Remove chariot

This commit is contained in:
2026-06-08 22:11:19 -07:00
parent 5acfac10a5
commit c7b47cb32e
11 changed files with 42 additions and 7801 deletions
+1 -1
View File
@@ -7,7 +7,7 @@ public enum EnemyType
FilthEater,
Sara,
Ballos,
Chariot,
Planter,
Chinthe,
AmbassadorGreen,
AmbassadorRed,
@@ -23,8 +23,8 @@ public static class EnemyTypeToEnemyConverter
return InstantiateFromPath(@$"{_folderPath}/04. sara/Sara.tscn");
case EnemyType.Ballos:
return InstantiateFromPath(@$"{_folderPath}/05. ballos/Ballos.tscn");
case EnemyType.Chariot:
return InstantiateFromPath(@$"{_folderPath}/06. chariot/Chariot.tscn");
case EnemyType.Planter:
return InstantiateFromPath(@$"{_folderPath}/06. Planter/Planter.tscn");
case EnemyType.Chinthe:
return InstantiateFromPath(@$"{_folderPath}/07. chinthe/Chinthe.tscn");
case EnemyType.AmbassadorGreen:
@@ -62,8 +62,8 @@ public static class EnemyTypeToEnemyConverter
return EnemyType.Sara;
if (enemy is Ballos)
return EnemyType.Ballos;
if (enemy is Chariot)
return EnemyType.Chariot;
if (enemy is Planter)
return EnemyType.Planter;
if (enemy is Chinthe)
return EnemyType.Chinthe;
if (enemy is Ambassador ambassador)
@@ -1,103 +0,0 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using System;
using System.Collections.Generic;
using Zennysoft.Game.Ma;
using Zennysoft.Ma.Adapter;
[Meta(typeof(IAutoNode))]
public partial class Chariot : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBehavior, IHaveFollowBehavior
{
public override void _Notification(int what) => this.Notify(what);
[Export] private float PrimaryAttackChance { get; set; } = 0.75f;
[Export] private float SecondaryAttackChance { get; set; } = 0.25f;
[Node] public NavigationAgent3D NavigationAgent { get; set; }
[Node] public PatrolBehavior PatrolBehavior { get; set; } = default!;
[Node] public FollowBehavior FollowBehavior { get; set; } = default!;
[Node] public EngagePlayerBehavior EngagePlayerBehavior { get; set; } = default!;
[Node] public Area3D PlayerDetector { get; set; } = default!;
public void OnReady()
{
FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnChariotVelocityComputed;
FollowBehavior.OnVelocityComputed += OnChariotVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += Chariot_PlayerDetected;
PlayerDetector.BodyExited += Chariot_PlayerExitArea;
((EnemyModelView)EnemyModelView).CanMove = true;
SetPhysicsProcess(true);
}
private void Chariot_PlayerExitArea(Node3D body)
{
EngagePlayerBehavior.Disengage();
}
private void Chariot_PlayerDetected(Node3D body)
{
if (body is not IPlayer)
return;
if (!_activated)
_enemyLogic.Input(new EnemyLogic.Input.Activate());
EngagePlayerBehavior.Engage();
}
public override void Idle()
{
if (!_activated)
base.Idle();
}
public override void Move()
{
if (!_activated)
base.Move();
}
public void OnResolved()
{
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
}
public override void Activate()
{
if (!_activated)
{
((EnemyModelView)EnemyModelView).CanMove = false;
Velocity = Vector3.Zero;
EnemyModelView.PlayActivateAnimation();
}
}
public override void _Process(double delta)
{
if (!_activated)
base._Process(delta);
}
public override void PerformAction()
{
var rng = new RandomNumberGenerator();
var options = new List<Action>() { EnemyModelView.PlayPrimaryAttackAnimation, EnemyModelView.PlaySecondaryAttackAnimation };
var selection = rng.RandWeighted([PrimaryAttackChance, SecondaryAttackChance]);
options[(int)selection].Invoke();
}
public void OnChariotVelocityComputed(Vector3 safeVelocity)
{
Velocity = safeVelocity;
LookAtTarget(safeVelocity);
if (((EnemyModelView)EnemyModelView).CanMove)
MoveAndSlide();
}
}
@@ -1 +0,0 @@
uid://djx5x5bhkku85
@@ -1,121 +0,0 @@
[gd_scene load_steps=14 format=3 uid="uid://cd12cj1g37bn4"]
[ext_resource type="Script" uid="uid://djx5x5bhkku85" path="res://src/enemy/enemy_types/06. chariot/Chariot.cs" id="1_q1q0f"]
[ext_resource type="PackedScene" uid="uid://dwgq2bxolnx8l" path="res://src/enemy/enemy_types/06. chariot/ChariotModelView.tscn" id="3_q1q0f"]
[ext_resource type="PackedScene" uid="uid://cn4fv2gv6raql" path="res://src/enemy/behaviors/PatrolBehavior.tscn" id="4_ee8v4"]
[ext_resource type="PackedScene" uid="uid://cve5oouhowtff" path="res://src/enemy/behaviors/FollowBehavior.tscn" id="5_uv8in"]
[ext_resource type="AudioStream" uid="uid://ba8xendacec6" path="res://src/audio/sfx/item_kyuu_layer_2.ogg" id="6_582pa"]
[ext_resource type="PackedScene" uid="uid://cmhem5xknjsvc" path="res://src/enemy/behaviors/EngagePlayerBehavior.tscn" id="6_cfqmf"]
[ext_resource type="AudioStream" uid="uid://b7ycb6qvitpmw" path="res://src/audio/sfx/player_HITENEMY_3.ogg" id="7_jemva"]
[ext_resource type="AudioStream" uid="uid://bf7adfdd857hw" path="res://src/audio/sfx/enemy_morph.ogg" id="8_ave6n"]
[ext_resource type="AudioStream" uid="uid://daye7334d7rfe" path="res://src/audio/sfx/ENEMY_CHARIOT_DEATH.ogg" id="9_cfqmf"]
[sub_resource type="CapsuleShape3D" id="CapsuleShape3D_cwfph"]
radius = 1.67281
height = 3.34563
[sub_resource type="CylinderShape3D" id="CylinderShape3D_jbgmx"]
height = 5.0
radius = 1.0
[sub_resource type="SphereShape3D" id="SphereShape3D_lqifn"]
radius = 1.20703
[sub_resource type="CylinderShape3D" id="CylinderShape3D_582pa"]
radius = 2.34863
[node name="Chariot" type="CharacterBody3D" groups=["enemy"]]
process_mode = 1
collision_layer = 10
collision_mask = 3
axis_lock_linear_y = true
axis_lock_angular_x = true
script = ExtResource("1_q1q0f")
[node name="CollisionShape" type="CollisionShape3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.40414, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="LineOfSight" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 1.40414, 0)
collision_layer = 2
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="LineOfSight"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, 0, 0, -2)
shape = SubResource("CylinderShape3D_jbgmx")
[node name="Raycast" type="RayCast3D" parent="LineOfSight"]
unique_name_in_owner = true
transform = Transform3D(-1, 0, 8.74228e-08, 0, 1, 0, -8.74228e-08, 0, -1, 0, 0, 0)
target_position = Vector3(0, 0, 3)
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
collision_layer = 2048
collision_mask = 0
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision"]
shape = SubResource("SphereShape3D_lqifn")
[node name="EnemyModelView" parent="." instance=ExtResource("3_q1q0f")]
unique_name_in_owner = true
transform = Transform3D(0.999848, 0, 0.0174524, 0, 1, 0, -0.0174524, 0, 0.999848, 0, 0.0547004, 0)
[node name="PlayerDetector" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
collision_layer = 0
collision_mask = 2
[node name="CollisionShape3D" type="CollisionShape3D" parent="PlayerDetector"]
shape = SubResource("CylinderShape3D_582pa")
[node name="Components" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("4_ee8v4")]
unique_name_in_owner = true
[node name="FollowBehavior" parent="Components" instance=ExtResource("5_uv8in")]
unique_name_in_owner = true
_followSpeed = 150.0
[node name="EngagePlayerBehavior" parent="Components" instance=ExtResource("6_cfqmf")]
unique_name_in_owner = true
_acquireTargetTime = 2.0
[node name="NavigationAgent" type="NavigationAgent3D" parent="Components"]
unique_name_in_owner = true
avoidance_enabled = true
height = 3.0
radius = 1.0
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.40414, 0)
[node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("6_582pa")
bus = &"SFX"
[node name="HitSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("7_jemva")
bus = &"SFX"
[node name="MorphSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("8_ave6n")
bus = &"SFX"
[node name="DieSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
stream = ExtResource("9_cfqmf")
bus = &"SFX"
[node name="AggroSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true
bus = &"SFX"
@@ -1,21 +0,0 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
public partial class ChariotModelView : EnemyModelView2D, IEnemyModelView
{
public override void _Notification(int what) => this.Notify(what);
[Node] AnimationTree ScrollAnimationTree { get; set; } = default!;
public override void PlayActivateAnimation()
{
_stateMachine.Travel(_activateName);
var scrollStateMachine = (AnimationNodeStateMachinePlayback)ScrollAnimationTree.Get(_parametersPlayback);
scrollStateMachine.Travel(_activateName);
}
}
@@ -1 +0,0 @@
uid://ckxqmb4tu4rml
File diff suppressed because it is too large Load Diff
@@ -23,8 +23,6 @@ public partial class DungeonFloorNode : FloorNode
[Export]
public float Ballos { get; set; }
[Export]
public float Chariot { get; set; }
[Export]
public float Chinthe { get; set; }
[Export]
public float GreenAmbassador { get; set; }
@@ -20,9 +20,9 @@ public partial class DungeonFloor : Node3D, IDungeonFloor
public void InitializeDungeon()
{
Rooms = [];
Rooms = FindAllDungeonRooms([.. GetChildren()], Rooms);
_playerSpawnPoint = RandomizePlayerSpawnPoint();
Rooms = [];
Rooms = FindAllDungeonRooms([.. GetChildren()], Rooms);
_playerSpawnPoint = RandomizePlayerSpawnPoint();
}
public void FadeOutAudio()
@@ -32,27 +32,26 @@ public partial class DungeonFloor : Node3D, IDungeonFloor
public void SpawnEnemies(DungeonFloorNode floorNode)
{
var enemyOdds = new Godot.Collections.Dictionary<EnemyType, float>
{
{ EnemyType.Sproingy, floorNode.Sproingy },
{ EnemyType.Michael, floorNode.Michael },
{ EnemyType.FilthEater, floorNode.FilthEater },
{ EnemyType.Sara, floorNode.Sara },
{ EnemyType.Ballos, floorNode.Ballos },
{ EnemyType.Chariot, floorNode.Chariot },
{ EnemyType.Chinthe, floorNode.Chinthe },
{ EnemyType.AmbassadorGreen, floorNode.GreenAmbassador },
{ EnemyType.AmbassadorRed, floorNode.RedAmbassador },
{ EnemyType.AmbassadorSteel, floorNode.SteelAmbassador },
{ EnemyType.AgniDemon, floorNode.AgniDemon },
{ EnemyType.AqueousDemon, floorNode.AqueosDemon },
{ EnemyType.Palan, floorNode.Palan },
{ EnemyType.ShieldOfHeaven, floorNode.ShieldOfHeaven },
{ EnemyType.GoldSproingy, floorNode.GoldSproingy },
};
var monsterRooms = Rooms.OfType<MonsterRoom>();
foreach (var room in monsterRooms)
room.SpawnEnemies(enemyOdds);
var enemyOdds = new Godot.Collections.Dictionary<EnemyType, float>
{
{ EnemyType.Sproingy, floorNode.Sproingy },
{ EnemyType.Michael, floorNode.Michael },
{ EnemyType.FilthEater, floorNode.FilthEater },
{ EnemyType.Sara, floorNode.Sara },
{ EnemyType.Ballos, floorNode.Ballos },
{ EnemyType.Chinthe, floorNode.Chinthe },
{ EnemyType.AmbassadorGreen, floorNode.GreenAmbassador },
{ EnemyType.AmbassadorRed, floorNode.RedAmbassador },
{ EnemyType.AmbassadorSteel, floorNode.SteelAmbassador },
{ EnemyType.AgniDemon, floorNode.AgniDemon },
{ EnemyType.AqueousDemon, floorNode.AqueosDemon },
{ EnemyType.Palan, floorNode.Palan },
{ EnemyType.ShieldOfHeaven, floorNode.ShieldOfHeaven },
{ EnemyType.GoldSproingy, floorNode.GoldSproingy },
};
var monsterRooms = Rooms.OfType<MonsterRoom>();
foreach (var room in monsterRooms)
room.SpawnEnemies(enemyOdds);
}
public (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (_playerSpawnPoint.Rotation, new Vector3(_playerSpawnPoint.GlobalPosition.X, 0, _playerSpawnPoint.GlobalPosition.Z)); }
@@ -60,25 +59,25 @@ public partial class DungeonFloor : Node3D, IDungeonFloor
private Marker3D RandomizePlayerSpawnPoint()
{
var randomSpawnLocations = Rooms
.OfType<MonsterRoom>()
.Select(x => x.PlayerSpawn);
var godotCollection = new Godot.Collections.Array<Marker3D>(randomSpawnLocations);
var result = godotCollection.PickRandom();
return result;
var randomSpawnLocations = Rooms
.OfType<MonsterRoom>()
.Select(x => x.PlayerSpawn);
var godotCollection = new Godot.Collections.Array<Marker3D>(randomSpawnLocations);
var result = godotCollection.PickRandom();
return result;
}
private static ImmutableList<IDungeonRoom> FindAllDungeonRooms(List<Node> nodesToSearch, ImmutableList<IDungeonRoom> roomsFound)
{
if (nodesToSearch.Count == 0)
return roomsFound;
if (nodesToSearch.Count == 0)
return roomsFound;
foreach (var node in nodesToSearch)
{
if (node is IDungeonRoom dungeonRoom)
roomsFound = roomsFound.Add(dungeonRoom);
}
foreach (var node in nodesToSearch)
{
if (node is IDungeonRoom dungeonRoom)
roomsFound = roomsFound.Add(dungeonRoom);
}
return FindAllDungeonRooms([.. nodesToSearch.SelectMany(x => x.GetChildren())], roomsFound);
return FindAllDungeonRooms([.. nodesToSearch.SelectMany(x => x.GetChildren())], roomsFound);
}
}
@@ -60,7 +60,6 @@ public partial class PauseDebugMenu : Control, IDebugMenu
_enemyFilePath + "/03. filth_eater/FilthEater.tscn",
_enemyFilePath + "/04. sara/Sara.tscn",
_enemyFilePath + "/05. ballos/Ballos.tscn",
_enemyFilePath + "/06. chariot/Chariot.tscn",
_enemyFilePath + "/07. chinthe/Chinthe.tscn",
_enemyFilePath + "/08a. Ambassador/Ambassador.tscn",
_enemyFilePath + "/08b. Ambassador (red)/AmbassadorRed.tscn",