Implement saving monster definitions to XML

This commit is contained in:
2015-01-22 14:33:28 -05:00
parent 670e35f9d5
commit 3e0e3d3b8a
7 changed files with 376 additions and 71 deletions

View File

@@ -3,6 +3,8 @@
<monster id="7">
<!-- The monster's name -->
<name>Cave Cow</name>
<!-- Species -->
<race>beast</race>
<!-- Monster picture -->
<pic w='1' h='1'>5</pic>
<!-- Experience level -->
@@ -18,17 +20,32 @@
<attacks>
<attack type='0'>1d4</attack>
</attacks>
<!-- Breath weapon -->
<breath type='dark'>1</breath>
<!-- Special abilities -->
<abilities>
<ability>
<type>0</type>
<param>4</param>
</ability>
<!-- A breath weapon; 12 = damage2, 3 = breath, 4 = unblockable damage -->
<general type='12'>
<type>3</type>
<missile>8</missile>
<strength>1</strength>
<range>8</range>
<chance>37.5</chance>
<extra>4</extra>
</general>
<!-- Archery; 1 = missile, 1 = arrow -->
<missile type='1'>
<type>1</type>
<missile>3</missile>
<strength>8d7</strength>
<skill>16</skill>
<range>10</range>
<chance>87.5</chance>
</missile>
<!-- Radiate fire fields; 22 = radiate, 2 = fire -->
<radiate type='22'>
<type>2</type>
<chance>100</chance>
</radiate>
</abilities>
<!-- Actions on sighting -->
<onsight/>
<!-- Ambient sound (eg cow mooing) -->
<voice>17</voice>
<!-- Summon class -->
@@ -37,7 +54,7 @@
<attitude>2</attitude>
<!-- Immunities (empty element for none) -->
<immunity>
<fire resist='true'/>
<fire>50</fire>
</immunity>
</monster>
</monsters>

View File

@@ -11,16 +11,90 @@
<xs:pattern value="\d*d\d+"/>
</xs:restriction>
</xs:simpleType>
<xs:complexType name="immunity">
<xs:attribute name="immune" type="bool"/>
<xs:attribute name="resist" type="bool"/>
</xs:complexType>
<xs:element name="ability">
<xs:simpleType name="species">
<xs:restriction base="xs:token">
<xs:enumeration value="human"/>
<xs:enumeration value="nephil"/>
<xs:enumeration value="slith"/>
<xs:enumeration value="vahnatai"/>
<xs:enumeration value="reptile"/>
<xs:enumeration value="beast"/>
<xs:enumeration value="important"/>
<xs:enumeration value="mage"/>
<xs:enumeration value="priest"/>
<xs:enumeration value="humanoid"/>
<xs:enumeration value="demon"/>
<xs:enumeration value="undead"/>
<xs:enumeration value="giant"/>
<xs:enumeration value="slime"/>
<xs:enumeration value="stone"/>
<xs:enumeration value="bug"/>
<xs:enumeration value="dragon"/>
<xs:enumeration value="magic"/>
<xs:enumeration value="plant"/>
<xs:enumeration value="bird"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="permille">
<xs:restriction base="xs:decimal">
<xs:fractionDigits value="1"/>
<xs:maxInclusive value="100"/>
<xs:minInclusive value="0"/>
</xs:restriction>
</xs:simpleType>
<xs:element name="general">
<xs:complexType>
<xs:all>
<xs:element name="type" type="xs:integer"/>
<xs:element name="missile" type="xs:integer" minOccurs="0"/>
<xs:element name="strength" type="xs:integer"/>
<xs:element name="range" type="xs:integer" minOccurs="0"/>
<xs:element name="chance" type="permille"/>
<xs:element name="extra" type="xs:integer" minOccurs="0"/>
</xs:all>
<xs:attribute name="type" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="missile">
<xs:complexType>
<xs:all>
<xs:element name="type" type="xs:integer"/>
<xs:element name="missile" type="xs:integer"/>
<xs:element name="strength" type="dice"/>
<xs:element name="skill" type="xs:integer"/>
<xs:element name="range" type="xs:integer"/>
<xs:element name="chance" type="permille"/>
</xs:all>
<xs:attribute name="type" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="summon">
<xs:complexType>
<xs:all>
<xs:element name="type" type="xs:integer"/>
<xs:element name="min" type="xs:integer"/>
<xs:element name="max" type="xs:integer"/>
<xs:element name="duration" type="xs:integer"/>
<xs:element name="chance" type="permille"/>
</xs:all>
<xs:attribute name="type" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="radiate">
<xs:complexType>
<xs:all>
<xs:element name="type" type="xs:integer"/>
<xs:element name="chance" type="permille"/>
</xs:all>
<xs:attribute name="type" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="special">
<xs:complexType>
<xs:sequence>
<xs:element name="type" type="xs:integer"/>
<xs:element name="param" type="xs:integer" minOccurs="0" maxOccurs="2"/>
<xs:element name="param" type="xs:integer" minOccurs="0" maxOccurs="3"/>
</xs:sequence>
<xs:attribute name="type" type="xs:integer" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="attack">
@@ -44,31 +118,25 @@
<xs:element name="treasure" minOccurs="0" type="xs:integer"/>
<xs:element name="mage" minOccurs="0" type="xs:integer"/>
<xs:element name="priest" minOccurs="0" type="xs:integer"/>
<xs:element name="breath" minOccurs="0">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:integer">
<xs:attribute name="type" use="required">
<xs:simpleType>
<xs:restriction base="xs:token">
<xs:enumeration value="fire"/>
<xs:enumeration value="cold"/>
<xs:enumeration value="shock"/>
<xs:enumeration value="dark"/>
</xs:restriction>
</xs:simpleType>
</xs:attribute>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
<xs:element name="poison" minOccurs="0" type="xs:integer"/>
<xs:element name="race" type="species"/>
<xs:element name="abilities" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element ref="ability" maxOccurs="2"/>
<xs:element name="invisible" minOccurs="0"/>
<xs:element name="guard" minOccurs="0"/>
<xs:choice maxOccurs="unbounded">
<xs:element ref="general" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="missile" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="summon" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="radiate" minOccurs="0" maxOccurs="unbounded"/>
<xs:element ref="special" minOccurs="0" maxOccurs="unbounded"/>
</xs:choice>
</xs:sequence>
</xs:complexType>
<xs:unique name="abilsPerMonst">
<xs:selector xpath="general|missile|summon|radiate|special"/>
<xs:field xpath="@type"/>
</xs:unique>
</xs:element>
<xs:element name="attacks">
<xs:complexType>
@@ -89,31 +157,19 @@
</xs:complexType>
</xs:element>
<xs:element name="default-face" minOccurs="0" type="xs:integer"/>
<xs:element name="onsight" minOccurs="0">
<xs:complexType>
<xs:all minOccurs="1">
<xs:element name="sound" minOccurs="0" type="xs:integer"/>
<xs:element name="special" minOccurs="0" type="xs:integer"/>
<xs:element name="message" minOccurs="0">
<xs:complexType>
<xs:sequence>
<xs:element name="text" maxOccurs="2" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:all>
</xs:complexType>
</xs:element>
<xs:element name="onsight" minOccurs="0" type="xs:integer"/>
<xs:element name="voice" minOccurs="0" type="xs:integer"/>
<xs:element name="summon" minOccurs="0" type="xs:integer"/>
<xs:element name="attitude" type="xs:integer"/>
<xs:element name="immunity">
<xs:complexType>
<xs:all>
<xs:element name="fire" type="immunity" minOccurs="0"/>
<xs:element name="cold" type="immunity" minOccurs="0"/>
<xs:element name="poison" type="immunity" minOccurs="0"/>
<xs:element name="magic" type="immunity" minOccurs="0"/>
<xs:element name="fire" type="xs:integer" minOccurs="0"/>
<xs:element name="cold" type="xs:integer" minOccurs="0"/>
<xs:element name="poison" type="xs:integer" minOccurs="0"/>
<xs:element name="magic" type="xs:integer" minOccurs="0"/>
<xs:element name="all" type="bool" minOccurs="0"/>
<xs:element name="fear" type="bool" minOccurs="0"/>
</xs:all>
</xs:complexType>
</xs:element>
@@ -135,5 +191,9 @@
<xs:element ref="monster" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:unique name='monsterIds'>
<xs:selector xpath='monster'/>
<xs:field xpath='@id'/>
</xs:unique>
</xs:element>
</xs:schema>