Monthly Archives: June 2019

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.

A bit more of the same


* Type Safety and Object Cleanup

I have continued to tighten up type conversions, to aid in the quest for stronger type safety.

I have also created some new objects as typed versions of previously generic systems. This has helpfully exposed some hidden issues, but may surface some others in ways that weren’t obvious.

In some cases, I have elected to change to a different sort of collection or list, if it was also typed. This was usually one that should be faster or have lower overhead when not all the features of the original variety were required for a particular implementation or type of data. This may introduce unexpected errors due to the difference between various types being 0-based or 1-based, and some routines iterating based on assumption of the base. In every case I can think of right now (BasicDamages, DamageBreaks, SkillCosts), I went from a 1-based collection to a 0-based list, so problems may show up in two primary ways: (1) the first value in the list never being seen, or (2) the program crashing as it tries to access an item beyond the end of the list.

These factors have, of course, resulted in some changes to the object model.

NOTE: These few sentences don’t do justice to the full impact this work has, especially since it’s not particularly complex in nature. However, this is the most foundationally impactful and invasive work on the core of GCA5 in years, and affects nearly every system and subsystem in use. Hundreds of lines of code were touched, and thousands more affected by the new custom collections, with many previously generic systems replaced by strongly typed ones. If I touched everything I needed to touch correctly, you shouldn’t even notice; if not. . . all sorts of wrong.

And I’m not done yet.

* Miscellaneous

Removed the remaining code for saving characters back to the old GCA4 format. (Saving to GCA4 format was removed a long time ago; this was just some left over code.)

Disabled/hid the Modifiers and Settings tabs on the Build Campaign Book dialog, as those are nowhere near working yet.

Next day, a bit more


I have been tightening up as many cases of implicit type conversion, to use explicit type conversion, as I can. This may result in errors if I made a mistake in specifying the conversion myself.

I have replaced all uses of the Decimal data type in GCA’s objects with Double. This may result in previously unseen artifacts resulting from floating point math issues, but does fix an annoying artifact resulting from the way Decimal remembers decimal precision.

One more bit in the wall


* Unified View

I have finally removed the Viewport boxes from Unified view, and restored the previous versions of the trait boxes. I hope to revisit Viewports some day, but as of now, they are no longer supported in the UI.

* Miscellaneous

Apparently the newmode() tag for adding modes to traits from datafiles was never supported by Spells. I have fixed that.

I have updated the Classic view so the library in use will be listed in the Library list header for most trait types.

If a character isn’t currently using a loadout, the Loadout options on the right-click menus for traits will be disabled.

Added a setting to control the number of MRU files that are remembered.

Moved the option to change the character’s library from the library toolbar button to the Character menu. Also, improved usability so that the dialog that opens shows the character’s current library selection, and if the user selects nothing, no changes are made.