diff --git a/MrBigsock/Assets/Code/Character.cs b/MrBigsock/Assets/Code/Character.cs index 0c23a48295cd9848e173f80034aa17d3d84451d6..654604a12a3e6df918661b1408e90e2585c88c8f 100644 --- a/MrBigsock/Assets/Code/Character.cs +++ b/MrBigsock/Assets/Code/Character.cs @@ -85,7 +85,7 @@ namespace BigSock { /* The inventory of the character. */ - public Inventory Inventory { get; protected set; } = new Inventory(); + public Inventory Inventory { get; protected set; } = new Inventory(this); /* The base stats of the character. @@ -123,18 +123,7 @@ namespace BigSock { Stats = BaseStats.Modify(modifiers); } - /* - Try to pick up an item. - */ - public bool TryPickUpItem(IItem item) { - if(Inventory.AddItem(item)) { - UpdateModifiers(); - print($"[Character.TryPickUpItem()] {item.Name} picked up. ({Inventory.Items.Count}/{Inventory.Cap})"); - return true; - } - print($"[Character.TryPickUpItem()] {item.Name} NOT picked up. ({Inventory.Items.Count}/{Inventory.Cap})"); - return false; - } + /* Add Kcockback. @@ -174,7 +163,7 @@ namespace BigSock { // Add damage HP -= attack.Damage; - OnDamage(attack); + AfterDamage(attack); TryKill(); @@ -189,7 +178,7 @@ namespace BigSock { if(Alive && HP <= 0) { Alive = false; - OnDeath(); + AfterDeath(); return true; } @@ -200,22 +189,72 @@ namespace BigSock { /* Method for what to do when the character takes damage. */ - protected virtual void OnDamage(IAttackStats attack) { - print($"[Character.TakeDamage()] {HP} - {attack.Damage}"); + protected virtual void AfterDamage(IAttackStats attack) { + print($"[Character.AfterDamage()] {HP} - {attack.Damage}"); KnockBack(attack); } /* Method for what to do when the character dies. */ - protected virtual void OnDeath() { - print($"[Character.TryKill()] start. | {HP}, {Alive}"); + protected virtual void AfterDeath() { + print($"[Character.AfterDeath()] start. | {HP}, {Alive}"); Destroy(gameObject); } } + + /* + Items + */ + public partial class Character { + + /* + Adds a listener for a conditional item to this character's event. + */ + public void AddItemListener(ConditionalItemBase item) { + switch(item.Trigger) { + case TriggerType.Fire: OnFire += ((OnFireItemBase) item).Handler; break; + case TriggerType.Hit: OnHit += ((OnHitItemBase) item).Handler; break; + case TriggerType.Kill: OnKill += ((OnKillItemBase) item).Handler; break; + + case TriggerType.TakeDamage: OnTakeDamage += ((OnTakeDamageItemBase) item).Handler; break; + case TriggerType.Heal: OnHeal += ((OnHealItemBase) item).Handler; break; + case TriggerType.Death: OnDeath += ((OnDeathItemBase) item).Handler; break; + } + } + + /* + Remove a listener for a conditional item from this character's event. + */ + public void RemoveItemListener(ConditionalItemBase item) { + switch(item.Trigger) { + case TriggerType.Fire: OnFire -= ((OnFireItemBase) item).Handler; break; + case TriggerType.Hit: OnHit -= ((OnHitItemBase) item).Handler; break; + case TriggerType.Kill: OnKill -= ((OnKillItemBase) item).Handler; break; + + case TriggerType.TakeDamage: OnTakeDamage -= ((OnTakeDamageItemBase) item).Handler; break; + case TriggerType.Heal: OnHeal -= ((OnHealItemBase) item).Handler; break; + case TriggerType.Death: OnDeath -= ((OnDeathItemBase) item).Handler; break; + } + } + + /* + Try to pick up an item. + */ + public bool TryPickUpItem(IItem item) { + if(Inventory.AddItem(item)) { + UpdateModifiers(); + print($"[Character.TryPickUpItem()] {item.Name} picked up. ({Inventory.Items.Count}/{Inventory.Cap})"); + return true; + } + print($"[Character.TryPickUpItem()] {item.Name} NOT picked up. ({Inventory.Items.Count}/{Inventory.Cap})"); + return false; + } + } + /* Events */ diff --git a/MrBigsock/Assets/Code/Item/Inventory.cs b/MrBigsock/Assets/Code/Item/Inventory.cs index 26c4656832fcf521ae5c2ccb164171312edf8f28..2b8a75e1daaae76246547a8a8d34b6eb9fb6bb1a 100644 --- a/MrBigsock/Assets/Code/Item/Inventory.cs +++ b/MrBigsock/Assets/Code/Item/Inventory.cs @@ -28,6 +28,18 @@ namespace BigSock.Item { public int Cap { get; set; } = 3; + /* + The max number of items the inventory can hold. + */ + public Character Owner { get; } + + + public Inventory(Character owner) { + if(owner == null) throw new ArgumentNullException(paramName: nameof(owner)); + Owner = owner; + } + + /* Adds an item to the inventory and manages changes. */ @@ -40,6 +52,9 @@ namespace BigSock.Item { if(item is PassiveItemBase passive) { Modifier = Modifier.Add(passive.Modifier); } + else if(item is ConditionalItemBase conditional) { + Owner.AddItemListener(conditional); + } //! Add ifs to handle the other 2 types of items. return true; diff --git a/MrBigsock/Assets/Code/PlayerController.cs b/MrBigsock/Assets/Code/PlayerController.cs index dea96a53c392c6ca7d24236fa97ad348aa716053..3fbe2ec8df0b725ba7d7c9bafceaff99a19dcd1e 100644 --- a/MrBigsock/Assets/Code/PlayerController.cs +++ b/MrBigsock/Assets/Code/PlayerController.cs @@ -152,8 +152,8 @@ namespace BigSock { /* Method for what to do when the character takes damage. */ - protected override void OnDamage(IAttackStats attack) { - base.OnDamage(attack); + protected override void AfterDamage(IAttackStats attack) { + base.AfterDamage(attack); hpBar.SetHealth(Convert.ToInt32(HP)); } }