Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
/*
Call as <<AddActivity [activity]>>
*/
<<widget "AddActivity">>
<<if def $args[0].cost>>
<<set $activityCost += $args[0].cost>>
<</if>>
<<if def $args[0].cash>>
<<set $activityCost -= $args[0].cash>>
<</if>>
<<if def $args[0].sanity>>
<<set $activitySanity += $args[0].sanity>>
<</if>>
<<if def $args[0].sexual>>
<<set $sexActCount += 1>>
<</if>>
<<if def $args[0].degrade>>
<<set $degActCount += $args[0].degrade>>
<</if>>
<<set $player.activities.push($args[0])>>
<</widget>>
/*
Call as <<RemoveActivity [index]>>
*/
<<widget "RemoveActivity">>
<<if ($args[0] >= 0) && ($args[0] < $player.activities.length)>>
<<if def $player.activities[$args[0]].cost>>
<<set $activityCost -= $player.activities[$args[0]].cost>>
<</if>>
<<if def $player.activities[$args[0]].cash>>
<<set $activityCost += $player.activities[$args[0]].cash>>
<</if>>
<<if def $player.activities[$args[0]].sanity>>
<<set $activitySanity -= $player.activities[$args[0]].sanity>>
<</if>>
<<if def $player.activities[$args[0]].sexual>>
<<set $sexActCount -= 1>>
<</if>>
<<if def $player.activities[$args[0]].degrade>>
<<set $degActCount -= $player.activities[$args[0]].degrade>>
<</if>>
<<set $player.activities.deleteAt($args[0])>>
<</if>>
<</widget>>/*
Call as <<PerformActivities>>
*/
<<widget "PerformActivities">>
/* Init Variables */
<<set _dels = []>>
<<set $visitorCount = $girls.length + 1>>
<<set $visitorReroll = 0>>
<<set $genericCount = 0>>
<<CalculateBrothelFame>>
<<if ndef $player.counter>>
<<set $player.counter = []>>
<</if>>
<<for _act=0; _act<$player.activities.length; _act++>>
$player.activities[_act].name - $player.activities[_act].effect
/* Cash */
<<if def $player.activities[_act].cash>>
<<set $player.cash += $player.activities[_act].cash>>
<</if>>
<<if def $player.activities[_act].cost>>
<<set $player.cash -= $player.activities[_act].cost>>
<</if>>
/* Sanity */
<<if def $player.activities[_act].sanity>>
<<set $player.sanity += $player.activities[_act].sanity>>
<</if>>
<<if def $player.activities[_act].maxSanity>>
<<set $player.sanity += $player.activities[_act].maxSanity>>
<</if>>
/* Fame */
<<if def $player.activities[_act].brothelFame>>
<<set $brothelFame += $player.activities[_act].brothelFame>>
<</if>>
/* Visitor */
<<if def $player.activities[_act].client>>
<<set $visitorCount += $player.activities[_act].client>>
<</if>>
<<if def $player.activities[_act].reroll>>
<<set $visitorReroll += $player.activities[_act].reroll>>
<</if>>
<<if def $player.activities[_act].generic>>
<<set $genericCount += $player.activities[_act].generic>>
<</if>>
/* Skill */
<<if def $player.activities[_act].skill>>
<<set AddSkill($player.skills, $player.activities[_act], $player.activities[_act].skillVal)>>
<</if>>
/* Counter handling */
<<if def $player.activities[_act].counter>>
<<set AddCounter($player.counter, $player.activities[_act].counter, $player.activities[_act].counterVal)>>
<</if>>
<<if def $player.activities[_act].sexual>>
<<set AddCounter($player.counter, "Sexual Activity", 1)>>
<</if>>
<<if def $player.activities[_act].degrade>>
<<set AddCounter($player.counter, "Degrading Activity", 1)>>
<</if>>
/* Pregnancy chance */
<<if def $player.activities[_act].pregnant>>
- <<PregChance $player $player.activities[_act].name>>
<</if>>
/* Remain */
<<if def $player.activities[_act].remain>>
<<set $player.activities[_act].remain -= 1>>
<<if $player.activities[_act].remain <= 0>>
- Duration expired.
<<set _dels.push(_act)>>
<</if>>
<</if>>
<br>
<</for>>
<br>
<<set $player.activities.deleteAt(_dels)>>
<</widget>>/* Variable Init */
<<set $gameState = $state.day>>
<<set _locked = {nonSex:0, nonDeg:0}>>
<<if ndef $menus>>
<<set $menus = {}>>
<</if>>
<<if $show.notes>>
''Daylight Hours''
<br>Shall we get moving on then, dear? The sun is already so high in the sky! We may be sex slaves at a small brothel, but the nights are busier than the days. Our customers still have regular jobs during business hours. They're ordinary people, you know? It's not Like they have unlimited money to dump on prostitutes, so you have to be patient if they haven't visited in a while.
<br>Every day, you have three activity slots during your daylight hours. You can fill those time slots with any combination of three tasks, and you can repeat the same tasks if you wish.
<</if>>
<br><br>
''Currently Planned Activities'': $player.activities.length of $numActivity activities
<<if $reqSexual >= 1>>
| $sexActCount @@color:pink;Sexual@@ activities ($reqSexual required)
<</if>>
<<if $allowDegrade >= 1>>
| $degActCount of $allowDegrade @@.degrade;Degrading@@ activities
<<if $reqDegrade >= 1>>
($reqDegrade required)
<</if>>
<</if>>
<<for _i=0; _i<$player.activities.length; _i++>>
<br>
<<if def $player.activities[_i].locked>>
Required
<<if ndef $player.activities[_i].sexual>>
<<set _locked.nonSex += 1>>
<</if>>
<<if ndef $player.activities[_i].degrade>>
<<set _locked.nonDeg += 1>>
<</if>>
<<else>>
<<capture _i>>
<<link "Cancel" "Plan Activities">>
<<RemoveActivity _i>>
<</link>>
<<if $player.activities.length < $numActivity>>
|
<<if def $player.activities[_i].limited>>
Limited
<<else>>
<<link "Repeat" "Plan Activities">>
<<set _tmp = clone($player.activities[_i])>>
<<AddActivity _tmp>>
<</link>>
<</if>>
<</if>>
<</capture>>
<</if>>
|
''$player.activities[_i].name''
<<if def $player.activities[_i].sexual>>
- @@color:pink;Sexual@@
<</if>>
<<if def $player.activities[_i].degrade>>
<<if $player.activities[_i].degrade == 1>>
- @@.degrade;Degrading@@
<<else>>
- @@.degrade;Very Degrading@@
<</if>>
<</if>>
- $player.activities[_i].effect
<<if def $player.activities[_i].remain>>
- @@color:coral;$player.activities[_i].remain Day<<if $player.activities[_i].remain > 1>>s<</if>> Left@@
<</if>>
<</for>>
/* NOTE - temporary Punishment & reqAct interaction handler */
<br><br>
<<if ($reqSexual + _locked.nonSex) > $numActivity>>
Punishments will prevent meeting required @@color:pink;Sexual@@ activity count (no penalty currently).<br>
<<set $reqSexual = $numActivity - _locked.nonSex>>
<</if>>
<<if ($reqDegrade + _locked.nonDeg) > $numActivity>>
Punishments will prevent meeting required @@.degrade;Degrading@@ activity count (no penalty currently).<br>
<<set $reqDegrade = $numActivity - _locked.nonDeg>>
<</if>>
/**/
<<set _workActs = WorkActList()>>
<<set _trainActs = TrainActList()>>
<table id="basic">
<tr><td colspan=3>
''Work & Labor''
<<if $show.notes>>
<br>Yeah, we still have work to do even when we're not sleeping with a client. What did you think? We're slaves. Our purpose is to make as much money as possible for our Owner, and we'll be punished if we fall short. I think the Owner is a fairly reasonable master, since he lets us decide everything for ourselves. However, slave owners are legally allowed to kill and maim their property, so don't go asking for trouble.
<</if>>
</td></tr>
<<for _idx=0; _idx<_workActs.length;>>
<tr>
<<for _n=0; _n<3;_n++>>
<td>
<<if _idx<_workActs.length>>
<<print DisplayActivity(_workActs[_idx])>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
<table id="basic">
<tr><td colspan=3>
''Training & Lessons''
<<if $show.notes>>
<br>You want to spend some time on self-improvement? That's the spirit! It takes effort to become good at something, and you'll need a lot of practice before you get good at this.
<</if>>
</td></tr>
<<for _idx=0; _idx<_trainActs.length;>>
<tr>
<<for _n=0; _n<3; _n++>>
<td>
<<if _idx<_trainActs.length>>
<<print DisplayActivity(_trainActs[_idx])>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
<br><br>
<<if ($player.cash < $activityCost)>>
<<set $nextLink.text = "Insufficient Cash!">>
<<set $nextLink.dest = "">>
<<elseif ($player.activities.length < $numActivity)>>
<<set $nextLink.text = "Select More Activities!">>
<<set $nextLink.dest = "">>
<<elseif ($player.activities.length > $numActivity)>>
<<set $nextLink.text = "Select Fewer Activities!">>
<<set $nextLink.dest = "">>
<<elseif ($sexActCount < $reqSexual)>>
<<set $nextLink.text = "Select More Sex Acts!">>
<<set $nextLink.dest = "">>
<<elseif ($degActCount < $reqDegrade)>>
<<set $nextLink.text = "Select More Degrading Acts!">>
<<set $nextLink.dest = "">>
<<elseif ($degActCount > $allowDegrade) && ($degActCount > $degActLocked)>>
<<set $nextLink.text = "Select Fewer Degrading Acts!">>
<<set $nextLink.dest = "">>
<<else>>
<<set $nextLink.text = "Perform Activities">>
<<set $nextLink.dest = "Activities to Evening">>
<</if>>/*
Call as <<UpdateActivity [player] [index]>>
*/
<<widget "UpdateActivity">>
<<set _origActivity = $args[0].activities[$args[1]]>>
<<set _newActivity = GenerateActivity(_origActivity.name)>>
/* Cost & Cash */
<<if def _origActivity.cost>>
<<set $activityCost -= _origActivity.cost>>
<</if>>
<<if def _origActivity.cash>>
<<set $activityCost += _origActivity.cash>>
<</if>>
<<if def _newActivity.cost>>
<<set $activityCost += _newActivity.cost>>
<</if>>
<<if def _newActivity.cash>>
<<set $activityCost -= _newActivity.cash>>
<</if>>
/* Flags */
<<if def _origActivity.sexual>>
<<set $sexActCount -= 1>>
<</if>>
<<if def _newActivity.sexual>>
<<set $sexActCount += 1>>
<</if>>
<<if def _origActivity.degrade>>
<<set $sexActCount -= _origActivity.degrade>>
<</if>>
<<if def _newActivity.degrade>>
<<set $sexActCount += _newActivity.degrade>>
<</if>>
/* Skill Opt */
<<if def _newActivity.skillOpt>>
<<set _newActivity.skill = _origActivity.skill>>
<<set FinalizeActivity(_newActivity)>>
<</if>>
<<set $args[0].activities[$args[1]] = _newActivity>>
<</widget>>/*<<set UpdateClientList($clients)>>*/
@@.major;Client List@@
<br>
<table id="clientlist">
<<for _idx=0;_idx<$clients.length;>>
<tr>
<<for _n=0;_n<4;_n++>>
<<if _idx<$clients.length>>
<td>
<<print DisplayClient($clients[_idx])>>
</td>
<<set _idx++>>
<</if>>
<</for>>
</tr>
<</for>>
</table>
Tags:
<<TagDescriptionList>>
Kinks:
<<KinkDescriptionList>>/*
Call as <<GenerateBrothelVisitors>>
Assumes $brothelFame is correct.
*/
<<widget "GenerateBrothelVisitors">>
/* Variable Init */
<<set $visitors = []>>
<<set $genericVisitors = []>>
<<set _minFame = $brothelFame / 2>>
<<set $minID = $clients.length>>
<<set _maxID = $minID>>
/* Determine min */
<<for _i=0; _i<($clients.length - $visitorCount); _i++>>
<<if $clients[_i].fame >= _minFame>>
<<set $minID = _i>>
<<break>>
<</if>>
<</for>>
/* Determine max */
<<for _i=$minID+$visitorCount; _i<$clients.length; _i++>>
<<if $clients[_i].fame > $brothelFame>>
<<set _maxID = _i - 1>>
<<break>>
<</if>>
<</for>>
<<if _maxID == $clients.length>>
<<set _maxID = $clients.length - 1>>
<<if (_maxID - $minID) < $visitorCount>>
<<set $minID = _maxID - $visitorCount>>
<</if>>
<</if>>
/* Pull visitors */
<<for ;$visitors.length < $visitorCount;>>
<<set _ID = RandomInRange($minID, _maxID)>>
<<set _found = 0>>
<<for _i=0; _i<$visitors.length; _i++>>
<<if $visitors[_i].ID == _ID>>
<<set _found = 1>>
<<break>>
<</if>>
<</for>>
<<if !_found>>
<<set $visitors.push({ID:_ID,girl:-1})>>
<<if ndef $clients[_ID].kinks>>
<<set $clients[_ID] = UpdateClientSingle($clients[_ID])>>
<</if>>
<<set CalculateOpinion($clients[_ID])>>
<</if>>
<</for>>
/* Sort */
/* TODO - sort based upon lower hearts first */
<<set $visitors = $visitors.sort(function(a, b)
{ if(a.ID > b.ID) return -1; if(a.ID < b.ID) return 1; return 0;})>>
/* Roll Fame for Generic Clients */
<<if $genericCount>>
<<if ndef $clientGenders>>
<<set $clientGenders = [GenderMale(), GenderMale(), GenderFemale()]>>
<</if>>
<<set _maxGen = Math.min($brothelFame, 150)>>
<<set _minGen = Math.floor(_maxGen/2)>>
<<for ;$genericVisitors.length < $genericCount;>>
<<set _num = Math.min(RandomInRange(_minGen, _maxGen),RandomInRange(_minGen, _maxGen))>>
<<set _newGeneric = CreateGenericClient(_num)>>
<<set $genericVisitors.push(_newGeneric)>>
<</for>>
<<set $genericVisitors = $genericVisitors.sort(function(a, b)
{ if(a.fame > b.fame) return -1; if(a.fame < b.fame) return 1; return 0;})>>
<</if>>
<</widget>>/*
Call as <<KinkDescriptionList>>
*/
<<widget "KinkDescriptionList">>
<<set _kinks = KinkList("list")>>
<ul>
<<for _tdl = 0; _tdl<_kinks.length; _tdl++>>
<li>_kinks[_tdl]: <<print KinkDescription(_kinks[_tdl])>></li>
<</for>>
</ul>
<</widget>>/*
Call as <<MatchMoreAppealingGirls>>
Assumes $visitors[] is up to date.
*/
<<widget "MatchMoreAppealingGirls">>
/* TODO - need Heart support */
<<set _idx=0>>
/* Sort $girls */
<<set $girls = $girls.sort(function(a, b)
{ if(a.appeal > b.appeal) return -1; if(a.appeal < b.appeal) return 1; return 0;})>>
/* Assign as needed */
<<for _i=0; _i<$visitors.length; _i++>>
<<if _idx >= $girls.length>>
<<break>>
<</if>>
<<if $girls[_idx].appeal >= $clients[$visitors[_i].ID].opinion>>
<<set $visitors[_i].girl = _idx>>
<<set _idx++>>
<</if>>
<</for>>
/*
<<for _i=0; _i<$girls.length; _i++>>
/*
<<if $visitors[_idx].opinion > $girls[_i].appeal>>
<<continue>>
<</if>>
*
<<set $visitors[_idx].girl = _i>>
<<set _idx++>>
<<if _idx >= $visitors.length>>
/* Error Catching? *
<<break>>
<</if>>
<</for>>
/**/
<</widget>>/* Variable Init */
<<set _success = 0>>
<<set _grtSuc = 0>>
<<set _fails = 0>>
<<set $earn = 0>>
<<set _punishment = 0>>
<<set _pregCheck = 0>>
<<if def $player.client.name>>
<<set _client = $player.client>>
<<else>>
<<set _client = $clients[$player.client]>>
<</if>>
<<set $gameState = $state.night>>
/* NEW CODE */
<<set _options = clone(_client.tasks)>>
<<set $tasks = []>>
<<set $failed = []>>
<<set _target = 3>>
/* Intro */
<table>
<tr>
<<if $show.images>>
<td rowspan="2">
<<print ClientImage(_client)>>
</td>
<</if>>
<td colspan="2">
Tonight you'll be servicing ''_client.name''.
/* Handle Honry/Pheromones & Sloth */
<<if _client.tags.includes("Horny")>>
<br>Due to <<print his(_client)>> @@color:pink;Horniness@@ <<print he(_client)>> wants extra service.
<<set _target += 1>>
<<elseif $player.flags.includes("pheromones")>>
<br>Your @@.tag;Pheromones@@ have made <<print him(_client)>> @@color:pink;Horny@@ and wanting extra service.
<<set _target += 1>>
<</if>>
<<if _client.tags.includes("Sloth")>>
<br><<print His(_client)>> @@.tag;Sloth@@ has him wanting reduced service.
<<set _target -= 1>>
<</if>>
/* Populate $tasks */
<<for ;$tasks.length<_target;>>
<<if _options.length <= 0>>
<<break>>
<</if>>
<<set _newTask = _options.pluck()>>
<<if _newTask.type == $type.special>>
/* TODO - update this when changing how special skills work */
<<if _newTask.skill.includes("nything")>>
<<set _newTask.skill = SexSkills().random()>>
<<set _newTask.type = $type.sex>>
<<else>>
<<set _rnd = either($type.sex, $type.kink, $type.service)>>
<<if _rnd == $type.sex>>
<<set _newTask.skill = SexSkills().random()>>
<<set _newTask.type = $type.sex>>
<<elseif _rnd == $type.kink>>
<<set _newTask.skill = KinkSkills().random()>>
<<set _newTask.type = $type.kink>>
<<else>>
<<set _newTask.skill = ServiceSkills().random()>>
<<set _newTask.type = $type.service>>
<</if>>
<</if>>
<</if>>
/* TODO - work on this *
<<if (VoiceSkills().includes(_newTask.skill) && HasEffect($player.effect, "Mute"))>>
<<set $failed.push(_newTask)>>
<<else>>
/**/
<<set _newTask.bonus = GetSkillMod($player.skills,_newTask.skill)>>
<<set $tasks.push(_newTask)>>
/*
<</if>>
/**/
<</for>>
/*
<<if $failed.length >= 1>>
<br><<if _client.gender == $gender.male>>He<<else>>She<</if>> wanted <<print SkillIconName($failed[0])>>, but since you're @@color:skyblue;Mute@@ you couldn't perform it.
<<set _fails += 1>>
<</if>>
*/
<br>
</td></tr>
<tr><td>
<<print His(_client)>> requests for tonight are:
<<for _i=0; _i<$tasks.length; _i++>>
<br>
CR @@color:magenta;$tasks[_i].cr@@
<<print SkillIconName($tasks[_i])>>
<<set _tmp = GetSkillMod($player.skills, $tasks[_i])>>
<<set $tasks[_i].bonus = _tmp>>
(+<<print _tmp>>)
<</for>>
</td>
</tr></table>
/* Perform tasks */
<<for _i=0; _i<$tasks.length; _i++>>
<br>
<<set _exp = 0>>
<<set $tasks[_i].roll = RandomInRange(1,20)>>
<<set $tasks[_i].rating = $tasks[_i].roll + $tasks[_i].bonus>>
/* Skill Block Check */
<<if $player.skillBlock.includes($tasks[_i].skill)>>
Failure! Cannot perform <<print SkillIconName($tasks[_i], true)>>
<<set _rsnFnd=0>>
<<for _pfc=0; _pfc<$player.effect.length; _pfc++>>
<<if def $player.effect[_pfc].skillBlock>>
<<if $player.effect[_pfc].skillBlock.includes($tasks[_i].skill)>>
because you are @@color:skyblue;<<print $player.effect[_pfc].name>>@@.
<<set _rsnFnd = 1>>
<<break>>
<</if>>
<</if>>
<</for>>
<<if !_rsnFnd>>
for some unknown reason.
<</if>>
<<if _client.tags.includes("Empathetic")>>
<<print He(_client)>> is @@.tag;Empathetic@@ and doesn't hold it against you.
<<else>>
<<set _fails += 1>>
<<set _punishment += 1>>
<</if>>
<<continue>>
<</if>>
<<if $tasks[_i].rating >= ($tasks[_i].cr)>>
<<if $tasks[_i].rating >= ($tasks[_i].cr * 2)>>
Great
<<set _grtSuc += 1>>
<</if>>
Success!
<<set _exp = 3>>
<<set _success += 1>>
<<else>>
<<if $tasks[_i].rating < ($tasks[_i].cr / 2)>>
Great
/* Injury Code */
<<if !$player.flags.includes("stretchy")>>
<<if [$type.sex, $type.kink].includes($tasks[_i].type)>>
<<set _injuries += 1>>
<</if>>
<</if>>
<</if>>
Failure!
<<set _exp = 2>>
<<if _client.heart >= 1>>
They decide to let it slide because of your past performance (-1 ♥).
<<set _client.heart -= 1>>
<<else>>
<<set _fails += 1>>
<<set _punishment += 1>>
<</if>>
<</if>>
<<print SkillIconName($tasks[_i])>> check:
(d20 Roll @@color:skyblue;$tasks[_i].roll@@ + Bonus $tasks[_i].bonus = $tasks[_i].rating vs CR @@.appeal;$tasks[_i].cr@@)
- (@@.skill;+<<print _exp>> $tasks[_i].skill exp@@)
<<set AddSkill($player.skills, $tasks[_i], _exp)>>
<<if $tasks[_i].skill == "Vaginal">>
<<set _pregCheck = 1>>
<</if>>
<</for>>
/* Calculate earnings */
<br>
<<set _multi = _grtSuc + _success - _fails>>
<<if _client.tags.includes("Cheap") && _grtSuc>>
<br>Due to <<print his(_client)>> @@.tag;Cheapness@@, you didn't earn as much.
<<set _multi -= 1>>
<</if>>
<<if _client.tags.includes("Generous") && (_grtSuc < _success)>>
<br><<print His(_client)>> @@.tag;Generosity@@ led to your earning more.
<<set _multi += 1>>
<</if>>
<<set $earn = _multi * _client.opinion>>
<<if _success >= 3>>
<<set $earn += _client.fame>>
<</if>>
<<if $earn >= 1>>
<br>You earned @@.cash;$<<print $earn>>@@.
<<elseif $earn <= -1>>
<br>Your poor performance led to your owner fining you @@.cash;$<<print -$earn>>@@.
<<else>>
<br>Your mediocre performance earned you no cash.
<</if>>
<<set $player.cash += $earn>>
/* Mention Hearts */
<<if (_grtSuc >= 3) && (_success >= 3) && (_fails == 0)>>
<<set _client.heart += 1>>
<br><br>Heart Gained! (<<print _client.heart>> total)
<</if>>
/* Pregnancy Check */
<<if _pregCheck>>
<br><br><<PregChance $player "Vaginal">>
<</if>>
/* Punishments */
<<if _client.tags.includes("Violent")>>
<br><<print His(_client)>> @@.tag;Violent@@ streak has left you ''Injured''.
<<set _e = GenerateEffect("Injury")>>
<<AddEffect $player _e>>
<</if>>
<<if _punishment && _client.tags.includes("Forgiving")>>
<br><<print He(_client)>> @@.tag;Forgives@@ your poor performance.
<<set _punishment -= 1>>
<</if>>
<<if _client.tags.includes("Perfectionist") && (_grtSuc < _success)>>
<br><<print His(_client)>> @@.tag;Perfectionist@@ streak has left <<print him(_client)>> unsatisfied with your performance.
<<set _punishment += 1>>
<</if>>
<<if _client.tags.includes("Complainer")>>
<br><<print His(_client)>> @@.tag;Complaints@@ leads to
<<if _punishment>>
a greater punishment.
<<else>>
you geting punished.
<</if>>
<<set _punishment += 1>>
<</if>>
<<if _punishment>>
<<set _punishString = either(PunishLists(_punishment))>>
<br><br><<PunishPlayer $player _punishString>>
<</if>>
<<if $player.cash < 0>>
<<set _brokePunish = either(["Free Glory Hole", "Free Use", "Gangbang"])>>
<br>Your broke ass needs further punishment.
<br><<PunishPlayer $player _brokePunish>>
<<set $player.cash = 0>>
<</if>>
<<if _client.heart >= 5>>
<br><br>Something about chance to be purchased.
<<link "Suggest they purchase you" "Purchase Attempt">>
<</link>>
<br><<link "Keep Quiet" "Finish Day">>
<</link>>
<<else>>
<<set $nextLink.text = "Finish Day">>
<<set $nextLink.dest = "Finish Day">>
<</if>>/* Variable Init */
<<set $gameState = $state.evening>>
<<set _idv = 0>>
<<set _idg = 0>>
<<set _continue = true>>
<<if $show.notes>>
''Evening Hours''
<br>It's time to open the brothel! Are you nervous?
<br>Have you fixed your makeup? You won't have time to run back to the dressing room once the customers are here, so make sure you @@color:coral;finalize your appearance@@ before the night starts.
<br>Take note of your @@.appeal;Total Appeal@@ score after all applying all daily/weekly modifiers to your base appeal.
<hr>
<</if>>
Brothel Fame = $brothelFame
<<if $visitorReroll>>
<br>Visitor Rerolls: $visitorReroll
<</if>>
<br>
<table id="borderless">
<<for ;_continue;>>
<tr>
<<for _n=0;_n<4; _n++>>
<td>
<<if _idv<$visitors.length>>
<<print DisplayClient($clients[$visitors[_idv].ID], true)>>
<br>
<<if $visitors[_idv].girl >= 0>>
@@color:yellow;<<print $girls[$visitors[_idv].girl].name>>@@
<<else>>
<<capture _idv>>
<<link "Pair With" "Perform For Client">>
<<set $player.client = $visitors[_idv].ID>>
<</link>>
<</capture>>
<<if $visitorReroll>>
<br>
<<link "Reroll" "Plan Evening">>
<<set _maxID = $visitors[_idv].ID - 1>>
<<set $visitors.deleteAt(_idv)>>
<<for ;$visitors.length < $visitorCount;>>
<<set _found = 0>>
<<set _ID = RandomInRange($minID, _maxID)>>
<<for _i=0; _i<$visitors.length; _i++>>
<<if $visitors[_i].ID == _ID>>
<<set _found = 1>>
<<continue>>
<</if>>
<</for>>
<<if !_found>>
<<set $visitors.push({ID:_ID,girl:-1})>>
<</if>>
<</for>>
<<set $visitorReroll -= 1>>
<<set $visitors = $visitors.sort(function(a, b)
{ if(a.ID > b.ID) return -1; if(a.ID < b.ID) return 1; return 0;})>>
<</link>>
<</if>>
<</if>>
<<set _idv++>>
<<elseif _idg<$genericVisitors.length>>
<<print DisplayClient($genericVisitors[_idg], true)>>
<br>
<<capture _idg>>
<<link "Pair With" "Perform For Client">>
<<set $player.client = $genericVisitors[_idg]>>
<</link>>
<</capture>>
<<set _idg++>>
<<else>>
<<set _continue = false>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
<hr>
Tags:
<<TagDescriptionList>>
Kinks:
<<KinkDescriptionList>>/* Variable init */
<<set _client = $clients[$player.client]>>
You have @@.appeal;five Hearts@@ with _client.name, and you've suggested that they purchasing you from the brothel.
<br>Roll a 2d100 dice and sum the score. If the Customer Fame is higher than the dice roll, they will successfully purchase you. Congratulations! You now have a new owner.
<br>If their Customer Fame is too low... I guess you need to find a wealthier client. It's not like a poor beggar can afford to buy a sex slave. The economy is bad, and people can't just throw money around like candy. Reset your client's Hearts to zero.
<br><br>
<<set _roll = RandomInRange(1,100) + RandomInRange(1,100)>>2d100 = _roll
<<if _roll < _client.fame>>
They gathered enough money to buy you! Congratulations you "win".
<<else>>
They were unable to get enough money to buy you. Better luck next time.
<<set _client.heart = 0>>
<<link "Back to Working" "Finish Day">>
<</link>>
<</if>>/*
Call as <<TagDescriptionList>>
*/
<<widget "TagDescriptionList">>
<<set _tags = TagList("list")>>
<ul>
<<for _tdl = 0; _tdl<_tags.length; _tdl++>>
<li><<print DisplayTag(_tags[_tdl])>>: <<print TagDescription(_tags[_tdl])>></li>
<</for>>
</ul>
<</widget>><<set $numActivity = 0>>
@@.major;Work & Labor@@
<<set _workActs = WorkActList(true)>>
<<set _trainActs = TrainActList(true)>>
<br><br>
<table id="basic">
<<for _idx=0; _idx<_workActs.length;>>
<tr>
<<for _n=0; _n<3;_n++>>
<td>
<<if _idx<_workActs.length>>
<<print DisplayActivity(_workActs[_idx], false)>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
@@.major;Training & Lessons@@
<table id="basic">
<<for _idx=0; _idx<_trainActs.length;>>
<tr>
<<for _n=0; _n<3; _n++>>
<td>
<<if _idx<_trainActs.length>>
<<print DisplayActivity(_trainActs[_idx], false)>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table><<set _avg = 0>>
<<set _idx=0;>>
<table id="clientlist">
<tr><td>Client</td><td>Fame</td><td>Task 0</td><td>Task 1</td><td>Task 2</td><td>Task 3</td></tr>
<<for _idx=0; _idx<$clients.length; _idx++>>
<tr>
<td>$clients[_idx].name</td>
<td>$clients[_idx].fame</td>
<td>$clients[_idx].tasks[0].cr</td>
<td>$clients[_idx].tasks[1].cr</td>
<td>$clients[_idx].tasks[2].cr</td>
<td>$clients[_idx].tasks[3].cr</td>
</tr>
<</for>>
</table><<DebugTableClients $clients>>@@.major;Daily Items@@
<<set _dailyItems = DailyShopList(true)>>
<<DebugTableItems _dailyItems>>
<br><br>
@@.major;Long Lasting Items@@
<<set _longItems = LongShopList(true)>>
<<DebugTableItems _longItems>>
/*
<br><br>
@@.major;Cursed Items@@ - Currently in beta
<<set _cursedItems = CursedShopList(true)>>
<table id="basic">
<<for _idx=0; _idx<_cursedItems.length;>>
<tr>
<<for _n=0; _n<4;_n++>>
<td>
<<if _idx<_cursedItems.length>>
<<set $newItem = GenerateItem(_cursedItems[_idx])>>
<<DisplayItem $newItem>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
/**/
<br><br>
@@.major;Permanent Items@@
<<set _permItems = PermanentItemList(true)>>
<table id="basic">
<<for _idx=0; _idx<_permItems.length;>>
<tr>
<<for _n=0; _n<4;_n++>>
<td>
<<if _idx<_permItems.length>>
<<ShowPermanent _permItems[_idx]>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>/* Variable Init */
<<set _skills = []>>
/* Add Sex Skills */
<<set _lst = SexSkills("list")>>
<<set AddSkill(_skills, _lst, 0)>>
/* Add Kink Skills */
<<set _lst = KinkSkills("list")>>
<<set AddSkill(_skills, _lst,0)>>
/* Add Service Skills */
<<set _lst = ServiceSkills("list")>>
<<set AddSkill(_skills, _lst,0)>>
/* Populate Skill Table From Default Clients */
<<for _i=0; _i<$clients.length; _i++>>
<<set AddSkill(_skills, $clients[_i].tasks, 1)>>
<</for>>
/* Sort ? */
<<set _skills = _skills.sort(function(a, b)
{
if(a.type < b.type) return -1; if(a.type > b.type) return 1;
if(a.skill < b.skill) return -1; if(a.skill > b.skill) return 1;
return 0;})>>
/* List them All */
''Skills'' (<<print _skills.length>>)
<table>
<tr><td></td><td>Sex Skill</td><td>Kink Skill</td><td>Service Skill</td><td>Voice Skill</td></tr>
<<for _i=0; _i<_skills.length; _i++>>
<tr>
<td><<print SkillIconName(_skills[_i], true)>> _skills[_i].exp</td>
<td>
<<if SexSkills(_skills[_i].skill)>>
Yes
<</if>>
</td>
<td>
<<if KinkSkills(_skills[_i].skill)>>
Yes
<</if>>
</td>
<td>
<<if ServiceSkills(_skills[_i].skill)>>
Yes
<</if>>
</td>
<td>
<<if VoiceSkills(_skills[_i].skill)>>
Yes
<</if>>
</td>
</tr>
<</for>>
</table>/*
Call as <<DebugTableClients [clientList]>>
*/
<<widget "DebugTableClients">>
<<set _idx=0;>>
<table id="clientlist">
<<for _idx=0;_idx<$args[0].length;>>
<tr>
<<for _n=0;_n<4;_n++>>
<<if _idx<$args[0].length>>
<td>
<<print DisplayClient($args[0][_idx])>>
</td>
<<set _idx++>>
<</if>>
<</for>>
</tr>
<</for>>
</table>
<</widget>>/*
Call as <<DebugTableItems [itemList]>>
*/
<<widget "DebugTableItems">>
<<set _idx=0;>>
<table id="basic">
<<for _idx=0;_idx<$args[0].length;>>
<tr>
<<for _n=0;_n<5;_n++>>
<<if _idx<$args[0].length>>
<td>
<<set $newItem = GenerateItem($args[0][_idx])>>
<<DisplayItem $newItem>>
</td>
<<set _idx++>>
<</if>>
<</for>>
</tr>
<</for>>
</table>
<</widget>>/* Variable Init */
<<set $clientGenders = [GenderMale(), GenderMale(), GenderFemale()]>>
<<set $genericVisitors = []>>
<<set _generic = {}>>
<<for _n=35; _n<151; _n+=5>>
<<set _generic = CreateGenericClient(_n)>>
<<set $genericVisitors.push(_generic)>>
<</for>>
<<DebugTableClients $genericVisitors>><table id="basic">
<tr><td colspan=3>
@@.major;Night Visitors@@
<br>Every night, a small number of clients will visit the brothel. The default is a number of named clients equal to the number of girls in the brothel and zero generic clients.
<br><br>The @@.appeal;Fame@@ of the clients encountered is based off your Brothel's Fame. @@.appeal;Brothel Fame@@ is the sum of everyone's appeal (including your own). The highest fame clients you can encounter is equal to your Brothel Fame, those with higher fame are too picky and will not visit your low-class brothel. The lowest fame clients you can encounter are equal to half your Brothel Fame, those with lower are too poor to visit your brothel.
</td></tr>
<tr><td></td><td id="clientlist">
@@.appeal;Brothel Fame@@ =
<<for _n=0; _n<$girls.length; _n++>>
(<<print $girls[_n].name>>'s Appeal) +
<</for>>
(Your Appeal) + (Activity Fame)
<br>
@@.appeal;Brothel Fame@@ =
<<set _bf = 0>>
<<for _n=0; _n<$girls.length; _n++>>
(<<print $girls[_n].appeal>>) +
<<set _bf+=$girls[_n].appeal>>
<</for>>
($player.appeal)
<<set _abf=0>>
<<for _n=0; _n<$player.activities.length; _n++>>
<<if def $player.activities[_n].brothelFame>>
<<set _abf += $player.activities[_n].brothelFame>>
<</if>>
<</for>>
+ (_abf)
=
<<set _bf+= $player.appeal + _abf>>_bf
<br>Your brothel can attract clients with a Fame between @@.appeal;<<print Math.ceil(_bf/2)>>@@ and @@.appeal;_bf@@.
<br>Generic clients take the lower of two rolls in the range to determine their fame.
<br><span class="note">For Generic clients Brothel Fame is capped at 150.</span>
</td><td></td></tr>
<tr><td colspan=3>
<br>
Once all the clients for the night are chosen, start matching them with the appropriate girl. The girls pair with clients in order of @@.appeal;Appeal@@, with the highest going first. The other girls will pair with the highest Fame Named Client available.
<br>
<br>Once all the girls with higher appeal than yours have paired with clients you may select from the remaining unpaired clients. If you have a @@.appeal;Reroll Guest@@, you may use them at this time. The replacement client will have equal or lower Fame than the rerolled client.
<br><span class="note">There currently no ways to get a reroll.</span>
</td></tr>
</table>
<table id="basic">
<tr><td colspan=3>
@@.major;Sex & Service@@
<br>Once you have paired with a client, they will ask you to perform three tasks for the night. If they are @@color:pink;Horny@@, they will ask for an addtional task. As a sex slave, you cannot decline any of their requests.
<br><br>
Every client task has a @@.appeal;Challenge Rating@@. You must get a performance score equal to or higher than their Challenge Rating in order to pass. Your performance score is the sum of a twenty-sided die roll, the square root of your experience in the skill, and your bonus modifier in the skill.
<br>If your performance score is at least double the task Challenge Rating, your performance will be considered a @@color:coral;Great Success@@. If you your performance scoure is less than half the task Challenge Rating your performance will be considered a @@color:coral;Great Failure@@.
</td></tr>
<tr><td></td><td id="clientlist">
@@color:skyblue;Performance Score@@ = (1d20) + (SQRT(@@.skill;exp@@)) + (@@color:skyblue;bonus@@)
</td><td></td></tr>
<tr><td colspan=3>
</td></tr>
</table>
<table id="basic">
<tr><td colspan=3>
@@.major;Payment & Hearts@@
<br>Each client will pay according to your performances in the tasks you perform, their opinion of your appearance, and their Fame.
<br>Their opinion of you is your appeal plus any bonuses from satisfiying their kinks. Their opinion of you also goes up by two for every Heart they have for you.
</td></tr>
<tr><td></td><td id="clientlist">
@@.cash;Pay@@ = (Great Success x2 + Success - Failure) * (Opinion)
<br>If you succeed at least three tasks, you get a bonus equal to the client's fame.
</td><td></td></tr>
<tr><td colspan=3>
<br>
If you get at least three Great Successes and zero failures, you will collect a @@color:pink;Heart@@.
<br>Hearts have three effects:
<br>Failure Forgiveness: A Heart will be consumed, negating both the cash penalty and the punishment from failing a task.
<br>Purchased: If you gather five hearts with a client, you can suggest they buy you from the brothel.
<br>Opinion: Each heart increases their opinion of you by two.
</td></tr>
</table>
Tags:
<<TagDescriptionList>>
Kinks:
<<KinkDescriptionList>>Item Notes:
<ul>
<li>Alcohol is arguably too cheap. It may need a downside like the player is a horny drunk.</li>
<li>Pheromones probably shouldn't be 100% successful.</li>
<li>Permanent versions of items so you no longer have to spend daily/weekly. The real questions are do I combine items, do I give them drawbacks?</li>
</ul><center>@@.major;''It was the beginning of a nightmare...''@@</center>
<table>
<tr><td>
<span style="font-size:10pt">You suddenly wake up in the middle of the night to a dizzying sense of pain, confusion, and darkness. Someone is on top of you and shoving your legs apart, and you frantically realize that you are @@color:coral;being raped@@ by several of the mercenaries.
<br><br>It feels like your brain is surrounded with fog, and you slowly deduce that you must have been @@color:coral;drugged@@. You can’t summon the energy to resist, and tight hemp rope around your arms digs into your skin. A soiled leather gag in your mouth tastes like mud, and bitter tears fill your eyes.
<br><br>“No hard feelings,” a mercenary says. “We need cash, and you’ll sell for a pretty sum. We all got families to feed.”</span>
</td><td>
<img src="images/Intro4.png">
</td></tr>
<tr><td>
<img src="images/Intro5.png">
</td><td>
<span style="font-size:10pt">You are promptly stripped naked, assaulted, and robbed of your belongings. A dark sack is thrown over your head, and you feel yourself loaded onto an enclosed wagon. Over the subsequent days, you are repeatedly drugged, molested, and forced to heal the injured members of the mercenary party, and you lose all sense of time and direction.
<br><br>At some point, you must have been sold to a slave merchant, because your restraints are exchanged for @@color:coral;metal shackles and a steel collar@@, and you are given slave rags to wear.
<br><br>“My father will come looking for me!” You insist weakly.
<br><br>But the slavers laugh, and an ominous cloaked figure steps forward. Glowing black magic appears at their fingertips.</span>
</td></tr>
<tr><td>
<span style="font-size:10pt">There is a flash of light, and you collapse on the floor writhing in pain. It feels like the skin on your body is melting, and the dark wizard coldly informs you that this @@color:coral;transformation magic@@ is permanent. It can even alter your gender. @@color:gray;(i.e.♂ to ♀)@@
<br><br>No one from your past life will ever recognize your new look. As far as society is concerned, your former identity is @@color:coral;dead@@.
<br><br>The dark wizard reaches out and seizes your neck. A fiery sensation expands inside your throat, and the evil magic slowly eats away your vocal cords, dealing irreversible damage and @@color:coral;branding@@ your neck with a magical slave’s mark.
<br><br>You are now @@color:coral;mute@@ and permanently silenced.
<br><br>This is the beginning of your new life as a voiceless slave...</span>
</td><td>
<img src="images/Intro6.png">
</td></tr></table>
<<link "Learn your fate" "Girls Intro">>
<</link>><table>
<tr>
<td>
<span style="font-size:10pt">Depression has struck the Kingdom of Petaligua. The economy is miserable, and the unemployment rate has skyrocketed to record heights. With thousands of starving people overcrowding the slums, rampant crime plagues the streets of the capital.
<br><br>Your father runs a small apple orchard outside of the city, so your family farm has been relatively secure. However, a terrible blight struck your orchard this year, and the crops are ruined. It’s starting to look like there won’t be enough money to pay for rent.
<br><br>As the eldest peasant child, you decide to look for work in the city. The @@color:coral;Adventurer’s Guild@@ is well known for accepting mercenaries from all walks of life, and you decide that this might be a good place to make use of your natural talent in @@color:coral;recovery magic@@.</span>
</td>
<td>
<img src="images/Intro1.png">
</td></tr>
<tr><td>
<img src="images/Intro2.png">
</td>
<td>
<span style="font-size:10pt">After registering as a healer, you look around the guild hall hoping to join a party. Everyone looks very intimidating, and you don’t know anyone. However, as a healer, you can’t take quests or fight monsters by yourself.
<br><br>You find a small party of mercenaries who look somewhat strong, and they are wrapped in bandages and other injuries. It seems like they don’t already have a healer, so you offer your services and ask to join their team.
<br><br>“@@color:coral;Sure, we could use a healer,@@” the leader tells you.
<br><br>Gratefully, you tag along and follow them out of the city.</span>
</td></tr>
<tr><td>
<span style="font-size:10pt">You quickly meet all the members of the party and you heal everyone’s wounds with your magic. Even though you initially thought the mercenaries seemed scary, they were @@color:coral;kinder than you expected@@, and they are actually very friendly.
<br><br>After spending an evening socializing, drinking alcohol, and getting to know your new teammates, you feel good about yourself. You think you’re very fortunate for being born with healing powers, because otherwise it would be difficult to find such a nice party of caring and welcoming people.
<br><br>You fall asleep underneath the stars, oblivious, warm, and happy.</span>
</td><td>
<img src="images/Intro3.png">
</td></tr></table>
<<link "Wake Up" "Game Intro Nightmare">>
<</link>><center>@@.major;The Slave Girls of the Red Lantern Brothel@@</center>
<table><tr>
<td>
<<if $show.images>>
<img src="images/Vivi Intro.png">
<</if>>
</td>
<td>
Oh? A new face? You must be the new @@color:coral;slave girl@@ that the Owner purchased yesterday. You’re in terrible shape, and I guess we should get you cleaned up. I have no idea what you’ve been through, but you should put your old life behind you. There’s no use crying, and you’ll scare away customers with that miserable look.
<br>My name is @@color:yellow;Vivi@@, and you can think of me like an older sister. I’m a slave just like you, but I’ve been working at this @@color:coral;slave brothel@@ for a few years. We’re a relatively small and affordable whorehouse in the red light district, so @@color:coral;we don’t get the nicest customers@@, but I hope that one day we can work together to attract better clients.
<br>It’s a dream of ours, you know?
<br>I don’t know if anyone has explained it to you yet, but the only way we’ll ever leave this place is if a customer @@color:coral;purchases us from the brothel@@. All of us fantasize about being purchased by a kind owner one day, so we’re all trying our hardest to appeal to the best patrons. Hopefully, they’ll fall for our charms and buy us from this place.
<br>Of course... you don’t want to be purchased by a filthy and cruel man, right?
<br>You better work hard then. You’re just a common @@color:coral;peasant girl@@, right? Your face and body is @@color:coral;kinda average@@, and you don’t even know how to read and write? I don’t mean to be rude, but you have a lot of catchup to do before you can start calling yourself a halfway decent prostitute like the rest of us.
</td></tr></table>
<table id="basic">
<tr><td colspan=3>
@@.major;Yahallo! It’s nice to meet you, newcomer!@@
<br>We’re only a small brothel, so there were only three of us here before you came along.
<br>We’re all trying our hardest to appeal to our ideal owners, so it’s kind of like a @@color:coral;competition@@ between us.
<br>But that doesn’t mean we can’t be friends! We’re all sex slaves, so let’s get along, okay?
</td></tr>
<tr>
<td>
<<if $show.images>>
<img src="images/Vivi.png">
<br>
<</if>>
@@.name;''Vivi''@@
<br>Appeal: @@.appeal;30@@
<br><span class='note'>Hiyo! We spoke earlier! I don’t mean to brag, but I’m the star maiden of this brothel. I’m number one in sales and popularity, and I’m pretty much fully booked every night. That said, I’m always up for a friendly chat!
<br>Since I’m obviously everyone’s first choice, I get dibs on the best customers. Patrons will visit me before they visit anyone else, so the rest of you girls will be stuck with the bottom of the pile. >.< No hard feelings though! It’s just the perks of being the #1 girl on the list.</span>
</td>
<td>
<<if $show.images>>
<img src="images/Mauve.png">
<br>
<</if>>
@@.name;''Mauve''@@
<br>Appeal: @@.appeal;20@@
<br><span class='note'>Hey. I’m Mauve. Nice to meet you. I’m kind of a weirdo, so don’t mind me if you see me doing strange things. The Boss picked me up because I’m an expert on all kinds of fetishes, so you can always talk to me if you want sex lessons. Of course, you’ll need to pay me for private tutoring, since I ain’t doing it for free.
<br>Do I have any advice for you? Hm… Be creative. Be bold. Be yourself. Don’t judge the clients. Some of them may look greasy, but they’re not bad people. Appearances ain’t everything.</span>
</td>
<td>
<<if $show.images>>
<img src="images/Ena.png">
<br>
<</if>>
@@.name;''Ena''@@
<br>Appeal: @@.appeal;12@@
<br><span class='note'>H-Hi… my name is Ena. I’m a b-beastkin slave… S-Snow leopard. Um… I’m not really good at this, but the customers like me because I’m f-fluffy. My tail is very soft, but please don’t touch it… it’s very sensitive… I don’t like it when the customers touch it but I don’t have a choice… Sex slaves can’t say no.
<br>Um… is there something wrong with your voice? You can’t talk? What happened to you? I’m sorry, I don’t know how to read or write either. You’ll have to learn from someone else.</span>
</td>
</tr>
</table>
<table id="basic">
<tr><td colspan=2>@@.major;Let's take a look in the mirror, shall we.?@@</td></tr>
<tr><td>
<<if $show.images>>
<img src="images/You.png">
<br>
<</if>>
</td>
<td>
<br>Huh? Why do you look so surprised? You don't even recognize your own face? Well... um... yeah, you'll probably need to work on your appearance if you want to attract better customers.
<br><br>But don't feel bad, okay? It's not like every peasant girl has beautiful skin like a goddess. To be honest, all of us use tons of makeup and cosmetics, and no prostitute looks good first thing in the morning. Maybe you didn't use many beauty products back when you were a poor flat-chested village girl, but you'll just have to start buying the more expensive goods if you want to look nice from now on. Your outfit is also half the battle, and it should highlight your charm. There are also surgeries and magical spells to increase your bust size or straighten your teeth, but those are expensive, and you'll have to save up before you can afford them.
<br>I know it's unusual, but the Owner makes us pay for our own clothing and beauty improvements. Even though we're sex slaves, he can't be bothered to micromanage this feminine stuff, so he gives us a small allowance with each client that we serve satisfactorily. It's not real money, but we can use it like fake currency to request upgrades.
<br>Right now, you have @@.cash;$0@@ in savings. Your base appeal score is: @@.appeal;2@@ Keep track of these two numbers moving forward!
</td></tr></table>
<br><br>
''Morning Hours''
<br>Are you okay, dear? You don’t look very thrilled about this. To be honest, Ena was just like you when the Owner purchased her at a discount market. She was a scraggly ball of fur, half starving, and way too skinny for anyone to want her. However, the Owner has excellent intuition, and he saw that she could definitely be popular after she cleaned up a bit. I’m sure it’s the same with you! You have a nice figure, but it’s covered underneath all that acne, freckles, and scars.
<br><br>Anyways, let me help you out for today, alright?
<br><br>It’s the morning right now, and it’s time to get ready. I’ll lend you $50 for your first day, so spend it on anything you like. Since you can’t talk, I guess you’ll have to point with your fingers, and I’ll help purchase those products for you. Our slave collars will shock and prevent us from leaving the red light district, so everything is delivered by a courier. I don’t need to mention that our slave brands have other magical features that allow our Owner to track, control, and punish us, right?
<br><br>
<<link "Start Game" "Start New Day">>
<<set $player.cash = 50>>
<</link>>/* FinishActivities */
<<GenerateBrothelVisitors>>
<<MatchMoreAppealingGirls>>
/* Include Plan Evening */
<<include "Plan Evening">>/* set plot flag */
<<set $plot.enaCuddle = 1>>
Umm.. Hi again... I was th-thinking that since you've been helping me with learning to read you could help me with something else? It's my tail. I need to practice having it t-touched, but ... you know, slaves cannot say no to c-customers.
<br><br>S-so I was thinking, maybe you could help me with that? You could practice some of your @@.skill;touching skills@@ on me?
<<if HasEffect($player.effect, "Mute")>>
Y-you're nodding, so that's a yes?
<<else>>
Oh, yes!
<</if>>
Oh, thank you! Just let me know when we can practice!/* set plot flag */
<<set $plot.enaPractice = 1>>
So, umm... our Owner says since we've been together so much he's moving me into your bed<<if ndef $plot.ninaAdded>> so he can buy another girl<</if>>. I-I'll try my best to not bother you...
<br><br>Oh, you're not upset?
<br><br>That's great! I'll get my things! If you want, we can practice our @@.skill;skills@@ together!
<<if ndef $plot.ninaAdded>>
<<set $plot.ninaAdded = 1>>
<<set $girls.push({
name:"Nina", appeal:20
})>>
<<set $girls = $girls.sort(function(a, b)
{ if(a.appeal > b.appeal) return -1; if(a.appeal < b.appeal) return 1; return 0;})>>
<br><br>Your ''Owner'' has agreed to buy @@.name;Nina@@. She'll arrive at the brothel tomorrow.
<</if>>A Prostitute's wish
<br>Tell me, how was your first night? Was it anything like you expected? Was it horrible? Perhaps you found it disgusting? You must feel filthy. All of us experienced the same thing when we first came here, and we learned to grow up and move on. I faith in you, my dear little sister. You can do this. You can be filthy sex whore a like the rest of us.
<br>Ha. I can see the expression on your face. I bet you dislike me. Maybe you think "Vivi is a two-faced bitch", and you think I act totally different in front of customers? It's kind of cute to see you upset. Nostalgic, kinds. To be honest, I used to be shiny-eyed and optimistic just like you, but years in the sex industry left me jaded and cynical.
<br>You'll become a liar just like me, sooner or later.
<br>Let's see you climb the ladder. Chase that little dream of salvation — that maybe a decent customer will save you and buy your freedom. It's every prostitute's wish, isn't it? Cling to that a tiny little hope like a desperate little fool.
<br>It's the morning again, so run along now. Rinse and repeat. Do your makeup. Pick out a cute outfit and fix that plastic face.
<br>Remember to smile for the camera, my dear.
<table id="basic">
<tr><td colspan=2>
''Little Extras in Ena's Bedroom''
<br>H-Hi again... this is Ena... I just wanted to check in... Did Vivi say something mean again? Don't listen to her. S-Seriously. She's not right about everything...
</td></tr>
<tr>
<td>
<<if $show.images>>
<img src="images/Present.png">
<br>
<</if>>
@@.name;Gifts & Presents@@
<br>Um... I got you a present since it was your first night here... It's not much... and you can refuse it if you want, but it will give @@.appeal;+1@@ to your @@color:coral;base appeal@@.
<br>If you spend @@.cash;$500@@, you can give a gift to any of the girls in the brothel. All presents give @@color:coral;+1 base appeal@@ to an NPC.
<br>Presents are useful, because we should work together to raise our @@color:coral;Brothel Fame@@ so we can attract better customers. Of course, you can't give yourself presents, but you're already spending so much money on yourself.
<br>Even though Vivi is a little rude, she's not a bad person. Mauve is also very caring even though she's a little bit cold. You should think about getting them presents from time to time. All of us live together, so we should try to be friends.
<br>
<<link "Accept Gift" "Start New Day">>
<<set $player.baseAppeal += 1>>
<<set $player.enaGift = 1>>
<<set $player.appeal = $player.baseAppeal + $player.tempAppeal>>
<<set $player.startingAppeal = $player.baseAppeal>>
<</link>>
<br>
<<link "Decline Gift" "Start New Day">>
<<set $player.enaGift = 0>>
You Meanie.
<</link>>
</td>
<td>
<<if $show.images>>
<img src="images/Leisure Time.png">
<br>
<</if>>
@@.name;Leisure Time@@
<br>In my opinion... I m-mean... you don't have to listen to me... but it's important to take care of yourself. You should take breaks and find a hobby to enjoy.
<br>If you spend @@.cash;$25@@ and use @@color:coral;one daylight activity slot@@, you can spend that time on a hobby. It needs to be approved by the Owner, so suspicious things aren't allowed, but he's okay with us painting, drawing, gardening, and other stuff.
<br>Spending time on a hobby doesn't give any benefits... but I still think it's important food for the soul. H-Honestly, I spend most of my own extra money on hobbies... so I don't have very much in savings...
<br>But you should do you! All of us are different, and we each prefer to use our time in different ways.
</td></tr></table>/* Variable Init */
<<set _major = 0>>
<<set _minor = 0>>
<<set _minorEna = []>>
<<set _minorVivi = []>>
<<set _minorNina = []>>
/* TEMP */
<<if HasEffect($girls, "Nina") && ndef $plot.ninaAdded>>
<<set $plot.ninaAdded = 1>>
<</if>>
/* Ena Plot */
<<if ndef $player.enaGift>>
<<set _major = 1>>
<<include "Ena's Gift">>
<</if>>
<<if (ndef $plot.enaCuddle) && (GetCounter($player.counter, "Ena Literacy") >= 10)>>
<<set _minorEna.push("Ena Cuddle")>>
<</if>>
<<if (ndef $plot.enaPractice) && (GetCounter($player.counter, "Ena Cuddle") >= 5)>>
<<set _minorEna.push("Ena Roommate")>>
<</if>>
/* Vivi Plot *
<<if ndef $plot.viviMods && HasEffect($player.effect, "Advanced Brainwashing") && ($player.appeal > 20)>>
<<set _minorVivi.push("Vivi Mods")>>
<</if>>
/* Owner Plot */
/* Nina Plot */
<<if $plot.ninaAdded && ndef $plot.ninaIntro>>
<<set _minorNina.push("Nina Introduction")>>
<</if>>
/* Cleanup */
<<if !_major>>
<<if _minorEna.length >= 1>>
<table id="basic"><tr>
<td>
<<if $show.images>>
<img src="images/Ena.png">
<</if>>
</td>
<td>
<<set _pick = either(_minorEna)>>
<<include _pick>>
</td></tr></table>
<<set _minor = 1>>
<</if>>
<<if _minorVivi.length >= 1>>
<table id="basic"><tr>
<td>
<<if $show.images>>
<img src="images/Vivi.png">
<</if>>
</td>
<td>
<<set _pick = either(_minorVivi)>>
<<include _pick>>
</td></tr></table>
<<set _minor = 1>>
<</if>>
<<if _minorNina.length >= 1>>
<table id="basic"><tr>
<td>
<<if $show.images>>
<img src="images/Nina.png">
<</if>>
</td>
<td>
<<set _pick = either(_minorNina)>>
<<include _pick>>
</td></tr></table>
<<set _minor = 1>>
<</if>>
<<if _minor>>
<<link "Start New Day" "Start New Day">>
<</link>>
<<else>>
<<include "Start New Day">>
<</if>>
<</if>>/* set plot flag */
<<set $plot.ninaIntro = 1>>
Oh, hello! I haven't introduced myself yet. I'm Nina. Your Ow... OUR Owner wanted me to introduce myself and offer use of my power.
<br><br>I used to work as a witch for a noble, but I messed up. Accidentally making his head maid forget his wife's birthday kind of mess up. As punishment he had me enslaved and my body modified. So now I'm a, how did Vivi put it ... a filthy sex whore.
<br><br>How did I make the maid forget the birthday? That's my power. I can convert someone's @@.skill;skill experience@@ into @@color:skyblue;natural talent@@ for the same skill. While my power does make you worse at the @@.skill;converted skill@@, you can recover from it quickly as you are basically learning a new skill. It does have the side effect of making the person forget things, like birthdays. So maybe keep a diary./* set plot flag */
<<set $plot.viviMods = 1>>
I see I was right, you can do this. You've done a commnedable job cleaning yourself up. And you even got yourself brainwashed. Just thinking about how you've embraced being a sex slave puts a smile on my face.
<br><br>So, my dearest little sister, do you want to take the next step? I think with my guidance you could become a perfect sex goddess. Why don't I do it myself? Your healing magic silly. To become a true goddess of sex you have to dedicate yourself to sex, throwing away everything else.
<br><br>Exotic Permanent Modifications are now available.''Version 0.2.0 Changes'':
<ul>
<li>Reworked how items and activities work internally. Prior saves are not compatible.</li>
<li>New Stat - @@color:pink;Horny@@: Requires the player to spend one activity doing something sexual. Multiple sources will require multiple sexual activities.</li>
<li>New Stat - @@.degrade;Lowered Inhibitions@@: Allows the player to perform a degrading activity. Multiple sources will allow multiple degrading activities.</li>
<li>The player starts with the @@color:skyblue;Mute@@ condtion. While Mute you automatically fail certain service skills. Getting your vocal cords fixed is a one time $500 purchase.</li>
<li>Vivi now expects to have her loan to you repaid. About half of the shopping items are locked behind repaying her.</li>
<li>Gave all the Clients a fourth task. They now pick 3 tasks that they want the player to perform, currently there is no way for the player to influence the selected tasks.</li>
<li>Injuries are currently disabled. Stretchy is also disabled.</li>
<li>In game menus now save the last selection through page loads. As a tip, PC users can click on the menu then type what they want for faster selection.</li>
</ul>
''Version 0.1.1 Changes'':
<ul>
<li>Removed the /10 on skill mod calculation. Calculation is now: mod = square root(exp)</li>
<li>Hearts are now obtained when you get 3 great successes.</li>
<li>Client payment is now takes great successes into account. Calculation is now: pay = ((Great Success x 2) + Success - Fails) * Player Appeal. You get a bonus equal to Client Fame if you have three successes. You can loose money from fails.</li>
<li>Fixed Sebastian's Fame. Saves from the prevsious version will need to visit the Client List page to fix the problem.</li>
<li>Studing with Ena now actually works and is tracked. Already existing versions will be flagged as bugged and won't cause more errors, but also won't be tracked.</li>
<li>Getting the Nudity punishment two days in a row now works.</li>
<li>Changed the UI for client task selection. It is now a checkbox. Clicking on the Volunteer text should also toggle it.</li>
<li>You can no longer get pregnant while pregnant.</li>
<li>Added the full intro from the CYOA. Due to formatting differences it doesn't look as good, maybe I'll just show the CYOA image in the future.</li>
</ul>
''Twine & CYOA Version Differences'':
<ul>
<li>A dozen or so client skills had changes from the google doc. Most changes were making skill type consistent (i.e. Reurig had bondage listed as a sex skill, not a kink skill).</li>
<li>(Anything) will pick a random sex skill. (Random) will pick a random skill from all types.</li>
<li>Punishment is based off of number of tasks failed. If you fail 1 task you get one of the first four punishments. 2 failed tasks for punishments 5-8, and 3 failed tasks for 9-12.</li>
<li>All sex and kink skills are considered rough for injuries.</li>
<li>Great Success/Failure for skills. A way of showing the Heart and Injury thresholds for skills.</li>
</ul>/*
Call as <<DisplayItem [item]>>
*/
<<widget "DisplayItem">>
<<if $show.images>>
<<print '<img src="images/items/'+$args[0].name+'.png">'>>
<br>
<</if>>
@@.name;''$args[0].name''@@
<br>Price: @@.cash;$<<print $args[0].price>>@@
<<if def $args[0].priceAppeal>>
(@@.appeal;$args[0].priceText@@)
<</if>>
<<if ndef $args[0].duration>>
<br>@@color:coral;Cursed@@
<<elseif $args[0].duration == 1>>
<<elseif $args[0].duration == 7>>
<br>@@color:coral;Weekly@@
<<else>>
<br>@@color:coral;Lasts $args[0].duration Days@@
<</if>>
<<if $show.notes>>
<span class='note'><br>//$args[0].note//</span>
<</if>>
<<if def $args[0].effect>>
<br>$args[0].effect
<</if>>
<<if def $args[0].effectNote>>
<span class="note"><br>$args[0].effectNote</span>
<</if>>
<</widget>>/*
Call as <<FinishShopping>>
*/
<<widget "FinishShopping">>
/* Push Buying over to items */
<<for _fs=0; _fs<$player.buying.length; _fs++>>
<<set $player.buying[_fs].remain = $player.buying[_fs].duration>>
<<set $player.items.push($player.buying[_fs])>>
<</for>>
<<set $player.buying = []>>
/* Remove Stopped Cursed Items */
<<if ndef $player.stopping>>
<<set $player.stopping = []>>
<</if>>
<<for _fs=0; _fs<$player.stopping.length; _fs++>>
<<RemovedOwnedItem $player.stopping[_fs]>>
<</for>>
<<set $player.stopping = []>>
/* Buy Shopping List */
<<set $player.cash -= $shoppingCost>>
<</widget>>/* Init Variables */
<<set $gameState = $state.morning>>
<<set _idx=0>>
<<set _budget = $player.cash - $shoppingCost>>
<<set $player.appeal = $player.baseAppeal + $player.tempAppeal>>
<<set _dailyItems = DailyShopList()>>
<<set _longItems = LongShopList()>>
<<set _permItems = PermanentItemList()>>
<<if ndef $menus>>
<<set $menus = {}>>
<</if>>
/* $show.blocked support */
<<if $show.blocked == false>>
<<set _dailyItems.delete($player.itemBlock)>>
<<set _longItems.delete($player.itemBlock)>>
<</if>>
/* Daily Items */
<table id="basic">
<tr>
<td colspan=5>
@@.major;Daily Item & Modifiers@@
<<if $show.notes>>
<br>First, let's check out the daily shop. These items have @@color:coral;temporary effects@@ that @@color:coral;expire at the end of the day@@. For instance, if you apply a skin care lotion with a @@.appeal;+1 appeal@@ effect, it only lasts for one day. Tomorrow, you'll have to purchase the item again and redo your makeup routine.
<br>Beauty products are expensive, and their cost scales with your @@color:coral;base appeal score@@ (@@.appeal;@@@) before any modifiers. As you start getting more attractive, you'll want to use better and higher quality products. Right now, your base appeal score (@@.appeal;@@@) is @@.appeal;2@@, so your "Makeup" will cost @@.cash;$3@@.
<</if>>
</td>
</tr>
<<for _idx=0; _idx<_dailyItems.length;>>
<tr>
<<for _n=0; _n<5;_n++>>
<td>
<<if _idx< _dailyItems.length>>
<<ShowShopItem _dailyItems[_idx]>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
/* Long-Lasting Items */
<table id="basic">
<tr>
<td colspan=5>
@@.major;Long Lasting Items & Modifiers@@
<<if $show.notes>>
<br>Long lasting items have @@color:coral;temporary effects@@ that @@color:coral;persist for multiple days@@. As before, these items get more and more expensive the higher you climb up the vanity ladder. Right now, your @@color:coral;base appeal score@@ (@) is @@.appeal;2@@, so your "Lingerie" (@ x 8) will cost @@.cash;$16@@.
<</if>>
</td>
</tr>
<<for _idx=0; _idx<_longItems.length;>>
<tr>
<<for _n=0; _n<5;_n++>>
<td>
<<if _idx< _longItems.length>>
<<ShowShopItem _longItems[_idx]>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
/* Cursed Items */
<<if def $plot.betaCursed>>
<<if ndef $player.stopping>>
<<set $player.stopping = []>>
<</if>>
<<set _cursedItems = CursedShopList()>>
<table id="basic">
<tr>
<td colspan=4>
@@.major;Cursed Item Rental@@ - Beta
<<if $show.notes>>
<br>Mages constantly come up with contraptions to help slave owners get the most out of their slaves. As our owner is nice, you don't have to use any of these, but you can rent them if you so choose. All of them have some form of drawback, and none of them can be removed by the slave wearing them so pick wisely.
<br>''Note'': These items last until you pay for their removal.
<</if>>
</td>
</tr>
<<for _idx=0; _idx<_cursedItems.length;>>
<tr>
<<for _n=0; _n<4;_n++>>
<td>
<<if _idx< _cursedItems.length>>
<<ShowShopItem _cursedItems[_idx]>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
<</if>>
/* Permanent Items */
<table id="basic">
<tr><td colspan=4>
@@.major;Permanent Modifications@@
<<if $show.notes>>
<br>Are you nervous? Does the idea of altering your body make you feel uncomfortable? I'm sorry to break the news to you, my dear little sister, but the world of prostitution is competitive and harsh. There are at least a dozen different brothels in this city that we're competing with, and nobody wants to fuck an ugly slut. If you want to climb your way out of this shitty hellhole, you better start working hard on upgrading your body. Right now, your @@color:coral;base appeal score@@ (@) is @@.appeal;2@@, so "Cosmetic Surgery" (@ x 100) will cost @@.cash;$200@@.
<</if>>
</td></tr>
<<for _idx=0; _idx<_permItems.length;>>
<tr>
<<for _n=0; _n<4;_n++>>
<td>
<<if _idx<_permItems.length>>
<<ShowPermanent _permItems[_idx]>>
<<set _idx++>>
<</if>>
</td>
<</for>>
</tr>
<</for>>
</table>
/* Determine Next Link */
<<if $player.cash >= $shoppingCost>>
<<set $nextLink.text = "Finish Shopping">>
<<set $nextLink.dest = "Shopping to Activities">>
<<elseif ($player.cash < 0) && ($shoppingCost == 0)>>
<<set $nextLink.text = "Skip Shopping">>
<<set $nextLink.dest = "Shopping to Activities">>
<<else>>
<<set $nextLink.text = "Insufficient Cash">>
<<set $nextLink.dest = "">>
<</if>>/*
Call as <<ShowPermanent [name]>>
*/
<<widget "ShowPermanent">>
/* Image and Name */
<<if $show.images>>
<<print '<img src="images/items/'+$args[0]+'.png">'>>
<br>
<</if>>
@@.name;''$args[0]''@@
<<switch $args[0]>>
<<case "Cosmetic Surgery">>
<<set _cosSur = $player.baseAppeal * 150>>
<br>Price: @@.cash;$<<print _cosSur>>@@ (@@.appeal;@ x 150@@)
<<if $show.notes>>
<br><span class='note'> A small surgical alteration that slightly enhances your overall appearance. Includes anything from modifying bust size, fixing your teeth, to aligning the bones in your nose. Our technology is highly advanced, and nothing is impossible for our skilled team of magical surgeons. Extensive alterations are more expensive.</span>
<</if>>
<br>@@.appeal;+1 base appeal@@
<br>
<<if $player.cash >= _cosSur>>
<<link "Get Cosmetic Surgery" "Plan Shopping">>
<<set AddCounter($player.counter, "Cosmetic Surgery", 1)>>
<<set $player.cash -= _cosSur>>
<<set $player.baseAppeal += 1>>
<</link>>
<<else>>
<</if>>
<<case "Silver Potion">>
<<set _slvPtn = $player.baseAppeal * 100>>
<br>Price: @@.cash;$<<print _slvPtn>>@@ (@@.appeal;@ x 100@@)
<<if $show.notes>>
<br><span class='note'>Almost every girl dreams of these mystical silver potions. Although cosmetic surgery can achieve the same result, these silver potions are 100% magical. You simply need to imagine your desired look as you drink the potion, and your body will transform a tiny bit. There are diminishing returns with each subsequent dose.</span>
<</if>>
<br>@@.appeal;+1 base appeal@@
<br>@@color:pink;Horny@@ (+6 days)
<br>
<<if $player.cash >= _slvPtn>>
<<link "Drink Silver Potion" "Plan Shopping">>
<<set _e = GenerateEffect("Horny")>>
<<set _e.remain = 6>>
<<AddEffect $player _e true>>
<<set AddCounter($player.counter, "Silver Potion", 1)>>
<<set $player.cash -= _slvPtn>>
<<set $player.baseAppeal += 1>>
<</link>>
<<else>>
<</if>>
<<case "Black Potion">>
<br>Price: @@.cash;$1000@@
<<if $show.notes>>
<br><span class='note'> This black potion is insidious, and it will slowly alter your personality. They are designed to mold the ideal sex slave, and customers love getting the perfect submissive girl of their fantasies. Brainwashing potions are a major reason why sex slaves are more popular than regular prostitutes. But consider this very carefully. Is it worth it?</span>
<</if>>
<br>@@.appeal;+1 base appeal@@
<br>@@.degrade;Uninhibited@@ (+9 days)
<br>
<<if $player.cash >= 1000>>
<<link "Drink Black Potion" "Plan Shopping">>
<<set _e = GenerateEffect("Uninhibited")>>
<<set _e.remain = 9>>
<<AddEffect $player _e true>>
<<set AddCounter($player.counter, "Black Potion", 1)>>
<<set $player.cash -= 1000>>
<<set $player.baseAppeal += 1>>
<</link>>
<<else>>
<</if>>
<<case "Fetish Potion">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<br><span class='note'>This variant of the black potion will subtly alter your mind to be better at sex. You simply imagine a sex act as you drink the potion, and the potion will brainwash you into being a better performer of that act. Its training in a bottle effect would be more widespread, except it only works with sex acts. And it may turn you into a uninhibited nympho.</span>
<</if>>
<br>@@.skill;+25 skill experience@@
<br>@@.degrade;Uninhibited@@ (+5 days)
<br>
<<if ndef $menus.fetPot>>
<<set $menus.fetPot = "">>
<</if>>
<<set _fetPot = {skill:""}>>
<<listbox "$menus.fetPot" autoselect>>
<<optionsfrom SexSkills()>>
<<optionsfrom KinkSkills()>>
<</listbox>>
<br>
<<if $player.cash >= 150>>
<<link "Drink Fetish Potion" "Plan Shopping">>
<<set _e = GenerateEffect("Uninhibited")>>
<<set _e.remain = 5>>
<<AddEffect $player _e true>>
<<set AddCounter($player.counter, "Fetish Potion", 1)>>
<<set $player.cash -= 150>>
<<set AddSkill($player.skills, {skill:$menus.fetPot}, 25)>>
<</link>>
<<else>>
<</if>>
<<case "Fetish Implant">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<br><span class='note'>There are a lot of perverts who are interested in renting sex slaves. It goes without saying that there are many twisted body modifications on the market. For instance, teeth removal is a popular alteration, since it guarantees that a sex slave will never bite. Some patrons just love using mouth pussies, so would you ever consider it?</span>
<</if>>
<br>@@color:skyblue;+2 skill bonus@@
<br>
<<if ndef $menus.fetImp>>
<<set $menus.fetImp = "">>
<</if>>
<<listbox "$menus.fetImp" autoselect>>
<<optionsfrom SexSkills()>>
<<optionsfrom KinkSkills()>>
<</listbox>>
<br>
<<if $player.cash >= 150>>
<<link "Get A Fetish Implant" "Plan Shopping">>
<<set AddCounter($player.counter, "Fetish Implant", 1)>>
<<set $player.cash -= 150>>
<<set AddSingleSkillBonus($player.skills, $menus.fetImp, 2)>>
<</link>>
<<else>>
<</if>>
<<case "Basic Brainwashing">>
<br>Price: @@.cash;$100@@
<<if $show.notes>>
<br><span class='note'>Our Owner is kind and doesn't force us to get brainwashed. But if you need help accepting your place as a sex slave, you could always get brainwashed. Remember, people like sex slaves because they aren't allowed to say no to anything. With this, you won't want to.</span>
<</if>>
<br>@@.appeal;+1 Appeal@@
<br>@@.degrade;Lowers Inhibitions@@
<br>
<<if $player.cash >= 100>>
<<link "Get Brainwashed" "Plan Shopping">>
<<set _e = GenerateEffect("Basic Brainwashing")>>
<<AddEffect $player _e>>
<<set $plot.brainwash = 1>>
<<set $player.cash -= 100>>
<</link>>
<<else>>
<</if>>
<<case "Advanced Brainwashing">>
<br>Price: @@.cash;$200@@
<<if $show.notes>>
<br><span class='note'>If removing your ability to say no isn't enough, you can get a second round of brainwashing. Turn yourself into a degraded little slut who will do anything requested of her. Yeah, anything. You'll be the filthy sex whore I always knew you could be.</span>
<</if>>
<br>@@.appeal;+1 Appeal@@
<br>@@.degrade;Lowers Inhibitions@@
<br>
<<if $player.cash >= 200>>
<<link "Get Brainwashed" "Plan Shopping">>
<<set _e = GenerateEffect("Advanced Brainwashing")>>
<<AddEffect $player _e>>
<<set $plot.brainwash = 2>>
<<set $player.cash -= 200>>
<</link>>
<<else>>
<</if>>
<<case "Womb Tattoo">>
<br>Price: @@.cash;$50@@
<<if $show.notes>>
<br><span class='note'>
</span>
<</if>>
<br>@@.appeal;+1 Appeal@@
<br>@@.degrade;Lowers Inhibitions@@
<br>
<<if $player.cash >= 50>>
<<link "Get Womb Tattoo" "Plan Shopping">>
<<set _e = GenerateEffect("Womb Tattoo")>>
<<AddEffect $player _e>>
<<set $player.cash -= 50>>
<</link>>
<<else>>
<</if>>
<<case "Present">>
<br>Price: @@.cash;$500@@
<<if $show.notes>>
<br><span class='note'>Presents are useful, because we should work together to raise our Brothel Fame so we can attract better customers. And attracting better customers is the only way we'll find kind owners to buy us.</span>
<</if>>
<br>@@.appeal;+1 NPC appeal@@
<br>
<<if ndef $menus.present>>
<<set $menus.present = "">>
<</if>>
<<listbox "$menus.present" autoselect>>
<<optionsfrom GirlsList($girls)>>
<</listbox>>
<br>
<<if $player.cash >= 500>>
<<link "Buy A Present" "Plan Shopping">>
<<set $player.cash -= 500>>
<<for _i=0; _i<$girls.length; _i++>>
<<if $girls[_i].name == $menus.present>>
<<set $girls[_i].appeal += 1>>
<<break>>
<</if>>
<</for>>
<</link>>
<<else>>
<</if>>
<<case "Fix Vocal Cords">>
<br>Price: @@.cash;$500@@
<<if $show.notes>>
<br><span class='note'>It's hard to call yourself a decent prostitute if you cannot speak! It may be a little pricey, but finding a mage to undo the damage that left you mute is highly recommended.</span>
<</if>>
<br>@@color:skyblue;Removes Mute Effect@@
<br>
<<if $player.cash >= 500>>
<<link "Fix Your Vocal Cords" "Plan Shopping">>
<<set $player.cash -= 500>>
<<RemoveEffect $player "Mute">>
<</link>>
<<else>>
<</if>>
<<case "Repay Vivi">>
<br>Price: @@.cash;$50@@
<<if $show.notes>>
<br><span class='note'>Pay off the loan Vivi gave you on your first day. It'll show her you are willing to work together to attract better clients.</span>
<</if>>
<br>@@.cash;Repays Vivi@@
<br>
<<if $player.cash >= 50>>
<<link "Repay Vivi" "Repay Vivi">>
<<set $player.cash -= 50>>
<<set $plot.repaidVivi = 1>>
<</link>>
<<else>>
<</if>>
<<case "Skill Conversion">>
<br>Price: @@.cash;$100@@
<<if $show.notes>>
<span class="note">
<br>Let Nina use her power on you to convert your @@.skill;experience@@ into @@color:skyblue;talent@@. Just be careful she doesn't mess up and make you forget some significant memory, although as a sex slave maybe forgetting everything is a good thing.
</span>
<</if>>
<br>@@.skill;Lowers experience@@
<br>@@color:skyblue;Raises skill modifier@@
<br>
<<if ndef $menus.skillconversion>>
<<set $menus.skillconversion = "">>
<</if>>
<<set _convList = SkillConversionList($player.skills)>>
<<if _convList.length >= 1>>
<<listbox "$menus.skillconversion" autoselect>>
<<optionsfrom _convList>>
<</listbox>>
<br>
<<if $player.cash >= 100>>
<<link "Get Skill Converted" "Plan Shopping">>
<<set $player.cash -= 100>>
<<set _exp = GetSkillExp($player.skills, {skill:$menus.skillconversion})>>
<<set _mod = Math.floor(BonusFromSkill(_exp) / 2)>>
<<set _exp = (_mod * _mod * 4)>>
<<set AddSingleSkillBonus($player.skills, $menus.skillconversion, _mod)>>
<<set AddSkill($player.skills, {skill:$menus.skillconversion}, -_exp)>>
<</link>>
<<else>>
<</if>>
<</if>>
<<case "Angel Hair">>
<br>Price: @@.cash;$600@@
<<if $show.notes>>
<span class="note">
<br>Angels are cheaters, they have self brushing and styling hair. As opposed to being mad about it, get your hair replaced with hair ... donated by an Angel. Now you'll never need to brush your hair ever again.
</span>
<</if>>
<br>@@.appeal;+2 Appeal@@
<br><span class="note">Permanent: Hair | Salon Visit</span>
<br>
<<if $player.cash >= 600>>
<<link "Get Angel Hair" "Plan Shopping">>
<<set _e = GenerateEffect("Angel Hair")>>
<<AddEffect $player _e>>
<<set $player.cash -= 600>>
<</link>>
<<else>>
<</if>>
<<case "Nymph Skin">>
<br>Price: @@.cash;$350@@
<<if $show.notes>>
<span class="note">
<br>Get your skin blessed into perfection by Nymphs. Now you too can have perfect skin even after spending all day frolicing in nature. The blessing does have a side effect, you'll find anything more than the skimpiest of lingerie unbearable to wear.
</span>
<</if>>
<br>@@.appeal;+3 Appeal@@
<br><span class="note">Permanent: Bath & Wash | Skincare | Clothing</span>
<br>
<<if $player.cash >= 350>>
<<link "Get Nymph Skin" "Plan Shopping">>
<<set _e = GenerateEffect("Nymph Skin")>>
<<AddEffect $player _e>>
<<set $player.cash -= 350>>
<</link>>
<<else>>
<</if>>
<<case "Satyr Blood">>
<br>Price: @@.cash;$250@@
<<if $show.notes>>
<span class="note">
<br>Satyr's are legendary revelers, always down for a good drink or fuck. This modification makes it so your body produces Alcohol and Aphrodisiacs, so you'll always be tipsy and horny.
</span>
<</if>>
<br>@@.appeal;+2 Appeal@@
<br>@@color:pink;Always Horny@@
<br>@@.degrade;Lowers Inhibitions@@
<br><span class="note">Permanent: Aphrodisiacs | Alcohol</span>
<br>
<<if $player.cash >= 250>>
<<link "Get Satyr Blood" "Plan Shopping">>
<<set _e = GenerateEffect("Satyr Blood")>>
<<AddEffect $player _e>>
<<set $player.cash -= 250>>
<</link>>
<<else>>
<</if>>
<<case "Slime Infusion">>
<br>Price: @@.cash;$750@@
<<if $show.notes>>
<span class="note">
<br>Slime girls are popular for their orifices, as they are inherently wet and can take any kind of insertion and still be tight. With selective infusion of slime, you too can have such orifices. Just make sure you have plenty of spare underwear.
</span>
<</if>>
<br>@@.appeal;+2 Appeal@@
<br>@@.heal;Heals Physical@@
<br><span class="note">Permanent: Always Wet | Stretchy | Tight</span>
<br>
<<if $player.cash >= 750>>
<<link "Get Slime Infusion" "Plan Shopping">>
<<set _e = GenerateEffect("Slime Infusion")>>
<<AddEffect $player _e>>
<<set $player.cash -= 750>>
<</link>>
<<else>>
<</if>>
<<case "Waist Narrowing">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print WaistDesc($player.waist).toLowerCase()>> waist narrowed to a <<print WaistDesc($player.waist - 1).toLowerCase()>> waist.
</span>
<</if>>
<br>@@color:skyblue;-1 Waist Size@@
<br>
<<if $player.cash >= 150>>
<<link "Get Waist Narrowing" "Plan Shopping">>
<<set $player.waist -= 1>>
<<set $player.cash -= 150>>
<</link>>
<<else>>
<</if>>
<<case "Waist Widening">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print WaistDesc($player.waist).toLowerCase()>> waist enlarged to a <<print WaistDesc($player.waist + 1).toLowerCase()>> waist.
</span>
<</if>>
<br>@@color:skyblue;+1 Waist Size@@
<br>
<<if $player.cash >= 150>>
<<link "Get Waist Widening" "Plan Shopping">>
<<set $player.waist += 1>>
<<set $player.cash -= 150>>
<</link>>
<<else>>
<</if>>
<<case "Hip Narrowing">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print HipsDesc($player.hips).toLowerCase()>> hips narrowed to a <<print HipsDesc($player.hips - 1).toLowerCase()>> hips.
</span>
<</if>>
<br>@@color:skyblue;-1 Hip Size@@
<br>
<<if $player.cash >= 150>>
<<link "Get Hip Narrowing" "Plan Shopping">>
<<set $player.hips -= 1>>
<<set $player.cash -= 150>>
<</link>>
<<else>>
<</if>>
<<case "Hip Widening">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print HipsDesc($player.hips).toLowerCase()>> hips widened to a <<print HipsDesc($player.hips + 1).toLowerCase()>> hips.
</span>
<</if>>
<br>@@color:skyblue;+1 Hip Size@@
<br>
<<if $player.cash >= 150>>
<<link "Get Hip Widening" "Plan Shopping">>
<<set $player.hips += 1>>
<<set $player.cash -= 150>>
<</link>>
<<else>>
<</if>>
<<case "Height Reduction">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print HeightDesc($player.height).toLowerCase()>> height reduced to <<print HeightDesc($player.height - 1).toLowerCase()>>.
</span>
<</if>>
<br>@@color:skyblue;-1 Height@@
<br>
<<if $player.cash >= 150>>
<<link "Get Height Reduction" "Plan Shopping">>
<<set $player.height -= 1>>
<<set $player.cash -= 150>>
<</link>>
<<else>>
<</if>>
<<case "Height Increase">>
<br>Price: @@.cash;$150@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print HeightDesc($player.height).toLowerCase()>> height increased to <<print HeightDesc($player.height + 1).toLowerCase()>>.
</span>
<</if>>
<br>@@color:skyblue;+1 Height@@
<br>
<<if $player.cash >= 150>>
<<link "Get Height Increase" "Plan Shopping">>
<<set $player.height += 1>>
<<set $player.cash -= 150>>
<</link>>
<<else>>
<</if>>
<<case "Breast Reduction">>
<br>Price: @@.cash;$100@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print BoobDesc($player.breast).toLowerCase()>> boobs reduced to <<print BoobDesc($player.breast - 1).toLowerCase()>>.
</span>
<</if>>
<br>@@color:skyblue;-1 Breast Size@@
<br>
<<if $player.cash >= 100>>
<<link "Get Breast Reduction" "Plan Shopping">>
<<set $player.breast -= 1>>
<<set $player.cash -= 100>>
<</link>>
<<else>>
<</if>>
<<case "Breast Enlargement">>
<br>Price: @@.cash;$100@@
<<if $show.notes>>
<span class="note">
<br>Get your <<print BoobDesc($player.breast).toLowerCase()>> boobs increased to <<print BoobDesc($player.breast + 1).toLowerCase()>>.
</span>
<</if>>
<br>@@color:skyblue;+1 Breast Size@@
<br>
<<if $player.cash >= 100>>
<<link "Get Breast Enlargement" "Plan Shopping">>
<<set $player.breast += 1>>
<<set $player.cash -= 100>>
<</link>>
<<else>>
<</if>>
<<case "Become Futanari">>
<br>Price: @@.cash;$250@@
<<if $show.notes>>
<span class="note">
<br>The only way you'll get your dick back. Hey, it's not all bad, some clients prefer futas.
</span>
<</if>>
<br>@@color:skyblue;Become Futanari@@
<br>
<<if $player.cash >= 250>>
<<link "Become Futanari" "Plan Shopping">>
<<set $player.gender = GenderFuta()>>
<<set $player.cash -= 250>>
<</link>>
<<else>>
<</if>>
<<case "Become Female">>
<br>Price: @@.cash;$250@@
<<if $show.notes>>
<span class="note">
<br>What, being a futa isn't your thing? Well, back to being a slave girl for you!
</span>
<</if>>
<br>@@color:skyblue;Become Female@@
<br>
<<if $player.cash >= 250>>
<<link "Become Female" "Plan Shopping">>
<<set $player.gender = GenderFemale()>>
<<set $player.cash -= 250>>
<</link>>
<<else>>
<</if>>
<<default>>
OOPS!
<br>$args[0] Not Found
<</switch>>
<</widget>>/*
Call as <<ShowShopItem [name]>>
*/
<<widget "ShowShopItem">>
<<set $newItem = GenerateItem($args[0])>>
<<DisplayItem $newItem>>
<br>
<<capture $newItem>>
<<set _remain = HasItem($player, $args[0])>>
<<if $player.itemBlock.includes($args[0])>>
Block: <<ItemBlockReason $args[0]>>
<<elseif ($player.flags.includes("no clothes")) && (def $newItem.clothing)>>
Clothing privileges revoked
<<elseif _remain>>
<<if _remain == -1>>
<<if $player.stopping.includes($newItem.name)>>
<<link "Keep Equipped" "Plan Shopping">>
<<set $player.stopping.delete($newItem.name)>>
<<set $shoppingCost -= $newItem.price>>
<</link>>
<<elseif $player.cash >=($newItem.price + $shoppingCost)>>
<<link "Get Removed" "Plan Shopping">>
<<set $player.stopping.push($newItem.name)>>
<<set $shoppingCost += $newItem.price>>
<</link>>
<<else>>
@@color:gray;Cannot Afford Removal@@
<</if>>
<<else>>
@@color:coral;Have _remain Days Worth@@
<</if>>
<<elseif BuyingItem($player, $args[0])>>
<<link "Stop Buying" "Plan Shopping">>
<<StopBuyingItem $newItem.name>>
<</link>>
<<else>>
<<if $player.cash >= ($newItem.price + $shoppingCost)>>
<<link "Start Buying" "Plan Shopping">>
<<StartBuyingItem $newItem>>
<</link>>
<<else>>
@@color:gray;Cannot Afford@@
<</if>>
<</if>>
<</capture>>
<</widget>>/*
Call as <<StartBuyingItem [item]>>
*/
<<widget "StartBuyingItem">>
<<set $shoppingCost += $args[0].price>>
<<if def $args[0].appeal>>
<<set $player.tempAppeal += $args[0].appeal>>
<</if>>
<<if def $args[0].flag>>
<<set $player.flags.push($args[0].flag)>>
<</if>>
<<if def $args[0].skillBlock>>
<<set $player.skillBlock.push($args[0].skillBlock)>>
<<set $player.skillBlock = $player.skillBlock.flat()>>
<</if>>
<<set $player.buying.push($args[0])>>
<</widget>>
/*
Call as <<StopBuyingItem [name]>>
*/
<<widget "StopBuyingItem">>
<<for _sbi=0; _sbi<$player.buying.length; _sbi++>>
<<if $player.buying[_sbi].name == $args[0]>>
<<set _sbitem = $player.buying[_sbi]>>
<<set $shoppingCost -= _sbitem.price>>
<<if def _sbitem.appeal>>
<<set $player.tempAppeal -= _sbitem.appeal>>
<</if>>
/* Flag */
<<if def _sbitem.flag>>
<<for _sb=0; _sb<$player.flags.length; _sb++>>
<<if $player.flags[_sb] == _sbitem.flag>>
<<set $player.flags.deleteAt(_sb)>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Skill Block */
<<if def _sbitem.skillBlock>>
<<for ;_sbitem.skillBlock.length>0;>>
<<for _re=0; _re<$player.skillBlock.length; _re++>>
<<if $player.skillBlock[_re] == _sbitem.skillBlock[0]>>
<<set $player.skillBlock.deleteAt(_re)>>
<<set _sbitem.skillBlock.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
<<set $player.buying.deleteAt(_sbi)>>
<<break>>
<</if>>
<</for>>
<</widget>>
/*
Call as <<RemovedOwnedItem [name]>>
*/
<<widget "RemovedOwnedItem">>
<<for _sbi=0; _sbi<$player.items.length; _sbi++>>
<<if $player.items[_sbi].name == $args[0]>>
<<set _sbitem = $player.items[_sbi]>>
<<if def _sbitem.appeal>>
<<set $player.tempAppeal -= _sbitem.appeal>>
<</if>>
/* Flags */
<<if def _sbitem.flag>>
<<for _sb=0; _sb<$player.flags.length; _sb++>>
<<if $player.flags[_sb] == _sbitem.flag>>
<<set $player.flags.deleteAt(_sb)>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Skill Block */
<<if def _sbitem.skillBlock>>
<<for ;_sbitem.skillBlock.length>0;>>
<<for _re=0; _re<$player.skillBlock.length; _re++>>
<<if $player.skillBlock[_re] == _sbitem.skillBlock[0]>>
<<set $player.skillBlock.deleteAt(_re)>>
<<set _sbitem.skillBlock.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
<<set $player.items.deleteAt(_sbi)>>
<<break>>
<</if>>
<</for>>
<</widget>><table><tr>
<td>
<<if $show.images>>
<img src="images/Vivi Intro.png">
<</if>>
</td>
<td>
Oh? You're paying me back! <<if $day <= 7>>That was faster than I expected!<</if>> I guess this means you understand the basics of your new life. I suppose this means as your older sister I should start teaching you about some of the more... @@color:coral;advanced things we can buy@@.
<br><br>Other than just making ourselves more visually appealing, we can buy things to improve our performance in other ways. Like @@color:coral;aphrodisiacs@@ to help us behave like we're enjoying ourselves. Some of these are rather expensive, so you'll have to judge what to spend on yourself.
/*
<br><br>If you really want some extra cash quick, our Owner has some offers you could consider. A warning about those offers, they are all @@color:coral;permanent@@ and will mess with your ability to have a normal life.
*/
<br><br>Remember, we should @@color:coral;work together@@ if we want to make it out of this. If you want any purchase recommendations, just ask your big sis. I'll point you in the correct direction.
</td></tr></table>
<br><br><<include "Plan Shopping">><<if $show.images>>
<img src="images/Splash Header.png">
<br>
<</if>>
@@font-size:200%;''Prostitute's Wish''@@:
<br> Original CYOA by @@color:lightgray; //anonekama//@@
<br> Twine Conversion by @@color:lightgray; //DrNoOne//@@
<br> Twine v. <<print GameVersion()>>
<br><br>''Disclaimer'': This game is a work of fiction designed for adults. It should not be played by anyone that is not of the legal age to view such materials.
<br><table id="basic"><tr><td>This RYOA is not a power fantasy. The story is intended as a semi-realistic depiction of prostitution and includes @@color:darkred;grim depictions@@ of unpleasant content (i.e. assault, slavery, rape, mutilation, misogyny). It is designed to be an @@color:darkred;immersive experience@@ (from the slave's perspective) rather than erotic. </td></tr></table>
<br>
<<link "Intro" "Game Intro">>
<</link>>
<br>
Test/Cheat Start:
<<link "Testing Start" "Beta Start">>
<</link>>
<br>
<<link "Test Rules Page" "Evening Rules">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
<hr>
Version 0.3.0 Changes:
<ul>
<li>New Stats - @@.heal;Physical Ailment@@ & @@.heal;Mental Ailment@@: Types of effects whose duration can be altered by using @@.heal;Healing Magic@@ and other effects.</li>
<li>New Stat - @@.degrade;Very Degrading@@: Some activities are now considered very degrading. They count twice towards degrading activity requirements and allowances.</li>
<li>New Stat - @@.appeal;Opinion@@: Not all clients have the same opinion on how the player looks. Opinion is a representation of what the client thinks of the player. Is replaces @@.appeal;Appeal@@ for client matching and performance payments. Hearts give +2 opinion.</li>
<li>Made some changes to the CSS. If anything looks really wrong, let me know.</li>
<li>Added some end of day plot events. This plus Ailments means every Item & Activity has a reason.</li>
<li>Changed how the Cheat/Beta Tests work. Now lets you set starting money and appeal, as well as pick which betas to use.</li>
<li>Added generic client support. They each have 3 tasks to request (1 sex, 1 kink, 1 random). They are all listed after the Named clients, even if they have higher fame. </li>
<li>Added client tag support. Generic clients have 1 randomly selected tag. Current tag options (green = good, red = bad):
<<TagDescriptionList>>
</li>
<li>Added client kink support. Kinks increase the client's opinion of the player by varying amounts. Generic clients have one or two randomly selected kinks. Current kink options:
<<KinkDescriptionList>>
</li>
<li>Added (0.3.0b): Added a link to the evening rules page in the side bar. Also added tag and kink descriptions to the end of the client table, even though the named clients don't have kinks and tags yet.</li>
<li>Changed (0.3.0c): Lowered the pay from Sexual activities. About -5$ each.</li>
<li>Fixed (0.3.0c): Activities that selected a skill from a menu no longer show (any skill) instead of the skill being trained. This appears to have been a purely visual bug.</li>
<li>Fixed (0.3.0d): Brothel Fame of 150+ and the female client list now function properly.</li>
<li>Fixed (0.3.0d): Appeal altering effects no longer give the opposite of their effect on the day their duration expires.</li>
<li>Added (0.3.0d): Added Tag and Kink Description lists to the bottom of the client selection pages.</li>
<li>Added (0.3.0d): Two new Beta tests, Day Of Week and Stats. Day of Week alters the sidebar and has a bugged activity that shows up only on Mondays. Stats is a rough idea of a more flexible character appearance system, it has a bunch of imageless permanent modifications and adds some kinks to the generic clients.</li>
</ul>
/*
Version 0.3.0 Bug Notes:
<ul>
<li>Known Bug: Female clients can get you pregnant.</li>
</ul>
/**/
<<link "Prior Changes" "Prior Changes">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
<br><br>
Content Requests - While I still have ideas for things to add and changes to make, getting content suggestions from players would be useful for fleshing out the game. So if you have suggestions for new items/activities/skills/kinks/tags/clients, let me know.
<br><br>
DEBUG:
<br>
<<link "List Clients" "Debug Client List">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
|
<<link "List Skills" "Debug Skill List">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
|
<<link "Clients CR Info" "Debug Client CR info">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
|
<<link "Test Generic Clients" "Debug Test Generic Clients">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
<br>
<<link "List Items" "Debug Item Lists">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
<br>
<<link "List Activities" "Debug Activity Lists">>
<<set $returnTo = "Story Splash">>
<<set $returnText = "Return">>
<</link>>
/*
Image Notes
Activity - 250 x 275
Client - 200 x 200 (can be narrower)
Items - 150 x 150 (can be narrower)
Cursed - 200 x 200
Permanents-200 x 275
Girls - 250 x 353
Upload Images:
general -
items -
activities -
client -
Work to do
Today's Work
- opinion pairing work
- kink preliminary
- percived appeal (opinion)
e More Degrading activities
e More Sexual activities
- switch from using .note to <span class="note">, so I can color the note text if needed.
- make a "Night Visitors" & "Sex & Service" & "Payments" page(s) to explain all the mechanics
- Soothing/Relaxing - recover from Mental/Physical healables faster
Consider
c Punishments - have a page showing them all?
c In Game Page that explains the client service math?
Ideas
Daily/Weekly Items
UI
Engine
Activities
Clients
c Keywords - ~3 keywords that allow for more dynamic clients.
- Cheap - -1 Great Success pay
- Complainer - +1 punishment tier
- Empathetic - Blocked skills aren't failures or punishments
- Forgiving - -1 punishment tier
- Generous - 1 normal success counts as great (for pay)
- Horny - +1 task performed
- Perfectionist - +1 punishment tier from a non-great success (wording)
- Sloth - -1 task performed
Game Text
Images
Balnce Change Ideas
Notes:
- (Anything) gives a random sexSkill
- (Random) gives a random skill
Girls:
Ena - Pramanix (arknights)
Nina - Witch Mercy (overwatch)
*//* Variable Initialization */
<<set $ver = GameVersion()>>
<<set $returnTo = "">>
<<set $returnText = "">>
<<set $nextLink = {dest:"", text:""}>>
/* QoL variables */
<<set $type = {any:0, sex:1, kink:2, service:3, special:4}>>
<<set $state = {intro:0, morning:1, day:2, evening:3, night:4}>>
<<set $gender = {male:0, female:1}>>
/* Variable Init */
<<set $brothelFame = 0>>
<<set $girls = [
{name:"Vivi", appeal:30},
{name:"Mauve", appeal:20},
{name:"Ena", appeal:12}
]>>
<<set $guests = []>>
<<set $gameState = $state.intro>>
<<set $day = 0>>
<<set $shoppingCost = 0>>
<<set $activityCost = 0>>
<<set $activitySanity = 0>>
<<set $visitorCount = 4>>
<<set $minID = 0>>
<<set $punishment = 0>>
<<set $numActivity = 3>>
<<set $clientGenders = [GenderMale(), GenderMale(), GenderFemale()]>>
<<set $visitors = []>>
<<set $tasks = []>>
<<set $show = {images:1, notes:1, blocked:1}>>
<<set $menus = {}>>
<<set $plot = {}>>
/* Init Player */
<<set $player = {
cash:0,
baseAppeal:2,
tempAppeal:0,
appeal:2,
startingAppeal:2,
gender:$gender.female,
sanity:100,
maxSanity:100,
items:[],
buying:[],
stopping:[],
skills:[],
activities:[],
effect:[],
flags:[],
counter:[],
skillBlock:[],
itemBlock:[]
}>>
<<set _e = GenerateEffect("Mute")>>
<<AddEffect $player _e>>
/* TEMP */
<<set $clients = GenerateClientArray(0)>>
/*
<<InitClients>>
<<InitItems>>
<<PrepareItemLists>>
<<CalculatePrices>>
/*
<<InitActivities>>
<<PrepareActivityLists>>
*//* FinishActivities */
<<PerformActivities>>
<<GenerateBrothelVisitors>>
<<MatchMoreAppealingGirls>>
/* Include Plan Evening */
<<include "Plan Evening">>/*Variable Init */
<<set _repaidVivi = false>>
<<set _addGirl = {}>>
<<set _clientArray = 0>>
<<set _beta = {}>>
__''Starting Cash''__:
<br>
<<numberbox "$player.cash" 50>>
<br>
<label><<checkbox "_repaidVivi" false true>>Already Repaid Vivi</label>
<br><br>
__''Starting Base Appeal''__:
<br>
<<numberbox "$player.baseAppeal" 2>>
<br><br>
__''Additional Girls''__
<br>
<label><<checkbox "_addGirl.Nina" false true>>Nina (Appeal 20)</label>
<br>
<label><<checkbox "_addGirl.Meat" false true>>Meat (Appeal 1)</label>
<br><br>
__''Client Set''__
<br>
<<listbox "_clientArray" autoselect>>
<<option "Default" 0>>
<<option "Female" 1>>
<</listbox>>
<br><br>
__''Item Betas''__
<br>
<label><<checkbox "_beta.permanent" false true>>Permanents</label>
/*
<br>
<label><<checkbox "_beta.cursed" false true>>Cursed Items</label>
/**/
<br><br>
__''Other Betas''__
<br>
<label><<checkbox "_beta.dayofweek" false true>>Day Of Week</label> - No content here currently.
<br>
<label><<checkbox "_beta.stats" false true>>Expanded Stats</label> - contains lots of imageless things to buy.
<br><br>
<<link "Start Playing" "Start New Day">>
/* Starting Money */
<<if _repaidVivi>>
<<set $plot.repaidVivi = 1>>
<</if>>
/* Additional Girls */
<<if _addGirl.Nina>>
<<set $plot.ninaAdded = 1>>
<<set $girls.push({
name:"Nina", appeal:20
})>>
<</if>>
<<if _addGirl.Meat>>
<<set $girls.push({
name:"Meat", appeal:1
})>>
<</if>>
<<set $girls = $girls.sort(function(a, b)
{ if(a.appeal > b.appeal) return -1; if(a.appeal < b.appeal) return 1; return 0;})>>
/* Client Set */
<<if _clientArray>>
<<set $clients = GenerateClientArray(_clientArray)>>
<</if>>
/* Item Betas */
<<if _beta.permanent>>
<<set $plot.betaPermanents = 1>>
<</if>>
<<if _beta.cursed>>
<<set $plot.betaCursed = 1>>
<</if>>
/* Other Betas */
<<if _beta.dayofweek>>
<<set $plot.betaDOW = 1>>
<</if>>
<<if _beta.stats>>
<<set $plot.betaStats = 1>>
<<set $player.breast = 1>>
<<set $player.waist = 4>>
<<set $player.hips = 2>>
<<set $player.height = 2>>
<</if>>
<</link>>/*
Call as <<CalculateBrothelFame>>
Assumes $player.appeal is correct.
*/
<<widget "CalculateBrothelFame">>
<<set $brothelFame = $player.appeal>>
<<for _i=0; _i<$girls.length; _i++>>
<<set $brothelFame += $girls[_i].appeal>>
<</for>>
<</widget>>This page is not finished. But it is getting better.
<br>
<br>Total Appeal: $player.appeal
<br>Temporary Appeal: $player.tempAppeal
<br>Base Appeal: $player.baseAppeal
<br> Starting Appeal: 2
<br> Ena's Gift: <<if $player.enaGift == 1>>1<<else>>0<</if>>
<br> Cosmetic Surgeries: <<print GetCounter($player.counter, "Cosmetic Surgery")>>
<br> Silver Potions: <<print GetCounter($player.counter, "Silver Potion")>>
<br> Black Potions: <<print GetCounter($player.counter, "Black Potion")>>
<<if def $plot.betaStats>>
<br><br>Stats - WIP:
<br> Breast: <<print BoobDesc($player.breast)>> $player.breast
<br> Waist: <<print WaistDesc($player.waist)>> $player.waist
<br> Hips: <<print HipsDesc($player.hips)>> $player.hips
<br> Height: <<print HeightDesc($player.height)>> $player.height
<br> Gender: <<print GenderText($player.gender)>> <<print GenderSymbol($player.gender)>>
<</if>>
<br>
<br>Effects:
<<for _i=0; _i<$player.effect.length; _i++>>
<br> $player.effect[_i].name
<<if def $player.effect[_i].remain>>
- @@color:coral;Lasts $player.effect[_i].remain Days@@
<</if>>
<<if def $player.effect[_i].physAilment>>
- @@.heal;Physical Ailment@@
<</if>>
<<if def $player.effect[_i].mentAilment>>
- @@.heal;Mental Ailment@@
<</if>>
<<if def $player.effect[_i].effect>>
- $player.effect[_i].effect
<</if>>
<</for>>
<br>
<br>Skills:
<<for _i=0; _i<$player.skills.length; _i++>>
<br> <<print SkillIconName($player.skills[_i])>> +<<print (BonusFromSkill($player.skills[_i].exp) + $player.skills[_i].bonus)>>
($player.skills[_i].exp exp<<if $player.skills[_i].bonus >= 1>>, +<<print $player.skills[_i].bonus>> bonus<</if>>)
<<if ndef $player.skills[_i].skill>>
- This is a bug
<</if>>
<</for>>
<br>
<br>Owned Items:
<<for _i=0; _i<$player.items.length; _i++>>
<br> $player.items[_i].name
<<if def $player.items[_i].effect>>
- @@.appeal;$player.items[_i].effect@@
<</if>>
<<if def $player.items[_i].effectNote>>
- @@.appeal;$player.items[_i].effectNote@@
<</if>>
<<if $player.items[_i].remain>>
- @@color:coral;Have $player.items[_i].remain Days Worth@@
<</if>>
<</for>>
<<if $player.buying.length >= 1>>
<br><br>Planned Purchases:
<<for _i=0; _i<$player.buying.length; _i++>>
<br> $player.buying[_i].name
<<if def $player.buying[_i].effect>>
- @@.appeal;$player.buying[_i].effect@@
<</if>>
<<if def $player.buying[_i].effectNote>>
- @@.appeal;$player.buying[_i].effectNote@@
<</if>>
<<if $player.buying[_i].duration >= 2>>
- @@color:coral;Will Last $player.buying[_i].duration Days@@
<</if>>
<</for>>
<</if>>
<br>
<br>Planned Activities:
<<for _i=0; _i<$player.activities.length; _i++>>
<br>
$player.activities[_i].name - $player.activities[_i].effect
<</for>>
<br><br>Flags - Hidden In the Future:
<<for _i=0; _i<$player.flags.length; _i++>>
<br>_i $player.flags[_i]
<</for>>
<<if $player.skillBlock.length >= 1>>
<br><br>Blocked Skills:
<br>
<<for _i=0; _i<$player.skillBlock.length; _i++>><<if _i>=1>>,<</if>>
$player.skillBlock[_i]<</for>>
<</if>>
<<if $player.itemBlock.length >= 1>>
<br><br>Blocked Items:
<br>
<<for _i=0; _i<$player.itemBlock.length; _i++>><<if _i>=1>>,<</if>>
$player.itemBlock[_i]<</for>>
<</if>>
<br><br>Counters:
<<for _i=0; _i<$player.counter.length; _i++>>
<br> $player.counter[_i].name $player.counter[_i].val
<</for>>/**
Call as <<AddEffect [player] [effect] opt:[extend]>>
*/
<<widget "AddEffect">>
<<set _found = false>>
<<if $args[2]>>
<<for _ae=0; _ae< $args[0].effect.length; _ae++>>
<<if $args[0].effect[_ae].name == $args[1].name>>
<<if def $args[0].effect[_ae].remain>>
<<if def $args[1].remain>>
<<set $args[0].effect[_ae].remain += $args[1].remain>>
<<else>>
<<set $args[0].effect[_ae].remain = undefined>>
<</if>>
<</if>>
<<set _found = true>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if !_found>>
<<set $args[0].effect.push($args[1])>>
/* Appeal */
<<if def $args[1].appeal>>
<<set $args[0].tempAppeal += $args[1].appeal>>
<<set $args[0].appeal += $args[1].appeal>>
<</if>>
/* Base Appeal */
<<if def $args[1].baseAppeal>>
<<set $args[0].baseAppeal += $args[1].baseAppeal>>
<<set $args[0].appeal += $args[1].baseAppeal>>
<</if>>
/* Flags */
<<if def $args[1].flag>>
<<set $args[0].flags.push($args[1].flag)>>
<</if>>
/* Skill Block */
<<if def $args[1].skillBlock>>
<<set $args[0].skillBlock.push($args[1].skillBlock)>>
<<set $args[0].skillBlock = $args[0].skillBlock.flat()>>
<</if>>
/* Item Block */
<<if def $args[1].itemBlock>>
<<for _ae=0; _ae<$args[1].itemBlock.length; _ae++>>
<<RemovedOwnedItem $args[1].itemBlock[_ae]>>
<<StopBuyingItem $args[1].itemBlock[_ae]>>
<<set $args[0].itemBlock.push($args[1].itemBlock[_ae])>>
<</for>>
<</if>>
<</if>>
<</widget>>
/*
Call as <<RemoveEffect [player] [name]>>
*/
<<widget "RemoveEffect">>
<<for _pe=0; _pe<$args[0].effect.length; _pe++>>
<<if $args[0].effect[_pe].name == $args[1]>>
<<set _effect = $args[0].effect[_pe]>>
/* Appeal */
<<if def _effect.appeal>>
<<set $args[0].tempAppeal -= _effect.appeal>>
<<set $args[0].appeal -= _effect.appeal>>
<</if>>
/* Base Appeal */
<<if def _effect.baseAppeal>>
<<set $args[0].baseAppeal -= _effect.baseAppeal>>
<<set $args[0].appeal -= _effect.baseAppeal>>
<</if>>
/* Flags */
<<if def _effect.flag>>
<<for _re=0; _re<$args[0].flags.length; _re++>>
<<if $args[0].flags[_re] == _effect.flag>>
<<set $args[0].flags.deleteAt(_re)>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Skill Block */
<<if def _effect.skillBlock>>
<<for ;_effect.skillBlock.length>0;>>
<<for _re=0; _re<$args[0].skillBlock.length; _re++>>
<<if $args[0].skillBlock[_re] == _effect.skillBlock[0]>>
<<set $args[0].skillBlock.deleteAt(_re)>>
<<set _effect.skillBlock.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
/* Item Block */
<<if def _effect.itemBlock>>
<<for ;_effect.itemBlock.length>0;>>
<<for _re=0; _re<$args[0].itemBlock.length; _re++>>
<<if $args[0].itemBlock[_re] == _effect.itemBlock[0]>>
<<set $args[0].itemBlock.deleteAt(_re)>>
<<set _effect.itemBlock.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
<<set $args[0].effect.deleteAt($args[1])>>
<<break>>
<</if>>
<</for>>
<</widget>>
/*
Call as <<RemoveEffectIndex [player] [index]>>
*/
<<widget "RemoveEffectIndex">>
<<set _effect = $args[0].effect[$args[1]]>>
/* Appeal */
<<if def _effect.appeal>>
<<set $args[0].tempAppeal -= _effect.appeal>>
<<set $args[0].appeal -= _effect.appeal>>
<</if>>
/* Base Appeal */
<<if def _effect.baseAppeal>>
<<set $args[0].baseAppeal -= _effect.baseAppeal>>
<<set $args[0].appeal -= _effect.baseAppeal>>
<</if>>
/* Flags */
<<if def _effect.flag>>
<<for _re=0; _re<$args[0].flags.length; _re++>>
<<if $args[0].flags[_re] == _effect.flag>>
<<set $args[0].flags.deleteAt(_re)>>
<<break>>
<</if>>
<</for>>
<</if>>
/* Skill Block */
<<if def _effect.skillBlock>>
<<for ;_effect.skillBlock.length>0;>>
<<for _re=0; _re<$args[0].skillBlock.length; _re++>>
<<if $args[0].skillBlock[_re] == _effect.skillBlock[0]>>
<<set $args[0].skillBlock.deleteAt(_re)>>
<<set _effect.skillBlock.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
/* Item Block */
<<if def _effect.itemBlock>>
<<for ;_effect.itemBlock.length>0;>>
<<for _re=0; _re<$args[0].itemBlock.length; _re++>>
<<if $args[0].itemBlock[_re] == _effect.itemBlock[0]>>
<<set $args[0].itemBlock.deleteAt(_re)>>
<<set _effect.itemBlock.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
<<set $args[0].effect.deleteAt($args[1])>>
<</widget>>/*
Call as <<UpdateEffect [player] [index]>>
This could be made faster, but this works.
*/
<<widget "UpdateEffect">>
<<set _origEffect = $args[0].effect[$args[1]]>>
<<set _newEffect = GenerateEffect(_origEffect.name)>>
/* Remain */
<<if def _origEffect.remain>>
<<set _newEffect.remain = _origEffect.remain>>
<<elseif def _newEffect.remain>>
<<set _newEffect.remain = undefined>>
<</if>>
/* Appeal */
<<if def _origEffect.appeal>>
<<set $args[0].tempAppeal -= _origEffect.appeal>>
<<set $args[0].appeal -= _origEffect.appeal>>
<</if>>
<<if def _newEffect.appeal>>
<<set $args[0].tempAppeal += _newEffect.appeal>>
<<set $args[0].appeal += _newEffect.appeal>>
<</if>>
/* Base Appeal */
<<if def _origEffect.baseAppeal>>
<<set $args[0].baseAppeal -= _origEffect.baseAppeal>>
<<set $args[0].appeal -= _origEffect.baseAppeal>>
<</if>>
<<if def _newEffect.baseAppeal>>
<<set $args[0].baseAppeal += _newEffect.baseAppeal>>
<<set $args[0].appeal += _newEffect.baseAppeal>>
<</if>>
/* Flags */
<<if def _origEffect.flag>>
<<for _re=0; _re<$args[0].flags.length; _re++>>
<<if $args[0].flags[_re] == _origEffect.flag>>
<<set $args[0].flags.deleteAt(_re)>>
<<break>>
<</if>>
<</for>>
<</if>>
<<if def _newEffect.flag>>
<<set $args[0].flags.push(_newEffect.flag)>>
<</if>>
/* Skill Block */
<<if def _origEffect.skillBlock>>
<<set _rem = clone(_origEffect.skillBlock)>>
<<for ;_rem.length>0;>>
<<for _re=0; _re<$args[0].skillBlock.length; _re++>>
<<if $args[0].skillBlock[_re] == _rem[0]>>
<<set $args[0].skillBlock.deleteAt(_re)>>
<<set _rem.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
<<if def _newEffect.skillBlock>>
<<set $args[0].skillBlock.push(_newEffect.skillBlock)>>
<<set $args[0].skillBlock = $args[0].skillBlock.flat()>>
<</if>>
/* Item Block */
<<if def _origEffect.itemBlock>>
<<set _rem = clone(_origEffect.itemBlock)>>
<<for ;_rem.length>0;>>
<<for _re=0; _re<$args[0].itemBlock.length; _re++>>
<<if $args[0].itemBlock[_re] == _rem[0]>>
<<set $args[0].itemBlock.deleteAt(_re)>>
<<set _rem.deleteAt(0)>>
<<break>>
<</if>>
<</for>>
<</for>>
<</if>>
<<if def _newEffect.itemBlock>>
<<for _ae=0; _ae<_newEffect.itemBlock.length; _ae++>>
<<RemovedOwnedItem _newEffect.itemBlock[_ae]>>
<<StopBuyingItem _newEffect.itemBlock[_ae]>>
<<set $args[0].itemBlock.push(_newEffect.itemBlock[_ae])>>
<</for>>
<</if>>
/* Set effect to new version */
<<set $args[0].effect[$args[1]] = _newEffect>>
<</widget>>WIP page
<br><br>
<<if $show.images>>
<<link "Hide Images" "Game Options">>
<<set $show.images = 0>>
<</link>>
<<else>>
<<link "Show Images" "Game Options">>
<<set $show.images = 1>>
<</link>>
<</if>>
<br><br>
<<if $show.notes>>
<<link "Hide Notes" "Game Options">>
<<set $show.notes = 0>>
<</link>>
<<else>>
<<link "Show Notes" "Game Options">>
<<set $show.notes = 1>>
<</link>>
<</if>>
| Notes are the fluff text for items/activities/clients
<br><br>
<<if $show.blocked>>
<<link "Hide Blocked" "Game Options">>
<<set $show.blocked = 0>>
<</link>>
<<else>>
<<link "Show Blocked" "Game Options">>
<<set $show.blocked = 1>>
<</link>>
<</if>>
| Blocked are Items you are prevented from using. Does not hide items you cannot afford./*
Call as <<ItemBlockReason [item]>>
*/
<<widget "ItemBlockReason">>
<<set _found = 0>>
<<for _ibr=0; _ibr<$player.effect.length; _ibr++>>
<<if def $player.effect[_ibr].itemBlock>>
<<if $player.effect[_ibr].itemBlock.includes($args[0])>>
@@color:skyblue;<<print $player.effect[_ibr].name>>@@
<<set _found = 1>>
<<break>>
<</if>>
<</if>>
<</for>>
<<if !_found>>
Unknown
<</if>>
<</widget>>/*
Call as <<PregChance [player] [skill]>>
*/
<<widget "PregChance">>
Your @@.skill;$args[1]@@ sex put you at risk for pregnancy,
<<if $args[0].flags.includes("pregnant")>>
but you already are pregnant.
<<elseif $args[0].flags.includes("contraception")>>
but your @@color:coral;contraception@@ kept you safe.
<<elseif $args[0].flags.includes("fertility")>>
and thanks to your @@color:coral;enhanced fertility@@ you are now @@color:skyblue;pregnant@@.
<<set $newEffect = GenerateEffect("Pregnant")>>
<<AddEffect $args[0] $newEffect>>
<<elseif RandomInRange(1,6) == 1>>
and you are now @@color:skyblue;pregnant@@.
/*<<GeneratePregnancyEffect>>*/
<<set $newEffect = GenerateEffect("Pregnant")>>
<<AddEffect $args[0] $newEffect>>
<<else>>
but you're safe this time.
<</if>>
<</widget>>/*
Call as <<PunishPlayer [player] [punishment]>>
*/
<<widget "PunishPlayer">>
<<switch $args[1]>>
/* Physical */
<<case "Spanking">>
''Spanking'': Bad girls need to be spanked Its as simple as that. How many strikes will it be?
<<case "Whipping">>
''Whipping'': It will leave marks, and I want you to feel the stinging pain for a few days. Do not heal it without permission.
<<set $newEffect = GenerateEffect("Whipped")>>
<<AddEffect $player $newEffect>>
<<case "Beating">>
''Beating'': A punishment with the intent of leaving a mark. You'll have to spend the day brusied and sore.
<<set $newEffect = GenerateEffect("Bruised")>>
<<AddEffect $player $newEffect>>
/* Free Session */
<<case "Free Session">>
''Free Session'': Clearly, you need to improve your skills. Your client gets a free quickie to help you learn what they want.
<<set _opts = []>>
<<if def $player.client.name>>
<<set _client = $player.client>>
<<else>>
<<set _client = $clients[$args[0].client]>>
<</if>>
<<for _pn=0; _pn<_client.tasks.length; _pn++>>
<<if _client.tasks[_pn].type == $type.special>>
<<elseif !$player.skillBlock.includes(_client.tasks[_pn].skill)>>
<<set _opts.push(_client.tasks[_pn])>>
<</if>>
<</for>>
<<if _opts.length >= 1>>
<<set _skill = either(_opts)>>
(@@.skill;+2 _skill.skill exp@@)
<<set AddSkill($args[0].skills, _skill, 2)>>
<<else>>
But you cannot perform anything they want, so your owner is sending you to the glory hole tomorrow instead.
<<set $newAct = GenerateActivity("Free Glory Hole")>>
<<set $args[0].activities.push($newAct)>>
<</if>>
/* Free Sex Activity */
<<case "Free Glory Hole">>
''Free Glory Hole'': I hope you don’t end up with a sore neck tomorrow, because it definitely gets very busy.
<<set $newAct = GenerateActivity("Free Glory Hole")>>
<<set $args[0].activities.push($newAct)>>
<<case "Free Use">>
''Free Use'': 100% free. No payment is needed to fuck you like a rag, and you will definitely be used nonstop.
<<set $newAct = GenerateActivity("Free Use")>>
<<set $args[0].activities.push($newAct)>>
<<case "Gangbang">>
''Gangbang'': There's nothing like organized rape to put a misbehaving sex slave bock in her place. A group of men will be invited to punish you.
<<set $newAct = GenerateActivity("Gangbang Punishment")>>
<<set $args[0].activities.push($newAct)>>
/* Punishment Activity */
<<case "Reflection Room">>
''Reflection Room'': You will be shut away in a small cage in a dark cramped room and isolated. No dinner for you today.
<<set $newAct = GenerateActivity("Reflection Room")>>
<<set $args[0].activities.push($newAct)>>
<<case "Strict Bondage">>
''Strict Bondage'': This punishment is very uncomfortable. In fact, it's a predicament, and it won't take long before you're whimpering.
<<set $newAct = GenerateActivity("Strict Bondage")>>
<<set $args[0].activities.push($newAct)>>
<<case "High Protocol">>
''High Protocol'': Your Owner is kind, and he normally doesn't treat you like a slave. But today, you'll be on full slave protocol Get on your knees!
<<set $newAct = GenerateActivity("High Protocol")>>
<<set $args[0].activities.push($newAct)>>
/* Nudity Punishment */
<<case "Nudity">>
''Nudity'': It seems you've forgotten that you're a sex slave.
<<if HasEffect($player.effect, "Nudity")>>
Your no clothes punishment has been extended by a day.
<<else>>
Your clothing privileges are revoked for a day.
<</if>>
<<set $newEffect = GenerateEffect("Nudity")>>
<<AddEffect $args[0] $newEffect true>>
<<case "Exhibition">>
''Exhibition'': You will be placed in a public location with a sign describing your crimes. Enjoy the public harassment.
/*
<<set $newEffect = GenerateEffect("Nudity")>>
<<AddEffect $args[0] $newEffect>>
*/
<<set $newAct = GenerateActivity("Exhibition")>>
<<set $args[0].activities.push($newAct)>>
<<case "Prolonged Nudity">>
''Prolonged Nudity'': You're not realizing that you are a sex slave.
<<set $newEffect = GenerateEffect("Nudity")>>
<<if HasEffect($player.effect, "Nudity")>>
Your no clothes punishment has been extended by five days.
<<set $newEffect.remain = 5>>
<<else>>
Your clothing privileges are revoked for a week.
<<set $newEffect.remain = 8>>
<</if>>
<<AddEffect $args[0] $newEffect true>>
/* Cash punishment */
<<case "No Pay">>
/* NOTE - not using - failures is good enough */
''No Pay'': Due to your poor performance your owner chose not to pay you for tonight's work.
<<set $earn = 0>>
<<case "Minor Cash">>
''Minor Cash Penalty'': You owner has fined you @@.cash;$<<print $args[0].appeal>>@@.
<<set $args[0].cash -= $args[0].appeal>>
<<case "Major Cash">>
<<if def $player.client.name>>
<<set _client = $player.client>>
<<else>>
<<set _client = $clients[$args[0].client]>>
<</if>>
''Major Cash Penalty'': You owner has fined you @@.cash;$<<print _client.fame>>@@.
<<set $args[0].cash -= _client.fame>>
/* No Healing Punishment */
<<case "No Healing">>
''No Healing'':
<<set $newEffect = GenerateEffect("No Healing")>>
<<if HasEffect($player.effect, "No Healing")>>
Your no healing punishment has been extended by three days.
<<set $newEffect.remain = 3>>
<<else>>
Your healing privileges are revoked for five days.
<<set $newEffect.remain = 6>>
<</if>>
<<AddEffect $args[0] $newEffect true>>
<<default>>
''Nothing?'': Lucky you, _punishment isn't handled correctly, so you get off scott free!
<</switch>>
<</widget>>/*
Call as <<SetBackLink>>
Intended for use with links to "Character Info" and "Client List".
*/
<<widget "SetBackLink">>
<<switch $gameState>>
<<case $state.morning>>
<<set $nextLink.text = "Back to Shopping">>
<<set $nextLink.dest = "Plan Shopping">>
<<case $state.day>>
<<set $nextLink.text = "Back to Activities">>
<<set $nextLink.dest = "Plan Activities">>
<<case $state.evening>>
<<set $nextLink.text = "Back to Evening">>
<<set $nextLink.dest = "Plan Evening">>
<<default>>
<<set $nextLink.text = "OOPS Go Shopping">>
<<set $nextLink.dest = "Plan Shopping">>
<</switch>>
<</widget>>/* FinishShopping */
/* TODO - FinishShopping could be moved from the widget to here */
<<FinishShopping>>
/* Set base activity counts */
<<set $numActivity = 3>>
<<set $reqSexual = 0>>
<<set $reqDegrade = 0>>
<<set $allowDegrade = 0>>
<<set $sexActCount = 0>>
<<set $degActCount = 0>>
<<set $degActLocked = 0>>
<<set $activityCost = 0>>
/* Item influence on activities */
<<for _i=0; _i<$player.items.length; _i++>>
<<if def $player.items[_i].activity>>
<<set $numActivity += $player.items[_i].activity>>
<</if>>
<<if def $player.items[_i].reqSexAct>>
<<set $reqSexual += $player.items[_i].reqSexAct>>
<</if>>
<<if def $player.items[_i].allowDegAct>>
<<set $allowDegrade += $player.items[_i].allowDegAct>>
<</if>>
<<if def $player.items[_i].reqDegAct>>
<<set $reqDegrade += $player.items[_i].reqDegAct>>
<</if>>
<</for>>
/* Effect influence on activities */
<<for _i=0; _i<$player.effect.length; _i++>>
<<if def $player.effect[_i].activity>>
<<set $numActivity += $player.effect[_i].activity>>
<</if>>
<<if def $player.effect[_i].reqSexAct>>
<<set $reqSexual += $player.effect[_i].reqSexAct>>
<</if>>
<<if def $player.effect[_i].allowDegAct>>
<<set $allowDegrade += $player.effect[_i].allowDegAct>>
<</if>>
<<if def $player.effect[_i].reqDegAct>>
<<set $reqDegrade += $player.effect[_i].reqDegAct>>
<</if>>
<</for>>
/* Fix out of range activity counts */
<<if $numActivity < 0>>
<<set $numActivity = 0>>
<</if>>
<<if $reqSexual > $numActivity>>
In order to satisfy your excessive @@color:pink;Horniness@@ you will need to do something @@.degrade;Degrading@@.
<<set $reqDegrade += 1>>
<<set $reqSexual = $numActivity>>
<</if>>
/*
<<if $allowDegrade > $numActivity>>
Your @@.degrade;Inhibitions@@ are so low that you must do something @@.degrade;degrading@@.<br>
<<set $reqDegrade += 1>>
<<set $allowDegrade = $numActivity>>
<</if>>
/**/
<<if $reqDegrade > $allowDegrade>>
/* TODO - some side effect of this? */
<<set $allowDegrade = $reqDegrade>>
<</if>>
<<if $reqDegrade > $numActivity>>
/* TODO - some side effect of this? */
<<set $reqDegrade = $numActivity>>
<</if>>
/* Cull Blocked Activities & Note Sexual/Degrading */
<<set _dels = []>>
<<for _i=0; _i<$player.activities.length; _i++>>
<<if def $player.activities[_i].reqAppeal>>
<<if $player.appeal < $player.activities[_i].reqAppeal>>
You have insufficient @@.appeal;Appeal@@ for ''$player.activities[_i].name''.
<br>
<<set _dels.push(_i)>>
<<continue>>
<</if>>
<</if>>
/* NOTE - there is no method of losing skill, so this shouldn't be needed
<<if def $player.activities[_i].reqSkill>>
<<set _skl = GetSkillExp($player.skills, $player.activities[_i].reqSkill)>>
<<if _skl < $player.activities[_i].reqSkill.val>>
<br>Insufficient Experience _skl
<<set _lnk = 0>>
<</if>>
<</if>>
/**/
<<if def $player.activities[_i].sexual>>
<<set $sexActCount += 1>>
<</if>>
<<if def $player.activities[_i].degrade>>
<<set $degActCount += $player.activities[_i].degrade>>
<<if def $player.activities[_i].locked>>
<<set $degActLocked += $player.activities[_i].degrade>>
<</if>>
<</if>>
<<UpdateActivity $player _i>>
/*
<<set FinalizeActivity($player.activities[_i])>>
*/
<<if def $player.activities[_i].cash>>
<<set $activityCost -= $player.activities[_i].cash>>
<</if>>
<<if def $player.activities[_i].cost>>
<<set $activityCost += $player.activities[_i].cost>>
<</if>>
<</for>>
<<set $player.activities.deleteAt(_dels)>>
<<if _dels.length>>
<br>
<</if>>
/* Include Activities */
<<if $player.flags.includes("injured")>>
You are injured and must spend the day recuperating and healing, so you must skip all your daylight activities.
<<set $nextLink.text = "Rest till Evening">>
<<set $nextLink.dest = "Injured to Evening">>
<<else>>
<<include "Plan Activities">>
<</if>><<set $shoppingCost = 0>>
<<set $player.tempAppeal = 0>>
<<set $player.startingAppeal = $player.baseAppeal>>
<<set _heal = {phys:0, ment:0, preg:0}>>
/* Calculate Healing bonuses */
<<for _i=0; _i<$player.items.length; _i++>>
<<if def $player.items[_i].healPhys>>
<<set _heal.phys += $player.items[_i].healPhys>>
<</if>>
<<if def $player.items[_i].healMent>>
<<set _heal.ment += $player.items[_i].healMent>>
<</if>>
<<if def $player.items[_i].speedPreg>>
<<set _heal.preg += $player.items[_i].speedPreg>>
<</if>>
<</for>>
<<for _i=0; _i<$player.activities.length; _i++>>
<<if def $player.activities[_i].healPhys>>
<<set _heal.phys += $player.activities[_i].healPhys>>
<</if>>
<<if def $player.activities[_i].healMent>>
<<set _heal.ment += $player.activities[_i].healMent>>
<</if>>
<</for>>
<<for _i=0; _i<$player.effect.length; _i++>>
<<if def $player.effect[_i].healPhys>>
<<set _heal.phys += $player.effect[_i].healPhys>>
<</if>>
<<if def $player.effect[_i].healMent>>
<<set _heal.ment += $player.effect[_i].healMent>>
<</if>>
<<if def $player.effect[_i].speedPreg>>
<<set _heal.preg += $player.effect[_i].speedPreg>>
<</if>>
<</for>>
/* Prevent duration increasing & report no duration loss */
<<if _heal.phys <= -1>>
Your @@.heal;Physical Ailments@@ aren't healing.
<<set _heal.phys = -1>>
<</if>>
<<if _heal.ment <= -1>>
Your @@.heal;Mental Ailments@@ aren't healing.
<<set _heal.ment = -1>>
<</if>>
<<if _heal.preg <= -1>>
<<set _heal.preg = -1>>
<</if>>
/* Effects */
<<for _i=0; _i<$player.effect.length;>>
/* Add current appeal, related to no clothing support */
<<if def $player.effect[_i].appeal>>
<<set $player.tempAppeal += $player.effect[_i].appeal>>
<</if>>
<<if def $player.effect[_i].remain>>
<<set $player.effect[_i].remain -= 1>>
<<if def $player.effect[_i].physAilment>>
<<set $player.effect[_i].remain -= _heal.phys>>
<</if>>
<<if def $player.effect[_i].mentAilment>>
<<set $player.effect[_i].remain -= _heal.ment>>
<</if>>
<<if def $player.effect[_i].pregnancy >>
<<if _heal.preg == -1>>
<br>Your @@color:skyblue;$player.effect[_i].name@@ isn't progressing!
<<elseif _heal.preg >= 1>>
<br>Your @@color:skyblue;$player.effect[_i].name@@ is progressing fast!
<</if>>
<<set $player.effect[_i].remain -= _heal.preg>>
<</if>>
<<if $player.effect[_i].remain <= 0>>
$player.effect[_i].name expired.
<<RemoveEffectIndex $player _i>>
<<continue>>
<</if>>
<</if>>
/* Update the Effect */
<<UpdateEffect $player _i>>
/* Daily Skill Improvement */
<<if def $player.effect[_i].skill>>
''$player.effect[_i].name'' increased your @@.skill;$player.effect[_i].skill exp@@.<br>
<<set AddSkill($player.skills, $player.effect[_i], $player.effect[_i].skillVal)>>
<</if>>
<<set _i++>>
<</for>>
/* Items */
<<set _dels = []>>
<<for _i=0; _i<$player.items.length; _i++>>
<<if $player.items[_i].remain>>
<<if ($player.flags.includes("no clothes")) && (def $player.items[_i].clothing)>>
<<continue>>
<</if>>
<<if def $player.items[_i].skill>>
''$player.items[_i].name'' increased your @@.skill;$player.items[_i].skill exp@@.<br>
<<set AddSkill($player.skills, $player.items[_i].skill, $player.items[_i].skillVal)>>
<</if>>
<<set $player.items[_i].remain -= 1>>
<<if $player.items[_i].remain <= 0>>
<<set $shoppingCost += $player.items[_i].price>>
<<set $player.buying.push($player.items[_i])>>
<<set _dels.push(_i)>>
<<if def $player.items[_i].norebuy>>
<<StopBuyingItem $player.items[_i].name>>
<<continue>>
<</if>>
<</if>>
<<if def $player.items[_i].appeal>>
<<set $player.tempAppeal += $player.items[_i].appeal>>
<</if>>
<</if>>
<</for>>
<<set $player.items.deleteAt(_dels)>>
/* Refresh Shopping Items */
<<set _list = BuyingNameList($player)>>
/*<<set _list.delete($player.itemBlock)>>*/
<<set _dailyList = DailyShopList()>>
<<set _weeklyList = LongShopList()>>
/* Cursed items should all have .norebuy, so checking them should not be needed */
/* Update the items */
<<for _i=0; _i<_list.length; _i++>>
<<StopBuyingItem _list[_i]>>
<<if _dailyList.includes(_list[_i])>>
<<set $newItem = GenerateItem(_list[_i])>>
<<StartBuyingItem $newItem>>
<<elseif _weeklyList.includes(_list[_i])>>
<<set $newItem = GenerateItem(_list[_i])>>
<<StartBuyingItem $newItem>>
You need to buy more ''_list[_i]''.<br>
<<else>>
Cannot buy _list[_i], it is no longer available.<br>
<</if>>
<</for>>
/* Sort Player skills */
<<set $player.skills = $player.skills.sort(function(a, b)
{
if(a.type < b.type) return -1; if(a.type > b.type) return 1;
if(a.skill < b.skill) return -1; if(a.skill > b.skill) return 1;
return 0;})>>
/* Cleanup */
<<set $day += 1>>
<<set $dayOfWeek = ($day % 7)>>
<<set $player.appeal = $player.baseAppeal + $player.tempAppeal>>
/* Include next day */
<<include "Plan Shopping">><<if $gameState == $state.intro>>
<<else>>
''Day $day''
<<if def $plot.betaDOW>>
<br>
<<print DayOfWeekText($dayOfWeek)>>
<<print TimeOfDayText($gameState)>>
<</if>>
<br>
<br>
<<if $nextLink.dest.length >= 1>>
<<link $nextLink.text $nextLink.dest>>
<<set $nextLink.text = "">>
<<set $nextLink.dest = "">>
<</link>>
<<else>>
$nextLink.text
<</if>>
<br>
/*
<br>Sanity: @@.sanity;$player.sanity@@ | @@.sanity;$player.maxSanity@@
*/
<br>Appeal: @@.appeal;$player.appeal@@ (@@.appeal;$player.baseAppeal@@ base)
<br>Cash: @@.cash;$player.cash@@
<<if $gameState == $state.morning>>
<br>Shopping: @@.cash;$shoppingCost@@
<<elseif $gameState == $state.day>>
<</if>>
<<if [$state.morning, $state.day, $state.evening].includes($gameState)>>
<br><br>
<<link "Character Info" "Character Info">>
<<SetBackLink>>
<</link>>
<br>
<<link "Client List" "Client List">>
<<SetBackLink>>
<</link>>
<br>
<<link "Evening Rules" "Evening Rules">>
<<SetBackLink>>
<</link>>
<br>
<<link "Game Options" "Game Options">>
<<SetBackLink>>
<</link>>
<</if>>
<br>
/* WIP */
<<for _sc=0; _sc<$girls.length; _sc++>>
<br>''$girls[_sc].name'' @@.appeal;$girls[_sc].appeal@@
<</for>>
<</if>>
<br><br>
<<if ($returnTo.length >= 1) && ($returnText.length >= 1)>>
<<link $returnText $returnTo>>
<<set $returnTo = "">>
<<set $returnText = "">>
<</link>>
<</if>>