Another in a series of little bits


I have added code to the handling of type-to-search in those lists that support it. This should address the issues noted in testing where the selected item may jump around unexpectedly.

There is a small chunk of code that clears old auto-backup files upon startup. At some point this chunk was moved up in the startup sequence. Unfortunately, it was moved above the code that allowed for restoring the auto-backup files, rendering that function useless. I have moved the chunk back down, so restoring auto-backups upon startup should work again.

I spent a lot of time, effort, and research figuring out how to make plugins reloadable within a session. I succeeded, but to no avail, as various structural elements within GCA simply don’t allow the available solution to work for us the way we need it to. So, unfortunately, that was basically a dead end. I apologize to those writing plugins that I wasn’t able to make that work out.

Rather delayed little bit


GCA will now save attack mode data as separate elements within the saved character file. This reflects how it’s now handled internally and should help avoid possible parsing errors in the future. It should also simplify use of the data by third-party tools that may someday want to use it.


Updated with the new elements and changes to support the new attack mode elements.

A little bit is better than nothing


I had code in place in the Edit dialog to allow for changing the level of leveled traits by typing the desired level into the level box, but had it disabled for ads and disads. I believe I did this because I decided to show LevelNames in that field, and text names don’t work well with numeric levels. I have shortened the Level field and reenabled the abiltity to change the value for leveled traits. It is now meant for numeric values. I have added a display field after the +- buttons to show the LevelName, if available, for the trait.

I’ve added a checkbox to the Update Available dialog to allow for not restarting GCA after the update runs. Check the box, and the updater will quit after installing updates without launching GCA again.

Updated GCAUpdater to support the NoRestart option.

Updated SimpleTextExport to output skill lines more like the SJGames format.

Being Fancy with Protection

Or, more accurately perhaps, getting detailed in GCA when your campaign is using detailed armor protection and layering rules. GCA5 will allow you to specify that you want to handle your own layering, and will then show you the armor protection values in layered order.

Not shown here is the dialog that allows you to set your layering, but that lets you adjust the ordering of how your armor is layered, from innermost to outermost layer. That’s as it’s shown on the list at the right side in this image, although I just randomly threw some stuff together when creating the test data being used here.

You’ll notice that each layer shown on the right side also has an icon noting whether that layer is rigid or flexible. The general DR item at the top (innermost layer) is not counted as a layer, so isn’t considered either rigid or flexible–it just is. You could change that if desired.

Basically a bit of a plugin


During some part of a previous conversion from engine values to character.settings values, several places were accidentally changed to use NeedsDefaultLevel (a number) or NeedsDefaultValue (a tag) when the other was called for. Fixed.

Fixed a recent bug in the Sheet View for sending Edit items to the Edit dialog, resulting from the conversion of the selected traits collection to SortedTraitCollection.

* Plugins

All the plugins included with GCA should now be the code versions, rather than the pre-compiled versions.

A bit of reference


Fixed a bug in the processing of damage breaks due to an earlier change from Collection (1-based) to List (0-based).

Fixed a display bug that sometimes resulted in the new Applied Modifiers list in Simple Edit getting all scrunched up.

Fixed a bug created in b112 related to checking for ownership of a bonus that is supposed to be removed. This bug prevented bonuses from being removed, which in turn resulted in multiple identical bonuses getting applied.

Added some data validation checking to the Edit Traits dialog, to check for unmatched parens or quotes.

Added some data validation checking to the Advanced Edit Traits dialog, to check for unmatched parens or quotes.

Was given a valid reason for letting modifiers be reduced to level 0, so I have restored that. In turn, I have added a default level name of ‘none’ to display when applicable.

Changed the wording of the instructional text on the Resynchronize dialog slightly.

There has been an issue since the beginning of Unified View, where clicking on any list in a box that was not already the box with focus would cause that box to scroll into view, usually selecting a bunch of items in the list unintentionally. I was unable to find a way to avoid that behavior without either building something new, or just subclassing the panel and then overriding the behavior of that event handler. So, I have done the subclassing thing, and that behavior should no longer happen. However, that means that scrolling a box into view is now the responsiblity of the user.

Bit by the code bug


Changed some of the process GCA uses to check for updates. Previously it was partially asynchronous and partially synchronous. It will now all be synchronous (this means you can’t do other things in GCA while the check for updates is running). It will also pop up the Working dialog while performing the process.

There was a shockingly convoluted system in place for sending messages to the logging pane. I simplified the system and shuffled around a few related routines while doing so.

Did some code cleanup in various areas and with various controls.

Found a pretty insidious little bug that had to do with the ownership of modifiers and traits when making copies of them (such as when making copies to undo changes when cancelling out of dialogs). This resulted in the ownership appearing to be correct, but not actually being so, because ownership was actually assigned to an identical object that was not actually in the correct ownership tree. I believe this mattered only in a tiny number of cases, but that’s still an issue. Anyway, it should now be fixed.

Made some changes to the Simple Edit and Modifiers dialogs in support of correct handling of undo when cancelling out of the dialog.

* Type Safety and Object Cleanup

Did a little more of this.

* Modifiers

It was possible to decrement a modifier to level 0, but it almost never provided any indication that you had done so (unless it had levelnames() set to account for that). At least it always set the value to a neutral value, so it no longer affected cost. But this just strikes me as extremely odd behavior, especially for non-leveled modifiers. GCA’s history is very long, so it’s possible that I did this for a reason back in the day, but I can’t think of any good reason for it now. So, I have now set Modifiers to have a minimum level of 1.

* Simple Edit

I’ve moved the Current Modifiers Applied block up above most other things.

I’m trying a new list for the Current Modifiers Applied block, as a listbox instead of a text block. You can do basic manipulation of the modifiers here, such as incrementing, decrementing, or removing.

Even more bits get updated


Changed some flags in GCATrait to use boolean states instead.

Had to perform some surgery on trait lists in Unified View to correct a logic error, and there and in Classic View to fix issues caused by some previous work and by the new boolean states.

There is an option to gray-out library traits for which the character hasn’t met the preqeqs. When this option is active, and a trait makes use of certain optional features, a crash could result. That should now be fixed.

I added the double-width option to the gear drop-down on trait boxes in Unified View.

Noticed there were some other oddities related to ctrl key combos in trait lists, so adjusted my copy/paste fix to fix that.

Traits pasted into character lists should now be selected.

I have created a small program called ‘thecleaner.exe’ that gets installed into the GCA5 system folder. When uninstalling GCA5, this program will be run to clean up the known source folders (\books\, \characters\, \images\, and \plugins\) in the *system folder only*. Without this, the update system might install new files to those folders, and they will not normally be removed by uninstalling, because the installer did not put them there. With this little program, each folder is fully removed, and no remnants should be left behind in the Program Files folder after an uninstall. Again, this *does not* delete anything from your Documents folder.

* Type Safety and Object Cleanup

Did a little more of this.

* Resync dialog

Rejiggered things to adjust better to resizing, and allow for it to be resized.

Removed some things from the dialog for which support was never added.

* Build Campaign Book dialog

I have hooked back up the Settings tab, and it now allows for changing many of the settings discussed in the last build.

You can choose whether or not to work with two groups of settings: Campaign and Rules. When saving the book to disk, GCA will only save the settings for the groups that you choose to include, but will include all settings from those groups.

Also updated some of the code so that deleting traits and changing libraries will work a bit better. Note that if you change libraries, any existing work on your book will be lost, so be sure to start with the right library.

* Updater

I have built a new system for packaging updates of the various files (books, images, etc.). This new packager ZIPs the changed files to reduce bandwidth requirements, and creates a manifest of all the files in the update.

Supporting the new ZIP files, GCA itself has been updated to download and extract the ZIPs before running the Updater.

The new system also considers an update ‘package’ to be the correct state of the GCA install files. This means that any files that GCA finds in the system folders that are not reflected by the new ‘state’ will be flagged for deletion by the Updater. (There are ‘bins’ of files, so an update can ignore all the Plugins, for example, and GCA won’t delete them; it knows they were ignored.) This very much reinforces that users should not change the files in the system folder.

This new process should allow us to make changes to the files included in the system folders, and not have outdated files left behind. It also means that files no longer being used can be deleted by the system automatically, without any additional work by those creating the update.

Note that GCA passes the file deletion requests to the Updater, so those will only happen if there is something else pending (file copying or new installer) that needs the Updater to be run.

Eventually you get a byte


I had noticed a while back that adding a new trait didn’t always result in all the boxes in Unified View correctly displaying the changes resulting from that new trait. That should now be fixed.

If a trait’s calculated damage changes, it will now be tagged as ‘dirty’.

If a trait’s skill used changes, or if the skill used score changes, it will now be tagged as ‘dirty’.

* Bonuses

Added the ability to target a standard bonus (a target with a prefix tag and a name) to a trait name of #any, which means you can target a whole class of things for a specific targetable tag, if you wish. For example

-1 to EQ:#Any::minst

would allow you to reduce the minst() requirements for all equipment items by 1 per level.

* Type Safety and Object Cleanup

Continued where encountered, but less aggressively as a whole.

* Settings, Default Settings, and Books

The [Settings] block of a Book file has long been able to set certain basic settings for operation. However, these settings changed the *overall* configuration of how GCA operated, and that model doesn’t fit well with how GCA5 allows for each character to be operating with different libraries, and therefore potentially the intention of very different intended settings.

The model now works a bit differently, and has expanded. Default settings are either set internally for normally expected GURPS operation, or they’re set on the Default Character Options pane of the Options dialog (depending on the type of setting). These go into the initial engine configuration, as loaded before any library is loaded. Then, when a library is created, it’s created with a set of options that match the default engine configuration. Once the library loads data, that data may change the defaults as set by the [Settings] blocks in book files. Finally, when a character is created, it is initialized with the settings in the library, and some of those can be changed on the Current Character Options pane of the Options dialog.

This is another change that reaches deep into GCA, but the effects of a mistake are unlikely to cause exceptions; instead the proper setting may not be honored as expected.

What settings can be set in [Settings] has been expanded with additional options, a quickie list of which is here:

CampaignName = value
DefaultTL = value
BasePoints = value
DisadLimit = value
QuirkLimit = value
HasDisadLimit = yes/no
HasQuirkLimit = yes/no
RuleOf = value
GlobalRuleOf = yes/no
UseDiceAddsConversion = yes/no
ModMultPercents = yes/no
AllowNonIQOptSpecs = yes/no
ModMaxNegPercentLimit = value
NoDefaultLevelDiscount = yes/no
AllowStackingFortify = yes/no
AllowStackingDeflect = yes/no
AllowHalfPointSpells = yes/no

This change to Settings has also changed the FastFileVersion, so all fastload files will be rebuilt.

* GCACharacter

All the character settings that match those initialized from library settings are now found through the Settings property, which returns a LibrarySettings object with those properties.

The AllowUserTraitOrdering setting (not part of the group above) was never saved/loaded from character files, but should be now.


Updated with the missing ‘allowusertraitordering’ element for GCACharacter.

And a bit for today


Made a slight visual adjustment to the Select Export Sheet dialog (to not show the dark ‘Sheet Description’ label, which is kinda redundant and negatively impacts the look and feel of the dialog).

Fixed an issue with double-clicking the empty modifiers list in the Modifiers dialog.

Fixed an issue with trait name boxes in Simple Edit losing their background color for Attributes (which are non-editable).

The splash screen should now close earlier during startup.

Pasted in traits should now get any applicable symbol icons assigned correctly.

If you tried to copy-n-paste traits in trait lists using CTRL+C and CTRL+V, the list would read that C or V as part of the type-to-search feature. (Did it always do that?) That was incredibly annoying. I have fixed that.

I have included the current weight of each loadout in the drop-down lists for loadout selection in the Movement box and on the Attributes tab.

I have partially restored a feature we had early on with GCA5, which is highlighting everything affected when you change a trait. I disabled it a long while back because the event model being used resulted in completely unreliable results. However, I realized that with some minor adjustments I could probably get it to work again. This is considered experimental, and it only works correctly when incrementing, decrementing, or directly setting the score of a trait. I can probably enable other circumstances, but things are definitely not updated correctly after editing tags or other such things.

* Updater

I have added a check during the Updater process to be sure that GCA doesn’t try to track duplicate assemblies when gathering data on what might need to be updated.

* Type Safety and Object Cleanup

Continued as per last build.

Fixed various bugs that popped up because of this work, but that weren’t caught during it.

* Accessibility

I have added some additional accessibility names in some places. This work continues slowly. I have found that Narrator will sometimes read a label that is supposed to be invisible because it doesn’t currently apply. This is a bit annoying, and I’m not sure if I’ll be able to fix that.

Also, I’m pretty sure I’m not well qualified to create a good interface for GCA to assist with accessibility issues. I will happily accept guidance if you have some.