# GameData, PickUp Mods

The following scripts contain updated code that is already integrated the Inventory System Unity Package.

**IMPORTANT**:  You may get a compile error in your code when importing the **InventorySystem** Package due to inconsistencies between using the **`GameData variable:  score`**, sometimes the variable **`totalScore`** was used with the same meaning.  Fix the error:  I recommend using **`score / Score`**, instead of totalScore/TotalScore, because it is what is used in subsequent code for Project 3 - LevelManager.cs&#x20;

The error above may show up in PlayerStats.cs:  Make the following change

```java
private void UpdateDisplay()
    {
        scoreText.text = "Score: " + GameData.instanceRef.Score; //replace .TotalScore
        healthText.text = "Health: " + GameData.instanceRef.Health;
    }
```

### Class Pickup

**updated Apr 10,2019**

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

//combines frontEnd UI and BackEnd 
public class PickUp : MonoBehaviour {

    public ItemInstance itemInstance;

    private int value;

    //read-only property
    public int Value
    {
        get { return value; }
    }

    private void Start()
    {
        this.value = itemInstance.item.value;
    }

    /// <summary>
    /// Adds the item to GameData Inventory
    /// Can be executed by button.onClick
    /// when added as a listener
    /// </summary>
    public void AddItem( ) //can be called onClick for a button
    {
        GameData.instanceRef.AddItem(this.itemInstance);
    }
}//end class PickUp
```

## GameData Changes: &#x20;

### Updated Class GameData with CustomEvent and Inventory, AddItem(ItemInstance)**, BoostHealth( ), BoostExperience( )**

**IMPORTANT**:  You may get a compile error in your code due to inconsistencies between using the **`GameData variable:  score`**, sometimes the variable **`totalScore`** was used with the same meaning.  Fix the error:  I recommend using **`score / Score`**, instead of totalScore/TotalScore, because it is what is used in subsequent code for Project 3 - LevelManager.cs&#x20;

## **GameData: Final Version**&#x20;

*updated Apr 3,2020*

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

///4/3/2020

//Singleton - one and only 1 ever in existance
//global variable to allow easy access
public class GameData : MonoBehaviour
{

    /// static means it belongs to the Class, and not to an object instance of the class
    public UnityEvent onPlayerDataUpdate = new UnityEvent();

    public static GameData instanceRef;  ///Global variable 

    public Inventory inventory;//Scriptable Object
    private Dictionary<string, string> choiceData = new Dictionary<string, string>();
    /// <summary>
    /// Properties - provide read/write access to variables
    /// </summary>



    private int levelScore;
    private int score; //some versions use totalScore
    private int health;
    private int experience;
    private int lives;
    private int maxExperience = 100;
    public bool miniGameWinner = false;



    //Properties - Support Encapsulation - protect inner workings of our class
    public int Score //some versions use TotalScore
    {
        get { return score; }   //read only access
    }

    public int LevelScore
    {
        get { return levelScore; }
        set { levelScore = value; }
    }

    public int Lives
    {
        get { return lives; }
        set { lives = value; }
    }

    public int Experience
    {
        get { return experience; }   //read only access
    }

    public int Health
    {
        get { return health; }   //read only access
    }

    private void Awake()
    {
        health = 100; //initialize
        score = 0;
        if (instanceRef == null)
        {
            instanceRef = this; //point to itself
            DontDestroyOnLoad(this.gameObject);  //this will never be destroyed
        }
        else
        {
            Destroy(this.gameObject);
            Debug.Log("Duplicate GameData is Destroyed");
        }
    }


    /// <summary>
    /// Add the specified item.
    /// Overloaded method
    /// takes the ItemInstance item as input parameter
    /// </summary>
    /// <param name="item">Item.</param>
    /// 

    public void AddItem(ItemInstance item)
    {
        inventory.InsertItem(item);
        //inventory invokes onInventoryUpdate event
    }

    /// <summary>
    /// Add the specified value.
    /// Overloaded method
    /// takes the PickUp item's value as input parameter
    /// </summary>
    /// <param name="value">Value.</param>
    public void Add(int value)
    {
        score += value;
        levelScore += value;  //Make sure you have this line of code
        Debug.Log("Score is updated " + score);
        InvokePlayerDataUpdate();
    }

    public void BoostHealth(int value)
    {
        health += value;
        health = Mathf.Min(health, 100);
        Debug.Log("boosting health, new health " + health);
        InvokePlayerDataUpdate();
    }

    public void BoostExperience(int value)
    {
        experience += value;
        experience = Mathf.Min(experience, maxExperience);
        Debug.Log("boosting experience: " + experience);
        InvokePlayerDataUpdate();
    }

    //updated TakeDamage: 4/24/19
    public void TakeDamage(int value)
    {
        health -= value;
        if (health < 0) health = 0;  //makes sure health !< 0
        Debug.Log("Health is updated " + health);
        InvokePlayerDataUpdate();
    }

    public void InvokePlayerDataUpdate()
    {
        if (onPlayerDataUpdate != null)
        {
            onPlayerDataUpdate.Invoke();
        }
    }

    public void SaveChoice(string choiceKey, string choiceValue)
    {

        if (choiceData.ContainsKey(choiceKey))
        {
            choiceData[choiceKey] = choiceValue; //change stored value
            Debug.Log("Choice Changed" + choiceKey + " : " + choiceValue);
        }
        else
        {
            choiceData.Add(choiceKey, choiceValue); //adds key,value pair
            Debug.Log("Choice Data Created" + choiceKey + " : " + choiceValue);
        }
    }

    public string GetChoice(string choiceKey)
    {
        string choiceValue = "None";
        choiceData.TryGetValue(choiceKey, out choiceValue);
        Debug.Log("Choice Data Accessed" + choiceKey + " : " + choiceValue);
        return choiceValue;
    }


    //to restart entire game
    public void ResetGameData()
    {
        health = 100; //initialize
        score = 0;
        experience = 0;
        //inventory.inventory.Clear();
        miniGameWinner = false;
    }

    //to restart miniGame
    public void ResetMiniGameData()
    {
        health = 100; //initialize
        score = 0;
        levelScore = 0;
    }

} //end class
```
