Files
fnl/Assets/Scripts/GameData.cs
2026-02-21 16:40:15 -08:00

231 lines
6.7 KiB
C#

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using System.Threading.Tasks;
public enum Unlockable {
None,
Bubuus,
}
public enum Status {
Normal,
Farty,
Horny,
Drunk,
Moody,
}
[System.Serializable]
public class GameData {
// Whether or not the game's Red Tag content is available.
// Red Tag is the supporter-only version of the game.
// It unlocks heavy fetish content in special scenes.
public static bool RED_TAG = false;
public bool isNewGame = true;
// Set temporarily when the game first notices that you've unlocked all the content.
// Should show a special scene.
public bool hasShownWinScene = false;
public int money = 100000;
public int day = 15;
public int time = 1;
public int mood = 4;
public int hunger = 0;
public int affection = 55550;
public int fartCounter = 0;
public Status status = Status.Normal;
public bool workedToday = false;
public bool boughtFood = false;
public bool ranAway = false;
public Body bodyChoice = Body.Undies;
public Hair hairChoice = Hair.Messy;
public HashSet<AssignedTask> tasksDoneToday = new HashSet<AssignedTask>();
// Populated when the Manager notices that you've unlocked a new version of a task.
// See ManagerController.NotifyTaskUnlocks.
public HashSet<Dialogue> notifiedTaskUnlocks = new HashSet<Dialogue>() {
Dialogue.None,
Dialogue.Task_Clean1,
Dialogue.Task_Games1,
Dialogue.Task_Suck1,
};
public HashSet<Unlockable> unlocked = new HashSet<Unlockable>() {
};
public HashSet<Body> unlockedOutfits = new HashSet<Body>()
{
Body.Undies
};
public HashSet<Hair> unlockedHairs = new HashSet<Hair>()
{
Hair.Messy
};
public HashSet<Body> forSaleOutfits = new HashSet<Body>();
public HashSet<Hair> forSaleHairs = new HashSet<Hair>();
public HashSet<Dialogue> viewedScenes = new HashSet<Dialogue>();
public Dictionary<Character, string> characterNames = new Dictionary<Character, string>()
{
{ Character.None, "" },
{ Character.Her, "Bitch" },
{ Character.You, "Player" },
{ Character.OldRoommate, "Jeanine" }
};
public GameData() {}
// Populate the for-sale outfits and hairs according to game progress.
public void UpdateForSale() {
forSaleOutfits.Clear();
forSaleHairs.Clear();
MaybeAddOutfitForSale(Body.EmoUndies, 2, 1000);
MaybeAddOutfitForSale(Body.Rockstar, 5, 3000);
MaybeAddOutfitForSale(Body.Swimsuit, 8, 5500);
MaybeAddOutfitForSale(Body.Messy, 11, 8000);
MaybeAddOutfitForSale(Body.Business, 14, 10000);
MaybeAddOutfitForSale(Body.Devil, 17, 15000);
MaybeAddHairForSale(Hair.Bratty, 3, 2000);
MaybeAddHairForSale(Hair.Pigtails, 6, 5500);
MaybeAddHairForSale(Hair.PrimProper, 13, 11500);
MaybeAddHairForSale(Hair.FizzyPop, 18, 17500);
}
private void MaybeAddOutfitForSale(Body _outfit, int minDay, int minAffection) {
if (!unlockedOutfits.Contains(_outfit)
&& day >= minDay
&& affection >= minAffection
) {
forSaleOutfits.Add(_outfit);
}
}
private void MaybeAddHairForSale(Hair _hair, int minDay, int minAffection) {
if (!unlockedHairs.Contains(_hair)
&& day >= minDay
&& affection >= minAffection
) {
forSaleHairs.Add(_hair);
}
}
// Whether you've done everything: all outfits, all hairs, all tasks.
public bool CheckWin() {
for (int i = 1; i < System.Enum.GetNames(typeof(Body)).Length; i++) {
if (!unlockedOutfits.Contains((Body)i))
return false;
}
for (int i = 1; i < System.Enum.GetNames(typeof(Hair)).Length; i++) {
if (!unlockedHairs.Contains((Hair)i))
return false;
}
foreach (var progressionKey in VNData.TASK_INFO.Keys) {
foreach (AssignedTaskInfo info in VNData.TASK_INFO[progressionKey]) {
if (info.dialogue != Dialogue.None &&
!viewedScenes.Contains(info.dialogue))
return false;
}
}
return true;
}
public static bool IsUnlocked(Unlockable u) {
return GLOBAL.unlocked.Contains(u);
}
public static void Unlock(Unlockable u) {
GLOBAL.unlocked.Add(u);
}
public static GameData GLOBAL = new GameData();
public static void Save() {
Debug.Log("Save");
ES3.Save<GameData>("save", GameData.GLOBAL);
}
public static bool Load() {
Debug.Log("Save");
ES3.LoadInto<GameData>("save", GameData.GLOBAL);
return true;
}
public void Feed(Food food) {
ItemInfo foodInfo = VNData.FOOD_INFO[food];
hunger -= foodInfo.hunger;
if (hunger < 0)
hunger = 0;
mood += foodInfo.mood;
if (mood < 0)
mood = 0;
if (mood > 4)
mood = 4;
affection += foodInfo.affection;
if (foodInfo.fartiness > 0f && Random.Range(0f,1f) < foodInfo.fartiness) {
// uh-oh spaghetti-o's
fartCounter = 2;
status = Status.Farty;
}
}
public void IncrementTime() {
boughtFood = false;
ranAway = false;
if (time == 4) {
time = 1;
day += 1;
workedToday = false;
tasksDoneToday.Clear();
if (status == Status.Moody) {
status = Status.Normal;
}
if (day > 1 && day % 3 == 1) {
// Pay the bills every third day, starting day 4.
money -= 200;
}
} else {
time += 1;
}
if (fartCounter == 0 && status == Status.Farty) {
status = Status.Normal;
}
fartCounter -= 1;
if (fartCounter < 0) {
fartCounter = 0;
}
// Process mood
if (hunger > 2 || Random.Range(0f, 1f) < 0.3f) {
mood -= 1;
}
if (mood < 1) {
mood = 0;
status = Status.Moody;
}
// Process hunger
hunger += 1;
if (hunger > 4) {
// Going too long without feeding her triggers a runaway event.
// She steals your credit card and takes a cab to take herself out to dinner.
// She also becomes moody and won't cooperate with you for a full day.
ranAway = true;
mood = 0;
hunger = 0;
status = Status.Moody;
money -= 200;
}
}
}