Category Archives: Build Notes

Excerpts from the change log and other notes related to new builds.

Apparently random bits of miscellany and functionals (b200)

b200

* Miscellaneous

GCA should no longer claim #Verbose On is a bad data file command (but still work) when it is a good command. Same for the #ModifierGroupWarnings command.

The #Clone data file command should now work with templates, and should better handle unsupported prefix tags.

Addsorincreases() didn’t correctly increase equipment counts. Now it does.

The combination attacks version of Edit Traits was crashing when trying to add a new combination. That is now fixed.

Added a system flag so I can have some system messages not go to the log when I’m doing things where they are repetitive or unnecessary. And then added support for that flag to a number of messages (such as new character and library loaded messages in randomized templates).

When handling an adds() or addsorincreases() for a trait name without an extension, and GCA only finds versions with extensions, GCA would pop up a dialog asking the user to pick one of those found. When doing a random template, this pop-up still popped up and waited for user input. That is now fixed and a random selection is made from the items found.

I have added a new engine option for verbose template processing. This option is off (False) by default. The idea is that nearly every message that gets logged during template processing is actually only useful for template writers, but not for users. Having all those messages get sent to the log cheapens the log for the typical user by filling it with what appears to be nonsense. (And much of what gets sent to the log is just noise to users, since many templates these days rely on certain behaviors to work correctly, but those behaviors also often send messages to the log). So, with this new option, just about every template processing message that used to get sent to the log now only gets sent if this new option is turned on (True). This option is available in Options, on the Program Options tab, on the Characters pane as the “Show all status messages when processing templates.” checkbox.

In Select dialogs, sometimes the options meant to be available are built from things that were chosen in previous dialogs. This sometimes means that an option may have a different name extension on the character than in the library. Previously, GCA wouldn’t find it in the library and would just give up on that item. Now, if GCA doesn’t find the specified item in the library, it will see if it can find a version on the character, and if so, use that as the template for the item in the selection list..

The new template tag setloadout() can be used to change the character’s active loadout to the loadout specified in the tag. This can be used inside triggers().

* Random Character dialog

I have restructured the order of things in the process that the Random Character dialog (called from either Randomized Template option in the Tools menu) uses when adding random templates. First it names the character, then runs the template. This will allow for templates to be built that apply random character names.

Also, the character names are no longer modified to include “- but Canceled” if it looks like the template didn’t complete properly. GCA will now wait until all the random characters have been built, then print one “Randomized template issues:” block to the Log pane, with a message about that for each such character.

I have also made the system check for the #deleteme command in the initial template, so that it will not assume a canceled template just because the initial template deleted itself once finished.

* Functions

@ItemsInLibraryGroup( GroupName )

This function returns the number of items for the GroupName specified, as found in the character’s loaded library’s Group collection. This is specifically the Library count, as currently loaded, just as it would be referenced if you were creating a group list for use in a Select dialog.

@ItemsInLibraryList( ListName )

This function returns the number of items for the ListName specified, as found in the character’s loaded library’s Lists collection.

Be aware that List usage is not the same as Group usage in GCA, as a List is just a collection of text lines, while a Group is specifically a collection of items, one per line. This means that a List may consist of many items per line, and its usage by the file author will likely not correspond to one item per line, but may result in many items in the destination output. Instead of counting the items in the List, you may want to use @ItemsInList to count the items in an equivalently constructed text list instead.

@ItemsInList( [ #codes() ] item list )

This function allows you to count the items in the given list and return that value. The #codes() special directive allows you to specify special commands to control how the list is processed.

By default, the list of items is considered to be comma separated, and each individual entry may be enclosed in quotes or braces as usual.

The only code currently supported for #codes() is #codes(sep=X) to change the separator from a comma to some other character. NOTE: If you specify multiple characters, each one individually is a separator, NOT the whole string as a single unit. You may enclose the separator in quotes or braces, such as #codes(sep=” “).

@Random( value1 [, value2] )

The @random() function returns a random integer value. Note that the values are applied differently depending on whether one or two values are supplied.

The templates for this are:

For an integer 1 to max: @random(<max>)”)
For an integer min to max : @random(<min>, <max>)”)

If only <max> is specified, then the value returned ranges from 1 to the <max> value. If both <min> and <max> are specified then the value returned ranges from the <min> to the <max>.

@Roll( number [, sides] )

The @roll() function returns the sum total for a series of random results simulating rolled dice.

The templates for this are:

For rolling Xd6: @Roll(<number>)
For rolling XdY: @Roll(<number>, <sides>)

If <sides> is not specified it uses six-sided dice. So using @roll(2,4) would ‘roll’ 2 4-sided dice, and would return the total sum of all ‘rolled’ values.

$RollValues( number [, sides] )

The $rollvalues() function returns a text value that is a sequence of values separated by + signs, representing every roll made for the given parameters

The templates for this are:

For rolling Xd6: $RollValues(<number>)
For rolling XdY: $RollValues(<number>, <sides>)

If <sides> is not specified it uses six-sided dice. So using $rollvalues(2,4) would ‘roll’ 2 4-sided dice, and would return the value as something similar to ‘1+4’, so that it can be included in a math expression.

$ListNoBlanks( [ #codes() ] item list )

This function allows you to process a list of items and remove the empty entries. The #codes() special directive allows you to specify special commands to control how the list is processed.

By default, the list of items is considered to be comma separated, and each individual entry may be enclosed in quotes or braces as usual.

You may specify #codes(hasprefix) or #codes(prefixtags) to tell the function that the entries in the list are expected to be trait names tagged with prefix tags and therefore any item that does not have both, or where either part is not specified, are considered to be blank items.

You may specify #codes(sep=X) to change the separator from a comma to some other character. NOTE: If you specify multiple characters, each one individually is a separator, NOT the whole string as a single unit. You may enclose the separator in quotes or braces, such as #codes(sep=” “).

If you specify multiple codes entries, separate them with commas.

* #Loadout() / Loadout()

Support for using the #loadout() special directive has been added to adds(), addsorincreases(), and creates().

If you use the #loadout() special directive to add an item to a loadout, then GCA will now automatically apply protection from any armor or shield items so added. This seemed to be the most likely desired action, so it was made the default. If you do NOT want that to happen, include #noarmor as part of the loadout name inside the #loadout() directive for each loadout not receive protection.

If you are adding a shield, you can use #arc() as part of the loadout name to specify the protected arc. At this time, the supported arcs are ‘none’ (the default), ‘back’, ‘left arm’, and ‘right arm’.

Example:

Loadout Tester (Adds),
displaycost(0),
cost(0),
page(User),
noresync(yes),
adds(_
{EQ:Backpack, Small #loadout(Pack)}=1,
{EQ:Blanket #loadout(Pack)}=2,
{EQ:Canteen #loadout(Pack)}=1,
{EQ:Leather Jacket #loadout(Pack, Combat)}=1,
{EQ:Heavy Leather Leggings #loadout(Pack, Combat)}=1,
{EQ:Gauntlets #loadout(Pack #noarmor, Combat)}=1,
{EQ:Small Shield #loadout(Pack #arc(back), Combat #arc(left arm) ) }=1,
{EQ:Steel Breastplate #loadout(pack #noarmor)}=1_ 
)

This template will apply all items to the ‘pack’ loadout, and some of the armor to the ‘combat’ loadout. The Steel Breastplate is not being worn, so it’s flagged as #noarmor in the ‘pack’ loadout where it resides. The Small Shield is worn on the back in the ‘pack’ loadout but on the left arm in the ‘combat’ loadout. And since gauntlets are annoying to wear casually, they’re also not being worn in the ‘pack’ loadout.

Note that the loadout() tag, which inserts the item with that tag into loadouts in a similar fashion, now also applies protection by default and also supports the #noarmor and #arc() directives.

You can also use this feature to assign protection for the virtual ‘All unassigned items’ loadout by leaving the loadout name portion blank, or by explicitly referencing a blank loadout using empty quotes “”. Note that this means using an empty loadout() tag on a trait will trigger GCA trying to assign it to a loadout and to apply protection, so don’t include empty loadout() tags unless that’s what you want to happen.

* Plugins

In compile.xml, you may now use the variable %home% in a ‘reference’ element to point at the plugin’s home install folder. This should allow for the compiler to properly find and reference additional DLLs that you may need to include with your plugin.

* Export to Roll20

A new exporter from Mad Coder that creates a json export file for importing into the Roll20 VTT.

 

Ever more bits of bug fixing (b198)

b198

Fixed issue that prevented limits on traits in Select dialogs from being handled.

Fixed crash bug related to calculating charblockscore() if no charskillscore() was found.

Made some changes to RTF handling so that it uses the system-returned default font rather than an assumed MS Sans Serif font for the default font used.

Made a minor initialization change to Party Log dialog, to hopefully address an issue that I don’t see but a user does.

One bit fixed, two bits extra (b196)

b196

* #AsChild

You can now use the special directive #AsChild in an adds(), addsorincreases(), or creates() tag to specify that the trait being added should be added as a child. Using #AsChild automatically forces #DoNotOwn as well, so be aware that the child will not be owned and will not appear in the needs() automatically. As with #NoNeeds and #DoNotOwn you should include #AsChild in the main clause of the tag data, before any ‘respond’ or ‘with’ portion, else it be considered part of the other clauses and not work correctly; sticking it into the name section is usually good.

* #InputX directives

There was a processing bug in the code that handles processing the #input(), #inputreplace(), #inputtotag(), and #inputtotagreplace() directives. This bug would occur when the tag data included a custom tag that ended with the # character. The processing code would find that character, correctly identify it as being part of a tag, but still exit processing before looking at the rest of the tag data. That is now fixed, and these directives should now be processed correctly regardless of where they fall in the tag list.

* Respond

I have adjusted adds() and addsorincreases() to allow any included ‘respond’ keywords to use a $ function to process the ‘respond’ text before it gets pushed onto the response stack. You can use this to completely change responses, or to respond with an evaluated expression. If you want to respond with text that includes an unprocessed $ function, escape it as ‘$/function()’ rather than simply ‘$function()’ and GCA will change the ‘$/’ to “$’ before it pushes the responses onto the stack. The $ function processing happens before any quotes or braces are stripped from around the response expression (which itself happens before the response is split into list items if it is a list).

Still more bits of cleanin’ (b195)

b195

There was a bug in how GCA removed nested components when deleting a template. That is now fixed.

The Recycle Bin didn’t properly support multiple levels of components. That is now fixed.

Added Public Function NonAttackModes() As ModeManager to the ModeManager class, which returns all contained modes that are not melee or ranged attacks (denoted by having charreach() or charrangemax() tags respectively) as a ModeManager.

Updated the Attack boxes in Unified to show DisplayName for the trait.

Adjusted filling of the Description and User Notes fields in Edit Traits to better support the possibility of there being partial RTF fragments (such as \par for paragraph breaks) in the original data, without there being full RTF. This basically converts the text with RTF fragments into full RTF before putting it into the editor by including a small RTF header. Since it would come out of the editor as full RTF anyway, this just ensures that the fragments aren’t ‘lost’ by being converted into embedded text rather than the intended RTF codes.

Cleanin’ up some bits (b194)

b194

GCA should now be cleaning up .tmp files correctly in its AppData folder

GCA should now be cleaning up those empty 5.0.X.X folders in its AppData and ProgramData folders.

I belatedly realized that changing Item.Notes from a property to a function in the last build could unnecessarily break some things that plugins might be doing. So I changed Item.Notes back to a property, and it now returns usernotes() as plain text. If you set it, it sets usernotes() with that text.

I’ve changed the new function that was briefly Notes() to GetNotes(Optional ByVal AsPlainText As Boolean = True) As String instead, and added GetDescription(Optional ByVal AsPlainText As Boolean = True) As String for getting Description as well.

When building protection values, it seems that I didn’t properly trap for non-Equipment traits (such as Damage Resistance) that may have been made children of Equipment items. When a Loadout then tried to calculate protection values, it would crash because it would create a duplicate reference to that item. (Traits that provide protection are separately gathered because they’re not technically part of a loadout, so could still provide protection regardless of the loadout in use.) I have added a trap for the duplicate, which should fix the crash.

GCA wasn’t properly updating the total costs for various types of traits when adding or removing children. Now it should be.

The attack boxes in the Party View cards should now integrate a bit better. Also the gear menu should now be hidden since the options aren’t available here.

Refactored some of the code in the process that finds and initializes plugins. This eliminated a ton of redundant code.

In the Plugins dialog, if you Enable a currently disabled plugin, but GCA isn’t able to activate it when you Close the dialog, it will no longer add it back to the Disabled list as it was doing. It’s possible that GCA isn’t able to reload a plugin if there was some kind of conflict, but that it may be able to load it when restarted; therefore it makes sense to assume it should not be on the Disabled list if the user requested that.

Added a bunch of additional pre-checks and error traps for possible issues related to duplicate entries of various sorts of tracked and keyed objects during program initialization, even in many situations where it shouldn’t be possible to get duplicates.

Dmg() was missing from the tags being processed into mini-modes for Mode.GetMiniModes(). Fixed now.

Another big haul o’ bits (b193)

Another much bigger update than usual. I have been putting the money from my Patreon to good use! Much of the new stuff in here is only available now thanks to the funding provided by my Patreon supporters. If you’d like to see improvements, bug fixes, expansions, and more added to GCA sooner rather than later, please consider pledging if you can afford to do so. (Not required, not expected, but very, very much appreciated!)

b193

* Miscellaneous

I have added support for requesting the worst of available skills, instead of the best, from the skillused() list when calculating charskillscore(). You do this using the #worst directive somewhere in the list (I suggest as the first thing). Do not separate the directive from the list with a comma, as GCA will identify it and remove it before parsing the list. This flag must be in the skillused() list for a mode in order to apply, otherwise GCA will continue to select the best possible skill for use.

GCA’s internal data handling is generally fine with CR+LF usage almost everywhere, but they’re not allowed in the data files. So, I have added some logic to convert these carriage return/line breaks to <CRLF>, <CR>, or <LF> (depending on how they’re found; RTF often uses line feeds but not carriage returns, for example) when saving data out to a data file, and to convert <CRLF>, <CR>, or <LF> back to the appropriate control characters on reading book data in. This has been done in the routines that save character data to book files, read data in from book files, and in the reading and writing of the FastLoad files. This should allow users to use hard returns in descriptions and notes for traits and modifiers within GCA itself, and <CRLF> to represent them when editing data files. If you paste RTF code into a book file manually, you will also have to manually change all the line feeds to <LF> to keep things kosher. Note that this change is not currently supported for anything that isn’t a trait or modifier.

GCA now supports the trait tag vttnotes() and the mode tag vttmodenotes() for users to make notes intended to be used in the virtual tabletops of their choice. Of course, this requires an appropriate exporter that knows to export these fields in the correct way to be useful for whatever VTT is the target.

I’ve created a very simple tool-style dialog to allow selecting a color; it’s basically just a form to show you the color picker drop-down that I use in Sheet Options for picking colors. This is currently used by the simple RTF editor that I mention in the RTF-Related section below.

I have enabled the gear menu on the Reaction Modifiers box, and added an option: Show Bonuses By Line. This allows for changing the display of bonuses and conditionals in the box so that they’re one per line, instead of in paragraph format. (Turns out that I prefer it this way, so I’ve made that the default behavior now. You can turn that option off to restore the previous paragraph-style output.)

Both Sheet View and the Print Preview dialog now have the ability to switch between Single Page and Facing Pages modes using new buttons on the toolbar. (The View Whole Page button now has a new image since the previous image is now used for Single Page.)

When you use Save to File from the Edit Traits, Advanced Edit Traits, or Edit Modifiers dialogs, or use Save as Template from the File menu, GCA will now ask you if you want to reload any libraries that make use of the changed book. This allows you to have GCA do it automatically rather than you having to reload the libraries manually, but by asking first it allows you to refuse, in case you have a bunch of other stuff to save as well.

* Bug Fixes

Fixed a bug in damage calculations related to text functions with damage multiplier bonuses.

I found that GCA really disliked fixed value (non-dice) base values for attack damage (such as ‘1’ instead of ‘1d’), and having one would often result in getting a weird result that might include unsolved expressions. I tracked down where that result was decided upon, and can’t figure out if there was a good reason for me to return that weirdness, or if it’s just a bug. I decided it was a bug, and fixed the value that gets returned so that it should now return the non-dice flat value result that I think should have been correct. If I was wrong, and just didn’t remember some esoteric reason for that particular configuration, I apologize, and hopefully it’ll come up and I can figure out something else.

The Reaction Modifiers box in Unified View would sometimes get its bottom cut off, and sometimes that would result in not seeing all the text. I have made a change in how it is refreshed to address this.

Fixed some text on the Symbols and Optional Display panels of the Character Options tabs in Options. Also moved the ‘Include your shield DB in the scores/levels for your active defenses’ option to the bottom of that panel.

* Minor Adjustments

Adjusted some bonus display string creation to show ‘+0’ instead of just ‘0’.

Advanced Edit Traits will now show the IDKey of a trait just above the tag data grid. It’s not editable, but it can be selected and copied.

Fixed Sheet View so that the Library pane will stay the set size when the window is resized, as it does on Unified View.

I’ve updated some mode based bonus messages to refer to the mode name instead of the number.

Added a bunch more tags to the list of tags that are not saved as data when saving a character trait as a system trait.

* Modes in General

I have updated some code, and added some routines, to better support certain mode calculations using Modes directly instead of passing a mode index. This should be transparent, but its a change that could potentially break something.

I have added Public Function DamageDisplayText() As String to the Mode object. This function returns a string that represents the standard damage notation including damage, armor divisor, damage type, and radius. Example: 2d+1 (2) cut (2). You can also access this using Item.DamageModeTagItem() with “DamageDisplayText” as the tag, if you’re accessing mode values that way.

I have updated various attack mode displays in GCA to use the new Mode.DamageDisplayText function.

* Damage Mini-Modes

Damage mini-modes allow you to store more than one set of damage values in a single attack mode. If you apply them manually, you need to set damage(), damtype(), armordivisor(), and radius() manually, using comma-separated values, one per mini-mode desired. Damage() is always required, but the other tags are not. You can also apply a mini-mode via a bonus to ‘minimode$’ in standard damage notation, such as ‘1d cut’ or ‘sw+1 (2) burn (3)’; GCA will parse those damage strings into the appropriate tags (remember to put armordivisor and radius in parens, and that armordivisor comes before the damage type while radius comes after it).

This is considered an experimental feature, but it is ON by default. You can turn it OFF on the Experimental Features panel on the Program Options tab of the Options dialog.

NOTE: If you have mini-modes that you created manually by editing tag values, turning the option OFF in Options may result in a crash as that can result in illegal data. However, if you apply mini-modes via a bonus, that bonus will simply no longer get processed, so no crash will result.

The new DamageDisplayText function of a Mode will return the damage string correctly, whether there are mini-modes in use or not. When mini-modes are in use, damages will be displayed as comma-separated damage notations.

Using mini-modes results in some new calculated tags being managed in each Mode: minimode_damage(), minimode_damtype(), minimode_armordivisor(), and minimode_radius(). These shadow the original tags but have all the extra mini-mode data included, or slots for them when values are missing or empty.

For plugin authors, if you need to access mode data for purposes other than display, you can use the new GetMiniModes() function of a Mode. This returns all the mini-modes as part of a ModeManager, as full modes using the data of the mode in question, but the damage data for each mini-mode. That is, if you have a mode with two mini-modes of ‘1d cut’ and ‘sw+1 (2) burn (3)’, then GetMiniModes() will return two modes that are identical to the original mode, but with the damage(), damtype(), armordivisor(), and radius() tags set for each type of damage for each of the two mini-modes.

* Notes, Notes(), UserNotes()

The Notes panel in Edit Traits wasn’t serving any purpose any more as handling of modes changed how that data was used and viewed, (The old usage of Notes was muddied between general notes and the original intended usage of the short notes-reference-numbers in equipment tables and such. Nowadays, notes() is enforced as a mode-specific tag, and I’ve made an effort to change the long-form notes that were sometimes used in data files to use either usernotes() for general trait notes, or itemnotes() for mode-specific notes.) As such, the Notes panel in Edit Traits has been re-tasked to support VTT Notes, which would be a specific place for people to enter notes or formulas for use on virtual table tops, if supported (Foundry, for example, could use it for OTF expressions without cluttering up any other fields.)

The Notes property on GCATrait has been removed. I have replaced it with Public Function Notes(Optional ByVal AsPlainText As Boolean = True) As String which returns any usernotes() for the trait. Usernotes() is an RTF-enabled tag, so by default the Notes() function returns that data as plain text; you can pass False for the AsPlainText optional parameter if you are okay with getting the RTF-encoded text.

* RTF-Related

The helper function RTFtoPlainText() wasn’t smart, and if an exception occurred because the text being processed wasn’t valid RTF, it would just fail. Now it attempts to convert again using a simple RTF header, and if that also fails, it simply returns the text it was provided. I also improved the logic significantly, which provides a huge improvement in processing speed. (This routine also used to convert any CR+LF that exists in the text after conversion, or failed conversion, to the text marker “<CRLF>”. That no longer happens here.)

Added some additional routines to assist in RTF processing, and adjusted some of the existing RTF routines so fewer controls will be instantiated and destroyed as GCA runs and handles RTF features.

I’ve created a very simple RTF editor, which just allows for setting bold, italic, or text colors, and offers access to the font dialog for changing fonts and font sizes.

Currently the RTF enabled fields using the new simple RTF editor are: the Description and User Notes boxes in Edit Traits; the Notes field in the Selected Log Entry area of the Campaign Log; and the Notes field of the Party Log Entry dialog.

With the added support, and likely increased use, of RTF in Description and User Notes, the existing code for displaying the description() and usernotes() in the Info pane no longer worked correctly. Since the content of the Info pane was already RTF, it already had a header with a color table. That meant that when the new RTF tag content was inserted, any color information it had would be matched against the existing color table, shifting the colors from what the user applied. (They were still correct in tag itself, just displayed incorrectly.) I have fixed this in various pieces of the system that generates the display, allowing me to insert the description() or usernotes() using the Info pane control’s RTF handling, which allows it to merge the color tables and display the data correctly.

* View Info Templates

I have adjusted the included templates for the information that is displayed in the View Info pane for the various types of traits. I have removed notes() because, as mentioned above, it’s not what was intended. I have also moved the usernotes() display to under the description() display, since it will often include important information, and moved both of them upward to just under the Page display.

* GCA Prime Sheet (now 1.0.5)

Updated to allow for properly printing the RTF text of description() and usernotes() for traits.

Added options to have description() and usernotes() print as plain text instead of rich text.

Add options to always show description() or usernotes() for traits that are highlighted a certain color (or highlighted at all).

Updated to use Mode’s DamageDisplayText for damage displays.

* GCA5.xsd

Added element ‘vttnotes’ to the ‘ref’ block of GCATrait

Added element ‘vttmodenotes’ to GCAAttackMode block

Added elements ‘minimode_damage’,’minimode_damtype’,’minimode_armordivisor’, and ‘minimode_radius’ to GCAAttackMode block

* TagDefs.xml

Updated ‘mode enabled’ text to instead be ‘mode specific’.

Updated to include text for vttnotes() and vttmodenotes().

Updated to include text for minimode_damage(), minimode_damtype(), minimode_armordivisor(), and minimode_radius().

 

Some big chonky bits (b192)

This is a much bigger update than usual. I have been putting the money from my Patreon to good use! Much of the new stuff in here is only available now thanks to the funding provided by my Patreon supporters. If you’d like to see improvements, bug fixes, expansions, and more added to GCA sooner rather than later, please consider pledging if you can afford to do so. (Not required, not expected, but very, very much appreciated!)

b192

* Miscellaneous

In Options, Current Character Options, in the Symbols and Optional Display box, some of the text for the options related to showing Break and Malf values was incorrect. Fixed.

The Attributes trait box in Unified View will no longer offer the little increment/decrement buttons if the attribute doesn’t actually support being adjusted.

The Edit Traits dialog will now disable the increment/decrement buttons for attributes that do not support being adjusted.

The colors for the header and border of the applicable modifiers list in the Modifiers dialog have been fixed.

I changed the data type for Penalty in the Hit Location Table lines, making it a string field instead of an integer one. This allows for more flexibility in possible table entries. I have updated the code in various places, including the Hit Location Table object and the Protection dialog, to reflect this change and to allow for unconverted string data.

I added an alias of ‘reskin’ for the tag ‘displaynameformula’ for both traits and modifiers. An alias just means that you can use that name for the tag instead of the expected name, but the expected name is the one that stays in the tag list. So, you can Add Tag ‘reskin’ with a value of “TEST”, and it will appear that way in Advanced Edit Traits until you click OK and the tags are written back to the tag list; at that point ‘reskin’ will become ‘displaynameformula’, and when you open Advanced Edit Traits again, you’ll see ‘displaynameformula’ instead of ‘reskin’. You can also use an alias as a reference, such as ‘me::reskin’ to get the value of the ‘displaynameformula’ tag. NOTE: If you use an alias to Add Tag a tag that already exists in the tag list in its dereferenced form, it’s a crap-shoot as to which tag value you’ll end up with when you click OK.

Made changes in a whole bunch of places where BonusList entries are made, so that the bonus text shows as coming from the giver’s DisplayName instead of its FullName.

Added a couple new BonusListSpecialCaseSubs for use with ListAs, since %name% now returns DisplayName instead of FullName. You can now use %displayname% if you want to, but that’s the same as %name% now. You can also use %fullname% to explicitly get FullName.

Adjusted the ‘name’ provided for the skill that is being defaulted from, when that’s happening, to use DisplayName instead of FullName.

Made it so CTRL+A should select all the text in the Message dialog’s text box.

Some users were seeing the ‘double-click to open the traits dialog’ optional feature in the Trait boxes on Unified not work for some lists. I believe this is because the pop-up menu will sometimes cover the button when the pop-up menu gets pushed upward to avoid parts of it appearing off-screen. I’ve set the pop-up to open to the right of the button, instead of below the button, which I think will fix the issue.

The Solver’s routine for getting an item’s value would return 0 in many cases instead of a negative number, if a negative number was the best or only result in those cases. This has now been fixed to allow returning that negative number if it is the best or only result.

* Templates

We’re seeing some issues with some of the more esoteric features of templates and related traits. It appears that this is because the various features of a template (adding traits and whatnot) are processed before the template itself is calculated. This is necessary, because some of those features might build things that change the template itself. However, without having values yet, even though the template may appear on the trait lists, it won’t appear to exist if something checks for it because it’ll have a level of 0. This can be a problem. So, I’ve moved the basic initialization to occur before the template features are processed, and now do a calculation based on those values. Since most of the template doesn’t exist yet, the results of the calculation at this stage won’t be ‘correct’, but they will provide initial levels and points, so that the trait should appear to exist when checked for. This applies to all traits, because any type may use some template features. Because most of the template isn’t actually initialized yet, the calculation should be very quick, but it also means that if a more comprehensive tag or value of the template is required, it won’t be there until after the template has finished being built.

I’ve created the new flag command #preserve for use with replacetags() and mergetags() in templates. Just stick it into the ‘with’ block somewhere; GCA will strip it out when found, but that will tell GCA not to create a changelog entry for it. (GCA has very few ‘undo’ features, but this is one place where there is some of that, and if you do a replacetags() or mergetags() and then remove the template that performed it, GCA will undo that tag change. Unless you now use #preserve to make it stick.) For example, replacetags(in char with “Profession(Bandit)”) will change (or add) a Profession tag to the character, with a value of Bandit, but removing the template that made that change will remove the tag value again (or change it back to what it was); using replacetags(in char with “Profession(Bandit)”#preserve) will ensure that the profession remains, even if that template is removed.

* ArmorDivisor() / CharArmorDivisor()

Stacking of armor divisor bonuses was not working correctly. Since armor divisor is a multiplicative adjustment, bonuses should multiply, not add. However, bonuses were being granted as adders instead of multipliers, because without any adders, the result would often be 0 (since adders are often used to create the base value, and without any, the base value stays 0).

So, armor divisor has to be handled as a special case, and in this special case, all adder bonuses are treated as multiplier bonuses instead, and a bonus value of 0 is treated as a bonus of 1 instead. Then, when the math is handled to sum adders together to get the base, GCA ensures that a base of 0 becomes a base of 1. The multipliers are then multiplied against that base.

GCA must also do something similar for all targeted text bonuses, since that has been the only way to create a bonus that only applies to certain modes. However, that creates or modifies the base value based on the orginal mode tag value, which could somehow cause a problem at some point (although right now I haven’t seen it). So, if a text bonus to armordivisor$ must *not* be pre-solved and converted to a multiplier as is now done, use the +noaddcheck keyword. GCA will remove the keyword from the bonus text, and then simply apply the remaining bonus text to the tag value (as is usually done for other tags) before eventually getting sent to the Solver for final evaluation.

Handling this special case in this way means all existing adder bonuses to armor divisor should now work correctly (as multipliers), and if users changed some to be mulitpliers, those should also continue to work correctly.

* Modes and Bonuses

So far, bonuses that need to differentiate by mode have to do a complicated text bonus. That’s dumb, but I just never really noticed it before. Shouldn’t it be possible to target a bonus right to a particular mode, without having to deal with the complex world of text bonuses to the $ version of a tag?

Yes, it should. It does require a little more overhead, because the bonuses have to be checked on a per-mode basis to see if they apply in the current case. But otherwise, it should be possible, and should be so without affecting anything else about how bonuses work, or any existing bonuses.

So, here’s what I’ve done to enable this.

I’ve added a new clause to creating a bonus using gives(), and that clause is ByMode, and it looks like this:

bymode [where] TAG COMPARISON VALUE

The bymode keyword is required but the where keyword is optional (it just helps readability to have it there).

TAG is the mode-enabled tag that you’re looking at, such as ‘damtype’.

COMPARISON is the comparison you’re making, and uses the same selection as Trait Selectors, which are these: is (TAG and VALUE are the same), isnot (TAG and VALUE are not the same), includes (VALUE can be found inside TAG), excludes (VALUE is not found inside TAG), listincludes (TAG is treated as a list, and VALUE is found as one of the list items), and listexcludes (TAG is treated as a list, and VALUE is not found as one of the list items).

VALUE is the value that you’re comparing TAG against.

Right now, this is basically all string/text based, so there’s no less than or greater than or such comparisons. I can add something to do that if needed down the line.

If the ByMode clause exists for the bonus, and the comparison returns TRUE, then the bonus applies for the mode.

Here’s an example gives() that might be applied by a modifier:

=+5 to owner::armordivisor bymode where damtype contains “cut”

This bonus to armor divisor is only applied when the owner’s mode is something that does cutting damage, so if there’s a hammer on the back doing crushing, it will not suddenly get an armor divisor as well.

To make all that new ByMode stuff actually work right in calculations, I also had to touch a lot of places and write some new routines, so that gathering up the applicable bonuses could be done per-mode instead of just once per-tag. Assuming that all of those changes have been done correctly, there should be no difference in results for any currently existing characters or bonuses, but the new functionality should now be available to all mode-specific target tags.

I have now updated the Trait Selector code to allow for better parsing, and to support subcriteria in the selection. This means that if you use ByMode, you can specify subcriteria for the COMPARISON specified, using the keywords “oneof”, “anyof”, “allof”, or “noneof”. This allows you to specify a list of options to use for the TAG value that satisfy or fail the requirement. This makes the template look like this:

bymode [where] TAG COMPARISON [SUBCRITERIA] VALUE

and allows VALUE to be a list of possible options separated by commas (quotes or braces blah blah blah).

Here’s our example using this:

=+5 to owner::armordivisor bymode where damtype contains anyof “cut,imp”

This bonus now allows the +5 to the owner’s armor divisor to be applied for any mode where damtype contains any occurence of “cut” or “imp”.

NOTE: many combinations of COMPARISON with SUBCRITERIA will make no sense, or will be incredibly confusing to figure out, especially if they’re negative in connotation, such as ‘excludes’ with ‘noneof’. I encourage you to always use positives when possible.

* Build Campaign Book

I’ve made some improvements. The dialog now allows for having a reference library and your book file both. The reference library is basically the same as before if you haven’t saved a book yet, but now you can have one in addition to an active book. This means you can load a book and the reference library and work with the same data you were using before, without having to start all over again. When you load both, GCA will use the book to set all the starting ‘deleted’ traits for you, based on comparing the book against the reference library. This means you’ll be able to improve and refine your book, or add new books to the reference library and add get new traits to add to your book.

It’s important to remember that GCA will not be able to remember the ‘deleted’ traits. Those are filled through a comparison of the book file with the reference library. Any traits found in the library that are not in the book will be put into the Deleted Traits list. Then, you can remove those traits from the Deleted list if they’re ones that you want to include now. This is the only way to ‘add’ new traits from new library books to your campaign book in this dialog. To say again, they’ll have been auto-deleted, and you have to *undelete* them to add them to the book. (Of course you can save traits to your book inside GCA normally, or add them manually if you wish.)

Books saved from this dialog will now include a reference to the library, so if you load the book in the dialog later, it will be able to set the library for you.

You can also change the library you are using as the reference library, and GCA will adjust the traits kept or deleted through the same comparison to the book.

When the Campaign Book includes traits that are *not* in the reference library, GCA will notify you of that, and will add all those traits from the book into the library. It will also flag all of those traits so that it’s clear which are not found in the reference library.

Once you have loaded both the book and the reference library, you’re working strictly with the library data (which may have had book data added to it, if it was missing, as mentioned above). Nothing you do changes the *book* until you save the library to the book.

Also: Fixed a couple bugs in Campaign Settings where changing the Disad Limit would change Base Points instead, and changing Quirk Limit would result in it being set to Disadvantage Limit. Enabled double-clicking in the library list to remove a trait, and in the deleted items list to restore the trait.

* Money

GCA has been updated to *not* include char::campaigntotalmoney in the calculations for the Points Bar to display equipment and money values based on the Remaining Funds and Money attributes, *if* those attributes already include char::campaigntotalmoney in their basevalue() tags.

It did not used to be possible to retrieve the value of the total money earned from the Campaign Log in the calculations for a trait. Once it was possible, it didn’t get applied to the attributes right away, so the value of the Money and Remaining Funds attributes would not correctly reflect actual values once Camapign Log entries were included. The Points Bar values, however, did include the Campaign Log values. This resulted in an unnecessarily confusing disconnect between the character’s value and the value displayed in the UI, and a Money value that would be incorrect when printed to character sheets.

This adjustment should fix that going forward, in conjunction with the changes to the book files that define these attributes. The Basic Set, Discworld, Dungeon Fantasy, and Lite book files have all been updated in support of this change.

As with all changes that include adjustments to data, *existing characters will not have this change*. You must Resynchronize Attributes in order to update a character with the updated attributes.

(If you wish, instead of a Resynchronize, you could manually add “+ char::campaigntotalmoney” (without the quotes) to the end of the basevalue() tag values for Money and Remaining Funds.)

* GCA5.xsd

Changed element ‘penalty’ in GCAHitLocationLine to a string.

* BookCodes.xml

* Data Files

NOTE: The updates to the data files are included here because they were released to my private beta testers. However, they are *not* yet released to the public. When that happens, I’ll post a Package Update notice.

(I’m sorry, but the data files updates here includes both new stuff since the previous update, and stuff that was in the previous update, because I’m just keeping one list that will go up on my blog when the Official Release version goes out.)

————————————————————
Discworld RPG.gdf
————————————————————
[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

————————————————————
Dungeon Fantasy RPG.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

[Body]
<Humanoid>
Updated body part display locations to better fit default image.

[HitTables]
<Humanoid>
Added.
Updated rolls and notes to match those in Exploits, but edited to fit a simple Humanoid body (no extra limbs, tails, wings, etc.)

<Universal Dungeon Fantasy>
Added this table to match the table in Exploits, which includes adjustments and notes for extra limbs, tails, wings, etc.

[Modifiers]
<Arrow>
Flaming
Added

<_General>
Continual Light
Haversack
Resistance
Deflect
All of these added from Matthew Woods, with some adjustments from Armin.

<Melee Quality>
Accuracy
Puissance
Penetrating Weapon
Shatterproof
Defending Weapon
Flaming Weapon
Icy Weapon
Lightning Weapon
Ghost Weapon
Graceful Weapon
Loyal Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Bow Quality>
Accuracy
Puissance
Penetrating Weapon
Shatterproof
Ghost Weapon
Loyal Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Arrow>
Accuracy
Puissance
Penetrating Weapon
Flaming Weapon
Icy Weapon
Lightning Weapon
Ghost Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Armor>
Fortify
Deflect
Lighten
All of these added from Matthew Woods, with some adjustments from Armin.

<Shield>
Defending Shield
Deflect
Lighten
All of these added from Matthew Woods, with some adjustments from Armin.

[Disadvantages]
<_General>
Odious Personal Habit (“Constant Humming or Singing”)
Added

Compulsive Carousing
Compulsive Generosity
Compulsive Lying
Added conditional bonuses/penalties.

[Equipment]
<Ammunition>
Arrow (Bodkin Point)
Arrow (Cutting Point)
Crossbow Bolt (Bodkin Point)
Crossbow Bolt (Cutting Point)
Added

<Clothing>
“Clothing, Complete Outfit”
Added

<Weapons>
Composite Bow (ST %choice%)
Composite Crossbow (ST %choice%)
Crossbow (ST %choice%)
Longbow (ST %choice%)
Pistol Crossbow (ST %choice%)
Regular Bow (ST %choice%)
Short Bow (ST %choice%)
Added modes for Standard Point, Bodkin Point, Cutting Point, and Flaming: Follow-Up

<Other Magic Items>
Bottomless Purse
Cornucopia Quiver
Gem of Healing
Ironskin Amulet
Moly Amulet
Necklace of Fireballs
Salamander Amulet
Serpent’s Amulet
Siege Stone
Wizard’s Staff
Wizard’s Wand
Added.

[Spells]
<Movement:Mo>
Added SP:Quick March (Druidic)

————————————————————
Dungeon Fantasy RPG – Companion 3.gdf
————————————————————
Book added. Thanks to Matthew Woods.

————————————————————
GCA5 Symbols.GDF
————————————————————
[SYMBOLS]
A number of the rules referred to the _Cinematic.png image. That image was removed a long time ago, but the rules weren’t updated to reflect that. That is now fixed.

————————————————————
GURPS Basic Set 4th Ed.–Characters.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

[Advantages]
<Mundane Social, Mundane, Social>
Pitiable
gives(+1 to SK:Panhandling) changed to gives(+3 to SK:Panhandling)

[Body]
<Humanoid>
Updated body part locations to better fit default image.

[Equipment]
“Auto Shotgun, 12G”
Removed the duplicate malf() entries from each newmode().

————————————————————
GURPS High-Tech Pulp Guns Volume 1.gdf
————————————————————
[Equipment]
Added quotes around so very many item names.

Colt Model 1878
H&H Paradox Gun
Winchester Model 97
FN-Browning Auto-5
H&R Model 8 Standard
Merkel Modell 145
Winchester Model 12
Greener Police Gun, 14.5G 2.56”
Remington Model 17, 20G 2.75”
LeFever Nitro Special, 12G 2.75”
Ithaca Auto & Burglar, 20G 2.5”
Ithaca NID Field, 12G 2.75”
Winchester Model 21, 12G 2.75”
Remington Model 32, 12G 2.75”
Manville M12, 12G 2.75”
Removed the extraneous mode() tag.

Greener F35 Far-Killer
Removed the extraneous mode() tag.
Renamed second newmode() to Slug.

Winchester Model 1887
Removed the extraneous mode() tag.
Removed the second newmode() tag because it was largely a duplicate of the first, and the other stats didn’t seem to make sense for that.

————————————————————
GURPS Lite 4th Ed.–Characters.gdf
————————————————————
[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

————————————————————
GURPS Low Tech 4e.gdf
————————————————————
[BODY]
<Humanoid – Low Tech>
Now showing Chest and Abdomen instead of Torso.
Updated body part locations to better fit default image.

[HitTables]
<Humanoid – Low Tech>
Added this hit location table to go along with the Body “Humanoid – Low Tech”.
Some of the hit penalties here are worked out with Kromm because they’re not specifically noted in the book.

[Equipment]
“Qian Kun Ri Yue Dao”
Fixed a missing comma between a couple newmodes()

————————————————————
GURPS Martial Arts 4e.gdf
————————————————————
[Equipment]
Large Hungamunga
Removed the tag mode() from newmode(Thrown).

————————————————————
GURPS Powers 4e.gdf
————————————————————
[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

————————————————————
GURPS Steampunk 3 – Soldiers and Scientists.gdf
————————————————————
Book added. Thanks to Gareth Parker.

————————————————————
GURPS Thaumatology 4e.gdf
————————————————————
Section for Raw Magic added to end of file. (Thanks to Symbiode)

[Advantages]
<Raw Magic>
Raw Magic Store
Added

[SPELLS]
<Meta-Spells>
Detect Raw Magic
Analyze Raw Magic
Process Raw Magic
Added

<~Ritual – Meta-Spells:MS>
Detect Raw Magic (Ritual)
Analyze Raw Magic (Ritual)
Process Raw Magic (Ritual)
Added

————————————————————
GURPS Ultra-Tech 4e.gdf
————————————————————
[Modifiers]
<Melee Quality>
Composition: Hyperdense Blade (TL11)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=5 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 5), (“imp”, 5) ) to owner::armordivisor$”

<Sword Class Quality>
Weapon Quality: Superfine (TL9+)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=2 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 2), (“imp”, 2) ) to owner::armordivisor$”

Composition: Monowire Blade (TL9^+)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+10 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 10) ) to owner::armordivisor$”

Composition: Vibroblade (TL10)
Composition: Vibroblade (TL11)
Composition: Vibroblade (TL12)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+3 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 3) ) to owner::armordivisor$”

Composition: Nanothorn Blade (TL11^)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+10 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 10) ) to owner::armordivisor$”

Fixed bits all over the place (b191)

NOTE: The updates to the data files are included here because they were released to my private beta testers. However, they are *not* yet released to the public. When that happens, I’ll post a Package Update notice.

b191

I have created a new program called The Cleaner that will be installed with GCA5 in the future. This program will allow you to clean/remove the folders that GCA creates in out-of-the-way areas of your system, so that you don’t have to track them down in order to clean up after GCA should you uninstall. (Because these folders and all that they contain are created by GCA itself, or by the Update system, the setup program can not remove them when you Add or Remove Programs.) This program is similar in concept to GCA4’s GCAClearAppData program, but this one has a UI and allows you to choose which of the two different folder structures you want to clear out.

The Party Log Entry dialog was missing a field to enter Money. It has been added.

For some reason, the Modifier property FullNameOldStyle was returning text in the new style of “Name, Extension” and not in the expected old style of “Name (Extension)”. This rendered any of the @hasmod() related functions likely to return the wrong value if they were checking against the often used “Name (Extension)” style. This has been fixed.

When loading a hit location table from a files, the table notes are keyed, so each must be unique by the given note() key. GCA was not checking for duplicates, and would crash if a duplicate note ‘key’ was added to the table. GCA now checks for dupes, and will replace the existing note with the duplicate now. (If Verbose is On for the book while loading, a message will be printed to the log about the duplicate and the replacement.)

Resynchronize was not removing certain system-only tags from character traits when refreshing the character traits with the system data. This meant some system control tags were being left on the trait, which would sometimes cause issues in certain situations. I’ve split out a routine for cleaning the traits of those tags (from the code in the character that handles creating new items), and Resynchronizing traits now uses that new routine as well.

GCA was incorrectly parsing template creates() items that had quoted names. That has been fixed.

When saving a Body to a file from the Protection dialog, height and width data for the location boxes was not being saved. Fixed.

GCA was also not processing height and width values for body parts that were being set in the [Body] section of a book file. Fixed.

Changed calculation of weightcapacity(), so that it can be targeted for bonuses to ‘weightcapacity’ and so that charweightcapacity() will be calced and included even if there are no children.

There was a potentially serious bug that could put GCA into an endless loop after clicking on OK in Advanced Edit Traits, if the item being edited had both children and bonuses. This appears to have been due to the order of operations for how a modified trait is updated (even if no real user edits were made). I have adjusted the order of some of the operations, and I believe this issue is now fixed without negatively impacting results.

Support for Bonus exceptions (onlyif, unless) hadn’t been extended to all routines related to applying bonuses. Should be now.

————————————————————
Dungeon Fantasy RPG.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Modifiers]
<Arrow>
Flaming
Added

[Disadvantages]
<_General>
Odious Personal Habit (“Constant Humming or Singing”)
Added

Compulsive Carousing
Compulsive Generosity
Compulsive Lying
Added conditional bonuses/penalties.

[Equipment]
<Ammunition>
Arrow (Bodkin Point)
Arrow (Cutting Point)
Crossbow Bolt (Bodkin Point)
Crossbow Bolt (Cutting Point)
Added

<Clothing>
“Clothing, Complete Outfit”
Added

<Weapons>
Composite Bow (ST %choice%)
Composite Crossbow (ST %choice%)
Crossbow (ST %choice%)
Longbow (ST %choice%)
Pistol Crossbow (ST %choice%)
Regular Bow (ST %choice%)
Short Bow (ST %choice%)
Added modes for Standard Point, Bodkin Point, Cutting Point, and Flaming: Follow-Up

<Other Magic Items>
Bottomless Purse
Cornucopia Quiver
Gem of Healing
Ironskin Amulet
Moly Amulet
Necklace of Fireballs
Salamander Amulet
Serpent’s Amulet
Siege Stone
Wizard’s Staff
Wizard’s Wand
Added.

————————————————————
GURPS Basic Set 4th Ed.–Characters.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

[Advantages]
<Mundane Social, Mundane, Social>
Pitiable
gives(+1 to SK:Panhandling) changed to gives(+3 to SK:Panhandling)

[Body]
<Humanoid>
Updated body part locations to better fit default image.

————————————————————
GURPS Low Tech 4e.gdf
————————————————————
[BODY]
<Humanoid – Low Tech>
Now showing Chest and Abdomen instead of Torso.
Updated body part locations to better fit default image.

[HitTables]
<Humanoid – Low Tech>
Added this hit location table to go along with the Body “Humanoid – Low Tech”.
Some of the hit penalties here are worked out with Kromm because they’re not specifically noted in the book.

————————————————————
GURPS Powers 4e.gdf
————————————————————
[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

————————————————————
GURPS Thaumatology 4e.gdf
————————————————————
Section for Raw Magic added to end of file. (Thanks to Symbiode)

[Advantages]
<Raw Magic>
Raw Magic Store
Added

[SPELLS]
<Meta-Spells>
Detect Raw Magic
Analyze Raw Magic
Process Raw Magic
Added

 

A variety of bits to choose from (b190)

b190

The routine used to allow scaling of super-large values was truncating/rounding small values with decimal places. Most places it was used that didn’t matter, but it affected Basic Speed, where it does. That routine now allows up to two decimal places if they exist.

There was a bug in the sheet option control that handles the new option for selecting one or more listed items and then allowing the user to arrange them in the order desired (List Selected & Ordered). This bug occurred when there were duplicate items, and the user attempted to move any of those duplicates; the duplicates just got bundled together at the end of the list and couldn’t be moved. That bug is now fixed.

After fixing the List Selected & Ordered bug, I added some support for drag-and-drop to add/remove items, and to reorder items in the selected list.

The Library panes used in Unified and Sheet views now have an additional option for filtering the categories being displayed. If you right-click an item selected in the list, you can select a category that it belongs to, which will then exclude that category of items from the displayed listing. For example, you could click on Absolute Direction, then right-click and select Exclude Trait Category to get a list of categories to which Absolute Direction belongs, then select Mundane to have all traits that belong to the Mundane category excluded from the library list. A check box pane will appear directly under the categories drop-down (above the filter pane), with a No ‘Mundane’ option listed and checked. Unchecking the box will clear that exclusion. The exclusion will persist until you check the box to clear it.

And, expanded the system above, so you can right-click in the Library list and then select Exclude Categories… to pick from a dialog of all the categories that apply to the current list. All the categories you check there will then be excluded, and added to the checklist of exclusions. There is now also a big red X button to clear the entire group of exclusions all at once, if you’re done with them.

Added the ability to convert a template or metatrait into a parent with children structure instead. This removes all the access-control features (hide, lock, etc.) from the related traits in the process. You can access this feature by selecting the desired template trait in the Character list (and only that trait), then choosing the “Convert to Parent/Child” option which will appear in the right-click or Traits menus. That will convert the template or metatrait into a parent with children. You can not undo this.

Updated the code that puts deleted traits into the Recycle Bin to *not* preserve the “NO XYZ” traits that are auto-created by GCA when you disable a component trait in a template. Because these are part of a behind-the-scenes system, they don’t work quite like regular traits, and if you Restore them from the Recycle Bin they may behave problematically.

Added text to the headers for the Armor sections in Edit Traits, so that it’s more clear that the non-editable display is *after* all modifiers and bonuses have applied, while the editable section is before those. Also, changing values did not immediately trickle-through, so that has also been updated to do so.

Adjusted code in the Info pane so the mouse pointer won’t flicker like crazy over page numbers.

I broke a bit again. Ugh. (b188)

b188

I made a mistake when fixing the bug for initializing bonuses of the ‘gains’ type. I only checked one of the two bits that I needed to check, and the less important one at that <ugh>. Unfortunately, that resulted in breaking a different set of bonuses, primarily with modifiers. That is now fixed. I’m sorry about that.