Menu

Room Builders Guide

dungeonsoffear

Room Builders Guide

Rooms built in compliance with this guide will most likely work well with other rooms.

Room Features

Each room requires the following features:

  • Title - the title should be a noun describing the obstacle in the room
  • Text - detailed provided to the player when in the room
  • Decision Conditions - conditions that determine what decisions a player sees
  • Outcome Conditions - rules that dictate what rewards and penalties players get

The following features are optional:
-Tags- a comma separated list of discriptive tags

Standard Traits

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.

Room Language

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

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

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" />

If Statements

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>

Operators

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

Decision Block If Statements

** 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" />

Resolution Block If Statements

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>

Resolution Block Modifiers

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" />

Related

Wiki: Home