Category Archives: Build Notes

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

A bit from feedback (b139)

b139

Added a Filter pane to the Library list used by Unified and Sheet views. This allows restricting the display of traits in the Library list based on text entered into the filter text box. The filter is applied based on the names of traits, and is case insensitive.

Added an option to the Library list gear menu to show/hide the filter pane.

* Data Files

Body types have been updated to include a Skin location group. All locations except Eyes belong to this group.

Updated Damage Resistance in Advantages and Templates to use the new Skin location, instead of the incorrect All location.

Bits and bobs addressed from the public Beta Preview (b138)

As a note: The public Beta Preview releases are 5.0.1.X, but that X will be the same as a previous private build. So this b138 will not be seen as a public release unless it’s listed as 1.138. That may happen, or I may have another private build first. We’ll see.

b138

There was a bug in the code that returned thr and sw damage, which didn’t allow it to find a ST of 1, so it was treated as a default value. That is now fixed, so ST 1 now returns the proper values.

Fixed a bug in Build Campaign Book that crashed the program when pressing a key in the trait list.

The ‘check for updates’ period was set to 0 by default. That should not have been 0, since that’s ‘disabled’. I set it to 30, but that won’t change the value for people who have already used GCA. If you want to periodically check for updates automatically, please go into Options and change the Check for Updates value to your preferred period.

Updated the Resync code to restore the base value of Tech Level to the character’s Campaign TL.

Updated the FastLoad file version, because I made some changes to what goes into the FastLoad files.

GCA will now track when a book sets a library settings value. This is necessary so that GCA can determine what action it needs to take when the user changes one of the related settings in the Default Character Options tab of Options. Since settings can be set inside a book, library settings are saved in the FastLoad file. However, not all settings are set by the books, so the default values end up getting saved to the FastLoad. If a user changes a default setting, then, GCA needs to know if it can safely change that setting and save it back to the FastLoad file, or if it should ignore the change to the current library because the value was set by an included book.

GCA will now check if the defaults are different from the settings in a Library after it is FastLoaded, and set those values that are using out-dated default values, but not those set by a book. If changes are made, the Library FastLoad is re-saved.

The Options dialog has now been updated also, to have each currently loaded library check to see if any changed options affect it, and re-save the FastLoad if so.

* LaunchCodes.XML

Adjusted Acrobat to use /n option, which always opens a new instance. This is because Acrobat will otherwise just bring-to-front the current instance, but not actually change to the desired page.

* BookCodes.XML

Adjusted Basic Set to have a page offset of 1 instead of 2, as that apparently changed over the years.

* RTF Display Info Templates

Updated to use fixed + values for changes in font size, instead of multiples, to account for issues with internationalization.

* OfficialCharacterSheet

Updated display of TL to use Char.TL.

Added two options: 1) print default bite/kick/punch attacks, True by default; 2) print item notes for attacks, True by default.

* ColorBlockSheet

Updated display of attributes to use DisplayScore

* Dungeon Fantasy RPG.gdf

Added “NoDefaultLevelDiscount=Yes” to Settings block.

Changed a tiny bit of my mind (b137)

b137

I’ve changed the ‘objects’ that can be interacted with in Unified trait boxes when a trait is selected. I’ve decided to remove the Delete button that was being shown and instead allow the user to click the + or – symbol next to a parent to expand or collapse the child list. It just seemed to make more sense to do that. I have not done that in Classic because Classic didn’t already have a built-in system for putting objects on selected traits.

Package Updater updated to support an update block that is a ‘message’ but doesn’t try to update that package itself.

Package Updater should now correctly display the description of a package even if there is an update for it.

Some of these bits, some of those (b136)

b136

Found and fixed an issue where GCA was not correctly tagging plugin controls found in the user’s plugins folder as controls.

Forgot to have GCA save/load the setting for gutter widths. Now it does.

Fixed the drawing code for character lists so that it no longer overrides the selected item color with the ‘touched’ color if ShowMeDirty is on.

Made some adjustments to the internal MiserOptionsBlock control to improve performance.

Added the EncumbranceMoveAdjustment() function to GCACharacter. This returns the current adjustment factor based on the current encumbrance level, as a math string. For example, at encumbrance level 1, Light, it returns “* 0.8”. These are currently fixed, but the plan is to allow them to be set by campaign settings or data files in the future. You can also request this text value from the character’s tagitem() function using any of these tags “encumbrancemovefactor”, “encmoveadj”, “encmovefactor”, or “encumbrancemoveadjustment”.

Many, many builds ago we added support for the drnotes() tag, to include non-mode-specific notes about the DR of an item, as is often used for split DR to explain how to use the second value. I did not implement support for displaying the DRNotes anywhere in the UI, and over time I simply forgot to go back and do that. I am doing that now.

The Protection box on unified has been updated to display DRNotes in its lists when appropriate. It has also been updated to resize its lists a little less jankily, and to support displaying info in the Info display for the currently selected protection item.

The Protection box has been updated to allow double-clicking a list item to launch Edit.

Broke out some of the stuff in Loadout calculations into separate routines to make maintenance easier.

Found an error in book file processing where a new body definition did not correctly replace an already loaded one with the same name.

I’ve made the Resync dialog rememeber its positioning, and changed the text slightly.

After GCA4 characters are loaded, GCA will now pop up Resync dialogs for those characters.

Added a new line to the Party tab explainer about the experimental and unfinished state of the tab.

Fixed a crash-bug in the character card designer for the Party tab.

The Edit dialog will now display location, DR, and DB values in an Armor block for traits with DR or DB.

* Loadouts and Armor

I believe I have the first experimental handling of complex split DR working. I implemented it based on the idea of the split DR looking like 7/19pi/19cu/5bu/5cor/3cr.

The new process within GCA will take that type of value for all applied armor and it will combine like protection types when armor stacks, and use untyped protection where no like-type protection is found.

I decided on this method as being the most direct, easiest to understand, and simplest to expand. GCA will happily type any text that follows a number in the DR splits, so you could add ‘cosmic ray’ protection or ‘ghost’ protection or whatever. (If I was to expand this to DB as well, you could have something like reflec armor that provides DB versus lasers but nothing else, for example.)

Right now, most split DR is simply listed as two untyped values. That’s not helpful to this process, so GCA will label the second of the two untyped values as ‘[note]’ and proceed from there as above. The user can edit the split to reflect the intended damage type and get the proper handling, or leave it since ‘[note]’ tells them it’s for the type mentioned in the armor’s DR note–but that may result in incorrect combinations of ‘[note]’ values if they weren’t meant to be the same type.

* Protection dialog

The armor and layer lists have been updated to display DRNotes when appropriate.

Added a note that is shown when stacking rules prevent the application of some values from Deflect or Fortify to location.

Added an explainer to the Armor & Shields tab to explain that you have to uncheck the Always auto-calculate box and also deselect all armor in the Apply Armor list in order to enter your own protection values, instead of having GCA calculate them.

I’ve added a checkbox to allow the protection image to be scaled to fit the display area.

I have updated the protection image display and refresh code. It should be smoother now.

I have updated the location boxes displayed on the protection image to something I think is much nicer. These boxes will also display little icons when there are issues with layers, or with Deflect or Fortify stacking.

* Sheets

Color Block Sheet updated to print DR Notes in the protection display.

I haven’t figured out a good way to update the Official sheet yet.

I adjusted the GetProtectionPaperDoll() function to include a line break before DB if DB is included in a box value.

More bits of plugins and other stuff (b135)

b135

GCA should now be saving and loading the system color settings.

The System Colors dialog now supports importing colors from a prefs file.

The System Colors dialog now supports exporting colors to a prefs file. To export, you must provide a profile name so that the color scheme can be imported in the future using that name. Supports exporting to an existing prefs file without overwriting the other contents of the file, but will warn if you might overwrite system colors with the same name.

Updated the Plugins dialog to support control plugins. Enabling or disabling Unified boxes should take effect once the dialog is closed.

Updated some of the code related to disabling and managing disabled plugins to be able to better handle controls and built-in plugins.

Adjusted the setup for the Sheet Options dialog so that it will no longer accidentally include control plugins in the sheets list, as those are not intended to be included (both because controls don’t support profiles and because controls are instantiated as possibly multiple other objects with the plugin itself being more of a template).

Added more xml doc headers to various procedures in various places.

Added more explicit type conversions in more places and removed more obsolete code blocks.

Adjusted the Simple Options dialog (the one used for run-specific options for Export Sheets) to allow for it to serve as the Options dialog for the control plugins.

Updated the IUnifiedViewBox interface.

Control plugins can now raise the ShowOptions event to tell GCA to call up the Options dialog with the options sheet for that control. Once the user has interacted with the dialog and closed it, GCA will call SetOptions so that the plugin can apply any changes. Note that these plugins are welcome to manage setting of the options themselves through their own UI, and simply use the sheet options that GCA implements to persist those options between sessions. GCA will save control plugin options when it shuts down, and it loads them when it instantiates controls during startup. (These options are saved in SheetOptions.prefs, while the simple settings that GCA manages for its own use, such as visibility on the form or column spanning, are saved in gca5.prefs.)

Updated the attack modes boxes to allow setting some options through GCA’s plugin control options dialog.

Updated the sample Attack Modes Box – External plugin to allow setting some options through GCA’s plugin control options dialog.

Updated the trait list boxes to once again support turning on/off shading of alternate lines.

The Gives Builder in Simple Edit should now only appear when Show All Fields is turned on.

The Where It’s Kept section for equipment should now appear higher up the form on Simple Edit.

Moved the code for saving and loading settings for the various objects that handle user-settings into the objects themselves, where it should have been all along, instead of in GCA’s main code.

The color settings saved to prefs files has been altered slightly, so that the saved color within the brackets, if not a named one, will now use my preferred “&FF00FF” hex color format instead of the previous “Color [A=255, R=255, G=240, B=255]” format.

* Trait Lists

Added a couple lines of code to allow formatting the display of weights and dollar costs for equipment items in the equipment trait lists. I don’t yet have support for it in the UI anywhere, but in the gca5.prefs file, the entries look like this:

FormatWeights = False
WeightFormat = ##,##0.00
FormatDollarCosts = False
DollarCostFormat = ##,##0.00

Change the False to True and GCA will use the format entries for the displayed values in the equipment lists. The Format values use the .Net Format() codes (as per Microsoft.VisualBasic.Strings.Format). The defaults shown here display two decimal places for each and always show at least one digit to the left of the decimal point.

* Color Block Sheet

Updated description to refer to Unified view rather than Compact view.

Bits or bytes of plugins or colors (b134)

b134

NOTE: The placement of the new System Colors toolbar button on the 1st toolbar will mess up your toolbar placements if you have them running linear as I do. I’m sorry about that.

NOTE: Your Unified boxes will be in a different order because they’re created in an entirely different way. Once you adjust the order using the new Unified View Layout dialog, they should keep that order.

The floater window should no longer get focus briefly when it appears, which should prevent unnecessary refreshes of the main window.

Adjusted the way the General Info box handled typing (in Unified and on the Attributes tab of Classic), because it was tedious to enter text into the Name or Player boxes. Changes should now perpetuate throughout the interface only after you’ve left one of those boxes.

Fixed some interaction issues between boxes and GCA that were disconnecting selected traits in boxes from what GCA thought the selected traits were.

Updated the IUnifiedViewBox interface.

All of the boxes in Unified view are now created from plugins. All of the plugins used right now are currently built into GCA. Support for externally compiled control plugins is available, and I have created an externally compilable version of the Attack Modes Box as an example. It is just a class-name-altered version of the one I’m using internally, which was built starting from a user control. This allows it to serve as both an example of a control plugin for Unified View and a control plugin based on a Visual Studio generated user control.

All of the places that use Unified boxes, such as dialogs and Party boxes, now use the plugin versions. The old versions have been removed.

I do NOT yet have a UI for user adjusting of SheetOptions for the new control plugins. GCA will get, process, and set the options, but they’ll currently always be the defaults as provided by the plugin, because of this lack of UI. I’ll get to that soon. For now, certain things that GCA tracks itself for each plugin, such as column span, visibility, and display order, are the only things saved, due to being external to the plugins themselves.

I have changed how GCA tracks and stores color information for boxes and traits and such. GCA now tracks these settings functionally and various features can grab the color set that they want from the system. This is different from before, where color settings were created based on the boxes that might need to have colors set by GCA. Now, GCA has a fixed set of color profiles available, and the controls access the ones that they want.

Everything in GCA should now work with the new color system. It’s entirely possible I hooked some things up to the wrong colors, however, so if you see something that looks weird, please let me know.

I have corrected some drawing issues in some of the Unified boxes where spacing was wrong or where colors were the default system colors instead of GCA’s internal colors.

The Classic Attributes tab should now properly clear the center column info when there is no character loaded.

I adjusted various bits of code to adapt to how plugin versions of Unified boxes work. This involved some new procedures and some consolidation of others, mostly in frmMain.

As a result of the work on the new plugins, combined with the new color system, the Colors & Layout dialog has been removed, as has the button that called it up on the third toolbar.

I have hooked up a new System Colors dialog from a new button on the first toolbar.

I have added a new dialog for setting the layout preferences for the Unified view. This is effectively the replacement for the rest of the Colors & Layout dialog.

Added a new button dropdown-menu to the front of the Unified View toolbar. From that, you can set the flow direction of the boxes, or call up the new Unified View Layout dialog to set various available options for Unified.

Removed a bunch of unused or outdated code related to boxes, plugins, miscellaneous UI stuff, and the failed experimental attempt at unloadable plugins.

Fixed some display issues in the Options dialog, and in the main toolbars.

Renamed some classes, but I don’t think any of those were user-facing, so shouldn’t affect anything in the object model that plugin writers need.

Added the GetResourceImage() function, which returns a Bitmap, to enable plugins to more easily use image resources included with GCA.

Adjusted the Attack Modes boxes a bit to not needlessly rebuild themselves as often.

Changed the Attack Modes boxes to use the Other Traits color scheme, since I realized that attack modes aren’t really equipment-specific.

* Select() and SelectX()

The changes made last build accidentally disabled the ability to specify both an ‘atleast’ and an ‘upto’ value for pointswanted() and itemswanted(), so that has been fixed.

* Plugins

Huge breaking change!

There are conflicts in the way I had done the IBasicPlugin Interface and using a plugin that is also a Control. This is particularly annoying with Name.

So, the ReadOnly Properties Name, Description, and Version have all been changed to Functions of PluginName, PluginDescription, and PluginVersion that return strings.

Public Function PluginName() As String Implements GCA5.Interfaces.IPrinterSheet.PluginName
Public Function PluginDescription() As String Implements GCA5.Interfaces.IPrinterSheet.PluginDescription
Public Function PluginVersion() As String Implements GCA5.Interfaces.IPrinterSheet.PluginVersion

Please update your plugins to reflect this change or GCA will not load them.

If you are using Visual Studio to create your plugins, you’ll want to remove and then re-add your References to GCA5.Interfaces and GCA5Engine. (And if you have a printer sheet, and you haven’t done that for some time, it wouldn’t hurt to do C1.C1.Report.4 also.)

I’ve updated the included sheets for this.

I’ve also restored SimpleTextExport to a standard export plugin, instead of the experimental remote plugin for which support is now removed.

I’ve adjusted the code in ColorBlockSheet and OfficialCharacterSheet to handle upgrading settings a bit differently. Also, because nothing on that front has changed in a long time, I removed most of the code in that block, leaving just a shell for future use.

I’ve also adjusted ColorBlockSheet to use the new GetResourceImage() function, so it no longer needs to include the Resources image folder. (This did require updating compile.xml to add a reference to GCA5.exe and the header of the code sheet to Imports GCA5, if you also have a sheet you want to update.)

Uses bits (b133)

b133

When GCA outputs to the log that it found plugins, it now also lists their names and versions, to provide an easy way at startup to verify exactly what is being loaded.

Changed the code in Unified trait boxes slightly, to allow clicking an empty trait box to set the focus there, which clears active selections in other boxes.

Added some helper features to ModeManager: made the modes in ModeManager enumerable, added a function to get a sub-set ModeManager for all modes that have a value for a given tag.

Added the calculated tag charskillusedkey() to modes. This allows for more easily referencing the trait found and used for charskillscore() and charskillused().

Updated the Edit Modes dialog to properly show/hide the calculated values while also allowing the rows to be auto-resized to show long text strings.

Made some adjustments to the Edit Modes dialog to attempt to work around a bug in the grid that prevents user-resizing of the last column at times.

Hooked up hiding/showing the Edit Modes dialog explainer on the Edit Modes dialog and in Options.

When a Mode is in the clipboard as an XML fragment, in the same format as copied from the Edit Modes dialog, it can now be pasted to traits. A mode pasted in this way is tacked on as a new mode, with no value checking or any attempt at avoiding duplicates.

Fixed a bug related to some old code in the Colors & Layout dialog.

Noticed that GCA wasn’t saving/loading the order of the boxes in Unified as set in Colors & Layout. Fixed that.

Found a bug that would crash GCA and prevent it from loading if the Horizontal Page Override setting was On in Unified view. I’ve adjusted some of the form initialization code, which fixed it.

Added an option to opening and closing GCA. If the Shift + Ctrl keys are being held down when GCA starts up, GCA will not load most saved settings values. This should allow for a way to get GCA started if a rogue setting is crashing things, although all the other settings will also be lost. Likewise, if the Shift + Ctrl keys are being held down when the main GCA window is closing, GCA will not save the current settings. This allows for a way to avoid saving settings you changed but don’t want to keep.

Fixed an issue where GCA was keeping way more files in the saved MRU files list than was correct for the value set in Options.

* Select()

Select() dialogs will now return the number of items selected and the points spent, and the number of items unselected and points unspent when it’s possible to determine that, when the user finishes the dialog. This allows for referencing those values in other Select() dialogs down the line.

Note that if ‘atleast’ is specified for points or count, the unused or unspent values will always be zero.

To use these values, you will need to add a name() tag into the tag list for the Select(), and specify a name. If you don’t specify the name(), the default name is just the number of the Select() in the processing order (if you used SelectX() outside of triggers(), X will be the number, otherwise it’s counted from 1 with the first Select() dialog). You can then reference the desired value in the pointswanted() or itemswanted()/numberwanted() tags, just as you would with a #ChoiceList substition, using the name of the Select() and the desired value within % signs.

The variables are: %Xunspentpoints%, %Xspentpoints%, %Xunusedslots%, %Xusedslots%, %Xnumberunused%, %Xnumberused%.

The X in each is replaced by the Select’s name() value.

%Xunspentpoints% and %Xspentpoints% return unspent and spent points, respectively, for the specified Select().

%Xunusedslots% and %Xnumberunused% will both return the allowed number of picks that went unused, and %Xusedslots% and %Xnumberused% will both return the number of picks actually used.

So, a Select() with name(Alpha) would use %alphaunspentpoints% in a subsequent Select() pointswanted() tag to reference those unused points, maybe something like pointswanted(30 + %alphaunspentpoints%) to allow for those unused points to be spent here.

Of course, this means that math is now enabled for pointswanted() and itemswanted()/numberwanted().

Also fixed a bug in the Select() code while I was doing this, where the MaxCost was being set incorrectly when ‘exactly’ was used for pointswanted().

* Protection

Changing the text in the Description boxes on the Locations and Hit Table tabs will now remember that for the character, and for the currently selected Body Type or Hit Table while in the same session of the Protection dialog. However, opening the dialog again later will have the library versions of the descriptions restored, so if you choose a different option from the drop-downs, the standard library text will replace the text in the Description box.

Renamed the Locations tab to Body & Locations.

* Uses

Started integrating support for the uses() tag, as pioneered by Phoenix. Right now, this includes a floating window with the uses for all selected traits, but that likely won’t stick around.

Added a Uses block to the Simple Edit dialog.

All of this support is mode-enabled, so each of the tags mentioned here are mode-specific tags. Even a trait that otherwise would have no modes will have at least one mode to support the uses() system.

Support currently exists as a mini-subsystem within GCA, utilizing the uses(), uses_sections(), uses_settings(), and uses_used() tags.

Uses() allows for specifying how many uses (doses, shots, bullets, etc.) are available, and to create check boxes for them. The special variable ‘count’ is supported as it is for Phoenix.

Uses_sections() allows for specifying how many groups of the uses() check boxes to create, which are shown in different sections on the current display control. This was called usescount() by Phoenix, but I wanted to have all the sub-tags use underscores and thought this would more clearly show how I see it working. I have set up aliases in GCA to allow using the usescount() tag to access the uses_sections() tag data. GCA should handle that transparently, but will save it out to the save files as the uses_sections() tag.. The special variable ‘count’ is supported as it is for Phoenix.

Uses_settings() contains a uses() specific set of tags that specifies display and operational settings for the Uses subsystem and controls. These tags should be formatted exactly like any other tag list, separated by commas. For example: usersettings( selectioncolor(orange), trackusesbysection(False), uselargerboxes(True) ).

Uses_used() tracks how many uses have been used of the uses() available. If tracking uses by section, then this may be a list of numbers separated by + signs, such as ‘4+0+1’ to show that there are three sections, and there have been 4 uses used in the first section and 1 uses used in the last section. If not tracking uses by section, then even if you have different sections specified, all uses are consumed as if from one big pile. Tracking uses by section is currently the default behavior.

If you right-click on a Uses display, you should get the option to make changes to the block’s settings.

* GCA5.xsd

Updated for uses(), uses_sections(), uses_used(), and uses_settings() in the GCAAttackMode block.

Updated for charskillusedkey().

* tagdefs.xml

Updated for the uses(), uses_sections(), uses_used(), and uses_settings() mode tags.

Updated for charskillusedkey().

* Basic Set

In the Basic Set file, the Karate skill has an extra | in itemnotes() at the end, which results in an unnecessary second Kick mode being added. I haved added a corrected version of Karate to the GCA5 Changes.GDF file.

* Official Character Sheet

This now has options for printing the User Notes and/or Description tags for traits, settable per trait type in Sheet Options.

A bit more byte, really (b132)

b132

In Unified view, at some point the Encumbrance & Move box stopped updating the Loadout pulldown correctly when the Loadout in the Protection box was changed, unless some of the traits referenced within it had also changed. Since the pulldown is meant to always be the same in both places, that discrepancy has been fixed..

* Book processing

I’ve adjusted how loading category headers for some data blocks works. For blocks that are not traits, but use sections in the style, GCA will now allow a colon to be used in the category name instead of unnecessarily separating out a non-existent category/college code.

I’ve updated the code for saving GDF files from the Build Campaign Book tool so that it will save the new or updated [Bodies], [HitTables], and [Wizards] sections.

Made some minor adjustments for how a Body is now built in the Library, but the files themselves aren’t changed.

* Body processing

I have changed the way that a Library handles the bodies and the [Body] block. Instead of a huge list of body parts that belong to various bodies, the Library now manages Body objects, each of which has its own BodyPart collection; like how a Character handles it. This has required some changes in the Book loading code, but the Book files themselves require no changes.

You can also now specify a [Body] section in a Book file using [Bodies].

Because I went ahead and changed this, the code I previously shoehorned in for body descriptions is no longer necessary, but you still add a description to a body the same way: just put a line into the Body data like this: description(This is the description). It should be the only thing on the line.

* Body part definitions

I was annoyed at myself that there’s a mix of body parts/locations with or without appropriate spaces in the name, so I’ve standardized on having spaces in the names. (This was my fault, since the default body messed this up. I think the Humanoid Expanded body always had spaces in the part names.). This will have an effect on any item/trait with a location() coverage that uses a name without a space when now the name has a space, so we’ll need to update data files to fix those where appropriate.

The body parts affected by this (just the Humanoid ones since other bodies didn’t exist before): LeftEye, RightEye, LeftArm, RightArm, LeftHand, RightHand, LeftLeg, RightLeg, LeftFoot, RightFoot.

I’ve adjusted GCA5 Changes.GDF and the GCA5 version of GURPS Additional Body Types.GDF to fix the bodies defined there to use spaces as appropriate.

* Protection dialog

Added a box for the Description of the Body Type to the Locations tab of the Protection dialog.

Added a new tab for Hit Table to the Protection dialog.

Made a lot of changes in the Protection dialog for the new handling of Bodies, Hit Locations Tables, and per-Loadout images.

You can now set and change the protection image for each loadout, allowing you to customize as you’d like.

Fixed the grids in use to support the dialog’s Zoom mode.

Description fields don’t currently save any changes.

Hit Location Tables aren’t currently editable.

The buttons on the Hit Table tab are not working.

* GCACharacter

GCA now has an ImageStore object (a Collection of the new ImageReference object), and GCACharacter is using that for the BodyImageStore, which stores the various body images. When images are loaded, they’ll be loaded in the store and referenced as needed. This should mean that no image ever needs to be in memory more than once, no matter how many Loadouts may specify it.

The character now has a bunch of new or reorganized properties related to the default body and body image. These defaults are used when a new Loadout is created, and are used for the “All unassigned items” loadout, so changing those values in the Protection dialog will affect the default values. All of these properties are too esoteric to get into here.

* Saved Characters

With each Loadout able to have its own image now, the character file can get pretty large. (Actually, it was already getting pretty large with the various possible images stored inside.)

The existing experimental program option “Store character portraits within the character files” is now also used to determine whether or not the new Body Image Store writes the stored images out to the saved character file. If this option is not set, the images are not saved, and must be loaded from the file name references when first needed after a character is loaded.

GCA should also no longer be saving an image out to the BodyImage element of the file, since if it exists now, it should be found inside the Body Image Store.

GCA also now saves a Hit Location Table with each Loadout, and a default one within the main character body.

* Hit Location Tables

GCA will now read and store the HitTables block from data files. That block looks like this:

[HitTables]
<Quadruped>
description(Like a dog or a cow.)
roll(-), location(Eye), penalty(-9)
roll(3-4), location(Skull), penalty(-7)
roll(5), location(Face), penalty(-5)
roll(6), location(Neck), penalty(-5)
roll(7-8), location(Foreleg), penalty(-2), notes(*)
roll(9-10), location(Torso), penalty(0)
roll(11), location(Torso), penalty(0)
roll(12), location(Groin), penalty(-3)
roll(13-14), location(Hind Leg), penalty(-2), notes(*)
roll(15-16), location(Foot), penalty(-4), notes(*)
roll(17-18), location(Tail), penalty(-3), notes(T)
roll(-), location(Vitals), penalty(-3)
note(*), text(note text here)
note(T), text(other note text here)

Using a section with a HitTable name that already exists will replace the existing one with the new one.

There are three different types of data lines there, which shouldn’t be mixed: description, roll, and note.

I elected to separate notes() from note() like this so I could specify exactly the note markers for the notes to be used, rather than relying on GCA’s footnote system later. I figured in this case, where these tables are often printed in truncated form, it was better to use the same markers as might appear in the source material for easier book reference.

This is just data. GCA makes no effort to check roll ranges, or to verify that notes() entries match note() lines.

Each Loadout can specify the appropriate Hit Location Table to use. If a table uses the same name as a body type, it should be the default when the body type is changed. However, if the Body Type and the Hit Location Table name do not match, GCA won’t change the Hit Location Table to match the Body Type when Body Type is changed, because it’s assumed you wanted a different table.

* Data Files

GURPS Additional Body Types.GDF is now included in \books\, and includes both the Body body part definitions and the HitTables hit location tables.

FastLoad files will be rebuilt, because I updated a bunch of code related to [Bodies] and [HitTables].

* Plugins

The GCACharacter object model has had some changes with the work to support various things in this update, plus I made a couple things that weren’t properties into properties, so you’ll likely need to recompile any compiled plug-ins.

* GCA5.xsd

Updated for various new stuff.

Some bits friendlier (b131)

b131

The warning panel in Classic view that advises a resync when Character categories don’t match Library categories was appearing on all tabs even when the categories in that tab actually matched. That has been fixed.

Adjusted the Advanced Edit dialog’s tag info to honor the minimum RTF size.

Shoehorned in the ability to add a description to a Body. The old code for loading a Body and tracking BodyParts in the Library needs to be updated to better reflect how things are done now, but until then, I’ve just made it so you can add and track descriptions for the Body. To add a description, just put a line into the Body data like this: description(This is the description).

There were some legacy values GCA5 was tracking and filling for backward compatibility with GCA4 save files. These values were related to DR and PD for body parts such as feet and hands, which don’t exist on all body types. GCA trying to store those values was crashing the program. Since I no longer write GCA4 files, those compatibility values are no longer needed. Rather than trapping for the missing bits, I have removed the related code. Should I later decide to try writing a backward compatible save file, those features can easily be replicated through other means.

* FastLoad

FastLoad files will be rebuilt because I changed some of the data being tracked related to Body.

* Uses

I have built a new control to allow tracking of how many uses a trait may have, and how many may be used. This supports the uses() tag that the Phoenix sheet supports, and will likely add some additional support tags, such as uses_used(). *Not yet integrated into GCA.*

* ModeManager

Added two new functions MeleeAttackModes() As ModeManager and RangedAttackModes() As ModeManager. Each returns a ModeManager that contains the subset of the trait’s modes related to that type of attack. Remember that some traits may use features with modes that are not types of attacks.

* LoadOut

Added the function ProtectingLocation(Location As String) As Collection, which returns a collection of GCATraits that provide protection to the specified Location (aka BodyPart). Only returns traits that are *applied* in the current loadout!

* Body

Added functions AllLocations() and AllBodyPartNames(), both of which return a Collection of Strings which is all the body parts (aka Locations) in that Body.

Added functions AllVisibleLocations() and AllVisibleBodyPartNames(), which are the same as above, but only include body parts that are displayed on the body diagram.

Changed the Add(BodyPart) routine to not use an optional Key (it always uses the BodyPart CollectionKey now).

Added the CollectionKey property to the BodyPart object, to match most other objects, which returns the CollectionKey for the object (in this case, the lowercase Name).

Added a Contains(Location) function to return True if the location is one contained in the body.

Added properties for both Name, so the body can know itself, and Description, so the user might know more about it.

* GCA5 Changes.GDF

Updated to include a couple body types with dummy description() tags for testing.

* GCA5.xsd

Updated to reflect changes to Body.

Sweeping up the bits (b130)

b130

Updated the code for pasting modifiers and tags into traits to ensure that the targets are marked dirty and will redraw immediately.

Updated the code for saving traits to save the recently added tags within the normal structure, rather than in the Extended tags block.

You can now use drag-n-drop in the Attributes list (on the left side) of the Attributes pane of Classic view to rearrange the mainwin() order of the attributes by dragging them to new positions.

Added a new option to the right-click menu for traits on the Attributes pane of Classic view, and to the gear menu on the Attributes box in Unified view: Create New Attribute. This will create a new attribute with a few possible options, but the user will have to do most of the editing to fully flesh out the attribute they want. This works by injecting a simple “new attribute wizard” into the system. The wizard is effectively a system trait, but attributes have no system lists to pick from.

Added a button to the bottom of the center section of the Attributes pane of Classic view to also add a new attribute.

Added a new section to data files which allows for creating system wizards using data file features. This section is called [Wizards] and must have a specific format where each category in the section is a particular trait type, such as . If this ever gets used for anything else, different trait names within each trait-type category would likely serve as the names of the various wizards for that type of trait.

GCA now reads the [Wizards] block and stores the data in the Library. This block is library specific, and is never saved within the character data. Support of this new section requires new FastLoad files, so those will be rebuilt as you use your libraries. NOTE: At this time, only the Create New Attribute wizard uses this data, and it currently uses only the first Attribute-specific wizard it finds, regardless of name.

Added a setting in the Options dialog for the preferred minimum font size for the RTF text displays.

Added an explainer to the Resync dialog, and adjusted the text at the bottom of the window.

* GCA5 Changes.GDF

Updated to include the new [Wizards] block with a copy of the built-in Attribute wizard for reference or replacement in your files.

* gca5.xsd

Updated for recently added tags.

* tagdefs.xml

Updated for recently added tags.