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 void UpdateEquipment(EquipableItem equipable);
public int BonusAttack { get; }
public int BonusDefense { get; }

View File

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

View File

@@ -76,4 +76,6 @@ public class EquipmentComponent : IEquipmentComponent
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.EnemyViewer -= OnEnemyViewer;
MainMenu.Gallery -= OnGallery;
MainMenu.Options -= OnOptions;
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()
{
BackButton.Pressed += BackButton_Pressed;
_enemies = [.. ModelPivot.GetChildren().Cast<EnemyModelView>()];
_currentModel = _enemies.First();
DisplayEnemy();
BackButton.Pressed += BackButton_Pressed;
_enemies = [.. ModelPivot.GetChildren().Cast<EnemyModelView>()];
_currentModel = _enemies.First();
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();
public override void _Input(InputEvent @event)
{
if (BackButton.HasFocus() && @event.IsActionPressed(GameInputs.Interact))
{
GetTree().Paused = false;
BackButton.ReleaseFocus();
return;
}
if (BackButton.HasFocus() && @event.IsActionPressed(GameInputs.Interact))
{
GetTree().Paused = false;
BackButton.ReleaseFocus();
return;
}
if (_currentModel == null || BackButton.HasFocus())
return;
if (_currentModel == null || BackButton.HasFocus())
return;
if (@event.IsActionPressed(GameInputs.Attack))
_currentModel.PlayPrimaryAttackAnimation();
if (@event.IsActionPressed(GameInputs.InventorySort))
_currentModel.PlaySecondaryAttackAnimation();
if (Input.IsActionJustPressed(GameInputs.Inventory))
_currentModel.PlayActivateAnimation();
if (@event.IsActionPressed(GameInputs.EnemyViewerWalk))
_currentModel.PlayWalkAnimation();
if (@event.IsActionReleased(GameInputs.EnemyViewerWalk))
_currentModel.PlayIdleAnimation();
if (@event.IsActionPressed(GameInputs.Attack))
_currentModel.PlayPrimaryAttackAnimation();
if (@event.IsActionPressed(GameInputs.InventorySort))
_currentModel.PlaySecondaryAttackAnimation();
if (Input.IsActionJustPressed(GameInputs.Inventory))
_currentModel.PlayActivateAnimation();
if (@event.IsActionPressed(GameInputs.EnemyViewerWalk))
_currentModel.PlayWalkAnimation();
if (@event.IsActionReleased(GameInputs.EnemyViewerWalk))
_currentModel.PlayIdleAnimation();
if (@event.IsActionPressed(GameInputs.Interact))
{
GetTree().Paused = true;
BackButton.GrabFocus();
}
if (@event.IsActionPressed(GameInputs.Interact))
{
GetTree().Paused = true;
BackButton.GrabFocus();
}
if (@event.IsActionPressed(GameInputs.StrafeRight))
{
// Load next model
_enemies[_currentIndex].Hide();
if (_currentIndex == _enemies.Count - 1)
_currentIndex = 0;
else
_currentIndex++;
DisplayEnemy();
}
if (@event.IsActionPressed(GameInputs.StrafeLeft))
{
_enemies[_currentIndex].Hide();
// Load previous model
if (_currentIndex == 0)
_currentIndex = _enemies.Count - 1;
else
_currentIndex--;
DisplayEnemy();
}
if (@event.IsActionPressed(GameInputs.StrafeRight))
{
// Load next model
_enemies[_currentIndex].Hide();
if (_currentIndex == _enemies.Count - 1)
_currentIndex = 0;
else
_currentIndex++;
DisplayEnemy();
}
if (@event.IsActionPressed(GameInputs.StrafeLeft))
{
_enemies[_currentIndex].Hide();
// Load previous model
if (_currentIndex == 0)
_currentIndex = _enemies.Count - 1;
else
_currentIndex--;
DisplayEnemy();
}
}
public override void _Process(double delta)
{
if (_currentModel == null || BackButton.HasFocus())
return;
if (_currentModel == null || BackButton.HasFocus())
return;
var forwardStrength = Input.GetActionStrength(GameInputs.CameraForward);
Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, _cameraSpeed * forwardStrength * (_cameraStartingPoint / 10));
var backStrength = Input.GetActionStrength(GameInputs.CameraBack);
Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, -_cameraSpeed * backStrength * (_cameraStartingPoint / 10));
var leftStrength = Input.GetActionStrength(GameInputs.MoveLeft);
CameraPivot.RotateY(_cameraSpeed * leftStrength);
var rightStrength = Input.GetActionStrength(GameInputs.MoveRight);
CameraPivot.RotateY(-_cameraSpeed * rightStrength);
var forwardStrength = Input.GetActionStrength(GameInputs.CameraForward);
Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, _cameraSpeed * forwardStrength * (_cameraStartingPoint / 10));
var backStrength = Input.GetActionStrength(GameInputs.CameraBack);
Camera3D.Position = Camera3D.Position.MoveToward(CameraPivot.Position, -_cameraSpeed * backStrength * (_cameraStartingPoint / 10));
var leftStrength = Input.GetActionStrength(GameInputs.MoveLeft);
CameraPivot.RotateY(_cameraSpeed * leftStrength);
var rightStrength = Input.GetActionStrength(GameInputs.MoveRight);
CameraPivot.RotateY(-_cameraSpeed * rightStrength);
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));
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));
if (_currentModel is EnemyModelView2D enemyModelView2D)
enemyModelView2D.SetCurrentDirection(_currentModel.GlobalBasis, -CameraPivot.Basis.Z);
if (_currentModel is EnemyModelView2D enemyModelView2D)
enemyModelView2D.SetCurrentDirection(_currentModel.GlobalBasis, -CameraPivot.Basis.Z);
}
private void DisplayEnemy()
{
_currentModel = _enemies[_currentIndex];
_currentModel = _enemies[_currentIndex];
var size = _currentModel.GetSize();
if (_currentModel is EnemyModelView2D)
_cameraStartingPoint = size.X / 50;
else
_cameraStartingPoint = size.X * 2;
var size = _currentModel.GetSize();
if (_currentModel is EnemyModelView2D)
_cameraStartingPoint = size.X / 50;
else
_cameraStartingPoint = size.X * 2;
Camera3D.Position = new Vector3(Camera3D.Position.X, Camera3D.Position.Y, _cameraStartingPoint);
EnemyName.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Name : "Placeholder Text";
Description.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Description : "Placeholder Text";
HPValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.MaximumHP : "Placeholder Text";
ATKValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.ATK : "Placeholder Text";
DEFValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.DEF : "Placeholder Text";
Drop1Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop1 : "Placeholder Text";
Drop2Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop2 : "Placeholder Text";
AffinityValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Affinity : "Placeholder Text";
WeaknessValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Weakness : "Placeholder Text";
Camera3D.Position = new Vector3(Camera3D.Position.X, Camera3D.Position.Y, _cameraStartingPoint);
EnemyName.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Name : "Placeholder Text";
Description.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Description : "Placeholder Text";
HPValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.MaximumHP : "Placeholder Text";
ATKValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.ATK : "Placeholder Text";
DEFValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.DEF : "Placeholder Text";
Drop1Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop1 : "Placeholder Text";
Drop2Value.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Drop2 : "Placeholder Text";
AffinityValue.Text = _currentModel.EnemyLoreInfo != null ? _currentModel.EnemyLoreInfo.Affinity : "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();
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;
PlayerDetector.BodyEntered -= PlayerDetector_BodyEntered;
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)
_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)
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()
{
FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnVelocityComputed;
FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetPhysicsProcess(true);
FollowBehavior.Init(NavigationAgent);
PatrolBehavior.Init(NavigationAgent);
PatrolBehavior.HomePosition = GlobalPosition;
PatrolBehavior.OnVelocityComputed += OnVelocityComputed;
FollowBehavior.OnVelocityComputed += OnVelocityComputed;
EngagePlayerBehavior.TakeAction += EngagePlayerBehavior_TakeAction;
EngagePlayerBehavior.AcquireTarget += EngagePlayerBehavior_AcquireTarget;
PlayerDetector.BodyEntered += PlayerDetector_BodyEntered;
PlayerDetector.BodyExited += PlayerDetector_BodyExited;
SetPhysicsProcess(true);
}
public void OnResolved()
{
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
_enemyLogic.Input(new EnemyLogic.Input.Patrol());
}
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 _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);
}
public void OnExitTree()
{
_attackTimer.Timeout -= AttackTimer_Timeout;
}
}

View File

@@ -25,14 +25,19 @@ public partial class DemonWallArm : EnemyModelView
public new void OnReady()
{
Hitbox.AreaEntered += Hitbox_AreaEntered;
base.OnReady();
Hitbox.AreaEntered += Hitbox_AreaEntered;
base.OnReady();
}
private void Hitbox_AreaEntered(Area3D area)
{
var target = area.GetOwner();
if (target is IPlayer player)
base.OnPlayerHit(new AttackEventArgs(AttackData));
var target = area.GetOwner();
if (target is IPlayer player)
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.TransitionCompleted -= FloorClearMenu_TransitionCompleted;
_player.Inventory.BroadcastMessage -= BroadcastMessage;
OnLoadLevelRequest -= LoadLevel;
GameRepo.RestorativePickedUp -= GameEventDepot_RestorativePickedUp;
GameRepo.CloseInventoryEvent -= ExitInventoryAction;
_player.Inventory.BroadcastMessage -= BroadcastMessage;
_map.FloorLoaded -= OnFloorLoadFinished;
_player.PlayerDied -= GameOver;
GameOverMenu.NewGame -= OnNewGame;
GameOverMenu.QuitGame -= OnQuit;
PauseMenu.ExitGamePressed -= OnQuit;
GameRepo.IsPaused.Sync -= IsPaused_Sync;
}
}

View File

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

View File

@@ -54,4 +54,10 @@ public partial class SetItem : RigidBody3D
{
_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);
}
}
public void OnExitTree()
{
BodyEntered -= ThrownItem_BodyEntered;
Collision.AreaEntered -= Collision_AreaEntered;
}
}

View File

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

View File

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

View File

@@ -11,13 +11,18 @@ public partial class UnlockableDoor : Node3D, IDoor
public void OnReady()
{
UnlockArea.AreaEntered += UnlockArea_AreaEntered;
UnlockArea.AreaEntered += UnlockArea_AreaEntered;
}
private void UnlockArea_AreaEntered(Area3D area)
{
var children = GetChildren();
foreach (var child in children)
child.QueueFree();
var children = GetChildren();
foreach (var child in children)
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 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 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.Introspection;
using Godot;
using System.Collections.Immutable;
using Zennysoft.Ma.Adapter;
namespace Zennysoft.Game.Ma;
@@ -47,4 +46,10 @@ public partial class BossRoomB : SpecialFloor, IBossRoom, IDungeonFloor
if (area.GetOwner() is IPlayer)
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()
{
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 (!Game.CurrentFloor.FloorIsLoaded)
return;
}
public void OnExitTree()
{
_room.BodyEntered -= Room_BodyEntered;
}
}

View File

@@ -18,15 +18,21 @@ public partial class ExitRoom : DungeonRoom
public override void _Ready()
{
_exit.AreaEntered += Exit_AreaEntered;
_exit.AreaEntered += Exit_AreaEntered;
}
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 new void OnExitTree()
{
base.OnExitTree();
_exit.AreaEntered -= Exit_AreaEntered;
}
}

View File

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

View File

@@ -28,4 +28,10 @@ public partial class JumpScareRoom : DungeonRoom
DialogueController.ShowDialogue(Dialogue, "general");
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 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();
public void OnExitTree()
{
Area3D.AreaEntered -= Area3D_AreaEntered;
}
}

View File

@@ -35,4 +35,9 @@ public partial class Minimap : Control
{
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)
{
if (@event.IsActionPressed(GameInputs.Interact) && _isInDialogueZone)
{
DialogueController.ShowDialogue(Dialogue, "general");
}
}
DialogueZone.BodyEntered -= DialogueZone_BodyEntered;
DialogueZone.BodyExited -= DialogueZone_BodyExited;
DialogueExitZone.BodyExited -= DialogueExitZone_BodyExited;
Hitbox.AreaEntered -= Hitbox_AreaEntered;
}
}

View File

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

View File

@@ -1,4 +1,5 @@
using Godot;
using Zennysoft.Game.Ma;
using Zennysoft.Ma.Adapter;
using Zennysoft.Ma.Adapter.Entity;
@@ -23,4 +24,12 @@ internal class PlayerEffectService
if (rand <= _player.TotalLuck)
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;
QueueFree();
}
public void OnExitTree()
{
AreaEntered -= QuestTest_AreaEntered;
}
}