[tellstory] Exempel på textbaserat grottkräl

stenhöna

tellstory
Joined
5 Oct 2002
Messages
964
Location
Hamburg
Mitt verktyg som urspringligen bara handlade om att slumpa tabeller och kort har nu utvecklats med input. Innan jag beskriver vad som pågår ska jag lista en testkörning:

Monster battle! In a dungeon!
Name of player: Olle
--- Player stats ---
Name: Olle
Attack: 6
Hit-points: 8
--------------------
Hit enter to enter dungeon...
Corridor leading south
Room with monster - prepare for battle!
You meet a orc.
Player Olle attacks
1. Attack
2. Flee
Choose your action (1-2): 1
Olle attacks! 6 damage to orc.
Hitpoints left: -1
The monster is defeated
Corridor leading south
Corridor leading south
Room with monster - prepare for battle!
You meet a tiny troll.
Player Olle attacks
1. Attack
2. Flee
Choose your action (1-2): 2
Player flees!
You're out of the dungeon!
Exemplet ovan består av:

* Ett kort med spelarstatistik
* Två tärningar (t3 och t6)
* En kortlek med tre monsterkort
* En interaktiv graf för att välja handling i strid (attack, flee)
* En graf för att pendla mellan spelare och monster under strid
* En graf för att gå vidare i grottan (just nu med enbart två rum - korridor och rum med monster)

Fortfarande finns inget webbinterface, men jag vill lägga till det OCH möjligheten att spela flera stycken samtidigt.

Jag listar hela XML-filen här, även om den är 125 rader lång...

HTML:
<?xml version="1.0" encoding="UTF-8"?>
<story newline="print">
  <print>Monster battle! In a dungeon!</print>

  <!-- We use two dice in this game -->
  <dice name="d6" sides="6" />
  <dice name="d3" sides="3" />

  <!-- Command-line input -->
  <input name="name" label="Name of player: " validation="[a-zA-Z]+" />

  <!-- Randomize player statistics -->
  <card name="player">
    <name>{name}</name>
    <attack>{%d6 + %d6}</attack>
    <hitpoints>{%d6 + %d6}</hitpoints>
  </card>

  <!-- Show the stats -->
  <print>--- Player stats ---</print>
  <print>Name: {player.name}</print>
  <print>Attack: {player.attack}</print>
  <print>Hit-points: {player.hitpoints}</print>
  <print>--------------------</print>

  <!-- Define the monster deck -->
  <deck name="monsterdeck">
    <card>
      <name>tiny troll</name>
      <attack>{%d3}</attack>
      <hitpoints>{%d3}</hitpoints>
    </card>
    <card>
      <name>troll</name>
      <attack>{%d3}</attack>
      <hitpoints>{%d6}</hitpoints>
    </card>
    <card>
      <name>orc</name>
      <attack>{%d3}</attack>
      <hitpoints>{%d6 + %d3}</hitpoints>
    </card>
  </deck>

  <!-- Attack flow with three nodes: Choose action, attack and flee -->
  <!-- Assumes card "player" is set -->
  <!-- Assumes card "monster" is set -->
  <!-- Assumes variable "path" is set to 0 -->
  <variable name="path" value="0" />
  <graph name="player_attack" start="0">
    <node id="0" connections="{path}">
      <print>1. Attack</print>
      <print>2. Flee</print>
      <input name="path" label="Choose your action (1-2): " validation="^[1-2]$"/>
    </node>
    <node id="1" connections="0">
      <!-- Player attacks the monster -->
      <print>{player.name} attacks! {player.attack} damage to {monster.name}.</print>
      <set card="monster" field="hitpoints" value="{monster.hitpoints - player.attack}" />
      <print>Hitpoints left: {monster.hitpoints}</print>
    </node>
    <node id="2" connections="0">
      <print>Player flees!</print>
      <setFlag name="endbattle" />
    </node>
  </graph>

  <!-- Battle flow with three nodes: Start, player attack and monster attack-->
  <!-- Assumes card "player" is set -->
  <!-- Assumes card "monster" is set -->
  <graph name="battle" start="0">
    <node id="0" connections="1">/start/</node>
    <node id="1" connections="2">
        <print>Player {player.name} attacks</print>
        <!-- Always reset path to 0 before starting player attack graph. -->
        <set variable="path" value="0" />
        <!-- Run attack graph twice - once for choice input and once for executing the choice -->
        <print>{@player_attack}</print>
        <print>{@player_attack}</print>
        <!-- Check if monster died - if yes, end battle -->
        <if content="{monster.hitpoints}" lessThan="1">
          <print>The monster is defeated</print>
          <setFlag name="endbattle" />
        </if>
    </node>
    <node id="2" connections="1">
      <print>The monster attacks</print>
      <set card="player" field="hitpoints" value="{player.hitpoints - monster.attack}" />
      <print>Player has {player.hitpoints} hitpoints left</print>
      <if content="{player.hitpoints}" lessThan="1">
        <print>Player DED</print>
        <setFlag name="endbattle" />
      </if>
    </node>
  </graph>

  <!-- Dungone flow with three nodes: start, corridor and room with monster -->
  <graph name="dungeon" start="0">
    <node id="0" connections="1">/start/</node>
    <node id="1" connections="1,2">
      <print>Corridor leading south</print>
    </node>
    <node id="2" connections="1">
      <print>Room with monster - prepare for battle!</print>
      <!-- Pick a card from monsterdeck and put it in slot "monster" -->
      <pick from="monsterdeck" into="monster"/>
      <print>You meet a {monster.name}.</print>
      <clear type="flag" name="endbattle" />
      <loop until="endbattle">
        <print>{@battle}</print>
      </loop>
      <!-- Always start from player attack at next battle -->
      <reset type="graph" name="battle" />
    </node>
  </graph>

  <input name="hitenter" label="Hit enter to enter dungeon..." validation=""/>

  <!-- Loop dungeon 10 times (TODO: until gameover?) -->
  <loop times="5">
    <print>{@dungeon}</print>
    <sleep time="1"/>
  </loop>
  <print>You're out of the dungeon!</print>
</story>
 

stenhöna

tellstory
Joined
5 Oct 2002
Messages
964
Location
Hamburg
bortom12e;n348980 said:
Coolt, påminner om MUD :)
Exakt, det blir ju som MUD. :) Men man kan ju också tänka sig att lägga till taggar för bild och ljud, < img >, < audio >, om man gör ett webbinterface, och sen packar ihop allt i en zip-fil.

Något som kunde vara kul är också leader board, där alla användare kan lägga upp sina egna XML-"äventyr", och sen kan man tävla vem som får högst poäng i olika sessioner. Enda problemet är att allting är publikt, dvs. XML-filen kan läsas. Fast det kanske man kan dölja...
 
Top