Boss fixes, various changes

This commit is contained in:
2026-01-25 19:01:34 -08:00
parent 2622ed4423
commit 865934399d
25 changed files with 5770 additions and 371 deletions

View File

@@ -265,7 +265,7 @@ EnemyViewerWalk={
[internationalization]
locale/translations_pot_files=PackedStringArray("res://src/dialog/Dialogue.dialogue", "res://src/npc/Ran/ran.dialogue", "res://src/npc/Rat/ratdialogue.dialogue", "res://src/dialog/Altar.dialogue")
locale/translations_pot_files=PackedStringArray("res://src/dialog/Dialogue.dialogue", "res://src/npc/Ran/ran.dialogue", "res://src/npc/Rat/ratdialogue.dialogue", "res://src/dialog/Altar.dialogue", "res://stone.dialogue")
[layer_names]

View File

@@ -110,8 +110,6 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
EnemyHitbox.SetDeferred(CollisionShape3D.PropertyName.Disabled, false);
}
public override void Die() => QueueFree();
public void RotateToPlayer(float rotationAngle)
{
var tweener = GetTree().CreateTween();

View File

@@ -13,12 +13,40 @@ public partial class EnemyModelView3D : EnemyModelView
[Node] public MeshInstance3D MeshInstance { get; set; } = default!;
[Node] public AnimationPlayer DeathAnimation { get; set; } = default!;
[Node] public Node3D Armature { get; set; } = default!;
[Node] public Node3D ExplodingModel { get; set; } = default!;
public void OnReady()
{
DeathAnimation.AnimationFinished += DeathAnimation_AnimationFinished;
}
private void DeathAnimation_AnimationFinished(StringName animName)
{
QueueFree();
}
public override Vector2 GetSize()
{
var aabb = MeshInstance.GetAabb();
return new Vector2(aabb.Size.X, aabb.Position.Abs().Y);
}
public override void PlayHitAnimation()
{
}
public override void PlayDeathAnimation()
{
Armature.Hide();
ExplodingModel.Show();
DeathAnimation.Play("Animation");
}
private void ChangeMaterial()
{
var material = new StandardMaterial3D

View File

@@ -42,10 +42,11 @@ script = ExtResource("1_xsluo")
[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, 0, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 2.18615, 0)
shape = SubResource("CapsuleShape3D_cwfph")
[node name="Collision" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.18615, 0)
[node name="Collision" type="Area3D" parent="Collision"]
collision_layer = 2048
@@ -83,11 +84,13 @@ collision_mask = 34
shape = SubResource("CylinderShape3D_drfkj")
[node name="Visual" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1, 0)
[node name="EnemyModelView" parent="Visual" instance=ExtResource("4_o3b7p")]
unique_name_in_owner = true
[node name="Components" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.18615, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("4_drfkj")]
unique_name_in_owner = true
@@ -108,6 +111,7 @@ avoidance_enabled = true
radius = 1.0
[node name="SFX" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.18615, 0)
[node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="SFX"]
unique_name_in_owner = true

View File

@@ -666,7 +666,7 @@ EnemyLoreInfo = SubResource("Resource_ivy74")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 0, 0)
transform = Transform3D(6, 0, 0, 0, 6, 0, 0, 0, 6, 0, 1.1044, 0)
pixel_size = 0.001
billboard = 2
shaded = true
@@ -697,7 +697,7 @@ animation = &"idle_left_walk"
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 0, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 1.1044, 0)
collision_layer = 64
collision_mask = 64
@@ -722,11 +722,12 @@ anim_player = NodePath("../AnimationPlayer")
[node name="WalkSFX" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.1044, 0)
autoplay = true
bus = &"SFX"
[node name="Shadow" type="Sprite3D" parent="."]
transform = Transform3D(0.115, 0, 0, 0, -5.02681e-09, 0.115, 0, -0.115, -5.02681e-09, -0.00018537, -1.10125, 0.0453106)
transform = Transform3D(0.115, 0, 0, 0, -5.02681e-09, 0.115, 0, -0.115, -5.02681e-09, -0.00018537, 0.00315392, 0.0453106)
transparency = 0.1
cast_shadow = 0
texture_filter = 0

View File

@@ -35,7 +35,7 @@ script = ExtResource("1_lb5oy")
[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, 0, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 2.27161, 0)
collision_layer = 2
collision_mask = 2
@@ -45,21 +45,22 @@ shape = SubResource("CylinderShape3D_jbgmx")
[node name="Raycast" type="RayCast3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 0, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, 0, 2.27161, 0)
target_position = Vector3(0, 0, -5)
collision_mask = 3
[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.0824751, 0.212459, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.0824751, 2.48407, 0)
shape = SubResource("CapsuleShape3D_0h5s2")
[node name="EnemyModelView" parent="." instance=ExtResource("3_wrps7")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0799522, 0, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0799522, 1.36029, 0)
[node name="PlayerDetector" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.27161, 0)
collision_layer = 0
collision_mask = 34
@@ -67,6 +68,7 @@ collision_mask = 34
shape = SubResource("CylinderShape3D_eek1b")
[node name="Collision" type="Area3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.27161, 0)
collision_layer = 2048
collision_mask = 0
@@ -75,6 +77,7 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.120117, 0.221246, 0)
shape = SubResource("SphereShape3D_wrps7")
[node name="Components" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.27161, 0)
[node name="PatrolBehavior" parent="Components" instance=ExtResource("5_fkx5j")]
unique_name_in_owner = true
@@ -93,6 +96,7 @@ avoidance_enabled = true
radius = 1.0
[node name="HitSounds" type="Node3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.27161, 0)
[node name="AbsorbSFX" type="AudioStreamPlayer3D" parent="HitSounds"]
unique_name_in_owner = true

View File

@@ -1187,7 +1187,7 @@ EnemyLoreInfo = SubResource("Resource_gby04")
[node name="Sprite3D" type="Sprite3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, -0.086869, 0)
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.25389, 0)
billboard = 2
shaded = true
alpha_cut = 1
@@ -1218,7 +1218,7 @@ offset = Vector2(400, 400)
[node name="Hitbox" type="Area3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 0, 0)
transform = Transform3D(-1, 0, -8.74228e-08, 0, 1, 0, 8.74228e-08, 0, -1, -0.152949, 1.34076, 0)
collision_layer = 64
collision_mask = 64
@@ -1245,18 +1245,19 @@ libraries = {
}
[node name="Michael Attack VFX" type="AnimatedSprite3D" parent="."]
transform = Transform3D(0.72, 0, 0, 0, 0.72, 0, 0, 0, 0.72, -0.129818, 0.274447, 0.532815)
transform = Transform3D(0.72, 0, 0, 0, 0.72, 0, 0, 0, 0.72, -0.129818, 1.61521, 0.532815)
modulate = Color(0.977, 0.31, 1, 0.741176)
billboard = 2
sprite_frames = SubResource("SpriteFrames_suy1t")
[node name="WalkSFX" type="AudioStreamPlayer3D" parent="."]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1.34076, 0)
autoplay = true
bus = &"SFX"
[node name="Shadow" type="Sprite3D" parent="."]
transform = Transform3D(0.38, 0, 0, 0, -1.66103e-08, 0.38, 0, -0.38, -1.66103e-08, 0.00393164, -1.31885, 0.0077811)
transform = Transform3D(0.38, 0, 0, 0, -1.66103e-08, 0.38, 0, -0.38, -1.66103e-08, 0.00393164, 0.0219133, 0.0077811)
transparency = 0.1
cast_shadow = 0
modulate = Color(1, 1, 1, 0.591)

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -34,73 +34,74 @@ public partial class Map : Node3D, IMap
public void OnResolved()
{
this.Provide();
this.Provide();
}
public void InitializeMapData()
{
CurrentFloorNumber.OnNext(-1);
CurrentFloorNumber.OnNext(-1);
}
public IDungeonRoom GetPlayersCurrentRoom()
{
var rooms = CurrentFloor.Rooms;
var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
return playersRoom;
var rooms = CurrentFloor.Rooms;
var playersRoom = rooms.SingleOrDefault(x => x.IsPlayerInRoom);
return playersRoom;
}
public Transform3D GetPlayerSpawnPosition() => CurrentFloor.GetPlayerSpawnPoint();
public async Task LoadFloor()
{
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value + 1);
var sceneToLoad = LayoutToScenePathConverter.Convert(floor);
await LoadFloor(sceneToLoad);
if (CurrentFloor is DungeonFloor dungeonFloor && floor is DungeonFloorNode dungeonFloorNode)
dungeonFloor.SpawnEnemies(dungeonFloorNode);
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value + 1);
var sceneToLoad = LayoutToScenePathConverter.Convert(floor);
await LoadFloor(sceneToLoad);
}
public async Task LoadFloor(string sceneName)
{
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, "fade_out");
ClearMap();
var newFloor = await LoadNewFloor(sceneName);
AddChild(newFloor);
InitializeFloor(newFloor);
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, ("fade_in"));
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, "fade_out");
ClearMap();
var newFloor = await LoadNewFloor(sceneName);
AddChild(newFloor);
InitializeFloor(newFloor);
var floor = MapOrder.GetChildren().OfType<FloorNode>().ElementAt(CurrentFloorNumber.Value + 1);
if (CurrentFloor is DungeonFloor dungeonFloor && floor is DungeonFloorNode dungeonFloorNode)
dungeonFloor.SpawnEnemies(dungeonFloorNode);
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, ("fade_in"));
}
public void ClearMap()
{
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, "fade_out");
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
SpawnPointCreated?.Invoke(new Transform3D(Basis.Identity, new Vector3(-999, -999, -999)));
AnimationPlayer.CallDeferred(AnimationPlayer.MethodName.Play, "fade_out");
CurrentFloor?.CallDeferred(MethodName.QueueFree, []);
SpawnPointCreated?.Invoke(new Transform3D(Basis.Identity, new Vector3(-999, -999, -999)));
}
private void InitializeFloor(Node newFloor)
{
CurrentFloor = (IDungeonFloor)newFloor;
SetupDungeonFloor();
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
FloorLoaded?.Invoke();
CurrentFloor = (IDungeonFloor)newFloor;
SetupDungeonFloor();
CurrentFloor.FloorIsLoaded = true;
CurrentFloorNumber.OnNext(CurrentFloorNumber.Value + 1);
FloorLoaded?.Invoke();
}
private async Task<Node> LoadNewFloor(string sceneName)
{
var sceneLoader = new SceneLoader();
AddChild(sceneLoader);
sceneLoader.LoadSceneRequest(sceneName);
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
var result = sceneLoader.LoadedScene;
sceneLoader.QueueFree();
return result;
var sceneLoader = new SceneLoader();
AddChild(sceneLoader);
sceneLoader.LoadSceneRequest(sceneName);
await ToSignal(sceneLoader, SceneLoader.SignalName.SceneLoaded);
var result = sceneLoader.LoadedScene;
sceneLoader.QueueFree();
return result;
}
private void SetupDungeonFloor()
{
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
SpawnPointCreated?.Invoke(transform);
CurrentFloor.InitializeDungeon();
var transform = GetPlayerSpawnPosition();
SpawnPointCreated?.Invoke(transform);
}
}

View File

@@ -76,6 +76,16 @@ libraries = {
[node name="MapOrder" type="Node" parent="."]
unique_name_in_owner = true
[node name="Boss Floor 1" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 2
[node name="Floor01" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor01"
FloorOdds = Array[float]([0.33, 0.33, 0.33])
Michael = 1.0
[node name="Overworld" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
@@ -83,12 +93,6 @@ script = ExtResource("3_v14r0")
script = ExtResource("3_v14r0")
FloorName = 1
[node name="Floor01" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor01"
FloorOdds = Array[float]([0.33, 0.33, 0.33])
Sproingy = 1.0
[node name="Floor02" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor02"
@@ -137,10 +141,6 @@ FolderName = "Floor09"
FloorOdds = Array[float]([1.0])
Sproingy = 1.0
[node name="Boss Floor 1" type="Node" parent="MapOrder"]
script = ExtResource("3_v14r0")
FloorName = 2
[node name="Floor11" type="Node" parent="MapOrder"]
script = ExtResource("2_00xd7")
FolderName = "Floor11"

View File

@@ -15,13 +15,13 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
[Node] public Marker3D PlayerSpawn { get; set; } = default!;
[Node] public Node3D HorseHeadStatue { get; set; } = default!;
//[Node] public Node3D HorseHeadStatue { get; set; } = default!;
[Node] public Node3D OxFaceStatue { get; set; } = default!;
[Node] public BossTypeA OxFace { get; set; } = default!;
[Node] public BossTypeA HorseFace { get; set; } = default!;
//[Node] public BossTypeA HorseFace { get; set; } = default!;
[Node] public Area3D ActivateTrap { get; set; } = default!;
@@ -35,45 +35,45 @@ public partial class BossRoomA : Node3D, IBossRoom, IDungeonFloor
public void OnReady()
{
ActivateTrap.BodyEntered += ActivateTrap_BodyEntered;
_exit.AreaEntered += Exit_AreaEntered;
OxFace.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
HorseFace.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
ActivateTrap.BodyEntered += ActivateTrap_BodyEntered;
_exit.AreaEntered += Exit_AreaEntered;
OxFace.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
//HorseFace.HealthComponent.HealthReachedZero += CheckForBossFightEnd;
}
private void ActivateTrap_BodyEntered(Node3D body)
{
ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered;
StartBossFight();
ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered;
StartBossFight();
}
public void StartBossFight()
{
OxFaceStatue.Hide();
HorseHeadStatue.Hide();
OxFace.StartFight();
HorseFace.StartFight();
OxFaceStatue.Hide();
//HorseHeadStatue.Hide();
OxFace.StartFight();
//HorseFace.StartFight();
}
private void CheckForBossFightEnd()
{
if (OxFace.HealthComponent.CurrentHP.Value <= 0 && HorseFace.HealthComponent.CurrentHP.Value <= 0)
OnBossFightEnded();
if (OxFace.HealthComponent.CurrentHP.Value <= 0) //&& HorseFace.HealthComponent.CurrentHP.Value <= 0)
OnBossFightEnded();
}
public void OnBossFightEnded()
{
GateCollision.CallDeferred(MethodName.QueueFree);
LOCKEDGATE.Hide();
GateCollision.CallDeferred(MethodName.QueueFree);
LOCKEDGATE.Hide();
}
public void ExitReached()
=> Game.FloorExitReached();
=> Game.FloorExitReached();
private void Exit_AreaEntered(Area3D area)
{
if (area.GetOwner() is IPlayer)
ExitReached();
if (area.GetOwner() is IPlayer)
ExitReached();
}
public void InitializeDungeon()

View File

@@ -13,21 +13,18 @@ public partial class CorridorRoom : Node3D
[Dependency] IGame Game => this.DependOn<IGame>();
[Node] private Area3D _room { get; set; } = default!;
[Node] private MeshInstance3D _minimap { get; set; } = default!;
private bool _playerDiscoveredRoom = false;
public void Setup()
{
if (_room != null)
_room.BodyEntered += Room_BodyEntered;
if (_room != null)
_room.BodyEntered += Room_BodyEntered;
}
private void Room_BodyEntered(Node3D body)
{
if (!Game.CurrentFloor.FloorIsLoaded)
return;
if (body is IPlayer)
_minimap.Show();
if (!Game.CurrentFloor.FloorIsLoaded)
return;
}
}

View File

@@ -12,8 +12,6 @@ public abstract partial class DungeonRoom : Node3D, IDungeonRoom
{
public override void _Notification(int what) => this.Notify(what);
[Node] private MeshInstance3D _minimap { get; set; } = default!;
public bool IsPlayerInRoom => _isPlayerInRoom;
public bool PlayerDiscoveredRoom => _playerDiscoveredRoom;
@@ -28,47 +26,46 @@ public abstract partial class DungeonRoom : Node3D, IDungeonRoom
public void Setup()
{
_enemiesInRoom = [];
if (_room != null)
{
_room.BodyEntered += Room_BodyEntered;
_room.BodyExited += Room_BodyExited;
}
_enemiesInRoom = [];
if (_room != null)
{
_room.BodyEntered += Room_BodyEntered;
_room.BodyExited += Room_BodyExited;
}
}
private void Room_BodyExited(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Remove(enemy);
if (body is IPlayer)
_isPlayerInRoom = false;
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Remove(enemy);
if (body is IPlayer)
_isPlayerInRoom = false;
}
private void Room_BodyEntered(Node3D body)
{
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Add(enemy);
if (body is IPlayer)
if (_playerDiscoveredRoom)
_isPlayerInRoom = true;
else
OnPlayerDiscoveringRoom();
if (body is IEnemy enemy)
_enemiesInRoom = _enemiesInRoom.Add(enemy);
if (body is IPlayer)
if (_playerDiscoveredRoom)
_isPlayerInRoom = true;
else
OnPlayerDiscoveringRoom();
}
public ImmutableList<IEnemy> GetEnemiesInCurrentRoom()
{
return _enemiesInRoom;
return _enemiesInRoom;
}
private void OnPlayerDiscoveringRoom()
{
_isPlayerInRoom = true;
_playerDiscoveredRoom = true;
_minimap.Show();
_isPlayerInRoom = true;
_playerDiscoveredRoom = true;
}
public void OnExitTree()
{
_room.BodyEntered -= Room_BodyEntered;
_room.BodyExited -= Room_BodyExited;
_room.BodyEntered -= Room_BodyEntered;
_room.BodyExited -= Room_BodyExited;
}
}

View File

@@ -19,54 +19,57 @@ public partial class MonsterRoom : DungeonRoom
public override void _Ready()
{
SpawnItems();
SpawnItems();
}
public void SpawnEnemies(Godot.Collections.Dictionary<EnemyType, float> enemyInfo)
{
if (enemyInfo == null || !enemyInfo.Any(x => x.Value > 0))
return;
if (enemyInfo == null || !enemyInfo.Any(x => x.Value > 0))
return;
var rng = new RandomNumberGenerator();
rng.Randomize();
var enemySpawnPoints = EnemySpawnPoints.GetChildren();
var numberOfEnemiesToSpawn = rng.RandiRange(1, enemySpawnPoints.Count);
var rng = new RandomNumberGenerator();
rng.Randomize();
var enemySpawnPoints = EnemySpawnPoints.GetChildren();
var numberOfEnemiesToSpawn = rng.RandiRange(1, enemySpawnPoints.Count);
foreach (var spawnPoint in enemySpawnPoints.Cast<Marker3D>())
{
if (numberOfEnemiesToSpawn <= 0)
break;
numberOfEnemiesToSpawn--;
foreach (var spawnPoint in enemySpawnPoints.Cast<Marker3D>())
{
if (numberOfEnemiesToSpawn <= 0)
break;
numberOfEnemiesToSpawn--;
var index = rng.RandWeighted([.. enemyInfo.Values]);
var selectedEnemy = enemyInfo.ElementAt((int)index);
var instantiatedEnemy = EnemyTypeToEnemyConverter.Convert(selectedEnemy.Key);
instantiatedEnemy.Position = new Vector3(spawnPoint.Position.X, 1.75f, spawnPoint.Position.Z);
AddChild(instantiatedEnemy);
}
var index = rng.RandWeighted([.. enemyInfo.Values]);
var selectedEnemy = enemyInfo.ElementAt((int)index);
var instantiatedEnemy = EnemyTypeToEnemyConverter.Convert(selectedEnemy.Key);
instantiatedEnemy.Position = new Vector3(spawnPoint.Position.X, 0f, spawnPoint.Position.Z);
AddChild(instantiatedEnemy);
}
}
// RegularFlame.GetChildren();
//
private void SpawnItems()
{
if (ItemSpawnPoints == null)
return;
if (ItemSpawnPoints == null)
return;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
var numberOfItemsToSpawn = rng.RandiRange(1, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var itemSpawnPoints = ItemSpawnPoints.GetChildren();
var rng = new RandomNumberGenerator();
rng.Randomize();
var numberOfItemsToSpawn = rng.RandiRange(1, itemSpawnPoints.Count);
itemSpawnPoints.Shuffle();
var database = ItemDatabase.Instance;
foreach (var spawnPoint in itemSpawnPoints.Cast<Marker3D>())
{
if (numberOfItemsToSpawn <= 0)
break;
numberOfItemsToSpawn--;
var selectedItem = database.PickItem<InventoryItem>();
var duplicated = selectedItem.Duplicate((int)DuplicateFlags.UseInstantiation) as Node3D;
duplicated.Position = new Vector3(spawnPoint.Position.X, -1.5f, spawnPoint.Position.Z);
AddChild(duplicated);
}
var selectedItem = database.PickItem<InventoryItem>();
var duplicated = selectedItem.Duplicate((int)DuplicateFlags.UseInstantiation) as Node3D;
duplicated.Position = new Vector3(spawnPoint.Position.X, 0, spawnPoint.Position.Z);
AddChild(duplicated);
}
}
}

File diff suppressed because one or more lines are too long

View File

@@ -1,12 +1,10 @@
[gd_scene load_steps=86 format=4 uid="uid://5ja3qxn8h7iw"]
[gd_scene load_steps=84 format=4 uid="uid://5ja3qxn8h7iw"]
[ext_resource type="Script" uid="uid://tqyybt313web" path="res://src/map/dungeon/code/BossRoomA.cs" id="1_0h3lb"]
[ext_resource type="Texture2D" uid="uid://clc5f6yyc7sdw" path="res://src/map/assets/Jomon Bells/BELL ANIMATIONS_concrete_0003_color_1k.png" id="2_lqw6r"]
[ext_resource type="PackedScene" uid="uid://j7xsk4fv6f4q" path="res://src/map/dungeon/models/Special Floors & Rooms/Boss Floor A/15_A1_BOSS FLOOR A_VER.2.glb" id="2_r3w6s"]
[ext_resource type="Texture2D" uid="uid://dipyrtjclqae1" path="res://src/map/assets/Jomon Bells/BELL ANIMATIONS_COLUMN.jpg" id="3_ucaw1"]
[ext_resource type="Texture2D" uid="uid://d1xdvf8awh4bi" path="res://src/map/assets/Jomon Bells/BELL ANIMATIONS_CHAIN_TEX.png" id="4_i4jo4"]
[ext_resource type="PackedScene" uid="uid://8yaqqojv4nuv" path="res://src/enemy/enemy_types/14. horse_head/HorseHeadStatue.tscn" id="24_r1rk5"]
[ext_resource type="PackedScene" uid="uid://2wibfnu2jvlv" path="res://src/enemy/enemy_types/14. horse_head/HorseFace.tscn" id="25_a482y"]
[ext_resource type="PackedScene" uid="uid://bvv5giqyrhtl1" path="res://src/enemy/enemy_types/15. ox_face/OxFaceStatue.tscn" id="26_futcf"]
[ext_resource type="PackedScene" uid="uid://6dnsw37d1uw4" path="res://src/enemy/enemy_types/15. ox_face/OxFace.tscn" id="27_g6y6v"]
[ext_resource type="Shader" uid="uid://dr68ani6ouefm" path="res://src/map/map shaders/B1 Cloud Roll.gdshader" id="30_lmjp4"]
@@ -662,6 +660,7 @@ script = ExtResource("1_0h3lb")
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -157.601, -16.1094, 21.8408)
[node name="Collision" type="Node3D" parent="."]
visible = false
[node name="StaticBody3D2" type="StaticBody3D" parent="Collision"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -88.2175, -1.5279, -0.620708)
@@ -800,6 +799,9 @@ transform = Transform3D(19.342, 0, 0, 0, 3.12, 0, 0, 0, 4.493, -118.232, 0.07999
[node name="CollisionShape3D" type="CollisionShape3D" parent="Collision/StaticBody3D5"]
shape = SubResource("ConcavePolygonShape3D_1txpk")
[node name="GateCollision" type="Node3D" parent="Collision"]
unique_name_in_owner = true
[node name="Doors" type="Node3D" parent="."]
[node name="Spawn Points" type="Node3D" parent="."]
@@ -823,35 +825,17 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -240.071, 36.4279, 34.624)
visible = false
shape = SubResource("BoxShape3D_pkvyy")
[node name="Horse Head" type="Node3D" parent="Room"]
[node name="HorseHeadStatue" parent="Room/Horse Head" instance=ExtResource("24_r1rk5")]
unique_name_in_owner = true
transform = Transform3D(-4.37114e-08, 0, -1, 0, 1, 0, 1, 0, -4.37114e-08, -102.157, -2.30863, 13.3664)
[node name="HorseFace" parent="Room/Horse Head" instance=ExtResource("25_a482y")]
unique_name_in_owner = true
transform = Transform3D(-6.55671e-09, 0, -0.15, 0, 0.15, 0, 0.15, 0, -6.55671e-09, -102.157, -0.510939, 13.3664)
visible = false
PrimaryAttackElementalType = null
PrimaryAttackElementalDamageBonus = null
InitialHP = null
[node name="OxFace" type="Node3D" parent="Room"]
transform = Transform3D(-6.55671e-09, 0, -0.15, 0, 0.15, 0, 0.15, 0, -6.55671e-09, -102.157, -0.510939, 13.3664)
[node name="OxFaceStatue" parent="Room/OxFace" instance=ExtResource("26_futcf")]
unique_name_in_owner = true
transform = Transform3D(6.66667, 0, 0, 0, 6.66667, 0, 0, 0, 6.66667, 54.7793, -11.9846, -4.01331)
visible = false
[node name="OxFace" parent="Room/OxFace" instance=ExtResource("27_g6y6v")]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 58.194, 0.2072, -3.02661)
transform = Transform3D(1, 0, 3.55271e-15, 0, 1, 0, -3.55271e-15, 0, 1, 58.194, -12.7983, -3.02698)
visible = false
PrimaryAttackElementalType = null
PrimaryAttackElementalDamageBonus = null
InitialHP = null
[node name="Exit" type="Area3D" parent="Room"]
unique_name_in_owner = true
@@ -864,6 +848,7 @@ transform = Transform3D(-4.37114e-08, 0, 1, 0, 1, 0, -1, 0, -4.37114e-08, 1.5910
shape = SubResource("BoxShape3D_1qa0g")
[node name="Minimap" type="Node3D" parent="."]
visible = false
[node name="Boss Floor Environment" type="WorldEnvironment" parent="."]
environment = SubResource("Environment_1qa0g")
@@ -919,6 +904,7 @@ transform = Transform3D(0.565, 0, 0, 0, 0.565, 0, 0, 0, 0.565, -92.0811, -2.7728
transform = Transform3D(0.55, 0, 0, 0, 0.55, 0, 0, 0, 0.55, -92.04, -2.83756, 3.9847)
[node name="NavigationRegion3D" type="NavigationRegion3D" parent="."]
visible = false
navigation_mesh = SubResource("NavigationMesh_eanap")
[node name="MeshInstance3D" type="MeshInstance3D" parent="NavigationRegion3D"]
@@ -998,3 +984,6 @@ libraries = {
&"": SubResource("AnimationLibrary_cm2l0")
}
autoplay = "Animation"
[node name="LOCKEDGATE" type="MeshInstance3D" parent="."]
unique_name_in_owner = true

View File

@@ -10882,6 +10882,44 @@ billboard = 1
sprite_frames = SubResource("SpriteFrames_cnruo")
frame_progress = 0.271099
[node name="RegularFlame" type="Node3D" parent="Node3D/Flames"]
[node name="REGULAR FLAME" type="AnimatedSprite3D" parent="Node3D/Flames/RegularFlame"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.38918, 0)
billboard = 1
sprite_frames = SubResource("SpriteFrames_yw3t6")
frame_progress = 0.180404
[node name="REGULAR FLAME2" type="AnimatedSprite3D" parent="Node3D/Flames/RegularFlame"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.38918, 0)
billboard = 1
sprite_frames = SubResource("SpriteFrames_yw3t6")
frame_progress = 0.180404
[node name="REGULAR FLAME3" type="AnimatedSprite3D" parent="Node3D/Flames/RegularFlame"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.38918, 0)
billboard = 1
sprite_frames = SubResource("SpriteFrames_yw3t6")
frame_progress = 0.180404
[node name="REGULAR FLAME4" type="AnimatedSprite3D" parent="Node3D/Flames/RegularFlame"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.38918, 0)
billboard = 1
sprite_frames = SubResource("SpriteFrames_yw3t6")
frame_progress = 0.180404
[node name="REGULAR FLAME5" type="AnimatedSprite3D" parent="Node3D/Flames/RegularFlame"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.38918, 0)
billboard = 1
sprite_frames = SubResource("SpriteFrames_yw3t6")
frame_progress = 0.180404
[node name="REGULAR FLAME6" type="AnimatedSprite3D" parent="Node3D/Flames/RegularFlame"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 2.38918, 0)
billboard = 1
sprite_frames = SubResource("SpriteFrames_yw3t6")
frame_progress = 0.180404
[node name="FAR SCENERY" type="MeshInstance3D" parent="Node3D"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -146.027, 31.1617, -329.541)
visible = false

View File

@@ -1,9 +1,8 @@
[gd_scene load_steps=23 format=3 uid="uid://tpgwccr6v43e"]
[gd_scene load_steps=20 format=3 uid="uid://tpgwccr6v43e"]
[ext_resource type="Script" uid="uid://dhollu4j3pynq" path="res://src/map/dungeon/code/MonsterRoom.cs" id="1_58osi"]
[ext_resource type="PackedScene" uid="uid://cljj515aklhoq" path="res://src/map/dungeon/models/Area 1/Tree/A1-Tree.glb" id="2_rr4cd"]
[ext_resource type="Texture2D" uid="uid://dw50ys561j8no" path="res://src/map/assets/DUST_1.png" id="4_e73oq"]
[ext_resource type="Texture2D" uid="uid://ba7ch5rr7qj1d" path="res://src/minimap/textures/Room Maps/mi_treeante.png" id="7_hy27a"]
[sub_resource type="BoxShape3D" id="BoxShape3D_q0uor"]
size = Vector3(7.93076, 7.25739, 0.543945)
@@ -76,14 +75,6 @@ size = Vector2(0.1, 0.1)
subdivide_width = 1
subdivide_depth = 1
[sub_resource type="PlaneMesh" id="PlaneMesh_jfnkd"]
size = Vector2(20, 16)
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_vyfk3"]
shading_mode = 0
albedo_texture = ExtResource("7_hy27a")
texture_filter = 0
[node name="Antechamber B" type="Node3D"]
script = ExtResource("1_58osi")
@@ -215,16 +206,6 @@ local_coords = true
process_material = SubResource("ParticleProcessMaterial_vqrrr")
draw_pass_1 = SubResource("QuadMesh_55djs")
[node name="Minimap" type="Node3D" parent="."]
[node name="Minimap" type="MeshInstance3D" parent="Minimap"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10, 0, 8)
visible = false
mesh = SubResource("PlaneMesh_jfnkd")
skeleton = NodePath("../cor_t_intersection")
surface_material_override/0 = SubResource("StandardMaterial3D_vyfk3")
[node name="OmniLight3D" type="OmniLight3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 10.383, 6.70561, 8.71907)
light_energy = 1.904

View File

@@ -1,6 +1,7 @@
using Chickensoft.AutoInject;
using Chickensoft.Introspection;
using Godot;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
[Meta(typeof(IAutoNode))]
@@ -10,15 +11,28 @@ public partial class Minimap : Control
[Dependency] public IMap _map => this.DependOn<IMap>();
[Dependency] public IPlayer _player => this.DependOn<IPlayer>();
[Node] public Camera3D MinimapCamera { get; set; }
[Node] public Label LayerNumberText { get; set; } = default!;
private bool _ready = false;
public void OnResolved()
{
_map.CurrentFloorNumber.Sync += CurrentFloorNumber_Sync;
_map.CurrentFloorNumber.Sync += CurrentFloorNumber_Sync;
_ready = true;
}
public override void _PhysicsProcess(double delta)
{
if (_ready)
MinimapCamera.Position = new Vector3(_player.GlobalPosition.X, MinimapCamera.Position.Y, _player.GlobalPosition.Z);
}
private void CurrentFloorNumber_Sync(int obj)
{
LayerNumberText.Text = $"{obj:D2}";
LayerNumberText.Text = $"{obj:D2}";
}
}

View File

@@ -63,8 +63,9 @@ handle_input_locally = false
size = Vector2i(350, 300)
render_target_update_mode = 4
[node name="Minimap Camera" type="Camera3D" parent="CenterContainer/SubViewportContainer/SubViewport"]
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -21.7374, 240.05, 2.76249)
[node name="MinimapCamera" type="Camera3D" parent="CenterContainer/SubViewportContainer/SubViewport"]
unique_name_in_owner = true
transform = Transform3D(1, 0, 0, 0, -4.37114e-08, 1, 0, -1, -4.37114e-08, -21.7374, 146.05, 2.76249)
cull_mask = 2
environment = SubResource("Environment_yn75n")
attributes = SubResource("CameraAttributesPractical_yn75n")

View File

@@ -20,53 +20,58 @@ public partial class Npc : Node3D
public void OnReady()
{
SetPhysicsProcess(true);
DialogueZone.BodyEntered += DialogueZone_BodyEntered;
DialogueZone.BodyExited += DialogueZone_BodyExited;
Hitbox.AreaEntered += Hitbox_AreaEntered;
SetPhysicsProcess(true);
DialogueZone.BodyEntered += DialogueZone_BodyEntered;
DialogueZone.BodyExited += DialogueZone_BodyExited;
Hitbox.AreaEntered += Hitbox_AreaEntered;
}
private void Hitbox_AreaEntered(Area3D area)
{
if (area.GetOwner() is ThrownItem thrownItem)
{
DialogueController.ShowDialogue(Dialogue, "get_item");
thrownItem.QueueFree();
}
else
{
DialogueController.ShowDialogue(Dialogue, "hit");
}
if (area.GetOwner() is ThrownItem thrownItem)
{
DialogueController.ShowDialogue(Dialogue, "get_item");
thrownItem.QueueFree();
}
else
{
DialogueController.ShowDialogue(Dialogue, "hit");
}
}
private void Hitbox_BodyEntered(Node body)
{
DialogueController.ShowDialogue(Dialogue, "hit");
DialogueController.ShowDialogue(Dialogue, "hit");
}
private void DialogueZone_BodyExited(Node3D body)
{
_isInDialogueZone = false;
DialogueController.Interrupt();
_isInDialogueZone = false;
DialogueController.Interrupt();
}
private void DialogueZone_BodyEntered(Node3D body)
{
_isInDialogueZone = true;
_isInDialogueZone = true;
}
public override void _UnhandledInput(InputEvent @event)
{
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone)
{
if (_isIntroductionComplete)
DialogueController.ShowDialogue(Dialogue, "general");
else
{
DialogueController.ShowDialogue(Dialogue, "introduction");
_isIntroductionComplete = true;
}
}
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone)
{
DialogueController.ShowDialogue(Dialogue, "general");
}
}
public partial class Gesthemii : Npc
{
public override void _UnhandledInput(InputEvent @event)
{
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone)
{
DialogueController.ShowDialogue(Dialogue, "general");
}
}
}
}

View File

@@ -12331,6 +12331,7 @@ transform = Transform3D(-0.015, 0, -2.26494e-09, 0, 0.015, 0, 2.26494e-09, 0, -0
[node name="tendomaya" parent="Camera/player_model" instance=ExtResource("3_74hqa")]
transform = Transform3D(1.355, 0, 2.84217e-14, 0, 1.355, 0, -2.84217e-14, 0, 1.355, 3.57499e-06, 0, -23.676)
visible = false
[node name="Lights" type="Node3D" parent="Camera"]

View File

@@ -0,0 +1,3 @@
~ general
- Here's my hint
=> END

View File

@@ -0,0 +1,16 @@
[remap]
importer="dialogue_manager"
importer_version=15
type="Resource"
uid="uid://8wf6jvs78ncf"
path="res://.godot/imported/stone.dialogue-844f025f38603e82467c319c925d9163.tres"
[deps]
source_file="res://stone.dialogue"
dest_files=["res://.godot/imported/stone.dialogue-844f025f38603e82467c319c925d9163.tres"]
[params]
defaults=true