Initial commit

pull/1/head
Chris Jennewein 2019-09-06 15:05:25 -07:00
parent 195cef0327
commit bceac39df5
11 changed files with 130758 additions and 2 deletions

17
.travis.yml Normal file
View File

@ -0,0 +1,17 @@
language: generic
addons:
apt:
packages:
- xmlstarlet
- xsltproc
before_install:
- rvm install 2.3.8
- gem install dropbox-deployment
script:
- xmlstarlet val -e FightClub5eXML/Sources/*.xml
- xmlstarlet val -e Collections/*.xml
- xmlstarlet val -s Utilities/collection.xsd Collections/*.xml
- xmlstarlet val -s Utilities/compendium.xsd FightClub5eXML/Sources/*.xml
- for i in Collections/*.xml; do xsltproc -o FightClub5eXML/$i Utilities/merge.xslt $i; done
after_success:
- if [ $TRAVIS_BRANCH = master ] && [ $TRAVIS_PULL_REQUEST = false ]; then dropbox-deployment; else echo "Skip deploy for PR or Branch Validation"; fi

6
Collections/Core.xml Normal file
View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<collection>
<doc href="../FightClub5eXML/Sources/PlayersHandbook.xml" />
<doc href="../FightClub5eXML/Sources/DungeonMastersGuide.xml" />
<doc href="../FightClub5eXML/Sources/MonsterManual.xml" />
</collection>

View File

@ -0,0 +1,21 @@
# CHANGE LOG
## 2019-08-06
Massive update to correct over 8000 spelling and grammar mistakes!!
## 2019-08-05
Uploaded to Dropbox for the first time.
XML includes
* All previously collated by FightClub5eXML
* Waterdeep dragon heist monsters, items.
* Waterdeep Dungeon of the Mad Mage monsters.
* Ghosts of Saltmarsh items and some monsters.

9
FightClub5eXML/README.md Normal file
View File

@ -0,0 +1,9 @@
# README
Being a big fan of Lion Dens Fight Club 5e and Game Master 5e apps for iOS and Android I was happy to see a kind soul (@fightclub5exml on twitter) had picked up the mantle of updating the compendium with content.
Unfortunately he seems to have deleted his twitter account so I am picking up where he left off by expanding on his work by adding Waterdeep Dragon Heist, Waterdeep Dungeon of the Mad Mage and Ghosts of Saltmarsh content to the XML.
Will take a few weeks but will be making my way through each book and adding the items and monsters to bring it up to date.
Any questions hit me up on twitter [@dragonahcas](http://twitter.com/dragonahcas).

File diff suppressed because it is too large Load Diff

21
LICENSE Normal file
View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2019 Chris Jennewein
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -1,2 +1,66 @@
# FightClub5eXML
Creating XML files of all D&amp;D sources compatible with Fight Club 5e and Game Master 5e apps for iOS and Android.
# Fight Club 5e XML
Creating XML files of all official D&D sources compatible with Fight Club 5e and Game Master 5e apps for iOS and Android.
## Usage
Final XML files are released on a shared Dropbox. If you're here to import the files into your app, instructions are in the Dropbox.
This repository is not an application in itself. But you can use it to build your own custom Compendium (see below).
## Contributing
If you'd like to contribute, feel free to fork the repository and submit pull requests with your changes.
## Development
* The XML files in the FightClub5eXML directory are Compendiums organized by source book.
* The files in Collections define which sources are merged into their own Compendium XML.
* When the master branch is updated, Travis CI validates the XML, builds the Compendiums, and deploys to Dropbox.
### Manual Validation
While you add to XML files, you can manually validate the XML to catch any errors.
You can find an online XML Linter or use xmllint in the command line. The schema files are in the Utilities folder.
Here is an example, running xmllint at the top level of the repo, using the compendium schema to validate an xml file in Sources:
```bash
xmllint --noout --schema Utilities/compendium.xsd FightClub5eXML/Sources/CorePlusUnearthedArcana.xml
```
## Build your own Compendium
### Create a collection file
A collection file is an XML file that lists which sources you would like to merge into your custom Compendium. It must follow this format:
```xml
<?xml version="1.0" encoding="UTF-8"?>
<collection>
<doc href="../FightClub5eXML/Sources/PlayersHandbook.xml" />
<doc href="../FightClub5eXML/Sources/DungeonMastersGuide.xml" />
<doc href="../FightClub5eXML/Sources/MonsterManual.xml" />
</collection>
```
You can have one or more `<doc>` tags. Each doc must reference an xml file with a `<compendium>` root element.
The name of the collection file will be the name of the final Compendium.
### Execute the merge
With your collection in place, you're ready to build your Compendium by merging the sources together.
Execute this line in your shell at the top level of the repo:
```bash
for i in Collections/*.xml; do xsltproc -o FightClub5eXML/$i Utilities/merge.xslt $i; done
```
This is the same line that is executed in our .travis.yml and will place all combined Compendiums in FightClub5eXML/Collections/

17
Utilities/collection.xsd Normal file
View File

@ -0,0 +1,17 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="collection" type="collectionType"/>
<xs:complexType name="docType">
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="href" use="required"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="collectionType">
<xs:sequence>
<xs:element type="docType" name="doc" maxOccurs="unbounded" minOccurs="1"/>
</xs:sequence>
</xs:complexType>
</xs:schema>

449
Utilities/compendium.xsd Normal file
View File

@ -0,0 +1,449 @@
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="compendium" type="compendiumType"/>
<!-- Restrictions -->
<xs:simpleType name="empty">
<xs:restriction base="xs:string">
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="roll">
<xs:restriction base="xs:string">
<xs:pattern value="SPELL|([\(]*[0-9]*((d[0-9])+)*([+-][0-9]+)*([+-](S[Tt][Rr]|D[Ee][Xx]|C[Oo][Nn]|I[Nn][Tt]|W[Ii][Ss]|C[Hh][Aa]|PROF|%0|LVL|W|W[Oo]|SPELL)?)*[\)]*)*[+-]?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="rollFormula">
<xs:restriction base="xs:string">
<xs:pattern value="SPELL|([\(]*[0-9]*((d[0-9])+)*([+-x/][0-9]+)*([+-x/](S[Tt][Rr]|D[Ee][Xx]|C[Oo][Nn]|I[Nn][Tt]|W[Ii][Ss]|C[Hh][Aa]|PROF|LVL|W|W[Oo]|SPELL)?)*[\)]*)*[+-x/]?"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="integer">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="double">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]*[.]?[0-9]*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="boolean">
<xs:restriction base="xs:string">
<xs:pattern value="(YES|NO|[01])*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="acType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]+( [(].*[)])*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="hpType">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9]+( [(][0-9]*(d[0-9]+)*([+-][0-9]+)*[)])*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="crType">
<xs:restriction base="xs:string">
<xs:pattern value="([0-9]+|(1/[248]))*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="integerList">
<xs:restriction base="xs:string">
<xs:pattern value="[0-9 ]*(, ?[0-9 ]*)*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="propertyList">
<xs:restriction base="xs:string">
<xs:pattern value="(A|F|H|L|LD|R|S|T|2H|V|M)*(, ?(A|F|H|L|LD|R|S|T|2H|V|M)*)*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="abilityBonusList">
<xs:restriction base="xs:string">
<xs:pattern value="((S[Tt][Rr]|D[Ee][Xx]|C[Oo][Nn]|I[Nn][Tt]|W[Ii][Ss]|C[Hh][Aa]) [+-]?[0-9]+)*(, ?((S[Tt][Rr]|D[Ee][Xx]|C[Oo][Nn]|I[Nn][Tt]|W[Ii][Ss]|C[Hh][Aa]) [+-]?[0-9]+))*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="abilityList">
<xs:restriction base="xs:string">
<xs:pattern value="([Ss]trength|[Dd]exterity|[Cc]onstitution|[Ii]ntelligence|[Ww]isdom|[Cc]harisma)*(, ?([Ss]trength|[Dd]exterity|[Cc]onstitution|[Ii]ntelligence|[Ww]isdom|[Cc]harisma)*)*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="skillList">
<xs:restriction base="xs:string">
<xs:pattern value="([Aa]crobatics|[Aa]thletics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival)*(, ?([Aa]crobatics|[Aa]thletics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival)*)*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="skillBonusList">
<xs:restriction base="xs:string">
<xs:pattern value="(([Aa]crobatics|[Aa]thletics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival) [+-]?[0-9]+)*(, ?(([Aa]crobatics|[Aa]thletics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival) [+-]?[0-9]+)*)*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="abilityAndSkillList">
<xs:restriction base="xs:string">
<xs:pattern value="([Ss]trength|[Dd]exterity|[Cc]onstitution|[Ii]ntelligence|[Ww]isdom|[Cc]harisma|[Aa]crobatics|[Aa]thletics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival)*(, ?([Ss]trength|[Dd]exterity|[Cc]onstitution|[Ii]ntelligence|[Ww]isdom|[Cc]harisma|[Aa]crobatics|[Aa]thletics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival)*)*"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="itemEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="LA"/>
<xs:enumeration value="MA"/>
<xs:enumeration value="HA"/>
<xs:enumeration value="S"/>
<xs:enumeration value="M"/>
<xs:enumeration value="R"/>
<xs:enumeration value="A"/>
<xs:enumeration value="RD"/>
<xs:enumeration value="ST"/>
<xs:enumeration value="WD"/>
<xs:enumeration value="RG"/>
<xs:enumeration value="P"/>
<xs:enumeration value="SC"/>
<xs:enumeration value="W"/>
<xs:enumeration value="G"/>
<xs:enumeration value="$"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="damageEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="B"/>
<xs:enumeration value="P"/>
<xs:enumeration value="S"/>
<xs:enumeration value="A"/>
<xs:enumeration value="C"/>
<xs:enumeration value="F"/>
<xs:enumeration value="FC"/>
<xs:enumeration value="L"/>
<xs:enumeration value="N"/>
<xs:enumeration value="PS"/>
<xs:enumeration value="R"/>
<xs:enumeration value="T"/>
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="sizeEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="T"/>
<xs:enumeration value="S"/>
<xs:enumeration value="M"/>
<xs:enumeration value="L"/>
<xs:enumeration value="H"/>
<xs:enumeration value="G"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="abilityEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="Strength"/>
<xs:enumeration value="Dexterity"/>
<xs:enumeration value="Constitution"/>
<xs:enumeration value="Intelligence"/>
<xs:enumeration value="Wisdom"/>
<xs:enumeration value="Charisma"/>
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="skillEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="Athletics"/>
<xs:enumeration value="Acrobatics"/>
<xs:enumeration value="Animal Handling"/>
<xs:enumeration value="Arcana"/>
<xs:enumeration value="Deception"/>
<xs:enumeration value="History"/>
<xs:enumeration value="Insight"/>
<xs:enumeration value="Intimidation"/>
<xs:enumeration value="Investigation"/>
<xs:enumeration value="Medicine"/>
<xs:enumeration value="Nature"/>
<xs:enumeration value="Perception"/>
<xs:enumeration value="Performance"/>
<xs:enumeration value="Persuasion"/>
<xs:enumeration value="Religion"/>
<xs:enumeration value="Sleight of Hand"/>
<xs:enumeration value="Stealth"/>
<xs:enumeration value="Survival"/>
<xs:enumeration value=""/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="categoryEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="bonus"/>
<xs:enumeration value="ability score"/>
<xs:enumeration value="ability modifier"/>
<xs:enumeration value="saving throw"/>
<xs:enumeration value="skills"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="schoolEnum">
<xs:restriction base="xs:string">
<xs:enumeration value="A"/>
<xs:enumeration value="C"/>
<xs:enumeration value="D"/>
<xs:enumeration value="EN"/>
<xs:enumeration value="EV"/>
<xs:enumeration value="I"/>
<xs:enumeration value="N"/>
<xs:enumeration value="T"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="modifierValue">
<xs:restriction base="xs:string">
<xs:pattern value="([Pp]assive )?([Ss]trength|[Dd]exterity|[Cc]onstitution|[Ii]ntelligence|[Ww]isdom|[Cc]harisma|[Hh][Pp]) ?[+-]? ?([0-9]*|%0|prof)"/>
<xs:pattern value="([Mm]elee damage|[Mm]elee attacks|[Ww]eapon damage|[Ww]eapon attacks|[Rr]anged damage|[Rr]anged attacks|[Ss]pell attack|[Ss]pell [Dd][Cc]|[Ss]aving throws|[Aa][Cc]|[Ss]peed|[Pp]roficiency bonus|[Ii]nitiative) ?[+-]? ?([0-9]*|%0|prof)"/>
<xs:pattern value="([Aa]thletics|[Aa]crobatics|[Aa]nimal [Hh]andling|[Aa]rcana|[Dd]eception|[Hh]istory|[Ii]nsight|[Ii]ntimidation|[Ii]nvestigation|[Mm]edicine|[Nn]ature|[Pp]erception|[Pp]erformance|[Pp]ersuasion|[Rr]eligion|[Ss]leight of [Hh]and|[Ss]tealth|[Ss]urvival) ?[+-]? ?([0-9]*|%0|prof)"/>
</xs:restriction>
</xs:simpleType>
<xs:simpleType name="attackType">
<xs:restriction base="xs:string">
<xs:pattern value="(.*[|]([ ]|[0-9]*)[|]([0-9]*(d[0-9]+)*([+-][0-9]+)*)*)*"/>
</xs:restriction>
</xs:simpleType>
<!-- End Restrictions -->
<!-- Shared Types -->
<xs:complexType name="modifierType">
<xs:simpleContent>
<xs:extension base="modifierValue">
<xs:attribute type="categoryEnum" name="category"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<xs:complexType name="traitType">
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="text" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="attackType" name="attack" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="xs:string" name="special" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="slotsType">
<xs:simpleContent>
<xs:extension base="integerList">
<xs:attribute type="boolean" name="optional" use="optional"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
<!-- End Shared Types -->
<!-- Monster -->
<xs:complexType name="monsterType">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="xs:string" name="name"/>
<xs:element type="sizeEnum" name="size"/>
<xs:element type="xs:string" name="type"/>
<xs:element type="xs:string" name="alignment"/>
<xs:element type="acType" name="ac"/>
<xs:element type="hpType" name="hp"/>
<xs:element type="xs:string" name="speed"/>
<xs:element type="xs:integer" name="str"/>
<xs:element type="xs:integer" name="dex"/>
<xs:element type="xs:integer" name="con"/>
<xs:element type="xs:integer" name="int"/>
<xs:element type="xs:integer" name="wis"/>
<xs:element type="xs:integer" name="cha"/>
<xs:element type="abilityBonusList" name="save"/>
<xs:element type="skillBonusList" name="skill"/>
<xs:element type="xs:string" name="resist"/>
<xs:element type="xs:string" name="vulnerable"/>
<xs:element type="xs:string" name="immune"/>
<xs:element type="xs:string" name="conditionImmune"/>
<xs:element type="xs:string" name="senses"/>
<xs:element type="xs:integer" name="passive"/>
<xs:element type="xs:string" name="languages"/>
<xs:element type="crType" name="cr"/>
<xs:element type="traitType" name="trait"/>
<xs:element type="traitType" name="action"/>
<xs:element type="traitType" name="legendary"/>
<xs:element type="traitType" name="reaction"/>
<xs:element type="xs:string" name="spells"/>
<xs:element type="slotsType" name="slots"/>
<xs:element type="xs:string" name="environment"/>
</xs:choice>
</xs:complexType>
<!-- End Monster -->
<!-- Spell -->
<xs:complexType name="spellType">
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:integer" name="level"/>
<xs:element type="schoolEnum" name="school" minOccurs="0"/>
<xs:element type="boolean" name="ritual"/>
<xs:element type="xs:string" name="time"/>
<xs:element type="xs:string" name="range"/>
<xs:element type="xs:string" name="components"/>
<xs:element type="xs:string" name="duration"/>
<xs:element type="xs:string" name="classes"/>
<xs:element type="xs:string" name="text" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="roll" name="roll" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<!-- End Spell -->
<!-- Background -->
<xs:complexType name="backgroundType">
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="skillList" name="proficiency"/>
<xs:element type="traitType" name="trait" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<!-- End Background -->
<!-- Feat -->
<xs:complexType name="featType">
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="prerequisite"/>
<xs:element type="xs:string" name="text" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="abilityAndSkillList" name="proficiency" minOccurs="0"/>
<xs:element type="modifierType" name="modifier" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<!-- End Feat -->
<!-- Class -->
<xs:complexType name="featureType">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:string" name="text"/>
<xs:element type="xs:string" name="special"/>
<xs:element type="modifierType" name="modifier"/>
<xs:element type="xs:string" name="proficiency"/>
</xs:choice>
<xs:attribute type="boolean" name="optional" use="optional"/>
</xs:complexType>
<xs:complexType name="autolevelType" mixed="true">
<xs:sequence>
<xs:element type="featureType" name="feature" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="slotsType" name="slots" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:integer" name="level" use="optional"/>
<xs:attribute type="boolean" name="scoreImprovement" use="optional"/>
</xs:complexType>
<xs:complexType name="classType">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="xs:string" name="name"/>
<xs:element type="xs:integer" name="hd"/>
<xs:element type="abilityAndSkillList" name="proficiency"/>
<xs:element type="abilityEnum" name="spellAbility"/>
<xs:element type="integer" name="numSkills"/>
<xs:element type="autolevelType" name="autolevel"/>
<xs:element type="xs:string" name="armor"/>
<xs:element type="xs:string" name="weapons"/>
<xs:element name="tools">
<xs:complexType mixed="true">
<xs:sequence>
<xs:element type="featureType" name="feature" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="slotsType" name="slots" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:integer" name="level" use="optional"/>
<xs:attribute type="xs:string" name="scoreImprovement" use="optional"/>
</xs:complexType>
</xs:element>
<xs:element type="rollFormula" name="wealth"/>
</xs:choice>
</xs:complexType>
<!-- End Class -->
<!-- Item -->
<xs:complexType name="itemType">
<xs:choice maxOccurs="unbounded" minOccurs="0">
<xs:element type="xs:string" name="name"/>
<xs:element type="itemEnum" name="type"/>
<xs:element type="boolean" name="magic"/>
<xs:element type="xs:string" name="detail"/>
<xs:element type="double" name="weight"/>
<xs:element type="xs:string" name="text"/>
<xs:element type="roll" name="roll"/>
<xs:element type="double" name="value"/>
<xs:element type="modifierType" name="modifier"/>
<xs:element type="xs:integer" name="ac"/>
<xs:element type="integer" name="strength"/>
<xs:element type="boolean" name="stealth"/>
<xs:element type="roll" name="dmg1"/>
<xs:element type="roll" name="dmg2"/>
<xs:element type="damageEnum" name="dmgType"/>
<xs:element type="propertyList" name="property"/>
<xs:element type="xs:string" name="range"/>
</xs:choice>
</xs:complexType>
<!-- End Item -->
<!-- Race -->
<xs:complexType name="raceType">
<xs:sequence>
<xs:element type="xs:string" name="name"/>
<xs:element type="sizeEnum" name="size"/>
<xs:element type="xs:integer" name="speed"/>
<xs:element type="abilityBonusList" name="ability"/>
<xs:element type="abilityEnum" name="spellAbility"/>
<xs:element type="skillList" name="proficiency"/>
<xs:element type="traitType" name="trait" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="modifierType" name="modifier" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
<!-- End Race -->
<!-- Compendium -->
<xs:complexType name="compendiumType">
<xs:sequence>
<xs:element type="itemType" name="item" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="raceType" name="race" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="classType" name="class" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="featType" name="feat" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="backgroundType" name="background" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="spellType" name="spell" maxOccurs="unbounded" minOccurs="0"/>
<xs:element type="monsterType" name="monster" maxOccurs="unbounded" minOccurs="0"/>
</xs:sequence>
<xs:attribute type="xs:byte" name="version"/>
<xs:attribute type="xs:string" name="auto_indent"/>
</xs:complexType>
</xs:schema>

10
Utilities/merge.xslt Normal file
View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<xsl:transform version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="xml" indent="yes" />
<xsl:template match="collection">
<compendium version="5" auto_indent="NO">
<xsl:copy-of select="document(doc/@href)/compendium/*" />
</compendium>
</xsl:template>
</xsl:transform>

4
dropbox-deployment.yml Normal file
View File

@ -0,0 +1,4 @@
deploy:
dropbox_path: /FightClub5eXML # The path to the folder on Dropbox where the files will go
artifacts_path: ./FightClub5eXML # can be a single file, or a path
debug: true # if you want to see more logs