Category Archives: Build Notes

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

Another big haul o’ bits (b193)

Another much bigger update than usual. I have been putting the money from my Patreon to good use! Much of the new stuff in here is only available now thanks to the funding provided by my Patreon supporters. If you’d like to see improvements, bug fixes, expansions, and more added to GCA sooner rather than later, please consider pledging if you can afford to do so. (Not required, not expected, but very, very much appreciated!)

b193

* Miscellaneous

I have added support for requesting the worst of available skills, instead of the best, from the skillused() list when calculating charskillscore(). You do this using the #worst directive somewhere in the list (I suggest as the first thing). Do not separate the directive from the list with a comma, as GCA will identify it and remove it before parsing the list. This flag must be in the skillused() list for a mode in order to apply, otherwise GCA will continue to select the best possible skill for use.

GCA’s internal data handling is generally fine with CR+LF usage almost everywhere, but they’re not allowed in the data files. So, I have added some logic to convert these carriage return/line breaks to <CRLF>, <CR>, or <LF> (depending on how they’re found; RTF often uses line feeds but not carriage returns, for example) when saving data out to a data file, and to convert <CRLF>, <CR>, or <LF> back to the appropriate control characters on reading book data in. This has been done in the routines that save character data to book files, read data in from book files, and in the reading and writing of the FastLoad files. This should allow users to use hard returns in descriptions and notes for traits and modifiers within GCA itself, and <CRLF> to represent them when editing data files. If you paste RTF code into a book file manually, you will also have to manually change all the line feeds to <LF> to keep things kosher. Note that this change is not currently supported for anything that isn’t a trait or modifier.

GCA now supports the trait tag vttnotes() and the mode tag vttmodenotes() for users to make notes intended to be used in the virtual tabletops of their choice. Of course, this requires an appropriate exporter that knows to export these fields in the correct way to be useful for whatever VTT is the target.

I’ve created a very simple tool-style dialog to allow selecting a color; it’s basically just a form to show you the color picker drop-down that I use in Sheet Options for picking colors. This is currently used by the simple RTF editor that I mention in the RTF-Related section below.

I have enabled the gear menu on the Reaction Modifiers box, and added an option: Show Bonuses By Line. This allows for changing the display of bonuses and conditionals in the box so that they’re one per line, instead of in paragraph format. (Turns out that I prefer it this way, so I’ve made that the default behavior now. You can turn that option off to restore the previous paragraph-style output.)

Both Sheet View and the Print Preview dialog now have the ability to switch between Single Page and Facing Pages modes using new buttons on the toolbar. (The View Whole Page button now has a new image since the previous image is now used for Single Page.)

When you use Save to File from the Edit Traits, Advanced Edit Traits, or Edit Modifiers dialogs, or use Save as Template from the File menu, GCA will now ask you if you want to reload any libraries that make use of the changed book. This allows you to have GCA do it automatically rather than you having to reload the libraries manually, but by asking first it allows you to refuse, in case you have a bunch of other stuff to save as well.

* Bug Fixes

Fixed a bug in damage calculations related to text functions with damage multiplier bonuses.

I found that GCA really disliked fixed value (non-dice) base values for attack damage (such as ‘1’ instead of ‘1d’), and having one would often result in getting a weird result that might include unsolved expressions. I tracked down where that result was decided upon, and can’t figure out if there was a good reason for me to return that weirdness, or if it’s just a bug. I decided it was a bug, and fixed the value that gets returned so that it should now return the non-dice flat value result that I think should have been correct. If I was wrong, and just didn’t remember some esoteric reason for that particular configuration, I apologize, and hopefully it’ll come up and I can figure out something else.

The Reaction Modifiers box in Unified View would sometimes get its bottom cut off, and sometimes that would result in not seeing all the text. I have made a change in how it is refreshed to address this.

Fixed some text on the Symbols and Optional Display panels of the Character Options tabs in Options. Also moved the ‘Include your shield DB in the scores/levels for your active defenses’ option to the bottom of that panel.

* Minor Adjustments

Adjusted some bonus display string creation to show ‘+0’ instead of just ‘0’.

Advanced Edit Traits will now show the IDKey of a trait just above the tag data grid. It’s not editable, but it can be selected and copied.

Fixed Sheet View so that the Library pane will stay the set size when the window is resized, as it does on Unified View.

I’ve updated some mode based bonus messages to refer to the mode name instead of the number.

Added a bunch more tags to the list of tags that are not saved as data when saving a character trait as a system trait.

* Modes in General

I have updated some code, and added some routines, to better support certain mode calculations using Modes directly instead of passing a mode index. This should be transparent, but its a change that could potentially break something.

I have added Public Function DamageDisplayText() As String to the Mode object. This function returns a string that represents the standard damage notation including damage, armor divisor, damage type, and radius. Example: 2d+1 (2) cut (2). You can also access this using Item.DamageModeTagItem() with “DamageDisplayText” as the tag, if you’re accessing mode values that way.

I have updated various attack mode displays in GCA to use the new Mode.DamageDisplayText function.

* Damage Mini-Modes

Damage mini-modes allow you to store more than one set of damage values in a single attack mode. If you apply them manually, you need to set damage(), damtype(), armordivisor(), and radius() manually, using comma-separated values, one per mini-mode desired. Damage() is always required, but the other tags are not. You can also apply a mini-mode via a bonus to ‘minimode$’ in standard damage notation, such as ‘1d cut’ or ‘sw+1 (2) burn (3)’; GCA will parse those damage strings into the appropriate tags (remember to put armordivisor and radius in parens, and that armordivisor comes before the damage type while radius comes after it).

This is considered an experimental feature, but it is ON by default. You can turn it OFF on the Experimental Features panel on the Program Options tab of the Options dialog.

NOTE: If you have mini-modes that you created manually by editing tag values, turning the option OFF in Options may result in a crash as that can result in illegal data. However, if you apply mini-modes via a bonus, that bonus will simply no longer get processed, so no crash will result.

The new DamageDisplayText function of a Mode will return the damage string correctly, whether there are mini-modes in use or not. When mini-modes are in use, damages will be displayed as comma-separated damage notations.

Using mini-modes results in some new calculated tags being managed in each Mode: minimode_damage(), minimode_damtype(), minimode_armordivisor(), and minimode_radius(). These shadow the original tags but have all the extra mini-mode data included, or slots for them when values are missing or empty.

For plugin authors, if you need to access mode data for purposes other than display, you can use the new GetMiniModes() function of a Mode. This returns all the mini-modes as part of a ModeManager, as full modes using the data of the mode in question, but the damage data for each mini-mode. That is, if you have a mode with two mini-modes of ‘1d cut’ and ‘sw+1 (2) burn (3)’, then GetMiniModes() will return two modes that are identical to the original mode, but with the damage(), damtype(), armordivisor(), and radius() tags set for each type of damage for each of the two mini-modes.

* Notes, Notes(), UserNotes()

The Notes panel in Edit Traits wasn’t serving any purpose any more as handling of modes changed how that data was used and viewed, (The old usage of Notes was muddied between general notes and the original intended usage of the short notes-reference-numbers in equipment tables and such. Nowadays, notes() is enforced as a mode-specific tag, and I’ve made an effort to change the long-form notes that were sometimes used in data files to use either usernotes() for general trait notes, or itemnotes() for mode-specific notes.) As such, the Notes panel in Edit Traits has been re-tasked to support VTT Notes, which would be a specific place for people to enter notes or formulas for use on virtual table tops, if supported (Foundry, for example, could use it for OTF expressions without cluttering up any other fields.)

The Notes property on GCATrait has been removed. I have replaced it with Public Function Notes(Optional ByVal AsPlainText As Boolean = True) As String which returns any usernotes() for the trait. Usernotes() is an RTF-enabled tag, so by default the Notes() function returns that data as plain text; you can pass False for the AsPlainText optional parameter if you are okay with getting the RTF-encoded text.

* RTF-Related

The helper function RTFtoPlainText() wasn’t smart, and if an exception occurred because the text being processed wasn’t valid RTF, it would just fail. Now it attempts to convert again using a simple RTF header, and if that also fails, it simply returns the text it was provided. I also improved the logic significantly, which provides a huge improvement in processing speed. (This routine also used to convert any CR+LF that exists in the text after conversion, or failed conversion, to the text marker “<CRLF>”. That no longer happens here.)

Added some additional routines to assist in RTF processing, and adjusted some of the existing RTF routines so fewer controls will be instantiated and destroyed as GCA runs and handles RTF features.

I’ve created a very simple RTF editor, which just allows for setting bold, italic, or text colors, and offers access to the font dialog for changing fonts and font sizes.

Currently the RTF enabled fields using the new simple RTF editor are: the Description and User Notes boxes in Edit Traits; the Notes field in the Selected Log Entry area of the Campaign Log; and the Notes field of the Party Log Entry dialog.

With the added support, and likely increased use, of RTF in Description and User Notes, the existing code for displaying the description() and usernotes() in the Info pane no longer worked correctly. Since the content of the Info pane was already RTF, it already had a header with a color table. That meant that when the new RTF tag content was inserted, any color information it had would be matched against the existing color table, shifting the colors from what the user applied. (They were still correct in tag itself, just displayed incorrectly.) I have fixed this in various pieces of the system that generates the display, allowing me to insert the description() or usernotes() using the Info pane control’s RTF handling, which allows it to merge the color tables and display the data correctly.

* View Info Templates

I have adjusted the included templates for the information that is displayed in the View Info pane for the various types of traits. I have removed notes() because, as mentioned above, it’s not what was intended. I have also moved the usernotes() display to under the description() display, since it will often include important information, and moved both of them upward to just under the Page display.

* GCA Prime Sheet (now 1.0.5)

Updated to allow for properly printing the RTF text of description() and usernotes() for traits.

Added options to have description() and usernotes() print as plain text instead of rich text.

Add options to always show description() or usernotes() for traits that are highlighted a certain color (or highlighted at all).

Updated to use Mode’s DamageDisplayText for damage displays.

* GCA5.xsd

Added element ‘vttnotes’ to the ‘ref’ block of GCATrait

Added element ‘vttmodenotes’ to GCAAttackMode block

Added elements ‘minimode_damage’,’minimode_damtype’,’minimode_armordivisor’, and ‘minimode_radius’ to GCAAttackMode block

* TagDefs.xml

Updated ‘mode enabled’ text to instead be ‘mode specific’.

Updated to include text for vttnotes() and vttmodenotes().

Updated to include text for minimode_damage(), minimode_damtype(), minimode_armordivisor(), and minimode_radius().

 

Some big chonky bits (b192)

This is a much bigger update than usual. I have been putting the money from my Patreon to good use! Much of the new stuff in here is only available now thanks to the funding provided by my Patreon supporters. If you’d like to see improvements, bug fixes, expansions, and more added to GCA sooner rather than later, please consider pledging if you can afford to do so. (Not required, not expected, but very, very much appreciated!)

b192

* Miscellaneous

In Options, Current Character Options, in the Symbols and Optional Display box, some of the text for the options related to showing Break and Malf values was incorrect. Fixed.

The Attributes trait box in Unified View will no longer offer the little increment/decrement buttons if the attribute doesn’t actually support being adjusted.

The Edit Traits dialog will now disable the increment/decrement buttons for attributes that do not support being adjusted.

The colors for the header and border of the applicable modifiers list in the Modifiers dialog have been fixed.

I changed the data type for Penalty in the Hit Location Table lines, making it a string field instead of an integer one. This allows for more flexibility in possible table entries. I have updated the code in various places, including the Hit Location Table object and the Protection dialog, to reflect this change and to allow for unconverted string data.

I added an alias of ‘reskin’ for the tag ‘displaynameformula’ for both traits and modifiers. An alias just means that you can use that name for the tag instead of the expected name, but the expected name is the one that stays in the tag list. So, you can Add Tag ‘reskin’ with a value of “TEST”, and it will appear that way in Advanced Edit Traits until you click OK and the tags are written back to the tag list; at that point ‘reskin’ will become ‘displaynameformula’, and when you open Advanced Edit Traits again, you’ll see ‘displaynameformula’ instead of ‘reskin’. You can also use an alias as a reference, such as ‘me::reskin’ to get the value of the ‘displaynameformula’ tag. NOTE: If you use an alias to Add Tag a tag that already exists in the tag list in its dereferenced form, it’s a crap-shoot as to which tag value you’ll end up with when you click OK.

Made changes in a whole bunch of places where BonusList entries are made, so that the bonus text shows as coming from the giver’s DisplayName instead of its FullName.

Added a couple new BonusListSpecialCaseSubs for use with ListAs, since %name% now returns DisplayName instead of FullName. You can now use %displayname% if you want to, but that’s the same as %name% now. You can also use %fullname% to explicitly get FullName.

Adjusted the ‘name’ provided for the skill that is being defaulted from, when that’s happening, to use DisplayName instead of FullName.

Made it so CTRL+A should select all the text in the Message dialog’s text box.

Some users were seeing the ‘double-click to open the traits dialog’ optional feature in the Trait boxes on Unified not work for some lists. I believe this is because the pop-up menu will sometimes cover the button when the pop-up menu gets pushed upward to avoid parts of it appearing off-screen. I’ve set the pop-up to open to the right of the button, instead of below the button, which I think will fix the issue.

The Solver’s routine for getting an item’s value would return 0 in many cases instead of a negative number, if a negative number was the best or only result in those cases. This has now been fixed to allow returning that negative number if it is the best or only result.

* Templates

We’re seeing some issues with some of the more esoteric features of templates and related traits. It appears that this is because the various features of a template (adding traits and whatnot) are processed before the template itself is calculated. This is necessary, because some of those features might build things that change the template itself. However, without having values yet, even though the template may appear on the trait lists, it won’t appear to exist if something checks for it because it’ll have a level of 0. This can be a problem. So, I’ve moved the basic initialization to occur before the template features are processed, and now do a calculation based on those values. Since most of the template doesn’t exist yet, the results of the calculation at this stage won’t be ‘correct’, but they will provide initial levels and points, so that the trait should appear to exist when checked for. This applies to all traits, because any type may use some template features. Because most of the template isn’t actually initialized yet, the calculation should be very quick, but it also means that if a more comprehensive tag or value of the template is required, it won’t be there until after the template has finished being built.

I’ve created the new flag command #preserve for use with replacetags() and mergetags() in templates. Just stick it into the ‘with’ block somewhere; GCA will strip it out when found, but that will tell GCA not to create a changelog entry for it. (GCA has very few ‘undo’ features, but this is one place where there is some of that, and if you do a replacetags() or mergetags() and then remove the template that performed it, GCA will undo that tag change. Unless you now use #preserve to make it stick.) For example, replacetags(in char with “Profession(Bandit)”) will change (or add) a Profession tag to the character, with a value of Bandit, but removing the template that made that change will remove the tag value again (or change it back to what it was); using replacetags(in char with “Profession(Bandit)”#preserve) will ensure that the profession remains, even if that template is removed.

* ArmorDivisor() / CharArmorDivisor()

Stacking of armor divisor bonuses was not working correctly. Since armor divisor is a multiplicative adjustment, bonuses should multiply, not add. However, bonuses were being granted as adders instead of multipliers, because without any adders, the result would often be 0 (since adders are often used to create the base value, and without any, the base value stays 0).

So, armor divisor has to be handled as a special case, and in this special case, all adder bonuses are treated as multiplier bonuses instead, and a bonus value of 0 is treated as a bonus of 1 instead. Then, when the math is handled to sum adders together to get the base, GCA ensures that a base of 0 becomes a base of 1. The multipliers are then multiplied against that base.

GCA must also do something similar for all targeted text bonuses, since that has been the only way to create a bonus that only applies to certain modes. However, that creates or modifies the base value based on the orginal mode tag value, which could somehow cause a problem at some point (although right now I haven’t seen it). So, if a text bonus to armordivisor$ must *not* be pre-solved and converted to a multiplier as is now done, use the +noaddcheck keyword. GCA will remove the keyword from the bonus text, and then simply apply the remaining bonus text to the tag value (as is usually done for other tags) before eventually getting sent to the Solver for final evaluation.

Handling this special case in this way means all existing adder bonuses to armor divisor should now work correctly (as multipliers), and if users changed some to be mulitpliers, those should also continue to work correctly.

* Modes and Bonuses

So far, bonuses that need to differentiate by mode have to do a complicated text bonus. That’s dumb, but I just never really noticed it before. Shouldn’t it be possible to target a bonus right to a particular mode, without having to deal with the complex world of text bonuses to the $ version of a tag?

Yes, it should. It does require a little more overhead, because the bonuses have to be checked on a per-mode basis to see if they apply in the current case. But otherwise, it should be possible, and should be so without affecting anything else about how bonuses work, or any existing bonuses.

So, here’s what I’ve done to enable this.

I’ve added a new clause to creating a bonus using gives(), and that clause is ByMode, and it looks like this:

bymode [where] TAG COMPARISON VALUE

The bymode keyword is required but the where keyword is optional (it just helps readability to have it there).

TAG is the mode-enabled tag that you’re looking at, such as ‘damtype’.

COMPARISON is the comparison you’re making, and uses the same selection as Trait Selectors, which are these: is (TAG and VALUE are the same), isnot (TAG and VALUE are not the same), includes (VALUE can be found inside TAG), excludes (VALUE is not found inside TAG), listincludes (TAG is treated as a list, and VALUE is found as one of the list items), and listexcludes (TAG is treated as a list, and VALUE is not found as one of the list items).

VALUE is the value that you’re comparing TAG against.

Right now, this is basically all string/text based, so there’s no less than or greater than or such comparisons. I can add something to do that if needed down the line.

If the ByMode clause exists for the bonus, and the comparison returns TRUE, then the bonus applies for the mode.

Here’s an example gives() that might be applied by a modifier:

=+5 to owner::armordivisor bymode where damtype contains “cut”

This bonus to armor divisor is only applied when the owner’s mode is something that does cutting damage, so if there’s a hammer on the back doing crushing, it will not suddenly get an armor divisor as well.

To make all that new ByMode stuff actually work right in calculations, I also had to touch a lot of places and write some new routines, so that gathering up the applicable bonuses could be done per-mode instead of just once per-tag. Assuming that all of those changes have been done correctly, there should be no difference in results for any currently existing characters or bonuses, but the new functionality should now be available to all mode-specific target tags.

I have now updated the Trait Selector code to allow for better parsing, and to support subcriteria in the selection. This means that if you use ByMode, you can specify subcriteria for the COMPARISON specified, using the keywords “oneof”, “anyof”, “allof”, or “noneof”. This allows you to specify a list of options to use for the TAG value that satisfy or fail the requirement. This makes the template look like this:

bymode [where] TAG COMPARISON [SUBCRITERIA] VALUE

and allows VALUE to be a list of possible options separated by commas (quotes or braces blah blah blah).

Here’s our example using this:

=+5 to owner::armordivisor bymode where damtype contains anyof “cut,imp”

This bonus now allows the +5 to the owner’s armor divisor to be applied for any mode where damtype contains any occurence of “cut” or “imp”.

NOTE: many combinations of COMPARISON with SUBCRITERIA will make no sense, or will be incredibly confusing to figure out, especially if they’re negative in connotation, such as ‘excludes’ with ‘noneof’. I encourage you to always use positives when possible.

* Build Campaign Book

I’ve made some improvements. The dialog now allows for having a reference library and your book file both. The reference library is basically the same as before if you haven’t saved a book yet, but now you can have one in addition to an active book. This means you can load a book and the reference library and work with the same data you were using before, without having to start all over again. When you load both, GCA will use the book to set all the starting ‘deleted’ traits for you, based on comparing the book against the reference library. This means you’ll be able to improve and refine your book, or add new books to the reference library and add get new traits to add to your book.

It’s important to remember that GCA will not be able to remember the ‘deleted’ traits. Those are filled through a comparison of the book file with the reference library. Any traits found in the library that are not in the book will be put into the Deleted Traits list. Then, you can remove those traits from the Deleted list if they’re ones that you want to include now. This is the only way to ‘add’ new traits from new library books to your campaign book in this dialog. To say again, they’ll have been auto-deleted, and you have to *undelete* them to add them to the book. (Of course you can save traits to your book inside GCA normally, or add them manually if you wish.)

Books saved from this dialog will now include a reference to the library, so if you load the book in the dialog later, it will be able to set the library for you.

You can also change the library you are using as the reference library, and GCA will adjust the traits kept or deleted through the same comparison to the book.

When the Campaign Book includes traits that are *not* in the reference library, GCA will notify you of that, and will add all those traits from the book into the library. It will also flag all of those traits so that it’s clear which are not found in the reference library.

Once you have loaded both the book and the reference library, you’re working strictly with the library data (which may have had book data added to it, if it was missing, as mentioned above). Nothing you do changes the *book* until you save the library to the book.

Also: Fixed a couple bugs in Campaign Settings where changing the Disad Limit would change Base Points instead, and changing Quirk Limit would result in it being set to Disadvantage Limit. Enabled double-clicking in the library list to remove a trait, and in the deleted items list to restore the trait.

* Money

GCA has been updated to *not* include char::campaigntotalmoney in the calculations for the Points Bar to display equipment and money values based on the Remaining Funds and Money attributes, *if* those attributes already include char::campaigntotalmoney in their basevalue() tags.

It did not used to be possible to retrieve the value of the total money earned from the Campaign Log in the calculations for a trait. Once it was possible, it didn’t get applied to the attributes right away, so the value of the Money and Remaining Funds attributes would not correctly reflect actual values once Camapign Log entries were included. The Points Bar values, however, did include the Campaign Log values. This resulted in an unnecessarily confusing disconnect between the character’s value and the value displayed in the UI, and a Money value that would be incorrect when printed to character sheets.

This adjustment should fix that going forward, in conjunction with the changes to the book files that define these attributes. The Basic Set, Discworld, Dungeon Fantasy, and Lite book files have all been updated in support of this change.

As with all changes that include adjustments to data, *existing characters will not have this change*. You must Resynchronize Attributes in order to update a character with the updated attributes.

(If you wish, instead of a Resynchronize, you could manually add “+ char::campaigntotalmoney” (without the quotes) to the end of the basevalue() tag values for Money and Remaining Funds.)

* GCA5.xsd

Changed element ‘penalty’ in GCAHitLocationLine to a string.

* BookCodes.xml

* Data Files

NOTE: The updates to the data files are included here because they were released to my private beta testers. However, they are *not* yet released to the public. When that happens, I’ll post a Package Update notice.

(I’m sorry, but the data files updates here includes both new stuff since the previous update, and stuff that was in the previous update, because I’m just keeping one list that will go up on my blog when the Official Release version goes out.)

————————————————————
Discworld RPG.gdf
————————————————————
[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

————————————————————
Dungeon Fantasy RPG.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

[Body]
<Humanoid>
Updated body part display locations to better fit default image.

[HitTables]
<Humanoid>
Added.
Updated rolls and notes to match those in Exploits, but edited to fit a simple Humanoid body (no extra limbs, tails, wings, etc.)

<Universal Dungeon Fantasy>
Added this table to match the table in Exploits, which includes adjustments and notes for extra limbs, tails, wings, etc.

[Modifiers]
<Arrow>
Flaming
Added

<_General>
Continual Light
Haversack
Resistance
Deflect
All of these added from Matthew Woods, with some adjustments from Armin.

<Melee Quality>
Accuracy
Puissance
Penetrating Weapon
Shatterproof
Defending Weapon
Flaming Weapon
Icy Weapon
Lightning Weapon
Ghost Weapon
Graceful Weapon
Loyal Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Bow Quality>
Accuracy
Puissance
Penetrating Weapon
Shatterproof
Ghost Weapon
Loyal Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Arrow>
Accuracy
Puissance
Penetrating Weapon
Flaming Weapon
Icy Weapon
Lightning Weapon
Ghost Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Armor>
Fortify
Deflect
Lighten
All of these added from Matthew Woods, with some adjustments from Armin.

<Shield>
Defending Shield
Deflect
Lighten
All of these added from Matthew Woods, with some adjustments from Armin.

[Disadvantages]
<_General>
Odious Personal Habit (“Constant Humming or Singing”)
Added

Compulsive Carousing
Compulsive Generosity
Compulsive Lying
Added conditional bonuses/penalties.

[Equipment]
<Ammunition>
Arrow (Bodkin Point)
Arrow (Cutting Point)
Crossbow Bolt (Bodkin Point)
Crossbow Bolt (Cutting Point)
Added

<Clothing>
“Clothing, Complete Outfit”
Added

<Weapons>
Composite Bow (ST %choice%)
Composite Crossbow (ST %choice%)
Crossbow (ST %choice%)
Longbow (ST %choice%)
Pistol Crossbow (ST %choice%)
Regular Bow (ST %choice%)
Short Bow (ST %choice%)
Added modes for Standard Point, Bodkin Point, Cutting Point, and Flaming: Follow-Up

<Other Magic Items>
Bottomless Purse
Cornucopia Quiver
Gem of Healing
Ironskin Amulet
Moly Amulet
Necklace of Fireballs
Salamander Amulet
Serpent’s Amulet
Siege Stone
Wizard’s Staff
Wizard’s Wand
Added.

[Spells]
<Movement:Mo>
Added SP:Quick March (Druidic)

————————————————————
Dungeon Fantasy RPG – Companion 3.gdf
————————————————————
Book added. Thanks to Matthew Woods.

————————————————————
GCA5 Symbols.GDF
————————————————————
[SYMBOLS]
A number of the rules referred to the _Cinematic.png image. That image was removed a long time ago, but the rules weren’t updated to reflect that. That is now fixed.

————————————————————
GURPS Basic Set 4th Ed.–Characters.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

[Advantages]
<Mundane Social, Mundane, Social>
Pitiable
gives(+1 to SK:Panhandling) changed to gives(+3 to SK:Panhandling)

[Body]
<Humanoid>
Updated body part locations to better fit default image.

[Equipment]
“Auto Shotgun, 12G”
Removed the duplicate malf() entries from each newmode().

————————————————————
GURPS High-Tech Pulp Guns Volume 1.gdf
————————————————————
[Equipment]
Added quotes around so very many item names.

Colt Model 1878
H&H Paradox Gun
Winchester Model 97
FN-Browning Auto-5
H&R Model 8 Standard
Merkel Modell 145
Winchester Model 12
Greener Police Gun, 14.5G 2.56”
Remington Model 17, 20G 2.75”
LeFever Nitro Special, 12G 2.75”
Ithaca Auto & Burglar, 20G 2.5”
Ithaca NID Field, 12G 2.75”
Winchester Model 21, 12G 2.75”
Remington Model 32, 12G 2.75”
Manville M12, 12G 2.75”
Removed the extraneous mode() tag.

Greener F35 Far-Killer
Removed the extraneous mode() tag.
Renamed second newmode() to Slug.

Winchester Model 1887
Removed the extraneous mode() tag.
Removed the second newmode() tag because it was largely a duplicate of the first, and the other stats didn’t seem to make sense for that.

————————————————————
GURPS Lite 4th Ed.–Characters.gdf
————————————————————
[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

————————————————————
GURPS Low Tech 4e.gdf
————————————————————
[BODY]
<Humanoid – Low Tech>
Now showing Chest and Abdomen instead of Torso.
Updated body part locations to better fit default image.

[HitTables]
<Humanoid – Low Tech>
Added this hit location table to go along with the Body “Humanoid – Low Tech”.
Some of the hit penalties here are worked out with Kromm because they’re not specifically noted in the book.

[Equipment]
“Qian Kun Ri Yue Dao”
Fixed a missing comma between a couple newmodes()

————————————————————
GURPS Martial Arts 4e.gdf
————————————————————
[Equipment]
Large Hungamunga
Removed the tag mode() from newmode(Thrown).

————————————————————
GURPS Powers 4e.gdf
————————————————————
[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

————————————————————
GURPS Steampunk 3 – Soldiers and Scientists.gdf
————————————————————
Book added. Thanks to Gareth Parker.

————————————————————
GURPS Thaumatology 4e.gdf
————————————————————
Section for Raw Magic added to end of file. (Thanks to Symbiode)

[Advantages]
<Raw Magic>
Raw Magic Store
Added

[SPELLS]
<Meta-Spells>
Detect Raw Magic
Analyze Raw Magic
Process Raw Magic
Added

<~Ritual – Meta-Spells:MS>
Detect Raw Magic (Ritual)
Analyze Raw Magic (Ritual)
Process Raw Magic (Ritual)
Added

————————————————————
GURPS Ultra-Tech 4e.gdf
————————————————————
[Modifiers]
<Melee Quality>
Composition: Hyperdense Blade (TL11)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=5 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 5), (“imp”, 5) ) to owner::armordivisor$”

<Sword Class Quality>
Weapon Quality: Superfine (TL9+)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=2 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 2), (“imp”, 2) ) to owner::armordivisor$”

Composition: Monowire Blade (TL9^+)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+10 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 10) ) to owner::armordivisor$”

Composition: Vibroblade (TL10)
Composition: Vibroblade (TL11)
Composition: Vibroblade (TL12)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+3 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 3) ) to owner::armordivisor$”

Composition: Nanothorn Blade (TL11^)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+10 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 10) ) to owner::armordivisor$”

Fixed bits all over the place (b191)

NOTE: The updates to the data files are included here because they were released to my private beta testers. However, they are *not* yet released to the public. When that happens, I’ll post a Package Update notice.

b191

I have created a new program called The Cleaner that will be installed with GCA5 in the future. This program will allow you to clean/remove the folders that GCA creates in out-of-the-way areas of your system, so that you don’t have to track them down in order to clean up after GCA should you uninstall. (Because these folders and all that they contain are created by GCA itself, or by the Update system, the setup program can not remove them when you Add or Remove Programs.) This program is similar in concept to GCA4’s GCAClearAppData program, but this one has a UI and allows you to choose which of the two different folder structures you want to clear out.

The Party Log Entry dialog was missing a field to enter Money. It has been added.

For some reason, the Modifier property FullNameOldStyle was returning text in the new style of “Name, Extension” and not in the expected old style of “Name (Extension)”. This rendered any of the @hasmod() related functions likely to return the wrong value if they were checking against the often used “Name (Extension)” style. This has been fixed.

When loading a hit location table from a files, the table notes are keyed, so each must be unique by the given note() key. GCA was not checking for duplicates, and would crash if a duplicate note ‘key’ was added to the table. GCA now checks for dupes, and will replace the existing note with the duplicate now. (If Verbose is On for the book while loading, a message will be printed to the log about the duplicate and the replacement.)

Resynchronize was not removing certain system-only tags from character traits when refreshing the character traits with the system data. This meant some system control tags were being left on the trait, which would sometimes cause issues in certain situations. I’ve split out a routine for cleaning the traits of those tags (from the code in the character that handles creating new items), and Resynchronizing traits now uses that new routine as well.

GCA was incorrectly parsing template creates() items that had quoted names. That has been fixed.

When saving a Body to a file from the Protection dialog, height and width data for the location boxes was not being saved. Fixed.

GCA was also not processing height and width values for body parts that were being set in the [Body] section of a book file. Fixed.

Changed calculation of weightcapacity(), so that it can be targeted for bonuses to ‘weightcapacity’ and so that charweightcapacity() will be calced and included even if there are no children.

There was a potentially serious bug that could put GCA into an endless loop after clicking on OK in Advanced Edit Traits, if the item being edited had both children and bonuses. This appears to have been due to the order of operations for how a modified trait is updated (even if no real user edits were made). I have adjusted the order of some of the operations, and I believe this issue is now fixed without negatively impacting results.

Support for Bonus exceptions (onlyif, unless) hadn’t been extended to all routines related to applying bonuses. Should be now.

————————————————————
Dungeon Fantasy RPG.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Modifiers]
<Arrow>
Flaming
Added

[Disadvantages]
<_General>
Odious Personal Habit (“Constant Humming or Singing”)
Added

Compulsive Carousing
Compulsive Generosity
Compulsive Lying
Added conditional bonuses/penalties.

[Equipment]
<Ammunition>
Arrow (Bodkin Point)
Arrow (Cutting Point)
Crossbow Bolt (Bodkin Point)
Crossbow Bolt (Cutting Point)
Added

<Clothing>
“Clothing, Complete Outfit”
Added

<Weapons>
Composite Bow (ST %choice%)
Composite Crossbow (ST %choice%)
Crossbow (ST %choice%)
Longbow (ST %choice%)
Pistol Crossbow (ST %choice%)
Regular Bow (ST %choice%)
Short Bow (ST %choice%)
Added modes for Standard Point, Bodkin Point, Cutting Point, and Flaming: Follow-Up

<Other Magic Items>
Bottomless Purse
Cornucopia Quiver
Gem of Healing
Ironskin Amulet
Moly Amulet
Necklace of Fireballs
Salamander Amulet
Serpent’s Amulet
Siege Stone
Wizard’s Staff
Wizard’s Wand
Added.

————————————————————
GURPS Basic Set 4th Ed.–Characters.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

[Advantages]
<Mundane Social, Mundane, Social>
Pitiable
gives(+1 to SK:Panhandling) changed to gives(+3 to SK:Panhandling)

[Body]
<Humanoid>
Updated body part locations to better fit default image.

————————————————————
GURPS Low Tech 4e.gdf
————————————————————
[BODY]
<Humanoid – Low Tech>
Now showing Chest and Abdomen instead of Torso.
Updated body part locations to better fit default image.

[HitTables]
<Humanoid – Low Tech>
Added this hit location table to go along with the Body “Humanoid – Low Tech”.
Some of the hit penalties here are worked out with Kromm because they’re not specifically noted in the book.

————————————————————
GURPS Powers 4e.gdf
————————————————————
[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

————————————————————
GURPS Thaumatology 4e.gdf
————————————————————
Section for Raw Magic added to end of file. (Thanks to Symbiode)

[Advantages]
<Raw Magic>
Raw Magic Store
Added

[SPELLS]
<Meta-Spells>
Detect Raw Magic
Analyze Raw Magic
Process Raw Magic
Added

 

A variety of bits to choose from (b190)

b190

The routine used to allow scaling of super-large values was truncating/rounding small values with decimal places. Most places it was used that didn’t matter, but it affected Basic Speed, where it does. That routine now allows up to two decimal places if they exist.

There was a bug in the sheet option control that handles the new option for selecting one or more listed items and then allowing the user to arrange them in the order desired (List Selected & Ordered). This bug occurred when there were duplicate items, and the user attempted to move any of those duplicates; the duplicates just got bundled together at the end of the list and couldn’t be moved. That bug is now fixed.

After fixing the List Selected & Ordered bug, I added some support for drag-and-drop to add/remove items, and to reorder items in the selected list.

The Library panes used in Unified and Sheet views now have an additional option for filtering the categories being displayed. If you right-click an item selected in the list, you can select a category that it belongs to, which will then exclude that category of items from the displayed listing. For example, you could click on Absolute Direction, then right-click and select Exclude Trait Category to get a list of categories to which Absolute Direction belongs, then select Mundane to have all traits that belong to the Mundane category excluded from the library list. A check box pane will appear directly under the categories drop-down (above the filter pane), with a No ‘Mundane’ option listed and checked. Unchecking the box will clear that exclusion. The exclusion will persist until you check the box to clear it.

And, expanded the system above, so you can right-click in the Library list and then select Exclude Categories… to pick from a dialog of all the categories that apply to the current list. All the categories you check there will then be excluded, and added to the checklist of exclusions. There is now also a big red X button to clear the entire group of exclusions all at once, if you’re done with them.

Added the ability to convert a template or metatrait into a parent with children structure instead. This removes all the access-control features (hide, lock, etc.) from the related traits in the process. You can access this feature by selecting the desired template trait in the Character list (and only that trait), then choosing the “Convert to Parent/Child” option which will appear in the right-click or Traits menus. That will convert the template or metatrait into a parent with children. You can not undo this.

Updated the code that puts deleted traits into the Recycle Bin to *not* preserve the “NO XYZ” traits that are auto-created by GCA when you disable a component trait in a template. Because these are part of a behind-the-scenes system, they don’t work quite like regular traits, and if you Restore them from the Recycle Bin they may behave problematically.

Added text to the headers for the Armor sections in Edit Traits, so that it’s more clear that the non-editable display is *after* all modifiers and bonuses have applied, while the editable section is before those. Also, changing values did not immediately trickle-through, so that has also been updated to do so.

Adjusted code in the Info pane so the mouse pointer won’t flicker like crazy over page numbers.

I broke a bit again. Ugh. (b188)

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)

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)

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)

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)

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)

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.