> For the complete documentation index, see [llms.txt](https://kdoore.gitbook.io/cs2335/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://kdoore.gitbook.io/cs2335/overview-branchlogic/gamedata-v3.md).

# GameData Version3

This version of GameData includes C# Dictionary choiceData and methods to save and access key,value pairs of data.

You must update your GameData code to this version in order to use the choiceData dictionary and methods.

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

/// <summary>
/// Singleton Object to store all GameData
/// Is not destroyed when changing scenes
/// </summary>
public class GameData : MonoBehaviour
{
    public static GameData instanceRef; //null //variable that can point to a GameData object

    private int score;
    private int health;
   

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

    public int  Score
    {
        get { return score; } //Read access
                                   // set { totalScore = value; }   //write access
    }

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

    // Awake is called before Start() is called on any GameObject
    // Other objects have dependencies on this object so it must be created first
    void Awake()
    {
        if (instanceRef == null)  //this code hasn't been executed before
        {
            instanceRef = this; //point to object instance currently executing this code
            DontDestroyOnLoad(this.gameObject); //don't destroy the gameObject this is attached to
        }
        else  //this object is not the first, it's an imposter that must be destroyed
        {
            DestroyImmediate(this.gameObject);
            Debug.Log("Destroy GameData Imposter");
        }

        //initialize after destroying imposters
        score = 0;
        health = 100;
       

    } //end Awake

    //will be executed in PlayerController when colliding with a collectible
    public void Add(int value)
    {
        score += value;
        Debug.Log("Score updated: " + score); //display score in console
    }// end Add

    public void TakeDamage(int value)
    {
        health -= value;
        Debug.Log("health updated: " + health); //display health in console
        if (health <= 0)
        {
            Debug.Log("Health less than 0"); //display health in console
        }
    }//end TakeDamage
    
    //uses score points to purchase something
     public void Buy(int value)
    {
        score -= value;
        Debug.Log("Buy: score reduced " + score);
    }

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

    //save any <string, string > key-value pair in choiceData dictionary
    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);
        }
       
    }

    //given key, read any < string, string > key-value pair 
    public string GetChoice(string choiceKey)
    {
        string choiceValue = "None";
        choiceData.TryGetValue(choiceKey, out choiceValue);
        Debug.Log("Choice Data Accessed" + choiceKey + " : " + choiceValue);
       
        return choiceValue;
    }

    //removes item from dictionary if key exists
    public void RemoveChoice( string choiceKey)
    {
        if(choiceData.ContainsKey(choiceKey))
        {
            choiceData.Remove(choiceKey);
          
        }
    }
    
    
    //called when restarting the miniGame
    public void ResetGameData()
    {
        score = 0;
        health = 100;
    }


}//end class GameData
```

Optional way to initialize Dictionary Values when GameData Awake( ) is executed

```csharp
 //Initialize with default state values
 //Executed in Awake( ) 
    void InitializeChoiceStatevalues()
    {
        SaveChoice("LucyState", "deficiency");
        SaveChoice("ZombieState", "hungry");
        SaveChoice("RobotState", "agent");
        SaveChoice("CatState", "missing");
        SaveChoice("MonsterState", "angry");

    }
```
