User:Gorgon/Sandbox/Sandbox Alpha: Difference between revisions

From Avlis Wiki
Jump to navigation Jump to search
m (More tweaks)
m (Unbreaking)
Tag: Manual revert
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
{{ns detect | talk = | avlis wiki = | file = | mediawiki = | help = | category =
<noinclude>{{<!-- sec -->User:Gorgon/Sandbox/Sandbox_Beta | User:Gorgon/Sandbox | 1 }}
 
Anything up to/including the '''Template start''' heading will not be included in transclusion of this template (or any part of the trailing documentation section either, though that will eventually be formalized template documentation, possibly with transcluded categories at the end).
 
I love to over-comment my code, so why change things here...
 
 
<div style="float:left; max-width:50%">__TOC__</div>
<br clear=all />
 
 
== Test version of [[Template:Spell]] ==
<!-- Add any revision notes or other ideas here. -->
 
 
=== Extensions that would make this work better [My wish list] ===
 
* [http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion Extension:Labeled Section Transclusion] - Allows '''selective''' transclusion of marked-off sections of text.
** [[Wikipedia:Wikipedia:Transclusion#Without_using_the_labeled_section_method | Wikipedia:Selective transclusion without using the labeled section method]] - This works here with onlyinclude and includeonly, so transcludesection=SECTIONNAME parameters are doable if [http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion Extension:Labeled Section Transclusion] isn't added.
 
 
* [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(third-party) Extension:DynamicPageList (third-party)] - Enhanced version of [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(Wikimedia) Extension:DynamicPageList (Wikimedia)]
** [http://semeb.com/dpldemo/index.php?title=DPL:Overview DPL:Overview] - Generate dynamic reports based on category members and selective included info from each (Extension:Labeled Section Transclusion above would really help there).
** [http://semeb.com/dpldemo/index.php?title=Template:Catlist DPL:Template:Catlist] - Picture this totally reformatted as filter/sort options up top of the [[Magic:Spell_List | Spell List]] page, as a dynamic table. It starts showing all spells, but sortable with one click by level, school, class, or any other useful [[Template:Spell]] parameter/category used by them. Then add in the ability to filter results to only certain kinds/combinations (e.g, Show only cleric evocation spells, sorted by level, with the option of showing specific domain ones as well).
** I doubt anyone else besides me would use this (except maybe the occasional dabbler), but it would really be useful for spells, and maybe a few other things eventually. Revamping all spells via this template is a huge undertaking (and my main goal for wiki updating, now that I can verify/test spells again), so adding this extension for that work alone would make a huge difference.
** <s>After looking into the more recent version of [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(Wikimedia) Extension:DynamicPageList (Wikimedia)] (the one used by most Wikimedia projects, not the "enhanced - 3rd party one"), it may be just as useful (or better), since it allows more sort options. Need to see both in practical use before deciding anything.</s>
*** This can't grab sections by template parameter name, but [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(third-party) Extension:DynamicPageList (third-party)] can. See: [http://semeb.com/dpldemo/index.php?title=DPL:Manual_-_DPL_parameters:_Controlling_output_volume#include_contents_related_to_templates include contents related to templates] for how to specify named parameters in a page using a specific template (So grab the name and description in one simple <code>include={Template:Spell}:Name:Description Summary</code> option line, to make a page listing all spells, or filter/sort by whatever criteria, including each Template:Spell parameter)
**** [http://wayback.archive.org/web/20161110223718/http://semeb.com/dpldemo/index.php?title=DPL:Manual_-_DPL_parameters:_Controlling_output_volume#include_contents_related_to_templates Internet Archive link to the same '''include contents related to templates''' link above], since the site is having PhP issues.
** I definitely want this now. The [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(Wikimedia) Extension:DynamicPageList (Wikimedia)] version is '''off my wish list''', since that functionality is pretty much the main reason I want it.
* [http://www.mediawiki.org/wiki/Extension:Arrays Extension:Arrays] - For parsing things like the V, S, M in a single "Descriptors" parameter, without a lot of #explode etc. code (still looking for the best way to do that, and that needs the string parsing extensions enbled).
 
 
=== Revision notes ===
 
* [[NWN:Template:Spell | Template:Spell on the NWN Wiki]] has some ideas, but not quite what I had in mind either.
 
 
* I think [[User:Buddha|Buddha]] had the right idea with his discussion on the [[Avlis_Wiki_talk:Categories#Categorizing_Spells | Categories page]] about reformatting how we categorize spells. The current [[Magic:Spell_List | Spell List]] page (and its various subversions) all rely on manual updating when any new changes happen to it, like a new spell being added. Revisions to this template will improve how each spell is displayed, and categorized (even without new extensions), so moving to category listings that update dynamically makes a lot of sense.
** If the suggested [http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion Labeled Section Transclusion] extension is added, then short spell descriptions and other info can be dynamically added/updated to manually updated lists, like [[Magic:Cleric_Spells:Level-1 | Cleric Spells:Level-1]], even without moving to categories.
*** [[Wikipedia:Wikipedia:Transclusion#Without_using_the_labeled_section_method | Wikipedia:Selective transclusion without using the labeled section method]] - This works here with onlyinclude and includeonly (see above), so a workaround without [http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion Labeled Section Transclusion].
** The [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(third-party) Dynamic Page List (third-party)] extension would allow one page to display all variations in any sort of table, sortable and filterable by any useful criteria. Spells would be automatically categorized by this template, but one page would use those categories and/or the template parameters, to display whatever output is requested by the user. Combine this with Labeled Section Transclusion, and any results are updated as each spell gets edited.
 
 
----
 
 
Can the '''Name''' template parameter be taken from the page name automatically?
* Maybe as a default if not given as a parameter?
* Might need some page renaming, but should work.
* Keeping the template from categorizing itself as a spell might be annoying, unless namespace checking or other validation is done.
 
 
* Taking the '''Name''' template parameter from the <nowiki>{{SUBPAGENAME}}</nowiki> isn't so simple.
** The Magic: (and Epic Spell:) prefix needs to be stripped after checking if it exists, especially for using it as a sort key with categories. Checking for it is easy with something like <code><nowiki>{{#ifeq:{{lc:{{padleft:|6|{{SUBPAGENAME}}}}}}|magic:|}}</nowiki></code>. Removing it is harder. <code><nowiki>{{#explode:{{SUBPAGENAME}}|:|1}}</nowiki></code> could do it, but needs the parser functions for string handling enabled with <code>$wgPFEnableStringFunctions = true;</code> in LocalSettings.php (see the second top note at: [http://www.mediawiki.org/wiki/Extension:StringFunctions Extension:StringFunctions]).
*** All the spell pages should be stripped of these prefixes themselves. Someone was setting it up as if there were actual namespaces for them, but there aren't. Do I really want to get into that mess?
** If the <nowiki>{{SUBPAGENAME}}</nowiki> has more than one word for the spell name, the second and latter words need to be capitalized.
*** Using some sort of <code><nowiki>{{#replace:{{#explode:{{SUBPAGENAME}}| |1}}|{{ucfirst:{{#explode:{{SUBPAGENAME}}</nowiki></code> code, that first counts the words and has enough depth levels for them all would get messy fast (for loop in wiki markup?).
*** Someone must have had a similar problem and found an easier solution, so do some searching.
** We'll have to assume all page names like Bigbys have been changed to use apostrophes too (e.g., Bigby's) - no sane way to check and fix that here (well maybe a switch with the known names already, but new ones would need constant updates... which it what this is supposed to eliminate).
** If it isn't easy, just make it a required parameter with error message, like the rest.
 
 
----
 
 
* Redone using onlyinclude sections with transcludesection tags (See above).
** Not as simple as Labeled Section Transclusion, and can't do some things with it, but good enough for now.
* Major School/Subschool/Descriptors redo.
** Added the <b>[[Magic:Spell_Format:Subschool | Subschool]]</b>: and <b>[[Magic:Descriptors | Descriptors]]</b>: prefixes, but they may make the School line too long.
** Added a bunch of validation checks in switches.
* Added <b>Spell Name:</b> at the top.
** Having every spell "Name" be the page name "Magic:Name" was inaccurate and confusing.
** Uses the Name = parameter, or <nowiki>{{SUBPAGENAME}}</nowiki> if not entered.
* All parameters are now Proper Case.
* Lowercase conversion is used for comparison validation of parameter values (when possible).
** ifeq: and case entries in a switch are case sensitive, so this is necessary.
* Proper Case conversion is used (when possible) in output results.
** If people don't use the right case, this should fix at least some of the issues.
* Added a bunch of namespace checks as part of the validation,
** All spells should be in the Main namespace, so anything outside that is a template (or test page in a userspace).
** Added a hak to make my sandbox spell pages work as if in Main (remember to change it back when publishing this).
* Started making missing parameter entries (without forced defaults or warnings) not show in Main, instead of the <nowiki>{{{parameter name}}}</nowiki> (like in the Template namespace).
** Better to add warnings (when defaults aren't possible) for all that should be included. If they see annoying red stuff, they will have to fix it.
* Split Description Summary and Description Details parameters, so the summary can be transcluded as a short description elsewhere.
** Need to make the Description Details optional (and conditional on the summary) and add a default "No description" blurb to the summary.
* I don't like all the ifeq: <nowiki>{{NAMESPACE}}</nowiki> | Main checks I added (part of my hiding missing entries above). That can be done a better way.
* Also need to split up all the level parameters.
* Just getting started. Too many other things to do, so not gonna try listing them all (lots of trial and error with ideas anyway).
 
 
'''I'm an idiot. I'm trying to use transcludesection directly from the template, instead of passing it on to each spell. Taking a break and I'll come at it fresh later.'''
 
 
----
 
 
* School, Subschool and Descriptor links aren't being transcluded, just the names.
** I haven't added the Descriptor links to the template yet...
** Fixed: This wasn't passing my test for being a sandbox spell, so it was using the template page display...
 
 
* Don't really like having 3 separate parameters for Descriptors, and later the same deal for Components. Figure out a way to use an array from one parameter (cold, acid, ...).
 
 
----
 
 
:'''Whatever is done here is only RENDERED in the page. To have the spell code changed, the sec# tags must be added to each spell.'''
 
:* Even [http://www.mediawiki.org/wiki/Extension:Labeled_Section_Transclusion#Limitations Extension:Labeled Section Transclusion - Limitations] can't do that.
:* [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(third-party)#Which_steps_are_necessary.3F Extension:DynamicPageList (third-party) - Define contents you want to show section] can (not the [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(Wikimedia) Extension:DynamicPageList (Wikimedia)] version).'''
:** See: [http://semeb.com/dpldemo/index.php?title=DPL:Manual_-_DPL_parameters:_Controlling_output_volume#include_contents_related_to_templates include contents related to templates] for how to specify named parameters in a page using a specific template (So grab the name and description in one simple <code>include={Template:Spell}:Name:Description Summary</code> option line, to make a page listing all spells, or filter/sort by whatever criteria, including each Template:Spell parameter)
:** [http://wayback.archive.org/web/20161110223718/http://semeb.com/dpldemo/index.php?title=DPL:Manual_-_DPL_parameters:_Controlling_output_volume#include_contents_related_to_templates Internet Archive link to the same '''include contents related to templates''' link above], since the site is having PhP issues.
:* I definitely want this now. The [http://www.mediawiki.org/wiki/Extension:DynamicPageList_(Wikimedia) Extension:DynamicPageList (Wikimedia)] version is '''off my wish list''', since that functionality is pretty much the main reason I want it.
:* Updated the top list with this info.
 
 
* Parameters that are named with empty values are defined when checked. E.g., If <code>Parameter Name =</code> is in the spell code with no value, <code><nowiki>{{#if: {{{Parameter Name|}}} | yes | no }}</nowiki></code> is yes. Redo all of my checks (only 3 of them).
 
 
* Too many extra spaces are being added to things, like the end of the '''Name''' parameter. I may have to get rid of readable code format in many places, to get the correct output (commenting out space is even worse in many cases... maybe OK for newlines).
** [[Special:ExpandTemplates]] works well for this, and can cut down on template edits, if what is causing a problem is obvious enough to fix in np++, instead of extra trial and error saves (Offline/preview editing is great for most pages, but not templates used by other pages, so anything that can reduce the page save spam is good).
*** Use any name of a spell for '''Context title''' (E.g., Magic:Aid or User:Gorgon/Sandbox/Sandbox_Alpha/SbA01). This is used while expanding info used as <nowiki>{{FULLPAGENAME}}</nowiki> or whatever by the template, so using Template:Test will act as if in the template namespace (including a full preview as if in that namespace, with the provided page name and working category links. Handy!).
*** Paste the full spell (template call and parameters) into the '''Input text:''' box, and it shows all the hidden stuff used to render the page, including white-spaces (if a space is at the end of a line, it still shows the cursor being one space right... or just copy and paste all into np++ and show white-spaces there).
*** '''Show XML parse tree''' and '''Show raw HTML''' give even more useful info for this (in separate views), so use them all the time when checking. Toggling '''Remove comments''' is useful for seeing commented out categories in test spells (and being sure they don't get included.)
** The current version needs a lot of fixes after seeing it that way (ugh).
** Might also look at adding [[Wikipedia:Template:Trim|Template:Trim]] here, to clean up all parameters added on the spell pages, if they start adding more spaces (whitespace characters are stripped from the beginnings and ends of named parameter names and values, so this could only happen with ones in quotes).
 
 
* The error results for bad/missing parameter values (in red) should be links to the spell format documentation, which should be in this template's documentation. Basically this template makes the spells link back here on errors.
 
 
* Trying to grab the spell '''Name''' from <nowiki>{{SUBPAGENAME}}</nowiki> isn't working (see the extra info on that I added to my orignal notes above). Making it a required parameter with an error message, like the rest.
 
 
* Every spell in spelld.2da has a school (which is any spell like effect from anything pretty much), and there is no universal in NWN, only a general constant (SPELL_SCHOOL_GENERAL) for any spell in the 2da that doesn't have a school letter aassigned (e.g., ****). This shouldn't allow a blank school, but should allow <code>general</code> as a parameter (or <code>universal</code>???). See if that universal school term is used anywhere else outside of [[Magic:Spell_Format]] before using <code>general</code>.
 
 
* Testing for defined/empty parameters:
: ''"The value of a parameter can be the empty string (pipe or equals sign followed immediately by the next pipe or the closing braces). This is different from omitting the parameter altogether, which leaves it undefined, although templates are often coded so as to behave the same in both cases."''
 
:* Add [[Template:Ifparadef]] usage for parameters that need it.
 
 
* I forgot the '''"Main"''' namespace returns blank when checking <nowiki>{{NAMESPACE}}</nowiki>. I could use a blank, but better to show it by number, so all <code>Main</code> instances have been replaced with <code><nowiki>{{ns:0}}</nowiki></code>.
 
 
----
 
 
* Revamp for '''<nowiki>{{ns detect}}</nowiki>''' (Namespace detect) template usage, instead of complicated namespace checks.
** Transclusion of this template should only work in the main namespace.
** In the template or user namespace, is shows the parameters. The user namespace is intentional (and permanent) for testing template edits.
** For testing transclusion in a user namespace (i.e., a sandbox spell), use the <code>| demospace = main</code> optional parameter value.
** In any other namespace, this doesn't render anything, unless the <code>| demospace = main</code> or <code>| demospace = template</code> optional parameter values are used (<code>| page = Pagename</code> or <code>| page = Template:Pagename</code> give the same results).
 
 
----
 
 
More to come...
 
 
<!-- End of notes. -->
== Template start ==
 
 
</noinclude>{{ns detect | talk = | avlis wiki = | file = | mediawiki = | help = | category =
| other =
| other =
<b>[[Magic:{{{School}}}|{{{School}}}]]</b> {{{Subschool}}} {{{Descriptors}}} <br>
<div class="notice metadata" id="spell updates" style="background-color: #FFFFE0; margin: 1em; padding: 10px; border: 1px solid #CDCDB4;">
<b>[[Magic:Level|Level]]:</b> {{{Level}}}<br>
<b>[[Magic:Innate Level|Innate Level]]:</b> {{{Innate Level}}}<br>
<b>[[Magic:Components|Component(s)]]:</b> {{{Components}}} <br>
<b>[[Magic:Casting Time|Casting Time]]:</b> {{{Casting Time}}} <br>
<b>[[Magic:Range|Range]]:</b> {{{Range}}} <br>
<b>[[Magic:Target|Target]]:</b> {{{Target}}} <br>
<b>[[Magic:Duration|Duration]]:</b> {{{Duration}}} <br>
<b>[[Magic:Counter|Counter(s)]]:</b> {{{Counters}}}<br>
<b>[[Magic:Saving Throw|Saving Throw]]:</b> {{{Saving Throw}}} <br>
<b>[[Magic:Spell Resistance|Spell Resistance]]:</b> {{{Spell Resistance}}} <br>
<b>[[Magic:Metamagic|Metamagic]]:</b> {{{Metamagic}}}<br>
<b>[[Magic:Energy Substitution|Energy Substitution]]:</b> {{{Energy Substitution}}}<br>


{{{Description}}}
<font style="font-size: 16px; font-style: italic;">Spell articles are presently undergoing an overhaul to improve ease of updating. Please excuse any mess that this may cause for the duration.</font>
<noinclude>
</div>
<templatedata>
 
{
<b>Spell Name:</b> {{ns detect | main = {{{Name | <span style="color:red">Missing "Name" parameter value!</span> }}} | other = {{{Name}}} | demospace = {{{demospace|}}} | page = {{{page|}}} }}<br />
    "description": "Spell template parameter descriptions.
<b>[[Magic:School | School:]]</b> {{ns detect | main =
    Note: All parameter values (except the 'Description') should be in uppercase unless using full sentences. Try to keep any description of effects in the 'Description' parameter.",
    {{#switch: {{lc: {{{School|}}} }}
    "params": {
         |              = <span style="color:red">Missing "School" parameter value!</span>
        "Name": {
        | abjuration    = [[Magic:Abjuration    | Abjuration]]
            "label": "Spell Name",
        | conjuration  = [[Magic:Conjuration  | Conjuration]]
            "description": "The name of the spell.
        | divination    = [[Magic:Divination    | Divination]]
            - It should match the page name, but without any underscores.
        | enchantment  = [[Magic:Enchantment  | Enchantment]]
            - All words in the spell name use [[Wikipedia:Title_case|Title Case]]. All words are capitalized, except for minor words (typically articles, short prepositions, and some conjunctions) that are not the first or last word of the spell name.",
        | evocation    = [[Magic:Evocation    | Evocation]]
            "example": "Cone of Cold",
        | illusion      = [[Magic:Illusion      | Illusion]]
            "type": "line",
        | necromancy    = [[Magic:Necromancy   | Necromancy]]
            "required": true
        | transmutation = [[Magic:Transmutation | Transmutation]]
        },
         | general      = [[Magic:General      | General]]
         "School": {
         | #default      = <span style="color:red">Invalid "School" parameter value!</span>
            "label": "School",
    }}
            "description": "The [[Magical_Schools|Magical School]] to which the spell belongs.",
    {{#if: {{{Subschool|}}} |<!-- Is &nbsp; needed here, or will the next space be preserved? --> ( <b>[[Magic:Spell_Format:Subschool | Subschool:]] </b>
            "type": "line",
        {{#switch: {{lc: {{{Subschool|}}} }}
            "suggestedvalues": [
             | calling    = {{#ifeq: {{lc: {{{School|}}} }} | conjuration | [[Magic:Conjuration#Calling | Calling]] ) | <span style="color:red">"Subschool = Calling" requires "School = Conjuration"!</span> ) }}
                "Abjuration",
            | creation  = {{#ifeq: {{lc: {{{School|}}} }} | conjuration | [[Magic:Conjuration#Creation | Creation]] ) | <span style="color:red">"Subschool = Creation" requires "School = Conjuration"!</span> ) }}
                "Conjuration",
            | healing    = {{#ifeq: {{lc: {{{School|}}} }} | conjuration | [[Magic:Conjuration#Healing | Healing]] ) | <span style="color:red">"Subschool = Healing" requires "School = Conjuration"!</span> ) }}
                "Divination",
            | summoning  = {{#ifeq: {{lc: {{{School|}}} }} | conjuration | [[Magic:Conjuration#Summoning | Summoning]] ) | <span style="color:red">"Subschool = Summoning" requires "School = Conjuration"!</span> ) }}
                "Enchantment",
            | charm      = {{#ifeq: {{lc: {{{School|}}} }} | enchantment | [[Magic:Enchantment#Charm | Charm]] ) | <span style="color:red">"Subschool = Charm" requires "School = Enchantment"!</span> ) }}
                "Evocation",
             | compulsion = {{#ifeq: {{lc: {{{School|}}} }} | enchantment | [[Magic:Enchantment#Compulsion | Compulsion]] ) | <span style="color:red">"Subschool = Compulsion" requires "School = Enchantment"!</span> ) }}
                "Illusion",
             | figment    = {{#ifeq: {{lc: {{{School|}}} }} | Illusion | [[Magic:Illusion#Figment | Figment]] ) | <span style="color:red">"Subschool = Figment" requires "School = Illusion"!</span> ) }}
                "Necromancy",
            | glamer    = {{#ifeq: {{lc: {{{School|}}} }} | Illusion | [[Magic:Illusion#Glamer | Glamer]] ) | <span style="color:red">"Subschool = Glamer" requires "School = Illusion"!</span> ) }}
                "Transmutation",
            | pattern    = {{#ifeq: {{lc: {{{School|}}} }} | Illusion | [[Magic:Illusion#Pattern | Pattern]] ) | <span style="color:red">"Subschool = Pattern" requires "School = Illusion"!</span> ) }}
                "Universal"
            | phantasm  = {{#ifeq: {{lc: {{{School|}}} }} | Illusion | [[Magic:Illusion#Phantasm | Phantasm]] ) | <span style="color:red">"Subschool = Phantasm" requires "School = Illusion"!</span> ) }}
            ],
            | shadow    = {{#ifeq: {{lc: {{{School|}}} }} | Illusion | [[Magic:Illusion#Shadow | Shadow]] ) | <span style="color:red">"Subschool = Shadow" requires "School = Illusion"!</span> ) }}
            "required": true
            | #default  = <span style="color:red">Invalid "Subschool" parameter value!</span> )
         },
        }}
         "Subschool": {
    }}
            "label": "Sub-School",
    {{#if: {{{Descriptors|}}} |<!-- Is &nbsp; needed here, or will the next space be preserved? --> ( <b>[[Magic:Descriptors | Descriptors:]] </b><!-- Redo with #explode and comma separated Descriptors. Just test the first letter of each (so v, verbal... or vine all return "V") -->
            "description": "The [[Magic:Subschool|Sub-School]] to which the spell belongs.
        {{#switch: {{lc: {{{Descriptors|}}} }}
            - Only [[Magic:Conjuration|Conjuration]], [[Magic:Enchantment|Enchantment]], and [[Magic:Illusion|Illusion]] schools can have a sub-school.",
            | = <!-- This blank case and result is needed to not trigger the default Invalid "Descriptor" error -->
             "type": "line",
            | acid | chaotic | cold | darkness | death | disease | divine | electricity | evil
            "default": "",
             | fear | fire | force | good | language-dependent | lawful | light | mind-affecting
            "suggestedvalues": [
            | negative | nature | paralyze | poison | positive | sonic | teleportation
                "([[Magic:Conjuration#Calling|Calling]])",
             | weapon enchantment = &nbsp;[ <b>[[Magic:Descriptors | Descriptors]]:</b> {{{Descriptor}}}
                "([[Magic:Conjuration#Creation|Creation]])",
                {{#if: {{{Descriptor 2|}}}
                "([[Magic:Conjuration#Healing|Healing]])",
                |  {{#switch: {{lc: {{{Descriptor 2}}} }}
                "([[Magic:Conjuration#Summoning|Summoning]])",
                        | {{lc: {{{Descriptor}}} }} = <span style="color:red">, Duplicate "Descriptor 2" parameter value!</span>
                "([[Magic:Enchantment#Charm|Charm]])",
                        | acid | chaotic | cold | darkness | death | disease | divine | electricity | evil
                "([[Magic:Enchantment#Compulsion|Compulsion]])",
                        | fear | fire | force | good | language-dependent | lawful | light | mind-affecting
                "([[Magic:Illusion#Figment|Figment]])",
                        | negative | nature | paralyze | poison | positive | sonic | teleportation
                "([[Magic:Illusion#Glamer|Glamer]])",
                        | weapon enchantment = , {{{Descriptor 2}}}
                "([[Magic:Illusion#Pattern|Pattern]])",
                        | #default          = <span style="color:red">, Invalid "Descriptor 2" parameter value!</span>
                "([[Magic:Illusion#Phantasm|Phantasm]])",
                    }}
                "([[Magic:Illusion#Shadow|Shadow]])"
                    {{#if: {{{Descriptor 3|}}}
            ]
                    |   {{#switch: {{lc: {{{Descriptor 3}}} }}
        },
                            | {{lc: {{{Descriptor}}} }} | {{lc: {{{Descriptor 2}}} }} = <span style="color:red">, Duplicate "Descriptor 3" parameter value!</span>
        "Descriptors": {
                            | acid | chaotic | cold | darkness | death | disease | divine | electricity | evil
            "label": "Descriptors",
                            | fear | fire | force | good | language-dependent | lawful | light | mind-affecting
             "description": "[[Magic:Descriptors|Descriptors]] indicate the nature of a spell.",
                            | negative | nature | paralyze | poison | positive | sonic | teleportation
            "type": "line",
                            | weapon enchantment = , {{{Descriptor 3}}}
             "default": "",
                            | #default          = <span style="color:red">, Invalid "Descriptor 3" parameter value!</span>
            "suggestedvalues": [
                        }}
                "[ [[Magic:Descriptors#Acid]] ]",
                    }}
                "[ [[Magic:Descriptors#Chaotic]] ]",
                }} ]
                "[ [[Magic:Descriptors#Cold]] ]",
            | #default = &nbsp;[ <b>[[Magic:Descriptors | Descriptors]]:</b> <span style="color:red">Invalid "Descriptor" parameter value!</span> ]
                "[ [[Magic:Descriptors#Darkness]] ]",
        }}
                "[ [[Magic:Descriptors#Death]] ]",
    }}
                "[ [[Magic:Descriptors#Disease]] ]",
| other = {{{School}}} ( <b>[[Magic:Spell_Format:Subschool | Subschool]]:</b> {{{Subschool}}} ) [ <b>[[Magic:Descriptors | Descriptors]]:</b> {{{Descriptors}}} ]
                "[ [[Magic:Descriptors#Divine]] ]",
| demospace = {{{demospace|}}}
                "[ [[Magic:Descriptors#Electricity]] ]",
| page = {{{page|}}}
                "[ [[Magic:Descriptors#Evil]] ]",
}} <br />
                "[ [[Magic:Descriptors#Fear]] ]",
<b>[[Magic:Level | Level(s)]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Level|}}} | {{{Level}}} }} <br />
                "[ [[Magic:Descriptors#Fire]] ]",
<b>[[Magic:Innate_Level | Innate Level]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Innate Level|}}} | {{{Innate Level}}} }} <br />
                "[ [[Magic:Descriptors#Force]] ]",
<b>[[Magic:Components | Component(s)]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Components|}}} | {{{Components}}} }} <br />
                "[ [[Magic:Descriptors#Good]] ]",
<b>[[Magic:Casting_Time | Casting Time]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Casting Time|}}} | {{{Casting Time}}} }} <br />
                "[ [[Magic:Descriptors#Language-dependent]] ]",
<b>[[Magic:Range | Range]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Range|}}} | {{{Range}}} }} <br />
                "[ [[Magic:Descriptors#Lawful]] ]",
<b>[[Magic:Target | Target]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Target|}}} | {{{Target}}} }} <br />
                "[ [[Magic:Descriptors#Light]] ]",
<b>[[Magic:Duration | Duration]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Duration|}}} | {{{Duration}}} }} <br />
                "[ [[Magic:Descriptors#Mind-affecting]] ]",
<b>[[Magic:Counter | Counter(s)]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Counters|}}} | {{{Counters}}} }} <br />
                "[ [[Magic:Descriptors#Negative]] ]",
<b>[[Magic:Saving_Throw | Saving Throw]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Saving Throw|}}} | {{{Saving Throw}}} }} <br />
                "[ [[Magic:Descriptors#Nature]] ]",  
<b>[[Magic:Spell_Resistance | Spell Resistance]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Spell Resistance|}}} | {{{Spell Resistance}}} }} <br />
                "[ [[Magic:Descriptors#Paralyze]] ]",
<b>[[Magic:Metamagic | Metamagic]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Metamagic|}}} | {{{Metamagic}}} }} <br />
                "[ [[Magic:Descriptors#Poison]] ]",
<b>[[Magic:Energy_Substitution | Energy Substitution]]:</b> {{#ifeq: {{NAMESPACE}} | {{ns:0}} | {{{Energy Substitution|}}} | {{{Energy Substitution}}} }} <br />
                "[ [[Magic:Descriptors#Positive]] ]",
<!-- Redo the rest of these (above) to check if set, then give the "required" warnings. -->{{{Description Summary|{{ns detect | main = <span style="color:red">Missing "Description Summary" parameter value!</span> | other = {{{Description Summary}}} }} }}}
                "[ [[Magic:Descriptors#Sonic]] ]",
{{ifparadef | {{{Description Details|¬}}} | <br /><br />{{{Description Details}}} | {{ns detect | other = <br /><br />{{{Description Details}}} }} | {{ns detect | other = <br /><br />{{{Description Details}}} }} }}
                "[ [[Magic:Descriptors#Teleportation]] ]",
                "[ [[Magic:Descriptors#Weapon_Enchantment]] ]"
             ]
        },
        "Level": {
             "label": "Class/Domain Levels",
            "description": "[[Magic:Level|Level]] shows abbreviations for each class that can cast this spell and at what level it is cast. It also indicates if a spell is a domain spell and at what its level is cast.
            - Standard spellcasting class abbreviations are: Brd, Clr, Drd, Pal, Rgr, Sor/Wiz.
            - Include a link to the domain entry when adding one (see the included example for [[Magic:Haste|Haste]]).",
            "example": "Brd 3, Sor/Wiz 3, [[Magic:Level#Travel|Travel 5]]",
            "type": "line",
            "required": true
        },
        "Innate Level": {
            "label": "Innate Level",
            "description": "[[Magic:Innate_Level|Innate Level]] is the level number of the the spell when there is no reference to a particular spellcasting class. Typically, the innate level is the lowest spell level among all the classes that can cast the spell (check the 'Innate' column for the spell in [https://nwn.wiki/display/NWN1/spells.2da spells.2da]).
            - The innate level is used when a class-dependent spell level cannot be determined, such as a spell cast from an item. It is also used when countering the spell with [[nwn:Counterspell|universal counter spells]].",
            "type": "number",
            "required": true
        },
        "Components": {
            "label": "Components",
            "description": "[[Magic:Components|Components]] indicates what the character must do to cast the spell. Spells in NWN only use V (Verbal) and/or S (Somatic) as components unless they include extra component code (see: [https://nwn.wiki/display/NWN1/spells.2da spells.2da - 'VS']).",
            "type": "line",
            "suggestedvalues": [
                "V",
                "S",
                "V, S"
            ],
            "required": true
        },
        "Casting Time": {
            "label": "Casting Time",
            "description": "[[Magic:Casting_Time|Casting Time]] in NWN is 1 Action. The actual casting time can vary by a few seconds, but you can cast 1 spell per round as an action (more actions while hasted, quickened, and so on).",
            "type": "line",
            "default": "1 Action",
            "required": true
        },
        "Range": {
            "label": "Target Range",
            "description": "[[Magic:Range|Range]] is the maximum distance from the caster at which the spell can affect a target.
            - Ranges are: (P) Personal - 0m, (T) Touch - 2.25m, (S) Short - 8m, (M) Medium - 20m, (L) Long - 40m.",
            "type": "line",
            "suggestedvalues": [
                "P",
                "T",
                "S",
                "M",
                "L"
            ],
            "required": true
        },
        "Target": {
            "label": "Target",
            "description": "[[Magic:Target|Target]] lists what is affected and the area of effect.
            - Format begins with either 'Caster', 'Target', or 'Area', optionally followed by the area of effect size. If the target can be either an object or area location, then use both.
            - Standard AoE sizes (non-standard sizes are also used): Personal, Single, Small - 1.67m, Medium - 3.33m, Large - 5.0m, Huge - 6.67m, Gargantuan  - 8.33m, Colossal - 10m.",
            "example": "Caster: Personal / Target: Single / Area: Medium / Target/Area: 14m Cone",
            "type": "line",
            "required": true
        },
        "Duration": {
            "label": "Duration",
            "description": "[[Magic:Duration|Duration]] is how long the spell lasts.
            - Standard durations are: Instantaneous, Permanent, Concentration, Discharge, or a timed duration value.
            - If the duration line ends with '(D)', the character can dismiss the spell at will (e.g., [[Magic:Shapechange|Shapechange]]).
            - Discharge means the same as 'Permanent (D)', with it only dispelled by the caster (e.g., Shifter forms if they were spells).
            - Avlis spell durations are all measured in 'real life' seconds or minutes. 'In game' time (i.e. the 20 RL minutes per game hour server setting) has no effect on hooked spell durations. There are no 'hour per level' or 'per day' hooked spells in Avlis (all old hour durations are '4 minutes', and day durations are '96 minutes').
            - The term 'turn' no meaning in NWN, and should always be replaced with 'minute'.
            - A 'round' does have special meaning in NWN, but as far as spell durations, it is '6 seconds' ('round' may be included for completeness).
            - You may use the suggested values as a base and edit them to suit your needs. See the examples.",
            "example": "Instantaneous / 1 Round (6 Seconds)/2 Levels  / 1 Minute/Level / 4 Minutes/Level / 96 Minutes",
            "type": "line",
            "suggestedvalues": [
                "Instantaneous",
                "Permanent",
                "Concentration",
                "Discharge",
                "1 Round (6 Seconds)/Level",
                "1 Minute/Level",
                "4 Minutes/Level",
                "96 Minutes"
            ],
            "required": true
        },
        "Counters": {
            "label": "Counters",
            "description": "[[Magic:Counter|Counters]] is a list of additional counter spells. This is a required parameter. If the spell doesn't have extra counters, or you don't know them, always use the default value of '--' (do not use 'None').
            - Include a link to the spell entry when adding one (see the included example for [[Magic:Entangle|Entangle]]).",
            "example": "[[Magic:Freedom of Movement|Freedom of Movement]]",
            "type": "line",
            "default": "--",
            "required": true
        },
        "Saving Throw": {
            "label": "Saving Throw",
            "description": "[[Magic:Saving_Throw|Saving Throw]] lists if the spell allows a save, what type(s), and the effects.
            - Anything more than a few words should be in the main 'Description'. Get the general save info in there and they can read on if they need to.",
            "example": "Fortitude: Negates, Will: Half / Reflex 1/2 (Evasion Ineffective) / Will And Fortitude: Partial",
            "type": "line",
            "suggestedvalues": [
                "None",
                "Fortitude",  
                "Reflex",
                "Will"
            ],
            "required": true
        },
        "Spell Resistance": {
            "label": "Spell Resistance",
            "description": "[[Magic:Spell_Resistance|Spell Resistance]] shows if spell resistance (SR) resists this spell.
            - Do not guess. If you don't know, leave it blank.",
            "type": "line",
            "default": "",
            "suggestedvalues": [
                "No",
                "Yes"
            ]
        },
        "Metamagic": {
            "label": "Metamagic",
            "description": "[[Magic:Metamagic|Metamagic]] that can be use with this spell.
            - This can be a bit complicated to set correctly. [https://nwn.wiki/display/NWN1/spells.2da spells.2da 'MetaMagic'] determines what a caster can do with spell metamagic feats, but the code determines what effects can happen. Metamagic rods and other sources override (ignore) spells.2da settings, but they will not do anything if the code doesn't support it.
            - Do not guess. If you don't know, and don't have access to code source to confirm it, only add what you are sure of.
            - Do not say 'None'. Leave it blank instead. There are many custom metamagic types that will almost certainly work, even if the standard ones don't.
            - Do not use custom Avlis metamagic values here (only the types in the example). None of the custom metamagic applies to specific spells, and it should be obvious if they affect certain spell types.",
            "example": "Extend, Empower, Maximize, Silent, Still, Quicken",
            "type": "line",
            "default": ""
        },
        "Energy Substitution": {
            "label": "Energy Substitution",
            "description": "[[Magic:Energy_Substitution|Energy Substitution]] shows if the spell can use energy substitution.
            - This is enabled in the spell code, and can be used with metamagic rods.
            - Do not guess. If you don't know, leave it blank.",
            "type": "line",
            "default": "",
            "suggestedvalues": [
                "No",
                "Yes"
            ]
        },
        "Description": {
            "label": "Spell Description",
            "description": "Details of what the spell does and how it works.
            - Only add details for what a spell actually does in game terms. This is about the facts.
            - [[Wikipedia:WYSIWYG|WYSIWYG]] in game, and nothing more. Do not add imagined or flowery descriptive details.
            - Do not include details about what a spell is supposed to do, whether or not a fix/update may happen in the future. Only describe the current spell behavior. The wiki can be updated if/when changes are made.",
            "type": "unbalanced-wikitext",
            "required": true
        }
    },
    "format": "block",
    "paramOrder": [
        "Name",
        "School",
        "Subschool",
        "Descriptors",
        "Level",
        "Innate Level",
        "Components",
        "Casting Time",
        "Range",
        "Target",
        "Duration",
        "Counters",
        "Saving Throw",
        "Spell Resistance",
        "Metamagic",
        "Energy Substitution",
        "Description"
    ]
}
</templatedata>
</noinclude>
<includeonly>
{{ns detect | main =
{{ns detect | main =
[[Category:Spells|{{{Name}}}]]
[[Category:Magic |{{{Name |{{PAGENAME}} }}}]]
[[Category:{{{School}}} Spells|{{{Name}}}]] }}</includeonly>
[[Category:{{{School}}}_Spells |{{{Name |{{PAGENAME}} }}}]] }}
| demospace = {{{demospace|}}}
| demospace = {{{demospace|}}}
| page = {{{page|}}}
| page = {{{page|}}}
}}<noinclude>
}}<noinclude>


{{ns detect | template = [[Category:Templates|{{PAGENAME}}]] }}</noinclude>
<!-- Add template documentation here, or include a doc subpage (see: http://wikipedia.org/wiki/Wikipedia:Template_documentation#How_to_create_a_documentation_subpage). -->
== Non-transcluded template documentation [or an included doc subpage] ==
 
Add template documentation here, or include a doc subpage (see: [[Wikipedia:Wikipedia:Template_documentation#How_to_create_a_documentation_subpage | How to create a documentation subpage]]).
 
* A <nowiki>{{</nowiki>[[Wikipedia:Template:Documentation |Documentation]]<nowiki>}}</nowiki> sub-template would be useful for all templates on this wiki, since they need usage documentation (stripped down version, without the dozens of other templates).
 
 
* [[Magic:Spell_Format]] should be here as documentation, instead of that hard to find page.
 
 
* Include instructions for using this in namespaces outside of main, with a simple <code>| demospace = main</code> parameter example above the name parameter.
 
 
* Obviously I've added more parameters for class and domain spells, similar to the NWN Wiki version of [[NWN:Template:Spell | Template:Spell]]. Their full parameter list is below (they don't use Subschool, and I used proper case with spaces for all parameters):
 
 
:'''Spell levels:'''
:*''bardlevel'' &mdash; The level of this spell when cast by a [[bard]]. ''Optional''
:*''clericlevel'' &mdash; The level of this spell when cast by a [[cleric]]. ''Optional''
:*''druidlevel'' &mdash; The level of this spell when cast by a [[druid]]. ''Optional''
:*''paladinlevel'' &mdash; The level of this spell when cast by a [[paladin]]. ''Optional''
:*''rangerlevel'' &mdash; The level of this spell when cast by a [[ranger]]. ''Optional''
:*''magelevel'' &mdash; The level of this spell when cast by a [[sorcerer]] or [[wizard]]. ''Optional''
:*''domain'' &mdash; The clerical [[domain]] that grants access to this spell. ''Optional''
:*''domainlevel'' &mdash; The level of this spell when granted by this domain. ''Required if domain is specified''
:*''domain2'' &mdash; A second clerical domain that grants access to this spell. ''Optional''
:*''domain2level'' &mdash; The level of this spell when granted by the second domain. ''Required if domain2 is specified''
:*''domain3'' &mdash; A third clerical domain that grants access to this spell. ''Optional''
:*''domain3level'' &mdash; The level of this spell when granted by the third domain. ''Required if domain3 is specified''
:*''domain4'' &mdash; A fourth clerical domain that grants access to this spell. ''Optional''
:*''domain4level'' &mdash; The level of this spell when granted by the fourth domain. ''Required if domain4 is specified''
:*''innatelevel'' &mdash; The innate level of this spell.
 
 
:'''Lines of spells:'''
:* ''line'' &mdash; a name for the spell line this spell belongs to. ''Optional, but if not set then ''line0'' through ''line9'' are ignored''
:* ''line0'' through ''line9'' &mdash; names of spells (not linked) that are considered in the same "line" of spells as the current spell. Use the parameter corresponding to the spell's innate level. Include the current spell. ''Optional, but some should be used if "line" is set''
:* ''linebreach'' &mdash; set this (to "yes") to get a table for the breach line of spells. (This is a hack to accommodate ''disjunction'' having two spell lines.) ''Optional''
 
 
:'''Other:'''
:*''area'' &mdash; The area affected by this spell. The values "small", "medium", "large", "huge", "gargantuan", "colossal", and "spellcone" should be used when appropriate.
:**''areanote'' &mdash; Additional information about the area of effect (e.g. a limit on the number of targets in a colossal area). ''Optional''
:**''conesize'' &mdash; This can override the default length of "10" for spell cones.
:*''components'' &mdash; "V", "S", or "VS" indicating the components this spell utilizes. ''Optional''
:*''counters'' &mdash; Additional counterspells, preferably linked. ''Optional''
:*''duration'' &mdash; The duration of the spell.
:*''immunity'' &mdash; The [[Magic:Descriptors | descriptor]] (immunity type) of this spell. ''Optional''
:*''range'' &mdash; "p", "t", "s", "m", or "l" indicating the range of the spell.
:*''save'' &mdash; The save allowed for this spell, preferably linked. ''Optional''
:*''school'' &mdash; The [[Magic:School | spell school]] of this spell, preferably linked.
:*''spellcraft'' &mdash; The spellcraft requirement (for epic spells). ''Optional, epic only''
:*''spellresistance'' &mdash; Should be "yes" if spell resistance can bock this spell. Should be "yes*" if the BioWare description says spell resistance can block this spell, but it does not actually do so. ''Optional''
 
:*''desc'' &mdash; The spell's in-game description.
:*''icon'' &mdash; The name of the image (icon) for this spell. ''Optional''
 
 
<!-- End of documentation. -->
{{ns detect | template = [[Category:Templates |{{PAGENAME}}]] }}</noinclude>

Latest revision as of 06:31, 4 January 2024

This is a user sandbox of Gorgon. A user sandbox is a subpage of the user's user page. It serves as a testing spot and page development space for the user, and is not an Avlis wiki article.

Anything up to/including the Template start heading will not be included in transclusion of this template (or any part of the trailing documentation section either, though that will eventually be formalized template documentation, possibly with transcluded categories at the end).

I love to over-comment my code, so why change things here...




Test version of Template:Spell

Extensions that would make this work better [My wish list]


  • Extension:DynamicPageList (third-party) - Enhanced version of Extension:DynamicPageList (Wikimedia)
    • DPL:Overview - Generate dynamic reports based on category members and selective included info from each (Extension:Labeled Section Transclusion above would really help there).
    • DPL:Template:Catlist - Picture this totally reformatted as filter/sort options up top of the Spell List page, as a dynamic table. It starts showing all spells, but sortable with one click by level, school, class, or any other useful Template:Spell parameter/category used by them. Then add in the ability to filter results to only certain kinds/combinations (e.g, Show only cleric evocation spells, sorted by level, with the option of showing specific domain ones as well).
    • I doubt anyone else besides me would use this (except maybe the occasional dabbler), but it would really be useful for spells, and maybe a few other things eventually. Revamping all spells via this template is a huge undertaking (and my main goal for wiki updating, now that I can verify/test spells again), so adding this extension for that work alone would make a huge difference.
    • After looking into the more recent version of Extension:DynamicPageList (Wikimedia) (the one used by most Wikimedia projects, not the "enhanced - 3rd party one"), it may be just as useful (or better), since it allows more sort options. Need to see both in practical use before deciding anything.
    • I definitely want this now. The Extension:DynamicPageList (Wikimedia) version is off my wish list, since that functionality is pretty much the main reason I want it.
  • Extension:Arrays - For parsing things like the V, S, M in a single "Descriptors" parameter, without a lot of #explode etc. code (still looking for the best way to do that, and that needs the string parsing extensions enbled).


Revision notes


  • I think Buddha had the right idea with his discussion on the Categories page about reformatting how we categorize spells. The current Spell List page (and its various subversions) all rely on manual updating when any new changes happen to it, like a new spell being added. Revisions to this template will improve how each spell is displayed, and categorized (even without new extensions), so moving to category listings that update dynamically makes a lot of sense.




Can the Name template parameter be taken from the page name automatically?

  • Maybe as a default if not given as a parameter?
  • Might need some page renaming, but should work.
  • Keeping the template from categorizing itself as a spell might be annoying, unless namespace checking or other validation is done.


  • Taking the Name template parameter from the {{SUBPAGENAME}} isn't so simple.
    • The Magic: (and Epic Spell:) prefix needs to be stripped after checking if it exists, especially for using it as a sort key with categories. Checking for it is easy with something like {{#ifeq:{{lc:{{padleft:|6|{{SUBPAGENAME}}}}}}|magic:|}}. Removing it is harder. {{#explode:{{SUBPAGENAME}}|:|1}} could do it, but needs the parser functions for string handling enabled with $wgPFEnableStringFunctions = true; in LocalSettings.php (see the second top note at: Extension:StringFunctions).
      • All the spell pages should be stripped of these prefixes themselves. Someone was setting it up as if there were actual namespaces for them, but there aren't. Do I really want to get into that mess?
    • If the {{SUBPAGENAME}} has more than one word for the spell name, the second and latter words need to be capitalized.
      • Using some sort of {{#replace:{{#explode:{{SUBPAGENAME}}| |1}}|{{ucfirst:{{#explode:{{SUBPAGENAME}} code, that first counts the words and has enough depth levels for them all would get messy fast (for loop in wiki markup?).
      • Someone must have had a similar problem and found an easier solution, so do some searching.
    • We'll have to assume all page names like Bigbys have been changed to use apostrophes too (e.g., Bigby's) - no sane way to check and fix that here (well maybe a switch with the known names already, but new ones would need constant updates... which it what this is supposed to eliminate).
    • If it isn't easy, just make it a required parameter with error message, like the rest.




  • Redone using onlyinclude sections with transcludesection tags (See above).
    • Not as simple as Labeled Section Transclusion, and can't do some things with it, but good enough for now.
  • Major School/Subschool/Descriptors redo.
    • Added the Subschool: and Descriptors: prefixes, but they may make the School line too long.
    • Added a bunch of validation checks in switches.
  • Added Spell Name: at the top.
    • Having every spell "Name" be the page name "Magic:Name" was inaccurate and confusing.
    • Uses the Name = parameter, or {{SUBPAGENAME}} if not entered.
  • All parameters are now Proper Case.
  • Lowercase conversion is used for comparison validation of parameter values (when possible).
    • ifeq: and case entries in a switch are case sensitive, so this is necessary.
  • Proper Case conversion is used (when possible) in output results.
    • If people don't use the right case, this should fix at least some of the issues.
  • Added a bunch of namespace checks as part of the validation,
    • All spells should be in the Main namespace, so anything outside that is a template (or test page in a userspace).
    • Added a hak to make my sandbox spell pages work as if in Main (remember to change it back when publishing this).
  • Started making missing parameter entries (without forced defaults or warnings) not show in Main, instead of the {{{parameter name}}} (like in the Template namespace).
    • Better to add warnings (when defaults aren't possible) for all that should be included. If they see annoying red stuff, they will have to fix it.
  • Split Description Summary and Description Details parameters, so the summary can be transcluded as a short description elsewhere.
    • Need to make the Description Details optional (and conditional on the summary) and add a default "No description" blurb to the summary.
  • I don't like all the ifeq: {{NAMESPACE}} | Main checks I added (part of my hiding missing entries above). That can be done a better way.
  • Also need to split up all the level parameters.
  • Just getting started. Too many other things to do, so not gonna try listing them all (lots of trial and error with ideas anyway).


I'm an idiot. I'm trying to use transcludesection directly from the template, instead of passing it on to each spell. Taking a break and I'll come at it fresh later.




  • School, Subschool and Descriptor links aren't being transcluded, just the names.
    • I haven't added the Descriptor links to the template yet...
    • Fixed: This wasn't passing my test for being a sandbox spell, so it was using the template page display...


  • Don't really like having 3 separate parameters for Descriptors, and later the same deal for Components. Figure out a way to use an array from one parameter (cold, acid, ...).




Whatever is done here is only RENDERED in the page. To have the spell code changed, the sec# tags must be added to each spell.


  • Parameters that are named with empty values are defined when checked. E.g., If Parameter Name = is in the spell code with no value, {{#if: {{{Parameter Name|}}} | yes | no }} is yes. Redo all of my checks (only 3 of them).


  • Too many extra spaces are being added to things, like the end of the Name parameter. I may have to get rid of readable code format in many places, to get the correct output (commenting out space is even worse in many cases... maybe OK for newlines).
    • Special:ExpandTemplates works well for this, and can cut down on template edits, if what is causing a problem is obvious enough to fix in np++, instead of extra trial and error saves (Offline/preview editing is great for most pages, but not templates used by other pages, so anything that can reduce the page save spam is good).
      • Use any name of a spell for Context title (E.g., Magic:Aid or User:Gorgon/Sandbox/Sandbox_Alpha/SbA01). This is used while expanding info used as {{FULLPAGENAME}} or whatever by the template, so using Template:Test will act as if in the template namespace (including a full preview as if in that namespace, with the provided page name and working category links. Handy!).
      • Paste the full spell (template call and parameters) into the Input text: box, and it shows all the hidden stuff used to render the page, including white-spaces (if a space is at the end of a line, it still shows the cursor being one space right... or just copy and paste all into np++ and show white-spaces there).
      • Show XML parse tree and Show raw HTML give even more useful info for this (in separate views), so use them all the time when checking. Toggling Remove comments is useful for seeing commented out categories in test spells (and being sure they don't get included.)
    • The current version needs a lot of fixes after seeing it that way (ugh).
    • Might also look at adding Template:Trim here, to clean up all parameters added on the spell pages, if they start adding more spaces (whitespace characters are stripped from the beginnings and ends of named parameter names and values, so this could only happen with ones in quotes).


  • The error results for bad/missing parameter values (in red) should be links to the spell format documentation, which should be in this template's documentation. Basically this template makes the spells link back here on errors.


  • Trying to grab the spell Name from {{SUBPAGENAME}} isn't working (see the extra info on that I added to my orignal notes above). Making it a required parameter with an error message, like the rest.


  • Every spell in spelld.2da has a school (which is any spell like effect from anything pretty much), and there is no universal in NWN, only a general constant (SPELL_SCHOOL_GENERAL) for any spell in the 2da that doesn't have a school letter aassigned (e.g., ****). This shouldn't allow a blank school, but should allow general as a parameter (or universal???). See if that universal school term is used anywhere else outside of Magic:Spell_Format before using general.


  • Testing for defined/empty parameters:
"The value of a parameter can be the empty string (pipe or equals sign followed immediately by the next pipe or the closing braces). This is different from omitting the parameter altogether, which leaves it undefined, although templates are often coded so as to behave the same in both cases."


  • I forgot the "Main" namespace returns blank when checking {{NAMESPACE}}. I could use a blank, but better to show it by number, so all Main instances have been replaced with {{ns:0}}.




  • Revamp for {{ns detect}} (Namespace detect) template usage, instead of complicated namespace checks.
    • Transclusion of this template should only work in the main namespace.
    • In the template or user namespace, is shows the parameters. The user namespace is intentional (and permanent) for testing template edits.
    • For testing transclusion in a user namespace (i.e., a sandbox spell), use the | demospace = main optional parameter value.
    • In any other namespace, this doesn't render anything, unless the | demospace = main or | demospace = template optional parameter values are used (| page = Pagename or | page = Template:Pagename give the same results).




More to come...


Template start

Spell Name: {{{Name}}}
School: {{{School}}} ( Subschool: {{{Subschool}}} ) [ Descriptors: {{{Descriptors}}} ]
Level(s): {{{Level}}}
Innate Level: {{{Innate Level}}}
Component(s): {{{Components}}}
Casting Time: {{{Casting Time}}}
Range: {{{Range}}}
Target: {{{Target}}}
Duration: {{{Duration}}}
Counter(s): {{{Counters}}}
Saving Throw: {{{Saving Throw}}}
Spell Resistance: {{{Spell Resistance}}}
Metamagic: {{{Metamagic}}}
Energy Substitution: {{{Energy Substitution}}}
{{{Description Summary}}}

{{{Description Details}}}

Non-transcluded template documentation [or an included doc subpage]

Add template documentation here, or include a doc subpage (see: How to create a documentation subpage).

  • A {{Documentation}} sub-template would be useful for all templates on this wiki, since they need usage documentation (stripped down version, without the dozens of other templates).



  • Include instructions for using this in namespaces outside of main, with a simple | demospace = main parameter example above the name parameter.


  • Obviously I've added more parameters for class and domain spells, similar to the NWN Wiki version of Template:Spell. Their full parameter list is below (they don't use Subschool, and I used proper case with spaces for all parameters):


Spell levels:
  • bardlevel — The level of this spell when cast by a bard. Optional
  • clericlevel — The level of this spell when cast by a cleric. Optional
  • druidlevel — The level of this spell when cast by a druid. Optional
  • paladinlevel — The level of this spell when cast by a paladin. Optional
  • rangerlevel — The level of this spell when cast by a ranger. Optional
  • magelevel — The level of this spell when cast by a sorcerer or wizard. Optional
  • domain — The clerical domain that grants access to this spell. Optional
  • domainlevel — The level of this spell when granted by this domain. Required if domain is specified
  • domain2 — A second clerical domain that grants access to this spell. Optional
  • domain2level — The level of this spell when granted by the second domain. Required if domain2 is specified
  • domain3 — A third clerical domain that grants access to this spell. Optional
  • domain3level — The level of this spell when granted by the third domain. Required if domain3 is specified
  • domain4 — A fourth clerical domain that grants access to this spell. Optional
  • domain4level — The level of this spell when granted by the fourth domain. Required if domain4 is specified
  • innatelevel — The innate level of this spell.


Lines of spells:
  • line — a name for the spell line this spell belongs to. Optional, but if not set then line0 through line9 are ignored
  • line0 through line9 — names of spells (not linked) that are considered in the same "line" of spells as the current spell. Use the parameter corresponding to the spell's innate level. Include the current spell. Optional, but some should be used if "line" is set
  • linebreach — set this (to "yes") to get a table for the breach line of spells. (This is a hack to accommodate disjunction having two spell lines.) Optional


Other:
  • area — The area affected by this spell. The values "small", "medium", "large", "huge", "gargantuan", "colossal", and "spellcone" should be used when appropriate.
    • areanote — Additional information about the area of effect (e.g. a limit on the number of targets in a colossal area). Optional
    • conesize — This can override the default length of "10" for spell cones.
  • components — "V", "S", or "VS" indicating the components this spell utilizes. Optional
  • counters — Additional counterspells, preferably linked. Optional
  • duration — The duration of the spell.
  • immunity — The descriptor (immunity type) of this spell. Optional
  • range — "p", "t", "s", "m", or "l" indicating the range of the spell.
  • save — The save allowed for this spell, preferably linked. Optional
  • school — The spell school of this spell, preferably linked.
  • spellcraft — The spellcraft requirement (for epic spells). Optional, epic only
  • spellresistance — Should be "yes" if spell resistance can bock this spell. Should be "yes*" if the BioWare description says spell resistance can block this spell, but it does not actually do so. Optional
  • desc — The spell's in-game description.
  • icon — The name of the image (icon) for this spell. Optional