Dev:SDK/Core - XML Slaves

From Slavemaker Wiki
Jump to: navigation, search
<<first <prev SDK/Core - XML Slaves next> last>>


Every slave and assistant has an optional XML file that can be used to initialise their variables, show introductions and even show images.

See Dev:SDK/Core - XML Events - Common for a general overview of xml in the game and file locations

XML File[edit]

Slaves All slave specific xml is stored in files like Slave-Aeris.xml These files are optional.

For translation copy this file and create for Russian Slave-Aeris-Russian.xml and similarly for other languages. Note these are in the same folder, not a subfolder like above.

Note for translations you again do not need to repeat nodes that are not changed, like stats or other numeric nodes. These can be deleted from the translated version.

All data in the slave's XML file are structured in general as

<Language>
        <Slave>
        </Slave>
       
        <Assistant>
        </Assistant>

        <Events>
        </Events>

        <Planning>
                <Acts>                 
                        <DoPlanning>                           
                        </DoPlanning>
                </Acts>
        </Planning>
       
</Language>

All the nodes are optional, but if you do not implement the Slave or Assistant node you need to implement the equivallent in actionscript code in the StartGame(), Initialise() and InitialiseAsAssistant() functions

Initialisation (as a slave)[edit]

All slave variables can be initialised in the <Slave> node. Some are only checked when a new game is started and others also when a game is loaded. The game automatically decides which variables to load at which time. In most cases the name of the tag is the same as an existing variable in this SDK

A few variables are clearly for start game only, particularly those for the introduction screens.

Each value is defined as an XML Tag with value eg

<Name>Elesa</Name>

This is the tag Name and defines the slave's name.

Each will have attributes of element data. Some have special meaning

  • conditionals - a set of <if> attributes
  • expression - a calculated expression,

eg

constitution + charisma
-1 * smlust
10
  • string - a single line string, leading and trailing whitespace is removed
  • boolean - values of true or false

eg

<VirginOral>true</VirginOral>
  • number - a constant number

eg

<Price>200</Price>

NOTE: most of these tags/variables are optional. If they are not present then they will be set to their default values. Mandatory ones are noted.

MANDATORY for pure XML slaves - this means the variable is manfatory for a slave like Mai or Mihoshi where all image and functionality is in the xml, and they use the generic swf file Slave-GenericSlave.swf.

Start of Game Only[edit]

General Variables These appear in the base <Slave> node and are only checked by the game when the slave starts being trained

<Name>string</Name> MANDATORY
The slave's name.
sdk variable: SlaveName
default: none
<Folder>string</Folder> MANDATORY for pure XML slaves
The relative path to the folder containing the images for the slave. This is relative to the location of SlaveMaker.exe/SlaveMaker.swf. Use / in the path, not Windows type \
sdk variable: SlaveFolder
default: none

eg

        <Folder>Images/Mai</Folder>
<Price>number</Price>
The purchase price for the slave when purchased by a Freelance Slave Maker
sdk variable: Price
default: 200
<Gender>number or string</Gender>
Values 1-6 (see Core - Variables.rtf) or male, female, dickgirl, male twins, female twins, dickgirl twins
sdk variable
SlaveGender
default
2 (female)

eg

        <Gender>3</Gender>

or

        <Gender>dickgirl</Gender>

Note hermaphrodite can be used interchangably with dickgirl eg

        <Gender>hermaphrodite twins</Gender>
<GenderBorn>number or string</GenderBorn>
The gender the slave was born. Same values as <Gender>
sdk variable: SlaveGenderBorn
default: SlaveGender
<Image>filename</Image> MANDATORY for pure XML slaves
The filename for the image shown in the Participant selection screen.
sdk variable: SlaveImage
default: none

eg

        <Image>Images/Mai/Chore - Discuss 1.jpg</Image>
<Available conditionals />
A comditional to determine if the slave is available for training
sdk variable
Available
default
true

eg

        <Available renown="80+" ponytrainer="2+"/>
<CustomFlag>expression</CustomFlag>
Set the initial value for a custom flag to the result of an expression
sdk variable: CustomFlag
default: -1

eg

        <CustomFlag>0</CustomFlag>

sets the initial value to 0 ie CustomFlag = 0;

<CustomFlag1>expression</CustomFlag1>
Set the initial value for a custom flag
sdk variable
CustomFlag1
default
-1
<CustomFlag2>expression</CustomFlag2>
Set the initial value for a custom flag
sdk variable: CustomFlag2
default: -1
<CustomFlag3>expression</CustomFlag3>
Set the initial value for a custom flag
sdk variable: CustomFlag3
default: -1
<CustomFlag4>expression</CustomFlag4>
Set the initial value for a custom flag
sdk variable: CustomFlag4
default: -1
<CustomFlag5>expression</CustomFlag5>
Set the initial value for a custom flag
sdk variable: CustomFlag5
default: -1
<CustomFlag6>expression</CustomFlag6>
Set the initial value for a custom flag
sdk variable: CustomFlag6
default: -1
<CustomFlag7>expression</CustomFlag7>
Set the initial value for a custom flag
sdk variable: CustomFlag7
default: -1
<CustomFlag8>expression</CustomFlag8>
Set the initial value for a custom flag
sdk variable: CustomFlag8
default: -1
<CustomFlag9>expression</CustomFlag9>
Set the initial value for a custom flag
sdk variable: CustomFlag9
default: -1
<CustomString>string</CustomString>
Set the initial value for a custom flag
sdk variable: CustomString
default: ""
<VirginVaginal>boolean</VirginVaginal>
Is the slave a virgin (in her pussy for females, for males have they fucked ever before)
sdk variable: VirginVaginal
default: false
<VirginAnal>boolean</VirginAnal>
Is the slave a virgin (in their ass)
sdk variable: VirginAnal
default: false
<VirginOral>boolean</VirginOral>
Is the slave a virgin of oral sex
sdk variable: VirginOral
default: false
<Sexuality>boolean</Sexuality>
The slaves sexuality
sdk variable: Sexuality
default: 100
<Bust>number</Bust>
The circumference of your slave's bust in centimeters
sdk variable: vitalsBust
<Waist>number</Waist>
The circumference of your slave's waist in centimeters
sdk variable: vitalsWaist
<Hips>number</Hips>
The circumference of your slave's hips in centimeters
sdk variable: vitalsHips
<Age>number</Age>
The slave's age in years
sdk variable: vitalsAge
<Weight>number</Weight>
The slave's weight in kilograms
sdk variable: vitalsWeight
<Height>number</Height>
The slave's height in centimeters
sdk variable: vitalsHeight
<ClitCockSize>number</ClitCockSize>
The size of the slaves clit in centimeters. If your slave has a cock this is the size of their cock * 30 in centimeters
sdk variable: ClitCockSize
default: 0.6
<BloodType>string</BloodType>
The slave's blootype (O, A, B, AB)
sdk variable: vitalsBloodType
default: O
<Description>string</Description> MANDATORY
A short description of your slave like "The angry girl"
sdk variable: vitalsDescription
<IntimacyOK>boolean</IntimacyOK>
For minor slaves and assistants only. Will they do sex acts or assist in sex trainings
sdk variable: IntimacyOK
default: true
<Path1>number</Path1>
This is a general variable for 3 possible paths of development
sdk variable: Path1
default: 0
<Path2>number</Path2>
This is a general variable for 3 possible paths of development
sdk variable: Path2
default: 0
<Path3>number</Path3>
This is a general variable for 3 possible paths of development
sdk variable: Path3
default: 0
<Slutiness>number</Slutiness>
How much of a slut is the slave
sdk variable: Slutiness
default: 1
<Loyalty>number</Loyalty>
How loyal the slave is (0 completely)
sdk variable: Loyalty
default: 6
<FairyXF>number</FairyXF>
Progress of her fairy transformation 0-100, 1000-complete
sdk variable: FairyXF
default: -1
<PonygirlInterest>number</PonygirlInterest>
Level of Ponygirl Trainer needed to train as a ponygirl
sdk variable: PonygirlInterest
default: 1
<LesbianInterest>number</LesbianInterest>
Level of Lesbian Trainer needed to train as a lesbian
sdk variable: LesbianInterest
default: 1
<CatgirlInterest>number</CatgirlInterest>
Level of Catgirl Trainer needed to train as a catgirl
sdk variable: CatgirlInterest
default: 1
<SuccubusInterest>number</SuccubusInterest>
Level of Succubus Trainer needed to train as a succubus
sdk variable: SuccubusInterest
default: 1
<TrainingTime>
sdk variable: TrainingTime
<MaxTentacleHarem>
sdk variable: MaxTentacleHarem
<IntroPages>
sdk variable: IntroPages
<Available>
Is the slave available in the Slave Market
sdk variable: Available

Statistics[edit]

The following appear in the subnode of the base slave node <Statistics> Following are MANDATORY Well, sort of, all statistics default to 0 if not supplied

<Statistics>
        <Charisma>20</Charisma>
        <Sensibility>10</Sensibility>
</Statistics>
<Charisma>number</Charisma>
sdk variable: VarCharisma
<Sensibility>
sdk variable: VarSensibility
<Refinement>
sdk variable: VarRefinement
<Intelligence>
sdk variable: VarIntelligence
<Morality>
sdk variable: VarMorality
<Constitution>
sdk variable: VarConstitution
<Cooking>
sdk variable: VarCooking
<Cleaning>
sdk variable: VarCleaning
<Conversation>
sdk variable: VarConversation
<Fitness>
sdk variable: FatigueBonus
<BlowJob>
sdk variable: VarBlowJob
<Fuck>
sdk variable: VarFuck
<Temperament>
sdk variable: VarTemperament
<Nymphomania>
sdk variable: VarNymphomania
<Obedience>
sdk variable: VarObedience
<Lust>
sdk variable: VarLibido
<Reputation>
sdk variable: VarReputation
<Fatigue>
sdk variable: VarFatigue
<Joy>
sdk variable: VarJoy
<LovePoints>
sdk variable: VarLovePoints

Following are OPTIONAL

<Special>
sdk variable: VarSpecial
<Cunnilingus>
sdk variable: VarCunnilingus
<LesbianFuck>
sdk variable: VarLesbianFuck
<MaxFuck>
sdk variable: MaxFuck
<MaxBlowJob>
sdk variable: MaxBlowJob
<MaxObedience>
sdk variable: MaxObedience
<Deficiency>
A specified statistic increases at 50% of the normal rate
  • charisma
  • sensibility
  • refinement
  • intelligence
  • morality
  • constitution
  • cooking
  • cleaning
  • conversation
  • blowjob or blowjobs
  • fuck or fucking
  • temperament
  • nymphomania
  • obedience
  • lust
  • fatigue or tiredness
  • joy
  • special

eg

<Deficiency>charisma</Deficiency>
<NaturalTalent>
A specified statistic increases at 150% of the normal rate
  • charisma
  • sensibility
  • refinement
  • intelligence
  • morality
  • constitution
  • cooking
  • cleaning
  • conversation
  • blowjob or blowjobs
  • fuck or fucking
  • temperament
  • nymphomania
  • obedience
  • lust
  • fatigue or tiredness
  • joy
  • special

eg

<NaturalTalent>constitution</NaturalTalent>

Skills[edit]

The following appear in the subnode of the base slave node <Skills>

<Singing>number</Singing>
sdk variable: slSinging
default: 0
range: 0 to 5
<Dancing>number</Dancing>
sdk variable: slDancing
default: 0
range: 0 to 5
<Swimming>number</Swimming>
sdk variable: slSwimming
default: 0
range: 0 to 5
<Combat name="?????">number</Combat>
sdk variable: slCombat
default: 0
range: 0 to 100

eg

<Skills>
        <Swimming>1</Swimming>
        <Combat name="Martial Arts">20</Combat>
</Skills>

Difficulties[edit]

The following appear in the subnode of the base slave node <Difficulties>

All these should have the range 0 to 300 and default to 0. They are used the same as a simple number node eg

<Difficulties>
        <XXX>40</XXX>
        <XXXContest>40</XXXContest>
</Difficulties>
<XXX>
Difficulty to attend the XXX School
sdk variable
DifficultyXXX
<XXXContest>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyXXXContest
<Expose>
Difficulty to do the 'Expose Herself' Chore
sdk variable: DifficultyExhib
<SleazyBar>
Difficulty to work in the Sleazy Bar
sdk variable: DifficultySleazyBar
<Brothel>
Difficulty to work in the Brothel
sdk variable: DifficultyBrothel
<Touch>
Difficulty to do the Touch Her sex act
sdk variable: DifficultyTouch
<Lick>
Difficulty to do the Lick Her sex act
sdk variable: DifficultyLick
<Fuck>
Difficulty to do the Fuck sex act
sdk variable: DifficultyFuck
<Blowjob>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyBlowjob
<TitsFuck>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyTitsFuck
<Anal>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyAnal
<Dildo>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyDildo
<Plug>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyPlug
<Lesbian>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyLesbian
<Bondage>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyBondage
<Naked>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyNaked
<Master>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyMaster
<GangBang>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyGangBang
<Lend>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyLendHer
<Ponygirl>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyPonygirl
<Spanking>
Difficulty to compete in the XXX Contest
sdk variable: DifficultySpank
<Threesome>
Difficulty to compete in the XXX Contest
sdk variable: DifficultyThreesome

eg

        <Difficulties>
                <Anal>15</Anal>
                <Blowjob>10</Blowjob>
                <Bondage>60</Bondage>
                <Brothel>50</Brothel>
                <Dildo>40</Dildo>
                <Expose>20</Expose>
                <Fuck>5</Fuck>
                <GangBang>85</GangBang>
                <LendHer>75</LendHer>
                <Lesbian>70</Lesbian>
                <Lick>5</Lick>
                <Master>80</Master>
                <Masturbate>0</Masturbate>
                <Naked>20</Naked>
                <Plug>55</Plug>
                <Ponygirl>95</Ponygirl>
                <SleazyBar>15</SleazyBar>
                <Spanking>30</Spanking>
                <Threesome>15</Threesome>
                <TitsFuck>10</TitsFuck>
                <Touch>5</Touch>
                <XXX>40</XXX>
                <XXXContest>30</XXXContest>
        </Difficulties>

Images[edit]

The following appear in the subnode of the base slave node <Images>

Each of these node are used to show images, primarily for XML slaves. They can be manually invoked in actioncsript. Each corresponds to particularly named files in the folder pointed to by the <Folder> node above

Each have set sub nodes

  • <Normal> - standard act, heterosexual sex
  • <Naked> - the slave is shown naked whie doing the act
  • <Lesbian> - show a lesbian version of the act
  • <Dickgirl> - show the slave as a dickgirl
  • <Catgirl> - show the slave as a catgirl

These nodes just contains a count of the available images.

The <Normal> node is mandatory, none of the others are and will intelligently default. If your slave is naked but there is no <Naked> node the game will use the <Normal> node. For sex acts it will show images from <Normal> and <Naked> combined if they are clothed.


There is a special case for dickgirl images,

<Dickgirl>-2</Dickgirl>

This means there are no specific dickgirl images available, but the first 2 normal images should be used for the dickgirl case. This is to allow you to select images where you cannot tell if she is a dickgirl or not (ie you do not see her groin clearly)

eg

<Fuck>
        <Normal>5</Normal>
        <Lesbian>1</Lesbian>
        <Dickgirl>2</Dickgirl>
        <Naked>1</Naked>
        <Catgirl>1</Catgirl>
<Fuck>

In the folder pointed to by <Folder> there will be files

  • Sex Act - Fuck 1.jpg
  • Sex Act - Fuck 2.jpg
  • Sex Act - Fuck 3.jpg
  • Sex Act - Fuck 4.jpg
  • Sex Act - Fuck 5.jpg
  • Sex Act - Fuck (As Lesbian 1).jpg
  • Sex Act - Fuck (As Dickgirl 1).jpg
  • Sex Act - Fuck (As Dickgirl 2).jpg
  • Sex Act - Fuck (Naked 1).jpg
  • Sex Act - Fuck (As Catgirl 1).jpg

Note: the game supports the extensions

  • .jpg
  • .png
  • .gif
  • .swf

The available node are

sex acts
  • Nothing
  • Touch
  • Lick
  • Fuck
  • BlowJob
  • TitsFuck
  • Anal
  • Masturbate
  • Dildo
  • Plug
  • Lesbian
  • Bondage
  • Naked
  • Master
  • GangBang
  • Lend
  • Ponygirl
  • Spanking
  • Threesome
  • SixtyNine
  • Orgy
  • KissMale
  • KissFemale
  • StripTease
  • CumBath
  • CustomSex1
  • CustomSex2
chores/jobs
  • Cooking
  • Cleaning
  • Exercise
  • Discuss
  • Makeup
  • Sciences
  • Theology
  • Refinement
  • Dance
  • XXX
  • Expose
  • Restaurant
  • Acolyte
  • Bar
  • SleazyBar
  • SleazyBarStrip
  • Brothel
  • Break
  • CustomJob1
  • Read
  • CustomJob2
  • CustomJob3
  • Library
  • Onsen
  • CustomSchool1
  • CustomSchool2
  • CustomSchool3
  • CustomChore1
  • CustomChore2
  • CustomChore3
  • CockMilk
  • Singing
contests
  • ContestXXX
  • ContestBeauty
  • ContestHousework
  • ContestAdvancedHousework
  • ContestCourt
  • ContestDance
  • ContestGeneralKnowledge
  • ContestPonygirl
other events and images
  • TentacleSex
  • Tired
  • EventMilked
  • Dickgirl
  • EventGigaBE
  • ItemLingerie
  • ItemSwimsuit
  • EventNakedApron
  • EventRaped
  • ItemBunnySuit
  • ItemMaidUniform
  • EventFaerieTransformation
function ApplyHouseDetails(eNode:XMLNode)
{
        var hname:String;
        var hhint:String;
        var xpos:Number;
        var ypos:Number;
        var bshow:Boolean = false;
       
        for (var attr:String in eNode.attributes) {
                switch(attr.toLowerCase()) {
                        case "name": hname = eNode.attributes[attr]; break;
                        case "hint": hhint = eNode.attributes[attr]; break;
                        case "show": bshow = eNode.attributes[attr] == "true"; break;
                        case "xpos": xpos = GetExpression(eNode.attributes[attr]); break;
                        case "ypos": ypos = GetExpression(eNode.attributes[attr]); break;
                }
        }
       
        var idx:Number = AddCustomHouse(hname, xpos, ypos, hhint);
        if (bshow) ShowCustomHouse(idx);
}

function ApplyJobDetails(job:Number, eNode:XMLNode)
{
        var jobname:String;
        var joblabel:String;
        var bshow:Boolean = false;
       
        for (var attr:String in eNode.attributes) {
                switch(attr.toLowerCase()) {
                        case "name": jobname = eNode.attributes[attr]; break;
                        case "label": joblabel = eNode.attributes[attr]; break;
                        case "show": bshow = eNode.attributes[attr] == "true"; break;
                }
        }
        if (job == 1) SetCustomJobDetails1(jobname, joblabel);
        else if (job == 2) SetCustomJobDetails2(jobname, joblabel);
        else SetCustomJobDetails3(jobname, joblabel);
        if (bshow) ShowCustomJob(job);
}

function ApplyChoreDetails(chore:Number, eNode:XMLNode)
{
        var cname:String;
        var clabel:String;
        var bshow:Boolean = false;
       
        for (var attr:String in eNode.attributes) {
                switch(attr.toLowerCase()) {
                        case "name": cname = eNode.attributes[attr]; break;
                        case "label": clabel = eNode.attributes[attr]; break;
                        case "show": bshow = eNode.attributes[attr] == "true"; break;
                }
        }
        if (chore == 1) SetCustomChoreDetails1(cname, clabel);
        else if (chore == 2) SetCustomChoreDetails2(cname, clabel);
        else SetCustomChoreDetails3(cname, clabel);
        if (bshow) ShowCustomChore(chore);
}

function ApplySchoolDetails(school:Number, eNode:XMLNode)
{
        var cname:String;
        var clabel:String;
        var bshow:Boolean = false;
       
        for (var attr:String in eNode.attributes) {
                switch(attr.toLowerCase()) {
                        case "name": cname = eNode.attributes[attr]; break;
                        case "label": clabel = eNode.attributes[attr]; break;
                        case "show": bshow = eNode.attributes[attr] == "true"; break;
                }
        }
        if (school == 1) SetCustomSchoolDetails1(cname, clabel);
        else if (school == 2) SetCustomSchoolDetails2(cname, clabel);
        else SetCustomSchoolDetails3(cname, clabel);
        if (bshow) ShowCustomSchool(school);
}

function ApplySexDetails(sex:Number, eNode:XMLNode)
{
        var sdesc:String;
        var clabel:String;
        var bshow:Boolean = undefined;
       
        for (var attr:String in eNode.attributes) {
                switch(attr.toLowerCase()) {
                        case "label": clabel = eNode.attributes[attr]; break;
                        case "desc": sdesc = eNode.attributes[attr]; break;
                        case "show": bshow = eNode.attributes[attr] == "true"; break;
                }
        }
        if (sex == 1) SetCustomSexAct1(clabel, sdesc);
        else SetCustomSexAct2(clabel, sdesc);
        if (bshow == true) ShowCustomSexAct(sex);
}

Initialisation (new game or when loading a game)[edit]

The following appear in the base node <Slave>

<Version>
Version of the slave
sdk variable: SlaveVersion
<Credits>
Credits and notes for the assistant.
sdk variable: SlaveCredits
<Pronoun>
sdk variable: SlavePronoun
<SlaveLikeServant>
sdk variable: SlaveLikeServant
<Attitude>
sdk variable: SlaveAttitude
<NobleLoveType>
sdk variable: NobleLoveType
<Milkable>
sdk variable: Milkable
<OwnerTesting>
sdk variable: OwnerTesting
<OwnerTestingUrgent>
sdk variable: OwnerTestingUrgent
<OldLover>
sdk variable: OldLover

Dresses The following appear in the subnode of the base slave node <Dresses>

Each dress has it's own node selected by dress number

<Dress0> <Dress1> <Dress2> <Dress3> <Dress4> <Dress5> <Dress6>

Each dress has the following subnodes

<Name> MANDATORY
the name of the dress
<Price>
the price of the dress at the tailors
<Sold>
is the dress sold at the tailors, defaults to true
<StatEffects> MANDATORY
<StatEffects>Charisma, Sensibility, Refinement, Intelligence, Morality, Constitution, Cooking, Cleaning, Conversation, BlowJob, Fuck, Temperament, Nymphomania, Obedience, Lust, Reputation, Joy, Special</StatEffects>
The effects the dress has as it is worn
attributes
holy
easy
courtly
swimsuit
sleazybar
slutty
dance | dancing
maid
lingerie
catears
cattail
miko
waitress
demonic
Set these attributes to true to apply the property to the dress

Optional for Dress 0[edit]

<Effects>
A text description of the effect or properties of the dress, option as the game will automatically build a description based on the stat effects and properties.
<Normal>
<Dickgirl>
<Catgirl>
Counts of the number of variations of the dress for normal, dickgirls and catgirls, defaults to <Normal>1</Normal>

The following are positions information for the item images that appear on the dresses. Generally these are created using the debugging menu.

<Halo>

eg

<Halo x='223.2' y='18.4' rotation='-5' width='180' height='55'/>


;<Leash>
eg
<syntaxhighlight lang="xml" enclose="div">
<Leash x='262.4' y='60.75' rotation='0' width='60' height='120'/>
<BitGag>

eg

<BitGag frame='2' x='236.7' y='99.45' rotation='-10' width='60' height='39.3'/>
<NymphsTiara>

eg

<NymphsTiara x='227.3' y='33' rotation='-10' width='70' height='70'/>
<CatEars>

eg

<CatEars frame='1' x='223.75' y='46.85' rotation='-10' width='70' height='25' over='true'/>
<Tail>

eg

<Tail x='186.65' y='246.15' rotation='10' width='-130' height='119.3'/>
<Wings>

eg

<Wings x='238' y='185.35' rotation='0' width='320' height='260'/>

eg

<Dresses>
        <Dress0>
                <Halo x='229.5' y='30.95' rotation='0' width='150' height='54'/>
                <Leash x='177.6' y='57' rotation='0' width='-80' height='120' over='true'/>
                <BitGag frame='4' x='220' y='79' rotation='-10' width='55' height='40'/>
                <NymphsTiara x='216' y='47' rotation='-10' width='50' height='45'/>
                <CatEars frame='1' x='222.25' y='52.55' rotation='0' width='50' height='25' over='true'/>
                <Tail x='152' y='226' rotation='0' width='-150' height='80'/>
                <Wings x='217' y='150' rotation='10' width='-300' height='200'/>
        </Dress0>
        <Dress1>
                <Name>Shorts &amp; Top</Name>
                <StatEffects>5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0</StatEffects>
                <Halo x='236.15' y='38.25' rotation='0' width='200' height='60'/>
                <Leash x='272' y='74.25' rotation='0' width='80' height='160'/>
                <BitGag frame='2' x='228' y='130' rotation='-5' width='90' height='50'/>
                <NymphsTiara x='212.7' y='57.7' rotation='-10' width='57.05' height='53'/>
                <CatEars frame='1' x='229.5' y='46.55' rotation='0' width='80' height='30' over='true'/>
                <Tail x='290.2' y='248.4' rotation='-50' width='250' height='170'/>
                <Wings x='233' y='221' rotation='5' width='400' height='300'/>
        </Dress1>
        <Dress2>
                <Name>Bunny Suit</Name>
                <StatEffects SleazyBar='true'>10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0</StatEffects>
                <Halo x='223.9' y='21.25' rotation='0' width='130' height='45'/>
                <Leash x='247.25' y='42.85' rotation='0' width='60' height='120'/>
                <BitGag frame='4' x='220' y='69' rotation='-15' width='40' height='30'/>
                <NymphsTiara x='220' y='42.35' rotation='-10' width='40' height='40'/>
                <CatEars frame='1' x='219.5' y='45.7' rotation='5' width='40' height='25' over='true'/>
                <Tail x='276.8' y='190.7' rotation='10' width='120' height='100'/>
                <Wings x='226.5' y='148' rotation='10' width='250' height='200'/>
        </Dress2>
        <Dress3>
                <Name>Very Little</Name>
                <StatEffects Easy='true' Lingerie='true'>5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 2, 0</StatEffects>
                <Halo x='223.2' y='18.4' rotation='-5' width='180' height='55'/>
                <Leash x='262.4' y='60.75' rotation='0' width='60' height='120'/>
                <BitGag frame='2' x='236.7' y='99.45' rotation='-10' width='60' height='39.3'/>
                <NymphsTiara x='227.3' y='33' rotation='-10' width='70' height='70'/>
                <CatEars frame='1' x='223.75' y='46.85' rotation='-10' width='70' height='25' over='true'/>
                <Tail x='186.65' y='246.15' rotation='10' width='-130' height='119.3'/>
                <Wings x='238' y='185.35' rotation='0' width='320' height='260'/>
        </Dress3>
        <Dress4>
                <Name>Green Bikini</Name>
                <StatEffects Swimsuit='true' Easy='true'>10, 10, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0</StatEffects>
                <Halo x='215.3' y='24.15' rotation='5' width='184.1' height='70.5'/>
                <Leash x='258' y='59' rotation='0' width='90' height='140'/>
                <BitGag frame='4' x='217.4' y='80.7' rotation='-15' width='60' height='40'/>
                <NymphsTiara x='210.7' y='32.2' rotation='-10' width='60' height='60'/>
                <CatEars frame='1' x='231' y='29.6' rotation='10' width='60' height='25' over='true'/>
                <Tail x='292.3' y='280.15' rotation='10' width='148.75' height='140.05'/>
                <Wings x='220.85' y='183' rotation='5' width='400' height='300'/>
        </Dress4>
        <Dress5>
                <Name>Strap Swimsuit</Name>
                <StatEffects Swimsuit='true' Easy='true'>10, 0, 10, 0, 0, 0, 0, 0, 0, 5, 5, 0, 0, 0, 5, 0, 5, 0</StatEffects>
                <Halo x='242.65' y='16.35' rotation='0' width='130' height='40'/>
                <Leash x='202.4' y='17.85' rotation='0' width='-70' height='120'/>
                <BitGag frame='2' x='245.5' y='64.15' rotation='0' width='45' height='30'/>
                <NymphsTiara x='242.5' y='29.5' rotation='-10' width='30' height='30'/>
                <CatEars frame='1' x='244.75' y='31.8' rotation='0' width='40' height='25' over='true'/>
                <Tail x='307' y='179' rotation='10' width='150' height='120'/>
                <Wings x='246' y='116.5' rotation='-10' width='300' height='250'/>
        </Dress5>
        <Dress6>
                <Name>Slutty Straps</Name>
                <StatEffects Slutty='true' Easy='true'>30, 0, 10, 0, 0, 0, 0, 0, 0, 10, 10, 10, 10, 15, 15, 0, 15, 0</StatEffects>
                <Halo x='220.5' y='24' rotation='-5' width='200' height='50'/>
                <Leash x='272' y='76.5' rotation='0' width='-100' height='140'/>
                <BitGag frame='2' x='233.5' y='113.25' rotation='-10' width='70' height='35'/>
                <NymphsTiara x='222.9' y='46.65' rotation='-10' width='80' height='80'/>
                <CatEars frame='1' x='220.25' y='49.65' rotation='-10' width='80' height='25' over='true'/>
                <Tail x='141' y='291.5' rotation='10' width='-190' height='145'/>
                <Wings x='231.5' y='225.5' rotation='5' width='400' height='350'/>
        </Dress6>
</Dresses>
        iNode = GetNode(slaveNode, "SpecialStat");
        if (iNode != null) {
                str = StripLines(iNode.firstChild.nodeValue);
                if (iNode.attributes.show != "false") ShowSpecialStat(str);
                else SetSpecialStat(str);
        }
       
                // Acts
        iNode = GetNode(slaveNode, "SlaveJob1");
        if (iNode != null) ApplyJobDetails(1, iNode);
        iNode = GetNode(slaveNode, "SlaveJob2");
        if (iNode != null) ApplyJobDetails(2, iNode);
        iNode = GetNode(slaveNode, "SlaveJob3");
        if (iNode != null) ApplyJobDetails(3, iNode);
        iNode = GetNode(slaveNode, "SlaveChore1");
        if (iNode != null) ApplyChoreDetails(1, iNode);
        iNode = GetNode(slaveNode, "SlaveChore2");
        if (iNode != null) ApplyChoreDetails(2, iNode);
        iNode = GetNode(slaveNode, "SlaveChore3");
        if (iNode != null) ApplyChoreDetails(3, iNode);
        iNode = GetNode(slaveNode, "SlaveSchool1");
        if (iNode != null) ApplySchoolDetails(1, iNode);
        iNode = GetNode(slaveNode, "SlaveSchool2");
        if (iNode != null) ApplySchoolDetails(2, iNode);
        iNode = GetNode(slaveNode, "SlaveSchool3");
        if (iNode != null) ApplySchooleDetails(3, iNode);
        iNode = GetNode(slaveNode, "SlaveSex1");
        if (iNode != null) ApplySexDetails(1, iNode);
        iNode = GetNode(slaveNode, "SlaveSex2");
        if (iNode != null) ApplySexDetails(2, iNode);
       
        // Acts
        iNode = GetNode(actNode, "SlaveJob1");
        if (iNode != null) ApplyJobDetails(1, iNode);
        iNode = GetNode(actNode, "SlaveJob2");
        if (iNode != null) ApplyJobDetails(2, iNode);
        iNode = GetNode(actNode, "SlaveJob2");
        if (iNode != null) ApplyJobDetails(3, iNode);
        iNode = GetNode(actNode, "SlaveChore1");
        if (iNode != null) ApplyChoreDetails(1, iNode);
        iNode = GetNode(actNode, "SlaveChore2");
        if (iNode != null) ApplyChoreDetails(2, iNode);
        iNode = GetNode(actNode, "SlaveChore3");
        if (iNode != null) ApplyChoreDetails(3, iNode);
        iNode = GetNode(actNode, "SlaveSchool1");
        if (iNode != null) ApplySchoolDetails(1, iNode);
        iNode = GetNode(actNode, "SlaveSchool2");
        if (iNode != null) ApplySchoolDetails(2, iNode);
        iNode = GetNode(actNode, "SlaveSchool3");
        if (iNode != null) ApplySchooleDetails(3, iNode);
        iNode = GetNode(actNode, "SlaveSex1");
        if (iNode != null) ApplySexDetails(1, iNode);
        iNode = GetNode(actNode, "SlaveSex2");
        if (iNode != null) ApplySexDetails(2, iNode);
       
        iNode = GetNode("Contests/CustomContest");
        if (iNode != null) {
                str = "";
                var desc:String = "";
                var bshow:Boolean = false;
                for (var attr:String in eNode.attributes) {
                        switch(attr.toLowerCase()) {
                                case "name": str = strLineChanges(eNode.attributes[attr]); break;
                                case "desc": sdesc = strLineChanges(eNode.attributes[attr]); break;
                                case "show": bshow = eNode.attributes[attr] == "true"; break;
                        }
                }
                _root.SetCustomContestDetails(str, desc);
                if (bshow) _root.ShowCustomContest();
        }
       
        // reset special participants
        {
                var sdata:Slave;
                for (var so:String in SlavesArray) {
                        sdata = SlavesArray[so];
                        if (sdata.SlaveType == -20) sdata.SlaveType = -2;
                }
        }
       
        iNode = GetNode(slaveNode, "SpecialParticipants");
        for (var pNode:XMLNode = iNode.firstChild; pNode != null; pNode = pNode.nextSibling) {
                if (pNode.nodeType != 1) continue;
                var str:String = pNode.nodeName.toLowerCase();
                if (str == "participant") ParseAddParticipant(pNode);
        }
       
        // Custom House
       
        for (var pNode:XMLNode = walkNode; pNode != null; pNode = pNode.nextSibling) {
                if (pNode.nodeType != 1) continue;
                var str:String = pNode.nodeName.toLowerCase();
                if (str.substr(0, 12) == "customhouse-") ApplyHouseDetails(pNode);
        }
                       
        // General initialisation
        if (XMLEventByNode(GetNode(slaveNode, "Initialise"), true, undefined, true)) {
                // ignore any text output
                EventText = "";
        }

When used as an Assistant[edit]

The following appear in node <Assistant>. Note this is a subnode of <Language> NOT <Slave>

<AssistantDescription> MANDATORY for pure XML assistants
Description shown when hiring the assistant
sdk variable: AssistantDescription
<Cost> MANDATORY for pure XML assistants
Cost to hire as an assistant. Ignored for bought back slaves
sdk variable: AssistantCost
<Version>
Version of the assistant.
sdk variable: AssistantVersion
<Credits>
Credits and notes for the assistant.
sdk variable: AssistantCredits
<Name> MANDATORY for pure XML assistants
Name of the assistant. Ignored for bought back slaves
sdk variable: ServantName
<Speech>
This node controls how the assistant speaks, and has the following 2 subnodes
<Pronoun>
The prpnoun the assistant uses, default I, some use #slave, eg Shampoo speaks in the 3rd person
sdk variable: ServantPronoun
<Suffix>
A suffix the assistant adds to the end of each of their sentences
sdk variable: Assistantata.SpeechSuffix

eg

<Speech>
        <Pronoun>#slave</Pronoun>
        <Suffix>desu</Suffix>
</Speech>

eg

        <Assistant>
                <AssistantDescription>A clumsy but talented ex-militia member.</AssistantDescription>
        </Assistant>


<<first <prev SDK/Core - XML Slaves next> last>>