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.

Mostly updating bits related to bits in the previous build (b129)

b129

Updated the Traits menu, and the right-click menus for traits on the Classic and Unified views, to allow setting Highlight colors of yellow, pink, magenta, lime, cyan, red, green, or blue.

Updated the Traits menu, and the right-click menus for traits on the Classic and Unified views, to allow Collapse/Expand of parent traits.

Updated the UI to include expanded/collapsed indicators on the tree for parent/child items. You can currently only expand/collapse using the menu options, however.

I have updated Paste for traits so that you can now paste Tags that may be on the clipboard as XML (such as when you copy them using Copy Tags or CTRL+SHIFT+C in Advanced Edit). Pasting Tags in this way replaces any existing tags with the same names, and pastes to all selected traits.

I have updated drag-n-drop in the Attributes box in Unified to allow you to rearrange the mainwin() order of the attributes by dragging them to new positions. (This only works when you are not currently viewing a re-ordered list in the box.)

It is now possible to cut-n-paste attributes. Duplicate attributes are still not allowed, so pasting an attribute with a name that already exists will be refused.

Type-to-search in the Classic Attributes lists should now update the search buffer display on the toolbar as other trait lists do.

* Sheets

My print sheets have been updated with support for highlight colors and collapsed parents.

Bits of a variety pack (b128)

b128

You can now delete attributes from a character. GCA will pop up a dialog that warns against it and asks for confirmation. The dialog will also tell you what other traits appear to be directly affected by that attribute, if any. You may then proceed to delete it if you wish.

The way that Attributes are Resynchronized has changed, so it’s a bit less of a special case than before. It first ensures that all attributes in the library exist on the character, and then it uses the standard system (as for the other traits) to resync all the attributes with the library. The standard system will then notify you of any traits that were not found. You can then keep or delete the unfound attributes as desired, depending on whether they’re unneeded or perhaps added by you.

GCA will no longer list all the traits that it’s examining as it does a Resync, but continues to list all the exceptions.

Toolbar now shows a full recycle bin when a trait has been deleted from the character.

Created and included an alternate image for the full recycle bin.

Added some additional procedure header docs to a bunch of routines in GCATrait, and added a couple new helpful properties.

I’ve updated the GCA UI code to support any predefined color as an option for the highlight() tag. GCA will use the name of the color to derive the highlight that is drawn, with a transparency value of 100 (out of 255). The predefined colors that can be used are shown here . If the tag is highlight(yes), GCA will pick yellow as the highlight color. I will be updating the UI soon to support picking the traditional highlight colors of yellow or pink, plus the additional options of red, blue, or green.

Added hideme() tag. This uses the Solver to return a numeric result. If zero, hide() is removed, otherwise hide(yes) is added to the trait.

Added highlightme() tag. This uses TextFunctionSolver to return a text result. If the result is empty (“”, nothing), the highlight() tag is removed, otherwise the result is placed into the highlight() tag.

Added collapse() tag for parents, to indicate if children are intended to be shown or not. This is currently a flag tag, but I’m wondering if there shouldn’t be values to show certain children for special cases. GCA currently supports the tag, but the UI currently does not provide any means to set/unset it.

Added collapseme() tag for parents. This uses TextFunctionSolver to return a text result. If the result is empty (“”, nothing), the collapse() tag is removed, otherwise the result is placed into the collapse() tag. Currently collapse() is a flag tag, but this uses the text functions in case I decide to add special cases later.

* Sheets

My sheets do not yet provide support for any of the new tag features, but I will be including it soon.

* Updater

I discovered that the licensing issue that caused me to have to reinstall all my ComponentOne tools affected the PackageUpdater, which I’d overlooked. I’ve rebuilt it, which should fix the issue. If the Updater crashes when trying to Unzip, you’ll have to update manually because you still have the impacted updater files.

* Basic Set

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

* Installer

Because of the way Windows handles permissions for the ProgramData directory, the setup program now alters the permissions for GCA’s specific ProgramData folder during installation.

Body bits (b127)

b127

Custom body image selections, either from the drop-down or from the Open button, in the Protection window were not being properly assigned to the character, which prevented GCA from using them correctly in other places.

The tool tip on the Protection window for loading a custom body image had the wrong text.

When the All Unassigned Items loadout was active, the print sheet protection graphic didn’t show protection boxes in the correct places. Now it does.

I made some dumb coding decisions when the initial work was done to embed images within the character. This resulted in the loss of the associated image filename for body images when interacting with the body in the Protection window, and meant that saving the body out to a file didn’t save the associated image file name correctly. That has now been fixed.

Removed Force Update from the Help menu, as it no longer serves a purpose.

Removed some additional code related to the old updater.

Moved some control constants from the main form to a module.

* Plugins

I had to update the ComponentOne components again, which may result in your compiled plugins needing to be recompiled.

Looking Back at 2020

Things continued to move in fits and spurts over this last year (and through 2019 before that).

I made some good progress on various things, and the engine is looking solid to me. There are definitely some things that still need work, but nothing that I can see stopping us from doing a larger-scale beta test to help shake out issues in the core. Ugh, so close I can almost touch it.

Anyway. A pretty standard year, I think. Sorry it’s taking so many of them.

Happy holidays, everyone!

Updated the updated updater bits (b126)

b126

I have changed where GCA stores the system data, such as books and images. Such files now go into ProgramData. This allows for updating them without requiring elevated permissions to do so. The setup program and GCA have both been updated to use the new location.

GCA has been updated to send name and zoom info to the Package Updater.

I’ll still need to do something to remove Installed Package information when uninstalling GCA, so that the stuff that has actually been installed or uninstalled by the Setup program doesn’t hang around.

* Updater

The Package Updater should now only use PackageUpdaterElevated when it actually needs to update something in a protected location (Program Files), which should be much less often now.

If there are no updates available for installed packages, the Package Updater should now quit automatically and return to GCA if it was run as part of GCA’s startup.

The Updater system now stores installed packages in ProgramData\installedpackages\ with a folder and manifest for each package. This allows Package Updater to remove exactly the files that were installed if optional packages are being uninstalled. This also allows for obsolete files (those that are no longer included in a package) to be removed as an update.

When you click OK in Package Updater, it will now exit if you haven’t selected anything for it to do.

The update blocks in Package Updater now show the More Info links if they are set in Package Builder. They also now show the Details button, which will launch a dialog with details on exactly what files need to be updated.

The update blocks in Package Updater now show an error message if source files needed for updates weren’t found or were found to be the wrong ones.

Package Updater now supports changing its name as instructed by the calling program, and supports zooming if the caller provides the zoomed font size.

Rebuilt the update bits (b125)

b125

* Miscellaneous

Updated my BBCodeSurfaceEngine with a PlainText function, which returns the text stripped of the BBCodes.

Updated MiserBBCodeLabel with a PlainText function, and now use the PlainText as the AccessibileName of the control.

Added some image features to MiserOptionsBlock, and updated MiserWarningLabel’s image features a bit.

* Updater

I have created a new Updater system. Things may be a little rough, still, but it looks to be working mostly as intended. The system is a couple parts: a Package Builder and a Package Updater.

The Package Builder is currently working well enough as a tool for me and/or Eric, to create packages of files for required or optional updates.

The Package Updater is the piece that will do the hard work of checking for and installing updates. It also provides access to the selection of Optional Packages that may be installed by users if they want them. This actually includes two EXEs, the PackageUpdater, which does the work of evaluating, downloading, and unzipping; and PackageUpdaterElevated, which just operates as an elevated permissions copybot to move the files to their destinations, or deletes files and folders for packages that are being uninstalled.

This system, which is mostly separate from GCA, makes it much easier to manage. It’s still missing some features that might be nice, and working with it is a bit clunkier for the end user than before, I think, but I also think the general operation, and ability to maintain the packages, is far simpler and easier.

So, GCA is now updated to work with this new system. I have also removed some files from the standard installation and turned them into Optional Packages instead. Be aware that you may suddently be missing things that you had before, if you used Eric’s images, 3rd Edition files, or my Color Block Sheet. Be sure to Check for Updates, and click the Optional Packages tab, to select and install those features!

* Plugins

I have updated the ComponentOne components, which may result in your compiled plugins needing to be recompiled.