PROJECT DESCRIPTION

Rollcore was one of my very first games that I have made and was created as part of one of my assignmrnts during my studies on creative media and production (Games Development). This game consists of a singular ball that the player controls and explores a vast world filled with landmarks, enemies, healthpacks and more! 

 

During the development of this game, I didnt think nor know too much about how "good" the game works nor looks, I just wanted to practise and create however the outcome was more satisfying and celebratory that I have anticipated, making me proud of my first game I created and motivating more to explore this career and what kind of amazing new ideas and titles I could either make myself or help make within a team. 

 

I do eventually intend to "remaster" and recreate this game in a more appealing and optimised fashion with a debut to more abilities and possible areas/landmarks. (Keep your eye out for that!)

! PLAY HERE !

This is my first ever game, so... Expect ALOT of bugs

GAME DESIGN DOCUMENT

HIGHLIGHT IDEAS GENERATION

 

Locked Areas

 

The first idea that I wanted to try and implement is the feature of unlocking areas if you have a certain score. My idea is using two scripts, the player script and a new script. In the new script I want to define how much score you would need to be able to unlock an area, using two scripts will be useful as I can amend how much score each barrier would need with no additional code.

 

My idea was to initially set the isTrigger option to false at the first frame, then using the OnColliderEnter() method and filter using CompareTag("Barrier") to run a block of code when the player collides with the barrier. The block of code will check if the score is equal to or bigger than the cost and if true, it will change isTrigger() to true and therefore the ball can go through the barrier and destroy it, making a particle effect to show that it has been unlocked. The image below shows a flowchart and the order of all the processes that will happen for this idea to be successfully implemented into the prototype. Flowcharts are useful to plan procedures and envision them in your head, it is commonly used for project planning.

 

 I wanted to display the remaining score (which will be referred to as "energy"). The new processes are shown by the yellow region on the updated flowchart above. I plan to improve the Locked areas by displaying the difference between the current players energy and the required amount of energy to unlock an area as it will assist the player to know how much more energy is needed to unlock an area rather than just guessing how much energy unlocking a certain area is needed. 

 

Enemies + Proximity

 

For the combat system, I wanted to provide enemies with a proximity area so that if the player is in the proximity of the enemy, the enemy would start chasing the player. I had the idea of having multiple Collison boxes on the enemy by using the parent/child feature of unity. The parent class will be an empty game Object with the script that checks if the player is in the proximity range of the range and if so, it will trigger a method to be executed in the enemy script that will allow the enemy entity to follow the player.

I had to research how the enemy would follow the player if the player comes into contact with the enemies proximity, to help me implement enemies following, I would need a public Game Object reference for a target (that being the player), then I can use the MoveTowards() operation that will help the enemy move towards the player. I needed 3 arguments to use MoveTowards() which were the objects position, the targets position and the speed. As the object position would be the enemies position, I can use tranform.position to get the enemies position as well as Target.transform.position that will get the players position and finally use EnemySpeed*Time.deltaTime to get the speed of the movement. Time.deltatime is used to give us a smoother movement as the use of deltaTime will make the game frame independent and therefore will run the same speed, no matter what the frames per second is.

 

The ability icons are the icons that can be found on the top right part of the image above, these icons are made from me and created with the help of Krita. Each icon has some correspondence to their ability that they represent (for example, The Invincibility Ability icon has a forcefield around the ball to represent defense). Each ability icon has their unique keybind to show the player what keybind is the action to activate a certain ability, however the teleport ability has no keybind as it will eventually be designed to open up a map of the game showing all the shrines that the player can teleport to. Once activating an ability, I want to use the gray icon (can be found in the top right of the image) to cover the ability and paste a countdown onto the gray icon to indicate how long until the player can use the ability again. The assets found on the bottom left of the image will tell the player which biome they are currently in. The bottom right asset holds my final design of the prototypes Heads Up Display. Containing a slot for ability icons, the health/ armor/ score of the player as well as what biome the player is in. I wanted to maximise the amount of information that the player is given however also try to balance how much the player can see (gameplaywise).

HIGHLIGHT CODE SNIPPETS

public class RollyBall : MonoBehaviour
{
    Rigidbody rb;
    private Vector3 grav=new Vector3(0,-50f,0); 
    Vector3 moveDirection;

    public GameObject ForceField;
    public GameObject ImpulseEffect;

    public GameObject DamageTaken;
    public GameObject MoreHealth;
    private bool ShowDamage=false;
    private int ShowDamageCount;

    public float moveSpeed=10f;
    public GameObject explosionPrefab;
    public GameObject MatrixParticle;
    public GameObject Impulse;
    private GameObject DestroyImpulse;
    public int scoreValue;
    private int Difference;
    public GameObject AugmentParticle;
    public GameObject Portal;
    public GameObject PortalText;

    private bool ShowPortalText;
    private int ShowPortalTextCount;

    public Text scoreText;
    public Text HealthText;
    public Text ArmourText;
    public Text COOLDOWN;

    public bool ShowCooldown;
    public int ShowCooldownCount;

    public int check;
    bool TriggerState;

    public int PlayerHealth;
    public int PlayerArmour;
    public int MaxHealth;
    public int MaxArmour;
    public int Damage;

    public bool ImpusleCooldownBool=false;
    public int ImpusleCoolCount=0;
    public int ImpulseCountDown=60*60;
    public bool ImpulseShown=false;
    public bool ImpulseActive=false;
    private int ForceFieldCount=10;
    private int ForceFieldShowCount;

    public int InvincCoolCount=0;
    public int InvincCountDown=60*60;
    public bool InvincCooldownBool=false;

    public bool InvincActive=false;
    
    public bool SpeedCooldwonBool=false;
    public int SpeedCoolCount=0;
    public int SpeedCountdown=60*30;
    public bool SpeedActive=false;
    public float NormalSpeed=1f;
    public float AbilitySpeed=0.5f;

    private bool TeleportActive;

    public GameObject DashCD;
    public GameObject ImpulseCD;
    public GameObject InvincCD;

    public Text DashCooldownText;
    public Text ImpulseCooldownText;
    public Text InvincibilityCooldownText;

    public Text TeleportText;
    
    public bool DashObtained=false;
    public bool ImpulseObtained=false;
    public bool InvincibilityObtained=false;
    public bool TeleportObtained=false;

    public int duration=600;

    public Text CostNeeded;
    private bool CostCheck;
    private int CostCheckCount;
    private int StoreHealth;

    private bool inLava;

    public bool PlainsShrineActive;
    public bool DesertShrineActive;
    public bool SnowShrineActive;
    public bool VolcanoShrineActive;
    public bool GlitchShrineActive;

    string Plains;
    string Desert;
    string Snow;
    string Volcano;
    string Glitch;

    public GameObject DeathSFX, KeySFX, DamageTakeSFX, ImpulseSFX, InvincSFX, DoorBreakSFX, FlySFX, DashSFX, AugmentSFX, MatrixSFX; 

    [SerializeField] Transform cam;
    
    void Start()
    {      
        rb = GetComponent();
        rb.mass = NormalSpeed;  
        SetHealthText();
        ForceField.SetActive(false);
        MaxHealth = 50;
        MaxHealth = 50;
    }

    void Update()
    {
        float HorizontalInput = Input.GetAxisRaw("Horizontal") * moveSpeed;
        float VericalInput = Input.GetAxisRaw("Vertical") * moveSpeed;

        Vector3 camFoward = cam.forward;
        Vector3 camRight = cam.right;

        camFoward.y = 0;
        camRight.y = 0;
        Vector3 FowardRelative =  VericalInput * camFoward;
        Vector3 RightRelative = HorizontalInput * camRight;
        Vector3 moveDir = FowardRelative + RightRelative;
        moveDirection = new Vector3(moveDir.x / 5, 0, moveDir.z / 5); 

        if(PlayerHealth <= 0 )
        {
            rb.isKinematic = true;
            transform.position = new Vector3(2834f,3f,1121f);
            rb.isKinematic = false;
            PlayerHealth = MaxHealth;
            DeathSFX.GetComponent().Play();
            SetHealthText();
        }

        if(ShowDamage)
        {
            if(ShowDamageCount != 10)
            {
                ShowDamageCount++;
            }
            else
            {
                ShowDamage = false;
                ShowDamageCount = 0;
                MoreHealth.SetActive(false);
                DamageTaken.SetActive(false);
            }
        }

        if(TeleportObtained)
        {
            if(TeleportActive == false)
            {
                if(Input.GetKeyDown("4"))
                {
                    TeleportActive = true;
                    TeleportText.gameObject.SetActive(true);
                }
            }
            else
            {
                if(PlainsShrineActive)
                {
                    Plains = "Plains";
                }
                else
                {
                    Plains = "?";
                }
                if(DesertShrineActive)
                {
                    Desert = "Desert";
                }
                else
                {
                    Desert = "?";
                }
                if(SnowShrineActive)
                {
                    Snow = "Snowy Mountains";
                }
                else
                {
                    Snow = "?";
                }
                if(VolcanoShrineActive)
                {
                    Volcano = "Volcanic Peaks";
                }
                else
                {
                    Volcano = "?";
                }
                if(GlitchShrineActive)
                {
                    Glitch = "Glitched Dimension";
                }
                else
                {
                    Glitch = "?";
                }
                
                TeleportText.text = "Click number to teleport\nCANCEL: 4\n" + Plains + ": 5\n" + Desert + ": 6\n" + Snow + ": 7\n" + Volcano + ": 8\n" + Glitch + ": 9";

                if(Input.GetKeyDown("4"))
                {
                    TeleportText.gameObject.SetActive(false);
                    TeleportActive = false;
                }
                if(Input.GetKeyDown("5"))
                {
                    if(PlainsShrineActive)
                    {
                        TeleportText.gameObject.SetActive(false);
                        TeleportActive = false;
                        rb.isKinematic = true;
                        transform.position = new Vector3(2456f,21f,1539f);
                        rb.isKinematic = false;
                        FlySFX.GetComponent().Play();
                    }
                }   
                if(Input.GetKeyDown("6"))
                {
                    if(DesertShrineActive)
                    {
                        TeleportText.gameObject.SetActive(false);
                        TeleportActive = false;
                        rb.isKinematic = true;
                        transform.position = new Vector3(2258f,21f,2356f);
                        rb.isKinematic = false;
                        FlySFX.GetComponent().Play();
                    }
                }  
                if(Input.GetKeyDown("7"))
                {
                    if(SnowShrineActive)
                    {
                        TeleportText.gameObject.SetActive(false);
                        TeleportActive = false;
                        rb.isKinematic = true;
                        transform.position = new Vector3(2707f,21f,157f);
                        rb.isKinematic = false;
                        FlySFX.GetComponent().Play();
                    }
                }  
                if(Input.GetKeyDown("8"))
                {
                    if(VolcanoShrineActive)
                    {
                        TeleportText.gameObject.SetActive(false);
                        TeleportActive = false;
                        rb.isKinematic = true;
                        transform.position = new Vector3(1535f,21f,670f);
                        rb.isKinematic = false;
                        FlySFX.GetComponent().Play();
                    }

                }   
                if(Input.GetKeyDown("9"))
                {
                    if(GlitchShrineActive)
                    {
                        TeleportText.gameObject.SetActive(false);
                        TeleportActive = false;
                        rb.isKinematic = true;
                        transform.position = new Vector3(2479f,21f,4375f);
                        rb.isKinematic = false;
                        FlySFX.GetComponent().Play();
                    }
                }
                
            }
        }


        if(InvincibilityObtained)
        {
            if(Input.GetKeyDown("3"))
            {
                if(InvincCooldownBool == false)
                {
                    InvincSFX.GetComponent().Play();
                    ForceField.SetActive(true);
                    InvincActive = true;
                    InvincCooldownBool = true;
                    InvincCD.GetComponent().enabled = true;
                    
                }
                else
                {
                    ShowCooldown = true;
                }
            }
            if (InvincCooldownBool)
            {
                InvincCooldown();
            }     
        }

        if(ImpulseObtained)
        {
            if(Input.GetKeyDown("2"))
            {
                if(ImpusleCooldownBool == false)
                {
                    ImpulseSFX.GetComponent().Play();
                    ImpulseActive = true;
                    ImpusleCooldownBool = true;
                    ImpulseCD.GetComponent().enabled = true;
                    
                }
                else
                {
                    ShowCooldown = true;
                }
            }
            if (ImpusleCooldownBool)
            {
                ImpulseCooldown();
            }
        }

        if(DashObtained)
        {
            if(Input.GetKeyDown("1"))
            {
                if(SpeedCooldwonBool == false)
                {
                    DashSFX.GetComponent().Play();
                    GetComponent().enabled = true;
                    SpeedActive = true;
                    SpeedCooldwonBool = true;
                    DashCD.GetComponent().enabled = true;
                }
                else
                {
                    ShowCooldown = true;
                }
            }
            if (SpeedCooldwonBool)
            {
                SpeedCooldown();
            }
        }

        if (ShowCooldown)
        {
            COOLDOWN.GetComponent().enabled = true;
            if (ShowCooldownCount != 60)
            {
                ShowCooldownCount = ShowCooldownCount + 1;
            }
            else
            {
                ShowCooldownCount = 0;
                ShowCooldown = false;
                COOLDOWN.GetComponent().enabled = false;
            }
        }

        if(CostCheck)
        {
            if(CostCheckCount != 60)
            {
                CostCheckCount = CostCheckCount + 1;
            }
            else
            {
                CostNeeded.GetComponent().enabled = false;
                CostCheckCount = 0;
                CostCheck = false;
            }
        }
    }

    private void InvincCooldown()
    {
        if(InvincCoolCount != InvincCountDown)
        {
            InvincCoolCount = InvincCoolCount + 1;
            InvincibilityCooldownText.text = ((InvincCountDown/60)-(InvincCoolCount/60)).ToString();
        }
        else
        {
            InvincCooldownBool = false;
            InvincCoolCount = 0;
            InvincCD.GetComponent().enabled = false;
            InvincibilityCooldownText.text = "";
        }
        if(InvincCoolCount == duration)
        {
            InvincActive = false;
            ForceField.SetActive(false);
        }
    }

    private void SpeedCooldown()
    {
        if(SpeedActive)
        {
            rb.mass = AbilitySpeed;
        }
        if(SpeedCoolCount != SpeedCountdown)
        {
            SpeedCoolCount = SpeedCoolCount + 1;
            DashCooldownText.text = ((SpeedCountdown/60)-(SpeedCoolCount/60)).ToString();

            if(SpeedCoolCount == 60*5)
            {
                rb.mass = NormalSpeed;
                GetComponent().enabled = false;
                SpeedActive = false;
            }
        }
        else
        {
            SpeedCoolCount = 0;
            SpeedCooldwonBool = false;
            DashCD.GetComponent().enabled = false;
            DashCooldownText.text = "";
        }
    }

    private void ImpulseCooldown()
    {

        if(ImpulseActive)
        {
            if(ImpulseShown)
            {
                if(ImpusleCoolCount==60)
                {
                    Destroy(DestroyImpulse.gameObject);
                    ImpulseShown = false;
                    ImpulseActive = false;
                }

                if(ForceFieldShowCount == ForceFieldCount)
                {
                    DestroyImpulse = Instantiate(Impulse,transform.position,Quaternion.Euler(new Vector3(0,0,0)));
                    ForceFieldShowCount = 0;
                }
                else
                {
                    ForceFieldShowCount++;
                }
            }
            else
            {
                Instantiate(ImpulseEffect,transform.position,Quaternion.Euler(new Vector3(0,0,-90)));
                ImpulseShown = true;
            }

        }

        if(ImpusleCoolCount != ImpulseCountDown)
        {
            ImpusleCoolCount = ImpusleCoolCount + 1;
            ImpulseCooldownText.text = ((ImpulseCountDown/60)-(ImpusleCoolCount/60)).ToString();
        }
        else
        {
            ImpusleCoolCount = 0;
            ImpusleCooldownBool = false;
            ImpulseCD.GetComponent().enabled = false;
            ImpulseCooldownText.text = "";
        }
    }

    void FixedUpdate()
    {
       rb.AddForce(moveDirection * moveSpeed);
       rb.AddForce(grav * rb.mass);
    }

    private void OnTriggerEnter(Collider other){

        if(other.gameObject.CompareTag("DesertShrine"))
        {
            DesertShrineActive = true;
            other.gameObject.SetActive(false);
        }
        if(other.gameObject.CompareTag("PlainsShrine"))
        {
            PlainsShrineActive = true;
            other.gameObject.SetActive(false);
        }
        if(other.gameObject.CompareTag("SnowShrine"))
        {
            SnowShrineActive = true;
            other.gameObject.SetActive(false);
        }
        if(other.gameObject.CompareTag("VolcanoShrine"))
        {
            VolcanoShrineActive = true;
            other.gameObject.SetActive(false);
        }
        if(other.gameObject.CompareTag("GlitchShrine"))
        {
            GlitchShrineActive = true;
            other.gameObject.SetActive(false);
        }
        

        if(other.gameObject.CompareTag("Collectible"))
        {
            Instantiate(explosionPrefab, other.transform.position, other.transform.rotation);
            Destroy(other.gameObject);
            scoreValue = scoreValue + 1;
            KeySFX.GetComponent().Play();
        }

        if(other.gameObject.CompareTag("Matrix"))
        {
            if(other.GetComponent().enabled)
            {
                Instantiate(MatrixParticle, other.transform.position, other.transform.rotation);

                if (PlayerHealth + 20 > MaxHealth)
                {
                    Difference = MaxHealth - PlayerHealth;
                    PlayerArmour = PlayerArmour + Difference;
                    PlayerHealth = MaxHealth;
                    if (Difference == 0)
                    {
                        PlayerArmour = PlayerArmour + 20;
                    }
                }
                else
                {
                    PlayerHealth = PlayerHealth + 20;
                }

                if (PlayerArmour > MaxArmour)
                {
                    PlayerArmour = MaxArmour;
                }
                other.GetComponent().PlayerInteracted = true;
                ShowHealthGain();
                SetHealthText();
                MatrixSFX.GetComponent().Play();
            }

        }
            
        if(other.CompareTag("Augment"))
        {

            MaxArmour++;
            MaxHealth++;
            Damage++;
            Instantiate(AugmentParticle,transform.position,Quaternion.Euler(new Vector3(-90,0,0)));
            Destroy(other.gameObject);
            SetHealthText();
            AugmentSFX.GetComponent().Play();
        }
        if(other.CompareTag("Lava"))
        {
            inLava = true; 
            InvokeRepeating("LavaDamage",0.5f,0.5f);
        }
        if(other.CompareTag("VirusImpulse"))
        {
            if(PlayerArmour >= 10)
            {
                PlayerArmour = PlayerArmour - 10;
            }
            else
            {
                var Difference = 10 - PlayerArmour;
                PlayerHealth = PlayerHealth - Difference;
                PlayerArmour = 0;
            }
            ShowTakenDamge();
            SetHealthText();
        }
        if(other.CompareTag("Check"))
        {
            if(DashObtained && TeleportObtained && ImpulseObtained && InvincibilityObtained)
            {
                other.gameObject.SetActive(false);
                Portal.SetActive(true);
            }
            else
            {
                PortalText.GetComponent().enabled = true;
            }
            
        }
        if(other.CompareTag("Portal"))
        {
            rb.isKinematic = true;
            transform.position = new Vector3(2755f,27f,4283f);
            rb.isKinematic = false;
        }
        if(other.CompareTag("PlainsPortal"))
        {
            rb.isKinematic = true;
            transform.position = new Vector3(2088f,17f,1826f);
            rb.isKinematic = false;
        }
        SetSCoreText(); 
    }

    void OnTriggerExit(Collider other)
    {
        if(other.CompareTag("Lava"))
        {
            inLava = false;
        }
        if(other.CompareTag("Check"))
        {
            PortalText.GetComponent().enabled = false;
        }
    }

    void SetSCoreText()
    {
        scoreText.text = scoreValue.ToString();
    }
    
    public void SetHealthText()
    {
        HealthText.text = PlayerHealth.ToString();
        ArmourText.text = PlayerArmour.ToString();
    }

    private void OnCollisionEnter(Collision other)
    {
        if(other.gameObject.CompareTag("Cactus"))
        {
            if(PlayerArmour >= 5)
            {
                PlayerArmour = PlayerArmour - 5;
            }
            else
            {
                var Difference = 5 - PlayerArmour;
                PlayerHealth = PlayerHealth - Difference;
                PlayerArmour = 0;
            }
            ShowTakenDamge();
            SetHealthText();
        }

        if(other.gameObject.CompareTag("Door"))
        {
           check = other.gameObject.GetComponent().cost;
           if(scoreValue >= check)
            {
                scoreValue = scoreValue - check;
                Destroy(other.gameObject);
                Instantiate(explosionPrefab, other.transform.position,transform.rotation);
                SetSCoreText();
                DoorBreakSFX.GetComponent().Play();
            }
            else
            {
                int Difference = check - scoreValue;
                CostNeeded.text = "Gather " + Difference.ToString() + " more Energy";
                CostCheck = true;
                CostNeeded.GetComponent().enabled = true;
            }
            
        }   
    }

    void LavaDamage()
    {
        if(inLava)
        {
            PlayerHealth = PlayerHealth - 1;
            ShowTakenDamge();
            SetHealthText();
        }
    }

    public void ShowTakenDamge()
    {
        DamageTaken.SetActive(true);
        ShowDamage = true;
        DamageTakeSFX.GetComponent().Play();
    }
    public void ShowHealthGain()
    {
        MoreHealth.SetActive(true);
        ShowDamage = true;
    }
}

        

      public class EnemyProx : MonoBehaviour
{
    public GameObject EnemyGameObject;
    public GameObject Target;
    bool PlayerinProx;
    public float Distance;
    public int EnemySpeed;

    public float speed=10f;

    private int RotateCount;
    
    void Start()
    {
        
    }

    void Update()
    {
        if(PlayerinProx)
        {
            if(EnemyGameObject.gameObject.GetComponent().CooldownActive == false)
            {
                Vector3 targetDirection = Target.transform.position - transform.position;

                float singleStep = speed * Time.deltaTime;

                Vector3 newDirection = Vector3.RotateTowards(transform.forward, - targetDirection, singleStep, 0.0f);

                transform.rotation = Quaternion.LookRotation(newDirection, Vector3.up);
                
                transform.position = Vector3.MoveTowards(transform.position, Target.transform.position,  EnemySpeed * Time.deltaTime);
            }            
        }
    }
    

    private void OnTriggerEnter(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            PlayerinProx = true; 
        }
        
    }
    private void OnTriggerExit(Collider other)
    {
        if (other.gameObject.CompareTag("Player"))
        {
            PlayerinProx = false; 
        }
    }
}


  

          public class EnemyScript : MonoBehaviour
{
    public int Health;
    public int Damage;
    public GameObject Parent;
    public RollyBall script;
    
    public Text HealthText;
    public Text ArmourText;

    public GameObject InvincCD;

    public bool CooldownActive;
    public int DamageCooldown;
    public int CooldownCount;

    
    private int CurrentHealth;
    private int CurrentArmour;
    private int Difference;

    void Start()
    {
    }

    void Update()
    {
        if(CooldownActive)
        {
            if (CooldownCount != DamageCooldown)
            {
                CooldownCount = CooldownCount + 1;
                if(CooldownCount == DamageCooldown)
                {
                    CooldownActive = false;
                    CooldownCount = 0;
                }
            }
        }
    }

    private void OnCollisionEnter(Collision other)
    {
        if(other.gameObject.CompareTag("Player"))
        {
            if(script.InvincActive == false)
            {
                if (CooldownActive == false)
                {
                    CurrentArmour = other.gameObject.GetComponent().PlayerArmour;
                    CurrentHealth = other.gameObject.GetComponent().PlayerHealth;
                    
                    if(CurrentArmour >= Damage)
                    {
                        CurrentArmour = CurrentArmour - Damage;
                    }
                    else
                    {
                        Difference = Damage - CurrentArmour;
                        CurrentHealth = CurrentHealth - Difference;
                        CurrentArmour = 0;
                    }
                    other.gameObject.GetComponent().PlayerArmour = CurrentArmour;
                    other.gameObject.GetComponent().PlayerHealth = CurrentHealth;
                    CooldownActive = true;
                    other.gameObject.GetComponent().ShowTakenDamge();
                    SetHealthText();
                }
            }
        }
    }

    public void SetHealthText()
    {
        HealthText.text = CurrentHealth.ToString();
        ArmourText.text = CurrentArmour.ToString();
    }
}

          

ASSETS/TEXTURES/AUDIO USED

This texture resembles the wood/bark that you can find on the tree assets around the first biome of the game. I chose this texture as it was simple and basic and on the other hand has a decent amount of detail. This texture was found on Filter Forge and created by Aurum. 

This image shows my chosen texture that will be used for Grass. Will mostly be used in the plains biome to represent the lush and vibrant atmosphere that the beginning of the game will provide with the player to grasp their interest. I wanted all my textures to have a somewhat "illustrative" style to it to set a cartoonish world for the game. This texture was found on ArtStation and created by Mononoke.

This is a texture of leaves for the tree asset that can be found in the Plains Biome. I chose this texture as it fits the illustrative theme of the Plains Biome and thought that would contrast well in detail along with the wood texture above. This texture was found on pinetrest and created by Vector Stocks.

This is the texture that I found on Open Art that will resemble the cliffs/walls of the plains biome. I chose this texture as it gave me the impression of looking like ruins as well as a cliff. With the 2 concepts blended together, i thought that it would make a really good texture for the wall, creating an immersive atmosphere for the plains. I found this texture on Open Art, Open Art is a website that generates a texture from a prompt using AI, I do not claim this texture therefore it will be credited to Open Art AI.

This is a texture that will resemble the rocks appearance that can be found in the plains biome. I went for the texture as I thought it would contrast well with the grassy texture found above. Similarly to the wood texture, this texture was found on Filter Forge however was created by emme.

I found this texture on Shutter stock and used it while texturing the appearance of the enemy. I went for a scale like texture for the enemies because I wanted them to feel familiar to the player, visually showing that enemies are hostile. My initial idea for enemy appearance was making them look like goblins, however I differed from my idea by making them look lizard like however I inherited the goblin idea through colour and thats why I chose this colour specifically. It matches the colour of goblins and gives of a hostile nature to the ability. This texture was made by Mr.Alex M and uploaded by him on Shutter stock, therefore I give him the credit for using this texture.

This texture was also found on open Art and created by openArt AI. It consists of an illustrative texture of sand that will be used for the surface of the desert biome. 

 

(Link not found)

 

This is the texture that I used for the cactus asset that can be found throughout the desert biome. Trying to keep consistency with the illustrative visual to the world, I chose this texture to help stablalise that. This texture was  uploaded on dreamstime website.

This texture was found on the internet and on dreams time. It consists of a liquid metal texture that will be used for Augments (the Collectible that the player can collect that increments their stats). I went for this kind of texture as It gave me the impression of looking precious and stable which correlates to the Augment collectible that the player can find through out the world. This texture was uploaded and created by Alexandra Nedviga on Dreamstime.com.

 

This is the texture that resembles a canyon like cliff texture that I intend to place as the walls for the desert biome. I thought that this texture would blend really well with the sand texture found above to create a desert like visual and atmosphere for the player to explore in. This texture was also found on Filter Forge and also created by jitspoe.

Moving on to the Volcanic Peaks biome, I used this texture to highlight the lava areas that make the player take damage if in the vicinity. I chose this texture as it visually highlights lava and looks like lava. This texture was uploaded by puruswatam and uploaded on CLEANPNG. 

This is the texture that I used for the peaks of the walls as well as the Snowy Mountains Temple. It is a snow texture that helped me create an immersive atmosphere for the player when they enter the biome. Making them feel cold. This texture was uploaded by Many Texturs. Texturedb is a website that provides free textures.

This is the texture that will be used for the wall as for the Volcanic Peaks biome as well as the chamber. I chose this texture as it gives me the impression of violence and danger, using this texture I wanted to set an atmosphere to indicate that the player is in a dangerous and place and indicated to be cautious. This texture was created by cowboyleland and uploaded on flickr

 

This texture consists of a purple gem like image. This texture will be used for indicating that the player is healing as well as the portal that can be found in the plains biome. I selected this texture as it resembles Royalty and Preciousness/Value, i wanted to use this on the portal to indicate that the player is entering a highly royal area however in a corrupted manner which will be resembled by the static textures which are shown below. To resemble the Glitched Dimension (the final biome of the game) as well as the Entity, I wanted to use Black and Purple colours to resemble Royalty and evil. This texture was made using OpenArt AI and found on Open Art.

This texture shows a black Sci-Fi plate and my intension of using this was to create a some what futuristic vibe to when the player comes across Glitched Architecture. Glitched Architecture will have Purple and Black Colours, resembling their status in power and royalty as well as their dark and evil ambitions. This texture will be used on structures such as the Shrines and The portals found on the plains. This Texture was uploaded on Pinterest created by lleandro .

This is the Final Texture that I have used for my game, consisting of a static Purple. This texture will be used all over the Glitched Dimension, further implying that the player is in an area full of royalty and corruption. The texture above was  uploaded on Deviant Art and created by TheFrozenWaffle.