These are three separate bug/features that appeared as I was writing a skill mod last night. 1. If an <ability> tag in skillsDB is (accidentally) closed off in the first line, the game will crash on startup with no explanation. For example, with everything else in place, Code: <ability name="Sanguinista" icon="mod/skills/wizard/bloodmagic1_64.png" skill="123" level="0"/> <description text="Placeholder."/> </ability> will cause a startup crash, due to the extra / in the first line. Given that I banged my head on the keyboard for an hour not realizing that I had done this when I first ran into it, it'd be much appreciated if things like this could be made to print a "Syntax error in skillsDB; the game will probably crash!" message, like the one for missing skill images and animations. 2. Placing comment tags around one <ability> in a skill tree will cause all the abilities in that tree that are after it in skillsDB to disappear from the in-game sKills menu. For example, with everything else in place, Code: <bloodmagicSkills> <ability name="Sanguinista" icon="mod/skills/wizard/bloodmagic1_64.png" skill="123" level="0"> <description text="Placeholder."/> </ability> <!-- <ability name="Vital Siphon" icon="mod/skills/vital_siphon64.png" skill="123" level="1" > <description text="Placeholder." /> </ability> --> <ability name="Spirit Stealer" icon="mod/skills/wizard/bloodmagic2_64.png" skill="123" level="2"> <description text="Placeholder."/> </ability> ... </bloodmagicSkills> will cause the skills after Vital Siphon (i.e. Spirit Stealer, Haemetic Phylactery, and Soul Collector) to disappear from the sKills menu, even if the level="n" arguments are renumbered. If Siphon was instead deleted outright, Stealer, Phylactery, and Collector would appear on the sKills menu (with a blank space between Sanguinista and Stealer if the level="n" arguments weren't changed). I suppose that this is somewhat preferable to an outright crash, of course, since once I realized what was going on I could work around it. 3. In both skillsDB and spellsDB, misspelling an element name inside a <resistbuff> tag will cause the game to treat it as a similiarly-sized existential damage buff instead. For example, Code: <resistbuff voltaic="1" conflagratory="2" hypoborean="3"/> is indistinguishable on the user end from Code: <resistbuff voltaic="1" conflagratory="2"/> <damagebuff existential="3"/> (note the misspelling of "hyperborean" in the first code box). Again, I suppose this is preferable to an outright crash, since once I knew about it I was able to use it to track down a three-in-the-morning spelling mistake in a particularly resist-heavy skill.
XML won't natively check for errors. You can, however, use an external XML syntax-checker like the following: http://www.w3schools.com/xml/xml_validator.asp The errors it spits out aren't always 100% intuitive, but they tell you on exactly which line you've borked your code. It does indeed notice the problem with your first chunk of code, though it's not going to be able to check your spelling for you.
Re:1: It's not the game's fault, but XML's (or rather, the programmer's), and you can get around that by using a syntax-checker, or working on your code in something that does show you faulty code fragments. And it's not like the game can send messages to you while you work on mods with notepad (or something of the kind), as that would require it to be sentience (and, as the Terminator series had shown it to us, that would be a very bad thing). Re:2: Once again, that's the result of faulty code, and it comes from XML (or rather, the programmer) and not from the game - the game is simply supposed to load skill until there's no skill with "n+1" ID, where "n" is the ID of the highest-levelled skill in that particular tree, and because of that, having holes in the tree will do just that. That being said, please try to learn at least the basics of coding before you attempt to do modifications that require coding, because without the ability to recognise even the most obviously faulty code, you won't get far. Re:3: The default resistance/damage is existential, and whether you believe it or not, this "feature" (as it is not a bug) is preferred to having the game crash on you, as you can at least see where said error is, instead of having to look for "something", "somewhere" in the code.