Rooms built in compliance with this guide will most likely work well with other rooms.
Each room requires the following features:
The following features are optional:
-Tags- a comma separated list of discriptive tags
The standard traits define commonly used traits and their relationships to each other. Rooms should make use of these values and relationships to provide a cohesive experience.
-Intelligence - The player's ability to solve puzzles, perform magic, and use logical reasoning.
-Morality - The player's capacity for compassion, empathy, and kindness.
-Fitness - The player's strength, athleticism, and stamina.
-Looks - The first impression a character makes on others and their hygiene.
-Speech - The player's ability to barter, persuade, lie, and understand spoken word.
This is an example room called Team Workout. It demonstrates a target style decision and a traditional decision.
<xml>
<room>
<title>Team Workout</title>
<text>
<summary>Your party decides to take a break from adventuring to work out.
Everyone takes a turn at the bench press. Spotting your friend would
really help them out.</summary>
<details>You can choose to spot your friends or not.</details>
<flavor>You can put flavor text here.</flavor>
</text>
<decision-block>
<eachplayer text="Spot {}." />
<decision text="Psh, spotting is for wimps." id="1" />
</decision-block>
<resolution-block>
<if target-player="">
<modtargettrait trait="fitness" op="add" value="1" />
<result>You spot {}, who sets a personal record!</result>
</if>
<if decision="'Psh, spotting is for wimps.'" id="1">
<if chosen-after="" id="1" value="1" op="gte">
<modpartyhealth value="2" op="sub" />
<result>You created a hostile gym environment!</result>
<else>
<modhealth value="1" op="sub" />
<result>A weight falls on your head.</result>
</else>
</if>
</if>
</resolution-block>
</room>
</xml>
Decisions show what a player will be able to choose from in a given room. All decisions must have a text field and an ID field. The ID must be unique to the room. The text is usually unused other than display.
Example, allowing the player to eat a bug:
<decision text="Eat a bug." id="1" />
Results affect the player after every player has made a decision. The result is just text inside a result tag. Results are usually paired with modifiers that affect the player's traits or health.
Exampe, a player getting hurt from eating a bug:
<result>You ate the bug, but it was poisonous.</result>
<modhealth value="2" op="sub" />
Most rooms use an intricate series of if statements to give some players decisions or results based on their character or the action in the room. There are a series of conditions to check against which are outlined later in the document. If statements may be nested to create AND logic, and may contain a else statements.
Example: if a player has a fitness trait of at least 5 and intelligence less than 5, then they can eat a bug. If their intelligence is greater than 5, they can squash the bug. If neither are true, nothing happens.
<if trait="fitness" value="5" op="gte">
<if trait="intelligence value="5" op="lt">
<decision text="Eat a bug." id="1">
<else>
<decision text="Squash a bug." id="2">
</else>
</if>
</if>
Unless specified otherwise, the op field in an if statement will usually be one of:
| Operation | Meaning |
|---|---|
| eq | Equal to |
| ne | Not equal to |
| gt | Greater than |
| gte | Greater than or equal to |
| lt | Less than |
| lte | Less than or equal to |
** Trait **
The decision will only appear if the trait value meets the condition.
Contains: trait, value, up
Example, seeing if morality is greater than or equal to 2:
<if trait="morality" value="2" op="gte">
<decision text="Eat a bug." id="1" />
</if>
** Relative-Trait **
The decision will only appear if the player's trait value is the highest or lowest in the party. In the case of a tie, both players will receive this decision.
Contains: trait, value [highest, lowest]
Example, seeint if the player has the highest fitness in the party:
<if relative-trait="fitness" value="highest">
<decision text="Eat a bug." id="1" />
</if>
** EachPlayer
This will generate a decision related to each player. This is how targeting decisions work. The {} will be replace with the player's name.
Contains: text, exclude-self [yes, no]
Example: Generate a decision related that targets every player in the party.
<eachplayer text="Force {} to eat a bug." exclude-self="yes" />
Decision
If a player made a decision, continue.
Contains: id
Example, seeing if player chose decision with ID of 1:
<if decision="Eat a bug" id="1">
<result>You ate a bug.</result>
</if>
** Trait **
If a player has a certain trait value, continue.
Contains: value, op
Example, seeing if player has less than 5 intelligence:
<if trait="intelligence" op="lt" value="5">
<result>You ate a bug.</result>
</if>
** Relative-trait **
If a player has the highest or lowest trait in the party, continue. Ties for lowest/highest still count.
Contains: value[highest, lowest]
Example, seeing if the player has the lowest speech:
<if relative-trait="speech" value="lowest">
<result>You ate a bug.</result>
</if>
** Previous-decision **
Checks to see if the decision chosen immediately before the player's choice matches an ID. This only matches on ID; the text is irrelevant. You can use an operator to get a range of ID's, like, "if ID is greater than 1".
Contains: value, op
Example, seeing if the previous decision was 1:
<if prevision-decision="Eat a bug" value="1" op="eq">
<result>You ate a bug.</result>
</if>
** Next-decision **
Checks to see if the decision chosen immediately after the player's choice matches an ID. This only matches on ID; the text is irrelevant. You can use an operator to get a range of ID's, like, "if ID is greater than 1".
Contains: value, op
Example, seeing if the next decision was greater than 1:
<if next-decision="" value="1" op="gt">
<result>You ate a bug.</result>
</if>
** Times-chosen **
Checks if a decision of a certain ID was chosen a certain number of times. Times-chosen will usually be blank.
Contains: value, op, id
Example, seeing if decision 1 was chosen 3 times:
<if times-chosen="" id="1" op="eq" value="3">
<result>You ate a bug.</result>
</if>
** Unanimous **
Checks if a decision of a certain ID was chosen for every player. Unanimous will usually be blank.
Contains: op, id
Example, seeing if decision 1 was chosen unanimously:
<if unanimous="" id="1" op="eq">
<result>You ate a bug.</result>
</if>
** Decision-order **
Checks to see when the player made a decision, 1st, 2nd, 3rd, etc. Decision order is usually blank.
Contains: value, op
Example, sees if player was not the third player to choose:
<if decision-order="" value="3" op="ne">
<result>You ate a bug.</result>
</if>
** Chosen-before **
Checks the number of times a decsion ID was chosen before the player chose. Chosen-before will usually be blank.
Contains: value, op, id
Example, seeing if decision 1 was chosen at least twice before this player's decision:
<if chosen-before="" id="1" value="2" op="gte">
<result>You ate a bug.</result>
</if>
** Chosen-after **
Checks the number of times a decsion ID was chosen after the player chose. Chosen-after will usually be blank.
Contains: value, op, id
Example, seeing if decision 4 was chosen once after this player's decision:
<if chosen-after="" id="4" value="1" op="eq">
<result>You ate a bug.</result>
</if>
** Most-chosen **
Checks to see if a decision ID was chosen the most. Ties are considered with a attribute. Special decisions, like pants shitter, dead, and do nothing are not considered in the calculation.
Contains: id, ties
Example, seeing if decision 2 was chosen the most:
<if most-chosen="" id="2" ties="no">
<result>You ate a bug.</result>
</if>
** Least-chosen **
Checks to see if a decision ID was chosen the least. Ties are considered with a attribute. Special decisions, like pants shitter, dead, and do nothing are not considered in the calculation.
Contains: id
Example, seeing if decision 1 was chosen the least:
<if least-chosen="" id="1" ties="yes">
<result>You ate a bug.</result>
</if>
** Targeted-player **
Checks to see if a player chose a decision that targeted a player. The player targeted will be used in any target style modifiers within this if block. Any {} found in the result text will be replaced with the targeted player's name.
Contains: (nothing)
Example, after selecting a targeted player:
<if targeted-player="">
<result>You made {} eat a bug.</result>
</if>
** Targeted-player-health **
Checks to see if a targeted player's health is a certain value. This must be inside a targeted-player if statement.
Contains: value, op
Example, seeing if a targets health is above 0:
<if targeted-player-health="" op="gt" value="0">
<result>You healed {}.</result>
</if>
Modtrait **
Modifies a player's trait.
Contains: trait, value, op[add,sub]
Example, modify a player's fitness trait by 3:
<modtrait trait="fitness" value="3" op="add" />
** Modhealth **
Modifies a player's health.
Contains: value, op[add,sub]
Example, a player losing 2 health:
<modhealth value="2" op="sub" />
** Modtargettrait **
Modifies the target's trait. Only used in target-player if blocks.
Contains: trait, value, op[add,sub]
Example, modify a target's looks trait by 3:
<modtargettrait trait="looks" value="3" op="add" />
** Modtargethealth **
Modifies a targets's health. Only used in target-player if blocks.
Contains: value, op[add,sub]
Example, a target gaining 2 health:
<modtargethealth value="2" op="add" />
** Modpartytrait **
Modifies the entire party's trait.
Contains: trait, value, op[add,sub]
Example, modify the party's intelligence trait by 3:
<modpartytrait trait="intelligence" value="3" op="add" />
** Modpartyhealth **
Modifies the entire party's health.
Contains: value, op[add,sub]
Example, the party gaining 2 health:
<modpartyhealth value="2" op="add" />
** Modrandomtrait **
Modifies a random party member's trait.
Contains: trait, value, op[add,sub]
Example, modify a random party member's intelligence trait by 3:
<modrandomtrait trait="intelligence" value="3" op="add" />
** Modrandomhealth **
Modifies a random party member's health.
Contains: value, op[add,sub]
Example, a random party member gaining 2 health:
<modrandomhealth value="2" op="add" />