From 9c2d5d34e5a21296fd4f9f21723cc444dbc603ee Mon Sep 17 00:00:00 2001 From: Nikolai Fesenko <152747946+NikolaiFesenko-code@users.noreply.github.com> Date: Fri, 29 Aug 2025 00:05:43 +0200 Subject: [PATCH] basic ai --- Scenes/AI.tscn | 7 +++++++ Scenes/main.tscn | 11 +++++++---- Scripts/ai.gd | 23 +++++++++++++++++++++++ Scripts/ai.gd.uid | 1 + Scripts/bullet.gd | 2 ++ Scripts/game_manager.gd | 27 +++++++++++++++++++-------- Scripts/revolver.gd | 6 +++++- 7 files changed, 64 insertions(+), 13 deletions(-) create mode 100644 Scenes/AI.tscn create mode 100644 Scripts/ai.gd create mode 100644 Scripts/ai.gd.uid diff --git a/Scenes/AI.tscn b/Scenes/AI.tscn new file mode 100644 index 0000000..86f7695 --- /dev/null +++ b/Scenes/AI.tscn @@ -0,0 +1,7 @@ +[gd_scene load_steps=3 format=3 uid="uid://bueqdw22nl501"] + +[ext_resource type="PackedScene" uid="uid://c7t8himcaqljg" path="res://Blends/Person/person2.gltf" id="1_y8wit"] +[ext_resource type="Script" uid="uid://b3rkpiosqgfdi" path="res://Scripts/ai.gd" id="2_wxquw"] + +[node name="person2" instance=ExtResource("1_y8wit")] +script = ExtResource("2_wxquw") diff --git a/Scenes/main.tscn b/Scenes/main.tscn index 230cdc9..8b27739 100644 --- a/Scenes/main.tscn +++ b/Scenes/main.tscn @@ -1,10 +1,10 @@ [gd_scene load_steps=6 format=3 uid="uid://b4ot3p50x08po"] [ext_resource type="PackedScene" uid="uid://cuqeg7u667dw6" path="res://Blends/Room/room.gltf" id="1_jjgbg"] -[ext_resource type="PackedScene" uid="uid://c7t8himcaqljg" path="res://Blends/Person/person2.gltf" id="2_bo1nx"] [ext_resource type="PackedScene" uid="uid://j06vthscroca" path="res://Scenes/bullet.tscn" id="3_8gbba"] [ext_resource type="PackedScene" uid="uid://bge7npb7b1y6x" path="res://Scenes/revolver.tscn" id="4_jjvhh"] [ext_resource type="Script" uid="uid://dcmqt4341kxem" path="res://Scripts/bullet_stack.gd" id="4_kry3j"] +[ext_resource type="PackedScene" uid="uid://bueqdw22nl501" path="res://Scenes/AI.tscn" id="5_kry3j"] [node name="Node3D" type="Node3D"] @@ -21,9 +21,6 @@ transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 6.1 spot_range = 4.8595 spot_angle = 42.0126 -[node name="person2" parent="." instance=ExtResource("2_bo1nx")] -transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.0599972, 3.68584, -2.25251) - [node name="revolver" parent="." instance=ExtResource("4_jjvhh")] transform = Transform3D(-0.1, -8.74228e-09, 0, 8.74228e-09, -0.1, 0, 0, 0, 0.1, 0.354285, 4.2476, 0.425178) is_player_revolver = true @@ -50,4 +47,10 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.126874, -0.00966144, 0.1641 [node name="bullet6" parent="BulletStack" instance=ExtResource("3_8gbba")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.300729, -0.0193229, 0.207828) +[node name="person3" parent="." instance=ExtResource("5_kry3j")] +transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 0.0599972, 3.68584, -2.25251) + +[node name="enemy_revolver" parent="." instance=ExtResource("4_jjvhh")] +transform = Transform3D(0.1, 0, 0, 0, -0.1, -8.74228e-09, 0, 8.74228e-09, -0.1, 0.354285, 4.2476, -0.496572) + [editable path="revolver"] diff --git a/Scripts/ai.gd b/Scripts/ai.gd new file mode 100644 index 0000000..871428c --- /dev/null +++ b/Scripts/ai.gd @@ -0,0 +1,23 @@ +extends Node3D + +var revolver: Node3D + +func _ready() -> void: + revolver = GameManager.get_enemy_revolver() + GameManager.state_changed.connect(on_state_changed) + +func on_state_changed(): + if GameManager.current_state == GameManager.GameState.PLAYER2_GUN_LOAD: + make_turn() + +func make_turn(): + if revolver == null: + revolver = GameManager.get_enemy_revolver() + var bullets = GameManager.bullets + var avaible_bullets = Array() + for bullet in bullets: + if bullet.is_loaded == false: + avaible_bullets.append(bullet) + var randNumb = randi_range(0, avaible_bullets.size() -1) + revolver.load_bullet(avaible_bullets[randNumb]) + diff --git a/Scripts/ai.gd.uid b/Scripts/ai.gd.uid new file mode 100644 index 0000000..8e95ca2 --- /dev/null +++ b/Scripts/ai.gd.uid @@ -0,0 +1 @@ +uid://b3rkpiosqgfdi diff --git a/Scripts/bullet.gd b/Scripts/bullet.gd index 5418436..889cfed 100644 --- a/Scripts/bullet.gd +++ b/Scripts/bullet.gd @@ -4,11 +4,13 @@ signal destination_reached var is_live: bool = false +var is_loaded: bool = false var is_target_reached: bool = true var target_position: Vector3 func _ready() -> void: + GameManager.add_bullet(self) target_position = Vector3.ZERO destination_reached.connect(on_target_reached) diff --git a/Scripts/game_manager.gd b/Scripts/game_manager.gd index d9021ed..1e6e29c 100644 --- a/Scripts/game_manager.gd +++ b/Scripts/game_manager.gd @@ -2,9 +2,11 @@ extends Node signal bullet_selected(object) +signal state_changed enum GameState { PLAYER1_GUN_LOAD, PLAYER2_GUN_LOAD, GUN_ANIMATION} var current_state = GameState.PLAYER1_GUN_LOAD +var prev_state: int var bullets: Array var player1_revolver: Node3D @@ -12,7 +14,6 @@ var player2_revolver: Node3D var bullet_stack: Node3D func _ready() -> void: - bullets.resize(21) bullet_selected.connect(on_bullet_selected) func _input(event: InputEvent) -> void: @@ -28,16 +29,26 @@ func set_enemy_revolver(newRevolver): func set_bullet_stack(newStack): bullet_stack = newStack -func add_bullet(): - pass +func add_bullet(bullet): + bullets.append(bullet) func on_bullet_selected(bullet_object: Node3D): if current_state == GameState.PLAYER1_GUN_LOAD: - current_state = GameState.GUN_ANIMATION - player1_revolver.load_bullet(bullet_object) + if bullet_object.is_loaded != true: + set_state(GameState.GUN_ANIMATION) + player1_revolver.load_bullet(bullet_object) +func set_state(newState): + prev_state = current_state + current_state = newState + state_changed.emit() -func end_turn(): - if current_state == GameState.PLAYER1_GUN_LOAD: - current_state = GameState.PLAYER2_GUN_LOAD + + +func end_player_turn(): + set_state(GameState.PLAYER2_GUN_LOAD) +func end_enemy_turn(): + set_state(GameState.PLAYER1_GUN_LOAD) +func get_enemy_revolver() -> Node3D: + return player2_revolver diff --git a/Scripts/revolver.gd b/Scripts/revolver.gd index 85a4911..c9d2357 100644 --- a/Scripts/revolver.gd +++ b/Scripts/revolver.gd @@ -29,6 +29,7 @@ func _process(delta: float) -> void: #cylinder.rotation_degrees = Vector3(30 + current_round*60,90,90) func load_bullet(bullet_object: Node3D): loaded_bullets[current_round] = bullet_object + bullet_object.is_loaded = true bullet_object.destination_reached.connect(on_bullet_reached) bullet_object.moveTo(to_global(bullet_target_pos)) bullet_object.rotate_x(deg_to_rad(-90)) @@ -39,7 +40,10 @@ func load_bullet(bullet_object: Node3D): func on_load_anim_end(): is_cylinder_out = false - GameManager.end_turn() + if is_player_revolver: + GameManager.end_player_turn() + else: + GameManager.end_enemy_turn() timer.timeout.disconnect(on_load_anim_end) func on_bullet_reached():