diff options
Diffstat (limited to 'client/tmw.xsd')
-rw-r--r-- | client/tmw.xsd | 637 |
1 files changed, 637 insertions, 0 deletions
diff --git a/client/tmw.xsd b/client/tmw.xsd new file mode 100644 index 0000000..139f3b9 --- /dev/null +++ b/client/tmw.xsd @@ -0,0 +1,637 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- vim: set sts=2 sw=2: --> +<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:its="http://www.w3.org/2005/11/its" elementFormDefault="qualified"> + <!-- + meta + --> + <!-- + Probably most 'sequence' below should really be 'choice', + and the corresponding maxOccurs should be hoisted. + TODO see what happens for duplicates in that case (see <chars> in particular) + --> + <xs:import namespace="http://www.w3.org/2005/11/its" schemaLocation="dl/its.xsd"/> + <!-- + common + --> + <xs:complexType name="weapon_items"> + <xs:sequence> + <xs:element name="item" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + <xs:element name="include"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + <xs:simpleType name="cursor"> + <xs:restriction base="xs:string"> + <xs:enumeration value="small"/> + <xs:enumeration value="large"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="sex"> + <xs:restriction base="xs:string"> + <xs:enumeration value="male"/> + <xs:enumeration value="female"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="replace_dir"> + <!-- also used for drawBefore --> + <xs:restriction base="xs:string"> + <xs:enumeration value="left"/> + <xs:enumeration value="right"/> + <xs:enumeration value="upall"/> + <xs:enumeration value="downall"/> + <xs:enumeration value="up"/> + <xs:enumeration value="down"/> + <xs:enumeration value="default"/> + <xs:enumeration value="upright"/> + <xs:enumeration value="upleft"/> + <xs:enumeration value="downright"/> + <xs:enumeration value="downleft"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="replace_sprite"> + <!-- also used for drawBefore --> + <xs:restriction base="xs:string"> + <xs:enumeration value="hair"/> + <xs:enumeration value="hat"/> + <xs:enumeration value="pants"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="sound_event"> + <xs:restriction base="xs:string"> + <xs:enumeration value="strike"/> + <xs:enumeration value="hit"/> + <xs:enumeration value="miss"/> + <xs:enumeration value="die"/> + <xs:enumeration value="hurt"/> + <xs:enumeration value="move"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="item_drawBefore"> + <xs:attribute name="name" type="replace_sprite" use="required"/> + <xs:attribute name="direction" type="replace_dir" use="required"/> + </xs:complexType> + <xs:complexType name="item_sprite"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="gender" type="sex" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="item_replace"> + <xs:sequence> + <xs:element name="item" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="from" type="xs:integer" use="optional"/> + <xs:attribute name="to" type="xs:integer" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="direction" type="replace_dir" use="optional"/> + <xs:attribute name="sprite" type="replace_sprite" use="required"/> + </xs:complexType> + <xs:complexType name="item_sound"> + <!-- TODO also being used for monster sounds, see if that's really ok --> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="event" type="sound_event" use="required"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:simpleType name="attack_action"> + <xs:restriction base="xs:string"> + <xs:enumeration value="attack"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="attack_type"> + <xs:restriction base="xs:string"> + <xs:enumeration value="direct"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="unit_type"> + <xs:restriction base="xs:string"> + <xs:enumeration value="currency"/> + <xs:enumeration value="weight"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="sprite_action"> + <xs:restriction base="xs:string"> + <xs:enumeration value="stand"/> + <xs:enumeration value="walk"/> + <xs:enumeration value="attack"/> + <xs:enumeration value="dead"/> + <xs:enumeration value="default"/> + <xs:enumeration value="sit"/> + <xs:enumeration value="attack_bow"/> + <xs:enumeration value="attack_sword_stab"/> + <xs:enumeration value="attack_dagger_stab"/> + <xs:enumeration value="attack_spear"/> + <xs:enumeration value="attack_chop"/> + <xs:enumeration value="attack_2hand"/> + <xs:enumeration value="cast"/> + <xs:enumeration value="attack_dagger_stab"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="literal_stand"> + <xs:restriction base="xs:string"> + <xs:enumeration value="stand"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="sequence"> + <xs:attribute name="start" type="xs:integer" use="required"/> + <xs:attribute name="end" type="xs:integer" use="required"/> + <xs:attribute name="delay" type="xs:integer" use="optional"/> + <xs:attribute name="offsetX" type="xs:integer" use="optional"/> + <xs:attribute name="offsetY" type="xs:integer" use="optional"/> + </xs:complexType> + <xs:complexType name="animation"> + <xs:sequence> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="frame"> + <xs:complexType> + <xs:attribute name="index" type="xs:integer" use="required"/> + <xs:attribute name="delay" type="xs:integer" use="optional"/> + <xs:attribute name="offsetX" type="xs:integer" use="optional"/> + <xs:attribute name="offsetY" type="xs:integer" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="sequence" type="sequence"/> + </xs:choice> + <xs:element name="end" minOccurs="0"> + <xs:complexType> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="direction" type="replace_dir" use="optional"/> + <xs:attribute name="imageset" type="xs:string" use="optional"/> + <xs:attribute name="width" type="xs:integer" use="optional"/> + <xs:attribute name="height" type="xs:integer" use="optional"/> + </xs:complexType> + <xs:complexType name="emitter"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="property"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="value" type="xs:string" use="optional"/> + <xs:attribute name="min" type="xs:decimal" use="optional"/> + <xs:attribute name="max" type="xs:decimal" use="optional"/> + <xs:attribute name="change-func" type="change_func" use="optional"/> + <xs:attribute name="change-amplitude" type="xs:integer" use="optional"/> + <xs:attribute name="change-period" type="xs:integer" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="animation" type="animation"/> + <xs:element name="emitter" type="emitter"/> + </xs:choice> + </xs:complexType> + <xs:simpleType name="change_func"> + <xs:restriction base="xs:string"> + <xs:enumeration value="sine"/> + </xs:restriction> + </xs:simpleType> + <!-- + end meta + --> + <!-- + effects.xml + --> + <xs:element name="being-effects"> + <xs:complexType> + <xs:sequence> + <xs:element name="effect" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="audio" type="xs:string" use="optional"/> + <xs:attribute name="particle" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + charcreation.xml + --> + <xs:element name="chars"> + <xs:complexType> + <xs:sequence> + <xs:element name="haircolor"> + <xs:complexType> + <xs:attribute name="min" type="xs:integer" use="required"/> + <xs:attribute name="max" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="hairstyle"> + <xs:complexType> + <xs:attribute name="min" type="xs:integer" use="required"/> + <xs:attribute name="max" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="stat"> + <xs:complexType> + <xs:attribute name="min" type="xs:integer" use="required"/> + <xs:attribute name="max" type="xs:integer" use="required"/> + <xs:attribute name="sum" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + hair.xml + --> + <xs:element name="colors"> + <xs:complexType> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:element name="color" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="value" type="xs:string" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + features.xml, paths.xml + --> + <xs:element name="configuration"> + <xs:complexType> + <xs:sequence> + <xs:element name="option" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="value" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + emotes.xml + --> + <xs:element name="emotes"> + <xs:complexType> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:element name="emote" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="sprite"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="variant" type="xs:integer" use="required"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="id" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + equipmentwindow.xml + --> + <xs:element name="equipment"> + <xs:complexType> + <xs:sequence> + <xs:element name="window"> + <xs:complexType> + <xs:attribute name="width" type="xs:integer" use="required"/> + <xs:attribute name="height" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="playerbox"> + <xs:complexType> + <xs:attribute name="x" type="xs:integer" use="required"/> + <xs:attribute name="y" type="xs:integer" use="required"/> + <xs:attribute name="width" type="xs:integer" use="required"/> + <xs:attribute name="height" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="slot" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="x" type="xs:integer" use="required"/> + <xs:attribute name="y" type="xs:integer" use="required"/> + <xs:attribute name="image" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + items.xml + --> + <xs:element name="items"> + <xs:complexType> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:element ref="include" minOccurs="0" maxOccurs="unbounded"/> + <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <!-- + TODO change xml files to all be <replace/> <sprite/> + --> + <xs:sequence> + <xs:element name="drawBefore" minOccurs="0" type="item_drawBefore"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="sprite" type="item_sprite"/> + <xs:element name="replace" type="item_replace"/> + </xs:choice> + <xs:element name="sound" minOccurs="0" maxOccurs="unbounded" type="item_sound"/> + <xs:element name="particlefx" minOccurs="0" type="xs:string"/> + </xs:sequence> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="type" type="xs:string" use="optional"/> + <xs:attribute name="name" type="xs:string" use="optional"/> + <xs:attribute name="attack-action" type="xs:string" use="optional"/> + <xs:attribute name="image" type="xs:string" use="optional"/> + <xs:attribute name="description" type="xs:string" use="optional"/> + <xs:attribute name="hp" type="xs:integer" use="optional"/> + <xs:attribute name="weight" type="xs:integer" use="optional"/> + <xs:attribute name="tag" type="xs:string" use="optional"/> + <xs:attribute name="effect" type="xs:string" use="optional"/> + <xs:attribute name="defense" type="xs:integer" use="optional"/> + <xs:attribute name="sellProtected" type="xs:boolean" use="optional"/> + <xs:attribute name="attack-range" type="xs:integer" use="optional"/> + <xs:attribute name="missile-particle" type="xs:string" use="optional"/> + <xs:attribute name="mp" type="xs:integer" use="optional"/> + <xs:attribute name="str" type="xs:integer" use="optional"/> + <xs:attribute name="agi" type="xs:integer" use="optional"/> + <xs:attribute name="vit" type="xs:integer" use="optional"/> + <xs:attribute name="int" type="xs:integer" use="optional"/> + <xs:attribute name="dex" type="xs:integer" use="optional"/> + <xs:attribute name="luck" type="xs:integer" use="optional"/> + <xs:attribute name="drawBefore" type="xs:string" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + maps.xml + --> + <xs:element name="maps"> + <xs:complexType> + <xs:sequence> + <xs:element name="map" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="atlas"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="atlas" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="file" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + monsters.xml + --> + <xs:element name="monsters"> + <xs:complexType> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:element name="monster" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:choice maxOccurs="unbounded"> + <xs:element name="sprite" type="xs:string"/> + <xs:element name="particlefx" type="xs:string"/> + <xs:element name="sound" type="item_sound"/> + <xs:element name="attack" minOccurs="0"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="critical-hit-effect-id" type="xs:integer" use="optional"/> + <xs:attribute name="hit-effect-id" type="xs:integer" use="optional"/> + <xs:attribute name="effect-id" type="xs:integer" use="optional"/> + <xs:attribute name="particle-effect" type="xs:string" use="optional"/> + <xs:attribute name="missile-particle" type="xs:string" use="optional"/> + <xs:attribute name="action" type="attack_action" use="optional"/> + <xs:attribute name="type" type="attack_type" use="optional"/> + </xs:complexType> + </xs:element> + </xs:choice> + </xs:sequence> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="targetCursor" type="cursor" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="offset" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <!-- + npcs.xml + --> + <xs:element name="npcs"> + <xs:complexType> + <xs:sequence> + <xs:element name="npc" maxOccurs="unbounded"> + <xs:complexType> + <!-- This 'minOccurs' is suspicious --> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="sprite"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="variant" type="xs:integer" use="optional"/> + <xs:attribute name="gender" type="sex" use="optional"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="particlefx" type="xs:string"/> + </xs:choice> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="targetSelection" type="xs:boolean" use="optional"/> + <xs:attribute name="nameOffsetX" type="xs:integer" use="optional"/> + <xs:attribute name="nameOffsetY" type="xs:integer" use="optional"/> + <xs:attribute name="targetOffsetX" type="xs:integer" use="optional"/> + <xs:attribute name="targetOffsetY" type="xs:integer" use="optional"/> + <xs:attribute name="targetCursor" type="cursor" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- skills.xml (modern), ea-skills.xml (for old versions) --> + <xs:element name="skills"> + <xs:complexType> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:element name="set" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="skill" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="icon" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + status-effects.xml + --> + <xs:element name="status-effects"> + <xs:complexType> + <xs:sequence> + <xs:element name="status-effect" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attribute name="block-id" type="xs:integer" use="optional"/> + <xs:attribute name="persistent-particle-effect" type="xs:boolean" use="optional"/> + <xs:attribute name="start-particle" type="xs:string" use="optional"/> + <xs:attribute name="icon" type="xs:string" use="optional"/> + <xs:attribute name="start-message" type="xs:string" use="optional"/> + <xs:attribute name="end-message" type="xs:string" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + units.xml + --> + <xs:element name="units"> + <xs:complexType> + <xs:sequence> + <xs:element name="unit" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="level" minOccurs="0"> + <xs:complexType> + <xs:attribute name="symbol" type="xs:string" use="required"/> + <xs:attribute name="count" type="xs:integer" use="required"/> + <xs:attribute name="round" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="type" type="unit_type" use="required"/> + <xs:attribute name="base" type="xs:string" use="required"/> + <xs:attribute name="round" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <!-- + weapons.xml + --> + <xs:element name="weapons"> + <xs:complexType> + <xs:choice maxOccurs="unbounded"> + <xs:element name="swords" type="weapon_items"/> + <xs:element name="bows" type="weapon_items"/> + <xs:element name="shields" type="weapon_items"/> + </xs:choice> + </xs:complexType> + </xs:element> + <xs:element name="effect"> + <xs:complexType> + <xs:sequence> + <xs:element name="particle" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="rotation" minOccurs="0"> + <xs:complexType> + <xs:sequence> + <xs:element name="sequence" type="sequence"/> + </xs:sequence> + <xs:attribute name="name" type="xs:string" use="optional"/> + <xs:attribute name="imageset" type="xs:string" use="required"/> + <xs:attribute name="width" type="xs:integer" use="required"/> + <xs:attribute name="height" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="animation" type="animation" minOccurs="0"/> + <xs:element name="emitter" type="emitter" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="position-x" type="xs:integer" use="required"/> + <xs:attribute name="position-y" type="xs:integer" use="required"/> + <xs:attribute name="position-z" type="xs:integer" use="required"/> + <xs:attribute name="lifetime" type="xs:integer" use="optional"/> + <xs:attribute name="follow-parent" type="xs:integer" use="optional"/> + <xs:attribute name="size-adjustable" type="xs:boolean" use="optional"/> + </xs:complexType> + </xs:element> + </xs:sequence> + </xs:complexType> + </xs:element> + <xs:element name="sprite"> + <xs:complexType> + <xs:sequence> + <xs:element name="imageset" maxOccurs="unbounded"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="src" type="xs:string" use="required"/> + <xs:attribute name="width" type="xs:integer" use="required"/> + <xs:attribute name="height" type="xs:integer" use="required"/> + <xs:attribute name="offsetY" type="xs:integer" use="optional"/> + </xs:complexType> + </xs:element> + <xs:element name="action" minOccurs="0" maxOccurs="unbounded"> + <xs:complexType> + <xs:sequence> + <xs:element name="animation" type="animation" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="name" type="sprite_action" use="required"/> + <xs:attribute name="imageset" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="include" minOccurs="0"> + <xs:complexType> + <xs:attribute name="file" use="required"/> + </xs:complexType> + </xs:element> + </xs:sequence> + <xs:attribute name="name" type="xs:string"/> + <xs:attribute name="action" type="literal_stand"/> + <xs:attribute name="variants" type="xs:integer"/> + <xs:attribute name="variant_offset" type="xs:integer"/> + </xs:complexType> + </xs:element> +</xs:schema> |