From f7968ed8bde7d1eca14da821bf43f83d87aa7f7c Mon Sep 17 00:00:00 2001
From: Ny Bruker <robinhs@stud.ntnu.no>
Date: Fri, 30 Sep 2022 13:48:54 +0200
Subject: [PATCH] New items system. - Items class hierarchy. - Inventory class.
 - CharacterStats class. - Applies modifiers to character's stats.

---
 MrBigsock/Assets/Code/Character.cs            |  65 ++++++++++--
 MrBigsock/Assets/Code/Core/CharacterStats.cs  |  45 ++++++++
 .../Assets/Code/Core/CharacterStats.cs.meta   |  11 ++
 MrBigsock/Assets/Code/Core/ICharacterStats.cs | 100 ++++++++++++++++++
 .../Assets/Code/Core/ICharacterStats.cs.meta  |  11 ++
 MrBigsock/Assets/Code/Item.meta               |   8 ++
 MrBigsock/Assets/Code/Item/Base.meta          |   8 ++
 .../Code/Item/Base/ConditionalItemBase.cs     |  25 +++++
 .../Item/Base/ConditionalItemBase.cs.meta     |  11 ++
 MrBigsock/Assets/Code/Item/Base/IItem.cs      |  30 ++++++
 MrBigsock/Assets/Code/Item/Base/IItem.cs.meta |  11 ++
 MrBigsock/Assets/Code/Item/Base/ItemBase.cs   |  30 ++++++
 .../Assets/Code/Item/Base/ItemBase.cs.meta    |  11 ++
 .../Assets/Code/Item/Base/PassiveItemBase.cs  |  21 ++++
 .../Code/Item/Base/PassiveItemBase.cs.meta    |  11 ++
 .../Assets/Code/Item/Base/TriggerType.cs      |  20 ++++
 .../Assets/Code/Item/Base/TriggerType.cs.meta |  11 ++
 MrBigsock/Assets/Code/Item/EventParams.meta   |   8 ++
 .../Code/Item/EventParams/CharEventParams.cs  |  27 +++++
 .../Item/EventParams/CharEventParams.cs.meta  |  11 ++
 .../Code/Item/EventParams/ICharEventParms.cs  |  27 +++++
 .../Item/EventParams/ICharEventParms.cs.meta  |  11 ++
 MrBigsock/Assets/Code/Item/Inventory.cs       |  49 +++++++++
 MrBigsock/Assets/Code/Item/Inventory.cs.meta  |  11 ++
 MrBigsock/Assets/Code/Item/Items.meta         |   8 ++
 .../Assets/Code/Item/Items/RunningShoes.cs    |  24 +++++
 .../Code/Item/Items/RunningShoes.cs.meta      |  11 ++
 MrBigsock/Assets/Code/Item/Root.meta          |   8 ++
 MrBigsock/Assets/Code/PlayerController.cs     |  18 ++--
 MrBigsock/Assets/Code/orc/EnemyController.cs  |   4 +-
 30 files changed, 631 insertions(+), 15 deletions(-)
 create mode 100644 MrBigsock/Assets/Code/Core/CharacterStats.cs
 create mode 100644 MrBigsock/Assets/Code/Core/CharacterStats.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Core/ICharacterStats.cs
 create mode 100644 MrBigsock/Assets/Code/Core/ICharacterStats.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Base.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Base/IItem.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Base/IItem.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Base/ItemBase.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Base/ItemBase.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Base/TriggerType.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Base/TriggerType.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/EventParams.meta
 create mode 100644 MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs
 create mode 100644 MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs
 create mode 100644 MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Inventory.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Inventory.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Items.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Items/RunningShoes.cs
 create mode 100644 MrBigsock/Assets/Code/Item/Items/RunningShoes.cs.meta
 create mode 100644 MrBigsock/Assets/Code/Item/Root.meta

diff --git a/MrBigsock/Assets/Code/Character.cs b/MrBigsock/Assets/Code/Character.cs
index 3a04ccfd..de0bdcac 100644
--- a/MrBigsock/Assets/Code/Character.cs
+++ b/MrBigsock/Assets/Code/Character.cs
@@ -3,6 +3,7 @@ using System;
 using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.InputSystem;
+using BigSock.Item;
 
 namespace BigSock {
 	// Common class for all characters.
@@ -11,7 +12,7 @@ namespace BigSock {
 		/*
 			Attack speed of the character.
 		*/
-		public float AttackSpeed => baseAttackSpeed;
+		public float AttackSpeed => Stats.AttackSpeed;
 		public float baseAttackSpeed = 1;
 
 		/*
@@ -22,20 +23,20 @@ namespace BigSock {
 		/*
 			Movement speed of the character.
 		*/
-		public float MovementSpeed => baseMovementSpeed;
+		public float MovementSpeed => Stats.MoveSpeed;
 		public float baseMovementSpeed = 1;
 
 		
 		/*
 			Damage of the character.
 		*/
-		public float Damage => baseDamage;
+		public float Damage => Stats.Damage;
 		public float baseDamage = 1;
 
 		/*
 			Knockback force
 		*/
-		public float KnockbackForce => knockbackForce;
+		public float KnockbackForce => Stats.Knockback;
 		public float knockbackForce = 150;
 
 		
@@ -52,7 +53,7 @@ namespace BigSock {
 		/*
 			Maximum hit points of the character.
 		*/
-		public float MaxHP => baseMaxHP;
+		public float MaxHP => Stats.MaxHP;
 		public float baseMaxHP = 10;
 
 
@@ -81,8 +82,58 @@ namespace BigSock {
 		protected Rigidbody2D rb;
 
 
-		void Start() {
-				rb = GetComponent<Rigidbody2D>();
+		/*
+			The inventory of the character.
+		*/
+		public Inventory Inventory { get; protected set; } = new Inventory();
+
+		/*
+			The base stats of the character.
+		*/
+		public ICharacterStats BaseStats { get; protected set; } = new CharacterStats();
+
+		/*
+			The final stats of the character after applying modifiers.
+		*/
+		public ICharacterStats Stats { get; protected set; } = new CharacterStats();
+
+
+
+		protected virtual void Start() {
+			rb = GetComponent<Rigidbody2D>();
+
+			// Set the base stats.
+			BaseStats = new CharacterStats {
+				MaxHP = baseMaxHP,
+				Damage = baseDamage,
+				MoveSpeed = baseMovementSpeed,
+				Knockback = knockbackForce,
+				Range = 1,
+				AttackSpeed = baseAttackSpeed,
+			};
+			UpdateModifiers();
+
+		}
+
+		/*
+			Updates the modifiers to the character's stats.
+		*/
+		public void UpdateModifiers(ICharacterStats modifiers = null) {
+			modifiers ??= Inventory.Modifier;
+			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;
 		}
 
 		/*
diff --git a/MrBigsock/Assets/Code/Core/CharacterStats.cs b/MrBigsock/Assets/Code/Core/CharacterStats.cs
new file mode 100644
index 00000000..e6e13cba
--- /dev/null
+++ b/MrBigsock/Assets/Code/Core/CharacterStats.cs
@@ -0,0 +1,45 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock {
+
+	/*
+		class represents the stats of a character.
+	*/
+	public class CharacterStats : ICharacterStats {
+		/*
+			The hp of the character.
+		*/
+		public float MaxHP { get; set; }
+
+		/*
+			The damage of the character.
+		*/
+		public float Damage { get; set; }
+
+		/*
+			The movement speed of the character.
+		*/
+		public float MoveSpeed { get; set; }
+
+		/*
+			The knockback of the character.
+		*/
+		public float Knockback { get; set; }
+
+		/*
+			The range of the character.
+		*/
+		public float Range { get; set; }
+
+		/*
+			The attack speed of the character.
+		*/
+		public float AttackSpeed { get; set; }
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Core/CharacterStats.cs.meta b/MrBigsock/Assets/Code/Core/CharacterStats.cs.meta
new file mode 100644
index 00000000..aa194f50
--- /dev/null
+++ b/MrBigsock/Assets/Code/Core/CharacterStats.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 697f21373556c9549b064efc46c9730b
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Core/ICharacterStats.cs b/MrBigsock/Assets/Code/Core/ICharacterStats.cs
new file mode 100644
index 00000000..afccfaf2
--- /dev/null
+++ b/MrBigsock/Assets/Code/Core/ICharacterStats.cs
@@ -0,0 +1,100 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock {
+
+	/*
+		Interface represents the stats of a character.
+	*/
+	public interface ICharacterStats {
+		/*
+			The hp of the character.
+		*/
+		float MaxHP { get; }
+
+		/*
+			The damage of the character.
+		*/
+		float Damage { get; }
+
+		/*
+			The movement speed of the character.
+		*/
+		float MoveSpeed { get; }
+
+		/*
+			The knockback of the character.
+		*/
+		float Knockback { get; }
+
+		/*
+			The range of the character.
+		*/
+		float Range { get; }
+
+		/*
+			The attack speed of the character.
+		*/
+		float AttackSpeed { get; }
+
+	}
+
+	/*
+		Holds extension methods for character stat objects.
+	*/
+	public static class CharacterStatsExtension {
+		/*
+			Identity object for character stats.
+		*/
+		public static readonly ICharacterStats IDENTITY = new CharacterStats{
+			MaxHP = 1,
+			Damage = 1,
+			MoveSpeed = 1,
+			Knockback = 1,
+			Range = 1,
+			AttackSpeed = 1,
+		};
+
+		/*
+			Adds the values of 2 character stats together.
+		*/
+		public static ICharacterStats Add(this ICharacterStats a, ICharacterStats b) {
+			return new CharacterStats{
+				MaxHP = a.MaxHP + b.MaxHP,
+				Damage = a.Damage + b.Damage,
+				MoveSpeed = a.MoveSpeed + b.MoveSpeed,
+				Knockback = a.Knockback + b.Knockback,
+				Range = a.Range + b.Range,
+				AttackSpeed = a.AttackSpeed + b.AttackSpeed,
+			};
+		}
+
+		/*
+			Multiplies the values of 2 character stats together.
+		*/
+		public static ICharacterStats Multiply(this ICharacterStats a, ICharacterStats b) {
+			return new CharacterStats{
+				MaxHP = a.MaxHP * b.MaxHP,
+				Damage = a.Damage * b.Damage,
+				MoveSpeed = a.MoveSpeed * b.MoveSpeed,
+				Knockback = a.Knockback * b.Knockback,
+				Range = a.Range * b.Range,
+				AttackSpeed = a.AttackSpeed * b.AttackSpeed,
+			};
+		}
+
+		
+		/*
+			Modifies the first stat object by the second one.
+			Ex.: if the second is 20% hp, the result will be the first one, but with 20% more hp.
+		*/
+		public static ICharacterStats Modify(this ICharacterStats a, ICharacterStats b) {
+			return a.Multiply(b.Add(IDENTITY));
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Core/ICharacterStats.cs.meta b/MrBigsock/Assets/Code/Core/ICharacterStats.cs.meta
new file mode 100644
index 00000000..48fb6263
--- /dev/null
+++ b/MrBigsock/Assets/Code/Core/ICharacterStats.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: d67cdc4f8a1fd31439d31116ad4821b7
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item.meta b/MrBigsock/Assets/Code/Item.meta
new file mode 100644
index 00000000..fa111966
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 023fe0779d2abeb44ad4470ad4e5642a
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Base.meta b/MrBigsock/Assets/Code/Item/Base.meta
new file mode 100644
index 00000000..0b806ae6
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fdc1d36c8d53fe54898d8cccff53b536
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs b/MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs
new file mode 100644
index 00000000..95612893
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs
@@ -0,0 +1,25 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		A class that represents an item that an effect when a condition is meet.
+	*/
+	public abstract class ConditionalItemBase : ItemBase {
+		/*
+			The type of trigger this item uses.
+		*/
+		public TriggerType Trigger { get; set; }
+
+		/*
+			The handler to activate when the condition is triggered.
+		*/
+		public Action<ICharEventParams> Handler { get; set; }
+
+	}
+} 
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs.meta b/MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs.meta
new file mode 100644
index 00000000..ec5d9564
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/ConditionalItemBase.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 15064819886e52a4a85b803e26467c05
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Base/IItem.cs b/MrBigsock/Assets/Code/Item/Base/IItem.cs
new file mode 100644
index 00000000..720fa112
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/IItem.cs
@@ -0,0 +1,30 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		An interface representing a generic item.
+	*/
+	public interface IItem {
+		/*
+			The name of the item.
+		*/
+		string Name { get; }
+
+		/*
+			The description of the item.
+		*/
+		string Description { get; }
+
+		/*
+			The id of the item.
+		*/
+		ulong Id { get; }
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Base/IItem.cs.meta b/MrBigsock/Assets/Code/Item/Base/IItem.cs.meta
new file mode 100644
index 00000000..7c3c5385
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/IItem.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 0a4fa79a9560deb45976fa4bebd5d1ec
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Base/ItemBase.cs b/MrBigsock/Assets/Code/Item/Base/ItemBase.cs
new file mode 100644
index 00000000..bd74fdd3
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/ItemBase.cs
@@ -0,0 +1,30 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		A class that represents the root of all items.
+	*/
+	public abstract class ItemBase : IItem {
+		/*
+			The name of the item.
+		*/
+		public string Name { get; protected set; }
+
+		/*
+			The description of the item.
+		*/
+		public string Description { get; protected set; }
+
+		/*
+			The id of the item.
+		*/
+		public ulong Id { get; protected set; }
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Base/ItemBase.cs.meta b/MrBigsock/Assets/Code/Item/Base/ItemBase.cs.meta
new file mode 100644
index 00000000..fa7b4531
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/ItemBase.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: e99afc192b85f3d43a7159cbbd68a39c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs b/MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs
new file mode 100644
index 00000000..1b09c3b4
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs
@@ -0,0 +1,21 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		A class that represents an item that provides passive stat boosts.
+	*/
+	public abstract class PassiveItemBase : ItemBase {
+		/*
+			The modifier of the item.
+		*/
+		public ICharacterStats Modifier { get; set; }
+
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs.meta b/MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs.meta
new file mode 100644
index 00000000..d264b9a2
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/PassiveItemBase.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 779b8b8f25258cf4983c1ac9d442cb8c
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Base/TriggerType.cs b/MrBigsock/Assets/Code/Item/Base/TriggerType.cs
new file mode 100644
index 00000000..5ea86686
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/TriggerType.cs
@@ -0,0 +1,20 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		The type of trigger that activates the item's effect.
+	*/
+	public enum TriggerType {
+		None,
+		OnKill,
+		OnAttack,
+		OnHit,
+		OnDamage,
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Base/TriggerType.cs.meta b/MrBigsock/Assets/Code/Item/Base/TriggerType.cs.meta
new file mode 100644
index 00000000..de080a71
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Base/TriggerType.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 39ba995ac8dbf00498eb995c98f71402
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/EventParams.meta b/MrBigsock/Assets/Code/Item/EventParams.meta
new file mode 100644
index 00000000..ed6be0ca
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/EventParams.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 9b2c87c112ffd1a4dbacf0405214b30b
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs b/MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs
new file mode 100644
index 00000000..fa52874e
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs
@@ -0,0 +1,27 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock {
+
+	/*
+		Class that represents the parameters of a generic character event.
+	*/
+	public class CharEventParams : ICharEventParams {
+		/*
+			The character that own's the event.
+		*/
+		public Character Source { get; set; }
+
+		/*
+			The character that triggered the event. (If any)
+			ex.: OnKill -> the killed enemy. OnDamage -> Enemy that dealt the damage.
+		*/
+		public Character Target { get; set; }
+
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs.meta b/MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs.meta
new file mode 100644
index 00000000..d594b12a
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/EventParams/CharEventParams.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 69465ff2019a5bb428771fa1c74e4f41
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs b/MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs
new file mode 100644
index 00000000..8204f89e
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs
@@ -0,0 +1,27 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock {
+
+	/*
+		Interface that represents the parameters of a generic character event.
+	*/
+	public interface ICharEventParams {
+		/*
+			The character that own's the event.
+		*/
+		Character Source { get; }
+
+		/*
+			The character that triggered the event. (If any)
+			ex.: OnKill -> the killed enemy. OnDamage -> Enemy that dealt the damage.
+		*/
+		Character Target { get; }
+
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs.meta b/MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs.meta
new file mode 100644
index 00000000..1161d2b5
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/EventParams/ICharEventParms.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: f392d99fa5161e04791a522b7becc933
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Inventory.cs b/MrBigsock/Assets/Code/Item/Inventory.cs
new file mode 100644
index 00000000..26c46568
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Inventory.cs
@@ -0,0 +1,49 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		An inventory of a character.
+	*/
+	public class Inventory {
+		/*
+			The items in the inventory.
+		*/
+		public List<IItem> Items { get; protected set; } = new List<IItem>();
+
+		/*
+			The modifier from all the passives.
+		*/
+		public ICharacterStats Modifier { get; protected set; } = new CharacterStats();
+
+
+		/*
+			The max number of items the inventory can hold.
+		*/
+		public int Cap { get; set; } = 3;
+
+
+		/*
+			Adds an item to the inventory and manages changes.
+		*/
+		public bool AddItem(IItem item) {
+			if(Items.Count >= Cap) return false;
+			
+			Items.Add(item);
+
+			// Add the passive effects to the modifier.
+			if(item is PassiveItemBase passive) {
+				Modifier = Modifier.Add(passive.Modifier);
+			}
+			//! Add ifs to handle the other 2 types of items.
+
+			return true;
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Inventory.cs.meta b/MrBigsock/Assets/Code/Item/Inventory.cs.meta
new file mode 100644
index 00000000..f35fc65d
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Inventory.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 91c4ea7605d846e4a8ea5208d2217072
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Items.meta b/MrBigsock/Assets/Code/Item/Items.meta
new file mode 100644
index 00000000..0970a19e
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Items.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: dbcc22c9f61379c4e9676afbe7eb8feb
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Items/RunningShoes.cs b/MrBigsock/Assets/Code/Item/Items/RunningShoes.cs
new file mode 100644
index 00000000..618fdef6
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Items/RunningShoes.cs
@@ -0,0 +1,24 @@
+using System.Collections;
+using System;
+using System.Collections.Generic;
+using UnityEngine;
+using UnityEngine.InputSystem;
+
+
+namespace BigSock.Item {
+
+	/*
+		A passive item that increases user's running speed by 50%.
+	*/
+	public class RunningShoes : PassiveItemBase {
+		public RunningShoes() {
+			Id = 101;
+			Name = "Running Shoes";
+			Description = "Increases movement speed by 50%";
+			Modifier = new CharacterStats{
+				MoveSpeed = 0.5f,
+			};
+		}
+
+	}
+}
\ No newline at end of file
diff --git a/MrBigsock/Assets/Code/Item/Items/RunningShoes.cs.meta b/MrBigsock/Assets/Code/Item/Items/RunningShoes.cs.meta
new file mode 100644
index 00000000..791c93b1
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Items/RunningShoes.cs.meta
@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 12406fa4fcf374142ad545946396cbde
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/Item/Root.meta b/MrBigsock/Assets/Code/Item/Root.meta
new file mode 100644
index 00000000..ebb11903
--- /dev/null
+++ b/MrBigsock/Assets/Code/Item/Root.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: fad9ca94bd85fe14da5644defaaf3820
+folderAsset: yes
+DefaultImporter:
+  externalObjects: {}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 
diff --git a/MrBigsock/Assets/Code/PlayerController.cs b/MrBigsock/Assets/Code/PlayerController.cs
index 0711143f..dea96a53 100644
--- a/MrBigsock/Assets/Code/PlayerController.cs
+++ b/MrBigsock/Assets/Code/PlayerController.cs
@@ -4,6 +4,7 @@ using System.Collections.Generic;
 using UnityEngine;
 using UnityEngine.InputSystem;
 using BigSock.UI;
+using BigSock.Item;
 
 
 namespace BigSock {
@@ -36,13 +37,13 @@ namespace BigSock {
 
 
 			// Start is called before the first frame update 
-			void Start()
+			protected override void Start()
 			{
-					rb = GetComponent<Rigidbody2D>();
-					animator = GetComponent<Animator>();
-					spriteRenderer = GetComponent<SpriteRenderer>();
-					hpBar.SetMaxHealth(Convert.ToInt32(MaxHP));
-					hpBar.SetHealth(Convert.ToInt32(HP));
+				base.Start();
+				animator = GetComponent<Animator>();
+				spriteRenderer = GetComponent<SpriteRenderer>();
+				hpBar.SetMaxHealth(Convert.ToInt32(MaxHP));
+				hpBar.SetHealth(Convert.ToInt32(HP));
 			}
 
 
@@ -102,6 +103,11 @@ namespace BigSock {
 
 					
 				}
+
+				//!! Code for testing the new item stuff.
+				if(Input.GetKeyDown(KeyCode.Space)) {
+					TryPickUpItem(new RunningShoes());
+				}
 			}
 
 
diff --git a/MrBigsock/Assets/Code/orc/EnemyController.cs b/MrBigsock/Assets/Code/orc/EnemyController.cs
index d6e7282d..5e286172 100644
--- a/MrBigsock/Assets/Code/orc/EnemyController.cs
+++ b/MrBigsock/Assets/Code/orc/EnemyController.cs
@@ -28,8 +28,8 @@ namespace BigSock {
 
 		// private Collider2D_Proxy secondCollider;
 		
-		protected virtual void Start(){
-			rb = GetComponent<Rigidbody2D>();
+		protected override void Start() {
+			base.Start();
 
 			m_Animator = gameObject.GetComponent<Animator>();
 
-- 
GitLab