# Item, Gem, Potion Classes

The backbone of this Inventory are several classes that inherit from SciptableObject.

## Item Class - Abstract Class, ItemInstance Class

The **Item Class** is an **abstract class**, this means that no Item objects can be created directly of the Item type. Instead, we must write **concrete classes** that inherit from the Item Class, such as Gem, Potion.

## Methods:  abstract, virtual, override:

The Item class introduces new types of methods, where we want to insure we can call the method `Use( )`, on all object instances ( of child classes )

**Updated: April 11, 2020**

## class Item, ItemInstance

```java
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//Modified from
//https://github.com/Toqozz/blog/blob/master/inventory

//https://answers.unity.com/questions/1415831/inheritance-from-a-scriptableobject.html

//updated 4/10/2020

public enum ItemType
{
    Gem, Potion, Key
}

[System.Serializable]
//abstract classes can not be used to make 
//actual object instances, only child classes of 
//abstract classes can actually be created.
public abstract class Item : ScriptableObject {

    public string itemName;
    public int value;
    public Sprite sprite;

    protected ItemType itemType; 

    //updated code adds variable below - must be set in child class constructor
    public string instanceType; // enum type set in child classes - ie: Gem.Sapphire

    /// <summary>
    /// virtual means that this class can be overridden in a child-class, but it is not required
    /// in which case no code would be executed since this default version of the method 
    /// happens to have no code.
    /// </summary>
    public virtual void Use() 
    {
       //no code in this case, so nothing will be executed
    }

    ///other option which requires Use to be overridden in child classes
    /// 
    /*public abstract void Use()
    {
        //no code in this case, so nothing will be executed
    }
    */
}


[System.Serializable]
public class ItemInstance 
{
    // Reference to scriptable object "template".
    public Item item; //should be a child class item


    public ItemInstance(Item item,int value ) 
    {
        this.item = item;
        item.value = value;
    }
}

```

### Class Gem

```java
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//modified from
////https://github.com/Toqozz/blog/blob/master/inventory

//updated 4/10/2020

public enum GemType { Ruby, Diamond, Sapphire, Emerald }

[System.Serializable]
public class Gem : Item {

    public GemType gemType;

    public Gem()
    {
        itemType = ItemType.Gem;
        instanceType = gemType.ToString(); //updated - new code
    }

    public override void Use()
    {
        Debug.Log("Using Gem " + this.gemType);
        //TODO what does a gem do?
    }
} //end class Gem

```

## Class Potion

```java
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

//modified from
////https://github.com/Toqozz/blog/blob/master/inventory

public enum PotionType { Energy, Wisdom, Truth, Health }

public class Potion : Item {

    public PotionType potionType;

    public Potion()
    {
        itemType = ItemType.Potion;
        instanceType = potionType.ToString(); //set item value of potionType enum as string
    }

    public override void Use()
    {
        Debug.Log("Using Potion " + this.potionType);
        switch (this.potionType)
        {
            case PotionType.Health:
                GameData.instanceRef.BoostHealth(this.value);
                break;
            case PotionType.Energy:
               // GameData.instanceRef.BoostEnergy(this.value);
                break;
            case PotionType.Wisdom:
            case PotionType.Truth:
                //GameData.instanceRef.BoostExperience(this.value);
                break;
        }
        GameData.instanceRef.BoostHealth(this.value);
    }

} //end class Potion

```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kdoore.gitbook.io/cs2335/cs2335_f20/inventory-system/inventory-scriptableobject/overview/inventory-item-class.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
