Category Archives: Build Notes

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

I broke a bit again. Ugh. (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.

A refactored bit (b186)


Re-implemented some of the super-effort stuff I was working on, to better reflect intended usage.

Added IsHidden() function to GCATrait, which returns True if the trait is tagged to be hidden, False if not.

Made a small change in the process used to load characters, which should remove some calculations when assigning child items to their parents. Since there is a full recalculation made once the character is loaded, this should not affect any utility, just decrease loading times a bit for lots of child items.

There was a bug in correctly initializing bonuses loaded from saved characters, when those characters used gains bonuses (“to me from X” style). This bug could cause an issue that resulted in any such bonus causing an endless loop. That is now fixed.

A bit of trapping (b185)


I added an error trap in the Info Pane code that looks for page numbers so that it change the mouse pointer to a hand over them. A user reported an issue that seemed to be caused by this, and I don’t know why. This trap will avoid crashing GCA in that circumstance, but the pointer won’t get changed to a hand if the error trap is triggered.

I added a new option to never even try changing the pointer to a hand over page numbers.

It’s possible to input illegal (control) characters into various fields in GCA. I’ve created a routine to strip those out during field validation, and I’m integrating it into the data entry fields. There are a lot of those, so I’ve focused on the ones most likely to recieve pasted text. Note that I can’t sanitize RTF boxes the same way, as the RTF control automatically escapes those special characters, so they’ll still be there in some form but hopefully shouldn’t break anything. (These places should be getting cleaned data now: Edit Traits, Advanced Edit, Edit Modes, Add Tag, Gen Info Box, Appearance, Campaign Log.)

I’ve added a check to the AddChild routine of GCATrait, which double checks that the child being added doesn’t have a key matching the parent it’s being asked to be added to. This should never actually be possible through normal operation, but could potentially happen if someone manually edits things in a save file or otherwise alters data externally. So this check should discard the AddChild operation. *NOTE* that this check being triggered likely means other data in the program will be broken!

Some quality of life bits (b184)


Updated the attack selection criteria for the Unified Attack boxes so that hidden traits will be valid selections if Show Hidden is On.

Some minor updates to BBCodeEngine.

Slightly adjusted some of the _bw versions of trait icons due to layer issues.

I’ve made some adjustments to the code that applies sizing logic to the body location boxes on the Protection body image graphic. The boxes now have a smaller minimum height, which should work better for most characters.

Added support for Super-Effort Carry to the Move & Encumbrance boxes.

Added scaling of very large carry weights through ton (t), kiloton (Kt), and megaton (Mt).

Added some scaling for attribute scores over 1M when drawing them to character lists, so they’ll show as M values.

Added to the Edit Traits dialog some features for setting an attribute to appear in the main attribute list or to appear in the Additional Attribute list. (Additional Attribute’s are primarily used with sheets.)

I’ve added Super-Effort Lift as well as the Super-Effort Thr and Super-Effort Sw damages to General Info blocks, when those features are available.

I’ve added a checkbox for Metric next to Character In Play on General Info blocks, to make metric characters easier to use.

* GCA Prime Sheet

This sheet, formerly known as Angry Owl Sheet, is now the GCA Prime Sheet, and will be a new sheet bundled with GCA. Included here for the first time.

A bit of a bother (b182)


Added support for shields to calculate the character’s block level (the charblockscore() tag) based on the skill used with it. Charblockscore() is a mode-tag, so it will appear in the Mode editor and is found per-mode for the shield. You can target bonuses specific to it using the ‘blockscore’ target tag. The item must have a db() tag to trigger calculation of charblockscore(), and the shield’s DB value (the chardb() tag) will be included in the final level.

Added support for having your best equipped and ready (applied on an arm arc) shield DB added to all active defenses. I worked it so that you will be able so see bonuses to the Block, Dodge, or Parry attributes from ‘shield DB’ when applicable, since those attribute scores represent the ‘global’ bonus to those defenses. Those attribute scores are then picked up by the more specific trait calculated defense scores. When this option is enabled, the best applicable DB will be used, and that will also override a shield’s DB value in the calculated block level for a shield.

Added options to Default Character Options and Character Options to support the new option for applying DB across all active defenses.

The Protection box in Unified View will now display a line for DB/DR/Block information for shields in the shields list.

Added an option to the Melee Attacks block in Unified View to show a shield’s block score in the Pry field of the Lvl(Pry) column. Since shields usually show ‘No’ for a parry, this option is now On by default, as block seems a more useful value.

* Weapon Calculations

GCA normally calculates ST based requirements in weapons based on Striking ST. However, Striking ST may not exist, which obviously can be a problem. GCA now uses this order to fill the blank: Striking ST, One Arm Striking ST, and finally ST.

If you set damagebasedon(), GCA will use that value even if you pick something that doesn’t exist. Same with minstbasedon() if you set that.

This fix applies to calculating range for muscle-powered weapons, calculating effective ST with the weapon, and calculating the min ST penalties to effective level. It also applies to calculating damage using the damage functions if bonuses are applicable to ‘effectiveST’.

This fix includes the new GCACharacter function ActualStrikingSTAttributeUsed() which returns the name (without prefix-tag) of the attribute that is being used for this purpose in the calculations.

* FastLoad

FastLoad file version updated, fastload files will be rebuilt.

* TagDefs.xml

Updated to include charblockscore.

* GCA5.xsd

Updated to include charblockscore in GCAAttackMode block, and applydbtoactivedefenses in GCACharacter settings.

That’s a bit much (b181)


Added greyscale (mostly black) versions of the trait icons (such as the ‘prerequisites missing’ and ‘defaulted’ icons) to the resources so that they’ll be available to sheets. Each is named like the original resource but with a “_bw” appended to the name.

Added some temporary (not saved) properties to the BodyItem object, to help in using the output of the new GetProtectionBodyGraphic() routine (see below) in the Protection box of Unified View (or other possible places). These are Glow, GlowBorderExtension, GlowBorderColor, and GlowBorderMaxTransparency. Setting Glow to True will cause that item to be drawn with a ‘glow’ around the box (if the item is printed). The others set the size of the glow’s extension beyond the border, the base color of the glow, and the maximum level of transparency (max 255).

I have tried to standardize the default sizes of the location boxes across the Protection dialog and the new drawing routines. This will apply to any box which has not had its size set (usually by the user resizing it). As with all sizes, this will then be adjusted by scaling and a minimum usable size for the font being used.

Fixed an improperly colored border section in the header area of the Encumbrance & Move box.

* GroupedTraitListManager

Had to adjust things slightly to allow TraitTypes.None as a valid ItemType. This allows me to better support things like Transforms which include many different types of traits, by setting the value to None, and not getting the Grouping Options set for Advantages or whatever.

* Protection box (Unified View)

This now uses the same drawing routines as is newly available to sheets in GetProtectionBodyGraphic() (see below). This allows for a display with graphical elements like those in the Protection dialog. This also ensures that the image is more likely to be similar when comparing Unified with a printed sheet (if the sheet uses the new function). Be aware that due to font differences and image scaling, it’s nearly impossible to get an exact match.

Should no longer have an odd little bit of space to the left of the Armor list.

Fixed the Copy to Clipboard option on the gear menu.

Added the “Expand Locations to Fit Values” option to the gear menu. This allows the location boxes to extend downward to fit long values (most likely to occur when using Layering). If this option is turned on, the boxes may grow well beyond the height you may have set, and may obscure other boxes or disappear off of the display area.

Both the new “Expand Locations to Fit Values” option and the existing “Do Not Show Locations of DR 0” option are now plugged into the Plugin Options system, so these settings will now persist across GCA sessions.

* For Plugins

NOTE: The existing GetProtectionPaperDoll() function, currently used by any sheets that include the protection graphic, is ‘defective’ in that it only uses the default body image, not the one set in the current Loadout. It was written that way before the ability to change images was included in loadouts, and unfortunately never updated.

I have now created an alternative to the GetProtectionPaperDoll() function for plugins:

GetProtectionBodyGraphic(Settings As ProtectionBodyImageSettings) As Drawing.Bitmap

This returns a bitmap that starts with the body image set in the loadout, and then has body location graphics that more closely match those used in the Protection dialog. I’ve left the old GetProtectionPaperDoll() routine alone so that any existing sheets will continue to function as they already do.

Because creating the graphic often results in a different size image than the one used in Protection, where you may have adjusted the location boxes, GCA will try to scale the boxes to match the scaled image size, so that the boxes should better approximate the sizes and locations that you see in Protection. However, because fonts and font sizing will be very different between the two, you may see very different versions of what fits inside the boxes. GCA also tries to ensure that each box always has at least a couple lines of space for text (title and DR text), so a larger font may result in taller boxes than you’d expect.

This new function uses new Settings object as well. Here are some of the new properties:

Public Property LoadOut As LoadOut = Nothing

The loadout to use. If left as Nothing, GCA will attempt to set it to the character’s currently active loadout, or All Unassigned Items if none.

Public Property ColorSettings As BoxSettingsTraits = Nothing

The color profile to use when drawing the image. Leave it as Nothing to use GCA settings for Character Equipment. The function uses BorderColor and BackColor for the box; Title colors or Header colors for the header area; Trait colors for the DR text; and AltTrait colors for DB text (if printed).

Public Property AlwaysShowDB As Boolean = False

Set this to TRUE to always include the DB line (if the box will be printed anyway). Otherwise DB is only shown if it has a value. Default is FALSE.

Public Property IncludeStackingMessage As Boolean = True

When TRUE, if the character settings are set to allow stacking of DR or DB values, a text message will be printed at the bottom of the image to this effect. Default is TRUE. This makes the image slightly taller to make room at the bottom for the message without any possibility of interfering with the body image or the shield values inset image. If you are a sheet writer, you are encouraged to check for these values yourself and set this property to False; you can then print a message in the appropriate sheet font without it being unnecessarily scaled by the image scaling done to the graphic when it is printed.

Public Property AllowRedForLayersIssues As Boolean = True

When TRUE, any locations that have stacked layers will be drawn with Red borders and header backgrounds. When FALSE, normal colors are always used.

Public Property AllowRedForStackingIssues As Boolean = True

When TRUE, any locations that have stacked Fortify or Deflect (when not allowed) will have the sidebar drawn in light red. When FALSE, the Alt line shading is used (as with DB lines).

Public Property AllowGrowToFit As Boolean = True

Set to TRUE to allow the location boxes to grow (downward) to fully fit their contents. This may well cause overlaps the user didn’t expect, or boxes to extend off-screen.

Public Property NoSpecialEllipses As Boolean = False

When values don’t fit, GCA prints an ellipses in white-on-gray to make it more obvious that there’s more that didn’t fit. Set this to TRUE to prevent that, and just print the ellipses normally.

This bit (b180)


Added some code to better support prerequisite checking that relies on traits in groups. These prerequisites should now be checked, and the red P set or cleared, more reliably as you add and remove traits from the character.

* GroupedTraitListManager

Updated how GroupedTraitListManager handles GroupingOptions. This is now Nothing before BuildGroupTraits has been called, and after that call it is set to the options that were used to build the grouping, which are either the default character options or those set with OverrideGroupingOptions.

Added the TreatAsList option to GroupingOptions, which allows for treating a selected grouping tag as a list, much like categories are done. This allows for breaking the items within the tag into discrete grouping groups, instead of treating the entire tag value as one group.

* Sheet Options

When using an option of type GCA5Engine.OptionType.Caption, if you begin the UserPrompt with “[bb]” or “[bbcode]” GCA will substitute the BBCode enabled version of the caption control instead of the usual plain text only version. BBCode support is limited and should be documented somewhere (but I don’t think it is right now). Note that the control does have some glitches, so always try to include a space before any [p] marker (I think that avoids the worst annoying little glitch I haven’t fixed yet).

If all you need is the [p] marker and otherwise need plain text, note that the standard caption will now replace [p] with CR+LF. (Also be aware that the BBCode version of the control adds an extra half-line between paragraphs, but the standard caption control does not.)

* GCA5.xsd

Added the ‘treataslist’ element to GCAGroupingOptions

A little bit closer now (b179)


Created a new option type for sheets: ListSelectedOrdered.

* Book Processing

When loading a book file, a line beginning with a # was automatically perceived as a file command. This was a problem because certain #directives could also be the first thing on a line in a file. Now, GCA will check to see if the # starting the line is a directive before trying to process the line as a command.

* Campaign Log

Selected Log Entry Notes. I’ve now changed the Campaign Log so that when you enter the Notes field, the Accept button is turned off, and when you leave the Notes field it’s turned on again. That allows users to use the Enter key as expected within the Notes field without closing the dialog by inadvertently clicking the OK button.

* GroupedTraitListBuilder

The GroupedTraitListBuilder object has been updated:

Public Sub BuildGroupedTraits(Optional ByVal ReplacementList As SortedTraitCollection = Nothing, Optional ByVal OverrideGroupingOptions As TraitListGroupingOptions = Nothing)

This routine now optionally accepts a replacement list of traits as a SortedTraitCollection which allows you to group a collection of traits that are not specifically the character’s trait list.

It also now optionally accepts a replacement set of grouping options, which can override those contained in the character. This allows you to group a list differently than the user has specified and is intended primarily for when using the ReplacementList. Note that you must specify all applicable options here; no options are copied internally from the character settings, so if you want all the same options except for one change, you must still set them all yourself.

Transforms transformed a bit (b178)


Removed another redundant gathering of unassigned items in the character calculations, and set that to use the already gathered unassigned items loadout instead.

Added a MessageBox instead of just a message in the log when GCA is unable to print or export due to no sheets being found.

Added a MessageBox when no sheet plugins (or no plugins at all) were found during startup.

Added the #Log data file command, which allows the author to send a message to the Logging pane. Syntax is #log [<color>] <message> where the <message> can be enclosed in quotes and <color> is optional from red, blue, green, or orange (not specified is black).

* Transforms

I realized that the same oversight that was recently fixed in loadouts that caused child items to be counted twice when part of All Unassigned Items also applied to Transforms. I fixed that. (This had no real effect on much of anything, since it doesn’t affect encumbrance or any other such mechanic.)

Also as with loadouts previously, I’ve removed the check that prevented empty transforms from being saved. If you want to create transforms with no traits in them, you now can.

Transforms have been updated to support including Features, Cultural Familiarites, Languages, Skills, and Spells. This should greatly increase the ease of creating ad-hoc ‘templates’ to switch between, and supports more types of characters. (Attributes can’t be deactivated, so the best you can do for those is a trait that applies modifiers to the attribute that is itself active or not.)

The change in supported traits that are available to Transforms greatly increases the number and type of traits in the Transforms dialog trait grid. In support of that, I’ve added a new first column that displayes the type of each of the included traits, and Skill and Spell names will be shown with their levels appended using “-XX” where XX is their level.


I sometimes wonder how some bits are missed (b177)

b177 (b176 was used only for the last Release Version.)

Modified the output of the character’s QuickRulesOptionsCode() a bit: it now defaults to separating the pieces with commas; the dice+adds code is now ‘d+a’; the allows stacking for Deflect and Fortify codes now spell those out; added ‘-deffrom’ for when default level discounts are turned off; now outputs ‘n/a’ when no codes apply.

On the main window’s Traits menu the “Bonus Granting” option was changed to “Active/Inactive” to match right-click menus. I also added the “Loadout” options that were missing.

Changed how Options sizes the options panels, in an attempt to fix an issue with Windows 11 when high DPI scaling is turned off.

Added an error trap to the code when export sheets are run, to catch run-time errors in the export sheets.

The independent routine that returns the weight of all unassigned items wasn’t properly updated when the routine that returns all unassigned items was, so it was still double counting unassigned items that are chilren when totalling weights.

Since characters were changed some time ago to always recalculate the virtual ‘all unassigned items’ loadout (because that’s used as the default for various things), I have now changed the calculation code in the character to use the weight of that loadout for the character’s current load weight when using the unassigned items loadout. It was previously using the routine that just calculated the weight of all unassigned items separately, which is an unnecessary and redundant call in this situation, since we already know that value.

Character equipment lists now use an adjusted DisplayName that includes modifiers, as the various other traits do. This means you should now see the applied modifiers listed (in ‘short name, cost’ format) with the item. This will automatically flow through all lists and character sheets that use DisplayName when displaying the lists (all of my sheets use DisplayName). This *does not* apply to Attack Tables.

The Sheet Options dialog will now cap the sizing of the options blocks to prevent them from getting unreadably wide or unusably narrow.

The Sheet View toolbar should no longer be obscuring part of the Sheet View area.

* Campaign Settings

Campaign Settings should now honor Tablet Mode.

I’ve made some changes when initializing Campaign Settings to try to help adjust for issues with the sizing of the boxes in Windows 11 when high DPI scaling is turned off.

Campaign Settings has been changed to be a sizable window. This should help with better fitting everything as the user would like when the window is scaled in size.

Because of the change to a sizeable window, I’ve adjusted where the errors list appears when there are issues. This now appears inside the content area, under the panel displaying the info boxes. This will resize that flow panel, so when the errors list appears, the boxes may be re-flowed.

I’ve adjusted the checkboxes to help with accessibility. I’ve also left-aligned the various labels to fit in with the checbox change.