Only time for a few bits this week


* Miscellaneous

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

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

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

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

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

* Party Console

Added an explainer.

Adjusted the look of the default attributes block a tad.

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

* Books & Data

Included Eric’s book and image data updates.

Still summer, still more bits


* Miscellaneous

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

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

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

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

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

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

* #ChoiceList dialog

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

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

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

* Official Character Sheet

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

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

* Color Block Sheet

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

Summer bits


* Miscellaneous

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

Removed the unused Edit menu from the main menu.

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

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

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

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

* Print Preview

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

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

Added an Exit button.

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

* Official Character Sheet

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

Updated to actually print Templates.

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

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

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

* Books & Data

Included Eric’s book and image data updates.

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

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

Feature bits


* Miscellaneous

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

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

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

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

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

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

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

* Features

Removed previous, partial Features support.

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

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

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

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

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

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

* Books & Data

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

Updated GCA5 Changes.gdf with a _New Feature item.

* Sheets

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

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

Cleaning up and polishing of various bits continues


* Miscellaneous

In Classic View, in system and character trait lists, when using type-to-search, traits beyond the bottom of the viewable list area would often be found and selected, but would be considered ‘in view’ even if only a fraction of the trait’s name box was actually within the viewable area. Clearly, that’s not ideal. This has been fixed so that a whole row should scroll into view, at least.

In Unified and Sheet Views, the library list type-to-search has also been fixed as above.

When points are changed in the Campaign Settings dialog, the points bar should now update values correctly when the dialog is closed.

The Library items in Classic View didn’t have subheads, so added those. I don’t think we really needed them for most tabs, but for Equipment they seemed helpful, and having them on all tabs keeps the look consistent.

Widened the Cost column on the Library side of the Equipment tab of Classic View a bit.

Various places (including Campaign Log and some lists) were touched to show money values as $ rather than “Currency”, because “Currency” uses localized values, which is not correct for GURPS $.

* Manage Your Library

Added a buttom to allow duplicating the currently selected library.

Added a button to allow for browsing to a different User Books Folder.

Bits of Of and Except and Images


* Miscellaneous

Made a small visual change to the Save Body Type dialog.

GCA is now saving and loading the character’s body image to the character file (if it’s actually set to something other than the built-in default) as Base64 encoded data.

Updated Protection box in Unified View to work with embedded character body images.

Updated GetProtectionPaperDoll() routine for sheets to work with embedded character body images.

* Protection Dialog

Corrected a tooltip on the Locations tab.

Changed the Save To… button to Save Body… on the Locations tab.

Added a browse button for the Body Image on the Locations tab, allowing you to load a custom image directly.

* #any, #best, and #worst

In places that support the special directives #any, #best, and #worst in name extensions (currently GetItemVal, GetItemTextVal, @ItemHasMod, and Needs), I have expanded support to include the #none directive, to explicitly look only for traits with no specified name extension.

I have also added support for clauses to contract the acceptable pool of traits by the name extensions found, should you wish to do that. All the directives *excluding #none* support the new ‘of’ and ‘except’ clauses. ‘Of’ specifies the extensions that are valid, and only traits with one of those specified extensions will be considered. ‘Except’ specifies the extensions that are not valid, and only traits that don’t have a specified extension will be considered.

So, here’s a completely arbitrary and silly example of the needs() usage:

needs(SK:Animal Handling (#any of equines, big cats) = 12, SK:Animal Handling (#best) > 15, SK:Animal Handling (#worst except "raptors") < 8)

In this example, only the Animal Handling (Equines) or Animal Handling (Big Cats) skills will satisfy the need for an Animal Handling skill at 12 or higher, but any version at all will work to satisfy the need that some skill is over 15, and finally, the worst Animal Handling skill must be less than 8, but can’t be Animal Handling (Raptors) because that’s excluded.

The templates are like this:

#any [ of List ][ except List ]
#best [ of List ][ except List ]
#worst [ of List ][ except List ]

List is a list of the applicable name extensions for that clause. Enclose individual list items within quotes or braces if they include a comma or one of the other keywords. The ‘of’ and ‘except’ clauses should never have any reason to be used at the same time, but should you do so, order isn’t important as long as the clauses always follow the #keyword.

If it’s not obvious, #none doesn’t support the new clauses because it retrieves only traits without extensions, so there’s nothing to check against from the new clauses.

* Books & Data

Included updated book files from Eric.

Added the ‘bodyimage’ element to the gca5.xsd file, for the character’s saved body image (used for the protection paper doll).

A little bit’s notta lot but it’s better than notta bit


* Miscellaneous

Rewrote the routines for encrypting/decrypting the saved login creditials for getting updates. It now appears to work as intended, but your first new usage will still show messed up text (or nothing, if it was so messed up it caused an error in the new routine).

Added a ‘Force Update’ option to the Help menu, which will force GCA to see any available update as a new update, allowing you to effectively force a reinstall using the update system.

Standardized the round() tag a bit for more consistency across attributes and modifiers. You can now specify ‘up’ or ‘1’ for rounding up, ‘down’ or ‘-1’ for rounding down, and ‘no’, ‘0’, and ‘none’ for no rounding. Note, however, that modifiers only actually support rounding up or down, so any usage they see that isn’t ‘down’ or ‘-1’ is the same as ‘up’ or ‘1’.

Discovered that the default setting for rounding modifier calculations was different between traits and modifiers, when calculating modifiers that applied to the owner. For traits, default handling of modifiers was set to round up, while for modifiers, default handling of modifiers was set to round down. I have changed the default for modifier’s modifiers to be round up, as it was with traits. Of course, if there is a round() tag on the modifier, it will continue to honor that setting.

Fixed a bug that was causing trait symbols/flags to be lost when editing items from Unified View.

Fixed a display bug that was causing the trait edit buttons on a selected item in a Unified View box to continue to be displayed even when multiple items were selected.

* Substitutions

Added some robustness code to the Substitutions table creation routine.

Substitutions will now be seen as valid results in more places.

Hooked Substitutions into the Affects cross-linking system, which should allow for the same immediate results to be visible when making changes as there are normally. (Without this, for example, Trait A might find and base a Needs requirement on Trait S, which was found because it substitutes for the Trait B specified in Trait A’s needs() tag; but when Trait S is changed, Trait A wouldn’t be notified that something it depends on was changed.)

* Needs checking

I have added support for using the special directives #any, #best, and #worst in the name extensions in needs() items. These are supported for any traits that are properly identified with the correct prefix tags, and that have a valid base name.

GCA will assemble a list of all traits of the correct type that have the given base name, and then process them in this fashion:

  • #any – all traits will be evaluated and used to test the condition, but only until the first trait found that satisfies the given condition; or until all traits fail.
  • #best – all traits will be evaluated, and the one with the best (highest) value will be used to test the condition.
  • #worst – all traits will be evaluated, and the one with the worst (lowest) value will be used to test the condition.

Obviously, this only works for numeric values and conditions that evaluate numeric expressions. Inactive traits are not valid, and won’t be considered.

Bits of mish and mash


* Miscellaneous

Double-click to sort trait lists has been changed to single-click to sort, when on the column headings of the trait lists.

The old, temporary, feature of double-clicking the trait list title to summon the context menu has been removed, since the context menu has since been incorporated into the Traits menu on the main menu bar.

Somewhere in the work on the Campaign Log in an earlier build, it appears that a calculation step was lost, so GCA wasn’t including newly logged points when recalculating Unpsent Points, as it should have been. That should be fixed.

Added Money to the Points bar after Equipment. (This value may currently be rounded off.)

GCA will no longer ‘redline’ the Equipment value on the Points bar if the Character In Play checkbox is checked.

Due to some oddness in the design-time functionality of the third-party control used for Print Preview, such as is used in Sheet View, I’ve had to remove the design-time component, and now add it procedurally during program startup. If you notice something not working anymore in Sheet View, I probably missed hooking back up an event handler, so please let me know.

* Campaign Settings dialog

Made some changes to the appearance/structure.

Addressed a math issue.

* General Info box

A Transform drop-down list will now appear under the Race field when the user has transforms, to allow switching between them.

A field for “Campaign” has been added below Player, for the name of the campaign.

The Character In Play checkbox has been added.

Fixed some display issues when zooming.

Replaced the General Info section in the middle of the Attributes tab of Classic View with this box.

* Plug-ins

I have added the

Event RequestRunSpecificOptions(sender As IPrinterSheet, e As DialogOptions_RequestedOptions)

to the IPrinterSheet interface. As with the IExportSheet interface, this allows the sheet to request run-specific options to be set by the user, if desired. This is intended to support things that might need to be handled on a per-print basis, but you don’t have to use it. Sheets WILL have to be updated to support it, though, even if you don’t use it, since it’s part of the interface. Just include this line:

Public Event RequestRunSpecificOptions(sender As GCA5.Interfaces.IPrinterSheet, e As GCA5.Interfaces.DialogOptions_RequestedOptions) Implements GCA5.Interfaces.IPrinterSheet.RequestRunSpecificOptions

after your Implements GCA5.Interfaces.IPrinterSheet declaration, and you should be good.

I have also updated the third-party controls. This breaks sheet plug-ins, which will have to be re-compiled against the new versions. Since I changed the Interface module too, things were already in need of recompilation.

From past experience, updating the third-party controls can also lead to strange behavior in GCA if some things are a little incompatible. This might affect the tab controls, the grids in Advanced Edit and maybe a couple other things.

All included plug-ins have been updated and recompiled as necessary.

Bits of melted brain


* Miscellaneous

Altered a parsing routine to fall in line with how my parsing is intended to work these days. (Intention is: when matching containers, you can include a mis-matched paren or brace within quotes, or a mismatched paren inside braces, but can’t include any mismatched quotes anywhere. GCA’s older code is currently rather inconsistent as to when it’s honoring matching quotes, braces, parens, just two of those, or all three. I’m trying to fix that as I come across it.)

Added a new set of parsing routines that should simplify processing many of the keyword-clause based features.

Added Bonus Classes to Resynchronizing.

* Solver

Updated the GetItemVal routine, and the @ItemHasMod() function handling. Both should now support the ability to find a trait with various possible name extensions, using the base name and one of several special directives in place of a name extension: #any, #best, #worst. So, if you have several possible Flight advantages, but any one of them works just to say that you have Flight, you could use a reference like “SK:Flight (#any)” to find any of them.

The values work like this: #any will return the first valid non-zero trait with the given name; #best will return the best (highest non-zero); and #worst will return the worst (lowest non-zero). Note that #best and #worst can be tricky, and should be used cautiously, as results may not be as expected in all cases, depending on what tag or value you’re looking for.

Notes: The intention here is to allow for accepting variations of a trait via name extensions. Only numeric values can be judged.

Also updated the GetItemTextVal routine. Should be smarter about duplicate and inactive items now, and support #any, #best, #worst; although because it returns text, there’s no good way to determine best or worst, and it therefore treats all of them as #any, where any non-empty value satisfies the request.

* Bonuses

Reworked the routine in the Bonus object that converts the given bonus text into the proper bonus data. This uses the new parsing routines, which means we can now allow for any of the different clauses to be used in any order within the text; just the actual bonus part needs to be listed first, as before. For example, you could now use

gives(+2 to “SK:Acrobatics” when “on Earth” listas “native gravity bonus” upto 4 onlyif target::points > 0)

or you could use

gives(+2 to “SK:Acrobatics” onlyif target::points > 0 listas “native gravity bonus” upto 4 when “on Earth”)

and either should work correctly and without issue.

Note: spaces around the keywords aren’t required any more, except for the ” to ” and ” from ” keywords in the basic bonus block, but you must enclose other blocks in quotes or braces if they might include any of the other keywords: “onlyif”, “unless”, “listas”, “class”, “upto”, “when”. GCA will strip the containers after parsing. (Yes, parsing should now honor braces as well as quotes as containers for these clauses.)

* Bonus Classes

BonusClasses exist to provide rules for limiting bonuses from defined “classes” of bonuses. Bonuses include themselves in a BonusClass, and the rules for the classes are defined in the data files. Support is specific and limited at this time, but allows for limiting the total bonus levels applied from a class of bonuses to an item, or might prevent stacking, and so forth. At this time, Bonus Classes are applied only to addition/subtraction bonuses (whether variable or static) affecting only points or levels.

To include a bonus in a particular BonusClass, just use the “class” keyword and specify the name or names of the classes to which it should belong after that (in quotes/braces if needed) within the bonus text. It might look like this:

gives(+1 to “SK:Acrobatics” upto 4 class “Talents, Acrobatics”)

That would include the bonus as a member of the classes “Talents” and “Acrobatics”.

Here’s how you define BonusClasses in the data files:

ClassName, [ { affects | appliesto } { levels | points }] [ stacks { yes | no } ][ upto X ][ downto Y ][ best A ][ worst B ]

X, Y, A, and B can be expressions, and they’ll be sent to the Solver, but you can’t use me:: references because Bonus Classes aren’t tagged items.

Affects and AppliesTo (one word!) are synonyms, use the one you’re comfortable with, but don’t use both. Affects Levels means the class applies to bonus levels only. Affects Points means the class applies to bonus points only. The default is Affects Levels, so that’s what will happen if the Affects clause isn’t specified.

Stacks specifies if multiple bonuses from the same class can apply. Stacks Yes is the default behavior in GCA for all bonuses. Stacks No means only 1 bonus from the class will be allowed (usually the best one, unless you also specify Worst 1).

Upto specifies an upper limit on the total bonus value that may be applied by all bonuses in the class. If exceeded, GCA will create an Adjustment to apply, which will correct for the excess value. If Affects Points, do *not* include “pts” in the value.

Downto specifies a lower limit on the total bonus value that may be applied by all bonuses in the class. If exceeded, GCA will create an Adjustment to apply, which will correct for the excess value. If Affects Points, do *not* include “pts” in the value.

Best specifies the maximum number of bonuses that may be applied, and that the highest values upto that number should be used.

Worst specifies the maximum number of bonuses that may be applied, and that the lowest values upto that number should be used.

For example:

Talents, stacks yes upto 4 best 2
Acrobatics, stacks no worst 1

The Talents class allows stacking as usual, but limits the total bonus from Talents to 4, and only allows the best 2 bonuses (which, if totaling over 4, will have an adjustment created so that the net bonus is 4).

The Acrobatics class doesn’t allow bonuses to stack, and only wants the worst possible non-zero bonus to apply. Rough.

Notes: This can get conceptually confusing. Remember that any particular bonus will only be applied *once*, no matter the number of classes to which it belongs. If a bonus is excluded for any reason by any BonusClass rule, it will not be applied *at all* regardless of how many other classes it might belong to that didn’t exclude it.

A hodge podge of bits and bobs


* Transforms

Made an adjustment to the Transform Manager window so that the “All unassigned items” column will have the correct points.

Also, see the Solver section below.

* Updates

I have created a new Login dialog to gather your login credentials for downloading updates.

GCA will now save your credentials for downloading updates. They are encrypted. The new Login dialog has an option you can check to tell GCA not to save your credentials.

* Campaign Settings dialog

Changed the Other Settings box title to Tech Level.

Added a first draft of a Wealth & Money box to the right side.

* Miscellaneous

Added a couple more utility routines to GCACharacter.

GCA will now, for the time being, stick Features, such as those added by a template’s features() tag, into a simple Features collection on the character. (Nothing else being done with them, yet.)

I have added Money entries to the Campaign Log and related data structures. This allows for entering earned or lost money via the Campaign Log, just like you can enter earned or lost points.

For the time being, the Equipment: $XXX value on the Points bar at the bottom of the GCA window will now be offset by the character’s Campaign.TotalMoney value for purposes of hitting the ‘red’ value.

The following items have been made accessible through the character’s tagitem(), all for the corresponding Campaign values: “campaigntotalmoney”, “campaigntotalpoints”, “campaignothermoney”, “campaignotherpoints”, “campaignloggedmoney”, “campaignloggedpoints”. The ‘total’ values are the total of the ‘logged’ and ‘other’ values, while ‘logged’ is the total of all log entry values of that type (points or money).

Corrected text in Character menu from Multiplicities to Transforms.

* Solver

Updated the GetItemVal routine. Should be smarter about duplicate items now.

Updated the @ItemHasMod() function handling. Should be smarter about duplicate items now.

As an experimental testing feature for Transforms and inactive traits, the GetItemVal routine will now return a 0 value for any trait found that is inactive. We’ll see how this works out….

As an experimental testing feature for Transforms and inactive traits, the @ItemHasMod() function will now only consider traits that are not inactive. We’ll see how this works out….