This commit is contained in:
DoctaSax 2018-07-26 21:33:38 +02:00
parent 4bb5802285
commit 7fd1ff94e5
117 changed files with 2830 additions and 0 deletions

59
Docs/FAQ.txt Normal file
View file

@ -0,0 +1,59 @@
1. Dev questions
1.1. Why don't we have feature X yet?
1.2. Are you going to add feature X?
2. Gameplay questions
2.1. What do I do? Where do I go?
2.2. I don't have a place to live!
2.3. How do I find a residential building, bar, hotel, etc.?
2.4. How do I change a building's type?
3. Tech questions
3.1. I can't bring up the console!
3.2. How do I change or add to the content?
1. Dev questions
1.1. Why don't we have X yet?
Because it hasn't been made yet. Perhaps you can help out?
Creating content for LifePlay is easy to do, and because it's meant to be a moddable game, it's not just the developer who can do it. See the Docs/Modding folder to learn how.
1.2. Are you going to add X?
Quite possibly. It may take a while though. Other things need adding too!
2. Gameplay questions
2.1. What do I do? Where do I go?
The idea is that you live the life of the character you're playing. There is no one story, and no other background to the player character than what you imagine yourself. You can tweak your character's looks and stats, potentially give them relatives via the contacts menu (ctrl-P), make sure to load up content modules that fit your tastes (ctrl-M), and take it from there.
You should probably find a place to live, and get an income so you can pay for expenses. Or you could just sleep in hotels and hope money'll drop from the sky. Suit yourself ;)
2.2. I don't have a place to live!
Find a residential building during work hours, click on it, and select "arrange a viewing". This'll then give you the option to rent an apartment, or not.
2.3. How do I find a residential building, bar, hotel, etc.?
Hover the mouse over a building and ideally, an icon should show up telling you what type of building it is. Buildings with a question mark haven't been given a type yet.
You can also click on the magnifying glass icon to the left, leave the search field blank, then click on the icon so you can choose from a variety of building types to choose from. The search results will try to display them based on how far you have to walk.
2.4. How do I change a building's name or type?
Some maps have far more detailed information on buildings than others, and it's also always possible you want to insert or change a building type because you just want to. To do that, you just click on any building, and select "edit building".
Changes to a building on a map carry over to any new game you start on that same map, so perhaps you shouldn't change buildings on one game that could be your other game's character's home or job?
3. Tech Questions
3.1. I can't bring up the console!
Ordinarily you bring up the console with #
Due to different keyboard mappings throughout the world, though, the key to use may differ for you. You can change the key in Config/DefaultInput.ini, look for the line:
+ActionMappings=(ActionName="TestScenes",Key=#,bShift=False,bCtrl=False,bAlt=False,bCmd=False)
3.2. How do I change or add to the content?
Intel on how to write or edit scenes is found in the Docs/Modding folder. It mostly deals with the scripting language at the moment, in a noob-friendly way, and focuses on adding scenes, actions, stats, character presets, sex descriptions and sex talk. These are the easiest to change: a simple text editor is all you need, and the documentation is noob-friendly.
(Not ready to say anything useful about asset creation...)

View file

@ -0,0 +1,15 @@
Divorce()
USE:
This command undoes the marriage between player and their husband/wife. It will revert their status to being boyfriend(s)/girlfriend(s) though, so you probably want to follow up with loseDating().
TYPE: Command, non-Ref
RETURNS: /
THEME: Relationships
COMPARE: getMarried, isMarried, loseDating
EXAMPLE:
Official:: "Sign here and here and here and here... Initial here and here and here... Very well, everything's in order."
Player(Disgusted):: "About damn time!"
Divorce()
loseDating()

View file

@ -0,0 +1,21 @@
Filter(Tag)
USE:
Limit a sex scene to animations that have the specified tag.
TYPE: Command, non-Ref
RETURNS: /
THEME: Sex
COMPARE: TalkNonConsensual
EXAMPLE:
"A while later in front of her place."
Player(Flirty)::"Baby, since I just took you to that fancy place and all, maybe I could... come inside?"
Girlfriend(Offended)::"Hey, what do you take me for? I don't put out just for a meal!"
Player(Shy)::"I know you don't, I mean, I didn't think you would, but... please, being around you drives me nuts! I'm about to burst!"
Girlfriend(Annoyed)::"Oh, alright then. But there's no way we're actually doing 'it' tonight! A quick shake and then I'm off to bed, and you're off to yours!"
setBackground(home)
Player.strip()
Filter(Handjob)
Sex(Player, Girlfriend)

View file

@ -0,0 +1,14 @@
losePT()
USE:
The player fires their current personal trainer.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Special Characters
COMPARE: setPT
EXAMPLE:
Player(Angry):: "I've made no progress under your instructions. You're fired!"
losePT()
"I need to find a new personal trainer now."

View file

@ -0,0 +1,17 @@
Random(float, float)
USE:
returns a random float number between the entered float parameters. Commonly used to influence the chance a condition is true based on an actor stat.
TYPE: Command, non-Ref
RETURNS: float
THEME: Math
COMPARE:
EXAMPLE:
attrBonus = Random(1,5)
Actor:attrtoplayer += attrBonus
If Random(30, 100) > attractiveness // condition is only possible if attractiveness is higher than 30, and more likely to happen the higher attractiveness is
If Random(50,300) < Actor:perversion // only possible perversions is higher than 50, but only has a 20% chance of happening

View file

@ -0,0 +1,20 @@
Sex(Actor1, Actor2, ..., ActorN)
USE:
Start a sex scene involving these actors. If the player is involved, it will also check whether the player is cheating or not and add to the affair list accordingly.
The order in which roles are given to actors for the sex scene (important for descriptions and dirtytalk) depends largely on gender and domincance. Males are given roles before transsexuals, then women. Between people of the same gender, the most dominant one (lowest submission stat) is given a role first.
However, the order of the actor parameters to the Sex() function matters somewhat in group sex: Sex(Male1, Player, Male2) will be different from Sex(Male2, Player, Male1).
TYPE: Command, non-Ref
RETURNS: /
THEME: Sex
COMPARE: SexNoAffair
EXAMPLE:
Boss(Happy):: "Baby, let's get closer!"
Sex(Boss, Player)
If Boss.isAffair() // if you are in a relationship with someone else, this will return true after sex
"I cheated on my boyfriend with my boss."
Endif

View file

@ -0,0 +1,19 @@
SexNoAffair(Actor1, Actor2, ..., ActorN)
USE:
Start a sex scene involving these actors. Even if the player is involved, it will not check whether the player is cheating or not.
The order in which roles are given to actors for the sex scene (important for descriptions and dirtytalk) depends largely on gender and domincance. Males are given roles before transsexuals, then women. Between people of the same gender, the most dominant one (lowest submission stat) is given a role first.
However, the order of the actor parameters to the Sex() function matters somewhat in group sex: SexNoAffair(Male1, Player, Male2) will be different from SexNoAffair(Male2, Player, Male1).
TYPE: Command, non-Ref
RETURNS: /
THEME: Sex
COMPARE: Sex
EXAMPLE:
Boss(Happy):: "Baby, let's get closer!"
SexNoAffair(Boss, Player)
If Boss.isAffair() // this will return false no matter what
"I cheated on my boyfriend with my boss."
Endif

View file

@ -0,0 +1,15 @@
TalkNonConsensual()
USE:
call this command before starting a sex scene to make sure that none of the regular 'dirtytalk' (ie both ppl wanting it) is played, and only non-consensual talk is played.
TYPE: Command, non-Ref
RETURNS: /
THEME: Sex
COMPARE: Filter(Aggressive)
EXAMPLE:
"Before I knew what was happening, the door slammed shut behind me..."
Filter(Aggressive)
TalkNonConsensual()
SexNoAffair(Aggressor, Player)

View file

@ -0,0 +1,20 @@
WHAT
USE:
WHAT is mostly used to enter a condition at the top of a scene, affecting its random triggering depending on what the player's doing.
However, it can also be used as a command in the rest of the scene script, returning the player's current activity.
Available actionIDs can be found in the different files contained in the "Actions" folder in modules.
TYPE: Condition, non-Ref
RETURNS: actionID (string)
THEME: Scenes, Activity
COMPARE: WHAT, WHEN
EXAMPLE:
If WHAT == socialize && WHERE == nightclub
"It shouldn't be surprising that when you talk to random strangers at a nightclub, somebody will think you're just hitting on people."
Jealous = generatePerson()
Jealous.dress()
Jealous.show()
Jealous(Angry)::"Stay away from my <Player.boyfriend_or_girlfriend>, you <Player.creep_or_skank>!"
Endif

View file

@ -0,0 +1,19 @@
WHEN
USE:
WHEN is mostly used to enter a condition at the top of a scene, affecting its random triggering depending on what time of day it is.
However, it can also be used as a command in the rest of the scene script, to return the time of day in a float.
TYPE: Command, non-Ref
RETURNS: float
THEME: Scenes, Time
COMPARE: WHAT, WHERE
EXAMPLE:
If WHEN > 21 || WHEN < 4
time = "late"
Elseif WHEN < 9
time = "early"
Endif
"My neighbour's having <Neighbour.p> stereo on, and it's so loud the bass can be heard from a block away! I've got a good mind to tell <Neighbour.o> that I'm calling the police if <Neighbour.s> ever makes such noise this <time> again!"

View file

@ -0,0 +1,20 @@
WHERE
USE:
WHERE is mostly used to enter a condition at the top of a scene, affecting its random triggering depending on the player's location.
However, it can also be used as a command in the rest of the scene script, returning the player's location.
Available locationIDs can be found in Docs/Lists/all_wheres.txt
TYPE: Condition, non-Ref
RETURNS: locationID (string)
THEME: Scenes, Location
COMPARE: isAtHome, WHAT, WHEN
EXAMPLE:
Title = "shop assistant"
If WHERE == bank
Title = "cashier"
Elseif WHERE == bar || WHERE == nightclub
Title = "bartender"
Endif
"It's my lucky day. I found myself being served by a <New_Person.handsome_or_cute> <Title>."

View file

@ -0,0 +1,13 @@
Actor.addColleague()
USE:
Add this actor to the list of colleagues. Can be found later with getSpecific(Colleague)
TYPE: Command, Reference
RETURNS: /
THEME: Job
COMPARE: removeColleague, isColleague
EXAMPLE:
John(Happy):: "Hi there, I just got hired."
John.addColleague()

View file

@ -0,0 +1,13 @@
Actor.addDatingFriend()
USE:
Add this actor to the list of your significant other's friends. Can be found later with getSpecific(Dating_Friend)
TYPE: Command, Reference
RETURNS: /
THEME: Acquaintance
COMPARE: removeDatingFriend, isDatingFriend
EXAMPLE:
John(Happy):: "Hi there, I'm your boyfriend's friend."
John.addDatingFriend()

View file

@ -0,0 +1,13 @@
Actor.addNeighbour()
USE:
Add this actor to the list of neighbours. Can be found later with getSpecific(Neighbour)
TYPE: Command, Reference
RETURNS: /
THEME: Housing
COMPARE: removeNeighbour, isNeighbour
EXAMPLE:
John(Happy):: "Hi there, I'm new here. Just moved in."
John.addNeighbour()

View file

@ -0,0 +1,20 @@
Actor.blendPreset(PresetID)
USE:
Blend this actor with a preset, usually called after generatePerson().
Presets are contained in a module's folder for the purpose, and can contain either body morphing or stat-related intel.
PresetID is the filename without the extension.
TYPE: Command, Reference
RETURNS: /
THEME: Actor Creation, Looks, Stats
COMPARE: generatePerson, generatePersonTemporary
EXAMPLE:
// We want a male bodybuilder
Bodybuilder = generatePerson() // just so that we get the random stats etc, but this might generate a female
Bodybuilder.blendPreset(bodybuilder) // if the above is female, then this will reset face and hair to the default male face and hair, so it's best to follow up with
Actor.randomizeFace()
Actor.randomizeHairs()

View file

@ -0,0 +1,13 @@
blockContact(Actor)
USE:
Remove this person from your contact list.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Acquaintance
COMPARE: exchangeContact, isContactExchanged
EXAMPLE:
"This guy is a stalker. This is enough."
blockContact(John)

View file

@ -0,0 +1,13 @@
GlobalVariableName.clearGlobal()
USE:
Delete this global variable completely.
TYPE: Command, Non-Ref (but syntax is ref-like)
RETURNS: /
THEME: Variables
COMPARE: getGlobal, setGlobal
EXAMPLE:
SugarDaddy.clearGlobal()
FloatVariable = SugarDaddy.getGlobal() // will now return 0

View file

@ -0,0 +1,17 @@
Actor.closeEyes(bool)
USE:
force actor to close or open their eyes
TYPE: Command, Reference
RETURNS: /
THEME: Scenes
COMPARE:
EXAMPLE:
Masseuse::"Just lie down and relax."
Player.CloseEyes(true)
Mom(Angry)::"Hey, wake up, sleepy head! You're about to be late for work!"
Player.CloseEyes(false)

View file

@ -0,0 +1,14 @@
Float.convertToLocalCurrency()
USE
Converts a dollar value to the local currency for the home city in string format.
TYPE: Command, non-Ref (syntax is ref-like)
RETURNS: String, expressing the number in local currency
THEME: Money
COMPARE: getRent, getSalary, setRent, setSalary
EXAMPLE:
Salary = 3000
SalaryConverted = Salary.convertToLocalCurrency()
"My salary is <SalaryConverted>." // will show up as 'My salary is £ 2000.'

View file

@ -0,0 +1,9 @@
Actor.Delete()
USE:
Force remove this actor from current memory. Used in rare cases where SceneEnd() (which does this automatically to all actors used in the scene) isn't called.
TYPE: Command, Reference
RETURNS: /
THEME: Actor Removal
COMPARE: hide, makePermanent

View file

@ -0,0 +1,20 @@
Actor.dress(optional_item)
USE:
If there's nothing in the bracket, it will dress the actor fully appropriate to the current building. If a clothing piece is specified, will put that on only. Check LifePlay\Content\Heavy\Clothes for the names of the items
TYPE: Command, Reference
RETURNS: /
THEME: Clothes
COMPARE: strip
EXAMPLE:
setBackground(work)
Player.dress() // will put on a full suit with oxford shoes etc and underwear underneath
OR
Player.dress(Casual-Clothes_1_F) // will put on casual clothes only, no shoe or underwear

View file

@ -0,0 +1,14 @@
Actor.dressWedding()
USE:
This command puts the actor in a wedding dress or suit.
TYPE: Command, Reference
RETURNS: /
THEME: Relationships
COMPARE: getMarried, dress
EXAMPLE:
"It took quite a bit of doing, getting into that corset, but I finally was good to go, and ready to step down the aisle."
setBackground(place_of_worship)
Player.dressWedding()

View file

@ -0,0 +1,13 @@
endDate()
USE:
End the current 'date', i.e. get rid of the current companion.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Companions
COMPARE: startDate
EXAMPLE:
"We already hung out for the whole afternoon. It's time to separate."
endDate()

View file

@ -0,0 +1,13 @@
exchangeContact(Actor)
USE:
Exchange numbers with this actor.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Acquaintance
COMPARE: blockContact, isContactExchanged
EXAMPLE:
"We exchanged numbers and parted ways."
exchangeContact(John)

View file

@ -0,0 +1,13 @@
forgiveAffairs()
USE:
Clear all affairs commited while in this current relationship. This is done automatically when SetDating().
TYPE: Command, Non-Ref
RETURNS: /
THEME: Relationships
COMPARE: isAffair, loseDating
EXAMPLE:
Dating(Crying):: "Alright, after everything we've been through, I guess I can forgive you this time ..."
forgiveAffairs()

View file

@ -0,0 +1,18 @@
generatePerson()
generatePerson(preset1, preset2, ..., presetN)
USE:
Generate a new actor. If nothing inside the bracket: completely random actor. Or you can specify the presets to blend into this new actor. The actor generated using this method will be permanent right away, meaning they will remain after the current scene ends and are usable for some functions that only work with permanent actors.
TYPE: Command, Non-Ref
RETURNS: Actor
THEME: Actor Creation
COMPARE: generatePersonTemporary, blendPreset
EXAMPLE:
Actor = generatePerson() // OR Actor = generatePerson(easterneuropean, twenties, fitness_model)
Actor.dress()
Actor.show(2)
exchangeContact(Actor) // this will succeed because this is a permanent actor

View file

@ -0,0 +1,20 @@
generatePersonTemporary()
generatePersonTemporary(preset1, preset2, ..., presetN)
USE:
Generate a new actor. If nothing inside the bracket: completely random actor. Or you can specify the presets to blend into this new actor.
The actor generated using this method will be temporary at first (unless you call MakePermanent() on them later on), meaning they will be deleted with no traces left (not even in a lpcharacter) after the current scene ends. Useful for loops and for one-off actors like thiefs and prostitutes. Also, your adultery with a temporary actor will never be caught!
TYPE: Command, Non-Ref
RETURNS: Actor
THEME: Actor Creation
COMPARE: generatePerson, blendPreset, makePermanent
EXAMPLE:
Actor = generatePersonTemporary() // OR Actor = generatePersonTemporary(easterneuropean, twenties, fitness_model)
Actor.dress()
Actor.show(2)
exchangeContact(Actor) // this will fail because this is a temporary actor that will be lost forever after the current scene ends. You need to call MakePermanent first.

View file

@ -0,0 +1,17 @@
getCompanion()
USE:
Get the current companion. Not entirely necessary as the current companion has a special variable "CurrentCompanion" that is always available.
TYPE: Command, non-Ref
RETURNS: Actor
THEME: Companions
COMPARE: isWithCompanion
EXAMPLE:
Actor = getCompanion()
Actor.dress()
// is the same as
CurrentCompanion.dress()

View file

@ -0,0 +1,15 @@
GlobalVariable.getGlobal()
USE:
Get the float value of a global variable. If there's no global variable under such name, returns 0.
TYPE: Command, non-Ref (ref-like syntax)
RETURNS: float
THEME: Variables
COMPARE: clearGlobal, setGlobal, getID
EXAMPLE:
SugarDaddyID = SugarDaddyGV.getGlobal()
If SugarDaddy != 0
SugarDaddyActor = getSpecific(SugarDaddyID)
Endif

View file

@ -0,0 +1,20 @@
Actor.getID()
USE:
Get the ID number of this actor, which can then be saved as a global variable and then called on using getSpecific.
TYPE: Command, Reference
RETURNS: Float
THEME: Identity, Variables
COMPARE: setGlobal, getGlobal, getSpecific
EXAMPLE:
ID = Actor.getID()
SugarDaddy.setGlobal(ID)
// another scene
ID = SugarDaddy.getGlobal()
If ID != 0
Actor = getSpecific(ID)
Endif

View file

@ -0,0 +1,13 @@
getMarried()
USE:
Call this function to marry the player to their current bf/gf. This doesn't trigger a wedding scene, but flags them as being married.
TYPE: Command, non-Ref
RETURNS: /
THEME: Relationships
COMPARE: setDating, isMarried, Divorce, DressWedding, getSpecific(Dating)
EXAMPLE:
Priest::"I now pronounce you man and wife."
getMarried()

View file

@ -0,0 +1,14 @@
getPerson(optional bool)
USE:
Get a random person in your current game (i.e. could be anyone that has been created with GeneratePerson() or GeneratePersonTemporary() then MakePermanent() ). Optional bool parameters to filter for whether their contact has been exchanged to you or not.
TYPE: Command, Non-Ref
RETURNS: Actor
THEME: Actor Loading
COMPARE: getSpecific
EXAMPLE:
Actor = getPerson() // get anyone
Actor = getPerson(true) // get someone who has exchanged numbers with me
Actor = getPerson(false) // get someone whose number I don't have

View file

@ -0,0 +1,17 @@
getRelative()
getRelative(keyword, keyword, ..., keyword)
USE:
Retrieves an actor who's related to the player.
This can be filtered down to only certain types of relatives with keywords: Sibling, StepSibling, Child, StepChild, Cousin, ParentSibling (uncles/aunts), GrandParent, Parent, StepParent
TYPE: Command, non-Ref
RETURNS: Actor
THEME: Family, Actor Loading
COMPARE: getRelativeExcept
EXAMPLE:
WHO: Actor = getRelative()
WHO: Actor = getRelative(Sibling, StepSibling, Cousin, Child, StepChild)

View file

@ -0,0 +1,13 @@
getRelativeExcept(keyword, ..., keyword)
USE:
Retrieves an actor who is related to the player, but isn't tagged by the listed keyword(s).
TYPE: Command, non-Ref
RETURNS: Actor
THEME: Family, Actor Loading
COMPARE: getRelative
EXAMPLE:
WHO: Actor = getRelativeExcept(GrandParent) // returns a relative who isn't a grandparent of the player

View file

@ -0,0 +1,15 @@
getRent()
USE:
Get the current rent into a float variable.
TYPE: Command, Non-Ref
RETURNS: Float
THEME: Housing, Money
COMPARE: setRent, convertToLocalCurrency
EXAMPLE
Rent = getRent()
Rent *= 1.2
Rent.setRent()
"Damn, the rent was increased by 20%."

View file

@ -0,0 +1,15 @@
getSalary()
USE:
Get the current salary into a float variable.
TYPE: Command, Non-Ref
RETURNS: Float
THEME: Job, Money
COMPARE: setSalary, convertToLocalCurrency
EXAMPLE
Salary = getSalary()
Salary *= 1.2
Salary.setRent()
"Yay, my salary was increased by 20%."

View file

@ -0,0 +1,27 @@
getSpecific(keyword)
getSpecific(float)
getSpecific(float variable)
USE:
Get a specific person in your current game.
Available keywords are: Dating, Dating_Friend, Boss, Colleague, Neighbour, PT, ExDating, Landlord, CurrentBabyDaddy, Impregnated
Alternatively, you can input an ID number or a float variable containing it to get the actor with that ID.
TYPE: Command, Non-Ref
RETURNS: Actor
THEME: Actor Loading
COMPARE: getPerson, getID, setGlobal, getGlobal, isValid
EXAMPLE:
SO = getSpecific(Dating) // get my boyfriend / girlfriend
if SO.isValid
// I actually have a bf/gf
endif
Actor5 = getSpecific(5) // get the fifth generated actor in this current game
ID = SugarDaddy.getGlobal()
If ID != 0
SugarDaddyActor = getSpecific(ID) // get the sugar daddy via the float variable
Endif

View file

@ -0,0 +1,14 @@
Actor.hide()
USE:
Hide the actor from the player's view. Opposite to show().
TYPE: Command, Reference
RETURNS: /
THEME: Actor Removal, Scenes
COMPARE: show
EXAMPLE:
Actor.show(2)
"<Actor.name> said hi then quickly left."
Actor.hide()

View file

@ -0,0 +1,13 @@
loseDating()
USE:
Break up with current boyfriend / girlfriend. All affairs and SO's friends are cleared and become acquaintances.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Relationships
COMPARE: setDating, isDating, getSpecific(Dating), getSpecific(ExDating)
EXAMPLE:
"It's over. He broke up with me!"
loseDating()

View file

@ -0,0 +1,14 @@
loseHome()
USE:
The player moves out of their current home. Set rent to 0. Landlord and neighbours become acquantainces.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Housing
COMPARE: moveHome
EXAMPLE:
Landlord(Angry):: "That's enough. You're evicted!"
loseHome()
"I need to find a new place to live now."

View file

@ -0,0 +1,14 @@
loseJob()
USE:
The player stops working at their current company. Set salary to 0. Boss and colleagues become acquantainces.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Job
COMPARE: moveJobs
EXAMPLE:
Boss(Angry):: "That's enough. You're fired!"
loseJob()
"I need to find a new place to work now."

View file

@ -0,0 +1,18 @@
Actor.makePermanent()
USE:
This turns a temporary actor (generatePersonTemporary) into a permanent actor that persists after the current scene ends. Does nothing if called on an already permanent actor.
TYPE: Command, Reference
RETURNS: /
THEME: Actor Creation
COMPARE: generatePersonTemporary, generatePerson
EXAMPLE:
// Generate someone who is into the player's gender
InterestedPerson = generatePersonTemporary()
While !InterestedPerson.isInterestedIn(Player)
InterestedPerson = generatePersonTemporary() // use this instead of GeneratePerson() because otherwise there would be too many (depending how many loops it takes to generate oen that's into the player) permanent actors who appear out of nowhere.
Endwhile
InterestedPerson.makePermanent() // now that an interested person is generated, we can make them permanent now.

View file

@ -0,0 +1,16 @@
moveHome()
USE:
Move into the current building and make it your new home. Remember to use SetLandlord() and SetRent() separately.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Housing
COMPARE: loseHome, setLandlord, setRent
EXAMPLE:
"I signed the contract."
moveHome()
Rent = 1000
Landlord.setLandlord()
Rent.setRent()

View file

@ -0,0 +1,16 @@
moveJobs()
USE:
Get hired at this current building and make it our new workplace. Remember to use setBoss() and SetSalary() separately.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Job
COMPARE: loseJob, setBoss, setSalary
EXAMPLE:
"I signed the contract."
moveJobs()
Salary = 2000
Interviewer.setBoss()
Salary.setSalary()

View file

@ -0,0 +1,23 @@
moveTo(place)
USE:
Instantly move the player (and possible companion) to this place. Currently there are only three places: Home, Home_Dating, Work
TYPE: Command, Non-Ref
RETURNS: /
THEME: Location
COMPARE: setBackground
EXAMPLE:
"Where should I go?"
0:: "Home"
1:: "My boyfriend's place"
2:: "The office"
If 0
moveTo(home)
Elseif 1
moveTo(home_dating)
Else
moveTo(work)
Endif

View file

@ -0,0 +1,16 @@
passTime(hours_min, hours_max)
USE:
I initially intended this as a way to pass time during a scene, but it turned out too complicated due to stat depreciations. All it does now is add to the variable TimePassed, which can be useful for while loop I guess.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Time
COMPARE:
EXAMPLE:
While TimePassed < 3
"The party continues ..."
passTime(0.25, 1)
Endwhile
"The party ends."

View file

@ -0,0 +1,16 @@
Actor.randomizeFace()
USE:
Randomize the actor's face and skin. Commonly called after blendpreset (which might change the gender which resets the actor to the default face and hair for that gender)
TYPE: Command, Reference
RETURNS: /
THEME: Looks
COMPARE: randomizeHairs, blendPreset
EXAMPLE:
// We want a male bodybuilder
Bodybuilder = generatePerson() // just so that we get the random stats etc, but this might generate a female
Bodybuilder.blendPreset(bodybuilder) // if the above is female, then this will reset face and hair to the default male face and hair
Actor.randomizeFace()
Actor.randomizeHairs()

View file

@ -0,0 +1,16 @@
Actor.randomizeHairs()
USE:
Randomize the actor's hair and pubic hair. Commonly called after blendpreset (which might change the gender which resets the actor to the default face and hair for that gender)
TYPE: Command, Reference
RETURNS: /
THEME: Looks
COMPARE: randomizeFace, blendPreset
EXAMPLE:
// We want a male bodybuilder
Bodybuilder = generatePerson() // just so that we get the random stats etc, but this might generate a female
Bodybuilder.blendPreset(bodybuilder) // if the above is female, then this will reset face and hair to the default male face and hair
Actor.randomizeFace()
Actor.randomizeHairs()

View file

@ -0,0 +1,13 @@
Actor.removeColleague()
USE:
Remove this actor from the list of colleague. Will remain acquaintance at least though.
TYPE: Command, Reference
RETURNS: /
THEME: Job
Compare: addColleague, isColleague, getSpecific(Colleague)
EXAMPLE:
John(Sad):: "I'm leaving the company."
John.removeColleague()

View file

@ -0,0 +1,13 @@
Actor.removeDatingFriend()
USE:
Remove this actor from the list of your significant other's friends. Will remain acquaintance at least though.
TYPE: Command, Reference
RETURNS: /
THEME: Acquaintance
COMPARE: addDatingFriend, isDatingFriend, getSpecific(Dating_Friend)
EXAMPLE:
John(Sad):: "Your boyfriend is an asshole. I'm no longer his friend."
John.removeDatingFriend()

View file

@ -0,0 +1,13 @@
Actor.removeNeighbour()
USE:
Remove this actor from the list of your neighbours. Will remain acquaintance at least though.
TYPE: Command, Reference
RETURNS: /
THEME: Housing
COMPARE: addNeighbour, isNeighbour, getSpecific(Neighbour)
EXAMPLE:
John(Sad):: "Goodbye, we're moving to another apartment."
John.removeNeighbour()

View file

@ -0,0 +1,9 @@
sceneEnd()
USE:
End the scene and return to map view. This will also clear all actors (except player and current companion from memory) after saving them back into their lpcharacters.
TYPE: Command, Non-Ref
RETURNS: /
THEME: Scenes
COMPARE: sceneStart, timeout, timeoutprecise

View file

@ -0,0 +1,9 @@
sceneStart()
USE:
Start the scene and open the scene UI
TYPE: Command, non-Ref
RETURNS: /
THEME: Scenes
COMPARE: sceneEnd, setBackground

View file

@ -0,0 +1,13 @@
setBackground(where)
USE:
Set the background image. Check all_where.txt for full list. This is also important for dress() which decides how to dress the actor appropriately based on the background (suits for work, sport clothes for sports_centre etc)
TYPE: Command, non-Ref
RETURNS: /
THEME: Scenes, Location
COMPARE: sceneStart, dress
EXAMPLE:
setBackground(work)
Player.dress() // player will put on professional clothes

View file

@ -0,0 +1,16 @@
Actor.setBoss()
USE:
Make this person your boss. Current boss is no longer boss and becomes acquaintance.
TYPE: Command, Reference
RETURNS: /
THEME: Job
COMPARE: isBoss, getSpecific(Boss), moveJobs
EXAMPLE:
"I signed the contract."
moveJobs()
Salary = 2000
Interviewer.setBoss()
Salary.setRent()

View file

@ -0,0 +1,13 @@
Actor.setDating()
USE:
Make this person your significant other. Current SO is no longer dating you and becomes acquaintance. Also clears out all friends of previous SOs and affairs, who all become acquaintances.
TYPE: Command, Reference
RETURNS: /
THEME: Relationships
COMPARE: loseDating, isDating, getSpecific(Dating)
EXAMPLE:
"I agreed to be his girlfriend"
John.setDating()

View file

@ -0,0 +1,17 @@
GlobalVariableName.setGlobal(float or floatvariable)
USE:
Set (add if it doesn't already exist) a global variable to a certain number.
TYPE: Command, non-Ref (ref-like syntax)
RETURNS: /
THEME: Variables
COMPARE: getGlobal, clearGlobal, getID
EXAMPLE:
NumberOfChildren.setGlobal(3)
OR
SugarDaddyID = Actor2.getID()
SugarDaddy.setGlobal(SugarDaddyID)

View file

@ -0,0 +1,16 @@
Actor.setLandlord()
USE:
Make this person your landlord. Current landlord is no longer landlord and becomes acquaintance.
TYPE: Command, Reference
RETURNS: /
THEME: Housing
COMPARE: isLandlord, setRent, getSpecific(Landlord)
EXAMPLE:
"I signed the contract."
moveHome()
Rent = 1000
Landlord.setLandlord()
Rent.setRent()

View file

@ -0,0 +1,18 @@
Actor.setLivingWithPlayer(bool)
USE:
flags or unflags an actor as living with the player
TYPE: Command, Reference
RETURNS: /
THEME: Housing
COMPARE: livesWithPlayer
EXAMPLE:
"Since I have a spare room available and could do with the extra cash, I've agreed to sub-let it to a foreign exchange student."
Student = generatePerson(twenties)
Student::"Hello! Thank you for letting me stay here!"
Student.setLivingWithPlayer(true)
Roomie(Angry)::"I've had it with living in this pig sty! You never clean up after yourself!"
Roomie.setLivingWithPlayer(false)

View file

@ -0,0 +1,13 @@
Actor.setPT()
USE:
Make this person your personal trainer. Current personal trainer is no longer PT and becomes acquaintance.
TYPE: Command, Reference
RETURNS: /
THEME: Special Characters
COMPARE: losePT
EXAMPLE:
"<John.name> agreed to train me."
John.setPT()

View file

@ -0,0 +1,16 @@
FloatVar.setRent()
USE:
Set this as your current rent.
TYPE: Command, non-Ref (ref-like syntax)
RETURNS: /
THEME: Housing, Money
COMPARE: getRent, setLandlord, moveHome
EXAMPLE:
"I signed the contract."
moveHome()
Rent = 1000
Landlord.setLandlord()
Rent.setRent()

View file

@ -0,0 +1,16 @@
Floatvar.setSalary()
USE:
Set this as your current salary.
TYPE: Command, Non-Ref (ref-like syntax)
RETURNS: /
THEME: Job, Money
COMPARE: getSalary, moveJobs
EXAMPLE:
"I signed the contract."
moveJobs()
Salary = 2000
Interviewer.setBoss()
Salary.setSalary())

View file

@ -0,0 +1,14 @@
Actor.show(position_index)
USE:
Show this actor on screen. The player's default position is 0. 1 - 6 is counted from right to left of the screen.
TYPE: Command, Reference
RETURNS: /
THEME: Actor Loading, Scenes
COMPARE: hide, getSpecific, generatePerson, generatePersonTemporary, getPerson
EXAMPLE:
NewGuy = generatePerson()
NewGuy.dress()
NewGuy.show(2)

View file

@ -0,0 +1,13 @@
Actor.startDate()
USE:
Start hanging out with this person (make them your current companion)
TYPE: Command, Reference
RETURNS: /
THEME: Companions
COMPARE: endDate, isWithCompanion
EXAMPLE:
"I decided to hang out with <John.name> today."
John.startDate()

View file

@ -0,0 +1,13 @@
Actor.strip()
USE:
Strip this actor of all clothes
TYPE: Command, Reference
RETURNS: /
THEME: Clothes
COMPARE: dress
EXAMPLE:
Player.strip()
"I'm nude now ..."

View file

@ -0,0 +1,14 @@
timeout(hours, sceneid1, sceneid2, ..., sceneidN)
USE:
Timeout these scenes for x hours so that they won't trigger again. The number of hours is adjusted by the scene frequency setting however.
TYPE: Command, non-Ref
RETURNS: /
THEME: Scenes
COMPARE: timeoutprecise, timeoutActor, timeoutActorPrecise
EXAMPLE:
"I just met someone. I don't want to meet another person for a while."
timeout(20, meet_new_person) // could be more or less than 20 hours depending on the scene frequency setting

View file

@ -0,0 +1,18 @@
timeoutActor(hours, sceneID, Actor1, ..., ActorN)
USE:
Similar to timeout, except only for one particular scene. It puts a cooldown on the scene for x hours (adjusted by the scene frequency setting), but only for one or more specified actors, who won't get selected by the WHO condition of the scene.
TYPE: Command, non-Ref
RETURNS: /
THEME: Scenes
COMPARE: timeout, timeoutPrecise, timeoutActorPrecise
EXAMPLE:
Player(Angry)::"Stop calling me so many times a day!"
Contact(Offended)::"Uh... Ok, I guess. Catch you tomorrow, maybe?"
sceneEnd()
timeoutActor(24, call_invite, Contact)

View file

@ -0,0 +1,17 @@
timeoutActorPrecise(hours, sceneID, actor1, ..., actorN)
USE:
Combination of timeoutPrecise and timeoutActor. Puts a scene on cooldown for exactly the amount of hours specified, but limited to the stated actor(s) who will not pass the scene's WHO condition.
TYPE: Command, Reference
RETURNS: /
THEME: Scenes
COMPARE: timeout, timeoutPrecise, timeoutActor
EXAMPLE:
Friend(Happy)::"Well, I'm off to Barbados for a week. Bye!"
Player(Happy)::"Have a good time!"
sceneEnd
timeoutActorPrecise(156, call_invite, Friend)

View file

@ -0,0 +1,13 @@
timeoutPrecise(hours, sceneid1, sceneid2, ..., sceneidN)
USE:
Timeout these scenes for x hours so that they won't trigger again. The number of hours is fixed and not affected by the scene frequency setting.
TYPE: Command, non-Ref
RETURNS: /
THEME: Scenes
COMPARE: timeout, timeoutActor, timeoutActorPrecise
Example:
"I just celebrated my birthday."
timeoutPrecise(8760, birthday) // it will be my birthday again exactly this time next year

View file

@ -0,0 +1,26 @@
ForcedTrigger()
USE:
Returns whether a scene was force triggered with an action that has the SCENE_ALWAYS field filled (which overrides the conditions at the top of a scene). Use it to know if the scene was consciously triggered by the player or randomly triggered.
TYPE: Condition, non-Ref
RETURNS: bool
THEME: Scenes
COMPARE: sceneStart
EXAMPLE:
The "organize_a_house_party.lpaction" file has the following field filled:
SCENE_ALWAYS: house_party
And the house_party.lpscene consults it like this:
PlayerHosting = ForcedTrigger()
sceneStart()
If PlayerHosting
"My preparations are all done. It's time to welcome the guests!"
Player(Happy):: "Come in, everyone! Don't be shy. Everything's ready."
Else
"My phone rang! It's <Host.name>. I wonder what <Host.he_or_she> is calling me for?"
...
Endif

View file

@ -0,0 +1,14 @@
Tag(tag1, tag2, ..., tagN)
USE:
(Used for lpdesc and lptalk files) Check if the current animation contains ALL of the tags specified.
TYPE: Condition, non-Ref
RETURNS: bool
THEME: sex talk
COMPARE:
EXAMPLE:
Tag(Hugging, NonSexual, Couple)
// To check if the current animation contains ANY of the tags specified, use this instead:
Tag(Hugging) || Tag(NonSexual) || Tag(Couple)

View file

@ -0,0 +1,14 @@
Actor.isAffair()
USE:
Check if you have commited an affair with this actor while with your current boyfriend / girlfriend.
TYPE: Condition, Reference
RETURNS: bool
THEME: Relationships
COMPARE: forgiveAffairs
EXAMPLE:
If John.isAffair()
John(Flirty):: "Oh baby, your stupid boyfriend has no idea what we've done."
Endif

View file

@ -0,0 +1,14 @@
Actor.isAsexual()
USE:
returns true if the actor doesn't have any of the gender preferences "interested in male", "interested in female", or "interested in trans".
TYPE: Condition, Reference
RETURNS: bool
THEME: Gender Preference
COMPARE: isInterestedIn
EXAMPLE
If !Actor.isAsexual() && !Actor.isInterestedIn(Player) && Player.isMale()
"<Actor.name> is probably a lesbian."
Endif

View file

@ -0,0 +1,19 @@
isAtHome()
USE:
Check if the player is at their own home. Frequently used to separate 'WHERE: home' cases of the player being at home and being at their significant other's home.
TYPE: Condition, non-Ref
RETURNS: bool
THEME: Location
COMPARE: moveTo
EXAMPLE:
WHERE: home
....
If isAtHome()
"Home sweet home"
Else
"I must be at my boyfriend's house."
Endif

View file

@ -0,0 +1,14 @@
Actor.isBoss()
USE
Check if the actor is the player's boss.
TYPE: Condition, Reference
RETURNS: bool
THEME: Job
COMPARE: setBoss, moveJobs, getSpecific(Boss)
EXAMPLE:
If John.isBoss()
John(Angry):: "You're fired!"
Endif

View file

@ -0,0 +1,14 @@
Actor.isColleague()
USE:
Check if the actor is one of the player's colleagues.
TYPE: Condition, Reference
RETURNS: bool
THEME: Job
COMPARE: addColleague, removeColleague, getSpecific(Colleague)
EXAMPLE:
If John.isColleague()
John(Happy):: "Hey, wanna go for lunch?"
Endif

View file

@ -0,0 +1,17 @@
Actor.isContactExchanged()
USE:
Check if the actor has exchanged numbers with the player.
TYPE: Condition, Reference
RETURNS: bool
THEME: Acquaintance
COMPARE: blockContact, exchangeContact
EXAMPLE:
If John.isContactExchanged()
John(Happy):: "Well, you have my number. Just call me if you need anything else."
Else
John(Happy):: "Actually, why don't we exchange numbers. So that you'll know how to reach me if you need anything else."
exchangeContact(John)
Endif

View file

@ -0,0 +1,20 @@
Actor.isDating()
USE:
Check if the actor is in a relationship with the player.
Alternatively, if the Actor is Player then it checks whether the player is currently in a relationship at all.
TYPE: Condition, Reference
RETURNS: bool
THEME: Relationships
COMPARE: loseDating, setDating, getSpecific(Dating)
EXAMPLE:
If Player.isDating()
"I'm dating someone ..."
If John.isDating()
"And <John.name> is my <John.boyfriend_or_girlfriend>."
Else
"But my significant other isn't <John.name>."
Endif
Endif

View file

@ -0,0 +1,14 @@
Actor.isDatingFriend()
USE:
Check if the actor is a friend of your significant other
TYPE: Condition, Reference
RETURNS: bool
THEME: Acquaintance
COMPARE: addDatingFriend, removeDatingFriend, getSpecific(Dating_Friend)
EXAMPLE:
If John.isDatingFriend()
John(Happy):: "Nice to meet you at last, <Player.name>. <Dating.name> can't stop talking about you."
Endif

View file

@ -0,0 +1,14 @@
Actor1.isDominantSex(Actor2)
USE:
Check if the one actor would take a dominant role in a sexual relationship with another actor. This doesn't take into account sexual orientation. The rule is male is dominant to female, female with penis dominant to female with vagina. When it's male-male or female-female, it compares the masochist / submissive stat, the actor with lower masochist is dominant. Useful for mostly gender-related roles (opening doors, who walks who home etc)
TYPE: Condition, Reference
RETURNS: bool
THEME: Gender, Dominance
COMPARE: isMale, isSameGender
EXAMPLE:
If John.isDominantSex(Player)
"A <John.guy_or_girl> approached me and introduced <John.himself_or_herself> as <John.name>."
Endif

View file

@ -0,0 +1,14 @@
Actor1.isInterestedIn(Actor2)
USE:
Check if the one actor is interested sexually in another actor's gender. Does not take into account attractiontoplayer stat, just look at Actor1's sexual orientation and Actor2's gender.
TYPE: Condition, Reference
RETURNS: bool
THEME: Gender Preference
COMPARE:
EXAMPLE:
If John.isInterestedIn(Player)
"A <John.guy_or_girl> approached me and introduced <John.himself_or_herself> as <John.name>."
Endif

View file

@ -0,0 +1,14 @@
Actor.isLandlord()
USE:
Check if the actor is your landlord.
TYPE: Condition, Reference
RETURNS: bool
THEME: Housing
COMPARE: setLandlord, getSpecific(Landlord)
EXAMPLE:
If John.isLandlord()
John(Angry):: "Hey, there has been a noise complaint about you."
Endif

View file

@ -0,0 +1,14 @@
Actor.isMale()
USE:
Check if the actor is male.
TYPE: Condition, Reference
RETURNS: bool
THEME: Gender
COMPARE: isDominantSex, isSameGender, isInterestedIn
EXAMPLE:
If John.isMale()
"<John.name> is a dude!"
Endif

View file

@ -0,0 +1,17 @@
Actor.isMarried()
USE:
Returns true if the calling actor is married.
TYPE: Condition, Reference
RETURNS: bool
THEME: Relationships
COMPARE: isDating
EXAMPLE:
Parent = getRelative(Parent)
If Parent.isValid()
If !Parent.isMarried()
"Ever since my <Parent.mom_or_dad> left <Parent.o>, my <Parent.dad_or_mom> hasn't been the same."
Endif
Endif

View file

@ -0,0 +1,14 @@
isModEnabled(ModID)
USE:
Check if a mod, identified by its ID in its .lpmod file, is enabled.
TYPE: Condition, non-Ref
RETURNS: bool
THEME: Mods
COMPARE:
EXAMPLE:
If isModEnabled(vin_VanillaPorn)
"Some really silly porn plot is going to happen!"
Endif

View file

@ -0,0 +1,14 @@
Actor.isNeighbour()
USE:
Check if the actor is one of your neighbours.
TYPE: Condition, Reference
RETURNS: bool
THEME: Housing
COMPARE: addNeighbour, removeNeighbour, getSpecific(Neighbour)
EXAMPLE:
If John.isNeighbour()
John(Happy):: "Hey, I'm your neighbour. Nice to meet you!"
Endif

View file

@ -0,0 +1,14 @@
Actor.isPlayer()
USE:
Check if the actor is the player.
TYPE: Condition, Reference
RETURNS: bool
THEME: Identity
COMPARE: getID, isSameAs
EXAMPLE:
If John.isPlayer()
"Should have just use the variable Player!"
Endif

View file

@ -0,0 +1,20 @@
Actor.isRelative()
USE:
returns true if the calling actor is a relative of the player's
TYPE: Condition, Reference
RETURNS: bool
THEME: Family
COMPARE: getRelative, getRelativeExcept
EXAMPLE:
"Should I make a pass at <Actor.name>?"
0:: "Yes"
1:: "No"
If 0
If Actor.isRelative()
Actor(Disgusted):: "Ew, sick!"
Endif
Endif

View file

@ -0,0 +1,14 @@
Actor1.isSameAs(Actor2)
USE:
Check if the two actors are the same person
TYPE: Condition, Reference
RETURNS: bool
THEME: Identity
COMPARE: getID, isPlayer
EXAMPLE:
If John.isSameAs(Jack)
"They're the same dude!"
Endif

View file

@ -0,0 +1,14 @@
Actor1.isSameGender(Actor2)
USE:
Check if the two actors are the same gender
TYPE: Condition, Reference
RETURNS: bool
THEME: Gender
COMPARE: isMale, isDominantSex, isInterestedIn
EXAMPLE:
If John.isSameGender(Jack)
"They're both <John.male_or_female>."
Endif

View file

@ -0,0 +1,19 @@
Actor.isValid()
USE:
Check if an actor variable is valid. Most commonly used after GetPerson(), GetCompanion() or GetSpecific()
TYPE: Condition, Reference
RETURNS: bool
THEME: Actor Loading
COMPARE: getPerson, getSpecific
EXAMPLE:
John = getSpecific(Colleague)
If John.isValid()
"I have at least one colleague"
Else
John = generatePerson()
John.addColleague()
"I met a new colleague, <John.name>"
Endif

View file

@ -0,0 +1,14 @@
isWithCompanion()
USE:
Check if the player is currently hanging out with a companion.
TYPE: Condition, non-Ref
RETURNS: bool
THEME: Companions
COMPARE: getCompanion, startDate, endDate, "CurrentCompanion" global var
EXAMPLE:
If isWithCompanion()
"I'm currently with <CurrentCompanion.name>."
Endif

View file

@ -0,0 +1,18 @@
Actor.livesWithPlayer()
USE:
Returns true if the actor lives with the player, ie in the same apartment, not the same building (that'd be a neighbour).
TYPE: Condition, Reference
RETURNS: bool
THEME: Housing
COMPARE: isNeighbour
EXAMPLE:
Parent = getRelative(Parent)
if Parent.isValid()
if Parent.livesWithPlayer()
Player(Sad)::"I still live with my <Parent.dad_or_mom>."
endif
endif

View file

@ -0,0 +1,37 @@
CREATING ACTIONS
Actions are the activities you can choose from when you click on a building. You add them to your mod with an .lpaction file.
Let's look at an example:
ACTION_UNIQUEID: have_a_meal_in
ACTION_NAME: Have a meal
WHERE: home, work
WHEN: 5.30 - 22.30
MINUTES: 40 - 90
TIMEOUT_MINUTES: 180
ALSO_TIMEOUT: have_a_snack_in, have_a_snack, have_a_meal_in
EFFECTS: stock_meal -1 (START), mood +3 (END), energy +15 (DURATION), mood -1 (INTERRUPTED)
CONDITIONS: stock_meal >= 0.8 (STAT_COMPARE)
MOVE_FIRST: true
SCENE_ALWAYS:
ANIMATION:
1. ACTION_UNIQUEID is the ID for the action. Scenes use this to figure out if they should be triggered during this action or not.
2. ACTION_NAME is how the action is displayed in the list of choices for the building.
3. WHERE contains the locations where the action is available. See Docs/Modding/Lists/All_wheres.txt
4. WHEN contains a time range during which the action is available. This can also roll over from one day to the next: 22 - 4
5. MINUTES gives you a range to specify or randomize how long the action should take.
6. TIMEOUT_MINUTES makes it impossible to have the same action again for a specific number of minutes.
7. ALSO_TIMEOUT contains the IDs of other actions that should also time out for the time stated in TIMEOUT_MINUTES.
8. EFFECTS contains the effect the action should have on the player's stats. Different flags, between parentheses, mean different things here:
START: the effect is applied when the action begins
END: the effect is applied when the action ends
DURATION: the effect is gradually applied during the action. If the action is aborted early, that means part of the effect has been applied.
INTERRUPTED: the effect is applied when the action is interrupted
BUFF:minutes : this effect is applied for a certain amount of minutes, for example
attractiveness +5 (BUFF:300)
9. CONDITIONS contains additional conditions (beyond WHERE and WHEN) that need to be true for the action to be available. This is currently limited to checking the value of stats, marked with (STAT_COMPARE).
10. MOVE_FIRST contains a bool that checks if the player should be moved to the location first before performing the action.
11. SCENE_ALWAYS lists a scene ID that should immediately trigger when the action is started. It's best to limit this use to action files of your own, rather than modifications of someone else's.
12. ANIMATION lists animations that should play while the action lasts. Hardly any animations are available for this, but eg sleep.lpaction comes with such an anim.

View file

@ -0,0 +1,40 @@
CREATING PRESETS
1. Intro
Presets are used in scene scripts to create characters according to specific intel on body morphs, hair, skin, eyes, stats, gender and sexual preferences. They can also be used by players during character generation, or when they edit an existing character's appearance.
Character presets are really character files (.lpcharacter). The game creates such files for every character it generates, and stores them in Content/Saves, according to your save slot, whenever you perform a save. In the meantime, they're held in Content/Saves/_session.
2. Exporting from game
When you first create your character on starting a new game, you can choose to export it, at any time, to a file and folder of your choosing under Content/Modules. You can do the same when you edit an existing character via the Contacts menu.
When you export your own character, this happens before you can set your stats in the menu that follows, so stat information will not be entered into the file you create. Typically, it'll also only contain any information that deviates from the default character (Content/Saves/Default).
Full information for your, or any other character, can still be found in Content/Saves. Simply copy a file of a character from there to your mod's folder to be able to have a 'full' file.
3. Editing an .lpcharacter file
All intel fields in an exported file will have only 1 value, with a 100% chance of that value being true. After all, the character you made or edited, really did have that single value set on them.
If you want to use it as a preset, however, you may want to randomize certain information. You do this by
- replacing a single float value with a numeric range:
eg
SKIN Skin_Age: 100% 0.031212
can become
SKIN Skin_Age: 100% 0.4=>0.7
- replacing any single value by a weighted list of values:
eg
INFO Interested_In_Men: 100% false
can become
INFO Interested_In_Men: 70% false, 30% true
A lot of what's in an .lpcharacter file should be fairly easy to adjust:
- INFO and STAT shouldn't give you any problems
- skin, hair and eye color involve looking up RGB values somewhere and converting them to a float value between 0 and 1
- stipulating race, hair type, beard type etc may involve exporting a few different characters to figure out the ID of those things (or looking inside the game's content with the Unreal Editor)
The only thing that'll be hard to predict is probably the thing you're most likely to want to know more about: face and body morph data. I can't help you there. You'll need to see it in-game to know what works and what doesn't.

View file

@ -0,0 +1,27 @@
GETTING STARTED
LifePlay content is both moddable ('modification') and modular ('module'): even the 'official' content is really 'just a mod'.
A mod consists of a folder that goes into the LifePlay/Content/Modules folder.
At the very least it should contain an .lpmod file, which contains its basic meta-information:
MODULE_UNIQUEID: vin_NTR // unique ID for the mod, must match the mod folder's name under Content\Modules
MODULE_NAME: Official Netorare Module
MODULE_AUTHOR: Vinfamy
MODULE_LINK: www.loverslab.com
MODULE_DESCRIPTION: Netorare, cuckoldry, being cheated on - aka the most divisive fetish on the internet
MODULE_REQUIREMENTS: vin_VanillaRealistic // The UniqueID of mods that are needed in order for this one to work. If your mod refers to another's stats, actions, scenes etc, you need to fill this in.
The most easily moddable content consists of:
- Scenes, which are in .lpscene files. These are the virtual-novel type story situations that potentially lead to sex. See Docs/Modding/FullGuides/Writing_Scenes.txt
- Actions, which are in .lpaction files. These are the activities you can choose when you click on a building. See Docs/Modding/FullGuides/Creating_Actions.txt
- Descriptions, which are in .lpdesc files. These are the narrations that appear in the top right corner during a sex scene. See Docs/Modding/FullGuides/Writing_Sex_Text.txt
- DirtyTalks, which are in .lptalk files. These are dialogue lines floating near characters during sex scenes.See Docs/Modding/FullGuides/Writing_Sex_Text.txt
- Stats, which are in .lpstat files. They contain stats that the player and/or NPCs have, and are consulted in other file types. See Docs/Modding/ShortGuides/explanation.lpstat
- Characters, which are in .lpcharacter files. They are generated in-game when characters are created, and you can also export them when in the character creation menu. They can contain a variety of information. When placed inside a mod folder, they can be used as character presets by the player and by Scene scripts that generate or modify characters. See Docs/Modding/FullGuides/Creating_Presets.txt
It's definitely best to write and edit such files in a text editor that is good for coding and scripting. Avoid word processors such as Microsoft Word like the plague. These docs contain a syntax highlighter for Notepad++, so unless you prefer Atom or something, you should probably use NP++. It's free.
How you organize these files inside your own mod is really up to you. The vin_Base module's way of organizing them in folders by file type is a pretty good standard to follow though.
If two mods contain the exact same file in the same place, the one lowest in the load order wins. You can manage the load order in-game with the mod manager (ctrl-M).

View file

@ -0,0 +1,429 @@
1. Basics
2. Triggering a scene
3. Scoping
3.1. Creating a new actor
3.2. Loading an actor
3.3. Introducing the actor
3.4. Removing the actor
4. Main script
4.1. Descriptions and Dialogue
4.2. Functions
4.3. Variables and Stats
4.4. Choices
4.5. Conditions
4.6. Loops
4.7. Random
4.8. Commenting, Indentation
5. Testing
1. Basic structure
A 'scene' in the game is a virtual novel-type showing of characters with dialogue and choices, potentially leading to a sex scene. Scenes are built by a script in an .lpscene file, which is typically structured as follows:
// trigger conditions
WHAT:
WHERE:
WHEN:
WHO:
OTHER:
// some code can happen before the scene UI triggers
SceneStart() // brings up scene UI
// scene script goes here
SceneEnd() // closes scene UI, removes newly generated chars & sticks them back in their lpcharacters
timeout(200, sceneID) // cooldown on the scene appearing again
2. Triggering a Scene
At the top of the scene are a few fields where you can stipulate basic conditions for the scene to trigger randomly.
WHAT: sleep, masturbate
// lists the activities that can trigger the scene using their ID, separated by commas. See the 'Actions' folder of loaded modules to figure out which are available. Alternatively, you can use 'all' and exempt certain actions by prepending them with a - symbol:
// WHAT: all, -sleep
// If you don't want to put anything here, add 'none'
// WHAT: none
WHERE: home, office
// lists locations that trigger the scenes. See the Docs/Lists/All_wheres.txt for locations. You can also use all and -home, for instance, as with WHAT.
// If you don't want to put anything here, add 'none'
// WHERE: none
WHEN: 9-21
// time periods when scene is available, can roll over a date transition (22-4)
WHO: Actor = getSpecific(Dating)
// Assigns an actor id to the "actor" variable. This variable can be named whatever, and is simply a way of knowing if an actor with the specific scope is available and immediately being able to refer to them in the rest of the script. See 3.: scoping. Multiple actors can be introduced, separated by a semi-colon:
// WHO: Dating = getSpecific(Dating); Affair = getSpecific(Affair); Actor = getSpecific(Dating_Friend)
// Additional conditions depending on the actor(s) can be added after this with a semi-colon and a leading 'If', like
// WHO: Actor = getSpecific(ExDating); If !Actor.isContactExchanged() && Random(20,100) < Actor:rapportwithplayer
// If the game fails to find an appropriate actor or if the following If-condition returns false, the scene will be skipped.
// If you don't want to put anything here, just add 'none'
// WHO = none
OTHER: !isWithCompanion
// other conditions
Alternatively, you can bypass these trigger conditions if you enter the name of the scene to the SCENE_ALWAYS field of an action file. For an example in the base game, see
Modules/vin_Base/Actions/Social/organize_a_house_party.lpaction
Modules/vin_Base/Scenes/Social/house_party.lpscene
house_party can still trigger randomly, but if you organize it yourself, it immediately triggers. In order to know if it was force-triggered or not, to make sure your text and code can follow up on that, you can use the ForcedTrigger condition.
3. Scoping
Scoping is necessary for any scene involving more than the player. It winds down to either creating a new actor or finding an existing one, and then storing their ID in a variable for use in the scene.
Scoping can happen inside or outside the main script, as well as in the WHO condition on top.
3.1. Creating a new actor
There are two ways of creating a new actor to introduce to your player's life: a permanent one and a temporary one.
GeneratePerson() creates an actor who will stay in your game permanently, and assigns their actorID to the variable you call the function on:
ActorVar = GeneratePerson()
Between those parentheses, you can specify any actor presets you want to use (see the Presets folder of the modules). For instance, if you want to create a bodybuilder male, you type:
ActorVar = GeneratePerson(bodybuilder)
You can combine presets too:
ActorVar = GeneratePerson(easterneuropean, twenties, fitness_model)
While this already gives you some control over who is created, it might not be enough. Certain data such as gender preference and most actor stats is entirely randomized on creation, so you may need to create a few actors before you land on the right person. Or you may simply want to create an actor who's only needed for the duration of the scene, but shouldn't stay in your game permanently.
GeneratePersonTemporary() creates such a non-permanent actor, and uses the same presets as GeneratePerson. Sex with temporary actors doesn't count as an affair.
For example, if you want to only generate an actor who's interested in your gender, you could use a while loop to generate temporary actors until you find the right one:
ActorVar = GeneratePersonTemporary()
While !ActorVar.isInterestedIn(Player)
ActorVar = GeneratePersonTemporary()
EndWhile
After that, you can still make the temporary actor permanent, by using the makePermanent function:
ActorVar.makePermanent()
And it's possible that you want to apply a preset to a person after they're already generated:
ActorVar.blendPreset(bodybuilder)
When you do so, however, their face and hair will most likely be set to the default for that preset, causing some repetition. You can mix things up a little with:
ActorVar.randomizeFace()
ActorVar.randomizeHairs()
3.2. Loading an actor
In order to find a (permanent) actor to use in your scene, you have the following options:
- "Player" is you. Yes, you! "Player" is a special global var that always contains the player's actorID.
- "CurrentCompanion" is a special global var that'll always hold your current companion's ID so you can use it right away. Its function counterpart is getCompanion, which is largely pointless.
CurrentCompanion.dress()
is the same as
ActorVar = getCompanion()
ActorVar.dress()
- getPerson() gets a random actor.
ActorVar = getPerson() // get a random, permanent actor
ActorVar = getPerson(true) // get a random actor whose number you have
ActorVar = getPerson(false) // get a random actor whose number you don't have
- getSpecific() gets a specific actor. You can stipulate which actor by
- keyword: Dating (bf/gf), Dating_Friend (friend of your bf/gf), Boss, Colleague, Neighbour, PT (personal trainer), ExDating (ex-bf/gf), Landlord, CurrentBabyDaddy (father of player's unborn child), Impregnated (carrying player's child)
- ID: every actor has a reference number that you can get with the getID() function. You can store it in a global var and look it up later in order to find them back again:
ID = ActorVar.GetID // 'ID' is a local var
MySpecialNPC.SetGlobal(ID) // there now is a 'MySpecialNPC' global var with the value previously stored in 'ID'
and then in another script:
ID = MySpecialNPC.GetGlobal()
if ID != 0
Actor = getSpecific(ID)
endif
3.3. Introducing the actor
Once you have an actor selected for your scene, chances are you want him or her to actually show up:
Actor.show()
Perhaps they should be dressed first though, so let's type
Actor.dress()
Actor.show()
You can specify where on the screen the actor is to show up with a number, stating their position, from right to left:
Actor.show(2)
3.4. Removing the actor
Once you no longer need or want an actor in the scene, you can remove them:
Actor.hide()
When the scene ends, all actors are removed from the scene UI automatically.
4. Main script
The main script will typically consist of a sequence of descriptions and dialogue, functions, operators, and choices. Everything is written and read from top to bottom.
Its structure is usually given shape with 'if'-conditions, and sometimes 'while'-loops or 'Random' structures.
4.1. Descriptions and Dialogue
Scene descriptions provide narration and are added between double quotation marks:
"I heard a knock on the door. I wonder who it is."
Dialogue is also between double quotation marks, but is preceded by the actor speaking it:
Player:: "Oh, it's you, <Actor.name>. What a shame though, <Dating.name> just went out and won't be back for another few hours."
Actor(Happy):: "Yes, I know. <Dating.S> told me."
As you can tell, you can direct the emotion of the actor by inserting a "mood" keyword in parentheses after the actor. A list of available mood keywords is in Docs/Lists/All_moods.txt.
Both scene descriptions and dialogue can dynamically insert text based on an actor var. This is called interpolating, and is marked by < >.
<Actor.name> // Actor's first name
<Actor.name_last> // Actor's last name
<Actor.relationship> // Player's family relationship to the actor
<Actor.callplayer> // Actor's family relationship to the Player
<Actor.S> or <Actor.s> // Subject pronoun: I, he, she - with or without capitalization
<Actor.P> or <Actor.p> // Possessive adjective: my, his, her
<Actor.O> or <Actor.o> // Object pronoun: me, him, her
<Actor.R> or <Actor.r> // Reflexive pronoun: myself, himself, herself
<Actor.PP> or <Actor.pp> // Possessive pronoun: mine, his, hers
In order to choose between other words to inject, based on the actor's gender, you park them between _or_:
<Actor.name> is a successful <Actor.man_or_woman>.
If you've stored a string in a var, you can also use that:
myGift = "chocolates"
herPref = "flowers"
"I gave her <myGift> but she said she preferred <herPref>."
4.2. Functions
All existing functions are listed in /Docs/Modding. Each file under Docs/Modding/Command_Functions and Docs/Modding/Condition_Functions describes the use of a single function.
If you're unsure what you're looking for, consider using the Lists/Functions_By_Theme.txt file, which groups functions according to the context in which they're used.
Let's go over what's typically in one of them.
- The top line is a short example showcasing the function's syntax.
Actor.addColleague()
- USE: this field describes what the function is for.
- TYPE: this field tells you what kind of function it is. Eg a command or a condition, a reference function (meant to run on an actor) or not.
- RETURNS: if the function returns a data type, this field will tell you which one.
- THEME: keywords describing the context in which this function is used (see Lists/Functions_By_Theme.txt)
- COMPARE: other functions relevant to this one
- EXAMPLE: an example in context
4.3. Variables and Stats
Three types of variables are available:
- local ones you use in the script
- global ones you use with the getGlobal and setGlobal functions
- actor stats
Local variables can be added at any point by simply assigning them a value with "=". You don't need to declare them first. The values can be numbers, actorIDs, boolean (true/false), as well as strings:
Choices = 7 // stores number
Friend = getPerson(true) // stores actorID
Dating = Friend.isDating() // stores true or false
DateType = "Hang Out" // stores string, this can be injected in a description or dialog: "<DateType> with <Friend.name>"?
Global variables are stored outside of the script and can be consulted in any other script. You create them by giving them a name and setting them to a value (either explicit or contained in a local var):
myGlobalVarName.setGlobal(5)
myGlobalVarName.setGlobal(myLocalVar)
They are consulted by passing them to a local var:
myLocalVar = myGlobalVarName.getGlobal()
You delete them like this:
myGlobalVarName.clearGlobal()
Actor stats are added to the game with separate .lpstat files in the module (/"Stats"). They are consulted on an actor by connecting the actor var with the actor stat's ID with a colon:
if 20 > actorA:perversion
attr = actorB:attractiveness
If you don't specify the actor, the game will assume you mean to check the stat on the player:
if 30 < perversion
is the same as
if 30 < Player:perversion
Unlike local vars, you cannot assign a value to actor stats with '=' but must use '=>' instead:
actorA:attractiontoplayer => 20
Local numeric and actor variables can be easily manipulated with 'assignment operators', setting their value to the result of a calculation involving themselves:
somefloat += 1 // the same as somefloat = somefloat + 1
somefloat -= 2
actor:somestat *= 0.8
actor:somestat /= 2
4.4. Choices
If you want to give the player a choice between several options on how to proceed further in the scene, you set them up with consecutive integers starting with 0, followed by two colons:
SO = getSpecific(Dating)
"<SO.name> has hardly spoken a word all night. What do I do?"
0:: "Enjoy the peace and quiet."
1:: "Tell a joke"
2:: "What's wrong, <SO.name>?"
You can also make certain choices only selectable if they meet a certain condition:
0:: masochism < -20:: "Enjoy the peace and quiet."
1:: interpersonal > 30:: "Tell a joke."
2:: "What's wrong, <SO.name>?"
Make sure that one option is always selectable so that the player doesn't get stuck. In order to follow up on these choices, you're going to need if-conditions.
4.5. Conditions
Conditions make sure that certain code is only executed under certain circumstances. Conditions are already part of the top triggers of a scene, the triggers of an action file, or choices, but you can also add some in the main script with an if-structure.
If-structures are useful for any kind of branching that you want to see in the scene, and essential to follow up on previous choices:
If 0
SO(Angry)::"You never pay any attention to me!"
Elseif 1
SO(Happy)::"You always know how to cheer me up."
Else
SO(Disgusted)::"Well I met <Frenemy.name> today and would you believe she had the nerve to tell me that..."
Endif
If-structures are organized as follows:
If conditionA // opens the if-structure
// lines dependent on conditionA being true
Elseif conditionB // optional elseif
// lines dependent on conditionA being false but conditionB being true
... // there can be multiple elseifs, each one assuming that the conditions above are false
Else // optional else: there can be only one
// lines dependent on all of the conditions above being false
Endif // closes the structure
They can also be nested:
If conditionA
If conditionAA
Elseif conditionAB
Endif
Elseif conditionB
if conditionBA
Else
Endif
Endif
Apart from conditions following up on choices, any condition is always boolean: it only evaluates whether the entire expression that follows is true or false.
To make certain that your expression will be valid for a condition, it should contain either
- (boolean) condition functions, which return 'true' or 'false'
If Actor.livesWithPlayer()
If isWithCompanion() etc.
In order to check the reverse of a boolean function, you prepend it with the not symbol (!):
!Actor.liveswithPlayer()
- vars containing 'true' or 'false' as a value
If conditionA
breakup = true // assigns 'true' to the variable
Else
breakup = false
Endif
...
If breakup // var's value returns true or false, so this is a valid expression
Endif
- comparison operators that check the value of a variable or stat against another value or var/stat
If MyLocalVar > Actor.interpersonal // greater than
Elseif attractiveness < 20 // smaller than
Elseif MyLocalVar != 0 // not equal to
Elseif Actor.intelligence == 60 // equal to
Elseif perversion >= 30 // greater than or equal to
Elseif Actor.intelligence <= 20 // smaller than or equal to
Endif
- a combination of the above, held together with logical operators:
&& means AND:
If Actor.isMale() && Actor.isDating()
"<Actor.name> is my boyfriend."
Endif
|| means OR:
If Actor.isColleague() || Actor.isBoss()
"It was odd seeing <Actor.name> outside of work."
Endif
OR takes precedence over AND, so the following
If Actor.isColleague() && Actor.isMale() || Actor.isBoss()
is only true if the actor is
either male or your boss
AND a colleague
which, given how colleagues and bosses are different groups, means that it will never be true for your boss. You probably meant for the condition to always and only be true for either bosses or male colleagues.
If so, you can use brackets [] to override the hierarchy:
If [Actor.isColleague() && Actor.isMale()] || Actor.isBoss()
It's never a bad idea to add brackets, if only just for readability.
Just like with boolean functions, any expression inside brackets can be preceded by the NOT operator: !
If ![Actor.isColleague() && Actor.isMale()]
4.6. Loops
A while-loop repeats code and lines as long as the conditional expression that follows 'while' is true:
While intoxication < 80
Creep(Grin)::"Can I ply you with another drink?"
Player(Happy)::"Sure, I can do with another..."
intoxication += 10
endWhile
Player(Drained)::"I think I've had far too many..."
For another example on using while-loops, refer back to 3.1.
The most important thing to know about a while loop is that you must absolutely make sure that it isn't infinite. If the expression has no chance of ever becoming false, the loop will just keep excuting what's inside it forever, which usually results in crashing the game.
While Player.isPlayer()
// crash: the player is always going to be the player
endWhile
While 30 > attractiveness
// crash if attractiveness isn't increased inside the loop
endWhile
4.7. Random
You can randomize code and text lines by placing them between a Random and endRandom block, giving each code or text line an equal chance of being displayed:
Random
New_Person(Flirty):: "Hey there good-looking, fancy meeting you here!"
New_Person(Flirty):: "<Player.name>! Is that you, a sight to admire as always? How is it going?"
New_Person(Flirty):: "I knew it was you right away, hottie! How is life treating you?"
endRandom
Random
Guest1 = getPerson()
Guest1 = generatePerson()
endRandom
4.8. Commenting, Indentation
You can comment out a line by prepending it with a double slash
// This is a comment: it won't be executed by the game, but helps you keep track of what parts of the script are supposed to do
If conditionA // what's behind this double slash is also a comment
Indentation makes the overall structure easier to follow, and has been used throughout this document already:
If conditionA
// some code doing something
If conditionAA
// some more code here
Else
// why not here too
Endif
Endif
While most people are used to using the Tab key for indentation, there seems to be a problem with getting LifePlay files to recognize them. If you're using a proper text editor, you can find an option to convert Tabs to clusters of spaces. For Notepad++, that's in Edit/Blank Operations/TAB to Space. Just run it when you're done.
5. Testing
Once you're done with a scene, you'll probably want to give it a try and see if it works. Rather than waiting for it to trigger randomly, you can
- open the console with #
- type in the scene's ID, eg meet_new_person
A scene's ID is its file name, without the extension.
If the # key doesn't work for you, you can specifiy a different one in the game's Config/DefaultInput.ini file. Find and edit the following line:
+ActionMappings=(ActionName="TestScenes",Key=#,bShift=False,bCtrl=False,bAlt=False,bCmd=False)

View file

@ -0,0 +1,114 @@
WRITING SEX TEXT
Descriptions are narrative flavor texts that appear at the top right corner of the screen during a sex scene. They are entered in .lpdesc files in the following format:
Condition
Text
## // separates this description from the following one
DirtyTalks are dialogue lines floating near a character during a sex scene. They are entered in .lptalk files in the following format:
Condition
A1's text
A2's text
// and so on for group sex
## // separates this DT from the following one
Writing or editing these is pretty much alike, so we talk about them in one and the same document. They both are very reliant on using Tags in the condition, have to consider actor roles, and can use interpolation.
1. The conditions
The condition line for descriptions and dirtytalks heavily uses the Tag() condition function. This lists one or several tags that must be true for the current animation, if the text is to be displayed. A list of available tags is in Docs/Modding/Lists/All_sex_tags.txt
description:
Tag(Kneeling, Hugging, Couple)
<A2.name> got down on <A2.p> knees and tied <A1.name>'s shoe.
##
dirtytalk
Tag(Kneeling, Hugging, Couple)
Christ almighty, that feels so good!
(muffled) Hm-hm?
##
Several conditions can be tied together with the AND (&&) or OR (||) logical operators. A conditional expression can also be negated by the NOT (!) operator. For more info on using logical operators, have a look at chapter 4.5 in "Writing Scenes.txt"
Tag(Doggystyle) || Tag(ReverseCowgirl)
<A2.name> couldn't quite see the look on <A1.name>'s face.
##
Tag(DoggyStyle) || Tag(ReverseCowgirl)
... // use three dots to not display anything for this actor
Are you alright back there?
##
Tag(Hugging, Couple) && !Tag(MM)
<A1.name> placed <A1.p> hands on <A2.name>'s shoulders.
##
Tag(Hugging, Couple) && !Tag(MM)
Honk honk!
Real mature...
##
Descriptions and DirtyTalks can be marked to only play when a particular anim starts or ends:
*START* Tag(Kissing, Couple)
<A2.name> took <A1.name>'s hand and smiled.
##
*END* Tag(Standing, Couple) && toCum > 90
Oh god, I can't wait!
Yes, yes, stay close!
##
Conditions in descriptions and dirtytalks aren't limited to Tag alone, and most of what's said in chapter 4.5 of "Writing Scenes" applies here too (except for the if-structure):
*START* Tag(Kissing, Kneeling) && [30 > [A2:attractiveness - A1:attractiveness] ]
<A1.S> couldn't believe that a <A2.man_or_woman> as <A2.handsome_or_gorgeous> as <A2.name> was on <A2.p> knees before <A1.o>
Finally, a special variable is available in sex scenes, which corresponds to the arousal meter: toCum. See an example above.
2. Actor roles
Conditions, and the text of descriptions, refer to the actors involved with pre-determined actor variables: A1, A2, and so on. The sequence of lines of a dirtytalk also follows this order.
So, how do you know which actor's going to be which?
Generally, when a sex scene is started in a narrative scene script with the Sex() command, the actors to use are stated as parameters.
Sex(Boss, Player)
Sex(Male1, Player, Male2)
This will rarely affect the roles that are assigned, except perhaps for threesomes: Sex(Male1, Player, Male2) will not be the same as Sex(Male2, Player, Male1).
The default ordering happens
- first, by gender: males are assigned a role before transsexuals, who come before women
- between same genders, by dominance: same-gender actors with a lower submission stat come first
So a foursome with two guys, a transsexual and woman would be ordered like
A1: most dominant male
A2: least dominant male
A3: transsexual
A4: female
Of course, we need to bear in mind that the player can swap roles at any time.
A common pitfall in writing descriptions and dirtytalks is to wind up talking about body parts that the actors simply don't have. This can be due to
- incorrect tag use (eg 'Couple' instead of 'MF')
- not anticipating a particular actor role order or the possibility of role swaps
- using actual words where interpolation would've been better
3. Interpolation
As you can tell by previous examples, you can use specific in-text functions between < > to insert text based on the actor's names, whether an actor is the player, or the actor's gender. We call this interpolation, and it is very similar to how it works in narrative scenes (see 4.1. of "Writing Scenes").
Available functions:
<A1.name> // A1's first name
<A1.name_last> // A1's last name
<A1.S> or <A1.s> // Subject pronoun (I, he, she), with or without capitals
<A1.P> or <A1.p> // Possessive adjective (my, his, her)
<A1.O> or <A1.o> // Object pronoun (me, him, her)
<A1.R> or <A1.r> // Reflexive pronoun (myself, himself, herself)
<A1.PP> or <A1.pp> // Possessive Pronoun (mine, his, hers)
In addition, you can always insert any choice of two words, depending on an actor's gender, by placing them around _or_ :
<A1.Mr_or_Mrs> <A1.name_last> is a very attractive <A1.man_or_woman>.
and if you don't use that 'on' an actor, it'll be based on whether the player is involved in the scene:
<We_or_They> had the time of <our_or_their> lives.

View file

@ -0,0 +1,37 @@
These are used in dialogue like below:
Player(Happy):: "Hello!"
Replace 'Happy' with any of the below:
Angry
Annoyed
Anxious
Attentive
Bored
Confused
Crying
Curious
Disgusted
Drained
Embarassed
Evil
Excited
Flirty
Furious
Grin
Irritated
Kiss
Lazy
Offended
Pain
Peaceful
Posing
Sarcastic
Scared
Serene
Shocked
Shy
Surprised
Wink
Sad
Happy
Tired

Some files were not shown because too many files have changed in this diff Show more