Clean up events, add weapon tag for weaker on swing

This commit is contained in:
2026-02-09 23:50:15 -08:00
parent aba325ff2b
commit 90d054a3c6
34 changed files with 301 additions and 125 deletions

View File

@@ -17,6 +17,8 @@ public interface IEquipmentComponent : IEntityComponent
public bool IsItemEquipped(InventoryItem item); public bool IsItemEquipped(InventoryItem item);
public void UpdateEquipment(EquipableItem equipable);
public int BonusAttack { get; } public int BonusAttack { get; }
public int BonusDefense { get; } public int BonusDefense { get; }

View File

@@ -9,5 +9,6 @@ public enum WeaponTag
Knockback, Knockback,
InverseHPAttackPower, InverseHPAttackPower,
RustChanceSelfAndEnemy, RustChanceSelfAndEnemy,
Instakill Instakill,
DegradeOnSwing
} }

View File

@@ -76,4 +76,6 @@ public class EquipmentComponent : IEquipmentComponent
return item == _equippedWeapon.Value || item == _equippedArmor.Value || item == _equippedAccessory.Value; return item == _equippedWeapon.Value || item == _equippedArmor.Value || item == _equippedAccessory.Value;
} }
public void UpdateEquipment(EquipableItem equipable) => EquipmentChanged?.Invoke(equipable);
} }

View File

@@ -261,6 +261,13 @@ public partial class App : Node, IApp
MainMenu.StartGame -= OnStartGame; MainMenu.StartGame -= OnStartGame;
MainMenu.EnemyViewer -= OnEnemyViewer; MainMenu.EnemyViewer -= OnEnemyViewer;
MainMenu.Gallery -= OnGallery;
MainMenu.Options -= OnOptions;
MainMenu.Quit -= OnQuit; MainMenu.Quit -= OnQuit;
GalleryMenu.GalleryExited -= GalleryExited;
OptionsMenu.OptionsMenuExited -= OptionsMenu_OptionsMenuExited;
OptionsMenu.DeleteSaveData -= DeleteSaveData;
} }
} }

View File

@@ -54,111 +54,118 @@ public partial class DataViewer : Control, IDataViewer
public void OnReady() public void OnReady()
{ {
BackButton.Pressed += BackButton_Pressed; BackButton.Pressed += BackButton_Pressed;
_enemies = [.. ModelPivot.GetChildren().Cast<EnemyModelView>()]; _enemies = [.. ModelPivot.GetChildren().Cast<EnemyModelView>()];
_currentModel = _enemies.First(); _currentModel = _enemies.First();
DisplayEnemy(); DisplayEnemy();
} }
public void OnEnterTree() => GetTree().Paused = false; public void OnEnterTree()
{
GetTree().Paused = false;
}
public void OnExitTree() => GetTree().Paused = false; public void OnExitTree()
{
GetTree().Paused = false;
BackButton.Pressed -= BackButton_Pressed;
}
private void BackButton_Pressed() => AppRepo.OnDataViewerExited(); private void BackButton_Pressed() => AppRepo.OnDataViewerExited();
public override void _Input(InputEvent @event) public override void _Input(InputEvent @event)
{ {
if (BackButton.HasFocus() && @event.IsActionPressed(GameInputs.Interact)) if (BackButton.HasFocus() && @event.IsActionPressed(GameInputs.Interact))
{ {
GetTree().Paused = false; GetTree().Paused = false;
BackButton.ReleaseFocus(); BackButton.ReleaseFocus();
return; return;
} }
if (_currentModel == null || BackButton.HasFocus()) if (_currentModel == null || BackButton.HasFocus())
return; return;
if (@event.IsActionPressed(GameInputs.Attack)) if (@event.IsActionPressed(GameInputs.Attack))
_currentModel.PlayPrimaryAttackAnimation(); _currentModel.PlayPrimaryAttackAnimation();
if (@event.IsActionPressed(GameInputs.InventorySort)) if (@event.IsActionPressed(GameInputs.InventorySort))
_currentModel.PlaySecondaryAttackAnimation(); _currentModel.PlaySecondaryAttackAnimation();
if (Input.IsActionJustPressed(GameInputs.Inventory)) if (Input.IsActionJustPressed(GameInputs.Inventory))
_currentModel.PlayActivateAnimation(); _currentModel.PlayActivateAnimation();
if (@event.IsActionPressed(GameInputs.EnemyViewerWalk)) if (@event.IsActionPressed(GameInputs.EnemyViewerWalk))
_currentModel.PlayWalkAnimation(); _currentModel.PlayWalkAnimation();
if (@event.IsActionReleased(GameInputs.EnemyViewerWalk)) if (@event.IsActionReleased(GameInputs.EnemyViewerWalk))
_currentModel.PlayIdleAnimation(); _currentModel.PlayIdleAnimation();
if (@event.IsActionPressed(GameInputs.Interact)) if (@event.IsActionPressed(GameInputs.Interact))
{ {
GetTree().Paused = true; GetTree().Paused = true;
BackButton.GrabFocus(); BackButton.GrabFocus();
} }
if (@event.IsActionPressed(GameInputs.StrafeRight)) if (@event.IsActionPressed(GameInputs.StrafeRight))
{ {
// Load next model // Load next model
_enemies[_currentIndex].Hide(); _enemies[_currentIndex].Hide();
if (_currentIndex == _enemies.Count - 1) if (_currentIndex == _enemies.Count - 1)
_currentIndex = 0; _currentIndex = 0;
else else
_currentIndex++; _currentIndex++;
DisplayEnemy(); DisplayEnemy();
} }
if (@event.IsActionPressed(GameInputs.StrafeLeft)) if (@event.IsActionPressed(GameInputs.StrafeLeft))
{ {
_enemies[_currentIndex].Hide(); _enemies[_currentIndex].Hide();
// Load previous model // Load previous model
if (_currentIndex == 0) if (_currentIndex == 0)
_currentIndex = _enemies.Count - 1; _currentIndex = _enemies.Count - 1;
else else
_currentIndex--; _currentIndex--;
DisplayEnemy(); DisplayEnemy();
} }
} }
public override void _Process(double delta) public override void _Process(double delta)
{ {
if (_currentModel == null || BackButton.HasFocus()) if (_currentModel == null || BackButton.HasFocus())
return; return;
var forwardStrength = Input.GetActionStrength(GameInputs.CameraForward); var forwardStrength = Input.GetActionStrength(GameInputs.CameraForward);
Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, _cameraSpeed * forwardStrength * (_cameraStartingPoint / 10)); Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, _cameraSpeed * forwardStrength * (_cameraStartingPoint / 10));
var backStrength = Input.GetActionStrength(GameInputs.CameraBack); var backStrength = Input.GetActionStrength(GameInputs.CameraBack);
Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, -_cameraSpeed * backStrength * (_cameraStartingPoint / 10)); Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, -_cameraSpeed * backStrength * (_cameraStartingPoint / 10));
var leftStrength = Input.GetActionStrength(GameInputs.MoveLeft); var leftStrength = Input.GetActionStrength(GameInputs.MoveLeft);
CameraPivot.RotateY(_cameraSpeed * leftStrength); CameraPivot.RotateY(_cameraSpeed * leftStrength);
var rightStrength = Input.GetActionStrength(GameInputs.MoveRight); var rightStrength = Input.GetActionStrength(GameInputs.MoveRight);
CameraPivot.RotateY(-_cameraSpeed * rightStrength); CameraPivot.RotateY(-_cameraSpeed * rightStrength);
Camera3D.Position = Camera3D.Position.Clamp(new Vector3(0, 0, _cameraStartingPoint / 2), new Vector3(0, 0, _cameraStartingPoint)); Camera3D.Position = Camera3D.Position.Clamp(new Vector3(0, 0, _cameraStartingPoint / 2), new Vector3(0, 0, _cameraStartingPoint));
ModelPivot.Rotation = ModelPivot.Rotation.Clamp(Mathf.DegToRad(-60), Mathf.DegToRad(60)); ModelPivot.Rotation = ModelPivot.Rotation.Clamp(Mathf.DegToRad(-60), Mathf.DegToRad(60));
if (_currentModel is EnemyModelView2D enemyModelView2D) if (_currentModel is EnemyModelView2D enemyModelView2D)
enemyModelView2D.SetCurrentDirection(_currentModel.GlobalBasis, -CameraPivot.Basis.Z); enemyModelView2D.SetCurrentDirection(_currentModel.GlobalBasis, -CameraPivot.Basis.Z);
} }
private void DisplayEnemy() private void DisplayEnemy()
{ {
_currentModel = _enemies[_currentIndex]; _currentModel = _enemies[_currentIndex];
var size = _currentModel.GetSize(); var size = _currentModel.GetSize();
if (_currentModel is EnemyModelView2D) if (_currentModel is EnemyModelView2D)
_cameraStartingPoint = size.X / 50; _cameraStartingPoint = size.X / 50;
else else
_cameraStartingPoint = size.X * 2; _cameraStartingPoint = size.X * 2;
Camera3D.Position = new Vector3(Camera3D.Position.X, Camera3D.Position.Y, _cameraStartingPoint); Camera3D.Position = new Vector3(Camera3D.Position.X, Camera3D.Position.Y, _cameraStartingPoint);
EnemyName.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Name : "Placeholder Text"; EnemyName.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Name : "Placeholder Text";
Description.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Description : "Placeholder Text"; Description.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Description : "Placeholder Text";
HPValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.MaximumHP : "Placeholder Text"; HPValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.MaximumHP : "Placeholder Text";
ATKValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.ATK : "Placeholder Text"; ATKValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.ATK : "Placeholder Text";
DEFValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.DEF : "Placeholder Text"; DEFValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.DEF : "Placeholder Text";
Drop1Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop1 : "Placeholder Text"; Drop1Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop1 : "Placeholder Text";
Drop2Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop2 : "Placeholder Text"; Drop2Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop2 : "Placeholder Text";
AffinityValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Affinity : "Placeholder Text"; AffinityValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Affinity : "Placeholder Text";
WeaknessValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Weakness : "Placeholder Text"; WeaknessValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Weakness : "Placeholder Text";
_enemies[_currentIndex].Show(); _enemies[_currentIndex].Show();
} }
} }

View File

@@ -39,4 +39,10 @@ public partial class BossAModelView : EnemyModelView3D, INode3D
ExplodingModel.Show(); ExplodingModel.Show();
DeathAnimation.Play("Animation"); DeathAnimation.Play("Animation");
} }
public void OnExitTree()
{
Hitbox.AreaEntered -= Hitbox_AreaEntered;
DeathAnimation.AnimationFinished -= DeathAnimation_AnimationFinished;
}
} }

View File

@@ -180,5 +180,6 @@ public partial class BossTypeA : Enemy, IHaveEngagePlayerBehavior, IHaveFollowBe
EngagePlayerBehavior.TakeAction -= PerformAction; EngagePlayerBehavior.TakeAction -= PerformAction;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered; PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited; PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
(EnemyModelView as BossAModelView).OnDeathAnimationCompleted -= EnemyModelView3D_OnDeathAnimationCompleted;
} }
} }

View File

@@ -69,4 +69,10 @@ public abstract partial class Enemy2D : Enemy
if (body is IPlayer) if (body is IPlayer)
_enemyLogic.Input(new EnemyLogic.Input.Alert()); _enemyLogic.Input(new EnemyLogic.Input.Alert());
} }
public new void OnExitTree()
{
base.OnExitTree();
LineOfSight.BodyEntered -= LineOfSight_BodyEntered;
}
} }

View File

@@ -129,5 +129,6 @@ public abstract partial class EnemyModelView : Node3D, IEnemyModelView
{ {
if (AnimationTree != null) if (AnimationTree != null)
AnimationTree.Get(_parametersPlayback).As<AnimationNodeStateMachinePlayback>().Stop(); AnimationTree.Get(_parametersPlayback).As<AnimationNodeStateMachinePlayback>().Stop();
AnimationTree.AnimationFinished -= AnimationTree_AnimationFinished;
} }
} }

View File

@@ -18,23 +18,33 @@ public partial class Michael : Enemy2D, IHavePatrolBehavior, IHaveEngagePlayerBe
public void OnReady() public void OnReady()
{ {
FollowBehavior.Init(NavigationAgent); FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent); PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition; PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnVelocityComputed; PatrolBehavior.OnVelocityComputed += OnVelocityComputed;
FollowBehavior.OnVelocityComputed += OnVelocityComputed; FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction; EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget; EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered; PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited; PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetPhysicsProcess(true); SetPhysicsProcess(true);
} }
public void OnResolved() public void OnResolved()
{ {
_enemyLogic.Input(new EnemyLogic.Input.Patrol()); _enemyLogic.Input(new EnemyLogic.Input.Patrol());
} }
public override void Move() => EnemyModelView.PlayIdleAnimation(); public override void Move() => EnemyModelView.PlayIdleAnimation();
public new void OnExitTree()
{
base.OnExitTree();
PatrolBehavior.OnVelocityComputed -= OnVelocityComputed;
FollowBehavior.OnVelocityComputed -= OnVelocityComputed;
EngagePlayerBehavior.TakeAction -= EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget -= EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
}
} }

View File

@@ -39,4 +39,12 @@ public partial class GoldSproingy : Enemy2D, IHavePatrolBehavior, IHaveFleeBehav
} }
public override void Move() => EnemyModelView.PlayIdleAnimation(); public override void Move() => EnemyModelView.PlayIdleAnimation();
public override void _ExitTree()
{
PatrolBehavior.OnVelocityComputed -= OnVelocityComputed;
PlayerDetector.BodyExited -= PlayerDetector_BodyExited;
FleeBehavior.OnVelocityComputed -= OnVelocityComputed;
PlayerDetector.BodyEntered -= GoldSproingyFlee;
}
} }

View File

@@ -52,4 +52,9 @@ public partial class DemonWall : Enemy3D
{ {
EnemyModelView.Attack(_maximumWallMoveAmount); EnemyModelView.Attack(_maximumWallMoveAmount);
} }
public void OnExitTree()
{
_attackTimer.Timeout -= AttackTimer_Timeout;
}
} }

View File

@@ -25,14 +25,19 @@ public partial class DemonWallArm : EnemyModelView
public new void OnReady() public new void OnReady()
{ {
Hitbox.AreaEntered += Hitbox_AreaEntered; Hitbox.AreaEntered += Hitbox_AreaEntered;
base.OnReady(); base.OnReady();
} }
private void Hitbox_AreaEntered(Area3D area) private void Hitbox_AreaEntered(Area3D area)
{ {
var target = area.GetOwner(); var target = area.GetOwner();
if (target is IPlayer player) if (target is IPlayer player)
base.OnPlayerHit(new AttackEventArgs(AttackData)); base.OnPlayerHit(new AttackEventArgs(AttackData));
}
public void OnExitTree()
{
Hitbox.AreaEntered -= Hitbox_AreaEntered;
} }
} }

View File

@@ -608,13 +608,21 @@ public partial class Game : Node3D, IGame
LoadNextLevel.Exit -= FloorClearMenu_Exit; LoadNextLevel.Exit -= FloorClearMenu_Exit;
LoadNextLevel.TransitionCompleted -= FloorClearMenu_TransitionCompleted; LoadNextLevel.TransitionCompleted -= FloorClearMenu_TransitionCompleted;
_player.Inventory.BroadcastMessage -= BroadcastMessage; OnLoadLevelRequest -= LoadLevel;
GameRepo.RestorativePickedUp -= GameEventDepot_RestorativePickedUp; GameRepo.RestorativePickedUp -= GameEventDepot_RestorativePickedUp;
GameRepo.CloseInventoryEvent -= ExitInventoryAction;
_player.Inventory.BroadcastMessage -= BroadcastMessage;
_map.FloorLoaded -= OnFloorLoadFinished;
_player.PlayerDied -= GameOver;
GameOverMenu.NewGame -= OnNewGame; GameOverMenu.NewGame -= OnNewGame;
GameOverMenu.QuitGame -= OnQuit; GameOverMenu.QuitGame -= OnQuit;
PauseMenu.ExitGamePressed -= OnQuit;
GameRepo.IsPaused.Sync -= IsPaused_Sync; GameRepo.IsPaused.Sync -= IsPaused_Sync;
} }
} }

View File

@@ -25,4 +25,9 @@ public partial class ItemRescue : Area3D
BodyEntered -= OnItemRescueEntered; BodyEntered -= OnItemRescueEntered;
} }
public void OnExitTree()
{
BodyEntered -= OnItemRescueEntered;
}
} }

View File

@@ -54,4 +54,10 @@ public partial class SetItem : RigidBody3D
{ {
_stateMachine.Travel("timer"); _stateMachine.Travel("timer");
} }
public void OnExitTree()
{
ExplosionArea.AreaEntered -= ExplosionArea_AreaEntered;
AnimationTree.AnimationFinished -= AnimationTree_AnimationFinished;
}
} }

View File

@@ -127,4 +127,10 @@ public partial class ThrownItem : RigidBody3D, IThrownItem
enemy.HealthComponent.Damage(damageDealt); enemy.HealthComponent.Damage(damageDealt);
} }
} }
public void OnExitTree()
{
BodyEntered -= ThrownItem_BodyEntered;
Collision.AreaEntered -= Collision_AreaEntered;
}
} }

View File

@@ -20,6 +20,9 @@ public partial class Weapon : EquipableItem
public void OnReady() public void OnReady()
{ {
_sprite.Texture = Stats.Texture; _sprite.Texture = Stats.Texture;
_bonusDamage = Stats.BonusAttack;
_bonusDefense = Stats.BonusDefense;
_bonusLuck = Stats.BonusLuck;
} }
public override string ItemName => Stats.Name; public override string ItemName => Stats.Name;
@@ -51,11 +54,11 @@ public partial class Weapon : EquipableItem
public void SetWeaponDefense(int newBonus) => _bonusDefense = newBonus; public void SetWeaponDefense(int newBonus) => _bonusDefense = newBonus;
public override int BonusAttack { get => Stats.BonusAttack + _bonusDamage; } public override int BonusAttack { get => _bonusDamage; }
public override int BonusDefense { get => Stats.BonusDefense + _bonusDefense; } public override int BonusDefense { get => _bonusDefense; }
public override int BonusLuck { get => Stats.BonusLuck + _bonusLuck; } public override int BonusLuck { get => _bonusLuck; }
[Save("weapon_bonus_damage")] [Save("weapon_bonus_damage")]
private int _bonusDamage { get; set; } = 0; private int _bonusDamage { get; set; } = 0;

View File

@@ -7,14 +7,15 @@
script = ExtResource("2_vrork") script = ExtResource("2_vrork")
AttackSpeed = 0.75 AttackSpeed = 0.75
WeaponElement = 0 WeaponElement = 0
WeaponTag = 0 WeaponTag = 8
SelfDamage = 0
SoundEffect = 23 SoundEffect = 23
Name = "Shining Halberd" Name = "Shining Halberd"
Description = "Weapon that gradually becomes weaker." Description = "Weapon that gradually becomes weaker."
SpawnRate = 0.3 SpawnRate = 0.3
BonusAttack = 8 BonusAttack = 8
BonusDefense = 0 BonusDefense = 0
BonusLuck = 0.05 BonusLuck = 5
BonusHP = 0 BonusHP = 0
BonusVT = 0 BonusVT = 0
AeolicResistance = 0 AeolicResistance = 0

View File

@@ -11,13 +11,18 @@ public partial class UnlockableDoor : Node3D, IDoor
public void OnReady() public void OnReady()
{ {
UnlockArea.AreaEntered += UnlockArea_AreaEntered; UnlockArea.AreaEntered += UnlockArea_AreaEntered;
} }
private void UnlockArea_AreaEntered(Area3D area) private void UnlockArea_AreaEntered(Area3D area)
{ {
var children = GetChildren(); var children = GetChildren();
foreach (var child in children) foreach (var child in children)
child.QueueFree(); child.QueueFree();
}
public void OnExitTree()
{
UnlockArea.AreaEntered -= UnlockArea_AreaEntered;
} }
} }

View File

@@ -61,4 +61,10 @@ public partial class Altar : SpecialFloor, IDungeonFloor
} }
public void ExitReached() => Game.FloorExitReached(); public void ExitReached() => Game.FloorExitReached();
public void OnExitTree()
{
Exit.AreaEntered -= Exit_AreaEntered;
NoExitArea.AreaEntered -= NoExitArea_AreaEntered;
}
} }

View File

@@ -72,4 +72,12 @@ public partial class BossRoomA : SpecialFloor, IBossRoom, IDungeonFloor
} }
public override (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawn.Rotation, new Vector3(PlayerSpawn.GlobalPosition.X, -2.5f, PlayerSpawn.GlobalPosition.Z)); } public override (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawn.Rotation, new Vector3(PlayerSpawn.GlobalPosition.X, -2.5f, PlayerSpawn.GlobalPosition.Z)); }
public void OnExitTree()
{
ActivateTrap.BodyEntered -= ActivateTrap_BodyEntered;
_exit.AreaEntered -= Exit_AreaEntered;
OxFace.HealthComponent.HealthReachedZero -= CheckForBossFightEnd;
HorseHead.HealthComponent.HealthReachedZero -= CheckForBossFightEnd;
}
} }

View File

@@ -1,7 +1,6 @@
using Chickensoft.AutoInject; using Chickensoft.AutoInject;
using Chickensoft.Introspection; using Chickensoft.Introspection;
using Godot; using Godot;
using System.Collections.Immutable;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -47,4 +46,10 @@ public partial class BossRoomB : SpecialFloor, IBossRoom, IDungeonFloor
if (area.GetOwner() is IPlayer) if (area.GetOwner() is IPlayer)
ExitReached(); ExitReached();
} }
public void OnExitTree()
{
ActivateTrap.BodyEntered -= ActivateTrap_AreaEntered;
_exit.AreaEntered -= Exit_AreaEntered;
}
} }

View File

@@ -18,13 +18,18 @@ public partial class CorridorRoom : Node3D
public void Setup() public void Setup()
{ {
if (_room != null) if (_room != null)
_room.BodyEntered += Room_BodyEntered; _room.BodyEntered += Room_BodyEntered;
} }
private void Room_BodyEntered(Node3D body) private void Room_BodyEntered(Node3D body)
{ {
if (!Game.CurrentFloor.FloorIsLoaded) if (!Game.CurrentFloor.FloorIsLoaded)
return; return;
}
public void OnExitTree()
{
_room.BodyEntered -= Room_BodyEntered;
} }
} }

View File

@@ -18,15 +18,21 @@ public partial class ExitRoom : DungeonRoom
public override void _Ready() public override void _Ready()
{ {
_exit.AreaEntered += Exit_AreaEntered; _exit.AreaEntered += Exit_AreaEntered;
} }
public void ExitReached() public void ExitReached()
=> Game.FloorExitReached(); => Game.FloorExitReached();
private void Exit_AreaEntered(Area3D area) private void Exit_AreaEntered(Area3D area)
{ {
if (area.GetOwner() is IPlayer) if (area.GetOwner() is IPlayer)
ExitReached(); ExitReached();
}
public new void OnExitTree()
{
base.OnExitTree();
_exit.AreaEntered -= Exit_AreaEntered;
} }
} }

View File

@@ -3,6 +3,7 @@ using Chickensoft.Introspection;
using Godot; using Godot;
using System.Linq; using System.Linq;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
using static System.Net.Mime.MediaTypeNames;
namespace Zennysoft.Game.Ma; namespace Zennysoft.Game.Ma;
@@ -24,4 +25,9 @@ public partial class FinalFloor : SpecialFloor
{ {
_player.Die(); _player.Die();
} }
public void OnExitTree()
{
Exit.AreaEntered -= Exit_AreaEntered;
}
} }

View File

@@ -28,4 +28,10 @@ public partial class JumpScareRoom : DungeonRoom
DialogueController.ShowDialogue(Dialogue, "general"); DialogueController.ShowDialogue(Dialogue, "general");
JumpScare.SetMonitoring(false); JumpScare.SetMonitoring(false);
} }
public new void OnExitTree()
{
base.OnExitTree();
JumpScare.AreaEntered -= JumpScare_AreaEntered;
}
} }

View File

@@ -85,4 +85,12 @@ public partial class Overworld : SpecialFloor, IDungeonFloor
public override (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawnPoint.Rotation, new Vector3(PlayerSpawnPoint.GlobalPosition.X, 2.4f, PlayerSpawnPoint.GlobalPosition.Z)); } public override (Vector3 Rotation, Vector3 Position) GetPlayerSpawnPoint() { return (PlayerSpawnPoint.Rotation, new Vector3(PlayerSpawnPoint.GlobalPosition.X, 2.4f, PlayerSpawnPoint.GlobalPosition.Z)); }
public void OnExitTree()
{
Exit.AreaEntered -= Exit_AreaEntered;
RestoreArea.AreaEntered -= RestoreArea_AreaEntered;
RestoreArea.AreaExited -= RestoreArea_AreaExited;
RestoreTimer.Timeout -= RestoreTimer_Timeout;
}
} }

View File

@@ -18,4 +18,9 @@ public partial class MapRevealerCube : Node3D
} }
private void Area3D_AreaEntered(Area3D area) => MeshInstance3D.Hide(); private void Area3D_AreaEntered(Area3D area) => MeshInstance3D.Hide();
public void OnExitTree()
{
Area3D.AreaEntered -= Area3D_AreaEntered;
}
} }

View File

@@ -35,4 +35,9 @@ public partial class Minimap : Control
{ {
LayerNumberText.Text = $"{obj:D2}"; LayerNumberText.Text = $"{obj:D2}";
} }
public void OnExitTree()
{
_map.CurrentFloorNumber.Sync -= CurrentFloorNumber_Sync;
}
} }

View File

@@ -71,14 +71,11 @@ public partial class Npc : Node3D
} }
} }
public partial class Gesthemii : Npc public void OnExitTree()
{ {
public override void _UnhandledInput(InputEvent @event) DialogueZone.BodyEntered -= DialogueZone_BodyEntered;
{ DialogueZone.BodyExited -= DialogueZone_BodyExited;
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone) DialogueExitZone.BodyExited -= DialogueExitZone_BodyExited;
{ Hitbox.AreaEntered -= Hitbox_AreaEntered;
DialogueController.ShowDialogue(Dialogue, "general");
}
}
} }
} }

View File

@@ -323,6 +323,12 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
AnimationPlayer.Play("hit_wall"); AnimationPlayer.Play("hit_wall");
else if (!AnimationPlayer.IsPlaying()) else if (!AnimationPlayer.IsPlaying())
PlayAttackAnimation(); PlayAttackAnimation();
else
return;
var weapon = EquipmentComponent.EquippedWeapon.Value as Weapon;
if (weapon.WeaponTag == WeaponTag.DegradeOnSwing)
_playerEffectService.Degrade();
} }
private void ThrowItem() private void ThrowItem()
@@ -367,6 +373,10 @@ public partial class Player : CharacterBody3D, IPlayer, IProvide<IPlayer>
CollisionDetector.AreaEntered -= CollisionDetector_AreaEntered; CollisionDetector.AreaEntered -= CollisionDetector_AreaEntered;
HealthComponent.HealthReachedZero -= Die; HealthComponent.HealthReachedZero -= Die;
HealthTimer.Timeout -= OnHealthTimerTimeout; HealthTimer.Timeout -= OnHealthTimerTimeout;
HealthComponent.CurrentHP.Changed -= InverseHPToAttackPowerSync;
HealthComponent.HealthReachedZero -= Die;
ExperiencePointsComponent.PlayerLevelUp -= OnLevelUp;
PlayerFXAnimations.AnimationFinished -= PlayerFXAnimations_AnimationFinished;
} }
private void Move(float delta) private void Move(float delta)

View File

@@ -1,4 +1,5 @@
using Godot; using Godot;
using Zennysoft.Game.Ma;
using Zennysoft.Ma.Adapter; using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity; using Zennysoft.Ma.Adapter.Entity;
@@ -23,4 +24,12 @@ internal class PlayerEffectService
if (rand <= _player.TotalLuck) if (rand <= _player.TotalLuck)
enemy.Die(); enemy.Die();
} }
public void Degrade()
{
var weapon = _player.EquipmentComponent.EquippedWeapon.Value as Weapon;
var newAttack = Mathf.Max(weapon.BonusAttack - 1, 0);
weapon.SetWeaponAttack(newAttack);
_player.EquipmentComponent.UpdateEquipment(weapon);
}
} }

View File

@@ -22,4 +22,9 @@ public partial class QuestTest : Area3D
Game.QuestData.QuestMarker1 = true; Game.QuestData.QuestMarker1 = true;
QueueFree(); QueueFree();
} }
public void OnExitTree()
{
AreaEntered -= QuestTest_AreaEntered;
}
} }