Files
ihob/Assets/Scripts/Global/VNData.cs

601 lines
26 KiB
C#
Raw Normal View History

2026-02-21 17:04:05 -08:00
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class DialogueInteraction
{
// This is the name of whoever's talking.
public string name;
// This is the text being spoken.
public string text;
// Set this when you want completing this interaction to unlock something.
public Unlockable unlock = Unlockable.None;
// Reserved index -1 to mean "do not set".
// See VNObjectController for canonical lists.
public int backgroundIndex { get; set; } = -1;
public int audioClipIndex { get; set; } = -1;
public int musicClipIndex { get; set; } = -1;
public Body body1 { get; set; } = Body.None;
public Expression expression1 { get; set; } = Expression.None;
public int hair1 { get; set; } = 0;
public Effect effect1 { get; set; } = Effect.None;
public Body body2 { get; set; } = Body.None;
public int hair2 { get; set; } = 0;
public Expression expression2 { get; set; } = Expression.None;
public Effect effect2 { get; set; } = Effect.None;
public Body body3 { get; set; } = Body.None;
public int hair3 { get; set; } = 0;
public Expression expression3 { get; set; } = Expression.None;
public Effect effect3 { get; set; } = Effect.None;
public bool removeBody1 { get; set; } = false;
public bool removeBody2 { get; set; } = false;
public bool removeBody3 { get; set; } = false;
public DialogueInteraction(string name,
string text,
Unlockable unlock = Unlockable.None)
{
this.name = name;
this.text = text;
this.unlock = unlock;
}
}
public enum Dialogue
{
None,
// Default greetings when spinning up the Manager.
// One per chosen Side Piece.
Manager_Elaine1,
Manager_Elaine2,
Manager_Elaine3,
Manager_Irida1,
Manager_Irida2,
Manager_Irida3,
Manager_Clem1,
Manager_Clem2,
Manager_Clem3,
Manager_Schroder1,
Manager_Schroder2,
Manager_Schroder3,
Intro,
Unlock_Irida,
Unlock_Clem,
Unlock_Schroder,
Elaine_PentUp,
Elaine_Femdom,
Elaine_Foodplay,
Irida_Anal,
Irida_Boobies,
Irida_Oral,
Clem_Confession,
Clem_BadGirl,
Clem_FFM,
Clem_Exploration,
Schroder_Packing,
Schroder_Anal,
Schroder_Lapdance,
Schroder_Dom
}
public enum Body
{
None,
Elaine_Normal,
Irida_Normal,
Clem_Normal,
Schroder_Normal
}
public enum Expression
{
None,
Elaine_Normal,
Irida_Normal,
Clem_Normal,
Schroder_Normal,
Elaine_Smug,
}
public enum Effect
{
None,
}
public class Description
{
public string name { get; set; }
public string description { get; set; }
public string warnings { get; set; }
}
public class VNData
{
// Manager sets this value before loading SceneViewer.
public static Dialogue NextScene = Dialogue.Manager_Elaine1;
// TODO: Turn this into a set of probability distributions
public static Dictionary<Employee, List<Dialogue>> managerScenes =
new Dictionary<Employee, List<Dialogue>>() {
{ Employee.Elaine, new List<Dialogue>() {
Dialogue.Manager_Elaine1,
Dialogue.Manager_Elaine2,
Dialogue.Manager_Elaine3,
} },
{ Employee.Clem, new List<Dialogue>() {
Dialogue.Manager_Clem1,
Dialogue.Manager_Clem2,
Dialogue.Manager_Clem3,
} },
{ Employee.Irida, new List<Dialogue>() {
Dialogue.Manager_Irida1,
Dialogue.Manager_Irida2,
Dialogue.Manager_Irida3,
} },
{ Employee.Schroder, new List<Dialogue>() {
Dialogue.Manager_Schroder1,
Dialogue.Manager_Schroder2,
Dialogue.Manager_Schroder3,
} },
};
public static Dialogue GetRandomManagerScene(Employee employee)
{
// TODO: Turn this into a set of probability distributions
return managerScenes[employee][Random.Range(0, managerScenes[employee].Count)];
}
// Used to tell which dialogue sequences are unlockable.
// Mapped via DIALOGUE_DESCRIPTIONS.keys() by the Scene Picker to make a list of unlocked dialogues.
public static Dictionary<Dialogue, Unlockable> UNLOCKABLES = new Dictionary<Dialogue, Unlockable>() {
{ Dialogue.Unlock_Irida, Unlockable.IridaPlayable },
{ Dialogue.Unlock_Clem, Unlockable.ClemPlayable },
{ Dialogue.Unlock_Schroder, Unlockable.SchroderPlayable },
{ Dialogue.Elaine_PentUp, Unlockable.Dialogue_Elaine_Voyeurism },
{ Dialogue.Elaine_Femdom, Unlockable.Dialogue_Elaine_Femdom },
{ Dialogue.Elaine_Foodplay, Unlockable.Dialogue_Elaine_Foodplay },
{ Dialogue.Irida_Anal, Unlockable.Dialogue_Irida_Anal },
{ Dialogue.Irida_Boobies, Unlockable.Dialogue_Irida_Boobies },
{ Dialogue.Irida_Oral, Unlockable.Dialogue_Irida_Oral },
{ Dialogue.Clem_BadGirl, Unlockable.Dialogue_Clem_BadGirl },
{ Dialogue.Clem_Confession, Unlockable.Dialogue_Clem_Confession },
{ Dialogue.Clem_FFM, Unlockable.Dialogue_Clem_FFM },
{ Dialogue.Clem_Exploration, Unlockable.Dialogue_Clem_Exploration },
{ Dialogue.Schroder_Packing, Unlockable.Dialogue_Schroder_Packing },
{ Dialogue.Schroder_Anal, Unlockable.Dialogue_Schroder_Anal },
{ Dialogue.Schroder_Lapdance, Unlockable.Dialogue_Schroder_Lapdance },
{ Dialogue.Schroder_Dom, Unlockable.Dialogue_Schroder_Dom },
};
public static Dictionary<Dialogue, Description> DIALOGUE_DESCRIPTIONS = new Dictionary<Dialogue, Description>() {
{ Dialogue.Intro, new Description() {
name = "Intro",
description = "Elaine convinces you to make a dubious life decision." } },
// Unlock sequences.
{ Dialogue.Unlock_Irida, new Description() {
name = "Irida's Intro",
description = "A bombshell beauty suddenly arrives looking for work (and sex)!" } },
{ Dialogue.Unlock_Clem, new Description() {
name = "Clementine's Intro",
description = "What's this kid doing in my office?" } },
{ Dialogue.Unlock_Schroder, new Description() {
name = "Schroder's Intro",
description = "Mysterious, ambiguous, androgynous... whoever they are, their ass is mine!" } },
// Elaine fetish scenes.
{ Dialogue.Elaine_PentUp, new Description() {
name = "(Elaine) Off the Clock",
description = "Elaine gets caught flickin' it after her shift. Care to join?",
warnings = "Voyeurism" } },
{ Dialogue.Elaine_Femdom, new Description() {
name = "(Elaine) Mommy?",
description = "You get piss drunk with Elaine and convince her to be your dom for a night.",
warnings = "BDSM" } },
{ Dialogue.Elaine_Foodplay, new Description() {
name = "(Elaine) The Smorgasboard",
description = "You and Elaine explore some food fetishism!",
warnings = "Feederism, Oral Fixation" } },
// Irida fetish scenes.
{ Dialogue.Irida_Anal, new Description() {
name = "(Irida) Back-end in the Back-room",
description = "Irida challenges you to make her cum from just anal.",
warnings = "Anal" } },
{ Dialogue.Irida_Boobies, new Description() {
name = "(Irida) Boobies!",
description = "You book Irida for a nice long titty fucking session." } },
{ Dialogue.Irida_Oral, new Description() {
name = "(Irida) Sloppy Toppy",
description = "The bar's about to open, but Irida is nowhere to be seen. Where could she possibly be?" } },
// Clementine fetish scenes.
{ Dialogue.Clem_BadGirl, new Description() {
name = "(Clementine) Bad Girl",
description = "Clem gets in trouble over an altercation. It's time to teach her a lesson.",
warnings = "Petite, BDSM" } },
{ Dialogue.Clem_Confession, new Description() {
name = "(Clementine) The Confession",
description = "Clem comes clean about why she's there. And then you come clean all over her face.",
warnings = "Petite, Mental Health" } },
{ Dialogue.Clem_FFM, new Description() {
name = "(Clementine) FFM or FM (F)",
description = "You and Elaine give Clem some \"special training\" to boost her \"performance\".",
warnings = "Petite" } },
{ Dialogue.Clem_Exploration, new Description() {
name = "(Clementine) FFM or FM (F)",
description = "Clem needs help experimenting with her erogeneous zones.",
warnings = "Petite, Extreme Close-up" } },
// Schroder fetish scenes
{ Dialogue.Schroder_Packing, new Description() {
name = "(Schroder) Packing Heat",
description = "Just a simple night of love-making with Schroder." } },
{ Dialogue.Schroder_Anal, new Description() {
name = "(Schroder) The Bet",
description = "Schroder vows to win the Whose-Asshole-Tastes-The-Best competition that they made up.",
warnings = "Anal" } },
{ Dialogue.Schroder_Lapdance, new Description() {
name = "(Schroder) Private Showing",
description = "You book Schroder for a one-on-one sesh." } },
{ Dialogue.Schroder_Dom, new Description() {
name = "(Schroder) Role Reversal",
description = "Have you ever wondered how it feels to suck dick?" } },
};
public static string GetDialogueAssetPackFor(Dialogue d)
{
return "VNAssetPacks/VNA_" + d.ToString();
}
public static Dictionary<Dialogue, List<DialogueInteraction>> DIALOGUE = new Dictionary<Dialogue, List<DialogueInteraction>>() {
// Manager default day-shift quotes.
{ Dialogue.Manager_Elaine1,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "Phew... All in a day's work.") {
body1 = Body.Elaine_Normal,
expression1 = Expression.Elaine_Normal,
hair1 = 0,
},
new DialogueInteraction("Elaine", "Time to close down for the night."),
new DialogueInteraction("Elaine", "Anything you wanna do first?") {
expression1 = Expression.Elaine_Smug
}
}
},
{ Dialogue.Manager_Elaine2,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "Hey buster, I know we're all ripe for rubbin' here...") {
body1 = Body.Elaine_Normal,
expression1 = Expression.Elaine_Normal,
hair1 = 0,
},
new DialogueInteraction("Elaine", "But if you keep oglin', I'm gonna have to start chargin' for looks.") {
expression1 = Expression.Elaine_Smug
},
}
},
{ Dialogue.Manager_Elaine3,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "Let's wrap things up for the day.") {
body1 = Body.Elaine_Normal,
expression1 = Expression.Elaine_Normal,
hair1 = 0,
},
}
},
{ Dialogue.Manager_Clem1,
new List<DialogueInteraction>() {
new DialogueInteraction("Clementine", "Manager_Clem1"),
}
},
{ Dialogue.Manager_Clem2,
new List<DialogueInteraction>() {
new DialogueInteraction("Clementine", "Manager_Clem2"),
}
},
{ Dialogue.Manager_Clem3,
new List<DialogueInteraction>() {
new DialogueInteraction("Clementine", "Manager_Clem3"),
}
},
{ Dialogue.Manager_Irida1,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "Manager_Irida1"),
}
},
{ Dialogue.Manager_Irida2,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "Manager_Irida2"),
}
},
{ Dialogue.Manager_Irida3,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "Manager_Irida3"),
}
},
{ Dialogue.Manager_Schroder1,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "Manager_Schroder1"),
}
},
{ Dialogue.Manager_Schroder2,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "Manager_Schroder2"),
}
},
{ Dialogue.Manager_Schroder3,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "Manager_Schroder3"),
}
},
// Character unlock scenes.
{ Dialogue.Intro,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "(STUB) Game Intro"),
}
},
{ Dialogue.Unlock_Irida,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "(STUB) Irida Unlocked"),
}
},
{ Dialogue.Unlock_Clem,
new List<DialogueInteraction>() {
new DialogueInteraction("Clem", "(STUB) Clem Unlocked"),
}
},
{ Dialogue.Unlock_Schroder,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "(STUB) Schroder Unlocked"),
}
},
{ Dialogue.Elaine_PentUp,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "(STUB) Elaine_PentUp"),
}
},
{ Dialogue.Elaine_Femdom,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "(STUB) Elaine_Femdom"),
}
},
{ Dialogue.Elaine_Foodplay,
new List<DialogueInteraction>() {
new DialogueInteraction("Elaine", "(STUB) Elaine_Voyeurism"),
}
},
{ Dialogue.Irida_Anal,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "(STUB) Irida_Anal"),
}
},
{ Dialogue.Irida_Boobies,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "(STUB) Irida_Boobies"),
}
},
{ Dialogue.Irida_Oral,
new List<DialogueInteraction>() {
new DialogueInteraction("Irida", "(STUB) Irida_Oral"),
}
},
{ Dialogue.Clem_Confession,
new List<DialogueInteraction>() {
new DialogueInteraction("Clementine", "(STUB) Clem_Confession"),
}
},
{ Dialogue.Clem_BadGirl,
new List<DialogueInteraction>() {
new DialogueInteraction("", "(So Clementine's been reported to my office for misconduct.)") {
backgroundIndex = 0,
},
new DialogueInteraction("", "(From what I can tell, she got angry with some rowdy customer.)"),
new DialogueInteraction("", "(One thing lead to another...)"),
new DialogueInteraction("", "...And then you punched him.") {
body1 = Body.Clem_Normal,
expression1 = Expression.Clem_Normal,
hair1 = 2,
backgroundIndex = 1,
},
new DialogueInteraction("Clementine", "Yeah, well, that's what happened."),
new DialogueInteraction("", "Clementine, this shit is racking up our insurance!"),
new DialogueInteraction("", "I'm sure that guy deserved it, but we have security for a reason."),
new DialogueInteraction("Clementine", "(Sigh.)"),
new DialogueInteraction("", "Alright, look. This one's on you."),
new DialogueInteraction("", "You're gonna pay off the claim for that customer. Last I heard was a few hundred for the settlement."),
new DialogueInteraction("Clementine", "Wha- You know I can't afford that shit!") {
// expression1 = Expression.Clem_Angry,
},
new DialogueInteraction("", "Well, neither can I! Everyone's gotta work overtime here to clean up your messes."),
new DialogueInteraction("", "Frankly, you should know better."),
new DialogueInteraction("Clementine", "Yeah, well, sorry.") {
// expression1 = Expression.Clem_Normal,
},
new DialogueInteraction("", "..."),
new DialogueInteraction("", "You don't look very sorry to me."),
new DialogueInteraction("Clementine", "Yeah? And what are you gonna do, daddy? Spank me?") {
// expression1 = Expression.Clem_Angry,
},
new DialogueInteraction("", "Maybe I will. I'm getting sick of taking your crap."),
new DialogueInteraction("", "I don't want to fire you, but if you're gonna stay then you need to learn a lesson or two.") {
// expression1 = Expression.Clem_Surprised,
},
new DialogueInteraction("Clementine", "U-um..."),
new DialogueInteraction("", "So here's the deal.") {
// expression1 = Expression.Clem_Normal,
},
new DialogueInteraction("", "You're gonna get a hard spanking and tell me how sorry you are, and I'll pay for this little \"incident\"."),
new DialogueInteraction("Clementine", "(Growl)") {
// expression1 = Expression.Clem_Angry,
},
new DialogueInteraction("Clementine", "You're a sick freak, you know that?"),
new DialogueInteraction("", "I suppose I should mail you a bill, then?"),
new DialogueInteraction("", "Besides, I heard what you and Elaine were whispering about.") {
// expression1 = Expression.Clem_Sad,
},
new DialogueInteraction("", "You've got a kink for bdsm, don't you?"),
new DialogueInteraction("Clementine", "N-No, that was-...") {
// expression1 = Expression.Clem_Surprised,
},
new DialogueInteraction("", "Am I wrong?"),
new DialogueInteraction("Clementine", "(Sigh.)") {
// expression1 = Expression.Clem_Normal,
},
new DialogueInteraction("Clementine", "Fine. Just spank me and get it over with."),
new DialogueInteraction("Clementine", "But if you tell anyone what we're doing, I'll never forgive you!") {
// expression1 = Expression.Clem_Angry,
},
new DialogueInteraction("", "Yeah, yeah. Shut up and get on the table."),
new DialogueInteraction("", "...") {
removeBody1 = true,
backgroundIndex = 0,
},
new DialogueInteraction("", "....."),
new DialogueInteraction("Clementine", ".......") {
backgroundIndex = 2,
// TODO: Derpy music
},
new DialogueInteraction("Clementine", "W-Why'd you tie me up?!"),
new DialogueInteraction("", "I figured if I'm gonna whack you one, I might as well have some fun with it."),
new DialogueInteraction("", "Besides, this is a fitting look for you."),
new DialogueInteraction("Clementine", "..."),
new DialogueInteraction("Clementine", "Hey... Don't hit me too hard, okay?"),
new DialogueInteraction("", "Are you really in a position to negotiate right now?"),
new DialogueInteraction("Clementine", "Ungh..."),
new DialogueInteraction("", "(Let's get these panties off.)"),
new DialogueInteraction("", "(Yoink.)") {
backgroundIndex = 3,
// TODO: Ruffling sound effect
},
new DialogueInteraction("Clementine", "..."),
new DialogueInteraction("", "(She seems awfully calm given the situation.)"),
new DialogueInteraction("", "(I've got a paddle from the drawer, just waiting for some action.)"),
new DialogueInteraction("", "(Maybe she's used to this kind of thing. I'm not one to pry, so I wouldn't know.)"),
new DialogueInteraction("", "(Anyways... Let's get started.)"),
new DialogueInteraction("", "WHAM!") {
backgroundIndex = 4,
// TODO: Smack sound effect
},
new DialogueInteraction("Clementine", "--!! ...--!!!... --!... --!... ---!!!... --!... --!!... --!!!") {
// TODO: Yelp sound effect
},
new DialogueInteraction("", "(With long deliberate strokes, I lay into Clementine's ass with the paddle.)") {
// TODO: Wordless smacking sound effect
},
new DialogueInteraction("Clementine", "Augh-- FUCK!"),
new DialogueInteraction("", "Damn! Pipe down; they'll hear you outside."),
new DialogueInteraction("Clementine", "Shut the fuck up and hit me!"),
new DialogueInteraction("", "(...)"),
new DialogueInteraction("Clementine", "-#! --##!! --#! -##! --##! -#! -##! ---#!") {
// TODO: Yelp sound effect
},
new DialogueInteraction("Clementine", "Harder!!"),
new DialogueInteraction("", "(Harder, huh?)"),
new DialogueInteraction("", "(I reel back all the way and--)"),
new DialogueInteraction("Clementine", "--A! --AHH! -AGH! --AUH! --HH! --AH! --AHH! -AGH!") {
// TODO: Yelp sound effect
},
new DialogueInteraction("", "(I grip the paddle and go full-force onto her ass.)") {
// TODO: Wordless smacking sound effect
},
new DialogueInteraction("Clementine", "Ooh!! Oh! I'm gonna pee-- Nngh!") {
// TODO: Yelp sound effect
},
new DialogueInteraction("", "(...?)"),
new DialogueInteraction("", "(That's fine, I'll just have her clean it up later.)"),
new DialogueInteraction("Clementine", "--A! --AHH! -AGH! --AUH! --HH! --AH! --AHH! -AGH!") {
// TODO: Yelp sound effect
},
new DialogueInteraction("Clementine", "Wait-wait-wait-wait-wait-WAIT! I--"),
new DialogueInteraction("", "Nope."),
new DialogueInteraction("Clementine", "!!! !!! !!!! !!! !! !!! !!! !!!!!!") {
// TODO: Yelp sound effect
},
new DialogueInteraction("Clementine", "OOUGH!! Unnghhh!!! Ug--") {
// TODO: Yelp sound effect
},
new DialogueInteraction("", "(Clementine lets out an otherworldly noise as she squirts all over my paddle and desk.)"),
new DialogueInteraction("Clementine", "Augh-- ugh... nnn...") {
backgroundIndex = 5,
// TODO: Yelp sound effect
},
new DialogueInteraction("Clementine", "..........") {
// TODO: Breathing sound effect
},
new DialogueInteraction("", "(Clementine seems to be in another world right now.)"),
new DialogueInteraction("", "(As fun as this is, I've got other things to do today.)"),
new DialogueInteraction("", "..."),
new DialogueInteraction("", "So? What do you have to say for yourself?"),
new DialogueInteraction("Clementine", "I--..."),
new DialogueInteraction("Clementine", "I've been a bad girl... I'm sorry..."),
new DialogueInteraction("Clementine", "I'll be good, daddy... I'll be good for you."),
new DialogueInteraction("Clementine", "Promise."),
new DialogueInteraction("", "..."),
new DialogueInteraction("", "Good. You're in the clear for now."),
new DialogueInteraction("", "By the way, I was gonna foot the bill either way. Just thought I'd tease you a little first."),
new DialogueInteraction("Clementine", "....."),
new DialogueInteraction("Clementine", "Hey..."),
new DialogueInteraction("Clementine", "..."),
new DialogueInteraction("Clementine", "Can you spank me more later?"),
new DialogueInteraction("", "Uh--"),
new DialogueInteraction("", "Sure... Sounds like a plan to me. I'll see you back here after some other shift."),
new DialogueInteraction("", "But first..."),
new DialogueInteraction("", "You pissed all over my desk, so get down from there and clean it up."),
new DialogueInteraction("Clementine", "..."),
new DialogueInteraction("Clementine", "Yes, sir..."),
}
},
{ Dialogue.Clem_FFM,
new List<DialogueInteraction>() {
new DialogueInteraction("Clementine", "(STUB) Clem_FFM"),
}
},
{ Dialogue.Clem_Exploration,
new List<DialogueInteraction>() {
new DialogueInteraction("Clementine", "(STUB) Clem_Exploration"),
}
},
{ Dialogue.Schroder_Packing,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "(STUB) Schroder_Packing"),
}
},
{ Dialogue.Schroder_Anal,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "(STUB) Schroder_Anal"),
}
},
{ Dialogue.Schroder_Dom,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "(STUB) Schroder_Dom"),
}
},
{ Dialogue.Schroder_Lapdance,
new List<DialogueInteraction>() {
new DialogueInteraction("Schroder", "(STUB) Schroder_Lapdance"),
}
},
};
}