From 6a00e320b3230650b60a57eff22c2d88427fcdcf Mon Sep 17 00:00:00 2001 From: = Date: Wed, 28 Jan 2026 12:56:43 -0700 Subject: [PATCH] Optimized enemy code --- Assets/Scenes/DEVSCENES/EnemyTest.tscn | 141 ++++++++++++++++++++++++- Assets/Scenes/DEVSCENES/IQEnemy.cs | 79 +++++++------- 2 files changed, 176 insertions(+), 44 deletions(-) diff --git a/Assets/Scenes/DEVSCENES/EnemyTest.tscn b/Assets/Scenes/DEVSCENES/EnemyTest.tscn index b0d5939..2ffeeee 100644 --- a/Assets/Scenes/DEVSCENES/EnemyTest.tscn +++ b/Assets/Scenes/DEVSCENES/EnemyTest.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=15 format=4 uid="uid://b3g0hgfb0uw6a"] +[gd_scene load_steps=17 format=4 uid="uid://b3g0hgfb0uw6a"] [ext_resource type="Texture2D" uid="uid://b86fd86n5sxtr" path="res://Assets/Sprites/world_tileset.png" id="1_q0x10"] [ext_resource type="PackedScene" uid="uid://dr8qdk10uy0o4" path="res://Assets/Scenes/Persistant/Player.tscn" id="2_shvfg"] @@ -151,6 +151,139 @@ physics_layer_0/collision_layer = 1 physics_layer_0/collision_mask = 0 sources/0 = SubResource("TileSetAtlasSource_e35rp") +[sub_resource type="TileSetAtlasSource" id="TileSetAtlasSource_0b2hr"] +texture = ExtResource("1_q0x10") +0:0/0 = 0 +1:0/0 = 0 +2:0/0 = 0 +3:0/0 = 0 +4:0/0 = 0 +5:0/0 = 0 +6:0/0 = 0 +7:0/0 = 0 +8:0/0 = 0 +9:0/0 = 0 +10:0/0 = 0 +11:0/0 = 0 +0:1/0 = 0 +1:1/0 = 0 +2:1/0 = 0 +3:1/0 = 0 +4:1/0 = 0 +5:1/0 = 0 +6:1/0 = 0 +7:1/0 = 0 +8:1/0 = 0 +9:1/0 = 0 +10:1/0 = 0 +11:1/0 = 0 +0:2/0 = 0 +1:2/0 = 0 +2:2/0 = 0 +3:2/0 = 0 +4:2/0 = 0 +5:2/0 = 0 +6:2/0 = 0 +7:2/0 = 0 +8:2/0 = 0 +9:2/0 = 0 +10:2/0 = 0 +11:2/0 = 0 +0:3/0 = 0 +1:3/0 = 0 +2:3/0 = 0 +5:3/0 = 0 +6:3/0 = 0 +7:3/0 = 0 +8:3/0 = 0 +9:3/0 = 0 +0:4/0 = 0 +1:4/0 = 0 +2:4/0 = 0 +3:4/0 = 0 +4:4/0 = 0 +5:4/0 = 0 +6:4/0 = 0 +7:4/0 = 0 +8:4/0 = 0 +9:4/0 = 0 +0:5/0 = 0 +1:5/0 = 0 +2:5/0 = 0 +3:5/0 = 0 +4:5/0 = 0 +5:5/0 = 0 +6:5/0 = 0 +7:5/0 = 0 +8:5/0 = 0 +1:6/0 = 0 +2:6/0 = 0 +3:6/0 = 0 +4:6/0 = 0 +5:6/0 = 0 +6:6/0 = 0 +7:6/0 = 0 +8:6/0 = 0 +0:7/0 = 0 +1:7/0 = 0 +3:7/0 = 0 +5:7/0 = 0 +6:7/0 = 0 +7:7/0 = 0 +8:7/0 = 0 +0:8/0 = 0 +1:8/0 = 0 +2:8/0 = 0 +3:8/0 = 0 +4:8/0 = 0 +5:8/0 = 0 +6:8/0 = 0 +7:8/0 = 0 +8:8/0 = 0 +0:9/0 = 0 +1:9/0 = 0 +2:9/0 = 0 +3:9/0 = 0 +4:9/0 = 0 +5:9/0 = 0 +6:9/0 = 0 +7:9/0 = 0 +0:10/0 = 0 +1:10/0 = 0 +2:10/0 = 0 +3:10/0 = 0 +4:10/0 = 0 +6:10/0 = 0 +0:11/0 = 0 +1:11/0 = 0 +2:11/0 = 0 +3:11/0 = 0 +4:11/0 = 0 +5:11/0 = 0 +0:12/0 = 0 +1:12/0 = 0 +2:12/0 = 0 +3:12/0 = 0 +4:12/0 = 0 +0:13/0 = 0 +1:13/0 = 0 +2:13/0 = 0 +3:13/0 = 0 +4:13/0 = 0 +5:13/0 = 0 +0:14/0 = 0 +1:14/0 = 0 +2:14/0 = 0 +3:14/0 = 0 +4:14/0 = 0 +0:15/0 = 0 +1:15/0 = 0 +2:15/0 = 0 +3:15/0 = 0 + +[sub_resource type="TileSet" id="TileSet_7343r"] +sources/0 = SubResource("TileSetAtlasSource_0b2hr") + [sub_resource type="Animation" id="Animation_owkni"] length = 0.001 tracks/0/type = "value" @@ -228,10 +361,14 @@ _data = { [node name="Level1" type="Node2D"] [node name="PlayArea" type="TileMapLayer" parent="."] -tile_map_data = PackedByteArray("AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAJAAAAAAAAAAEAAAAKAAAAAAAAAAEAAAD//wEAAAAAAAEAAAAAAAEAAAAAAAEAAAABAAEAAAAAAAEAAAACAAEAAAAAAAEAAAADAAEAAAAAAAEAAAAEAAEAAAAAAAEAAAAFAAEAAAAAAAEAAAAGAAEAAAAAAAEAAAAHAAEAAAAAAAEAAAAIAAEAAAAAAAEAAAAJAAEAAAAAAAEAAAAKAAEAAAAAAAEAAAALAAEAAAAAAAAAAAAMAAEAAAAAAAAAAAANAAEAAAAAAAAAAAAOAAEAAAAAAAAAAAAPAAEAAAAAAAAAAAAQAAEAAAAAAAAAAAARAAEAAAAAAAAAAAASAAEAAAAAAAEAAAASAAAAAAAAAAEAAAATAAAAAAAAAAEAAAAUAAAAAAAAAAAAAAAUAAEAAAAAAAEAAAATAAEAAAAAAAEAAAASAP//AAAAAAEAAAASAP7/AAAAAAEAAAASAP3/AAAAAAEAAAASAPz/AAAAAAEAAAATAPz/AAAAAAEAAAATAP3/AAAAAAEAAAATAP7/AAAAAAEAAAATAP//AAAAAAEAAAASAPv/AAAAAAAAAAATAPv/AAAAAAAAAAAKAP//AAAAAAAAAAAJAP//AAAAAAAAAAD+/wEAAAAAAAEAAAD+/wAAAAAAAAEAAAD+////AAAAAAEAAAD+//7/AAAAAAEAAAD+//3/AAAAAAEAAAD+//z/AAAAAAEAAAD9//z/AAAAAAEAAAD9//v/AAAAAAAAAAD+//v/AAAAAAAAAAD9//3/AAAAAAEAAAD9//7/AAAAAAEAAAD9////AAAAAAEAAAD9/wAAAAAAAAEAAAD9/wEAAAAAAAEAAAAMAPz/AAAAAAAAAAADAPv/AAAAAAAAAAACAPv/AAAAAAAAAAANAPz/AAAAAAAAAAAOAPz/AAAAAAAAAAAGAP3/AAAAAAAAAAAHAP3/AAAAAAAAAAA=") +tile_map_data = PackedByteArray("AAD//wAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAACAAAAAAAAAAAAAAADAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAGAAAAAAAAAAAAAAAHAAAAAAAAAAAAAAAIAAAAAAAAAAAAAAAJAAAAAAAAAAEAAAD//wEAAAAAAAEAAAAAAAEAAAAAAAEAAAABAAEAAAAAAAEAAAACAAEAAAAAAAEAAAADAAEAAAAAAAEAAAAEAAEAAAAAAAEAAAAFAAEAAAAAAAEAAAAGAAEAAAAAAAEAAAAHAAEAAAAAAAEAAAAIAAEAAAAAAAEAAAAJAAEAAAAAAAEAAAAKAAEAAAAAAAEAAAALAAEAAAAAAAAAAAAMAAEAAAAAAAAAAAANAAEAAAAAAAAAAAAOAAEAAAAAAAAAAAAPAAEAAAAAAAAAAAAQAAEAAAAAAAAAAAARAAEAAAAAAAAAAAASAAEAAAAAAAEAAAASAAAAAAAAAAEAAAATAAAAAAAAAAEAAAAUAAAAAAAAAAAAAAAUAAEAAAAAAAEAAAATAAEAAAAAAAEAAAASAP//AAAAAAEAAAASAP7/AAAAAAEAAAASAP3/AAAAAAEAAAASAPz/AAAAAAEAAAATAPz/AAAAAAEAAAATAP3/AAAAAAEAAAATAP7/AAAAAAEAAAATAP//AAAAAAEAAAASAPv/AAAAAAAAAAATAPv/AAAAAAAAAAAKAP//AAAAAAAAAAAJAP//AAAAAAAAAAD+/wEAAAAAAAEAAAD+/wAAAAAAAAEAAAD+//3/AAAAAAEAAAD+//z/AAAAAAEAAAD9//z/AAAAAAEAAAD9//v/AAAAAAAAAAD+//v/AAAAAAAAAAD9//3/AAAAAAEAAAD9/wAAAAAAAAEAAAD9/wEAAAAAAAEAAAAMAPz/AAAAAAAAAAADAPv/AAAAAAAAAAACAPv/AAAAAAAAAAANAPz/AAAAAAAAAAAOAPz/AAAAAAAAAAAGAP3/AAAAAAAAAAAHAP3/AAAAAAAAAAD8/wAAAAAAAAAAAAD7/wAAAAAAAAAAAAD6/wAAAAAAAAAAAAD5/wAAAAAAAAAAAAD4/wAAAAAAAAEAAAD3/wAAAAAAAAEAAAD4////AAAAAAAAAAD3////AAAAAAAAAAD2////AAAAAAAAAAD1////AAAAAAEAAAD1//7/AAAAAAAAAAD0//7/AAAAAAEAAAD5//z/AAAAAAAAAAD6//z/AAAAAAAAAAD8/wEAAAAAAAEAAAD7/wEAAAAAAAEAAAD6/wEAAAAAAAEAAAD5/wEAAAAAAAEAAAD4/wEAAAAAAAEAAAD3/wEAAAAAAAEAAAD2/wEAAAAAAAEAAAD1/wEAAAAAAAEAAAD0/wEAAAAAAAEAAAD0/wAAAAAAAAEAAAD0////AAAAAAEAAAD0//3/AAAAAAEAAAD0//z/AAAAAAEAAAD0//v/AAAAAAEAAAD0//r/AAAAAAEAAADz//r/AAAAAAEAAADz//v/AAAAAAEAAADz//z/AAAAAAEAAADz//3/AAAAAAEAAADz//7/AAAAAAEAAADz////AAAAAAEAAADz/wAAAAAAAAEAAAD1/wAAAAAAAAEAAAD2/wAAAAAAAAEAAADz/wEAAAAAAAEAAADz//n/AAAAAAAAAAD0//n/AAAAAAAAAAAKAAAAAAAAAAEAAAA=") tile_set = SubResource("TileSet_q0ben") [node name="Background" type="TileMapLayer" parent="."] +self_modulate = Color(0.50980395, 0.50980395, 0.50980395, 1) +z_index = -1 +tile_map_data = PackedByteArray("AAD5//3/AAAAAAEAAAD5//7/AAAAAAEAAAD5////AAAAAAEAAAD6////AAAAAAEAAAD6//7/AAAAAAEAAAD6//3/AAAAAAEAAAD7////AAAAAAEAAAD8////AAAAAAEAAAD9////AAAAAAEAAAD9//7/AAAAAAEAAAD+//7/AAAAAAEAAAD+////AAAAAAEAAAD8//7/AAAAAAEAAAACAPz/AAAAAAEAAAACAP3/AAAAAAEAAAACAP7/AAAAAAEAAAACAP//AAAAAAEAAAADAP//AAAAAAEAAAADAP7/AAAAAAEAAAADAP3/AAAAAAEAAAADAPz/AAAAAAEAAAAGAP7/AAAAAAEAAAAGAP//AAAAAAEAAAAHAP//AAAAAAEAAAAHAP7/AAAAAAEAAAAFAP//AAAAAAEAAAD/////AAAAAAEAAAABAP7/AAAAAAEAAAABAP//AAAAAAEAAAAAAP//AAAAAAEAAAAMAP3/AAAAAAEAAAANAP3/AAAAAAEAAAAOAP3/AAAAAAEAAAAOAP7/AAAAAAEAAAAOAP//AAAAAAEAAAAOAAAAAAAAAAEAAAANAAAAAAAAAAEAAAAMAAAAAAAAAAEAAAAMAP//AAAAAAEAAAAMAP7/AAAAAAEAAAANAP7/AAAAAAEAAAANAP//AAAAAAEAAAALAAAAAAAAAAEAAAALAP//AAAAAAEAAAAKAAAAAAAAAAEAAAAPAAAAAAAAAAEAAAAQAAAAAAAAAAEAAAABAP3/AAAAAAAAAAD8//3/AAAAAAAAAAD7//7/AAAAAAAAAAAFAP7/AAAAAAAAAAALAP7/AAAAAAAAAAAPAP//AAAAAAAAAAAQAP//AAAAAAAAAAA=") +tile_set = SubResource("TileSet_7343r") [node name="Foreground" type="TileMapLayer" parent="."] diff --git a/Assets/Scenes/DEVSCENES/IQEnemy.cs b/Assets/Scenes/DEVSCENES/IQEnemy.cs index 68d01ad..9a4dadf 100644 --- a/Assets/Scenes/DEVSCENES/IQEnemy.cs +++ b/Assets/Scenes/DEVSCENES/IQEnemy.cs @@ -10,28 +10,14 @@ public partial class IQEnemy : CharacterBody2D // Enemy Stats public int IQ; public float HP; - public float MaxHP; - float RegenerationAmmount; - float RegenerationInterval; - float WalkSpeed; - float JumpHeight; + float MaxHP, RegenerationAmmount, RegenerationInterval, WalkSpeed, JumpHeight, DetectionRange; // Enemy Conditions - float CurrentYVelocity; - float PreviousYVelocity; - bool GroundDetected; - bool LedgeDetected; - bool WallDetected; + bool GroundDetected, LedgeDetected, WallDetected; String FacingDirection; // Enemy Abilities - bool AbilityJump = false; - bool AbilityMove = false; - bool AbilityAttack = false; - bool AbilityDash = false; - bool AbilityCloak = false; - bool AbilityTeleport = false; - bool AbilityRegenerate = false; + bool AbilityJump, AbilityMove, AbilityAttack, AbilityDash, AbilityCloak, AbilityTeleport, AbilityRegenerate = false; public override void _Ready() { @@ -51,6 +37,8 @@ public partial class IQEnemy : CharacterBody2D else WalkSpeed = 20.0f; if (HasMeta("JumpHeight")) JumpHeight = (float)GetMeta("JumpHeight"); else JumpHeight = 250.0f; + if (HasMeta("DetectionRange")) DetectionRange = (float)GetMeta("DetectionRange"); + else DetectionRange = 100.0f; JumpHeight *= -1; // Read and set stats @@ -93,54 +81,56 @@ public partial class IQEnemy : CharacterBody2D // Regenerate Health if (AbilityRegenerate){ - if (GlobalTimer % RegenerationInterval == 0){Regenerate(RegenerationAmmount);} + if (GlobalTimer % RegenerationInterval == 0) Regenerate(RegenerationAmmount); } // Movement // Add gravity. - if (GroundDetected == false){Velocity = new Vector2(Velocity[0],Velocity[1] + 10);} + if (GroundDetected == false) Velocity = new Vector2(Velocity[0],Velocity[1] + 10); #region 20IQ if (IQ >= 0 && IQ <= 20){ // Goomba ahh diddy blud - if (GroundDetected && LedgeDetected == false){Flip();} // Flip when presented with a ledge - if (WallDetected){Flip();} // Flip when comeing in contact with a wall - if (GroundDetected){Velocity = new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]);} // Walk + if (GroundDetected && LedgeDetected == false) Flip(); // Flip when presented with a ledge + if (WallDetected) Flip(); // Flip when comeing in contact with a wall + if (GroundDetected) Velocity = new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]); // Walk } #endregion #region 30IQ if (IQ > 20 && IQ <= 30){ // Goomba w/ hopps (no judy) Velocity = new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]); // Walk - if (WallDetected && GroundDetected && Velocity[1] == 0){Velocity = new Vector2(Velocity[0], JumpHeight);} // Jump - if (WallDetected && GroundDetected && Velocity[1] > 0){Flip();} // Wall too high + if (WallDetected && GroundDetected && Velocity[1] == 0) Velocity = new Vector2(Velocity[0], JumpHeight); // Jump + if (WallDetected && GroundDetected && Velocity[1] > 0) Flip(); // Wall too high } #endregion #region 40IQ if (IQ > 30 && IQ <= 40){ // Adds jumping when reaching edge as feature (also adding directional x force) - if (GroundDetected){Velocity = new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]);} // Walk on ground - else{Velocity = new Vector2(WalkSpeed * VAH.Scale[0] * 2, Velocity[1]);} // Walk on air - if (WallDetected && GroundDetected && Velocity[1] == 0){Velocity = new Vector2(Velocity[0], JumpHeight);} // Jump - //if (GroundDetected && LedgeDetected == false && Velocity[1] == 0){Velocity = new Vector2(Velocity[0] * 50, JumpHeight);} // Jump at ledge - if (GroundDetected && LedgeDetected == false && Velocity[1] == 0){Velocity = new Vector2(Velocity[0], JumpHeight);} // Jump at ledge - if (WallDetected && GroundDetected && Velocity[1] > 0){Flip();} // Wall too high + Velocity = (GroundDetected) ? new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]) : new Vector2(WalkSpeed * VAH.Scale[0] / 2, Velocity[1]); // Walk on air or ground + if (WallDetected && GroundDetected && Velocity[1] == 0) Velocity = new Vector2(Velocity[0], JumpHeight); // Jump + //if (GroundDetected && LedgeDetected == false && Velocity[1] == 0) Velocity = new Vector2(Velocity[0] * 50, JumpHeight); // Jump at ledge + if (GroundDetected && LedgeDetected == false && Velocity[1] == 0) Velocity = new Vector2(Velocity[0], JumpHeight); // Jump at ledge + if (WallDetected && GroundDetected && Velocity[1] > 0) Flip(); // Wall too high } #endregion #region 60IQ if (IQ > 40 && IQ <= 60){ // Concious of what side of the enemy the player is on - var CurrentLevel = GetTree().Root.GetChildren(); - float DistanceFromPlayerX = GlobalPosition[0] - CurrentLevel[2].GetNode("Player").GlobalPosition[0]; - if (DistanceFromPlayerX > (30.0f / (IQ / 4))){ if (VAH.Scale[0] > 0){Flip();}} // left of player - if (DistanceFromPlayerX < (-30.0f / (IQ / 4))){ if (VAH.Scale[0] < 0){Flip();}} // right of player - - if (DistanceFromPlayerX < (-30.0f / (IQ / 4)) && GroundDetected && GlobalPosition[0] > CurrentLevel[2].GetNode("Player").GlobalPosition[1]) {Velocity = new Vector2(Velocity[0], JumpHeight);} // Jump when player is overhead - if (GroundDetected){Velocity = new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]);} // Walk on ground - else{Velocity = new Vector2(WalkSpeed * VAH.Scale[0] * 2, Velocity[1]);} // Walk on air - if (WallDetected && GroundDetected && Velocity[1] == 0){Velocity = new Vector2(Velocity[0], JumpHeight);} // Jump - //if (GroundDetected && LedgeDetected == false && Velocity[1] == 0){Velocity = new Vector2(Velocity[0] * 50, JumpHeight);} // Jump at ledge - if (GroundDetected && LedgeDetected == false && Velocity[1] == 0){Velocity = new Vector2(Velocity[0], JumpHeight);} // Jump at ledge + if (DetectsPlayer()){ // Pursuing Player + var CurrentLevel = GetTree().Root.GetChildren(); + float DistanceFromPlayerX = GlobalPosition[0] - CurrentLevel[2].GetNode("Player").GlobalPosition[0]; + if (DistanceFromPlayerX > (30.0f / (IQ / 4))) if (VAH.Scale[0] > 0)Flip(); // left of player + if (DistanceFromPlayerX < (-30.0f / (IQ / 4))) if (VAH.Scale[0] < 0)Flip(); // right of player + if (DistanceFromPlayerX < (-30.0f / (IQ / 4)) && GroundDetected && GlobalPosition[0] > CurrentLevel[2].GetNode("Player").GlobalPosition[1]) Velocity = new Vector2(Velocity[0], JumpHeight); // Jump when player is overhead + } else { // Patrol + if (WallDetected && GroundDetected && Velocity[1] > 0)Flip(); // Wall too high + } + // Common Behaviors + Velocity = (GroundDetected) ? new Vector2(WalkSpeed * VAH.Scale[0], Velocity[1]) : new Vector2(WalkSpeed * VAH.Scale[0] / 2, Velocity[1]); // Walk on air or ground + if (WallDetected && GroundDetected && Velocity[1] == 0) Velocity = new Vector2(Velocity[0], JumpHeight); // Jump + //if (GroundDetected && LedgeDetected == false && Velocity[1] == 0) Velocity = new Vector2(Velocity[0] * 50, JumpHeight); // Jump at ledge + if (GroundDetected && LedgeDetected == false && Velocity[1] == 0) Velocity = new Vector2(Velocity[0], JumpHeight); // Jump at ledge } #endregion #region 80IQ - if (IQ > 60 && IQ <= 80){ // Maintan distance to avoid melee attacks and optimise ranged attacks + if (IQ > 60 && IQ <= 80){ // Maintain distance to avoid melee attacks and optimise ranged attacks } #endregion #region 1000IQ @@ -166,6 +156,11 @@ public partial class IQEnemy : CharacterBody2D else if (FacingDirection == "LEFT"){FacingDirection = "RIGHT";} } + bool DetectsPlayer(){ + var CurrentLevel = GetTree().Root.GetChildren(); + return (GlobalPosition.DistanceTo(CurrentLevel[2].GetNode("Player").GlobalPosition) <= DetectionRange) ? true : false; + } + public void Regenerate(float ammount){ if (HP < MaxHP) HP += ammount; if (HP > MaxHP) HP = MaxHP; // Catch errors