diff options
Diffstat (limited to 'client/tmw.xsd')
-rw-r--r-- | client/tmw.xsd | 1689 |
1 files changed, 1204 insertions, 485 deletions
diff --git a/client/tmw.xsd b/client/tmw.xsd index 139f3b9..7019770 100644 --- a/client/tmw.xsd +++ b/client/tmw.xsd @@ -1,637 +1,1356 @@ <?xml version="1.0" encoding="utf-8"?> <!-- vim: set sts=2 sw=2: --> +<!-- + Last updated for ManaPlus v1.4.7.19-21-g58f499d + Integer ranges are not currently bounds-checked. +--> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:its="http://www.w3.org/2005/11/its" elementFormDefault="qualified"> + <xs:import namespace="http://www.w3.org/2005/11/its" schemaLocation="dl/its.xsd"/> + <!-- stuff up here is used everywhere--> + <xs:element name="include" type="include"/> + <xs:complexType name="include"> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + <xs:complexType name="empty"/> <!-- - meta + XML::getBoolProperty --> + <xs:simpleType name="bool"> + <xs:restriction base="xs:string"> + <xs:enumeration value="true"/> + <xs:enumeration value="false"/> + </xs:restriction> + </xs:simpleType> + <!-- roots, with their children nearby --> <!-- - 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) + EffectManager::loadXmlFile + effectsFile: effects.xml + effectsPatchFile: effects_patch.xml + effectsPatchDir: effects.d/*.xml --> - <xs:import namespace="http://www.w3.org/2005/11/its" schemaLocation="dl/its.xsd"/> + <xs:element name="being-effects" type="root_being-effects"/> + <xs:complexType name="root_being-effects"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="effect"> + <xs:complexType> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="particle" type="xs:string" use="optional"/> + <xs:attribute name="audio" type="xs:string" use="optional"/> + <xs:attribute name="sprite" type="xs:string" use="optional"/> + </xs:complexType> + </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - common + Configuration::init/ConfigurationObject::initFromXML + branding + portable.xml + command-line + config + <configdir>/test.xml + <configdir>/config.xml + serverConfig + <configdir>/<server>/config.xml + paths + paths.xml + features + featuresFile features.xml --> - <xs:complexType name="weapon_items"> + <xs:element name="configuration" type="root_configuration"/> + <xs:complexType name="root_configuration"> <xs:sequence> - <xs:element name="item" maxOccurs="unbounded"> - <xs:complexType> - <xs:attribute name="id" type="xs:integer" use="required"/> - </xs:complexType> - </xs:element> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="list"> + <xs:complexType> + <!-- what manaplus does is actually impossible to represent --> + <!-- TODO in a future version fix this horrible abuse of XML --> + <xs:choice> + <xs:element name="nested_conf_1" type="root_configuration" maxOccurs="unbounded"/> + <xs:element name="nested_conf_2" type="root_configuration" maxOccurs="unbounded"/> + </xs:choice> + <xs:attribute name="name" type="nested_configuration" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="option"> + <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:choice> </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:simpleType name="nested_configuration"> <xs:restriction base="xs:string"> - <xs:enumeration value="small"/> - <xs:enumeration value="large"/> + <xs:enumeration value="nested_conf_1"/> + <xs:enumeration value="nested_conf_2"/> </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"/> + <!-- + Particle::addEffect(file|dye, x, y, rot) + --> + <xs:element name="effect" type="root_effect"/> + <xs:complexType name="root_effect"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="particle"> + <xs:complexType> + <xs:sequence> + <xs:group ref="particle_extras" minOccurs="0" maxOccurs="unbounded"/> + <!-- this should probably be required to go first --> + <xs:choice minOccurs="0"> + <xs:element name="animation" type="animation_1"/> + <xs:element name="rotation" type="animation_1"/> + <xs:element name="image" type="xs:string"/> + </xs:choice> + <xs:group ref="particle_extras" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + <xs:attribute name="position-x" type="xs:float" default="0"/> + <xs:attribute name="position-y" type="xs:float" default="0"/> + <xs:attribute name="position-z" type="xs:float" default="0"/> + <!-- TODO is this really? It was so unusual, but it's common. --> + <xs:attribute name="lifetime" type="xs:int" use="optional"/> + <xs:attribute name="size-adjustable" type="bool" default="false"/> + </xs:complexType> + </xs:element> + </xs:choice> + </xs:sequence> </xs:complexType> - <xs:complexType name="item_sprite"> + <xs:group name="particle_extras"> + <xs:choice> + <xs:element name="emitter" type="particle_emitter"/> + <xs:element name="deatheffect" type="death_effect"/> + </xs:choice> + </xs:group> + <xs:complexType name="death_effect"> <xs:simpleContent> <xs:extension base="xs:string"> - <xs:attribute name="gender" type="sex" use="optional"/> + <xs:attribute name="on-floor" type="bool" default="true"/> + <xs:attribute name="on-sky" type="bool" default="true"/> + <xs:attribute name="on-other" type="bool" default="false"/> + <xs:attribute name="on-impact" type="bool" default="true"/> + <xs:attribute name="on-timeout" type="bool" default="true"/> </xs:extension> </xs:simpleContent> </xs:complexType> - <xs:complexType name="item_replace"> - <xs:sequence> - <xs:element name="item" maxOccurs="unbounded"> + <!-- + SimpleAnimation::initializeAnimation + --> + <xs:complexType name="animation_1"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="frame"> <xs:complexType> - <xs:attribute name="from" type="xs:integer" use="optional"/> - <xs:attribute name="to" type="xs:integer" use="optional"/> + <xs:attributeGroup ref="frame_or_sequence_attrs"/> + <xs:attribute name="index" type="xs:int" use="required"/> </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:element name="sequence"> + <xs:complexType> + <xs:attributeGroup ref="frame_or_sequence_attrs"/> + <xs:attribute name="start" type="xs:int" use="required"/> + <xs:attribute name="end" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="end" type="empty"/> + </xs:choice> + <xs:attribute name="imageset" type="xs:string" use="required"/> + <xs:attribute name="width" type="xs:int" use="required"/> + <xs:attribute name="height" type="xs:int" 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> + <!-- + ParticleEmitter::ParticleEmitter + --> + <xs:complexType name="animation_2"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="frame"> + <xs:complexType> + <xs:attributeGroup ref="frame_or_sequence_attrs"/> + <xs:attribute name="index" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="sequence"> + <xs:complexType> + <xs:attributeGroup ref="frame_or_sequence_attrs"/> + <xs:attribute name="start" type="xs:int" use="required"/> + <xs:attribute name="end" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="end" type="empty"/> + </xs:choice> + <xs:attribute name="imageset" type="xs:string" use="required"/> + <xs:attribute name="width" type="xs:int" use="required"/> + <xs:attribute name="height" type="xs:int" use="required"/> + <xs:attribute name="subX" type="xs:int" use="optional"/> + <xs:attribute name="subY" type="xs:int" use="optional"/> + <xs:attribute name="subWidth" type="xs:int" use="optional"/> + <xs:attribute name="subHeight" type="xs:int" use="optional"/> </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"> + <!-- + SpriteDef::loadAnimation + --> + <xs:complexType name="animation_3"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="frame"> <xs:complexType> + <xs:attributeGroup ref="frame_or_sequence_attrs"/> + <xs:attribute name="index" type="xs:int" use="required"/> </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:element name="sequence"> + <xs:complexType> + <xs:attributeGroup ref="frame_or_sequence_attrs"/> + <xs:attribute name="start" type="xs:int" use="required"/> + <xs:attribute name="end" type="xs:int" use="required"/> + <xs:attribute name="value" type="xs:string" use="optional"/> + <xs:attribute name="repeat" type="xs:int" default="1"/> + </xs:complexType> + </xs:element> + <xs:element name="end" type="empty"/> + <xs:element name="jump"> + <xs:complexType> + <xs:attribute name="action" type="xs:string" use="required"/> + <xs:attribute name="rand" type="xs:int" default="100"/> + </xs:complexType> + </xs:element> + <xs:element name="label"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="goto"> + <xs:complexType> + <xs:attribute name="label" type="xs:string" use="required"/> + <xs:attribute name="rand" type="xs:int" default="100"/> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="direction" default="default"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="default"/> + <xs:enumeration value="up"/> + <xs:enumeration value="left"/> + <xs:enumeration value="right"/> + <xs:enumeration value="down"/> + <xs:enumeration value="upleft"/> + <xs:enumeration value="upright"/> + <xs:enumeration value="downleft"/> + <xs:enumeration value="downright"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> </xs:complexType> - <xs:complexType name="emitter"> - <xs:choice maxOccurs="unbounded"> + <xs:attributeGroup name="frame_or_sequence_attrs"> + <xs:attribute name="delay" type="xs:int" default="0"/> + <xs:attribute name="offsetX" type="xs:int" default="0"/> + <xs:attribute name="offsetY" type="xs:int" default="0"/> + <xs:attribute name="rand" type="xs:int" default="100"/> + </xs:attributeGroup> + <!-- + ParticleEmitter::ParticleEmitter + --> + <xs:complexType name="particle_emitter"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> <xs:element name="property"> <xs:complexType> - <xs:attribute name="name" type="xs:string" use="required"/> + <!-- TODO in a future version fix this horrible abuse of XML --> + <xs:attribute name="name" type="particle_property" use="required"/> + <!-- type varies depending on property --> <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:attribute name="min" type="xs:float" use="optional"/> + <xs:attribute name="max" type="xs:float" use="optional"/> + <xs:attribute name="change-func" default="none"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="none"/> + <xs:enumeration value="saw"/> + <xs:enumeration value="sawtooth"/> + <xs:enumeration value="sine"/> + <xs:enumeration value="sinewave"/> + <xs:enumeration value="triangle"/> + <xs:enumeration value="square"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="change-amplitude" type="xs:float" use="optional"/> + <xs:attribute name="change-period" type="xs:int" use="optional"/> + <xs:attribute name="change-phase" type="xs:int" use="optional"/> + <!-- only for subimage --> + <xs:attribute name="x" type="xs:int" use="optional"/> + <xs:attribute name="y" type="xs:int" use="optional"/> + <xs:attribute name="width" type="xs:int" use="optional"/> + <xs:attribute name="height" type="xs:int" use="optional"/> </xs:complexType> </xs:element> - <xs:element name="animation" type="animation"/> - <xs:element name="emitter" type="emitter"/> + <xs:element name="emitter" type="particle_emitter"/> + <xs:element name="rotation" type="animation_2"/> + <xs:element name="animation" type="animation_2"/> + <xs:element name="deatheffect" type="death_effect"/> </xs:choice> </xs:complexType> - <xs:simpleType name="change_func"> + <xs:simpleType name="particle_property"> <xs:restriction base="xs:string"> - <xs:enumeration value="sine"/> + <!-- xs:float --> + <xs:enumeration value="position-x"/> + <!-- xs:float --> + <xs:enumeration value="position-y"/> + <!-- xs:float --> + <xs:enumeration value="position-z"/> + <!-- xs:string --> + <xs:enumeration value="image"/> + <!-- xs:string for value, also xs:int for x/w/width/height --> + <xs:enumeration value="subimage"/> + <!-- xs:float --> + <xs:enumeration value="horizontal-angle"/> + <!-- xs:float --> + <xs:enumeration value="vertical-angle"/> + <!-- xs:float --> + <xs:enumeration value="power"/> + <!-- xs:float --> + <xs:enumeration value="gravity"/> + <!-- xs:int --> + <xs:enumeration value="randomness"/> + <!-- xs:float --> + <xs:enumeration value="bounce"/> + <!-- xs:int --> + <xs:enumeration value="lifetime"/> + <!-- xs:int --> + <xs:enumeration value="output"/> + <!-- xs:int --> + <xs:enumeration value="output-pause"/> + <!-- xs:float --> + <xs:enumeration value="acceleration"/> + <!-- xs:float --> + <xs:enumeration value="die-distance"/> + <!-- xs:float --> + <xs:enumeration value="momentum"/> + <!-- xs:int --> + <xs:enumeration value="fade-out"/> + <!-- xs:int --> + <xs:enumeration value="fade-in"/> + <!-- xs:float --> + <xs:enumeration value="alpha"/> + <!-- ignored --> + <xs:enumeration value="follow-parent"/> </xs:restriction> </xs:simpleType> <!-- - end meta - --> - <!-- - effects.xml + QuestsWindow::loadXmlFile + questsFile: quests.xml + questsPatchFile: quests_patch.xml + questsPatchDir: quests.d/*.xml --> - <xs:element name="being-effects"> - <xs:complexType> - <xs:sequence> - <xs:element name="effect" maxOccurs="unbounded"> + <xs:element name="quests" type="root_quests"/> + <xs:complexType name="root_quests"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="var"> <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:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="quest" type="quests_var_quest"/> + <xs:element name="effect" type="quests_var_effect"/> + </xs:choice> + <xs:attribute name="id" type="xs:int" use="required"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - charcreation.xml + QuestsWindow::loadQuest --> - <xs:element name="chars"> - <xs:complexType> - <xs:sequence> - <xs:element name="haircolor"> + <xs:complexType name="quests_var_quest"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="text" type="xs:string"/> + <xs:element name="name" type="xs:string"/> + <xs:element name="reward" type="xs:string"/> + </xs:choice> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="group" type="xs:string" use="required"/> + <!-- + For all known quests, exactly one of these is provided, with a single + integer value. However, manaplus actually parses both, and as a + comma-separated list. (xsd spec says they should be space-separated). + --> + <!-- TODO fix this horrible abuse of XML--> + <xs:attribute name="complete" type="xs:int" use="optional"/> + <xs:attribute name="incomplete" type="xs:int" use="optional"/> + </xs:complexType> + <!-- + QuestsWindow::loadEffect + --> + <xs:complexType name="quests_var_effect"> + <xs:attribute name="map" type="xs:string" use="required"/> + <xs:attribute name="npc" type="xs:int" use="required"/> + <xs:attribute name="effect" type="xs:int" use="required"/> + <!-- Really a comma-separated list, but xsd wants space-separated --> + <!-- TODO fix this horrible abuse of XML--> + <xs:attribute name="value" type="xs:string" use="required"/> + </xs:complexType> + <!-- + SkillDialog::loadXmlFile + skillsFile or skillsFile2: skills.xml or ea-skills.xml (but these were backwards before v1.4.1.18) + skillsPatchFile: skills_patch.xml + skillsPatchDir: skills.d/*.xml + --> + <xs:element name="skills" type="root_skills"/> + <xs:complexType name="root_skills"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="set"> <xs:complexType> - <xs:attribute name="min" type="xs:integer" use="required"/> - <xs:attribute name="max" type="xs:integer" use="required"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="skill"> + <xs:complexType> + <!-- By code, sometimes 'id' is 'var', but I don't see it in the wild. --> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="useButton" type="xs:string" default="Use"/> + <xs:attribute name="icon" type="xs:string" use="optional"/> + <xs:attribute name="level" type="xs:int" default="0"/> + <xs:attribute name="shortName" type="xs:string" use="optional"/> + <xs:attribute name="description" type="xs:string" use="optional"/> + <xs:attribute name="particle" type="xs:string" use="optional"/> + <xs:attribute name="soundHit" type="xs:string" use="optional"/> + <xs:attribute name="soundHitDelay" type="xs:int" use="optional"/> + <xs:attribute name="soundMiss" type="xs:string" use="optional"/> + <xs:attribute name="soundMissDelay" type="xs:int" use="optional"/> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="name" type="xs:string" use="required"/> </xs:complexType> </xs:element> - <xs:element name="hairstyle"> + </xs:choice> + </xs:sequence> + </xs:complexType> + <!-- + EquipmentWindow::fillBoxes + equipmentWindowFile: equipmentwindow.xml + --> + <xs:element name="equipment" type="root_equipment"/> + <xs:complexType name="root_equipment"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="playerbox" type="equipment_playerbox"/> + <xs:element name="slot" type="equipment_slot"/> + </xs:choice> + </xs:sequence> + <xs:attribute name="image" type="xs:string" default="equipmentbox.png"/> + </xs:complexType> + <!-- + EquipmentWindow::loadPlayerBox + --> + <xs:complexType name="equipment_playerbox"> + <xs:attribute name="x" type="xs:int" use="required"/> + <xs:attribute name="y" type="xs:int" use="required"/> + <xs:attribute name="width" type="xs:int" use="required"/> + <xs:attribute name="height" type="xs:int" use="required"/> + </xs:complexType> + <!-- + EquipmentWindow::loadSlot + --> + <xs:complexType name="equipment_slot"> + <xs:attribute name="name" type="equipment_slot_name" use="required"/> + <xs:attribute name="x" type="xs:int" use="required"/> + <xs:attribute name="y" type="xs:int" use="required"/> + <xs:attribute name="image" type="xs:int" use="required"/> + </xs:complexType> + <xs:simpleType name="equipment_slot_name"> + <xs:restriction base="xs:string"> + <xs:enumeration value="shoes"/> + <xs:enumeration value="boot"/> + <xs:enumeration value="boots"/> + <xs:enumeration value="bottomclothes"/> + <xs:enumeration value="bottom"/> + <xs:enumeration value="pants"/> + <xs:enumeration value="topclothes"/> + <xs:enumeration value="top"/> + <xs:enumeration value="torso"/> + <xs:enumeration value="body"/> + <xs:enumeration value="misc1"/> + <xs:enumeration value="cape"/> + <xs:enumeration value="misc2"/> + <xs:enumeration value="scarf"/> + <xs:enumeration value="scarfs"/> + <xs:enumeration value="hat"/> + <xs:enumeration value="hats"/> + <xs:enumeration value="wings"/> + <xs:enumeration value="glove"/> + <xs:enumeration value="gloves"/> + <xs:enumeration value="weapon"/> + <xs:enumeration value="weapons"/> + <xs:enumeration value="shield"/> + <xs:enumeration value="shields"/> + <xs:enumeration value="amulet"/> + <xs:enumeration value="amulets"/> + <xs:enumeration value="ring"/> + <xs:enumeration value="rings"/> + <xs:enumeration value="arrow"/> + <xs:enumeration value="arrows"/> + <xs:enumeration value="ammo"/> + </xs:restriction> + </xs:simpleType> + <!-- + Units::loadXMLFile + unitsFile: units.xml + unitsPatchFile: units_patch.xml + unitsPatchDir: units.d/*.xml + --> + <xs:element name="units" type="root_units"/> + <xs:complexType name="root_units"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="unit"> <xs:complexType> - <xs:attribute name="min" type="xs:integer" use="required"/> - <xs:attribute name="max" type="xs:integer" use="required"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="level"> + <xs:complexType> + <xs:attribute name="symbol" type="xs:string" use="required"/> + <xs:attribute name="count" type="xs:int" use="required"/> + <xs:attribute name="round" type="xs:int" use="optional"/> + <xs:attribute name="separator" type="xs:string" use="optional"/> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="type" type="units_unit_type" use="required"/> + <xs:attribute name="conversion" type="xs:int" default="1"/> + <xs:attribute name="mix" type="yesno" default="no"/> + <xs:attribute name="base" type="xs:string" default="ยค"/> + <xs:attribute name="round" type="xs:int" default="2"/> + <xs:attribute name="separator" type="xs:string" default=" "/> </xs:complexType> </xs:element> - <xs:element name="stat"> + </xs:choice> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="units_unit_type"> + <xs:restriction base="xs:string"> + <xs:enumeration value="currency"/> + <xs:enumeration value="weight"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="yesno"> + <xs:restriction base="xs:string"> + <xs:enumeration value="yes"/> + <xs:enumeration value="no"/> + </xs:restriction> + </xs:simpleType> + <!-- + StatusEffect::loadXmlFile + statusEffectsFile: status-effects.xml + statusEffectsPatchFile: status-effects_patch.xml + statusEffectsPatchDir: status-effects.d/*.xml + --> + <xs:element name="status-effects" type="root_status-effects"/> + <xs:complexType name="root_status-effects"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="status-effect"> <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:attribute name="block-id" type="xs:int" use="optional"/> + <xs:attributeGroup ref="status_or_stun_attrs"/> </xs:complexType> </xs:element> - <xs:element name="item" minOccurs="0" maxOccurs="unbounded"> + <xs:element name="stun-effect"> <xs:complexType> - <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:attributeGroup ref="status_or_stun_attrs"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> + <xs:attributeGroup name="status_or_stun_attrs"> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="start-message" type="xs:string" use="optional"/> + <xs:attribute name="start-audio" type="xs:string" use="optional"/> + <xs:attribute name="start-particle" type="xs:string" use="optional"/> + <xs:attribute name="icon" type="xs:string" use="optional"/> + <xs:attribute name="action" type="xs:string" use="optional"/> + <xs:attribute name="persistent-particle-effect" type="yesno" use="optional"/> + <xs:attribute name="end-message" type="xs:string" use="optional"/> + <xs:attribute name="end-audio" type="xs:string" use="optional"/> + <xs:attribute name="end-particle" type="xs:string" use="optional"/> + </xs:attributeGroup> <!-- - hair.xml + maps and tilesets omitted, they have a DTD from tiled --> - <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 + EmoteDB::loadXmlFile + emotesFile: emotes.xml + emotesPatchFile: emotes.xml + emotesPatchDir: emotes.d/*.xml + EmoteDB::loadSpecialXmlFile + manaplus_emotes.xml --> - <xs:element name="configuration"> - <xs:complexType> - <xs:sequence> - <xs:element name="option" maxOccurs="unbounded"> + <xs:element name="emotes" type="root_emotes"/> + <xs:complexType name="root_emotes"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="emote"> <xs:complexType> - <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="value" type="xs:string" use="required"/> + <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:int" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="particlefx" type="xs:string"/> + </xs:choice> + <xs:attribute name="id" type="xs:int" use="required"/> + <!-- altid is only in manaplus_emotes.xml --> + <xs:attribute name="altid" type="xs:int" use="optional"/> + <xs:attribute name="time" type="xs:int" default="500"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - emotes.xml + NPCDB::loadXmlFile + npcsFile: npcs.xml + npcsPatchFile: npcs.xml + npcsPatchDir: npcs.d/*.xml --> - <xs:element name="emotes"> - <xs:complexType> - <xs:sequence> - <xs:element ref="its:rules" minOccurs="0"/> - <xs:element name="emote" maxOccurs="unbounded"> + <xs:element name="npcs" type="root_npcs"/> + <xs:complexType name="root_npcs"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="npc"> <xs:complexType> - <xs:sequence> + <xs:choice minOccurs="0" maxOccurs="unbounded"> <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:attribute name="variant" type="xs:int" default="0"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> - </xs:sequence> - <xs:attribute name="id" type="xs:integer" use="required"/> + <xs:element name="particlefx" type="xs:string"/> + </xs:choice> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="targetSelection" type="bool" default="true"/> + <xs:attributeGroup ref="being_basic_attributes"/> + <xs:attribute name="deadSortOffsetY" type="xs:int" default="31"/> + <xs:attribute name="avatar" type="xs:unsignedShort" default="0"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> + <xs:attributeGroup name="being_basic_attributes"> + <xs:attribute name="targetCursor" type="cursor" default="medium"/> + <!-- + default for hoverCursor varies: + npc: "talk" + monster: "attack" + pet: "talk" + --> + <xs:attribute name="hoverCursor" type="xs:string" use="optional"/> + <xs:attribute name="targetOffsetX" type="xs:int" default="0"/> + <xs:attribute name="targetOffsetY" type="xs:int" default="0"/> + <xs:attribute name="nameOffsetX" type="xs:int" default="0"/> + <xs:attribute name="nameOffsetY" type="xs:int" default="0"/> + <xs:attribute name="sortOffsetY" type="xs:int" default="0"/> + <xs:attribute name="hpBarOffsetX" type="xs:int" default="0"/> + <xs:attribute name="hpBarOffsetY" type="xs:int" default="0"/> + </xs:attributeGroup> + <xs:simpleType name="cursor"> + <xs:restriction base="xs:string"> + <xs:enumeration value="small"/> + <xs:enumeration value="medium"/> + <xs:enumeration value="large"/> + </xs:restriction> + </xs:simpleType> <!-- - equipmentwindow.xml + ItemDB::loadXmlFile + itemsFile: items.xml + itemsPatchFile: items_patch.xml + itemsPatchDir: items.d/*.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:element name="items" type="root_items"/> + <xs:complexType name="root_items"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="item"> <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:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="sprite" type="items_item_sprite"/> + <xs:element name="particlefx" type="xs:string"/> + <xs:element name="sound" type="items_item_sound"/> + <xs:element name="floor" type="items_item_floor"/> + <xs:element name="replace" type="items_item_replace"/> + <xs:element name="drawAfter" type="items_item_draworder"/> + <xs:element name="drawBefore" type="items_item_draworder"/> + </xs:choice> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="type" type="items_item_type" default="other"/> + <xs:attribute name="weight" type="xs:int" default="0"/> + <xs:attribute name="view" type="xs:int" default="0"/> + <xs:attribute name="name" type="xs:string" default="unnamed"/> <xs:attribute name="image" type="xs:string" use="optional"/> + <xs:attribute name="floor" 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="attack-action" type="xs:string" use="optional"/> + <xs:attribute name="skyattack-action" type="xs:string" use="optional"/> + <xs:attribute name="waterattack-action" type="xs:string" use="optional"/> + <xs:attribute name="drawBefore" type="xs:string" use="optional"/> + <xs:attribute name="drawAfter" type="xs:string" use="optional"/> + <xs:attribute name="pet" type="xs:int" default="0"/> + <xs:attribute name="maxFloorOffset" type="xs:int" default="0"/> + <xs:attribute name="useButton" type="xs:string" use="optional"/> + <xs:attribute name="useButton2" type="xs:string" use="optional"/> + <xs:attribute name="colors" type="xs:string" use="optional"/> + <!-- Can't use both tag and tag1; tag has precedence. --> <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="tag1" type="xs:string" use="optional"/> + <xs:attribute name="tag2" type="xs:string" use="optional"/> + <xs:attribute name="tag3" type="xs:string" use="optional"/> + <xs:attribute name="drawPriority" type="xs:int" default="0"/> + <xs:attribute name="attack-range" type="xs:int" default="0"/> <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:attribute name="hit-effect-id" type="xs:string" use="optional"/> + <xs:attribute name="critical-hit-effect-id" type="xs:string" use="optional"/> + <xs:attribute name="miss-effect-id" type="xs:string" use="optional"/> + <xs:attribute name="sellProtected" type="bool" default="false"/> + <xs:attribute name="pickupCursor" type="xs:string" default="pickup"/> + <xs:attribute name="attack" type="xs:string" use="optional"/> + <xs:attribute name="criticalattack" type="xs:string" use="optional"/> + <xs:attribute name="mattack" type="xs:string" use="optional"/> + <xs:attribute name="defense" type="xs:string" use="optional"/> + <xs:attribute name="criticaldefense" type="xs:string" use="optional"/> + <xs:attribute name="mdefense" type="xs:string" use="optional"/> + <xs:attribute name="hp" type="xs:string" use="optional"/> + <xs:attribute name="mp" type="xs:string" use="optional"/> + <xs:attribute name="level" type="xs:string" use="optional"/> + <xs:attribute name="speed" type="xs:string" use="optional"/> + <xs:attribute name="range" type="xs:string" use="optional"/> + <xs:attribute name="flee" type="xs:string" use="optional"/> + <xs:attribute name="str" type="xs:string" use="optional"/> + <xs:attribute name="agi" type="xs:string" use="optional"/> + <xs:attribute name="vit" type="xs:string" use="optional"/> + <xs:attribute name="int" type="xs:string" use="optional"/> + <xs:attribute name="dex" type="xs:string" use="optional"/> + <xs:attribute name="luck" type="xs:string" use="optional"/> + <xs:attribute name="effect" type="xs:string" use="optional"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> + <xs:simpleType name="items_item_type"> + <xs:restriction base="xs:string"> + <xs:enumeration value="generic"/> + <xs:enumeration value="other"/> + <xs:enumeration value="usable"/> + <xs:enumeration value="equip-1hand"/> + <xs:enumeration value="equip-2hand"/> + <xs:enumeration value="equip-torso"/> + <xs:enumeration value="equip-arms"/> + <xs:enumeration value="equip-head"/> + <xs:enumeration value="equip-legs"/> + <xs:enumeration value="equip-shield"/> + <xs:enumeration value="equip-ring"/> + <xs:enumeration value="equip-charm"/> + <xs:enumeration value="equip-necklace"/> + <xs:enumeration value="equip-neck"/> + <xs:enumeration value="equip-feet"/> + <xs:enumeration value="equip-ammo"/> + <xs:enumeration value="racesprite"/> + <xs:enumeration value="hairsprite"/> + </xs:restriction> + </xs:simpleType> + <xs:complexType name="items_item_sprite"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="variant" type="xs:int" default="0"/> + <xs:attribute name="race" type="xs:int" default="0"/> + <xs:attribute name="gender" default="unisex"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="unisex"/> + <xs:enumeration value="male"/> + <xs:enumeration value="female"/> + <xs:enumeration value="other"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="items_item_sound"> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="event" use="required"> + <xs:simpleType> + <xs:restriction base="xs:string"> + <xs:enumeration value="hit"/> + <xs:enumeration value="strike"/> + <xs:enumeration value="miss"/> + <xs:enumeration value="use"/> + <xs:enumeration value="equip"/> + <xs:enumeration value="unequip"/> + <xs:enumeration value="drop"/> + <xs:enumeration value="pickup"/> + <xs:enumeration value="take"/> + <xs:enumeration value="put"/> + </xs:restriction> + </xs:simpleType> + </xs:attribute> + <xs:attribute name="delay" type="xs:int" default="0"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + <xs:complexType name="items_item_floor"> + <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:int" default="0"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="particlefx" type="xs:string"/> + </xs:choice> + </xs:complexType> + <xs:complexType name="items_item_replace"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="item"> + <xs:complexType> + <xs:attribute name="from" type="xs:int" use="optional"/> + <xs:attribute name="to" type="xs:int" use="optional"/> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="sprite" type="items_item_x_sprite" use="optional"/> + <xs:attribute name="direction" type="items_item_x_direction" default="all"/> + </xs:complexType> + <xs:complexType name="items_item_draworder"> + <xs:attribute name="name" type="items_item_x_sprite" use="required"/> + <xs:attribute name="priority" type="xs:int" use="optional"/> + <xs:attribute name="direction" type="items_item_x_direction" default="all"/> + </xs:complexType> + <xs:simpleType name="items_item_x_sprite"> + <xs:restriction base="xs:string"> + <xs:enumeration value="race"/> + <xs:enumeration value="type"/> + <xs:enumeration value="shoes"/> + <xs:enumeration value="boot"/> + <xs:enumeration value="boots"/> + <xs:enumeration value="bottomclothes"/> + <xs:enumeration value="bottom"/> + <xs:enumeration value="pants"/> + <xs:enumeration value="topclothes"/> + <xs:enumeration value="top"/> + <xs:enumeration value="torso"/> + <xs:enumeration value="body"/> + <xs:enumeration value="misc1"/> + <xs:enumeration value="misc2"/> + <xs:enumeration value="scarf"/> + <xs:enumeration value="scarfs"/> + <xs:enumeration value="hair"/> + <xs:enumeration value="hat"/> + <xs:enumeration value="hats"/> + <xs:enumeration value="wings"/> + <xs:enumeration value="glove"/> + <xs:enumeration value="gloves"/> + <xs:enumeration value="weapon"/> + <xs:enumeration value="weapons"/> + <xs:enumeration value="shield"/> + <xs:enumeration value="shields"/> + <xs:enumeration value="amulet"/> + <xs:enumeration value="amulets"/> + <xs:enumeration value="ring"/> + <xs:enumeration value="rings"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="items_item_x_direction"> + <xs:restriction base="xs:string"> + <xs:enumeration value="down"/> + <xs:enumeration value="downleft"/> + <xs:enumeration value="leftdown"/> + <xs:enumeration value="left"/> + <xs:enumeration value="upleft"/> + <xs:enumeration value="leftup"/> + <xs:enumeration value="up"/> + <xs:enumeration value="upright"/> + <xs:enumeration value="rightup"/> + <xs:enumeration value="right"/> + <xs:enumeration value="downright"/> + <xs:enumeration value="rightdown"/> + <xs:enumeration value="downall"/> + <xs:enumeration value="upall"/> + <xs:enumeration value="died"/> + <!-- handled by implicit else --> + <xs:enumeration value="all"/> + </xs:restriction> + </xs:simpleType> <!-- - maps.xml + SoundDB::loadXmlFile + soundsFile: sounds.xml + soundsPatchFile: sounds_patch.xml + soundsPatchDir: sounds.d/*.xml --> - <xs:element name="maps"> - <xs:complexType> - <xs:sequence> - <xs:element name="map" maxOccurs="unbounded"> + <xs:element name="sounds" type="root_sounds"/> + <xs:complexType name="root_sounds"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="sound"> <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:attribute name="value" type="xs:string" use="required"/> </xs:complexType> </xs:element> - <xs:element name="atlas" maxOccurs="unbounded"> + </xs:choice> + </xs:sequence> + </xs:complexType> + <!-- + ColorDB::loadHair + hairColorFile: hair.xml + hairColorPatchFile: hair.xml + hairColorPatchDir: hair.d/*.xml + ColorDB::loadColorLists + itemColorFile: itemcolors.xml + itemColorPatchFile: itemcolors_patch.xml + itemColorPatchDir: itemcolors.d/*.xml + --> + <xs:element name="colors" type="root_colors"/> + <xs:complexType name="root_colors"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice> + <!-- hair.xml --> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="color" type="colors_color"/> + </xs:choice> + <!-- itemcolors.xml --> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="list"> + <xs:complexType> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="color" type="colors_color"/> + </xs:choice> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:choice> + </xs:choice> + </xs:sequence> + </xs:complexType> + <xs:complexType name="colors_color"> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="value" type="xs:string" use="required"/> + </xs:complexType> + <!-- + MapDB::loadInfo + mapsFile: maps.xml + mapsPatchFile: maps_patch.xml + mapsPatchDir: maps.d/*.xml + --> + <xs:element name="maps" type="root_maps"/> + <xs:complexType name="root_maps"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="map" type="maps_map"/> + <xs:element name="atlas" type="maps_atlas"/> + </xs:choice> + </xs:sequence> + </xs:complexType> + <!-- MapDB::readMap --> + <xs:complexType name="maps_map"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="atlas"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + <!-- MapDB::readMap --> + <xs:complexType name="maps_atlas"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="file"> + <xs:complexType> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="name" type="xs:string" use="required"/> + </xs:complexType> + <!-- + MapDB::loadRemap + mapsRemapFile: maps/remap.xml + --> + <xs:element name="remap" type="root_remap"/> + <xs:complexType name="root_remap"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <!-- TODO <xs:element ref="include"/> --> + <xs:element name="map"> <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:attribute name="value" type="xs:string" use="required"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> + <!-- + DeadDB::loadXmlFile + deadMessagesFile: deadmessages.xml + deadMessagesPatchFile: deadmessages_patch.xml + deadMessagesPatchDir: deadmessages.d/*.xml + --> + <xs:element name="dead-messages" type="root_dead-messages"/> + <xs:complexType name="root_dead-messages"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="message" type="xs:string"/> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - monsters.xml + AvatarDB::loadXmlFile + avatarsFile: avatars.xml + avatarsPatchFile: avatars_patch.xml + avatarsPatchDir: avatars.d/*.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:element name="avatars" type="root_avatars"/> + <xs:complexType name="root_avatars"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="avatar"> <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:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="sprite"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="variant" type="xs:int" default="0"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + </xs:choice> + <xs:attribute name="id" type="xs:int" use="required"/> <xs:attribute name="name" type="xs:string" use="required"/> - <xs:attribute name="targetCursor" type="cursor" use="optional"/> + <xs:attribute name="targetOffsetX" type="xs:int" default="0"/> + <xs:attribute name="targetOffsetY" type="xs:int" default="0"/> + <xs:attribute name="width" type="xs:int" default="0"/> + <xs:attribute name="height" type="xs:int" default="0"/> </xs:complexType> </xs:element> - </xs:sequence> - <xs:attribute name="offset" type="xs:integer" use="required"/> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - npcs.xml + MonsterDB::loadXmlFile + monstersFile: monsters.xml + monstersPatchFile: monsters_patch.xml + monstersPatchDir: monsters.d/*.xml --> - <xs:element name="npcs"> - <xs:complexType> - <xs:sequence> - <xs:element name="npc" maxOccurs="unbounded"> + <xs:element name="monsters" type="root_monsters"/> + <xs:complexType name="root_monsters"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="monster"> <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:attribute name="variant" type="xs:int" default="0"/> </xs:extension> </xs:simpleContent> </xs:complexType> </xs:element> + <xs:element name="sound"> + <xs:complexType> + <xs:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="event" type="monster_sound_event" use="required"/> + <xs:attribute name="delay" type="xs:int" default="0"/> + </xs:extension> + </xs:simpleContent> + </xs:complexType> + </xs:element> + <xs:element name="attack"> + <xs:complexType> + <xs:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="effect-id" type="xs:int" use="optional"/> + <xs:attribute name="hit-effect-id" type="xs:int" use="optional"/> + <xs:attribute name="critical-hit-effect-id" type="xs:int" use="optional"/> + <xs:attribute name="miss-effect-id" type="xs:int" use="optional"/> + <xs:attribute name="action" type="xs:string" default="attack"/> + <xs:attribute name="skyaction" type="xs:string" default="skyattack"/> + <xs:attribute name="wateraction" type="xs:string" default="waterattack"/> + <xs:attribute name="missile-particle" type="xs:string" use="optional"/> + </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:attribute name="id" type="xs:int" use="required"/> + <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attributeGroup ref="being_basic_attributes"/> + <xs:attribute name="maxHP" type="xs:int" use="optional"/> + <xs:attribute name="deadSortOffsetY" type="xs:int" default="31"/> + <xs:attribute name="colors" type="xs:string" use="optional"/> + <xs:attribute name="walkType" type="monster_walktype" default="walk"/> </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:choice> + </xs:sequence> + <!-- really optional with default="1002", but that's not sane --> + <xs:attribute name="offset" type="xs:int" use="required"/> + </xs:complexType> + <xs:simpleType name="monster_walktype"> + <xs:restriction base="xs:string"> + <xs:enumeration value="walk"/> + <xs:enumeration value="fly"/> + <xs:enumeration value="swim"/> + <xs:enumeration value="walkswim"/> + <xs:enumeration value="swimwalk"/> + </xs:restriction> + </xs:simpleType> + <xs:simpleType name="monster_sound_event"> + <xs:restriction base="xs:string"> + <xs:enumeration value="hit"/> + <xs:enumeration value="miss"/> + <xs:enumeration value="hurt"/> + <xs:enumeration value="die"/> + <xs:enumeration value="move"/> + <xs:enumeration value="sit"/> + <xs:enumeration value="sittop"/> + <xs:enumeration value="spawn"/> + </xs:restriction> + </xs:simpleType> + <!-- + PETDB::loadXmlFile + petsFile: pets.xml + petsPatchFile: pets_patch.xml + petsPatchDir: pets.d/*.xml + --> + <xs:element name="pets" type="root_pets"/> + <xs:complexType name="root_pets"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="pet"> <xs:complexType> - <xs:sequence> - <xs:element name="skill" maxOccurs="unbounded"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="sprite"> <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:simpleContent> + <xs:extension base="xs:string"> + <xs:attribute name="variant" type="xs:int" default="0"/> + </xs:extension> + </xs:simpleContent> </xs:complexType> </xs:element> - </xs:sequence> + <xs:element name="particlefx" type="xs:string"/> + </xs:choice> + <xs:attribute name="id" type="xs:int" use="required"/> <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="targetSelection" type="bool" default="true"/> + <xs:attributeGroup ref="being_basic_attributes"/> + <xs:attribute name="deadSortOffsetY" type="xs:int" default="31"/> + <xs:attribute name="startFollowDistance" type="xs:int" default="3"/> + <xs:attribute name="followDistance" type="xs:int" default="0"/> + <xs:attribute name="warpDistance" type="xs:int" default="11"/> + <xs:attribute name="walkSpeed" type="xs:int" default="0"/> + <xs:attribute name="offsetX" type="xs:int" default="0"/> + <xs:attribute name="offsetY" type="xs:int" default="1"/> + <xs:attribute name="sitOffsetX" type="xs:int" default="0"/> + <xs:attribute name="sitOffsetY" type="xs:int" default="1"/> + <xs:attribute name="moveOffsetX" type="xs:int" default="0"/> + <xs:attribute name="moveOffsetY" type="xs:int" default="1"/> + <xs:attribute name="deadOffsetX" type="xs:int" default="0"/> + <xs:attribute name="deadOffsetY" type="xs:int" default="1"/> + <xs:attribute name="attackOffsetX" type="xs:int" use="optional"/> + <xs:attribute name="attackOffsetY" type="xs:int" use="optional"/> + <xs:attribute name="thinkTime" type="xs:int" default="500"/> + <xs:attribute name="directionType" type="xs:int" default="1"/> + <xs:attribute name="sitDirectionType" type="xs:int" default="1"/> + <xs:attribute name="deadDirectionType" type="xs:int" default="1"/> + <xs:attribute name="attackDirectionType" type="xs:int" default="4"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - status-effects.xml + ModDB::loadXmlFile + modsFile: mods.xml + modsPatchFile: mods_patch.xml + modsPatchDir: mods.d/*.xml --> - <xs:element name="status-effects"> - <xs:complexType> - <xs:sequence> - <xs:element name="status-effect" maxOccurs="unbounded"> + <xs:element name="mods" type="root_mods"/> + <xs:complexType name="root_mods"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element ref="include"/> + <xs:element name="mod"> <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:attribute name="description" type="xs:string" use="optional"/> + <xs:attribute name="help" type="xs:string" use="optional"/> + <xs:attribute name="localdir" type="xs:string" use="optional"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> + </xs:choice> + </xs:sequence> + </xs:complexType> <!-- - units.xml + CharDB::load + charCreationFile: charcreation.xml --> - <xs:element name="units"> - <xs:complexType> - <xs:sequence> - <xs:element name="unit" maxOccurs="unbounded"> + <xs:element name="chars" type="root_chars"/> + <xs:complexType name="root_chars"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <!-- TODO <xs:element ref="include"/> --> + <xs:element name="haircolor"> <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:attribute name="min" type="xs:int" use="required"/> + <xs:attribute name="max" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="hairstyle"> + <xs:complexType> + <xs:attribute name="min" type="xs:int" use="required"/> + <xs:attribute name="max" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="look"> + <xs:complexType> + <xs:attribute name="min" type="xs:int" use="required"/> + <xs:attribute name="max" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="stat"> + <xs:complexType> + <xs:attribute name="min" type="xs:int" use="required"/> + <xs:attribute name="max" type="xs:int" use="required"/> + <xs:attribute name="sum" type="xs:int" use="required"/> + </xs:complexType> + </xs:element> + <xs:element name="item"> + <xs:complexType> + <xs:attribute name="id" type="xs:int" 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:sequence> + </xs:complexType> + <!-- + SpriteDef::load + SpriteDef::loadSprite + --> + <xs:element name="sprite" type="root_sprite"/> + <xs:complexType name="root_sprite"> + <xs:sequence> + <xs:element ref="its:rules" minOccurs="0"/> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <!-- SpriteDef::includeSprite --> + <xs:element name="include"> <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:attribute name="file" type="xs:string" use="required"/> </xs:complexType> </xs:element> - </xs:sequence> - </xs:complexType> - </xs:element> - <xs:element name="sprite"> - <xs:complexType> - <xs:sequence> - <xs:element name="imageset" maxOccurs="unbounded"> + <!-- SpriteDef::loadImageSet --> + <xs:element name="imageset"> <xs:complexType> <xs:attribute name="name" type="xs:string" use="required"/> + <xs:attribute name="width" type="xs:int" use="required"/> + <xs:attribute name="height" type="xs:int" 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:attribute name="offsetX" type="xs:int" default="0"/> + <xs:attribute name="offsetY" type="xs:int" default="0"/> </xs:complexType> </xs:element> - <xs:element name="action" minOccurs="0" maxOccurs="unbounded"> + <!-- SpriteDef::loadAction --> + <xs:element name="action"> <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:choice minOccurs="0" maxOccurs="unbounded"> + <!-- SpriteDef::loadAnimation --> + <xs:element name="animation" type="animation_3"/> + </xs:choice> + <!-- TODO mostly enum? --> + <xs:attribute name="name" type="xs:string" use="required"/> <xs:attribute name="imageset" type="xs:string" use="required"/> + <xs:attribute name="hp" type="xs:int" default="100"/> </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:choice> + </xs:sequence> + <xs:attribute name="variants" type="xs:int" use="optional"/> + <xs:attribute name="variant_offset" type="xs:int" use="optional"/> + </xs:complexType> + <xs:element name="weapons" type="root_weapons"/> + <xs:complexType name="root_weapons"> + <xs:choice maxOccurs="unbounded"> + <xs:element name="swords" type="weapons_items"/> + <xs:element name="bows" type="weapons_items"/> + <xs:element name="shields" type="weapons_items"/> + </xs:choice> + </xs:complexType> + <xs:complexType name="weapons_items"> + <xs:choice minOccurs="0" maxOccurs="unbounded"> + <xs:element name="item"> + <xs:complexType> + <xs:attribute name="id" type="xs:integer" use="required"/> + </xs:complexType> + </xs:element> + </xs:choice> + </xs:complexType> </xs:schema> |