diff --git a/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll b/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll new file mode 100644 index 0000000..47bbb1d Binary files /dev/null and b/addons/godot-git-plugin/win64/~libgit_plugin.windows.editor.x86_64.dll differ diff --git a/project.godot b/project.godot index cc1dc7f..3e426ab 100644 --- a/project.godot +++ b/project.godot @@ -15,11 +15,67 @@ run/main_scene="uid://cyo30vhqp8aod" config/features=PackedStringArray("4.4", "GL Compatibility") config/icon="res://icon.svg" +[autoload] + +GameManager="*res://src/game_manager.gd" + [editor] version_control/plugin_name="GitPlugin" version_control/autoload_on_startup=true +[input] + +move_left={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":97,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194319,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +move_right={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":100,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194321,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +move_forward={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":119,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194320,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +move_back={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":115,"location":0,"echo":false,"script":null) +, Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194322,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} +activate_unit={ +"deadzone": 0.2, +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":32,"location":0,"echo":false,"script":null) +] +} +select_unit={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":1,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +deselect_unit={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":2,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +zoom_in={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} +zoom_out={ +"deadzone": 0.2, +"events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":5,"canceled":false,"pressed":false,"double_click":false,"script":null) +] +} + [rendering] renderer/rendering_method="gl_compatibility" diff --git a/src/models/base_model.gd b/src/base_model.gd similarity index 92% rename from src/models/base_model.gd rename to src/base_model.gd index ec63cea..1c976f6 100644 --- a/src/models/base_model.gd +++ b/src/base_model.gd @@ -1,14 +1,19 @@ extends Node +class_name Model +## Pixel to meters ratio. const PIXEL_SIZE := 0.0048 +## Scale from the miniature scale to real size. const HEROIC_SCALE := 57.2 +## Width to Height ratio of the image. const W_H_RATIO := 1.4 # Basic Variables @export var ModelName: String @export var CustomName: String @export var MovementDistance: int -@export var BaseSize: String # In mm +## In mm. +@export var BaseSize: String @export var MovementType: String @export var RangeCharacteristic: DiceModifier @export var MeleeCharacteristic: DiceModifier diff --git a/src/models/base_model.gd.uid b/src/base_model.gd.uid similarity index 100% rename from src/models/base_model.gd.uid rename to src/base_model.gd.uid diff --git a/src/base_model.tscn b/src/base_model.tscn new file mode 100644 index 0000000..027a6d0 --- /dev/null +++ b/src/base_model.tscn @@ -0,0 +1,50 @@ +[gd_scene load_steps=9 format=3 uid="uid://c26jufswfi2bh"] + +[ext_resource type="Script" uid="uid://di5g5x80wtaw7" path="res://src/base_model.gd" id="1_ni6nx"] + +[sub_resource type="Gradient" id="Gradient_fqpka"] +offsets = PackedFloat32Array(0, 0.632124, 1) +colors = PackedColorArray(0, 0, 0, 1, 0.310881, 0.310881, 0.310881, 1, 1, 1, 1, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_f2ut7"] +gradient = SubResource("Gradient_fqpka") +fill = 1 + +[sub_resource type="Gradient" id="Gradient_hq8bp"] +offsets = PackedFloat32Array(0, 0.439024, 1) +colors = PackedColorArray(1, 1, 1, 1, 0.282927, 0.282927, 0.282927, 1, 0, 0, 0, 1) + +[sub_resource type="GradientTexture2D" id="GradientTexture2D_lcex4"] +gradient = SubResource("Gradient_hq8bp") +fill = 1 + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_f2ut7"] +albedo_color = Color(1, 0.0470588, 1, 1) +albedo_texture = SubResource("GradientTexture2D_f2ut7") +metallic = 0.6 +metallic_texture = SubResource("GradientTexture2D_lcex4") + +[sub_resource type="CylinderShape3D" id="CylinderShape3D_wfmmx"] + +[sub_resource type="SceneReplicationConfig" id="SceneReplicationConfig_04rm0"] + +[node name="BaseModel" type="CharacterBody3D"] +script = ExtResource("1_ni6nx") + +[node name="Pivot" type="Node3D" parent="."] + +[node name="Sprite2D" type="Sprite3D" parent="Pivot"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.30011, 0) +pixel_size = 0.0048 +billboard = 2 + +[node name="Base" type="MeshInstance3D" parent="Pivot"] +transform = Transform3D(57.2, 0, 0, 0, 57.2, 0, 0, 0, 57.2, 0, 0, 0) +material_override = SubResource("StandardMaterial3D_f2ut7") +skeleton = NodePath("") + +[node name="CollisionShape3D" type="CollisionShape3D" parent="."] +shape = SubResource("CylinderShape3D_wfmmx") + +[node name="MultiplayerSynchronizer" type="MultiplayerSynchronizer" parent="."] +replication_config = SubResource("SceneReplicationConfig_04rm0") diff --git a/src/camera_pivot.gd b/src/camera_pivot.gd new file mode 100644 index 0000000..d911996 --- /dev/null +++ b/src/camera_pivot.gd @@ -0,0 +1,53 @@ +extends Node3D + +## Speed of the camera +@export var CAMERA_SPEED := 10 +## Min y distance of the camera +@export var MIN_ZOOM := 6 +## Max y distance of the camera +@export var MAX_ZOOM := 18 + +@export var MOUSE_SENSITIVITY := 0.5 +@export var TILT_LOWER_LIMIT := deg_to_rad(-10.0) +@export var TILT_UPPER_LIMIT := deg_to_rad(80.0) + +var zoom := 6.0 +var _mouse_rotation := Vector2.ZERO +var _mouse_input := Vector2.ZERO + +# Called when the node enters the scene tree for the first time. +func _ready() -> void: + pass # Replace with function body. + Input.mouse_mode = Input.MOUSE_MODE_CAPTURED + +# Called every frame. 'delta' is the elapsed time since the previous frame. +func _process(delta: float) -> void: + _update_camera(delta) + if Input.is_action_pressed("move_right"): + position.x += CAMERA_SPEED * delta + if Input.is_action_pressed("move_left"): + position.x -= CAMERA_SPEED * delta + if Input.is_action_pressed("move_back"): + position.z += CAMERA_SPEED * delta + if Input.is_action_pressed("move_forward"): + position.z -= CAMERA_SPEED * delta + if Input.is_action_just_released("zoom_in"): + zoom -= CAMERA_SPEED * delta + if Input.is_action_just_released("zoom_out"): + zoom += CAMERA_SPEED * delta + zoom = clamp(zoom, MIN_ZOOM, MAX_ZOOM) + $Camera3D.position.y = zoom + +func _unhandled_input(event): + if event is InputEventMouseMotion and Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED: + _mouse_input.x = -event.relative.x * MOUSE_SENSITIVITY + _mouse_input.y = -event.relative.y * MOUSE_SENSITIVITY + +func _update_camera(delta): + _mouse_rotation.x += _mouse_input.x * delta + _mouse_rotation.x = clamp(_mouse_rotation.x, TILT_UPPER_LIMIT, TILT_UPPER_LIMIT) + _mouse_rotation.y += _mouse_input.y * delta + _mouse_input = Vector2.ZERO + $Camera3D.transform.basis = Basis.from_euler(Vector3(_mouse_rotation.y, 0.0, 0.0)) + #CAMERA_CONTROLLER.rotation.z = 0.0 + global_transform.basis = Basis.from_euler(Vector3(0.0, _mouse_rotation.x, 0.0)) diff --git a/src/camera_pivot.gd.uid b/src/camera_pivot.gd.uid new file mode 100644 index 0000000..aa0a7c9 --- /dev/null +++ b/src/camera_pivot.gd.uid @@ -0,0 +1 @@ +uid://dsio3o1q73f1q diff --git a/src/game_manager.gd b/src/game_manager.gd new file mode 100644 index 0000000..78f5a88 --- /dev/null +++ b/src/game_manager.gd @@ -0,0 +1,84 @@ +extends Node + +# id: { +# 'name': '...', +# 'models': [ +# { +# name: "...", +# activated_this_turn: bool, +# }, +# ], +# } +## List of current players. +var Players := {} + +## Number turns to play. +@export var max_turns := 0 + +## Number of the current turn. +@export var current_turn_number := 0 + +## ID of the current Player to play. +@export var current_activation_player := 0 + +## Array of players id to cycle forplay order. +@export var players_activation_order := [] +@export var players_activation_order_index = 0 + +func set_up_game() -> void: + print("Start of game") + current_turn_number = 0 + start_turn() + +func start_turn() -> void: + current_turn_number += 1 + print("Start of turn %s of %s" % [current_turn_number, max_turns]) + # Set Players activation order. + players_activation_order_index = 0 + players_activation_order = [] + for id in Players: + players_activation_order.append(id) + players_activation_order.sort_custom(_sort_players_by_units_left) + +func next_activation() -> void: + # Check that there are players with not activated models + var successfuly_activated := false + for _i in range(len(Players)): + var player = _alternate_over_players() + for model in player.models: + if not model.activated_this_turn: + successfuly_activated = true + break + if successfuly_activated: + break + if not successfuly_activated: + end_turn() + + +func end_turn() -> void: + print("End of turn %s of %s" % [current_turn_number, max_turns]) + if current_turn_number >= max_turns: + end_game() + +func end_game() -> void: + print("End of game") + pass + +# Utility functions + +func _sort_players_by_units_left(a, b) -> bool: + var player_a_models := 0 + for model in Players[a].models: + if model.in_action: + player_a_models += 1 + var player_b_models := 0 + for model in Players[b].models: + if model.in_action: + player_b_models += 1 + return player_a_models < player_b_models + +func _alternate_over_players() -> Dictionary: + players_activation_order_index += 1 + if players_activation_order_index >= len(players_activation_order): + players_activation_order_index = 0 + return Players[players_activation_order[players_activation_order_index]] \ No newline at end of file diff --git a/src/game_manager.gd.uid b/src/game_manager.gd.uid new file mode 100644 index 0000000..9221d27 --- /dev/null +++ b/src/game_manager.gd.uid @@ -0,0 +1 @@ +uid://diynhg88ldrpu diff --git a/src/main_game.gd b/src/main_game.gd index d4554c9..42f1487 100644 --- a/src/main_game.gd +++ b/src/main_game.gd @@ -8,4 +8,4 @@ func _ready() -> void: # Called every frame. 'delta' is the elapsed time since the previous frame. func _process(delta: float) -> void: - pass + pass \ No newline at end of file diff --git a/src/main_game.tscn b/src/main_game.tscn index 6a2c4f9..b68d69f 100644 --- a/src/main_game.tscn +++ b/src/main_game.tscn @@ -1,6 +1,7 @@ -[gd_scene load_steps=7 format=3 uid="uid://budrvmnmxvk2d"] +[gd_scene load_steps=8 format=3 uid="uid://budrvmnmxvk2d"] [ext_resource type="Script" uid="uid://b5kn17oto74o" path="res://src/main_game.gd" id="1_fq370"] +[ext_resource type="Script" uid="uid://dsio3o1q73f1q" path="res://src/camera_pivot.gd" id="2_3vl0c"] [ext_resource type="PackedScene" uid="uid://ds20afeq5fbty" path="res://src/models/combat_priest.tscn" id="2_78si8"] [ext_resource type="Texture2D" uid="uid://c3ydthu2vpopv" path="res://assets/dev_512_gr_032x.jpg" id="3_aptux"] @@ -17,14 +18,15 @@ size = Vector3(10, 1, 10) script = ExtResource("1_fq370") [node name="CameraPivot" type="Node3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 0.34202, -0.939692, 0, 0.939692, 0.34202, 0, 0, 0) +script = ExtResource("2_3vl0c") [node name="Camera3D" type="Camera3D" parent="CameraPivot"] -transform = Transform3D(1, 0, 0, 0, 0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 5, 5) - -[node name="DirectionalLight3D" type="DirectionalLight3D" parent="CameraPivot"] -transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 5, 0) +transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 10, 0) +keep_aspect = 0 [node name="BaseModel" parent="." instance=ExtResource("2_78si8")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.723289, 0) [node name="StaticBody3D" type="StaticBody3D" parent="."] @@ -36,3 +38,7 @@ shape = SubResource("BoxShape3D_78si8") transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.5, 0) material_override = SubResource("StandardMaterial3D_3vl0c") mesh = SubResource("BoxMesh_aptux") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, -0.707107, 0.707107, 0, -0.707107, -0.707107, 0, 10, -10) +shadow_enabled = true diff --git a/src/models/base_model.tscn b/src/models/base_model.tscn deleted file mode 100644 index 1c0f8ca..0000000 --- a/src/models/base_model.tscn +++ /dev/null @@ -1,22 +0,0 @@ -[gd_scene load_steps=3 format=3 uid="uid://c26jufswfi2bh"] - -[ext_resource type="Script" uid="uid://di5g5x80wtaw7" path="res://src/models/base_model.gd" id="1_ni6nx"] - -[sub_resource type="CylinderShape3D" id="CylinderShape3D_wfmmx"] - -[node name="BaseModel" type="CharacterBody3D"] -script = ExtResource("1_ni6nx") - -[node name="Pivot" type="Node3D" parent="."] - -[node name="Sprite2D" type="Sprite3D" parent="Pivot"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.30011, 0) -pixel_size = 0.0048 -billboard = 2 - -[node name="Base" type="MeshInstance3D" parent="Pivot"] -transform = Transform3D(57.2, 0, 0, 0, 57.2, 0, 0, 0, 57.2, 0, 0, 0) -skeleton = NodePath("") - -[node name="CollisionShape3D" type="CollisionShape3D" parent="."] -shape = SubResource("CylinderShape3D_wfmmx") diff --git a/src/models/combat_priest.tscn b/src/models/combat_priest.tscn index 371bd5d..6cef787 100644 --- a/src/models/combat_priest.tscn +++ b/src/models/combat_priest.tscn @@ -1,6 +1,6 @@ [gd_scene load_steps=7 format=3 uid="uid://ds20afeq5fbty"] -[ext_resource type="PackedScene" uid="uid://c26jufswfi2bh" path="res://src/models/base_model.tscn" id="1_t6p38"] +[ext_resource type="PackedScene" uid="uid://c26jufswfi2bh" path="res://src/base_model.tscn" id="1_t6p38"] [ext_resource type="Script" uid="uid://4h1cvticrj7u" path="res://src/utils/dice_modifier.gd" id="2_ni6nx"] [ext_resource type="Texture2D" uid="uid://cc85nihxm3set" path="res://assets/cartas/combat_priest_pixel.png" id="3_ni6nx"] diff --git a/webrtc/lib/~libwebrtc_native.windows.template_debug.x86_64.dll b/webrtc/lib/~libwebrtc_native.windows.template_debug.x86_64.dll new file mode 100644 index 0000000..63a9437 Binary files /dev/null and b/webrtc/lib/~libwebrtc_native.windows.template_debug.x86_64.dll differ