From 5fe8f22ccb6c518062e71a57e5cfaf75e4787b03 Mon Sep 17 00:00:00 2001 From: Sch1nken Date: Fri, 22 Mar 2024 01:37:05 +0100 Subject: [PATCH] Refactored to allow hotseat and multiplayer. TODO: Create interface class for webrtc/enet multiplayer --- .../Prefabs/ActionBehaviourMosquito.gd | 5 +- Game.tscn | 80 +++--- GameEndChecker.gd | 6 +- GameOverMenu.gd | 2 +- Globals/GameData.gd | 16 +- HexGrid3D/HexGrid3D.gd | 6 +- InsectButton.gd | 62 +++-- InsectTiles/InsectTile.tscn | 4 +- MenuButtons.gd | 17 ++ Multiplayer/LobbyInfo.gd | 43 +-- Multiplayer/Multiplayer.gd | 3 +- Multiplayer/Multiplayer.tscn | 4 - Networking/Networking.tscn | 3 + Table.gd | 24 ++ Testbed/DistanceFaceWorld.gdshader | 41 +++ Testbed/GridTest.gdshader | 57 ++++ Testbed/Rules.gd | 53 ++++ Testbed/Rules.tscn | 249 ++++++++++++++++++ Testbed/Table.tres | 22 ++ Testbed/UIBlur.gdshader | 9 + Testbed/queenbeemove.png | Bin 0 -> 100889 bytes Testbed/queenbeemove.png.import | 34 +++ Tile/Tile.gd | 29 +- UI/BuildMenu.gd | 119 ++++++++- main_menu.gd | 27 +- main_menu.tscn | 16 +- project.godot | 2 +- 27 files changed, 798 insertions(+), 135 deletions(-) create mode 100644 MenuButtons.gd create mode 100644 Networking/Networking.tscn create mode 100644 Table.gd create mode 100644 Testbed/DistanceFaceWorld.gdshader create mode 100644 Testbed/GridTest.gdshader create mode 100644 Testbed/Rules.gd create mode 100644 Testbed/Rules.tscn create mode 100644 Testbed/Table.tres create mode 100644 Testbed/UIBlur.gdshader create mode 100644 Testbed/queenbeemove.png create mode 100644 Testbed/queenbeemove.png.import diff --git a/ActionBehaviour/Prefabs/ActionBehaviourMosquito.gd b/ActionBehaviour/Prefabs/ActionBehaviourMosquito.gd index 4da47a4..47cc193 100644 --- a/ActionBehaviour/Prefabs/ActionBehaviourMosquito.gd +++ b/ActionBehaviour/Prefabs/ActionBehaviourMosquito.gd @@ -10,7 +10,8 @@ func select_targets(source_pos: Vector4i, map: HexGrid): # -> Array[InsectTile]: var tile = map.get_tile(neighbour) if tile != null: # TODO: Find better way to see what tile we have... - if not tile.resource.movement_behaviour is MovementBehaviourMosquito: - possible_action_targets.push_back(tile) + pass + #if not tile.resource.movement_behaviour is MovementBehaviourMosquito: + # possible_action_targets.push_back(tile) GameEvents.insect_tiles_selected_for_action.emit(source_pos, possible_action_targets) diff --git a/Game.tscn b/Game.tscn index 8a13d20..d7e70cc 100644 --- a/Game.tscn +++ b/Game.tscn @@ -1,37 +1,21 @@ -[gd_scene load_steps=23 format=3 uid="uid://bx0bbrwdr0h40"] +[gd_scene load_steps=22 format=3 uid="uid://bx0bbrwdr0h40"] [ext_resource type="Script" path="res://Game.gd" id="1_dgt1j"] [ext_resource type="Script" path="res://Misc/RTSCamera3D.gd" id="1_dtmfo"] [ext_resource type="Script" path="res://HexGrid3D/HexGrid3D.gd" id="2_suxca"] [ext_resource type="Script" path="res://GameEndChecker.gd" id="2_ufkw3"] -[ext_resource type="Texture2D" uid="uid://cilgpyanfb3a8" path="res://Testbed/textures/wood_table_001_diff_4k.jpg" id="3_w3jge"] -[ext_resource type="Texture2D" uid="uid://diamo44e2x4if" path="res://Testbed/textures/wood_table_001_disp_4k.png" id="4_b7cy7"] -[ext_resource type="Texture2D" uid="uid://b6ejmikbfrprs" path="res://Testbed/textures/wood_table_001_rough_4k.jpg" id="5_lck42"] +[ext_resource type="Material" uid="uid://dv2oo7hlc5nyy" path="res://Testbed/Table.tres" id="5_u4p4p"] [ext_resource type="Script" path="res://WebLightChecker.gd" id="6_41m5i"] [ext_resource type="Script" path="res://UI/BuildMenu.gd" id="7_1oc55"] -[ext_resource type="PackedScene" uid="uid://bo8hgq66dbbb6" path="res://UI/insect_button.tscn" id="8_lfn34"] +[ext_resource type="Script" path="res://Table.gd" id="8_ys5y3"] [ext_resource type="Texture2D" uid="uid://d2i5vboeyq8qx" path="res://UI/hex_white.svg" id="11_cl0he"] [ext_resource type="Script" path="res://GameOverMenu.gd" id="11_ffmss"] +[ext_resource type="Script" path="res://MenuButtons.gd" id="11_urihv"] [ext_resource type="Script" path="res://TurnTexture.gd" id="12_kjwp8"] - -[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_u8oxs"] -albedo_texture = ExtResource("3_w3jge") -roughness_texture = ExtResource("5_lck42") -roughness_texture_channel = 4 -normal_enabled = true -normal_scale = 0.1 -normal_texture = ExtResource("4_b7cy7") -heightmap_scale = 1.0 -heightmap_deep_parallax = true -heightmap_min_layers = 1 -heightmap_max_layers = 1 -heightmap_texture = ExtResource("4_b7cy7") -refraction_scale = 0.28 -refraction_texture = ExtResource("4_b7cy7") -texture_filter = 5 +[ext_resource type="PackedScene" uid="uid://8ffmln680deh" path="res://Testbed/Rules.tscn" id="12_xhim1"] [sub_resource type="PlaneMesh" id="PlaneMesh_cu5ir"] -material = SubResource("StandardMaterial3D_u8oxs") +material = ExtResource("5_u4p4p") size = Vector2(50, 50) [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_dv0dt"] @@ -40,12 +24,22 @@ size = Vector2(50, 50) sky_material = SubResource("ProceduralSkyMaterial_dv0dt") [sub_resource type="Environment" id="Environment_xoohw"] -background_mode = 2 +background_mode = 1 +background_energy_multiplier = 0.0 sky = SubResource("Sky_v4pi7") +ambient_light_source = 2 +ambient_light_color = Color(1, 1, 1, 1) +ambient_light_energy = 0.3 tonemap_mode = 1 ssao_enabled = true +fog_light_color = Color(0, 0, 0, 1) +fog_density = 0.3 [sub_resource type="CameraAttributesPractical" id="CameraAttributesPractical_41x5h"] +dof_blur_far_enabled = true +dof_blur_far_distance = 15.0 +dof_blur_far_transition = 10.0 +dof_blur_near_enabled = true [sub_resource type="Gradient" id="Gradient_pctcs"] interpolation_mode = 2 @@ -84,6 +78,7 @@ script = ExtResource("2_suxca") [node name="MeshInstance3D" type="MeshInstance3D" parent="."] mesh = SubResource("PlaneMesh_cu5ir") +script = ExtResource("8_ys5y3") [node name="WorldEnvironment" type="WorldEnvironment" parent="."] environment = SubResource("Environment_xoohw") @@ -92,6 +87,8 @@ camera_attributes = SubResource("CameraAttributesPractical_41x5h") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] transform = Transform3D(0.843961, -0.46784, 0.262404, -0.0775016, 0.377705, 0.922677, -0.530777, -0.79904, 0.28251, 0.262159, 3.27869, -0.104568) light_color = Color(1, 0.941176, 0.823529, 1) +light_energy = 0.8 +light_indirect_energy = 0.8 shadow_enabled = true directional_shadow_blend_splits = true script = ExtResource("6_41m5i") @@ -162,12 +159,6 @@ alignment = 1 layout_mode = 2 mouse_filter = 0 -[node name="BeeButton" parent="BuildMenu/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2/LocalPlayerInsects" instance=ExtResource("8_lfn34")] -layout_mode = 2 - -[node name="VSeparator" type="VSeparator" parent="BuildMenu/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2/LocalPlayerInsects"] -layout_mode = 2 - [node name="PanelContainer2" type="PanelContainer" parent="BuildMenu/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2"] modulate = Color(1, 1, 1, 0) layout_mode = 2 @@ -230,13 +221,6 @@ mouse_filter = 2 layout_mode = 2 mouse_filter = 0 -[node name="VSeparator" type="VSeparator" parent="BuildMenu/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2/RemotePlayerInsects"] -layout_mode = 2 - -[node name="BeeButton" parent="BuildMenu/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2/RemotePlayerInsects" instance=ExtResource("8_lfn34")] -layout_mode = 2 -is_black = true - [node name="CurrentTurnDisplay" type="Control" parent="."] layout_mode = 3 anchors_preset = 5 @@ -249,6 +233,29 @@ size_flags_horizontal = 4 size_flags_vertical = 0 mouse_filter = 2 +[node name="MenuButtons" type="Control" parent="."] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("11_urihv") + +[node name="VBoxContainer" type="VBoxContainer" parent="MenuButtons"] +layout_mode = 0 +offset_right = 40.0 +offset_bottom = 40.0 + +[node name="MenuButton" type="Button" parent="MenuButtons/VBoxContainer"] +layout_mode = 2 +text = "Menu" + +[node name="RulesButton" type="Button" parent="MenuButtons/VBoxContainer"] +layout_mode = 2 +text = "Rules" + +[node name="Rules" parent="." instance=ExtResource("12_xhim1")] +visible = false + [node name="GameOverMenu" type="CanvasLayer" parent="."] script = ExtResource("11_ffmss") @@ -284,4 +291,5 @@ text = "Back to menu" [node name="PauseMenu" type="CanvasLayer" parent="."] +[connection signal="pressed" from="MenuButtons/VBoxContainer/RulesButton" to="MenuButtons" method="_on_rules_button_pressed"] [connection signal="pressed" from="GameOverMenu/Control/PanelContainer/VBoxContainer/Button" to="GameOverMenu" method="_on_button_pressed"] diff --git a/GameEndChecker.gd b/GameEndChecker.gd index 3106301..6170ab7 100644 --- a/GameEndChecker.gd +++ b/GameEndChecker.gd @@ -13,8 +13,10 @@ func _on_insect_tile_created(tile: InsectTile, pos: Vector4i) -> void: if is_same(BEE, tile.resource): bees.push_back(tile) - if tile.is_black == GameData.is_player_black: - GameData.has_bee_been_placed = true + GameData.bees_placed[tile.is_black] = tile + + #if tile.is_black == GameData.is_player_black: + # GameData.has_bee_been_placed = true func _on_turn_ended(turn_num: int, map: HexGrid) -> void: var black_lost: bool = false diff --git a/GameOverMenu.gd b/GameOverMenu.gd index 5a04d76..a4edd2f 100644 --- a/GameOverMenu.gd +++ b/GameOverMenu.gd @@ -21,5 +21,5 @@ func _on_game_over(black_lost: bool, white_lost: bool) -> void: print("should never happen...") func _on_button_pressed(): - WSClient.close() + #WSClient.close() get_tree().change_scene_to_file("res://main_menu.tscn") diff --git a/Globals/GameData.gd b/Globals/GameData.gd index 6a7d5da..753ac92 100644 --- a/Globals/GameData.gd +++ b/Globals/GameData.gd @@ -2,7 +2,11 @@ extends Node const WEBSOCKET_ENDPOINT: String = "wss://dev.bytesandpieces.xyz:9088" -var is_hot_seat: bool = false +# By default, peer_id is 1. This should make everything work flawless for local hotseat +var peer_id: int = 1 + + +var is_hot_seat: bool = true var is_player_black: bool = false var debug: bool = false @@ -10,13 +14,17 @@ var allow_selecting_in_stack: bool = false var lobby_code: String = "" -var has_bee_been_placed: bool = false -var bees_placed: Dictionary = {} +# false as key = white +# true as key = black + +# bees_placed.has(is_player_black) false/true -> white/black +var bees_placed: Dictionary = {} + var disconnect_reason: String = "" func reset() -> void: is_hot_seat = false - has_bee_been_placed = false disconnect_reason = "" bees_placed = {} + peer_id = 1 diff --git a/HexGrid3D/HexGrid3D.gd b/HexGrid3D/HexGrid3D.gd index 61a9499..52b02a4 100644 --- a/HexGrid3D/HexGrid3D.gd +++ b/HexGrid3D/HexGrid3D.gd @@ -339,12 +339,16 @@ func place_insect_tile(resource_path: String, is_black: bool, pos: Vector4i) -> tile_copy.resource = resource tile_copy.is_black = is_black tile_copy.coordinates = pos - #print(pos) + #print(pos) tile_copy.map_reference = self var target_pos = Vector3(hex_pos.x, 0.0, hex_pos.y) used_cells[pos] = tile_copy + var sender_id = multiplayer.get_remote_sender_id() + + tile_copy.set_multiplayer_authority(sender_id) + add_child(tile_copy) GameEvents.insect_tile_created.emit(tile_copy, pos) diff --git a/InsectButton.gd b/InsectButton.gd index ede11b2..dd3cffc 100644 --- a/InsectButton.gd +++ b/InsectButton.gd @@ -24,8 +24,32 @@ var is_blacks_turn: bool = false var should_disable: bool = false -func is_players_turn() -> bool: - return is_blacks_turn == is_black or GameData.debug +@rpc("call_local", "authority") +func set_authority(peer_id: int) -> void: + set_multiplayer_authority(peer_id, true) + pass + + +func is_players_turn() -> bool: + return is_blacks_turn == is_black + +# Have a functions that checks if we're the "owner" +func is_owner() -> bool: + # TODO: Only use multiplayer authority + # According to https://docs.godotengine.org/en/stable/classes/class_offlinemultiplayerpeer.html + # Even without active multiplayer, the normal calls just work as expected + #if GameData.is_hot_seat: + # return true + #elif GameData.is_player_black == is_black: # we could use multiplayer authority here + # return true + + #return false + return is_multiplayer_authority() + +@rpc("call_remote", "any_peer") +func update_amount(amount: int) -> void: + tile_count = amount + update_tile_count_display() func update_color(_is_black: bool) -> void: is_black = _is_black @@ -37,10 +61,7 @@ func update_color(_is_black: bool) -> void: update_tile_count_display() insect_icon.texture = insect_resource.ui_texture - if GameData.is_hot_seat: - return - - if is_black != is_blacks_turn and not GameData.debug: + if is_black != GameData.is_player_black: disabled = true return @@ -55,6 +76,7 @@ func update_tile_count_display() -> void: func decrement_tile_count() -> void: tile_count -= 1 update_tile_count_display() + update_amount.rpc(tile_count) func disable() -> void: disabled = true @@ -110,10 +132,12 @@ func _ready() -> void: GameEvents.turn_started.connect(_on_turn_started) + name = insect_resource.tile_name + func _on_turn_started(turn_num: int, map: HexGrid, _is_blacks_turn: bool) -> void: is_blacks_turn = _is_blacks_turn should_disable = false - if turn_num >= 7 and not GameData.bees_placed.has(is_black): #has_bee_been_placed: + if turn_num >= 7 and not GameData.bees_placed.has(is_black): if is_black == is_blacks_turn: # if not bee has been placed for this player # lock all buttons except the bee @@ -123,7 +147,8 @@ func _on_turn_started(turn_num: int, map: HexGrid, _is_blacks_turn: bool) -> voi else: #lock should_disable = true - + + refresh_state() func _on_insect_tile_deselected(tile: InsectTile) -> void: @@ -140,16 +165,18 @@ func _on_insect_selected(button: InsectButton, _is_black: bool) -> void: disable() func hover() -> void: - - #if is_blacks_turn != is_black and not GameData.debug: - # return + if is_blacks_turn != is_black: + return + + if not is_owner(): + return var tween = get_tree().create_tween() tween.tween_property(hex, "position", Vector2(0, -16), 0.1).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_SPRING) func unhover() -> void: - #if is_blacks_turn != is_black and not GameData.debug: - # return + #if GameData.is_player_black != is_black: + #return var tween = get_tree().create_tween() tween.tween_property(hex, "position", Vector2(0, 0), 0.25).set_ease(Tween.EASE_OUT).set_trans(Tween.TRANS_SPRING) @@ -167,17 +194,10 @@ func _on_mouse_exited(): unhover() func _on_pressed(): - # We can only press under these conditions - # Check if its the currents player turn (is black) - # If hotseat: we're done - # If multiplayer: Check if GameData.is_player_black is correct, this prevents - # the other player from using this button on their game instance - - #GameData.is_hot_seat if is_empty(): return - if not is_blacks_turn == is_black and not GameData.debug: + if not is_owner(): return if not is_players_turn(): diff --git a/InsectTiles/InsectTile.tscn b/InsectTiles/InsectTile.tscn index 5f35884..3e38482 100644 --- a/InsectTiles/InsectTile.tscn +++ b/InsectTiles/InsectTile.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=7 format=3 uid="uid://dxwngv0xmk3vy"] +[gd_scene load_steps=8 format=3 uid="uid://dxwngv0xmk3vy"] [ext_resource type="Script" path="res://Tile/Tile.gd" id="1_b68ym"] [ext_resource type="ArrayMesh" uid="uid://dsbshu53k588h" path="res://hexagon_small.res" id="2_vm00h"] +[ext_resource type="Resource" uid="uid://b70uxn2ofij8y" path="res://Tile/Prefabs/Bee.tres" id="2_xu8wf"] [ext_resource type="Texture2D" uid="uid://bp5lbofkicsqq" path="res://InsectTiles/Assets/Textures/ant_black.png" id="3_r51ol"] [ext_resource type="Texture2D" uid="uid://dr36631neiknu" path="res://InsectTiles/Assets/Textures/ant_white.png" id="4_f75dl"] @@ -15,6 +16,7 @@ data = PackedVector3Array(-0.25, 0.4004, 0.433014, 0.25, 0.000399577, 0.433014, [node name="InsectTile" type="Area3D"] monitoring = false script = ExtResource("1_b68ym") +resource = ExtResource("2_xu8wf") [node name="HexagonSmall" type="MeshInstance3D" parent="."] mesh = ExtResource("2_vm00h") diff --git a/MenuButtons.gd b/MenuButtons.gd new file mode 100644 index 0000000..48667a0 --- /dev/null +++ b/MenuButtons.gd @@ -0,0 +1,17 @@ +extends Control + +@onready var rules = $"../Rules" + + +# Called when the node enters the scene tree for the first time. +func _ready(): + pass # Replace with function body. + + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + + +func _on_rules_button_pressed(): + rules.show_panel() diff --git a/Multiplayer/LobbyInfo.gd b/Multiplayer/LobbyInfo.gd index 8a15bf2..ab0fbc8 100644 --- a/Multiplayer/LobbyInfo.gd +++ b/Multiplayer/LobbyInfo.gd @@ -1,33 +1,6 @@ extends CanvasLayer -@onready var insect_icons: HBoxContainer = $PanelContainer/VBoxContainer/InsectIcons - @onready var lobby_code: Label = $PanelContainer/VBoxContainer/LobbyCode -const INSECT_BUTTON = preload("res://UI/insect_button.tscn") - -const insect_resources = [ - preload("res://Tile/Prefabs/Ant.tres"), - preload("res://Tile/Prefabs/Bee.tres"), - preload("res://Tile/Prefabs/Beetle.tres"), - preload("res://Tile/Prefabs/Grasshopper.tres"), - preload("res://Tile/Prefabs/Ladybug.tres"), - preload("res://Tile/Prefabs/Mosquito.tres"), - preload("res://Tile/Prefabs/Pillbug.tres"), - preload("res://Tile/Prefabs/Spider.tres") -] - -var insect_data = { - -} - -func prepare_insect_data() -> void: - var c: int = 65 - - for i in insect_resources: - for k in 2: - insect_data[String.chr(c)] = {"resource": i, "is_black": k%2 != 0} - c = c + 1 - @onready var start_game_button = $PanelContainer/VBoxContainer/StartGameButton @@ -41,23 +14,9 @@ func _ready(): if not multiplayer.is_server(): return - insect_icons.visible = true start_game_button.visible = true - lobby_code.text = GameData.lobby_code - - prepare_insect_data() - - for c in GameData.lobby_code: - var b = INSECT_BUTTON.instantiate() - b.deactivated = true - b.disabled = true - b.disable_amount_display = true - var data = insect_data[c] - b.is_black = data.is_black - b.insect_resource = data.resource - insect_icons.add_child(b) - + lobby_code.text = GameData.lobby_code # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): diff --git a/Multiplayer/Multiplayer.gd b/Multiplayer/Multiplayer.gd index ad012bb..f5df305 100644 --- a/Multiplayer/Multiplayer.gd +++ b/Multiplayer/Multiplayer.gd @@ -15,6 +15,7 @@ func _ready(): func _mp_peer_disconnected(id: int) -> void: has_opponent = false + GameData.peer_id = 1 start_game_button.disabled = true if game_in_progress or id == 1: @@ -41,6 +42,7 @@ func _mp_server_disconnect(): func _mp_peer_connected(id: int): _log("[Multiplayer] Peer %d connected" % id) has_opponent = true + GameData.peer_id = id start_game_button.disabled = false @onready var lobby_info = $LobbyInfo @@ -62,4 +64,3 @@ func load_game() -> void: func _on_start_game_button_pressed(): # tell other peer to now load the world via rpc load_game.rpc() - pass # Replace with function body. diff --git a/Multiplayer/Multiplayer.tscn b/Multiplayer/Multiplayer.tscn index 6667470..17329d9 100644 --- a/Multiplayer/Multiplayer.tscn +++ b/Multiplayer/Multiplayer.tscn @@ -27,10 +27,6 @@ alignment = 1 layout_mode = 2 horizontal_alignment = 1 -[node name="InsectIcons" type="HBoxContainer" parent="LobbyInfo/PanelContainer/VBoxContainer"] -visible = false -layout_mode = 2 - [node name="StartGameButton" type="Button" parent="LobbyInfo/PanelContainer/VBoxContainer"] visible = false layout_mode = 2 diff --git a/Networking/Networking.tscn b/Networking/Networking.tscn new file mode 100644 index 0000000..5fdbee8 --- /dev/null +++ b/Networking/Networking.tscn @@ -0,0 +1,3 @@ +[gd_scene format=3 uid="uid://cigm5ol2f8b4b"] + +[node name="Networking" type="Node"] diff --git a/Table.gd b/Table.gd new file mode 100644 index 0000000..1715b20 --- /dev/null +++ b/Table.gd @@ -0,0 +1,24 @@ +extends MeshInstance3D + +var mat: ShaderMaterial +# Called when the node enters the scene tree for the first time. +func _ready(): + mat = get_active_material(0) + + var tween = get_tree().create_tween() + tween.set_parallel(true) + tween.tween_method(tween_inner, -1.0, 10.0, 3.5).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_EXPO) + tween.tween_method(tween_outer, 0.0, 25.0, 3.5).set_ease(Tween.EASE_IN_OUT).set_trans(Tween.TRANS_CIRC) + + pass # Replace with function body. + + +func tween_inner(value: float) -> void: + mat.set_shader_parameter("distance_fade_max", value) + +func tween_outer(value: float) -> void: + mat.set_shader_parameter("distance_fade_min", value) + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass diff --git a/Testbed/DistanceFaceWorld.gdshader b/Testbed/DistanceFaceWorld.gdshader new file mode 100644 index 0000000..331cf31 --- /dev/null +++ b/Testbed/DistanceFaceWorld.gdshader @@ -0,0 +1,41 @@ +// NOTE: Shader automatically converted from Godot Engine 4.2.1.stable's StandardMaterial3D. + +shader_type spatial; +render_mode blend_add,depth_draw_always,cull_back,diffuse_burley,specular_schlick_ggx; +uniform vec4 albedo : source_color; +uniform sampler2D texture_albedo : source_color,filter_linear_mipmap,repeat_enable; +uniform float distance_fade_min; +uniform float distance_fade_max; +uniform float roughness : hint_range(0,1); +uniform sampler2D texture_metallic : hint_default_white,filter_linear_mipmap,repeat_enable; +uniform vec4 metallic_texture_channel; +uniform sampler2D texture_roughness : hint_roughness_r,filter_linear_mipmap,repeat_enable; +uniform float specular; +uniform float metallic; +uniform vec3 uv1_scale; +uniform vec3 uv1_offset; + + +void vertex() { + UV=UV*uv1_scale.xy+uv1_offset.xy; +} + + + + + + +void fragment() { + vec2 base_uv = UV; + vec4 albedo_tex = texture(texture_albedo,base_uv); + ALBEDO = albedo.rgb * albedo_tex.rgb; + float metallic_tex = dot(texture(texture_metallic,base_uv),metallic_texture_channel); + METALLIC = metallic_tex * metallic; + vec4 roughness_texture_channel = vec4(1.0,0.0,0.0,0.0); + float roughness_tex = dot(texture(texture_roughness,base_uv),roughness_texture_channel); + ROUGHNESS = roughness_tex * roughness; + SPECULAR = specular; + ALPHA *= albedo.a * albedo_tex.a; + vec4 wrld_vertex = INV_VIEW_MATRIX * vec4(VERTEX, 1.0); + ALPHA *= clamp(smoothstep(distance_fade_min, distance_fade_max, length(wrld_vertex)), 0.0, 1.0); +} diff --git a/Testbed/GridTest.gdshader b/Testbed/GridTest.gdshader new file mode 100644 index 0000000..cfdd2c6 --- /dev/null +++ b/Testbed/GridTest.gdshader @@ -0,0 +1,57 @@ +shader_type spatial; + +uniform int scale_0 : hint_range(1, 1024, 1); +uniform int scale_1 : hint_range(1, 1024, 1); + +uniform float line_scale_0 : hint_range(0.001, 1, 0.001); +uniform float line_scale_1 : hint_range(0.001, 1, 0.001); + +uniform vec4 color_0 : source_color; +uniform vec4 color_1 : source_color; + +render_mode blend_add; + +float pristineGrid( vec2 uv, vec2 lineWidth) +{ + vec2 ddx = dFdx(uv); + vec2 ddy = dFdy(uv); + + vec2 uvDeriv = vec2(length(vec2(ddx.x, ddy.x)), length(vec2(ddx.y, ddy.y))); + bvec2 invertLine = bvec2(lineWidth.x > 0.5, lineWidth.y > 0.5); + + vec2 targetWidth = vec2( + invertLine.x ? 1.0 - lineWidth.x : lineWidth.x, + invertLine.y ? 1.0 - lineWidth.y : lineWidth.y + ); + + vec2 drawWidth = clamp(targetWidth, uvDeriv, vec2(0.5)); + vec2 lineAA = uvDeriv * 1.5; + vec2 gridUV = abs(fract(uv) * 2.0 - 1.0); + + gridUV.x = invertLine.x ? gridUV.x : 1.0 - gridUV.x; + gridUV.y = invertLine.y ? gridUV.y : 1.0 - gridUV.y; + + vec2 grid2 = smoothstep(drawWidth + lineAA, drawWidth - lineAA, gridUV); + + grid2 *= clamp(targetWidth / drawWidth, 0.0, 1.0); + grid2 = mix(grid2, targetWidth, clamp(uvDeriv * 2.0 - 1.0, 0.0, 1.0)); + grid2.x = invertLine.x ? 1.0 - grid2.x : grid2.x; + grid2.y = invertLine.y ? 1.0 - grid2.y : grid2.y; + return mix(grid2.x, 1.0, grid2.y); +} + +void vertex() +{ + //UV = VERTEX.xz; +} + +void fragment() +{ + vec3 grid_0 = vec3(pristineGrid(UV * float(scale_0), vec2(line_scale_0))); + vec3 grid_1 = vec3(pristineGrid(UV * float(scale_1), vec2(line_scale_1))); + + vec3 grid_3 = mix(grid_1 * color_1.rgb, grid_0 * color_0.rgb, grid_0); + + ALBEDO = grid_3; + ALPHA = 1.5; +} \ No newline at end of file diff --git a/Testbed/Rules.gd b/Testbed/Rules.gd new file mode 100644 index 0000000..196eca5 --- /dev/null +++ b/Testbed/Rules.gd @@ -0,0 +1,53 @@ +extends Control + +@onready var category_label = $Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/CategoryLabel +@onready var margin_container = $Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer +@onready var panel_container = $PanelContainer + +@onready var general = $Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/General + +@onready var margin_container2 = $Pivot/MarginContainer + +var mat: ShaderMaterial + +func show_panel() -> void: + margin_container2.position.y = 700 + mat.set_shader_parameter("lod", 0) + + visible = true + + var tween = get_tree().create_tween() + tween.set_parallel(true) + tween.tween_method(tween_blur, 0.0, 1.0, 0.5).set_trans(Tween.TRANS_EXPO).set_ease(Tween.EASE_IN_OUT) + tween.tween_property(margin_container2, "position:y", 0.0, 0.5).set_trans(Tween.TRANS_SPRING).set_ease(Tween.EASE_OUT) + +# Called when the node enters the scene tree for the first time. +func _ready(): + mat = panel_container.material + pass # Replace with function body. + +func tween_blur(val: float) -> void: + mat.set_shader_parameter("lod", val) + pass + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta): + pass + + +func _on_button_pressed(label: NodePath, category: String = ""): + for child in margin_container.get_children(): + child.visible = false + + category_label.text = category + + # hacky + general.get_node(label).visible = true + + +func _on_ant_pressed(extra_arg_0, extra_arg_1): + pass # Replace with function body. + + +func _on_close_button_pressed(): + visible = false diff --git a/Testbed/Rules.tscn b/Testbed/Rules.tscn new file mode 100644 index 0000000..426574e --- /dev/null +++ b/Testbed/Rules.tscn @@ -0,0 +1,249 @@ +[gd_scene load_steps=4 format=3 uid="uid://8ffmln680deh"] + +[ext_resource type="Script" path="res://Testbed/Rules.gd" id="1_qbtgw"] +[ext_resource type="Shader" path="res://Testbed/UIBlur.gdshader" id="2_ux84o"] + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_h3smw"] +shader = ExtResource("2_ux84o") +shader_parameter/lod = 1.0 + +[node name="Rules" type="Control"] +layout_mode = 3 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +size_flags_horizontal = 4 +size_flags_vertical = 4 +script = ExtResource("1_qbtgw") + +[node name="PanelContainer" type="PanelContainer" parent="."] +self_modulate = Color(1, 1, 1, 0.392157) +material = SubResource("ShaderMaterial_h3smw") +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Pivot" type="Control" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Pivot"] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +theme_override_constants/margin_left = 50 +theme_override_constants/margin_top = 50 +theme_override_constants/margin_right = 50 +theme_override_constants/margin_bottom = 50 + +[node name="PanelContainer" type="PanelContainer" parent="Pivot/MarginContainer"] +layout_mode = 2 + +[node name="MarginContainer" type="MarginContainer" parent="Pivot/MarginContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 15 +theme_override_constants/margin_top = 15 +theme_override_constants/margin_right = 15 +theme_override_constants/margin_bottom = 15 + +[node name="VBoxContainer" type="VBoxContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer"] +layout_mode = 2 + +[node name="HBoxContainer" type="HBoxContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +size_flags_vertical = 3 +theme_override_constants/separation = 15 + +[node name="VBoxContainer" type="VBoxContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +custom_minimum_size = Vector2(100, 0) +layout_mode = 2 + +[node name="General" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "General" + +[node name="Placing" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Placing" + +[node name="Moving" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Moving" + +[node name="HSeparator" type="HSeparator" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 + +[node name="Bee" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Bee" + +[node name="Beetle" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Beetle" + +[node name="Grasshopper" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Grasshopper" + +[node name="Spider" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Spider" + +[node name="Ant" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +text = "Ant" + +[node name="Ladybug" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +disabled = true +text = "Ladybug" + +[node name="Mosquito" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +disabled = true +text = "Mosquito" + +[node name="Pillbug" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer"] +layout_mode = 2 +disabled = true +text = "Pillbug" + +[node name="VBoxContainer2" type="VBoxContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer"] +layout_mode = 2 +size_flags_horizontal = 3 + +[node name="CategoryLabel" type="Label" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2"] +layout_mode = 2 +text = "General" + +[node name="ScrollContainer" type="ScrollContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="PanelContainer" type="PanelContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer"] +layout_mode = 2 +size_flags_horizontal = 3 +size_flags_vertical = 3 + +[node name="MarginContainer" type="MarginContainer" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer"] +layout_mode = 2 +theme_override_constants/margin_left = 10 +theme_override_constants/margin_top = 10 +theme_override_constants/margin_right = 10 +theme_override_constants/margin_bottom = 10 + +[node name="GeneralLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +layout_mode = 2 +text = "The pieces in play define the playing surface, known as the Hive. + +Play begings with one player placing a piece from their hand in the center of the table and the next player joining one of their own pieces to it edge to edge. + +Players then take turns to either place or move any one of their pieces." +fit_content = true + +[node name="PlacingLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +text = "A new piece can be introduced into the game at any time. However, with the exception of the first piece placed by each player, pieces may not be placed next to a piece of the opponent's color. + +It is possible to win the game without placing all your pieces but once a piece has been placed it can't be removed. + +Your Queen Bee can be placed at any time from your first to your fourth turn. You must place your Queen Bee on your fourth turn if you have not placed it before." +fit_content = true + +[node name="MovingLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +text = "Once your Queen Bee has been placed (but not before), you can decide whether to use each turn after that to place another tile or to move one of the pieces that have already been placed. + +Each creature has its own way of moving about the Hive and it's possible to move pieces to a position where they touch one or more of your opponent's tiles. + +Note: All pieces must always touch at least one other piece. If a piece the only connection between two parts of the Hive, it may not be moved." +fit_content = true + +[node name="BeeLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +bbcode_enabled = true +text = "The Queen Bee can move only one space per turn. Even though it is restricted in this way, if moved at the right time it can severely disrupt your opponent's plans. + +[img]res://Testbed/queenbeemove.png[/img] + + +From this position, the black Queen Bee is able to move into one of four spaces." +fit_content = true + +[node name="BeetleLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +text = "The Beetle, like the Queen Bee, moves only one space per turn. + +Unlike any other creature though, it can also move on top of the Hive. + +A piece with a beetle on top of it is unable to move and for the purposes of the placing rules, the stack takes on the color of the Beetle. + +From its position on top of the Hive, the Beetle can move from tile to tile across the top of the Hive. It can also drop into spaces that are surrounded and therefore not accessible to most other creatures. + +From its position, the white Beetle is able to move into one of four positions. + +The only way to block a Beetle that is on top of the Hive is to move another Beetle on top of it. All four Beetles can be stacked on top of each other. + +Note: When it is first placed, the Beetle is placed in the same way as all other pieces. It can't be placed directly on top of the Hive, even though it can be moved there later." +fit_content = true + +[node name="GrasshopperLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +text = "The Grasshopper does not move around the outside of the Hive like the other creatures. Instead, it jumps from its space over any number of pieces (but at least one) to the next unoccupied space along a straight row of joined pieces. + +This gives it the advantage of being able to fill in a space which is surrounded by other tiles. + +From its position, the white Grasshopper can jump to one of three spaces. Note: It can't jump across the gap to the space marked x." +fit_content = true + +[node name="SpiderLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +text = "The Spider moves three spaces per turn - no more, no less. + +It must move in a direct path and can't backtrack on itself. It may only move around pieces that it is in direct contact with on each step of its move and it may not move across to a piece that it's not in direct contact with. + +From its position, the black Spider can move into one of four spaces but is unable to move to the position on its left marked 2 on its first step. +" +fit_content = true + +[node name="AntLabel" type="RichTextLabel" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer"] +visible = false +layout_mode = 2 +text = "The Soldier Ant can move from its position to any other position around the Hive provided the restrictions are adhered to. This freedom of movement makes the Ant one of the most valuable pieces. + +In this case, the Ant can be moved into one of eleven positions but is unable to move into the position in the center of the Hive. +" +fit_content = true + +[node name="CloseButton" type="Button" parent="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Close" + +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/General" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/GeneralLabel"), "General"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Placing" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/PlacingLabel"), "Placing"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Moving" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/MovingLabel")]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Bee" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/BeeLabel"), "Bee"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Beetle" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/BeetleLabel"), "Beetle"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Grasshopper" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/GrasshopperLabel"), "Grasshopper"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Spider" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/SpiderLabel"), "Spider"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/HBoxContainer/VBoxContainer/Ant" to="." method="_on_button_pressed" binds= [NodePath("../../VBoxContainer2/ScrollContainer/PanelContainer/MarginContainer/AntLabel"), "Ant"]] +[connection signal="pressed" from="Pivot/MarginContainer/PanelContainer/MarginContainer/VBoxContainer/CloseButton" to="." method="_on_close_button_pressed"] diff --git a/Testbed/Table.tres b/Testbed/Table.tres new file mode 100644 index 0000000..e5c4778 --- /dev/null +++ b/Testbed/Table.tres @@ -0,0 +1,22 @@ +[gd_resource type="ShaderMaterial" load_steps=5 format=3 uid="uid://dv2oo7hlc5nyy"] + +[ext_resource type="Shader" path="res://Testbed/DistanceFaceWorld.gdshader" id="1_edhah"] +[ext_resource type="Texture2D" uid="uid://cilgpyanfb3a8" path="res://Testbed/textures/wood_table_001_diff_4k.jpg" id="2_hb1x7"] +[ext_resource type="Texture2D" uid="uid://diamo44e2x4if" path="res://Testbed/textures/wood_table_001_disp_4k.png" id="3_eyslc"] +[ext_resource type="Texture2D" uid="uid://b6ejmikbfrprs" path="res://Testbed/textures/wood_table_001_rough_4k.jpg" id="4_r705j"] + +[resource] +render_priority = 0 +shader = ExtResource("1_edhah") +shader_parameter/albedo = Color(1, 1, 1, 1) +shader_parameter/distance_fade_min = 0.0 +shader_parameter/distance_fade_max = 0.0 +shader_parameter/roughness = 0.5 +shader_parameter/metallic_texture_channel = null +shader_parameter/specular = 0.5 +shader_parameter/metallic = 0.5 +shader_parameter/uv1_scale = Vector3(1, 1, 1) +shader_parameter/uv1_offset = Vector3(0, 0, 0) +shader_parameter/texture_albedo = ExtResource("2_hb1x7") +shader_parameter/texture_metallic = ExtResource("3_eyslc") +shader_parameter/texture_roughness = ExtResource("4_r705j") diff --git a/Testbed/UIBlur.gdshader b/Testbed/UIBlur.gdshader new file mode 100644 index 0000000..692b2b7 --- /dev/null +++ b/Testbed/UIBlur.gdshader @@ -0,0 +1,9 @@ +shader_type canvas_item; + +uniform float lod: hint_range(0.0, 5.0) = 0.0; +uniform sampler2D SCREEN_TEXTURE: hint_screen_texture, filter_linear_mipmap; + +void fragment() { + vec4 color = texture(SCREEN_TEXTURE, SCREEN_UV, lod); + COLOR = vec4(color.rgb, 1.0); +} \ No newline at end of file diff --git a/Testbed/queenbeemove.png b/Testbed/queenbeemove.png new file mode 100644 index 0000000000000000000000000000000000000000..894ce0236652d864de0e8571211b7bfcf559fc6b GIT binary patch literal 100889 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 literal 0 HcmV?d00001 diff --git a/Testbed/queenbeemove.png.import b/Testbed/queenbeemove.png.import new file mode 100644 index 0000000..33b286b --- /dev/null +++ b/Testbed/queenbeemove.png.import @@ -0,0 +1,34 @@ +[remap] + +importer="texture" +type="CompressedTexture2D" +uid="uid://ce3vdaa8y4pmc" +path="res://.godot/imported/queenbeemove.png-5c1df16cbe3c407ebc595b848eeffac1.ctex" +metadata={ +"vram_texture": false +} + +[deps] + +source_file="res://Testbed/queenbeemove.png" +dest_files=["res://.godot/imported/queenbeemove.png-5c1df16cbe3c407ebc595b848eeffac1.ctex"] + +[params] + +compress/mode=0 +compress/high_quality=false +compress/lossy_quality=0.7 +compress/hdr_compression=1 +compress/normal_map=0 +compress/channel_pack=0 +mipmaps/generate=false +mipmaps/limit=-1 +roughness/mode=0 +roughness/src_normal="" +process/fix_alpha_border=true +process/premult_alpha=false +process/normal_map_invert_y=false +process/hdr_as_srgb=false +process/hdr_clamp_exposure=false +process/size_limit=0 +detect_3d/compress_to=1 diff --git a/Tile/Tile.gd b/Tile/Tile.gd index 5717e2f..a351398 100644 --- a/Tile/Tile.gd +++ b/Tile/Tile.gd @@ -40,7 +40,20 @@ var selected_for_action: bool = false var can_be_selected: bool = false func is_players_turn() -> bool: - return is_blacks_turn == GameData.is_player_black or GameData.debug + return is_blacks_turn == is_black + +# Have a functions that checks if we're the "owner" +func is_owner() -> bool: + # TODO: Only use multiplayer authority + # According to https://docs.godotengine.org/en/stable/classes/class_offlinemultiplayerpeer.html + # Even without active multiplayer, the normal calls just work as expected + #if GameData.is_hot_seat: + # return true + #elif GameData.is_player_black == is_black: # we could use multiplayer authority here + # return true + + #return false + return is_multiplayer_authority() func _ready() -> void: if is_black: @@ -65,9 +78,9 @@ func _ready() -> void: func _on_turn_started(turn_num: int, map: HexGrid, _is_blacks_turn: bool) -> void: is_blacks_turn = _is_blacks_turn - can_be_selected = GameData.has_bee_been_placed - print(GameData.has_bee_been_placed) - if turn_num >= 7 and not GameData.has_bee_been_placed: + can_be_selected = GameData.bees_placed.has(is_black) + #print(GameData.has_bee_been_placed) + if turn_num >= 7 and not GameData.bees_placed.has(is_black): can_be_selected = true func _on_tiles_selected_for_action(source_pos: Vector4i, targets: Array[InsectTile]) -> void: @@ -116,9 +129,9 @@ func _process(delta): if not hovered: return - if not GameData.is_player_black == is_black: + if not is_owner(): return - + if not is_players_turn(): return @@ -138,7 +151,7 @@ func _process(delta): GameEvents.insect_tile_selected.emit(self) func hover() -> void: - if GameData.is_player_black != is_black: + if is_blacks_turn != is_black: return if tween != null: @@ -155,7 +168,7 @@ func tween_hover_shader(color: Color) -> void: mat.next_pass.set_shader_parameter("emission_color", color) func unhover() -> void: - if GameData.is_player_black != is_black: + if is_blacks_turn != is_black: return if tween != null: diff --git a/UI/BuildMenu.gd b/UI/BuildMenu.gd index 0afa162..1466935 100644 --- a/UI/BuildMenu.gd +++ b/UI/BuildMenu.gd @@ -11,20 +11,127 @@ const default_insects = { preload("res://Tile/Prefabs/Beetle.tres"): 2, preload("res://Tile/Prefabs/Grasshopper.tres"): 3, preload("res://Tile/Prefabs/Spider.tres"): 2, - preload("res://Tile/Prefabs/Ladybug.tres"): 1, - preload("res://Tile/Prefabs/Mosquito.tres"): 1, - preload("res://Tile/Prefabs/Pillbug.tres"): 1 + #preload("res://Tile/Prefabs/Ladybug.tres"): 1, + #preload("res://Tile/Prefabs/Mosquito.tres"): 1, + #preload("res://Tile/Prefabs/Pillbug.tres"): 1 } -@onready var local_bee_button: InsectButton = $PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2/LocalPlayerInsects/BeeButton -@onready var remote_bee_button: InsectButton = $PanelContainer/MarginContainer/VBoxContainer/HBoxContainer2/RemotePlayerInsects/BeeButton +var local_bee_button: InsectButton +var remote_bee_button: InsectButton +@rpc("call_local", "authority", "reliable") +func reverse_enemy_list() -> void: + for child in remote_player_insects.get_children(): + remote_player_insects.move_child(child, 0) + pass + +@rpc("call_local", "authority", "reliable") +func add_spacer(is_black: bool, peer_id: int = 1) -> void: + var seperator = VSeparator.new() + + if GameData.is_hot_seat: + # left = white, right = black + if not is_black: + local_player_insects.add_child(seperator) + else: + remote_player_insects.add_child(seperator) + else: + if peer_id == multiplayer.get_unique_id(): + local_player_insects.add_child(seperator) + else: + remote_player_insects.add_child(seperator) + + #local_player_insects.add_spacer(false) + +@rpc("call_local", "authority", "reliable") +func add_insect(resource_path: String, count: int, is_black: bool, peer_id: int = 1) -> void: + var resource = load(resource_path) + + var btn = INSECT_BUTTON.instantiate() + btn.insect_resource = resource + btn.tile_count = count + btn.is_black = is_black + + btn.set_multiplayer_authority(peer_id, true) + + # TODO: if authority, put local, else put remote + # We can use authority, in hotseat authority will always be true + # if hotseat -> white left, black right + # else -> local left, remote right + if GameData.is_hot_seat: + if not is_black: + local_player_insects.add_child(btn) + else: + remote_player_insects.add_child(btn) + + else: + print("@") + print(peer_id) + print(multiplayer.get_unique_id()) + if peer_id == multiplayer.get_unique_id(): + local_player_insects.add_child(btn) + else: + remote_player_insects.add_child(btn) + + +@rpc("call_local", "authority", "reliable") +func setup_colors(is_host_black: bool) -> void: + if GameData.is_hot_seat: + local_player_insects.name = "White" + remote_player_insects.name = "Black" + return + + + if multiplayer.is_server(): + GameData.is_player_black = is_host_black + else: + GameData.is_player_black = !is_host_black + + if not GameData.is_player_black: + local_player_insects.name = "White" + remote_player_insects.name = "Black" + else: + local_player_insects.name = "Black" + remote_player_insects.name = "White" + # Called when the node enters the scene tree for the first time. func _ready(): + if multiplayer.is_server(): + setup_colors.rpc(false) + + add_insect.rpc("res://Tile/Prefabs/Bee.tres", 1, false, 1) + add_spacer.rpc(false, 1) + + add_insect.rpc("res://Tile/Prefabs/Bee.tres", 1, true, GameData.peer_id) + add_spacer.rpc(true, GameData.peer_id) + + #remote_bee_button.set_authority.rpc(GameData.peer_id) + for key in default_insects.keys(): + add_insect.rpc(key.get_path(), default_insects[key], false, 1) + add_insect.rpc(key.get_path(), default_insects[key], true, GameData.peer_id) + + #add_insect.rpc("res://Tile/Prefabs/Ant.tres", 1, false, GameData.peer_id) + reverse_enemy_list.rpc() + return + + if GameData.is_player_black: + # Rename LocalPlayerInsects and RemotePlayerInsects + local_player_insects.name = "Black" + remote_player_insects.name = "White" + else: + local_player_insects.name = "White" + remote_player_insects.name = "Black" + + local_bee_button = local_player_insects.get_node("Bee") + remote_bee_button = remote_player_insects.get_node("Bee") + #var unique_array = default_insects.duplicate().map() local_bee_button.update_color(GameData.is_player_black) remote_bee_button.update_color(!GameData.is_player_black) + if multiplayer.is_server(): + remote_bee_button.set_authority.rpc(GameData.peer_id) + for key in default_insects.keys(): #print(default_insects[key]) var btn = INSECT_BUTTON.instantiate() @@ -40,6 +147,8 @@ func _ready(): btn.is_black = !GameData.is_player_black remote_player_insects.add_child(btn) remote_player_insects.move_child(btn, 0) + if multiplayer.is_server(): + btn.set_authority.rpc(GameData.peer_id) # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta): diff --git a/main_menu.gd b/main_menu.gd index 8c09806..9b179b8 100644 --- a/main_menu.gd +++ b/main_menu.gd @@ -1,13 +1,17 @@ extends Control @onready var exit_button = $PanelContainer/MarginContainer/VBoxContainer/ExitButton +@onready var lan_button = $PanelContainer/MarginContainer/VBoxContainer/LANButton + +@onready var rules = $Rules # Called when the node enters the scene tree for the first time. func _ready() -> void: if OS.has_feature("web"): exit_button.visible = false + lan_button.visible = false - WSClient.lobby_joined.connect(_on_lobby_joined) + #WSClient.lobby_joined.connect(_on_lobby_joined) GameData.reset() func _on_lobby_joined(lobby: String) -> void: @@ -21,7 +25,7 @@ func _process(delta: float) -> void: func _on_host_button_pressed(): GameData.is_player_black = false - WSClient.start(GameData.WEBSOCKET_ENDPOINT, "", false) + #WSClient.start(GameData.WEBSOCKET_ENDPOINT, "", false) func _on_join_button_pressed(): @@ -34,5 +38,22 @@ func _on_exit_button_pressed(): func _on_rules_button_pressed(): # https://bacon.bytesandpieces.xyz/swarm/ - OS.shell_open("https://www.ultraboardgames.com/hive/game-rules.php") + #OS.shell_open("https://www.ultraboardgames.com/hive/game-rules.php") + rules.show_panel() pass # Replace with function body. + + +func _on_online_button_pressed(): + #GameData.is_player_black = false + #WSClient.start(GameData.WEBSOCKET_ENDPOINT, "", false) + pass # Replace with function body. + + +func _on_online_button_2_pressed(): + get_tree().change_scene_to_file("res://UI/join_menu.tscn") + pass # Replace with function body. + + +func _on_local_button_pressed(): + GameData.is_hot_seat = true + get_tree().change_scene_to_file("res://Game.tscn") diff --git a/main_menu.tscn b/main_menu.tscn index 1ab5621..78dc4d6 100644 --- a/main_menu.tscn +++ b/main_menu.tscn @@ -1,7 +1,8 @@ -[gd_scene load_steps=4 format=3 uid="uid://dogu37xma5vsp"] +[gd_scene load_steps=5 format=3 uid="uid://dogu37xma5vsp"] [ext_resource type="Script" path="res://main_menu.gd" id="1_q3q3u"] [ext_resource type="Script" path="res://DisconnectInfo.gd" id="2_2fkdc"] +[ext_resource type="PackedScene" uid="uid://8ffmln680deh" path="res://Testbed/Rules.tscn" id="2_7qmw6"] [sub_resource type="StyleBoxFlat" id="StyleBoxFlat_47fa1"] bg_color = Color(0, 0, 0, 1) @@ -74,6 +75,10 @@ text = "Local (Hotseat)" layout_mode = 2 text = "Online" +[node name="OnlineButton2" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer"] +layout_mode = 2 +text = "Online (Join)" + [node name="LANButton" type="Button" parent="PanelContainer/MarginContainer/VBoxContainer"] layout_mode = 2 disabled = true @@ -98,6 +103,10 @@ text = "Rules" layout_mode = 2 text = "Exit" +[node name="Rules" parent="." instance=ExtResource("2_7qmw6")] +visible = false +layout_mode = 1 + [node name="DisconnectInfo" type="Control" parent="."] visible = false layout_mode = 1 @@ -140,8 +149,9 @@ text = "Ok" [connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/HostButton" to="." method="_on_host_button_pressed"] [connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/JoinButton" to="." method="_on_join_button_pressed"] [connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/SingleplayerButton" to="." method="_on_rules_button_pressed"] -[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/LocalButton" to="." method="_on_rules_button_pressed"] -[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/OnlineButton" to="." method="_on_rules_button_pressed"] +[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/LocalButton" to="." method="_on_local_button_pressed"] +[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/OnlineButton" to="." method="_on_online_button_pressed"] +[connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/OnlineButton2" to="." method="_on_online_button_2_pressed"] [connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/LANButton" to="." method="_on_rules_button_pressed"] [connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/SettingsButton" to="." method="_on_rules_button_pressed"] [connection signal="pressed" from="PanelContainer/MarginContainer/VBoxContainer/RulesButton" to="." method="_on_rules_button_pressed"] diff --git a/project.godot b/project.godot index 74c82de..9d9e4e8 100644 --- a/project.godot +++ b/project.godot @@ -20,7 +20,7 @@ config/icon="res://icon.svg" GameEvents="*res://Globals/GameEvents.gd" GameData="*res://Globals/GameData.gd" DebugMenu="*res://addons/debug_menu/debug_menu.tscn" -WSClient="*res://Networking/ws_client.tscn" +Networking="*res://Networking/Networking.tscn" [editor_plugins]