David Liu

Interstellar Survival

About the Game

Interstellar Survival is a 2D turn-based tactical game consisted of short, simple levels. The player is restricted to a set amount of movement spaces and attacks per turn for each level, creating the challenge of planning a strategy to reach the goal. There are three attacks that can be used against enemies, each with a different effect to give more options for strategy. Find the key and get to the chest in order to advance to the next level!

Developed during the month of April 2020.

Role in Development

  • Designer: David Liu, David Knolls, Nathan Glick
  • Programmers: David Liu, Nathan Glick, Huadong Zhang, Nicholas Bazos, Elliot Privateer

This was a dual-project for my Gameplay and Prototyping class. The project was first made by a previous team, then handed off to another team to complete the game. I took part in creating most of the levels using a text file level creator made by Nathan Glick, and fixing bugs that was left from the initial project. I also put together a quick dialogue system for the tutorial, as well as simple managers for audio.

Script Examples

TutorialManager.csDialogue.csMusicManager.csSoundManager.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TutorialManager : MonoBehaviour
{
    public List dialogueSequences;
    // 1 - Intro asking the player for a tutorial
    // 2 - Explains movement
    // 3 - Explains end turn
    // 4 - Explains enemies and objects
    // 5 - Explains taking damage and attacking
    // 6 - Explains restoring health and winning the level
    public GameObject dialogueLose;
    public GameObject yesButton;
    public GameObject noButton;
    public GameObject promptDisplay;
    public GameObject endTurnButton;
    public Text restartText;

    [HideInInspector]
    public bool canMove;
    public bool canAttack = false;
    private TurnManager tm;
    private int index;

    // Start is called before the first frame update
    void Start()
    {
        tm = GameObject.Find("Manager").GetComponent();
        index = 0;

        // Determine if the player already went through the tutorial
        bool first = GameObject.Find("GameData").GetComponent().firstPlay;
        if (!first)
            SkipTutorial();
        else
            GameObject.Find("GameData").GetComponent().firstPlay = false;

        canMove = false;
        canAttack = false;
        restartText.text = "Next";
    }

    // Update is called once per frame
    void Update()
    {
        
    }

    public void FinishDialogue(int i)
    {
        index = i;
        switch (index)
        {
            case 1:
                promptDisplay.SetActive(true);
                yesButton.SetActive(true);
                noButton.SetActive(true);
                break;
            case 2:
                tm.StartPlayerTurn();
                canMove = true;
                break;
            case 3:
                endTurnButton.SetActive(true);
                canMove = true;
                break;
            case 4:
                canMove = true;
                break;
            case 5:
                canMove = true;
                canAttack = true;
                break;
            case 6:
                canMove = true;
                break;
        }
    }

    #region Event Receivers
    public void ConfirmTutorial()
    {
        yesButton.SetActive(false);
        noButton.SetActive(false);
        promptDisplay.SetActive(false);
        dialogueSequences[1].SetActive(true);
    }

    // Loads the next scene in the build index
    public void SkipTutorial()
    {
        RegularUIManager.instance.NextLevel();
    }

    public void OutOfMoves()
    {
        if (index == 2)
        {
            canMove = false;
            dialogueSequences[2].SetActive(true);
        }
    }

    public void StartPlayerTurn()
    {
        if (restartText.text != "Restart") // Check for if not game over
        {
            if (index == 3)
            {
                canMove = false;
                dialogueSequences[3].SetActive(true);
            }
            else if (index == 4)
            {
                canMove = false;
                dialogueSequences[4].SetActive(true);
            }
            else if (index == 5)
            {
                canMove = false;
                dialogueSequences[5].SetActive(true);
            }

            tm.StartPlayerTurn();
        }
    }

    public void Lost()
    {
        Time.timeScale = 1;
        restartText.text = "Restart";
        dialogueLose.SetActive(true);
        GameObject.Find("GameData").GetComponent().firstPlay = true;
    }
    #endregion
}