Category Archives: Build Notes

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

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.

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.

Tightened some slipped bits (b124)

b124

If multiple locations were specified for a piece of armor, and those locations overlapped (such as ‘full suit’ and ‘neck’), GCA5 threw an exception and died. Instead, locations specified later in the list are supposed to apply more specific armor values. For example, location(full suit, neck) and dr(4/2) should apply ‘4/2’ to all locations covered by ‘full suit’ and by ‘neck’, even though ‘neck’ is covered by ‘full suit’ and the DR is the same; if instead that dr() tag was dr(4/2, 1) then locations covered by ‘full suit’ should all get the ‘4/2’ value, while ‘neck’ should only receive the ‘1’ value. This should now be fixed.

Armor with multiple locations was also counting each location as another layer. That is now fixed.

Added entries for postformulacost, postformulaweight, prechildrencost, prechildrenweight, preformulacost, and preformulaweight to the tagdefs.xml file.

Bits just chucked in (b123)

b123

(A quickie bug fix to the PushRecalcItems routine was made. The fix changed two casts from object into GCATrait into ICollectibleObject instead. The program was recompiled, a replacement installer was built, and then b123 was re-released.)

Added support for scopeacc() and charscopeacc(). The scopeacc() tag reflects the bonus to acc that derives from a scope or similar such aiming aid. The charscopeacc() tag holds the bonus after any bonuses to scopeacc have been applied. The charscopeacc() value will now be used to create the suffix value for the final characc() tag, so acc(2) and scopeacc(2) with a ‘+1 to scopeacc’ bonus would result in charscopeacc(3) and characc(2+3).

Added ‘fencingweapon’ and ‘charfencingpenalty’ to the tagdefs.xml file.

There is a piece of the Trickle code that I had disabled because it seemed to be obsolete with the way GCA tracks things these days. Turns out I was mistaken, and it has been restored.

* Target Tag bonuses

Changed the method that GCA uses to keep track of target tag bonuses. Previously, it was a mass of individual flags. It’s now a dictionary that tracks what tags are being targeted for bonuses. You shouldn’t see the difference, but it will be considerably easier to adjust for supporting new target tags later. If I made a mistake, you’ll see some bonuses fail to be applied.

With the change in target tag bonus tracking, it’s possible to see if a bonus exists for any tag on a trait, even one that’s not supported as a targetable tag, or even for tags that don’t actually exist. So I have added some functions to grab the bonus values targeting any desired tag, so you can make use of them. This allows for you to make use of custom tags and custom tag targets to handle custom situations you could not handle in the past.

The new functions are:

@bonusadds() – Returns the total of all add and subtract bonuses/penalties targeted to the given tag, or 0 if there are none.

@bonusmults() – Returns the multiplicative total of all multiplier functions targeted to the given tag, or 1 if there are none.

$bonusstrings() – Returns the concatenated string of all text bonuses targeted to the given tag, or an empty string if there are none.

* Setup

I have switched to a new program to create the installer. This should avoid the issues I identified with using the Updater to update program files installed by the MSI install system. However, additional testing is still needed.

This installer doesn’t currently have a way to check for, and install if necessary, the .Net Framework 4 system files that are required. Most people should already have those, as they come with Windows, but some may be missing. That’s still something I’ll have to figure out.

A bit of something or other (b122)

b122

Added support for parent:: as a target for bonuses and as a reference in the solver, so you can do something like having a scope as a piece of equipment that is added to a rifle as a child, and then grant a bonus to that parent rifle’s acc. This will work for both the parent/child and the meta-trait/component relationships.

Added support for child:: as a target for bonuses, so you can have a parent that grants the same bonus to anything that is made a child of it. This will work for both the parent/child and the meta-trait/component relationships. This is not available as a reference in the solver because there’s no way to resolve what child of many may be intended.

Techniques are not limited by the Rule of 20, but GCA5 was doing so. GCA4 did it correctly, so that was broken during some rewrites at some point. That error should now be fixed.

Clicking inside the Library Traits listbox but not on an item caused a crash, which is now fixed.

Added PreferredRTFMinimumFontSize to UIConfig, to help set a minimum floor for the font size used in RTF displays. Currently works for most things sent to ViewInfo and the Log. (No UI for this option yet.)

You can now drag-n-drop character files onto GCA to open them.

You can now drag-n-drop image files onto GCA to set the current character’s portrait, or onto the Portrait window to set the image there. Note that since GCA only supports a single portrait image, if you drop multiples only the last valid image will be applied.

I noticed that if you’re using the “GCA5 Symbols.GDF” book, and are using a large library, it can take forever to process symbol assignments. (For example, a full GURPS Dungeon Fantasy library has over 6000 traits to examine; that takes approximately 12 years.) I now have GCA printing “X% complete” lines into the Working window at intervals, so it’s clear to the user that GCA hasn’t crashed. Luckily it only needs to do that when initially loading/building the FastLoad files. (I’ve also noticed that a bunch of the items in the file refer to the _Cinematic.png which we don’t actually appear to have.)

Hurt myself a bit during this build (b121)

b121

Removed some obsolete code.

In #Choice and #ChoiceList handling, I made updates last year to improve type checking, and while doing that also changed the type of collection being used during the processing of the various lists. That change used a new collection that, it turns out, didn’t properly handle being used without also using unique keys. Since the usage here doesn’t use unique keys, only one item was ever being added to the collection. I have updated the collection in use so that it should now work correctly when used without keys.

* Gains Bonuses

I have finally updated Bonus to track gains bonuses with separate From values, rather than overloading the Target values. This should allow for gaining a bonus that can be applied to a target tag on the gaining trait. Doing this requires explicitly including the previously implied ‘to me’ clause, like so: gives(+1 to me from ST:Magery listas “I’m a spell. Really!”). You’d then just use the standard “me::tag” format to target a targetable tag.

Updated the code in various places for the change in Bonus when the bonus is a gains.

* Bonus Builder

Fixed an initializing issue with some object references.

Updated Bonus Builder to read better when the bonus is a gains.

* GCA5.xsd

Added the fromX elements for gains bonuses to GCABonus.

A bit less (b120)

b120

GroupedTraitListBuilder would return no results if the character had no grouping options set for the given trait type. It will now return the no-match (“”) collection, filled with all the valid traits, as the only entry in the GroupedTraits dictionary. This makes more sense.

I don’t see any reason for the NoRestart option for Updater to not be working. I made a couple small changes in GCA and in GCAUpdater that shouldn’t really change anything, but we’ll see if it fixes it.

Removed some obsolete code.

* Files

ColorBlockSheet and OfficialCharacterSheet, as well as the IPrinterSheet interface, have been reverted to use C1PageSettings.

The XML help files for the GCA components should now be included in the distribution. This should allow for users writing plugins in Visual Studio to have what XML help I included in the system to be available within Visual Studio intellisense. I think.