Monthly Archives: January 2017

Transmogrified bits


Made a slight change to how GCA locks the UI, which should be a tad less annoying when there are characters loaded.

Made a small adjustment to the system that activates/deactivates items based on loadout, so that items deactivated by the user manually should be respected and stay deactivated.

The logic for identifying component traits for activating/deactivating has been fixed.

Adjusted the ‘frozen columns’ feature a bit in the Loadout Manager.

* Multiplicities

Started on support for the ‘multiple forms loadouts’ thingy. I don’t know what to call this system, so I’m currently calling these things ‘multiplicities’, or a ‘multiplicity’ for the singular. This isn’t a GURPS name, though, so we’ll likely want to rename it, but at least this will be easy to find and change when a better name comes up.

The Multiplcity Manager window now exists. GCA will now activate/deactivate traits based on the ‘active’ multiplicity selected in this window (if that Loadout option is set!), and the traits assigned to it. Currently, only Advantages, Perks, Disadvantages, Quirks, and Templates are valid traits for this system.

IMPORTANT: I realized that handling activation/deactivation just like loadouts currently does would be a problem, in that managing All Unassigned Items as *not* being a part of the active multiplicity is likely to be unexpected behavior. So, All Unassigned Items are considered to be active parts of ALL multiplicities, which means you don’t have to actively assign everything, only those things that belong specifically to one multiplicity or another. So, basically, GCA only deactivates traits that belong to some other multiplicity than the active one, and ignores unassigned traits. This greatly simplifies the system for the user, albeit at the price of not working exactly like loadouts.

Added a new item to the toolbars and the Character menu, for the Multiplicity Manager window. It’s next to the Loadouts Manager option.

Move bits


* Miscellaneous

The Attributes section in data files may now specify categories for attributes, and GCA will now also allow using the format, just like every other type of trait.

The Attributes tab in Classic View now supports changing categories for the All Attributes list (the one on the right side). You will find the Category drop-down list at the top, and it works like it does for other trait types. (The Attributes dialog uses the same system, so you’ll find this change there, too.)

Added an option to lock the toolbars: View > Toolbars > Lock Toolbars.

The Movement boxes in GCA have been fixed to show the correct basic movement rate for the various movement types the character has. Any enhanced movement rate will be shown after that, separated by a slash, such as “4 / 8”, if the option for that is set in Options (in the Display box of Program Options; it is On by default).

* Loadouts Window

Added Copy and Delete buttons

Changed grid selection so you can more easily tell which row you’re on

Moved buttons & selected loadout column name above the grid

Added a ‘gear’ icon, which allows you to ‘freeze’ the first few columns of the grid.

* Updater

Changed the hash used to SHA-256.

* Plugins

OfficialCharacterSheet: Updated Move column of the Encumbrance & Move block to show values based off of Basic Move as stated by the labels.

ColorBlockSheet: Updated Encumbrance & Move block to show correct move values. Added option to show Enhanced Move values as well, and if On (default is On) then it shows them on the following line of the table.

Bits of housekeeping inactivity


* Miscellaneous

Fixed a crash bug in Unified view trait lists when using field buttons to change a list item’s values, and trait grouping is being displayed.

Fixed CollectionKey for GCATrait to String, which for some reason it wasn’t. (Sorry sheet authors, pretty sure this breaks binary compatibility, so you’ll have to recompile again.)

Added some small utility stuff to modTools.

Ensured all code related to inactive items checked for ‘inactive’ status against a non-empty state, rather than checking for “yes”.

Some drawing code related to trait lists was modified to support graying out inactive items.

* Loadout Handling

I’ve added an option that should be considered ‘experimental’ for now, although since it can be disabled, and is Off by default, it shouldn’t be a big problem.

The new option is winningly named RenderNonLoadoutItemsInactive, but can be found in the Options dialog on two new Loadouts blocks under Current Character Options and Default Character Options, as “Render ‘inactive’ any items not in the current loadout.”

This option does what it says on the tin: any equipment item not in the current loadout is made “inactive”, and will grant no gives() bonuses.

There is a bit of a performance hit when changing loadouts, so folks can decide for themselves if it’s worth it, I guess.

There is also a companion option, GrayOutInactiveItems, which will ‘gray out’ the inactive items if you wish, using the same transparency setting option used for hidden items. (This option is On by default, but only applies if you’re using RenderNonLoadoutItemsInactive anyway.)

Allowing for this did require making some minor changes internally, but they shouldn’t affect much in the way of print or export sheet authors: if you were checking for TagItem(“inactive”) = “yes” instead of TagItem(“inactive”) <> “” or something similar, then you may now need to correct for that. GCA needs to be able to re-activate all items that have been deactivated, should the user turn Off the RenderNonLoadoutItemsInactive option, so GCA now sets TagItem(“inactive”) to the name of the current loadout, if the item isn’t already inactive. This way, GCA can undo things as cleanly as possible just by checking inactive() tags against existing Loadouts, and the inactive() tag can still be used as a flag tag.

* Mode Handling

Added reachbasedon() to tags handled by the mode manager.

* TagDefs.XML:

Added these tags: inactive, magery, units

* GCA5.XSD and saved files:

Added these tags to the ‘weaponmodesdata’ block: reachbasedon

Added these tags to the ‘armordata’ block: coverage, charlocation, locationcoverage

Added these tags to the ‘ref’ block: units

Added these spell-oriented tags to the ‘ref’ block: shortcat, prereqcount, magery, class, time, duration, castingcost

Added these equipment-oriented tags to the ‘calcs’ block: preformulacost, preformulaweight, postformulacost, postformulaweight, prechildrencost, prechildrenweight

* Updater

GCA will now pass along its installation folder to the downloaded setup program, which should allow it to correctly default to that target folder during the setup process.

* Included Sheets

All pre-compiled ones have been rebuilt against the current versions of the engine and interfaces.

* GCA5 Changes.GDF

Included the user-targetable version of Weapon Master from entry b

Data File Features

I haven’t done a preview in a while, so for something a bit different, I thought I’d post some of the additions to what data files can support. This also provides a peek into what kinds of new features traits support, as well, since one follows on the other.

Since I made a pretty document about it recently, I figure I’ll just link to that, and let you check it out if you’d like.

Here it is:

GCA5 Updated Data File Info (PDF Doc)

GCA5 Updated Data File Info (PDF Doc)

For want of a bit


In b82, I made a change to some Updater code, to avoid an issue when a book file of the same name was found in another folder. That change broke the system used to determine if GCA had matching files that needed to be updated, because it could no longer determine that any files matched those in the update.

I have implemented a fix for this. Older versions of GCA may see complaints logged about some XML stuff, but the older updater should still work fine to update to this version, it’ll just think every data file needs to be updated, when it really doesn’t. That’s fixed once this update is applied.

Bits of verbosity


* Miscellaneous

Added a bit of code to the MiserOptionsBlock control.

Rebuilt the category warnings on classic view (shows when categories between character and library don’t match) to avoid using a third-party control I no longer want to use.

Adjusted Updater to examine library data beyond simply *.gdf files.

Updated a bunch of the error messages in the GCALibrary object to be more standardized, and to provide line numbers for the lines causing problems during the loading and processing of data files. (Still more to do here.)

* Unified View

Rebuilt the newbie box in the Unified view (the green one that appears only when no characters are loaded) to avoid using a third-party control I no longer want to use.

Adjusted how the Unified view handles locking/disabling the display, so that the newbie box is readable even when the rest of the stuff is disabled.

* Data Files: #Verbose

I have added the command #Verbose to data files. This has only two options, On or Off, like so:

#Verbose On
#Verbose Off

This allows you to turn on VerboseBookProcessing for a specific file, or portion of a file, for testing purposes, without having to have full-on verbosity for every file you’re loading. (Technically, this sets a different property, and does not affect the user’s VerboseBookProcessing setting at all; if they have that turned on, this will have no impact on it at all, and they’ll get the verbosity they desire.)

It should be considered polite to remove these directives from files before they’re made publicly available, as many users will find verbose book processing quite annoying.

* Data Files: #IF

I have added limited support for #IF blocks in data files. The structure is like this:

#IF want = value [THEN]
[#ELSEIF want = value [THEN]]

Notice that the [THEN] parts are optional; GCA will remove them, but they’re not necessary. Same with the IF in #ENDIF; GCA considers any #END to be the end of the current #IF structure.

You may nest #IF..#END blocks.

Note that there is *no* expression evaluator involved here. Support exists for a tiny set of very specific comparisons, which I’ll cover here. If you try anything else, GCA will consider the block FALSE and continue on, happily ignoring that section (and provide an error in the log if you have verbose book processing turned on).

The two types of ‘want = value’ comparisons currently supported are these:

1) fileloaded = “name of file”

This allows you to see if a file has been loaded before this one. The file currently being processed does *not* count. You must use the exact file name that GCA has loaded (ignoring path information, and ignoring case).

GCA supports the following aliases for ‘fileloaded’, so you may use whichever you remember: fileloaded, loadedfile, fileisloaded, loaded, bookloaded, bookisloaded.

“name of file” may be in quotes or braces.


2) traitloaded = “name of trait”

This allows you to see if a particular trait exists in the current library data. Anything loaded before this comparison is a possibly valid subject.

GCA supports the following aliases for ‘traitloaded’, so you may use whichever you remember: traitloaded, traitexists, traitpresent, loadedtrait.

“name of trait” may be in quotes or braces, and must be in the standard fully qualified format, with prefix and full name and extension, as applicable.

Bits of engines


* Various

Added a routine to ConfigEngine.

Addressed an issue where opening the Build Campaign Book window would reset user folder assignments to default values.

GCA now supports displayname() for system traits in data files, similar in intent to the existing displaycost() and displayweight() tags. When displayname() exists, the value of the tag will be used instead of the standard return from the DisplayName property (usually Full Name/TL). This tag is removed from the data for the character’s version of the trait, where displaynameformula() can still be used if desired.

* SelectX dialog

I have added an option to randomize the current SelectX dialog, and all remaining selection dialogs for the template. I didn’t have a split button, so I built a quick-n-dirty one to handle this, which is/replaces the previous Random button. Clicking the menu part of the button should offer a menu to pick either the normal behavior or the finish-it-randomly behavior. Clicking the button with the keyboard should also activate the menu selection options.

* Plugins

I have hooked up a Plugin Manager, accessible from the Plugins option on the Tools menu. This will allow for disabling plugins that you don’t want to make use of, so that they won’t load in the future, or for re-enabling them so that they will.

(I wanted to include an option that would re-load/re-compile the plugin on every use, for testing and writing of plugins, but the needed changes to the plugin structure, and managing the apparently required app domains and such, is currently beyond me.)

NOTE: The disabling process, when loading plugins during subsequent GCA start-ups, assumes one plugin per folder, and disallows loading anything from a folder that contains a previously disabled plugin. This is to prevent loading it entirely, because otherwise the current system would load it into memory first, before discarding it.