Category Archives: Build Notes

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

One primary bit


* Edit Modes dialog

I have implemented the first draft of the Edit Modes dialog. This allows for editing, adding, and removing attack modes for traits. You can also drag the columns around to rearrange the order of the modes.

* Edit Items dialog

Added a button to launch the Edit Modes dialog.

* Advanced Edit dialog

Mode-enabled tags have been removed from the tag list in the Advanced Edit dialog.

With the mode tags removed, I had to add some code to preserve the mode data when moving in and out of this dialog.

Added an Edit Modes button to the bottom of the form, so that you can get to the Edit Modes dialog from here as well.

* Miscellaneous

Fixed a typo on the Options dialog.

Reverted a change I had made to where some event handlers for characters were enabled, due to that change resulting in dialogs and such being called two or more times for some events.

Given the reversion above, I have changed the updating of the UI for Unified view a bit to keep it updated correctly when changing to it when a character was opened in a different View.

Updated the character tab images so that the ‘unsaved’ icon should show when new traits get added to the lists.

Added some Interface references to some of the objects to allow simplifying things in some areas of code.

Made a small visual change to the attack modes in the Simple Edit display.

A mess of bits splattered about


* Accessibility

I have just begun adding proper accessibility names and descriptions for things where I can. This will take time, but the excellent Windows Narrator built into Windows 10 is helping me identify the many places where I need to improve things.

The interface in GCA5 is pretty busy for screen readers. I’ll probably have to offer a stripped down version at some point.

* Miscellaneous

Added some code to let my controls display styled text if I want to update them to do so.

Added some additional error traps.

Restructured some code.

Repaired the code in Updater for integrating libraryupdates.xml into the new system that uses fileupdates.xml. The intent was that the old library update generator would still work for updating library specific book files, while the new general file update generator would allow for all files, including the library files if specified. At some point, the code for actually integrating the libraryupdates.xml information into the process was bypassed, but now it should be included correctly again.

Closing characters in the UI should trigger slightly less chaotic UI refresh behavior.

Characters should no longer be getting marked as Dirty every time they are loaded into GCA.

Having fixed the ‘Dirty’ issue mentioned above, I found that there was also an issue with how tabs were changing the ‘dirty’ or ‘clean’ image for the tab, so I changed how that is set.

Discovered a problem with where I was assigning certain event handlers for characters in the UI. Changed where they are assigned.

Changed some of the graphic elements for the third toolbar, to help clarify which ‘buttons’ are checkbox style, which are either-or radiobox style, and which are selected.

Changed the images used on the character tabs for ‘dirty’ and ‘clean’ characters.

Slightly improved some of the drawing code for trait boxes when drawing traits, group headers, and header information.

Added a character option for “No default level discount,” which effectively turns off the ability to improve skills from the default level, and requires every point spent to buy levels normally, ignoring any discount defaulting might have provided.

Added a button to Unified View which provides a horizontal override, similar to the existing vertical version. This mode limits boxes to the height of the display area, and turns off flow-wrapping of boxes in the worksapce. This allows for a horizontally scrolling workspace, and limits scrolling to within the lists themselves, rather than scrolling the entire workspace to move within long trait lists.

* Plugins

Recompiled for changes in interfaces and structures.

* Trait Viewports

Viewports are a new way of organizing traits for interaction and display. Basically, a Trait Viewport (Viewports for short) is a list of a particular type, such as Spells, that only includes those traits that meet specific criteria, such as all being Druidic. This new way of handling traits allows for much more freedom in what can be displayed and how the user can interact with it, over the previous way of being restricted to one list per type of trait.

In addition, with each Viewport being its own thing, it’s possible to match that up with particular display preferences based on the Viewport, so users can customize how they view different Viewports without it affecting other data of the same type.

GCA still organizes all traits internally by trait type (spell, skill, advantage, etc.), but each character will also track and manage all the viewports that are defined for it, so that they can be carried along whereever the character goes. Importantly, the Viewports are only saved in the character by definition, which is the criteria used to create it; the traits are not saved in the character file with that information actually applied to trait or list data, so you will not be able to just read the XML file to get a list of a Viewport’s traits; the Viewport will have to be created and filled somehow (which GCA does automatically while managing the character).

The display information for each Viewport, however, is user specific, and is not saved with the character at all. Different users or different computers or whatever may call for different display options, so those Viewport display options are maintained with the other user settings for your GCA installation. GCA has default settings for each type of trait, so loading a character with a Viewport that you’ve never specified settings for will result in the default settings for that type being applied.

I have created new trait boxes for Unified View, based on Trait Viewports. These new boxes embrace the whole new Viewport structure, including display options. Because of the changes, I’ve also changed how ordering is indicated in the column headers for the lists. Although the three standard color options (grey, red, yellow) are still provided, since they’re drawn into the header area using transparency, you may find the results often aren’t quite what you’d expect. The default ‘gray’ option tends to look best.

Trait Viewport Usage Notes

When building a Display Template for a Viewport:

You can format the TAG column of a Column two ways, if TagIsFormatted is True. If TagIsFormatted is False, then only the Tag name may be specified and only that value retrieved.

1) You can support String.Format() style substitution by including {X} markers where X is 0 through whatever.
Then include a comma separated list of values that will be inserted into the {X} markers. This list is counted from base 0, so the first item goes into {0}, second in {1}, etc.
This allows you to format the Tag field with whatever values you like, so long as the following list of values are valid Tags.
For example, you could use “{0} lbs, weight” for the Weight column of Equipment, where the value of the Tag ‘weight’ is inserted for {0}.

2) You can specify a numeric format for tag values that are themselves numeric values. If you do this for a non-numeric value, results will be unexpected.
You do this by including the keyword #format followed by the numeric format to use, best enclosed in quotes or braces (required if the format includes a comma).
The format uses the .Net Numeric Format strings, so there’s online docs for that out there.
For example, our Weight column could use “{0} lbs, weight #format {#,0.00}” to build on our example above, which formats the weight value to use commas to separate thousands, and always include two decimal places.

You can use the tag numeric formatting without the substitution, such as “weight #format {#,0.00}” to just show the weight without including the ” lbs” from our example.

Only one Tag can be specified, unless you use the substitution method.

Viewport Development Note

Right now, it looks like Viewports are too much for me to get done, UI wise, for other parts of GCA. So, I’ll probably not be rolling them out to Classic or anywhere else for initial release. However, they’re supported internally.

For this build, and maybe the future (we’ll see), they’re the way the Unified view displays traits. Since the default Viewports are the same as the standard way of doing things, that shouldn’t change anything for you. However, the tools for changing the display outputs, and the viewports themselves, are basically half-baked. They usually work for the first change you make, but then don’t, for some reason. If I can fix that, maybe I’ll keep Viewports here for now. Otherwise, I’ll roll them back in Unified as well.

However, regardless of how that works out, Viewports can still be used programmatically for output sheets if authors want to use them.

Addressing some broken bits


* Miscellaneous

If you click on one of the point boxes in the Status bar, and you’re in Classic view, GCA will change to that tab.

When saving a trait to a GDF file, GCA was erroneously deleting the step() tag for attributes. Deleting the tag for other trait types is correct, but it is required for attributes to function correctly. That is now fixed.

Fixed a crash bug in the Save as Book function of the Build Campaign Book window.

Some bugs were identified in the new updater code in GCA, so those have been addressed.

The XML writing code for GCABonus overlooked writing out target name extensions, turning all specific bonuses into general bonuses for all saved and re-loaded characters. That has been fixed.

When pasting traits into a character, GCA was not correctly handling a temporary parent-child relationship tag that was being created automatically as part of XML processing, but wasnt’ needed for the pasting process. This caused problems when the character was saved and loaded again later. That temporary tag is now being removed during processing.


Updated with the missing ‘targetext’ element for GCABonus.

Bits of 101


* Miscellaneous

GCA now creates a charbulk() tag for the weapon’s character-specific bulk(). It uses the simplest math version, which means bonuses can be targeted to ‘bulk’, but GCA expects it to be just simple integer math stuff. All places where GCA displays weapon info have been updated to show charbulk().

I have changed how GCA applies the maximum applicable ST cap for muscle-powered weapons. Normally, three times the weapon’s ST value is the maximum, and GCA was doing that for melee weapons, but not for thrown weapons. GCA will now apply a ST cap to all muscle-powered weapons, melee or thrown or whatever. However, because it’s now easier to apply this to weapons that perhaps aren’t actually meant to be capped (either by RAW or in your campaign), GCA now supports a new stcap() tag (mode-based and math-enabled) to turn off capping, or to change the multiplier value if desired. Use stcap(no) to turn off the max ST cap, or use stcap(X), replacing X with a value, to replace the 3*ST cap with an X*ST cap.

GCA should save/load the new stcap() and charbulk() data.

Fixed the oversight in Loadout Manager that caused sorting by the values in the Qty or Wgt columns to be done incorrectly.

Made a small change to the Protection Box paint routine.

Updated a bunch of places in code to perform explicit type conversions, rather than implicit ones, and to change some instances of late-binding to early-binding where possible.

With loadouts, characters now have the option of having all unassigned items treated as if they’re part of the currently active loadout. The default behavior requires that for any item to be included in a loadout it has to be specifically added to that loadout. This new option will include the unassigned items as part of the current loadout for purposes of encumbrance and activation/deactivation (if you’re using that).

Updated the Encumbrance & Move box to show “Loadout (+ Unassigned)” for the current loadout if the IncludeUnassignedItemsInCurrentLoadout option is enabled.

I have added an interface to Options for GCA’s automatic duplicate trait refusal, so it can be turned on or off by trait type. I have also changed the default settings to begin with auto-refusal of dupes turned off, except for attributes (where duplicates are never allowed), and for spells and templates, where IMO auto-refusing dupes still makes more sense.


Updated to support ‘charbulk’ and ‘stcap’ elements.

Updated to support IncludeUnassignedItemsInCurrentLoadout option.

* TagDefs.XML

Updated to include bulk(), charbulk(), stcap(), highlight(), and drnotes().

Fixed some XML character encoding errors.

* Plugins

Sheets were updated to show charbulk() instead of bulk() for attack blocks.

Fixed a couple incorrect labels for weapon data in SimpleTextExport.

Fixed a reference in testOfficialCharacterSheet to the /graphics/ folder, which is no longer being used.

Back to bits


* Miscellaneous

Removed option to save as a GCA4 character file, since there are too many features within characters that have no way to downgrade gracefully to something supported by GCA4.

Fixed a bug where trying to Copy Modifiers when the traits had no modifiers would result in a crash message.

Noticed that somewhere along the line, the skill types for skills and spells had been lost from the display in the character lists. Rather than build it into the default DisplayName of the trait, I added a column for it in the character lists.

Updated the character trait lists in Unified and Classic Views to better respond/resize when an item is being word-wrapped, and its length changes (such as when adding or removing modifiers).

Now post a little message in the Info pane on startup about beta testing.

* Updater

I have updated the Updater within GCA, and the corresponding tools used for updates. This should allow for updating all the system files that don’t require an actual installer. The process used for library updates no longer works as it did, but the new system should fully encapsulate it, as well as adding the needed support for updating other things.

The ‘updates available’ notice should be a bit smarter in how it compiles the message to the user, and now actually supports using RTF messages as originally intended.

Added support for some additional stuff in the Updater code, which helps me in testing but may not ever be needed otherwise: update info xml files can be in a secure area; can have different update channels (currently compiled into GCA, so it supports only a single specific channel in a released build).

Modified things so that the code for accessing/using the login dialog was a bit more reusable, so I could reuse it.

Added the ability to include commands in the Updater information, to run before and/or after the general files are copied. No actual commands have been defined yet, however.

Fixed a bug in comparing version info.

* Pasting

Some of the work done previously to catch and correct for lost parent or child items resulted in the system losing its ability to paste traits that had parent-child relationships; the relationships would be removed, because all parents and children would have unmatching keys at various points in the process, before GCA had a chance to fix up all the references. I have addressed this issue, so that such traits should now insert correctly again.

I have added a snippet of code to allow for some unrelated garbage text before the opening XML tags when pasting XML into GCA. This should add a bit of robustness when pasting into GCA traits copied from elsewhere, such as a forum post, when the cutting of the XML wasn’t precise and some other text was included.

* Controls and Plugins

Since my development environment was rebuilt after my crash, my third-party controls and various other files were updated or otherwise different from the ones used before. As a result, my plug-ins have been rebuilt, and yours may need to be as well. (Plugins that are compiled by GCA on startup should be just fine.)

Tiny bit of an update


* Miscellaneous

A post on the forums caused me to look at some old code, which brought to light an issue with custom skill cost progressions that had more than ten levels of costs. Everything worked fine except for the routine in skill calculations that assigned the trait’s level based on the points spent; that was a bit dodgey, hardcoding a limit of ten possible cost steps, which effectively imposed an arbitrary limit. I already had a routine in GCA5’s SkillCosts object to handle things correctly, I just hadn’t used it, so the old code was still being used. I have fixed that. (Doesn’t help GCA4 users, unfortunately.)

Updated some other code related to using skill types, to improve readability and reduce lookups.

Consolidated some routines related to skill types that were basically duplicates between the GCATrait and GCACharacter objects.

* Unified View

I have added a button to the front of the Unified View specific toolbar. This is the Vertical Page Override button. When you press this button, Unified View will force all boxes to fill the display width, and to flow only vertically, overriding the other settings, and making the display more of a single long page view. This does not change any of the settings, so toggling the button off again will restore your usual display.

Hooked up the gear icon for the attack table boxes. Only option currently there is for toggling double width display.

Updated drawing code on the attack table boxes to correct for display issues that could happen with multiline items, as was done in last build for trait boxes.

Only time for a few bits this week


* Miscellaneous

Fixed display bug that could cut off itemnotes text in the Simple Edit attack tables when zoomed.

Fixed issue with #ChoiceList dialog listbox not selecting properly when clicking directly on the checkbox.

Fixed what I hope is the last of the drawing issues in the Unified trait boxes when multi-line user items is on.

When using in-list entry on the Character traits lists in Classic view, you should now be able to enter a decimal point.

Added support to GCATrait for the drnotes() tag. This is not mode enabled, and not managed by the Mode object, but otherwise works just like itenmotes() support does for modes, just on the trait level.

* Party Console

Added an explainer.

Adjusted the look of the default attributes block a tad.

Added support to the trait lists so that clicking on a trait displays info in the Info pane, as it does elsewhere in GCA.

* Books & Data

Included Eric’s book and image data updates.

Still summer, still more bits


* Miscellaneous

Itemnotes() support now implemented for attack mode boxes on Unified View.

Noticed some unexpected/unwanted color changes in the attack mode boxes in Simple Edit, so I fixed that. Then made some visual changes in the display of modes and itemnotes and such.

Fixed the tooltip for the Export button on the File toolbar.

Adjusted how the PendingChildKeyList() tag is handled, so it should no longer stick around past its intended lifetime.

Made some slight changes to how child handling is processed when loading characters, which reduces file loading times for characters that have traits with many child items.

I’m trying out a restructured version of the RecalculateAll routine, which results in far fewer recalculations of parent items and commonly referenced traits. It is significantly faster, and appears to still work properly, but it’s so much faster that I’m just not sure something isn’t being missed. Be alert for issues, especially for newly loaded characters.

* #ChoiceList dialog

Made various adjustments to the components and design of the dialog.

Fixed a bug that resulted in the dialog not correctly disabling the OK button again once it had been enabled.

Implemented a FIFO (first in/first out) selection process to keep selections at the maximum picks, if set, by deselecting earlier picks as later ones are made. If the list is in this mode, the check boxes on the list will be round instead of square.

* Official Character Sheet

Removed the CreateItemNotes() routine I added last build, since I have now included that routine as part of the GCA5Engine. The sheet was updated to use the engine routine, instead.

Fixed bug that would lose overflowing entries from weapon tables if there were itemnotes.

* Color Block Sheet

Added first draft of support for end-notes style itemnotes() to weapon tables.

Summer bits


* Miscellaneous

Added an Option to allow for multiple rows of Trait Tabs in Classic View, should the display area be narrow enough that some of the tabs would end up on the overflow drop-down list.

Removed the unused Edit menu from the main menu.

Updated the dialog version of Attributes to use the correct colors for the new general information box.

Fixed the Colors & Layout dialog to support the addition of Features.

Bulk is now correctly part of the new mode-handling system,

In #ChoiceList, totalcost(), picksallowed(), and the values for default() are now math-enabled, so can be given formulas. Since parsing within those tags is done on spaces, you should enclose the formulas in quotes or braces.

* Print Preview

Made some changes to how the Print Preview dialog is created, to adjust for some weirdness caused by the control vender.

Moved the Export PDF… button next to the Print button, and renamed it PDF.

Added an Exit button.

Adjusted the auto-sizing of the sheets drop-down a little bit.

* Official Character Sheet

Updated to handle Features, and to upgrade existing settings because of Features.

Updated to actually print Templates.

Added first draft of support for end-notes style itemnotes() to weapon tables.

Updated to reflect ‘gurps logo.bmp’ is now in \images\ rather than \graphics\ folder.

Added an option to not print the GURPS logo on page 2 (active by default), for a cleaner look with more room for the Hand Weapons table content.

* Books & Data

Included Eric’s book and image data updates.

Fixed the missing ‘minoccurs’ for Features in GCA5.XSD.

Moved ‘gurps logo.bmp’ to \images\ rather than the old \graphics\ folder.

Feature bits


* Miscellaneous

I noticed the mental_16.png symbol image had a bit of a ‘white halo’ effect from transparency issues when highlighted or on a dark background, so I adjusted the transparency around the image and included the adjusted image. (You won’t notice the change on existing characters unless you resync the symbols, since the images are stored in the character.)

While adding support for Features, noticed Languages and Cultural Familiarities were missing from a small section in Needs code, so addressed that.

Added code to the character trait lists in Classic View so that a newly added trait will no long be considered ‘in view’ unless a whole row is within the viewable area.

In the Folder Locations dialog for Options, displayed folder locations should now show & characters correctly.

Also in the Folder Locations dialog, if one of the Other Folders does not exist, and you click the Browse button, you should no longer have to drill down from the very top of the folder system structure anymore. If the Base Folder is valid, clicking Browse should now start you from that folder.

Added ability to delete a property from a section in my settings manager.

Added ability to delete an Option from SheetOptionsManager. (This is helpful if you completely change how something is handled, and want to remove the old options from the saved file when upgrading the options to the new format.)

* Features

Removed previous, partial Features support.

Features are now traits, and handled by the trait system. There are now trait tabs and boxes in Classic and Unified Views.

Updated code in many places to support the addition of Features to the trait types.

The Prefix tag code for Features is ‘FE’. The GDF block for them is [Features], and they’re functionally advantage-type traits.

Because Features have been inserted into the types of traits (internally, they’re between Quirks and Skills), the FastLoad files version has been updated, and they’ll have to be rebuilt.

Added support for Features in the custom tab names part of Current Character Options.

For now, the features() tag on templates will act like a creates() to create a new Feature as a component trait of the template.

* Books & Data

Included updated *and new* book files from Eric, since new ones were overlooked last time. (But I haven’t included the 3rd Edition files.)

Updated GCA5 Changes.gdf with a _New Feature item.

* Sheets

Note: You probably need to update/recompile your sheets to support the addition of Features.

Updated ColorBlockSheet to handle Features, to upgrade settings because of Features, and to change how various trait-type-block settings are stored/referenced to make them more robust.