This project was about expanding upon a game I made. I had concepts to add a more expansive and complete narrative to my arcade-spaceship-fatherhood game, Partial Eclipse, but due to the time constraints, I didn’t end up adding it. Now, it’s in the game.
Adding further narrative to Partial Eclipse
Here’s a mockup I did of what the UI should look like on the chat function. A text based conversation on the left, and her social media profile on the right, a useful way of representing her internal thoughts and feelings to the player.
I also sketched out how those three responses represent changes behind the scenes for your daughter’s emotional state. This is tracked by one stat (respect) and changes based solely on your responses and gift giving.
The Final Product
https://virtualvolt.itch.io/partial-eclipse
Available for download on itch!
Now the game has major narrative systems in place AND they’re scalable! The “respect” system is totally functional, as well as the social media system. So if I wanted to make the game’s story twice as long, all I’d need to do is feed in more dialogue (and more pseudo-tweets) and it’ll work.
Here are some screenshots of it functioning.


Here’s the associated code running the chat system.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TMPro;
public class ChatScript : MonoBehaviour
{
[Header("References")]
public GameObject endCanvas;
public List<TextMeshProUGUI> chats;
public List<TextMeshProUGUI> posts;
public List<TextMeshProUGUI> buttons;
[Header("Data")]
[Range(0,100)]
public int respect;
public List<string> allPosts;
public List<string> allDialogue;
public List<string> postTimeline;
// Start is called before the first frame update
void Start()
{
respect = SaveInfo.Instance.respect;
postTimeline = SaveInfo.Instance.savedPosts;
//Sets the Chat Text and the Button Text based on the current level
string[] tempString;
tempString = allDialogue[SaveInfo.Instance.level].Split(new char[] { '|' });
for(int i = 0; i <= 7; i++)
{
if(i < 5)
{
chats[i].text = tempString[i];
}
else
{
buttons[i - 5].text = tempString[i];
}
}
//Populates the social media timeline based on past posts and adds a new one based on current respect level.
if(SaveInfo.Instance.level != 0)
{
allPosts.TrimExcess();
respect /= allPosts.Count;
postTimeline.Insert(0, allPosts[respect]);
allPosts.Remove(allPosts[respect]);
}
for (int i = 0; i < 4; i++)
{
posts[i].text = postTimeline[i];
}
SaveInfo.Instance.savedPosts = postTimeline;
}
//Button function for a supportive response to her
public void Supportive()
{
Debug.Log("Supportive. Respect: " + SaveInfo.Instance.respect);
SaveInfo.Instance.respect = SaveInfo.Instance.respect + 10;
Debug.Log("New respect: " + SaveInfo.Instance.respect);
SaveInfo.Instance.level++;
endCanvas.SetActive(true);
}
//Button function for an unsupportive response to her
public void Unsupportive()
{
Debug.Log("Unsupportive. Respect: " + SaveInfo.Instance.respect);
SaveInfo.Instance.respect = SaveInfo.Instance.respect - 10;
Debug.Log("New respect: " + SaveInfo.Instance.respect);
SaveInfo.Instance.level++;
endCanvas.SetActive(true);
}
//Button function for a neutral response to her
public void Neutral()
{
Debug.Log("Neutral. Respect: " + SaveInfo.Instance.respect);
int tempRespectVal = (SaveInfo.Instance.respect / 10) - 5;
float coinFlip = Random.Range(0, 2);
if(coinFlip >= 1)
{
SaveInfo.Instance.respect = SaveInfo.Instance.respect - (10 + tempRespectVal);
}
else
{
SaveInfo.Instance.respect = SaveInfo.Instance.respect + (10 + tempRespectVal);
}
Debug.Log("New respect: " + SaveInfo.Instance.respect);
SaveInfo.Instance.level++;
endCanvas.SetActive(true);
}
}