Author Archives: Armin

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.

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.