Before we begin, would you like to read the content warnings?
->[[That'd be swell! |Content Warnings]]
-><<link "I’d much rather kick things off right away, old chum!" "2">><<set $chapter to "Prologue">><</link>>
Glitz, Glam, & GunpowderMiraMade in SugarCube 2.37.3.!!The Starling ($name "$pseudonym" $lastname)
You, my dear, are a talented $manwoperson of $height stature who previously starred at Le Cirque d'Estelle as a $circusrole. Eventually, you found your way to the Spotlight Syndicate, where you began working as a $performer. You have lovely <<if $vitiligo is true>> $skintone skin with light patches <<else>> $skintone skin<</if>> framed by exquisite $hairlength, $haircolor, $hairtexture hair. Your mesmerizing <<if $eyecolour.right is $eyecolour.left>> $eyecolour.right<<else>>$eyecolour.right and $eyecolour.left<</if>> eyes are the glimpse into your incredible soul and have captivated many. Currently, you are wearing $outfit.
!!Stats
''Angel's Blessing'' ($angel%) vs ''Devil's Curse'' ($devil%)
''Brains'' ($brains%) vs ''Brawn'' ($brawn%)
''Shy'' ($shy%) vs ''Bold'' ($bold%)
''Admired'' ($admired%) vs ''Feared'' ($feared%)
''Fame'' ($fame%) vs ''Forgotten'' ($forgotten%)
<<link "Character" "Character">><</link>>
<<link "Romance Options" "Romance Options">><</link>>
<<link "Codex" "Codex">><</link>>
<<link "Credits" "Credits">><</link>>
<<link "Back">><<if tags().includes("game-info")>><<goto $return>><<else>><<run Engine.backward()>><</if>><</link>> <!-- since the scrollbar is built into the passages container, this code resets it to the top each time a new passage is loaded -->
<<script>>
var passages = document.getElementById("passages");
passages.scrollTop = 0;
<</script>>
<!-- code to reset the page title in the top right; can be changed or removed altogether as necessary -->
<<if tags().includes("title")>>
<<elseif tags().includes("credits")>><h1>Credits</h1>
<<elseif tags().includes("character")>>
<h1>Character</h1>
<<elseif tags().includes("codex")>>
<h1>Codex</h1>
<<else>><h1>$chapter</h1>
<</if>>
<<set $chapter to "Loading Screen">>
<<set $haveMetSam = false>>
<<set $haveMetAli = false>>
<<set $knowVerita = false>>
<<set $eyecolour to {
"right": "brown",
"left": "brown",
}>>
<<set $angel to 50>>
<<set $devil to 50>>
<<set $brains to 50>>
<<set $brawn to 50>>
<<set $shy to 50>>
<<set $bold to 50>>
<<set $admired to 90>>
<<set $feared to 10>>
<<set $fame to 50>>
<<set $forgotten to 50>>
<<set $s_rom to 50>>
<<set $s_plat to 50>>
<<set $a_rom to 50>>
<<set $a_plat to 50>>!!!//''Aut Vincere Aut Mori'': Either Victory Or Death//
You still remember the day Le Cirque d'Estelle fell from grace.
The lingering smoke. The fallen silk tents. The sharp cries of coppers barking orders at each other, dancing around the flames threatening to consume everything in its wake. It was one of the only memories of your past you had left, buried deep within the crux of your soul. A fact you didn't take lightly.
The salted caramel scent coated your bustling nerves in warm, paternal embrace. Nobody was allowed to have sweets while practicing. Yet among the chaos, that decadent flavor enveloped your senses far more than the charring flesh did. It was quite a spectacle to behold, actually. What with the frigid metal chains tightening their ever present grip around the Ringmaster's limbs, you couldn't help but be surprised that the flames were what got to him first.
But despite all of this, you remained quiet. Not a single whisper, hum, or syllable permitted to escape. Fervent ardor eclipsed your senses and permeated all thought and threatened to spill open for all to see. To drench every blade of grass red and fuel the flames. Against your will but restless in tandem with the madness. You had a mouth and a voice to go with it, but it felt as though you were unable to scream.
It was hardly a show for the gaping remains either. Who, despite their circumstances, managed to lay in position and play their part. Reaching out to the burning man even on their deathbead. His legacy stilt inferno, the show ending at long last. The question still remained: was this the finale, or the conception of something much greater? Even as a young <<listbox "$young_gender" autoselect>>
<<option "boy">>
<<option "girl">>
<<option "child">>
<</listbox>>, you never expected everything you had ever lived for to end in a sugar-drunken haze. And to think, only a few hours ago in that very spot, you were rigorously perfecting...
-><<link "A knee hang while flying on the trapeze" "3">><<set $circusrole to "aerialist">><<set $performer to "singer">><<set $bold to 90>><<set $shy to 10>><</link>>
-><<link "The stretching of your muscles for the upcoming acrobatic performance" "3">><<set $circusrole to "acrobat">><<set $performer to "dancer">><<set $brawn to 60>><<set $brains to 40>><</link>>
-><<link "Your comedic timing in front of the stagehands" "3">><<set $circusrole to "clown">><<set $performer to "actor">><<set $admired to 80>><<set $feared to 20>><</link>>
-><<link "Your juggling with various oddities before the exotic animals" "3">><<set $circusrole to "juggler">><<set $performer to "musician">><<set $admired to 90>><<set $feared to 10>><</link>><ul>
<li>Banner assets <a href="https://www.canva.com/">Canva</a></li>
<li>Fonts <a href="https://fonts.google.com/">Google Fonts</a></li>
</ul>''Le Cirque d'Estelle'': A mystical and mind-bending traveling circus featuring a myriad of dreamlike attractions and illusions. It is rumored the circus permanently shut down in the year 1900 after the death of the, frankly, bizarre Ringmaster in a great fire. Knowledge of what happened to the other performers is severely limited.
''The Spotlight Syndicate'': One of the most popular and elusive nightclubs of the time disguised as an unassuming barbershop in New York City. To gain entry, you must perform a secret knock and quietly recite a secret password to the bouncer. Longtime trusted members are allowed a unique speakeasy identification card.
<<if $knowVerita is true>>
''Verità nel Sangue'': A criminal organization of six mafia families, founded by $name's late mother. Despite primarily operating in North America, they are a monopoly of various illegal markets and oversee every form of illegal activity on a //global// scale.
<</if>>ORANGE: Game info - character page, codex, credits. Populate these with what you like.
GREEN: UI & game set-up elements. These can be edited to suit your needs.
RED: Code. Everything in these passages should be labelled; things might break if you mess with them.An Interactive Fiction By...<!-- styling for the splash screen - hides all the menus only on this passage -->
<style>
#ui-bar {display:none;}
#passages {width:100vw;margin:0;background-image:var(--banner-top),var(--banner-bottom);background-repeat:no-repeat;background-size:50%;background-position:top center, bottom center;overflow:hidden;scrollbar-width:none;font-family:var(--header-font);transition:0s;padding:0;}
::-webkit-scrollbar {width:0px;}
.passage {text-align:center;color:#8B0000;transition:0s;}
#passages a:before {content: none;}
#story {margin-left:0;}
h1 {text-align:center;margin-top:25vh;}
@media screen and (max-width: 800px) {#story {margin:0;}}
</style>
<h1>Glitz, Glam, and Gunpowder</h1>
<<if Save.autosave.ok() and Save.autosave.has()>><<link "Resume Game">><<script>>Save.autosave.load()<</script>><</link>> | <</if>><<link "New Game" "Loading Screen">><</link>> | <<link "Load Game">><<run UI.saves()>><</link>> | <<link "Settings">><<run UI.settings()>><</link>><<if $haveMetSam is true>>
!!The Boss ($s_name "Sam" Kaminski)
''YOU'' are an acquired talent on behalf of the current wealthy owner of the elusive Spotlight Syndicate, one of the most popular bars of its time. <<print $s_heshe.toUpperFirst()>>'s one of the few people who don't question your mysterious past, who trust you as implicitly as the air $s_heshe breathes. You know deep down $s_heshe has a soft spot for you, one of $s_hisher greatest assets, but $s_hisher motives are...difficult to discern. But is there a possibility your relationship could go beyond transactional business?
''Physical Description'': Jewish and Black; Tall (<<if $s_person is "woman">>5'7<<else>>6'<</if>>); Muscular; Deep Brown Skin Tone; Textured Black Hair; Deep Brown Eyes ==Rumors they Glow Red at Night==; Sharp Eyebrows; Adorns <<print$s_himself.toUpperFirst()>> With a Lot of Accessories/Jewelry
''Romantic'': $s_rom
''Platonic'': $s_plat
<</if>>
<<if $haveMetAli is true>>
!!The Rival ($a_name Delacroix)
''AS'' you adjust to your new life, you hear rumors about your fated rival. One whose mind was poisoned to despise every fiber of your being. It's no surprise $a_heshe's known for $a_hisher ambition, $a_hisher cunning, $a_hisher ruthless nature. $a_hisher path led $a_himher to inevitable darkness, but will yours?
''Physical Description'': French/Irish; Average Height (<<if $a_person is "woman">>5'5<<else>>5'10<</if>>); Somewhat Muscular; Ivory Skin Tone; Shoulder-Length Wavy Blonde Hair; Blue-Green Eyes; One-Sided Dimple on Right; Sharp Jawline; Scar over Left Eyebrow
''Romantic'': $a_rom
''Platonic'': $a_plat
<</if>>~~may be adjusted as the story develops~~
* This IF is inspired and based on various time periods/settings on both a political and socioeconomic level. However, it is not meant to be taken as a one-to-one accurate historical account, as I have taken creative liberties for the sake of the story
* Mentions of Racism/Racial Stereotypes of the Time
** //Not prominently because I don't feel it my place to be ''too'' explicit, but again, please be wary as this is a historical IF//
* Depictions of Trauma and Abuse Tied to:
** //Heavy Extremist Religious Themes, Grooming, Poor Mental Health, Violence/Gore, Criminal Activity, and Implied Incest/Incestuous Dynamics//
* Inaccurate Biblical References and Depiction of Christianity As a Religion
Relationship Improvement Key:
*(♥) signifies a romantic improvement option
*(♡) signifies a platonic improvement option
->[["Return to Loading Screen" |Loading Screen]]
Cool fingers wrapped around your wrist, gently tugging you away from the raging hearth. ''Jesse''. They were acting quite unusual that day. Clutching their forehead, murmuring what the others had shrugged off as cryptic nonsense. // Merely another one of their mad moments,// they said. The irony was palpable even then.
But they must have come back for you, seeing as you were stuck in place. From a distance, it would seemed you were nothing more than a votive statue. But, //were// you stuck in place? You could have sworn you'd taken a step...forward? No, that's not right, why are you going there?! ''STAY BACK—''
"We must leave...we must hurry...."
Maybe //you// were the one having a mad moment. That didn't sound like your dear friend at all.
The screams, oh goodness. The Ringmaster was howling, no better than a wilderbeast during a full moon. You could have sworn you saw his soul set aflight that night, crackling away whilst with the bold red fabric limply hung onto his frilly white cuff. //''Don't look away, you cannot look away.''// Perhaps that is why you stayed. Why anyone bothered to accompany him during his journey to the Great Beyond. A shaky laugh desperately clawed at your throat, but it didn't quite manage to reach the surface. Al of this was for him, it was always for him.
He cared for you, he //loved// you—He did! Would I dare lie to you? He held you all in the highest esteem. The Ringmaster breathed life into you again. Gave you purpose. And here you are, watching him wither away like he never existed. Merely passing by like a grain of sand in a boundless hourglass.
You were nothing. You were //everything//.
You were everyone. You were //no one//.
You were now a blank slate, cleansed of the last remaining shred of your former self. Capable of being anyone you so desire. One can only wonder, who or what will you become?
Well for starters...
There is power in a name.
What is yours, my starling? <<textbox "$name" "" "4">><<set $chapter to "Chapter 1">>(function () {
'use strict';
// v1.1.0; by Chapel, for SugarCube 2 (>= v2.29.0)
if (!Template || !Template.add || typeof Template.add !== 'function') {
alert('Warning, this version of SugarCube does not include the Template API. Please upgrade to v2.29.0 or higher.');
return;
}
// CONFIGURATION
var config = {
name : 'gender',
showSetting : true,
label : 'Gender',
desc : '',
storyVar : '%%gender',
default : 'female' // female, male, or other
};
// DATA
// the point-replace id
var settingID = '#setting-control-' + config.name;
// preset pornoun map
var genderMap = {
subjective : ['she', 'he', 'they'],
objective : ['her', 'him', 'them'],
possessive : ['hers', 'his', 'theirs'],
determiner : ['her', 'his', 'their'],
reflexive : ['herself', 'himself', 'themself'],
noun : ['woman', 'man', 'person']
};
// INTERNAL FUNCTIONS
// custom dialog function
function createDialog (name, element, classes) {
var reopen = false;
if (Dialog.isOpen() && $('#ui-dialog-body').hasClass('settings')) {
reopen = true;
}
Dialog.close();
Dialog.setup(name, (reopen) ? classes + ' reopen' : classes);
Dialog.append(element);
Dialog.open();
}
function genderForm () { // create a form for users to configure their pronouns
var $wrapper = $(document.createElement('div'));
function createInput (label, name, def) { // create text inputs
return $(document.createElement('label'))
.append(label)
.css('display', 'block')
.append($(document.createElement('input'))
.attr({
type : 'text',
name : name
})
.css({
float : 'right',
'margin-left' : '0.2em'
})
.val(def)
);
}
function createDropdown (label, name, list) { // create dropdowns
var $select = $(document.createElement('select'))
.attr('name', name)
.css('float', 'right');
list.forEach( function (opt, idx) {
console.log(idx);
$(document.createElement('option'))
.attr('value', String(idx))
.append(opt)
.appendTo($select);
});
return $(document.createElement('label')).css('display', 'block').append(label, $select);
}
var $inputs = Object.keys(genderMap).map( function (key) {
// create an input for each type of pronoun
var idx = 2;
if (config.default === 'male') {
idx = 1;
} else if (config.default === 'female') {
idx = 0;
}
var sv = State.variables;
var def = genderMap[key][idx];
if (sv[config.storyVar] && sv[config.storyVar][key]) {
def = sv[config.storyVar][key];
}
return createInput(key.toUpperFirst() + ': ', 'gender-' + key, def);
});
var $presets = createDropdown('Presets: ', 'gender-preset', ['She/Her', 'He/Him', 'They/Them'])
.on('change', function () {
// auto-fill text inputs when the preset is changed
var value = Number($(this).find('select').val());
if (!Number.isNaN(value)) {
$inputs.forEach( function ($input) {
var $text = $input.find('input');
var type = $text.attr('name').split('-')[1];
$text.val(genderMap[type][value]);
});
}
});
var $select = $presets.find('select');
if (!State.variables[config.storyVar]) {
// set defaults
if (config.default === 'male') {
$select.val('1');
} else if (config.default === 'female') {
$select.val('0');
} else {
$select.val('2');
}
} else {
$select.val(''); // custom config, no preset
}
var $confirm = $(document.createElement('button'))
.wiki('Confirm')
.addClass('gender-confirm')
.ariaClick({ label : 'Confirm pronoun selection.' }, function () {
// this button saves the pronoun config settings
var sv = State.variables;
sv[config.storyVar] = {};
$inputs.forEach( function ($input) {
var $text = $input.find('input');
var type = $text.attr('name').split('-')[1];
sv[config.storyVar][type] = $text.val().trim().toLowerCase();
});
// reopen the settings modal or close the modal
if ($('#ui-dialog-body').hasClass('reopen')) {
UI.settings();
}
Dialog.close();
});
var $form = (function () {
// add some line breaks to the generated form
var $els = [$presets, '<br>'];
$inputs.forEach( function ($input) {
$els.push($input);
$els.push('<br>');
});
$els.push($confirm);
return $els;
}());
return $wrapper.append($form);
}
// CORE FUNCTIONS
function handleGender () {
// this function opens the custom modal
createDialog('Customize Gender', genderForm(), 'custom-gender');
}
function getFromPreset (n) {
// default
if (typeof n !== "number" || Number.isNaN(n) || n > 2 || n < 0) {
n = 0;
}
var ret = {};
Object.keys(genderMap).forEach( function (key) {
ret[key] = genderMap[key][n];
});
return ret;
}
function getGender () {
// get the player's gender (custom or grab the default)
// custom
if (State.variables[config.storyVar] && State.variables[config.storyVar].subjective) {
return State.variables[config.storyVar];
}
// default
return getFromPreset(config.default === 'male' ? 1 : 0);
}
function setPreset (gender) {
var pn;
switch (gender) {
case 'female':
pn = getFromPreset(0);
break;
case 'male':
pn = getFromPreset(1);
break;
default:
pn = getFromPreset(2);
}
State.variables[config.storyVar] = clone(pn);
return pn;
}
function setPronouns (obj) {
if (typeof obj !== 'object') {
return;
}
State.variables[config.storyVar] = setPreset(config.default === 'male' ? 1 : 0);
return Object.assign(State.variables[config.storyVar], obj);
}
// SETTINGS API
if (config.showSetting) {
Setting.addToggle(config.name, {
label : config.label,
desc : (config.desc && typeof config.desc === 'string' && config.desc.trim()) ?
config.desc.trim() : undefined
});
$(document).on(':dialogopen :dialogopened', function () {
if ($('#ui-dialog-body').hasClass('settings')) {
$(settingID).parent('div').empty().append( $(document.createElement('button'))
.append('Configure...')
.ariaClick( function () {
handleGender();
})
);
}
});
}
// singular endings
var replaceWith_are = /^is$/i; // is
var replaceWith_were = /^was$/i; // was
var replaceWith_have = /^has$/i; // has
var replaceWith_o = /oes$/i; // does, goes
var replaceWith_ie = /^[dl]ies$/i; // dies
var replaceWith_y = /ies$/i; // dries
var remove_es = /sses$/i; // posesses
var remove_es2 = /hes$/i; // catches
var remove_s = /s$/i; // surpises, plays
// the above are tested in order; if none apply, return singular form (e.g: ran -> ran)
// test for 'they' pronoun
var hasThey = /they/i;
function makePlural (singular) {
if (!singular || typeof singular !== 'string') {
return singular;
}
singular = singular.trim();
if (replaceWith_are.test(singular)) {
return singular.replace(replaceWith_are, 'are');
}
if (replaceWith_were.test(singular)) {
return singular.replace(replaceWith_were, 'were');
}
if (replaceWith_have.test(singular)) {
return singular.replace(replaceWith_have, 'have');
}
if (replaceWith_o.test(singular)) {
return singular.replace(replaceWith_o, 'o');
}
if (replaceWith_ie.test(singular)) {
// need to use replaceWith_y regex here.
return singular.replace(replaceWith_y, 'ie');
}
if (replaceWith_y.test(singular)) {
return singular.replace(replaceWith_y, 'y');
}
if (remove_es.test(singular)) {
return singular.replace(remove_es, 'ss');
}
if (remove_es2.test(singular)) {
return singular.replace(remove_es2, 'h');
}
if (remove_s.test(singular)) {
return singular.replace(remove_s, '');
}
return singular;
}
function _getPronounsArePlural () {
return hasThey.test(getGender().subjective.trim());
}
// usage: pluralize('dries', null, true) -> dry; pluralize('supresses', 'supress') -> supresses
function pluralize (singular, plural, forcePlural) {
if (!forcePlural) {
return singular;
}
if (plural && typeof plural === 'string') {
return plural;
}
return makePlural(singular);
}
// TEMPLATES
function isUpper (name, string) {
// is name is uppercase, return uppercased string
if (name.first() === name.first().toUpperCase()) {
return string.toUpperFirst();
}
return string;
}
Template.add(['he', 'she', 'they', 'He', 'She', 'They'], function () {
return isUpper(this.name, getGender().subjective);
});
Template.add(['him', 'her', 'them', 'Him', 'Her', 'Them'], function () {
return isUpper(this.name, getGender().objective);
});
Template.add(['his', 'hers', 'theirs', 'His', 'Hers', 'Theirs'], function () {
return isUpper(this.name, getGender().possessive);
});
Template.add(['his_', 'her_', 'their', 'His_', 'Her_', 'Their'], function () {
return isUpper(this.name, getGender().determiner);
});
Template.add(['himself', 'herself', 'themself', 'Himself', 'Herself', 'Themself'], function () {
return isUpper(this.name, getGender().reflexive);
});
Template.add(['man', 'woman', 'person', 'Man', 'Woman', 'Person'], function () {
return isUpper(this.name, getGender().noun);
});
Template.add(['he-s', 'she-s', 'they-re', 'He-s', 'She-s', 'They-re'], function () {
return isUpper(this.name, getGender().subjective + pluralize("'s", "'re", _getPronounsArePlural()));
});
// MACRO
// `<<pronouns>>` -> opens the modal for pronoun configuration, probably best paired with a link
Macro.add('pronouns', {
skipArgs : true,
handler : function () {
handleGender();
}
});
// <<verb singular [plural] [makePlural]>>
Macro.add('verb', {
handler: function () {
var pl = _getPronounsArePlural();
if (this.args.length < 1) {
return this.error('Please pass at least a singular third person pronoun to this macro.');
}
if (this.args.includes('plural')) {
pl = true;
}
this.output.append(pluralize(String(this.args[0]), (this.args[1]) ? String(this.args[1]) : null, !!pl));
}
});
// JAVASCRIPT API
setup.gender = {
// get the pronoun object; `setup.gender.pronouns().subjective` -> get `he`, `she`, etc
pronouns : getGender,
// set pronouns from presets or manually
setPronouns : function (presetOrObj) {
if (typeof presetOrObj === 'string') {
return setPreset(presetOrObj);
}
if (typeof presetOrObj === 'object') {
return setPronouns(presetOrObj);
}
},
// open the pronoun config modal from JS; `setup.gender.dialog()`
dialog : handleGender,
// pluralizer function
pluralize : makePlural
};
window.gender = window.gender || setup.gender;
}());
// fading macro set, by chapel; for SugarCube 2
// version 1.1.0
// see the documentation: https://github.com/ChapelR/custom-macros-for-sugarcube-2#fading-macros
// <<fadein>> macro
Macro.add('fadein', {
tags : null,
handler : function () {
var $wrapper = $(document.createElement('span'));
var content = this.payload[0].contents, time, delay;
if (this.args.length === 0) {
return this.error('no arguments given');
}
time = Util.fromCssTime(this.args[0]);
delay = (this.args.length > 1) ? Util.fromCssTime(this.args[1]) : 0;
$wrapper
.wiki(content)
.addClass('macro-' + this.name)
.appendTo(this.output)
.hide()
.delay(delay)
.fadeIn(time);
}
});
// <<fadeout>> macro
Macro.add('fadeout', {
tags : null,
handler : function () {
var $wrapper = $(document.createElement('span'));
var content = this.payload[0].contents, time, delay;
if (this.args.length === 0) {
return this.error('no arguments given');
}
time = Util.fromCssTime(this.args[0]);
delay = (this.args.length > 1) ? Util.fromCssTime(this.args[1]) : 0;
$wrapper
.wiki(content)
.addClass('macro-' + this.name)
.appendTo(this.output)
.delay(delay)
.fadeOut(time);
}You're the cat's pajamas hon! $name...it simply rolls off the tongue, wouldn't you say? Nothing short of magnificent, as is your very essence. But I'd expect nothing less from such a stellar...
-><<button 'Man (He/Him Pronouns)'>>
<<set $heshe to 'he';
$himher to 'him';
$hisher to 'his';
$hishers to 'his';
$himself to 'himself';
$manwoperson to 'man';
$sondaughter to 'son';
$mafiatitle to 'Godfather';
$title to 'Mr.';
$pronouns_plural to false>>
<<run Engine.play("5")>>
<</button>>
-><<button 'Woman (She/her Pronouns)'>>
<<set $heshe to 'she';
$himher to 'her';
$hisher to 'her';
$hishers to 'hers';
$himself to 'herself';
$manwoperson to 'woman';
$sondaughter to 'daughter';
$mafiatitle to 'Godmother';
$title to 'Mrs.';
$pronouns_plural to false>>
<<run Engine.play("5")>>
<</button>>
-><<button 'Person (They/Them Pronouns)'>>
<<set $heshe to 'they';
$himher to 'them';
$hisher to 'their';
$hishers to 'theirs';
$himself to 'themself';
$manwoperson to 'person';
$sondaughter to 'child';
$mafiatitle to 'Godmaster';
$title to 'Mx.';
$pronouns_plural to true>>
<<run Engine.play("5")>>
<</button>>Goodness, we're bound to be tardy! Look's like there's little time left to waste dwelling. You must soon get ready to deliver the best performance of your life tonight. Even better than yesterday's and one that can only hope to top tomorrow's...
!!! End of Prologue Demo (TRIAL I)