Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
/* verb is in javascript files */
<<include 'InitBanterTopic'>><<set setup.BANTER_TOPIC = [
'you',
'your race',
'your gender',
'your personality',
'your skills',
'your career',
'the company',
'recent events',
'slaves',
'new slaves',
'their past life',
'humans',
'elves',
'the Kingdom of Tor',
'the City of Lucgate',
'orcs',
'nekos',
'dragonkins',
'foreigners',
'quests',
'recent quests',
'past quests',
'adventuring',
'swords',
'dragons',
'culture',
'cooking',
'hobbies',
'literature',
'art',
'entertainment',
'game',
'poetry',
'sports',
'exercise',
'muscle',
'sex',
'anal sex',
'oral sex',
'vaginal sex',
'pony slave',
'pet slave',
'music',
'painting',
'health',
'history',
'mathematics',
'animals',
'plants',
'dick',
'balls',
'vagina',
'anus',
'breasts',
'relationships',
'religion',
'politics',
'love life',
'crime',
'slaving career',
'knights',
'peasants',
'milk',
'trading',
'magic',
'northern vale',
'southern seas',
'western forests',
'eastern deserts',
'bimbos',
'mindbroken slaves',
'fleshshaping',
'corruption',
'purification',
'duties',
'your leadership',
'their friends',
'their rivals',
'the future',
'the past',
'the world',
'their dreams',
'money',
'fame',
'travel',
'the weather',
'food',
'fashion',
'armor',
'bondage',
'naked',
'submissive slaves',
'dominant slavers',
'technology',
'romance',
'love',
'pets',
'education',
'mercenaries',
'pirates',
'whores',
'soldiers',
'raiders',
'demons',
'healers',
'healing',
'crafting',
'potions',
'trauma',
'equipments',
'their background',
'their gender',
'their race',
'their personality',
'work',
'combat',
'survival',
'stealth',
'slaving',
'knowledge',
'social life',
'sex life',
'family',
'nipples',
'wings',
'tail',
'healsluts',
'friendship',
'rivalry',
'mistakes',
'triumphs',
'the fort',
'tomorrow',
'yesterday',
'next month',
'last month',
'next week',
'last week',
'hypnotism',
'breaking slaves',
'domestic slaves',
'sissies',
'exhibitionism',
'edging',
'sex addiction',
'ghosts',
'nature',
'sleeping',
'puns',
'home',
'hygiene',
'science',
'tentacles',
'favors',
'eldritch abominations',
'Neko Port City',
'harems',
'low wages',
'wet dreams',
"dinner",
"indigestion",
"the Mist",
"the cold",
"the heat",
"old flames",
"virginity",
"sex protection",
"a bad rash",
"fungus",
"feet",
"working out",
"saving up",
"getting new clothes",
"chafing",
"the thing",
"getting stains out of clothing",
"favorite songs",
"regular cats",
"weapon maintenance",
"holey underwear",
"wearing a mask while raiding",
"the ethics of slaving",
"philosophy",
"tea",
"rumors",
"that smell",
"tall people",
"short people",
"big butts",
"flat butts",
"cake",
"birthdays",
"injuries",
"scars",
"childhood friends",
"perfect handwriting",
"awful handwriting",
"new slavers",
"the meaning of your name",
"our glorious leader",
"dancing",
"prisoners",
"favorite slaves",
"networking",
"one-night stands",
"the night sky",
"orc tusks",
"elf ears",
"peach fuzz",
"other worlds",
"dildos",
"fresh fruits",
"the afterlife",
"sunrise",
"sunset",
"camp nightlife",
"elven hand-woven rugs",
"Southern Lands dragonspice",
"orc liquor",
"werewolf soaps",
"neko milk-mead",
"Northern fur coats",
"Lucgate pickpockets",
"Eastern crystal tooth-knives",
"Kingdom of Tor eggplant dishes",
"seaman-sucking sea serpents",
"Mist culinary",
]>><<set setup.buildingtemplate = {}>>
/* Unique buildings */
/* Structural */
<<include 'InitBuildingFort'>>
<<include 'InitBuildingGrandHall'>>
<<include 'InitBuildingVeteranHall'>>
/* Critical Buildings */
<<include 'InitBuildingQuestOffice'>>
<<include 'InitBuildingLodgings'>>
<<include 'InitBuildingConstructionOffice'>>
<<include 'InitBuildingScoutHut'>>
<<include 'InitBuildingProspectsHall'>>
<<include 'InitBuildingMissionControl'>>
<<include 'InitBuildingHiringSquare'>>
<<include 'InitBuildingDungeons'>>
<<include 'InitBuildingSlavePens'>>
<<include 'InitBuildingMarketingOffice'>>
<<include 'InitBuildingMailRoom'>>
/* Offices */
<<include 'InitBuildingViceLeaderOffice'>>
<<include 'InitBuildingMoraleOffice'>>
<<include 'InitBuildingLibrary'>>
/* Lodgings */
/* activities */
<<include 'InitBuildingDutyRoom'>>
/* slaver training */
<<include 'InitBuildingTrainingGrounds'>>
/* scout */
<<include 'InitBuildingScoutTower'>>
<<include 'InitBuildingScoutOffice'>>
<<include 'InitBuildingScoutCarriage'>>
<<include 'InitBuildingScoutHarbor'>>
/* training */
<<include 'InitBuildingTrainingChamber'>>
/* storage */
<<include 'InitBuildingArmory'>>
<<include 'InitBuildingWarehouse'>>
/* hospital */
<<include 'InitBuildingHospital'>>
<<include 'InitBuildingTraumaCenter'>>
/* bed chamber */
<<include 'InitBuildingBedchamberWing'>>
/* rec wing */
<<include 'InitBuildingRecreationWing'>>
/* under here are optional buildings */
/* Markets */
<<include 'InitBuildingForge'>>
<<include 'InitBuildingSexShop'>>
<<include 'InitBuildingApothecary'>>
/* treatment */
<<include 'InitBuildingTreatmentRoom'>>
/* biolab */
<<include 'InitBuildingBiolab'>>
/* surgery */
<<include 'InitBuildingSurgery'>>
/* ritual chamber */
<<include 'InitBuildingRitualChamber'>>
<<include 'InitBuildingDeepRitualChamber'>>
/* temple */
<<include 'InitBuildingTemple'>>
/* Supplementary Buildings */
/* Offices */
<<include 'InitBuildingMarketerOffice'>>
<<include 'InitBuildingInsurerOffice'>>
<<include 'InitBuildingRescuerOffice'>>
<<include 'InitBuildingRelationsOffice'>>
<<include 'InitBuildingRelationshipManagerOffice'>>
<<include 'InitBuildingDamageControlOffice'>>
<<include 'InitBuildingMessengerPost'>>
/* Hiring */
<<include 'InitBuildingHiringSquareVale'>>
<<include 'InitBuildingHiringSquareForest'>>
<<include 'InitBuildingHiringSquareDesert'>>
<<include 'InitBuildingHiringSquareSea'>>
/* Hospital */
<<include 'InitBuildingTreatmentRoomResetLevel'>>
<<include 'InitBuildingTreatmentRoomBlank'>>
<<include 'InitBuildingTreatmentRoomMindMend'>>
<<include 'InitBuildingTreatmentRoomHate'>>
<<include 'InitBuildingTreatmentRoomLove'>>
<<include 'InitBuildingTreatmentRoomLoveTrue'>>
<<include 'InitBuildingTreatmentRoomForget'>>
<<include 'InitBuildingTreatmentRoomIsolation'>>
<<include 'InitBuildingTreatmentRoomTransformation'>>
/* training */
<<include 'InitBuildingTrainingBedroom'>>
<<include 'InitBuildingTrainingField'>>
<<include 'InitBuildingTortureChamber'>>
<<include 'InitBuildingFetishTrainingRoom'>>
<<include 'InitBuildingMilkerRoom'>>
<<include 'InitBuildingObedienceTrainingRoom'>>
<<include 'InitBuildingVaginaTrainingRoom'>>
<<include 'InitBuildingOralTrainingRoom'>>
<<include 'InitBuildingAnalTrainingRoom'>>
<<include 'InitBuildingSissyTrainingRoom'>>
<<include 'InitBuildingToiletTrainingRoom'>>
<<include 'InitBuildingDomesticTrainingRoom'>>
<<include 'InitBuildingEnduranceTrainingRoom'>>
<<include 'InitBuildingPetTrainingRoom'>>
<<include 'InitBuildingPonyTrainingRoom'>>
<<include 'InitBuildingDominanceTrainingRoom'>>
<<include 'InitBuildingMasochistTrainingRoom'>>
<<include 'InitBuildingEdgingTrainingRoom'>>
<<include 'InitBuildingHornyTrainingRoom'>>
<<include 'InitBuildingConvincingRoom'>>
<<include 'InitBuildingBrainwashingRoom'>>
/* biolab */
<<include 'InitBuildingBreastlab'>>
<<include 'InitBuildingDicklab'>>
<<include 'InitBuildingBallslab'>>
<<include 'InitBuildingAnuslab'>>
<<include 'InitBuildingVaginalab'>>
/* surgery */
<<include 'InitBuildingSurgeryBreast'>>
<<include 'InitBuildingSurgeryDick'>>
<<include 'InitBuildingSurgeryBalls'>>
<<include 'InitBuildingSurgeryAnus'>>
<<include 'InitBuildingSurgeryVagina'>>
/* ritual chamber */
<<include 'InitBuildingAltarOfDarkness'>>
<<include 'InitBuildingMirrorOfTheDamned'>>
<<include 'InitBuildingPoolOfMist'>>
<<include 'InitBuildingDeepAltarOfDarkness'>>
<<include 'InitBuildingDeepMirrorOfTheDamned'>>
<<include 'InitBuildingDeepPoolOfMist'>>
/* temple */
<<include 'InitBuildingBlessingRoom'>>
<<include 'InitBuildingPenitenceRoom'>>
<<include 'InitBuildingPrayerRoom'>>
/* activities */
<<include 'InitBuildingDoctorOffice'>>
<<include 'InitBuildingMysticOffice'>>
/* Scout Outposts */
<<include 'InitBuildingScoutOutpostVale'>>
<<include 'InitBuildingScoutOutpostForest'>>
<<include 'InitBuildingScoutOutpostCity'>>
<<include 'InitBuildingScoutOutpostDesert'>>
<<include 'InitBuildingScoutOutpostSea'>>
/* storage */
<<include 'InitBuildingBazaar'>>
<<include 'InitBuildingAlchemistShop'>>
<<include 'InitBuildingBlacksmith'>>
<<include 'InitBuildingTailor'>>
<<include 'InitBuildingWeaver'>>
<<include 'InitBuildingWoodworks'>>
<<include 'InitBuildingSexShopPony'>>
<<include 'InitBuildingSexShopPet'>>
/* rec wing */
<<include 'InitBuildingAnalFuckhole'>>
<<include 'InitBuildingBar'>>
<<include 'InitBuildingBath'>>
<<include 'InitBuildingCleaning'>>
<<include 'InitBuildingCourtyard'>>
<<include 'InitBuildingGym'>>
<<include 'InitBuildingKennel'>>
<<include 'InitBuildingMuseum'>>
<<include 'InitBuildingOralFuckhole'>>
<<include 'InitBuildingPasture'>>
<<include 'InitBuildingStables'>>
<<include 'InitBuildingStage'>>
<<include 'InitBuildingTavern'>>
<<include 'InitBuildingTheatre'>>
<<include 'InitBuildingVaginaFuckhole'>>
/* buildings from mods */
<<set _passages = Story.lookup('tags', 'building')>>
<<for _ipassage, _passage range _passages>>
<<include _passage.title>>
<</for>><<run new setup.BuildingTemplate(
'dutyroom',
'Duty roster room',
['duty', 'critical', 'unlocker', ],
'BuildingDutyRoom',
1,
[
[setup.qc.Money(-1500)],
],
[
[setup.qres.Building('grandhall')],
],
false,
)>><p>
Unlocks assigning slavers to duties.
</p><<run new setup.BuildingTemplate(
'bedchamberwing',
'Bedchamber wing',
['critical'],
'BuildingBedchamberWing',
1,
[
[setup.qc.Money(-3000)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('grandhall'),
],
[
setup.qres.Building('veteranhall'),
],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
],
false,
[
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
[ setup.qc.Function(() => State.variables.bedchamberlist.newBedchamber()), ],
],
)>><p>
Transforms a small north wing of your fort into a luxurious area for you and your
slavers to revel in your success.
Unlocks private bedchambers, in which you can give ownership of some slaves to yourself
or your slavers.
Very, very slightly increases the slaver's skills, but the main reason this improvement exists
is to roleplay.
</p>
<p>
Each upgrade unlocks one extra bedchamber.
</p><<run new setup.BuildingTemplate(
'anuslab',
'Anuslab',
['biolab'],
'BuildingAnuslab',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('biolab'),
setup.qres.HasItem(setup.item.rear_technology),
],
],
false,
)>><p>
Unlocks tightening and loosening of slave's anus.
</p><<run new setup.BuildingTemplate(
'ballslab',
'Ballslab',
['biolab'],
'BuildingBallslab',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[setup.qres.Building('biolab')],
],
false,
)>><p>
Unlocks limited growing and shrinking of slave ballss.
</p><<run new setup.BuildingTemplate(
'biolab',
'Biolab',
['biolab', 'critical', 'unlocker', ],
'BuildingBiolab',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_water]),
],
],
false,
)>><p>
Unlocks limited muscle and height growing and shrinking on slaves.
Can build further improvements to unlock more flesh shaping options.
</p><<run new setup.BuildingTemplate(
'breastlab',
'Breastlab',
['biolab'],
'BuildingBreastlab',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[setup.qres.Building('biolab')],
],
false,
)>><p>
Unlocks limited growing and shrinking of slave breasts.
</p><<run new setup.BuildingTemplate(
'dicklab',
'Dicklab',
['biolab'],
'BuildingDicklab',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[setup.qres.Building('biolab')],
],
false,
)>><p>
Unlocks limited growing and shrinking of slave dicks.
</p><<run new setup.BuildingTemplate(
'vaginalab',
'Vaginalab',
['biolab'],
'BuildingVaginalab',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('biolab'),
setup.qres.HasItem(setup.item.rear_technology),
],
],
false,
)>><p>
Unlocks tightening and loosening of slave's vagina.
</p><<run new setup.BuildingTemplate(
'doctoroffice',
'Doctor office',
['duty', 'hospital',],
'BuildingDoctorOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('hospital'), setup.qres.Building('dutyroom')],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.Doctor)],
],
)>><p>
Unlocks the doctor duty, which speedups injury recovery.
</p><<run new setup.BuildingTemplate(
'hospital',
'Hospital',
['critical', 'hospital', 'unlocker', ],
'BuildingHospital',
1,
[
[setup.qc.Money(-2900)],
],
[
[setup.qres.Building('grandhall')],
],
false,
)>><p>
A proper place for the injured to rest and recover.
Unlocks management of injured units.
Allows building additional improvements that can speedup recovery.
</p><<run new setup.BuildingTemplate(
'moraleoffice',
'Morale office',
['critical'],
'BuildingMoraleOffice',
1,
[
[setup.qc.Money(-2400)],
],
[
[
setup.qres.Building('hospital'),
setup.qres.Building('grandhall'),
],
],
false,
)>><p>
You keep track of your slaver's morales and relationship with each other in this room.
Unlocks viewing banters at week ends, as well as viewing relationships between slavers
and between a slaver and a slave.
</p><<run new setup.BuildingTemplate(
'mysticoffice',
'Mystic office',
['duty', 'hospital',],
'BuildingMysticOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('hospital'), setup.qres.Building('dutyroom')],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.Mystic)],
],
)>><p>
Unlocks the mystic duty, which can reduce injury durations.
</p><<run new setup.BuildingTemplate(
'traumacenter',
'Trauma center',
['critical', 'hospital',],
'BuildingTraumaCenter',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('hospital'),
setup.qres.Building('grandhall'),
],
],
false,
)>><p>
A ward to treat your unit's psyche.
Unlocks viewing the durations of your unit's traumas and boons.
</p><<run new setup.BuildingTemplate(
'treatmentroom',
'Treatment Room',
['hospital', 'critical', 'unlocker', ],
'BuildingTreatmentRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('hospital'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light]),
],
],
false,
)>><p>
A sterile room next to your hospital designated to allow your slaver
to (literally) work their healing magic.
Unlocks treatments that can heal significantly injured slavers.
Can be further expanded for more treatment options.
</p><<run new setup.BuildingTemplate(
'treatmentroomblank',
'Therapy Room',
['hospital'],
'BuildingTreatmentRoomBlank',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
],
],
false,
)>><p>
Unlocks treatment option that can reset a slave's trainings.
Each treatment will consume a <<rep setup.item.blank_potion>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomforget',
'PTSD Room',
['hospital'],
'BuildingTreatmentRoomForget',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
],
],
false,
)>><p>
Unlocks treatment option that can forcefully make two slavers forget each other and reset their friendship to 0.
Each treatment will consume a <<rep setup.item.forget_potion>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomhate',
'Solitary Room',
['hospital'],
'BuildingTreatmentRoomHate',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
],
],
false,
)>><p>
Unlocks treatment option that can forcefully make two units hate each other.
Each treatment will consume a <<rep setup.item.hate_potion>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomisolation',
'Memory Isolator Room',
['hospital'],
'BuildingTreatmentRoomIsolation',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasItem(setup.item.isolation_technology),
],
],
false,
)>><p>
Unlocks treatment that can remove a background or skill from a unit.
This can be useful if they want to learn new skill or background, since both
of them are capped.
Each treatment will consume a <<rep setup.item.potion_isolation>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomlove',
'Massage Room',
['hospital'],
'BuildingTreatmentRoomLove',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
],
],
false,
)>><p>
Unlocks treatment option that can forcefully make two units like each other.
Each treatment will consume a <<rep setup.item.love_potion>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomlovetrue',
'Private Vacation Room',
['hospital'],
'BuildingTreatmentRoomLoveTrue',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
setup.qres.HasItem(setup.item.love_technology),
],
],
false,
)>><p>
Unlocks treatment option that can forcefully make two units love each other.
Each treatment will consume a <<rep setup.item.love_potion_true>>.
</p><<run new setup.BuildingTemplate(
'treatmentroommindmend',
'Spa',
['hospital'],
'BuildingTreatmentRoomMindMend',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
],
],
false,
)>><p>
Unlocks treatment option that can restore a mindbroken slave.
Each treatment will consume a <<rep setup.item.mindmend_potion>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomresetlevel',
'Pharmacy',
['hospital'],
'BuildingTreatmentRoomResetLevel',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_light_master]),
],
],
false,
)>><p>
Unlocks treatment option that can reset the level of a unit to level 1.
Note that their skills will also be reset to those of a level 1 unit.
Each treatment will consume a <<rep setup.item.reset_potion>>.
</p><<run new setup.BuildingTemplate(
'treatmentroomtransformation',
'Body Reshaper Room',
['hospital'],
'BuildingTreatmentRoomTransformation',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('treatmentroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasItem(setup.item.transformation_technology),
],
],
false,
)>><p>
Unlocks treatment that can grow a random non-demonic body-part to a unit.
Each treatment will consume a <<rep setup.item.potion_transformation>>.
</p><<run new setup.BuildingTemplate(
'dungeons',
'Dungeons',
['critical', 'unlocker',],
'BuildingDungeons',
1,
[
[setup.qc.Money(-600)],
[setup.qc.Money(-300)],
[setup.qc.Money(-400)],
[setup.qc.Money(-500)],
[setup.qc.Money(-600)],
[setup.qc.Money(-800)],
[setup.qc.Money(-1200)],
[setup.qc.Money(-1400)],
[setup.qc.Money(-1600)],
[setup.qc.Money(-1800)],
[setup.qc.Money(-5000)],
[setup.qc.Money(-6000)],
[setup.qc.Money(-7000)],
[setup.qc.Money(-8000)],
[setup.qc.Money(-9000)],
[setup.qc.Money(-10000)],
[setup.qc.Money(-11000)],
[setup.qc.Money(-12000)],
[setup.qc.Money(-13000)],
[setup.qc.Money(-14000)],
[setup.qc.Money(-15000)],
[setup.qc.Money(-16000)],
[setup.qc.Money(-17000)],
[setup.qc.Money(-18000)],
[setup.qc.Money(-19000)],
[setup.qc.Money(-20000)],
[setup.qc.Money(-21000)],
[setup.qc.Money(-22000)],
[setup.qc.Money(-23000)],
[setup.qc.Money(-24000)],
[setup.qc.Money(-25000)],
[setup.qc.Money(-26000)],
[setup.qc.Money(-27000)],
[setup.qc.Money(-28000)],
[setup.qc.Money(-29000)],
[setup.qc.Money(-30000)],
[setup.qc.Money(-31000)],
[setup.qc.Money(-32000)],
[setup.qc.Money(-33000)],
[setup.qc.Money(-34000)],
[setup.qc.Money(-35000)],
[setup.qc.Money(-36000)],
[setup.qc.Money(-37000)],
[setup.qc.Money(-38000)],
[setup.qc.Money(-39000)],
[setup.qc.Money(-40000)],
[setup.qc.Money(-41000)],
[setup.qc.Money(-42000)],
[setup.qc.Money(-43000)],
[setup.qc.Money(-44000)],
],
[
[],
[],
[setup.qres.Building('grandhall')],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
],
false,
)>><p>
An underground complex where you can keep your slaves.
While initially limited in size, you can build more cells to keep more slaves.
Each upgrade adds
<<= setup.FORT_SLAVE_CAPACITY_PER_CELL>>
extra space for keeping slaves.
</p><<run new setup.BuildingTemplate(
'lodgings',
'Lodgings',
['critical', 'unlocker',],
'BuildingLodgings',
1,
[
[],
[setup.qc.Money(-300)],
[setup.qc.Money(-400)],
[setup.qc.Money(-500)],
[setup.qc.Money(-800)],
/* 14 people */
[setup.qc.Money(-1000)],
[setup.qc.Money(-2000)],
/* 18 people */
[setup.qc.Money(-10000)],
[setup.qc.Money(-25000)],
[setup.qc.Money(-75000)],
/* 24 people, softcap starts */
[setup.qc.Money(-300000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-900000)],
[setup.qc.Money(-1000000)],
[setup.qc.Money(-1100000)],
[setup.qc.Money(-1200000)],
[setup.qc.Money(-1300000)],
[setup.qc.Money(-1400000)],
[setup.qc.Money(-1500000)],
[setup.qc.Money(-1600000)],
[setup.qc.Money(-1700000)],
[setup.qc.Money(-1800000)],
[setup.qc.Money(-1900000)],
[setup.qc.Money(-2000000)],
[setup.qc.Money(-2100000)],
[setup.qc.Money(-2200000)],
[setup.qc.Money(-2300000)],
[setup.qc.Money(-2400000)],
[setup.qc.Money(-2500000)],
[setup.qc.Money(-2600000)],
[setup.qc.Money(-2700000)],
[setup.qc.Money(-2800000)],
[setup.qc.Money(-2900000)],
[setup.qc.Money(-3000000)],
[setup.qc.Money(-3100000)],
[setup.qc.Money(-3200000)],
[setup.qc.Money(-3300000)],
[setup.qc.Money(-3400000)],
[setup.qc.Money(-3500000)],
[setup.qc.Money(-3600000)],
[setup.qc.Money(-3800000)],
[setup.qc.Money(-4000000)],
[setup.qc.Money(-4500000)],
[setup.qc.Money(-5000000)],
[setup.qc.Money(-7000000)],
[setup.qc.Money(-10000000)],
],
[
[],
[],
[],
/* 10 people */
[setup.qres.Building('grandhall')],
[],
[],
[],
/* 18 people */
[setup.qres.Building('veteranhall')],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
],
false,
)>><p>
The west wing of the fort has been transformed into
a lodgings area for your slavers.
While only few rooms have been prepared initially, you can prepare more rooms
to house more slavers.
Each upgrade adds
<<= setup.FORT_SLAVER_CAPACITY_PER_LODGING>>
extra spaces for slavers.
</p><<run new setup.BuildingTemplate(
'prospectshall',
'Prospects hall',
['hiring', 'critical'],
'BuildingProspectsHall',
1,
[
[setup.qc.Money(-500)],
],
[
[setup.qres.Building('lodgings')],
],
false,
)>><p>
One of the most important improvements, a prospect hall is where
new prospective slavers are accomodated in your fort before your
decide to hire them.
Unlocks hiring new slavers.
</p><<run new setup.BuildingTemplate(
'slavepens',
'Slave pens',
['hiring', 'critical'],
'BuildingSlavePens',
1,
[
[setup.qc.Money(-700)],
],
[
[setup.qres.Building('dungeons')],
],
false,
)>><p>
A must have after you build your dungeons, slave pens is where
you temporarily keep slaves you capture, as well as slaves
that are being offered to you at a price.
Unlocks getting new slaves.
</p><<run new setup.BuildingTemplate(
'hiringsquare',
'Fort Square',
['hiring', 'unlocker', ],
'BuildingHiringSquare',
1,
[
[setup.qc.Money(-700)],
],
[
[setup.qres.Building('prospectshall')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.recruiter),]
]
)>><p>
A small empty space in front of your fort where you can post
job openings.
Unlocks a contact which gives you a quest for hiring new slavers from across the region.
</p><<run new setup.BuildingTemplate(
'hiringsquaredesert',
'Recruitment Booth: Desert',
['hiring', ],
'BuildingHiringSquareDesert',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('hiringsquare'),
setup.qres.Building('scoutcarriage'),
],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.recruiterdesert),]
]
)>><p>
A booth in the <<rep setup.buildingtemplate.hiringsquare>> where you can attempt
to recruit the people and orcs living on the eastern deserts into your company.
Unlocks a contact which gives you a quest for hiring new slavers from the eastern deserts.
</p><<run new setup.BuildingTemplate(
'hiringsquareforest',
'Recruitment Booth: Forest',
['hiring', ],
'BuildingHiringSquareForest',
1,
[
[setup.qc.Money(-1500)],
],
[
[
setup.qres.Building('hiringsquare'),
setup.qres.Building('scouttower'),
],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.recruiterforest),]
]
)>><p>
A booth in the <<rep setup.buildingtemplate.hiringsquare>> where you can attempt
to recruit the nekos and elves living on the western forests into your company.
Unlocks a contact which gives you a quest for hiring new slavers from the western forests.
</p><<run new setup.BuildingTemplate(
'hiringsquaresea',
'Recruitment Booth: Sea',
['hiring', ],
'BuildingHiringSquareSea',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('hiringsquare'),
setup.qres.Building('scoutharbor'),
],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.recruitersea),]
]
)>><p>
A booth in the <<rep setup.buildingtemplate.hiringsquare>> where you can attempt
to recruit the people and occasionally dragonkins living off the southern seas into your company.
Unlocks a contact which gives you a quest for hiring new slavers from the southern seas.
</p><<run new setup.BuildingTemplate(
'hiringsquarevale',
'Recruitment Booth: Vale',
['hiring', ],
'BuildingHiringSquareVale',
1,
[
[setup.qc.Money(-1000)],
],
[
[
setup.qres.Building('hiringsquare'),
],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.recruitervale),]
]
)>><p>
A booth in the <<rep setup.buildingtemplate.hiringsquare>> where you can attempt
to recruit the northerners and weres living in the <<lore region_vale>> into your company.
Unlocks a contact which gives you a quest for hiring new slavers from the <<lore region_vale>>.
</p><<run new setup.BuildingTemplate(
'constructionoffice',
'Construction office',
['critical'],
'BuildingConstructionOffice',
1,
[
[],
],
[
[],
],
false,
)>><p>
An essential part of every fort,
this small wooden office houses all the current and future blueprints
of all the improvements in your fort.
You can make further upgrades to your fort by entering this office.
</p><<run new setup.BuildingTemplate(
'damagecontroloffice',
'Damage control office',
['duty'],
'BuildingDamageControlOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('relationsoffice'), setup.qres.Building('dutyroom')],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.DamageControlOfficer)],
],
)>><p>
Unlocks the Damage Control Officer duty, which can decrease ire
with the other forces, in exchange for some money.
</p><<run new setup.BuildingTemplate(
'insureroffice',
'Insurer office',
['duty'],
'BuildingInsurerOffice',
1,
[
[setup.qc.Money(-1500)],
],
[
[
setup.qres.Building('missioncontrol'),
setup.qres.Building('grandhall'),
],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.Insurer)],
],
)>><p>
If you want to succeed, then make plans for the failures.
Unlocks the Insurer duty,
which gives you money each time you fail a quest.
</p><<run new setup.BuildingTemplate(
'library',
'Library',
['critical'],
'BuildingLibrary',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT )],
],
[
[
setup.qres.Building('veteranhall'),
],
],
false,
)>><p>
A room full of books for the more studious slavers.
Unlocks viewing game lores at your leisure.
</p><<run new setup.BuildingTemplate(
'mailroom',
'Mail room',
['critical'],
'BuildingMailRoom',
1,
[
[setup.qc.Money(-800)],
],
[
[
setup.qres.Building('questoffice'),
],
],
false,
)>><p>
Where your incoming mails are sorted to.
Unlocks the management of opportunities.
</p><<run new setup.BuildingTemplate(
'marketeroffice',
'Marketer office',
['duty'],
'BuildingMarketerOffice',
1,
[
[setup.qc.Money(-2400)],
],
[
[setup.qres.Building('marketingoffice'), setup.qres.Building('dutyroom')],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.Marketer)],
],
)>><p>
A critical improvement if you want to dabble in slave trade.
Unlocks the Marketer duty, which gives you a fixed-price slave order each week.
</p><<run new setup.BuildingTemplate(
'marketingoffice',
'Marketing office',
['critical', 'unlocker',],
'BuildingMarketingOffice',
1,
[
[setup.qc.Money(-800)],
],
[
[
setup.qres.Building('questoffice'),
setup.qres.Building('dungeons')
],
],
false,
[
[
setup.qc.SlaveOrderMenial(),
],
]
)>><p>
This room allows the company to accept and complete slave orders.
</p><<run new setup.BuildingTemplate(
'messengerpost',
'Messenger post',
['critical'],
'BuildingMessengerPost',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('questoffice'),
setup.qres.Building('veteranhall'),
],
],
false,
)>><p>
Where you send and receive messages from across the realm.
Unlocks managing your contacts.
</p><<run new setup.BuildingTemplate(
'missioncontrol',
'Mission control',
['critical'],
'BuildingMissionControl',
1,
[
[setup.qc.Money(-800)],
[setup.qc.Money(-1200)],
[setup.qc.Money(-2000)],
[setup.qc.Money(-3000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-1200000)],
[setup.qc.Money(-2500000)],
[setup.qc.Money(-5000000)],
[setup.qc.Money(-10000000)],
],
[
[
setup.qres.Building('questoffice'),
setup.qres.Building('lodgings'),
],
[setup.qres.Building('grandhall')],
[],
[
setup.qres.Building('veteranhall'),
],
[],
[],
[],
[],
[],
],
false,
)>><p>
Unlocks team management.
Allows you to assign units to permanent team, as well as automatically
assigning units to quests.
Also allows more teams to be sent concurrently on a quest.
Can be upgraded to send even more teams concurrently on a quest,
as well as unlocking more permanent team slots.
</p><<run new setup.BuildingTemplate(
'questoffice',
'Your office',
['critical'],
'BuildingQuestOffice',
1,
[
[],
],
[
[],
],
false,
)>><p>
Your office, where you do your main work: picking and outfitting teams to quests.
</p><<run new setup.BuildingTemplate(
'relationsoffice',
'Relations office',
['critical', 'unlocker', ],
'BuildingRelationsOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('questoffice'),
setup.qres.Building('veteranhall'),
],
],
false,
)>><p>
A room for managing your company's relationship with other forces.
Allows you to see your current favors and ires with those forces.
Unlocks an improvement which opens up the Relationship Manager duty,
as well as another improvement which allows you to manage your contacts.
</p><<run new setup.BuildingTemplate(
'relationshipmanageroffice',
'Relationship manager office',
['duty',],
'BuildingRelationshipManagerOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('relationsoffice'), setup.qres.Building('dutyroom')],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.RelationshipManager)],
],
)>><p>
Unlocks the Relationship Manager duty, which can prevent favor with other companies
from decaying.
</p><<run new setup.BuildingTemplate(
'rescueroffice',
'Rescuer office',
['duty'],
'BuildingRescuerOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('missioncontrol'),
setup.qres.Building('veteranhall'),
],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.Rescuer)],
],
)>><p>
A lifeline for your slavers especially on veteran missions.
Unlocks the Rescuer duty, which gives you quests to rescue your missing slaves/slavers.
</p><<run new setup.BuildingTemplate(
'viceleaderoffice',
'Vice-leader office',
['duty'],
'BuildingViceLeaderOffice',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('questoffice'),
setup.qres.Building('veteranhall'),
],
],
false,
[
[setup.qc.Duty(setup.dutytemplate.ViceLeader)],
],
)>><p>
A lavish office suitable for your vice-leader to do their work.
Unlocks the Vice-leader duty, which increases your skills based on their skills, i.e.,
<<for _iskill, _skill range setup.skill>><<rep _skill>><</for>>.
The Vice-leader also can help automate some of your tasks.
</p><<run new setup.BuildingTemplate(
'analfuckhole',
'Anal fuckhole',
['recreation', 'duty',],
'BuildingAnalFuckhole',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.AnalFuckholeSlave)
],
],
)>><p>
Unlocks the Anal Fuckhole Slave duty, which raises prestige based on the anal skill of the slave.
</p><<run new setup.BuildingTemplate(
'bar',
'Bar',
['recreation', 'duty',],
'BuildingBar',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ServerSlave)
],
],
)>><p>
Unlocks the Server Slave duty, which raises prestige based on the edging skill of the slave.
</p><<run new setup.BuildingTemplate(
'bath',
'Bath',
['recreation', 'duty',],
'BuildingBath',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ToiletSlave)
],
],
)>><p>
Unlocks the Toilet Slave duty, which raises prestige based on the toilet skill of the slave.
</p><<run new setup.BuildingTemplate(
'cleaning',
'Cleaning',
['recreation', 'duty',],
'BuildingCleaning',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.MaidSlave)
],
],
)>><p>
Unlocks the Maid Slave duty, which raises prestige based on the domestic skill of the slave.
</p><<run new setup.BuildingTemplate(
'courtyard',
'Courtyard',
['recreation', 'duty',],
'BuildingCourtyard',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.FurnitureSlave)
],
],
)>><p>
Unlocks the Furniture Slave duty, which raises prestige based on the endurance skill of the slave.
</p><<run new setup.BuildingTemplate(
'gym',
'Gym',
['recreation', 'duty',],
'BuildingGym',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.PunchingBagSlave)
],
],
)>><p>
Unlocks the Punching Bag Slave duty, which raises prestige based on the masochist skill of the slave.
</p><<run new setup.BuildingTemplate(
'kennel',
'Kennel',
['recreation', 'duty',],
'BuildingKennel',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.DogSlave)
],
],
)>><p>
Unlocks the Dog Slave duty, which raises prestige based on the pet skill of the slave.
</p><<run new setup.BuildingTemplate(
'museum',
'Museum',
['recreation', 'duty',],
'BuildingMuseum',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.DecorationSlave)
],
],
)>><p>
Unlocks the Decoration Slave duty, which raises prestige based on the horny skill of the slave.
</p><<run new setup.BuildingTemplate(
'oralfuckhole',
'Oral fuckhole',
['recreation', 'duty',],
'BuildingOralFuckhole',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.OralFuckholeSlave)
],
],
)>><p>
Unlocks the Oral Fuckhole Slave duty, which raises prestige based on the oral skill of the slave.
</p><<run new setup.BuildingTemplate(
'pasture',
'Pasture',
['recreation', 'duty',],
'BuildingPasture',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.MilkCowSlave)
],
],
)>><p>
Unlocks the Cow Milk Slave duty, which raises prestige based on the size of the slave's milky breasts.
</p><<run new setup.BuildingTemplate(
'recreationwing',
'Recreation wing',
['recreation', 'critical', 'unlocker', ],
'BuildingRecreationWing',
1,
[
[setup.qc.Money(-3000)],
[setup.qc.MoneyMult(-12)],
[setup.qc.MoneyMult(-20)],
[setup.qc.MoneyMult(-30)],
[setup.qc.MoneyMult(-40)],
[setup.qc.MoneyMult(-50)],
[setup.qc.MoneyMult(-70)],
[setup.qc.MoneyMult(-90)],
[setup.qc.MoneyMult(-120)],
[setup.qc.MoneyMult(-150)],
[setup.qc.MoneyMult(-200)],
[setup.qc.MoneyMult(-300)],
],
[
[
setup.qres.Building('grandhall'),
setup.qres.Building('trainingchamber'),
],
[
setup.qres.Building('veteranhall'),
],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
],
false,
[
[
setup.qc.Prestige(1),
setup.qc.Duty(setup.dutytemplate.Pimp),
setup.qc.Duty(setup.dutytemplate.EntertainmentSlave),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
[
setup.qc.Prestige(1),
],
],
)>><p>
Transforms the right wing of your fort into an area of entertainment and general debauchery.
Unlocks the Pimp duty, which grants you money each week based on your prestige, and
the Entertainment Slave duty, which raises prestige based on the obedience of the slave.
Can build further improvements which further unlock slave duties that increases prestige,
which in turn boosts
the profit made by the Pimp duty.
The level of the recreation wing limits the amount of money the Pimp can make.
Upgrade the recreation wing to increase this amount.
Each upgrade also slightly increase prestige.
</p><<run new setup.BuildingTemplate(
'stables',
'Stables',
['recreation', 'duty',],
'BuildingStables',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.PonySlave)
],
],
)>><p>
Unlocks the Pony Slave duty, which raises prestige based on the pony skill of the slave.
</p><<run new setup.BuildingTemplate(
'stage',
'Stage',
['recreation', 'duty',],
'BuildingStage',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.DominatrixSlave)
],
],
)>><p>
Unlocks the Dominatrix Slave duty, which raises prestige based on the dominance skill of the slave.
</p><<run new setup.BuildingTemplate(
'tavern',
'Tavern',
['recreation', 'duty',],
'BuildingTavern',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.CumCowSlave)
],
],
)>><p>
Unlocks the Cum Cow Slave duty, which raises prestige based on the size of the slave's full balls.
</p><<run new setup.BuildingTemplate(
'theatre',
'Theatre',
['recreation', 'duty',],
'BuildingTheatre',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.TheatreSlave)
],
],
)>><p>
Unlocks the Stripper Slave duty, which raises prestige based on the sissy skill of the slave.
</p><<run new setup.BuildingTemplate(
'vaginafuckhole',
'Vagina fuckhole',
['recreation', 'duty',],
'BuildingVaginaFuckhole',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('recreationwing')],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.VaginaFuckholeSlave)
],
],
)>><p>
Unlocks the Vagina Fuckhole Slave duty, which raises prestige based on the vagina skill of the slave.
</p><<run new setup.BuildingTemplate(
'altarofdarkness',
'Altar of Darkness',
['ritualchamber'],
'BuildingAltarOfDarkness',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_VERYHIGH_MULT)],
],
[
[
setup.qres.Building('ritualchamber'),
setup.qres.HasItem(setup.item.wings_technology),
setup.qres.HasSlaverWithTraits([setup.trait.magic_dark_master]),
],
],
false,
)>><p>
Unlocks targeted corruptions on the tails, wings, and dicks of slaves.
</p><<run new setup.BuildingTemplate(
'deepaltarofdarkness',
'Deep Altar of Darkness',
['ritualchamber'],
'BuildingDeepAltarOfDarkness',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_ASTRO_MULT)],
],
[
[
setup.qres.Building('deepritualchamber'),
setup.qres.HasItem(setup.item.wings_technology),
],
],
false,
)>><p>
Unlocks targeted corruptions on the tails, wings, and dicks of slavers.
</p><<run new setup.BuildingTemplate(
'deepmirrorofthedamned',
'Deep Mirror Of The Damned',
['ritualchamber'],
'BuildingDeepMirrorOfTheDamned',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_VERYHIGH_MULT)],
],
[
[setup.qres.Building('deepritualchamber')],
],
false,
)>><p>
Unlocks targeted corruptions on the body, arms, and legs of slavers.
</p><<run new setup.BuildingTemplate(
'deeppoolofmist',
'Deep Pool of Mist',
['ritualchamber'],
'BuildingDeepPoolOfMist',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_VERYHIGH_MULT)],
],
[
[setup.qres.Building('deepritualchamber')],
],
false,
)>><p>
Unlocks targeted corruptions on the eyes, ears, and mouths of slavers.
</p><<run new setup.BuildingTemplate(
'deepritualchamber',
'Deep ritual chamber',
['ritualchamber', 'unlocker', ],
'BuildingDeepRitualChamber',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_VERYHIGH_MULT)],
],
[
[
setup.qres.Building('ritualchamber'),
setup.qres.Building('veteranhall'),
setup.qres.HasItem(setup.item.dark_technology),
setup.qres.HasSlaverWithTraits([setup.trait.magic_dark_master]),
],
],
false,
)>><p>
A damned place to communicate beyond the mist, in particular with the demon prince you have
somehow successfully bargained with.
Unlocks corruption on slavers.
Corruption requires slaves to be sent beyond the mist as payment.
Can build further improvements to unlock more targeted corruptions.
</p><<run new setup.BuildingTemplate(
'mirrorofthedamned',
'Mirror Of The Damned',
['ritualchamber'],
'BuildingMirrorOfTheDamned',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[setup.qres.Building('ritualchamber')],
],
false,
)>><p>
Unlocks targeted corruptions on the body, arms, and legs of slaves.
</p><<run new setup.BuildingTemplate(
'poolofmist',
'Pool of Mist',
['ritualchamber'],
'BuildingPoolOfMist',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[setup.qres.Building('ritualchamber')],
],
false,
)>><p>
Unlocks targeted corruptions on the eyes, ears, and mouths of slaves.
</p><<run new setup.BuildingTemplate(
'ritualchamber',
'Ritual chamber',
['ritualchamber', 'critical', 'unlocker', ],
'BuildingRitualChamber',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('veteranhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_dark]),
],
],
false,
)>><p>
A damned place to communicate beyond the mist.
Unlocks corruption on slaves.
Corruption requires slaves to be sent beyond the mist as payment.
Can build further improvements to unlock more targeted corruptions.
</p><<run new setup.BuildingTemplate(
'scoutcarriage',
'Scout Carriage',
['scout', 'unlocker',],
'BuildingScoutCarriage',
1,
[
[setup.qc.Money(-3900)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('grandhall'),
],
],
false,
[
[
setup.qc.QuestDirect('desert_contact'),
],
],
)>><p>
A horse carriage parked neatly next to the scout hut, for distant travel.
Unlocks a quest which grants a contact in the desert that supply you with scouting mission each week.
</p><<run new setup.BuildingTemplate(
'scoutharbor',
'Scout Harbor',
['scout', 'unlocker',],
'BuildingScoutHarbor',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('veteranhall'),
setup.qres.Prestige(12),
],
],
false,
[
[
setup.qc.QuestDirect('sea_contact'),
],
],
)>><p>
A fully functional harbor in the vicinity of the scout hut, for sea travel.
Unlocks a quest which grants a contact across the sea that supply you with scouting mission each week.
</p><<run new setup.BuildingTemplate(
'scouthut',
'Scout Hut',
['scout', 'unlocker',],
'BuildingScoutHut',
1,
[
[setup.qc.Money(-100)],
],
[
[],
],
false,
[
[
setup.qc.QuestDirect('vale_contact'),
],
],
)>><p>
A small hut inside your fort where your scouts prepare before venturing outside.
Unlocks a quest which grants
a contact in the <<lore region_vale>> that supply you with scouting mission each week.
</p><<run new setup.BuildingTemplate(
'scoutoffice',
'Scout Office',
['scout', 'unlocker',],
'BuildingScoutOffice',
1,
[
[setup.qc.Money(-2400)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('grandhall'),
],
],
false,
[
[
setup.qc.QuestDirect('city_contact'),
],
],
)>><p>
An office attached to the scout hut where the scouts store all the leads in
the city.
Unlocks a quest which grants a contact in the city that supply you with scouting mission each week.
</p><<run new setup.BuildingTemplate(
'scoutoutpostcity',
'Scout Outpost: City',
['scout', 'duty',],
'BuildingScoutOutpostCity',
1,
[
[setup.qc.Money(-4700)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('scoutoffice'),
setup.qres.Building('dutyroom'),
],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ScoutCity)
],
],
)>><p>
Unlocks the City Scout duty, which grants you free quest leads each week from the<<lore location_lucgate>>.
</p><<run new setup.BuildingTemplate(
'scoutoutpostdesert',
'Scout Outpost: Desert',
['scout', 'duty',],
'BuildingScoutOutpostDesert',
1,
[
[setup.qc.Money(-5800)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('scoutcarriage'),
setup.qres.Building('dutyroom'),
],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ScoutDesert)
],
],
)>><p>
Unlocks the Desert Scout duty, which grants you free quest leads each week from the eastern desert.
</p><<run new setup.BuildingTemplate(
'scoutoutpostforest',
'Scout Outpost: Forest',
['scout', 'duty',],
'BuildingScoutOutpostForest',
1,
[
[setup.qc.Money(-3200)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('scouttower'),
setup.qres.Building('dutyroom'),
],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ScoutForest)
],
],
)>><p>
Unlocks the Forest Scout duty, which grants you free quest leads each week from the western forest.
</p><<run new setup.BuildingTemplate(
'scoutoutpostsea',
'Scout Outpost: Sea',
['scout', 'duty',],
'BuildingScoutOutpostSea',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('scoutharbor'),
setup.qres.Building('dutyroom'),
setup.qres.Prestige(12),
],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ScoutSea)
],
],
)>><p>
Unlocks the Sea Scout duty, which grants you free quest leads each week from the beyond the southern sea.
</p><<run new setup.BuildingTemplate(
'scoutoutpostvale',
'Scout Outpost: Vale',
['scout', 'duty',],
'BuildingScoutOutpostVale',
1,
[
[setup.qc.Money(-2000)],
],
[
[
setup.qres.Building('scouthut'),
setup.qres.Building('dutyroom'),
],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.ScoutVale)
],
],
)>><p>
Unlocks the Vale Scout duty, which grants you free quest leads each week from the <<lore region_vale>>.
</p><<run new setup.BuildingTemplate(
'scouttower',
'Scout Tower',
['scout', 'unlocker',],
'BuildingScoutTower',
1,
[
[setup.qc.Money(-600)],
],
[
[setup.qres.Building('scouthut')],
],
false,
[
[
setup.qc.QuestDirect('forest_contact'),
],
],
)>><p>
A small tower next to the scout hut which allows your scouts to see far ahead.
Unlocks a quest which grants a contact in the western forests that supply you with scouting mission each week.
</p><<run new setup.BuildingTemplate(
'alchemistshop',
'Alchemist Shop',
['equipment', ],
'BuildingAlchemistShop',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('apothecary'),
setup.qres.Building('veteranhall'),
],
],
false,
[
[],
],
)>><p>
A laboratory for an alchemist to work their magic.
Unlocks buying an infinite number of all kinds of potions that you have ever acquired in the game, but at a
steep markup.
</p><<run new setup.BuildingTemplate(
'apothecary',
'Market',
['equipment', 'unlocker',],
'BuildingApothecary',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('warehouse')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.itempeddler),]
],
)>><p>
An area with small kiosks where peddlers can sell their goods to you and your slavers.
Unlocks buying items.
Can build improvements which attracts vendors that makes more goods available to purchase.
</p><<run new setup.BuildingTemplate(
'armory',
'Armory',
['critical', 'equipment', 'unlocker',],
'BuildingArmory',
1,
[
[setup.qc.Money(-2000)],
[setup.qc.Money(-300)],
[setup.qc.Money(-400)],
[setup.qc.Money(-500)],
[setup.qc.Money(-600)],
[setup.qc.Money(-800)],
[setup.qc.Money(-1200)],
[setup.qc.Money(-1400)],
[setup.qc.Money(-1600)],
[setup.qc.Money(-1800)],
[setup.qc.Money(-5000)],
[setup.qc.Money(-6000)],
[setup.qc.Money(-7000)],
[setup.qc.Money(-8000)],
[setup.qc.Money(-9000)],
[setup.qc.Money(-10000)],
[setup.qc.Money(-11000)],
[setup.qc.Money(-12000)],
[setup.qc.Money(-13000)],
[setup.qc.Money(-14000)],
[setup.qc.Money(-15000)],
[setup.qc.Money(-16000)],
[setup.qc.Money(-17000)],
[setup.qc.Money(-18000)],
[setup.qc.Money(-19000)],
[setup.qc.Money(-20000)],
[setup.qc.Money(-21000)],
[setup.qc.Money(-22000)],
[setup.qc.Money(-23000)],
[setup.qc.Money(-24000)],
[setup.qc.Money(-25000)],
[setup.qc.Money(-26000)],
[setup.qc.Money(-27000)],
[setup.qc.Money(-28000)],
[setup.qc.Money(-29000)],
[setup.qc.Money(-30000)],
[setup.qc.Money(-31000)],
[setup.qc.Money(-32000)],
[setup.qc.Money(-33000)],
[setup.qc.Money(-34000)],
[setup.qc.Money(-35000)],
[setup.qc.Money(-36000)],
[setup.qc.Money(-37000)],
[setup.qc.Money(-38000)],
[setup.qc.Money(-39000)],
[setup.qc.Money(-40000)],
[setup.qc.Money(-41000)],
[setup.qc.Money(-42000)],
[setup.qc.Money(-43000)],
[setup.qc.Money(-44000)],
],
[
[setup.qres.Building('grandhall')],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
],
false,
)>><p>
Where you store are all your spare equipments, and allows you to manage them more efficiently.
Unlocks the management of equipment sets.
Initially, there are only enough space for a few equipment set, but this can be
expanded by
upgrading the armory.
Each upgrade adds
<<= setup.EQUIPMENTSET_PER_STORAGE>>
extra spaces for equipment sets.
</p><<run new setup.BuildingTemplate(
'bazaar',
'Bazaar',
['equipment', 'critical'],
'BuildingBazaar',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('warehouse'), setup.qres.Building('armory')],
],
false,
[
],
)>><p>
A designated square just outside your fort where you occasionally auctions trinkets and
treasures from your raids to the public.
Unlocks selling items and spare equipments from their corresponding menus.
</p><<run new setup.BuildingTemplate(
'blacksmith',
'Blacksmith Shop',
['equipment', ],
'BuildingBlacksmith',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('forge')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.blacksmithpeddler),]
],
)>><p>
Unlocks a contact which specializes in selling gears that improve
<<rep setup.skill.combat>>, <<rep setup.skill.brawn>>, and
<<rep setup.skill.slaving>>.
</p><<run new setup.BuildingTemplate(
'forge',
'Forge',
['equipment', 'unlocker',],
'BuildingForge',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('armory')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.combatpeddler),]
],
)>><p>
An area with anvil and source of flame where blacksmiths and tailor can practice their craft.
Unlocks buying non-sexual related equipments.
Can build improvements which attracts vendors that makes more goods available to purchase.
</p><<run new setup.BuildingTemplate(
'sexshop',
'Sex Shop',
['equipment', 'unlocker',],
'BuildingSexShop',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('armory')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.sexpeddler),]
],
)>><p>
An underground room in your fort that has been transformed into a marketplace for
sexual-related items.
Unlocks buying sex equipments such as dildos and gags.
Can build improvements which attracts vendors that makes more goods available to purchase.
</p><<run new setup.BuildingTemplate(
'sexshoppet',
'Sex Shop: Pet-gear Booth',
['equipment', ],
'BuildingSexShopPet',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('sexshop')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.petpeddler),]
],
)>><p>
Unlocks a contact which sells specialized pet gears.
</p><<run new setup.BuildingTemplate(
'sexshoppony',
'Sex Shop: Pony-gear Booth',
['equipment', ],
'BuildingSexShopPony',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('sexshop')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.ponypeddler),]
],
)>><p>
Unlocks a contact which sells specialized pony gears.
</p><<run new setup.BuildingTemplate(
'tailor',
'Tailor Shop',
['equipment', ],
'BuildingTailor',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('forge')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.tailorpeddler),]
],
)>><p>
Unlocks a contact which specializes in selling gears that improve
<<rep setup.skill.survival>>, <<rep setup.skill.intrigue>>,
<<rep setup.skill.social>>, and <<rep setup.skill.sex>>.
</p><<run new setup.BuildingTemplate(
'warehouse',
'Warehouse',
['equipment', 'critical', 'unlocker',],
'BuildingWarehouse',
1,
[
[setup.qc.Money(-2400)],
],
[
[
setup.qres.Building('armory'),
setup.qres.Building('grandhall'),
],
],
false,
)>><p>
A proper place to store all your items. Allows you to see all the items you hold, as well as use
items you own such as potions.
</p><<run new setup.BuildingTemplate(
'weaver',
'Weaver Shop',
['equipment', ],
'BuildingWeaver',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('forge')],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.weaverpeddler),]
],
)>><p>
Unlocks a contact which specializes in selling gears that improve
<<rep setup.skill.knowledge>>, <<rep setup.skill.aid>>, and
<<rep setup.skill.arcane>>.
</p><<run new setup.BuildingTemplate(
'woodworks',
'Woodworks',
['equipment', ],
'BuildingWoodworks',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUM_MULT)],
],
[
[
setup.qres.Building('apothecary'),
setup.qres.Building('bedchamberwing'),
],
],
false,
[
[setup.qc.Contact(setup.contacttemplate.furniturepeddler),]
],
)>><p>
Unlocks a contact which specializes in selling furnitures for your
<<rep setup.buildingtemplate.bedchamberwing>>.
</p><<run new setup.BuildingTemplate(
'fort',
'Fort',
['critical'],
'BuildingFort',
1,
[
[],
[setup.qc.Money(-50)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
[setup.qc.Money(-200)],
/* 10 */
[setup.qc.Money(-210)],
[setup.qc.Money(-220)],
[setup.qc.Money(-230)],
[setup.qc.Money(-240)],
[setup.qc.Money(-250)],
[setup.qc.Money(-260)],
[setup.qc.Money(-270)],
[setup.qc.Money(-280)],
[setup.qc.Money(-290)],
[setup.qc.Money(-300)],
/* 20 */
[setup.qc.Money(-320)],
[setup.qc.Money(-340)],
[setup.qc.Money(-360)],
[setup.qc.Money(-380)],
[setup.qc.Money(-400)],
[setup.qc.Money(-450)],
[setup.qc.Money(-500)],
[setup.qc.Money(-550)],
[setup.qc.Money(-600)],
[setup.qc.Money(-650)],
/* 30 */
[setup.qc.Money(-700)],
[setup.qc.Money(-750)],
[setup.qc.Money(-800)],
[setup.qc.Money(-850)],
[setup.qc.Money(-900)],
[setup.qc.Money(-950)],
[setup.qc.Money(-1000)],
[setup.qc.Money(-1050)],
[setup.qc.Money(-1100)],
[setup.qc.Money(-1150)],
/* 40 */
[setup.qc.Money(-1200)],
[setup.qc.Money(-1250)],
[setup.qc.Money(-1300)],
[setup.qc.Money(-1350)],
[setup.qc.Money(-1400)],
[setup.qc.Money(-1450)],
[setup.qc.Money(-1500)],
[setup.qc.Money(-1600)],
[setup.qc.Money(-1700)],
[setup.qc.Money(-1800)],
/* 50 */
[setup.qc.Money(-1900)],
[setup.qc.Money(-2000)],
[setup.qc.Money(-2100)],
[setup.qc.Money(-2200)],
[setup.qc.Money(-2300)],
[setup.qc.Money(-2400)],
[setup.qc.Money(-2500)],
[setup.qc.Money(-2600)],
[setup.qc.Money(-2700)],
[setup.qc.Money(-2800)],
/* 60 */
[setup.qc.Money(-2900)],
[setup.qc.Money(-3000)],
[setup.qc.Money(-3100)],
[setup.qc.Money(-3200)],
[setup.qc.Money(-3300)],
[setup.qc.Money(-3400)],
[setup.qc.Money(-3500)],
[setup.qc.Money(-3600)],
[setup.qc.Money(-3700)],
[setup.qc.Money(-3800)],
/* 70 */
[setup.qc.Money(-3900)],
[setup.qc.Money(-4000)],
[setup.qc.Money(-4100)],
[setup.qc.Money(-4200)],
[setup.qc.Money(-4300)],
[setup.qc.Money(-4400)],
[setup.qc.Money(-4500)],
[setup.qc.Money(-4600)],
[setup.qc.Money(-4700)],
[setup.qc.Money(-4800)],
/* 80 */
[setup.qc.Money(-4900)],
[setup.qc.Money(-5000)],
[setup.qc.Money(-5200)],
[setup.qc.Money(-5400)],
[setup.qc.Money(-5600)],
[setup.qc.Money(-5800)],
[setup.qc.Money(-6000)],
[setup.qc.Money(-6200)],
[setup.qc.Money(-6400)],
[setup.qc.Money(-6600)],
/* 90 */
[setup.qc.Money(-6800)],
[setup.qc.Money(-7000)],
[setup.qc.Money(-7200)],
[setup.qc.Money(-7400)],
[setup.qc.Money(-7600)],
[setup.qc.Money(-7800)],
[setup.qc.Money(-8000)],
[setup.qc.Money(-8200)],
[setup.qc.Money(-8400)],
[setup.qc.Money(-8600)],
/* 100 */
[setup.qc.Money(-8800)],
[setup.qc.Money(-9000)],
[setup.qc.Money(-9200)],
[setup.qc.Money(-9600)],
[setup.qc.Money(-9800)],
[setup.qc.Money(-10000)],
[setup.qc.Money(-10000)],
[setup.qc.Money(-10000)],
[setup.qc.Money(-11000)],
[setup.qc.Money(-12000)],
/* 110 */
[setup.qc.Money(-13000)],
[setup.qc.Money(-14000)],
[setup.qc.Money(-15000)],
[setup.qc.Money(-17000)],
[setup.qc.Money(-19000)],
[setup.qc.Money(-21000)],
[setup.qc.Money(-23000)],
[setup.qc.Money(-25000)],
[setup.qc.Money(-27000)],
[setup.qc.Money(-29000)],
/* 120 */
[setup.qc.Money(-30000)],
[setup.qc.Money(-32000)],
[setup.qc.Money(-34000)],
[setup.qc.Money(-36000)],
[setup.qc.Money(-38000)],
[setup.qc.Money(-40000)],
[setup.qc.Money(-42000)],
[setup.qc.Money(-44000)],
[setup.qc.Money(-46000)],
[setup.qc.Money(-48000)],
/* 130 */
[setup.qc.Money(-50000)],
[setup.qc.Money(-52000)],
[setup.qc.Money(-54000)],
[setup.qc.Money(-56000)],
[setup.qc.Money(-58000)],
[setup.qc.Money(-60000)],
[setup.qc.Money(-62000)],
[setup.qc.Money(-64000)],
[setup.qc.Money(-66000)],
[setup.qc.Money(-68000)],
/* 140 */
[setup.qc.Money(-70000)],
[setup.qc.Money(-72000)],
[setup.qc.Money(-74000)],
[setup.qc.Money(-76000)],
[setup.qc.Money(-78000)],
[setup.qc.Money(-80000)],
[setup.qc.Money(-82000)],
[setup.qc.Money(-84000)],
[setup.qc.Money(-86000)],
[setup.qc.Money(-88000)],
/* 150 */
[setup.qc.Money(-90000)],
[setup.qc.Money(-92000)],
[setup.qc.Money(-94000)],
[setup.qc.Money(-96000)],
[setup.qc.Money(-98000)],
[setup.qc.Money(-100000)],
[setup.qc.Money(-105000)],
[setup.qc.Money(-110000)],
[setup.qc.Money(-115000)],
[setup.qc.Money(-120000)],
/* 160 */
[setup.qc.Money(-130000)],
[setup.qc.Money(-140000)],
[setup.qc.Money(-150000)],
[setup.qc.Money(-160000)],
[setup.qc.Money(-170000)],
[setup.qc.Money(-180000)],
[setup.qc.Money(-190000)],
[setup.qc.Money(-200000)],
[setup.qc.Money(-210000)],
[setup.qc.Money(-220000)],
/* 170 */
[setup.qc.Money(-230000)],
[setup.qc.Money(-240000)],
[setup.qc.Money(-250000)],
[setup.qc.Money(-260000)],
[setup.qc.Money(-270000)],
[setup.qc.Money(-280000)],
[setup.qc.Money(-290000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
/* 180 */
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
[setup.qc.Money(-300000)],
/* 190 */
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
[setup.qc.Money(-400000)],
/* 200 */
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
[setup.qc.Money(-500000)],
/* 210 */
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
[setup.qc.Money(-600000)],
/* 220 */
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
[setup.qc.Money(-700000)],
/* 230 */
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
[setup.qc.Money(-800000)],
/* 240 */
[setup.qc.Money(-900000)],
[setup.qc.Money(-900000)],
[setup.qc.Money(-900000)],
[setup.qc.Money(-1000000)],
[setup.qc.Money(-1200000)],
[setup.qc.Money(-1400000)],
[setup.qc.Money(-1600000)],
[setup.qc.Money(-1800000)],
[setup.qc.Money(-2000000)],
/* 250 */
],
[
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 10 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 20 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 30 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 40 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 50 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 60 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 70 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 80 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 90 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 100 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 110 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 120 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 130 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 140 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 150 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 160 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 170 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 180 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 190 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 200 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 210 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 220 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 230 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 240 */
[],
[],
[],
[],
[],
[],
[],
[],
[],
/* 250 */
],
false,
)>><p>
The structural integrity of your fort. As your fort has been abandoned for many
years, at the beginning, you need to hire workers to clear out the rubbles
to make spaces for other improvements.
Once all the rubbles are cleared, you can start building new structures
to house the other improvements, although this will come at a much greater costs.
</p>
<p>
Each time this improvement is upgraded, one extra improvement space is added to your fort.
</p><<run new setup.BuildingTemplate(
'grandhall',
'Grand Hall',
['critical', 'unlocker', ],
'BuildingGrandHall',
1,
[
[setup.qc.Money(-2000)],
],
[
[
setup.qres.Building('dungeons'),
setup.qres.Building('hiringsquare'),
setup.qres.Building('lodgings'),
setup.qres.Building('mailroom'),
setup.qres.Building('marketingoffice'),
setup.qres.Building('missioncontrol'),
setup.qres.Building('prospectshall'),
setup.qres.Building('slavepens'),
setup.qres.Building('scouttower'),
],
],
false,
[
[
setup.qc.Event('renovation_feast', 0),
setup.qc.Event('loan_tiger', 2),
]
]
)>><p>
Renovate the first floor of your fort into a grand hall suitable for your fledging company.
Unlocks seeing your company information, as well as many filter options in various menus.
This improvement is also required to build many of the advanced improvements.
</p><<run new setup.BuildingTemplate(
'veteranhall',
'Veteran Hall',
['critical', 'unlocker', ],
'BuildingVeteranHall',
1,
[
[setup.qc.MoneyMult(-20)],
],
[
[
setup.qres.Building('armory'),
setup.qres.Building('bedchamberwing'),
setup.qres.Building('dutyroom'),
setup.qres.Building('hospital'),
setup.qres.Building('moraleoffice'),
setup.qres.Building('recreationwing'),
setup.qres.Building('scoutcarriage'),
setup.qres.Building('scoutoffice'),
setup.qres.Building('trainingchamber'),
setup.qres.Building('traininggrounds'),
setup.qres.Building('warehouse'),
],
],
false,
[
[setup.qc.Event('veteran_celebration', 0),]
],
)>><p>
Renovates the floor above your grand hall into a grand area suitable to display your company's
achievements.
Unlocks seeing your company statistics in the company info.
Also enables veteran quests to be scouted, which are considerably harder than normal quests.
Furthermore, this improvement is a requirement for many veteran improvements.
</p>
<p>
Building this improvement will also <<successtextlite 'permanently'>> ramp up all the quest
rewards of low-level quests to the equivalent of a level <<= setup.LEVEL_VETERANHALL >> quest.
The difficulties do not change.
</p><<run new setup.BuildingTemplate(
'surgery',
'Surgery',
['biolab', 'unlocker', ],
'BuildingSurgery',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('biolab'),
setup.qres.Building('veteranhall'),
setup.qres.HasItem(setup.item.water_technology),
setup.qres.HasSlaverWithTraits([setup.trait.magic_water_master]),
],
],
false,
)>><p>
Unlocks limited muscle and height growing and shrinking on yourself and your slavers.
Can build further improvements to unlock more physical changes options.
</p><<run new setup.BuildingTemplate(
'surgeryanus',
'Surgery: Anus Operating Room',
['biolab'],
'BuildingSurgeryAnus',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('surgery'),
setup.qres.HasItem(setup.item.rear_technology),
],
],
false,
)>><p>
Unlocks tightening and loosening of yours and your slavers' anus.
</p><<run new setup.BuildingTemplate(
'surgeryballs',
'Surgery: Balls Operating Room',
['biolab'],
'BuildingSurgeryBalls',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[setup.qres.Building('surgery')],
],
false,
)>><p>
Unlocks limited growing and shrinking of yours and your slavers' balls.
</p><<run new setup.BuildingTemplate(
'surgerybreast',
'Surgery: Breast Operating Room',
['biolab'],
'BuildingSurgeryBreast',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[setup.qres.Building('surgery')],
],
false,
)>><p>
Unlocks limited growing and shrinking of yours and your slavers' breasts.
</p><<run new setup.BuildingTemplate(
'surgerydick',
'Surgery: Dick Operating Room',
['biolab'],
'BuildingSurgeryDick',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[setup.qres.Building('surgery')],
],
false,
)>><p>
Unlocks limited growing and shrinking of yours and your slavers' dicks.
</p><<run new setup.BuildingTemplate(
'surgeryvagina',
'Surgery: Vagina Operating Room',
['biolab'],
'BuildingSurgeryVagina',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('surgery'),
setup.qres.HasItem(setup.item.rear_technology),
],
],
false,
)>><p>
Unlocks tightening of yours and your slavers' vagina.
</p><<run new setup.BuildingTemplate(
'blessingroom',
'Blessing Room',
['temple'],
'BuildingBlessingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[
setup.qres.Building('temple'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_fire_master]),
],
],
false,
)>><p>
Unlocks targeted purification on the eyes, mouth, or ears of slaves and slavers.
</p><<run new setup.BuildingTemplate(
'penitenceroom',
'Penitence Room',
['temple'],
'BuildingPenitenceRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[
setup.qres.Building('temple'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_fire_master]),
],
],
false,
)>><p>
Unlocks targeted purification on the tails, wings and dicks of slaves and slavers.
</p><<run new setup.BuildingTemplate(
'prayerroom',
'Prayer Room',
['temple'],
'BuildingPrayerRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[
setup.qres.Building('temple'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_fire_master]),
],
],
false,
)>><p>
Unlocks targeted purification on the body, legs, and arms of slaves and slavers.
</p><<run new setup.BuildingTemplate(
'temple',
'Temple',
['temple', 'critical', 'unlocker', ],
'BuildingTemple',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[
setup.qres.Building('grandhall'),
setup.qres.HasSlaverWithTraits([setup.trait.magic_fire]),
],
],
false,
)>><p>
A temple to pray to some higher beings.
Unlocks purification, which can revert the effect of corruptions on both slaves and slavers,
but it costs quite a bit of money.
Can build further improvements to unlock more targeted purifications.
</p><<run new setup.BuildingTemplate(
'analtrainingroom',
'Anal Training Room',
['training'],
'BuildingAnalTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingbedroom')],
],
false,
)>><p>
Unlocks Anal Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'brainwashingroom',
'Brainwashing Room',
['training', 'hiring',],
'BuildingBrainwashingRoom',
1,
[
[
setup.qc.MoneyMult(-setup.BUILDING_HIGH_MULT)],
],
[
[
setup.qres.Building('trainingchamber'),
setup.qres.Building('convincingroom'),
setup.qres.Building('veteranhall'),
setup.qres.HasItem(setup.item.brainwash_technology),
],
],
false,
)>><p>
Where you can practice your brainwash-assisted manipulation techniques to convert
a slave into a slaver without side-effects.
Unlocks a training that can convert a slave into a slaver with no side effect other than
losing all their slave trainings.
</p><<run new setup.BuildingTemplate(
'convincingroom',
'Convincing Room',
['training', 'hiring',],
'BuildingConvincingRoom',
1,
[
[
setup.qc.Money(-3000)],
],
[
[
setup.qres.Building('trainingchamber'),
setup.qres.Building('grandhall'),
],
],
false,
)>><p>
Where you can practice your best manipulation techniques to convince a slave to do terrible things.
Unlocks a training that can convert a completely untrained slave into a slaver, although it will cost you quite a bit of money. The slaver will
also be traumatized for a good while, but there are no long-term damage.
</p><<run new setup.BuildingTemplate(
'domestictrainingroom',
'Domestic Training Room',
['training'],
'BuildingDomesticTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('fetishtrainingroom')],
],
false,
)>><p>
Unlocks Domestic Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'dominancetrainingroom',
'Dominance Training Room',
['training'],
'BuildingDominanceTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('torturechamber')],
],
false,
)>><p>
Unlocks Dominance Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'edgingtrainingroom',
'Edging Training Room',
['training'],
'BuildingEdgingTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('milkerroom')],
],
false,
)>><p>
Unlocks Edging Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'endurancetrainingroom',
'Endurance Training Room',
['training'],
'BuildingEnduranceTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingfield')],
],
false,
)>><p>
Unlocks Endurance Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'fetishtrainingroom',
'Fetish Training Room',
['training', 'unlocker', ],
'BuildingFetishTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingchamber')],
],
false,
)>><p>
Room containing several specialized tools to train slaves for particularly...
uncommon tastes.
Unlocks basic and advanced training for: toilet training, sissy training, and domestic training.
</p><<run new setup.BuildingTemplate(
'hornytrainingroom',
'Horny Training Room',
['training'],
'BuildingHornyTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('milkerroom')],
],
false,
)>><p>
Unlocks Horny Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'masochisttrainingroom',
'Masochist Training Room',
['training'],
'BuildingMasochistTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('torturechamber')],
],
false,
)>><p>
Unlocks Masochist Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'milkerroom',
'Milker Room',
['training', 'unlocker', ],
'BuildingMilkerRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('trainingchamber')],
],
false,
)>><p>
The centerpiece of this room are a row of chairs with various devious looking tubes.
They can be used to edge slaves or to milk slaves dry.
Unlocks basic and advanced edging and horny training for slaves.
</p><<run new setup.BuildingTemplate(
'obediencetrainingroom',
'Obedience Training Room',
['training'],
'BuildingObedienceTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingchamber')],
],
false,
)>><p>
Unlocks Obedience Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'oraltrainingroom',
'Oral Training Room',
['training'],
'BuildingOralTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingbedroom')],
],
false,
)>><p>
Unlocks Oral Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'pettrainingroom',
'Pet Training Room',
['training'],
'BuildingPetTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingfield')],
],
false,
)>><p>
Unlocks Pet Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'ponytrainingroom',
'Pony Training Room',
['training'],
'BuildingPonyTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingfield')],
],
false,
)>><p>
Unlocks Pony Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'sissytrainingroom',
'Sissy Training Room',
['training'],
'BuildingSissyTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('fetishtrainingroom')],
],
false,
)>><p>
Unlocks Sissy Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'toilettrainingroom',
'Toilet Training Room',
['training'],
'BuildingToiletTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('fetishtrainingroom')],
],
false,
)>><p>
Unlocks Toilet Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'torturechamber',
'Torture Chamber',
['training', 'unlocker', ],
'BuildingTortureChamber',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('trainingchamber')],
],
false,
)>><p>
Containing various tools to inflict pain upon your slaves, this room is
the dread of all but the most masochistic of slaves.
Unlocks basic and advanced dominance and masochist training for slaves, as well
as allowing you to mindbreak slaves.
</p><<run new setup.BuildingTemplate(
'trainingbedroom',
'Training Bedroom',
['training', 'unlocker', ],
'BuildingTrainingBedroom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('trainingchamber')],
],
false,
)>><p>
A small room with a bed within the training chamber complex.
Unlocks basic and advanced vaginal, oral, and anal sex training for slaves.
</p><<run new setup.BuildingTemplate(
'trainingchamber',
'Training Chamber',
['training', 'critical', 'unlocker', ],
'BuildingTrainingChamber',
1,
[
[setup.qc.Money(-1700)],
],
[
[setup.qres.Building('grandhall')],
],
false,
)>><p>
Unlocks basic and advanced obedience training for slaves.
This improvement is critical to fulfill
some of the more lucrative slave demands, which requires
that the slaves is pre-trained.
Can build further improvements to unlock special types of slave training.
</p><<run new setup.BuildingTemplate(
'trainingfield',
'Training Field',
['training', 'unlocker', ],
'BuildingTrainingField',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_CHEAP_MULT)],
],
[
[setup.qres.Building('trainingchamber')],
],
false,
)>><p>
A small fenced field right next to the training chamber, for exercising slaves.
Unlocks basic and advanced endurance, pet, and pony training for slaves.
</p><<run new setup.BuildingTemplate(
'vaginatrainingroom',
'Vagina Training Room',
['training'],
'BuildingVaginaTrainingRoom',
1,
[
[setup.qc.MoneyMult(-setup.BUILDING_MEDIUMLOW_MULT)],
],
[
[setup.qres.Building('trainingbedroom')],
],
false,
)>><p>
Unlocks Vagina Training: Master for slaves.
</p><<run new setup.BuildingTemplate(
'traininggrounds',
'Training Grounds',
['critical',],
'BuildingTrainingGrounds',
1,
[
[setup.qc.Money(-2500)],
],
[
[
setup.qres.Building('dutyroom'),
setup.qres.Building('grandhall'),
],
],
false,
[
[
setup.qc.Duty(setup.dutytemplate.Trainer),
setup.qc.Contact(setup.contacttemplate.trainer),
],
],
)>><p>
The training grounds is where your slavers can practice their skills.
Unlocks the Drill Sergeant duty, who when staffed, will generate
a quest each week that allows them to train new slavers and increase their
levels rapidly. The drill sergeant will also give EXP to units on duties.
</p><<set setup.contacttemplate = {}>>
<<include 'InitContactValeLead' >>
<<include 'InitContactForestLead' >>
<<include 'InitContactDesertLead' >>
<<include 'InitContactCityLead' >>
<<include 'InitContactSeaLead' >>
<<include 'InitContactRecruiter' >>
<<include 'InitContactRecruiterVale'>>
<<include 'InitContactRecruiterForest' >>
<<include 'InitContactRecruiterDesert' >>
<<include 'InitContactRecruiterSea' >>
<<include 'InitContactTrainer' >>
<<include 'InitContactMenialOrder' >>
<<include 'InitContactCombatPeddler' >>
<<include 'InitContactBlacksmithPeddler' >>
<<include 'InitContactTailorPeddler' >>
<<include 'InitContactWeaverPeddler' >>
<<include 'InitContactSexPeddler' >>
<<include 'InitContactItemPeddler' >>
<<include 'InitContactFurniturePeddler' >>
<<include 'InitContactPetPeddler' >>
<<include 'InitContactPonyPeddler' >>
/* quest */
<<include 'InitContactFuckholeFair'>>
<<include 'InitContactAuctionHigh'>><<run new setup.ContactTemplate(
'citylead',
'Contact in the<<lore location_lucgate>>',
'ContactCityLead',
[setup.qc.QuestDelay(setup.questpool.scoutcity)],
)>>A contact in the city who agrees to supply you with potential quest leads every week.<<run new setup.ContactTemplate(
'desertlead',
'Contact in the Eastern Desert',
'ContactDesertLead',
[setup.qc.QuestDelay(setup.questpool.scoutdesert)],
)>>A small orcish nomads who agrees to supply you with potential quest lead every week.<<run new setup.ContactTemplate(
'forestlead',
'Contact in the Western Forest',
'ContactForestLead',
[setup.qc.QuestDelay(setup.questpool.scoutforest)],
)>>You have established contact with some of the elven people at the western forest,
which supplies you with potential quest leads every week./* DEPRECATED (v1.2.5.3) */
/* WILL BE REMOVED IN v1.4 */
<<run new setup.ContactTemplate(
'menialorder',
'Mine Owner',
'ContactMenialOrder',
[
],
)>>You have made a deal with a nearby unscrupulous businessman who will be more than happy
to buy your unwanted slaves for a very cheap sum.
You can get much better value orders elsewhere, but fulfilling this order can be better than nothing.<<run new setup.ContactTemplate(
'sealead',
'Contact in the Southern Sea',
'ContactSeaLead',
[setup.qc.QuestDelay(setup.questpool.scoutsea)],
)>>A contact residing in faraway land who agrees to send you mails regarding potential
leads in the southern lands.<<run new setup.ContactTemplate(
'trainer',
'Trainer',
'ContactTrainer',
[setup.qc.QuestDelay(setup.questpool.training)],
)>>Having a <<rep setup.buildingtemplate.traininggrounds>> allows you to rapidly level your
slavers, as long as you have someone in the Drill Sergeant duty.<<run new setup.ContactTemplate(
'valelead',
'Contact in the Northern Vale',
'ContactValeLead',
[setup.qc.QuestDelay(setup.questpool.scoutvale)],
)>>You have established contact with the locals at the <<lore region_vale>>,
which supplies you with potential quest leads every week.<<run new setup.ContactTemplate(
'blacksmithpeddler',
'Blacksmith',
'ContactBlacksmithPeddler',
[
setup.qc.EquipmentForSale(
'combatequipmentmarket',
setup.equipmentpool.blacksmith,
/* amount = */ 3,
),
],
)>>A burly vendor selling iron armors and gears.<<run new setup.ContactTemplate(
'combatpeddler',
'Combat Peddler',
'ContactCombatPeddler',
[
setup.qc.EquipmentForSale(
'combatequipmentmarket',
setup.equipmentpool.all_combat,
/* amount = */ 1,
),
],
)>>Random traveling peddlers who sell combat-related equipment at your fort.<<run new setup.ContactTemplate(
'furniturepeddler',
'Furniture Peddler',
'ContactFurniturePeddler',
[
setup.qc.ItemForSale(
'itemmarket',
setup.itempool.furniture_normal,
/* amount = */ 3,
),
],
)>>A specialized peddler from the<<lore location_lucgate>> who sell furnitures for your fort.<<run new setup.ContactTemplate(
'itempeddler',
'Item Peddler',
'ContactItemPeddler',
[
setup.qc.ItemForSale(
'itemmarket',
setup.itempool.all,
/* amount = */ 1,
),
setup.qc.ItemForSale(
'itemmarket',
setup.itempool.furniture_normal,
/* amount = */ 1,
),
],
)>>Random traveling peddlers who sell random items at your fort.<<run new setup.ContactTemplate(
'petpeddler',
'Pet Peddler',
'ContactPetPeddler',
[
setup.qc.EquipmentForSale(
'sexequipmentmarket',
setup.equipmentpool.dog,
/* amount = */ 3,
),
],
)>>A peddler specializing in selling pet gears for your fort.<<run new setup.ContactTemplate(
'ponypeddler',
'Pony Peddler',
'ContactPonyPeddler',
[
setup.qc.EquipmentForSale(
'sexequipmentmarket',
setup.equipmentpool.pony,
/* amount = */ 3,
),
],
)>>A trader specializing in selling pony gears for your fort.<<run new setup.ContactTemplate(
'sexpeddler',
'Sex Peddler',
'ContactSexPeddler',
[
setup.qc.EquipmentForSale(
'sexequipmentmarket',
setup.equipmentpool.all_sex,
/* amount = */ 1,
),
],
)>>Random traveling peddlers who sell sex-related equipment at your fort.<<run new setup.ContactTemplate(
'tailorpeddler',
'Tailor',
'ContactTailorPeddler',
[
setup.qc.EquipmentForSale(
'combatequipmentmarket',
setup.equipmentpool.tailor,
/* amount = */ 3,
),
],
)>>A well-dressed tailor selling high quality outfits and clothes.<<run new setup.ContactTemplate(
'weaverpeddler',
'Weaver',
'ContactWeaverPeddler',
[
setup.qc.EquipmentForSale(
'combatequipmentmarket',
setup.equipmentpool.weaver,
/* amount = */ 3,
),
],
)>>A young beautiful lady selling various colored robes.<<run new setup.ContactTemplate(
'quest_auctionhigh',
'Contact from Auction High',
'ContactAuctionHigh',
[],
10,
)>>Your contact in the Auction High, who is responsible for managing the slave
that you decide to auction, if you choose to do so.<<run new setup.ContactTemplate(
'fuckholefair',
'Contact from Fuckhole Fair',
'ContactFuckholeFair',
[setup.qc.Money(Math.round(setup.MONEY_PER_SLAVER_WEEK * 3 / 10))],
10,
)>><<run new setup.ContactTemplate(
'recruiter',
'Recruiter',
'ContactRecruiter',
[setup.qc.QuestDelay(setup.questpool.recruitment)],
)>>Having a <<rep setup.buildingtemplate.hiringsquare>> allows you to invite people for potentially joining your band of slavers.<<run new setup.ContactTemplate(
'recruiterdesert',
'Desert Recruiter',
'ContactRecruiterDesert',
[setup.qc.QuestDelay(setup.questpool.recruitmentdesert)],
)>>A contact that came with the <<rep setup.buildingtemplate.hiringsquaredesert>>.
Grants you quest to recruit the residents of the eastern deserts to your company.<<run new setup.ContactTemplate(
'recruiterforest',
'Forest Recruiter',
'ContactRecruiterForest',
[setup.qc.QuestDelay(setup.questpool.recruitmentforest)],
)>>With the <<rep setup.buildingtemplate.hiringsquareforest>> built, this contact will
grant you quest to recruit the residents of the western forests to your company.<<run new setup.ContactTemplate(
'recruitersea',
'Sea Recruiter',
'ContactRecruiterSea',
[setup.qc.QuestDelay(setup.questpool.recruitmentsea)],
)>>An elusive contact who manned the <<rep setup.buildingtemplate.hiringsquaresea>>.
Grants you quest to recruit the residents of the southern seas to your company.<<run new setup.ContactTemplate(
'recruitervale',
'Vale Recruiter',
'ContactRecruiterVale',
[setup.qc.QuestDelay(setup.questpool.recruitmentvale)],
)>>Thanks to your <<rep setup.buildingtemplate.hiringsquarevale>>, this contact will
give you a quest to specifically recruit residents on the <<lore region_vale>> into your company.<<set setup.ch = {}>>
<<include 'InitCostHelperTransformation'>>
<<include 'InitCostHelperRear'>><<set setup.ch.gapevagina = function(actor_name) {
return setup.qc.IfActorSatisfyThen(
actor_name,
setup.qs.trait_vagina,
setup.qc.Trait(actor_name, setup.trait.vagina_gape))
}>>
<<set setup.ch.loosenvagina = function(actor_name) {
return setup.qc.IfActorSatisfyThen(
actor_name,
setup.qs.trait_vagina,
setup.qc.Trait(actor_name, setup.trait.vagina_loose))
}>>
<<set setup.ch.tightenvagina = function(actor_name) {
return setup.qc.IfActorSatisfyThen(
actor_name,
setup.qs.trait_vagina,
setup.qc.Trait(actor_name, setup.trait.vagina_tight))
}>>
<<set setup.ch.gapeanus = function(actor_name) {
return setup.qc.Trait(actor_name, setup.trait.anus_gape)
}>>
<<set setup.ch.loosenanus = function(actor_name) {
return setup.qc.Trait(actor_name, setup.trait.anus_loose)
}>>
<<set setup.ch.tightenanus = function(actor_name) {
return setup.qc.Trait(actor_name, setup.trait.anus_tight)
}>><<set setup.ch.shrinkdick = function(actor_name) {
return setup.qc.TraitDecrease(actor_name, setup.trait.dick_small)
}>>
<<set setup.ch.shrinkballs = function(actor_name) {
return setup.qc.TraitDecrease(actor_name, setup.trait.balls_small)
}>>
<<set setup.ch.shrinkbreast = function(actor_name) {
return setup.qc.Trait(actor_name, null, setup.trait.breast_tiny.getTraitGroup())
}>>
<<set setup.ch.growdick = function(actor_name) {
return setup.qc.TraitIncreaseExisting(actor_name, setup.trait.dick_large)
}>>
<<set setup.ch.growballs = function(actor_name) {
return setup.qc.TraitIncreaseExisting(actor_name, setup.trait.balls_large)
}>>
<<set setup.ch.growbreast = function(actor_name) {
return setup.qc.Trait(actor_name, setup.trait.breast_large)
}>>
<<set setup.ch.growbreastsafe = function(actor_name) {
return setup.qc.TraitIncreaseExisting(actor_name, setup.trait.breast_large)
}>>
<<set setup.ch.growdickhuge = function(actor_name) {
return setup.qc.TraitIncreaseExisting(actor_name, setup.trait.dick_huge)
}>>
<<set setup.ch.growballshuge = function(actor_name) {
return setup.qc.TraitIncreaseExisting(actor_name, setup.trait.balls_huge)
}>>
<<set setup.ch.growbreasthuge = function(actor_name) {
return setup.qc.Trait(actor_name, setup.trait.breast_huge)
}>>
<<set setup.ch.growbreasthugesafe = function(actor_name) {
return setup.qc.TraitIncreaseExisting(actor_name, setup.trait.breast_huge)
}>>[[(Icon Credits)|ImageCredits]]
<h3>Inspirations</h3>
BedlamGames, who made No Haven, which this games takes an enormous amount of inspirations from,
and FCDev, who made Free Cities, which this games also takes an enormous amount of content from.
<h3>Playtesters</h3>
Thank you playtesters for feedback, bug reports, and playtestings.
Special thanks to
Someguy01, Dirtyxmind, docclox, LordXenon_, Hermenegild, X Death
and the F95Zone community.
<h3>Unit names</h3>
Norse names from:
Coats, Steven. (2019). Language choice and gender in a Nordic social media corpus. Nordic Journal of Linguistics 42(1).
TES names:
https://en.uesp.net/wiki/Main_Page
https://github.com/KieranMcCool/TESGen
Name data are scraped from UESP and in accordance with their Copyright & Ownership guidelines, they are provided freely under the Creative Commons Attribution-ShareAlike 2.5 Generic license.
https://en.uesp.net/wiki/Lore:Khajiit_Names
https://en.uesp.net/wiki/Lore:Orc_Names
<h3>Others</h3>
Thanks to ChapelR for various Twine and SugarCube templates.
And of course, many thanks to Chris Klimas for making Twine, and
Thomas M. Edwards for making SugarCube 2.<<set _credits = setup.UnitImage.getCreditsByArtist()>>
<<set _artists = Object.keys(_credits)>>
<<run _artists.sort()>>
<<for _artist range _artists>>
<<capture _artist>>
<<message _artist>>
<<set _images = _credits[_artist]>>
<<run _images.sort((a, b) => a.info.title.localeCompare(b.info.title))>>
<<for _image range _images>>
<<set _info = _image.info>>
<<set _path = _image.path>>
"<<= _info.title>>"
<<if _info.url>>
[[(source)|_info.url]]
<</if>>
(<<= _info.license>>)
<<if _info.extra>>
[<<= _info.extra>>]
<</if>>
<<capture _path>>
<<message _path>>
<<image _path>>
<</message>>
<</capture>>
<br/>
<</for>>
<</message>>
(<<= _credits[_artist].length>> artworks)
<br/>
<</capture>>
<</for>><<set _credits = setup.getAuthorCredits()>>
<<set _authors = Object.keys(_credits)>>
<<run _authors.sort()>>
<<for _author range _authors>>
<<capture _author>>
<<message _author>>
<<set _items = ['quest', 'opportunity', 'event', 'interaction']>>
<<for _item range _items>>
<<if _credits[_author][_item].length>>
<<capture _item>>
<<message _item>>
<<for _title range _credits[_author][_item]>>
<<nameof _title>>
<br/>
<</for>>
<</message>>
(<<= _credits[_author][_item].length>>)
<br/>
<</capture>>
<</if>>
<</for>>
<</message>>
<</capture>>
(<<= _credits[_author].quest.length>> quests,
<<= _credits[_author].opportunity.length>> opportunitys,
<<= _credits[_author].event.length>> events, and
<<= _credits[_author].interaction.length>> interactions)
<br/>
<</for>><h3>Repository contributors</h3>
This is a joint work of the [[repository contributors|https://gitgud.io/darkofocdarko/foc/-/graphs/master]].
Naraden contributed many, many fixes and improvements, and acciabread
gave many suggestions and work that greatly improve the game.
Give your thanks to them!<<set setup.qu = {}>>
<<include 'InitCriteriaCombatCommon'>>
<<include 'InitCriteriaRaiderCommon'>>
<<include 'InitCriteriaBrawnCommon'>>
<<include 'InitCriteriaSurvivalCommon'>>
<<include 'InitCriteriaIntrigueCommon'>>
<<include 'InitCriteriaSlavingCommon'>>
<<include 'InitCriteriaKnowledgeCommon'>>
<<include 'InitCriteriaSocialCommon'>>
<<include 'InitCriteriaAidCommon'>>
<<include 'InitCriteriaArcaneCommon'>>
<<include 'InitCriteriaSexCommon'>>
<<include 'InitCriteriaSlaveCommon'>>
<<include 'InitCriteriaUnitTraining'>>
<<include 'InitCriteriaFleshShape'>>
<<include 'InitCriteriaSurgery'>>
<<include 'InitCriteriaCorruption'>>
<<include 'InitCriteriaPurify'>>
<<include 'InitCriteriaHeal'>>
<<include 'InitCriteriaScout'>><<run new setup.UnitCriteria(
'healer', /* key */
'Healer', /* title */
[
setup.trait.bg_healer,
setup.trait.per_kind,
setup.trait.per_humble,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.per_calm,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
], /* critical traits */
[
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_cruel,
setup.trait.per_proud,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_intimidating,
setup.trait.per_aggressive,
setup.trait.breast_tiny,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
aid: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'knight', /* key */
'Knight', /* title */
[
setup.trait.bg_knight,
setup.trait.per_brave,
setup.trait.per_chaste,
setup.trait.per_honorable,
setup.trait.per_loyal,
setup.trait.per_serious,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.skill_ambidextrous,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.race_orc,
setup.trait.race_werewolf,
setup.trait.race_neko,
setup.trait.race_elf,
setup.trait.race_demon,
setup.trait.per_cautious,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_evil,
setup.trait.per_independent,
setup.trait.per_masochistic,
setup.trait.per_lunatic,
setup.trait.per_deceitful,
setup.trait.per_cruel,
setup.trait.per_playful,
setup.trait.per_curious,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.skill_alchemy,
setup.trait.skill_flight,
setup.trait.corrupted,
setup.trait.corruptedfull,
], /* disaster traits */
[
setup.qs.job_slaver,
], /* requirement */
{ /* skill effects, sum to 3.0 */
combat: 1.0,
brawn: 1.0,
aid: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'squire', /* key */
'Squire', /* title */
[
setup.trait.per_submissive,
setup.trait.per_honest,
setup.trait.per_loyal,
setup.trait.per_studious,
setup.trait.per_humble,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.bg_knight,
setup.trait.race_orc,
setup.trait.race_werewolf,
setup.trait.race_neko,
setup.trait.race_elf,
setup.trait.race_demon,
setup.trait.per_dominant,
setup.trait.per_deceitful,
setup.trait.per_independent,
setup.trait.per_active,
setup.trait.per_proud,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.corrupted,
setup.trait.corruptedfull,
], /* disaster traits */
[
setup.qs.job_slaver,
setup.qres.NoTrait(setup.trait.bg_knight),
], /* requirement */
{ /* skill effects, sum to 3.0 */
aid: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'support', /* key */
'Support', /* title */
[ /* critical traits */
setup.trait.per_loyal,
setup.trait.per_generous,
setup.trait.skill_alchemy,
setup.trait.magic_light,
setup.trait.magic_light_master,
],
[ /* disaster traits */
setup.trait.per_independent,
setup.trait.per_thrifty,
setup.trait.skill_intimidating,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
aid: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'maid', /* key */
'Maid / Butler', /* title */
[
setup.trait.per_loyal,
setup.trait.per_submissive,
setup.trait.per_studious,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.skill_ambidextrous,
], /* critical traits */
[
setup.trait.per_independent,
setup.trait.per_dominant,
setup.trait.per_active,
setup.trait.per_lunatic,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_connected,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
aid: 2.0,
brawn: 1.0,
}
)>><<run new setup.UnitCriteria(
'arcanefire', /* key */
'Arcane (Fire)', /* title */
[ /* critical traits */
setup.trait.per_proud,
setup.trait.per_aggressive,
setup.trait.per_tough,
setup.trait.per_serious,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.skill_ambidextrous,
],
[ /* disaster traits */
setup.trait.per_humble,
setup.trait.per_calm,
setup.trait.per_nimble,
setup.trait.per_playful,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.skill_creative,
],
[
setup.qs.job_slaver
], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
combat: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanewater', /* key */
'Arcane (Water)', /* title */
[ /* critical traits */
setup.trait.per_loner,
setup.trait.per_brave,
setup.trait.per_stubborn,
setup.trait.per_honest,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.skill_creative,
],
[ /* disaster traits */
setup.trait.per_gregarious,
setup.trait.per_cautious,
setup.trait.per_curious,
setup.trait.per_deceitful,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.skill_hypnotic,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
knowledge: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanewind', /* key */
'Arcane (Wind)', /* title */
[ /* critical traits */
setup.trait.per_gregarious,
setup.trait.per_playful,
setup.trait.per_thrifty,
setup.trait.per_empath,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.skill_connected,
],
[ /* disaster traits */
setup.trait.per_loner,
setup.trait.per_serious,
setup.trait.per_generous,
setup.trait.per_logical,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_alchemy,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcaneearth', /* key */
'Arcane (Earth)', /* title */
[ /* critical traits */
setup.trait.per_humble,
setup.trait.per_nimble,
setup.trait.per_calm,
setup.trait.per_studious,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_animal,
],
[ /* disaster traits */
setup.trait.per_proud,
setup.trait.per_tough,
setup.trait.per_aggressive,
setup.trait.per_active,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.skill_flight,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
survival: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanelight', /* key */
'Arcane (Light)', /* title */
[ /* critical traits */
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_loyal,
setup.trait.per_chaste,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.skill_alchemy,
],
[ /* disaster traits */
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_independent,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_entertain,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
aid: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanedark', /* key */
'Arcane (Dark)', /* title */
[ /* critical traits */
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_deceitful,
setup.trait.per_active,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_entertain,
],
[ /* disaster traits */
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_honest,
setup.trait.per_studious,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.skill_animal,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanefireveteran', /* key */
'Arcane Veteran (Fire)', /* title */
[ /* critical traits */
setup.trait.per_proud,
setup.trait.per_aggressive,
setup.trait.per_tough,
setup.trait.per_serious,
setup.trait.magic_fire_master,
setup.trait.skill_ambidextrous,
],
[ /* disaster traits */
setup.trait.per_humble,
setup.trait.per_calm,
setup.trait.per_nimble,
setup.trait.per_playful,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.skill_creative,
],
[
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_fire),
], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
combat: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanewaterveteran', /* key */
'Arcane Veteran (Water)', /* title */
[ /* critical traits */
setup.trait.per_loner,
setup.trait.per_brave,
setup.trait.per_stubborn,
setup.trait.per_honest,
setup.trait.magic_water_master,
setup.trait.skill_creative,
],
[ /* disaster traits */
setup.trait.per_gregarious,
setup.trait.per_cautious,
setup.trait.per_curious,
setup.trait.per_deceitful,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.skill_hypnotic,
],
[
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_water),
], /* requirement */
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
knowledge: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanewindveteran', /* key */
'Arcane Veteran (Wind)', /* title */
[ /* critical traits */
setup.trait.per_gregarious,
setup.trait.per_playful,
setup.trait.per_thrifty,
setup.trait.per_empath,
setup.trait.magic_wind_master,
setup.trait.skill_connected,
],
[ /* disaster traits */
setup.trait.per_loner,
setup.trait.per_serious,
setup.trait.per_generous,
setup.trait.per_logical,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_alchemy,
],
[ /* requirement */
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_wind),
],
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcaneearthveteran', /* key */
'Arcane Veteran (Earth)', /* title */
[ /* critical traits */
setup.trait.per_humble,
setup.trait.per_nimble,
setup.trait.per_calm,
setup.trait.per_studious,
setup.trait.magic_earth_master,
setup.trait.skill_animal,
],
[ /* disaster traits */
setup.trait.per_proud,
setup.trait.per_tough,
setup.trait.per_aggressive,
setup.trait.per_active,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.skill_flight,
],
[ /* requirement */
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_earth),
],
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
survival: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanelightveteran', /* key */
'Arcane Veteran (Light)', /* title */
[ /* critical traits */
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_loyal,
setup.trait.per_chaste,
setup.trait.magic_light_master,
setup.trait.skill_alchemy,
],
[ /* disaster traits */
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_independent,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_entertain,
],
[ /* requirement */
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_light),
],
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
aid: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'arcanedarkveteran', /* key */
'Arcane Veteran (Dark)', /* title */
[ /* critical traits */
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_deceitful,
setup.trait.per_active,
setup.trait.magic_dark_master,
setup.trait.skill_entertain,
],
[ /* disaster traits */
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_honest,
setup.trait.per_studious,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.skill_animal,
],
[ /* requirement */
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_dark),
],
{ /* skill effects, sums to 3.0 */
arcane: 2.0,
sex: 1.0,
}
)>><<run new setup.UnitCriteria(
'builder', /* key */
'Builder', /* title */
[
setup.trait.bg_laborer,
setup.trait.per_tough,
setup.trait.per_studious,
setup.trait.per_submissive,
setup.trait.muscle_strong,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong
], /* critical traits */
[
setup.trait.per_nimble,
setup.trait.per_active,
setup.trait.per_sexaddict,
setup.trait.per_dominant,
setup.trait.muscle_weak,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
brawn: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'tank', /* key */
'Tank', /* title */
[
setup.trait.per_tough,
setup.trait.per_stubborn,
setup.trait.per_masochistic,
setup.trait.per_dominant,
setup.trait.muscle_strong,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.height_giant,
setup.trait.skill_intimidating,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.per_nimble,
setup.trait.per_curious,
setup.trait.per_independent,
setup.trait.per_submissive,
setup.trait.muscle_weak,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.height_dwarf,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
brawn: 2.0,
combat: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'brawler', /* key */
'Brawler', /* title */
[
setup.trait.per_tough,
setup.trait.per_stubborn,
setup.trait.per_aggressive,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.height_giant,
setup.trait.skill_intimidating,
], /* critical traits */
[
setup.trait.per_masochistic,
setup.trait.per_nimble,
setup.trait.per_curious,
setup.trait.per_calm,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.height_dwarf,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
brawn: 2.0,
combat: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'carrier', /* key */
'Carrier', /* title */
[
setup.trait.bg_laborer,
setup.trait.per_honest,
setup.trait.per_submissive,
setup.trait.per_slow,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
], /* critical traits */
[
setup.trait.per_deceitful,
setup.trait.per_dominant,
setup.trait.per_lunatic,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.skill_flight,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
brawn: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'dragontamer', /* key */
'Dragon Tamer', /* title */
[ /* critical traits */
setup.trait.race_dragonkin,
setup.trait.per_aggressive,
setup.trait.per_honorable,
setup.trait.per_brave,
setup.trait.per_masochistic,
setup.trait.skill_hypnotic,
setup.trait.skill_animal,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.magic_light,
setup.trait.magic_light_master,
],
[ /* disaster traits */
setup.trait.race_humanvale,
setup.trait.race_humankingdom,
setup.trait.race_humandesert,
setup.trait.race_humansea,
setup.trait.race_elf,
setup.trait.race_neko,
setup.trait.per_calm,
setup.trait.per_evil,
setup.trait.per_cautious,
setup.trait.per_lunatic,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
brawn: 1.0,
slaving: 1.0,
knowledge: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'blacksmith', /* key */
'Blacksmith', /* title */
[ /* critical traits */
setup.trait.bg_artisan,
setup.trait.bg_metalworker,
setup.trait.race_dragonkin,
setup.trait.muscle_strong,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.per_tough,
setup.trait.per_calm,
setup.trait.skill_creative,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[ /* disaster traits */
setup.trait.muscle_weak,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.per_nimble,
setup.trait.per_aggressive,
setup.trait.per_masochistic,
setup.trait.magic_water,
setup.trait.magic_water_master,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
brawn: 1.5,
knowledge: 1.5,
}
)>><<run new setup.UnitCriteria(
'guard', /* key */
'Guard', /* title */
[
setup.trait.bg_soldier,
setup.trait.per_loyal,
setup.trait.per_brave,
setup.trait.per_honorable,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.bg_raider,
setup.trait.bg_thug,
setup.trait.per_independent,
setup.trait.per_cautious,
setup.trait.per_evil,
setup.trait.magic_water,
setup.trait.magic_water_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
combat: 2.0,
brawn: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'fighter', /* key */
'Fighter', /* title */
[
setup.trait.bg_adventurer,
setup.trait.bg_mercenary,
setup.trait.per_proud,
setup.trait.per_stubborn,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.height_tall,
setup.trait.height_giant,
setup.trait.skill_ambidextrous,
], /* critical traits */
[
setup.trait.eq_restrained,
setup.trait.eq_blind,
setup.trait.per_humble,
setup.trait.per_masochistic,
setup.trait.per_curious,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.height_dwarf,
setup.trait.magic_water,
setup.trait.magic_water_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
combat: 2.0,
brawn: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'guardsupport', /* key */
'Guard Support', /* title */
[ /* critical traits */
setup.trait.bg_healer,
setup.trait.per_loyal,
setup.trait.per_kind,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
],
[
setup.trait.per_independent,
setup.trait.per_cruel,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
aid: 2.0,
combat: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'defender', /* key */
'Defender', /* title */
[
setup.trait.bg_knight,
setup.trait.per_chaste,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
], /* critical traits */
[
setup.trait.bg_raider,
setup.trait.bg_thug,
setup.trait.bg_slaver,
setup.trait.per_masochistic,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_lunatic,
setup.trait.eq_slutty,
setup.trait.eq_veryslutty,
setup.trait.magic_water,
setup.trait.magic_water_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sum to 3.0 */
combat: 2,
aid: 1,
}
)>>
<<run new setup.UnitCriteria(
'defendersupport', /* key */
'Defender Support', /* title */
[ /* critical traits */
setup.trait.per_chaste,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.skill_alchemy,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.breast_large,
setup.trait.breast_huge,
],
[ /* disaster traits */
setup.trait.per_masochistic,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.breast_titanic,
setup.trait.breast_tiny,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sum to 3.0 */
aid: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'dark_warrior', /* key */
'Dark Warrior', /* title */
[
setup.trait.per_loner,
setup.trait.per_cruel,
setup.trait.per_dominant,
setup.trait.per_evil,
setup.trait.per_proud,
setup.trait.per_independent,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.skill_intimidating,
], /* critical traits */
[
setup.trait.bg_knight,
setup.trait.skill_animal,
setup.trait.per_gregarious,
setup.trait.per_kind,
setup.trait.per_submissive,
setup.trait.per_honorable,
setup.trait.per_playful,
setup.trait.per_humble,
setup.trait.per_generous,
setup.trait.per_loyal,
setup.trait.per_lunatic,
setup.trait.per_masochistic,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
combat: 2.0,
arcane: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'light_warrior', /* key */
'Light Warrior', /* title */
[
setup.trait.bg_knight,
setup.trait.per_kind,
setup.trait.per_dominant,
setup.trait.per_honorable,
setup.trait.per_empath,
setup.trait.per_humble,
setup.trait.per_loyal,
setup.trait.per_serious,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.skill_animal,
], /* critical traits */
[
setup.trait.skill_intimidating,
setup.trait.per_loner,
setup.trait.per_cruel,
setup.trait.per_submissive,
setup.trait.per_proud,
setup.trait.per_logical,
setup.trait.per_evil,
setup.trait.per_independent,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
combat: 2.0,
aid: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'dps', /* key */
'Damager', /* title */
[
setup.trait.bg_assassin,
setup.trait.per_nimble,
setup.trait.per_lunatic,
setup.trait.skill_creative,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.skill_ambidextrous,
], /* critical traits */
[
setup.trait.per_tough,
setup.trait.per_lunatic,
setup.trait.per_sexaddict,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.magic_light,
setup.trait.magic_light_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
combat: 2.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'pirate', /* key */
'Pirate', /* title */
[ /* critical traits */
setup.trait.bg_pirate,
setup.trait.per_playful,
setup.trait.per_active,
setup.trait.per_lunatic,
setup.trait.skill_ambidextrous,
setup.trait.magic_water,
setup.trait.magic_water_master,
],
[ /* disaster traits */
setup.trait.per_serious,
setup.trait.per_studious,
setup.trait.per_masochistic,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
combat: 1.0,
brawn: 1.0,
slaving: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'mercenary', /* key */
'Mercenary', /* title */
[ /* critical traits */
setup.trait.bg_mercenary,
setup.trait.per_thrifty,
setup.trait.per_independent,
setup.trait.per_honest,
setup.trait.muscle_strong,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
],
[ /* disaster traits */
setup.trait.per_generous,
setup.trait.per_loyal,
setup.trait.per_deceitful,
setup.trait.per_masochistic,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.join_junior,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
combat: 1.0,
brawn: 1.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'archer', /* key */
'Archer', /* title */
[ /* critical traits */
setup.trait.bg_hunter,
setup.trait.per_attentive,
setup.trait.per_nimble,
setup.trait.per_calm,
setup.trait.height_tall,
setup.trait.height_giant,
setup.trait.skill_flight,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
],
[ /* disaster traits */
setup.trait.per_tough,
setup.trait.per_dreamy,
setup.trait.per_sexaddict,
setup.trait.per_masochistic,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.height_short,
setup.trait.height_dwarf,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.eq_blind,
setup.trait.eq_restrained,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
combat: 1.5,
survival: 1.5,
}
)>><<run new setup.UnitCriteria(
'corruption_head',
'Head Corruptor',
[
setup.trait.race_demon,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_dominant,
setup.trait.corrupted,
setup.trait.corruptedfull,
],
[
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_masochistic,
setup.trait.per_chaste,
setup.trait.per_submissive,
],
[setup.qs.job_slaver, setup.qres.Trait(setup.trait.magic_dark,
setup.trait.magic_dark_master)],
{
arcane: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'corruption_assistant',
'Assistant Corruptor',
[
setup.trait.bg_apprentice,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.per_evil,
setup.trait.per_cruel,
setup.trait.per_active,
],
[
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_chaste,
setup.trait.per_studious,
],
[setup.qs.job_slaver],
{
arcane: 2.0,
slaving: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'corruptor',
'Corruptor',
[
setup.trait.per_evil,
setup.trait.per_lunatic,
setup.trait.per_cruel,
setup.trait.per_masochistic,
setup.trait.per_sexaddict,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_hypnotic,
],
[
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_logical,
setup.trait.per_chaste,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.magic_dark,
setup.trait.magic_dark_master),
],
{
arcane: 3.0,
}
)>><<run new setup.UnitCriteria(
'fleshshape_head',
'Head Flesh-Shaper',
[
setup.trait.race_humanvale,
setup.trait.race_werewolf,
setup.trait.per_chaste,
setup.trait.per_attentive,
setup.trait.per_cautious,
setup.trait.magic_water,
setup.trait.magic_water_master,
],
[
setup.trait.per_dreamy,
setup.trait.per_lustful,
setup.trait.per_brave,
setup.trait.per_lunatic,
setup.trait.per_sexaddict,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[setup.qs.job_slaver, setup.qres.Trait(setup.trait.magic_water,
setup.trait.magic_water_master)],
{
arcane: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'fleshshape_assistant',
'Assistant Flesh-Shaper',
[
setup.trait.race_humanvale,
setup.trait.race_werewolf,
setup.trait.per_chaste,
setup.trait.per_attentive,
setup.trait.per_cautious,
setup.trait.magic_water,
setup.trait.magic_water_master,
],
[
setup.trait.per_dreamy,
setup.trait.per_lustful,
setup.trait.per_brave,
setup.trait.per_lunatic,
setup.trait.per_sexaddict,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[setup.qs.job_slaver],
{
arcane: 2.0,
aid: 1.0,
}
)>><<run new setup.UnitCriteria(
'heal_head',
'Head Healer',
[
setup.trait.bg_healer,
setup.trait.per_masochistic,
setup.trait.per_kind,
setup.trait.per_empath,
setup.trait.per_humble,
setup.trait.magic_light,
setup.trait.magic_light_master,
],
[
setup.trait.per_cruel,
setup.trait.per_lunatic,
setup.trait.per_logical,
setup.trait.per_proud,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.corrupted,
setup.trait.corruptedfull,
],
[setup.qs.job_slaver, setup.qres.Trait(setup.trait.magic_light,
setup.trait.magic_light_master)],
{
aid: 2.0,
arcane: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'heal_assistant',
'Assistant Healer',
[
setup.trait.per_submissive,
setup.trait.per_kind,
setup.trait.per_empath,
setup.trait.per_humble,
setup.trait.magic_light,
setup.trait.magic_light_master,
],
[
setup.trait.per_dominant,
setup.trait.per_cruel,
setup.trait.per_logical,
setup.trait.per_proud,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.corrupted,
setup.trait.corruptedfull,
],
[setup.qs.job_slaver],
{
aid: 3.0,
}
)>><<run new setup.UnitCriteria(
'infiltrator', /* key */
'Infiltrator', /* title */
[ /* critical traits */
setup.trait.bg_thief,
setup.trait.bg_assassin,
setup.trait.per_nimble,
setup.trait.per_attentive,
setup.trait.skill_hypnotic,
setup.trait.skill_creative,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[ /* disaster traits */
setup.trait.per_honorable,
setup.trait.per_tough,
setup.trait.per_masochistic,
setup.trait.per_dreamy,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
intrigue: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'thief', /* key */
'Thief', /* title */
[ /* critical traits */
setup.trait.bg_thief,
setup.trait.per_loner,
setup.trait.per_aggressive,
setup.trait.per_thrifty,
setup.trait.per_independent,
setup.trait.per_attentive,
setup.trait.per_nimble,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_flight,
],
[
setup.trait.per_gregarious,
setup.trait.per_calm,
setup.trait.per_generous,
setup.trait.per_loyal,
setup.trait.per_dreamy,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.per_honorable,
setup.trait.magic_light,
setup.trait.magic_light_master
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
intrigue: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'kidnapper', /* key */
'Kidnapper', /* title */
[ /* critical traits */
setup.trait.per_cruel,
setup.trait.per_nimble,
setup.trait.per_evil,
setup.trait.skill_hypnotic,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[ /* disaster traits */
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_tough,
setup.trait.magic_light,
setup.trait.magic_light_master
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
intrigue: 1.5,
slaving: 1.5,
}
)>>
<<run new setup.UnitCriteria(
'schemer', /* key */
'Schemer', /* title */
[ /* critical traits */
setup.trait.per_deceitful,
setup.trait.per_cautious,
setup.trait.per_studious,
setup.trait.per_logical,
setup.trait.skill_creative,
],
[ /* disaster traits */
setup.trait.per_honest,
setup.trait.per_aggressive,
setup.trait.per_active,
setup.trait.per_empath,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
intrigue: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'conartist', /* key */
'Con Artist', /* title */
[ /* critical traits */
setup.trait.per_deceitful,
setup.trait.per_playful,
setup.trait.per_lunatic,
setup.trait.per_evil,
setup.trait.skill_hypnotic,
],
[ /* disaster traits */
setup.trait.bg_thug,
setup.trait.per_honest,
setup.trait.per_serious,
setup.trait.per_honorable,
setup.trait.per_masochistic,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
intrigue: 1.5,
social: 1.5,
}
)>>
<<run new setup.UnitCriteria(
'shadow_fighter', /* key */
'Shadow Fighter', /* title */
[ /* critical traits */
setup.trait.bg_assassin,
setup.trait.per_nimble,
setup.trait.per_calm,
setup.trait.per_serious,
setup.trait.skill_ambidextrous,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[ /* disaster traits */
setup.trait.per_tough,
setup.trait.per_aggressive,
setup.trait.per_lunatic,
setup.trait.per_playful,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
intrigue: 1.0,
combat: 1.0,
survival: 1.0,
}
)>><<run new setup.UnitCriteria(
'planner', /* key */
'Planner', /* title */
[ /* critical traits */
setup.trait.bg_scholar,
setup.trait.per_cautious,
setup.trait.per_smart,
setup.trait.per_studious,
setup.trait.skill_creative,
],
[ /* disaster traits */
setup.trait.per_aggressive,
setup.trait.per_slow,
setup.trait.per_active
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
knowledge: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'biologist', /* key */
'Biologist', /* title */
[
setup.trait.bg_scholar,
setup.trait.per_cautious,
setup.trait.per_smart,
setup.trait.per_logical,
setup.trait.skill_animal,
setup.trait.skill_alchemy,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
], /* critical traits */
[
setup.trait.per_aggressive,
setup.trait.per_slow,
setup.trait.per_empath,
setup.trait.skill_intimidating,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
survival: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'bidder', /* key */
'Bidder', /* title */
[
setup.trait.bg_informer,
setup.trait.per_thrifty,
setup.trait.per_calm,
setup.trait.per_attentive,
setup.trait.per_cautious,
setup.trait.per_calm,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.bg_slave,
setup.trait.per_dreamy,
setup.trait.per_generous,
setup.trait.per_brave,
setup.trait.per_honest,
setup.trait.per_aggressive,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
knowledge: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'explorer', /* key */
'Explorer', /* title */
[ /* critical traits */
setup.trait.bg_adventurer,
setup.trait.per_curious,
setup.trait.per_brave,
setup.trait.per_studious,
setup.trait.skill_animal,
],
[ /* disaster traits */
setup.trait.per_stubborn,
setup.trait.per_cautious,
setup.trait.per_active,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[
setup.qs.job_slaver
], /* requirement */
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
survival: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'milker', /* key */
'Milker', /* title */
[
setup.trait.bg_farmer,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_cruel,
setup.trait.per_nimble,
setup.trait.per_playful,
setup.trait.skill_animal,
setup.trait.skill_ambidextrous,
], /* critical traits */
[
setup.trait.per_chaste,
setup.trait.per_kind,
setup.trait.per_tough,
setup.trait.per_serious,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'alchemist', /* key */
'Alchemist', /* title */
[
setup.trait.bg_scholar,
setup.trait.per_curious,
setup.trait.per_studious,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_alchemy,
], /* critical traits */
[
setup.trait.per_stubborn,
setup.trait.per_active,
setup.trait.per_sexaddict,
setup.trait.skill_creative,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
arcane: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'navigator', /* key */
'Navigator', /* title */
[
setup.trait.bg_seaman,
setup.trait.per_attentive,
setup.trait.per_smart,
setup.trait.per_cautious,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.skill_flight,
], /* critical traits */
[
setup.trait.race_humandesert,
setup.trait.per_dreamy,
setup.trait.race_orc,
setup.trait.per_lunatic,
setup.trait.per_slow,
setup.trait.per_brave,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
survival: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'alchemist_veteran', /* key */
'Veteran Alchemist', /* title */
[
setup.trait.bg_scholar,
setup.trait.per_smart,
setup.trait.per_curious,
setup.trait.per_studious,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
], /* critical traits */
[
setup.trait.per_slow,
setup.trait.per_stubborn,
setup.trait.per_active,
setup.trait.per_sexaddict,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.skill_alchemy),
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
arcane: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'hypnotist', /* key */
'Hypnotist', /* title */
[
setup.trait.per_dominant,
setup.trait.per_empath,
setup.trait.per_gregarious,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.skill_hypnotic,
], /* critical traits */
[
setup.trait.skill_animal,
setup.trait.per_submissive,
setup.trait.per_sexaddict,
setup.trait.per_masochistic,
setup.trait.per_logical,
setup.trait.per_loner,
setup.trait.face_ugly,
setup.trait.face_hideous,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'hypnotist_veteran', /* key */
'Hypnotist Veteran', /* title */
[
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.per_dominant,
setup.trait.per_empath,
setup.trait.per_gregarious,
setup.trait.face_attractive,
setup.trait.face_beautiful,
], /* critical traits */
[
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_animal,
setup.trait.per_submissive,
setup.trait.per_sexaddict,
setup.trait.per_masochistic,
setup.trait.per_logical,
setup.trait.per_loner,
setup.trait.face_ugly,
setup.trait.face_hideous,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.skill_hypnotic),
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'writer', /* key */
'Writer', /* title */
[
setup.trait.bg_artist,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_studious,
setup.trait.per_curious,
setup.trait.per_dreamy,
setup.trait.skill_entertain,
setup.trait.skill_creative,
], /* critical traits */
[
setup.trait.per_lunatic,
setup.trait.per_active,
setup.trait.per_stubborn,
setup.trait.per_attentive,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'bureaucrat', /* key */
'Bureaucrat', /* title */
[
setup.trait.bg_clerk,
setup.trait.per_cruel,
setup.trait.per_evil,
setup.trait.per_studious,
setup.trait.per_masochistic,
], /* critical traits */
[
setup.trait.bg_artist,
setup.trait.per_kind,
setup.trait.per_honorable,
setup.trait.per_generous,
setup.trait.per_active,
setup.trait.per_lunatic,
setup.trait.skill_creative,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'appraiser', /* key */
'Appraiser', /* title */
[
setup.trait.bg_merchant,
setup.trait.per_thrifty,
setup.trait.per_attentive,
setup.trait.per_curious,
setup.trait.skill_connected,
], /* critical traits */
[
setup.trait.per_lunatic,
setup.trait.per_dreamy,
setup.trait.per_generous,
setup.trait.per_stubborn,
setup.trait.trauma_knowledge,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'scientist', /* key */
'Scientist', /* title */
[
setup.trait.bg_scholar,
setup.trait.per_logical,
setup.trait.per_studious,
setup.trait.per_smart,
setup.trait.per_humble,
setup.trait.skill_creative,
setup.trait.magic_water,
setup.trait.magic_water_master,
], /* critical traits */
[
setup.trait.per_proud,
setup.trait.bg_apprentice,
setup.trait.bg_mystic,
setup.trait.bg_mythical,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.per_empath,
setup.trait.per_active,
setup.trait.per_slow,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.skill_hypnotic,
], /* disaster traits */
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'crafter', /* key */
'Crafter', /* title */
[ /* critical traits */
setup.trait.bg_artisan,
setup.trait.per_cautious,
setup.trait.per_studious,
setup.trait.per_lunatic,
setup.trait.skill_creative,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
],
[ /* disaster traits */
setup.trait.per_brave,
setup.trait.per_active,
setup.trait.per_lunatic,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
slaving: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'ritualist', /* key */
'Ritualist', /* title */
[ /* critical traits */
setup.trait.per_calm,
setup.trait.per_chaste,
setup.trait.per_loner,
setup.trait.magic_water_master,
setup.trait.magic_earth_master,
setup.trait.magic_wind_master,
setup.trait.magic_fire_master,
setup.trait.magic_dark_master,
setup.trait.magic_light_master,
],
[ /* disaster traits */
setup.trait.per_gregarious,
setup.trait.per_aggressive,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_masochistic,
setup.trait.per_lunatic,
],
[ /* requirement */
setup.qs.job_slaver,
],
{ /* skill effects, sums to 3.0 */
knowledge: 2.0,
arcane: 1.0,
}
)>><<run new setup.UnitCriteria(
'purify_head',
'Head Purifier',
[
setup.trait.bg_priest,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.per_chaste,
setup.trait.per_kind,
setup.trait.per_submissive,
setup.trait.per_masochistic,
setup.trait.per_honorable,
],
[
setup.trait.race_demon,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_cruel,
setup.trait.per_dominant,
setup.trait.per_evil,
setup.trait.per_curious,
setup.trait.corrupted,
setup.trait.corruptedfull,
],
[setup.qs.job_slaver, setup.qres.Trait(setup.trait.magic_fire,
setup.trait.magic_fire_master)],
{
aid: 1.5,
arcane: 1.5,
}
)>>
<<run new setup.UnitCriteria(
'purify_assistant',
'Assistant Purifier',
[
setup.trait.bg_apprentice,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.per_chaste,
setup.trait.per_kind,
setup.trait.per_honorable,
],
[
setup.trait.race_demon,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_cruel,
setup.trait.per_evil,
setup.trait.corrupted,
setup.trait.corruptedfull,
],
[setup.qs.job_slaver],
{
knowledge: 1.5,
aid: 1.5,
}
)>>
<<run new setup.UnitCriteria(
'repentant',
'Repentant',
[
setup.trait.per_chaste,
setup.trait.per_kind,
setup.trait.per_honorable,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_cruel,
setup.trait.per_lunatic,
setup.trait.per_evil,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[
setup.qs.job_slaver,
setup.qres.NoTrait(setup.trait.race_demon),
],
{
arcane: 1.0,
aid: 1.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'purifier',
'Purifier',
[
setup.trait.bg_priest,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.per_chaste,
setup.trait.per_honorable,
setup.trait.per_studious,
],
[
setup.trait.race_demon,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_cruel,
setup.trait.per_evil,
setup.trait.per_active,
setup.trait.corrupted,
setup.trait.corruptedfull,
],
[setup.qs.job_slaver],
{
aid: 2.0,
arcane: 1.0,
}
)>><<run new setup.UnitCriteria(
'raider', /* key */
'Raider', /* title */
[
setup.trait.bg_raider,
setup.trait.per_aggressive,
setup.trait.per_playful,
setup.trait.per_cruel,
setup.trait.per_dreamy,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.skill_ambidextrous,
setup.trait.skill_intimidating,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.per_attentive,
setup.trait.per_kind,
setup.trait.per_humble,
setup.trait.per_honorable,
setup.trait.per_serious,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sum to 3.0 */
combat: 2.0,
brawn: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'raidersupport', /* key */
'Raider Support', /* title */
[ /* critical traits */
setup.trait.bg_raider,
setup.trait.per_calm,
setup.trait.per_loyal,
setup.trait.per_dreamy,
setup.trait.magic_light,
setup.trait.magic_light_master,
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_attentive,
setup.trait.per_kind,
setup.trait.per_humble,
setup.trait.per_honorable,
setup.trait.per_aggressive,
setup.trait.per_independent,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sum to 3.0 */
aid: 2.0,
knowledge: 1.0,
}
)>><<run new setup.UnitCriteria(
'scout_vale',
'Scout (Vale)',
[
setup.trait.race_werewolf,
setup.trait.race_humanvale,
setup.trait.per_attentive,
setup.trait.per_honest,
setup.trait.per_curious,
setup.trait.skill_flight,
setup.trait.magic_water,
setup.trait.magic_water_master,
],
[
setup.trait.per_dreamy,
setup.trait.race_orc,
setup.trait.race_humandesert,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.per_deceitful,
setup.trait.per_stubborn,
],
[setup.qs.job_slaver],
{
survival: 2.0,
knowledge: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'scout_city',
'Scout (City)',
[
setup.trait.bg_informer,
setup.trait.race_humankingdom,
setup.trait.per_thrifty,
setup.trait.per_deceitful,
setup.trait.per_curious,
setup.trait.skill_connected,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
],
[
setup.trait.skill_intimidating,
setup.trait.race_elf,
setup.trait.race_neko,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.per_generous,
setup.trait.per_stubborn,
setup.trait.per_honest,
],
[setup.qs.job_slaver],
{
survival: 1.0,
social: 1.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'scout_forest',
'Scout (Forest)',
[
setup.trait.bg_woodsman,
setup.trait.race_elf,
setup.trait.race_neko,
setup.trait.per_cautious,
setup.trait.per_loner,
setup.trait.skill_animal,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
],
[
setup.trait.race_humankingdom,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.per_gregarious,
setup.trait.per_brave,
],
[setup.qs.job_slaver],
{
survival: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'scout_desert',
'Scout (Desert)',
[
setup.trait.bg_nomad,
setup.trait.race_orc,
setup.trait.race_humandesert,
setup.trait.per_tough,
setup.trait.per_calm,
setup.trait.skill_intimidating,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[
setup.trait.race_humanvale,
setup.trait.race_werewolf,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.per_aggressive,
],
[setup.qs.job_slaver],
{
survival: 2.0,
brawn: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'scout_sea',
'Scout (Sea)',
[
setup.trait.bg_seaman,
setup.trait.race_dragonkin,
setup.trait.race_humansea,
setup.trait.per_brave,
setup.trait.per_loyal,
setup.trait.per_playful,
setup.trait.skill_hypnotic,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[
setup.trait.per_independent,
setup.trait.per_masochistic,
setup.trait.per_cautious,
setup.trait.per_generous,
setup.trait.per_sexaddict,
setup.trait.per_empath,
setup.trait.per_honest,
setup.trait.per_submissive,
setup.trait.per_serious,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
],
[setup.qs.job_slaver],
{
survival: 2.0,
arcane: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'scout_guard',
'Scout (Guard)',
[
setup.trait.per_tough,
setup.trait.per_loyal,
setup.trait.per_masochistic,
setup.trait.per_dominant,
setup.trait.per_serious,
],
[
setup.trait.per_independent,
setup.trait.per_nimble,
setup.trait.per_lunatic,
setup.trait.per_submissive,
setup.trait.per_playful,
],
[setup.qs.job_slaver],
{
survival: 1.0,
combat: 2.0,
}
)>><<run new setup.UnitCriteria(
'seducer', /* key */
'Seducer', /* title */
[
setup.trait.bg_courtesan,
setup.trait.per_deceitful,
setup.trait.per_playful,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.eq_slutty,
setup.trait.eq_veryslutty,
], /* critical traits */
[ /* disaster traits */
setup.trait.per_chaste,
setup.trait.per_serious,
setup.trait.per_honest,
setup.trait.dick_tiny,
setup.trait.breast_tiny,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.skill_intimidating,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 2.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'whore', /* key */
'Whore', /* title */
[
setup.trait.bg_whore,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_dreamy,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.balls_large,
setup.trait.balls_huge,
setup.trait.balls_titanic,
], /* critical traits */
[ /* disaster traits */
setup.trait.breast_tiny,
setup.trait.balls_tiny,
setup.trait.dick_tiny,
setup.trait.per_chaste,
setup.trait.per_attentive,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.per_loner,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.skill_intimidating,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'whoreblowjob', /* key */
'Whore (Head special)', /* title */
[
setup.trait.bg_whore,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_submissive,
setup.trait.per_cautious,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.face_attractive,
setup.trait.face_beautiful,
], /* critical traits */
[
setup.trait.breast_tiny,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_dominant,
setup.trait.per_chaste,
setup.trait.per_loner,
setup.trait.per_aggressive,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.gender_male,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'loveinterest', /* key */
'Love Interest', /* title */
[
setup.trait.bg_courtesan,
setup.trait.per_gregarious,
setup.trait.per_kind,
setup.trait.per_humble,
setup.trait.per_empath,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.breast_tiny,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_loner,
setup.trait.per_cruel,
setup.trait.per_aggressive,
setup.trait.per_logical,
setup.trait.dick_medium,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.balls_medium,
setup.trait.balls_large,
setup.trait.balls_huge,
setup.trait.balls_titanic,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'escort', /* key */
'Escort', /* title */
[
setup.trait.bg_courtesan,
setup.trait.per_gregarious,
setup.trait.per_kind,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.eq_veryvaluable,
], /* critical traits */
[
setup.trait.anus_gape,
setup.trait.vagina_gape,
setup.trait.breast_tiny,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.race_orc,
setup.trait.dick_tiny,
setup.trait.per_loner,
setup.trait.per_chaste,
setup.trait.per_cruel,
setup.trait.per_lunatic,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.eq_slutty,
setup.trait.eq_veryslutty,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'bimbo', /* key */
'Bimbo', /* title */
[
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_dreamy,
setup.trait.per_sexaddict,
setup.trait.per_masochistic,
setup.trait.per_playful,
setup.trait.per_active,
setup.trait.per_humble,
setup.trait.per_slow,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.face_beautiful,
setup.trait.anus_gape,
setup.trait.vagina_gape,
], /* critical traits */
[
setup.trait.bg_courtesan,
setup.trait.per_chaste,
setup.trait.per_serious,
setup.trait.per_lunatic,
setup.trait.per_cruel,
setup.trait.per_independent,
setup.trait.per_attentive,
setup.trait.per_smart,
setup.trait.per_curious,
setup.trait.per_studious,
setup.trait.per_proud,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.dick_tiny,
setup.trait.dick_small,
setup.trait.breast_tiny,
setup.trait.breast_small,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'pimp', /* key */
'Pimp', /* title */
[
setup.trait.bg_courtesan,
setup.trait.bg_slaver,
setup.trait.per_active,
setup.trait.per_thrifty,
setup.trait.per_dominant,
setup.trait.per_proud,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.skill_connected,
], /* critical traits */
[
setup.trait.per_studious,
setup.trait.per_kind,
setup.trait.per_chaste,
setup.trait.per_generous,
setup.trait.per_submissive,
setup.trait.per_masochistic,
setup.trait.per_humble,
setup.trait.face_ugly,
setup.trait.face_hideous,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 2.0,
social: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'housekeeper', /* key */
'Housekeeper', /* title */
[
setup.trait.bg_maid,
setup.trait.per_kind,
setup.trait.per_studious,
setup.trait.per_humble,
setup.trait.per_submissive,
setup.trait.skill_alchemy,
], /* critical traits */
[
setup.trait.bg_noble,
setup.trait.bg_royal,
setup.trait.per_cruel,
setup.trait.per_dominant,
setup.trait.per_lunatic,
setup.trait.per_active,
setup.trait.per_proud,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 2.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'highescort', /* key */
'High-Class Prostitute', /* title */
[
setup.trait.bg_courtesan,
setup.trait.per_gregarious,
setup.trait.per_nimble,
setup.trait.per_active,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.face_beautiful,
setup.trait.skill_creative,
setup.trait.skill_connected,
setup.trait.eq_veryvaluable,
setup.trait.eq_veryslutty,
], /* critical traits */
[
setup.trait.breast_tiny,
setup.trait.breast_small,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.race_orc,
setup.trait.dick_tiny,
setup.trait.dick_small,
setup.trait.anus_gape,
setup.trait.vagina_gape,
setup.trait.per_loner,
setup.trait.per_lunatic,
setup.trait.per_tough,
setup.trait.per_studious,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
sex: 3.0,
}
)>><<run new setup.UnitCriteria(
'slave', /* key */
'Slave', /* title */
[], /* critical traits */
[], /* disaster traits */
[setup.qs.job_slave], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'offeringslave', /* key */
'Offering Slave', /* title */
[], /* critical traits */
[], /* disaster traits */
[setup.qs.job_slave], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'fuckholeslave', /* key */
'Fuckhole Slave', /* title */
[ /* critical traits */
setup.trait.per_submissive,
setup.trait.per_sexaddict,
setup.trait.anus_loose,
setup.trait.training_anal_basic,
setup.trait.training_anal_advanced,
setup.trait.training_anal_master,
setup.trait.training_vagina_basic,
setup.trait.training_vagina_advanced,
setup.trait.training_vagina_master,
setup.trait.training_endurance_basic,
setup.trait.training_endurance_advanced,
setup.trait.training_endurance_master,
],
[
setup.trait.per_dominant,
setup.trait.training_mindbreak,
setup.trait.race_humanvale,
], /* disaster traits */
[setup.qs.job_slave], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slavepet', /* key */
'Pet', /* title */
[ /* critical traits */
setup.trait.race_neko,
setup.trait.race_elf,
setup.trait.per_submissive,
setup.trait.per_loyal,
setup.trait.per_nimble,
setup.trait.per_playful,
setup.trait.per_curious,
setup.trait.anus_gape,
setup.trait.vagina_gape,
setup.trait.eq_slutty,
setup.trait.eq_veryslutty,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.training_pet_master,
setup.trait.skill_animal,
],
[
setup.trait.race_humankingdom,
setup.trait.race_humanvale,
setup.trait.race_humandesert,
setup.trait.race_humansea,
setup.trait.per_dominant,
setup.trait.per_independent,
setup.trait.per_stubborn,
setup.trait.per_aggressive,
setup.trait.per_serious,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
], /* disaster traits */
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_pet_basic,
setup.trait.training_pet_advanced,
setup.trait.training_pet_master),
setup.qres.Trait(setup.trait.eq_pet),
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slavegeneric', /* key */
'Slave (generic)', /* title */
[ /* critical traits */
setup.trait.per_submissive,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_loyal,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.training_obedience_advanced,
setup.trait.training_obedience_master,
].concat(setup.TraitHelper.TRAINING_MASTER),
[
setup.trait.per_dominant,
setup.trait.per_loner,
setup.trait.per_chaste,
setup.trait.per_stubborn,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
], /* disaster traits */
[
setup.qs.job_slave,
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slavefurniture', /* key */
'Furniture', /* title */
[ /* critical traits */
setup.trait.race_orc,
setup.trait.per_stubborn,
setup.trait.per_tough,
setup.trait.per_masochistic,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.eq_restrained,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.training_endurance_master,
],
[
setup.trait.race_elf,
setup.trait.per_gregarious,
setup.trait.per_aggressive,
setup.trait.per_sexaddict,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
], /* disaster traits */
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_endurance_basic,
setup.trait.training_endurance_advanced,
setup.trait.training_endurance_master),
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slavepony', /* key */
'Pony', /* title */
[ /* critical traits */
setup.trait.race_dragonkin,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_tough,
setup.trait.per_active,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
setup.trait.training_pony_master,
setup.trait.skill_animal,
],
[
setup.trait.per_chaste,
setup.trait.per_nimble,
setup.trait.per_studious,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.magic_water,
setup.trait.magic_water_master,
], /* disaster traits */
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_pony_basic,
setup.trait.training_pony_advanced,
setup.trait.training_pony_master),
setup.qres.Trait(setup.trait.eq_pony),
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slavecow', /* key */
'Cum/Milk Slave', /* title */
[ /* critical traits */
setup.trait.race_orc,
setup.trait.per_sexaddict,
setup.trait.balls_large,
setup.trait.balls_huge,
setup.trait.balls_titanic,
setup.trait.breast_large,
setup.trait.breast_huge,
setup.trait.breast_titanic,
setup.trait.eq_restrained,
setup.trait.eq_plug_anus,
setup.trait.eq_plug_vagina,
setup.trait.eq_gagged,
setup.trait.training_mindbreak,
setup.trait.skill_animal,
],
[
setup.trait.breast_small,
setup.trait.breast_tiny,
setup.trait.balls_small,
setup.trait.balls_tiny,
setup.trait.race_demon,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_chaste,
setup.trait.height_giant,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.eq_chastity,
], /* disaster traits */
[
setup.qs.job_slave,
setup.qres.AnyTrait([setup.trait.dick_small, setup.trait.breast_small]),
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slaveoral', /* key */
'Oral Slave', /* title */
[ /* critical traits */
setup.trait.mouth_demon,
setup.trait.per_thrifty,
setup.trait.per_active,
setup.trait.per_masochistic,
setup.trait.eq_gagged,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.training_oral_advanced,
setup.trait.training_oral_master,
],
[
setup.trait.per_generous,
setup.trait.per_studious,
setup.trait.per_lunatic,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
], /* disaster traits */
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_oral_basic,
setup.trait.training_oral_advanced,
setup.trait.training_oral_master),
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slaveobedient', /* key */
'Slave (Obedient)', /* title */
[ /* critical traits */
setup.trait.per_submissive,
setup.trait.per_lustful,
setup.trait.per_sexaddict,
setup.trait.per_loyal,
setup.trait.eq_valuable,
setup.trait.eq_veryvaluable,
].concat(setup.TraitHelper.TRAINING_MASTER),
[
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_dominant,
setup.trait.per_loner,
setup.trait.per_chaste,
setup.trait.per_stubborn,
], /* disaster traits */
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_obedience_basic,
setup.trait.training_obedience_advanced,
setup.trait.training_obedience_master),
], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>><<run new setup.UnitCriteria(
'slaver', /* key */
'Slaver (Generic)', /* title */
[ /* critical traits */
],
[
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
}
)>>
<<run new setup.UnitCriteria(
'slavetrader', /* key */
'Slave Trader', /* title */
[ /* critical traits */
setup.trait.bg_merchant,
setup.trait.per_thrifty,
setup.trait.per_deceitful,
setup.trait.per_cruel,
setup.trait.magic_wind,
setup.trait.magic_wind_master
],
[ /* disaster traits */
setup.trait.bg_slave,
setup.trait.per_honest,
setup.trait.per_generous,
setup.trait.per_submissive,
setup.trait.per_kind
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 2.0,
slaving: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'slavetrainer', /* key */
'Slave Trainer', /* title */
[ /* critical traits */
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.per_dominant,
setup.trait.per_evil,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_intimidating,
setup.trait.skill_creative,
],
[ /* disaster traits */
setup.trait.bg_slave,
setup.trait.per_kind,
setup.trait.per_honorable,
setup.trait.per_submissive,
setup.trait.per_honorable,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
slaving: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'slaveappraiser', /* key */
'Slave Appraiser', /* title */
[ /* critical traits */
setup.trait.per_attentive,
setup.trait.per_curious,
setup.trait.per_calm,
setup.trait.per_evil,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
],
[
setup.trait.per_dreamy,
setup.trait.bg_slave,
setup.trait.per_stubborn,
setup.trait.per_aggressive,
setup.trait.per_lunatic,
setup.trait.per_honorable,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
slaving: 1.0,
knowledge: 1.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'slavehandler', /* key */
'Slave Handler', /* title */
[ /* critical traits */
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.per_calm,
setup.trait.per_dominant,
setup.trait.per_aggressive,
setup.trait.per_evil,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
],
[
setup.trait.bg_slave,
setup.trait.per_aggressive,
setup.trait.per_calm,
setup.trait.per_submissive,
setup.trait.per_lunatic,
setup.trait.per_masochistic,
setup.trait.per_honorable,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
slaving: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'slavecapturer', /* key */
'Slave Capturer', /* title */
[ /* critical traits */
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.per_aggressive,
setup.trait.per_stubborn,
setup.trait.per_active,
setup.trait.per_nimble,
setup.trait.per_evil,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
],
[
setup.trait.bg_slave,
setup.trait.per_calm,
setup.trait.per_masochistic,
setup.trait.per_curious,
setup.trait.per_studious,
setup.trait.per_tough,
setup.trait.per_honorable,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
slaving: 2.0,
brawn: 1.0,
}
)>><<run new setup.UnitCriteria(
'negotiator', /* key */
'Negotiator', /* title */
[ /* critical traits */
setup.trait.bg_merchant,
setup.trait.per_deceitful,
setup.trait.per_calm,
setup.trait.per_logical,
setup.trait.per_gregarious,
setup.trait.per_attentive,
],
[
setup.trait.per_dreamy,
setup.trait.per_honest,
setup.trait.per_aggressive,
setup.trait.per_empath,
setup.trait.per_loner,
setup.trait.skill_intimidating,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'trader', /* key */
'Trader', /* title */
[ /* critical traits */
setup.trait.bg_merchant,
setup.trait.per_thrifty,
setup.trait.per_deceitful,
setup.trait.per_smart,
setup.trait.per_logical,
],
[ /* disaster traits */
setup.trait.skill_intimidating,
setup.trait.per_honest,
setup.trait.per_generous,
setup.trait.per_submissive,
setup.trait.per_empath,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 2.0,
knowledge: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'recruiter', /* key */
'Recruiter', /* title */
[ /* critical traits */
setup.trait.per_gregarious,
setup.trait.per_kind,
setup.trait.per_curious,
setup.trait.per_dominant,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.skill_intimidating,
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_loner,
setup.trait.per_cruel,
setup.trait.per_stubborn,
setup.trait.per_submissive,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'convincer', /* key */
'Convincer', /* title */
[ /* critical traits */
setup.trait.per_gregarious,
setup.trait.per_stubborn,
setup.trait.per_attentive,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.skill_hypnotic,
setup.trait.skill_intimidating,
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_dreamy,
setup.trait.per_loner,
setup.trait.per_curious,
setup.trait.per_aggressive,
setup.trait.face_ugly,
setup.trait.face_hideous,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'informer', /* key */
'Informer', /* title */
[ /* critical traits */
setup.trait.bg_informer,
setup.trait.per_gregarious,
setup.trait.per_deceitful,
setup.trait.per_logical,
setup.trait.per_attentive,
setup.trait.face_attractive,
setup.trait.face_beautiful
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_loner,
setup.trait.per_honest,
setup.trait.per_empath,
setup.trait.per_dreamy,
setup.trait.face_ugly,
setup.trait.face_hideous
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 2.0,
intrigue: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'salesman', /* key */
'Salesman', /* title */
[ /* critical traits */
setup.trait.bg_merchant,
setup.trait.per_thrifty,
setup.trait.per_stubborn,
setup.trait.per_logical,
setup.trait.face_attractive,
setup.trait.face_beautiful
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_generous,
setup.trait.per_curious,
setup.trait.per_lunatic,
setup.trait.per_empath,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.skill_intimidating,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'attentionseeker', /* key */
'Attention Seeker', /* title */
[ /* critical traits */
setup.trait.bg_artist,
setup.trait.bg_entertainer,
setup.trait.per_gregarious,
setup.trait.per_aggressive,
setup.trait.per_dominant,
setup.trait.per_active,
setup.trait.per_lunatic,
setup.trait.per_proud,
setup.trait.skill_connected,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.muscle_strong,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.muscle_weak,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.eq_veryvaluable,
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_loner,
setup.trait.per_calm,
setup.trait.per_submissive,
setup.trait.per_studious,
setup.trait.per_masochistic,
setup.trait.per_humble,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.skill_intimidating,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 1.0,
sex: 1.0,
brawn: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'performer', /* key */
'Performer', /* title */
[ /* critical traits */
setup.trait.bg_entertainer,
setup.trait.bg_artist,
setup.trait.per_playful,
setup.trait.per_active,
setup.trait.per_dreamy,
setup.trait.skill_entertain,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.muscle_strong,
setup.trait.muscle_verystrong,
setup.trait.muscle_extremelystrong,
setup.trait.muscle_weak,
setup.trait.muscle_veryweak,
setup.trait.muscle_extremelyweak,
setup.trait.eq_veryvaluable,
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_serious,
setup.trait.per_studious,
setup.trait.per_attentive,
setup.trait.face_ugly,
setup.trait.face_hideous,
setup.trait.skill_intimidating,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 1.5,
brawn: 1.5,
}
)>>
<<run new setup.UnitCriteria(
'briber', /* key */
'Briber', /* title */
[ /* critical traits */
setup.trait.bg_informer,
setup.trait.per_thrifty,
setup.trait.per_deceitful,
setup.trait.per_evil,
setup.trait.skill_hypnotic,
setup.trait.face_attractive,
setup.trait.face_beautiful,
setup.trait.skill_intimidating,
],
[ /* disaster traits */
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_generous,
setup.trait.per_honest,
setup.trait.per_honorable,
setup.trait.face_ugly,
setup.trait.face_hideous,
],
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
social: 2.0,
intrigue: 1.0,
}
)>><<run new setup.UnitCriteria(
'surgery_head',
'Head Surgeon',
[
setup.trait.bg_healer,
setup.trait.per_nimble,
setup.trait.per_attentive,
setup.trait.magic_light,
setup.trait.magic_light_master,
],
[
setup.trait.per_brave,
setup.trait.per_cruel,
setup.trait.per_masochistic,
setup.trait.per_tough,
setup.trait.per_dreamy,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[
setup.qs.job_slaver, setup.qres.Trait(setup.trait.magic_water,
setup.trait.magic_water_master)
],
{
arcane: 1.5,
aid: 1.5,
}
)>>
<<run new setup.UnitCriteria(
'surgery_assistant',
'Assistant Surgeon',
[
setup.trait.bg_apprentice,
setup.trait.magic_water,
setup.trait.magic_water_master,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.per_submissive,
],
[
setup.trait.per_masochistic,
setup.trait.per_aggressive,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
],
[
setup.qs.job_slaver
],
{
arcane: 1.5,
aid: 1.5,
}
)>><<run new setup.UnitCriteria(
'hunter', /* key */
'Hunter', /* title */
[
setup.trait.bg_hunter,
setup.trait.per_attentive,
setup.trait.per_calm,
setup.trait.per_stubborn,
setup.trait.per_nimble,
setup.trait.skill_animal,
], /* critical traits */
[
setup.trait.per_dreamy,
setup.trait.per_curious,
setup.trait.per_aggressive,
setup.trait.per_lunatic,
setup.trait.per_tough,
setup.trait.magic_fire,
setup.trait.magic_fire_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
survival: 2.0,
combat: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'trapper', /* key */
'Trapper', /* title */
[
setup.trait.bg_woodsman,
setup.trait.per_calm,
setup.trait.per_playful,
setup.trait.per_curious,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.skill_animal,
], /* critical traits */
[
setup.trait.per_aggressive,
setup.trait.per_serious,
setup.trait.per_stubborn,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
survival: 2.0,
slaving: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'scavenger', /* key */
'Scavenger', /* title */
[
setup.trait.per_aggressive,
setup.trait.per_attentive,
setup.trait.skill_flight,
setup.trait.magic_light,
setup.trait.magic_light_master,
], /* critical traits */
[
setup.trait.per_dreamy,
setup.trait.per_calm,
setup.trait.per_lunatic,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
survival: 2.0,
knowledge: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'spotter', /* key */
'Spotter', /* title */
[
setup.trait.eyes_neko,
setup.trait.eyes_dragonkin,
setup.trait.per_attentive,
setup.trait.per_aggressive,
setup.trait.skill_flight,
setup.trait.magic_light,
setup.trait.magic_light_master,
], /* critical traits */
[
setup.trait.per_dreamy,
setup.trait.corrupted,
setup.trait.corruptedfull,
setup.trait.per_sexaddict,
setup.trait.per_calm,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
], /* disaster traits */
[setup.qs.job_slaver], /* requirement */
{ /* skill effects, sums to 3.0 */
survival: 3.0,
}
)>><<run new setup.UnitCriteria(
'training_head',
'Head Slave Trainer',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.per_dominant,
setup.trait.per_cruel,
setup.trait.skill_intimidating,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
],
[
setup.trait.bg_slave,
setup.trait.per_submissive,
setup.trait.per_honorable,
setup.trait.per_kind,
],
[setup.qs.job_slaver],
{
slaving: 1.5,
knowledge: 1.0,
social: 0.5,
}
)>>
<<run new setup.UnitCriteria(
'training_trainer_nosex',
'Slave Trainer (No sex)',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.per_dominant,
setup.trait.magic_light,
setup.trait.magic_light_master,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
],
[
setup.trait.bg_slave,
setup.trait.per_kind,
setup.trait.per_masochistic,
setup.trait.per_submissive,
setup.trait.per_honorable,
],
[setup.qs.job_slaver],
{
slaving: 2.0,
brawn: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'training_trainer_dick_normal',
'Slave Trainer (Dick)',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.dick_small,
setup.trait.dick_medium,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.per_dominant,
],
[
setup.trait.bg_slave,
setup.trait.per_kind,
setup.trait.per_masochistic,
setup.trait.per_honorable,
setup.trait.dick_tiny,
setup.trait.dick_titanic,
],
[
setup.qs.job_slaver,
setup.qres.NoTrait(setup.trait.eq_chastity),
],
{
slaving: 2.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'training_trainer_dick_master',
'Slave Trainer+ (Dick)',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_earth,
setup.trait.magic_earth_master,
setup.trait.per_dominant,
setup.trait.dick_large,
setup.trait.dick_huge,
setup.trait.dick_titanic,
setup.trait.balls_huge,
setup.trait.balls_titanic,
],
[
setup.trait.bg_slave,
setup.trait.dick_tiny,
setup.trait.dick_small,
setup.trait.balls_tiny,
setup.trait.balls_small,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_masochistic,
],
[
setup.qs.job_slaver,
setup.qres.NoTrait(setup.trait.eq_chastity),
],
{
slaving: 2.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'training_trainer_sex',
'Slave Trainer (Sex)',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.per_dominant,
],
[
setup.trait.bg_slave,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_masochistic,
],
[
setup.qs.job_slaver,
],
{
slaving: 2.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'training_trainer_masochist',
'Slave Trainer (Masochist)',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.per_dominant,
setup.trait.per_cruel,
],
[
setup.trait.bg_slave,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_masochistic,
],
[
setup.qs.job_slaver,
],
{
slaving: 1.0,
brawn: 1.0,
sex: 1.0,
}
)>>
<<run new setup.UnitCriteria(
'training_trainer_mindbreak',
'Slave Trainer (Mindbreaker)',
[
setup.trait.bg_slaver,
setup.trait.bg_demon,
setup.trait.magic_wind,
setup.trait.magic_wind_master,
setup.trait.magic_dark,
setup.trait.magic_dark_master,
setup.trait.per_dominant,
setup.trait.per_cruel,
setup.trait.skill_intimidating,
],
[
setup.trait.bg_slave,
setup.trait.per_honorable,
setup.trait.per_kind,
setup.trait.per_humble,
setup.trait.per_empath,
setup.trait.per_masochistic,
],
[
setup.qs.job_slaver,
],
{
slaving: 3.0,
}
)>>
<<run new setup.UnitCriteria(
'training_slave',
'Slave',
[
setup.trait.per_submissive,
setup.trait.training_obedience_master,
],
[
setup.trait.per_dominant,
setup.trait.per_masochistic,
],
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_obedience_basic,
setup.trait.training_obedience_advanced,
setup.trait.training_obedience_master),
],
{}
)>>
<<run new setup.UnitCriteria(
'trainee',
'Trainee',
[
setup.trait.per_studious,
setup.trait.per_active,
setup.trait.per_submissive,
setup.trait.per_calm,
],
[
setup.trait.per_aggressive,
setup.trait.per_dominant,
setup.trait.per_lunatic,
],
[setup.qs.job_slaver],
{
brawn: 1.0,
knowledge: 1.0,
sex: 1.0,
}
)>><div>
<<devtoolreturnbutton>>
</div>
<div>
<<successtext 'Actor name'>>:
<<message '(?)'>>
Actor name. Don't forget to fill this in!
<br/>
<br/>
Name should be entirely consist of lowercase characters, numbers, all without space.
For example, 'bigdick'.
<</message>>
<<textbox '$qactorname' '' autofocus>>
</div>
Choose unit group:
<<link '(Create new from scratch)' 'UnitGroupGen'>>
<<set _baseunitgroup = null>>
<<include 'UGGenInit'>>
<</link>>
<br/>
<<set _customkeys = {}>>
<<for _iunitgroup, _unitgroup range $qcustomunitgroup>>
<<set _customkeys[_unitgroup.key] = true>>
<</for>>
<<set _ugall = []>>
<<for _iug, _ug range setup.unitgroup>>
<<if !(_ug.key in _customkeys)>>
<<run _ugall.push(_ug)>>
<</if>>
<</for>>
<<set _uglist = [
['Unit groups you made...', {ug: $qcustomunitgroup}],
['Units on location...', [
['All locations...', {ug: _ugall.filter(a => a.key.startsWith('all'))}],
['Vale...', {ug: _ugall.filter(a => a.key.startsWith('vale'))}],
['Forest...', {ug: _ugall.filter(a => a.key.startsWith('forest'))}],
['City...', {ug: _ugall.filter(a => a.key.startsWith('city'))}],
['Desert...', {ug: _ugall.filter(a => a.key.startsWith('desert'))}],
['Sea...', {ug: _ugall.filter(a => a.key.startsWith('sea'))}],
]],
['Units of certain race...', [
['Human (vale)...', {ug: _ugall.filter(a => a.key.startsWith('humanvale'))}],
['Human (kingdom)...', {ug: _ugall.filter(a => a.key.startsWith('humankingdom'))}],
['Human (desert)...', {ug: _ugall.filter(a => a.key.startsWith('humandesert'))}],
['Human (sea)...', {ug: _ugall.filter(a => a.key.startsWith('humansea'))}],
['Werewolf...', {ug: _ugall.filter(a => a.key.startsWith('werewolf'))}],
['Neko...', {ug: _ugall.filter(a => a.key.startsWith('neko'))}],
['Elf...', {ug: _ugall.filter(a => a.key.startsWith('elf'))}],
['Orc...', {ug: _ugall.filter(a => a.key.startsWith('orc'))}],
['Dragonkin...', {ug: _ugall.filter(a => a.key.startsWith('dragonkin'))}],
['Demon...', {ug: _ugall.filter(a => a.key.startsWith('demon'))}],
]],
['Persistent unit groups...', {ug: _ugall.filter(a => !(a.key in _customkeys) && a.reuse_chance)}],
['Quest-specific unit groups...', {ug: _ugall.filter(a => !(a.key in _customkeys) && a.key.startsWith('quest_'))}],
]>>
<<focwidget 'DisplayUnitGroup'>>
<<message $args[0]>>
<div class='slavercard'>
<<for _iunitgroup, _unitgroup range $args[1]>>
<<set _customkeys[_unitgroup.key] = true>>
<<set _text = `Select ${_unitgroup.getName()} (${_unitgroup.key})`>>
<<capture _unitgroup>>
<<link _text>>
<<devroleaddunitgroup $qactorname _unitgroup>>
<</link>>
or
<<link '(New based on this)' 'UnitGroupGen'>>
<<set _baseunitgroup = _unitgroup>>
<<include 'UGGenInit'>>
<</link>>
<</capture>>
<<capture _unitgroup>>
<<message '(+)'>>
<<unitgroupcard _unitgroup>>
<</message>>
<</capture>>
<br/>
<</for>>
</div>
<</message>>
<</focwidget>>
<<for _iuglist, _uglisten range _uglist>>
<<if !Array.isArray(_uglisten[1])>>
<<if _uglisten[1].ug.length>>
<<DisplayUnitGroup _uglisten[0] _uglisten[1].ug>>
<br/>
<</if>>
<<else>>
<<capture _uglisten>>
<<message _uglisten[0]>>
<div class='marketobjectcard'>
<<for _iuglistdeep, _uglistdeep range _uglisten[1]>>
<<DisplayUnitGroup _uglistdeep[0] _uglistdeep[1].ug>>
<br/>
<</for>>
</div>
<</message>>
<</capture>>
<br/>
<</if>>
<</for>><<devtoolreturnbutton>>
<p>
Choose addon to add:
<<message '(Need something else?)'>>
If you need some other addon, please drop a message in the subreddit.
<</message>>
</p>
<<message 'Add random critical, disaster, and must-have traits...'>>
[[The traits must match exactly|AddonTraitsRandomExact]]
<<message '(?)'>>
E.g., a unit with <<rep setup.trait.muscle_verystrong>> will not count for <<rep setup.trait.muscle_strong>>.
Use the other option if you want stronger traits to match weaker ones.
(The strength is the upper-left number).
<</message>>
<br/>
[[Stronger counts for weaker traits|AddonTraitsRandom]]
<<message '(?)'>>
E.g., <<rep setup.trait.muscle_veryweak>> counts for
<<rep setup.trait.muscle_weak>>, and <<rep setup.trait.dick_large>> counts for
<<rep setup.trait.dick_tiny>>.
(The strength is the upper-left number).
Use the exact match option if you only want the traits to match exactly.
<</message>>
<</message>>
<br/>
[[Must have a random gender|AddonRequireGenderRandomSlave]]
<<message '(?)'>>
Will try to follow the player's slave preferences.
E.g., if the preferences is 75% male slave, then 75% of the time will require
male slave.
<</message>>Adds
<<numberbox "_crit" 0>>
critical traits,
<<numberbox "_disaster" 0>>
disaster traits,
and
<<numberbox "_restriction" 0>>
must-have traits from the following traits.
The traits are inexact: e.g., <<rep setup.trait.muscle_veryweak>> counts for
<<rep setup.trait.muscle_weak>>, and <<rep setup.trait.dick_large>> counts for
<<rep setup.trait.dick_tiny>>.
<<message '(?)'>>
A must-have trait will be translated to unit requirement.
The traits will not overlap. For example, if a trait is chosen as a critical trait, it will not be
chosen as a disaster trait or must-have.
<</message>>
<<link '(Done)'>>
<<if _crit + _disaster + _restriction > _chosentraits.length>>
<<warning 'Not enough traits chosen! Must have at least equal to number of critical traits plus number of disaster traits'>>
<<else>>
<<run $soaddons.push(setup.SlaveOrderAddon.TraitsRandom(_chosentraits, _crit, _disaster, _restriction))>>
<<goto 'SlaveOrderGen'>>
<</if>>
<</link>>
<<include 'ChooseTraits'>>Adds
<<numberbox "_crit" 0>>
critical traits,
<<numberbox "_disaster" 0>>
disaster traits,
and
<<numberbox "_restriction" 0>>
must-have traits from the following traits:
The traits must match exactly.
<<message '(?)'>>
A must-have trait will be translated to unit requirement.
The traits will not overlap. For example, if a trait is chosen as a critical trait, it will not be
chosen as a disaster trait or must-have.
<</message>>
<<link '(Done)'>>
<<if _crit + _disaster + _restriction > _chosentraits.length>>
<<warning 'Not enough traits chosen! Must have at least equal to number of critical traits plus number of disaster traits'>>
<<else>>
<<run $soaddons.push(setup.SlaveOrderAddon.TraitsRandomExact(_chosentraits, _crit, _disaster, _restriction))>>
<<goto 'SlaveOrderGen'>>
<</if>>
<</link>>
<<include 'ChooseTraits'>><<run $soaddons.push(setup.SlaveOrderAddon.RequireGenderRandom(setup.job.slave))>>
<<gotowipehistory 'SlaveOrderGen'>><!-- Used for tooltips for macro info -->
<<focwidget 'devmacroinfo'>>
<<set _macroname = $args[0]>>
<<set _meta = setup.getMacroMetadata(_macroname)>>
<header style="margin: 6px 0; padding-left: 4px">
<<set _aliases = setup.getMacroAliases(_macroname).join(' / ')>>
<b><<= _aliases >></b>
<small>(macro)</small>
</header>
<<if _meta>>
<<= _meta.info >>
<<if _meta.args>>
<<set _overloads = Array.isArray(_meta.args[0]) ? _meta.args : [_meta.args]>>
<hr/>
<<for _ioverload, _overload range _overloads>>
<div>
Parameters:
<span class="language-twee3">
<span class="token macro"><<<<= _macroname>> <b class="token macro-inner"><<= _overload.join(' ')>></b>>></span>
</span>
</div>
<</for>>
<</if>>
<<elseif _meta === null>>
This macro is for internal use only
<<else>>
No info available
<</if>>
<</focwidget>>
<<focwidget 'devcodeeditorpreview'>>
<<set _devpreviewvalue = $args[0]>>
<<set _devpreviewvar = $args[1]>>
<<switch $devtooltype>>
<<case 'quest'>>
<<include 'CodeEditorPreviewQuest'>>
<<case 'event'>>
<<include 'CodeEditorPreviewEvent'>>
<<case 'opportunity'>>
<<include 'CodeEditorPreviewOpportunity'>>
<<case 'interaction'>>
<<include 'CodeEditorPreviewInteraction'>>
<<default>>
[Preview not supported for this content]
<</switch>>
<</focwidget>><aside>
<<set _actors = setup.DevToolHelper.getActors()>>
Actors:
<<link '(reset)'>>
<<unset $compiledquest>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<devgotoreturn>>
<</link>>
<div class="indented">
<<for _iactor, _actor range _actors>>
<div>
_actor[0]: <<rep setup.evalJsPath(_actor[1])>>
<<capture _actor>>
<<link '(edit)'>>'
<<set $gUnit_key = setup.evalJsPath(_actor[1]).key>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<focgoto 'UnitDebugDo'>>
<</link>>
<<if _actor[0] != 'Player'>>
<<link '(replace)'>>
<<set $dtEditActor = _actor[0]>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<focgoto 'CodeEditorReplaceUnit'>>
<</link>>
<</if>>
<</capture>>
</div>
<</for>>
</div>
</aside><div>
<<link '(Cancel)'>>
<<unset $dtEditActor>>
<<devgotoreturn>>
<</link>>
</div>
<<focwidget 'rostershowaction'>>
<<link '(Select)'>>
<<if $dtEditActor == 'Target'>>
<<set $compiledquest.unit_key = $args[0].key>>
<<else>>
<<set $compiledquest.actor_unit_key_map[$dtEditActor] = $args[0].key>>
<</if>>
<<unset $dtEditActor>>
<<devgotoreturn>>
<</link>>
<</focwidget>>
<<set _unitlist = $company.player.getUnits()>>
<<rostershow _unitlist>><<if !$compiledquest>>
<<set setup.interaction[$dtquest.key] = $dtquest>>
<<set $compiledquest = $dtquest.debugMakeInstance()>>
<</if>>
<<run $notification.popAll()>>
<<questvarload $compiledquest>>
<<include 'CodeEditorPreviewContextDetails'>>
<div>
<<= setup.DevToolHelper.debugDevToolTwine(_devpreviewvalue) >>
</div><<if !$compiledquest>>
<<set setup.opportunitytemplate[$dtquest.key] = $dtquest>>
<<set $compiledquest = $dtquest.debugMakeInstance()>>
<</if>>
<<run $notification.popAll()>>
<<questvarload $compiledquest>>
<<include 'CodeEditorPreviewContextDetails'>>
<div>
<<= setup.DevToolHelper.debugDevToolTwine(_devpreviewvalue) >>
</div><<if !$compiledquest>>
<<set setup.event[$dtquest.key] = $dtquest>>
<<set $compiledquest = $dtquest.debugMakeInstance()>>
<</if>>
<<run $notification.popAll()>>
<<questvarload $compiledquest>>
<<include 'CodeEditorPreviewContextDetails'>>
<div>
<<= setup.DevToolHelper.debugDevToolTwine(_devpreviewvalue) >>
</div><<set _outcome = 'crit'>>
<<switch _devpreviewvar>>
<<case '$qoutcomedesc[1]'>>
<<set _outcome = 'success'>>
<<case '$qoutcomedesc[2]'>>
<<set _outcome = 'failure'>>
<<case '$qoutcomedesc[3]'>>
<<set _outcome = 'disaster'>>
<</switch>>
/* TODO: creating a quest will create their users and quest instances.
These needs to be destroyed too, otherwise will fill variables with garbage. */
<<if !$compiledquest>>
<<set setup.questtemplate[$dtquest.key] = $dtquest>>
<<set $compiledquest = $dtquest.debugMakeFilledInstance(_outcome)>>
<</if>>
<<run $notification.popAll()>>
<<questvarload $compiledquest>>
<<include 'CodeEditorPreviewContextDetails'>>
<div>
<<= setup.DevToolHelper.debugDevToolTwine(_devpreviewvalue) >>
</div>Adds a free random equipment from an equipment pool:
<<for _ieqpool, _eqpool range setup.equipmentpool>>
<<capture _eqpool>>
<br/>
<<rep _eqpool>>
<<link '(select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.Equipment(_eqpool)>>
<</link>>
<</capture>>
<</for>>Gain a free equipment:
<<for _ieq, _eq range setup.equipment>>
<<capture _eq>>
<br/>
<<rep _eq>>
<<link '(select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.EquipmentDirect(_eq)>>
<</link>>
<</capture>>
<</for>>Schedule the following event to trigger in
<<numberbox '_weeks' 0>> weeks.
<<message '(?)'>>
Put 0 if you want the event to trigger in the same week.
<</message>>
<br/>
<<for _ievent, _event range setup.event>>
<<capture _event>>
<<link _event.getName() 'QGCostDone'>>
<<set $qcost = setup.qc.Event(_event, _weeks)>>
<</link>>
<br/>
<</capture>>
<</for>>If the following event was scheduled, unschedule it.
<br/>
<<for _ievent, _event range setup.event>>
<<capture _event>>
<<link _event.getName() 'QGCostDone'>>
<<set $qcost = setup.qc.UnscheduleEvent(_event, _weeks)>>
<</link>>
<br/>
<</capture>>
<</for>><div>
First, choose the event
that you want to trigger in
<<numberbox '_weeks' 0>> weeks.
<<message '(?)'>>
Put 0 if you want the event to trigger in the same week.
<</message>>
</div>
<<for _ievent, _event range setup.event>>
<<capture _event>>
<<link _event.getName() 'CostEventRolesImplement'>>
<<set $qeventchosenweeks = _weeks>>
<<set $qeventchosen = _event>>
<</link>>
<br/>
<</capture>>
<</for>><p>
Select the roles in <<rep $qeventchosen>> that you want to assign with roles
in the current thing you are making:
</p>
<p>
<<devquestroles $qeventchosen>>
</p>
<<link '(Done)' 'QGCostDone'>>
<<set $qcost = setup.qc.Event($qeventchosen, $qeventchosenweeks, setup.deepCopy($qdevquestroles))>>
<<unset $qdevquestroles>>
<</link>><p>Adds exp. Use 0 or POSITIVE to add exp, and NEGATIVE to substract exp.
If this is a quest cost, use a NEGATIVE number. If this is a reward, use either POSITIVE
or 0. 0 will default to automatically adjust the reward based on the quest length.</p>
Multiplier: <<numberbox '_expmulti' 0>>
<<link 'Add cost' 'QGCostDone'>>
<<ExpDone>>
<</link>><<focwidget 'ExpDone'>>
<<set $qcost = setup.qc.ExpNormal(_expmulti)>>
<</focwidget>>
<<include 'CostExpCommon'>><<focwidget 'ExpDone'>>
<<set $qcost = setup.qc.ExpCrit(_expmulti)>>
<</focwidget>>
<<include 'CostExpCommon'>><<for _icompany, _company range $company>>
<<capture _company>>
<<if _company != $company.player && _company != $company.independent>>
<br/>
<<rep _company>>
<<link '(select this)' 'QGCostDone'>>
<<costrelationshipwidget>>
<</link>>
<</if>>
<</capture>>
<</for>><<focwidget 'costrelationshipwidget'>>
<<set $qcost = setup.qc.Favor(_company, _favor)>>
<</focwidget>>
Gain <<numberbox '_favor' 200>> favor with:
<<message '(?)'>>
Insert this as 10 times the amount displayed in game.
For example, to add 20.5 favor, put 205.
Maximum favor is <<= setup.FAVOR_MAX >>.
5.0 favor is worth <<money 1000>>.
<</message>>
<<include 'CostFavorChoose'>><<focwidget 'costrelationshipwidget'>>
<<set $qcost = setup.qc.Favor(_company, -_favor)>>
<</focwidget>>
Lose <<numberbox '_favor' 200>> favor with:
<<message '(?)'>>
Insert this as 10 times the amount displayed in game.
For example, to lose 20.5 favor, put 205.
Maximum favor is <<= setup.FAVOR_MAX >>
5.0 favor is worth <<money 1000>>.
<</message>>
<<include 'CostFavorChoose'>><<focwidget 'costrelationshipwidget'>>
<<set $qcost = setup.qc.Ire(_company, _ire)>>
<</focwidget>>
Gain <<numberbox '_ire' 1>> ire with:
<<message '(?)'>>
1 ire is worth <<money 500>>. When ire reaches 20,
something bad will happen to the company.
<</message>>
<<include 'CostFavorChoose'>><<focwidget 'costrelationshipwidget'>>
<<set $qcost = setup.qc.Ire(_company, -_ire)>>
<</focwidget>>
Lose <<numberbox '_ire' 20>> ire with:
<<message '(?)'>>
1 ire is worth <<money 500>>. When ire reaches 20,
something bad will happen to the company.
<</message>>
<<include 'CostFavorChoose'>>Gain an item:
<<for _iitem, _item range setup.item>>
<<capture _item>>
<br/>
<<rep _item>>
<<link '(select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.Item(_item)>>
<</link>>
<</capture>>
<</for>>Lose <<numberbox '_lostnumber' 1>> copies of:
<<for _iitem, _item range setup.item>>
<<capture _item>>
<br/>
<<rep _item>>
<<link '(select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.LoseItem(_item, _lostnumber)>>
<</link>>
<</capture>>
<</for>>Gain an item from an item pool:
<<for _iitem, _item range setup.itempool>>
<<capture _item>>
<br/>
<<rep _item>>
<<link '(select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.ItemPool(_item)>>
<</link>>
<</capture>>
<</for>><<set _moneymulti = 0>>
<<MoneyDone>>
<<gotowipehistory 'QGCostDone'>><<focwidget 'MoneyDone'>>
<<set $qcost = setup.qc.MoneyNormal(_moneymulti)>>
<</focwidget>>
<<include 'CostMoneyCommon'>><<focwidget 'MoneyDone'>>
<<set $qcost = setup.qc.MoneyCrit(_moneymulti)>>
<</focwidget>>
<<include 'CostMoneyCommon'>><<focwidget 'MoneyDone'>>
<<set $qcost = setup.qc.MoneySmall(_moneymulti)>>
<</focwidget>>
<<include 'CostMoneyCommon'>><p>
Gain
<<numberbox '_money' 1500>>
money.<<message '(?)'>>This is the amount of money that the quest should give on
a Lv. 40 quest. The amount will be scaled down automatically if the quest level is lower.<</message>>
</p>
<<link 'Add cost' 'QGCostDone'>>
<<set $qcost = setup.qc.MoneyCustom(_money)>>
<</link>><p>
Lose
<<numberbox '_money' 1500>>
money.<<message '(?)'>>This is the amount of money that the quest should take on
a Lv. 40 quest. The amount will be scaled down automatically if the quest level is lower.<</message>>
</p>
<<link 'Add cost' 'QGCostDone'>>
<<set $qcost = setup.qc.MoneyLoseCustom(_money)>>
<</link>><p>
Gain a FIXED amount of money:
<<numberbox '_money' 1500>>g.
<<message '(?)'>>
Unlike all other money options, this amount will not be scaled depending on the level.
<</message>>
</p>
<<link 'Add cost' 'QGCostDone'>>
<<set $qcost = setup.qc.Money(_money)>>
<</link>><p>
Lose a FIXED amount of money:
<<numberbox '_money' 1500>>g.
<<message '(?)'>>
Unlike all other money options, this amount will not be scaled depending on the level.
<</message>>
</p>
<<link 'Add cost' 'QGCostDone'>>
<<set $qcost = setup.qc.Money(-_money)>>
<</link>>Gain the following chosen opportunity.
<br/>
<<devchooseopportunity 'CostOpportunityDo'>><<set $qcost = setup.qc.Opportunity(_opportunitychosen)>>
<<gotowipehistory 'QGCostDone'>><div>
First, choose the opportunity:
</div>
<<devchooseopportunity 'CostOpportunityRolesDo'>><<set $qopportunitychosen = _opportunitychosen>>
<<gotowipehistory 'CostOpportunityRolesImplement'>><p>
Select the roles in <<rep $qopportunitychosen>> that you want to assign with roles
in the current thing you are making:
</p>
<p>
<<devquestroles $qopportunitychosen>>
</p>
<<link '(Done)' 'QGCostDone'>>
<<set $qcost = setup.qc.Opportunity($qopportunitychosen, setup.deepCopy($qdevquestroles))>>
<<unset $qdevquestroles>>
<</link>><p>Adds or substract prestige. Use 0 or POSITIVE to add money, and NEGATIVE to substract money.
If this is a quest cost, use a NEGATIVE number.</p>
Prestige: <<numberbox '_prestige' 1>>
<<link 'Add cost' 'QGCostDone'>>
<<set $qcost = setup.qc.Prestige(_prestige)>>
<</link>>Gain <<numberbox '_quantity' 1>> quests from a questpool:
<<for _iquestpool, _questpool range setup.questpool>>
<<capture _questpool>>
<br/>
<<rep _questpool>>
<<link '(select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.QuestDelay(_questpool, _quantity)>>
<</link>>
<</capture>>
<</for>>Gain the following chosen quest.
<br/>
<<devchoosequest 'CostQuestDirectDo'>><<set $qcost = setup.qc.QuestDirect(_questchosen)>>
<<gotowipehistory 'QGCostDone'>>First, choose the quest:
<<devchoosequest 'CostQuestDirectRolesDo'>><<set $qquestchosen = _questchosen>>
<<gotowipehistory 'CostQuestDirectRolesImplement'>><p>
Select the roles in <<rep $qquestchosen>> that you want to assign with roles
in the current thing you are making:
</p>
<p>
<<devquestroles $qquestchosen>>
</p>
<<link '(Done)' 'QGCostDone'>>
<<set $qcost = setup.qc.QuestDirect($qquestchosen, setup.deepCopy($qdevquestroles))>>
<<unset $qdevquestroles>>
<</link>>First, choose the quest:
<<devchoosequest 'CostQuestDirectForceAssignDo'>><<set $qquestchosen = _questchosen>>
<<gotowipehistory 'CostQuestDirectForceAssignImplement'>><p>
Match the roles in <<rep $qquestchosen>> that you want to assign with units going on in this quest.
Note that all roles must be matched.
</p>
<p>
<<devquestroles $qquestchosen>>
</p>
<<link '(Done)'>>
/* sanity checks */
<<set _error = setup.qcImpl.QuestDirectForceAssign.sanityCheckDevTool($qquestchosen, $qdevquestroles)>>
<<if _error>>
<<warning _error>>
<<else>>
<<set $qcost = setup.qc.QuestDirectForceAssign($qquestchosen, setup.deepCopy($qdevquestroles))>>
<<unset $qdevquestroles>>
<<goto 'QGCostDone'>>
<</if>>
<</link>><<set $qcost = setup.qc.DoAll([])>>
<<gotowipehistory 'QGCostDone'>><<if _entry.probability !== undefined>>
<b>Do all of the following with <<= (_entry.probability * 100).toFixed(1)>>% chance:</b>
<<else>>
<b>Do all of the following:</b>
<</if>><p>
Do all of the following with probability: <<numberbox "_probability" 50>>%
<<message '(?)'>>
Put a percentage. For example, 50, which means these will be executed half of the time.
<</message>>:
</p>
<<link '(Continue)' 'QGCostDone'>>
<<set $qcost = setup.qc.DoAll([], _probability / 100)>>
<</link>><<set $qcost = setup.qc.IfThenElse(setup.qres.Never('Never'), setup.qc.DoAll([]), setup.qc.DoAll([]))>>
<<gotowipehistory 'QGCostDone'>><b>If</b><b>Then:</b>
<<message '(?)'>>
What happens if the condition is satisfied?
<</message>><b>Else:</b>
<<message '(?)'>>
What happens if the condition is not satisfied?
<</message>><<set $qcost = setup.qc.OneRandom([])>>
<<gotowipehistory 'QGCostDone'>><b>A random effect out of:</b><p>
Choose a slave order to gain:
<<link '(Create new slave order)' 'SlaveOrderGen'>>
<<set _sobaserole = null>>
<<include 'SOGenInit'>>
<</link>>
</p>
<<for _islaveorder, _slaveorder range $qcustomslaveorder>>
<<capture _slaveorder>>
<<= _slaveorder.explain()>>
<<link '(Choose this)' 'QGCostDone'>>
<<set $qcost = _slaveorder>>
<</link>>
<<link '(Create new slave order based on this)' 'SlaveOrderGen'>>
<<set _sobaserole = _slaveorder>>
<<include 'SOGenInit'>>
<</link>>
<br/>
<</capture>>
<</for>>
<br/>
<br/>
<<devtoolreturnbutton>><<include LoadSelectTrait>>
<<include CostTraitActorCommon>>
<<selecttrait 'CostBgTraitResetDo' setup.TraitHelper.getAllTraitsOfTags(['bg'])>><<set $qcost = setup.qc.BgTraitReset($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>><p>
<<dangertext 'No eligible actor.'>>
Please ensure you have at least one eligible actor for this option.
You can try adding more roles, or adding a new actor to the quest / opportunity / event.
</p>
[[Return|$gPrevious]]<p>
<<devactordefault>> becomes a bodyshifter, with
<<devactor '$qgDefaultActorName2'>> as its other body.
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.SetBodyshifter($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
<<devactordefault>> bodyshifts.
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Bodyshift($qgDefaultActorName)>>
<</link>><p>
<<devactordefault>> swap bodies with
<<devactor '$qgDefaultActorName2'>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Bodyswap($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
Randomly corrupt <<devactordefault>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Corrupt($qgDefaultActorName)>>
<</link>><p>
<<devactordefault>> becomes siblings with
<<devactor '$qgDefaultActorName2'>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Sibling($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
<<devactordefault>> becomes twins with
<<devactor '$qgDefaultActorName2'>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Twin($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
<<devactordefault>> becomes the parent of
<<devactor '$qgDefaultActorName2'>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Parent($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
<<devactordefault>> gains <<numberbox '_friendship_amt' 1>> friendship with
<<devactor '$qgDefaultActorName2'>>
<<message '(?)'>>
Put a negative number if you want them to gain rivalry instead.
Note that this number is 10 times larger than displayed in game. So, if it's displayed
as 47.2 in game, that actually means it's 472. Maximum friendship is 1000, minimum is -1000.
<</message>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Friendship($qgDefaultActorName, $qgDefaultActorName2, _friendship_amt)>>
<</link>><p>
<<devactordefault>> gains <<numberbox '_friendship_amt' 1>> friendship with you.
<<message '(?)'>>
Put a negative number if you want them to gain rivalry instead.
Note that this number is 10 times larger than displayed in game. So, if it's displayed
as 47.2 in game, that actually means it's 472. Maximum friendship is 1000, minimum is -1000.
<</message>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.FriendshipWithYou($qgDefaultActorName, _friendship_amt)>>
<</link>><p>
<<devactordefault>> becomes lovers with
<<devactor '$qgDefaultActorName2'>>
<<message '(?)'>>
<div class='helpcard'>
If they had other lovers previously, they will break up first.
</div>
<</message>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Hookup($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
<<devactordefault>> breaks up with
<<devactor '$qgDefaultActorName2'>>
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Breakup($qgDefaultActorName, $qgDefaultActorName2)>>
<</link>><p>
<<devactordefault>> breaks up with you
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.BreakupWithYou($qgDefaultActorName)>>
<</link>><p>
<<devactordefault>> hooks up with you
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.HookupWithYou($qgDefaultActorName)>>
<</link>>Give <<devactordefault>> a history record:
Actor <<textbox '_history' 'kills a demon lord.'>>
<<message '(?)'>>
The game will automatically record history for important moments,
e.g., when a slaver leave the company or when a unit gains a new trait.
However, you can use this to add extra flavorful things, e.g.,
if a unit got possessed.
<</message>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddHistory($qgDefaultActorName, _history)>>
<</link>><<devactordefault>> is injured for <<numberbox '_injuryamt' 1>> weeks.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Injury($qgDefaultActorName, _injuryamt)>>
<</link>><<devactordefault>> is healed by <<numberbox '_healamt' 1>> weeks.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Heal($qgDefaultActorName, _healamt)>>
<</link>><div>
Unit
<<textbox '_leavereason' 'is training to become a great warrior'>>.
<<message '(?)'>>
<div class='helpcard'>
Complete the sentence describing the reason for being on leave.
Don't put a period at the end.
</div>
<</message>>
</div><p>
<<devactordefault>> will be on leave from your company
for <<numberbox "_weeks" 1>> weeks.
The reason is as follows.
</p>
<<include 'CostLeaveReason'>>
<br/>
<div>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Leave($qgDefaultActorName, _leavereason, _weeks)>>
<</link>>
</div><p>
<<devactordefault>> will be on leave from your company for an indefinite number of weeks.
The reason is as follows.
</p>
<<include 'CostLeaveReason'>>
<br/>
<div>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Leave($qgDefaultActorName, _leavereason)>>
<</link>>
</div><p>
<<devactordefault>> will return to your company from their leave.
</p>
<div>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Return($qgDefaultActorName)>>
<</link>>
</div>Unit <<devactordefault>> gains a level.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.levelUp($qgDefaultActorName)>>
<</link>><p>
Unit <<devactordefault>> will be gone from your company,
but can be rescued one day.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnit($qgDefaultActorName)>>
<</link>><p>
Unit <<devactordefault>> will be gone from your company
<<dangertext 'forever'>> with no chance of being rescued.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitForever($qgDefaultActorName)>>
<</link>><p>
Unit <<devactordefault>> will be gone from your company, but can be
<<successtext 'rebought'>> immediately.
The price is
<<numberbox '_multiplier' 1.0>> times their value.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRebuy($qgDefaultActorName, _multiplier)>>
<</link>><p>
Unit <<devactordefault>> will switch their job.
<<message '(?)'>>
A slaver becomes a slave available in the slave pens,
while a slave becomes a slaver available in the prospects hall.
<</message>>
Replace their flavor text background with:
The slave <<textbox '_background' 'was'>>.
For example, you can write "was a slave corrupted into a slaver".
(Leave blank to keep old flavor text.)
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitOpposite($qgDefaultActorName, _background)>>
<</link>><p>
Unit <<devactordefault>> will attempt an escape. A quest will then be generated
which must be done in order to recapture the slave.
For this one, the quest will be <<successtext 'easy'>>, with level around 15-30.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRecapture($qgDefaultActorName, 'escapeeasy')>>
<</link>><p>
Unit <<devactordefault>> will attempt an escape. A quest will then be generated
which must be done in order to recapture the slave.
For this one, the quest will be medium difficulty, with level around 35-50.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRecapture($qgDefaultActorName, 'escapemedium')>>
<</link>><p>
Unit <<devactordefault>> will attempt an escape. A quest will then be generated
which must be done in order to recapture the slave.
For this one, the quest will be <<dangertext 'hard'>>, with level 50-70.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRecapture($qgDefaultActorName, 'escapehard')>>
<</link>><p>
Slaver <<devactordefault>> will be captured, but immediately rescue-able with a quest.
For this one, the quest will be <<successtext 'easy'>>, with level around 15-30.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRecapture($qgDefaultActorName, 'capturedeasy')>>
<</link>><p>
Slaver <<devactordefault>> will be captured, but immediately rescue-able with a quest.
For this one, the quest will be medium difficulty, with level around 35-50.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRecapture($qgDefaultActorName, 'capturedmedium')>>
<</link>><p>
Slaver <<devactordefault>> will be captured, but immediately rescue-able with a quest.
For this one, the quest will be <<dangertext 'hard'>>, with level 50-70.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MissingUnitRecapture($qgDefaultActorName, 'capturedhard')>>
<</link>>Gain money equal to <<devactordefault>>'s value multiplied by
<<numberbox '_multiplier' 0.5>>, and capped at <<numberbox '_cap' 10000>>g.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.MoneyUnitValue($qgDefaultActorName, _multiplier, _cap)>>
<</link>>Give <<devactordefault>> the nickname: <<textbox '_nickname' ''>>.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Nickname($qgDefaultActorName, _nickname)>>
<</link>><<include LoadSelectTrait>>
Change <<devactordefault>>'s name to a generated one based on:
<<message '(?)'>>
The game will generate a name based on their traits. In particular, race
and gender are the two most important traits that will determine the name.
So here, if you want to replace a unit's name with a demon name, put the demon race in
and don't put any gender --- if the gender is not put, then it will use the unit's original gender.
<</message>>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.GenName($qgDefaultActorName, _rTraits)>>
<</link>>
<<selecttraits setup.trait>><<set $qcost = setup.qc.FreePlayer()>>
<<gotowipehistory 'QGCostDone'>><p>
Randomly purify <<devactordefault>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Purify($qgDefaultActorName)>>
<</link>>Resets the level of <<devactordefault>> to Level 1.
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.ResetLevel($qgDefaultActorName)>>
<</link>><p>
Gain slave: <<devactordefault>> with the following background.
The slave <<textbox '_background' 'was'>>.
For example, you can write "was a farmer".
<br/>
The slave will be <<successtextlite 'free'>> to get.
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Slave($qgDefaultActorName, _background, _needmoney)>>
<</link>><p>
Gain slave: <<devactordefault>> with the following background.
The slave <<textbox '_background' 'was'>>.
For example, you can write "was a farmer".
<br/>
The slave will need to be <<dangertextlite 'bought'>> to get.
</p>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Slave($qgDefaultActorName, _background, /* mercenary = */ true)>>
<</link>><<set $qcost = setup.qc.EscapedSlaveRandom()>>
<<include QGCostDone>><<devactordefault>> is marked as a slave, for gender preference.
<<message '(?)'>>
You can use this to mark a certain actor to use slave's gender preferences.
You don't have to use this when the unit is already a possible slave reward,
but you can use this if the unit is just a slave participating in the story.
<</message>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.SlaveMarker($qgDefaultActorName)>>
<</link>><p>
Gain a slaver: <<devactordefault>> with the following background.
The slaver <<textbox '_background' 'was'>>.
For example, you can write "was a hunter".
<br/>
The slaver will offer to join your company for <<successtextlite 'free'>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Slaver($qgDefaultActorName, _background)>>
<</link>><p>
Gain a slaver: <<devactordefault>> with the following background.
The slaver <<textbox '_background' 'was'>>.
For example, you can write "was a hunter".
<br/>
The slaver needs to be <<dangertextlite 'paid'>> money to join your company.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.Slaver($qgDefaultActorName, _background, /* mercenary = */ true)>>
<</link>><<devactordefault>> is marked as a slaver, for gender preference.
<<message '(?)'>>
You can use this to mark a certain actor to use slaver's gender preferences.
You don't have to use this when the unit is already a possible slaver reward,
but you can use this if the unit is just a slaver participating in the story.
<</message>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.SlaverMarker($qgDefaultActorName)>>
<</link>><<message '(?)'>>
Tag acts as a flag that you can set on units.
This can later be checked --- e.g., you can require that a quest
only be generated when you have a unit with a certain flag.
Use this only when you need, and remove the tag when you are done.
Also, consider using titles instead. The difference between titles and tags
is that: title is visible to the user and can have gameplay effects (e.g., increasing skills),
while tags are hidden and has no gameplay effect.
<</message>>Give <<devactordefault>> the tag: <<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddTag($qgDefaultActorName, _tag)>>
<</link>>From <<devactordefault>>, remove their tag (if any): <<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveTag($qgDefaultActorName, _tag)>>
<</link>>From ALL units, remove tag (if any): <<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveTagGlobal(_tag)>>
<</link>><<focwidget 'devtoolchoosetitle'>>
<<link '(Create new title)' 'TRGen'>>
<<set $gTRReturnPassage = passage()>>
<<include 'TRGenInit'>>
<</link>>
<br/>
<br/>
<<for _title range $qcustomtitle>>
<<rep _title>>
<<capture _title>>
<<link '(select this)'>>
<<set _chosentitle = _title>>
<<include $args[0]>>
<</link>>
<</capture>>
<br/>
<</for>>
<<for _title range setup.title>>
<<rep _title>>
<<capture _title>>
<<link '(select this)'>>
<<set _chosentitle = _title>>
<<include $args[0]>>
<</link>>
<</capture>>
<br/>
<</for>>
<</focwidget>>Give <<devactordefault>> the title:
<<devtoolchoosetitle 'CostAddTitleDo'>><<set $qcost = setup.qc.AddTitle($qgDefaultActorName, _chosentitle)>>
<<gotowipehistory 'QGCostDone'>><<devactordefault>> loses the title:
<<devtoolchoosetitle 'CostRemoveTitleDo'>><<set $qcost = setup.qc.RemoveTitle($qgDefaultActorName, _chosentitle)>>
<<gotowipehistory 'QGCostDone'>>From <<dangertextlite 'ALL'>> units, remove the title:
<<devtoolchoosetitle 'CostRemoveTitleGlobalDo'>><<set $qcost = setup.qc.RemoveTitleGlobal(_chosentitle)>>
<<gotowipehistory 'QGCostDone'>><<devactordefault>> gains the following trait:
<br/><<include LoadSelectTrait>>
<<include CostTraitActorCommon>>
<<selecttrait 'CostTraitReplaceDo'>><<set $qcost = setup.qc.TraitReplace($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>><<include LoadSelectTrait>>
<<devactordefault>> increases the following trait:
<<message '(?)'>>
(Here, increases means that
the level increase, up to the chosen trait. E.g.,
a unit with muscle_strong will increase to muscle_verystrong, when the chosen
trait is muscle_extremelystrong, while a unit with muscle_weak will have the trait disappear.)
<</message>>
<br/>
<<selecttrait 'CostTraitDo'>><<set $qcost = setup.qc.Trait($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>><<include LoadSelectTrait>>
<<devactordefault>> loses the following exact trait, if they have it:
<br/>
<<selecttrait 'CostTraitRemoveDo'>><<set $qcost = setup.qc.TraitRemove($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>><<include LoadSelectTrait>>
<<devactordefault>> decreases the following trait up to the given trait:
<<message '(?)'>>
For example, if you choose small_dick, then it will change a unit with large dick into
medium dick, while unit with small dick remain small dick.
<</message>>
<br/>
<<selecttrait 'CostTraitDecreaseDo' setup.TraitHelper.getAllTraitsOfTags(['decreasable'])>><<set $qcost = setup.qc.TraitDecrease($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>><<include LoadSelectTrait>>
<<devactordefault>> increases the following trait, if they ALREADY have it:
<<message '(?)'>>
For example, if you choose large_dick, then it will give it a larger dick ONLY
if it already have some sort of dick before.
<</message>>
<br/>
<<selecttrait 'CostTraitIncreaseExistingDo' setup.TraitHelper.getAllTraitsOfTags(['decreasable'])>><<set $qcost = setup.qc.TraitIncreaseExisting($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>><p>
Give
<<devactordefault>>
<<dangertext 'all'>> of the following traits (replacing conflicting ones):
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.TraitsReplace($qgDefaultActorName, _chosentraits)>>
<</link>>
</p>
<<include 'ChooseTraits'>><p>
Gives
<<devactordefault>>.
a random trait from:
<<for _itrait, _trait range setup.TraitHelper.getAllTraitsOfTags(['per'])>><<rep _trait>><</for>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddRandomTraitWithTags($qgDefaultActorName, ['per'])>>
<</link>><p>
<<devactordefault>>.
loses a random trait from:
<<for _itrait, _trait range setup.TraitHelper.getAllTraitsOfTags(['per'])>><<rep _trait>><</for>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveRandomTraitWithTag($qgDefaultActorName, 'per')>>
<</link>><p>
Gives
<<devactordefault>>.
a random trait from:
<<for _itrait, _trait range setup.TraitHelper.getAllTraitsOfTags(['skill'])>><<rep _trait>><</for>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddRandomTraitWithTags($qgDefaultActorName, ['skill'])>>
<</link>><p>
<<devactordefault>>.
loses a random trait from:
<<for _itrait, _trait range setup.TraitHelper.getAllTraitsOfTags(['skill'])>><<rep _trait>><</for>>.
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveRandomTraitWithTag($qgDefaultActorName, 'skill')>>
<</link>><p>
Gives
<<devactordefault>>
a random non-demonic bodypart.
(Can give rare ones too like <<= setup.trait.wings_feathery.rep() >>!)
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddRandomBodypart($qgDefaultActorName, false)>>
<</link>><p>
Gives
<<devactordefault>>
a random bodypart (can include demonic ones).
(Can give rare ones too like <<= setup.trait.wings_feathery.rep() >>!)
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddRandomBodypart($qgDefaultActorName, true)>>
<</link>><div>
<<set _guaranteed = false>>
<<checkbox '_guaranteed' false true autocheck>> guaranteed
<<message '(?)'>>
<div class='helpcard'>
If checked, then the unit is guaranteed to get this.
<br/>
<br/>
If checked, then the game will avoid the traits that the unit already have.
Otherwise, it is possible that a trait the unit already have will get selected,
which will result in the unit not gaining any trait.
</div>
<</message>>
</div><p>
Give
<<devactordefault>>
a total of
<<numberbox '_no_of_traits' 1>>
random traits out of the following traits.
The traits are increased,
<<message '(?)'>>
<div class='helpcard'>
For example, if a unit has <<rep setup.trait.muscle_veryweak>> and gained
<<rep setup.trait.muscle_verystrong>>, then the unit will now have
<<rep setup.trait.muscle_weak>>.
If you want to replace instead, use the other version.
</div>
<</message>>
not replaced.
<<include 'CostAddTraitsGuaranteedCheck'>>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddTraitsRandom($qgDefaultActorName, _chosentraits, _no_of_traits, false, _guaranteed)>>
<</link>>
</p>
<<include 'ChooseTraits'>><p>
Give
<<devactordefault>>
a total of
<<numberbox '_no_of_traits' 1>>
random traits out of the following traits.
The traits are <<dangertextlite 'replaced'>>.
<<message '(?)'>>
<div class='helpcard'>
This will first remove any conflicting traits before adding the trait.
</div>
<</message>>
<<include 'CostAddTraitsGuaranteedCheck'>>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.AddTraitsRandom($qgDefaultActorName, _chosentraits, _no_of_traits, true, _guaranteed)>>
<</link>>
</p>
<<include 'ChooseTraits'>><p>
<<devactordefault>>
loses a total of
<<numberbox '_no_of_traits' 1>>
traits out of the following traits.
The traits are decreased,
<<message '(?)'>>
For example, if a unit has <<rep setup.trait.muscle_verystrong>> and loses
it, then it becomes <<rep setup.trait.muscle_strong>>.
If you want to remove it completely instead, use the other version.
<</message>>
not necessarily removed entirely.
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.DecreaseTraitsRandom($qgDefaultActorName, _chosentraits, _no_of_traits, false)>>
<</link>>
</p>
<<include 'ChooseTraits'>><p>
<<devactordefault>>
LOSES a total of
<<numberbox '_no_of_traits' 1>>
random traits out of the following traits.
The traits are <<dangertextlite 'removed'>>.
<<message '(?)'>>
For example, a unit with <<rep setup.trait.muscle_verystrong>> will lost it completely,
instead of becoming <<rep setup.trait.muscle_strong>>.
<</message>>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.DecreaseTraitsRandom($qgDefaultActorName, _chosentraits, _no_of_traits, true)>>
<</link>>
</p>
<<include 'ChooseTraits'>><<include LoadSelectTrait>>
<<devactordefault>> permanently (not purifiable) gain the following trait:
<br/>
<<selecttrait 'CostTraitAndMakeInnateDo' setup.TraitHelper.getAllTraitsOfTags(['skin'])>><<set $qcost = setup.qc.TraitAndMakeInnate($qgDefaultActorName, $rTrait)>>
<<gotowipehistory 'QGCostDone'>>Unit <<devactordefault>> will gain all their current skin traits as their innate traits.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.ResetInnateTraits($qgDefaultActorName)>>
<</link>>Unit <<devactordefault>> will lose a random background.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveRandomTraitWithTag($qgDefaultActorName, 'bg')>>
<</link>>Unit <<devactordefault>> will lose a random personality.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveRandomTraitWithTag($qgDefaultActorName, 'per')>>
<</link>><<include LoadSelectTrait>>
<<devactordefault>> gains the following temporary trait for
<<numberbox '_duration' 5>> weeks:
<br/>
<<selecttrait 'CostTraumaDo' setup.TraitHelper.getAllTraitsOfTags(['temporary'])>><<set $qcost = setup.qc.Trauma($qgDefaultActorName, $rTrait, _duration)>>
<<gotowipehistory 'QGCostDone'>><<devactordefault>> gains a random temporary trauma for
<<numberbox '_duration' 5>> weeks.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.TraumatizeRandom($qgDefaultActorName, _duration)>>
<</link>><<devactordefault>> gains a random temporary boon for
<<numberbox '_duration' 5>> weeks.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.BoonizeRandom($qgDefaultActorName, _duration)>>
<</link>><<devactordefault>> heals
<<numberbox '_duration' 5>> weeks worth of trauma.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.TraumaHeal($qgDefaultActorName, _duration)>>
<</link>><p>
Deletes <<devactordefault>>.
<<message '(?)'>>
Only relevant for unit groups that retain their units.
Will make the unit "gone" from that unit group.
For example, you can make a slaver in the Missing Slaver unit gone,
i.e., no longer rescue-able. Often used in quests with persistent units to make
the persistent unit disappear and replaced with a new one.
<</message>>
</p>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.RemoveFromUnitGroup($qgDefaultActorName)>>
<</link>><p>
Deletes all units from the following unit group:
<<message '(?)'>>
This effectively clears this unit group.
<</message>>
</p>
<<for _iug, _ug range setup.unitgroup>>
<<if _ug.reuse_chance>>
<<rep _ug>>
<<capture _ug>>
<<link '(Select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.EmptyUnitGroup(_ug)>>
<</link>>
<</capture>>
<br/>
<</if>>
<</for>><p>
Adds <<devactordefault>> to the following unit group:
</p>
<<for _iug, _ug range setup.unitgroup>>
<<if _ug.reuse_chance>>
<<rep _ug>>
<<capture _ug>>
<<link '(Select this)' 'QGCostDone'>>
<<set $qcost = setup.qc.AddUnitToUnitGroup($qgDefaultActorName, _ug)>>
<</link>>
<</capture>>
<br/>
<</if>>
<</for>>Set the value of variable <<textbox '_key' ''>> to <<textbox '_value' ''>>
for <<numberbox '_expires' -1>> weeks.
<<message '(?)'>>
If expiration is 0 or negative, then will never expires.
<</message>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.VarSet(_key, _value, _expires)>>
<</link>>Unsets the value of the variable <<textbox '_key' ''>>.
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.VarRemove(_key)>>
<</link>>Add into variable <<textbox '_key' ''>> a value of <<numberbox '_value' ''>>
and resets expiration to <<numberbox '_expires' -1>> weeks.
<<message '(?)'>>
If the value did not exist before, it becomes 0.
If expiration is 0 or negative, then will never expires.
<</message>>
<br/>
<<link 'Done' 'QGCostDone'>>
<<set $qcost = setup.qc.VarAdd(_key, _value, _expires)>>
<</link>>Select from these options:
<hr/>
<div><b>Non-unit related</b></div>
<<if $qCostActualNoUnit>>
<div>
<<message 'Money...'>>
<div class='marketobjectcard'>
<<if $qCostActualNonCost>>
<div>
[['Gain money'|CostMoneyCustom]]
</div>
<</if>>
<div>
[['Lose money'|CostMoneyLoseCustom]]
</div>
<hr/>
<<message 'Advanced...'>>
<div class='slavercard'>
<<if $qCostActualNonCost>>
<div>
[['Gain money (auto, success)'|CostMoneyNormal]]
<<message '(?)'>>A convenience option that gives an automatically computed amount of money
equal to the total rewards that this quest should give on a <<successtext 'critical success'>>,
assuming no other rewards.
<</message>>
</div>
<div>
[['Gain money (auto, crit)'|CostMoneyCrit]]
<<message '(?)'>>A convenience option that gives an automatically computed amount of money
equal to the total rewards that this quest should give on a <<successtextlite 'success'>>,
assuming no other rewards.
<</message>>
</div>
<div>
[["Gain money based on unit's value"|CostMoneyUnitValue]]
<<message '(?)'>>Gain a sum of money equal to a fraction of a slave's value,
up to a certain cap. Use with caution, as slave value can range from 1000g to 40,000g.
Can be useful for quests that whore out your slave.<</message>>
</div>
<</if>>
<<if $qCostActualNonCost>>
<div>
[['Gain money (FIXED)'|CostMoneyCustomFixed]]
<<message '(?)'>>
Gain a fixed amount of money. When using the standard gain money,
the amount of money will be adjusted by difficulty. This one does not get
adjusted by difficulty.
<</message>>
</div>
<</if>>
<div>
[['Lose money (FIXED)'|CostMoneyLoseCustomFixed]]
<<message '(?)'>>
Lose a fixed amount of money. When using the standard gain money,
the amount of money will be adjusted by difficulty. This one does not get
adjusted by difficulty.
<</message>>
</div>
</div>
<</message>>
<</message>>
</div>
<</if>>
<<if $qCostActualNoUnit>>
<div>
<<message 'Favor / Ire...'>>
<div class='marketobjectcard'>
<div><b>Favor</b></div>
<<if $qCostActualNonCost>>
<div>
[['Gain favor'|CostFavor]]
<<message '(?)'>>
5.0 favor is worth <<money 1000>>
<</message>>
</div>
<</if>>
<div>
[['Lose favor'|CostFavorLose]]
<<message '(?)'>>
5.0 favor is worth <<money 1000>>
<</message>>
</div>
<<if $qCostActualNonCost>>
<hr/>
<div><b>Ire</b></div>
<div>
[['Gain ire'|CostIre]]
<<message '(?)'>>
1 ire is worth <<money 500>>
<</message>>
</div>
<div>
[['Lose ire'|CostIreLose]]
<<message '(?)'>>
1 ire is worth <<money 500>>
<</message>>
</div>
<</if>>
</div>
<</message>>
</div>
<</if>>
<<if $qCostActualNoUnit>>
<div>
<<message 'Item / Equipment...'>>
<div class='marketobjectcard'>
<div><b>Item</b></div>
<<if $qCostActualNonCost>>
<div>
[['Gain an item'|CostItem]]
</div>
<div>
[['Gain a random item'|CostItemPool]]
</div>
<</if>>
<div>
[['Lose an item'|CostLoseItem]]
</div>
<<if $qCostActualNonCost>>
<hr/>
<div><b>Equipment</b></div>
<div>
[['Gain an equipment'|CostEquipmentDirect]]
</div>
<div>
[['Gain a random equipment'|CostEquipment]]
</div>
<</if>>
</div>
<</message>>
</div>
<</if>>
<<if $qCostActualNoUnit && $qCostActualNonCost>>
<div>
<<message 'Quests / Mails / Event / Slave order...'>>
<div class='marketobjectcard'>
<div><b>Quest</b></div>
<div>
[['Gain a quest'|CostQuestDirect]]
</div>
<div>
[['Gain a random quest from pool'|CostQuest]]
</div>
<div>
[['Gain a chained quest'|CostQuestDirectRoles]]
<<message '(?)'>>
<div class='helpcard'>
A chained quest will make some of its actors to be the same actors in this quest.
For example, you can fight the same villain over multiple quests this way.
</div>
<</message>>
</div>
<div>
[['Gain a consecutive quest'|CostQuestDirectForceAssign]]
<<message '(?)'>>
<div class='helpcard'>
A consecutive quest will force the same team to be stuck in a new quest.
This way, you can make a quest with variable length. You can also use
this if you want to tell that your slavers got lost, and is instead stuck
in another quest.
</div>
<</message>>
</div>
<hr/>
<div><b>Opportunity</b></div>
<div>
[['Gain an opportunity'|CostOpportunity]]
</div>
<div>
[['Gained a chained opportunity'|CostOpportunityRoles]]
</div>
<hr/>
<div><b>Event</b></div>
<div>
[['Schedule an event'|CostEvent]]
</div>
<div>
[['Unschedule an event'|CostUnscheduleEvent]]
</div>
<div>
[['Schedule a chained event'|CostEventRoles]]
</div>
<hr/>
<div><b>Slave order</b></div>
<div>
[['Gain a slave order'|CostSlaveOrder]]
</div>
</div>
<</message>>
</div>
<</if>>
<hr/>
<div><b>Gain / Lose unit</b></div>
<<if $qCostActualNoUnit && $qCostActualNonCost>>
<div>
<<message 'Gain unit...'>>
<div class='marketobjectcard'>
<div><b>Slaver</b></div>
<div>
[['Gain a slaver'|CostSlaver]]
</div>
<div>
[['Gain a slaver (must be paid)'|CostSlaverMercenary]]
<<message '(?)'>>
Slavers gained via this option will have to be paid a hiring free.
The most promiment user of this reward are recruitment quests, that scouts
for potential recruits. The amount paid will depend on the traits of the slaver.
<</message>>
</div>
<hr/>
<div><b>Slave</b></div>
<div>
[['Gain a slave'|CostSlave]]
</div>
<div>
[['Gain a slave (must be paid)'|CostSlaveMercenary]]
<<message '(?)'>>
Slaves gained via this option will have to be bought with a sum of money equal to their value.
The most promiment user of this reward are quests that browse wares in a slave market.
<</message>>
</div>
</div>
<</message>>
</div>
<</if>>
<<if $qCostActualNoUnit && $qCostActualNonCost>>
<div>
<<message 'Lose unit...'>>
<div class='marketobjectcard'>
<div><b>Slaver</b></div>
<div>
[['Lose a slaver (rescue-able with a Rescuer)'|CostMissingUnit]]
<<message '(?)'>>
This is the standard way to lose slavers.
Slavers lost this way can be rescued later by the Rescuer duty.
<</message>>
</div>
<div>
<<message 'Slaver is captured but immediately rescue-able...'>>
<div class='slavercard'>
<div>
[['Easy (Lv 15 - 30)'|CostMissingUnitRecaptureEasySlaver]]
</div>
<div>
[['Medium (Lv 35 - 50)'|CostMissingUnitRecaptureMediumSlaver]]
</div>
<div>
[['Hard (Lv 50 - 70)'|CostMissingUnitRecaptureHardSlaver]]
</div>
</div>
<</message>>
<<message '(?)'>>
The slaver will went missing, but
a quest will be immediately generated where the slaver can be rescued.
If the quest is ignored, the slaver will disappear forever --- otherwise,
the slaver will be rescued in the quest.
Has three difficulties to choose from.
<</message>>
</div>
<div>
[['Lose a slaver (rebuy-able)'|CostMissingUnitRebuy]]
<<message '(?)'>>
Slavers lost this way are immediately added back to the
prospects hall, and can be rebought at a price.
The price can be adjusted to be high or low.
This is useful for example when your slaver is captured by another slaver and immediately
sold back to you.
<</message>>
</div>
<div>
[['Lose a slaver FOREVER'|CostMissingUnitForever]]
<<message '(?)'>>
Lose a slaver forever. Use extremely sparingly.
<</message>>
</div>
<hr/>
<div><b>Slave</b></div>
<div>
[['Lose a slave (rescue-able with a Rescuer)'|CostMissingUnit]]
<<message '(?)'>>
This is the standard way to lose slaves.
Slaves lost this way can be rescued later by the Rescuer duty.
<</message>>
</div>
<div>
<<message 'Slave escapes but immediately recapture-able...'>>
<div class='slavercard'>
<div>
[['Easy (Lv 15 - 30)'|CostMissingUnitRecaptureEasy]]
</div>
<div>
[['Medium (Lv 35 - 50)'|CostMissingUnitRecaptureMedium]]
</div>
<div>
[['Hard (Lv 50 - 70)'|CostMissingUnitRecaptureHard]]
</div>
</div>
<</message>>
<<message '(?)'>>
A quest will be generated where the slave will attempt an escape.
If the quest is ignored, the slave will disappear forever --- otherwise,
the slave will be recaptured in the quest.
Has three difficulties to choose from.
<</message>>
</div>
<div>
[['Lose a slave (rebuy-able immediately)'|CostMissingUnitRebuy]]
<<message '(?)'>>
Lose a slave.
Slaves lost this way are immediately added back to the
slaves pen, and can be rebought at a price.
The price can be adjusted.
This is useful for example when your slave is captured by another slaver and immediately
sold to you.
<</message>>
</div>
<div>
[['Lose a slave FOREVER'|CostMissingUnitForever]]
<<message '(?)'>>
Lose a slave forever.
Primarily used when you sell a slave.
<</message>>
</div>
<div>
[['Lose a random slave'|CostEscapedSlaveRandom]]
<<message '(?)'>>
Will make a random one of your slaves escape from the fort.
<</message>>
</div>
</div>
<</message>>
</div>
<</if>>
<<if $qCostActualUnit>>
<hr/>
<div><b>Unit related</b></div>
<div>
<<message 'Injury, Trauma, Corruption...'>>
<div class='marketobjectcard'>
<div><b>Injury</b></div>
<div>
[['Injure unit'|CostInjury]]
</div>
<div>
[['Heal unit'|CostHeal]]
</div>
<hr/>
<div><b>Trauma</b></div>
<div>
[['Traumatize unit'|CostTraumatizeRandom]]
<<message '(?)'>>
The default way to traumatize a unit.
A random trauma will be chosen and given the unit. The chance of each trauma
depends on the slaver's skills.
<</message>>
</div>
<div>
[['Boonize unit'|CostBoonizeRandom]]
<<message '(?)'>>
The default way to give a boon to a unit.
A random boon will be chosen and given the unit. The chance of each trauma
depends on the slaver's skills.
<</message>>
</div>
<div>
[['Specialized trauma / boon'|CostTrauma]]
<<message '(?)'>>
Gives a unit a specific boon or trauma.
<</message>>
</div>
<div>
[['Heal trauma'|CostTraumaHeal]]
<<message '(?)'>>
Heals traumas on a unit worth the given amount of weeks.
If the unit is not traumatized, nothing happens.
<</message>>
</div>
<hr/>
<div><b>Corruption</b></div>
<div>
[['Corrupt unit'|CostCorrupt]]
<<message '(?)'>>
Corruption will replace one of the bodyparts with its demonic counterpart,
significantly reducing one skill and reducing the value of the unit.
The bodypart chosen by this option is randomly chosen.
Corruption sometimes will replace the bodypart with non-demonic part.
<</message>>
</div>
<div>
[['Purify a unit'|CostPurify]]
<<message '(?)'>>
Restores a missing bodypart to what it should be.
Can be used to reverse corruption.
Demons cannot be purified.
<</message>>
</div>
<div>
[['Gain innate trait'|CostTraitAndMakeInnate]]
<<message '(?)'>>
Permanently give a unit a bodypart. If you give it using this, then the trait
cannot be purified.
<</message>>
</div>
<div>
[['Reset innate traits'|CostResetInnateTraits]]
<<message '(?)'>>
This unit will gain all its current skin traits as their innate traits.
Most useful for generating units.
<</message>>
</div>
</div>
<</message>>
</div>
<div>
<<message 'Trait...'>>
<div class='marketobjectcard'>
<div><b>Gain trait</b></div>
<div>
[['Gain trait / Increase trait level'|CostTrait]]
<<message '(?)'>>
<div class='helpcard'>
The preferred way to add trait.
<br/>
<br/>
For most traits, this will simply add the trait to the unit if it does not already have it.
However, some traits have level in them --- for example,
<<rep setup.trait.muscle_strong>>
<<rep setup.trait.muscle_verystrong>>
<<rep setup.trait.muscle_extremelystrong>>.
For these traits, this option will increase the trait level by one, up to the chosen trait.
For example, if you choose <<rep setup.trait.muscle_verystrong>>,
then a <<rep setup.trait.muscle_strong>> will get <<rep setup.trait.muscle_verystrong>>
and a unit with <<rep setup.trait.muscle_veryweak>> will get <<rep setup.trait.muscle_weak>>.
Units with <<rep setup.trait.muscle_verystrong>> or <<rep setup.trait.muscle_extremelystrong>>
will not change their traits.
<br/>
<br/>
Be careful with gender-specific traits such as
<<rep setup.trait.dick_small>> or <<rep setup.trait.vagina_loose>>.
Using this will grow those if the unit does not have it.
Use the "Increase trait" option instead.
<br/>
<br/>
If you want to forcefully add a trait, use the
"Replace trait" option.
</div>
<</message>>
</div>
<div>
[['Increase existing trait'|CostTraitIncreaseExisting]]
<<message '(?)'>>
Increase an existing trait, if the unit already have it, up to a certain cap.
Mostly useful for growing existing physical attributes such as
<<rep setup.trait.dick_large>> or <<rep setup.trait.breast_large>>.
<</message>>
</div>
<div>
[['Replace background'|CostBgTraitReset]]
<<message '(?)'>>
Replace a unit's background trait with a new one.
<br/>
<br/>
Note that unit can usually have multiple backgrounds. Using this,
the old background will be removed and replaced with the new one.
Most useful in generating units so that they always come with a
specific background.
<</message>>
</div>
<div>
[['Replace trait'|CostTraitReplace]]
<<message '(?)'>>
Forcefully gain a specific trait, replacing all conflicting trait.
<br/>
<br/>
This is different than gaining trait: a <<rep setup.trait.muscle_veryweak>>
slaver that gains a <<rep setup.trait.muscle_verystrong>> will end up with
<<rep setup.trait.muscle_weak>>.
But if the <<rep setup.trait.muscle_veryweak>> slaver replaced it with
<<rep setup.trait.muscle_verystrong>>, then the slaver will end up with
<<rep setup.trait.muscle_verystrong>>.
<</message>>
</div>
<div>
[['Replace trait (mass)'|CostTraitsReplace]]
<<message '(?)'>>
Shorthand for using (replace trait) on multiple traits at once.
<</message>>
</div>
<div>
<<message 'Gain random traits...'>>
<div class='slavercard'>
<div>
[['Gain random traits'|CostAddTraitsRandom]]
</div>
<div>
[['Replace random traits'|CostAddTraitsRandomReplace]]
</div>
<div>
[['Gain a random non-demonic bodypart'|CostAddRandomBodypartNonDemonic]]
</div>
<div>
[['Gain a random bodypart (can be demonic)'|CostAddRandomBodypartAll]]
</div>
</div>
<</message>>
</div>
<hr/>
<div><b>Lose trait</b></div>
<div>
[['Remove trait'|CostTraitRemove]]
<<message '(?)'>>
Removes a specific trait, if the unit have it.
<</message>>
</div>
<div>
[['Decrease existing trait'|CostTraitDecrease]]
<<message '(?)'>>
Decrease an existing trait, if the unit already have it, up to a certain cap.
Mostly useful for shrinking physical attributes such as
<<rep setup.trait.dick_small>> or <<rep setup.trait.breast_small>>,
to ensure they will not be gone.
<</message>>
</div>
<div>
<<message 'Decrease random traits...'>>
<div class='slavercard'>
<div>
[['Remove random traits'|CostDecreaseTraitsRandomReplace]]
</div>
<div>
[['Decrease random traits'|CostDecreaseTraitsRandom]]
</div>
<div>
[['Remove a random background trait'|CostRemoveRandomBgTrait]]
</div>
<div>
[['Remove a random personality trait'|CostRemoveRandomPerTrait]]
</div>
</div>
<</message>>
</div>
</div>
<</message>>
</div>
<div>
<<message 'Title...'>>
<div class='marketobjectcard'>
<div>
[["Gain title"|CostAddTitle]]
</div>
<div>
[["Lose title"|CostRemoveTitle]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Leave...'>>
<div class='marketobjectcard'>
<div><b>Go on a leave</b></div>
<div>
[["Go on a leave (set duration)"|CostLeave]]
<<message '(?)'>>
<div class='helpcard'>
This will cause the unit to be away from your company for a set number of weeks.
</div>
<</message>>
</div>
<div>
[["Go on a leave (indefinite duration)"|CostLeaveNoDuration]]
<<message '(?)'>>
<div class='helpcard'>
This will cause the unit to be away from your company until another
event / quest returns the unit back to the company.
</div>
<</message>>
</div>
<hr/>
<div><b>Return from leave</b></div>
<div>
[["Return from leave"|CostReturn]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Others...'>>
<div class='marketobjectcard'>
<div><b>History</b></div>
<div>
[["Mark a historical moment in unit's history"|CostAddHistory]]
</div>
<hr/>
<div><b>Friend / Lover</b></div>
<div>
[["Gain friendship / rivalry with you"|CostFriendshipWithYou]]
</div>
<div>
[["Become your lovers"|CostHookupWithYou]]
</div>
<div>
[["Breaks up with you"|CostBreakupWithYou]]
</div>
<hr/>
<div><b>Name</b></div>
<div>
[["Change unit's nickname"|CostNickname]]
</div>
<div>
[["Change unit's real name to a newly generated one"|CostGenName]]
</div>
<hr/>
<div><b>Level</b></div>
<div>
[["Unit levels up"|CostlevelUp]]
<<message '(?)'>>
Should NOT be used in most circumstances.
<</message>>
</div>
<div>
[["Reset unit's level to 1"|CostResetLevel]]
</div>
<hr/>
<div><b>Unit group</b></div>
<div>
[["Add unit to unit group"|CostAddUnitToUnitGroup]]
<<message '(?)'>>
Adds a unit to another unit group. This can be useful to set up an event chain,
for example, you add a slaver that just left your company to the villain unit group,
to be picked from later when the slaver seeks retribution against you.
<</message>>
</div>
<div>
[["Delete actor"|CostRemoveFromUnitGroup]]
<<message '(?)'>>
Removes the unit from the game. Only relevant for units that are generated
from persistent unit groups, such as the "Missing Slavers" unit groups
or custom-made unit groups.
<</message>>
</div>
<hr/>
<div><b>Tags</b></div>
<div>
[["Remove a tag / flag from a unit"|CostRemoveTag]]
<<include 'CostTagHelp'>>
</div>
<div>
[["Give a Tag / Flag to a unit"|CostAddTag]]
<<include 'CostTagHelp'>>
</div>
</div>
<</message>>
</div>
<</if>>
<hr/>
<div><b>Advanced</b></div>
<<if $qCostActualNonCost>>
<div>
<<message 'Recursive...'>>
<div class='marketobjectcard'>
[['Do all of the following'|CostDoAll]]
<<message '(?)'>>
Get all the rewards listed. Useful in combination with other conditionals, such as "Do one at random"
<</message>>
<br/>
[['Do one at random'|CostOneRandom]]
<<message '(?)'>>
One of these outcomes are chosen at random.
<</message>>
<br/>
[['If (restriction) then (outcome) else (outcome)'|CostIfThenElse]]
<<message '(?)'>>
Sets a restriction. If it's satisfied, then the first outcome is given. Otherwise, the second outcome is given.
<</message>>
<br/>
[['Do all of the following with certain probability'|CostDoAllProbability]]
<<message '(?)'>>
Will only give the rewards with some probability.
Useful for a "lucky" reward, e.g., small chance of getting something rare.
<</message>>
</div>
<</message>>
</div>
<</if>>
<<if $qCostActualNoUnit && $qCostActualNonCost>>
<<message 'All Others...'>>
<div class='marketobjectcard'>
<div><b>Misc.</b></div>
<div>
<<message 'Variables...'>>
<div class='slavercard'>
<div>
[['Set variable'|CostVarSet]]
</div>
<div>
[['Unset variable'|CostVarRemove]]
</div>
<div>
[['Adds a value into a variable'|CostVarAdd]]
</div>
</div>
<</message>>
<<message '(?)'>>
Variables are advanced but very flexible technique.
It is essentially a "data container" that can be used to store decisions
made by the player. For example, you can store here that a player has decided to
choose a certain opportunity, and this can later be checked for.
<</message>>
</div>
<div>
[['Prestige'|CostPrestige]]
<<message '(?)'>>
Should NOT be used in most circumstances.
<</message>>
</div>
<hr/>
<div><b>Two units</b></div>
<div>
<<message 'Family...'>>
<div class='slavercard'>
<div>
[['Make siblings'|CostSibling]]
</div>
<div>
[["Make parent-child"|CostParent]]
</div>
<div>
[['Make twins'|CostTwin]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Friendship / Lovers...'>>
<div class='slavercard'>
<div>
[['Friendship / Rivalry'|CostFriendship]]
</div>
<div>
[['Make lovers'|CostHookup]]
</div>
<div>
[['Break up lovers'|CostBreakup]]
</div>
</div>
<</message>>
</div>
<div>
[['Swap bodies'|CostBodyswap]]
<<message '(?)'>>
Swapping bodies will exchange all physical traits between the units including race
and gender.
<</message>>
</div>
<div>
[['Make bodyshifter'|CostSetBodyshifter]]
<<message '(?)'>>
A bodyshifter is able to shift their body to another one at will.
<</message>>
</div>
<hr/>
<div><b>One unit (others)</b></div>
<div>
[['Bodyshifts'|CostBodyshift]]
<<message '(?)'>>
Only usable on bodyshifters.
<</message>>
</div>
<div>
[["Mark unit as slaver"|CostSlaverMarker]]
<<message '(?)'>>
Mark this unit as a slaver --- the unit's gender will try to follow player's
preferences for slaver gender.
There is no need to use this if you already have the unit as a slaver reward.
<</message>>
</div>
<div>
[["Mark unit as slave"|CostSlaveMarker]]
<<message '(?)'>>
Mark this unit as a slave --- the unit's gender will try to follow player's
preferences for slave gender.
There is no need to use this if you already have the unit as a slave reward.
<</message>>
</div>
<div>
[['Unit switches job'|CostMissingUnitOpposite]]
<<message '(?)'>>
A unit switches their job --- i.e., a slave becomes a slaver, or a slaver becomes a slave.
<<dangertext 'USE WITH CAUTION'>>.
This is a very dangerous reward, and could easily break the game if abused.
<</message>>
</div>
<hr/>
<div><b>Global</b></div>
<div>
[["Remove a tag from ALL units that have it"|CostRemoveTagGlobal]]
</div>
<div>
[["Remove a title from ALL units that have it"|CostRemoveTitleGlobal]]
</div>
<div>
[["Clear all units from a unit group"|CostEmptyUnitGroup]]
</div>
<hr/>
<div><b>Others</b></div>
<div>
[["Free player"|CostFreePlayer]]
<<message '(?)'>>
<div class='helpcard'>
This is only relevant for quest or events that can free a captured player.
</div>
<</message>>
</div>
</div>
<</message>>
<</if>>
<br/>
<br/>
<<devtoolreturnbutton>><<set $qCostActualUnit = true>>
<<set $qCostActualNoUnit = true>>
<<set $qCostActualNonCost = true>>
<<set $qgDefaultActorName = ''>>
<<include 'QGAddCostActual'>>Choose cost type:
<<set $qCostActualUnit = false>>
<<set $qCostActualNoUnit = true>>
<<set $qCostActualNonCost = true>>
<<set $qgDefaultActorName = ''>>
<<include 'QGAddCostActual'>>Choose cost type:
<<set $qCostActualUnit = true>>
<<set $qCostActualNoUnit = false>>
<<set $qCostActualNonCost = true>>
<<set $qgDefaultActorName = 'unit'>>
<<include 'QGAddCostActual'>>Choose cost type:
<<set $qCostActualNoUnit = true>>
<<set $qCostActualUnit = false>>
<<set $qCostActualNonCost = false>>
<<include 'QGAddCostActual'>><<set $qCostActualUnit = true>>
<<set $qCostActualNoUnit = true>>
<<set $qCostActualNonCost = true>>
<<set $qgDefaultActorName = 'target'>>
<<include 'QGAddCostActual'>><<set _entry = $qcost>>
<<unset $qcost>>
<<include 'DevAddEntry'>><<if _qbaserole>>
<<set $crname = _qbaserole.getName()>>
<<set $crcrit = _qbaserole.getCritTraits()>>
<<set $crdisaster = _qbaserole.getDisasterTraits()>>
<<set $crrestrictions = _qbaserole.getRestrictions()>>
<<set $crskillmultis = _qbaserole.getSkillMultis()>>
<<set $crcritmap = {}>>
<<set $crdisastermap = {}>>
<<for _itrait, _trait range $crcrit>>
<<set $crcritmap[_trait.key] = true>>
<</for>>
<<for _itrait, _trait range $crdisaster>>
<<set $crdisastermap[_trait.key] = true>>
<</for>>
<<else>>
<<set $crname = "">>
<<set $crcrit = []>>
<<set $crdisaster = []>>
<<set $crcritmap = {}>>
<<set $crdisastermap = {}>>
<<set $crrestrictions = []>>
<<set $crskillmultis = [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
]>> /* array of 10 elements */
<</if>>
<<dtsavepassage 'CriteriaGen'>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtloadpassagelink>>
<br/>
<p>
Criteria name:
<<message '(?)'>>
<div class='helpcard'>
The criteria's name.
<br/>
<br/>
For example: "Slave Trainer"
</div>
<</message>>
<<textbox "$crname" $crname>>
</p>
<div class='equipmentcard'>
Unit Restrictions:
<<message '(?)'>>
<div class='helpcard'>
Only units that satisfies these requirements can be assigned to this role.
<br/>
<br/>
The most common requirement is Job: Slaver, which indicates that this is for
slavers only.
</div>
<</message>>
<<devlist '$crrestrictions' '(Add new restriction)' 'QGAddRestrictionUnit' 'CriteriaGen'>>
</div>
<div class='equipmentsetcard card'>
Skill weights: (should sum to 3.0)
<<message '(?)'>>
<div class='helpcard'>
How important each skill is for this role.
<br/>
<br/>
If this is a slave role, skills are not used and should be set to all 0.
<br/>
<br/>
The skill weights should sum to 3.0.
For example, you can assign 1.5 to <<rep setup.skill.combat>>, 0.5 to <<rep setup.skill.brawn>>,
and 1.0 to <<rep setup.skill.knowledge>>.
</div>
<</message>>
<<for _iskill, _skill range setup.skill>>
<br/>
<<set _varname = `$crskillmultis[${_iskill}]`>>
<<capture _varname>>
<<rep _skill>>: <<numberbox _varname $crskillmultis[_iskill]>>
<</capture>>
<</for>>
</div>
<<focwidget 'loadcatcrit'>>
<div class='dutycard'>
<<successtext 'CRITICAL'>>:
<<message '(?)'>>
<div class='helpcard'>
Specially beneficial traits for this mission.
<br/>
<br/>
Having these traits increase the chance to get <<successtext 'critical success'>>.
Having 5-10 traits is recommended.
</div>
<</message>>
<<for _itrait, _trait range $crcrit >>
<<capture _itrait, _trait>>
<<rep _trait>>
<<link '(-)'>>
<<run $crcrit.splice(_itrait, 1)>>
<<run delete $crcritmap[_trait.key]>>
<<refreshcatcrit>>
<</link>>
|
<</capture>>
<</for>>
<br/>
Add new trait:
<<for _itrait, _trait range setup.trait>>
<<if !(_trait.key in $crcritmap)>>
<<rep _trait>>
<<capture _trait>>
<<link '(+)'>>
<<run $crcrit.push(_trait)>>
<<set $crcritmap[_trait.key] = true>>
<<refreshcatcrit>>
<</link>>
<</capture>>
<<else>>
<<negtraitcard _trait>>
(+)
<</if>>
|
<</for>>
</div>
<</focwidget>>
<<focwidget 'loadcatdisaster'>>
<div class='contactcard'>
<<dangertext 'DISASTER'>>:
<<message '(?)'>>
<div class='helpcard'>
Specially disastrous traits for this mission.
<br/>
<br/>
Having these traits increase the chance to get <<dangertext 'disaster failure'>>.
Having 5-10 traits is recommended.
</div>
<</message>>
<<for _itrait, _trait range $crdisaster >>
<<capture _itrait, _trait>>
<<rep _trait>>
<<link '(-)'>>
<<run $crdisaster.splice(_itrait, 1)>>
<<run delete $crdisastermap[_trait.key]>>
<<refreshcatdisaster>>
<</link>>
|
<</capture>>
<</for>>
<br/>
Add new trait:
<<for _itrait, _trait range setup.trait>>
<<if !(_trait.key in $crdisastermap)>>
<<rep _trait>>
<<capture _trait>>
<<link '(+)'>>
<<run $crdisaster.push(_trait)>>
<<set $crdisastermap[_trait.key] = true>>
<<refreshcatdisaster>>
<</link>>
<</capture>>
<<else>>
<<negtraitcard _trait>>
(+)
<</if>>
|
<</for>>
</div>
<</focwidget>>
<div id='catdivcrit'>
<<loadcatcrit>>
</div>
<<focwidget 'refreshcatcrit'>>
<<replace '#catdivcrit'>>
<<loadcatcrit>>
<</replace>>
<</focwidget>>
<div id='catdivdisaster'>
<<loadcatdisaster>>
</div>
<<focwidget 'refreshcatdisaster'>>
<<replace '#catdivdisaster'>>
<<loadcatdisaster>>
<</replace>>
<</focwidget>>
<<link 'CREATE CRITERIA' >>
<<if !$crname>>
<<warning 'Name cannot be empty'>>
<<else>>
<<run $qcustomcriteria.push(
new setup.UnitCriteria(
null, /* key */
$crname,
$crcrit,
$crdisaster,
$crrestrictions,
$crskillmultis,
)
)>>
<<dtloadpassage>>
<<goto 'QGAddRole'>>
<</if>>
<</link>><<unset _sellore>>
<div style="display: flex; flex-wrap: wrap">
<<for _lore range Object.values(setup.lore)>>
<<capture _lore>>
<<set _text = _lore.getName()>>
<<button _text>>
<<set _sellore = _lore>>
<<run Dialog.close()>>
<</button>>
<</capture>>
<</for>>
</div>
<div>
<<button 'Cancel'>>
<<run Dialog.close()>>
<</button>>
</div><<focwidget 'devselectedtraits'>>
<div>Selected: <<= _seltraits.length >></div>
<div style="display: flex; flex-wrap: wrap">
<<for _iseltraitkey, _seltraitkey range _seltraits>>
<div style="margin: 0 4px; cursor: pointer">
<<capture _iseltraitkey>>
<<onevent 'click'>>
<<= setup.trait[_seltraitkey].rep(true)>>
<<onevent-callback>>
<<run _seltraits.splice(_iseltraitkey, 1)>>
<<replace '#seltraits'>><<devselectedtraits>><</replace>>
<</onevent>>
<</capture>>
</div>
<</for>>
<<if !_seltraits.length>>
(none)
<</if>>
</div>
<div>
<<button 'Clear'>>
<<set _seltraits.length = 0>>
<<replace '#seltraits'>><<devselectedtraits>><</replace>>
<</button>>
</div>
<div>
<<button 'Confirm'>>
<<run Dialog.close()>>
<</button>>
</div>
<</focwidget>>
<div id="seltraits" style="display: grid; grid-template-columns: auto 1fr auto auto; grid-column-gap: 8px">
<<devselectedtraits>>
</div>
<hr/>
<p>
Search by name:
<<onevent 'input'>>
<<textbox '_devtraitpickerfilter_dummy' ''>>
<<onevent-callback>>
<<set _devtraitpickerfilter = (_value || '').trim().toLowerCase()>>
<<filterable-refresh '<.filterable'>>
<</onevent>>
</p>
<p>Click on a trait to add it to selection:</p>
<<set _filterfn = () => Object.keys(setup.trait).filter(trait_key => !_devtraitpickerfilter || trait_key.includes(_devtraitpickerfilter))>>
<<filterable _filterfn>>
<div style="display: grid; grid-template-columns: repeat(auto-fill, minmax(34px, 1fr))">
<<for _itrait, _trait range setup.trait>>
<div style="cursor: pointer" @data-filter-key="_trait.key">
<<capture _trait>>
<<onevent 'click'>>
<<= _trait.rep(true)>>
<<onevent-callback>>
<<run _seltraits.includes(_trait.key) ? undefined : _seltraits.push(_trait.key)>>
<<replace '#seltraits'>><<devselectedtraits>><</replace>>
<</onevent>>
<</capture>>
</div>
<</for>>
</div>
<</filterable>><<nobr>>
<<devtoolcontentdonebegin 'event'>>
<<link '(Test your event)' 'EventDebugDo'>>
<<set setup.event[$dtquest.key] = $dtquest>>
<<set $qDebugEventTemplate_key = $dtquest.key>>
<<set setup.DEVTOOL_edesc = $edesc>>
<</link>>
[[(Back to edit event)|EventGen]]
<br/>
<br/>
<<devtoolcontentdonemid 'event'>>
<</nobr>>
<div class='companycard'> <code>
"""::""" <<= $epassagesetup >> [nobr event]
<<dtprintmeta>>
"""<<run new setup.Event("""
'<<= $ekey>>', """/* key */"""
<<dtprinttitle>>
<<dtprintauthor>>
<<dtprinttags>>
'<<= $epassagedesc>>',
{ """/* roles */"""
<<for _irole, _role range $dtquest.getUnitRestrictions()>> <<nobr>>
'<<= _irole>>': [
<<for _iccost, _ccost range _role>>
<br/>
<<= _ccost.text()>>,
<</for>>
<br/>
],
<</nobr>>
<</for>> },
<<dtprintactors>>
<<dtprintoutcomes 'rewards'>>
<<dtprintrestrictions 'requirements'>>
<<= $dtquest.cooldown >>, """/* Cooldown */"""
<<= $dtquest.rarity >>, """/* Rarity */"""
)>>
"""::""" <<= $epassagedesc >> [nobr]
<<= setup.escapeTwine($edesc)>>
</code></div><<set $devtooltype = 'event'>>
<<set $qcustomslaveorder = []>>
<<set $qcustomcriteria = []>>
<<set $qcustomunitgroup = []>>
<<set $qcustomtitle = []>>
<<set _ekey = '__devtool_event'>>
<<set _epassage = 'DummyEventPassageDesc'>>
<<set $edesc = "">>
<<if _ekey in setup.event>>
<<run delete setup.event[_ekey]>>
<</if>>
<<if !_ebase>>
<<set $dtquest = new setup.Event(
_ekey,
"", /* name */
"", /* author */
[], /* tags */
_epassage, /* desc passage */
[], /* unit restrictions */
{}, /* actors */
[], /* outcomes */
[], /* requirements */
300, /* cooldown */
1, /* rarity */
)>>
<<else>>
<<set $edesc = Story.get(_ebase.getPassage()).text>>
<<set $dtquest = new setup.Event(
_ekey,
_ebase.getName(), /* name */
_ebase.getAuthor(), /* author */
_ebase.getTags(), /* tags */
_epassage, /* desc passage */
_ebase.getUnitRestrictions(), /* unit restrictions */
_ebase.getActorUnitGroups(), /* actors */
_ebase.getRewards(), /* outcomes */
_ebase.getRequirements(), /* requirements */
_ebase.getCooldown(), /* cooldown */
_ebase.getRarity(), /* rarity */
)>>
<</if>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtauthor "$dtquest.author" $dtquest.author>>
<<dtname "$dtquest.name" $dtquest.name>>
<<dtrarity "$dtquest.rarity" $dtquest.rarity>>
<p>
<b>Cooldown</b>:
<<message '(?)'>>
<div class='helpcard'>
How many weeks before this event can be triggered again.
<br/>
<br/>
Recommended to put at least 200 weeks for random events, but 0 for chain events.
</div>
<</message>>
<<numberbox "$dtquest.cooldown" $dtquest.cooldown>>
</p>
<<dttags $dtquest>>
/*
<div class='slavecard'>
Roles (max. 5)
<<message '(?)'>>
<div class='helpcard'>
Your units that are participating in this event.
<br/>
<br/>
Maximum is 5 roles.
</div>
<</message>>
<<if Object.keys($dtquest.getUnitRestrictions()).length < 5>>
<br/>
Add new role with actor name: <<textbox '_newactorname' ''>>
<<link '(Add role)'>>
<<if !_newactorname || $dtquest.getAllActorNames().includes(_newactorname)>>
<<warning 'Duplicate actor name or missing actor name'>>
<<else>>
<<set $dtquest.unit_restrictions[_newactorname] = []>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<goto 'EventGen'>>
<</if>>
<</link>>
<</if>>
<<for _irole, _role range $dtquest.unit_restrictions>>
<div class='marketobjectcard'>
<<= _irole>>
<<message '(?)'>>
<div class='helpcard'>
Restrictions for this unit
<br/>
<br/>
Only units that satisfies this will ever be assigned to this role.
The game will try to find an assignment that matches.
The most common requirement is Job: Slaver, which indicates that this role is for
slavers only.
</div>
<</message>>:
<<capture _irole, _role>>
<<link '(DELETE THIS ROLE)' 'EventGen'>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<run delete $dtquest.unit_restrictions[_irole]>>
<</link>>
<</capture>>
<<set _listpath = '$dtquest.unit_restrictions[' + _irole + ']'>>
<<devlist _listpath '(Add new restriction)' 'QGAddRestrictionUnit' 'EventGen'>>
<br/>
</div>
<</for>>
</div>
*/
<<dtactor $dtquest>>
<<dtoutcome "$dtquest.rewards">>
<<dtrestriction "$dtquest.requirements">>
<hr/>
<<dtstoryhelp>>
<div class="overflow-story-container">
<hr/>
<p>
<b>Event text</b>:
<br/>
<<codeeditor '$edesc' $edesc>>
</p>
<hr/>
<p class="center">
<br/>
<<button 'CREATE EVENT!'>>
<<set $ekey = setup.getKeyFromName($dtquest.name, setup.event)>>
/* create passage names etc */
<<set $efilename = `${$ekey}.twee`>>
<<set $epassagesetup = `EventSetup_${$ekey}`>>
<<set $epassagedesc = `Event_${$ekey}`>>
<<goto 'EGCreate'>>
<</button>>
</p>
</div><<nobr>>
<<devtoolcontentdonebegin 'interaction'>>
<<link '(Test your interaction)' 'InteractionDebugDo'>>
<<set setup.interaction[$dtquest.key] = $dtquest>>
<<set $qDebugInteractionTemplate_key = $dtquest.key>>
<<set setup.DEVTOOL_idesc = $idesc>>
<</link>>
[[(Back to edit interaction)|InteractionGen]]
<br/>
<br/>
<<devtoolcontentdonemid 'interaction'>>
<</nobr>>
<div class='companycard'> <code>
"""::""" <<= $ipassagesetup >> [nobr interaction]
<<dtprintmeta>>
"""<<run new setup.Interaction("""
'<<= $ikey>>', """/* key */"""
<<dtprinttitle>>
<<dtprintauthor>>
<<dtprinttags>>
'<<= $ipassagedesc>>',
<<dtprintcosts>>
<<dtprintrestrictions 'prerequisites'>>
[ """/* unit requirements */"""
<<for _irestriction, _restriction range $dtquest.unit_requirements >><<nobr>>
<<= _restriction.text()>>,
<</nobr>>
<</for>> ],
<<dtprintoutcomes 'rewards'>>
<<= $dtquest.cooldown >>,
setup.interactionpool.unit,
)>>
"""::""" <<= $ipassagedesc >> [nobr]
<<= setup.escapeTwine($idesc)>>
</code></div><<set $devtooltype = 'interaction'>>
<<set $qcustomslaveorder = []>>
<<set $qcustomcriteria = []>>
<<set $qcustomunitgroup = []>>
<<set $qcustomtitle = []>>
<<set _ikey = '__devtool_interaction'>>
<<set _ipassage = 'DummyInteractionPassage'>>
<<set $idesc = "">>
<<if _ikey in setup.interaction>>
<<run delete setup.interaction[_ikey]>>
<</if>>
<<if !_ibase>>
<<set $dtquest = new setup.Interaction(
_ikey,
'', /* name */
'', /* author */
[], /* tags */
_ipassage, /* desc passage */
[], /* costs */
[], /* requirements */
[], /* unit requirements */
[], /* outcomes */
0, /* cooldown */
setup.interactionpool.unit, /* pool */
)>>
<<else>>
<<set $idesc = Story.get(_ibase.getPassage()).text>>
<<set $dtquest = new setup.Interaction(
_ikey,
_ibase.getName(), /* name */
_ibase.getAuthor(), /* author */
_ibase.getTags(), /* tags */
_ipassage, /* desc passage */
_ibase.getCosts(), /* costs */
_ibase.getPrerequisites(), /* requirements */
_ibase.getUnitRequirements(), /* unit requirements */
_ibase.getRewards(), /* outcomes */
_ibase.getCooldown(), /* cooldown */
setup.interactionpool.unit, /* pool */
)>>
<</if>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtauthor "$dtquest.author" $dtquest.author>>
<<dtname "$dtquest.name" $dtquest.name>>
<p>
Interaction cooldown:
<<message '(?)'>>
<div class='helpcard'>
Number of weeks before this interaction can be used again.
<br/>
<br/>
0 means no cooldown, and this interaction can be spammed each week.
</div>
<</message>>
<<numberbox "$dtquest.cooldown" $dtquest.cooldown>> weeks
</p>
<<dttags $dtquest>>
<div class='marketobjectcard'>
<b>Unit requirements</b>:
<<message '(?)'>>
<div class='helpcard'>
Only units that satisfies these requirements can be interacted with.
<br/>
<br/>
The most common requirement is Job: Slave,
which indicates that this interaction can only be used on slaves.
</div>
<</message>>:
<<devlist '$dtquest.unit_requirements' '(Add new requirement)' 'QGAddRestrictionUnit' 'InteractionGen'>>
</div>
<<dtcost '$dtquest.costs'>>
<div class='equipmentcard'>
<b>Outcomes</b>:
<<message '(?)'>>
<div class='helpcard'>
What happens afterwards, if any.
</div>
<</message>>
<<devlist '$dtquest.rewards' '(Add new outcome)' 'QGAddCostTarget' 'DevGoToReturn'>>
</div>
<<dtrestriction "$dtquest.prerequisites">>
<hr/>
<<dtstoryhelp>>
<div class="overflow-story-container">
<hr/>
<p>
Interaction text:
<<message '(?)'>>
<div class='helpcard'>
Describes what happens during the interaction.
</div>
<</message>>
<br/>
<<codeeditor '$idesc' $idesc>>
</p>
<hr/>
<p class="center">
<br/>
<<button 'CREATE INTERACTION!'>>
<<set $ikey = setup.getKeyFromName($dtquest.name, setup.interaction)>>
/* create passage names etc */
<<set $ifilename = `${$ikey}.twee`>>
<<set $ipassagesetup = `InteractionSetup_${$ikey}`>>
<<set $ipassagedesc = `Interaction_${$ikey}`>>
<<goto 'IGCreate'>>
<</button>>
</p>
</div><<run Config.history.maxStates = 3>>
<<set $qDevTool = true>>
<<include 'DevToolMenu'>><p>
Remember that you can undo your action by clicking on the left arrow on the top left of the screen.
</p>
<div class='unemployedcard'>
<b>New Quest</b>
<<message '(?)'>>
Create a new quest.
<</message>>
<br/>
<<link 'Create new quest based on existing quest' 'QuestGenSetupExisting'>>
<</link>>
<b>recommended</b>
<<message '(?)'>>
Using this option, some of your quest details such as slaver roles and difficulty will be based
on an existing quest.
They can be changed later, and there is <b>no drawback</b> on selecting this option compared
to creating new from scratch. This is the recommended option.
<</message>>
<br/>
<<link 'Create new from scratch' 'QuestGen'>>
<<set _qbase = null>>
<<include 'QuestGenSetup'>>
<</link>>
</div>
<div class='companycard'>
<b>New Interaction</b>
<<message '(?)'>>
Create a new interaction, either between you and a slave, or between you and a slaver (or sometimes both).
This includes the sex options that you can see when you interact with your slavers/slaves.
Most of the interactions have no in-game effects, and just flavor text, but they remain
an important part of the game.
<</message>>
<br/>
<<link 'Create new interaction based on existing interaction' 'InteractionGenSetupExisting'>>
<</link>>
<<message '(?)'>>
Using this option, some of your interaction details such as the option rewards and difficulty will be based
on an existing interaction.
They can be changed later, and there is <b>no drawback</b> on selecting this option compared
to creating new from scratch. This is the recommended option.
<</message>>
<br/>
<<link 'Create new interaction from scratch' 'InteractionGen'>>
<<set _ibase = null>>
<<include 'InteractionGenSetup'>>
<</link>>
</div>
<div class='opportunitycard'>
<b>New Mail / Opportunity</b>
<<message '(?)'>>
Create a new opportunity.
Opportunity and mails are the same thing.
An opportunity usually diverges into multiple quests, for example it could ask if you want
to kidnap the farmer's daughter or just raid the farm.
To make an opportunity, you usually will first write the corresponding quests,
and then create an opportunity that rewards those quests when you select the options.
<</message>>
<br/>
<<link 'Create new opportunity based on existing opportunity' 'OpportunityGenSetupExisting'>>
<</link>>
<<message '(?)'>>
Using this option, some of your opportunity details such as the option rewards and difficulty will be based
on an existing opportunity.
They can be changed later, and there is <b>no drawback</b> on selecting this option compared
to creating new from scratch. This is the recommended option.
<</message>>
<br/>
<<link 'Create new opportunity from scratch' 'OpportunityGen'>>
<<set _obase = null>>
<<include 'OpportunityGenSetup'>>
<</link>>
</div>
<div class='equipmentsetcard card'>
<b>New Event</b>
<<message '(?)'>>
Create a new event.
Events can either be randomly triggered during the end of week,
or can be scheduled to event (e.g., a quest can make a slaver leave your company for a few weeks
until an event triggers.
<</message>>
<br/>
<<link 'Create new event based on existing event' 'EventGenSetupExisting'>>
<</link>>
<br/>
<<link 'Create new event from scratch' 'EventGen'>>
<<set _ebase = null>>
<<include 'EventGenSetup'>>
<</link>>
</div><<include 'LoadDevWidgets'>>
<<devchoosequest 'QuestGenSetupExistingDo'>><<set _qbase = _questchosen>>
<<include 'QuestGenSetup'>>
<<goto 'QuestGen'>><<include 'LoadDevWidgets'>>
<<devchooseopportunity 'OpportunityGenSetupExistingDo'>><<set _obase = _opportunitychosen>>
<<include 'OpportunityGenSetup'>>
<<goto 'OpportunityGen'>>Choose existing event to base from:
<br/>
<<for _ievent, _event range setup.event>>
<<capture _event>>
<<link _event.getName() 'EventGen'>>
<<set _ebase = _event>>
<<include 'EventGenSetup'>>
<</link>>
<br/>
<</capture>>
<</for>>Choose existing interaction to base from:
<br/>
<<for _iinteraction, _interaction range setup.interaction>>
<<capture _interaction>>
<<link _interaction.getName() 'InteractionGen'>>
<<set _ibase = _interaction>>
<<include 'InteractionGenSetup'>>
<</link>>
<br/>
<</capture>>
<</for>><<nobr>>
<<devtoolcontentdonebegin 'opportunity'>>
<<link '(Test your opportunity)'>>
<<set setup.opportunitytemplate[$dtquest.key] = $dtquest>>
<<if $qpool>>
<<run $qpool.registerOpportunity($dtquest, $qrarity)>>
<</if>>
<<set setup.DEVTOOL_odesc = $odesc>>
<<set setup.DEVTOOL_ooptiondesc = $ooptiondesc>>
<<set setup.DEVTOOL_ooptiontitle = $ooptiontitle>>
<<for _ioption, _option range $ooptiondesc>>
<<set $dtquest.options[_ioption][0] = `DummyOpportunityPassage${_ioption}`>>
<<set $dtquest.options[_ioption][1] = `DummyOpportunityPassageFlavor${_ioption}`>>
<</for>>
<<set $qDebugOpportunityTemplate_key = $dtquest.key>>
<<focgoto 'OpportunityDebugChoose'>>
<</link>>
[[(Back to edit opportunity)|OpportunityGen]]
<br/>
<br/>
<<devtoolcontentdonemid 'opportunity'>>
<</nobr>>
<div class='companycard'> <code>
"""::""" <<= $opassagesetup >> [nobr opportunity]
<<dtprintmeta>>
"""<<run new setup.OpportunityTemplate("""
'<<= $okey>>', """/* key */"""
<<dtprinttitle>>
<<dtprintauthor>>
<<dtprinttags>>
<<dtprintdeadlineweeks>>
'<<= $opassagedesc>>',
<<dtprintdifficulty>>
[ """/* options */""" <<nobr>>
<<for _ioption, _option range $dtquest.options>>
<br>
[
<br/>
'Opportunity_<<= $okey>>_<<= _ioption>>',
<br/>
<<if $ooptiondesc[_ioption]>>
'Opportunity_<<= $okey>>_<<= _ioption>>_flavor',
<<else>>
null,
<</if>>
<br/>
[ """/* costs */"""
<<for _icost, _cost range _option[2]>>
<br/>
<<= _cost.text()>>,
<</for>>
<br/>
],
<br/>
[ """/* restrictions */"""
<<for _irestriction, _restriction range _option[3]>>
<br/>
<<= _restriction.text()>>,
<</for>>
<br/>
],
<br/>
[ """/* outcomes */"""
<<for _ioutcome, _outcome range _option[4]>>
<br/>
<<= _outcome.text()>>,
<</for>>
<br/>
],
<br/>
],
<</for>>
<</nobr>>
],
<<dtprintquestpool $opool $orarity>>
<<dtprintrestrictions 'prerequisites'>>
<<dtprintactors>>
<<dtprintexpirationoutcomes>>
<<= $dtquest.isMustBeAnswered()>>, """ /* is must be answered */ """
)>>
"""::""" <<= $opassagedesc >> [nobr]
<<= setup.escapeTwine($odesc)>>
<<for _ioption, _option range $dtquest.options>>
"""::""" Opportunity_<<= $okey>>_<<= _ioption>> [nobr]
<<= setup.escapeTwine($ooptiontitle[_ioption])>>
<<if $ooptiondesc[_ioption]>>
"""::""" Opportunity_<<= $okey>>_<<= _ioption>>_flavor [nobr]
<<= setup.escapeTwine($ooptiondesc[_ioption])>>
<</if>>
<</for>>
</code></div><<set $devtooltype = 'opportunity'>>
<<set $qcustomslaveorder = []>>
<<set $qcustomcriteria = []>>
<<set $qcustomunitgroup = []>>
<<set $qcustomtitle = []>>
<<set _okey = '__devtool_opportunity'>>
<<set _opassage = 'DummyOpportunityPassageDesc'>>
<<set $opool = null>>
<<set $orarity = 1>>
<<set $odesc = "">>
<<set $ooptiondesc = []>>
<<set $ooptiontitle = []>>
<<if _okey in setup.opportunitytemplate>>
<<run delete setup.opportunitytemplate[_okey]>>
<</if>>
<<if !_obase>>
<<set $dtquest = new setup.OpportunityTemplate(
_okey, /* key */
"", /* name */
"", /* author */
[], /* tags */
1, /* deadline weeks */
_opassage, /* description passage */
setup.qdiff.normal40, /* difficulty */
[], /* options */
[], /* quest pools */
[], /* restrictions */
{}, /* actors */
[], /* expiration outcomes */
true, /* is_must_be_answered */
)>>
<<else>>
<<set $odesc = Story.get(_obase.getDescriptionPassage()).text>>
<<set _ooptions = []>>
<<for _ioption, _option range _obase.getOptions()>>
<<set _optiondesc = ''>>
<<if _option[1]>>
<<set _optiondesc = Story.get(_option[1]).text>>
<</if>>
<<run $ooptiondesc.push(_optiondesc)>>
<<run $ooptiontitle.push(Story.get(_option[0]).text)>>
<<run _ooptions.push([
`DummyOpportunityPassage${_ioption}`,
`DummyOpportunityPassageFlavor${_ioption}`,
_option[2],
_option[3],
_option[4],
])>>
<</for>>
<<set $dtquest = new setup.OpportunityTemplate(
_okey, /* key */
_obase.getName(), /* name */
_obase.getAuthor(), /* author */
_obase.tags, /* tags */
_obase.getDeadlineWeeks(), /* deadline weeks */
_opassage, /* description passage */
_obase.getDifficulty(), /* difficulty */
_ooptions, /* options */
[], /* quest pools */
_obase.getPrerequisites(), /* restrictions */
_obase.getActorUnitGroups(), /* actors */
_obase.getExpiredOutcomes(), /* expiration outcomes */
_obase.isMustBeAnswered(), /* is_must_be_answered */
)>>
<</if>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtauthor "$dtquest.author" $dtquest.author>>
<<dtname "$dtquest.name" $dtquest.name>>
<<dtquestpool "$opool" $opool 'OGChooseQuestPool'>>
<<dtrarity "$orarity" $orarity>>
<<dtdifficulty $dtquest 'OGChooseDifficulty'>>
<<dttags $dtquest>>
<<dtactor $dtquest>>
<<dtrestriction '$dtquest.prerequisites'>>
<div class='opportunitycard'>
Options: <<message '(?)'>>
<div class='helpcard'>
The various choices you can make on this opportunity.
<br/>
<br/>
An opportunity should always have at least one option.
Maximum 10 options.
</div>
<</message>>
<<if $ooptiondesc.length < 10>>
<<link '(Add new option)' 'OpportunityGen'>>
<<set _i = $ooptiondesc.length>>
<<run $dtquest.options.push([
`DummyOpportunityPassage${_i}`,
`DummyOpportunityPassageFlavor${_i}`,
[],
[],
[],
])>>
<<run $ooptiondesc.push('')>>
<<run $ooptiontitle.push('')>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</if>>
<<for _ioption, _option range $dtquest.options>>
<<set _baseoptionvar = `$dtquest.options[${_ioption}]`>>
<<capture _ioption, _option>>
<div class='opportunitycardoption'>
<div>
Option name:
<<message '(?)'>>
<div class='helpcard'>
The displayed option name.
<br/>
<br/>
For example, "Raid the vilage"
</div>
<</message>>
<<set _title = `$ooptiontitle[${_ioption}]`>>
<<textbox _title $ooptiontitle[_ioption]>>
</div>
<div>
Option flavor text:
<<message '(?)'>>
<div class='helpcard'>
Flavor text of what happens after you select this option.
<br/>
<br/>
Can be left empty if you don't want to have any text.
</div>
<</message>>
<br/>
<<set _desccontainer = `$ooptiondesc[${_ioption}]`>>
<<codeeditor _desccontainer $ooptiondesc[_ioption]>>
</div>
<<set _cost = `$dtquest.options[${_ioption}][2]`>>
<<dtcost _cost>>
<<set _restriction = `$dtquest.options[${_ioption}][3]`>>
<<dtrestriction _restriction>>
<<set _outcomes = `$dtquest.options[${_ioption}][4]`>>
<<dtoutcome _outcomes>>
<<link '(DELETE THIS OPTION)' 'OpportunityGen'>>
<<run $dtquest.options.splice(_ioption, 1)>>
<<run $ooptiontitle.splice(_ioption, 1)>>
<<run $ooptiondesc.splice(_ioption, 1)>>
<</link>>
</div>
<</capture>>
<</for>>
</div>
<<if $dtquest.isMustBeAnswered()>>
<div>This opportunity <<dangertext 'must be answered'>> by the player.
<<link '(Click to allow this to be ignored)' 'OpportunityGen'>>
<<set $dtquest.is_must_be_answered = false>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
</div>
<<else>>
<div>This opportunity <<successtext 'can be ignored'>> and expire on its own.
<<link '(Click to force players to answer this opportunity)' 'OpportunityGen'>>
<<set $dtquest.is_must_be_answered = true>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
</div>
<<dtexpires "$dtquest.deadline_weeks" $dtquest.deadline_weeks>>
<<dtexpireoutcome '$dtquest.expired_outcomes'>>
<</if>>
<hr/>
<<dtstoryhelp>>
<div class="overflow-story-container">
<hr/>
<p>
<b>Opportunity description</b>:
<br/>
<<codeeditor '$odesc' $odesc>>
</p>
<hr/>
<p class="center">
<br/>
<<button 'CREATE OPPORTUNITY!'>>
<<set $okey = setup.getKeyFromName($dtquest.name, setup.opportunitytemplate)>>
/* create passage names */
<<set $ofilename = `${$okey}.twee`>>
<<set $opassagesetup = `OpportunitySetup_${$okey}`>>
<<set $opassagedesc = `Opportunity_${$okey}`>>
<<goto 'OGCreate'>>
<</button>>
</p>
</div><p>Choose where quest can appear</p>
<<dtquestpoolchoose 'OGChooseQuestPoolDo'>><<set $opool = _questpoolchosen>>
<<gotowipehistory 'OpportunityGen'>><p>Choose quest difficulty</p>
<<devchoosedifficulty 'OGChooseDifficultyDo'>><<set $dtquest.difficulty = _diffchosen>>
<<gotowipehistory 'OpportunityGen'>><<nobr>>
<<devtoolcontentdonebegin 'quest'>>
<<link '(Test your quest)' 'QuestDebugAll'>>
<<set setup.questtemplate[$dtquest.key] = $dtquest>>
<<if $qpool>>
<<run $qpool.registerQuest($dtquest, $qrarity)>>
<</if>>
<<set $qDebugQuestTemplate_key = $dtquest.key>>
<<set setup.DEVTOOL_qdesc = $qdesc>>
<<set setup.DEVTOOL_qoutcomedesc = $qoutcomedesc>>
<</link>>
[[(Back to edit quest)|QuestGen]]
<br/>
<br/>
<<devtoolcontentdonemid 'quest'>>
<</nobr>>
<div class='companycard'> <code>
"""::""" <<= $qpassagesetup >> [nobr quest]
<<dtprintmeta>>
<<for _irole, _role range $dtquest.getUnitCriterias()>> <<if !_role.criteria.key>> <<set _rolename = `_criteria${_irole}`>>
"""<<"""set <<= _rolename >> = new setup.UnitCriteria(
null, """/* key */"""
'<<= setup.escapeJsString(_role.criteria.getName())>>', """/* name */"""
[
<<for _itrait, _trait range _role.criteria.getCritTraits()>><<nobr>>
setup.trait.<<= _trait.key>>,
<</nobr>>
<</for>> ],
[
<<for _itrait, _trait range _role.criteria.getDisasterTraits()>><<nobr>>
setup.trait.<<= _trait.key>>,
<</nobr>>
<</for>> ],
[
<<for _irestriction, _restriction range _role.criteria.getRestrictions()>><<nobr>>
<<= _restriction.text()>>,
<</nobr>>
<</for>> ],
{ <<for _iskill, _ivalue range _role.criteria.getSkillMultis()>> <<nobr>>
<<if _ivalue>>
<br/>
<<= setup.skill[_iskill].keyword>>: <<= _ivalue>>,
<</if>>
<</nobr>> <</for>>
}
)>> <</if>>
<</for>><<nobr>>
<</nobr>>"""<<run new setup.QuestTemplate("""
'<<= $qkey>>', """/* key */"""
<<dtprinttitle>>
<<dtprintauthor>>
<<dtprinttags>>
<<= $dtquest.weeks>>, """/* weeks */"""
<<dtprintdeadlineweeks>>
{ """/* roles */"""
<<for _irole, _role range $dtquest.getUnitCriterias()>><<nobr>>
'<<= _irole>>':
<<set _slaverole = true>>
<<for _restriction range _role.criteria.getRestrictions()>>
<<if _restriction instanceof setup.qresImpl.Job && _restriction.job_key == setup.job.slaver.key>>
<<set _slaverole = false>>
<<break>>
<</if>>
<</for>>
<<if !_slaverole>>[<</if>>
<<if _role.criteria.key>>
setup.qu.<<= _role.criteria.key>>,
<<else>>
_criteria<<= _irole >>,
<</if>>
<<if !_slaverole>>
<<= _role.offsetmod>>],
<</if>>
<</nobr>>
<</for>>},
<<dtprintactors>>
<<dtprintcosts>>
'<<= $qpassagedesc>>',
<<dtprintdifficulty>>
[ """/* outcomes */"""
<<for _ioutcome, _outcomes range $dtquest.outcomes>><<nobr>>
[
<br/>
'<<= $qpassageoutcomes[setup.DevToolHelper.getPassageIndex($qoutcomedesc, _ioutcome)]>>',
<br/>
[
<<for _ixxx, _outcome range _outcomes[1]>>
<br/>
<<= _outcome.text()>>,
<</for>>
<br/>
],
<br/>
],
<</nobr>>
<</for>> ],
<<dtprintquestpool $qpool $qrarity>>
<<dtprintrestrictions 'quest_prerequisites'>>
<<dtprintexpirationoutcomes>>
)>>
"""::""" <<= $qpassagedesc >> [nobr]
<<= setup.escapeTwine($qdesc)>>
<<for _ipo, _po range $qpassageoutcomes>><<if !_ipo || $qoutcomedesc[_ipo].trim()>>
"""::""" <<= _po >> [nobr]
<<= setup.escapeTwine($qoutcomedesc[_ipo])>>
<</if>><</for>>
</code>
</div><<set $devtooltype = 'quest'>>
<<set $qcustomslaveorder = []>>
<<set $qcustomcriteria = []>>
<<set $qcustomunitgroup = []>>
<<set $qcustomtitle = []>>
<<set _qkey = '__devtool_quest'>>
<<set _dpassage = 'DummyPassageDesc'>>
<<set $qpool = null>>
<<set $qrarity = 1>>
<<set $qoutcomedesc = ['', '', '', '']>>
<<set $qdesc = ''>>
<<if _qkey in setup.questtemplate>>
<<run delete setup.questtemplate[_qkey]>>
<</if>>
<<if !_qbase>>
<<set $dtquest = new setup.QuestTemplate(
_qkey,
"", /* name */
"", /* author */
[], /* tag list */
1, /* weeks */
6, /* deadline weeks */
{}, /* roles */
{}, /* actors */
[], /* costs */
_dpassage, /* description passage */
setup.qdiff.easiest1, /* difficulty */
[ /* outcomes */
[`DummyPassage0`, []],
[`DummyPassage1`, []],
[`DummyPassage2`, []],
[`DummyPassage3`, []],
],
[ /* quest pools */
],
[], /* restriction */
[], /* expired outcomes */
)>>
<<else>>
<<set _criterias = _qbase.getUnitCriterias()>>
<<set _toinputroles = {}>>
<<for _actorname, _criteriaobj range _criterias>>
<<set _toinputroles[_actorname] = _criteriaobj.criteria>>
<</for>>
<<set $dtquest = new setup.QuestTemplate(
_qkey,
_qbase.getName(), /* name */
_qbase.getAuthor(), /* author */
_qbase.getTags(), /* tag list */
_qbase.getWeeks(), /* weeks */
_qbase.getDeadlineWeeks(), /* deadline weeks */
_toinputroles, /* roles */
_qbase.actor_unitgroup_key_map, /* actors */
_qbase.getCosts(), /* costs */
_dpassage, /* description passage */
_qbase.getDifficulty(), /* difficulty */
[ /* outcomes */
[`DummyPassage0`, _qbase.outcomes[0][1]],
[`DummyPassage1`, _qbase.outcomes[1][1]],
[`DummyPassage2`, _qbase.outcomes[2][1]],
[`DummyPassage3`, _qbase.outcomes[3][1]],
],
[ /* quest pools */
],
_qbase.getPrerequisites(), /* restriction */
_qbase.getExpiredOutcomes(), /* expired outcomes */
)>>
/* get the descriptions */
<<for _ioutcome, _outcome range _qbase.getOutcomes()>>
<<if _ioutcome && _outcome[0] == _qbase.getOutcomes()[_ioutcome-1][0]>>
<<else>>
<<set $qoutcomedesc[_ioutcome] = Story.get(_outcome[0]).text>>
<</if>>
<</for>>
<<set $qdesc = Story.get(_qbase.getDescriptionPassage()).text>>
<</if>>
/* Remove the auto-generated exps */
<<for _i range [0, 1, 2, 3]>>
<<set $dtquest.outcomes[_i][1] = $dtquest.outcomes[_i][1].filter(c => !c.IS_EXP_AUTO)>>
<</for>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtauthor "$dtquest.author" $dtquest.author>>
<<dtname "$dtquest.name" $dtquest.name>>
<<dtquestpool "$qpool" $qpool 'QGChooseQuestPool'>>
<<dtrarity "$qrarity" $qrarity>>
<<dtduration "$dtquest.weeks" $dtquest.weeks>>
<<dtexpires "$dtquest.deadline_weeks" $dtquest.deadline_weeks>>
<<dtdifficulty $dtquest 'QGChooseDifficulty'>>
<<dttags $dtquest>>
<div class='slavecard'>
<b>Roles</b> (max. 5)
<<message '(?)'>>
<div class='helpcard'>
The details about your units that go on this quest.
<br/>
<br/>
For balance reason, most quests are encouraged to have three slavers participating in it.
You can have less or more, but you must be careful with balancing the quest if you do.
</div>
<</message>>
<<if Object.keys($dtquest.unit_criteria_map).length < 5>>
<<link '(Add new role)'>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<goto 'QGAddRole'>>
<</link>>
<</if>>
<<for _irole, _role range $dtquest.unit_criteria_map>>
<br/>
<<= _irole>>: <<= _role.criteria.getName()>>
<<capture _irole, _role>>
<<message '(+)'>>
<<criteriacard _role.criteria>>
<</message>>
<<set _text = `(remove ${_irole})`>>
<<link _text>>
<<run delete $dtquest.unit_criteria_map[_irole]>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<goto 'QuestGen'>>
<</link>>
<</capture>>
<</for>>
</div>
<<dtactor $dtquest>>
<<dtcost '$dtquest.costs'>>
<<dtrestriction '$dtquest.quest_prerequisites'>>
<div class='companycard'>
<b>Outcomes</b>:
<<message '(?)'>>
<div class='helpcard'>
Outcomes of the quest.
<br/>
<br/>
See the help texts in their corresponding area for more information.
</div>
<</message>>
<<for _ioutcome, _outcome range $dtquest.outcomes>>
<div class='buildingcard'>
<<if _ioutcome == 0>>
<<successtext 'CRITICAL SUCCESS'>>
<<message '(?)'>>
<<dtrewardhelp>>
<</message>>
<<link '(Click here to compute your recommended total quest reward)'>>
<<replace '#critrewarddiv'>>
<<set _money = 2 * 500 * $dtquest.weeks * Object.keys($dtquest.getUnitCriterias()).length>>
Your quest should reward a total of <<money _money>> on <<successtext 'critical success'>>.
<</replace>>
<</link>>
<div id='critrewarddiv'>
Please compute your recommended <<successtext 'critical success'>> quest reward by clicking the link above.
</div>
<<elseif _ioutcome == 1>>
<<successtextlite 'SUCCESS'>>
<<message '(?)'>>
<<dtrewardhelp>>
<</message>>
<<link '(Click here to compute your recommended total quest reward)'>>
<<replace '#successrewarddiv'>>
<<set _money = 500 * $dtquest.weeks * Object.keys($dtquest.getUnitCriterias()).length>>
Your quest should reward a total of <<money _money>> on <<successtextlite 'success'>>.
<</replace>>
<</link>>
<div id='successrewarddiv'>
Please compute your recommended <<successtextlite 'success'>> quest reward by clicking the link above.
</div>
<<elseif _ioutcome == 2>>
<<dangertextlite 'FAILURE'>>
<<message '(?)'>>
<<dtfailurehelp>>
<</message>>
<<elseif _ioutcome == 3>>
<<dangertext 'DISASTER'>>
<<message '(?)'>>
<<dtfailurehelp>>
<</message>>
<</if>>
<<set _listpath = "$dtquest.outcomes[" + _ioutcome + "][1]">>
<<devlist _listpath '(Add new result)' 'QGAddCost' 'QuestGen'>>
</div>
<</for>>
</div>
<<dtexpireoutcome '$dtquest.expired_outcomes'>>
<hr/>
<<dtstoryhelp>>
<div class="overflow-story-container">
<hr/>
<p>
<h4>Quest description:</h4>
</p>
<p>
<<codeeditor '$qdesc' $qdesc>>
</p>
<hr/>
There are two ways to write your quest outcomes.
First, you can write each of the outcomes below.
Alternatively, you can only write several outcomes, and use the
same text for multiple results.
<<message '(Click for more information)'>>
<div class='helpcard'>
If you leave some of the fields blank, then it will use the first non-blank one
above it.
For example, if you leave both <<successtextlite 'SUCCESS'>> and <<dangertextlite 'FAILURE'>> blank,
but fill in <<dangertext 'DISASTER'>>, then
then both <<successtextlite 'SUCCESS'>> and
<<dangertextlite 'FAILURE'>> will use the <<successtext 'CRITICAL SUCCESS'>> text,
while <<dangertext 'DISASTER'>> will use its own.
To refer to the quest result, Click "Quest" then "If... outcomes" from the toolbar.
For example, it can look like this:
<div class='companycard'>
<code>
Your slavers venture into the abandoned temple.<br/>
"""<<if $gOutcome == 'crit'>>"""<br/>
They found a treasure!<br/>
"""<<elseif $gOutcome == 'success'>>"""<br/>
They found a bag of gold.<br/>
"""<<elseif $gOutcome == 'failure'>>"""<br/>
They fell into a hole.<br/>
"""<<elseif $gOutcome == 'disaster'>>"""<br/>
They fell into a spike trap.<br/>
"""<</if>>"""<br/>
They then went home.
"""
</code>
</div>
<hr/>
<p>
In <<successtextlite 'SUCCESS'>>,
the above would become: <br/>
Your slavers venture into the abandoned temple. They found a bag of gold. They then went home.
As an example quest, you can open in Content Creator the
"Bounty Hunt: Wolves" quest in the <<lore region_vale>>.
</p>
</div>
<</message>>
<<for _iqod, _qod range $qoutcomedesc>>
<hr/>
<p>
<<if _iqod == 0>>
<<successtext 'CRITICAL SUCCESS'>>
<<elseif _iqod == 1>>
<<successtextlite 'SUCCESS'>>
<<elseif _iqod == 2>>
<<dangertextlite 'FAILURE'>>
<<elseif _iqod == 3>>
<<dangertext 'DISASTER'>>
<</if>>
text:
</p>
<p>
<<set _receiver = `$qoutcomedesc[${_iqod}]`>>
<<codeeditor _receiver $qoutcomedesc[_iqod]>>
</p>
<</for>>
<hr/>
<p class="center">
<br/>
<<button 'CREATE QUEST!'>>
/* normalize role weights */
<<set _slavers = 0>>
<<for _iactor, _icriteria range $dtquest.getUnitCriterias()>>
<<if $dtquest.getActorResultJob(_iactor) == setup.job.slaver>>
<<set _slavers = _slavers + 1>>
<</if>>
<</for>>
<<if _slavers == 0>><<set _slavers = 1>><</if>>
<<for _iactor, _icriteria range $dtquest.getUnitCriterias()>>
<<set $dtquest.unit_criteria_map[_iactor].offsetmod = 3.0 / _slavers>>
<</for>>
/* create passage names etc */
<<set $qkey = setup.getKeyFromName($dtquest.name, setup.questtemplate)>>
<<set $qfilename = `${$qkey}.twee`>>
<<set $qpassagesetup = `QuestSetup_${$qkey}`>>
<<set $qpassagedesc = `Quest_${$qkey}`>>
<<set $qpassageoutcomes = [
`Quest_${$qkey}Crit`,
`Quest_${$qkey}Success`,
`Quest_${$qkey}Failure`,
`Quest_${$qkey}Disaster`,
]>>
<<goto 'QGCreate'>>
<</button>>
</p>
</div><p>Choose where quest can appear</p>
<<dtquestpoolchoose 'QGChooseQuestPoolDo'>><<set $qpool = _questpoolchosen>>
<<gotowipehistory 'QuestGen'>><<devchoosedifficulty 'QGChooseDifficultyDo'>><<set $dtquest.difficulty = _diffchosen>>
<<gotowipehistory 'QuestGen'>><p>Must have built the following improvement:</p>
<<for _ibt, _bt range setup.buildingtemplate>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Building(_bt)>>
<</link>>
<</capture>>
<br/>
<</for>><p>Must <<dangertext 'NOT'>> have the following contact:</p>
<<for _ibt, _bt range setup.contacttemplate>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoContact(_bt)>>
<</link>>
<</capture>>
<br/>
<</for>><p>Must have the following contact:</p>
<<for _ibt, _bt range setup.contacttemplate>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasContact(_bt)>>
<</link>>
<</capture>>
<br/>
<</for>>This event must NOT already been scheduled: <br/>
<<for _ievent, _event range setup.event>>
<<capture _event>>
<<link _event.getName() 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoEvent(_event)>>
<</link>>
<br/>
<</capture>>
<</for>>At <<dangertext 'LEAST'>> <<numberbox '_favor' 300>> favor with:
<<message '(?)'>>
Insert this as 10 times the amount displayed in game.
For example, to add 20.5 favor, put 205.
Maximum favor is <<= setup.FAVOR_MAX >>.
5.0 favor is worth <<money 1000>>.
<</message>>
<<for _icompany, _company range $company>>
<<capture _company>>
<<if _company != $company.player>>
<br/>
<<rep _company>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.FavorAtLeast(_company, _favor)>>
<</link>>
<</if>>
<</capture>>
<</for>>At <<dangertext 'LEAST'>> <<numberbox '_ire' 20>> ire with:
<<message '(?)'>>
1 ire is worth <<money 500>>. When ire reaches 20,
something bad will happen to the company.
<</message>>
<<for _icompany, _company range $company>>
<<capture _company>>
<<if _company != $company.player>>
<br/>
<<rep _company>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.IreAtLeast(_company, _ire)>>
<</link>>
<</if>>
<</capture>>
<</for>>Must have the following item: <br/>
<<for _ibt, _bt range setup.item>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasItem(_bt)>>
<</link>>
<</capture>>
<br/>
<</for>>Must <<dangertext 'NOT'>> have the following item: <br/>
<<for _ibt, _bt range setup.item>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoItem(_bt)>>
<</link>>
<</capture>>
<br/>
<</for>>Slave must be in a bedchamber containing the following furniture: <br/>
<<for _ibt, _bt range setup.item>>
<<if _bt.getItemClass() == setup.itemclass.furniture>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.SlaveBedchamberHasFurniture(_bt)>>
<</link>>
<</capture>>
<br/>
<</if>>
<</for>><<set $qrestriction = setup.qres.UnitGroupHasUnit(setup.unitgroup.missingslavers)>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.UnitGroupHasUnit(setup.unitgroup.missingslaves)>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.UnitGroupHasUnit(setup.unitgroup.escapedslaves)>>
<<include 'QGRestrictionDone'>>At least <<numberbox '_money' 100>> money.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Money(_money)>>
<</link>>This restriction is NEVER satisfied. Shows up as: <<textbox '_thistext' 'You died.'>>
Useful for flavor texts.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Never(_thistext)>>
<</link>>At least <<numberbox '_prestige' 10>> prestige.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Prestige(_prestige)>>
<</link>>Must NOT currently doing or having the following quest: <br/>
<<devchoosequest 'RestrictionNoQuestDo'>><<set $qrestriction = setup.qres.NoQuest(_questchosen)>>
<<gotowipehistory 'QGRestrictionDone'>><<set $qrestriction = setup.qres.QuestUnique()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.OpportunityUnique()>>
<<include 'QGRestrictionDone'>>Quest/Opportunity can only be generated at most once per <<numberbox '_cooldown' 8>> weeks.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Cooldown(_cooldown)>>
<</link>>Do NOT currently have the following opportunity: <br/>
<<devchooseopportunity 'RestrictionNoOpportunityDo'>><<set $qrestriction = setup.qres.NoOpportunity(_opportunitychosen)>>
<<gotowipehistory 'QGRestrictionDone'>>Must have successfully completed this quest: <br/>
<<devchoosequest 'RestrictionQuestDoneDo'>><<set $qrestriction = setup.qres.QuestDone(_questchosen)>>
<<gotowipehistory 'QGRestrictionDone'>><p>
<<devactordefault>> must satisfy:
</p>
<<link '(Continue)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Actor($qgDefaultActorName, $qrestriction ? $qrestriction.restriction : setup.qres.Never('Never'))>>
<</link>><b><i><<= _entry.actor_name >></i> must satisfy:</b>
<<capture _passage, _ientry, _entry, _listpath>>
<<link '(change actor)' 'RestrictionActor'>>
<<set $qPassageName = _passage>>
<<set $qJsPath = _listpath>>
<<set $qListIndex = _ientry>>
<<set $qrestriction = _entry>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</capture>><<set $qrestriction = setup.qres.ExistUnit([])>>
<<gotowipehistory 'QGRestrictionDone'>>Must exist some unit that satisfies all of these:<<set $qrestriction = setup.qres.NotExistUnit([])>>
<<gotowipehistory 'QGRestrictionDone'>>Must <<dangertext 'NOT'>> exist some unit that satisfies all of these:<p>
<<devactor '_actorname1'>> must be best friends with
<<devactor '_actorname2'>>.
</p>
<<link '(Continue)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.BestFriends(_actorname1, _actorname2)>>
<</link>><p>
<<devactor '_actorname1'>> must be lovers with
<<devactor '_actorname2'>>.
</p>
<<link '(Continue)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Lovers(_actorname1, _actorname2)>>
<</link>><<set $qrestriction = setup.qres.Not(setup.qres.Never('Never'))>>
<<gotowipehistory 'QGRestrictionDone'>><<gotowipehistory 'RestrictionNot'>><b>Must be false:</b><<set $qrestriction = setup.qres.Or([])>>
<<gotowipehistory 'QGRestrictionDone'>><<gotowipehistory 'RestrictionOr'>><<dangertextlite 'At least one'>> of the following must be true:<<set $qrestriction = setup.qres.And([])>>
<<gotowipehistory 'QGRestrictionDone'>><<gotowipehistory 'RestrictionAnd'>><<dangertextlite 'ALL'>> of the following must be true:<<set $qrestriction = setup.qres.Player(setup.qres.Never('Never'))>>
<<gotowipehistory 'QGRestrictionDone'>><b>Player character must satisfy:</b><<set $qrestriction = setup.qres.Owner(setup.qres.Never('Never'))>>
<<gotowipehistory 'QGRestrictionDone'>><b>Slave's owner must satisfy:</b><<set $qrestriction = setup.qres.BedchamberOtherSlave(setup.qres.Never('Never'))>>
<<gotowipehistory 'QGRestrictionDone'>><b>The other slave in bedchamber must satisfy:</b><<set $qrestriction = setup.qres.BestFriend(setup.qres.Never('Never'))>>
<<gotowipehistory 'QGRestrictionDone'>><b>Unit's best friend or lover must satisfy:</b><<set $qrestriction = setup.qres.HasSlave()>>
<<include 'QGRestrictionDone'>>Has at least one slave with all the following traits:
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasSlaveWithTraits(_chosentraits)>>
<</link>>
<<include 'ChooseTraits'>>None of your slaves has <<dangertext 'ALL'>> the following traits (i.e., it
is ok if they only have one or two, but not ALL of the traits):
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoSlaveWithTraits(_chosentraits)>>
<</link>>
<<include 'ChooseTraits'>>Has at least one slaver with all the following traits:
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasSlaverWithTraits(_chosentraits)>>
<</link>>
<<include 'ChooseTraits'>>None of your slavers has <<dangertext 'ALL'>> the following traits (i.e., it
is ok if they only have one or two, but not ALL of the traits):
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoSlaverWithTraits(_chosentraits)>>
<</link>>
<<include 'ChooseTraits'>><<set $qrestriction = setup.qres.SlaveHasBedchamber()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.SlaveNoBedchamber()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.SlaveBedchamberFullUsableByYou()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.SlaveOwnedByYou()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.Bodyshifter()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.NotBusy()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.SlaveUsableByYou()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.Home()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.Available()>>
<<include 'QGRestrictionDone'>><p>Must have a unit on the following duty, and the unit must be <<successtext 'available'>>:</p>
<<for _duty range setup.dutytemplate>>
<<= _duty.prototype.getName()>>
<<capture _duty>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasUnitOnDuty(_duty)>>
<</link>>
<</capture>>
<br/>
<</for>>Unit's friendship with you is at most <<numberbox '_level' -500>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.FriendshipWithYouAtMost(_level)>>
<</link>><<set _default = setup.LEVEL_PLATEAU>>
Unit's friendship with you is at least <<numberbox '_level' 500>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.FriendshipWithYouAtLeast(_level)>>
<</link>><<set _default = setup.LEVEL_PLATEAU>>
Unit must have a best friend / lover, and their friendship is at least
<<numberbox '_level' 500>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.BestFriendFriendshipAtLeast(_level)>>
<</link>><<set _default = setup.LEVEL_PLATEAU>>
Unit must have a best friend / lover, and their friendship is at most
<<numberbox '_level' -500>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.BestFriendFriendshipAtMost(_level)>>
<</link>><<set $qrestriction = setup.qres.BestFriendExist()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.LoverExist()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.YourBestFriend()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.YourLover()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.RememberUnit()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.BestFriendWithRememberedUnit()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.CanBeLoverWithBestFriend()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.CanBeLoverWithYou()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.IsInjured()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.NotInjured()>>
<<include 'QGRestrictionDone'>>Unit must have the following job: <br/>
<<for _ibt, _bt range setup.job>>
<<rep _bt>>
<<capture _bt>>
<<link '(select this)' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.Job(_bt)>>
<</link>>
<</capture>>
<br/>
<</for>><<set $qrestriction = setup.qres.Job(setup.job.slaver)>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.Job(setup.job.slave)>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.HasFamilyWithJob(setup.job.slaver)>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.HasFamilyWithJob(setup.job.slave)>>
<<include 'QGRestrictionDone'>>Unit has been with your company for at most <<numberbox '_weeks' 27>> weeks.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.WeeksWithCompanyAtMost(_weeks)>>
<</link>>Unit has been with your company for at least <<numberbox '_weeks' 53>> weeks.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.WeeksWithCompanyAtLeast(_weeks)>>
<</link>><<set _default = setup.LEVEL_PLATEAU - 1>>
Unit's level is at most <<numberbox '_level' _default>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.LevelAtMost(_level)>>
<</link>><<set _default = setup.LEVEL_PLATEAU>>
Unit's level is at least <<numberbox '_level' _default>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.LevelAtLeast(_level)>>
<</link>>Unit's slave value is at most <<numberbox '_slavevalue' 1500 >>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.SlaveValueAtMost(_slavevalue)>>
<</link>>Unit's slave value is at least <<numberbox '_slavevalue' 1500 >>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.SlaveValueAtLeast(_slavevalue)>>
<</link>>Unit has the following tag/flag: <<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasTag(_tag)>>
<</link>>Unit does <<dangertext 'NOT'>> have the following tag/flag: <<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoTag(_tag)>>
<</link>>Does not exists a unit <<dangertext 'ANYWHERE'>>
<<message '(?)'>>
This includes slavers that you have lost, but are still rescue-able.
<</message>>
that have the following tag/flag: <<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoUnitWithTag(_tag)>>
<</link>>At least one of your <<rep setup.job.slaver>> slavers has the tag / flag:
<<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasUnitWithTagAndJob(_tag, setup.job.slaver)>>
<</link>>At least one of your <<rep setup.job.slave>> slaves has the tag / flag:
<<textbox '_tag' ''>>.
<<include 'CostTagHelp'>>
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.HasUnitWithTagAndJob(_tag, setup.job.slave)>>
<</link>>Unit has the following title:
<<devtoolchoosetitle 'RestrictionHasTitleDo'>><<set $qrestriction = setup.qres.HasTitle(_chosentitle)>>
<<gotowipehistory 'QGRestrictionDone'>>Unit does <<dangertext 'not'>> have the following title:
<<devtoolchoosetitle 'RestrictionNoTitleDo'>><<set $qrestriction = setup.qres.NoTitle(_chosentitle)>>
<<gotowipehistory 'QGRestrictionDone'>>Has a slaver with the following title:
<<devtoolchoosetitle 'RestrictionHasSlaverWithTitleDo'>><<set $qrestriction = setup.qres.HasUnitWithTitle(_chosentitle, {job_key: 'slaver'})>>
<<gotowipehistory 'QGRestrictionDone'>>Has a slave with the following title:
<<devtoolchoosetitle 'RestrictionHasSlaveWithTitleDo'>><<set $qrestriction = setup.qres.HasUnitWithTitle(_chosentitle, {job_key: 'slave'})>>
<<gotowipehistory 'QGRestrictionDone'>>No a slaver with the following title:
<<devtoolchoosetitle 'RestrictionNoSlaverWithTitleDo'>><<set $qrestriction = setup.qres.NoUnitWithTitle(_chosentitle, {job_key: 'slaver'})>>
<<gotowipehistory 'QGRestrictionDone'>>Does not exist a slave with the following title:
<<devtoolchoosetitle 'RestrictionNoSlaveWithTitleDo'>><<set $qrestriction = setup.qres.NoUnitWithTitle(_chosentitle, {job_key: 'slave'})>>
<<gotowipehistory 'QGRestrictionDone'>>Does not exist any unit with the following title:
<<devtoolchoosetitle 'RestrictionNoUnitWithTitleDo'>><<set $qrestriction = setup.qres.NoUnitWithTitle(_chosentitle)>>
<<gotowipehistory 'QGRestrictionDone'>>Exists any unit with the following title:
<<devtoolchoosetitle 'RestrictionHasUnitWithTitleDo'>><<set $qrestriction = setup.qres.HasUnitWithTitle(_chosentitle)>>
<<gotowipehistory 'QGRestrictionDone'>><div class='filtercard'>
Display:
<<if $gTraitDisplay>>
<<link 'Compact'>>
<<set $gTraitDisplay = null>>
<<refreshtraits>>
<</link>>
<<else>>
Compact
<</if>>
|
<<if $gTraitDisplay == 'long'>>
Long
<<else>>
<<link 'Long'>>
<<set $gTraitDisplay = 'long'>>
<<refreshtraits>>
<</link>>
<</if>>
|
<<if $gTraitDisplay == 'longlist'>>
Long List
<<else>>
<<link 'Long List'>>
<<set $gTraitDisplay = 'longlist'>>
<<refreshtraits>>
<</link>>
<</if>>
|
<<if $gTraitDisplay == 'full'>>
Full
<<else>>
<<link 'Full'>>
<<set $gTraitDisplay = 'full'>>
<<refreshtraits>>
<</link>>
<</if>>
<br/>
Filter:
<<if !$gTraitFilterTag>>
All
<<else>>
<<link 'All'>>
<<set $gTraitFilterTag = null>>
<<refreshtraits>>
<</link>>
<</if>>
<<for _itagkey, _tagkey range setup.TraitHelper.TRAIT_MAIN_TAGS>>
<<capture _tagkey>>
|
<<if $gTraitFilterTag == _tagkey>>
<<= _tagkey>>
<<else>>
<<link _tagkey>>
<<set $gTraitFilterTag = _tagkey>>
<<refreshtraits>>
<</link>>
<</if>>
<</capture>>
<</for>>
</div><<focwidget 'selecttrait'>>
<<focwidget 'loadtraits'>>
<<include 'LoadTraitFilter'>>
<<for _itrait, _trait range _traitpool >>
<<if !$gTraitFilterTag || _trait.getTags().includes($gTraitFilterTag)>>
<<capture _trait>>
<<rep _trait>>
<<link '(+)'>>
<<set $rTrait = _trait>>
<<include _targetpassage>>
<</link>>
<<if $gTraitDisplay == 'full' || $gTraitDisplay == 'long' || $gTraitDisplay == 'longlist'>>
<<nameof _trait>>
<</if>>
<<if $gTraitDisplay == 'full'>>:<<= _trait.getDescriptionDisplay() >> <br/>
<<elseif $gTraitDisplay == 'longlist'>><br/>
<<else>>
|
<</if>>
<</capture>>
<</if>>
<</for>>
<</focwidget>>
<<focwidget 'refreshtraits'>>
<<replace '#traitdiv'>>
<<loadtraits>>
<</replace>>
<</focwidget>>
<<set _targetpassage = $args[0]>>
<<set _traitpool = $args[1]>>
<<if !_traitpool>> <<set _traitpool = setup.trait>> <</if>>
<div id='traitdiv'>
<<loadtraits>>
</div>
<</focwidget>>
<<focwidget 'selecttraitsload'>>
<div class='contactcard'>
<<for _itrait, _trait range _rTraits >>
<<capture _itrait>>
<<rep _trait>>
<<link '(-)'>>
<<run _rTraits.splice(_itrait, 1)>>
<<selecttraitrefreshcat>>
<</link>>
|
<</capture>>
<</for>>
<br/>
Add trait:
<<include 'LoadTraitFilter'>>
<<for _itrait, _trait range _traitpool>>
<<if !$gTraitFilterTag || _trait.getTags().includes($gTraitFilterTag)>>
<<capture _trait>>
<<if !_rTraits.includes(_trait)>>
<<rep _trait>>
<<link '(+)'>>
<<run _rTraits.push(_trait)>>
<<selecttraitrefreshcat>>
<</link>>
<<else>>
<<negtraitcard _trait>>
(+)
<</if>>
<<if $gTraitDisplay == 'full' || $gTraitDisplay == 'long' || $gTraitDisplay == 'longlist'>>
<<nameof _trait>>
<</if>>
<<if $gTraitDisplay == 'full'>>:<<= _trait.getDescriptionDisplay() >> <br/>
<<elseif $gTraitDisplay == 'longlist'>><br/>
<<else>>
|
<</if>>
<</capture>>
<</if>>
<</for>>
</div>
<</focwidget>>
<<focwidget 'selecttraitrefreshcat'>>
<<replace '#selecttraitsdiv'>>
<<selecttraitsload>>
<</replace>>
<</focwidget>>
<<focwidget 'selecttraits'>>
<<focwidget 'refreshtraits'>>
<<selecttraitrefreshcat>>
<</focwidget>>
<<set _traitpool = $args[0]>>
<<set _rTraits = []>>
<div id='selecttraitsdiv'>
<<selecttraitsload>>
</div>
<</focwidget>><<set _chosentraits = []>>
<<focwidget 'refreshtraits'>>
<<refresharraycat>>
<</focwidget>>
<<focwidget 'loadarraycat'>>
<div class='dutycard'>
Chosen traits:
<<for _itrait, _trait range _chosentraits >>
<<capture _itrait>>
<<rep _trait>>
<<link '(-)'>>
<<run _chosentraits.splice(_itrait, 1)>>
<<refresharraycat>>
<</link>>
|
<</capture>>
<</for>>
<br/>
Add new trait:
<<include 'LoadTraitFilter'>>
<<for _itrait, _trait range setup.trait>>
<<if !$gTraitFilterTag || _trait.getTags().includes($gTraitFilterTag)>>
<<capture _trait>>
<<if !_chosentraits.includes(_trait)>>
<<rep _trait>>
<<link '(+)'>>
<<run _chosentraits.push(_trait)>>
<<refresharraycat>>
<</link>>
<<else>>
<<negtraitcard _trait>>
(+)
<</if>>
<<if $gTraitDisplay == 'full' || $gTraitDisplay == 'long' || $gTraitDisplay == 'longlist'>>
<<nameof _trait>>
<</if>>
<<if $gTraitDisplay == 'full'>>:<<= _trait.getDescriptionDisplay() >> <br/>
<<elseif $gTraitDisplay == 'longlist'>><br/>
<<else>>
|
<</if>>
<</capture>>
<</if>>
<</for>>
</div>
<</focwidget>>
<div class='chosencatdiv'>
<<loadarraycat>>
</div>
<<focwidget 'refresharraycat'>>
<<replace '.chosencatdiv'>>
<<loadarraycat>>
<</replace>>
<</focwidget>><<include LoadSelectTrait>>
<p>Unit must have the following trait:
<<message '(?)'>>
Note that a stronger trait will "dominate" the lower trait. Hence, if a unit has
a large dick, it will count as having a tiny dick as well.
(You can see it by the "number" on the top right of the icon.)
<</message>>
</p>
<<selecttrait 'RestrictionTraitDo'>><<set $qrestriction = setup.qres.Trait($rTrait)>>
<<gotowipehistory 'QGRestrictionDone'>><<include LoadSelectTrait>>
<p>Unit must <<dangertext 'NOT'>> have the following trait:
<<message '(?)'>>
Note that a stronger trait will "dominate" the lower trait. Hence, if a unit has
a large dick, it will count as having a tiny dick as well.
<</message>></p>
<<selecttrait 'RestrictionNoTraitDo'>><<set $qrestriction = setup.qres.NoTrait($rTrait)>>
<<gotowipehistory 'QGRestrictionDone'>><p>Unit must have <<dangertext 'at least one'>> of the following traits:
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.AnyTrait(_chosentraits)>>
<</link>>
</p>
<<include 'ChooseTraits'>><<include LoadSelectTrait>>
<p>Unit must have the following trait EXACTLY:
<<message '(?)'>>
This is exact trait --- e.g., if you choose muscle_strong,
then muscle_verystrong is not counted.
<</message>>
</p>
<<selecttrait 'RestrictionTraitExactDo'>><<set $qrestriction = setup.qres.TraitExact($rTrait)>>
<<gotowipehistory 'QGRestrictionDone'>><p>Unit must have <<dangertext 'NONE'>> of the following traits (exact):
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.NoTraits(_chosentraits, true)>>
<</link>>
</p>
<<include 'ChooseTraits'>><p>Unit must have <<successtext 'ALL'>> of the following traits:
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.AllTraits(_chosentraits, false)>>
<</link>>
</p>
<<include 'ChooseTraits'>><<include LoadSelectTrait>>
<p>Unit must have the following trait as an INNATE trait:
<<message '(?)'>>
Innate trait is the traits that the unit should have when fully purified.
<</message>>
</p>
<<selecttrait 'RestrictionInnateTraitDo' setup.TraitHelper.getAllTraitsOfTags(['skin'])>><<set $qrestriction = setup.qres.InnateTrait($rTrait)>>
<<gotowipehistory 'QGRestrictionDone'>><<set $qrestriction = setup.qres.NotYou()>>
<<include 'QGRestrictionDone'>><<set $qrestriction = setup.qres.You()>>
<<include 'QGRestrictionDone'>>Variable <<textbox '_key' ''>> must equals <<textbox '_value' ''>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.VarEqual(_key, _value)>>
<</link>>Variable <<textbox '_key' ''>> must >= <<numberbox '_value' ''>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.VarGte(_key, _value)>>
<</link>>Variable <<textbox '_key' ''>> must <= <<numberbox '_value' ''>>.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.VarLte(_key, _value)>>
<</link>>Variable <<textbox '_key' ''>> must be unset.
<br/>
<<link 'Done' 'QGRestrictionDone'>>
<<set $qrestriction = setup.qres.VarNull(_key)>>
<</link>>Choose restriction type:
<<back 'Back'>>
<hr/>
<div><b>Company</b></div>
<div>
[[Improvement|RestrictionBuilding]]
</div>
<div>
[[Money|RestrictionMoney]]
</div>
<div>
[[Prestige|RestrictionPrestige]]
</div>
<div>
<<message 'Favor / Ire...'>>
<div class='marketobjectcard'>
<div>
[[Favor at LEAST this much |RestrictionFavorAtLeast]]
</div>
<div>
[[Ire at LEAST this much |RestrictionIreAtLeast]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Item...'>>
<div class='marketobjectcard'>
<div>
[[Must have item|RestrictionHasItem]]
</div>
<div>
[[Must NOT have item|RestrictionNoItem]]
</div>
</div>
<</message>>
</div>
<hr/>
<div><b>Quest / Opportunity / Event</b></div>
<<if $devtooltype == 'quest'>>
<div>
[[Unique|RestrictionQuestUnique]]
<<message '(?)'>>
Only one instance of this quest can exists at any given time.
You can get more of this quest once the quest expires / complete.
<</message>>
</div>
<<elseif $devtooltype == 'opportunity'>>
<div>
[[Unique|RestrictionOpportunityUnique]]
<<message '(?)'>>
Only one instance of this opportunity can exists at any given time.
You can get more of this opportunity once the opportunity expires / complete.
Usually used in combination with the
"(Certain quest does not exist)".
<</message>>
</div>
<</if>>
<div>
<<message 'Quest / Opportunity / Event...'>>
<div class='marketobjectcard'>
<<if $devtooltype == 'quest' || $devtooltype == 'opportunity'>>
<div>
[[Cooldown|RestrictionCooldown]]
<<message '(?)'>>
This $devtooltype can only be created at most once per
this many weeks.
<</message>>
</div>
<</if>>
<div>
[[Quest cannot exist|RestrictionNoQuest]]
<<message '(?)'>>
Must not have or already doing the chosen quest.
Most commonly used in conjunction with (Unique) ---
e.g., to ensure that none of the three variations of
the flesh shaping temple quest can exist simultaneously.
<</message>>
</div>
<div>
[[Must have ever completed quest|RestrictionQuestDone]]
</div>
<div>
[[Opportunity cannot exist|RestrictionNoOpportunity]]
<<message '(?)'>>
Must not currently have this opportunity.
Can be used with quests that rewards opportunities, to ensure the player
has to answer the opportunity first before proceeding.
<</message>>
</div>
<div>
[[Event cannot already been scheduled|RestrictionNoEvent]]
<<message '(?)'>>
Must not have this event scheduled to occur in the future.
<</message>>
</div>
</div>
<</message>>
</div>
<hr/>
<div><b>Unit</b></div>
<div>
<<message 'Slaver...'>>
<div class='marketobjectcard'>
<div><b>Trait</b></div>
<div>
[[Exist slaver with ALL these traits|RestrictionHasSlaverWithTraits]]
</div>
<div>
[[NOT exist slaver with ALL these traits|RestrictionNoSlaverWithTraits]]
</div>
<hr/>
<div><b>Title</b></div>
<div>
[[Exist slaver with title|RestrictionHasSlaverWithTitle]]
</div>
<div>
[[NOT exist slaver with title|RestrictionNoSlaverWithTitle]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Slave...'>>
<div class='marketobjectcard'>
<div>
[[Have any slave|RestrictionHasSlave]]
</div>
<hr/>
<div><b>Trait</b></div>
<div>
[[Exist slave with ALL these traits|RestrictionHasSlaveWithTraits]]
</div>
<div>
[[NOT exist slave with ALL these traits|RestrictionNoSlaveWithTraits]]
</div>
<hr/>
<div><b>Title</b></div>
<div>
[[Exist slave with title|RestrictionHasSlaveWithTitle]]
</div>
<div>
[[NOT exist slave with title|RestrictionNoSlaveWithTitle]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Unit...'>>
<div class='marketobjectcard'>
<div>
[[Exist unit that satisfies...|RestrictionExistUnit]]
</div>
<div>
[[NOT exist unit that satisfies...|RestrictionNotExistUnit]]
</div>
<div>
[[Has unit on this duty|RestrictionHasUnitOnDuty]]
</div>
<div>
<<message 'Tag...'>>
<div class='slavercard'>
<div>
[[Exist slave with tag|RestrictionHasSlaveWithTag]]
</div>
<div>
[[Exist slaver with tag|RestrictionHasSlaverWithTag]]
</div>
<div>
[[No unit with tag|RestrictionNoUnitWithTag]]
<<message '(?)'>>
This means that there cannot exist a unit ANYWHERE that have this tag.
This includes slavers that are lost, but rescue-able, as well as similar-fated slaves.
<</message>>
</div>
</div>
<</message>>
<<include 'CostTagHelp'>>
</div>
<div>
[[Exist unit with title|RestrictionHasUnitWithTitle]]
</div>
<div>
[[NOT exist unit with title|RestrictionNoUnitWithTitle]]
</div>
<div>
<<message 'Multiple units...'>>
<div class='slavercard'>
<div>
[[Two units must be best friends|RestrictionBestFriends]]
</div>
<div>
[[Two units must be lovers|RestrictionLovers]]
</div>
</div>
<</message>>
</div>
</div>
<</message>>
</div>
<div>
<<message 'A certain unit satisfies...'>>
<div class='marketobjectcard'>
<div>
<<link 'You satisfies this'>>
<<include 'RestrictionPlayer'>>
<</link>>
</div>
<<if $qgDefaultActorName || $dtquest.getAllActorNames().length>>
<div>
[[Actor satisfies this|RestrictionActor]]
</div>
<</if>>
</div>
<</message>>
</div>
<hr/>
<div><b>Advanced</b></div>
<div>
<<message 'Recursive...'>>
<div class='marketobjectcard'>
<div>
[[OR: At least one of these must be true|RestrictionOr]]
</div>
<div>
[[AND: ALL of these must be true|RestrictionAnd]]
</div>
<div>
[[NOT: This requirement must be false|RestrictionNot]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Others..'>>
<div class='marketobjectcard'>
<div>
<<message 'Contact...'>>
<div class='slavercard'>
<div>
[[Contact exists|RestrictionHasContact]]
</div>
<div>
[[Contact does NOT exist|RestrictionNoContact]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Exist missing unit...'>>
<div class='slavercard'>
<div>
[[Exist rescue-able missing slaver|RestrictionHasMissingSlaver]]
</div>
<div>
[[Exist rescue-able missing slave|RestrictionHasMissingSlave]]
</div>
<div>
[[Exist escaped slave|RestrictionHasEscapedSlave]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Variable...'>>
<div class='slavercard'>
<div>
[[Variable equals|RestrictionVarEqual]]
</div>
<div>
[[Variable greater than or equal|RestrictionVarGte]]
</div>
<div>
[[Variable less than or equal|RestrictionVarLte]]
</div>
<div>
[[Variable is unset|RestrictionVarNull]]
</div>
</div>
<</message>>
</div>
<div>
[[Never|RestrictionNever]]
</div>
</div>
<</message>>
</div>
<br/>
<br/>
<<devtoolreturnbutton>><div>
Choose restriction type:
</div>
<hr/>
<div><b>Status</b></div>
<div>
[[Is a slaver|RestrictionJobSlaver]]
</div>
<div>
[[Is a slave|RestrictionJobSlave]]
</div>
<div>
<<message 'Busy / Injury...'>>
<div class='marketobjectcard'>
<div><b>Status</b></div>
<div>
[[Is available|RestrictionAvailable]]
<<message '(?)'>>
This means the unit can go on a quest. Note that this includes
units on duty.
<</message>>
</div>
<div>
[[Is available and not on duty|RestrictionNotBusy]]
</div>
<div>
[[Is at home|RestrictionHome]]
<<message '(?)'>>
This is the same with unit being available, but also includes injured units and units on duty.
<</message>>
</div>
<div>
[[Is a slave usable by you|RestrictionSlaveUsableByYou]]
<<message '(?)'>>
Whether you can interact with this particular slave. You cannot interact with injured slaves
and slaves that have been set as a private slave for other slavers.
<</message>>
</div>
<hr/>
<div><b>Status</b></div>
<div>
[[Is injured|RestrictionIsInjured]]
</div>
<div>
[[Is NOT injured|RestrictionNotInjured]]
</div>
<br/>
</div>
<</message>>
<br/>
<hr/>
<div><b>Traits and characteristic</b></div>
<div>
<<message "Trait...">>
<div class='marketobjectcard'>
<div><b>One trait</b></div>
<div>
[[Has this trait|RestrictionTrait]]
<<message '(?)'>>
This is the standard checking where stronger trait will count for weaker trait.
E.g., if a <<rep setup.trait.muscle_verystrong>> unit counts for <<rep setup.trait.muscle_strong>>.
If you want exact checking, use "Has this EXACT trait".
<</message>>
</div>
<div>
[['NOT have this trait'|RestrictionNoTrait]]
<<message '(?)'>>
Behave similarly with the above, i.e.,
a <<rep setup.trait.muscle_verystrong>> unit counts for <<rep setup.trait.muscle_strong>>.
If you want exact checking, use "(NOT have any of these traits (exact))" below.
<</message>>
</div>
<div>
[[Unit must have this EXACT trait|RestrictionTraitExact]]
<<message '(?)'>>
This check will require the unit to have this EXACT trait --- i.e.,
a <<rep setup.trait.muscle_verystrong>> will NOT count for <<rep setup.trait.muscle_strong>>.
If you want inexact check, use "Has this trait".
<</message>>
</div>
<div>
[[Unit must INNATELY have this trait|RestrictionInnateTrait]]
<<message '(?)'>>
Innate trait are traits that the unit will have when fully purified.
Generally, this is the skin traits they started with, e.g.,
<<rep setup.trait.body_dragonkin>> for most dragonkins.
<</message>>
</div>
<hr/>
<div><b>Multiple traits</b></div>
<div>
[[Has AT LEAST ONE of these traits|RestrictionAnyTrait]]
</div>
<div>
[['Has ALL these traits'|RestrictionAllTraits]]
</div>
<div>
[['NOT have any of these traits (exact)'|RestrictionNoTraitsExact]]
</div>
</div>
<</message>>
</div>
<div>
<<message "Level...">>
<div class='marketobjectcard'>
<div>
[[Level at LEAST|RestrictionLevelAtLeast]]
</div>
<div>
[[Level at MOST|RestrictionLevelAtMost]]
</div>
</div>
<</message>>
</div>
<div>
<<message "Slave value...">>
<div class='marketobjectcard'>
<div>
[[Slave value at least|RestrictionSlaveValueAtLeast]]
</div>
<div>
[[Slave value at most|RestrictionSlaveValueAtMost]]
</div>
</div>
<</message>>
</div>
<hr/>
<div><b>Title, Identity, and Family</b></div>
<div>
<<message "Title...">>
<div class='marketobjectcard'>
<div>
[[Has title|RestrictionHasTitle]]
</div>
<div>
[[NOT have title|RestrictionNoTitle]]
</div>
</div>
<</message>>
</div>
<div>
<<message "You...">>
<div class='marketobjectcard'>
<div><b>Identity</b></div>
<div>
[[Is not you|RestrictionNotYou]]
</div>
<div>
[[Is you|RestrictionYou]]
</div>
<hr/>
<div><b>Friendship / Lover</b></div>
<div>
[[Is your best friend / lover|RestrictionYourBestFriend]]
</div>
<div>
[[Is your lover|RestrictionYourLover]]
</div>
<div>
[[Can become your lover|RestrictionCanBeLoverWithYou]]
</div>
<div>
[[Friendship with you at least|RestrictionFriendshipWithYouAtLeast]]
</div>
<div>
[[Friendship with you at most|RestrictionFriendshipWithYouAtMost]]
</div>
</div>
<</message>>
</div>
<div>
<<message "Friendship / Lover...">>
<div class='marketobjectcard'>
<div><b>Existance</b></div>
<div>
[[Must have best friend / lover|RestrictionBestFriendExist]]
</div>
<div>
[[Must have lover|RestrictionLoverExist]]
</div>
<hr/>
<div><b>Value</b></div>
<div>
[[Friendship with best friend at least|RestrictionBestFriendFriendshipAtLeast]]
</div>
<div>
[[Friendship with best friend at most|RestrictionBestFriendFriendshipAtMost]]
</div>
<div>
[[Can make best friend into lover|RestrictionCanBeLoverWithBestFriend]]
<<message '(?)'>>
<div class='helpcard'>
A unit can turn its best friend into lover when the following is satisfied:
<ol>
<li>
Both units does not already have lovers.
</li>
<li>
Their friendship is at least <<= setup.LOVERS_HOOKUP_FRIENDSHIP >>.
</li>
<li>
Satisfies the orientation settings of the player (e.g., hetero only or gay only).
</li>
<li>
If it's incest, then this can only happen with small probability.
</li>
</ol>
</div>
<</message>>
</div>
<div><b>Identity</b></div>
<div>
[[Remember unit|RestrictionRememberUnit]]
</div>
<div>
[[Must be the best friend / lover of remembered unit|RestrictionBestFriendWithRememberedUnit]]
<<message '(?)'>>
<div class='helpcard'>
This restricts this unit to be the best friend / lover of the unit on which the (Remember Unit)
above is located.
<br/>
<br/>
For example, to create an event for two lovers, then you use the following restrictions:
<ol>
<li>
Role a: Unit must have a lover
Role a: Unit's best friend / lover must satisfy: Unit is available
Role a: Remember unit
</li>
<li>
Role b: Unit must be the best friend / lover of remembered unit
</li>
</ol>
</div>
<</message>>
</div>
<hr/>
<div><b>Custom</b></div>
<div>
[[Best friend / lover satisfies...|RestrictionBestFriend]]
</div>
</div>
<</message>>
</div>
<div>
<<message "Family...">>
<div class='marketobjectcard'>
<div>
[[Has one of your slavers as a family member|RestrictionHasFamilyWithJobSlaver]]
</div>
<div>
[[Has one of your slaves as a family member|RestrictionHasFamilyWithJobSlave]]
</div>
</div>
<</message>>
</div>
<hr/>
<div><b>Advanced</b></div>
<div>
<<message 'Bedchambers...'>>
<div class='marketobjectcard'>
<div><b>Basic</b></div>
<div>
[[Is assigned to some bedchamber|RestrictionSlaveHasBedchamber]]
</div>
<div>
[[Is NOT assigned to some bedchamber|RestrictionSlaveNoBedchamber]]
</div>
<div>
<<message "Slave's owner...">>
<div class='slavercard'>
<div>
[[Is owned by you|RestrictionSlaveOwnedByYou]]
</div>
<div>
[["Slave's owner must satisfy..."|RestrictionOwner]]
</div>
</div>
<</message>>
</div>
<div>
[[Is usable by you|RestrictionSlaveUsableByYou]]
</div>
<hr/>
<div><b>The other slave in the bedchamber</b></div>
<div>
[[Is in a full bedchamber, with both slaves available to you|RestrictionSlaveBedchamberFullUsableByYou]]
</div>
<div>
[[The other slave in the bedchamber must satisfy this|RestrictionBedchamberOtherSlave]]
</div>
<hr/>
<div><b>Furniture</b></div>
<div>
[[Is in a bedchamber with this furniture|RestrictionSlaveBedchamberHasFurniture]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Recursive...'>>
<div class='marketobjectcard'>
<div>
[[OR: At least one of these must be true|RestrictionOrUnit]]
</div>
<div>
[[AND: ALL of these must be true|RestrictionAndUnit]]
</div>
<div>
[[NOT: This requirement must not be true|RestrictionNotUnit]]
</div>
</div>
<</message>>
</div>
<div>
<<message 'Others...'>>
<div class='marketobjectcard'>
<div><b>Join week</b></div>
<div>
[['Has been with your company for at least this many weeks'|RestrictionWeeksWithCompanyAtLeast]]
</div>
<div>
[['Has been with your company for at most this many weeks'|RestrictionWeeksWithCompanyAtMost]]
</div>
<hr/>
<div><b>Others</b></div>
<div>
[['Is a bodyshifter'|RestrictionBodyshifter]]
</div>
<<message "Tag...">>
<div class='slavercard'>
<div>
[[Has this tag|RestrictionHasTag]]
</div>
<div>
[[NOT have this tag|RestrictionNoTag]]
</div>
</div>
<</message>>
<<include 'CostTagHelp'>>
</div>
<</message>>
</div>
<br/>
<br/>
<<devtoolreturnbutton>><<set _entry = $qrestriction>>
<<unset $qrestriction>>
<<include 'DevAddEntry'>><div>
<<devtoolreturnbutton>>
</div>
<div>
<<successtext 'Role name'>>:
<<message '(?)'>>
<div class='helptext'>
Name for this actor. Don't forget to fill this in!
<br/>
<br/>
Put something short,
which will make it easier for you later to refer to the unit in the stories.
<br/>
<br/>
The name must consists of only lower case characters and numbers. No space allowed.
For example, you can put "farmer", or even just "x", but you cannot put "Farmer", "x y", or "Y".
</div>
<</message>>
<<textbox '$qrolename' '' autofocus>>
</div>
Choose criteria:
<<link '(Create new from scratch)' 'CriteriaGen'>>
<<set _qbaserole = null>>
<<include 'CRGenInit'>>
<</link>>
<<focwidget 'roleaddcriteria'>>
<<devgotoreturn>>
<</focwidget>>
<<for _icriteria, _criteria range $qcustomcriteria>>
<br/>
<<capture _criteria>>
<<= _criteria.getName()>>
<<message '(+)'>>
<<criteriacard _criteria>>
<</message>>
<</capture>>
<<set _text = `(Select this)`>>
<<capture _icriteria, _criteria>>
<<link _text>>
<<devroleaddcriteria $qrolename _criteria>>
<</link>>
or
<<link '(New based from this)' 'CriteriaGen'>>
<<set _qbaserole = _criteria>>
<<include 'CRGenInit'>>
<</link>>
<</capture>>
<</for>>
<<set _qmap = setup.DevToolHelper.getCriteriasMap()>>
<<for _skillkey, _qulist range _qmap>>
<br/>
<<capture _qulist>>
<<if _skillkey == 'SLAVE'>>
<<set _text = 'Slave criterias'>>
<<else>>
<<= setup.skill[_skillkey].rep()>>
<<set _text = `${setup.skill[_skillkey].getName()}-based criterias`>>
<</if>>
<<message _text>>
<<for _icriteria, _criteria range _qulist>>
<<capture _criteria>>
<<= _criteria.getName()>>
<<message '(+)'>>
<<criteriacard _criteria>>
<</message>>
<</capture>>
<<set _text = `(Select criteria)`>>
<<capture _criteria>>
<<link _text>>
<<devroleaddcriteria $qrolename _criteria>>
<</link>>
or
<<link '(New based from this)' 'CriteriaGen'>>
<<set _qbaserole = _criteria>>
<<include 'CRGenInit'>>
<</link>>
<</capture>>
<br/>
<</for>>
<</message>>
<</capture>>
<</for>><<if _sobaserole>>
<<set $soname = _sobaserole.getName()>>
<<set $socompany = _sobaserole.getCompany()>>
<<set $soexpires_in = _sobaserole.expires_in>>
<<set $sobase_price = _sobaserole.base_price>>
<<set $sotrait_mult = _sobaserole.trait_multi>>
<<set $sovalue_mult = _sobaserole.value_multi>>
<<set $socrit_traits = Object.keys(_sobaserole.criteria.crit_trait_map).map(a => setup.trait[a])>>
<<set $sodisaster_traits = Object.keys(_sobaserole.criteria.disaster_trait_map).map(a => setup.trait[a])>>
<<set $socritmap = setup.deepCopy(_sobaserole.criteria.crit_trait_map)>>
<<set $sodisastermap = setup.deepCopy(_sobaserole.criteria.disaster_trait_map)>>
<<set $sorestrictions = _sobaserole.criteria.restrictions>>
<<set $soaddons = _sobaserole.addons>>
<<set $sofulfilled = _sobaserole.fulfilled_outcomes>>
<<set $sounfulfilled = _sobaserole.unfulfilled_outcomes>>
<<else>>
<<set $soname = ''>>
<<set $socompany = $company.independent>>
<<set $soexpires_in = 12>>
<<set $sobase_price = 1500>>
<<set $sotrait_mult = 0>>
<<set $sovalue_mult = 1>>
<<set $socrit_traits = []>>
<<set $sodisaster_traits = []>>
<<set $socritmap = {}>>
<<set $sodisastermap = {}>>
<<set $sorestrictions = [setup.qs.job_slave]>>
<<set $soaddons = []>>
<<set $sofulfilled = []>>
<<set $sounfulfilled = []>>
<</if>>
<<dtsavepassage 'SlaveOrderGen'>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtloadpassagelink>>
<p>
Slave order name:
<<message '(?)'>>
Enter the slave order's name. For example: "Order from the Safari Zone"
<</message>>
<<textbox "$soname" $soname>>
</p>
<p>
Order source:
<<message '(?)'>>
Which company logically generate this order. If none is applicable, use the default "Independent" company.
<<dangertextlite 'Not used'>> for anything but flavor text.
<</message>>
<<= $socompany.rep()>>
<<message '(Change)'>>
|
<<for _icompany, _company range $company>>
<<capture _company>>
<<link _company.getName()>>
<<set $socompany = _company>>
<<focgoto 'SlaveOrderGen'>>
<</link>>
|
<</capture>>
<</for>>
<</message>>
</p>
<p>
Expires in:
<<numberbox "$soexpires_in" $soexpires_in>>
weeks.
</p>
<p>
Base price:
<<numberbox "$sobase_price" $sobase_price>>g.
</p>
<p>
Gold per trait match (or negative per disaster match):
<<numberbox "$sotrait_mult" $sotrait_mult>>g.
</p>
<p>
Gold per slave value (can put fraction, e.g., 1.5):
<<numberbox "$sovalue_mult" $sovalue_mult>>g.
</p>
<div class='equipmentcard'>
Unit Restrictions:
<<message '(?)'>>
Only units that satisfies these requirements can fulfill this requirement.
There's also a second "hidden" requirement where the unit must sell for some positive value.
This requirement is ALWAYS here --- if you want random requirements, use the (Addons) field later.
<</message>>
<<devlist '$sorestrictions' '(Add new restriction)' 'QGAddRestrictionUnit' 'SlaveOrderGen'>>
</div>
<<focwidget 'loadcatcrit'>>
<div class='dutycard'>
<<successtext 'CRITICAL'>>:
<<message '(?)'>>
Slaves having this trait will sell for more for this order.
These criterias are ALWAYS here --- if you want random criterias, use the (Addons) field later.
<</message>>
<<for _itrait, _trait range $socrit_traits>>
<<capture _itrait, _trait>>
<<rep _trait>>
<<link '(-)'>>
<<run $socrit_traits.splice(_itrait, 1)>>
<<run delete $socritmap[_trait.key]>>
<<refreshcatcrit>>
<</link>>
|
<</capture>>
<</for>>
<br/>
Add new trait:
<<for _itrait, _trait range setup.trait>>
<<if !(_trait.key in $socritmap)>>
<<rep _trait>>
<<capture _trait>>
<<link '(+)'>>
<<run $socrit_traits.push(_trait)>>
<<set $socritmap[_trait.key] = true>>
<<refreshcatcrit>>
<</link>>
<</capture>>
<<else>>
<<negtraitcard _trait>>
(+)
<</if>>
|
<</for>>
</div>
<</focwidget>>
<<focwidget 'loadcatdisaster'>>
<div class='contactcard'>
<<dangertext 'DISASTER'>>:
<<message '(?)'>>
Slaves with these traits will sell for less for this order.
These criterias are ALWAYS here --- if you want random criterias, use the (Addons) field later.
<</message>>
<<for _itrait, _trait range $sodisaster_traits>>
<<capture _itrait>>
<<rep _trait>>
<<link '(-)'>>
<<run $sodisaster_traits.splice(_itrait, 1)>>
<<run delete $sodisastermap[_trait.key]>>
<<refreshcatdisaster>>
<</link>>
|
<</capture>>
<</for>>
<br/>
Add new trait:
<<for _itrait, _trait range setup.trait>>
<<if !(_trait.key in $sodisastermap)>>
<<rep _trait>>
<<capture _trait>>
<<link '(+)'>>
<<run $sodisaster_traits.push(_trait)>>
<<set $sodisastermap[_trait.key] = true>>
<<refreshcatdisaster>>
<</link>>
<</capture>>
<<else>>
<<negtraitcard _trait>>
(+)
<</if>>
|
<</for>>
</div>
<</focwidget>>
<div id='catdivcrit'>
<<loadcatcrit>>
</div>
<<focwidget 'refreshcatcrit'>>
<<replace '#catdivcrit'>>
<<loadcatcrit>>
<</replace>>
<</focwidget>>
<div id='catdivdisaster'>
<<loadcatdisaster>>
</div>
<<focwidget 'refreshcatdisaster'>>
<<replace '#catdivdisaster'>>
<<loadcatdisaster>>
<</replace>>
<</focwidget>>
<div class='bedchambercard'>
Addons:
<<message '(?)'>>
Special modifiers to this order. For example, you can add an addon that requires the slave
to be of a random gender, or an addon that adds random critical traits.
<</message>>
<<link '(Add new addon)' 'QGAddAddon'>>
<</link>>
<<for _iccaddon, _ccaddon range $soaddons>>
<br/>
<<= _ccaddon.explain()>>
<<capture _iccaddon>>
<<link '(delete)' 'SlaveOrderGen'>>
<<run $soaddons.splice(_iccaddon, 1)>>
<</link>>
<</capture>>
<</for>>
</div>
<div class='companycard'>
Outcomes on Fulfillment:
<<message '(?)'>>
Extra things that happen when the order is fulfilled (outside of getting the money specified).
Usually empty, but sometimes can be things such as gaining relations.
<</message>>
<<devlist '$sofulfilled' '(Add new result)' 'QGAddCost' 'SlaveOrderGen'>>
</div>
<div class='eventcard'>
Outcomes on expiration without fulfilling:
<<message '(?)'>>
What happens when you fail to fulfill the order. Usually empty, but sometimes can be
used to substract money from the player.
<</message>>
<<devlist '$sounfulfilled' '(Add new result)' 'QGAddCost' 'SlaveOrderGen'>>
</div>
<<link 'CREATE SLAVE ORDER' >>
<<if !$soname>>
<<warning 'Name cannot be empty'>>
<<elseif $soexpires_in <= 0>>
<<warning 'Expiration must be positive'>>
<<else>>
<<set _order = setup.qc.SlaveOrderFlex(
$soname,
$socompany.key,
$soexpires_in,
$sobase_price,
$sotrait_mult,
$sovalue_mult,
$socrit_traits,
$sodisaster_traits,
$sorestrictions,
$soaddons,
$sofulfilled,
$sounfulfilled,
)>>
<<run $qcustomslaveorder.push(_order)>>
<<dtloadpassage>>
<<devgotoreturn>>
<</if>>
<</link>>
<br/>
<br/>
<<dtloadpassagelink>><<set $trname = "">>
<<set $trdescription = "">>
<<set $trunittext = "">>
<<set $trslavevalue = 0>>
<<set $trskilladds = [
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
]>><<link '(Cancel)'>>
<<goto $gTRReturnPassage>>
<</link>>
<br/>
<p>
Title name:
<<message '(?)'>>
Enter the title's name. For example "Divine Wielder of Excalibur"
<</message>>
<<textbox "$trname" $trname>>
</p>
<p>
Title description:
<<message '(?)'>>
Enter the title's description. For example "Wielder of the divine sword Excalibur"
<</message>>
<<textbox "$trdescription" $trdescription>>
</p>
<p>
Title unit text:
<<message '(?)'>>
Enter the unit text that will be displayed in unit description.
For example: " is the sole wielder of the divine sword Excalibur".
Do NOT put period at the end.
<</message>>
<<textbox "$trunittext" $trunittext>>
</p>
<p>
Slave value:
<<message '(?)'>>
Enter the additional value slaves with this title gets.
Often 0.
Rule of thumb: cheap title: 1500g. Good titles: 3000g.
Rare title: 7500g.
Unicorn: 15000g.
Can be negative.
<</message>>
<<textbox "$trslavevalue" $trslavevalue>>
</p>
<div class='equipmentsetcard card'>
Skill additives:
<<message '(?)'>>
How much increment does each of these skills get?
This is a flat bonus, not percentage.
Should not exceed 5 on any one skill.
(Only put 5 for very rare titles! Most ordinary ones should be at most 3.)
Total sum should not exceed 10 for the rarest trait --- less rare trait should sum less.
Can put negative values to penalty those stats instead.
<</message>>
<<for _iskill, _skill range setup.skill>>
<br/>
<<set _varname = `$trskilladds[${_iskill}]`>>
<<capture _varname>>
<<rep _skill>>: <<numberbox _varname $trskilladds[_iskill]>>
<</capture>>
<</for>>
</div>
<<link 'CREATE TITLE' >>
<<if !$trname>>
<<warning 'Name cannot be empty'>>
<<elseif !$trdescription>>
<<warning 'Description cannot be empty'>>
<<else>>
setup.Title = function(key, name, description, unit_text, slave_value, skill_adds) {
<<set $tkey = 'quest_' + setup.getKeyFromName($trname, setup.title) + `_${$qcustomtitle.length}`>>
<<run $qcustomtitle.push(
new setup.Title(
$tkey,
$trname,
$trdescription,
$trunittext,
$trslavevalue,
$trskilladds,
)
)>>
<<goto $gTRReturnPassage>>
<</if>>
<</link>><<if _baseunitgroup>>
<<set $ugname = _baseunitgroup.getName()>>
<<set $ugpools = _baseunitgroup.getUnitPools()>>
<<set $ugpostprocess = _baseunitgroup.unit_post_process>>
<<set $ugisreuse = !(!(_baseunitgroup.reuse_chance))>>
<<else>>
<<set $ugname = "">>
<<set $ugpools = []>>
<<set $ugpostprocess = []>>
<<set $ugisreuse = false>>
<</if>>
<<dtsavepassage 'UnitGroupGen'>><<run setup.DevToolHelper.restoreScrollPos()>>
<<dtloadpassagelink>>
<p>
Unit group name:
<<message '(?)'>>
<div class='helpcard'>
Enter the unit group's name.
<br/>
<br/>
For example: "Desert Warriors"
</div>
<</message>>
<<textbox "$ugname" $ugname>>
</p>
<div class='itemcard'>
Pools:
[[(Add new unitpool)|UGAddUnitPool]]
<<for _iccunitpool, _ccunitpool range $ugpools>>
<br/>
<<= _ccunitpool[1]>>: <<= _ccunitpool[0].rep()>>
<<capture _iccunitpool>>
<<link '(delete)' 'UnitGroupGen'>>
<<run $ugpools.splice(_iccunitpool, 1)>>
<</link>>
<</capture>>
<</for>>
</div>
<div class='equipmentsetcard card'>
Unit effect:
<<message '(?)'>>
<div class='helpcard'>
Use this if you want units generated from this pool to have certain characteristics.
<br/>
<br/>
For example, you can use this to ensure that the unit always have a certain trait or title.
</div>
<</message>>
<<devlist '$ugpostprocess' '(Add new cost)' 'QGAddCostUnit' 'UnitGroupGen'>>
</div>
<div>
<<checkbox '$ugisreuse' false true autocheck>> Is unit persistent?
<<message '(?)'>>
<div class='helpcard'>
If checked, then the unit generated by this unitgroup will remain <<successtext 'persistent'>>.
<br/>
<br/>
A persistent unit will persist when the quest ended.
When another quest tries to pull a unit from this unit group, the same unit will
be selected.
For example, you can use this to generate a villain character that spans
multiple quests, or making a quest that details the adventure of a certain
unit spanning multiple quests.
A new unit will only be generated when the existing one is removed, either
by using the (Delete actor) outcome, or by the
(Clear all units from a unit group) outcome.
</div>
<</message>>
</div>
<<link '(CREATE UNIT GROUP)' >>
<<if !$ugname>>
<<warning 'Name cannot be empty'>>
<<else>>
<<if !$ugpools.length>>
<<warning 'Unit pools cannot be empty'>>
<<else>>
<<if $ugisreuse>>
<<set _reuse = 1>>
<<else>>
<<set _reuse = 0>>
<</if>>
/* generate title */
<<set _basekey = setup.getKeyFromName($dtquest.name, setup.unitgroup)>>
<<set _basekey = `${_basekey}${$qcustomunitgroup.length}`>>
<<set $qcustomunitgroup.push(
new setup.UnitGroup(
_basekey, /* key */
$ugname,
$ugpools,
_reuse, /* reuse chance */
$ugpostprocess,
)
)>>
<<dtloadpassage>>
<<goto 'QGAddActor'>>
<</if>>
<</if>>
<</link>>Weight:
<<message '(?)'>>
The larger the weight, the more often this pool is used.
For example, a pool with weight 3 will be used thrice more often than another
pool with weight 1.
<</message>>
<<numberbox '$ugweight' 1>>
<br/>
Choose unit pool:
<<for _iunitpool, _unitpool range setup.unitpool>>
<<set _text = `Select ${_unitpool.getName()}`>>
<br/>
<<capture _unitpool>>
<<link _text>>
<<if $ugweight <= 0 || !$ugweight>>
<<warning 'Weight cannot be 0 or negative'>>
<<else>>
<<run $ugpools.push([_unitpool, $ugweight])>>
<<goto 'UnitGroupGen'>>
<</if>>
<</link>>
<</capture>>
<<capture _unitpool>>
<<message '(+)'>>
<<unitpoolcard _unitpool>>
<</message>>
<</capture>>
<</for>><<focwidget 'twinehelptext'>>
<<message '(Help and Formatting)'>>
For additional game-specific commands not covered in the toolbar,
see [[here|https://gitgud.io/darkofocdarko/foc/-/blob/master/docs/text.md]].
For SugarCube 2 commands, see [[here|http://www.motoslave.net/sugarcube/2/docs/]].
<</message>>
<</focwidget>>
<<focwidget 'devtoolreturnbutton'>>
<<link '(Cancel)'>>
<<devgotoreturn>>
<</link>>
<</focwidget>>
<<focwidget 'devtoolcontentdonebegin'>>
Your new $args[0] is ready!
It is advisable to <<successtext 'save your game now'>>, so you don't lose your progress,
and you can continue to work on this $args[0] later if you want to revise it.
Click the (Test your $args[0]) link to test your $args[0]:
You can also <<message 'test your content in a real game'>>
<div class='helpcard'>
To test your $args[0] in a real game, you must have an existing saved game right now.
Click the "(Test your $args[0])" button below. Once the $args[0] test results shows up,
<<dangertext 'in that same screen'>>, load your save from the SAVES menu at the bottom left.
Your $args[0] is now in that game!
If you want to add multiple $args[0]s to test in the game, you can do so by following the
(Click for guide on how to add it to the game code yourself) guide below.
</div>
<</message>>.
<br/>
<</focwidget>>
<<focwidget 'devtoolcontentdonemid'>>
When you are happy with your $args[0] and no error appeared in the (Test your $args[0]) above,
you are ready to add the $args[0] to the game!
There are two options for you.
The first option is to copy paste all the code below to the [[subreddit|https://www.reddit.com/r/FortOfChains/]],
and a contributor will put it in the game code.
(Hint: your code is likely to exceed reddit's word limit. In this case,
paste your code to [[pastebin|https://pastebin.com/]],
then paste the resulting link to reddit.)
The second option is to add it to the code directly, and it's also very easy!
<<set _filename = `project/twee/${$args[0]}/[yourname]/${$qfilename}`>>
<<message "Click for guide on how to add it to the game code yourself">>
<div class='helpcard'>
<p>
First, go to https://gitgud.io/darkofocdarko/foc and download the repository.
Next, create the following file:
<<successtext _filename>>,
and copy paste all the code later below to that file.
(Replace [yourname] with your name. You can use any text editor like Notepad to create the file.
You may need to create a new directory here.)
[[(Example)|https://gitgud.io/darkofocdarko/foc/-/blob/master/project/twee/quest/Dporentel/goblin_resque.twee]]
Finally, compile the game, which is really easy! See [[here|https://gitgud.io/darkofocdarko/foc#compiling-instructions]]
for compiling instructions.
</p>
<p>
That's all.
Your $args[0] is now permanently in the game (in your copy of the game that is).
You can
test your $args[0] after you compile by going to the Debug Start, then go to Settings, then to "Test $args[0]".
<<if $args[0] == 'quest'>>
Your $args[0] will be at their corresponding pool (or at "Other Quests" if it does not belong to any pool).
<</if>>
Once that works, all you need to do is
[[send a merge request to the repository|https://gitgud.io/darkofocdarko/foc/-/blob/master/docs/mergerequest.md]].
(Again, you don't need to install anything to do so.)
</p>
</div>
<</message>>
<br/>
<br/>
Copy all the code below to either the subreddit,
or if you have compiled, to <<successtextlite _filename>>:
<</focwidget>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_qdesc)>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_qoutcomedesc[0])>><<if !setup.DEVTOOL_qoutcomedesc[1]>>
<<include 'DummyPassage0'>>
<<else>>
<<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_qoutcomedesc[1])>>
<</if>><<if !setup.DEVTOOL_qoutcomedesc[2]>>
<<include 'DummyPassage1'>>
<<else>>
<<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_qoutcomedesc[2])>>
<</if>><<if !setup.DEVTOOL_qoutcomedesc[3]>>
<<include 'DummyPassage2'>>
<<else>>
<<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_qoutcomedesc[3])>>
<</if>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_odesc)>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[0])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[0])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[1])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[1])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[2])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[2])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[3])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[3])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[4])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[4])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[5])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[5])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[6])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[6])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[7])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[7])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[8])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[8])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiontitle[9])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_ooptiondesc[9])>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_edesc)>><<= setup.DevToolHelper.debugDevToolTwine(setup.DEVTOOL_idesc)>><<run State.history.splice(State.activeIndex, 1)>>
<<devgotoreturn>><<focwidget 'dtauthor'>>
<p>
<b>Author</b>:
<<message '(?)'>>
<div class='helpcard'>
Enter your nickname.
<br/>
<br/>
This will be displayed as author of this $devtooltype.
You can leave this blank if you want to remain anonymous.
</div>
<</message>>
<<textbox $args[0] $args[1]>>
</p>
<</focwidget>>
<<focwidget 'dtname'>>
<p>
<b>Name</b> of the $devtooltype:
<<message '(?)'>>
<div class='helpcard'>
Enter the $devtooltype's name.
<br/>
<br/>
Example: "Raiding the Farm: Corny Revenge"
</div>
<</message>>
<<textbox $args[0] $args[1]>>
</p>
<</focwidget>>
<<focwidget 'dtquestpool'>>
<p>
<b>Quest pool</b>:
<<message '(?)'>>
<div class='helpcard'>
Where this quest can be scouted.
<br/>
<br/>
This field is optional and can be left empty. If you do, the quest can never be
scouted. This can be useful when the quest is generated by other means, for example,
as part of a quest chain.
</div>
<</message>>
<<if $args[1]>>
<<= $args[1].rep()>>
<<link '(remove)'>>
<<set State.variables[$args[0].substr(1)] = null>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<devgotoreturn>>
<</link>>
<<else>>
<<dangertextlite 'No quest pool'>>
<</if>>
<<link '(Select quest pool)'>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<goto $args[2]>>
<</link>>
</p>
<</focwidget>>
<<focwidget 'dtrarity'>>
<p>
<b>Rarity</b>:
<<message '(?)'>>
<div class='helpcard'>
The higher the rarity, the rarer the $devtooltype will be scouted.
<br/>
<br/>
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Rarity Number</th>
<th>Meaning</th>
<th>Effect</th>
</tr>
</thead>
<tbody>
<tr>
<td>0</td>
<td>Common</td>
<td></td>
</tr>
<tr>
<td>30</td>
<td>Uncommon</td>
<td>Roughly 1 quest every 2 common quests</td>
</tr>
<tr>
<td>60</td>
<td>Rare</td>
<td>Roughly 1 quest every 5 common quests</td>
</tr>
<tr>
<td>80</td>
<td>Very Rare</td>
<td>Roughly 1 quest every 10 common quests</td>
</tr>
<tr>
<td>90</td>
<td>Extremely Rare</td>
<td>Roughly 1 quest every 20 common quests</td>
</tr>
<tr>
<td>100</td>
<td>Impossible</td>
<td>Will never be scouted</td>
</tr>
<tr>
<td>0</td>
<td>Always</td>
<td>Special value: this quest will ALWAYS be scouted whenever possible</td>
</tr>
</tbody>
</table>
</div>
<</message>>
<<numberbox $args[0] $args[1]>>.
</p>
<</focwidget>>
<<focwidget 'dtduration'>>
<p>
<b>Weeks to complete</b>:
<<message '(?)'>>
<div class='helpcard'>
How many weeks to complete this $devtooltype?
<br/>
<br/>
The guideline is as follows. You can deviate from it, but use your good judgment if you do.
<br/>
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Location</th>
<th>Quest type</th>
<th>Duration</th>
</tr>
</thead>
<tbody>
<tr>
<td><<lore region_vale>></td>
<td>Normal</td>
<td>1 week</td>
</tr>
<tr>
<td>Western Forests</td>
<td>Normal</td>
<td>1 week</td>
</tr>
<tr>
<td>City of Lucgate</td>
<td>Normal</td>
<td>1-2 week</td>
</tr>
<tr>
<td>Eastern Deserts</td>
<td>Normal</td>
<td>2-3 weeks</td>
</tr>
<tr>
<td>All locations</td>
<td>Veteran</td>
<td>4-8 weeks</td>
</tr>
</tbody>
</table>
<br/>
Note that all quests in the southern seas are Veteran quests.
</div>
<</message>>
<<numberbox $args[0] $args[1]>> weeks
</p>
<</focwidget>>
<<focwidget 'dtexpires'>>
<b>Weeks before $devtooltype expires</b>:
<<message '(?)'>>
<div class='helpcard'>
How many weeks before this quest expires on its own?
<br/>
<br/>
<<if $devtooltype == 'quest'>>
The standard value is <<successtext 6>> weeks.
<<elseif $devtooltype == 'opportunity'>>
The standard value is <<successtext 1>> week.
<</if>>
<br/>
<br/>
You can use less if you want to make the $devtooltype feels urgent,
and use more if you want to allow players to have more time to prepare
for the $devtooltype.
</div>
<</message>>
<<numberbox $args[0] $args[1]>> weeks
<</focwidget>>
<<focwidget 'dtdifficultyrewardtable'>>
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Modifier</th>
<th>Risks</th>
</tr>
</thead>
<tbody>
<tr>
<td>Easiest-Normal</td>
<td>
- Losing money
<br/>
- Gaining a little ire
<br/>
- Injury
<br/>
- Trauma
</td>
</tr>
<tr>
<td>Normal-Harder</td>
<td>
- All of the above
<br/>
- A slave escapes but immediately recapture-able
<br/>
- A slaver is captured but immediately rescue-able
<br/>
- Longer injuries
<br/>
- Longer trauma
<br/>
- Gaining more ire
</td>
</tr>
<tr>
<td>Hardest+</td>
<td>
- All of the above
<br/>
- Very long trauma
<br/>
- Very long injury
<br/>
- Losing a slaver / slave that must be rescued using a Rescuer
<br/>
- Your slaver got corrupted
<br/>
- Gaining a lot of ire
</td>
</tr>
</tbody>
</table>
<</focwidget>>
<<focwidget 'dtdifficultyhelp'>>
<<message '(?)'>>
<div class='helpcard'>
Difficulty consists of two parts, a <<successtextlite 'level'>>
and a <<dangertextlite 'modifier'>>.
A Lv. X quest is meant to be tackled by a set of naked, uoptimized Lv. X slavers.
The difficulty is further adjusted by the <<dangertextlite 'modifier'>>,
such as <<successtextlite 'easy'>> or <<dangertextlite 'hard'>>.
A Lv. 15 <<successtextlite 'easy'>> quest will be easier to do
than a Lv. 15 <<dangertextlite 'hard'>> quest, for example.
<br/>
<br/>
Note that at the late game, players are expected to have more optimized slavers,
and hence higher level quests (e.g., Lv 60 quests) can be tackled by lv40 but optimized slavers.
<br/>
<br/>
Quest level should be chosen in the following way:
<br/>
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Location</th>
<th>Type</th>
<th>Level</th>
</tr>
</thead>
<tbody>
<tr>
<td><<lore region_vale>></td>
<td>Normal Quests</td>
<td>Lv. 1 - Lv. 20</td>
</tr>
<tr>
<td>Western Forests</td>
<td>Normal Quests</td>
<td>Lv. 15 - Lv. 30</td>
</tr>
<tr>
<td>City of Lucgate</td>
<td>Normal Quests</td>
<td>Lv. 25 - Lv. 40</td>
</tr>
<tr>
<td>Eastern Deserts</td>
<td>Normal Quests</td>
<td>Lv. 35 - Lv. 50</td>
</tr>
<tr>
<td>All Locations</td>
<td>Veteran Quests</td>
<td>Lv. 50 - Lv. 80</td>
</tr>
</tbody>
</table>
<br/>
Note that all quests in the Southern Seas are Veteran quests.
<br/>
<br/>
Choosing modifier should be done according to their risks, i.e., what
happens on failure. The following is a general guideline, but you are
free to be creative with your quest failure outcomes.
<br/>
<<dtdifficultyrewardtable>>
</div>
<</message>>
<</focwidget>>
<<focwidget 'dtdifficulty'>>
<p>
<b>Difficulty</b>:
<<dtdifficultyhelp>>
<<if $args[0]['difficulty']>>
<<rep $args[0]['difficulty']>>
<</if>>
<<link '(Choose difficulty)'>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<goto $args[1]>>
<</link>>
</p>
<</focwidget>>
<<focwidget 'dttagsinternal'>>
<<for _itag range setup.TagHelper.getAllTagsOfType('quest', $args[1])>>
<<capture _itag>>
<<set _tagtext = setup.TagHelper.tagRepLong('quest', _itag)>>
<<if $args[0].tags.includes(_itag)>>
(<<= _tagtext>>)
<<else>>
<<set _linkname = `(${_tagtext})`>>
<<link _linkname>>
<<run $args[0].tags.push(_itag)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<devgotoreturn>>
<</link>>
<</if>>
<</capture>>
<</for>>
<</focwidget>>
<<focwidget 'dttags'>>
<div class='dutycard'>
<div>
<b>Tags</b>:
<<message '(?)'>>
<div class='helpcard'>
Tags primary purpose is for filtering content, including filtering out banned content.
Please see their corresponding help texts for more information.
</div>
<</message>>
<<for _itag, _tag range $args[0].tags>>
<<capture _tag>>
<span class='tagcard'>
<<= setup.TagHelper.tagRepLong('quest', _tag) >>
<<link '<<icon cancel "Delete">>'>>
<<set $args[0].tags = $args[0].tags.filter(item => item != _tag)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<devgotoreturn>>
<</link>>
</span>
<</capture>>
<</for>>
</div>
<div>
New fetish tag:
<<message '(?)'>>
<div class='helpcard'>
The fetishes associated with this $devtooltype.
<br/>
<br/>
This is used to filter
<<dangertext 'out'>> content based on player's preferences.
You should only use these tags if it is highly relevant for your $devtooltype.
</div>
<</message>>
<<dttagsinternal $args[0] 'fetish'>>
</div>
<div>
New region tag:
<<message '(?)'>>
<div class='helpcard'>
The location where this $devtooltype is scouted or takes place.
Usually only relevant for quests and opportunities.
</div>
<</message>>
<<dttagsinternal $args[0] 'region'>>
</div>
<div>
New type tag:
<<message '(?)'>>
<div class='helpcard'>
Special properties of this $devtooltype, if any.
</div>
<</message>>
<<dttagsinternal $args[0] 'type'>>
</div>
<div>
New reward tag:
<<message'(?)'>>
<div class='helpcard'>
The best guess on the rewards that this $devtooltype gives solely by reading the description.
<br/>
<br/>
This is often not actually the real reward!
There has been quests whose description is intentionally misleading, and the
tags should reflect that.
</div>
<</message>>
<<dttagsinternal $args[0] 'reward'>>
</div>
</div>
<</focwidget>>
<<focwidget 'devroleaddcriteria'>>
<<if !$args[0] || !$args[0].match('^[a-z0-9]+$') >>
<<warning 'Role name cannot be empty and must consist of lowercase letters and numbers only'>>
<<else>>
<<if $dtquest.getAllActorNames().includes($args[0])>>
<<warning 'Duplicate rolename'>>
<<else>>
<<if $devtooltype == 'quest'>>
<<run $dtquest.unit_criteria_map[$args[0]] = {
criteria: $args[1],
offsetmod: 1,
}>>
<<unset $compiledquest>>
<<devgotoreturn>>
<</if>>
<</if>>
<</if>>
<</focwidget>>
<<focwidget 'dtactor'>>
<div class='opportunitycard'>
<div>
<b>Actors</b>:
<<message '(?)'>>
<div class='helpcard'>
List of units that are involved in this $devtooltype.
<br/>
<br/>
You can use this to add NPCs to participate in your $devtooltype.
For example, if you are raiding a farm, the NPC could be the farmer
that you are raiding and potentially enslave.
<br/>
<br/>
You can also use this to add units from your company to participate
in the $devtooltype.
These actors will be chosen randomly, among the eligible units in your
company.
For example, this could be used for making a quest where a slave tries to
escape from your company.
Note that the unit will be considered busy for the entirety of the
$devtooltype, so this should only be used sparingly.
If you just want a slaver to add flavor to the quest description,
consider using
<code>
"""<<set _u = setup.getAnySlaver()>>"""
</code>
instead.
</div>
<</message>>
<<link '(Add new NPC)'>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<goto 'QGAddActor'>>
<</link>>
<<message '(Add a random actor from your company)'>>
<div class='slavercard'>
<div><b>Actor name</b>: <<textbox '_newactorname' ''>></div>
<<link '(Add actor)'>>
<<if !_newactorname || $dtquest.getAllActorNames().includes(_newactorname)>>
<<warning 'Duplicate actor name or missing actor name'>>
<<else>>
<<if !_newactorname.match('^[a-z0-9]+$') >>
<<warning 'Actor name cannot be empty and must consist of lowercase letters and numbers only'>>
<<else>>
<<if ['event', 'quest', 'opportunity'].includes($devtooltype)>>
<<set $dtquest.actor_unitgroup_key_map[_newactorname] = []>>
<</if>>
<<unset $compiledquest>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<devgotoreturn>>
<</if>>
<</if>>
<</link>>
</div>
<</message>>
</div>
<<if ['event', 'quest', 'opportunity'].includes($devtooltype)>>
<<set _actor_unitgroup_key_map = $dtquest.actor_unitgroup_key_map>>
<<set _listpathbase = "$dtquest.actor_unitgroup_key_map">>
<</if>>
<<for _iactor, _actor range _actor_unitgroup_key_map>>
<div>
<<if _actor>>
<<if Array.isArray(_actor)>>
<div class='marketobjectcard'>
<<= _iactor>>
<<message '(?)'>>
A random unit from YOUR COMPANY that satisfies these requirements will be assigned to this actor.
<</message>>:
<<set _listpath = _listpathbase + "[" + _iactor + "]">>
<<devlist _listpath '(Add new restriction)' 'QGAddRestrictionUnit' 'DevGoToReturn'>>
</div>
<<else>>
<<= _iactor>>: <<rep setup.unitgroup[_actor]>>
<</if>>
<<else>>
<<= _iactor>>: None
<</if>>
<<capture _iactor, _actor>>
<<set _text = `(remove ${_iactor})`>>
<<link _text>>
<<run delete _actor_unitgroup_key_map[_iactor]>>
<<run setup.DevToolHelper.saveScrollPos()>>
<<devgotoreturn>>
<</link>>
<</capture>>
</div>
<</for>>
</div>
<</focwidget>>
<<focwidget 'devroleaddunitgroup'>>
<<if !$args[0] || !$args[0].match('^[a-z0-9]+$') >>
<<warning 'Actor name cannot be empty and must consist of lowercase letters and numbers only'>>
<<else>>
<<if $dtquest.getAllActorNames().includes($args[0])>>
<<warning 'Duplicate actor name'>>
<<else>>
<<if ['event', 'quest', 'opportunity'].includes($devtooltype)>>
<<run $dtquest.actor_unitgroup_key_map[$args[0]] = _unitgroup.key>>
<<unset $compiledquest>>
<<devgotoreturn>>
<</if>>
<</if>>
<</if>>
<</focwidget>>
<<focwidget 'dtcost'>>
<div class='equipmentsetcard card'>
<b>Costs</b>:
<<message '(?)'>>
<div class='helpcard'>
Upfront cost of doing this $devtooltype.
<br/>
<br/>
Most $devtooltype have no cost, and should leave this part empty.
<<if $devtooltype == 'quest'>>
If your quest have a cost, remember to
take it into account when calculating the rewards.
<</if>>
</div>
<</message>>
<<devlist $args[0] '(Add new cost)' 'QGAddActualCost' 'DevGoToReturn'>>
</div>
<</focwidget>>
<<focwidget 'dtrestriction'>>
<div class='equipmentcard'>
<b>Restrictions</b>:
<<message '(?)'>>
<div class='helpcard'>
Restrictions on when the $devtooltype can
<<if ['quest', 'opportunity'].includes($devtooltype)>>
be scouted.
<<elseif $devtooltype == 'event'>>
appear.
<<elseif $devtooltype == 'interaction'>>
be performed.
<</if>>
<br/>
<br/>
For example, you can restrict this only after you have build the
<<rep setup.buildingtemplate.veteranhall>>.
</div>
<</message>>
<<devlist $args[0] '(Add new restriction)' 'QGAddRestriction' 'DevGoToReturn'>>
</div>
<</focwidget>>
<<focwidget 'dtexpireoutcome'>>
<div class='eventcard'>
Expiration outcome:
<<message '(?)'>>
<div class='helpcard'>
What happens if you let this $devtooltype expire without being done.
<br/>
<br/>
Usually, this list is empty.
But this can be useful,
for example in the following quest:
A quest that recaptures a runaway slave, which will make the slave gone forever if
the quest expires without being done.
</div>
<</message>>
<<devlist $args[0] '(Add new result)' 'QGAddCost' 'DevGoToReturn'>>
</div>
<</focwidget>>
<<focwidget 'dtoutcome'>>
<div class='equipmentcard'>
<b>Outcomes</b>:
<<message '(?)'>>
<div class='helpcard'>
<<if $devtooltype == 'opportunity'>>
What happens if you select this option.
<<else>>
What happens afterwards, if any.
<</if>>
<br/>
<br/>
For example, it could grant you a new quest, or it could give you money.
</div>
<</message>>
<<devlist $args[0] '(Add new outcome)' 'QGAddCost' 'DevGoToReturn'>>
</div>
<</focwidget>>
<<focwidget 'dtrewardhelp'>>
<div class='helpcard'>
This is the recommended total reward that your $devtooltype should give.
The EXP reward is given automatically.
<br/>
<br/>
The total recommended reward is computed based on the number of units,
the difficulty, whether it's a critical result, and so on.
To get this amount of reward, you can combine multiple rewards.
Their monetary values are the following:
<br/>
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Type</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Money</td>
<td>Their value</td>
</tr>
<tr>
<td>Favor</td>
<td>1.0 favor = <<money 200>></td>
</tr>
<tr>
<td>Items</td>
<td>Equal to their value</td>
</tr>
<tr>
<td>Equipment / Furniture</td>
<td>Equal to their value. Usually common is
<<money setup.EQUIPMENT_PRICE_NORMAL>>,
rare is <<money setup.EQUIPMENT_PRICE_GOOD>>,
and master is <<money setup.EQUIPMENT_PRICE_MASTER>>.
</td>
</tr>
<tr>
<td>Boon</td>
<td><<money 100>> per week per unit. For example, 15 weeks of boon to two units is worth <<money 3000>></td>
</tr>
<tr>
<td>Healing</td>
<td><<money 500>> per weeks healed</td>
</tr>
<tr>
<td>Free slave / slaver</td>
<td>Equal to their <b>unit value</b>. See table below</td>
</tr>
<tr>
<td>Paid slave / slaver<<message '(?)'>>These are recruits / slaves that you have to buy in order to hire / enslave<</message>></td>
<td><<money 500>> per unit</td>
</tr>
<tr>
<td>Quests</td>
<td>
- Vale: <<money 250>>
<br/>
- Forest: <<money 250>>
<br/>
- City: <<money 300>>
<br/>
- Desert: <<money 500>>
<br/>
- Sea: <<money 750>>
</td>
</tr>
<tr>
<td>Trait</td>
<td>Depends on the trait, but must be VERY expensive. At least <<money 10000>> for
normal traits. <<money 80000>> or more for skill / magic traits (can be achieved via quest chains).</td>
</tr>
<tr>
<td>Slave order</td>
<td><<money 500>> plus any extra modifiers (see below)</td>
</tr>
<tr>
<td>Title</td>
<td>Variable. But titles that increase slave value should be worth at least that much</td>
</tr>
</tbody>
</table>
<br/>
For example, to get a total reward of <<money 2000>>, you can give 2 quests in the Vale plus
<<money 1500>>.
<br/>
<br/>
Remember that <b>there is no need to be too creative with rewards</b>. If you are
unsure what reward to give, monetary reward is always helpful to the players.
<br/>
<br/>
<b>Calculating unit's value:</b> To calculate a unit's value,
sum up their race value, the titles you give them (if any), as well as the value of
any other traits modifiers you give them such as when they come pre-trained
or with magical ability. The following is the base unit value based on their race.
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Race</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td><<rep setup.trait.race_humanvale>></td>
<td>
<<money 1500>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_humankingdom>></td>
<td>
<<money 1500>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_humandesert>></td>
<td>
<<money 2000>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_humansea>></td>
<td>
<<money 5000>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_werewolf>></td>
<td>
<<money 3000>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_elf>></td>
<td>
<<money 1500>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_neko>></td>
<td>
<<money 1500>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_orc>></td>
<td>
<<money 3000>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_dragonkin>></td>
<td>
<<money 10000>>
</td>
</tr>
<tr>
<td><<rep setup.trait.race_demon>></td>
<td>
<<money 15000>>
</td>
</tr>
</tbody>
</table>
<br/>
<br/>
<b>Slave order value calculation.</b>
**Slave order reward calculation**.
Slave order has a base price of <<money 500>>.
The overall price can increase / decrease based on the quality of the order.
As a baseline, a slave order that rewards 1x the slave value does not increase
or decrease its price.
Hence, if you give extra money on top of it (e.g., <<money 1500>> bonus payment)
for the slave order, then increase its value by that much.
<br/>
<br/>
If your $devtooltype gives negative result as a reward, make sure to compensate
for them properly.
<<message '(?)'>>
<<dtfailurehelp>>
<</message>>
</div>
<</focwidget>>
<<focwidget 'dtfailurehelp'>>
<div class='helpcard'>
Different than success, there are no strict guidelines on what happens during failure.
The outcomes should be reflected in the $devtooltype difficulty:
<br/>
<<dtdifficultyrewardtable>>
<br/>
<br/>
There are rough monetary value of failure outcomes as well:
<table class='table table-sm table-striped table-bordered'>
<thead>
<tr>
<th>Type</th>
<th>Value</th>
</tr>
</thead>
<tbody>
<tr>
<td>Losing Money</td>
<td>Their value</td>
</tr>
<tr>
<td>Gain Ire</td>
<td><<money 500>> per ire</td>
</tr>
<tr>
<td>Injury</td>
<td><<money 350>> per week</td>
</tr>
<tr>
<td>Trauma</td>
<td><<money 100>> per week per slaver</td>
</tr>
<tr>
<td>Corruption</td>
<td><<money 3000>> per corruption</td>
</tr>
<tr>
<td>Losing a slaver / slave, but immediately rescue-able</td>
<td>
Depends on the quest difficulty:
<br/>
- <<money 1500>> for easiest
<br/>
- <<money 3000>> for medium
<br/>
- <<money 7000>> for hardest
</td>
</tr>
<tr>
<td>Losing a slaver / slave, but can be later rescued by a rescuer</td>
<td>
<<money 3000>>
</td>
</tr>
</tbody>
</table>
</div>
<</focwidget>>
<<focwidget 'dtstoryhelp'>>
<p>
The following are all the stories accompanying this $devtooltype.
<<message '(Content Guidelines)'>>
<div class='helpcard'>
The game tries to be permissive with what kind of stories you can add,
but due to various reasons, there are some
[[Guidelines|https://gitgud.io/darkofocdarko/foc/-/blob/master/docs/contentguideline.md]]
on this.
</div>
<</message>>
<<message '(Code editor help)'>>
<div class='helpcard'>
The code editor is divided into two panes: the left-side pane
is for you to write. You can preview what it looks like by clicking the
"Refresh" link on the top right of the output preview.
<br/>
<br/>
You can add unit-specific "macros" by using the toolbar that appears when
you are inside the left-side pane. For example, you can use this to insert a
gender specific pronoun, or refer to a unit's name.
There are much more things you can do it with it, please feel free to try
each of the items in the toolbar.
</div>
<</message>>
<<message '(Writing suggestions)'>>
<div class='helpcard'>
To make the slavers feel more alive, consider personalizing the story based on the slaver.
This can be done in several ways:
<br/>
<br/>
First, you can create different sentences based on their **general personality**.
Each unit has one of the five possibly general personality.
To do this, in the editor you choose "If Actor" from the toolbar, and then
"Has general personality"
<br/>
<br/>
Second, you can use adverbs that will be based on their personality.
To do this, in the editor choose "Terms" from the toolbar, and then
"Random adverb".
<br/>
<br/>
There are many other ways you can do this, but the two above are the main ones.
You can also check their traits, give a randomized sentence based on their personality,
and much more. Check out the toolbar in the editor below for more.
</div>
<</message>>
</p>
<</focwidget>>
<<focwidget 'dtquestpoolchoose'>>
<<set _questpooldefault = [
'vale', 'forest', 'city', 'desert', 'sea',
]>>
<<for _iquestpool, _questpool range setup.questpool>>
<<if _questpooldefault.includes(_questpool.key)>>
<div>
<<rep _questpool>>
<<capture _questpool>>
<<link '(select this)'>>
<<set _questpoolchosen = _questpool>>
<<include $args[0]>>
<</link>>
<</capture>>
</div>
<</if>>
<</for>>
<<message '(Other...)'>>
<<for _iquestpool, _questpool range setup.questpool>>
<<if !_questpooldefault.includes(_questpool.key)>>
<div>
<<rep _questpool>>
<<capture _questpool>>
<<link '(select this)'>>
<<set _questpoolchosen = _questpool>>
<<include $args[0]>>
<</link>>
<</capture>>
</div>
<</if>>
<</for>>
<</message>>
<</focwidget>>/* widgets that requires br */
<<focwidget 'dtprintmeta'>>
<<for _title range $qcustomtitle>>"""<<run """<<= _title.toText()>>""">>"""
<</for>><<for _iug, _ug range $qcustomunitgroup>> <<nobr>>
<<set _used = false>>
<<for _iactor, _actor range $dtquest.getActorUnitGroups()>>
<<if _actor && !Array.isArray(_actor) && _actor.key == _ug.key>>
<<set _used = true>>
<</if>>
<</for>>
<</nobr>> <<if _used>> """<<run """<<= _ug.toJs()>>""">>""" <</if>> <</for>>
<</focwidget>>
<<focwidget 'dtprinttitle'>><<nobr>>
"<<= setup.escapeJsString($dtquest.name)>>", """/* Title */"""
<</nobr>><</focwidget>>
<<focwidget 'dtprintauthor'>><<nobr>>
"<<= setup.escapeJsString($dtquest.author)>>", """/* Author */"""
<</nobr>><</focwidget>>
<<focwidget 'dtprintdeadlineweeks'>><<nobr>>
<<= $dtquest.deadline_weeks>>, """/* expiration weeks */"""
<</nobr>><</focwidget>>
<<focwidget 'dtprintdifficulty'>><<nobr>>
setup.qdiff.<<= $dtquest.difficulty.diffname>><<= $dtquest.difficulty.level>>, """/* difficulty */"""
<</nobr>><</focwidget>>
<<focwidget 'dtprintactors'>>{ """/* actors */"""
<<for _iactor, _actor range $dtquest.getActorUnitGroups()>><<nobr>>
'<<= _iactor>>':
<<if Array.isArray(_actor)>>
[
<<for _iactorcost, _actorcost range _actor>>
<br/>
<<= _actorcost.text()>>,
<</for>>
<br/>
],
<<elseif _actor>>
'<<= _actor.key>>',
<<else>>
null,
<</if>>
<</nobr>>
<</for>> }, <</focwidget>>
<<focwidget 'dtprinttags'>>[ """/* tags */"""
<<for _itag, _tag range $dtquest.tags>><<nobr>>
'<<= _tag>>',
<</nobr>>
<</for>> ],<</focwidget>>
<<focwidget 'dtprintcosts'>>[ """/* costs */"""
<<for _icost, _cost range $dtquest.costs>><<nobr>>
<<= _cost.text()>>,
<</nobr>>
<</for>> ], <</focwidget>>
<<focwidget 'dtprintrestrictions'>>[ """/* restrictions */"""
<<for _irestriction, _restriction range $dtquest[$args[0]]>><<nobr>>
<<= _restriction.text()>>,
<</nobr>>
<</for>> ], <</focwidget>>
<<focwidget 'dtprintoutcomes'>>[ """/* outcomes */"""
<<for _ioutcome, _outcome range $dtquest[$args[0]]>><<nobr>>
<<= _outcome.text()>>,
<</nobr>>
<</for>> ], <</focwidget>>
<<focwidget 'dtprintexpirationoutcomes'>>[ """/* expiration outcomes */"""
<<for _ixxx, _outcome range $dtquest.expired_outcomes >><<nobr>>
<<= _outcome.text()>>,
<</nobr>>
<</for>>
], <</focwidget>>
<<focwidget 'dtprintquestpool'>>[ """/* quest pool and rarity */"""
<<if $args[0]>> [setup.questpool.<<= $args[0].key>>, <<= $args[1]>>],
<</if>> ], <</focwidget>>/* Save the current passage, and switch to the new one supplied as argument */
/* The saved passage can be restored using <<dtloadpassage>> */
<<focwidget dtsavepassage>>
<<run setup.devQueue('devtoolmainpassage', $gDtSavePassageReturnPassage)>>
<<set $gDtSavePassageReturnPassage = $args[0]>>
<</focwidget>>
<<focwidget dtloadpassage>>
<<set $gDtSavePassageReturnPassage = setup.devPop('devtoolmainpassage')>>
<</focwidget>>
<<focwidget dtloadpassagelink>>
<div>
<<link '(Cancel)'>>
<<dtloadpassage>>
<<devgotoreturn>>
<</link>>
</div>
<</focwidget>><<focwidget 'gotowipehistory'>>
<<run State.history.splice(State.activeIndex, 1)>>
<<goto $args[0]>>
<</focwidget>>
<<focwidget 'devgotoreturn'>>
<<if $gDtSavePassageReturnPassage>>
<<goto $gDtSavePassageReturnPassage>>
<<else>>
<<if $devtooltype == 'quest'>>
<<goto 'QuestGen'>>
<<elseif $devtooltype == 'event'>>
<<goto 'EventGen'>>
<<elseif $devtooltype == 'opportunity'>>
<<goto 'OpportunityGen'>>
<<elseif $devtooltype == 'interaction'>>
<<goto 'InteractionGen'>>
<</if>>
<</if>>
<</focwidget>>
<<focwidget 'devquestroles'>>
<<if !$qdevquestroles>>
<<set $qdevquestroles to {}>>
<</if>>
<div>
<b>Quest roles:</b>
<<message '(Add new)'>>
<div class='slavecard'>
<div>
<<set _newroles = $args[0].getAllActorNames()>>
<<devactorall '_newquestactor' _newroles>>
of <<rep $args[0]>> will be set to
<<devactor '_oldquestactor'>>
of the new quest/event/mail you are making now.
</div>
<div>
<<link '(ADD THIS!)'>>
<<set $qdevquestroles[_newquestactor] = _oldquestactor>>
<<set _thispassage = passage()>>
<<goto _thispassage>>
<</link>>
</div>
</div>
<</message>>
</div>
<<for _actornew, _actorpast range $qdevquestroles>>
<div>
<<successtext _actornew>> of <<rep $args[0]>> will be set to <<successtext _actorpast>> in this quest.
<<capture _actornew>>
<<link '(Delete)'>>
<<run delete $qdevquestroles[_actornew]>>
<<set _thispassage = passage()>>
<<goto _thispassage>>
<</link>>
<</capture>>
</div>
<</for>>
<</focwidget>>
/* Usage: <<devactorall '_varname' actornamelist>> */
/* Use <<devactor>> for most cases, but this can be useful for very few reasons */
/* Unlike <<devactor>>, this ignores $qgDefaultActorName, and list of actors must be supplied */
<<focwidget 'devactorall'>>
<<if !$args[1].length>>
<<if passage() != 'DevActorError'>>
<<set $gPrevious = previous()>>
<<goto 'DevActorError'>>
<</if>>
<<else>>
Actor
<<cycle $args[0] autoselect>>
<<optionsfrom $args[1]>>
<</cycle>>
(Click to change)
<</if>>
<</focwidget>>
/* Usage: <<devactor '_varname'>> */
/* Gives an actor cycling through the list of actors */
<<focwidget 'devactor'>>
<<set _actorlist = $dtquest.getAllActorNames()>>
<<devactorall $args[0] _actorlist>>
<</focwidget>>
<<focwidget 'devactordefault'>>
<<if !$qgDefaultActorName>>
<<devactor '$qgDefaultActorName'>>
<<else>>
<<= $qgDefaultActorName>>
<</if>>
<</focwidget>><<focwidget 'devchoosequest'>>
<p>
Search:
<<onevent 'input'>>
<<textbox '_choosequestfilterunused' ''>>
<<onevent-callback>>
<<set _choosequestfilter = _value>>
<<set _choosequestshowall = 0>>
<<refreshable-refresh "#devchoosequestlist0">>
<</onevent>>
<div>
<<refreshable id="devchoosequestlist0">>
<<devchoosequestlist $args[0]>>
<</refreshable>>
</div>
</p>
<</focwidget>>
<!-- (internal, do not use directly) -->
<<focwidget 'devchoosequestlist'>>
<<if _choosequestfilter>>
<p>Matching quests:</p>
<<set _cand = []>>
<<set _filter = _choosequestfilter.toLowerCase()>>
<<for _iquest, _quest range setup.questtemplate>>
<<if _quest.getName().toLowerCase().includes(_filter)>>
<<run _cand.push(_quest)>>
<</if>>
<</for>>
<<run _cand.sort((q1, q2) => q1.getDifficulty().getLevel() - q2.getDifficulty().getLevel())>>
<<set _subset = _choosequestshowall ? _cand : _cand.slice(0, 20)>>
<<for _iquest, _quest range _subset>>
<<capture _quest>>
<<= _quest.getDifficulty().rep()>>:
<<rep _quest>>
<<link '(select this)'>>
<<set _questchosen = _quest>>
<<include _passage>>
<</link>>
<br/>
<</capture>>
<</for>>
<<if _subset.length < _cand.length>> <!-- prevent showing too many matches at once -->
<p class="indented">
And <<= _cand.length - _subset.length >> more
<<link '(see all results)'>>
<<set _choosequestshowall = 1>>
<<refreshable-refresh "#devchoosequestlist0">>
<</link>>
</p>
<<elseif !_cand.length>>
<p class="indented">
(No matches)
</p>
<</if>>
<<else>>
<p>
Where is the quest located?
<<message '(?)'>>
If it does not have a quest location, it will be at the bottom option "Other Quests".
<</message>>
</p>
<<set _passage = $args[0]>>
<<set _found = {}>>
<<for _iquestpool, _questpool range setup.questpool>>
<<set _qkeys = Object.keys(_questpool.quest_template_rarity_map)>>
<<for _z, _iqkey range _qkeys>>
<<set _found[_iqkey] = true>>
<</for>>
<<capture _questpool>>
<<set _text = `Quests in ${_questpool.getName()}`>>
<<message _text>>
<<set _qkeys = Object.keys(_questpool.quest_template_rarity_map)>>
<<run _qkeys.sort((q1, q2) => setup.questtemplate[q1].getDifficulty().getLevel() - setup.questtemplate[q2].getDifficulty().getLevel())>>
<<for _z, _iqkey range _qkeys>>
<<set _questtemplate = setup.questtemplate[_iqkey]>>
<<capture _questtemplate>>
<<= _questtemplate.getDifficulty().rep()>>:
<<rep _questtemplate>>
<<link '(select this)'>>
<<set _questchosen = _questtemplate>>
<<include _passage>>
<</link>>
<br/>
<</capture>>
<</for>>
<</message>>
<br/>
<</capture>>
<</for>>
<<message 'Other Quests'>>
<<set _cand = []>>
<<for _iquest, _quest range setup.questtemplate>>
<<if !_found[_quest.key]>>
<<run _cand.push(_quest)>>
<</if>>
<</for>>
<<run _cand.sort((q1, q2) => q1.getDifficulty().getLevel() - q2.getDifficulty().getLevel())>>
<<for _iquest, _quest range _cand>>
<<capture _quest>>
<<= _quest.getDifficulty().rep()>>:
<<rep _quest>>
<<link '(select this)'>>
<<set _questchosen = _quest>>
<<include _passage>>
<</link>>
<br/>
<</capture>>
<</for>>
<</message>>
<</if>>
<</focwidget>>
<<focwidget 'devchoosedifficulty'>>
Choose a difficulty:
<<message '(?)'>>
A difficulty consists of two parts: a "modifier" in easy, medium, or hard, and the level.
In general, "easy" quests have higher success rate than "hard" quest.
The modifier should reflect how dangerous the risks are --- easy or medium quests means that
even on disaster it won't be too bad, while "hardest" or "abyss" quest will have terrible consequences
on disaster.
The level of a difficulty is the recommended level for slavers to tackle this difficulty ---
e.g., a Lv 50 quest is designed to be tackled by a set of lv 50 slavers.
<</message>>
<br/>
<<set _passage = $args[0]>>
<<set _keywords = []>>
<<for _iqdiff, _qdiff range setup.qdiff>>
<<if !_keywords.includes(_qdiff.diffname)>>
<<run _keywords.push(_qdiff.diffname)>>
<</if>>
<</for>>
<<for _ikeyword, _keyword range _keywords>>
<<capture _keyword>>
<<message _keyword>>
<<for _iqdiff, _qdiff range setup.qdiff>>
<<if _qdiff.diffname == _keyword>>
<<rep _qdiff>>
<<capture _qdiff>>
<<link '(select this)'>>
<<set _diffchosen = _qdiff>>
<<include _passage>>
<</link>>
<</capture>>
<br/>
<</if>>
<</for>>
<</message>>
<br/>
<</capture>>
<</for>>
<</focwidget>>
<<focwidget 'devchooseopportunity'>>
<p>
Search:
<<onevent 'input'>>
<<textbox '_chooseoppfilterunused' ''>>
<<onevent-callback>>
<<set _chooseoppfilter = _value>>
<<set _chooseoppshowall = 0>>
<<refreshable-refresh "#devchooseopplist0">>
<</onevent>>
<div>
<<refreshable id="devchooseopplist0">>
<<devchooseopportunitylist $args[0]>>
<</refreshable>>
</div>
</p>
<</focwidget>>
<!-- (internal, do not use directly) -->
<<focwidget 'devchooseopportunitylist'>>
<<if _chooseoppfilter>>
<p>Matching opportunities:</p>
<<set _cand = []>>
<<set _filter = _chooseoppfilter.toLowerCase()>>
<<for _iopp, _opp range setup.opportunitytemplate>>
<<if _opp.getName().toLowerCase().includes(_filter)>>
<<run _cand.push(_opp)>>
<</if>>
<</for>>
<<run _cand.sort((q1, q2) => q1.getDifficulty().getLevel() - q2.getDifficulty().getLevel())>>
<<set _subset = _chooseoppshowall ? _cand : _cand.slice(0, 20)>>
<<for _iopp, _opp range _subset>>
<<capture _opp>>
<<= _opp.getDifficulty().rep()>>:
<<rep _opp>>
<<link '(select this)'>>
<<set _opportunitychosen = _opp>>
<<include _passage>>
<</link>>
<br/>
<</capture>>
<</for>>
<<if _subset.length < _cand.length>> <!-- prevent showing too many matches at once -->
<p class="indented">
And <<= _cand.length - _subset.length >> more
<<link '(see all results)'>>
<<set _chooseoppshowall = 1>>
<<refreshable-refresh "#devchooseopplist0">>
<</link>>
</p>
<<elseif !_cand.length>>
<p class="indented">
(No matches)
</p>
<</if>>
<<else>>
<p>
Where is the opportunity located?
<<message '(?)'>>
If it does not have an opportunity location, it will be at the bottom option "Other Quests".
<</message>>
</p>
<<set _passage = $args[0]>>
<<set _found = {}>>
<<for _iopportunitypool, _opportunitypool range setup.questpool>>
<<set _qkeys = Object.keys(_opportunitypool.opportunity_template_rarity_map)>>
<<for _z, _iqkey range _qkeys>>
<<set _found[_iqkey] = true>>
<</for>>
<<capture _opportunitypool>>
<<set _text = `Opportunities in ${_opportunitypool.getName()}`>>
<<message _text>>
<<set _qkeys = Object.keys(_opportunitypool.opportunity_template_rarity_map)>>
<<run _qkeys.sort((q1, q2) => setup.opportunitytemplate[q1].getDifficulty().getLevel() - setup.opportunitytemplate[q2].getDifficulty().getLevel())>>
<<for _z, _iqkey range _qkeys>>
<<set _opportunitytemplate = setup.opportunitytemplate[_iqkey]>>
<<capture _opportunitytemplate>>
<<= _opportunitytemplate.getDifficulty().rep()>>:
<<rep _opportunitytemplate>>
<<link '(select this)'>>
<<set _opportunitychosen = _opportunitytemplate>>
<<include _passage>>
<</link>>
<br/>
<</capture>>
<</for>>
<</message>>
<br/>
<</capture>>
<</for>>
<<message 'Other Quests'>>
<<set _cand = []>>
<<for _iopportunity, _opportunity range setup.opportunitytemplate>>
<<if !_found[_opportunity.key]>>
<<run _cand.push(_opportunity)>>
<</if>>
<</for>>
<<run _cand.sort((q1, q2) => q1.getDifficulty().getLevel() - q2.getDifficulty().getLevel())>>
<<for _iopportunity, _opportunity range _cand>>
<<capture _opportunity>>
<<= _opportunity.getDifficulty().rep()>>:
<<rep _opportunity>>
<<link '(select this)'>>
<<set _opportunitychosen = _opportunity>>
<<include _passage>>
<</link>>
<br/>
<</capture>>
<</for>>
<</message>>
<</if>>
<</focwidget>>
<!-- Care: must be reentrant (temporary variables may get overwritten by recursion) -->
<<focwidget 'devlistentry'>>
<<set _entrypath = $args[0]>>
<<set _addpassage = $args[1]>>
<<set _passage = $args[2]>>
<<set _ientry = $args[3]>> <!-- _ientry === null: a fixed single entry (e.g. 'if' condition) instead of a list -->
<<set _entry = $args[4]>>
<<set _listpath = $args[5]>>
<<set _sameline = $args[6]>> <!-- if true, don't add br -->
<<if !_entry>> <!-- handle undefined/null gracefully -->
<div @style="_sameline ? 'display: inline-block' : ''">
Invalid
<<capture _listpath, _ientry>>
<<link '(delete)' _passage>>
<<run setup.evalJsPath(_listpath).splice(_ientry, 1)>>
<</link>>
<</capture>>
</div>
<<elseif _entry.getLayout>> <!-- recursive entry (do all block, if/then/else, etc) -->
<<set _layout = _entry.getLayout()>>
<div @class="_layout.css_class || ''">
<div style="float: right">
<<if $args[3] === null>> <!-- _ientry === null -->
<!-- replace block button -->
<<capture _passage, _entrypath>>
<<link '(replace)' $args[1]>>
<<set $qPassageName = _passage>>
<<set $qJsPath = _entrypath>>
<<set $qListIndex = null>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</capture>>
<<else>> <!-- _ientry !== null -->
<!-- delete recursive block button -->
<<set _listpath = $args[5]>>
<<capture _ientry, _listpath>>
<<link '(delete block)' $args[2]>>
<<run setup.evalJsPath(_listpath).splice(_ientry, 1)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<<if _ientry > 0>>
<<link '<<icon up-dir "Move up">>' _passage>>
<<run setup.swapValues(setup.evalJsPath(_listpath), _ientry, _ientry - 1)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</if>>
<<if _ientry < setup.evalJsPath(_listpath).length - 1>>
<<link '<<icon down-dir "Move down">>' _passage>>
<<run setup.swapValues(setup.evalJsPath(_listpath), _ientry, _ientry + 1)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</if>>
<</capture>>
<</if>>
</div>
<<for _iblock, _block range _layout.blocks>>
<div>
<<if _block.passage>>
<!-- allow passages to access args (e.g. actor name) via '_entry' -->
<<set _entry = $args[4]>>
<<include _block.passage>>
<</if>>
<<set _childaddpassage = _block.addpassage || $args[1]>>
<<if _block.listpath>>
<<set _childpath = $args[0] + _block.listpath>>
<<devlist _childpath '(add)' _childaddpassage $args[2]>>
<<elseif _block.entrypath>>
<<set _childpath = $args[0] + _block.entrypath>>
<<set _childentry = setup.evalJsPath(_childpath)>>
<<devlistentry _childpath _childaddpassage $args[2] null _childentry null _block.sameline>>
<</if>>
</div>
<</for>>
</div>
<<else>> <!-- regular entry -->
<div @style="_sameline ? 'display: inline-block' : ''">
<<= _entry.explain()>>
<<capture _ientry, _entry, _entrypath, _listpath, _passage, _addpassage>>
<!-- edit entry button -->
<!--<<set _editpassage = (_entry.passage && _entry.passage()) || _entry.PASSAGE>>
<<run _editpassage || console.log("[DevTool] PASSAGE not defined for class of entry ", _entry.text(), _entry)>>
<<if _editpassage && tags(_editpassage).includes('editable')>>
<<capture _editpassage>>
<<link '(edit)' _editpassage>>
<<set $qPassageName = _passage>>
<<set $qJsPath = _listpath>>
<<set $qListIndex = _ientry>>
<<if _addpassage.includes("Restriction")>>
<<set $qrestriction = _entry>>
<<else>>
<<set $qcost = _entry>>
<</if>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</capture>>
<</if>>-->
<<if _ientry === null>>
<!-- replace entry button -->
<<link '(replace)' _addpassage>>
<<set $qPassageName = _passage>>
<<set $qJsPath = _entrypath>>
<<set $qListIndex = null>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<<else>>
<!-- move entry buttons -->
<<if _ientry > 0>>
<<link '<<icon up-dir "Move up">>' _passage>>
<<run setup.swapValues(setup.evalJsPath(_listpath), _ientry, _ientry - 1)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</if>>
<<if _ientry < setup.evalJsPath(_listpath).length - 1>>
<<if _ientry === 0>> <</if>>
<<link '<<icon down-dir "Move down">>' _passage>>
<<run setup.swapValues(setup.evalJsPath(_listpath), _ientry, _ientry + 1)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</if>>
<!-- delete entry button -->
<<link '<<icon cancel "Delete">>' _passage>>
<<run setup.evalJsPath(_listpath).splice(_ientry, 1)>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</if>>
<</capture>>
</div>
<</if>>
<</focwidget>>
<!-- Care: must be reentrant (temporary variables may get overwritten by recursion) -->
<<focwidget 'devlist'>>
<<set _listpath = $args[0]>>
<<set _addtext = $args[1]>>
<<set _addpassage = $args[2]>> <!-- passage called to add/replace an entry (e.g. QGAddCostUnit) -->
<<set _passage = $args[3]>> <!-- passage to return to after adding/editing -->
<!-- Add entry to recursive block button -->
<<capture _listpath, _passage>>
<<link _addtext _addpassage>>
<<set $qPassageName = _passage>>
<<set $qJsPath = _listpath>>
<<set $qListIndex = -1>>
<<run setup.DevToolHelper.saveScrollPos()>>
<</link>>
<</capture>>
<<if !(setup.evalJsPath($args[0]) || []).length>>
<div class="graytext">(empty)</div>
<</if>>
<<for _ientry, _entry range (setup.evalJsPath($args[0]) || [])>>
<!-- use $args instead of temporary variables, cause recursion breaks them... -->
<<set _entrypath = $args[0] + '[' + _ientry + ']'>>
<<devlistentry _entrypath $args[2] $args[3] _ientry _entry $args[0]>>
<</for>>
<</focwidget>><!-- Called by QGCostDone and QGRestrictionDone, with the result at '_entry' -->
<!-- [DEBUG]: Uncomment line below to report all changes (add/edit/replace) -->
<!--<<run console.log("DevAddEntry", $qJsPath, $qListIndex, _entry)>>-->
<<if $qListIndex === null>>
<!-- null: not a list but a single root cost/restriction, so replace it -->
<<run setup.evalJsPathAssign($qJsPath, undefined, _entry)>>
<<else>>
<<set _list = setup.evalJsPath($qJsPath)>>
<<if $qListIndex === -1>>
<!-- -1: push at the end of the list -->
<<run _list.push(_entry)>>
<<else>>
<!-- >= 0: replace the i-th entry -->
<<run _list[$qListIndex] = _entry>>
<</if>>
<</if>>
<<unset $qJsPath>>
<<unset $qListIndex>>
<<unset $qgDefaultActorName>>
<<gotowipehistory $qPassageName>><<include 'InitDutyBedchamberSlave'>>
<<include 'InitDutyDamageControlOfficer'>>
<<include 'InitDutyDoctor'>>
<<include 'InitDutyInsurer'>>
<<include 'InitDutyMarketer'>>
<<include 'InitDutyMystic'>>
<<include 'InitDutyPimp'>>
<<include 'InitDutyRelationshipManager'>>
<<include 'InitDutyRescuer'>>
<<include 'InitDutyTrainer'>>
<<include 'InitDutyViceLeader'>>
<<include 'InitDutyScout'>>
<<include 'InitDutyPrestigeSlave'>><<run setup.DutyTemplate.create('BedchamberSlave', {
subclass: setup.DutyTemplate.BedchamberSlave,
name: 'Bedchamber Slave',
description_passage: 'DutyBedchamberSlave',
type: 'bedchamber',
unit_restrictions: [setup.qs.job_slave],
})>><p>
Private slave to whoever is given ownership of
<<= _gDuty.getBedchamber().rep()>>.
Once the slave bonds with their owner, will improve the owner's skills
a tiny amount.
More effective for slavers who tend to stay at your fort and does not go on quests.
</p><<run setup.DutyTemplate.create('DamageControlOfficer', {
subclass: setup.DutyTemplate.DamageControlOfficer,
name: 'Damage Control Officer',
description_passage: 'DutyDamageControlOfficer',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
knowledge: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
intrigue: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_intimidating: setup.DUTY_TRAIT_CRIT_CHANCE,
per_deceitful: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_honest: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Responsible for minimizing anger from other factions.
Has a chance to reduce the anger from other faction,
but in exchange for <<money setup.IRE_DCO_PAY>> each time.
(If the chance is higher than 100%, then there is a chance that the
ire will be reduced further, but in exchange for <<money setup.IRE_DCO_PAY_CRIT>>.)
</p><<run setup.DutyTemplate.create('Doctor', {
name: 'Doctor',
description_passage: 'DutyDoctor',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
aid: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
arcane: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
magic_light_master: setup.DUTY_TRAIT_CRIT_CHANCE,
magic_light: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_kind: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_cruel: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Helps with injury recovery.
The doctor each week
heals up to <<= setup.DOCTOR_ATTEMPTS >> weeks of injuries,
each with the trigger chance.
(If the chance is higher than 100%, then there is a chance that the doctor will heal even more injuries.)
</p><<run setup.DutyTemplate.create('Insurer', {
name: 'Insurer',
description_passage: 'DutyInsurer',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
intrigue: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
survival: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_creative: setup.DUTY_TRAIT_CRIT_CHANCE,
per_cautious: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_brave: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Has a chance to
grant you money each time a quest resulted in failure or disaster.
(If the chance is higher than 100%, then there is a chance that you will get even more money.)
</p><<run setup.DutyTemplate.create('Marketer', {
subclass: setup.DutyTemplate.Marketer,
name: 'Marketer',
description_passage: 'DutyMarketer',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
slaving: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
social: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_connected: setup.DUTY_TRAIT_CRIT_CHANCE,
per_gregarious: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_loner: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Grants you a fixed-priced
slave orders at the end of each week with some chance.
The price depends on your marketer's level.
(If the chance is higher than 100%, then there is a chance that the order found will have higher than usual price.)
</p><<run setup.DutyTemplate.create('Mystic', {
name: 'Mystic',
description_passage: 'DutyMystic',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
arcane: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
knowledge: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_alchemy: setup.DUTY_TRAIT_CRIT_CHANCE,
per_studious: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_active: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Reduces injury duration.
Whenever a unit is injured, the mystic has a chance to reduce the injury
duration. (Maximum <<= setup.MYSTIC_MAX_INJURY>> weeks of injuries prevented per unit.)
(If the chance is higher than 100%, then there is a chance that the mythic will further decrease the injury duration.)
</p><<run setup.DutyTemplate.create('Pimp', {
subclass: setup.DutyTemplate.Pimp,
name: 'Pimp',
description_passage: 'DutyPimp',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
sex: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
slaving: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_entertain: setup.DUTY_TRAIT_CRIT_CHANCE,
per_playful: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_serious: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Grants money
each week based on prestige.
At the end of each week,
has a chance to
grant you around <<money setup.PIMP_PRESTIGE_MULTIPLIER >> for every prestige your company have,
as profits from the operation of your recreation wing.
(If the chance is higher than 100%, then there is a chance that the pimp will generate even more money.)
The money gained per week is capped at
<<money setup.dutytemplate.Pimp.getMoneyCap()>>.
You can increase this cap by upgrading your <<rep setup.buildingtemplate.recreationwing>>.
</p><<run setup.DutyTemplate.PrestigeSlave.create(
'AnalFuckholeSlave',
'Anal Fuckhole Slave',
'DutyAnalFuckholeSlave',
{
training_anal_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_anal_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_anal_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_calm: setup.DUTY_TRAIT_PRESTIGE2,
anus_tight: setup.DUTY_TRAIT_PRESTIGE1,
per_aggressive: -setup.DUTY_TRAIT_PRESTIGE2,
anus_gape: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_anal_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'ServerSlave',
'Server Slave',
'DutyServerSlave',
{
training_edging_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_edging_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_edging_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_generous: setup.DUTY_TRAIT_PRESTIGE2,
skill_alchemy: setup.DUTY_TRAIT_PRESTIGE2,
per_thrifty: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_edging_basic),
],
[
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'ToiletSlave',
'Toilet Slave',
'DutyToiletSlave',
{
training_toilet_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_toilet_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_toilet_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_slow: setup.DUTY_TRAIT_PRESTIGE2,
per_brave: setup.DUTY_TRAIT_PRESTIGE2,
per_smart: -setup.DUTY_TRAIT_PRESTIGE2,
per_cautious: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_toilet_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'MaidSlave',
'Maid Slave',
'DutyMaidSlave',
{
training_domestic_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_domestic_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_domestic_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_chaste: setup.DUTY_TRAIT_PRESTIGE2,
skill_ambidextrous: setup.DUTY_TRAIT_PRESTIGE2,
per_lustful: -setup.DUTY_TRAIT_PRESTIGE2,
per_sexaddict: -setup.DUTY_TRAIT_PRESTIGE3,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_domestic_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'FurnitureSlave',
'Furniture Slave',
'DutyFurnitureSlave',
{
training_endurance_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_endurance_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_endurance_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_loner: setup.DUTY_TRAIT_PRESTIGE2,
per_serious: setup.DUTY_TRAIT_PRESTIGE2,
per_gregarious: -setup.DUTY_TRAIT_PRESTIGE2,
per_playful: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_endurance_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'PunchingBagSlave',
'Punching Bag Slave',
'DutyPunchingBagSlave',
{
training_masochist_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_masochist_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_masochist_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_masochistic: setup.DUTY_TRAIT_PRESTIGE2,
per_tough: setup.DUTY_TRAIT_PRESTIGE2,
per_nimble: -setup.DUTY_TRAIT_PRESTIGE2,
per_lunatic: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_masochist_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'DogSlave',
'Dog Slave',
'DutyDogSlave',
{
training_pet_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_pet_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_pet_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_playful: setup.DUTY_TRAIT_PRESTIGE2,
per_loyal: setup.DUTY_TRAIT_PRESTIGE2,
per_serious: -setup.DUTY_TRAIT_PRESTIGE2,
per_independent: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_pet_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'DecorationSlave',
'Decoration Slave',
'DutyDecorationSlave',
{
training_horny_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_horny_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_horny_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_lustful: setup.DUTY_TRAIT_PRESTIGE2,
per_sexaddict: setup.DUTY_TRAIT_PRESTIGE2,
skill_ambidextrous: setup.DUTY_TRAIT_PRESTIGE2,
per_chaste: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_horny_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'OralFuckholeSlave',
'Oral Fuckhole Slave',
'DutyOralFuckholeSlave',
{
training_oral_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_oral_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_oral_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_submissive: setup.DUTY_TRAIT_PRESTIGE2,
face_attractive: setup.DUTY_TRAIT_PRESTIGE2,
face_beautiful: setup.DUTY_TRAIT_PRESTIGE3,
per_dominant: -setup.DUTY_TRAIT_PRESTIGE2,
face_ugly: -setup.DUTY_TRAIT_PRESTIGE2,
face_hideous: -setup.DUTY_TRAIT_PRESTIGE3,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_oral_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'EntertainmentSlave',
'Entertainment Slave',
'DutyEntertainmentSlave',
{
training_obedience_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_obedience_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_obedience_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
skill_entertain: setup.DUTY_TRAIT_PRESTIGE2,
per_gregarious: setup.DUTY_TRAIT_PRESTIGE2,
per_loner: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_obedience_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'PonySlave',
'Pony Slave',
'DutyPonySlave',
{
training_pony_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_pony_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_pony_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
skill_animal: setup.DUTY_TRAIT_PRESTIGE2,
muscle_strong: setup.DUTY_TRAIT_PRESTIGE1,
muscle_verystrong: setup.DUTY_TRAIT_PRESTIGE2,
muscle_extremelystrong: setup.DUTY_TRAIT_PRESTIGE3,
muscle_weak: -setup.DUTY_TRAIT_PRESTIGE1,
muscle_veryweak: -setup.DUTY_TRAIT_PRESTIGE2,
muscle_extremelyweak: -setup.DUTY_TRAIT_PRESTIGE3,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_pony_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'DominatrixSlave',
'Dominatrix Slave',
'DutyDominatrixSlave',
{
training_dominance_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_dominance_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_dominance_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_dominant: setup.DUTY_TRAIT_PRESTIGE2,
skill_hypnotic: setup.DUTY_TRAIT_PRESTIGE2,
per_submissive: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_dominance_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'TheatreSlave',
'Stripper Slave',
'DutyTheatreSlave',
{
training_sissy_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_sissy_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_sissy_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_dreamy: setup.DUTY_TRAIT_PRESTIGE2,
skill_creative: setup.DUTY_TRAIT_PRESTIGE2,
per_attentive: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_sissy_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'VaginaFuckholeSlave',
'Vagina Fuckhole Slave',
'DutyVaginaFuckholeSlave',
{
training_vagina_basic: setup.DUTY_TRAIT_PRESTIGE1,
training_vagina_advanced: setup.DUTY_TRAIT_PRESTIGE3,
training_vagina_master: setup.DUTY_TRAIT_PRESTIGE5,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
per_generous: setup.DUTY_TRAIT_PRESTIGE2,
vagina_tight: setup.DUTY_TRAIT_PRESTIGE1,
per_thrifty: -setup.DUTY_TRAIT_PRESTIGE2,
vagina_gape: -setup.DUTY_TRAIT_PRESTIGE2,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_vagina_basic),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'CumCowSlave',
'Cum Cow Slave',
'DutyCumCowSlave',
{
balls_tiny: setup.DUTY_TRAIT_PRESTIGE1,
balls_small: setup.DUTY_TRAIT_PRESTIGE2,
balls_medium: setup.DUTY_TRAIT_PRESTIGE3,
balls_large: setup.DUTY_TRAIT_PRESTIGE4,
balls_huge: setup.DUTY_TRAIT_PRESTIGE5,
balls_titanic: setup.DUTY_TRAIT_PRESTIGE6,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.balls_tiny),
setup.qres.Trait(setup.trait.dick_tiny),
],
)>>
<<run setup.DutyTemplate.PrestigeSlave.create(
'MilkCowSlave',
'Milk Cow Slave',
'DutyMilkCowSlave',
{
breast_tiny: setup.DUTY_TRAIT_PRESTIGE1,
breast_small: setup.DUTY_TRAIT_PRESTIGE2,
breast_medium: setup.DUTY_TRAIT_PRESTIGE3,
breast_large: setup.DUTY_TRAIT_PRESTIGE4,
breast_huge: setup.DUTY_TRAIT_PRESTIGE5,
breast_titanic: setup.DUTY_TRAIT_PRESTIGE6,
value_high1: setup.DUTY_TRAIT_PRESTIGE1,
value_high2: setup.DUTY_TRAIT_PRESTIGE2,
value_high3: setup.DUTY_TRAIT_PRESTIGE3,
value_high4: setup.DUTY_TRAIT_PRESTIGE4,
value_high5: setup.DUTY_TRAIT_PRESTIGE5,
value_high6: setup.DUTY_TRAIT_PRESTIGE6,
},
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.breast_tiny),
],
)>><p>
Slave stationed in the recreation wing to entertain its users.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the anal fuckhole station of the recreation wing.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the vagina fuckhole station of the recreation wing.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the oral fuckhole station of the recreation wing.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the bar of the recreation wing, responsible for sucking the dicks of the customers
of the bar without bringing them to climax.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the bath area of the recreation wing, as an alternative to normal urinals.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the cleaning area of the recreation wing, responsible both for cleaning the area,
and for being fucked whenever a customer desires.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the courtyard of the recreation wing, to be used as a furniture by the customers.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the gym of the recreation wing, a living punching bag that loves being punched hard.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the kennel of the recreation wing --- a playful companion that likes to play fetch.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the museum of the recreation wing, as an exhibit displaying aroused human body.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the stables of the recreation wing, which can be used as transportation between various entertainment.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the stage of the recreation wing, which dazzle customers with bondage shows.
Increases prestige based on the slave's traits.
</p><p>
Slave stationed in the theatre area of the recreation wing, which shows nude plays.
Increases prestige based on the slave's traits.
</p><p>
Slaves installed in the taverns as an alternative source of fresh cream for either consumption or play.
Increases prestige based on the slave's traits.
</p><p>
Slaves roaming the pastures acting as a source of fresh milk for patrons.
Increases prestige based on the slave's traits.
</p><<run setup.DutyTemplate.QuestPoolDuty.create(
'ScoutVale',
`Vale Scout`,
'DutyScoutVale',
{
brawn: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
survival: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
{
skill_intimidating: setup.DUTY_TRAIT_CRIT_CHANCE,
per_loner: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_gregarious: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
setup.questpool.vale,
3, /* amount */
)>>
<<run setup.DutyTemplate.QuestPoolDuty.create(
'ScoutForest',
`Forest Scout`,
'DutyScoutForest',
{
survival: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
arcane: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
{
skill_animal: setup.DUTY_TRAIT_CRIT_CHANCE,
per_nimble: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_tough: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
setup.questpool.forest,
2, /* amount */
)>>
<<run setup.DutyTemplate.QuestPoolDuty.create(
'ScoutCity',
`City Scout`,
'DutyScoutCity',
{
social: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
sex: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
{
skill_hypnotic: setup.DUTY_TRAIT_CRIT_CHANCE,
per_curious: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_stubborn: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
setup.questpool.city,
2, /* amount */
)>>
<<run setup.DutyTemplate.QuestPoolDuty.create(
'ScoutDesert',
`Desert Scout`,
'DutyScoutDesert',
{
combat: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
brawn: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
{
skill_ambidextrous: setup.DUTY_TRAIT_CRIT_CHANCE,
per_aggressive: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_calm: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
setup.questpool.desert,
1, /* amount */
)>>
<<run setup.DutyTemplate.QuestPoolDuty.create(
'ScoutSea',
`Sea Scout`,
'DutyScoutSea',
{
combat: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 3,
slaving: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 3,
},
{
skill_flight: setup.DUTY_TRAIT_CRIT_CHANCE / 3,
per_honorable: setup.DUTY_TRAIT_NORMAL_CHANCE / 3,
per_evil: setup.DUTY_TRAIT_NORMAL_CHANCE / 3,
},
setup.questpool.sea,
1, /* amount */
)>><p>
Has a chance to grant quests from <<= setup.questpool.vale.rep() >>.
(If the chance is higher than 100%, then there is a chance that even more quests will be found.)
</p><p>
Has a chance to grant quests from <<= setup.questpool.forest.rep() >>.
(If the chance is higher than 100%, then there is a chance that even more quests will be found.)
</p><p>
Has a chance to grant quests from <<= setup.questpool.city.rep() >>.
(If the chance is higher than 100%, then there is a chance that even more quests will be found.)
</p><p>
Has a chance to grant quests from <<= setup.questpool.desert.rep() >>.
(If the chance is higher than 100%, then there is a chance that even more quests will be found.)
</p><p>
Has a chance to grant quests from <<= setup.questpool.sea.rep() >>.
(If the chance is higher than 100%, then there is a chance that even more quests will be found.)
</p><<run setup.DutyTemplate.create('RelationshipManager', {
name: 'Relationship Manager',
description_passage: 'DutyRelationshipManager',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
aid: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
social: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_connected: setup.DUTY_TRAIT_CRIT_CHANCE,
per_smart: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_slow: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>><p>
Responsible for smoothing it out with all the other forces out there.
Prevents favor decay on some chosen companies.
The number of companies the manager can manage is determined by the
trigger chance -- the higher it is, the more companies the manager can
manage at the same time.
This duty costs <<dangertextlite "upkeep">>,
which is higher when the manager is managing a large number of companies.
</p>
<<include 'RelationshipManagerDescribe'>><<run setup.DutyTemplate.create('Rescuer', {
subclass: setup.DutyTemplate.Rescuer,
name: 'Rescuer',
description_passage: 'DutyRescuer',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
intrigue: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 6,
aid: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 6,
},
relevant_traits:{
skill_creative: setup.DUTY_TRAIT_CRIT_CHANCE / 3,
per_aggressive: setup.DUTY_TRAIT_NORMAL_CHANCE / 3,
per_calm: -setup.DUTY_TRAIT_NORMAL_CHANCE / 3,
},
})>><p>
Your slaver's best friend.
The rescuer will occassionally generate a quest that can possibly rescue one of
your lost slaves/slavers, if any.
This is a difficult duty, however, and the chance is generally not high.
</p><<run setup.DutyTemplate.create('Trainer', {
name: 'Drill Sergeant',
description_passage: 'DutyTrainer',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
brawn: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
knowledge: setup.DUTY_SKILL_MULTIPLIER_TOTAL / 2,
},
relevant_traits:{
skill_intimidating: setup.DUTY_TRAIT_CRIT_CHANCE,
per_dominant: setup.DUTY_TRAIT_NORMAL_CHANCE,
per_submissive: -setup.DUTY_TRAIT_NORMAL_CHANCE,
},
})>>
/*
<<run setup.dutytemplate.Trainer.onWeekend = function(unit) {
setup.questpool.training.generateQuest()
}>>
*/<p>
Gives EXP to your slavers.
The drill sergeant has a chance to
give each unit on duty (including themselves) some exp each week.
(If the chance is higher than 100%, then there is a chance that the drill sergeant
will give even more exp.)
The drill sergeant is also required to do level catch-up quests.
</p><<run setup.DutyTemplate.create('ViceLeader', {
name: 'Vice Leader',
description_passage: 'DutyViceLeader',
type: 'util',
unit_restrictions: [setup.qs.job_slaver],
relevant_skills: {
combat: 0.001,
brawn: 0.001,
survival: 0.001,
intrigue: 0.001,
slaving: 0.001,
knowledge: 0.001,
social: 0.001,
aid: 0.001,
arcane: 0.001,
sex: 0.001,
},
relevant_traits:{
},
})>><p>
Your second in command, who helps you with everything.
You gain <<= Math.round(setup.VICELEADER_SKILL_MULTI * 100)>>% of each of the vice leader's skills (i.e,
<<for _iskill, _skill range setup.skill>><<rep _skill>><</for>>
).
(The trigger chance does not actually do anything.)
</p>/* By FCDev from Free Cities game */
<<set $i1 = {}>>
<<set $i2 = {}>>
<<pronounload $i1 _u>>
<<pronounload $i2 _victim>>
<<if _u.isHasDick() && _u.isHasTrait(setup.trait.eq_chastity)>>
<<set _hasdick = true>>
<<else>>
<<set _hasdick = false>>
<</if>>
You quietly head over to the doctor's office door.
As you get closer and close,
you hear a quiet moaning and the distinct noise of flesh on flesh.
Peeking into the office, you see <<rep _u>> between
$i1.his patient slave <<rep _victim>>'s legs,
who are lying on top of the doctor's table and
spread wide by makeshift stirrups made from weapon sheathes.
<<if _hasdick>>
$i1.He's pounding eagerly away and mauling $i1.his patient's
bare <<ubreast _victim>> with both <<uhands _u>>.
<<else>>
$i1.He's using one <<uhand _u>> to fingerfuck $i1.his patient, and the other to masturbate furiously.
<</if>>
Sensing nothing wrong with a little fun on the job, you leave
your <<uadjper _u>> doctor alone.
<<questauthorcardtext 'FCDev (Free Cities)'>>/* By FCDev from Free Cities game */
<<set $i = {}>>
<<pronounload $i _u>>
You bring <<= _u.getName()>> back to your office.
You cuff $i.his wrists and ankles,
bend all four limbs behind $i.him,
secure them together, and hoist $i.him up to the ceiling on a rope.
$i.He hangs up ther like a sex slave chandelier, $i.his
<<if _u.isHasDick()>><<udick _u>> swaying<<else>>
<<ubreasts _u>> swaying<</if>>
in a lovely way whenever $i.he moves.
Periodically you let $i.him down to stretch $i.his aching limbs,
but whenever you put your decoration back up you add some clips with little bells on them:
first the nose, then the nipples, and finally the
<<if _u.isHasDick()>>dickhead<<else>>pussylips<</if>>.
By the end of the day your work is accompanied by the sweet sounds of ringing bells and
stoic moans, which makes your work less dull.
<<questauthorcardtext 'FCDev (Free Cities)'>><<set $i = {}>>
<<pronounload $i _u>>
When $i.he saw you approaching, <<= _u.getName()>> stops the scrubbing and immediately switched
$i.his attention to you, asking if there is anything $i.he can do for you.
<<if Math.random() < 0.5>>
You instruct $i.him to go back to what $i.he was doing.
$i.He gets back to $i.his knees,
puzzled, and then gasps when $i.he finds
<<if !$unit.player.isHasDick()>>your fingers<<else>>your cockhead<</if>>
pressing against $i.his
<<if _u.isHasVagina()>>rosebud<<else>>asshole<</if>>.
You instruct $i.him imperiously to get on with it,
and $i.he soon understands your intent.
$i.He scrubs back and forth, panting and moaning, as you buttfuck $i.him
in time with $i.his labors<<if $unit.player.isHasDick()>>,
using your other <<uhand $unit.player>> to look after yourself<<elseif $unit.player.isHasVagina()>>,
using your other <<uhand $unit.player>> to shlick your pussy while you pound $i.him<</if>>.
You even carefully scoot along with $i.him when $i.he needs to reach new spots.
By the time $i.he's done $i.his <<ulegs _u>>, <<uarms _u>> and $i.his <<uanus _u>> are very tired.
<<else>>
<<if !setup.Text.Unit.Equipment.isNaked(_u)>>
You instruct $i.him to strip off
$i.his clothes and lay $i.his back against the floor.
<<ustriptorso _u>>
<<ustriplegs _u>>
<<else>>
You instruct $i.him to lay $i.his back against the floor.
<</if>>
You empty a bottle of lubricating potion across $i.his entire body.
$i.He gasps from the cold fluid.
You slide around on the floor with $i.him,
playfully scrubbing $i.his <<ubody _u>>
around in the pool of lube,
playing with $i.his wet <<ubreast _u>> and $i.his lubricated <<ulegs _u>> before
<<if !$unit.player.isHasDick()>>
wrestling the slick slave onto $i.his back so you can ride $i.his <<uface _u>>
while reaching down to spread $i.his legs and molest $i.his ass<<else>>
sinking your <<udick $unit.player>> into $i.his
<<if _u.isHasVagina()>>
now-slick pussy and then $i.his relaxing butthole
<<else>>
now-slick butthole
<</if>>
<<if $unit.player.isHasVagina()>>
followed by some grinding to coat $i.his face in your pussyjuice<</if>><</if>>
Both you and the slave $i.he had fun for a while before getting back to your work.
<</if>>
<<questauthorcardtext 'FCDev (Free Cities)'>><<set $i = {}>>
<<pronounload $i _u>>
<<if Math.random() < 0.5>>
You head toward the utility area with the cow milkers,
and <<= _u.getName()>> follows eagerly behind you,
pleased you'd do this for $i.him and very ready to relieve the pressure in $i.his tits.
You seat yourself on a stool
and draw $i.him onto your lap rather.
Reaching behind yourself, you give the cow on your lap a broad bucket,
and tell $i.him to hold it
on $i.his lap.
Then you reach around $i.him and take $i.his
<<ubreasts _u>>
in your <<uhands $unit.player>>.
She gasps as $i.he realizes exactly how you plan to do this,
and adjusts the bucket so it's below both of $i.his nipples at once.
<br><br>
You gave $i.her a methodical massage of $i.his breasts, both at once.
<<if _u.isHasTrait(setup.trait.breast_medium)>>
They're large enough to be more than a single handful, so you go bit by bit,
ensuring that no part of $i.his udders goes untouched.
<</if>>
Her nipples start to gush milk without help after a few moments of this,
and $i.he groans with relief and satisfaction as $i.he
feels $i.his breasts begin to empty and enjoys the sensation of the massage.
After you're satisfied, you move your <<uhands $unit.player>> to $i.his nipples and milk $i.him like a cow,
getting the last drops of milk out of $i.him.
When $i.he's done, $i.he leans back into you for a moment before setting the milk bucket
down.
<<else>>
You decided to treat <<= _u.getName()>> like the cow $i.he is
You lead $i.him to the utility area of the pasture,
where the cow milkers are.
You fetch a pair of low stools, make $i.him kneel on one, and put $i.his <<uhands _u>> on the other,
so $i.he's on all fours with $i.his udders hanging beneath $i.his
<<ubreast _u>>.
<br><br>
You swing a bucket under $i.his nipples and milk $i.him by hand,
as though $i.he were a cow.
This isn't exactly what $i.he had in mind, but the feeling of your <<uhands $unit.player>>
on $i.his nipples, tugging the streams of milk out of $i.him
and into the bucket beneath
eventually relaxes $i.him.
Seeing this, you muse aloud, as though to yourself,
that a little farmyard bestiality wouldn't hurt,
since there's no one there but you and a dairy cow.
Pawing the cow's behind possessively,
you finger $i.him aggressively before deciding on
<<if $unit.player.isHasVagina()>>
a little cow tongue action.
You stand up and grind your pussy against the cow's upturned <<umouth _u>>,
humping $i.his face hard enough to shake the drops of milk still clinging to
$i.his sore nipples down and into the bucket below.
<<if $unit.player.isHasDick()>>
You pull away when you're about halfway there,
only to shove your cock down $i.his throat instead.
<</if>>
When you're finished,
you step away, leaving $i.his face thoroughly coated in
girlcum
<<if $unit.player.isHasDick()>>
and $i.his mouth full of your load<</if>>,
<<elseif _u.isHasVagina()>>
a little cow pussy.
<<ustripvagina _u>>
You walk around behind $i.him and fuck $i.him
hard enough to shake the drops of milk still clinging
to $i.his sore nipples down and into the bucket below.
When you're finished,
you step away, leaving your cum to run out of $i.his cunt and down $i.his <<ulegs _u>>,
<<else>>
some cow ass.
<<ustripanus _u>>
You walk around behind $i.him and buttfuck $i.him hard enough to
shake the drops of milk still clinging to $i.his sore
nipples down and into the bucket below. When you're finished,
you step away, leaving your cum to drip out of $i.his asshole,
<</if>>
<</if>>
<<questauthorcardtext 'FCDev (Free Cities)'>><<set $i = {}>>
<<pronounload $i _u>>
$i.He comes eagerly over and sucks you off with enthusiasm.
As you cum, $i.he orgasms quickly at the taste of the stuff hitting $i.his <<umouth _u>>,
before complimenting the taste.
<<questauthorcardtext 'FCDev (Free Cities)'>><<set $i = {}>>
<<pronounload $i _u>>
You order a refreshment to go with some
<<if $unit.player.isHasDick()>>
a blowjob<<else>>some
cunnilingus<</if>>.
Turning to <<= _u.getName()>>, you
select a beverage, which <<= _u.getName()>> prompty serve.
You relieve the slave of the tray, and
widen your legs slightly in your chair.
$i.He immediately drops to $i.his knees and gets to work,
using all of her mastery at edging and giving oral pleasure.
You take your time, enjoying the combination of alcohol and <<if $unit.player.isHasDick()>>blowjob<<else>>rimjob<</if>>,
running a molesting <<uhand $unit.player>> on the slave's <<ubody _u>>.
/*
This isn't the first time you've done this, nor will it be the last,
and <<= _u.getName()>> is used to being used as a serving $i.man.
*/
<<questauthorcardtext 'FCDev (Free Cities)'>><<set setup.equipment = {}>>
<<include InitEquipmentCombat>>
<<include InitEquipmentBrawn>>
<<include InitEquipmentSurvival>>
<<include InitEquipmentIntrigue>>
<<include InitEquipmentSlaving>>
<<include InitEquipmentKnowledge>>
<<include InitEquipmentSocial>>
<<include InitEquipmentAid>>
<<include InitEquipmentArcane>>
<<include InitEquipmentSex>>
<<include InitEquipmentPet>>
<<include InitEquipmentPony>>
<<include InitEquipmentRestraint>>
<<include InitEquipmentSexToy>>
<<include InitEquipmentChastity>>
<<include InitEquipmentWeapon>>
<<include InitEquipmentOther>>
<<include InitEquipmentTexts>>
/* must be last: */
<<include InitEquipmentPoolGroup>>
<<run setup.EquipmentSet.initDefaultEquipmentSets()>><<set setup.EQUIPMENT_TEXTS = {
/* orc-born gauntlet */
combat_arms_master: {
description: 'An extremely well-crafted gauntlets suitable for the hardiest combatants. ' +
'It bear the craftsmanship of a master orcish blacksmith.',
flavor: 'The gauntlets bear the mark of a legendary orcish smith, truly a mastework equipment.' +
'It is said to grant whoever wear them great power like orcs of ancient times',
},
/* dark excalibur: */
slaving_weapon_master: {
description: 'Once the famous sword Excalibur, its purifying powers have been corrupted beyond recognition. ' +
'The corruption does not reduce its ego however, and the sword continues to refuse being wielded by anyone but the people it consider most honorable',
flavor: 'Even when fully corrupted, the sword remains beautiful in its stark nature.' +
'It is able to cut through flesh inflicting as much pain as possible without causing damage, truly a useful weapon for slavers',
},
weapon_broadsword: {
description: 'A masterfully crafted broadsword made using pure strong metal',
flavor: 'It is very heavy, and only the stronger slavers are able to wield it with deadly efficiency',
},
weapon_dualdagger: {
description: 'Masterfully crafted dual daggers for the stealthiest of assasins. Or assasin-wannabes',
flavor: 'With one dagger in each hand, an experienced assassin can make great use of such a weapon',
},
weapon_rapier: {
description: 'Masterfully crafted rapier guaranteed to give you the required edge for those damsel-winning duels',
flavor: 'The preferred weapon of the high nobility, but perhaps still useful for a slaving career',
},
weapon_log: {
description: 'An ordinary log bearing the inscriptions of a master blacksmith',
flavor: "If it's any consolation, the ladies are sure to be pleased seeing such a hard, thick piece of wood",
},
}>><<run new setup.Equipment(
'aid_torso',
'Healer Robe',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'torso_robes' },
)>>
<<run new setup.Equipment(
'aid_mouth',
'Healer Plague Mask',
setup.equipmentslot.mouth,
['accessory', 'plaguemask'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'eyes_mask_plague' },
)>>
<<run new setup.Equipment(
'aid_head',
'Healer Habit',
setup.equipmentslot.head,
['clothes'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'aid_arms',
'Healer Gloves',
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'aid_nipple',
'Healer Nipple Clamps',
setup.equipmentslot.nipple,
['accessory', 'nippleclamps'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
15, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'nipple_clamps' },
)>>
<<run new setup.EquipmentPool(
'aid',
{
aid_torso: 1,
aid_mouth: 1,
aid_arms: 1,
aid_head: 1,
aid_nipple: 1,
}
)>>
<<run new setup.Equipment(
'aid_torso_good',
'Saint Robe',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'torso_robes' },
)>>
<<run new setup.Equipment(
'aid_mouth_good',
'Saint Shroud',
setup.equipmentslot.mouth,
['accessory', 'mouthcover'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'neck_hood' },
)>>
<<run new setup.Equipment(
'aid_head_good',
'Saint Habit',
setup.equipmentslot.head,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'aid_arms_good',
'Saint Gloves',
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'aid_nipple_good',
'Saint Nipple Clamps',
setup.equipmentslot.nipple,
['accessory', 'nippleclamps',],
setup.EQUIPMENT_PRICE_GOOD, /* value */
15, /* sluttines */
{aid: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'nipple_clamps' },
)>>
<<run new setup.EquipmentPool(
'aid_good',
{
aid_torso_good: 1,
aid_mouth_good: 1,
aid_arms_good: 1,
aid_head_good: 1,
aid_nipple_good: 1,
}
)>><<run new setup.Equipment(
'arcane_torso',
'Wizard Robe',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'torso_robes' },
)>>
<<run new setup.Equipment(
'arcane_arms',
'Wizard Ring',
setup.equipmentslot.arms,
['ring'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'arms_ring' },
)>>
<<run new setup.Equipment(
'arcane_feet',
'Wizard Slippers',
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{},
)>>
<<run new setup.Equipment(
'arcane_head',
'Wizard Hat',
setup.equipmentslot.head,
['accessory', 'hat',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'head_hat_wizard' },
)>>
<<run new setup.Equipment(
'arcane_neck',
'Wizard Amulet',
setup.equipmentslot.neck,
['necklace'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'neck_necklace_star' },
)>>
<<run new setup.EquipmentPool(
'arcane',
{
arcane_torso: 1,
arcane_arms: 1,
arcane_head: 1,
arcane_feet: 1,
arcane_neck: 1,
}
)>>
<<run new setup.Equipment(
'arcane_torso_good',
'Archwizard Robe',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'torso_robes' },
)>>
<<run new setup.Equipment(
'arcane_arms_good',
'Archwizard Ring',
setup.equipmentslot.arms,
['ring'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'arms_ring' },
)>>
<<run new setup.Equipment(
'arcane_feet_good',
'Archwizard Slippers',
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{},
)>>
<<run new setup.Equipment(
'arcane_head_good',
'Archwizard Hat',
setup.equipmentslot.head,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'head_hat_wizard' },
)>>
<<run new setup.Equipment(
'arcane_neck_good',
'Archwizard Amulet',
setup.equipmentslot.neck,
['necklace'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{arcane: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'neck_necklace_star' },
)>>
<<run new setup.EquipmentPool(
'arcane_good',
{
arcane_torso_good: 1,
arcane_arms_good: 1,
arcane_head_good: 1,
arcane_feet_good: 1,
arcane_neck_good: 1,
}
)>><<run new setup.Equipment(
'brawn_neck',
"Brawler Cape",
setup.equipmentslot.neck,
['clothes', 'cape',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'brawn_rear',
"Brawler Boxers",
setup.equipmentslot.rear,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'brawn_arms',
"Brawler Gauntlets",
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
"brawn_mouth",
"Brawler Bandana",
setup.equipmentslot.mouth,
['accessory', 'mouthcover'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
"brawn_feet",
"Brawler Sandals",
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'feet_sandals' },
)>>
<<run new setup.EquipmentPool(
'brawn',
{
brawn_neck: 1,
brawn_rear: 1,
brawn_arms: 1,
brawn_feet: 1,
brawn_mouth: 1,
}
)>>
<<run new setup.Equipment(
'brawn_neck_good',
"Gladiator Cape",
setup.equipmentslot.neck,
['clothes', 'cape'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'brawn_rear_good',
"Gladiator Boxers",
setup.equipmentslot.rear,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
5, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'brawn_arms_good',
"Gladiator Gauntlets",
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
"brawn_mouth_good",
"Gladiator Bandana",
setup.equipmentslot.mouth,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
"brawn_feet_good",
"Gladiator Sandals",
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{brawn: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'feet_sandals' },
)>>
<<run new setup.EquipmentPool(
'brawn_good',
{
brawn_neck_good: 1,
brawn_rear_good: 1,
brawn_arms_good: 1,
brawn_feet_good: 1,
brawn_mouth_good: 1,
}
)>><<run new setup.Equipment(
'chastity_dick',
'Dick Chastity Device',
setup.equipmentslot.genital,
['dick', 'chastity', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{},
[setup.trait.eq_chastity],
[ /* unit restrictions */
setup.qs.trait_dick,
],
{ image: 'genital_chastity' }
)>>
<<run new setup.EquipmentPool(
'chastity',
{
chastity_dick: 1,
}
)>><<run new setup.Equipment(
'combat_torso',
'Chain Mail',
setup.equipmentslot.torso,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'torso_chestplate_heavy' },
)>>
<<run new setup.Equipment(
'combat_legs',
'Chain Greaves',
setup.equipmentslot.legs,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'legs_faulds_heavy' },
)>>
<<run new setup.Equipment(
'combat_feet',
'Chain Sabatons',
setup.equipmentslot.feet,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'feet_greaves_heavy' },
)>>
<<run new setup.Equipment(
'combat_arms',
'Chain Gauntlets',
setup.equipmentslot.arms,
['armor'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'arms_gauntlets_heavy' },
)>>
<<run new setup.Equipment(
'combat_head',
'Chain Coif',
setup.equipmentslot.head,
['armor', 'helmet', 'coverface'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'head_helm_heavy' },
)>>
<<run new setup.EquipmentPool(
'combat',
{
combat_torso: 1,
combat_legs: 1,
combat_arms: 1,
combat_feet: 1,
combat_head: 1,
}
)>>
<<run new setup.Equipment(
'combat_torso_good',
'Plate Armor',
setup.equipmentslot.torso,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'torso_chestplate_heavy' },
)>>
<<run new setup.Equipment(
'combat_legs_good',
'Plate Greaves',
setup.equipmentslot.legs,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'legs_faulds_heavy' },
)>>
<<run new setup.Equipment(
'combat_feet_good',
'Plate Sabatons',
setup.equipmentslot.feet,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'feet_greaves_heavy' },
)>>
<<run new setup.Equipment(
'combat_arms_good',
'Plate Gauntlets',
setup.equipmentslot.arms,
['armor'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'arms_gauntlets_heavy' },
)>>
<<run new setup.Equipment(
'combat_head_good',
'Plate Helmet',
setup.equipmentslot.head,
['armor', 'helmet', 'coverface'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'head_helm_heavy' },
)>>
<<run new setup.EquipmentPool(
'combat_good',
{
combat_torso_good: 1,
combat_legs_good: 1,
combat_arms_good: 1,
combat_feet_good: 1,
combat_head_good: 1,
}
)>>
<<run new setup.Equipment(
'combat_arms_master',
'Orc-born Gauntlets',
setup.equipmentslot.arms,
['armor'],
setup.EQUIPMENT_PRICE_MASTER, /* value */
0, /* sluttines */
{combat: setup.EQUIPMENT_STAT_BOOST_MASTER},
[],
[],
{ image: 'arms_gauntlets_heavy' },
)>><<run new setup.Equipment(
'intrigue_neck',
'Thief Cloak',
setup.equipmentslot.neck,
['clothes'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_legs',
'Thief Trousers',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_feet',
'Thief Shoes',
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_mouth',
'Thief Bandana',
setup.equipmentslot.mouth,
['accessory', 'mouthcover',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_eyes',
'Thief Mask',
setup.equipmentslot.eyes,
['accessory', 'eyemask'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'eyes_mask' },
)>>
<<run new setup.EquipmentPool(
'intrigue',
{
intrigue_neck: 1,
intrigue_legs: 1,
intrigue_mouth: 1,
intrigue_feet: 1,
intrigue_eyes: 1,
}
)>>
<<run new setup.Equipment(
'intrigue_neck_good',
'Ninja Cloak',
setup.equipmentslot.neck,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_legs_good',
'Ninja Trousers',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_feet_good',
'Ninja Slippers',
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_mouth_good',
'Ninja Bandana',
setup.equipmentslot.mouth,
['accessory', 'mouthcover',],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'intrigue_eyes_good',
'Ninja Mask',
setup.equipmentslot.eyes,
['accessory', 'eyemask'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{intrigue: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'eyes_mask' },
)>>
<<run new setup.EquipmentPool(
'intrigue_good',
{
intrigue_neck_good: 1,
intrigue_legs_good: 1,
intrigue_mouth_good: 1,
intrigue_feet_good: 1,
intrigue_eyes_good: 1,
}
)>><<run new setup.Equipment(
'knowledge_torso',
'Scholar Robe',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'torso_robes' },
)>>
<<run new setup.Equipment(
'knowledge_legs',
'Scholar Pants',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'knowledge_head',
'Scholar Cap',
setup.equipmentslot.head,
['accessory', 'hat'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'head_hat_wizard' },
)>>
<<run new setup.Equipment(
'knowledge_eyes',
'Scholar Spectacles',
setup.equipmentslot.eyes,
['accessory', 'spectacles',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'eyes_spectacles' },
)>>
<<run new setup.Equipment(
'knowledge_arms',
'Scholar Gloves',
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.EquipmentPool(
'knowledge',
{
knowledge_torso: 1,
knowledge_legs: 1,
knowledge_eyes: 1,
knowledge_head: 1,
knowledge_arms: 1,
}
)>>
<<run new setup.Equipment(
'knowledge_torso_good',
'Wiseman Robe',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'torso_robes' },
)>>
<<run new setup.Equipment(
'knowledge_legs_good',
'Wiseman Pants',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'knowledge_head_good',
'Wiseman Thinking Cap',
setup.equipmentslot.head,
['accessory', 'hat'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'head_hat_wizard' },
)>>
<<run new setup.Equipment(
'knowledge_eyes_good',
'Wiseman Spectacles',
setup.equipmentslot.eyes,
['clothes', 'spectacles',],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'eyes_spectacles' },
)>>
<<run new setup.Equipment(
'knowledge_arms_good',
'Wiseman Gloves',
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{knowledge: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.EquipmentPool(
'knowledge_good',
{
knowledge_torso_good: 1,
knowledge_legs_good: 1,
knowledge_eyes_good: 1,
knowledge_head_good: 1,
knowledge_arms_good: 1,
}
)>><<run new setup.Equipment(
'pants',
'Standard Pants',
setup.equipmentslot.legs,
['clothes', 'covering', ],
0, /* value */
0, /* sluttines */
{},
[],)>>
<<run new setup.Equipment(
'shirt',
'Standard Shirt',
setup.equipmentslot.torso,
['clothes', 'covering', ],
0, /* value */
0, /* sluttines */
{},
[],)>>
<<run new setup.Equipment(
'shoes',
'Standard Shoes',
setup.equipmentslot.feet,
['shoes', 'covering', ],
0, /* value */
0, /* sluttines */
{},
[],)>><<run new setup.Equipment(
'tailplug_dog',
'Puppy Tail Plug',
setup.equipmentslot.rear,
['pet', 'buttplug', 'tailplug', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_pony_tailplug' },
)>>
<<run new setup.Equipment(
'collar_dog',
'Puppy Collar',
setup.equipmentslot.neck,
['pet', 'collar'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttines */
{},
[setup.trait.eq_collar],
[],
{ image: 'neck_puppy_collar' },
)>>
<<run new setup.Equipment(
'hood_dog',
'Puppy Hood',
setup.equipmentslot.head,
['pet', 'headcover', 'coverface'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttines */
{},
[],
[],
{ image: 'head_puppy_hood' },
)>>
<<run new setup.Equipment(
'mitts_dog',
'Puppy Mitts',
setup.equipmentslot.arms,
['pet', 'mitts', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttines */
{},
[setup.trait.eq_restrained],
[],
{ image: 'arms_puppy_mitts' },
)>>
<<run new setup.Equipment(
'harness_dog',
'Puppy Harness',
setup.equipmentslot.torso,
['pet', 'harness'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[],
[],
{ image: 'torso_puppy_harness' },
)>>
<<run new setup.EquipmentPool(
'dog',
{
tailplug_dog: 1,
collar_dog: 1,
hood_dog: 1,
mitts_dog: 1,
harness_dog: 1,
}
)>>
<<run new setup.Equipment(
'golden_tailplug_dog',
'Golden Puppy Tail Plug',
setup.equipmentslot.rear,
['pet', 'buttplug', 'tailplug', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
30, /* sluttines */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_pony_tailplug', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golden_collar_dog',
'Golden Puppy Collar',
setup.equipmentslot.neck,
['pet', 'collar'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
15, /* sluttines */
{},
[setup.trait.eq_collar],
[],
{ image: 'neck_puppy_collar', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golden_harness_dog',
'Golden Puppy Harness',
setup.equipmentslot.torso,
['pet', 'harness'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
25, /* sluttines */
{},
[],
[],
{ image: 'torso_puppy_harness', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golden_hood_dog',
'Golden Puppy Hood',
setup.equipmentslot.head,
['pet', 'headcover', 'coverface'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[],
[],
{ image: 'head_puppy_hood', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golden_mitts_dog',
'Golden Puppy Mitts',
setup.equipmentslot.arms,
['pet', 'mitts', 'banuse'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[setup.trait.eq_restrained],
[],
{ image: 'arms_puppy_mitts', colorize: 'gold' },
)>>
<<run new setup.EquipmentPool(
'pet_good',
{
golden_tailplug_dog: 1,
golden_collar_dog: 1,
golden_harness_dog: 1,
golden_mitts_dog: 1,
golden_hood_dog: 1,
}
)>><<run new setup.Equipment(
'tailplug_pony',
'Pony Tail Plug',
setup.equipmentslot.rear,
['pony', 'buttplug', 'tailplug', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttiness */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_pony_tailplug' },
)>>
<<run new setup.Equipment(
'gag_pony',
'Pony Bit Gag',
setup.equipmentslot.mouth,
['pony', 'gag', 'bitgag', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttiness */
{},
[setup.trait.eq_gagged],
[],
{ image: 'mouth_pony_bitgag' },
)>>
<<run new setup.Equipment(
'eyecover_pony',
'Pony Blinders',
setup.equipmentslot.eyes,
['pony', 'ponyeyecover', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttiness */
{},
[],
[],
{ image: 'eyes_pony_blinders' },
)>>
<<run new setup.Equipment(
'hooves_front_pony',
'Pony Hooves (Front)',
setup.equipmentslot.arms,
['pony', 'hooves', 'banuse'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttiness */
{},
[setup.trait.eq_restrained],
[],
{ image: 'legs_pony_hooves' },
)>>
<<run new setup.Equipment(
'hooves_rear_pony',
'Pony Hooves (Rear)',
setup.equipmentslot.feet,
['pony', 'hooves', 'banuse', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttiness */
{},
[setup.trait.eq_restrained],
[],
{ image: 'legs_pony_hooves' },
)>>
<<run new setup.Equipment(
'large_tailplug_pony',
'Extra Large Pony Tail Plug',
setup.equipmentslot.rear,
['pony', 'buttplug', 'tailplug', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
30, /* sluttiness */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_pony_tailplug' },
)>>
<<run new setup.Equipment(
'large_gag_pony',
'Extra Large Pony Bit Gag',
setup.equipmentslot.mouth,
['pony', 'gag', 'bitgag', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttiness */
{},
[setup.trait.eq_gagged],
[],
{ image: 'mouth_pony_bitgag' },
)>>
<<run new setup.Equipment(
'large_eyecover_pony',
'Extra Dark Pony Blinders',
setup.equipmentslot.eyes,
['pony', 'ponyeyecover'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttiness */
{},
[],
[],
{ image: 'eyes_pony_blinders' },
)>>
<<run new setup.Equipment(
'constricting_hooves_front_pony',
'Extra Constricting Pony Hooves (Front)',
setup.equipmentslot.arms,
['pony', 'hooves', 'banuse'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttiness */
{},
[setup.trait.eq_restrained],
[],
{ image: 'legs_pony_hooves' },
)>>
<<run new setup.Equipment(
'constricting_hooves_rear_pony',
'Extra Constricting Pony Hooves (Rear)',
setup.equipmentslot.feet,
['pony', 'hooves', 'banuse', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttiness */
{},
[setup.trait.eq_restrained],
[],
{ image: 'legs_pony_hooves' },
)>>
<<run new setup.EquipmentPool(
'pony',
{
tailplug_pony: 1,
gag_pony: 1,
eyecover_pony: 1,
hooves_front_pony: 1,
hooves_rear_pony: 1,
}
)>>
<<run new setup.EquipmentPool(
'pony_good',
{
large_tailplug_pony: 1,
large_gag_pony: 1,
large_eyecover_pony: 1,
constricting_hooves_front_pony: 1,
constricting_hooves_rear_pony: 1,
}
)>><<run new setup.Equipment(
'manacles_up',
'Manacles',
setup.equipmentslot.arms,
['restraints'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{},
[setup.trait.eq_restrained],
[],
{ image: 'arms_manacles' },
)>>
<<run new setup.Equipment(
'manacles_down',
'Fetters',
setup.equipmentslot.feet,
['restraints'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{},
[setup.trait.eq_restrained],
[],
{ image: 'feet_fetters' },
)>>
<<run new setup.Equipment(
'blindfold',
'Blindfold',
setup.equipmentslot.eyes,
['blindfold', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttines */
{},
[setup.trait.eq_blind],
[],
{ image: 'eyes_blindfold' },
)>>
<<run new setup.Equipment(
'ballgag',
'Ball Gag',
setup.equipmentslot.mouth,
['gag', 'ballgag', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[setup.trait.eq_gagged],
[],
{ image: 'mouth_gag_ball' },
)>>
<<run new setup.Equipment(
'metal_collar',
'Heavy Metal Collar',
setup.equipmentslot.neck,
['collar'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
10, /* sluttines */
{},
[setup.trait.eq_collar],
[],
{ image: 'neck_collar' },
)>>
<<run new setup.EquipmentPool(
'restraint',
{
metal_collar: 1,
ballgag: 1,
blindfold: 1,
manacles_up: 1,
manacles_down: 1,
}
)>><<run new setup.Equipment(
'sex_torso',
'Whore Harness',
setup.equipmentslot.torso,
['harness'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],)>>
<<run new setup.Equipment(
'sex_legs',
'Whore Leggings',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],)>>
<<run new setup.Equipment(
'sex_rear',
'Whore Thong',
setup.equipmentslot.rear,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'rear_thong' },)>>
<<run new setup.Equipment(
'sex_nipple',
'Whore Nipple Clamps',
setup.equipmentslot.nipple,
['accessory', 'nippleclamps',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],)>>
<<run new setup.Equipment(
'sex_neck',
'Whore Choker',
setup.equipmentslot.neck,
['choker'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'neck_necklace' },
)>>
<<run new setup.EquipmentPool(
'sex',
{
sex_torso: 1,
sex_legs: 1,
sex_nipple: 1,
sex_rear: 1,
sex_neck: 1,
}
)>>
<<run new setup.Equipment(
'sex_torso_good',
'Succubus Harness',
setup.equipmentslot.torso,
['harness'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],)>>
<<run new setup.Equipment(
'sex_legs_good',
'Succubus Leggings',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],)>>
<<run new setup.Equipment(
'sex_rear_good',
'Succubus Thong',
setup.equipmentslot.rear,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'rear_thong' },)>>
<<run new setup.Equipment(
'sex_nipple_good',
'Succubus Nipple Clamps',
setup.equipmentslot.nipple,
['accessory', 'nippleclamps'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],)>>
<<run new setup.Equipment(
'sex_neck_good',
'Succubus Choker',
setup.equipmentslot.neck,
['choker'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
5, /* sluttines */
{sex: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'neck_necklace' },
)>>
<<run new setup.EquipmentPool(
'sex_good',
{
sex_torso_good: 1,
sex_legs_good: 1,
sex_nipple_good: 1,
sex_rear_good: 1,
sex_neck_good: 1,
}
)>><<run new setup.Equipment(
'nipplechains',
'Nipple Chains',
setup.equipmentslot.nipple,
['accessory', 'nipplechains'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[],
[],
{ image: 'nipple_clamps' },
)>>
<<run new setup.Equipment(
'buttplug',
'Buttplug',
setup.equipmentslot.rear,
['buttplug', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_buttplug' },
)>>
<<run new setup.Equipment(
'dildo',
'Dildo',
setup.equipmentslot.genital,
['dildo', 'vagina', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[setup.trait.eq_plug_vagina],
[
setup.qs.trait_vagina,
],
{ image: 'genital_dildo' },
)>>
<<run new setup.Equipment(
'dildogag',
'Dildo Gag',
setup.equipmentslot.mouth,
['gag', 'dildogag', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[setup.trait.eq_gagged],
[],
{ image: 'mouth_gag_dildo' },
)>>
<<run new setup.Equipment(
'dickplug',
'Dick Plug',
setup.equipmentslot.genital,
['dickplug', 'dick', 'banuse', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
20, /* sluttines */
{},
[],
[
setup.qs.trait_dick,
],
{ image: 'genital_dickplug' },
)>>
<<run new setup.Equipment(
'goldnipplechains',
'Gold Nipple Chains',
setup.equipmentslot.nipple,
['accessory', 'nipplechains'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[],
[],
{ image: 'nipple_clamps', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'goldbuttplug',
'Gold Buttplug',
setup.equipmentslot.rear,
['buttplug', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_buttplug', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golddildo',
'Gold Dildo',
setup.equipmentslot.genital,
['dildo', 'vagina', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[setup.trait.eq_plug_vagina],
[
setup.qs.trait_vagina,
],
{ image: 'genital_dildo', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golddildogag',
'Gold Dildo Gag',
setup.equipmentslot.mouth,
['dildogag', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[setup.trait.eq_gagged],
[],
{ image: 'mouth_gag_dildo', colorize: 'gold' },
)>>
<<run new setup.Equipment(
'golddickplug',
'Gold Dick Plug',
setup.equipmentslot.genital,
['dickplug', 'dick', 'banuse', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
20, /* sluttines */
{},
[],
[
setup.qs.trait_dick,
],
{ image: 'genital_dickplug', colorize: 'gold' },
)>>
<<run new setup.EquipmentPool(
'sextoy',
{
nipplechains: 1,
buttplug: 1,
dildo: 1,
dildogag: 1,
dickplug: 1,
}
)>>
<<run new setup.EquipmentPool(
'sextoy_good',
{
goldnipplechains: 1,
goldbuttplug: 1,
golddildo: 1,
golddildogag: 1,
golddickplug: 1,
}
)>>
<<run new setup.Equipment(
'buttplug_master',
'Ancient Neko Buttplug',
setup.equipmentslot.rear,
['buttplug',],
setup.EQUIPMENT_PRICE_MASTER, /* value */
30, /* sluttines */
{},
[setup.trait.eq_plug_anus],
[],
{ image: 'rear_buttplug' },
)>><<run new setup.Equipment(
'slaving_torso',
'Kinky Jacket',
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_legs',
'Kinky Leggings',
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_arms',
'Kinky Gloves',
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_rear',
'Kinky Underwear',
setup.equipmentslot.rear,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
5, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_head',
'Kinky Cap',
setup.equipmentslot.head,
['accessory', 'hat'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.EquipmentPool(
'slaving',
{
slaving_torso: 1,
slaving_legs: 1,
slaving_rear: 1,
slaving_arms: 1,
slaving_head: 1,
}
)>>
<<run new setup.Equipment(
'slaving_torso_good',
"Master Jacket",
setup.equipmentslot.torso,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_legs_good',
"Master Trousers",
setup.equipmentslot.legs,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_arms_good',
"Master Gloves",
setup.equipmentslot.arms,
['clothes'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_rear_good',
"Master Boxers",
setup.equipmentslot.rear,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'slaving_head_good',
"Master Hat",
setup.equipmentslot.head,
['accessory', 'hat'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{slaving: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.EquipmentPool(
'slaving_good',
{
slaving_torso_good: 1,
slaving_legs_good: 1,
slaving_rear_good: 1,
slaving_arms_good: 1,
slaving_head_good: 1,
}
)>>
<<run new setup.Equipment(
'slaving_weapon_master',
"Dark Excalibur",
setup.equipmentslot.weapon,
[],
setup.EQUIPMENT_PRICE_MASTER, /* value */
0, /* sluttines */
{ /* skills */
slaving: setup.EQUIPMENT_STAT_BOOST_MASTER,
combat: setup.EQUIPMENT_STAT_BOOST_NORMAL,
},
[ /* traits */
],
[ /* unit restriction */
setup.qs.job_slaver,
setup.qres.HasTitle('quest_corrupted_wielder_of_the_excalibur_0'),
],
{ /* image: 'TBD' */ },
)>><<run new setup.Equipment(
'social_neck',
'Socialite Necklace',
setup.equipmentslot.neck,
['necklace'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'neck_necklace' },
)>>
<<run new setup.Equipment(
'social_eyes',
'Socialite Ball Mask',
setup.equipmentslot.eyes,
['accessory', 'eyemask'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'eyes_masquerade' },
)>>
<<run new setup.Equipment(
'social_feet',
'Socialite Shoes',
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'social_head',
'Socialite Circlet',
setup.equipmentslot.head,
['accessory', 'tiara'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'social_arms',
'Socialite Ring',
setup.equipmentslot.arms,
['ring'],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'arms_ring_jeweled' },
)>>
<<run new setup.EquipmentPool(
'social',
{
social_neck: 1,
social_eyes: 1,
social_head: 1,
social_feet: 1,
social_arms: 1,
}
)>>
<<run new setup.Equipment(
'social_neck_good',
'Noble Necklace',
setup.equipmentslot.neck,
['necklace'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'neck_necklace' },
)>>
<<run new setup.Equipment(
'social_eyes_good',
'Noble Masquerade Mask',
setup.equipmentslot.eyes,
['accessory', 'eyemask'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'eyes_masquerade' },
)>>
<<run new setup.Equipment(
'social_feet_good',
'Noble Shoes',
setup.equipmentslot.feet,
['clothes', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'social_head_good',
'Noble Tiara',
setup.equipmentslot.head,
['accessory', 'tiara'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'social_arms_good',
'Noble Signet Ring',
setup.equipmentslot.arms,
['ring'],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{social: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'arms_ring_jeweled' },
)>>
<<run new setup.EquipmentPool(
'social_good',
{
social_neck_good: 1,
social_eyes_good: 1,
social_head_good: 1,
social_feet_good: 1,
social_arms_good: 1,
}
)>><<run new setup.Equipment(
'survival_torso',
'Ranger Breastplate',
setup.equipmentslot.torso,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ image: 'torso_chestplate' },
)>>
<<run new setup.Equipment(
'survival_legs',
'Ranger Leggings',
setup.equipmentslot.legs,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'survival_feet',
'Ranger Boots',
setup.equipmentslot.feet,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'survival_neck',
'Ranger Cloak',
setup.equipmentslot.neck,
['armor', 'cape',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'survival_head',
'Ranger Hood',
setup.equipmentslot.head,
['armor', 'hood',],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_NORMAL},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.EquipmentPool(
'survival',
{
survival_torso: 1,
survival_legs: 1,
survival_neck: 1,
survival_feet: 1,
survival_head: 1,
}
)>>
<<run new setup.Equipment(
'survival_torso_good',
'Silk Ranger Shirt',
setup.equipmentslot.torso,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ image: 'torso_chestplate' },
)>>
<<run new setup.Equipment(
'survival_legs_good',
'Silk Ranger Leggings',
setup.equipmentslot.legs,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'survival_feet_good',
'Silk Ranger Boots',
setup.equipmentslot.feet,
['armor', 'covering', ],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'survival_neck_good',
'Silk Ranger Cloak',
setup.equipmentslot.neck,
['armor', 'cape',],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.Equipment(
'survival_head_good',
'Silk Ranger Hood',
setup.equipmentslot.head,
['armor', 'hood',],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{survival: setup.EQUIPMENT_STAT_BOOST_GOOD},
[],
[],
{ /* image: 'TBD' */ },
)>>
<<run new setup.EquipmentPool(
'survival_good',
{
survival_torso_good: 1,
survival_legs_good: 1,
survival_neck_good: 1,
survival_feet_good: 1,
survival_head_good: 1,
}
)>>/* These are a set of default weapons */
<<run new setup.Equipment(
'weapon_sword',
"Sword",
setup.equipmentslot.weapon,
['basic', ],
0, /* value */
0, /* sluttines */
{}, /* stat effects */
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_sword' },
)>>
<<run new setup.Equipment(
'weapon_spear',
"Spear",
setup.equipmentslot.weapon,
['basic', ],
0, /* value */
0, /* sluttines */
{}, /* stat effects */
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_spear' },
)>>
<<run new setup.Equipment(
'weapon_axe',
"Axe",
setup.equipmentslot.weapon,
['basic', ],
0, /* value */
0, /* sluttines */
{}, /* stat effects */
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_axe' },
)>>
<<run new setup.Equipment(
'weapon_dagger',
"Dagger",
setup.equipmentslot.weapon,
['basic', ],
0, /* value */
0, /* sluttines */
{}, /* stat effects */
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_dagger' },
)>>
<<run new setup.Equipment(
'weapon_staff',
"Staff",
setup.equipmentslot.weapon,
['basic', ],
0, /* value */
0, /* sluttines */
{}, /* stat effects */
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_staff' },
)>>
<<run new setup.Equipment(
'weapon_broadsword',
"Broadsword",
setup.equipmentslot.weapon,
[],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{
combat: setup.EQUIPMENT_STAT_BOOST_NORMAL,
brawn: setup.EQUIPMENT_STAT_BOOST_NORMAL,
},
[], /* traits */
[
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.muscle_strong),
], /* unit restrictions */
{ image: 'weapon_broadsword' },
)>>
<<run new setup.Equipment(
'weapon_dualdagger',
"Dual Dagger",
setup.equipmentslot.weapon,
[],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{
combat: setup.EQUIPMENT_STAT_BOOST_NORMAL,
intrigue: setup.EQUIPMENT_STAT_BOOST_NORMAL,
},
[], /* traits */
[
setup.qs.job_slaver,
setup.qres.Trait(setup.trait.skill_ambidextrous),
], /* unit restrictions */
{ image: 'weapon_dual' },
)>>
<<run new setup.Equipment(
'weapon_rapier',
"Rapier",
setup.equipmentslot.weapon,
[],
setup.EQUIPMENT_PRICE_GOOD, /* value */
0, /* sluttines */
{
combat: setup.EQUIPMENT_STAT_BOOST_NORMAL,
social: setup.EQUIPMENT_STAT_BOOST_NORMAL,
},
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_rapier' },
)>>
<<run new setup.Equipment(
'weapon_log',
"Log",
setup.equipmentslot.weapon,
[],
setup.EQUIPMENT_PRICE_NORMAL, /* value */
0, /* sluttines */
{
combat: -setup.EQUIPMENT_STAT_BOOST_NORMAL,
sex: 0.01,
},
[], /* traits */
[
setup.qs.job_slaver,
], /* unit restrictions */
{ image: 'weapon_log' },
)>><<set setup.equipmentpool = {}>><<run new setup.EquipmentPoolGroup(
'all_sex',
{
dog: 1,
pony: 1,
sextoy: 1,
restraint: 1,
chastity: 0.2,
}
)>>
<<run new setup.EquipmentPoolGroup(
'all_combat',
{
aid: 1,
brawn: 1,
combat: 1,
survival: 1,
intrigue: 1,
slaving: 1,
knowledge: 1,
social: 1,
arcane: 1,
sex: 1,
}
)>>
<<run new setup.EquipmentPoolGroup(
'all_nonsex_good',
{
aid_good: 1,
brawn_good: 1,
combat_good: 1,
survival_good: 1,
intrigue_good: 1,
slaving_good: 1,
knowledge_good: 1,
social_good: 1,
arcane_good: 1,
sex_good: 1,
}
)>>
<<run new setup.EquipmentPoolGroup(
'blacksmith',
{
brawn: 1,
combat: 1,
slaving: 1,
}
)>>
<<run new setup.EquipmentPoolGroup(
'tailor',
{
survival: 1,
intrigue: 1,
social: 1,
sex: 1,
}
)>>
<<run new setup.EquipmentPoolGroup(
'weaver',
{
aid: 1,
knowledge: 1,
arcane: 1,
}
)>><<set setup.equipmentslot = {}>>
<<run new setup.EquipmentSlot('head', 'head')>>
<<run new setup.EquipmentSlot('neck', 'neck')>>
<<run new setup.EquipmentSlot('torso', 'torso')>>
<<run new setup.EquipmentSlot('arms', 'arms')>>
<<run new setup.EquipmentSlot('legs', 'legs')>>
<<run new setup.EquipmentSlot('feet', 'feet')>>
<<run new setup.EquipmentSlot('weapon', 'weapon')>>
<<run new setup.EquipmentSlot('eyes', 'eyes')>>
<<run new setup.EquipmentSlot('mouth', 'mouth')>>
<<run new setup.EquipmentSlot('nipple', 'nipple')>>
<<run new setup.EquipmentSlot('rear', 'rear')>>
<<run new setup.EquipmentSlot('genital', 'genital')>><<run new setup.Event(
'coming_of_age', /* key */
"Coming of Age", /* Title */
"Alberich", /* Author */
[ ], /* tags */
'Event_coming_of_age',
{ /* roles */
},
{ /* actors */
'child': null },
[ /* outcomes */
setup.qc.Opportunity('coming_of_age', {child: 'child',}), ],
[ /* restrictions to generate */
],
1, /* Cooldown */
100, /* Rarity */
)>><<set _mom = $family.getUnitRelation($g.child, setup.familyrelation.mother)>>
<<set _dad = $family.getUnitRelation($g.child, setup.familyrelation.father)>>
<<set _u = setup.getAnySlaver()>>
<p>
Today marks the 18-th birthday of <<rep $g.child>>, which if you recall correctly was the <<daughter $g.child>> of
<<if _mom && _mom.isSlaver()>>
your <<repfull _mom>>.
<<else>>
a former slaver in your employ.
<</if>>
Now comes the day where you need to decide what to do with the <<lass $g.child>>.
You could try asking <<repfull _u>> for advice, but on a second thought these personal matters are best resolved
with your own hands.
</p><<run new setup.Event(
'enlightenment_of_the_soul___interlude', /* key */
"Enlightenment of the Soul - Interlude", /* Title */
"Alberich", /* Author */
[ ], /* tags */
'Event_enlightenment_of_the_soul___interlude',
{ /* roles */
'pupil': [
setup.qres.HasTitle('quest_enlightenment_2_graduate_1'),
],
},
{ /* actors */
'child': null,
},
[ /* outcomes */
setup.qc.TraitRemove('pupil', setup.trait.per_chaste),
setup.qc.QuestDirect('enlightenment_of_the_soul', {child: 'child'}),
],
[ /* restrictions to generate */
],
1,
100,
)>><<set _p = $g.pupil>>
<<set _doctor = $dutylist.getUnit('DutyDoctor')>>
<p>
In obedience to your instructions, <<rep _p>> stops taking her contraceptive potions. <<if _doctor>> Your physician, <<rep _doctor>> <<else>> an alchemist <</if>> has concocted a fertility draught and calculated the best night to ensure your sowing will fall on fertile ground. That night has now come.
</p>
<p>
The evening hour strikes, and you swagger your way down to <<rep _p>>'s quarters, ready for an evening's delight. She knows to expect you and to make herself ready. Her door is ajar and soft lamplight is shining inside. You push it open.
</p>
<p>
The light mage's quarters are clean, freshly swept out, and simply appointed, with clean sheets and a well-turned-down blanket. Since her recent education, her furnishings include a few books and a pair of decorative prisms.
<<if _p.isHasTrait('per_lustful')>> Erotic paintings advertise <<rep _p>> 's lubricious longings to all who enter these quarters, and given her well known predilections, you suspect they have been many. But tonight, she is for you.
<<elseif _p.isHasTrait('per_submissive')>>Her paintings feature women in submissive postures and attitudes, bowing to the will of their masters, and ensuring that <<rep _p>>'s visitors understand that she wants them to take charge. <</if>>
<<if _p.isHasTrait('per_masochistic')>> One of the paintings features a woman spreadeagled and chained in midair, her face a mask of pleasure, and telling the visitor of <<rep _p>>'s fondness for receiving pleasure through pain.<</if>>
<<if _p.isHasTrait('per_dominant')>> Fur-lined handcuffs on the bed, blindfolds, and an arresting watercolor of helpless male figures on their knees before an imperious Mistress, reveal <<rep _p>>'s fondness for taking the dominant role. A small wooden table is covered with marks where previous visitors have been forced to scratch their names and protestations of devotion to their Mistress. If you ever get into this room alone, you might find it interesting to see how many members of your company have tasted the delights of <<rep _p>>'s bootheels.
<</if>>
<<if _p.isHasTrait('per_cruel')>> Several scourges and fetters adorn the walls, hinting at <<rep _p>>'s fondness for inflicting pain to bring pleasure to herself. <</if>>
What matters most now is that she is here and she is ready.
</p>
<<if _p.isHasTrait('per_submissive')>> <p>She sits on the edge of the bed, stripped to a filmy shift with a gold “slave” anklet above her left foot, her crossed arms barely covering her <<ubreasts _p>>. Her eyes are downcast, and her demeanor could not be plainer: she is awaiting your orders. With a wolfish grin, you kick the door closed and stride over her way. “On your feet!” you command. She springs up hastily, like a soldier caught by the sergeant-major or a slave fearing the whip. “Now off with that,” you say, gesturing up and down at her flimsy night-dress. She hastens to obey, casting it aside and leaving herself defenseless before you. </p>
<p> Smiling a contemptuous sort of approval, you walk around your shivering slaver, stroking her <<ubody _p>> and assets as you do so. She dares not utter a sound, but her body flushes and her breathing betrays her arousal. When you've brought her to a higher pitch of excitement, you command her to remove your own garments. She does so, standing to remove your upper clothes, and kneeling at your feet—where she belongs—to remove the lower ones. When she reveals your <<udick $unit.player>>, she treats it with deference, looking down as if too nervous to face this sacred idol. At a gesture from you, she folds your clothes carefully and sets them aside, as a good maid would do. </p>
<p> “My lord. . . “ she begins, but you cut her off with a gesture. You've got other uses for her tongue than talking. Hiking one foot up on the edge of her bed, you gesture her back to her knees. Taking hold of her hair, you guide her 'til she understands what she is to do, licking first between your toes, then up to the spots between your <<uballs $unit.player>> and legs. Only when she has performed these early devotions is she allowed to face your stiff cock in worship. </p>
<<elseif _p.isHasTrait('per_dominant') && $unit.player.isHasTrait('per_submissive')>>
<p> She stands there in black with a silver circlet on her head and a short black rod cradled in her arms, looking imperiously as you enter, and bringing out immediately all your own submissive tendencies—tendencies she must have noticed long ago, whether she said a thing about them or not. </p>
<p> “You're late,” she says. You look for a clock, but she cuts you off. “I <i>said</i>, you're <i>late!</i>. Now get that door closed and off with those clothes.” You hasten to obey. “On the <i>floor!</i>,” she adds before you can finish. “Your head doesn't come up to my level unless I say, got it?” </p>
<p>”Yes, mistress.</p>
<p>”Speak when you're spoken to! Now <i>get</i> those clothes <i>off!</i>.” You scramble to obey. Instinctively you look up to see her approval when you've done. With a gesture of her fingers, she half-blinds you with a flash of magic light. “<i>Don't</i> look me in the face, slaveboy, not unless I say!” </p>
<p>Under threat of her sharp tongue you're forced to fold the clothes neatly and put them away. Only then are you allowed to crawl to her feet, and lick her leather shoes while she taps your shoulders with her rod. Total silence and quick obedience are the ways to her favor, and you quickly fall into both habits. Mistress doesn't need a word except “yes, mistress,” and she doesn't need <i>that</i> very often. </p>
<p> Your good behavior is rewarded in time, as Mistress throws down her black gown and orders you to fold it up. “So,” she says, “you think you're fit to put your spawn in me, do you? Get over here.” You scramble to obey. She hikes a foot up onto her bed and makes it plain what you are to do—to give pleasure to her legs and lower regions with your tongue. The rod is in her hand. You had best not be idle. </p>
<<elseif _p.isHasTrait('bg_whore')>> <p> Before <<per _p>> was a slaver, she was an experienced whore, and she has not forgotten her tradecraft. She's seductively dressed and approaches with a welcoming smile and terms of endearment. You are her “love” and her “sweetheart,” at least for tonight, and her welcoming words and friendly smiles would put the shyest young novice at his ease. </p>
<p> Shyness about getting down to business was never part of her profession, and in moments you are sitting together on the bed, your arms twined around each other, and kissing lasciviously. She asks whether you like her, whether you fancy her, whether you want to put a baby in her, while her practiced fingers pluck the pair of you as naked as the day you were born. </p>
<<elseif _p.isHasTrait('bg_courtesan')>> <p> Before <<per _p>> was a slaver, she was an experienced courtesan, and she has not forgotten her tradecraft. She's seductively dressed and approaches with a welcoming smile and terms of endearment. You are her “love” and her “sweetheart,” at least for tonight, and her welcoming words and friendly smiles would put the shyest young novice at his ease. </p>
<p> Shyness about getting down to business was never part of her profession, and in moments you are sitting together on the bed, your arms twined around each other, and kissing lasciviously. She asks whether you like her, whether you fancy her, whether you want to put a baby in her, while her practiced fingers pluck the pair of you as naked as the day you were born. </p>
<<elseif _p.isHasTrait('per_lunatic')>> <p> <<per _p>>'s back is to you, as she kneels beside a small desk, naked as the day she was born, and eyeing a glass snow-globe. As you close the door and approach, she shakes the globe and stares at it intensely, seemingly oblivious to you, but grinding her hips erotically and stroking one of her own thighs. </p>
<p> When you've latched the door softly and crossed the room halfway, her head snaps around suddenly. There's a wild look in her eyes, as if she's being hunted. She sets the globe down carefully and rises into a crouch with a wild look in her eyes, as if preparing to spring or to flee. You come closer yet, a half-amused smile on your face. She backs towards the bed. When she feels it behind her she grips the mattress with both hands, holding on as if for dear life. Calmly and confidently, you undress.</p>
<p> And then you step forward and pounce, and she shifts immediately from wild fear to wild passion. Now she's clinging to <i>you</i> and covering your body with little kisses and bites. When you seize her head for a long kiss, her tongue invades yours like a hungry she-beast, and your touches can't come half as fast as hers. You're dealing with a Force of Nature here, and the best you can do is hang on. </p>
<p> In a little while she has you face-down on her bed, while she gives extra attention to your nether regions, gripping your hips and biting your buttocks. Soon after she's peeling your cheeks aside and giving your <<uanus $unit.player>> careful attention with her tongue, moaning her devotion and delight as she does so. </p>
<<elseif _p.isHasTrait('per_aggressive')>> <p> She's standing in a one-piece robe. Upon your entry, she looks you up and down once, nods, and marches straight up to you. With a single, decisive gesture, she pulls open the sash of her robe. With another, she shrugs it off, leaving her proudly naked and ready for action. “Let's,” she says, which is all the wooing you need. </p>
<p>Your own clothes take a little longer to get off, but she assists you eagerly, and soon you're kneeling face-to-face on the bed, kissing and touching each other eagerly. With simple gestures she guides you to the sweet spots on her body, and you are not slow to touch, kiss, and bite them, bringing forth her gasps and moans of pleasure. There's a great attraction in a woman who knows what she wants, and <i>this</i> woman knows what she wants. She wants you. And she wants your child. And she's going to get it. </p>
<<else>> <p> She sits on a small loveseat, near a table with wine and glasses, and invites you over in a friendly way. When you sit beside her, it's clear enough she'd had a glass or two already, and it's easy enough to break the ice. You talk a little about your day, about the business, about the times you've had together, and when the moment seems right the talk turns to kissing, and the kissing turns to passionate necking, and the passionate necking moves to the bed. You stroke and touch each other's bodies, first through the clothes, then, as you take them off, bare. As you get more naked, you get more excited. </p>
<</if>>
<<if _p.isHasTrait('per_playful')>> <p> With an impish grin, <<rep _p>> reaches to a side table, and presents you with a small silver salver. On top of which you see (of all things!) dice. You look a question and she explains the game. You each take a roll, and what the dice say, you do. One die for acts, one for parts.
<<elseif _p.isHasTrait('race_neko') || _p.isHasTrait('race_dragonkin') || _p.isHasTrait('race_werewolf') || _p.isHasTrait('race_demon')>> The dice are eight-sided instead of the usual six, so as to accommodate her nonhuman body parts. <</if>>. </p>
<p>You roll the reddish-pink “female” dice—they come up “massage” and “lower back.” So you give her a lower back massage, eliciting sighs of pleasure and satisfaction.</p>
<p>She rolls the blue “male” dice—one for “nibble,” one for “stomach.” She nibbles playfully at your stomach, flicking her tongue out occasionally and hitting a sweet spot that makes you spasm.</p>
<<if _p.isHasTrait('race_neko') || _p.isHasTrait('race_dragonkin') || _p.isHasTrait('race_werewolf') || _p.isHasTrait('race_demon')>> <p> The next roll comes up “stroke” and “tail,” and you do. </p>
<<else>>
<p>And so the fun and games go on. </p>
<</if>>
<p> On the bed, you and <<rep _p>> continue your lovemaking.
<<if _p.isHasTrait('per_lustful')>> As your love-play continues, <<rep _p>> abandons herself further and further to desire, losing all inhibitions if she ever had any. Truly she is in her element. <</if>>
<<if _p.isHasTrait('per_kind') || _p.isHasTrait('per_calm') || _p.isHasTrait('bg_whore') || _p.isHasTrait('bg_courtesan')>> To your delight, you find that <<rep _p>> has the trick of putting a man at his ease, so that you think only of pleasure and happiness, and are overwhelmed with a strong feeling for her.
<<elseif _p.isHasTrait('per_dominant') || _p.isHasTrait('per_cruel')>> She is a demanding sort of lover, quick to criticize any move she doesn't like, and if you were older or less full of lust tonight she might undermine your performance (and then laugh at you). As it is—not a chance! <</if>>
<<if _p.isHasTrait('per_playful')>> She is enjoying every moment and she lets you know it. <</if>>
<<if _p.isHasTrait('per_lunatic')>> Her wild face scrunches on one side, and she goes at your body with reckless abandon. <</if>>
<<if _p.isHasTrait('per_empath')>> She seems to know just what you're in the mood for, and anticipates your desires like a wife of ten years. <</if>>
<<if _p.isHasTrait('per_cruel') and $unit.player.isHasTrait('per_masochistic')>> You soon discover that she loves inflicting pain just as much as you love receiving it—and she slaps your face repeatedly while growling at you, as your erection swells to an almost painful maximum. <</if>>
<<if _p.isHasTrait('per_masochistic') and $unit.player.isHasTrait('per_cruel')>> You soon discover that she loves receiving pain as much as you love inflicting it—and you slap her face with a wolfish growl, twist her arms behind her, then seize up a rod and thrash her buttocks while she screams for more. <</if>>
<<if _p.isHasTrait('per_submissive')>> Above all things, <<rep _p>> lives to serve your desires, and whatever you wish, she does at once without question. <</if>>
</p>
<p>
<<if _p.isHasTrait('per_dominant')>> When she feels the moment has come, <<rep _p>> takes hold of you, rolls you onto your back, and slides her hands over your chest. With a lascivious leer, she guides your hands to her <<ubreasts _p>>, and while you fondle them, she guides your <<udick $unit.player>> into her well-lubricated <<uvagina _p>>. She begins to ride.
<<elseif _p.isHasTrait('per_dominant') && $unit.player.isHasTrait('per_submissive') && _p.isHasTrait('race_draconic')>> To your surprise, your Mistress lowers her breast to yours, seizes your arms, and rolls over to put <i>you</i> on top. Her eager face tells you what you want and you plow away at her without holding back. Then you feel a sudden pressure on your buttocks and begin to realize why she changed positions as her leer grows fierce and you feel the tip of her <<utail _p>> penetrate your <<uanus $unit.player>>. Judging by her laugh, the look on your <i>own</i> face must be priceless. “That's right,” she says. “You get it while you give it. Now <i>knock me up, you bitch!</i> You slam away obediently.
<<elseif _p.isHasTrait('per_dominant') && $unit.player.isHasTrait('per_submissive') &&
_p.isHasTrait('race_demon')>>
To your surprise, your Mistress lowers her breast to yours, seizes your arms, and rolls over to put <i>you</i> on top. Her eager face tells you what you want and you plow away at her without holding back. Then you feel a sudden pressure on your buttocks and begin to realize why she changed positions as her leer grows fierce and you feel the tip of her <<utail _p>> penetrate your <<uanus $unit.player>>. Judging by her laugh, the look on your <i>own</i> face must be priceless. “That's right,” she says. “You get it while you give it. Now <i>knock me up, you bitch!</i> You slam away obediently.
<<elseif _p.isHasTrait('race_neko') || _p.isHasTrait('race_dragonkin') || _p.isHasTrait('race_werewolf') || _p.isHasTrait('race_demon')>>
At a silent assent between you, <<rep _p>> kneels on the bed, with her legs apart, her head far down, and her <<utail _p>> curled up to present her <<uvagina _p>>. She puts back a hand to guide you as you slide your full length in and begin to couple.
<<elseif _p.isHasTrait('per_lustful')>> And now she is on her back, eagerly encouraging you, as you slide your full length into her <<uvagina _p>>. A slaver she may be by day, but by <i>this</i> night she is a slave of lust, and she whispers her encouragements as you grind into her and give her what she wants. Her cries of pleasure are heard by all.
<<else>> And in time, <<rep _p>> finds herself beneath you, and you atop her. There is a pause filled with breathing as you look into each others' eyes, and the looks say <i>yes</i> and <i>now</i>. With a gentle hand she guides your <<udick $unit.player>> into herself and you begin to couple.
<</if>>
</p>
<p>
Your coupling grows more intense as you near your climax.
<<if _p.isHasTrait('per_active')>> <<rep _p>>'s energy is boundless, and she keeps up with you like a gold-medal sexual athlete. <</if>>
<<if _p.isHasTrait('per_deceitful')>> By the sound of her, <<rep _p>> has three screaming orgasms while you're on the way. If that accomplished liar is deceiving you about that, who is harmed, really? <</if>>
<<if _p.isHasTrait('per_lunatic')>> <<rep _p>>'s orgasmic cries rise to a passionate scream they can hear down in the slave dungeons, and with her wriggling body beneath you, you burst inside in ecstasy. As you lie together panting in the afterglow, she clutches your body and begins a little sing-song, “I'm gonnnna haaave a baaaaay-beee….”
<<elseif _p.isHasTrait('bg_whore') || _p.isHasTrait('bg_courtesan')>> Soon you are overcome with ecstasy and your semen streams inside <<rep _p>>, putting her in the happy state she most desires to be in. And if she never truly climaxed from your now-softening member, there are (as it were) no hard feelings. It was a motto of her old profession: “The customer always comes first.”
<<elseif _p.isHasTrait('per_dominant')>> <<rep _p>> 's body arches in climax, but she won't let you stop. “Do it!” she cries out. “Knock me up! <i>Knock</i> me <i>up</i>, I said!!!” Your <<udick $unit.player>> happily obliges, exploding in a burst of delight, leaving you both sated and panting.
<<elseif _p.isHasTrait('race_werewolf')>> <<rep _p>> pants doglike as you copulate, and at the moment of climax lets out an ear-splitting wolf howl. (You vaguely remember reading that wolf howls are for communication, not anything sexual. You resolve not to tell <i>her</i> that.) Your own climax is not far behind, and the animal before you is well and truly bred.
<<else>> In a fit of generosity, you try to keep your mind on other things, hoping to draw out <<rep _p>> 's pleasure before you reach your own climax. You think of the account books, but those are full of sex slaves, and that turns you on. You think of your latest staff memo, but it was about an order from a specialty brothel, and <i>that</i> turns you on. In the end, you come in less than a minute after <<rep _p>>, and as your juices flow, you know you have done a good night's work. <</if>>
</p>
<p>
Afterwards, you lie together.
<<if _p.isHasTrait('per_dominant') && $unit.player.isHasTrait('per_submissive')>> But not for long. While you are in this room, <<rep _p>> is the Mistress and she doesn't let you forget it. Before you can leave, you have one last task to perform. She hands you a folding knife and gestures you to her marked-up wooden table, where you must carefully scratch your name amongst those of the others who have served beneath her. The humiliation makes you blush and rouses your <<udick $unit.player>>. You may be rubbing one out later at the thought. When you're done she takes the knife back, cuts a small lock of your hair for a trophy, and tells you to get the fuck out. But you can see her satisfied smile as you go, and know that beneath the games you have played, both of you are well satisfied.
<<elseif _p.isHasTrait('per_dominant')>> But not for long. <<rep _p>>, that natural dominatrix, doesn't like you seeing her vulnerable side. She curtly dismisses you and you leave without lingering, but you can see her satisfied smile as you go.
<<elseif _p.isHasTrait('per_sexaddict')>> You fall asleep beside <<rep _p>>, her arm across your chest and a satisfied smile on her face. An hour or two later, she prods you awake, wanting more . . . .
<<elseif _p.isHasTrait('per_calm')>> Soon after <<rep _p>> falls asleep, her face a mask of inner calm and pure tranquility, such as you rarely see on a slaver. You think this must be a reflection of her inner being, something the perverse ways of <<rep $company.player>> have never been able to touch. You slip away quietly back to your own room.
<<elseif _p.isHasTrait('per_submissive')>> <<rep _p>> demurely avoids eye contact and doesn't speak too much, but you can tell she is happy to have been fully in your power, and to have come out as she wished to be. In time, you give your “slave” a pinch on the buttocks, and leave her to her happy dreams.
<<elseif _p.isHasTrait('per_playful')>> In time <<rep _p>> pulls out a boardgame from her native country, and the two of you enjoy some play and a little good wine before you take your leave. It's all so friendly and casual. You return to your own room, happy.
<<else>> Contentedly, <<rep _p>> falls asleep, secure in her knowledge that she is the future mother of your child, and now able to advance to the final level in the Academy.
<</if>>
</p>
<p>
Some days later,
<<if _doctor>>
Your physician, <<rep _doctor>>, confirms
<<else>>
<<rep _p>> confirms
<</if>>
that you have done your duty, and the pupil is now ready to return to the academy. </p><<run new setup.Event(
'enlightenment_of_the_soul___interlude2', /* key */
"Enlightenment of the Soul - Interlude", /* Title */
"Alberich", /* Author */
[ ], /* tags */
'Event_enlightenment_of_the_soul___interlude2',
{ /* roles */
'pupil': [
setup.qres.HasTitle('quest_enlightenment_2_graduate_1'),
],
},
{ /* actors */
'child': null,
},
[ /* outcomes */
setup.qc.TraitRemove('pupil', setup.trait.per_chaste),
setup.qc.QuestDirect('enlightenment_of_the_soul', {child: 'child'}),
],
[ /* restrictions to generate */
],
1,
100,
)>><<set _p = $g.pupil>>
<<set _father = $family.getUnitRelation($g.child, 'father')>>
<<set _doctor = $dutylist.getUnit('DutyDoctor')>>
<<if !_father>>
/* player dismissed the father */
<p>
Later that week, your <<repfull _p>>
was often found missing from the fort. You can only hope they are doing
their work in the earnest.
</p>
<<else>>
<p>
Later that week, your <<repfull _p>> and <<rep _father>>
were often found missing from the fort. You can only hope they are doing
their work in the earnest.
</p>
<</if>>
<p>
Some days later,
<<if _doctor>>
Your physician, <<rep _doctor>>, confirms
<<else>>
<<rep _p>> confirms
<</if>>
that
<<if _father>>
<<rep _father>>
<<else>>
your former slaver
<</if>>
has done the duty, and the pupil is now ready to return to the academy. </p><<run new setup.Event(
'rival_interaction', /* key */
"Rival Interaction", /* Title */
"Kyiper", /* Author */
[ ], /* tags */
'Event_rival_interaction',
{ /* roles */
'you': [
setup.qres.You(),
setup.qres.Available(),
setup.qres.NoTraits([setup.trait.per_dominant], true),
],
'rival': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.FriendshipWithYouAtMost(-500),
setup.qres.NoTraits([setup.trait.per_submissive], true),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Opportunity('rival_interaction', {'rival': 'rival',}),
],
[ /* restrictions to generate */
],
300,
1,
)>><<include 'Opportunity_rival_interaction'>><<run new setup.Event(
'assault_on_your_lover', /* key */
"Assault on Your Lover", /* Title */
"darko", /* Author */
[ /* tags */
],
'Event_assault_on_your_lover',
{ /* roles */
},
{ /* actors */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.NoTag('future_assassin_parent'),
setup.qres.YourLover(),
],
},
[ /* outcomes */
setup.qc.VarSet('future_assassin_progress', '1', -1),
setup.qc.VarSet('future_assassin_cooldown', '1', 4),
],
[ /* restrictions */
setup.qres.VarNull('future_assassin_progress'),
setup.qres.VarNull('future_assassin_cooldown'),
setup.qres.HasUnitWithTagAndJob('future_assassin_parent', setup.job.slaver),
],
0, /* Cooldown */
1, /* Rarity */
)>><<set _u = setup.getAnySlaver()>>
<p>
Today, you receive a most dreaded news.
Your lover <<repfull $g.victim>> was apparently assaulted in <<their $g.victim>> room last night by a mysterious assailant. Luckily, your <<repfull _u>> happened to be nearby, and together they managed to repel the assailant. But damn, it did make your heart skipped a beat at the thought of losing your <<uadjgood $g.victim>> <<urace $g.victim>> lover. You make notes to yourself to force <<them $g.victim>> to sleep in your room tonight.
</p>
<p>
Maybe you'll hear more about this assailant, and you have plans on what to do with them once you get your hands on them. But in the mean time, maybe you should reward <<rep _u>> for <<their _u>> great service.
</p><<run new setup.Event(
'at_what_cost2', /* key */
"At What Cost", /* Title */
"darko", /* Author */
[ /* tags */
'playercapture',
],
'Event_at_what_cost2',
{ /* roles */
},
{ /* actors */
'you': null,
},
[ /* outcomes */
setup.qc.Opportunity('at_what_cost', {
you: "you",
}),
],
[ /* restrictions */
],
0, /* Cooldown */
100, /* Rarity */
)>><<include "Opportunity_at_what_cost">><<run new setup.Event(
'bodyswap_epilogue', /* key */
"Serial Bodyswapper Epilogue", /* Title */
"darko", /* Author */
[ 'desert',
], /* tags */
'Event_bodyswap_epilogue',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.EmptyUnitGroup('quest_the_serial_bodyswapper1'),
setup.qc.EmptyUnitGroup('quest_night_shift231'),
setup.qc.EmptyUnitGroup('quest_the_serial_bodyswapper2'),
setup.qc.Favor('humandesert', 250),
setup.qc.MoneyCustom(3000), ],
[ /* restrictions to generate */
],
50,
100,
)>><p>
It seems your actions have somehow stopped the bodyswapper activities in the eastern desert.
The grateful citizens pool up some money for your company, which you <<uadv $unit.player>> accept.
</p><<run new setup.Event(
'equivalent_exchange', /* key */
"Equivalent Exchange", /* Title */
"darko", /* Author */
[ /* tags */
'playercapture',
],
'Event_equivalent_exchange',
{ /* roles */
},
{ /* actors */
'you': null,
},
[ /* outcomes */
setup.qc.Opportunity('equivalent_exchange', {
you: "you",
}),
],
[ /* restrictions */
],
0, /* Cooldown */
100, /* Rarity */
)>><<include "Opportunity_equivalent_exchange">><<run new setup.Event(
'excalibur_missing_sword', /* key */
"Missing Sword", /* Title */
"darko", /* Author */
[ 'veteran',
], /* tags */
'Event_missing_sword',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.VarSet('quest_excalibur', '2', -1),
],
[ /* restrictions to generate */
setup.qres.VarEqual('quest_excalibur', '1'),
setup.qres.Building(setup.buildingtemplate.veteranhall),
],
1, /* cooldown */
100, /* rarity */
)>><<set _u = setup.getAnySlaver()>>
<p>
"Hear ye, hear ye. Brave adventurers are wanted, for the legendary sword Excalibur has been stolen from Lucgate."
</p>
<<if $varstore.get('quest_excalibur_done')>>
<p>
Oh no, not again.
It seems that a legendary sword has once again been lost soon after your company's heist into the city treasury.
Obviously given your company's history with the sword, none of your slavers would have dared to
bring or touch the sword. Still, you asked
your <<repfull _u>> whether <<they _u>> stole the sword, which the
<<urace _u>> answers negatively.
</p>
<p>
Rumors said that each Excalibur sword is different. Perhaps this Excalibur sword is not as feisty
as the previous one?
Probably not, but perhaps you are foolish enough to reattempt acquiring the sword...
If you really want to go through with such a terrible idea, you no doubt will need a
chivalrious, experienced, and wise slaver yet again.
</p>
<<else>>
<p>
Finishing the news, it seems that a legendary sword has been lost soon after your company's heist into the city treasury. You asked your <<repfull _u>> whether the sword was one of the items stolen during the heist. <<They _u>> shakes their head, "Sorry boss, but no". You had a thoughts or two about giving your slavers a hard lecture about "how-to-choose-object-to-steal", but on a second thought perhaps they made the right decision not to make the entire Kingdom of Tor your company's mortal enemy.
</p>
<p>
You wondered what could have possibly happened to the sword. Rumors said that the sword tend to show itself to a worthy swordsman who has proven their chivalry, experience, and wisdom, but it has never happened for centuries as no single <<man $unit.player>> is capable of having all three. You dismissed the tale as dumb before, but maybe it's the only hope for recovering the sword.
</p>
<p>
Then again recovering the sword is not really your business. What use does a band of slaver possibly have over some petty sword, after all? You should really get going with your day.
Still, the maybe you should keep the three aspects in mind.
Chivalry, experience, and wisdom, huh?
</p>
<</if>><<run new setup.Event(
'flickering_flame', /* key */
"Flickering Flame", /* Title */
"darko", /* Author */
[ /* tags */
],
'Event_flickering_flame',
{ /* roles */
},
{ /* actors */
'you': [
setup.qres.You(),
],
'lover': [
setup.qres.NotYou(),
setup.qres.CanBeLoverWithYou(),
],
},
[ /* outcomes */
setup.qc.Opportunity('flickering_flame', {
you: "you",
lover: "lover",
}),
],
[ /* restrictions */
],
100, /* Cooldown */
1, /* Rarity */
)>><<include "Opportunity_flickering_flame">><<run new setup.Event(
'corruption_rain', /* key */
"Corruption Rain", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_corruption_rain',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('demon', -20),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('demon', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
As you were going by your usual business, the sky above your fort (and only above your fort) suddenly turned pitch black. A black magical circle appears on the sky, raining dark spells down your fort.
Your slavers and slaves frantically try to dodge as many of the dark bullets as possible, which seemingly deal no damage to the structure but rapidly alter the flesh of whatever it touches.
</p>
<p>
Eventually, the spell fizzles leaving the sky bright once again. But the damage has been done, as several of your slavers and slaves who were at home at the time were noticably corrupted by the event.
</p>
<p>
Only powerful beings can possibly cast such a dangerous spell. Given the amount of dark energy though, this must be the work of the <<rep $company.demon>>, who you have angered recently.
</p><<run new setup.Event(
'ire_of_the_dark_dragon_lord', /* key */
"Ire of the Dark Dragon Lord", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_ire_of_the_dark_dragon_lord',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('dragonkin', -20),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('dragonkin', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Recently, you have somehow made a very dangerous enemy: a dark dragon
lord of the southern seas.
With your relationship finally reaching breaking point, however, the great dark dragon
has personally come to visit your fort and unleash woes upon it.
Before you could even react, the walls of your fort has melted into a slimy substance,
where tentacled abominations hurled free away from it, touching and corrupting the many flesh
it touches.
Eventually, the dragon lord felt that punishment was delivered and left your fort.
The fort itself remain intact, but many of its residents have been corrupted by the experience.
Perhaps it would be wiser not to make such a dangerous enemy...
</p><<run new setup.Event(
'revenge_of_the_elves', /* key */
"Revenge of the Elves", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_revenge_of_the_elves',
{ /* roles */
'elf': setup.unitgroup.elf,
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('elf', -20),
/* elven corruption is slightly weaker, only 5 corruption vs 6 */
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
setup.qc.CorruptRandomUnitHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('elf', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
A strange visitor has come to your fort, a <<male $g.elf>> of unknown origin.
<<They $g.elf>> comes seeking shelter for the harsh night, which you grant while
eyeing specifically whether the elf would make a great slave.
</p>
<p>
Later that night, your generosity was punished as the elf revealed <<themself $g.elf>>
as an emissary of a certain wizarding circle in <<rep $company.elf>>, whom you have angered recently.
As the elf chants an unknown language, the sky turned dark and soon enough,
you can hear writhing sounds coming from all over your fort.
You too get affected soonafter, and the moments passed in a blur of pain and ecstacy for you
and your slavers.
</p>
<p>
When you awake next month, the elf was nowhere to be seen. Fortunately it seems that no
damage was done to your fort, but its residents have noticably been corrupted by the turn of events.
</p><<run new setup.Event(
'disappearing_act', /* key */
"Disappearing Act", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_disappearing_act',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slave),
setup.qres.Available(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('elf', -20),
setup.qc.MissingUnitRecapture('victim', 'escapehard'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('elf', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Today has been a stressful day, with many new assignments and many antics from your slavers occupying your mind. As you contemplated using your <<repfull $g.victim>> to ease the stress, a sudden out-of-nowhere brown magical circle formed under <<rep $g.victim>>. Before your eyes, <<their $g.victim>> body disintegrates, no doubt being transported to another plane via portal magic. As the magic finished, there was no trace left of <<rep $g.victim>>, outside of their equipment which fell to the floor.
</p>
<p>
The elves are said to be master of such portal magic, and you suspect this is one of their doings. After all you have done to <<rep $company.elf>>, it should be no surprise that they retaliate. Still, somehow you were able to track down <<rep $g.victim>>'s location. <<uneedrescue $g.victim>>, but it will sure as hell be difficult to do.
</p><<run new setup.Event(
'the_dragonkin_beckons2', /* key */
"The Dragonkin Beckons", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_the_dragonkin_beckons2',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slave),
setup.qres.Available(),
],
},
{ /* actors */
'dragon': setup.unitgroup.dragonkin, },
[ /* outcomes */
setup.qc.Ire('dragonkin', -20),
setup.qc.MissingUnitRecapture('victim', 'escapehard'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('dragonkin', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
The sun shone brightly today, and just as you thought the day is perfect a sudden chill froze the entire compound. Paralyzed from an unknown force, you can't do anything but watched as a majestic blue-colored dragonkin descend from the sky into your compound. <<They $g.dragon>> calmly walked around your compound as if nothing happen, inspecting some of your slaves until settling at your <<repfullgood $g.victim>>. "You will do," said the dragonkin calmly as they took <<rep $g.victim>> and carried <<them $g.victim>> effortlessly back to the sky.
</p>
<p>
Whatever paralyzes you and your slavers dissipate soon after. After catching your breath, you look to the sky wondering if this was a retribution for your actions against the <<rep $company.dragonkin>>. You shrug it all off, and start planning your next move. <<urescuenow $g.victim>>, although it sure as hell won't be easy.
</p><<run new setup.Event(
'with_interest', /* key */
"With Interest", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_with_interest',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slave),
setup.qres.Available(),
],
},
{ /* actors */
'dragon': setup.unitgroup.dragonkin, },
[ /* outcomes */
setup.qc.Ire('bank', -20),
setup.qc.MissingUnitRecapture('victim', 'escapehard'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('bank', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Through your recent actions, your reputation with the powerful <<rep $company.bank>> has suffered greatly. And now, this has come to bite you in the ass as a representative of the bank came to your fort demanding the <<repfull $g.victim>> as payment for your grievances.
</p>
<p>
You are not planning to back down without a fight however, and as the slave is brought to <<their $g.victim>> new home, you use your connections to track down the slave. <<urescuenow $g.victim>>, but it won't be easy given the reputation of the <<rep $company.bank>>.
</p><<run new setup.Event(
'faraway_disapproval', /* key */
"Faraway Disapproval", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_faraway_disapproval',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humansea', -20),
setup.qc.Favor('humansea', -500),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humansea', 20),
setup.qres.FavorAtLeast('humansea', 500), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Despite the long distance, your company has somehow managed a positive relationship with the <<rep $company.humansea>>. But recent quests have painted your company in a much worse light for them, and apparently they had enough of it. In the coming days, you receive much less communication from these elusive people. It seems they have decided to sever connections with your company as the result of your recent actions.
</p><<run new setup.Event(
'the_nekos_disapprove', /* key */
"The Nekos Disapprove", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_the_nekos_disapprove',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('neko', -20),
setup.qc.Favor('neko', -500),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('neko', 20),
setup.qres.FavorAtLeast('neko', 500), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Your company has been a good friend to the <<rep $company.neko>>, the sexually driven cats. But you have angered some high-class citizens of the <<lore location_npc>> recently, and using their power, they boycotted your company from the city. As a result, your relationship with the nekos suffer greatly. Perhaps you should not have irked the cats too much.
</p><<run new setup.Event(
'the_werewolves_disapprove', /* key */
"The Werewolves Disapprove", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_the_werewolves_disapprove',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('werewolf', -20),
setup.qc.Favor('werewolf', -500), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('werewolf', 20),
setup.qres.FavorAtLeast('werewolf', 500), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Your company has been a good friend to the <<rep $company.werewolf>>. But recently, you have irked them quite a bit, and a result their confidence is your company is shaken to the core. Today, you receive a messenger from them, indicating their wishes to get more distant with your company. Ah well, perhaps they make better pets than allies.
</p><<run new setup.Event(
'bandit_ambush_ambush', /* key */
"Bandit Ambush Ambush", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_bandit_ambush_ambush',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('outlaws', -20),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('outlaws', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Several of your slavers reported with heavy injuries today. Apparently, when they were ambushing
a trading caravan, they were ambushed by a group of bandits who seemingly have been waiting for them.
Having carried no valuables with them, the slavers were beaten badly by this particular group of bandits
who seemed to carry some kind of grudge against your company.
</p>
<p>
There is nothing else you could do for now other than try to nurse their injuries as best as you could.
Perhaps you could get your revenge one day. A former-bandit slave is always useful to have.
</p><<run new setup.Event(
'hunting_party', /* key */
"Hunting Party", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_hunting_party',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('werewolf', -20),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('werewolf', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
During a tavern break, a group of your slavers were ambushed by a werewolf hunting party.
They appear to carry some kind of grudge against your company, perhaps due to your recent
actions against the <<rep $company.werewolf>>. Your slavers managed to barely escape,
sustaining heavy injuries in the process.
</p>
<p>
There is nothing else you could do for now other than try to nurse their injuries as best as you could.
You make a mental note to teach these pups a lesson one day -- your kennel could always use
more pets.
</p><<run new setup.Event(
'orc_hospitality', /* key */
"Orc Hospitality", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_orc_hospitality',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('orc', -20),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
setup.qc.InjureRandomSlaverHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('orc', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
During late night, you are woken up by the sounds of moaning and groaning coming from the fort gates. Several of your slavers came home badly injured from their short misadventure in a nearby tavern. Apparently, a group of orc brigands decided to rough them up for associating with your company, who has earned bad reputation among some circle of orcs.
</p>
<p>
There is nothing else you could do for now other than try to nurse their injuries as best as you could. Perhaps making enemies of the orcs were not such a bright idea after all...
</p><<run new setup.Event(
'bank_marketing_strategy', /* key */
"Bank Marketing Strategy", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_bank_marketing_strategy',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('bank', -20),
setup.qc.IreSpread('bank'),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('bank', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
You have made dangerous friends with some executives of the <<rep $company.bank>>.
And recently, they have begin to retaliate. Suddenly several other companies
view your company with much more disdain than usual, no doubt thanks to the bank
unleashing their marketers to spread bad words around.
The <<uadjgood $g.slaver>> <<urace $g.slaver>> slaver could offer you no advice
on this situation, other than perhaps not to anger the bank too much.
You considered for a little while to deduct the slaver's pay for such a dumb comment,
but ultimately decide to carry on with your day.
</p><<run new setup.Event(
'lies_and_slander', /* key */
"Lies and Slander", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_lies_and_slander',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humankingdom', -20),
setup.qc.IreSpread('humankingdom'),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humankingdom', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Recently, your company activities have irked certain powerful people in the undercity of Lucgate. And they have decided to retaliate against your company in the way they know best: by spreading lies and slander: "Let it be known that <<rep $company.player>> often raided villages in order to rape and enslave their women!", they say. Surely a total lie and slander! You make a mental note to ask your <<uadjgood $g.slaver>> <<ufriend $unit.player $g.slaver>> <<rep $g.slaver>> about this later.
</p>
<p>
Either way, many other companies now view your company with a level of disdain...
</p><<run new setup.Event(
'vale_gossip', /* key */
"Gossipers of the Vale", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_vale_gossip',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humanvale', -20),
setup.qc.IreSpread('humanvale'),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humanvale', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Recently, your company's evil deeds is at the tip of the tongue of many womens
of the <<lore region_vale>>. They spread the words quickly, and soon enough many are made aware
of the atrocious ventures your companies may or may not have done.
There is nothing you could do right now, but perhaps it would be wiser not to
anger these gossip-frenzied women of the <<lore region_vale>> next time...
</p><<run new setup.Event(
'eastern_swindlers', /* key */
"Eastern Swindlers", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_eastern_swindlers',
{ /* roles */
'slaver': [
setup.qres.NotYou(),
setup.qres.Job(setup.job.slaver),
],
'slaver2': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.MoneyCustom(-10000),
setup.qc.Ire('humandesert', -20), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humandesert', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
As you are doing the daily accounting for your money, you noticed a large sum has recently went missing. Upon further scrutiny, it seems that your company made a bad purchase some time in the eastern city. Apparently <<rep $g.slaver>> was swindled by an unscrupulous merchant from the east, losing much of your money. The <<uadjbad $g.slaver2>> slaver <<rep $g.slaver2>> were also swindled, and probably many more.
</p>
<p>
In fact, talking to the rest of the fort revealed that almost everyone seemingly have been swindled by a merchant or two in the recent days. Perhaps this is their way of showing their displeasure at your company from your deeds in the past. Perhaps you should be more careful in the future not to make these people your enemy, but in the meantime you can always channel your frustration into one of your slaves.
</p><<run new setup.Event(
'heisted_by_ninjas', /* key */
"Heisted by Ninjas", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_heisted_by_ninjas',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.MoneyCustom(-10000),
setup.qc.Ire('humansea', -20), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humansea', 20), ],
0,
0,
)>><p>
You were woken up by one of your slavers <<rep $g.slaver>> in the middle of the night. Normally you would give the <<uadjgood $g.slaver>> a good stern talking-to after such a rude awakening, but apparently <<they $g.slaver>> has a good reason for the urgency this time. Apparently according to the slaver your coffers have been robbed a group of ninjas, who came in the dead of the night, infiltrate the compound, and left with much of your money without nobody noticing anything.
</p>
<p>
As much as you wanted to blame luck for such a misfortune, this is most certainly the work of the residents of the southern seas, who your company have irked in the past.
</p><<run new setup.Event(
'robbery_bank', /* key */
"Robbery Bank", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_robbery_bank',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.MoneyCustom(-10000),
setup.qc.Ire('bank', -20), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('bank', 20), ],
0,
0,
)>><p>
Your slavers woke up today with a light feeling in their pockets. Literally this time, as somehow a huge sum of money went missing from your coffers. While you would normally suspect one of your slavers to spend too much on a drunken night (especially that <<uadjbad $g.slaver>> <<urace $g.slaver>> slaver of yours <<rep $g.slaver>>), the sum is simply too much to be spent by one <<man $g.slaver>>.
</p>
<p>
A few days later, you receive a thank you letter coming from the <<rep $company.bank>> for your investment in the bank. If you had doubts before, it is gone now — the bank has stole from you as recompense for the troubles you may have caused them in the past. As much as you wanted revenge, it is better to give up the plan especially against an entity as rich as the <<rep $company.bank>>. At least this should even out the goodwill, eh?
</p><<run new setup.Event(
'tax_collector', /* key */
"Tax Collector", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_tax_collector',
{ /* roles */
'tax': setup.unitgroup.humankingdom,
'slaver': [
setup.qres.NotYou(),
setup.qres.Job(setup.job.slaver),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.MoneyCustom(-10000),
setup.qc.Ire('humankingdom', -20), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humankingdom', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
A most unusual visitor has arrived at your fort today: A well-dressed
<<man $g.tax>>, probably in <<their $g.tax>> 40s, who came to your office
to collect some... tax?
It turned out to be a thinly-veiled threat, as your actions against the
<<rep $company.humankingdom>> has apparently raised the ire of some
powerful members of its undercity.
</p>
<p>
Consulting your <<uadjper $g.slaver>> <<urace $g.slaver>> slaver <<rep $g.slaver>>,
seems like the best approach here is to simply pay the tax.
These undercity mafias are business people after all, and a good chunk of money
will surely smooth out the relationship between the two companies.
</p>
<p>
As the tax collector departs you wonder what would have happened to your company
were you to refuse to pay... Best not to dwell on such questions and get back to work.
</p><<run new setup.Event(
'angry_peasants', /* key */
"Angry Peasants", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_angry_peasants',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humanvale', -20),
setup.qc.QuestDirect('angry_peasants'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humanvale', 20),
setup.qres.Building('veteranhall'),
],
0, /* Cooldown */
0, /* Rarity */
)>><<include 'Quest_angry_peasants'>><<run new setup.Event(
'desert_raiders', /* key */
"Desert Raiders", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_desert_raiders',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humandesert', -20),
setup.qc.QuestDirect('desert_raider'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humandesert', 20),
setup.qres.Building('veteranhall'),
],
0, /* Cooldown */
0, /* Rarity */
)>><<include 'Quest_desert_raider'>><<run new setup.Event(
'dragons_at_your_doorstep', /* key */
"Dragons at Your Doorstep", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_dragons_at_your_doorstep',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('dragonkin', -20),
setup.qc.QuestDirect('dragons_at_your_doorstep'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('dragonkin', 20),
setup.qres.Building('veteranhall'),
],
0, /* Cooldown */
0, /* Rarity */
)>><<include 'Quest_dragons_at_your_doorstep'>><<run new setup.Event(
'orc_invasion', /* key */
"Orc Invasion", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_orc_invasion',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('orc', -20),
setup.qc.QuestDirect('orc_invasion'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('orc', 20),
setup.qres.Building('veteranhall'),
],
0, /* Cooldown */
0, /* Rarity */
)>><<include 'Quest_orc_invasion'>><<run new setup.Event(
'brothel_pickup', /* key */
"Brothel Pickup", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_brothel_pickup',
{ /* roles */
'victim': [
setup.qres.Available(),
setup.qres.Job(setup.job.slave),
],
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humandesert', -20),
setup.qc.MissingUnit('victim'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humandesert', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Today, you have half a mind to tie up your <<repfull $g.slaver>> in your office as decoration. The slaver had fell victim to a pick-up scam:<<they $g.slaver>> is being promised great rewards and price in exchange for lending the slave <<rep $g.victim>> for a single week. And of course, the slave never came back, and the supposed business disappear into the vast deserts of the east...
</p>
<p>
As much as you'd like to castrate <<rep $g.victim>> for the stupidity, you also took a little part of the blame: this is probably done in part in retaliation for your recent aggressive actions against the <<rep $company.humandesert>>. Either way, the task now falls to your hand. <<uneedrescue $g.victim>>.
</p><<run new setup.Event(
'fort_rescue', /* key */
"Fort Rescue", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_fort_rescue',
{ /* roles */
'victim': [
setup.qres.Available(),
setup.qres.Job(setup.job.slave),
],
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humankingdom', -20),
setup.qc.MissingUnit('victim'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humankingdom', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Ever since slavery is banned ten years ago, the <<rep $company.humankingdom>> abhors slavery. This, compounded with your recent acts against them has made them painfully aware of your existence, and you have been wary of some sort of retaliation in the past few weeks.
</p>
<p>
Today, a small band of adventurers, no doubt sent over by <<rep $company.humankingdom>>, came over and launched a surprise attack on your fort. While you and your slavers managed to fend off their attacks from damaging the compound, there were nobody to guard the dungeons. When the assault ended, your slave <<rep $g.victim>> were nowhere to be seen, quite possibly being rescued by the adventurers on order from <<rep $company.humankingdom>>.
</p>
<p>
<<if $g.victim.isHasTrait('training_obedience_advanced')>>
Given the slave's trainings, it will be quite difficult for them to undo the slave into a normal <<urace $g.victim>> being again.
<<elseif $g.victim.isMindbroken()>>
It's unclear however, if the mindbroken slave can ever be reintegrated into the society.
<<else>>
The disobedient slave surely rejoices at <<their $g.victim>> daring rescue.
<</if>>
<<uneedrescue $g.victim>>, before <<they $g.victim>> disappear forever into the<<lore location_lucgate>>...
</p><<run new setup.Event(
'slaves_war', /* key */
"Slaves War", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_slaves_war',
{ /* roles */
'victim': [
setup.qres.Available(),
setup.qres.Job(setup.job.slave),
],
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('outlaws', -20),
setup.qc.MissingUnit('victim'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('outlaws', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Recently, your company's actions have undermined the general <<rep $company.outlaws>> society —
In particular, you have made enemies with one particular outlawed slaving company in the past few weeks. In a brazen retaliation, they have somehow kidnapped one of your slavers, the <<repfull $g.victim>>, straight from your fort. You have a mind to scold your <<repfull $g.slaver>> for allowing such a brazen kidnapping to happen, but on the other hand you should probably spend time thinking how to get the slave back, if you wish. <<uneedrescue $g.victim>>.
</p><<run new setup.Event(
'ex_slaver_for_sale', /* key */
"Ex-Slaver for Sale", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_ex_slaver_for_sale',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.NotYou(),
],
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('outlaws', -20),
setup.qc.MissingUnit('victim'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('outlaws', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
In the recent months, you have somehow made enemies with the local brigand gang. And today, you reap the consequences as your <<repfull $g.slaver>> reported that <<rep $g.victim>> is nowhere to be seen. Searching through the entire fort, from their room to the empty dungeon cells yielded nothing, as if <<rep $g.victim>> had just vanished into thin air. That is, until you saw the news that <<rep $g.victim>> is going to be auctioned soon in the undercity of Lucgate.
</p>
<p>
It is unfortunately already too late for you to participate in the auction, but from what you gathered this is the work of that <<rep $company.outlaws>> that you have irked recently. But there is no time to think about that —- <<uneedrescue $g.victim>>.
</p><<run new setup.Event(
'peasant_uprising', /* key */
"Peasant Uprising", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_peasant_uprising',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.NotYou(),
],
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humanvale', -20),
setup.qc.MissingUnit('victim'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humanvale', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Today, you are greeted by your <<repfull $g.slaver>>, who brings bad news. Last night, when <<they $g.slaver>> is out drinking in a nearby tavern with <<rep $g.victim>>, an angry mob of peasants came storming into the tavern. They demanded your head for all the atrocities your company has done against the <<rep $company.humanvale>>. Seeing you were not there drinking with them, they settled with kidnapping <<rep $g.victim>> to send you a strong message not to mess with them.
</p>
<p>
As much as you want to chastise <<rep $g.slaver>> for being stupid enough to patron such a tavern, you now have more important work to do if you ever want to see <<rep $g.victim>> again.
<<uneedrescue $g.victim>>, before <<they $g.victim>> suffer in the hand of the mobs...
</p><<run new setup.Event(
'whorebaited', /* key */
"Whorebaited", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_whorebaited',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.NotYou(),
],
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
'neko': setup.unitgroup.neko, },
[ /* outcomes */
setup.qc.Ire('neko', -20),
setup.qc.MissingUnit('victim'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('neko', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Recently, you noticed your <<repfull $g.victim>> spending more and more time with a certain neko <<lady $g.neko>> from the <<lore location_npc>>. You given it no notice since it sounds harmless enough, but today marks the fifth day that <<rep $g.victim>> has been missing from your compound.
</p>
<p>
Given the cleaned up state of <<their $g.victim>> room, it seems that <<rep $g.victim>> had been lured into voluntarily quitting your company. You started to wonder if this is the work of some people in <<rep $company.neko>>, whom you have angered recently. If it does, then whatever fate awaits the <<uadjgood $g.victim>> slaver will not be a good one. <<uneedrescue $g.victim>> from <<their $g.victim>> fake lover...
</p><<run new setup.Event(
'demonic_pitfall', /* key */
"Unknown Tentacle Object", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_demonic_pitfall',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('demon', -20),
setup.qc.MissingUnitRecapture('victim', 'capturedhard'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('demon', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Today, you spilled your drink in the morning, lost a sparring fight to <<rep $g.victim>> later, and triped on your own clothes and fell flat into the ground just now. Just as you thought your day could not get any worse, the sky suddenly turned dark. As you stare into the sky cursing your luck, a dark tendril lurches fast into your compound, grabbing your <<repfull $g.victim>>, and within moments sucked the slaver into the vortex.
</p>
<p>
While you are tempted to just blame it all on luck, this is probably the works of <<rep $company.demon>> whom you've angered recently. <<uneedrescue $g.victim>>, before god-knows what the demons will do to the poor <<urace $g.victim>> there beyond the mist.
</p><<run new setup.Event(
'hoisted_by_ninjas', /* key */
"Hoisted by Ninjas", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_hoisted_by_ninjas',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('humansea', -20),
setup.qc.MissingUnitRecapture('victim', 'capturedhard'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('humansea', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Your sleep today was disrupted by the sound of smoke and explosion coming from the <<rep setup.buildingtemplate.lodgings>>. When you arrived, you saw several ninjas standing on the roof of your fort with your <<repfull $g.victim>> bound and gagged in their clutches. In a flash, the ninjas disappear from your fort together with your slaver.
</p>
<p>
Fortunately, you have been somewhat prepared for this as you have expected retaliation from the <<rep $company.humansea>> for the horrible deeds you have committed over there. You're able to track down <<rep $g.victim>> to a distant location, but rescuing <<them $g.victim>> will surely be a challenge. <<urescuenow $g.victim>>.
</p><<run new setup.Event(
'the_dragonkin_beckons', /* key */
"The Dragonkin Beckons", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_the_dragonkin_beckons',
{ /* roles */
'victim': [
setup.qres.Job(setup.job.slaver),
setup.qres.Available(),
setup.qres.NotYou(),
],
},
{ /* actors */
'dragon': setup.unitgroup.dragonkin, },
[ /* outcomes */
setup.qc.Ire('dragonkin', -20),
setup.qc.MissingUnitRecapture('victim', 'capturedhard'), ],
[ /* restrictions to generate */
setup.qres.IreAtLeast('dragonkin', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
The sun shone brightly today, and just as you thought the day is perfect a sudden chill froze the entire compound. Paralyzed from an unknown force, you can't do anything but watched as a majestic blue-colored dragonkin descend from the sky into your compound. <<They $g.dragon>> calmly walked around your compound as if nothing happen, inspecting some of your slavers until settling at your <<repfullgood $g.victim>>. "You will do," said the dragonkin calmly as they took <<rep $g.victim>> and carried <<them $g.victim>> effortlessly back to the sky.
</p>
<p>
Whatever paralyzes you and your slavers dissipate soon after. After catching your breath, you look to the sky wondering if this was a retribution for your actions against the <<rep $company.dragonkin>>. You shrug it all off, and start planning your next move. <<urescuenow $g.victim>>, although it sure as hell won't be easy.
</p><<run new setup.Event(
'nightmares', /* key */
"Nightmares", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_nightmares',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('demon', -20),
setup.qc.TraumatizeRandomSlaverHome(),
setup.qc.TraumatizeRandomSlaverHome(),
setup.qc.TraumatizeRandomSlaverHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('demon', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
In the recent weeks, you and some other slavers have started to experience more and more haunting nightmares. While initially it started innocuously with falling into an endless pit, lately the nightmares have become more intrusive. At one point you dreamt being held in front of a succubus, being forced to watch as your <<uadjgood $g.slaver>> <<urace $g.slaver>> slaver <<rep $g.slaver>> were sexually tortured in front of you.
</p>
<p>
The experience has deeply traumatized some inhabitants of the fort. You are certain this is the work of some other entities out there, perhaps as a result of you angering the <<rep $company.demon>> recently.
</p><<run new setup.Event(
'spirit_dream', /* key */
"Spirit Dream", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_spirit_dream',
{ /* roles */
'slaver': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('werewolf', -20),
setup.qc.TraumatizeRandomSlaverHome(),
setup.qc.TraumatizeRandomSlaverHome(),
setup.qc.TraumatizeRandomSlaverHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('werewolf', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
As you begin your work today, the <<uadjgood $g.slaver>> slaver <<rep $g.slaver>> came to your
office bearing grave news. Some of your slavers had experienced a dream so nightmarish,
that they are now traumatized.
</p>
<p>
From what you gather from the mess that is your traumatized slavers, they dreamt of various
evil spirits, which plagued their dreams in the past few weeks. The description of the spirit
matches a certain furry guardian of the werewolves, which made you certain this must be the work
of some werewolf tribe out there who bear some grudge against your company. Maybe next time you
can be more careful when dealing with these pups.
</p><<run new setup.Event(
'waking_dream', /* key */
"Waking Dream", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_waking_dream',
{ /* roles */
'elf': setup.unitgroup.elf,
},
{ /* actors */
},
[ /* outcomes */
setup.qc.Ire('elf', -20),
setup.qc.TraumatizeRandomSlaverHome(),
setup.qc.TraumatizeRandomSlaverHome(),
setup.qc.TraumatizeRandomSlaverHome(),
],
[ /* restrictions to generate */
setup.qres.IreAtLeast('elf', 20), ],
0, /* Cooldown */
0, /* Rarity */
)>><p>
Recently, you noticed some of your slavers look as if they haven't slept in days.
When you question them, they have apparently been unable to sleep due to seeing
the same unnerving dream each time:
they are seated in front of the sternest looking elf <<lady $g.elf>> they have ever seen,
lecturing them on their evil deeds and making them promise to do better in the future.
Fortunately it does not seem to affect most of your slavers, which means only a select few
were traumatized by this.
</p>
<p>
You wonder if this is the work of some dissidents of the <<rep $company.elf>>.
Perhaps you should try not to anger them next time...
</p><<run new setup.UnitGroup(
'quest_event_loan_tiger1',
"Loan Tiger Agent",
[
[setup.unitpool.race_neko_male, 0.5],
[setup.unitpool.race_neko_female, 0.5], ],
1, /* reuse chance */
[
setup.qc.BgTraitReset('unit', setup.trait.bg_clerk),
setup.qc.TraitReplace('unit', setup.trait.per_thrifty), ],
)>>
<<run new setup.Event(
'loan_tiger', /* key */
"Loan Tiger", /* Title */
"darko", /* Author */
[ 'special',
], /* tags */
'Event_loan_tiger',
{ /* roles */
'you': [
setup.qres.You(),
],
},
{ /* actors */
'tiger': setup.unitgroup.quest_event_loan_tiger1, },
[ /* outcomes */
setup.qc.SlaverMarker('tiger'),
setup.qc.Favor('bank', 100),
setup.qc.Opportunity('loan_tiger'),
],
[ /* restrictions to generate */
],
1,
100,
)>><p>
It's not everyday that a slaver such as yourself receives visitors, but today you are visited by a representative from the <<rep $company.bank>>. The <<name $company.bank>> is perhaps the largest banking institution in the region, and they are headquartered in the <<lore location_npc>> —- a city in the western forests predominantly inhabited by <<rep setup.trait.race_neko>> people.
</p>
<p>
<<They $g.tiger>> introduces <<themself $g.tiger>> as <<name $g.tiger>>. "You must be <<= $g.you.getName()>>, the leader of a" - he pauses a bit - "new mercenary company in this area. <<name $g.tiger>> have heard of your recent deeds, and is quite impressed." As it turns out, your company's activities has reached the institution. You do not have to guess what such institution wants from your company as <<name $g.tiger>> proceeds to open <<their $g.tiger>> expensive-looking suitcase filled to the brim with documents, and hands you over a loan agreement. "The bank and also <<name $g.tiger>> trusted that your company can benefit from this offer." - <<they $g.tiger>> adds.
</p>
<p>
You put the documents in your desk to read later. You asked one of your slavers to give <<name $g.tiger>> a tour of your fort while you get back to work.
</p><<run new setup.Event(
'loan_tiger__payment', /* key */
"Loan Tiger: Payment", /* Title */
"darko", /* Author */
[ 'special',
], /* tags */
'Event_loan_tiger__payment',
{ /* roles */
},
{ /* actors */
'tiger': setup.unitgroup.quest_event_loan_tiger1, },
[ /* outcomes */
setup.qc.SlaverMarker('tiger'),
setup.qc.Money(-15000), ],
[ /* restrictions to generate */
],
1,
100,
)>><p>
A year ago, you borrows some money from the <<rep $company.bank>>. Today, the charming representative of the bank is back at your company to collect the loan.
<<if $company.player.getMoney() >= 15000>>
You have allocated some funds for this purpose, which <<name $g.tiger>> happily took.
"<<name $g.tiger>> is pleased to do business with you." - <<they $g.tiger>> cordially said as they leave your fort with the bag of money.
<<else>>
Paying the money puts your company in significant debt, but a promise is a promise as <<name $g.tiger>> took the money.
"<<name $g.tiger>> is pleased to do business with you, but <<name $g.tiger>> hopes your company will be doing well." - <<they $g.tiger>> apologetically said as they leave your fort with the bag of money.
<</if>>
</p><<run new setup.Event(
'lost_flame', /* key */
"Lost Flame", /* Title */
"darko", /* Author */
[ /* tags */
],
'Event_lost_flame',
{ /* roles */
},
{ /* actors */
'you': [
setup.qres.You(),
],
'lover': [
setup.qres.Job(setup.job.slaver),
setup.qres.YourLover(),
setup.qres.FriendshipWithYouAtMost(setup.LOVERS_BREAKUP_FRIENDSHIP - 1),
],
},
[ /* outcomes */
setup.qc.BreakupWithYou('lover'),
],
[ /* restrictions */
],
0, /* Cooldown */
0, /* Rarity */
)>><p>
You never realized how you and your <<urace $g.lover>> lover <<rep $g.lover>> has grown distant over the last few weeks. No longer you feel the heat rising within you when you look into <<their $g.lover>> <<ueyes $g.lover>>, and lately you almost see a stranger inside the <<man $g.lover>> you once loved.
</p>
<p>
It was not really a surprise then when <<rep $g.lover>> came to you to declare the relationship over. It was doomed to happen sooner or later, and you both just have to get over it as quickly as possible.
</p><<run new setup.Event(
'renovation_feast', /* key */
"Grand Hall Built", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_renovation_feast',
{ /* roles */
'slaver1': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
'slaver2': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
'slaver3': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
'slaver4': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
],
[ /* restrictions to generate */
],
50,
100,
)>><p>
This week, you have built the
<<rep setup.buildingtemplate.grandhall>> of your fort. The fort is starting to feel like home now, with all the basic improvements required for a slaving career fully built.
You decided to do a little tour of the fort for today.
</p>
<p>
You found <<rep $g.slaver1>> <<uadv $g.slaver1>> snoozing away in the <<rep setup.buildingtemplate.lodgings>> area, on a comfortable bed this time rather than outside in the rain.
Exiting the lodging area, you now arrive at an open space designated as the <<rep setup.buildingtemplate.hiringsquare>>, where you can hire new slavers into your fort, which will then go to <<rep setup.buildingtemplate.prospectshall>>. Next is the newly built <<rep setup.buildingtemplate.grandhall>> —- a wide open space where you can gather your slavers for important occassions. It's empty right now, save for <<rep $g.slaver2>> who is busy <<uadv $g.slaver2>> arguing with <<rep $g.slaver3>>.
</p>
<p>
Not wanting to get into their argument, you enter the work area, a series of office rooms to sort out the paperwork that will surely become your daily business. The incoming mails are received in the <<rep setup.buildingtemplate.mailroom>>, which is next to your main office. A separate room has been designated as the <<rep setup.buildingtemplate.marketingoffice>>, where you can arrange slaves to be pawned for money.
</p>
<p>
Finally, you descend to the basements of your fort. While initially it was full of rubble, they have been mostly cleared and part of the basement has been turned into a dungeons complex. Here you can keep slaves either to sell them later, or for your own and your slavers' amusement. Who knows, maybe one day you'll be able to affort the <<rep setup.buildingtemplate.bedchamberwing>> and keep a harem for your own. Newly gathered slaves will be placed in the <<rep setup.buildingtemplate.slavepens>> just outside your fort.</p>
<p>
Your fellow slaver <<rep $g.slaver4>> <<uadv $g.slaver4>> greets you, and expressed <<their $g.slaver4>> appreciation of your work leading the group so far. The team indeed feels a little more like family now. Still, there are more work to be done. Perhaps you can aim to renovate the empty space above your <<rep setup.buildingtemplate.grandhall>> —- a <<rep setup.buildingtemplate.veteranhall>> would surely be a nice addition to your fort.
</p><<run new setup.Event(
'stolen_flame', /* key */
"Stolen Flame", /* Title */
"darko", /* Author */
[ /* tags */
'fort',
],
'Event_stolen_flame',
{ /* roles */
},
{ /* actors */
'lover': [
setup.qres.Job(setup.job.slaver),
setup.qres.YourLover(),
],
},
[ /* outcomes */
setup.qc.VarSet('future_assassin_progress', '2', -1),
setup.qc.QuestDirect('stolen_flame', {
lover: "lover",
}),
],
[ /* restrictions */
setup.qres.VarEqual('future_assassin_progress', '1'),
setup.qres.VarNull('future_assassin_cooldown'),
setup.qres.ExistUnit([
setup.qres.Job(setup.job.slaver),
setup.qres.HasTag('future_assassin_parent')
]),
],
0, /* Cooldown */
1, /* Rarity */
)>><<include "Quest_stolen_flame">><<run new setup.Event(
'the_quest_for_excalibur__epilogue', /* key */
"The Quest for Excalibur: Epilogue", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_the_quest_for_excalibur__epilogue',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.VarRemove('quest_excalibur'),
setup.qc.VarSet('quest_excalibur_done', '1', -1),
],
[ /* restrictions to generate */
],
0, /* Cooldown */
100, /* Rarity */
)>><<set _u = setup.getAnySlaver()>>
<p>
You have recently heard from your <<repfull _u>> that the<<lore location_lucgate>> actually stores a massive amount of Excalibur swords in its vaults.
Those swords are dangerous in the wrong hands, possessing their wielders to do terribly good things.
Surely a slaving company such as yours has nothing to do with 'em.
</p>
<p>
You do your best to reassure yourself of this in the coming days.
</p><<run new setup.Title(
"quest_love_trialist_0", /* key */
"Love Trialist", /* name */
"Participant in the Trials of Love", /* description */
"is currently participating in the Trials of Love", /* unit text */
0, /* slave value */
{ /* skill additives */
},
)
>>
<<run new setup.Event(
'trial_of_love_cancelled', /* key */
"Trial of Love Cancelled", /* Title */
"darko", /* Author */
[ /* tags */
],
'Event_trial_of_love_cancelled',
{ /* roles */
},
{ /* actors */
},
[ /* outcomes */
setup.qc.RemoveTitleGlobal('quest_love_trialist_0'),
setup.qc.VarRemove('trial_of_love_progress'),
setup.qc.VarSet('trial_of_love_cooldown', '1', 15),
],
[ /* restrictions */
setup.qres.ExistUnit([
setup.qres.HasTitle('quest_love_trialist_0'),
setup.qres.Not(setup.qres.BestFriend(setup.qres.HasTitle('quest_love_trialist_0')))
]),
],
0, /* Cooldown */
0, /* Rarity */
)>><p>
The slavers you sent previously on the trial of love are apparently no longer lovers. This immediately disqualifies them from continuing the trials. You'll just have to wait for another opportunity to show up before reattempting.
</p><<run new setup.Event(
'veteran_celebration', /* key */
"Veteran Celebration", /* Title */
"darko", /* Author */
[ ], /* tags */
'Event_veteran_celebration',
{ /* roles */
'slaver1': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
'slaver2': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
'slaver3': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
'slaver4': [
setup.qres.Job(setup.job.slaver),
setup.qres.NotYou(),
],
},
{ /* actors */
},
[ /* outcomes */
],
[ /* restrictions to generate */
],
50,
100,
)>><p>
This week marks the <<= $calendar.getWeek()>>-th week of your slaving career. Finally, the fort is looking like a proper villain headquarters —- the walls surrounding the fort has been fully repaired. Visitors are greeted with an imposing iron gate, behind which stands your mighty fort. The <<rep setup.buildingtemplate.grandhall>> greets the visitors entering your fort, and the newly built <<rep setup.buildingtemplate.veteranhall>> majestically tower over it.
</p>
<p>
It took a lot of money and work to get here, and in no small part also thanks to your slaving family. You see your slavers similarly celebrating the construction of the <<rep setup.buildingtemplate.veteranhall>>. <<rep $g.slaver1>> <<uadv $g.slaver1>> admiring the equipments in the <<rep setup.buildingtemplate.armory>>, which is next to the <<rep setup.buildingtemplate.warehouse>> where you store all your other items.
From the windows of your fort you can see <<rep $g.slaver3>> <<uadv $g.slaver3>> training in the <<rep setup.buildingtemplate.traininggrounds>> of your fort. There, you can welcome new slavers into your family and rapidly train them in the art of slaving.
</p>
<p>
Your fort now has a proper <<rep setup.buildingtemplate.hospital>> to nurse your injured slavers.
The <<rep setup.buildingtemplate.moraleoffice>> is located next, and here you can manage your slaver's relationships with each other. The office complex has also been expanded with the <<rep setup.buildingtemplate.dutyroom>>, where you can assign slaver (and slaves too, later) to perform important duties in your fort.
</p>
<p>
Down in the basement <<rep $g.slaver2>> <<uadv $g.slaver2>> <<if $g.slaver2.isHasTrait('per_kind')>>
frowns
<<else>>
licks <<their $g.slaver2>> lips
<</if>>
imagining what kind of pain you can inflict on the slaves in the <<rep setup.buildingtemplate.trainingchamber>>.
</p>
<p>
With the <<rep setup.buildingtemplate.veteranhall>> fully built, the world is now fully open to you. Whatever your goal is, be it wealth, fame, power, or pleasure, you can pursue it now. Now that your company is well known, clients may offer your company more dangerous quests. While these quests are dangerous in nature, they promise unique rewards not found anywhere else. Perhaps you can consider sending your slavers to attempt some of these...
</p><<run new setup.Title(
"quest_mysterious_wanderer_0", /* key */
"Mysterious Wanderer", /* name */
"A mysterious wonderer who one day showed up at your fort", /* description */
"has a mysterious past that you know little about", /* unit text */
0, /* slave value */
{ /* skill additives */
},
)
>>
<<run new setup.Title(
"quest_shapeshifter__werewolf_1", /* key */
"Shapeshifter: Werewolf", /* name */
"Either through heritage or advanced magic, this unit is capable of shifting forms between northerner and werewolf", /* description */
"is a shapeshifter capable of shifting form between ordinary northerner and a hulking werewolf", /* unit text */
3000, /* slave value */
{ /* skill additives */
brawn: 1,social: 1,},
)
>>
<<run new setup.UnitGroup(
"wanderer_joins1",
"Wanderer",
[ /* pools */
[setup.unitpool.race_humanvale_male, 0.5],
[setup.unitpool.race_humanvale_female, 0.5],
],
0, /* reuse chance */
[ /* unit post process */
setup.qc.BgTraitReset('unit', setup.trait.bg_nomad),
setup.qc.TraitsReplace('unit', [setup.trait.face_attractive, setup.trait.per_loner]),
setup.qc.AddTitle('unit', 'quest_mysterious_wanderer_0'),
],
)>>
<<run new setup.Event(
'wanderer_joins', /* key */
"Wanderer Joins", /* Title */
"darko", /* Author */
[ /* tags */
],
'Event_wanderer_joins',
{ /* roles */
},
{ /* actors */
'wanderer': 'wanderer_joins1',
},
[ /* outcomes */
setup.qc.Slaver('wanderer', "has an unknown past", undefined),
setup.qc.VarSet('wanderer_joins_cooldown', "1", 4),
],
[ /* restrictions */
setup.qres.Building('prospectshall'),
setup.qres.NoUnitWithTitle('quest_mysterious_wanderer_0', {
}),
setup.qres.NoUnitWithTitle('quest_shapeshifter__werewolf_1', {
}),
],
300, /* Cooldown */
0, /* Rarity */
)>><p>
Your fort has received a guest today — a hooded northerner who claims to seek company of fellow <<women $g.wanderer>>. Seeing your company occupying a previously abandoned fort, <<they $g.wanderer>> saw an opportunity, which leads <<them $g.wanderer>> to where <<they $g.wanderer>> is now.
</p>
<p>
You were not able to gather much about the <<man $g.wanderer>>'s past, but at this point you are hard-pressed for slavers that it might be a good decision to hire the <<uadjphys $g.wanderer>> <<man $g.wanderer>>.
</p>
<p>
<<successtext 'Please note'>>: If you want to hire <<them $g.wanderer>>, you have to do so using by going into your <<rep setup.buildingtemplate.prospectshall>>.
</p><<run new setup.Event(
'wanderer_missing', /* key */
"Wanderer Missing", /* Title */
"darko", /* Author */
[ /* tags */
],
'Event_wanderer_missing',
{ /* roles */
},
{ /* actors */
'wanderer': [
setup.qres.Job(setup.job.slaver),
setup.qres.HasTitle('quest_mysterious_wanderer_0'),
],
},
[ /* outcomes */
setup.qc.Leave('wanderer', "went missing from your company", 1),
setup.qc.IfThenElse(
setup.qres.VarGte('wanderer_joins_missing', 2),
setup.qc.DoAll([
setup.qc.QuestDirect('the_wanderer_wanders', {
wanderer: "wanderer",
})
], undefined),
setup.qc.DoAll([
], undefined)),
setup.qc.VarAdd('wanderer_joins_missing', 1, -1),
],
[ /* restrictions */
setup.qres.VarNull('wanderer_joins_cooldown'),
],
8, /* Cooldown */
0, /* Rarity */
)>><<set _iter = $varstore.get('wanderer_joins_missing') || 0>>
<<set _u = setup.getAnySlaver()>>
<p>
Your usually <<uadj $g.wanderer>> <<rep $g.wanderer>> is nowhere to be seen.
<<if _iter > 2>>
But you're not a little bit surprised by now — It almost has become a routine that <<rep $g.wanderer>> must disappear from your fort every now and then. Perhaps you can adjust your schedule to fit this variable in, or perhaps you can try to find the root cause of <<their $g.wanderer>> disappearances...
<<elseif _iter > 0>>
As you recall, this isn't the first time the mysterious slaver disappeared from your fort. The last time <<they $g.wanderer>> disappeared, <<they $g.wanderer>> dodged all of your questions asking where <<they $g.wanderer>> have gone to. You're starting to think if you should dock the <<uadjper $g.wanderer>> slaver's pay...
<<else>>
Even with your <<repfull _u>> helping you comb the entire fort, there was no trace of <<rep $g.wanderer>> to be found. Strange, you think to yourself, but perhaps the slaver just need some time for <<themself $g.wanderer>>. <<They $g.wanderer>>'ll probably be back by next week to collect <<their $g.wanderer>> pay as usual.
<</if>>
</p><<set setup.event = {}>>
<<set _passages = Story.lookup('tags', 'event')>>
<<for _ipassage, _passage range _passages>>
<<include _passage.title>>
<</for>><<set setup.familyrelation = {}>>
<<run new setup.FamilyRelation('brother', 'brother', ['sibling', 'incest',])>>
<<run new setup.FamilyRelation('sister', 'sister', ['sibling', 'incest',])>>
<<run new setup.FamilyRelation('twinbrother', 'twin brother', ['twin', 'sibling', 'incest',])>>
<<run new setup.FamilyRelation('twinsister', 'twin sister', ['twin', 'sibling', 'incest',])>>
<<run new setup.FamilyRelation('father', 'father', ['parent', 'incest',])>>
<<run new setup.FamilyRelation('mother', 'mother', ['parent', 'incest',])>>
<<run new setup.FamilyRelation('son', 'son', ['child', 'incest',])>>
<<run new setup.FamilyRelation('daughter', 'daughter', ['child', 'incest',])>><<include 'InitFurnitureSlaverBed'>>
<<include 'InitFurnitureSlaveBed'>>
<<include 'InitFurnitureFoodTray'>>
<<include 'InitFurnitureDrinkTray'>>
<<include 'InitFurnitureReward'>>
<<include 'InitFurniturePunishment'>>
<<include 'InitFurnitureLighting'>>
<<include 'InitFurnitureTile'>>
<<include 'InitFurnitureObject'>>
<<include 'InitFurnitureWall'>>
/* must be at bottom */
<<include 'InitFurniturePool'>><<run new setup.ItemPool(
'furniture_normal',
{
f_slaverbed_normal: 1,
f_slavebed_normal: 1,
f_foodtray_normal: 1,
f_drinktray_normal: 1,
f_reward_normal: 1,
f_punishment_normal: 1,
f_lighting_normal: 1,
f_tile_normal: 1,
f_object_normal: 1,
f_wall_normal: 1,
}
)>>
<<run new setup.ItemPool(
'furniture_good',
{
f_slaverbed_good: 1,
f_slavebed_good: 1,
f_foodtray_good: 1,
f_drinktray_good: 1,
f_reward_good: 1,
f_punishment_good: 1,
f_lighting_good: 1,
f_tile_good: 1,
f_object_good: 1,
f_wall_good: 1,
}
)>>
<<run new setup.ItemPool(
'furniture_master',
{
f_slaverbed_master: 1,
f_slavebed_master: 1,
f_foodtray_master: 1,
f_drinktray_master: 1,
f_reward_master: 1,
f_punishment_master: 1,
f_lighting_master: 1,
f_tile_master: 1,
f_object_master: 1,
f_wall_master: 1,
}
)>><<run new setup.Furniture(
'f_drinktray_none',
'floor',
'Drink from a depression on the floor',
/* value = */ 0,
setup.furnitureslot.drinktray,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_drinktray_normal',
'water bowl',
'A small water bowl for your slaves to drink from',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.drinktray,
['normal'],
{
social: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_drinktray_good',
'gilded water bowl',
'Luxurious-looking water bowl placed on the floor for your slaves to lap water from',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.drinktray,
['good'],
{
social: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_drinktray_master',
'Golden Chalice of Tor',
'An incredibly lavish chalice stolen from the secret coffers of the Kingdom of Tor',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.drinktray,
['master'],
{
social: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_foodtray_none',
'floor',
'Eat from the floor',
/* value = */ 0,
setup.furnitureslot.foodtray,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_foodtray_normal',
'pet food tray',
'Doggy bowl for your slaves to eat from',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.foodtray,
['normal'],
{
knowledge: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_foodtray_good',
'gilded pet food tray',
'Luxurious-looking doggy bowl for your slaves to eat from',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.foodtray,
['good'],
{
knowledge: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_foodtray_master',
'PLACEHOLDER foodtray master title',
'PLACEHOLDER foodtray master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.foodtray,
['master'],
{
knowledge: setup.FURNITURE_SKILL_MASTER,
},
)>>
<<run new setup.Furniture(
'f_foodtray_normal_hermit',
"wooden food bowl of wizardry",
"An ordinary and worn-out food bowl, given to you by the infamous Hermit of the Crags. \
No matter which angle you see it from, it looks nothing more than a worthless food bowl, \
but every now and then it glows purple with strange magic",
/* value = */ 100,
setup.furnitureslot.foodtray,
['normal'],
{
knowledge: setup.FURNITURE_SKILL_NORMAL,
arcane: 1,
},
)>><<set setup.furnitureslot = {}>>
<<run new setup.FurnitureSlot('slaverbed', 'slaver bed')>>
<<run new setup.FurnitureSlot('slavebed', 'slaves beds')>>
<<run new setup.FurnitureSlot('foodtray', 'food tray')>>
<<run new setup.FurnitureSlot('drinktray', 'drink container')>>
<<run new setup.FurnitureSlot('reward', 'slave reward')>>
<<run new setup.FurnitureSlot('punishment', 'slave punishment')>>
<<run new setup.FurnitureSlot('lighting', 'lighting')>>
<<run new setup.FurnitureSlot('tile', 'floor decoration')>>
<<run new setup.FurnitureSlot('object', 'object decoration')>>
<<run new setup.FurnitureSlot('wall', 'wall decoration')>><<run new setup.Furniture(
'f_lighting_none',
'candle',
'Some candles to dimly light the room',
/* value = */ 0,
setup.furnitureslot.lighting,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_lighting_normal',
'candlestick',
'Tall candlesticks illuminate the room',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.lighting,
['normal'],
{
survival: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_lighting_good',
'chandelier',
'Large chandelier of elven design that can hang from the ceiling',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.lighting,
['good'],
{
survival: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_lighting_master',
'PLACEHOLDER lighting master title',
'PLACEHOLDER lighting master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.lighting,
['master'],
{
survival: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_object_none',
'none',
'Nothing to decorate the space',
/* value = */ 0,
setup.furnitureslot.object,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_object_normal',
'statue',
'A non-descript statue that barely looks beautiful',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.object,
['normal'],
{
brawn: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_object_good',
'exotic statue',
'An exotic statue of an incredibly sexy humanified god',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.object,
['good'],
{
brawn: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_object_master',
'PLACEHOLDER object master title',
'PLACEHOLDER object master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.object,
['master'],
{
brawn: setup.FURNITURE_SKILL_MASTER,
},
)>>
<<run new setup.Furniture(
'f_object_master_fuckmachine',
'Fuckmachine',
'A protruding stick ending up with a large dildo with a solid box base. The box is powered by magic to move the lewd dildo up and down. Unlocks a new interaction with anally-trained slaves in the same bedchamber',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.object,
['master'],
{
brawn: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_punishment_none',
'nothing',
'Spanks for naughty slaves!',
/* value = */ 0,
setup.furnitureslot.punishment,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_punishment_normal',
'whip',
'A worn-out whip for inflicting discipline on slaves',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.punishment,
['normal'],
{
slaving: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_punishment_good',
'cross',
'A large cross to secure your slaves for a good session of bondage',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.punishment,
['good'],
{
slaving: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_punishment_master',
'PLACEHOLDER punishment master title',
'PLACEHOLDER punishment master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.punishment,
['master'],
{
slaving: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_reward_none',
'nothing',
'Pets for your pets!',
/* value = */ 0,
setup.furnitureslot.reward,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_reward_normal',
'ball',
'A small ball your slaves can play with when their owners are not around',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.reward,
['normal'],
{
aid: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_reward_good',
'climbing platform',
'A monkey climbing platform for your slaves to amuse themselves when their owners are not around',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.reward,
['good'],
{
aid: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_reward_master',
'PLACEHOLDER reward master title',
'PLACEHOLDER reward master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.reward,
['master'],
{
aid: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_slavebed_none',
'floor',
'Sleep on the floor',
/* value = */ 0,
setup.furnitureslot.slavebed,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_slavebed_normal',
'iron cages',
'Iron cages to keep your slaves comfortable inside',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.slavebed,
['normal'],
{
intrigue: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_slavebed_good',
'gilded cages',
'Gilded cages to keep and showcase your slaves inside',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.slavebed,
['good'],
{
intrigue: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_slavebed_master',
'PLACEHOLDER slavebed master title',
'PLACEHOLDER slavebed master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.slavebed,
['master'],
{
intrigue: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_slaverbed_none',
'bedroll',
'A worn-out bedroll',
/* value = */ 0,
setup.furnitureslot.slaverbed,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_slaverbed_normal',
'wooden bed',
'Sturdy but cheap wooden bed',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.slaverbed,
['normal'],
{
sex: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_slaverbed_good',
'luxurious bed',
'A luxurious double bed complete with a canopy',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.slaverbed,
['good'],
{
sex: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_slaverbed_master',
'Silver Wolf Bed',
'An extremely luxurious canopy bed decorated masterfully with beautiful and exotic animal furs',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.slaverbed,
['master'],
{
sex: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_tile_none',
'floor',
'Dirty floor with nothing covering it',
/* value = */ 0,
setup.furnitureslot.tile,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_tile_normal',
'rug',
'Some cheap-looking rug keeping the floor nice and tidy',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.tile,
['normal'],
{
combat: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_tile_good',
'exotic rug',
'Exotic rugs from the southern seas that makes for a beautiful decoration',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.tile,
['good'],
{
combat: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_tile_master',
'PLACEHOLDER tile master title',
'PLACEHOLDER tile master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.tile,
['master'],
{
combat: setup.FURNITURE_SKILL_MASTER,
},
)>><<run new setup.Furniture(
'f_wall_none',
'wall',
'The walls are unevenly painted',
/* value = */ 0,
setup.furnitureslot.wall,
['basic'],
{},
)>>
<<run new setup.Furniture(
'f_wall_normal',
'painting',
'Some paintings bought for cheap in the<<lore location_lucgate>>',
/* value = */ setup.FURNITURE_PRICE_NORMAL,
setup.furnitureslot.wall,
['normal'],
{
arcane: setup.FURNITURE_SKILL_NORMAL,
},
)>>
<<run new setup.Furniture(
'f_wall_good',
'exotic painting',
'Beautiful paintings of various natural sceneries',
/* value = */ setup.FURNITURE_PRICE_GOOD,
setup.furnitureslot.wall,
['good'],
{
arcane: setup.FURNITURE_SKILL_GOOD,
},
)>>
<<run new setup.Furniture(
'f_wall_master',
'PLACEHOLDER wall master title',
'PLACEHOLDER wall master description',
/* value = */ setup.FURNITURE_PRICE_MASTER,
setup.furnitureslot.wall,
['master'],
{
arcane: setup.FURNITURE_SKILL_MASTER,
},
)>>These are credits for various icons and miscelianous images used in the game.
For portrait credits, they can be found in-game, either by clicking the portrait,
or by going to the (interact with unit) menu.
Various images from wikimedia
CSS patterns from heropatterns.com
broken bone by Veysel Kara from the Noun Project
Muscle by Ayub Irawan from the Noun Project
Male by Yo! Baba from the Noun Project
Female by Yo! Baba from the Noun Project
Farmer by Adrien Coquet from the Noun Project
Village by Adrien Coquet from the Noun Project
Human by Gan Khoon Lay from the Noun Project
battle axe by Ben Davis from the Noun Project
Brain by BomSymbols from the Noun Project
magic ball by b farias from the Noun Project
Muscle by Adrien Coquet from the Noun Project
shackle by Robert Bjurshagen from the Noun Project
camp by Dev Patel from the Noun Project
dagger by iconcheese from the Noun Project
Letter by Arthur Shlain from the Noun Project
chatting by Scott Dunlap from the Noun Project
Sex by Yazmin Alanis from the Noun Project
medic by alkhalifi_design from the Noun Project
Book by Bismillah from the Noun Project
human trafficking by Gan Khoon Lay from the Noun Project
whipping by Andrew Doane from the Noun Project
Unemployed by Adriana Danaila from the Noun Project
Fort by Atif Arshad from the Noun Project
Construction by Nikita Kozin from the Noun Project
bedroom by Shocho from the Noun Project
Park by Adrien Coquet from the Noun Project
goblet by Pham Duy Phuong Hung from the Noun Project
Muscle by Adrien Coquet from the Noun Project
penis by Alex Muravev from the Noun Project
Male by Andrejs Kirma from the Noun Project
Female by Adam Schraff from the Noun Project
Hermaphrodite by Egorova Valentina from the Noun Project
Circle by Tresnatiq from the Noun Project
Wolf by Serhii Smirnov from the Noun Project
Cat by Sven Gabriel from the Noun Project
Fox by prasong tadoungsorn from the Noun Project
dragon by Icons Producer from the Noun Project
demon by RareSloth from the Noun Project
human head by Elisabeta from the Noun Project
Face by David Alexander Slaager from the Noun Project
Face by David Alexander Slaager from the Noun Project
Farm by mynamepong from the Noun Project
Castle by Eucalyp from the Noun Project
whip by Cédric Villain from the Noun Project
pirate ship by ProSymbols from the Noun Project
thief by Nhor from the Noun Project
Satan by Royyan Wijaya from the Noun Project
classes hunter by Maxicons from the Noun Project
university by ProSymbols from the Noun Project
Church by Smalllike from the Noun Project
Sex by Rflor from the Noun Project
leader by Wilson Joseph from the Noun Project
alone by Adrien Coquet from the Noun Project
Trident by kareemovic from the Noun Project
Lock by Adrien Coquet from the Noun Project
Heart by Ahmed Elzahra from the Noun Project
Charity by Vectors Point from the Noun Project
Dog by Anang Taufik from the Noun Project
Lion by m. turan ercan from the Noun Project
meditate by Becris from the Noun Project
skill hammer slam by Maxicons from the Noun Project
Peace by Tinashe Mugayi from the Noun Project
dragon by BGBOXXX Design from the Noun Project
Rat by sandra from the Noun Project
compassionate by priyanka from the Noun Project
Fist by Alejandro Capellan from the Noun Project
whip by Angelo Troiano from the Noun Project
short circuit by dDara from the Noun Project
hawk by Brand Mania from the Noun Project
Wolf by Olga from the Noun Project
Speech Bubble by Alice Noir from the Noun Project
Pinocchio by HeadsOfBirds from the Noun Project
rock by Gan Khoon Lay from the Noun Project
Pleading by Luis Prado from the Noun Project
top by Subagus Indra from the Noun Project
Gears by Gregor Cresnar from the Noun Project
Bleeding Heart by Bohdan Burmich from the Noun Project
Angel by Pascal Heß from the Noun Project
Devil by Gan Khoon Lay from the Noun Project
magnify by Alice Design from the Noun Project
Elephant by bmijnlieff from the Noun Project
Cat by b farias from the Noun Project
wave by Nawicon from the Noun Project
Sea by tulpahn from the Noun Project
fracture by Adrien Coquet from the Noun Project
Fox by David from the Noun Project
Cow by styleku from the Noun Project
penis by Alex Muravev from the Noun Project
breasts by IcoLabs from the Noun Project
[[vagina by priyanka from the Noun Project|https://thenounproject.com/search/?q=vagina&i=2529029]]
butt by Mello from the Noun Project
mirror by b farias from the Noun Project
Broken Mirror by arif fajar yulianto from the Noun Project
tall by Adrien Coquet from the Noun Project
wings by Luis Prado from the Noun Project
alchemy by Matthias Hartmann from the Noun Project
Gym by Bhuvan from the Noun Project
Weapon by Eucalyp from the Noun Project
connection by counloucon from the Noun Project
Brain by Laymik from the Noun Project
aura by Alexander Skowalsky from the Noun Project
pendulum by Rflor from the Noun Project
Maraca by Smalllike from the Noun Project
Water by Ricki Tri Putra from the Noun Project
oclone a willy by Smalllike from the Noun Project
Wind by Marko Fuček from the Noun Project
thunder by Ziyad Al junaidi from the Noun Project
sprout by tulpahn from the Noun Project
tentacles by Smalllike from the Noun Project
vortex by Eliricon from the Noun Project
Corruption by Daniel Schott from the Noun Project
healing by agus raharjo from the Noun Project
pony by Jose Dean from the Noun Project
Dog by Mariia Nisiforova from the Noun Project
ball gag by Arthur Shlain from the Noun Project
blindfold by Luis Prado from the Noun Project
Heart by Oleg Frolov from the Noun Project
sex shop by Smalllike from the Noun Project
Bikini by IconMark from the Noun Project
Oral Sex by Gan Khoon Lay from the Noun Project
homosexual sex by Gan Khoon Lay from the Noun Project
Sex Position by ghayn from the Noun Project
transgender by Andrejs Kirma from the Noun Project
pet playing by ProSymbols from the Noun Project
horseback rider by designer468 from the Noun Project
riding whip by Azam Ishaq from the Noun Project
Tortured Man by Gan Khoon Lay from the Noun Project
Toilet by Vadim Solomakhin from the Noun Project
treadmill by Ayub Irawan from the Noun Project
penis by Cédric Villain from the Noun Project
solution by Anton from the Noun Project
cleaning by Mavadee from the Noun Project
smashed by Laymik from the Noun Project
cliff by suhyeon Jung from the Noun Project
Injury by Rose Duong from the Noun Project
Trolley by alvianwijaya from the Noun Project
marketplace by Jasmine Christine from the Noun Project
Tent by nareerat jaikaew from the Noun Project
Pitchfork by Mello from the Noun Project
jungle by iconfield from the Noun Project
Camping by Smalllike from the Noun Project
Burning by monkik from the Noun Project
adventure by Guilherme Schmitt from the Noun Project
entertainer by Ben Davis from the Noun Project
demon by Amethyst Studio from the Noun Project
Elf by Rodrigo Vidinich from the Noun Project
Knight by Icon Island from the Noun Project
horse rider by ProSymbols from the Noun Project
gold by franc11s from the Noun Project
clinic by IcoLabs from the Noun Project
Restaurant by Manaqib S from the Noun Project
flogger by Smalllike from the Noun Project
workshop by Vectors Point from the Noun Project
electric by Alice Design from the Noun Project
electrician by Gan Khoon Lay from the Noun Project
Toy by Smalllike from the Noun Project
clock by Gregor Cresnar from the Noun Project
books by Aleksandr Vector from the Noun Project
battery charge by ProSymbols from the Noun Project
magnify by Adrien Coquet from the Noun Project
Swords by Sweet Farm from the Noun Project
Cat by Alejandro Capellan from the Noun Project
Dog by Jack Made from the Noun Project
Wolf by Emir Palavan from the Noun Project
equipment elf ears by Maxicons from the Noun Project
Wolf by Serhii Smirnov from the Noun Project
dragon by prasong tadoungsorn from the Noun Project
demon by Amethyst Studio from the Noun Project
Werewolf by parkjisun from the Noun Project
demon by parkjisun from the Noun Project
dragon by Anna Neyshtadt from the Noun Project
wings by Valeriy from the Noun Project
demon by Pau Urquijo from the Noun Project
claw by regina from the Noun Project
Fox Tail by Lucid Formation from the Noun Project
Devil Emoji by Razmik Badalyan from the Noun Project
Big tail cat by Johanna Vargas Sanchez from the Noun Project
dragon by prasong tadoungsorn from the Noun Project
penis by Phạm Thanh Lộc from the Noun Project
Chimera by Studio Fibonacci from the Noun Project
potion by Deemak Daksina from the Noun Project
Hobo by Luis Prado from the Noun Project
metalworking by Symbolon from the Noun Project
rape by Cédric Villain from the Noun Project
fangs by Alexander Wiefel from the Noun Project
Tiger by Ben Avery from the Noun Project
Tiger by Sarah Rudkin from the Noun Project
Tiger by Iconic from the Noun Project
Tiger by Christy Presler from the Noun Project
Tiger by Saeful Muslim from the Noun Project
Question by heri sugianto from the Noun Project
Bed by alrigel from the Noun Project
dog bowl by Andrew Acree from the Noun Project
washbasin by Symbolon from the Noun Project
Ball by Sandhi Priyasmoro from the Noun Project
st. andrew's cross by Avana Vana from the Noun Project
Candle by Guilherme Simoes from the Noun Project
rugs by priyanka from the Noun Project
statue by Eucalyp from the Noun Project
painting by priyanka from the Noun Project
furniture by Kantor Tegalsari from the Noun Project
Axe by Anil from the Noun Project
Mine by David from the Noun Project
paperwork by Nociconist from the Noun Project
crime by Adrien Coquet from the Noun Project
Garden by supalerk laipawat from the Noun Project
Wizard Hat by Alice Design from the Noun Project
broom by Vector Valley from the Noun Project
throne by Eucalyp from the Noun Project
Unicorn by Lazar Nikolic from the Noun Project
GPS by Rohith M S from the Noun Project
spy by Vectorstall from the Noun Project
wand by Vector Valley from the Noun Project
treasure by Misbahul Munir from the Noun Project
coin by fahmionline from the Noun Project
sapling by Vectors Market from the Noun Project
Tree by kareemovic3000 from the Noun Project
Butterfly by Benedetta Ferrero Varsino from the Noun Project
lightbulb by Davo Sime from the Noun Project
[[Diamond by HAMEL KHALED from the Noun Project|https://thenounproject.com/search/?creator=3998020&q=diamond&i=3614721]] (trait: eq. very valuable)
Streaking by Luis Prado from the Noun Project
flaming heart by Jaime Serra from the Noun Project
passion by Richard Cordero from the Noun Project
Spanking by Luis Prado from the Noun Project
flippers by Vectors Market from the Noun Project
Flute by Flatart from the Noun Project
Bat by satrio bagus permadi from the Noun Project
Idea by corpus delicti from the Noun Project
Rose by Kmg Design from the Noun Project
Rose by Fardan from the Noun Project
Rose by Vallone Design from the Noun Project
Tulip by Vectors Market from the Noun Project
Bicep by Mello from the Noun Project
crawl by Desbenoit from the Noun Project
Shuriken by Kieu Thi Kim Cuong from the Noun Project
Library by vicentnovoa from the Noun Project
meditation by Adrien Coquet from the Noun Project
busy by Akshar Pathak from the Noun Project
Ok by Thales Muller from the Noun Project
crafted by priyanka from the Noun Project
Art by Vectors Point from the Noun Project
Smooth criminal by Jordy Madueño from the Noun Project
Cigar by Sergey Demushkin from the Noun Project
Warning by Dan Craggs from the Noun Project
prisoners by Gan Khoon Lay from the Noun Project
clay crafting by Smalllike from the Noun Project
pet dog by Hea Poh Lin from the Noun Project
Horse by Smalllike from the Noun Project
Bleeding Heart by Bohdan Burmich from the Noun Project
fairy by Atif Arshad from the Noun Project
skill dead skull by Maxicons from the Noun Project
skill magic fire soul by Maxicons from the Noun Project
Fire by Akhmad taufiq from the Noun Project
abnormal silent by Maxicons from the Noun Project
[[Milking by Andrejs Kirma from the Noun Project|https://thenounproject.com/search/?q=udder&i=3353718]] (icon for duty MilkCowSlave)
[[Cell Preservation by Luis Prado from the Noun Project|https://thenounproject.com/term/semen/10708/]] (icon for duty CumCowSlave)
[[pimp by Gan Khoon Lay from the Noun Project|https://thenounproject.com/search/?q=pimp&i=858486]] (icon for duty Pimp)
[[negotiate by irene hoffman from the Noun Project|https://thenounproject.com/search/?q=diplomacy&i=82393]] (icon for duty RelationshipManager)
[[tree in snow by Graphic Nehar from the Noun Project|https://thenounproject.com/search/?q=snow+pine&i=2940502]] (icon for duty ScoutVale)
[[forest by Vectors Market from the Noun Project|https://thenounproject.com/term/forest/2011305/]] (icon for duty ScoutForest)
[[Castle by Manthana Chaiwong from the Noun Project|https://thenounproject.com/search/?q=castle&i=3373238]] (icon for duty ScoutCity)
[[desert by icon 54 from the Noun Project|https://thenounproject.com/search/?q=desert&i=211188]] (icon for duty ScoutDesert)
[[island by Designs by MB from the Noun Project|https://thenounproject.com/search/?q=island&i=3360037]] (icon for duty ScoutSea)
[[sea dragon by Eucalyp from the Noun Project|https://thenounproject.com/term/sea-dragon/1969020/]] (icon for duty ScoutSea)
[[rescue by visual language from the Noun Project|https://thenounproject.com/search/?q=rescue&i=2762899]] (icon for duty Rescuer)
[[Coins by Gregor Cresnar from the Noun Project|https://thenounproject.com/search/?q=coins+bag&i=780244]] (icon for duty Insurer)
[[Scale by Erik Vullings from the Noun Project|https://thenounproject.com/search/?q=scales&i=873248]] (icon for duty Marketer)
[[leader by Wilson Joseph from the Noun Project|https://thenounproject.com/search/?q=leader&i=509087]] (icon for duty Viceleader)
[[Peace by I Create Stuff from the Noun Project|https://thenounproject.com/search/?q=peace&i=248818]] (icon for duty DamageControlOfficer)
[[workout by Adrien Coquet from the Noun Project|https://thenounproject.com/term/workout/2397485/]] (icon for duty DamageControlOfficer)
[[all seeing eye by Kyle Tezak from the Noun Project|https://thenounproject.com/term/all-seeing-eye/96280/]] (icon for duty Mystic)
[[Nurse by Adrien Coquet from the Noun Project|https://thenounproject.com/term/nurse/2195046/]] (icon for duty Doctor)
[[Sex by Miranda Dempster from the Noun Project|https://thenounproject.com/term/sex/14484/]] (icon for duty VaginalFuckholeSlave)
[[maid by Hea Poh Lin from the Noun Project|https://thenounproject.com/term/maid/584456/]] (icon for duty MaidSlave)
[[flowerpot by Akshar Pathak from the Noun Project|https://thenounproject.com/search/?q=flowerpot&i=947947]] (icon for duty FurnitureSlave)
[[crawl by Marco Fleseri from the Noun Project|https://thenounproject.com/search/?q=crawl&i=485414]] (icon for duty FurnitureSlave)
[[makeup by monkik from the Noun Project|https://thenounproject.com/search/?q=makeup&i=3382821]] (icon for duty TheatreSlave)
[[Ecstacy by Luis Prado from the Noun Project|https://thenounproject.com/search/?q=ecstasy&i=25211]] (icon for duty ServerSlave)
[[Danger by luca fruzza from the Noun Project|https://thenounproject.com/term/danger/1750323/]] (icon for special/danger.png)
[[fairy by Maxicons from the Noun Project|https://thenounproject.com/term/fairy/2157927/]] (icon for dreamy)
[[Donkey by Rfourtytwo from the Noun Project|https://thenounproject.com/term/donkey/2396972/]] (icon for humble)
[[Lion by Javier Triana from the Noun Project|https://thenounproject.com/term/lion/184473/]] (icon for proud)
<h4>Misc:</h4>
[[Danger by luca fruzza from the Noun Project|https://thenounproject.com/term/danger/1750323/]] (special/danger.png)
<h4>Trait icons:</h4>
[[Hero by Andrew J. Young from the Noun Project|https://thenounproject.com/search/?q=leader+speaker&i=195465]] (trait: per_gregarious)
[[fly by Lucas Helle from the Noun Project|https://thenounproject.com/term/fly/3608310/]] (trait: value_low)
[[Voodoo Doll by Sitara Shah from the Noun Project|https://thenounproject.com/term/voodoo-doll/38199/]] (trait: per_masochistic)
[[Pickpocket by Proletkult Graphik from the Noun Project|https://thenounproject.com/term/pickpocket/1368/]] (trait: bg_thief)
[[Needle and Thread by Vectors Point from the Noun Project|https://thenounproject.com/term/needle-and-thread/3243023/]] (trait: bg_artisan)
[[classes archer by Maxicons from the Noun Project|https://thenounproject.com/term/classes-archer/2360003/]] (trait: bg_hunter)
[[classes priest by Maxicons from the Noun Project|https://thenounproject.com/term/classes-priest/2360008/]] (trait: bg_priest)
[[classes engineer by Maxicons from the Noun Project|https://thenounproject.com/term/classes-engineer/2360010/]] (trait: bg_engineer)
[[Spear by Template from the Noun Project|https://thenounproject.com/term/spear/2206287/]] (trait: bg_soldier)
[[game ui money by Maxicons from the Noun Project|https://thenounproject.com/maxicons/collection/role-playing-game/?i=2360125]] (trait: bg_merchant)
[[Question by NeMaria from the Noun Project|https://thenounproject.com/term/question/2774612/]] (trait: per_curious)
[[collar by lipi from the Noun Project|https://thenounproject.com/term/collar/788700/]] (trait: eq_collar)
[[Head by Magicon from the Noun Project|https://thenounproject.com/term/head/489118/]] (trait: training_mindbreak)
[[Dojo Master by Gan Khoon Lay from the Noun Project|https://thenounproject.com/search/?q=master&i=1926810]] (trait: per_dominant)
[[fairy by Maxicons from the Noun Project|https://thenounproject.com/term/fairy/2157927/]] (trait: per_dreamy)
[[Deer by Alexander Skowalsky from the Noun Project|https://thenounproject.com/search/?q=deer&i=257568]] (trait: per_humble)
[[Lion by Icons Producer from the Noun Project|https://thenounproject.com/term/lion/1315674/]] (trait: per_proud)
[[Prostitute by Gan Khoon Lay from the Noun Project|https://thenounproject.com/term/prostitute/682587/]] (trait: bg_courtesan)
<h4>Race, and body parts icons:</h4>
[[cat eyes by Stanislav Levin from the Noun Project|https://thenounproject.com/search/?creator=619&q=cat&i=217677]] (cat eye)
[[cat paw by Olena Panasovska from the Noun Project|https://thenounproject.com/search/?q=paws&i=3292545]] (cat arms)
[[Cat by Jieting Tina Chen from the Noun Project|https://thenounproject.com/term/cat/1643181/]] (cat ears)
[[Tiger by Eight on from the Noun Project|https://thenounproject.com/term/tiger/1917820/]] (cat face)
[[cat ey by Alex Muravev from the Noun Project|https://thenounproject.com/search/?creator=2223634&q=cat&i=882424]] (dragonkin eye)
[[dragon by Icons Producer from the Noun Project|https://thenounproject.com/term/dragon/1387591/]] (dragonkin mouth)
[[Wyvern by Nathan Thomson from the Noun Project|https://thenounproject.com/term/wyvern/60790/]] (dragonkin body)
[[dragon by parkjisun from the Noun Project|https://thenounproject.com/term/dragon/1005199/]] (dragonkin arms)
[[Orc by Darren Northcott from the Noun Project|https://thenounproject.com/search/?q=orc&i=318104]] (orc race)
[[Orc by Icons Producer from the Noun Project|https://thenounproject.com/search/?q=orc&i=1395140]] (orc body)
[[Medieval Orc mask by Gerard Girbes Berges from the Noun Project|https://thenounproject.com/search/?q=orc&i=418857]] (orc mouth)
[[snake head by Vectors Market from the Noun Project|https://thenounproject.com/search/?q=snake+tongue&i=2145934]] (demon mouth)
[[eyeball by Nimal Raj from the Noun Project|https://thenounproject.com/term/eyeball/186322/]] (demon eyes)
<h4>Duty icons:</h4>
[[Milking by Andrejs Kirma from the Noun Project|https://thenounproject.com/search/?q=udder&i=3353718]] (duty MilkCowSlave)
[[Cell Preservation by Luis Prado from the Noun Project|https://thenounproject.com/term/semen/10708/]] (duty CumCowSlave)
[[pimp by Gan Khoon Lay from the Noun Project|https://thenounproject.com/search/?q=pimp&i=858486]] (duty Pimp)
[[negotiate by irene hoffman from the Noun Project|https://thenounproject.com/search/?q=diplomacy&i=82393]] (duty RelationshipManager)
[[tree in snow by Graphic Nehar from the Noun Project|https://thenounproject.com/search/?q=snow+pine&i=2940502]] (duty ScoutPlains)
[[forest by Vectors Market from the Noun Project|https://thenounproject.com/term/forest/2011305/]] (duty ScoutForest)
[[Castle by Manthana Chaiwong from the Noun Project|https://thenounproject.com/search/?q=castle&i=3373238]] (duty ScoutCity)
[[desert by icon 54 from the Noun Project|https://thenounproject.com/search/?q=desert&i=211188]] (duty ScoutDesert)
[[island by Designs by MB from the Noun Project|https://thenounproject.com/search/?q=island&i=3360037]] (duty ScoutSea)
[[sea dragon by Eucalyp from the Noun Project|https://thenounproject.com/term/sea-dragon/1969020/]] (duty ScoutSea)
[[rescue by visual language from the Noun Project|https://thenounproject.com/search/?q=rescue&i=2762899]] (duty Rescuer)
[[Coins by Gregor Cresnar from the Noun Project|https://thenounproject.com/search/?q=coins+bag&i=780244]] (duty Insurer)
[[Scale by Erik Vullings from the Noun Project|https://thenounproject.com/search/?q=scales&i=873248]] (duty Marketer)
[[leader by Wilson Joseph from the Noun Project|https://thenounproject.com/search/?q=leader&i=509087]] (duty Viceleader)
[[Peace by I Create Stuff from the Noun Project|https://thenounproject.com/search/?q=peace&i=248818]] (duty DamageControlOfficer)
[[workout by Adrien Coquet from the Noun Project|https://thenounproject.com/term/workout/2397485/]] (duty DamageControlOfficer)
[[all seeing eye by Kyle Tezak from the Noun Project|https://thenounproject.com/term/all-seeing-eye/96280/]] (duty Mystic)
[[Nurse by Adrien Coquet from the Noun Project|https://thenounproject.com/term/nurse/2195046/]] (duty Doctor)
[[Sex by Miranda Dempster from the Noun Project|https://thenounproject.com/term/sex/14484/]] (duty VaginalFuckholeSlave)
[[maid by Hea Poh Lin from the Noun Project|https://thenounproject.com/term/maid/584456/]] (duty MaidSlave)
[[flowerpot by Akshar Pathak from the Noun Project|https://thenounproject.com/search/?q=flowerpot&i=947947]] (duty FurnitureSlave)
[[crawl by Marco Fleseri from the Noun Project|https://thenounproject.com/search/?q=crawl&i=485414]] (duty FurnitureSlave)
[[makeup by monkik from the Noun Project|https://thenounproject.com/search/?q=makeup&i=3382821]] (duty TheatreSlave)
[[juggler by Isabel Martínez Isabel from the Noun Project|https://thenounproject.com/search/?q=juggler&i=129409]] (duty EntertainmentSlave)
[[master by Adrien Coquet from the Noun Project|https://thenounproject.com/term/master/2560113/]] (duty DominatrixSlave)
<h4>Equipment slots</h4>
[[skill sword mastery by Maxicons from the Noun Project|https://thenounproject.com/search/?creator=3983118&q=sword&i=2360217]] (equip slot: weapon)
[[eyes by luca fruzza from the Noun Project|https://thenounproject.com/search/?creator=3312903&q=eyes&i=1729493]] (equip slot: eyes)
[[foot by Mello from the Noun Project|https://thenounproject.com/search/?creator=2404951&q=foot&i=1676032]] (equip slot: feet)
[[Head by Elisabeta from the Noun Project|https://thenounproject.com/search/?creator=2405554&q=head&i=991299]] (equip slot: head)
[[legs by iconsmind.com from the Noun Project|https://thenounproject.com/search/?creator=438738&q=legs&i=70520]] (equip slot: legs)
[[mouth by Wuppdidu from the Noun Project|https://thenounproject.com/search/?creator=3263277&q=mouth&i=3096701]] (equip slot: mouth)
[[neck by Deemak Daksina from the Noun Project|https://thenounproject.com/search/?creator=2976159&q=neck&i=2206967]] (equip slot: neck)
[[breasts by LAFS from the Noun Project|https://thenounproject.com/search/?creator=1804969&q=breast&i=665665]] (equip slot: nipple)
[[butt by Mark S Waterhouse from the Noun Project|https://thenounproject.com/search/?creator=339310&q=butt&i=706902]] (equip slot: rear)
[[torso by Andrejs Kirma from the Noun Project|https://thenounproject.com/search/?creator=757191&q=torso&i=3353601]] (equip slot: torso)
[[OPEN HANDS by tezar tantular from the Noun Project|https://thenounproject.com/term/open-hands/3657235/]] (equip slot: arms)
[[vagina by Pham Duy Phuong Hung from the Noun Project|https://thenounproject.com/search/?q=genital&i=2073647]] (equip slot: genitals)
[[penis by Sergey Demushkin from the Noun Project|https://thenounproject.com/search/?q=penis&i=392553]] (equip slot: penis)
<h4>Equipment</h4>
[[weapon board sword by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-board-sword/2360303/]] (weapon: broadsword)
[[Spear by Monjin Friends from the Noun Project|https://thenounproject.com/term/spear/1071981/]] (weapon: spear)
[[weapon battle axe by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-battle-axe/2360306/]] (weapon: axe)
[[weapon knife by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-knife/2360328/]] (weapon: dagger)
[[weapon staff by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-staff/2360318/]] (weapon: staff)
[[Sword by uzeir syarief from the Noun Project|https://thenounproject.com/term/sword/1722113/]] (weapon: sword)
[[weapon dual blade by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-dual-blade/2360311/]] (weapon: dual blade)
[[weapon flail by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-flail/2360312/]] (weapon: flail)
[[weapon blade by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-blade/2360305/]] (weapon: scimitar)
[[weapon spear by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-spear/2360313/]] (weapon: spear)
[[weapon magic book by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-magic-book/2360315/]] (weapon: magicbook)
[[weapon mace by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-mace/2360320/]] (weapon: mace)
[[weapon rapier by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-rapier/2360322/]] (weapon: rapier)
[[weapon sickle by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-sickle/2360324/]] (weapon: scythe)
[[weapon wand by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-wand/2360326/]] (weapon: wand)
[[weapon katana by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-katana/2360325/]] (weapon: katana)
[[battle hammer by Maxicons from the Noun Project|https://thenounproject.com/term/battle-hammer/2360330/]] (weapon: hammer)
[[weapon dead wand by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-dead-wand/2360321/]] (weapon: evilwand)
[[weapon halberd by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-halberd/2360319/]] (weapon: halberd)
[[weapon shield by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-shield/2360317/]] (weapon: shield)
[[weapon buckler by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-buckler/2360307/]] (weapon: buckler)
[[weapon claw by Maxicons from the Noun Project|https://thenounproject.com/term/weapon-claw/2360308/]] (weapon: claw)
[[log by Cédric Villain from the Noun Project|https://thenounproject.com/term/log/2349028/]] (weapon: log)
[[Glasses by Ellen from the Noun Project|https://thenounproject.com/term/glasses/2945453/]] (eyes: spectacles)
[[mask by Deemak Daksina from the Noun Project|https://thenounproject.com/search/?q=mask&i=1595651]] (eyes: mask)
[[plague mask by Catherine Please from the Noun Project|https://thenounproject.com/search/?q=plague+mask&i=911576]] (eyes: mask plague)
[[masquerade by Phạm Thanh Lộc from the Noun Project|https://thenounproject.com/term/masquerade/3028783/]] (eyes: masquerade)
[[blind fold by 1516 from the Noun Project|https://thenounproject.com/term/blind-fold/1671787/]] (eyes: blindfold)
[[blinkers by P Thanga Vignesh from the Noun Project|https://thenounproject.com/search/?q=blinkers&i=3081735]] (eyes: pony blinders)
[[neck scarf by Olena Panasovska from the Noun Project|https://thenounproject.com/term/neck-scarf/2091847/]] (mouth: bandana)
[[Penis mouth gag by sobinsergey from the Noun Project|https://thenounproject.com/term/penis-mouth-gag/1130812/]] (mouth: gag dildo)
[[ball gag by 1516 from the Noun Project|https://thenounproject.com/search/?q=ball+gag&i=1671782]] (mouth: gag ball)
[[bit gag by Smalllike from the Noun Project|https://thenounproject.com/search/?q=gag&i=2566893]] (mouth: pony bitgag)
[[equipment helm armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-helm-armor/2360100/]] (head: helm)
[[equipment helm armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-helm-armor/2360086/]] (head: helm heavy)
[[equipment viking helm by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-viking-helm/2360085/]] (head: helm viking)
[[equipment viking helm by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-wizard-hat/2360088/]] (head: hat wizard)
[[equipment crown by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-crown/2360075/]] (head: crown)
[[equipment earring by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-earring/2360079/]] (head: earrings)
[[Dog by Mister Pixel from the Noun Project|https://thenounproject.com/term/dog/35537/]] (head: dog hood)
[[equipment wizard cover by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-wizard-cover/2360089/]] (neck: cloak)
[[equipment wizard hood by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-wizard-hood/2360098/]] (neck: hood)
[[equipment necklace by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-necklace/2360073/]] (neck: necklace)
[[equipment star necklace by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-star-necklace/2360080/]] (neck: star necklace)
[[collar by Andrejs Kirma from the Noun Project|https://thenounproject.com/search/?q=collar&i=2496330]] (neck: collar dog)
[[collar by lipi from the Noun Project|https://thenounproject.com/term/collar/788700/]] (neck: collar)
[[equipment simple ring by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-simple-ring/2360072/]] (arms: ring)
[[equipment ring by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-ring/2360074/]] (arms: ring jeweled)
[[equipment bracelet by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-bracelet/2360099/]] (arms: bracelet)
[[equipment glove by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-glove/2360096/]] (arms: gloves)
[[equipment silmple glove armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-silmple-glove-armor/2360082/]] (arms: gauntlets)
[[equipment glove armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-glove-armor/2360083/]] (arms: gauntlets heavy)
[[handcuff by tulpahn from the Noun Project|https://thenounproject.com/search/?q=handcuff&i=2078171]] (arms: manacles)
[[Boxing Gloves by Creative Stall from the Noun Project|https://thenounproject.com/term/boxing-gloves/177869/]] (arms: dog mitts)
[[equipment shirt by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-shirt/2360097/]] (torso: shirt)
[[equipment wizard robe by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-wizard-robe/2360101/]] (torso: robes)
[[equipment silmple body armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-silmple-body-armor/2360084/]] (torso: chestplate)
[[equipment body armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-body-armor/2360076/]] (torso: chestplate heavy)
[[Dog Harness by Ale Santander from the Noun Project|https://thenounproject.com/search/?q=harness&i=1452272]] (torso: dog harness)
[[Nipple Clamps by Elaine Madsen from the Noun Project|https://thenounproject.com/search/?q=nipple+clamps&i=1207159]] (nipple: clamps)
[[Underwear by iconixar from the Noun Project|https://thenounproject.com/search/?q=underwear&i=3482532]] (rear: underwear)
[[thong by Llisole from the Noun Project|https://thenounproject.com/search/?q=thong&i=3650296]] (rear: thong)
[[Butt Plug by 1516 from the Noun Project|https://thenounproject.com/search/?q=butt+plug&i=1671781]] (rear: buttplug)
[[flogger by Smalllike from the Noun Project|https://thenounproject.com/search/?q=flogger&i=2566912]] (rear: pony tailplug)
[[Dildo by Smalllike from the Noun Project|https://thenounproject.com/search/?q=dildo&i=2566902]] (genital: dildo)
[[pipette by Marco Livolsi from the Noun Project|https://thenounproject.com/term/pipette/1233329/]] (genital: dickplug)
[[chastity by Leopold Merleau from the Noun Project|https://thenounproject.com/search/?q=chastity&i=2074956]] (genital: chastity)
[[equipment belt by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-belt/2360093/]] (legs: belt)
[[pants by iconfield from the Noun Project|https://thenounproject.com/search/?q=pants&i=1790099]] (legs: pants)
[[equipment silmple waist armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-silmple-waist-armor/2360091/]] (legs: faulds)
[[equipment waist armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-waist-armor/2360094/]] (legs: faulds heavy)
[[hoof by P Thanga Vignesh from the Noun Project|https://thenounproject.com/term/hoof/3081761/]] (legs: pony hooves / arms: pony hooves)
[[equipment boot by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-boot/2360087/]] (feet: boots)
[[equipment wizard boot by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-wizard-boot/2360090/]] (feet: boots fancy)
[[equipment wing boot by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-wing-boot/2360095/]] (feet: boots winged)
[[equipment silmple leg armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-silmple-leg-armor/2360081/]] (feet: greaves medium)
[[equipment leg armor by Maxicons from the Noun Project|https://thenounproject.com/term/equipment-leg-armor/2360077/]] (feet: greaves heavy)
[[Sandal by LSE Designs from the Noun Project|https://thenounproject.com/term/sandal/1245056/]] (feet: sandals)
[[shackle by Robert Bjurshagen from the Noun Project|https://thenounproject.com/search/?q=fetters&i=217216]] (feet: fetters)
<h4>Quest tags</h4>
[[Coins by Gregor Cresnar from the Noun Project|https://thenounproject.com/term/coins/162941/]] Money
[[game ui item bag by Maxicons from the Noun Project|https://thenounproject.com/term/game-ui-item-bag/2360112/]] Item
[[person by Alice Design from the Noun Project|https://thenounproject.com/term/person/1995015/]] Unit
[[item quest scroll by Maxicons from the Noun Project|https://thenounproject.com/term/item-quest-scroll/2360143/]] Quest
[[Death by Adrien Coquet from the Noun Project|https://thenounproject.com/term/death/3194193/]] Danger
[[Prostitute by Luis Prado from the Noun Project|https://thenounproject.com/term/prostitute/16839/]] Order
[[study by Bonegolem from the Noun Project|https://thenounproject.com/term/study/532113/]] Trait
[[Fort by RocketDiction from the Noun Project|https://thenounproject.com/term/fort/1439810/]] Fort
[[Construction by tezar tantular from the Noun Project|https://thenounproject.com/term/construction/2504673/]] Upgrade
[[snowy mountains by Camila Bertoco from the Noun Project|https://thenounproject.com/term/snowy-mountains/207643/]] Vale
[[forest by Eucalyp from the Noun Project|https://thenounproject.com/term/forest/1977259/]] Forest
[[desert by iconfield from the Noun Project|https://thenounproject.com/term/desert/3005227/]] Desert
[[fortification by dDara from the Noun Project|https://thenounproject.com/search/?q=fortification&i=2096245]] City
[[valley scene by Azam Ishaq from the Noun Project|https://thenounproject.com/term/valley-scene/3310171/]] Sea
[[Repeat by Rflor from the Noun Project|https://thenounproject.com/search/?q=repeat&i=287836]] Repeat
[[Planning by emka angelina from the Noun Project|https://thenounproject.com/term/planning/2941604/]] Prep
[[special effects by ProSymbols from the Noun Project|https://thenounproject.com/term/special-effects/1872356/]] Unknown
[[exclamation by iconcheese from the Noun Project|https://thenounproject.com/search/?q=exclamation&i=2686931]] Special
[[shiny by Marie Van den Broeck from the Noun Project|https://thenounproject.com/term/shiny/236213/]] New
[[panorama|https://freesvg.org/panorama]] Vale quest background
[[https://freesvg.org/flat-shaded-mountains-scene|https://freesvg.org/flat-shaded-mountains-scene]] Vale quest background
[[Pier Panorama Silhouette|https://freesvg.org/1548790890]] City quest background
[[Sunset in the desert|https://freesvg.org/sunset-in-the-desert]] Desert quest background
[[Forest Treeline Landscape|https://freesvg.org/1544226855]] Forest quest background
[[Sea waves|https://freesvg.org/sea-waves]] Sea quest background
[[Fence refixed|https://freesvg.org/1471287239]] Fort quest background
[[Old city background|https://freesvg.org/old-city-background]] City quest background
[[shake hand by Wing from the Noun Project|https://thenounproject.com/term/shake-hand/1546237/]] Favor
<h4>Building tags</h4>
[[Key by Eagle Eye from the Noun Project|https://thenounproject.com/term/key/1814655/]] Key Building
[[increase by Alice Design from the Noun Project|https://thenounproject.com/term/increase/1920812/]] Unlocker
[[hiring by Aneeque Ahmed from the Noun Project|https://thenounproject.com/term/hiring/739201/]] Hiring
[[skipping rope by sandra from the Noun Project|https://thenounproject.com/term/skipping-rope/1553122/]] Training
[[officer by Adi Kurniawan from the Noun Project|https://thenounproject.com/term/officer/2051092/]] Duty
[[Binoculars by Andreas Bjurenborg from the Noun Project|https://thenounproject.com/term/binoculars/100530/]] Scout
[[game ui item bag by Maxicons from the Noun Project|https://thenounproject.com/term/game-ui-item-bag/2360112/]] Item
[[amusement park by Lars Meiertoberens from the Noun Project|https://thenounproject.com/term/amusement-park/3390684/]] Recreation
[[bandaid by Alice Design from the Noun Project|https://thenounproject.com/term/bandaid/3408162/]] hospital
[[Laboratory by zidney from the Noun Project|https://thenounproject.com/term/laboratory/1260379/]] Laboratory
[[temple by rivercon from the Noun Project|https://thenounproject.com/term/temple/2382623/]] Temple
[[ofrenda by Eucalyp from the Noun Project|https://thenounproject.com/term/ofrenda/3153721/]] Ritual chamber
<h4>Duty tags</h4>
[[Bed by Vectorstall from the Noun Project|https://thenounproject.com/term/bed/3663437/]] (duty: bedchamber)
[[champion by Mello from the Noun Project|https://thenounproject.com/term/champion/1676552/]] (duty: prestige)
[[utilities by Kevin White from the Noun Project|https://thenounproject.com/term/utilities/3039201/]] (duty: utility)
<h4>Lore tags</h4>
[[Flag by Oksana Latysheva from the Noun Project|https://thenounproject.com/term/flag/787776/]] (lore: race)
[[Book by Jaime Serra from the Noun Project|https://thenounproject.com/term/book/1722861/]] (lore: concept)
[[region by Adrien Coquet from the Noun Project|https://thenounproject.com/term/region/3097495/]] (lore: region)
[[Monument by Sascha Elmers from the Noun Project|https://thenounproject.com/term/monument/95211/]] (lore: location)
<h4>Others</h4>
[[Heart by Cassandra Cappello from the Noun Project|https://thenounproject.com/term/heart/405032/]] (special: lovers)<<set setup.companytemplate = {}>>
<<run new setup.CompanyTemplate(
'player',
'Fort of Chains',
'CompanyTemplatePlayer',
[ /* favor effects */
[],
[],
[],
],
)>>
<<run new setup.CompanyTemplate(
'independent',
'Independent',
'CompanyTemplateIndependent',
[ /* favor effects */
[],
[],
[],
],
)>>
<<set _getslaver = setup.qc.Function(() => {
var preference = State.variables.settings.getGenderPreference(setup.job.slaver);
var unit = setup.unitgroup.all.getUnit(preference);
setup.qc.Slaver('recruit', "", /* is mercenary = */ true).apply({getActorUnit: () => unit});
})>>
<<run new setup.CompanyTemplate(
'humankingdom',
'Kingdom of Tor',
'CompanyTemplateHumanKingdom',
[ /* favor effects */
[
_getslaver,
],
[
_getslaver,
_getslaver,
],
[
_getslaver,
_getslaver,
_getslaver,
],
],
)>>
<<set _scout = setup.qc.OneRandom([
setup.qc.QuestDelay('vale', 2),
setup.qc.QuestDelay('forest', 2),
setup.qc.QuestDelay('city', 2),
])>>
<<run new setup.CompanyTemplate(
'humanvale',
'Humans of the Northern Vale',
'CompanyTemplateHumanVale',
[ /* favor effects */
[
_scout,
],
[
_scout,
_scout,
],
[
_scout,
_scout,
_scout,
],
],
)>>
<<set _scout = setup.qc.OneRandom([
setup.qc.QuestDelay('desert', 1),
setup.qc.QuestDelay('sea', 1),
])>>
<<run new setup.CompanyTemplate(
'humandesert',
'Nomads of the Eastern Desert',
'CompanyTemplateHumanDesert',
[ /* favor effects */
[
_scout,
],
[
_scout,
_scout,
],
[
_scout,
_scout,
_scout,
],
],
)>>
<<set _heal = setup.qc.Function(() => {
State.variables.hospital.healRandom();
})>>
<<run new setup.CompanyTemplate(
'humansea',
'Humans of the Southern Lands',
'CompanyTemplateHumanSea',
[ /* favor effects */
[
_heal,
],
[
_heal,
_heal,
],
[
_heal,
_heal,
_heal,
],
],
)>>
<<set _item = setup.qc.ItemForSale(
'itemmarket',
'all',
/* amount = */ 1,
)>>
<<set _rare = setup.qc.ItemForSaleSingle(
'itemmarket',
'blank_potion',
)>>
<<run new setup.CompanyTemplate(
'elf',
'Elven Council',
'CompanyTemplateElf',
[ /* favor effects */
[
_item,
_item,
_item,
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMENT_PROBABILITY_MEDIUM),
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMETN_PROBABILITY_HIGH),
],
],
)>>
<<set _item = setup.qc.EquipmentForSale(
'sexequipmentmarket',
'all_sex',
/* amount = */ 1,
)>>
<<set _rare = setup.qc.EquipmentForSaleSingle(
'sexequipmentmarket',
'buttplug_master',
)>>
<<run new setup.CompanyTemplate(
'neko',
"Nekos",
'CompanyTemplateNeko',
[ /* favor effects */
[
_item,
_item,
_item,
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMENT_PROBABILITY_MEDIUM),
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMETN_PROBABILITY_HIGH),
],
],
)>>
<<set _item = setup.qc.EquipmentForSale(
'combatequipmentmarket',
'blacksmith',
/* amount = */ 1,
)>>
<<set _rare = setup.qc.EquipmentForSaleSingle(
'combatequipmentmarket',
'combat_arms_master',
)>>
<<run new setup.CompanyTemplate(
'orc',
'Orcish Band',
'CompanyTemplateOrc',
[ /* favor effects */
[
_item,
_item,
_item,
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMENT_PROBABILITY_MEDIUM),
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMETN_PROBABILITY_HIGH),
],
],
)>>
<<set _item = setup.qc.ItemForSale(
'itemmarket',
'furniture_normal',
/* amount = */ 1,
)>>
<<set _rare = setup.qc.ItemForSaleSingle(
'itemmarket',
'f_slaverbed_master',
)>>
<<run new setup.CompanyTemplate(
'werewolf',
'Werewolves of the Northern Vale',
'CompanyTemplateWerewolf',
[ /* favor effects */
[
_item,
_item,
_item,
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMENT_PROBABILITY_MEDIUM),
],
[
_item,
_item,
_item,
setup.qc.DoAll([_rare], setup.FAVOR_MASTER_EQUIPMETN_PROBABILITY_HIGH),
],
],
)>>
<<set _scout = setup.qc.OneRandom([
setup.qc.DoAll([]),
setup.qc.QuestDelay('veteran', 1),
])>>
<<run new setup.CompanyTemplate(
'dragonkin',
'The Land of Dragons',
'CompanyTemplateDragonkin',
[ /* favor effects */
[
_scout,
],
[
setup.qc.QuestDelay('veteran', 1),
],
[
setup.qc.QuestDelay('veteran', 1),
_scout,
],
],
)>>
<<set _boon = setup.qc.Function(() => {
var unit = setup.rngLib.choiceRandom(State.variables.company.player.getUnits({job: setup.job.slaver}));
State.variables.trauma.boonize(unit, 5);
})>>
<<run new setup.CompanyTemplate(
'demon',
'The Great Mist',
'CompanyTemplateDemon',
[ /* favor effects */
[
_boon,
],
[
_boon,
_boon,
],
[
_boon,
_boon,
_boon,
],
],
)>>
<<set _getslave = setup.qc.Function(() => {
var preference = State.variables.settings.getGenderPreference(setup.job.slave);
var unit = setup.unitgroup.all.getUnit(preference);
setup.qc.Slave('recruit', "", /* is mercenary = */ true).apply({getActorUnit: () => unit});
})>>
<<run new setup.CompanyTemplate(
'outlaws',
'Outlaws',
'CompanyTemplateOutlaws',
[ /* favor effects */
[
_getslave,
],
[
_getslave,
_getslave,
],
[
_getslave,
_getslave,
_getslave,
],
],
)>>
<<run new setup.CompanyTemplate(
'bank',
'Tiger Bank',
'CompanyTemplateBank',
[ /* favor effects */
[
setup.qc.Money(500),
],
[
setup.qc.Money(1000),
],
[
setup.qc.Money(1500),
],
],
)>>Your glorious company.Various rabbles scattered around the region with no clear leadership between them.Humans of the <<lore region_vale>>.
If you befriend them, they can supply your fort with leads for quests from the surrounding
vale, forest, and city.The glorious Kingdom of Tor.
Befriending them will let an influx of mercenaries to come from the city and sign up for your company,
which you can hire as slavers.Hardy people of the eastern deserts.
When befriended, these people can supply your company with leads for quests from faraway lands.Mysterious people hailing from beyond the southern seas.
Many are gifted in <<rep setup.trait.magic_light>>, and when befriended
can share their secrets to heal your injured slavers faster.The furry tribes of the <<lore region_vale>>.
Many are excellent carpenters who when befriended would be willing to sell their
furniture wares at your fort. Rumors have it that befriending them enough attract
more skillful carpenters, who can make wondrous furniture...The catfolk of the western forests. Most have lost their fully furry ancestries,
and mostly just sport cat ears and cat tails.
Many can be found peddling in sex toys, and if you befriend them, they might be
willing to sell their wares at your fort.
Rumors have it that they sell the rarest of their toys to their most staunch allies...Intelligent and smart, these sharp-eared people lives in the western forests
together with the nekos.
They are often gifted alchemists, and when befriended might be willing to peddle
the rarest of their potions in your fort...A group of green-skinned brutes living on the eastern deserts.
Orc smiths are famous for having crafted the sturdiest of armors,
and they can be enticed to sell their wares if you befriend them enough.The mighty kingdom of dragonkins in the southern seas.
Not many can befriend these aloof but honorable race, but for those who managed
to do so, they find this exotic species to make very good scouts for rare quests.Residents of the land beyond the mist, they are notorious for leading a perpetually
debauched life.
Befriending them will not be easy at all, but for those that managed such an impossible
endeavor, they are said to be granted wondrous boons in their lives.The general lawbreakers, perfect company for a slaving company such as yours.
If befriending, they will surely be glad to offer your company some of their
freshly captured slaves for sale.The largest banking institution in the region, headquartered at the <<lore location_npc>>.
They are said to offer easy money for those few they consider allies.<<set setup.job = {}>>
<<run new setup.Job('slaver', 'Slaver')>>
<<run new setup.Job('slave', 'Slave')>>
<<run new setup.Job('unemployed', 'Not in company')>><<set setup.qdiff = {}>>
<<run setup.QuestDifficulty.generate()>>/* This is just for legacy purposes. They are not used anymore since content creator was implemented. */
<<set setup.qs = {}>>
<<set setup.qs.job_slaver = setup.qres.Job(setup.job.slaver)>>
<<set setup.qs.job_slave = setup.qres.Job(setup.job.slave)>>
<<set setup.qs.trait_vagina = setup.qres.Trait(setup.trait.vagina_tight)>>
<<set setup.qs.trait_dick = setup.qres.Trait(setup.trait.dick_tiny)>>
<<set setup.qs.trait_breast = setup.qres.Trait(setup.trait.breast_tiny)>>
<<set setup.qs.trait_balls = setup.qres.Trait(setup.trait.balls_tiny)>>
<<set setup.qs.trait_gender_male = setup.qres.Trait(setup.trait.gender_male)>>
<<set setup.qs.trait_gender_female = setup.qres.Trait(setup.trait.gender_female)>><<set setup.skill = []>>
/* 0-4 */
<<run new setup.Skill(
'combat',
'Combat',
'The skill of fighting other humanlikes. ' +
'Helpful on missions where you are expected to fight other humanlikes.',
)>>
<<run new setup.Skill(
'brawn',
'Brawn',
'The measure of physical strength. ' +
'Helpful on missions requiring physical feats, and also helps combat to some extent.',
)>>
<<run new setup.Skill(
'survival',
'Survival',
'Skills for surviving, navigating, and conquering the wilds. ' +
'Helpful for scouting missions, as well as missions that venture far into the wilds.',
)>>
<<run new setup.Skill(
'intrigue',
'Intrigue',
'The art of planning, scheming, and manipulating the stage from the shadows. ' +
'Helpful for missions involving stealth, subterfuge, and infiltrations.',
)>>
<<run new setup.Skill(
'slaving',
'Slaving',
'The skill of efficiently breaking slaves. ' +
'Helpful for training slaves.',
)>>
/* 5-9 */
<<run new setup.Skill(
'knowledge',
'Knowledge',
'The understanding of the world. ' +
'Helpful for most missions, as well as missions requiring expert knowledge.',
)>>
<<run new setup.Skill(
'social',
'Social',
'The skill of manipulating others into doing your bidding with words. ' +
'Helpful for diplomacy missions, as well as missions involving negotiations.',
)>>
<<run new setup.Skill(
'aid',
'Aid',
'The skill of healing and restoring spirit. ' +
'Helpful for rescue as well as missions involving long rounds of combat.',
)>>
<<run new setup.Skill(
'arcane',
'Arcane',
'The understanding of the otherworldly. ' +
'Helpful for mysterious missions.',
)>>
<<run new setup.Skill(
'sex',
'Sex',
'The ancient art of sex. ' +
'Helpful for sexual missions, as well as training slaves to some extent.',
)>><<set setup.title = {}>>
/* base titles */
<<run new setup.Title(
'leader', /* key */
'Leader of the Company', /* name */
'A title held by the leader of this company, you', /* name */
'is the leader of this company', /* unit description */
0, /* slave value */
{
combat: 1,
brawn: 1,
survival: 1,
intrigue: 1,
slaving: 1,
knowledge: 1,
social: 1,
aid: 1,
arcane: 1,
sex: 1,
},
)>>
<<run new setup.Title(
'bodyswapped', /* key */
'Bodyswap Survivor', /* name */
'Has undergone a bodyswap at some point in their life', /* name */
'is occupying a body not necessarily their own', /* unit description */
0, /* slave value */
{
},
)>><<run new setup.Interaction(
'unit_abuse',
'Abuse',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionAbuse',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<pronounload $i _u>>
<<set _maintraining = setup.UnitTitle.getMainTraining(_u)>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<set _blind = _u.isHasTrait(setup.trait.eq_blind)>>
<<set _utorsoequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.torso)>>
<<set _ulegsequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.legs)>>
<<set _unaked = setup.Text.Unit.Equipment.isNaked(_u)>>
<<set _verymaso = (_u.isHasTrait(setup.trait.training_masochist_advanced) && _maintraining.getTags().includes('trmasochist'))>>
<<set _maso = (_u.isHasTrait(setup.trait.training_masochist_basic) && _maintraining.getTags().includes('trmasochist'))>>
<<set _advanced = _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _basic = _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
<<set _notrain = _u.isHasTrait(setup.trait.training_none)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
<<if !_bedchamber>>
your
<<else>>
your private
<</if>>
<<titlefull _u>>
<<name _u>> over so you can abuse $i.him.
You get things started with an open-handed slap across the
face<<if _blind>>; thanks to the blindfold, $i.he never saw it coming<</if>>.
As $i.he reels in shock and pain, you follow up with
<<if _u.isHasDick()>>
a vicious slap to $i.his <<udick _u>>,
<<elseif _u.isHasVagina()>>
a vicious slap to $i.his exposed clit,
<<else>>
a vicious jerk on $i.his <<unipples _u>>,
<</if>>
which causes $i.him to collapse to the $i.floor in agony.
<<if !_unaked>>
You tell $i.him $i.he has ten seconds to get naked.
<</if>>
<<ustriptorso _u>>
<<ustriplegs _u>>
<<if _verymaso>>
The slap seems to have excited $i.him, seeing $i.his
hard nipples <<if _u.isHasDick()>>and erect cock<<elseif _u.isHasVagina()>>and wet pussy<</if>>,
and $i.his <<ueyes _u>> practically begging for more.
<<elseif _maso>>
$i.He seems to be a bit expectant of what is to come.
<</if>>
<<if !_hasdick>>
<<if !_unaked>>While $i.he strips, you<<else>>You<</if>> don a cruelly large strap-on, earning
<<elseif _hasvagina>>
<<if !_unaked>>While $i.he strips, your<<else>>Your<</if>> stiffening cock rises,
revealing your pussy and earning
<<if _verymaso>>
a sultry look
<<elseif _maso>>
a shy look
<<else>>
a frightened glance
<</if>>
from your victim.
<</if>>
You order $i.him to present
<<if _u.isHasVagina()>> $i.his holes <<else>> $i.his hole<</if>>
to you
and spank $i.him brutally
<<if _maso>>
making $i.his
<<if _u.isHasVagina()>>
pussy
<<elseif _u.isHasDick()>>
dick
<<else>>
nipple
<</if>>
throb
<</if>>
<<if _notrain>>
until $i.he complies.
<<elseif _basic>>
as $i.he slowly complies.
<<else>>
as $i.he rushes to comply.
<</if>>
$i.His <<uass _u>>
growing red under the spanking.
<<if _chastity>>
You rip $i.his dick chastity off $i.him,
though $i.he knows not to be relieved.
$i.His cock is now vulnerable, not free.
<</if>>
<<set _analrape = false>>
<<if _u.isHasTrait(setup.trait.vagina_tight)>>
<<ustripvagina _u>>
The bitch's pussy is tight,
so you ram
<<if !_hasdick>>the strap-on<<else>>your dick<</if>>
into $i.him without preamble and fuck $i.him hard and fast.
<<if _hasvagina && _hasvagina>>
Fortunately for $i.him, this gets you so wet that some of your pussyjuice makes
it down onto your shaft and serves as improvised lube.
<</if>>
$i.His cunt spasms with the pain of the rape.
You cum in no time.
<<elseif _u.isHasTrait(setup.trait.anus_tight)>>
<<ustripanus _u>>
The bitch's butt is tight, so you ram
<<if !_hasdick>>the strap-on<<else>>your dick<</if>>
into $i.him without lubricant and sodomize $i.him as hard as you can without
damaging your property.
<<if _hasvagina && _hasvagina>>
Fortunately for $i.him,
this gets you so wet that some of your pussyjuice makes it down
onto your shaft and serves as improvised lube.
<</if>>
$i.His asshole spasms with the pain of the rape.
You cum explosively.
<<set _analrape = true>>
<<elseif _u.isHasDick() && _u.isHasBalls()>>
You ram
<<if !_hasdick>>the strap-on<<else>>your dick<</if>>
into $i.his butt without lubricant.
As $i.he flinches you announce that $i.he'll be taking part
in giving $i.himself anal pain.
$i.He humps into you lamely,
so you administer a truly agonizing slap to $i.his <<uballs _u>>
<<if _hasdick>> that makes $i.his anal ring stiffen deliciously around your dick<</if>>.
To avoid further punishment
$i.he fucks $i.himself against you almost hard enough
to hurt $i.himself.
<<if _hasvagina && _hasvagina>>
Fortunately for $i.him, this gets you so wet that some of
your pussyjuice makes it down onto your shaft and
serves as improvised lube.
<</if>>
You orgasm explosively.
<<set _analrape = true>>
<<else>>
$i.He's got no special physical targets for abuse,
so you just rape $i.him hard and fast,
raining stinging slaps down on $i.him as you do.
$i.He cries and whimpers; you finish with an explosive orgasm.
<</if>>
This leaves $i.him sobbing on the floor
<<if !_hasdick>>
as you shuck off the strap-on and drop it on $i.his face<<else>>
with cum dripping out of $i.him<</if>>.
<<if _analrape>>
The anal rape leaves $i.him with a sore butthole.
<</if>>
<<if _maso>>
$i.He secretly got off on the pain and humiliation.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_caress',
'Caress',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionCaress',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<set _hasbreasts = $unit.player.isHasBreasts()>>
<<pronounload $i _u>>
<<set _maintraining = setup.UnitTitle.getMainTraining(_u)>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<set _umouthequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.mouth)>>
<<set _friendship = $friendship.getFriendship(_u, $unit.player)>>
<<set _mindbroken = _u.isMindbroken()>>
<<set _advanced = _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _basic = _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
<<set _notrain = _u.isHasTrait(setup.trait.training_none)>>
<<set _gagged = _u.isHasTrait(setup.trait.eq_gagged)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and commands
your <<titlefull _u>> <<= _u.getName()>>
to approach you.
<<include 'InteractionKissApproach'>>
You delicately lift $i.his <<uhead _u>>
and touch your fingertips to $i.his chin,
tenderly brushing along the line of $i.his <<umouth _u>>
with the your thumb.
Then, you gently tilt $i.his <<uface _u>> back and lightly touch $i.his lips
with your fingertips.
You use your fingers and thumbs to slowly slide along $i.his mouth,
$i.his chin, $i.his cheeks then around $i.his face.
You use a deft touch to thoroughly explore the shape of
$i.his cheekbones.
Grazing $i.his temple and brushing $i.his forehead
simultaneously, you smoothly motion along $i.his
eyelids and nose and you tenderly stroke $i.his face with both
hands as you take $i.his head
lightly and trace around it, gently massaging
as you go.
You work your way down, slowly and gradually,
along $i.his <<uneck _u>> with one <<uhand $unit.player>>,
then the other,
briefly pausing before continuing your path down to $i.his shoulders
and<<if !_mindbroken>> $i.he starts to gasp as<<else>> starts to shudder as<</if>>
you slide your <<uhands $unit.player>> down $i.his side,
across $i.his
<<if _u.getWings()>>
<<uwings _u>>
<<else>>
back
<</if>>
and along $i.his belly taking every moment to savour
the contours of $i.his <<ubody _u>>
before going back up again to $i.his face.
<<if _mindbroken>>
$i.His posture doesn't change.
$i.He initially only reacts slightly
to your physical touch but then stops reacting completely.
When you stop, $i.his <<ueyes _u>>
track the movements of your <<uhands $unit.player>> briefly but then stare
blankly ahead of $i.his, awaiting further use of $i.his <<ubody _u>>.
<<elseif _friendship >= 800>>
$i.His eyes gradually close and
$i.he slowly leans $i.his head back,
relaxing as $i.he feels your caress.
$i.He gently gasps as $i.he feels your warm <<uarms _u>>.
When you finally stop gently caressing $i.him,
$i.his <<ueyes _u>>
remain closed and $i.his <<umouth _u>>
still in a rapturous shape for a moment before $i.he slowly opens
$i.his eyes and smiles at you,
$i.he has an eager look on $i.his <<uface _u>>.
A <<uhand _u>> reaches dumbly up to $i.his face mimicking your last movements.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"I love you", $i.he says dreamily.
<</if>>
$i.He looks as though $i.he wants much more than your mere caress.
<<elseif _u.isHasTrait(setup.trait.training_dominance_advanced) && _maintraining.getTags().includes('trdominance')>>
As you start to touch $i.his
<<uface _u>>, $i.he smiles at you and takes your <<uhand $unit.player>> in <<theirs _u>>,
following its movements.
$i.He tries hard to stop $i.himself from losing $i.himself in your masterful <<uhands $unit.player>>.
$i.He takes $i.his tendency towards sexual dominance right up to
the edge of insubordination, when $i.he starts to caress your <<uface _u>> in turn.
When you finally stop, $i.his eyes are closed and $i.he's smiling.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"That was fun", $i.he says cheerfully.
<</if>>
$i.He looks at you, $i.his <<ueyes _u>> almost begging you to give $i.his more than your mere caress.
<<elseif _hasdick && _u.isHasTrait(setup.trait.training_oral_advanced) && _maintraining.getTags().includes('troral')>>
$i.He stiffens at your touch but slowly
relaxes to your fingers on $i.his face.
As you move your fingers along $i.his lips,
$i.he reacts almost as though $i.he's receiving oral.
$i.He starts to gently suck your fingers, moaning into your <<uhand $unit.player>> and pressing
$i.his <<ubody _u>> lewdly against your <<ubreast $unit.player>>.
<<if !_chastity>>
$i.He achieves a weak orgasm before you stop caressing $i.him.
<</if>>
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"That was fun", $i.he says lustfully.
<</if>>
$i.He looks at you as if $i.he wants more than your <<uhands $unit.player>> touching $i.him.
<<elseif _friendship >= 500>>
$i.He accepts your touch with devotion,
leaning $i.his head back at your gentle caress along $i.his face.
$i.He leans $i.his <<ubody _u>> forward,
pressing $i.himself against you,
and you feel the intense heat from $i.his <<ubody _u>> against your <<ubreast $unit.player>>.
$i.He gradually closes $i.his <<ueyes _u>>
and when you finally stop, $i.he runs
$i.his <<uhand _u>> delightfully across $i.his face where you last touched $i.his,
an euphoric look on $i.his <<uface _u>>.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"I love you", $i.he says jubilantly.
<</if>>
$i.He looks at you longingly, almost as if $i.he's bursting
to say that $i.he wants more than your mere caress.
<<elseif _u.isHasTrait(setup.trait.training_obedience_advanced)>>
$i.He accepts your touch willingly.
As you are so close to $i.him,
you sense considerable turmoil in the $i.man;
$i.he's doing $i.his duty as a slave by complying with your wishes,
and is probably struggling with the mixture of resistance,
obedience and perhaps even devotion forced to the forefront of
$i.his mind by your touch across $i.his face.
When you finally move your <<uhand $unit.player>> away,
$i.his <<ueyes _u>>
gaze into yours searchingly,
looking for answers that are not there.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
$i.He asks hesitantly, "I-is that it?".
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic)>>
$i.He shakes at your touch fearfully.
As you move your <<uhand $unit.player>> along $i.his unresisting face,
$i.his eagerness to avoid punishment leads $i.his
to stiffen, $i.his nervousness is made apparent.
You continue stroking $i.his cheek,
enjoying $i.his fear, and the physical intimacy slowly
does its work. $i.He starts to relax, $i.his resistance easing
and $i.his eyes start to close.
When finally move your <<uhand $unit.player>> away, $i.he looks at you for a long moment,
$i.his <<ueyes _u>>
darting up at you, before visibly catching $i.himself with
a reminder that $i.he's a slave and you're $i.his owner.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
$i.He asks hesitantly, "I-is that it?".
<</if>>
<<elseif _friendship <= -100>>
$i.He is nearly frozen with fear,
and does not resist as you start to caress $i.his face.
In fact, $i.he barely reacts at all.
$i.He stares at you as you move your fingers across
$i.his stiff face, but it's like touching a statue.
$i.He is so filled with terror that $i.he remains
stiff even as it becomes clear to $i.his you're not going to hurt $i.him.
When you bore of touching the $i.man and move your <<uhand $unit.player>> away,
$i.he stares at you in utter incomprehension.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
$i.He asks nervously, "I-is that it?".
<</if>>
Then $i.he cringes.
<<else>>
$i.He reflexively turns away from you, but you catch $i.his <<uhead _u>>
with one <<uhand $unit.player>> and slowly but gently move your other <<uhand $unit.player>> along $i.his face.
Spluttering, $i.he leans backwards, but
you tip forward with $i.him and pin $i.him against the walls of the $i.locgeneral,
not stopping your gentle touch on $i.his head.
$i.He tries to wriggle out of your grasp desperately, but
$i.his struggles slowly subside as $i.he
realizes that you're not taking this any farther.
When you bore of it and move your <<uhand $unit.player>> away, $i.he
stares at you in utter incomprehension.
His eyes demand an answer: is that it?
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_embrace',
'Embrace',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionEmbrace',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<set _hasbreasts = $unit.player.isHasBreasts()>>
<<pronounload $i _u>>
<<set _maintraining = setup.UnitTitle.getMainTraining(_u)>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<set _umouthequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.mouth)>>
<<set _friendship = $friendship.getFriendship(_u, $unit.player)>>
<<set _mindbroken = _u.isMindbroken()>>
<<set _advanced = _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _basic = _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
<<set _notrain = _u.isHasTrait(setup.trait.training_none)>>
<<set _gagged = _u.isHasTrait(setup.trait.eq_gagged)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and command
your <<titlefull _u>>
<<= _u.getName()>>
to approach you.
<<include 'InteractionKissApproach'>>
You walk around $i.him and put your <<uhands $unit.player>> around $i.his <<ubody _u>>,
to gently pull $i.him close towards you
and then wrap your arms around $i.his shoulders.
When you press your hips against <<theirs _u>>,
<<if _basic>>letting $i.him lean while taking the weight of $i.him against you<<else>>
$i.he tries to lean away from you, pushing against your <<uarms _u>><</if>>.
You lovingly squeeze $i.him in your <<ubody $unit.player>> within the long, cradling embrace of your <<uarms _u>>.
<<if _u.isHasTrait(setup.trait.breast_tiny)>>
You feel $i.his erect nipples against your
<<uarms $unit.player>>
as you move your arms down around $i.his <<ubreast _u>>.
<<else>>
You move your arms down around $i.his <<ubreast _u>>
<<if _u.isHasTrait(setup.trait.muscle_strong)>> and feel $i.his rippling muscles<</if>>.
<</if>>
<<if _basic>>
You take your time to stay in this position, feeling $i.his
heart beat against you.
$i.He starts to breathe faster before you keep one arm wrapped around
$i.him as you move to $i.his front.
<<else>>
As you move to $i.his front, with one arm still around $i.him,
$i.he again tries to break away but you keep $i.him held tightly and
you whisper the alternatives to $i.him, reminding $i.him.
<</if>>
You wrap your arms around $i.his back
as you press $i.his <<ubreast _u>> against your
<<ubreast $unit.player>>.
<<if _mindbroken>>
Her posture doesn't change.
$i.He initially only reacts slightly to your physical touch but eventually
$i.he relaxes in the warmth of the your embrace against $i.him.
You know that this may only be a physiological reaction,
nothing more. For a brief moment you think you
detect a spark of life in $i.his dull eyes
but just as quickly, it is gone.
When you stop, $i.his <<ueyes _u>> track the movements of your <<uhands $unit.player>>
briefly but then $i.he stares blankly ahead of $i.him,
not understanding what is happening.
<<elseif _friendship >= 800>>
In the warmth of your embrace,
$i.he turns towards you,
$i.his passionate <<ueyes _u>> staring intently at your <<uface $unit.player>>.
$i.He leans closer to you and kisses you as you hold $i.him.
Her heart beats faster and then gradually slows as $i.he grows accustomed
to your <<ubody $unit.player>> against $i.his <<ubody _u>>.
Eventually, $i.he relaxes totally and $i.his eyes gradually close,
melting in your <<uarms $unit.player>>.
When you finally stop and relax your embrace,
$i.his eyes remain closed and $i.his <<umouth _u>> still in a
rapturous shape for a moment before $i.he slowly opens
$i.his eyes and smiles at you with a blissful look on $i.him <<uface _u>>.
$i.His <<uhand _u>> reaches to your <<uarms $unit.player>> and $i.he strokes them longingly.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"I love you", $i.he says dreamily.
<</if>>
$i.He looks at you,
almost begging you with $i.him eyes that $i.he wants much more than a mere embrace.
<<elseif _u.isHasTrait(setup.trait.training_dominance_advanced) && _maintraining.getTags().includes('trdominance')>>
In your soft, warm embrace,
$i.he tries hard to stop $i.himself from losing $i.himself in your arms.
$i.He starts to embracing you in $i.him <<uarms _u>> as well.
When you gently squeeze $i.him in your <<uarms $unit.player>>,
$i.he breathes more heavily and starts to lovingly squeeze you as well,
$i.his tendency towards sexual dominance encouraging $i.him to
compete with you in embraces against each other.
When you finally stop and relax your embrace, $i.his
eyes are closed and $i.he's smiling blissfully.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"That was fun", $i.he says cheerfully.
<</if>>
$i.He eagerly looks at you, $i.his eyes almost seem to say that
$i.he wants you to give $i.him more than a mere hug.
<<elseif _friendship >= 500>>
$i.He sighs devotedly in your <<uarms $unit.player>>
and slowly relaxes.
$i.He turns towards you, $i.his doting <<ueyes _u>>
staring intently at your <<uface $unit.player>>.
You feel $i.his heart beating faster against your <<ubreast $unit.player>>
as you softly squeeze your arms tighter.
$i.His <<uhands _u>> reach to your <<uarms $unit.player>>
and $i.he strokes them longingly as you squeeze.
$i.He gradually closes $i.his eyes as $i.he leans $i.his <<ubody _u>> against yours,
melting in your warm embrace,
and you feel the intense heat from $i.his <<ubody _u>> against your <<ubreast $unit.player>>.
When you finally stop, $i.he reaches to your <<uface $unit.player>>
with $i.his <<uhand _u>> and gently strokes your cheek, a euphoric
look on $i.his <<uface _u>>.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"I love you", $i.he says elatedly.
<</if>>
$i.He looks at you longingly, almost as if $i.he's bursting to say
that $i.he wants more than a mere embrace.
<<elseif _u.isHasTrait(setup.trait.training_obedience_advanced)>>
$i.He willingly gives $i.himself up to
your embracing arms.
As you are so close to $i.him,
you sense considerable uneasiness in the $i.man;
$i.he's doing $i.him duty as a slave by complying with your wishes,
and is probably struggling with the mixture of resistance, obedience and perhaps
even devotion forced to the forefront of $i.his mind by your
soft embrace against $i.his <<ubody _u>>.
$i.He gradually closes $i.his eyes in the feeling of your gentle <<uarms $unit.player>>.
When you finally stop and relax your embrace,
$i.his <<ueyes _u>> open to gaze puzzlingly at you.
Even though $i.he has accepted life as a sex slave,
$i.he looks as though $i.he is unsure of what to make of
this non-sexual physical contact.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
He asks hesitantly, "I-is that it?".
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic)>>
$i.He shakes at your touch fearfully.
As you softly press $i.his trembling body against you,
$i.his eagerness to avoid punishment leads $i.him
to stiffen in your <<uarms $unit.player>>.
While $i.he continues to shudder,
you continue embracing $i.him,
enjoying $i.his fear, and the physical intimacy slowly does its work.
$i.He starts to relax, $i.his resistance easing and $i.his eyes start to close.
When you relax your arms for a moment,
$i.he opens $i.him eyes to look at you for a long moment,
$i.him eyes darting up to your <<uface $unit.player>>,
before visibly catching $i.himself with a reminder that $i.he's a slave and you're $i.him owner.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
He asks hesitantly, "I-is that it?".
<</if>>
<<elseif _friendship <= -100>>
$i.He is nearly frozen with fear,
and does not resist as you start to squeeze your <<uarms $unit.player>>
around $i.him.
In fact, $i.he barely reacts at all.
$i.He stares at your arms as they continue squeezing, but
it's like touching a statue.
$i.He is so filled with terror that $i.he
remains stiff even as it becomes clear to $i.him
you're not going to hurt $i.him.
When you bore of embracing the still
$i.man
and release $i.him,
$i.he stares at you in utter incomprehension.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
He asks nervously, "I-is that it?".
<</if>>
Then $i.he cringes, unsure of what you are going to do next.
<<else>>
$i.He reflexively tries to break free from your <<uarms $unit.player>>,
but you keep $i.him wrapped in them.
Shuddering, $i.he desperately leans away from you,
but you tip forward with $i.him and pin $i.him against the walls of the $i.locgeneral,
continuing your hold on $i.him.
$i.He tries to wriggle out of your grasp desperately, but
$i.his struggles slowly subside as $i.he
realizes that you're not taking this any farther.
When you bore of it and release $i.him,
$i.he stares at you in utter incomprehension.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
He splutters, "Is that it?".
<</if>>
$i.He shakes uncontrollably, apprehensive at what you are going to do next.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fist_ass',
'Fist ass',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFistAss',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.Trait(setup.trait.training_anal_advanced),
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<pronounload $i _u>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and called
your <<titlefull _u>>
<<= _u.getName()>> over, telling $i.him that you are planning to use
$i.his <<uanusall _u>>.
<<ustripanus _u>>
You tell $i.him to grab $i.his ankles.
$i.He complies,
relaxing $i.his
<<uanus _u>>
in the expectation of
<<if _hasdick>> your cock<<else>>a strap-on<</if>>,
but starts with surprise when she feels two warm,
lubricated fingers slide into $i.his rectum.
<<if _u.isHasTrait(setup.trait.anus_gape)>>
$i.He moans when you add a third, and grunts when you insert a fourth.
When $i.he feels you form your <<uhand $unit.player>> into a point,
thumb included, $i.he understands what's coming and relaxes completely.
The wide part of your <<uhand $unit.player>>, at the knuckles, squeezes
into $i.him without much trouble,
and $i.he lets out a huge sigh.
When you start to fuck $i.him, though, $i.he collapses to $i.him knees,
begging you to fist $i.his hole without mercy
$i.He starts to frantically
<<if _chastity>>
rub $i.his taint
<<elseif !_u.isHasDick()>>
rub $i.himself
<<else>>jerk off<</if>>.
<<if _chastity>>
$i.His chastity device prevents $i.him from reaching climax.
<<else>>
$i.He manages to climax promptly,
$i.his overstimulated sphincter helping, no doubt.
<</if>>
$i.He slumps to the ground when you withdraw your <<uhand $unit.player>>, gasping.
You haul $i.him so $i.he can
<<if _hasdick>>
suck you off
<<if _hasvagina>>
and
<</if>>
<</if>>
<<if _hasvagina>>
eat you out
<</if>>.
$i.He complies,
<<if _u.isHasTrait(setup.trait.per_submissive)>>
submissively
<</if>>
drooling and groaning,
all pretense of <<if _u.isFemale()>>feminine grace<<else>>masculinity<</if>> gone.
It doesn't take long, since that was quite a lot of fun,
but by the time you finish $i.he's already
<<if _chastity>>
masturbating
<<else>>
rubbing $i.his chastity device
<</if>>
again.
<<elseif _u.isHasTrait(setup.trait.anus_loose)>>
$i.He grunts when you add a third, and begins to beg when you insert a fourth.
When $i.he feels you form your <<uhand $unit.player>> into a point,
thumb included, $i.he understands what's coming and does $i.his best to relax.
The wide part of your <<uhand $unit.player>>, at the knuckles, squeezes into $i.him
after some effort on your part and squealing on $i.his part.
When you withdraw it and press it back in, slowly
starting to fist fuck $i.him ass, though, $i.he collapses to $i.his knees,
sobbing in a mixture of pain and pleasure.
$i.He starts to frantically
<<if _chastity>>
rub $i.his taint
<<elseif !_u.isHasDick()>>
rub $i.himself
<<else>>jerk off<</if>>.
<<if _chastity>>
$i.His chastity device prevents $i.him from reaching climax.
<<else>>
$i.He manages to climax eventually.
<</if>>
$i.He slumps to the ground when you withdraw your <<uhand $unit.player>>, gasping.
You haul $i.him so $i.he can
<<if _hasdick>>
suck you off
<<if _hasvagina>>
and
<</if>>
<</if>>
<<if _hasvagina>>
eat you out
<</if>>.
$i.He complies,
<<if _u.isHasTrait(setup.trait.per_submissive)>>
submissively
<</if>>
drooling and weeping,
all pretense of <<if _u.isFemale()>>feminine grace<<else>>masculinity<</if>> gone.
It doesn't take long, since that was quite a lot of fun,
but by the time you finish $i.he's
<<if _chastity>>
tentatively masturbating
<<else>>
rubbing $i.his chastity device
<</if>>
again.
<<else>>
$i.He squeals when you add a third,
and begins to shamelessly beg for mercy when you insert a fourth.
When $i.he feels you form your <<uhand $unit.player>> into a point, thumb included,
$i.he understands what's coming and collapses to $i.his knees,
begging you not to be gentle and not ruin $i.his favorite hole.
$i.He starts to frantically
<<if _chastity>>
rub $i.his taint
<<elseif !_u.isHasDick()>>
rub $i.himself
<<else>>jerk off<</if>>.
As $i.he works $i.his sphincter relaxes bit by bit,
and you advance your fist up $i.his butt.
$i.He screams in surprise and relief
when your knuckles finally make it
<<if _chastity>>
in.
<<else>>
in, and achieves a crying orgasm shortly thereafter.
<</if>>
$i.He slumps to the ground when you withdraw your <<uhand $unit.player>>,
moaning incoherently.
You haul $i.him so $i.he can
<<if _hasdick>>
suck you off
<<if _hasvagina>>
and
<</if>>
<</if>>
<<if _hasvagina>>
eat you out
<</if>>.
$i.He complies,
<<if _u.isHasTrait(setup.trait.per_submissive)>>
submissively
crying
<<else>>
sobbing
<</if>>
quietly in pain and disarray,
all pretense of <<if _u.isFemale()>>feminine grace<<else>>masculinity<</if>> gone.
It doesn't take long, since that was quite a lot of fun,
and by the time you finish $i.he hasn't yet worked up
the courage to touch $i.his backdoor.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fist_vagina',
'Fist vagina',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFistVagina',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qs.trait_vagina,
setup.qres.Trait(setup.trait.training_vagina_advanced),
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<pronounload $i _u>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and called
your <<titlefull _u>>
<<= _u.getName()>> over, telling $i.him that you are planning to use
$i.his <<uvaginaall _u>>.
<<ustripvagina _u>>
You slide up behind $i.him and run a possessive
hand down to finger $i.his pussylips.
She compliantly cocks $i.his hips backward for you,
and is surprised to find a couple of warm, lubricated fingers
rather than
<<if _hasdick>>your cock<<else>>a strap-on<</if>>
sliding into $i.his ready cunt.
<<if _u.isHasTrait(setup.trait.vagina_gape)>>
$i.He moans when you add a third,
and grunts when you insert a fourth.
When $i.he feels you form your <<uhand $unit.player>> into a point, thumb included, $i.he understands
what's coming and relaxes completely.
The wide part of your <<uhand $unit.player>>, at the knuckles, squeezes into $i.him without much trouble,
and $i.he lets out a huge sigh.
When you start to fuck $i.his huge cunt with your <<uhand $unit.player>>, though,
$i.he collapses to $i.his knees, whining and begging nonverbally.
$i.he starts to frantically
<<if _chastity>>
rub $i.his taint
<<elseif !_u.isHasDick()>>
rub $i.himself
<<else>>
jerk off
<</if>>
$i.He manages to climax promptly,
$i.his big vagina squeezing your <<uarms $unit.player>> strongly.
$i.He slumps to the ground when you withdraw your <<uhand $unit.player>>, gasping,
the collapse giving you a good view into $i.his open, pink-walled channel.
You haul $i.him back so $i.he can
<<if _hasdick>> suck you off <<if _hasvagina>>and<</if>><</if>>
<<if _hasvagina>>eat you out<</if>>.
$i.He complies,
<<if _u.isHasTrait(setup.trait.per_submissive)>>
submissively
<</if>>
drooling and groaning,
all pretense of <<if _u.isFemale()>>feminine grace<<else>>masculinity<</if>> gone.
It doesn't take long, since that was quite a lot of fun, but by the time you finish
$i.he's replaced your <<uhand $unit.player>> with $i.his own.
<<elseif _u.isHasTrait(setup.trait.vagina_loose)>>
$i.He grunts when you add a third, and begins to beg when you insert a fourth.
When $i.he feels you form your <<uhand $unit.player>> into a point,
thumb included,
$i.he understands what's coming and hurriedly gets down on $i.his knees to
present a more comfortable angle.
The wide part of your <<uhand $unit.player>>, at the knuckles,
squeezes into $i.him after some effort on your part and squealing on $i.his part.
$i.He starts to frantically
<<if _chastity>>
rub $i.his taint
<<elseif !_u.isHasDick()>>
rub $i.himself
<<else>>jerk off<</if>>.
<<if _chastity>>
$i.His chastity device prevents $i.him from reaching climax.
<<else>>
$i.He manages to climax eventually.
<</if>>
$i.He slumps to the ground when you withdraw your <<uhand $unit.player>>,
gasping, the collapse giving you a good view into $i.his currently-gaping, pink-walled channel.
You haul $i.him so $i.he can
<<if _hasdick>>
suck you off
<<if _hasvagina>>
and
<</if>>
<</if>>
<<if _hasvagina>>
eat you out
<</if>>.
$i.He complies,
<<if _u.isHasTrait(setup.trait.per_submissive)>>
submissively
<</if>>
drooling and weeping,
all pretense of <<if _u.isFemale()>>feminine grace<<else>>masculinity<</if>> gone.
It doesn't take long, since that was quite a lot of fun,
but by the time you finish $i.he's
<<if _chastity>>
tentatively masturbating
<<else>>
rubbing $i.his chastity device
<</if>>
again.
<<else>>
$i.He squeals when you add a third,
and begins to shamelessly beg for mercy when you insert a fourth.
When $i.he feels you form your <<uhand $unit.player>> into a point,
thumb included, $i.he understands what's coming and collapses to $i.his knees,
begging you to be gentle.
$i.he frantically
<<if _chastity>>
rub $i.his taint
<<elseif !_u.isHasDick()>>
rub $i.himself
<<else>>jerk off<</if>>,
hoping to relax a little.
As $i.he works $i.his pussy relaxes bit by bit,
and you advance your fist into $i.his womanhood.
$i.He screams in surprise and relief when your knuckles finally make it
<<if _chastity>>
in, and achieves a crying orgasm shortly thereafter.
<<else>>
in.
<</if>>
$i.He slumps to the ground when you withdraw your <<uhand $unit.player>>,
moaning incoherently,
the collapse giving you a good view into $i.him currently-gaping, pink-walled channel.
You haul $i.him around so $i.he can
<<if _hasdick>>
suck you off
<<if _hasvagina>>
and
<</if>>
<</if>>
<<if _hasvagina>>
eat you out
<</if>>.
$i.He complies,
<<if _u.isHasTrait(setup.trait.per_submissive)>>
submissively
<</if>>
crying quietly with overstimulation,
all pretense of
all pretense of <<if _u.isFemale()>>feminine grace<<else>>masculinity<</if>> gone.
It doesn't take long, since that was quite a lot of fun,
but by the time you finish $i.he's gingerly massaging $i.his loosened cunt.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fondle_butt',
'Fondle butt',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFondleButt',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<pronounload $i _u>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
so you can fondle $i.his butt as well as $i.his <<uanusall _u>>.
<<ustripanus _u>>
<<if _u.isMindbroken()>>
You instruct $i.him to present $i.his buttocks
and anus but $i.he remains still and unresponsive.
Talking to a broken mind is pointless.
You reach around and grab $i.his buttocks
buttocks before rubbing along them,
feeling the shape of $i.his ass with your fingers and squeezing gently.
$i.He reacts to your initial touch as you rub fingers around $i.his <<uanus _u>>,
but you understand it is only physiological.
You continue to move around $i.his posterior gently reaching to touch
your fingertips against $i.his sphincter while rubbing $i.his ass at the same time.
You circle around $i.his anus but $i.he remains still.
You keep squeezing $i.his buttocks tenderly -
first one, then the other and then both but $i.he is like a doll in your grasp.
You pull $i.his <<ubody _u>> closer towards you by $i.his buttocks,
turn $i.him around and bend $i.him over by $i.location.
You look at $i.his rear while you squeeze $i.his cheeks and rub them with your firm <<uhands $unit.player>>.
You explore the contours of $i.his posterior with both your eyes and <<uhands $unit.player>>,
then look at $i.his <<uanus _u>>
as you trace it with your fingers and thumb.
Eventually, you decide to stop but $i.he
remains in position over by $i.location until you stand $i.him up yourself.
<<elseif _u.isMasochistic()>>
$i.He approaches you eagerly and waves $i.his butt,
then presents $i.his anus in front of you,
spreading $i.his butt cheeks towards you with
$i.his <<uarms _u>> before turning to face you.
You reach around and firmly grab $i.his
buttocks with both <<uhands $unit.player>>.
$i.He gasps as you smack both of $i.his cheeks,
you feel the shape of $i.his ass with your fingers and squeeze hard.
$i.He moans with arousal as you spank $i.his
buttocks.
$i.He looks longingly into your eyes as you continue to move around
$i.his posterior,
pinching with your fingers and slapping with your palms before reaching
to touch your fingertips against $i.his sphincter.
$i.He moans and quivers slightly when you you rub fingers around
$i.his <<uanus _u>>.
$i.He starts to wiggle $i.his ass while you circle around $i.his anus,
not breaking contact with $i.him with your fingers.
You keep squeezing $i.his buttocks firmly - first one, then the other
and then finally both.
$i.He can't resist gyrating $i.his hips in arousal while in your grasp.
You strongly pull $i.his <<ubody _u>>
closer towards you by $i.his buttocks,
turn $i.him around and push $i.him
down to bend $i.him over by $i.location.
$i.He pretends to be unwilling but cannot disguise
$i.his obvious joy, being a masochist as $i.he is.
You see that $i.his rear has reddened in your rough play
and you continue to squeeze $i.his cheeks hard and spank them with your firm <<uhands $unit.player>>.
$i.He moans harder at you squeezing along the contours of $i.his
posterior with both your <<uhands $unit.player>> and at $i.his butthole as you push against
it with your fingers and thumb.
Eventually you decide to stop and $i.he squeals with delight after you give $i.his
buttocks a few hard smacks for good measure.
$i.His <<uface _u>> is in ecstasy as $i.he stands and turns to face you,
gently rubbing the red spots on $i.his buttocks and looking at you hungrily as if $i.he wants more.
<<elseif _u.isHasTrait(setup.trait.training_none)>>
You instruct $i.him to present $i.his buttocks and anus.
Opposed to the thought of your <<uhands $unit.player>> groping $i.his,
$i.he tries to step back,
but you catch $i.him and pull $i.his <<ubody _u>>
closer to you as you reach around and grab $i.his
buttocks.
$i.He tries to grab your wrists to keep them away but $i.he cannot resist for long.
You start rubbing along $i.his cheeks,
feeling the shape of $i.his ass with your fingers and squeezing gently.
$i.He tries to break out of your grasp as you rub fingers around $i.his <<uanus _u>>.
$i.He writhes as you continue to move around $i.his posterior gently reaching to touch your
fingertips against $i.his sphincter while rubbing $i.his ass at the same time.
$i.He struggles to stay still while you circle around $i.his anus,
not breaking contact with $i.him with your fingers.
You look at $i.his <<uface _u>> and $i.he has shut $i.his <<ueyes _u>>,
trying not to think about what's happening to $i.his butt.
This only encourages you to continue.
You keep squeezing $i.his buttocks tenderly -
first one, then the other and then finally both and
$i.he can't help but quiver while in your grasp.
You pull $i.his <<ubody _u>> closer towards you by $i.his buttocks,
turn $i.him around and push $i.him down,
bending $i.him over by $i.location while $i.he tries to push away.
You look at $i.his rear while you squeeze $i.his cheeks and rub
them with your firm <<uhands $unit.player>>.
You wander along the outline of $i.his posterior with both your eyes and <<uhands $unit.player>>,
then look at $i.his <<uanus _u>>
butthole as you trace it with your fingers and thumb.
Eventually, you decide to stop.
$i.He slowly stands and looks in your <<ueyes $unit.player>>,
as though almost demanding answers.
$i.He looks apprehensive about what you will do next.
<<elseif _u.isHasTraitExact(setup.trait.training_obedience_basic) && _u.isHasDick()>>
You instruct $i.him to present $i.his anus.
$i.He complies without comment, standing in front of you.
You reach around and grab $i.his
buttocks.
$i.His <<udick _u>>
cannot stop twitching as you start rubbing along $i.his cheeks,
feeling the shape of $i.his ass with your fingers and squeezing gently.
You rub your fingers around $i.his <<uanus _u>>.
$i.He writhes as you continue to move around $i.his posterior
gently reaching to touch your fingertips against $i.his sphincter
while rubbing $i.his ass at the same time.
$i.He struggles to stay still while you circle around $i.his anus with your fingers.
You look at $i.his <<uface _u>> and $i.he has shut $i.his <<ueyes _u>>,
trying not to get aroused by your touch on $i.his butt.
This only encourages you to continue.
You keep squeezing $i.his buttocks tenderly - first one,
then the other and then finally both and
$i.he can't help but quiver while in your grasp.
You pull $i.his <<ubody _u>> closer towards you by $i.his buttocks,
turn $i.him around and push $i.him down, bending $i.him over by $i.location.
You look at $i.his rear while you squeeze $i.his cheeks and rub them with your firm <<uhands $unit.player>>.
You wander along the outline of $i.his posterior with both your eyes and <<uhands $unit.player>>,
then look at $i.his <<uanus _u>>
as you trace it with your fingers and thumb.
Eventually, you decide to stop and $i.he looks up at you quizzically,
unsure about what you will do next.
<<elseif _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
You instruct $i.his to present $i.his
anus.
$i.He hesitates but eventually stands in front of you showing
$i.his buttocks before presenting $i.his <<uanus _u>>
to you and turning to face you.
You reach around and grab $i.his
buttocks.
You start rubbing along $i.his cheeks,
feeling the shape of $i.his ass with your fingers and
squeezing gently.
As you rub your fingers around $i.his anus,
$i.he starts to relax.
$i.He quivers as you continue to move around $i.his posterior gently
reaching to touch your fingertips against $i.his sphincter
while rubbing $i.his ass at the same time.
$i.He purses $i.his lips while you circle around $i.his anus
with your fingers.
You look at $i.his <<uface _u>> and is looking back at you doe-eyed,
trying but failing not to get aroused by your soft touch on $i.his butt.
You keep squeezing $i.his buttocks tenderly -
first one, then the other and then finally both and $i.he
can't help but let out a moan while in your grasp.
You pull $i.his <<ubody _u>> closer towards you by $i.his buttocks,
turn $i.him around and push $i.him down, bending $i.him over your desk.
You look at $i.his rear while you squeeze $i.his cheeks and rub them with your firm <<uhands $unit.player>>.
You wander along the outline of $i.his posterior with both your eyes and <<uhands $unit.player>>,
then look at $i.his butthole as you trace it with your fingers and thumb.
Eventually, you decide to stop and $i.he looks up into your eyes
longingly, as if $i.he wants more.
<<else>>
You instruct $i.him to present $i.his anus.
$i.He eagerly stands in front of you showing $i.his buttocks
before happily presenting $i.his <<uanus _u>> to you,
spreading $i.his butt cheeks and turning to face you.
You reach around and grab $i.his buttocks.
You start rubbing along $i.his cheeks,
feeling the shape of $i.his ass with your fingers and squeezing gently.
As you rub your fingers around $i.his anus,
$i.he sighs audibly.
$i.He moans as you continue to move around
$i.his posterior gently reaching to touch your fingertips against $i.his sphincter while rubbing
$i.his ass at the same time.
$i.He quivers while you circle around $i.his anus with your fingers.
You look at $i.his <<uface _u>> and is looking back at you longingly,
getting aroused by your continued touch on $i.his butt.
You keep squeezing $i.his buttocks tenderly - first one, then the other
and then finally both and $i.he can't help but let out a moan while in your grasp.
You pull $i.his <<ubody _u>> closer towards you by $i.his buttocks,
turn $i.him around and push $i.him down, bending $i.him over by $i.location.
You look at $i.his rear while you squeeze $i.his cheeks and rub them with your firm <<uhands $unit.player>>.
You wander along the outline of $i.his posterior with both your eyes and <<uhands $unit.player>>,
then look at $i.his butthole as you trace it with your fingers and thumb.
Eventually, you decide to stop and $i.he looks up into your eyes ecstatically,
as $i.he stands, eager for more.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fondle_chests',
'Fondle chest',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFondleChests',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<set _hasbreasts = $unit.player.isHasBreasts()>>
<<pronounload $i _u>>
<<set _maintraining = setup.UnitTitle.getMainTraining(_u)>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<set _umouthequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.mouth)>>
<<set _friendship = $friendship.getFriendship(_u, $unit.player)>>
<<set _mindbroken = _u.isMindbroken()>>
<<set _advanced = _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _basic = _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
<<set _notrain = _u.isHasTrait(setup.trait.training_none)>>
<<set _gagged = _u.isHasTrait(setup.trait.eq_gagged)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
so you can fondle $i.his <<ubreastall _u>>.
<<ustriptorso _u>>
<<ustripnipple _u>>
<<set _unippleequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.nipple)>>
<<if _u.isMindbroken()>>
Like a doll,
$i.he dumbly remains still,
watching you place your <<uhands $unit.player>> on $i.his <<ubreast _u>> without any real interest.
You place your <<uhands $unit.player>> on $i.his
<<if _u.isHasTrait(setup.trait.breast_titanic)>>
monster tits, bouncing their weighty mass in your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_huge)>>
huge tits, bouncing them up and down in your <<uhands $unit.player>>,
while simultaneously rubbing $i.his nipples with your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_large)>>
large tits, jiggling them enticingly with your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_medium)>>
cute breasts, cupping them and gently playing with $i.his
<<unipples _u>> between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_tiny)>>
flat breasts, gently playing with $i.his hard, erect nipples between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.muscle_extremelystrong)>>
monster pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to play with $i.his nipples,
<<elseif _u.isHasTrait(setup.trait.muscle_verystrong)>>
extremely muscular pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to $i.his nipples
<<elseif _u.isHasTrait(setup.trait.muscle_strong)>>
muscular pecs, feeling and tracing its contour before sliding your <<uhands $unit.player>> to $i.his nipples
<<else>>
flat chests, gently playing with $i.his hard nipples between your fingers and thumbs,
<</if>>
teasing them and pulling them gently towards you.
Moving your <<uhead $unit.player>> close to $i.his <<ubreasts _u>>,
you nuzzle on a nipple with your lips and even lick
it with your tongue.
Then you alternate, nibbling with your teeth on the other nipple.
You squeeze the tips of $i.his nipples
with your thumbs and fingers and tweak them in your fingertips,
then you dab $i.his nipples with your thumbs,
flicking them in different directions. $i.
He moans at the continued stimulation of $i.his <<ubreasts _u>> and nipples,
but you know that this is nothing but purely physiological response of
$i.his <<ubody _u>>.
When you finally stop,
$i.he does nothing but
remains in position over by $i.location until you stand send your <<uadjphys _u>> toy back to $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _u.isHasTrait(setup.trait.training_dominance_advanced) && _maintraining.getTags().includes('trdominance')>>
$i.He eagerly comes over to you, puffing $i.his <<ubreast _u>> out at you.
When you place your <<uhands $unit.player>> on $i.his chests,
she places $i.his <<uhands _u>> on your <<ubreast $unit.player>> in turn,
$i.his tendency towards sexual dominance encouraging $i.his to compete with you in
fondling each other.
You both alternate between taking your <<umouth $unit.player>> to $i.his
<<unipples _u>> and $i.his <<umouth _u>> to yours,
gently nuzzling and nibbling while simultaneously fondling each other all the while.
Both of you continue to passionately lick, nibble, stroke and fondle one other until tiredly,
she slows down.
When you eventually stop, she looks up at you happily.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"That was fun", she says tiredly.
<</if>>
$i.He looks at you with $i.his <<ueyes _u>>, smiling.
<<elseif _u.isHasTrait(setup.trait.training_masochist_advanced) && _maintraining.getTags().includes('trmasochist')>>
$i.He hurriedly comes over to you,
to stand between you and $i.location.
You lean over while $i.he lies down upon it, face up, with $i.his
<<ubreasts _u>> facing upwards to the air.
$i.He gasps as you slap your <<uhands $unit.player>> on $i.his
<<if _u.isHasTrait(setup.trait.breast_titanic)>>
monster tits, bouncing their weighty mass
roughly with all your might before sliding your <<uhands $unit.player>> to
$i.his nipples,
<<elseif _u.isHasTrait(setup.trait.breast_huge)>>
huge tits, bouncing them roughly up and down in your <<uhands $unit.player>>,
while simultaneously flicking $i.his nipples hard
with your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_large)>>
large tits, jiggling them enticingly with your <<uhands $unit.player>>
<<elseif _u.isHasTrait(setup.trait.breast_medium)>>
cute breasts, cupping them and roughly playing with $i.his
<<unipples _u>> between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_tiny)>>
flat breasts, roughly playing with $i.his hard, erect nipples between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.muscle_extremelystrong)>>
monster pecs, feeling its shape and hardness and roughly playing with them before sliding your <<uhands $unit.player>> to play with $i.his nipples,
<<elseif _u.isHasTrait(setup.trait.muscle_verystrong)>>
extremely muscular pecs, feeling its shape and hardness and roughly playing with them before sliding your <<uhands $unit.player>> to $i.his nipples
<<elseif _u.isHasTrait(setup.trait.muscle_strong)>>
muscular pecs, feeling and tracing its contour and roughly playing with them before sliding your <<uhands $unit.player>> to $i.his nipples
<<else>>
flat chests, roughly playing with $i.his hard nipples between your fingers and thumbs,
<</if>>
teasing them and firmly pulling them in all directions.
Moving your <<uhead $unit.player>> close to $i.his <<ubreasts _u>>,
you put your lips on a nipple and close your lips firmly around it to pull strongly on it.
Then you alternate, bite hard with your teeth on the other.
You firmly squeeze the tips of $i.his <<unipples _u>>
with your thumbs and fingers and tweak them in your fingertips,
then you push $i.his nipples with your thumbs,
flicking them hard in different directions.
$i.He moans passionately at the continued punishment of $i.his <<ubreast _u>> and nipples.
Your rough play leaves red marks on $i.his <<ubreasts _u>> and nipples and $i.he
becomes even more aroused.
When you finally stop $i.he rubs the marks on $i.his <<ubreasts _u>> with $i.his <<uarms _u>>,
an ecstatic look on $i.his <<uface _u>>.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"Please punish me more", $i.he says quietly.
<</if>>
$i.He looks at you longingly, hungry for more.
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic) && _u.isHasTrait(setup.trait.per_submissive)>>
$i.He eagerly comes over to you,
to stand between you and $i.location.
You lean over while $i.he submissively
lies down upon it,
face up,
with $i.his <<ubreast _u>> facing upwards to the air.
You place your <<uhands $unit.player>> on $i.his
<<if _u.isHasTrait(setup.trait.breast_titanic)>>
monster tits, bouncing their weighty mass in your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_huge)>>
huge tits, bouncing them up and down in your <<uhands $unit.player>>,
while simultaneously rubbing $i.his nipples with your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_large)>>
large tits, jiggling them enticingly with your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_medium)>>
cute breasts, cupping them and gently playing with $i.his
<<unipples _u>> between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_tiny)>>
flat breasts, gently playing with $i.his hard, erect nipples between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.muscle_extremelystrong)>>
monster pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to play with $i.his nipples,
<<elseif _u.isHasTrait(setup.trait.muscle_verystrong)>>
extremely muscular pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to $i.his nipples
<<elseif _u.isHasTrait(setup.trait.muscle_strong)>>
muscular pecs, feeling and tracing its contour before sliding your <<uhands $unit.player>> to $i.his nipples
<<else>>
flat chests, gently playing with $i.his hard nipples between your fingers and thumbs,
<</if>>
teasing them and pulling them gently towards you.
Moving your <<uhead $unit.player>> close to $i.his <<ubreasts _u>>,
you nuzzle on a nipple with your lips and even lick
it delicately with your tongue.
Then you alternate, gently nibbling with your teeth on the other nipple.
You squeeze the tips of $i.his nipples
with your thumbs and fingers and tweak them in your fingertips,
then you dab $i.his nipples with your thumbs,
flicking them in different directions.
$i.He moans passionately at the continued stimulation of $i.his <<ubreasts _u>>
and nipples.
When you finally stop, $i.he reaches up to your <<uface $unit.player>> with $i.his <<uhand _u>>
and lovingly strokes it, a blissful look on $i.his <<uface _u>>.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"Please don't stop", $i.he says quietly.
<</if>>
$i.He looks at you longingly, eager for more.
<<elseif _friendship >= 500>>
$i.He devotedly comes over to you,
to stand between you and $i.location.
Her doting <<ueyes _u>>
looking in yours.
You place your <<uhands $unit.player>> on $i.his
<<if _u.isHasTrait(setup.trait.breast_titanic)>>
monster tits, bouncing their weighty mass in your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_huge)>>
huge tits, bouncing them up and down in your <<uhands $unit.player>>,
while simultaneously rubbing $i.his nipples with your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_large)>>
large tits, jiggling them enticingly with your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_medium)>>
cute breasts, cupping them and gently playing with $i.his
<<unipples _u>> between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_tiny)>>
flat breasts, gently playing with $i.his hard, erect nipples between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.muscle_extremelystrong)>>
monster pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to play with $i.his nipples,
<<elseif _u.isHasTrait(setup.trait.muscle_verystrong)>>
extremely muscular pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to $i.his nipples
<<elseif _u.isHasTrait(setup.trait.muscle_strong)>>
muscular pecs, feeling and tracing its contour before sliding your <<uhands $unit.player>> to $i.his nipples
<<else>>
flat chests, gently playing with $i.his hard nipples between your fingers and thumbs,
<</if>>
teasing them and pulling them gently towards you.
Moving your <<uhead $unit.player>> close to $i.his <<ubreast _u>>,
you nuzzle on a nipple with your lips and even lick it
delicately with your tongue.
Then you alternate, gently nibbling with your teeth on the
other nipple.
You squeeze the tips of $i.his <<unipples _u>>
with your thumbs and fingers and tweak them in your fingertips,
then you dab $i.his nipples with your thumbs, flicking
them in different directions.
$i.He moans passionately at the continued stimulation
of $i.his <<ubreasts _u>> and nipples.
When you finally stop, $i.he reaches up to your <<uface $unit.player>>
with $i.his <<uhand _u>> and lovingly strokes it, a blissful look on $i.his <<uface _u>>.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
"I love you", $i.he says euphorically.
<</if>>
$i.He looks at you longingly, eager for more.
<<elseif _u.isHasTrait(setup.trait.training_obedience_advanced)>>
$i.He willingly gives $i.himself up to you.
You place your <<uhands $unit.player>> on $i.his
<<if _u.isHasTrait(setup.trait.breast_titanic)>>
monster tits, bouncing their weighty mass in your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_huge)>>
huge tits, bouncing them up and down in your <<uhands $unit.player>>,
while simultaneously rubbing $i.his nipples with your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_large)>>
large tits, jiggling them enticingly with your <<uhands $unit.player>>,
<<elseif _u.isHasTrait(setup.trait.breast_medium)>>
cute breasts, cupping them and gently playing with $i.his
<<unipples _u>> between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.breast_tiny)>>
flat breasts, gently playing with $i.his hard, erect nipples between your fingers and thumbs,
<<elseif _u.isHasTrait(setup.trait.muscle_extremelystrong)>>
monster pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to play with $i.his nipples,
<<elseif _u.isHasTrait(setup.trait.muscle_verystrong)>>
extremely muscular pecs, feeling its shape and hardness before sliding your <<uhands $unit.player>> to $i.his nipples
<<elseif _u.isHasTrait(setup.trait.muscle_strong)>>
muscular pecs, feeling and tracing its contour before sliding your <<uhands $unit.player>> to $i.his nipples
<<else>>
flat chests, gently playing with $i.his hard nipples between your fingers and thumbs,
<</if>>
teasing them and pulling them towards you.
Moving your <<uhead $unit.player>>
close to $i.his <<ubreasts _u>>, you nuzzle on a
nipple with your lips and even lick it delicately with your tongue.
Then you alternate, gently nibbling with your teeth on the other nipple.
You squeeze the tips of $i.his nipples with
your thumbs and fingers and tweak them in your fingertips,
then you dab $i.his nipples with your thumbs,
flicking them in different directions.
You sense considerable uneasiness in the $i.man;
$i.he's doing $i.his duty as a slave by complying with your wishes,
and is probably struggling with the mixture of resistance, obedience
and perhaps even devotion forced to the forefront of $i.his mind
by your <<uhands $unit.player>> on $i.his <<ubreasts _u>>.
$i.He gradually loses $i.himself in the feeling of your gentle <<uhands $unit.player>>.
When you finally stop, $i.he gazes puzzlingly at you.
Even though $i.he has accepted life as a sex slave,
$i.he looks as though $i.he is unsure of what to make of this.
<<if _gagged>>
It looks as if $i.he has something to say, but $i.his gag prevents $i.him from saying it.
<<else>>
He asks hesitantly, "I-is that it?".
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic)>>
$i.He shakes at your touch fearfully.
As you softly place your <<uhands $unit.player>> on $i.his <<ubreast _u>>,
$i.his eagerness to avoid punishment leads $i.him
to stiffen as you start to massage them.
$i.He finally starts to relax as you continue to
massage $i.his <<ubreasts _u>> with your <<uarms $unit.player>>,
playing with $i.his <<unipples _u>> so that they
become hard in between your fingers and thumbs.
You squeeze the tips of $i.his nipples with your
thumbs and fingers and tweak them in your fingertips, then you
dab $i.his nipples with your thumbs,
flicking them in different directions.
<<if _u.isHasTrait(setup.trait.breast_tiny)>>
When you
firmly pull $i.his nipples milk streams out of them and $i.he lets out a gasp.
<</if>>
Her body softens as $i.his eyes dart up to your face,
before visibly catching $i.himself with a reminder that $i.he's a slave and you're $i.his owner.
When you finally stop, $i.he shivers but says nothing,
uneasy at what you are going to do next.
<<elseif _friendship <= -100>>
$i.He is nearly frozen with fear, and does not resist as you start to massage $i.his
<<ubreast _u>>
In fact, $i.he barely reacts at all.
$i.He stares at you, but $i.he remains motionless.
$i.He is so filled with terror that $i.he remains stiff even
as it becomes clear to $i.his you're not going to hurt $i.him.
$i.He trembles as you continue to massage $i.his <<ubreasts _u>>
with your <<uarms $unit.player>>,
playing with $i.his <<unipples _u>> so that they become hard in between your fingers and thumbs.
You squeeze the tips of $i.his nipples with your thumbs and
fingers and tweak them in your fingertips,
then you dab $i.his nipples with your thumbs,
flicking them in different directions.
When you firmly pull $i.his nipples,<<if _u.isHasTrait(setup.trait.breast_tiny)>>
milk streams out of them and<</if>> $i.he gasps audibly,
unable to contain $i.himself at your relentless assault upon $i.his areola.
When you put your mouth on $i.his <<ubreasts _u>>
to nibble on $i.his nipples,
$i.he bites $i.his lip, desperately trying to hide $i.his
arousal at $i.his stimulated nipples.
When you finally stop, $i.he shakes uncontrollably
but says nothing, apprehensive at what you are going to do next.
<<else>>
$i.He tries to refuse you,
so you push $i.him down on $i.location and squeeze $i.his
<<ubreasts _u>> in your <<uarms $unit.player>>.
$i.He tries to push you off $i.his <<ubreasts _u>>.
but you continue to massage them,
playing with $i.his <<unipples _u>> so that they become hard in between your
fingers and thumbs.
You squeeze the tips of $i.his nipples with your thumbs and
fingers and tweak them in your fingertips, then you dab $i.his
nipples with your thumbs, flicking them in different directions. When you firmly pull
$i.his nipples,<<if _u.isHasTrait(setup.trait.breast_tiny)>>
milk streams out of them and<</if>>
$i.he gasps audibly, unable to contain $i.himself at
your relentless assault upon $i.his areola.
When you put your mouth on $i.his <<ubreasts _u>> to nibble on $i.his nipples,
$i.he bites $i.his lip, desperately trying to hide $i.his arousal at
$i.his stimulated nipples. When you finally stop,
$i.he shakes uncontrollably, apprehensive at what you are going to do next.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fondle_breasts',
'Fondle dick',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFondleDick',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qs.trait_dick,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<set _hasbreasts = $unit.player.isHasBreasts()>>
<<pronounload $i _u>>
<<set _maintraining = setup.UnitTitle.getMainTraining(_u)>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<set _umouthequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.mouth)>>
<<set _friendship = $friendship.getFriendship(_u, $unit.player)>>
<<set _mindbroken = _u.isMindbroken()>>
<<set _advanced = _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _basic = _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
<<set _notrain = _u.isHasTrait(setup.trait.training_none)>>
<<set _uballs = _u.isHasBalls()>>
<<loadinteractioncommon _u>>
<<if _chastity>>
Remove <<= $u.getName()>>'s chastity if you want to fondle $i.his dick.
<<else>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
so you can fondle $i.his <<udickall _u>><<if _uballs>> and <<uballs _u>><</if>>.
<<ustripdick _u>>
<<set _udickequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.genital)>>
<<if _mindbroken>>
Like a toy,
$i.he dumbly remains still,
watching your <<uhands $unit.player>> move towards $i.his <<ubody _u>> without any real interest.
You gently trace your fingers along $i.his <<udick _u>>
before taking it gently in one <<uhand $unit.player>> and tenderly stroking your <<uhand $unit.player>> along its shaft
<<if _uballs>>
, while simultaneously cupping $i.hirs <<uballs _u>>
<</if>>.
You firmly wrap your fingers,
thumb and palm around $i.his dick,
rhythmically stroking along with both <<uhands $unit.player>>,
starting slow but gradually increasing the speed of your movements.
You occasionally squeeze the tip and head of
$i.his dick between your fingers and thumb.
$i.His prick stiffens like a rod
in your <<uhands $unit.player>> and you continue your expert strokes
along the erect shaft but,
except for the cockmilk leaking out of
$i.his dick, $i.he does not respond.
Since $i.he is mindbroken,
$i.his responses to you are purely physiological and your actions
have no affect on $i.him mentally.
You place your <<uadjphys _u>> toy back to $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic) && _u.isHasTrait(setup.trait.per_submissive)>>
$i.He comes submissively over,
smiling a little submissive smile,
and points $i.his dick towards you.
You gently trace your fingers along $i.his <<udick _u>>
before taking it gently in one <<uhand $unit.player>> and tenderly stroking your <<uhand $unit.player>> along its shaft
<<if _uballs>>
, while simultaneously cupping $i.his <<uballs _u>>
<</if>>.
You firmly wrap your fingers, thumb and palm around $i.his dick,
rhythmically stroking along with both <<uhands $unit.player>>, starting slow
but gradually increasing the speed of your movements.
You occasionally squeeze the tip and head of $i.his
dick between your fingers and thumb.
$i.His prick stiffens like a rod in your <<uhands $unit.player>>
and you continue your expert strokes along the erect shaft.
Soon, $i.his movements indicate that $i.he is orgasming.
$i.He shudders and leaks $i.him cockmilk as $i.he orgasms in your <<uhands $unit.player>>.
You made $i.him lick $i.his own cum clean from your <<uhand $unit.player>> before you send your
<<uadjphys _u>> slave back to $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _u.isHasTrait(setup.trait.training_masochist_advanced) && _maintraining.getTags().includes('trmasochist')>>
$i.He hurriedly comes over to you, to stand between you and $i.location.
You lean over while $i.he lies down upon it,
face up, with $i.his dick pointed towards you. $i.He gasps when you slap $i.his <<udick _u>>
with your <<uhand $unit.player>>.
You firmly grab it and tightly squeeze it
with your fingers, stroking your <<uhand $unit.player>> along its
<<if _uballs>>
shaft,
while simultaneously slapping $i.his <<uballs _u>>
with your other <<uhand $unit.player>>.
You pulled $i.his balls uncomfortably from its resting position, earning
you an ecstatic moan from your masochistic slave.
<<else>>
shaft.
<</if>>
You firmly wrap your fingers,
thumb and palm around $i.his dick,
roughly stroking along with both <<uhands $unit.player>>,
starting slow but gradually increasing the speed of your movements.
You occasionally slap and swat $i.his dick, as well as
squeezing and pinching the tip and head of
$i.his dick between your fingers and thumb.
$i.His prick stiffens like a rod in your <<uhands $unit.player>>
and you continue your expert manhandling of the erect shaft.
Your rough play leaves red marks on $i.his <<ubreasts _u>>
and nipples and $i.he becomes even more aroused.
Soon, $i.his movements indicate that $i.he is orgasming.
$i.He shudders and leaks $i.his cockmilk as $i.he orgasms
in your <<uhands $unit.player>>.
You made $i.him lick $i.his own cum clean from your <<uhand $unit.player>> before you send your
<<uadjphys _u>> slave back to $i.his
resting place, the $i.slavebed in the $i.room.
$i.He rubs the marks on $i.his dick and balls with $i.his <<uhands _u>>,
an ecstatic look on $i.his <<uface _u>>.
$i.He looks at you longingly, hungry for more.
<<elseif _notrain>>
$i.He clearly dislikes the thought of getting $i.his dick fondled by you.
$i.His lower lip quivers with trepidation as
$i.he watches your <<uhands $unit.player>> move towards $i.him.
$i.He has no choice but to obey if $i.he wants to avoid punishment.
$i.He gasps and shakes as you gently trace along $i.his <<udick _u>>
before taking it gently in one <<uhand $unit.player>> and tenderly stroking your <<uhand $unit.player>> along its
<<if _uballs>>
shaft, while simultaneously cupping $i.his <<uballs _u>>.
<<else>>
shaft.
<</if>>
You firmly wrap your fingers,
thumb and palm around $i.his dick,
rhythmically stroking along with both <<uhands $unit.player>>,
starting slow but gradually increasing the speed of your movements.
You occasionally squeeze the tip and head of $i.his
dick between your fingers and thumb.
$i.His prick stiffens like a rod in your <<uhand $unit.player>> and you
continue your expert strokes along the erect shaft.
$i.He grabs your wrist with $i.his <<uhands _u>>
and tries to stop it from moving but is unable
to and despite $i.his resistant pulling against you.
$i.He bites $i.his lip but $i.he cannot help but moan.
Soon $i.he shudders and leaks $i.his cockmilk as $i.he orgasms in your <<uhands $unit.player>>.
$i.He looks at you shamefully as you stop moving your <<uhands $unit.player>> and send your
<<uadjphys _u>> slave back to $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _basic>>
$i.He obeys silently,
standing in front of you as you move your <<uhands $unit.player>> towards $i.him.
You gently trace your fingers along $i.his <<udick _u>>
before taking it gently in one <<uhand $unit.player>> and tenderly stroking your <<uhand $unit.player>> along its
<<if _uballs>>
shaft, while simultaneously cupping $i.his <<uballs _u>>.
<<else>>
shaft.
<</if>>
You firmly wrap your fingers, thumb and palm around $i.his dick,
rhythmically stroking along with both <<uhands $unit.player>>, starting
slow but gradually increasing the speed of your movements.
You occasionally squeeze the tip and head of $i.his
dick between your fingers and thumb.
$i.His prick stiffens like a rod in your <<uhands $unit.player>>
and you continue your expert strokes along the erect shaft.
$i.He looks into your eyes furtively while $i.he grabs
your wrists with $i.his <<uhands _u>>, moving to match your <<uhand $unit.player>> movements.
$i.He moans and shudders, leaking $i.his cockmilk as
$i.he orgasms in your <<uhands $unit.player>>.
You made $i.him lick $i.his own cum clean from your <<uhand $unit.player>>.
$i.He dutifully looks at you as you stop moving your <<uhands $unit.player>> and send you
<<uadjphys _u>> slave back to $i.his
resting place, the $i.slavebed in the $i.room.
<<else>>
$i.He devotedly comes over and gives you an impassioned kiss.
$i.He smiles and points $i.his dick towards you.
You gently trace your fingers along $i.his <<udick _u>>
before taking it gently in one <<uhand $unit.player>> and tenderly stroking your <<uhand $unit.player>> along its
<<if _uballs>>
shaft, while simultaneously cupping $i.his <<uballs _u>>.
<<else>>
shaft.
<</if>>
You firmly wrap your fingers, thumb and palm around
$i.his dick,
rhythmically stroking along with both <<uhands $unit.player>>,
starting slow but gradually increasing the speed of your movements.
You occasionally squeeze the tip and head of $i.his
dick between your fingers and thumb.
$i.His prick stiffens like a rod in your <<uhands $unit.player>> and you
continue your expert strokes along the erect shaft.
$i.He begs you not to stop. Soon, $i.he moans and $i.his
movements indicate that $i.he is about to orgasm.
$i.He shudders and leaks $i.his cockmilk as $i.he orgasms in your <<uhands $unit.player>>.
$i.He eagerly licks $i.his own cum clean from your <<uhand $unit.player>>.
$i.He looks at you passionately as you stop moving your <<uhands $unit.player>> send your
<<uadjphys _u>> slave back to $i.his
resting place, the $i.slavebed in the $i.room.
<</if>>
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fondle_vagina',
'Fondle vagina',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFondleVagina',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qs.trait_vagina,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<pronounload $i _u>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
so you can fondle $i.his <<uvaginaall _u>>.
<<ustripvagina _u>>
<<if _u.isMindbroken()>>
Like a doll,
$i.he dumbly remains still,
watching your <<uhands $unit.player>> move towards $i.him without any real interest.
You gently trace along $i.his labia
with your outstretched fingers, strumming up and down the edges of $i.his pussylips,
then softly rub your fingers along the inner walls with a tender touch,
starting slow but gradually increasing the speed of your movements.
You occasionally flick $i.his clit
and rub it with your fingertips as your <<uhand $unit.player>> nears it.
Except for the pussy juices trickling down $i.his <<ulegs _u>>,
$i.he does not respond.
Since $i.he is mindbroken,
$i.his responses to you are purely physiological and your actions have no affect on $i.his mentally.
You leave your <<uadjphys _u>> toy back in $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic) && _u.isHasTrait(setup.trait.per_submissive)>>
$i.He comes submissively over,
smiling a little submissive smile,
and points $i.his pussy towards you.
You gently trace along $i.his labia
with your outstretched fingers,
strumming up and down the edges of $i.his pussylips,
then softly rub your fingers along the inner walls with a tender touch,
starting slow but gradually increasing the speed of your movements.
You occasionally flick $i.his clit
and rub it with your fingertips as your <<uhand $unit.player>> nears it.
$i.He begs you not to stop as $i.he looks into your <<ueyes $unit.player>>
expectantly as $i.he shudders in an orgasm.
<<elseif _u.isHasTrait(setup.trait.training_none)>>
$i.He tries to refuse,
so you push the disobedient slave down over the
$i.bed
as you move your <<uhands $unit.player>> towards $i.him.
You gently trace along $i.his labia
with your outstretched fingers, strumming up and down the edges of $i.his pussylips,
then softly rub your fingers along the inner walls with a tender touch,
starting slow but gradually increasing the speed of your movements.
$i.He grabs your wrist to try to stop you but $i.he is unable to.
You occasionally flick $i.his clit
and rub it with your fingertips as your <<uhand $unit.player>> nears it,
despite $i.his resistant pulling against you.
$i.He bites $i.his lip but $i.he cannot help but moan
and $i.he shudders in an orgasm. $i.He looks at you shamefully as you stop moving your <<uhand $unit.player>>.
<<elseif _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
$i.He obeys silently, standing in front of you as you move your <<uhands $unit.player>> towards $i.him.
You gently trace along $i.his labia
with your outstretched fingers,
strumming up and down the edges of $i.his pussylips,
then softly rub your fingers along the inner walls with a tender touch,
starting slow but gradually increasing the speed of your movements.
You occasionally flick $i.his clit
and rub it with your fingertips as your <<uhand $unit.player>> nears it.
$i.He looks into your eyes furtively while $i.he grabs your wrist
with $i.his <<uhand _u>> and $i.he squeezes $i.his <<ulegs _u>> togetther as $i.he moans
and shudders in an orgasm. $i.He dutifully looks at you as you stop moving your <<uhand $unit.player>>.
<<else>>
$i.He devotedly comes over and gives you an impassioned kiss.
$i.He smiles and points $i.his pussy towards you.
You gently trace along $i.his labia
with your outstretched fingers, strumming up and down the edges of $i.his pussylips,
then softly rub your fingers along the inner walls with a tender touch,
starting slow but gradually increasing the speed of your movements.
You occasionally flick $i.his clit
and rub it with your fingertips as your <<uhand $unit.player>> nears it.
$i.He squeezes $i.his <<ulegs _u>> lightly against your <<uhand $unit.player>> as
$i.he moans and shudders in orgasmic bliss.
$i.He looks at you passionately as you stop moving your <<uhand $unit.player>>.
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fuck_anus',
'Fuck ass',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFuckAnus',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<pronounload $i _u>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
over so you can fuck $i.his <<uanusall _u>>.
<<ustripanus _u>>
<<if setup.UnitTitle.getMainTraining(_u).getTags().includes('pony') ||
setup.UnitTitle.getMainTraining(_u).getTags().includes('pet')>>
$i.His training dictates that $i.he must crawl along on all fours, which makes $i.his anus readily available.
<</if>>
<<if _u.isMindbroken()>>
You instruct $i.him to present $i.his anus.
$i.He dully kneels and spreads $i.his buttocks<<if !_hasdick>>as you don a strap-on<</if>>.
You spit on $i.his hole and ram <<if !_hasdick>>it<<else>>your <<udick $unit.player>><</if>>
up $i.his butt.
$i.His butthole spasms as you assrape $i.him,
<<if !_hasdick>>an amusing sight<<else>>squeezing your dick nicely<</if>>.
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
Automatic responses give $i.him an erection,
which $i.his chastity makes so uncomfortable that $i.he spasms.
This cycle continues repeatedly, $i.his rectum squeezing unconsciously each time.
<<else>>
Despite $i.his mental deficiency,
the prostate stimulation gives $i.him an erection anyway.
<</if>>
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_none)>>
You instruct $i.him to present $i.him anus<<if !_hasdick>> as you don a strap-on<</if>>.
Horrified, $i.he tries to back away, but you catch
$i.him and throw $i.him on $i.location.
$i.He tries to shield $i.his asshole,
but you pin $i.his <<uarms _u>> behind
$i.him with one <<uhand $unit.player>>,
spit on $i.his hole,
and ram your <<if !_hasdick>>fake dick<<else>><<udick $unit.player>><</if>>
up $i.his butt with the other <<uhand $unit.player>>.
$i.His butthole spasms as you assrape $i.him,
<<if !_hasdick>>an amusing sight<<else>>squeezing your dick nicely<</if>>.
<<if _u.isHasDick()>>
Despite $i.his unwillingness to be sodomized, the prostate stimulation
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
starts to give $i.him an erection,
which $i.his dick chastity makes horribly uncomfortable.
$i.He bucks with the pain,
$i.his asshole spasming delightfully.
<<else>>
gives $i.him an erection.
$i.He's mortified that $i.he would get hard while being anally raped.
<</if>>
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_anal_basic) || _u.isHasTrait(setup.trait.training_obedience_advanced)>>
$i.He kneels on the couch
with $i.his butt facing you, back strongly arched to angle $i.his rectum for
more comfortable anal coupling
<<if !_hasdick>>; you don a strap-on and rub a little lubricant into $i.his rear<</if>>.
You take your time and fuck $i.his butthole for a good long while.
<<if _u.isHasTraitExact(setup.trait.anus_tight)>>
$i.His ass is so tight that $i.he has to concentrate on relaxing for you.
<<elseif _u.isHasTraitExact(setup.trait.anus_loose)>>
$i.His experienced ass feels great.
<<else>>
$i.His asspussy is so loose you can pound it as hard as you like.
<</if>>
$i.He moans as $i.he rubs $i.his <<ubody _u>> and his
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
caged dick, and brings $i.himself to orgasm before you.
<<set _orgasmed = true>>
<<else>>
hardon, which prevents $i.him from reaching orgasm before you.
<<set _orgasmed = false>>
<</if>>
<<else>>
clit, and brings $i.himself to orgasm before you.
<<set _orgasmed = true>>
<</if>>
<<if !_hasdick>>
The sight of $i.him gasping and shaking $i.his way through
<<if _orgasmed>>
an anal orgasm
<<else>>
what would normally be an orgasm without the chastity device,
<</if>>
brings you to climax yourself,
and you shove yourself against $i.his <<ubody _u>>
with enough force to give the slave's sensitized hole a final brutal stretching.
<<else>>
$i.His orgasmic rectal spasms squeeze your cock and you blow your load inside $i.his ass.
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic) && !_u.isHasVagina() && _u.isHasTraitExact(setup.trait.anus_tight)>>
You instruct $i.him to present $i.him anus<<if !_hasdick>> as you don a strap-on<</if>>.
$i.He knows a male slave takes it up the butt,
and lies on the couch next to your desk with $i.his <<ulegs _u>> in the air,
spreading $i.his buttocks with $i.his <<uarms _u>>.
You take your time and fuck $i.his butthole for a good long while
<<if _u.isHasDick() && !_u.isHasTrait(setup.trait.eq_chastity)>>
as $i.his erect <<udick _u>> waves in the air.
This gives you enough time to stroke $i.him until
$i.he gets aroused despite $i.his discomfort with anal.
$i.He doesn't orgasm, but $i.he's getting accustomed to $i.his asshole being used as a sexual organ.
<</if>>
<<else>>
You instruct $i.him to present $i.him anus<<if !_hasdick>> as you don a strap-on<</if>>.
$i.He hesitates but eventually lies on $i.location with $i.his <<ulegs _u>>
in the air, spreading $i.his buttocks with $i.him <<uarms _u>>.
You take your time and fuck $i.his butthole for a good long while.
<<if _u.isHasTraitExact(setup.trait.anus_tight)>>
$i.His ass is so tight that $i.he winces with anal pain
<<elseif _u.isHasTraitExact(setup.trait.anus_loose)>>
$i.His experienced ass takes your <<if !_hasdick>>fake dick<<else>>cock<</if>> without trouble
<<else>>
$i.His asspussy is so loose you can pound it as hard as you like
<</if>>
<<if _u.isHasDick()>>
as $i.his erect dick waves in the air.
<<else>>
as it substitutes for $i.his pussy.
<</if>>
$i.He gets aroused despite $i.his discomfort with anal, though $i.he doesn't orgasm.
<</if>>
<<if _hasdick>>
<<if _u.isHasTraitExact(setup.trait.anus_gape)>>
Your cum falls out of $i.his gaping hole.
<<elseif _u.isHasTraitExact(setup.trait.anus_loose)>>
Cum flows out of $i.his gaped butthole.
<<else>>
$i.His still-tight ass keeps your load inside $i.him.
<</if>>
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fuck_butt',
'Fuck both holes',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFuckButt',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qs.trait_vagina,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<pronounload $i _u>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
so you can use
<<if _u.isHasVagina()>>
$i.his holes.
<<else>>
$i.his <<uanusall _u>>.
<</if>>
<<ustripanus _u>>
<<ustripvagina _u>>
<<if _u.isMindbroken()>>
Since $i.his mind is gone,
$i.his <<ubody _u>> is all yours to use as a <<racelow _u>> sex doll.
You throw $i.him over the couch and amuse yourself with
$i.him for a while;
$i.his <<ubody _u>> retains its instinctual responses, at least.
You finish inside $i.his <<uanus _u>> and brought your toy back to $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _u.isHasTrait(setup.trait.training_obedience_advanced)>>
$i.He kneels on the floor
so you can take $i.him at will<<if !$unit.player.isHasDick()>>, and don a strap-on<</if>>.
You finger $i.his <<uanus _u>> while
<<if _u.isHasVagina()>>
fucking $i.his pussy
<<else>>
frotting $i.him
<</if>>
for a bit and then switch to $i.his now-ready anus.
<<if _u.isHasTraitExact(setup.trait.anus_tight)>>
$i.His ass is so tight that you have to work yourself in.
<<elseif _u.isHasTraitExact(setup.trait.anus_loose)>>
Your <<if $unit.player.isHasDick()>><<udick $unit.player>><<else>>fake cock<</if>> slides easily up $i.his ass.
<<else>>
You slide into $i.his already-gaping asspussy with ease.
<</if>>
You fuck $i.him there for a while before repeatedly
pulling out and stuffing yourself back in.
$i.He moans each time you fill a waiting hole.
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
Whenever $i.he starts to get hard,
$i.his dick chastity gives $i.him an awful twinge of pain.
You do your best to be up $i.his butt when this happens so you can
experience the resulting spasm.
<<else>>
Every time you penetrate, $i.his erect <<udick _u>>
jerks up and slaps $i.his stomach.
<</if>>
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_obedience_basic)>>
You throw $i.him across the back of $i.location with $i.his <<uanus _u>>
in the air<<if !$unit.player.isHasDick()>>, and don a strap-on<</if>>.
You finger $i.his <<uanus _u>>
while
<<if _u.isHasVagina()>>fucking $i.his pussy<<else>>frotting $i.his thighs<</if>>
for a bit and then switch to $i.his now-ready anus.
<<if _u.isHasTraitExact(setup.trait.anus_tight)>>
$i.His ass is so tight that you have to work yourself in.
<<elseif _u.isHasTraitExact(setup.trait.anus_loose)>>
Your <<if $unit.player.isHasDick()>><<udick $unit.player>><<else>>fake cock<</if>> slides easily up $i.his ass.
<<else>>
You slide into $i.his already-gaping asspussy with ease.
<</if>>
$i.He gasps as you penetrate $i.his rectum,
but you timed the switch so that $i.he was on the verge of orgasm,
and $i.he comes immediately.
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
$i.He managed to stay soft within $i.his dick chastity,
but $i.he dribbled a lot of precum onto the
$i.bed.
You make $i.him lick it up, and $i.he obeys, shuddering with unsatisfied arousal.
<<else>>
$i.His <<udick _u>> spatters the $i.bed with cum, and you make $i.him lick it all up.
<</if>>
<</if>>
<<else>>
<<if !$unit.player.isHasDick()>>
You don a cruelly large strap-on, and you do it so $i.he can see it.
<</if>>
$i.He tries to refuse you, so you throw $i.him across the back of $i.location with
$i.his <<racelow _u>> ass in the air.
You finger $i.his <<uanus _u>>
<<if _u.isHasVagina()>>
while fucking $i.his pussy
<<else>>
while frotting $i.his thighs
<</if>>
for a bit and then switch to $i.his now-ready anus.
$i.He sobs as you penetrate $i.his rectum.
<<if _u.isHasDick()>>
Despite $i.his unwillingness to be sodomized, the prostate stimulation
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
starts to give $i.him an erection,
which $i.his dick chastity makes horribly uncomfortable.
$i.He bucks with the pain, $i.his asshole spasming delightfully.
<<else>>
gives $i.him an erection. $i.He's mortified that $i.he would get hard while being anally raped.
<</if>>
<</if>>
<</if>>
<<if $unit.player.isHasDick()>>
<<if _u.isHasTraitExact(setup.trait.anus_gape)>>
$i.His gaping hole drips your cum right out again.
<<elseif _u.isHasTraitExact(setup.trait.anus_loose)>>
Cum drips out of $i.him loose hole.
<<else>>
$i.His still-tight ass keeps your load inside $i.him.
<</if>>
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fuck_lips',
'Fuck mouth',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFuckLips',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<pronounload $i _u>>
<<set _maintraining = setup.UnitTitle.getMainTraining(_u)>>
<<set _chastity = _u.isHasTrait(setup.trait.eq_chastity)>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over so $i.he can
<<if _hasdick>>
blow you with $i.his
<<else>>
please your pussy with $i.his
<</if>>
<<umouthall _u>>.
<<ustripmouth _u>>
<<set _umouthequip = setup.Text.Unit.Equipment.getEquipmentAt(_u, setup.equipmentslot.mouth)>>
<<if _u.isMindbroken()>>
As $i.he is mindbroken, $i.he does not respond to your command to approach you.
<<if _hasdick>>
You had no choice but to grab $i.him
and push $i.him down to $i.his knees with $i.his <<uhead _u>>
against $i.location so you can give $i.him a good hard throat fuck.
You cum down $i.his throat but $i.his mental psyche remains unchanged.
You put your toy back in $i.his
resting place, the $i.slavebed in the $i.room.
<<else>>
You had no choice but to grab $i.him
and throw $i.him onto $i.location face up,
and then kneel on $i.him with your <<ulegs $unit.player>> on either side of
$i.his crying <<ubody _u>>,
so your pussylips are hard against $i.his mouth.
$i.He mechanically eats you out, more out of breathing reflex than eagerness.
You grind down, taking pleasure from your <<uadjphys _u>> toy.
<</if>>
<<elseif _hasdick && _u.isHasTrait(setup.trait.training_oral_advanced) && _maintraining.getTags().includes('troral')>>
$i.He comes over eagerly, with hunger in $i.his <<ueyes _u>>.
$i.He gets to $i.his knees,
hurriedly takes you into $i.his <<umouth _u>>,
and gives the blowjob $i.his all.
As a <<titlelow _u>>,
$i.he's almost desperate to get your cum into $i.his <<umouth _u>> and
<<if _chastity>>
(since $i.his cock is off limits)
frantically rubs $i.his <<unipples _u>>
and asspussy
<<else>>
jacks $i.himself off
<</if>>
in anticipation.
<<if $unit.player.isHasVagina()>>
You have more than one variety of deliciousness for $i.him,
and $i.he's careful not to neglect your wet cunt.
<</if>>
<<if _u.isHasDick() && !_chastity>>
When you finish,
$i.he sits back with an ecstatic look on $i.his
<<uface _u>>
and lets your cum rest in $i.his mouth as $i.he climaxes into $i.his
<<uarms _u>>.
$i.He pours $i.his own cum from $i.his <<uhand _u>>
into $i.his mouth so it can mingle with yours.
<<else>>
When you finish, $i.he sits back with an ecstatic look on $i.his face and lets your cum rest in $i.his mouth as $i.he climaxes.
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_none)>>
$i.He tries to back away, so you
<<if _hasdick>>
<<if _umouthequip && (_umouthequip.getTags().includes('ringgag') || _umouthequip.getTags().includes('dildogag'))>>
grab $i.him; $i.his <<umouth _u>> is already held invitingly open by
$i.his gag,
and $i.he's prevented from biting.
<<else>>
grab $i.him and force a ring gag into $i.his <<umouth _u>>.
Once you have the straps secured behind $i.his head,
$i.he's prevented from biting.
<</if>>
You push $i.him down to $i.his knees with $i.his <<uhead _u>>
against $i.location so you can give $i.him a good hard throat fuck.
When you cum down $i.his throat $i.he retches through $i.his tears.
<<if _hasvagina>>
$i.He has a mere moment
to get $i.his breath back
before you press your pussy against $i.his unwilling mouth.
<</if>>
<<else>>
seize $i.him and throw $i.him onto $i.location face up,
and then kneel on $i.him with your <<ulegs $unit.player>> on either side of
$i.his crying <<ubody _u>>,
so your pussylips are hard against $i.his mouth.
$i.He desperately eats you out, trying to get you off as fast as possible so
$i.he can get a bit more air,
but you grind down without mercy, taking your pleasure.
<</if>>
<<elseif _u.isHasTraitExact(setup.trait.training_obedience_basic)>>
$i.He comes over reluctantly and begins to
<<if _hasdick>>
give you a blowjob.
Deciding that $i.he isn't showing the necessary enthusiasm,
you hold $i.his <<uhead _u>>
and fuck $i.his <<uface _u>> instead
<<if _hasvagina>>, occasionally jerking your dick free to shove your pussy against $i.his face instead
<</if>>.
$i.He does $i.his best to follow your motions but
still splutters and gags.
You pull free to cum across $i.his face.
<<else>>
eat you out.
Deciding that $i.he isn't showing the necessary enthusiasm,
you hold $i.his head and grind your pussy against $i.his
<<uface _u>> instead.
$i.He does $i.his best to follow your motions but still splutters
and gasps for air.
You climax quickly and haul $i.him to $i.his feet,
kissing the bewildered $i.boy full on the mouth.
You can taste yourself on $i.his lips.
<</if>>
<<else>>
$i.He licks $i.his lips and looks you in the eyes as
$i.he gets to $i.his knees. $i.He
<<if _hasdick>>
gives you a long, deep blowjob.
$i.He massages your balls<<if _hasvagina>> and pussy<</if>>
with one <<uhand _u>> and
$i.his <<ubreast _u>> with the other, giving you a show.
$i.He sucks your head until you
<<set _cumchoose = random(1, 3)>>
<<if _cumchoose == 1>>
climax,
letting your cock pop free of $i.his <<umouth _u>> to shoot pearly
cum all across $i.his <<uface _u>>.
You order $i.him to lick clean all your cum off his face and the $i.floor.
<<elseif _cumchoose == 2>>
climax deep inside $i.his <<umouth _u>>, gushing all the cum directly down
$i.his throat and into $i.his stomach.
<<else>>
climax inside $i.his <<umouth _u>>. $i.He obediently swallows all your cum.
<</if>>
<<else>>
eats you out like $i.he's starving,
moaning into your pussy to show off
$i.his arousal and add to your pleasure.
$i.He massages your perineum with one <<uhand _u>> and
$i.his <<ubreast _u>>
with the other, giving you a show.
$i.He slowly concentrates more and more attention on your
clit until you climax convulsively.
You pull $i.him to $i.his feet,
kissing the compliant $i.boy full on the mouth.
You can taste yourself on $i.his lips.
<</if>>
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_fuck_relation',
'Incestuous fuck',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFuckRelation',
[], /* Cost */
[ /* Requirements */
],
[
setup.qs.job_slave,
setup.qres.HasFamilyWithJob(setup.job.slave),
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set _slavelist = $company.player.getUnits({job: setup.job.slave, not_injured: true, home: true, usable_by_you: true})>>
<<set _slavelist = $family.getFamilyList($g.target).filter(a => _slavelist.includes(a.unit))>>
<<if _slavelist.length>>
Use <<rep $g.target>> with:
<div id='divholder'>
<<for _islave, _slave range _slavelist>>
<<capture _slave>>
<<utheirrel $g.target _slave.unit>>
<<rep _slave.unit>>
<<link '(use)'>>
<<replace '#divholder'>>
<<set _victim = _slave.unit>>
<<include 'InteractionFuckRelationDo'>>
<</replace>>
<</link>>
<br/>
<</capture>>
<</for>>
</div>
<<else>>
There are no available enslaved family member of <<rep $g.target>> to use with.
<</if>><<set $i1 = {}>>
<<set $i2 = {}>>
<<set $i = {}>>
<<set _u = $g.target>>
<<set _v = _victim>>
<<set _hasdick = $unit.player.isHasDick()>>
<<set _hasvagina = $unit.player.isHasVagina()>>
<<pronounload $i1 _u>>
<<pronounload $i2 _victim>>
<<set _chastity = _victim.isHasTrait(setup.trait.eq_chastity)>>
<<set _umouthequip = setup.Text.Unit.Equipment.getEquipmentAt(_victim, setup.equipmentslot.mouth)>>
<<set _gagged = _victim.isHasTrait(setup.trait.eq_gagged)>>
<<set _uadvanced = _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _vadvanced = _v.isHasTrait(setup.trait.training_obedience_advanced)>>
<<set _ubasic = _u.isHasTrait(setup.trait.training_obedience_basic)>>
<<set _vbasic = _victim.isHasTrait(setup.trait.training_obedience_basic)>>
<<set _udick = _u.isHasDick()>>
<<set _vdick = _victim.isHasDick()>>
<<set _us = $family.getRelation(_victim, _u)>>
<<set _vs = $family.getRelation(_u, _v)>>
<<loadinteractioncommon _u>>
You descend down to your $i.locgeneral and grabbed two of your slaves
<<= _u.getName()>> and <<= _victim.getName()>>.
<<if _ubasic && _vbasic && _udick && _vdick && _hasdick>>
There are three stiff pricks available.
You order <<= _u.getName()>> to bottom.
<<They _u>> lies on the $i.floor, spreads <<their _u>>
buttocks,
relaxes <<their _u>> <<uanus _u>>,
and then begs <<their _u>> <<rep _us>>
to buttfuck <<them _u>>.
<<= _v.getName()>> does,
slipping <<their _v>> <<udick _v>> into
<<their _v>> <<rep _vs>> ass.
<<They _v>> then stops and waits for you to buttfuck
<<them _v>> in turn.
It isn't a particularly convenient way to fuck,
but it's got the virtue of being uncommon.
<<= _v.getName()>>, both fucking and getting fucked,
comes in <<their _v>> <<rep _vs>>'s rectum first.
They switch places so <<= _u.getName()>> can have a turn in the middle,
leaving you to finish into <<= _u.getName()>>'s already cum-soaked hole.
<<elseif _ubasic && !_vbasic>>
<<= _u.getName()>> is a lot more ready and willing for this than
<<their _u>> <<rep _us>>
<<= _v.getName()>>, so
<<if !_hasdick>>while getting into a strap-on,<</if>>
you sit <<them _u>> on the $i.location and make
<<= _v.getName()>> sit on <<their _v>> lap, facing <<them _u>>.
In this position,
<<= _u.getName()>> can reach around and spread
<<their _u>> <<rep _us>>'s buttocks for her, controlling
<<them _v>> all the while in case <<they _v>> has hesitations about this.
<<= _v.getName()>> knows that <<they _v>>'s trapped,
and lets <<their _v>> <<rep _vs>> hold <<their _v>> ass wide so you can use <<them _v>>.
They're face to face, and it's not hard to tell that
<<= _v.getName()>> is glaring daggers at <<= _u.getName()>>.
You reward <<= _u.getName()>> for her obedience and punish
<<= _v.getName()>> for her resistance by forcing <<them _v>>
to suck <<= _u.getName()>> off while you finish using <<= _v.getName()>>.
<<elseif _vbasic && !_ubasic>>
<<set _victim = _u>>
<<set _u = _v>>
<<include 'InteractionFuckRelationDo'>>
<<elseif _uadvanced && _vadvanced && _us.getTags().includes('twin')>>
<<= _u.getName()>> and <<= _v.getName()>>
are such devoted sex slaves that they've long since lost
any hesitations about their partnership, and generally approach
sex as though their bodies were interchangeable.
(This means that they almost never masturbate, for one thing,
preferring to have sex with each other, instead.)
Caressing and manhandling each other,
they eagerly kneel before your chair and give you
simultaneous oral sex,
making an effort to play with their symmetry.
They kiss around your <<if !_hasdick>>pussy<<else>>cock,
making a complete seal around you with their lips<</if>>,
one on each side.
Then they jump up on your desk and press their
<<if _udick && _vdick>>
cocks
<<elseif _udick || _vdick>>
cock and pussy
<<else>>pussies
<</if>>
against one another<<if !_hasdick>> while you don a strap-on<</if>>,
spreading their legs to offer you everything. You switch
back and forth, with the twin you're not in rubbing and grinding against their sister,
until both of <<= _u.getName()>> and <<= _v.getName()>> are lying on the desk<<if _hasdick>>
with cum dripping out of them<</if>>,
making out tiredly.
<<elseif _ubasic && _vbasic && _us.getTags().includes('sibling')>>
You call <<= _u.getName()>>'s
<<rep _us>> <<= _v.getName()>> in for some incestuous fun,
but see no reason to wait for <<them _v>>.
When <<they _v>> arrives, it's to the sight of
<<= _u.getName()>> sitting on the $i.bed with <<their _u>> legs spread with you
<<uadv $unit.player>>
<<if _u.isHasVagina()>>
fucking <<their _u>> pussy<<else>>using <<their _u>> asshole<</if>>
<<if !_hasdick>>with a strap-on<</if>>.
You pull out and order <<= _v.getName()>> to orally service <<their _v>> <<rep _vs>>.
<<They _v>> gets down before the spreadeagled slave <<girl _u>> to get to work.
After watching <<= _u.getName()>> enjoy the attention for a while, you move
behind the busy <<= _v.getName()>> and pull <<them _v>> into a good position
so you can fuck <<them _v>> while <<they _v>> sucks.
After a few thrusts, <<= _u.getName()>>'s <<ueyes _u>> roll back.
<<They _u>> gestures that it feels really good when you make <<their _u>> <<rep _us>> moan into <<them _u>>.
<<elseif _uadvanced && _vbasic>>
<<= _u.getName()>> is enthusiastic when <<they _u>> hears you order
<<= _v.getName()>> to come over. <<Their _u>> total immersion in sexual slavery has
clearly uncovered a willingness to get very close to <<their _u>> <<rep _us>>.
You<<if !_hasdick>> don a strap-on,<</if>> lie on the $i.floor and
instruct <<= _v.getName()>> to ride you. <<They _v>> complies, and finds <<their _v>> <<rep _vs>>
<<= _u.getName()>> <<if _vdick>>stroking <<their _v>> <<udick _v>> while <<they _v>> humps
<<their _v>> butt up and down on your
<<else>>
licking <<their _v>> anus while <<they _v>> humps <<themself _v>> up and down on your
<</if>>
<<if _hasdick>>cock<<else>>fake cock<</if>>.
Your use of <<= _v.getName()>>'s <<ubody _v>> is the focus.
<<They _v>> finds <<themself _v>> caught up in a miasma of sexual pleasure and perversion,
moaning and blushing as your
<<if !_hasdick>>strap-on and fingers<<else>>cock<</if>> and
<<= _u.getName()>>'s mouth tour <<their _v>> body.
When you finish in <<their _v>> <<if _vdick>>asshole,
<<their _v>> <<rep _vs>> hastens to lavish attention on <<their _u>> <<rep _us>>'s
well fucked, cum filled butt.<<else>>pussy,
<<their _v>> <<rep _vs>> hastens to lavish attention on <<their _u>> <<rep _us>>'s
well fucked, cum filled cunt.<</if>>
<<elseif _ubasic && _vbasic>>
<<= _u.getName()>> gives you a little smile when
<<they _u>> hears you wish to fuck <<them _u>> and <<their _u>> <<rep _us>>
<<= _v.getName()>><<if !_hasdick>> and sees your strap-on<</if>>.
On your direction, <<= _u.getName()>> sits on the $i.location.
When <<= _v.getName()>> enters,
<<their _v>> <<rep _vs>> spreads <<their _u>> arms and tells <<them _v>> to sit on <<their _u>> lap.
<<= _v.getName()>> gets the idea and straddles <<them _u>> so they're face to face.
You take <<= _v.getName()>> from behind;
<<they _v>> gasps as <<they _v>> feels <<their _v>> <<rep _vs>>'s <<uhands _u>> stimulate
<<them _v>> from the front.
They make out shamelessly while you take your pleasure.
When you finish, <<= _u.getName()>> lies down on the couch so
<<= _v.getName()>> can ride <<their _u>>
<<uface _u>>.
As <<they _u>> sucks the cum out of <<their _u>> <<rep _u>>'s sopping fuckhole,
<<= _v.getName()>> sucks you hard again.
In the mood for something harder this time, you jam yourself
into the <<= _u.getName()>>.
<<= _v.getName()>> gets off <<= _u.getName()>>'s face so <<they _v>> can offer
<<themself _v>> for fondling and manhandling while you pound
<<= _u.getName()>>. After you're done,
<<= _v.getName()>> returns <<their _v>> <<rep _vs>>'s affection and gives
<<them _u>> some gentle oral as the slave lies there exhausted.
<<else>>
Since between them they aren't able to enthusiastically perform an incestuous threesome,
you simply line <<= _u.getName()>> and <<= _v.getName()>> up next to one another
on a $i.location,<<if !_hasdick>> don a strap-on,<</if>>
and fuck the available holes at will.
Whenever a hole begins to pall you just switch to another.
<<= _u.getName()>> tries hard to ignore the fact that
<<they _u>>'s getting fucked next to <<their _u>> <<rep _us>>,
and <<= _v.getName()>> pretends the cock getting shoved into <<them _v>>
isn't slick from <<their _v>> <<rep _vs>>'s fuckhole.
<</if>>
/*
<<elseif ((_activeSlaveRel is "friend") or (_activeSlaveRel is "best friend")) and ($activeSlave.devotion > 20) and ($partner.devotion > 20)>>
$activeSlave.slaveName and $partner.slaveName line up next to one another on the couch next to your desk<<if ($PC.dick is 0)>> while you don a strap-on,<</if>> and offer you their holes. They're just friends, but they're sex slaves and they see nothing wrong with enjoying sex with you, together. They keep up a constant stream of giggling, gasping, and smiling as each of them in turn feels a cock, warm and wet from her friend's body, transferred into her. Each of them does her best to help the other do well, even manually stimulating her friend when necessary<<if ($PC.boobs gt 0)>> and spinning around to lavish attention on your nipples<</if>>.
<<BothVCheck>>
<<PartnerVCheck>>
<<elseif ((_activeSlaveRel is "friend with benefits") or (_activeSlaveRel is "lover") or (_activeSlaveRel is "slave wife")) and ($activeSlave.devotion > 20) and ($partner.devotion > 20)>>
$activeSlave.slaveName and $partner.slaveName eagerly repair to the couch and arrange themselves face to face so they can make out and enjoy each other's bodies as you enjoy theirs. You decide not to set up an elaborate threesome, and just <<if ($PC.dick is 0)>>engage in a little tribadism with<<else>>fuck<</if>> whatever hole catches your eye next. They rarely break their intimate kissing, forming between the two of them a loving entity on the couch with all sorts of interesting parts to experience. They're sex slaves, and you're fucking them, but they're also lovers who are very comfortable in each others' arms, kissing, fondling each other, and <<if ($PC.dick is 0)>>enjoying your pussy loving<<else>>taking your dick<</if>>.
<<BothVCheck>>
<<PartnerVCheck>>
<<else>>
Since between them they aren't able to enthusiastically perform a threesome, you simply line $activeSlave.slaveName and $partner.slaveName up next to one another on the couch next to your desk, and fuck <<if $seeRace is 1>>$activeSlave.race holes <</if>>at will. Whenever a hole begins to pall you just switch to another. $activeSlave.slaveName tries hard to ignore the fact that she's getting fucked next to her _partnerRel, and $partner.slaveName pretends the <<if ($PC.dick is 0)>>strap-on<<else>>cock<</if>> getting shoved into her isn't slick from her _activeSlaveRel's fuckhole.
<<BothVCheck>>
<<PartnerVCheck>>
<</if>>
*/<<run new setup.Interaction(
'unit_fuck_vagina',
'Fuck vagina',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionFuckVagina',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qs.trait_vagina,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<set $i = {}>>
<<set _u = $g.target>>
<<pronounload $i _u>>
<<loadinteractioncommon _u>>
You descend into your $i.locgeneral and grabbed
your <<titlefull _u>>
<<= _u.getName()>> over
so you can use $i.his <<uvaginaall _u>>.
<<ustripvagina _u>>
<<set _fPosition = random(1,100)>>
You decide to fuck $i.him
<<if (_fPosition <= 20)>>
in the missionary position.
You tell $i.him to lie down on $i.location.
<<elseif (_fPosition <= 40)>>
doggy-style.
You tell $i.him to get on $i.location on $i.his <<uarms _u>> and knees.
<<elseif (_fPosition <= 60)>>
in the cowgirl position.
You lie on $i.location and tell $i.him to straddle you, facing towards you.
<<elseif (_fPosition <= 80)>>
in the reverse cowgirl position.
You lie on $i.location and tell $i.him to straddle you facing away from you.
<<else>>
in the wheelbarrow position.
You tell $i.him to get on $i.location, stand next to $i.him and lift $i.his <<ulegs _u>> up
into the air.
<</if>>
<<set _fSpeed = random(1,100)>>
<<if _u.isMindbroken()>>
Since $i.his mind is gone,
$i.his <<ubody _u>> is all yours to use as a <<racelow _u>> sex doll.
You throw $i.him over the couch and amuse yourself with
$i.him for a while;
$i.his <<ubody _u>> retains its instinctual responses, at least.
You finish inside $i.him and brought your <<uadjphys _u>> toy back to $i.his
resting place, the $i.slavebed in the $i.room.
<<elseif _u.isHasTrait(setup.trait.training_obedience_advanced)>>
<<if $unit.player.isHasDick()>>
<<set _sub = _u.isHasTrait(setup.trait.per_submissive)>>
$i.He comes over,
smiling <<if _sub>>a little submissive smile<</if>>, and spreads $i.himself for you.
You take $i.him on $i.location after $i.he gets into position.
<<if (_fPosition <= 20)>>
$i.He hugs $i.him <<ubody _u>> to you and $i.his <<ubreast _u>> press against your <<ubreast $unit.player>>;
<<elseif (_fPosition <= 40)>>
$i.He arches $i.his back as you continue to pound $i.him;
<<elseif (_fPosition <= 60)>>
$i.He puts $i.his <<uhands _u>> on your <<ubreast $unit.player>> and leans forward as you continue to thrust upwards;
<<elseif (_fPosition <= 80)>>
$i.He puts $i.his <<uhands _u>> on your <<ubreast $unit.player>> and starts to lean back as you continue to thrust upwards;
<<else>>
$i.He begins to tire as you keep pounding;
<</if>>
you can feel $i.his heart beating hard.
<<if $unit.player.isHasDick() && _sub>>
As the sex reaches its climax, $i.he begs you to cum inside $i.his unworthy body.
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
$i.He does $i.his submissive best to stay completely soft within $i.his dick chastity.
<<else>>
As a submissive $i.he spares no attention for $i.his own orgasm, so $i.his rock hard erection swings untended.
<</if>>
<</if>>
<<if $unit.player.isHasVagina()>>
When you finally climax, you pull out and press your wet cunt
against $i.his <<umouth _u>>,
letting $i.him lavish attention on you that brings you to another quick orgasm.
<</if>>
<<else>>
As the sex reaches its climax, $i.his kisses grow urgent and passionate.
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
$i.He enjoys $i.himself,
even though $i.his dick chastity keeps $i.him
soft by making the beginnings of erection very uncomfortable.
<<else>>
When you orgasm together,
$i.his erect <<udick _u>> squirts cum up towards $i.his tits while your dick fills $i.him with cum.
<</if>>
<</if>>
<<if $unit.player.isHasVagina()>>
You got so wet fucking $i.him that when you climax,
you stand up; $i.he knows what that means, and hurries to eat you out.
The oral attention brings you to a quick aftershock orgasm.
<</if>>
<</if>>
<<else>>
You pat the tops of your thighs,
and $i.he skips over smiling and gives you a quick kiss.
Without breaking the lip lock,
$i.he sits down, wrapping $i.him <<ulegs _u>> around you.
Your <<uhands $unit.player>> reach around $i.him and seize $i.his buttocks,
drawing $i.him in even closer so that the warmth between $i.his legs
is pressed hard against your pussy,
and you can play with $i.his asshole.
$i.He grinds enthusiastically against you, moaning into your <<umouth $unit.player>>
with pleasure.
<</if>>
<<elseif _u.isHasTrait(setup.trait.training_none)>>
$i.He tries to refuse, so you
<<if $unit.player.isHasDick()>>
bend the disobedient slave over $i.location and take
$i.him hard from behind.
<<if _u.isHasBreasts()>>
$i.His <<ubreast _u>>
<<if _u.isHasDick()>>and <<udick _u>><</if>>
slide back and forth across the desk.
<</if>>
You give $i.his buttocks
some nice hard swats as you pound $i.him.
$i.He grunts and moans but knows better than to try to get away.
<<if _u.isHasDick()>>
Despite $i.his unwillingness to be raped, the stimulation
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
starts to give $i.him an erection,
which $i.his dick chastity makes horribly uncomfortable.
$i.He bucks with the pain, $i.his hole spasming delightfully.
<<else>>
gives $i.him an erection.
$i.He's mortified that $i.he would get hard while being raped.
<</if>>
<</if>>
<<if $unit.player.isHasVagina()>>
After your first orgasm,
you pull out and grind your pussy against
$i.his <<uface _u>> for another climax,
enjoying the stimulation of $i.his muffled crying.
<</if>>
<<else>>
stand and seize $i.him,
shoving $i.him down to sit in your chair.
You jump atop $i.his hips,
pinning $i.him down into the chair with your legs and pressing your pussy hard
against $i.his groin.
$i.He struggles and whimpers,
but you give $i.him a hard warning slap to the cheek and kiss $i.his unwilling <<umouth _u>>,
forcing your tongue past $i.his lips as you grind against $i.him.
<</if>>
<<else>>
<<if $unit.player.isHasDick()>>
$i.He obeys,
lying on $i.location with $i.his <<ulegs _u>> spread.
You kneel on the ground and enter $i.him,
a <<uhand $unit.player>> on each of $i.his <<ulegs _u>> to give you a good grip.
<<if _fSpeed > 75>>The pounding is hard and fast
<<elseif _fSpeed > 50>>You pound $i.him firmly and vigorously
<<elseif _fSpeed > 25>>You fuck $i.him steadily and controlled
<<else>>You fuck $i.him slowly and tenderly
<</if>>, and $i.he gasps and
<<if _fSpeed > 50>>whines
<<else>>moans<</if>>.
You reach a <<uhand $unit.player>> down to maul $i.his <<ubreast _u>>.
<<if _u.isHasDick()>>
<<if _u.isHasTrait(setup.trait.eq_chastity)>>
$i.He enjoys $i.himself,
even though $i.his dick chastity keeps $i.him soft by making the beginnings
of erection very uncomfortable.
<<else>>
$i.He bites $i.his lip and moans as $i.he climaxes.
You fill $i.his squeezing fuckhole with your cum.
$i.He already dribbled $i.his own load all over $i.his stomach.
<</if>>
<</if>>
<<if $unit.player.isHasVagina()>>
You got so wet fucking $i.him that when you climax,
you stand up and let $i.him clean your pussy with $i.his <<umouth _u>>.
The oral attention brings you to a quick aftershock orgasm.
<</if>>
<<else>>
You pat the tops of your thighs,
and $i.he obediently comes over to sit atop them,
wrapping $i.him <<ulegs _u>> around you.
Your <<uhands $unit.player>> reach around $i.him and seize $i.his buttocks,
drawing $i.him in even closer so that the warmth between $i.his <<ulegs _u>>
is pressed hard against your pussy.
$i.He grinds dutifully against you,
only pausing for a moment when $i.he finds your insistent tongue probing past $i.his lips.
<</if>>
<</if>>
<<if $unit.player.isHasDick()>>
<<if _u.isHasTraitExact(setup.trait.vagina_gape)>>
Cum drips out of $i.his fucked-out hole.
<<elseif _u.isHasTraitExact(setup.trait.vagina_loose)>>
Cum drips out of $i.his stretched vagina.
<<else>>
$i.His still-tight vagina keeps your load inside $i.him.
<</if>>
<</if>>
<<unset $i>><<run new setup.Interaction(
'unit_kiss',
'Kiss',
'FCdev (Free Cities)', /* author */
[], /* tags */
'InteractionKiss',
[], /* Cost */
[], /* Requirements */
[
setup.qs.job_slave,
setup.qres.SlaveUsableByYou(),
], /* Target requirements */
[], /* Effects */
0, /* cooldown in weeks */
setup.interactionpool.unit, /* interaction pool this belongs to */
)>><<if _u.isMindbroken()>>
$i.He complies mechanically.
$i.He remembers that when
your commands are not obeyed, there is punishment.
<<elseif _friendship >= 900>>
$i.He hurriedly complies,
happy to be near the object of $i.his longing.
Once she's close, you take a moment to gaze deeply into
$i.his <<ueyes _u>>.
$i.He finds the intense look from the <<man $unit.player>> $i.he loves overwhelming,
and $i.his eyes flick downward after a moment.
$i.He blushes furiously.
<<elseif _friendship >= 750>>
$i.He hurriedly complies, happy to be near you.
Once $i.he's close, you take a moment to gaze deeply into $i.his <<ueyes _u>>.
$i.He finds the intense look from $i.his beloved owner disconcerting,
and $i.his eyes flick downward after a moment. $i.He blushes furiously.
<<elseif _friendship >= 500>>
$i.He hurriedly complies, happy to be near you.
Once $i.he's close, you take a moment to gaze deeply into $i.his <<ueyes _u>>.
$i.He finds the intense attention from $i.his owner disconcerting,
and $i.he looks down after a moment, blushing.
<<elseif _u.isHasTrait(setup.trait.training_obedience_advanced)>>
$i.He hurried