# 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
```


---

# 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/f20_bkup_v2/inventory-system/inventory-scriptableobject/updated-inventorysystem/pickup-gamedata-mods.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.
