Category Archives: Build Notes

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

Molasses in Winter (b221)

I am SO VERY sorry that this build took so long to get out. I’ve been having some issues, but this still should not have taken this long. Official release should follow relatively soon if nothing significant pops up in the next little while.

* Miscellaneous

The Available Modifiers list in the Modifiers dialog will now show the calculation tiers for the modifiers in the icon column, as the Applied Modifiers list was already doing.

I think at some point in my revisions between the original attack displays for Unified View, and the new ones that I wrote during the open beta, I lost the code to display item notes for the modes. Everything was there except the few lines needed to assign them to the display. That is now fixed, and item notes are now shown. You can turn them back off in the Options for each box if you prefer not to see them.

Traits now save the tags baseweightunconverted(), baseweightconverted(), charammo(), and charammounits() as part of the trait’s XML calcs block.

Modifiers now save the tag description() as part of the XML block.

Made a slight adjustment to trait relationship checking for items with damage().

GCA will now update trait relationships after the user has edited the Modes for a trait.

GCA was not processing some #InputX directives if they weren’t the first directives found in the trait tags. Fixed.

A user complained that the Assigning Children part of loading a saved character took a long time. I looked into it, and indeed it does. I dug into the process, and I found a couple places where I could optimize things. The effect was quite dramatic, by a factor of 5 or more. I hope this helps a lot! (I also added a couple Engine options, not surfaced in the UI, to turn these changes back off, but hopefully nobody will need those for anything.)

GCA has very few places where it attempts to revert a change made by a trait when that trait is later removed, but there is a very simple attempt at reversion for replacetags(). There was an error in that system where it did not ensure that an affected trait existed before attempting to do the reversion. That is now fixed.

Based on a user crash report, although unable to reproduce the issue myself, I’ve added some addtional checks to the routine that collects and displays Show Info data for the classic trait lists, in an attempt to catch possible things that might cause the error reported in various situations.

* Adds()

I’ve added initial support for #tags() in adds(), as per how it was previously added for Select(). This allows for finding the item specified in the adds() list, then completely rebuiliding/replacing any desired tags using those specified in the #tags() taglist. Basically creating an on-the-fly new trait based on the specified one.

There was no need for this support in creates(), so it was not added there.

By it’s nature, #tags() makes some of the other supported stuff in adds() unnecessary, but I’ll leave all that alone. However, if it all works as intended, then going forward it may make more sense, for example, to use #tags() to replace initmods() rather than use ‘with…and…’ structures for including mods.

I’m not currently going to mess with anything that goes on when GCA does not find the exact trait specified; that will still work as before, with any popups or whatnot.

* Info panes

Since Tablet Mode and other common uses of the selection dialogs will often hide the Info pane on the main window, I’ve started adding optional Info panes on the selection dialogs.

I have now done this with the Modifiers dialog.

When the Info pane is closed, a View Info button will appear on the left side of the button bar at the bottom of the dialog to allow you to get it back.

* TagDefs.XML

Added ‘description’ as a valid tag to the Modifiers tags.

Added ‘ammo’, ‘charammo’ and ‘charammounits’ to Traits tags.

* GCA5.XSD

Added element ‘description’ to GCAModifier

Added elements ‘baseweightconverted’, ‘baseweightunconverted’, ‘charammo’ and ‘charammounits’ to the Calcs block of GCATrait

* launchcodes.xml

Added x86 folder location options for Chrome and Firefox browsers as PDF readers.

A bit of rock dome (b219)

b219

* Bug Fixes

For some reason, GCA would stop responding if you were in an edit field on a Classic View trait list and you clicked on a tab to change to a different list or view. That should no longer happen.

The fixes made to account for base weight usage for equipment, formulas, and modifiers in an earlier build had a serious issue: the base weight was being reconverted every time from the converted value, not from the original source base weight. <sigh> This was a stupid mistake on my part, that I somehow overlooked accounting for at the start of the calculation process. Fixed now.

A bit of color (b217)

b217

* Point Summary dialog

I was using the wrong color set, so that is now fixed.

I was using a fixed ‘red’ color for warnings, which didn’t work well on many backgrounds. I’m now using a ‘red’ color on a ‘white’ background which should read clearly regardless of color settings, although it will be rather bright on an otherwise dark configuration.

More various bits of things (b216)

b216

* Miscellaneous

Made some adjustments to the text output and display of the Point Summary window.

The order of the tabs in Classic View had Equipment appearing before Templates, which is backward from intended. I reversed them.

* Separate Template Costs

I have surfaced an option to track points spent on Templates separately from Advantages and Disadvantages, due to requests. That is now available in Options under Windows & Boxes.

GCA will now display a block in the points bar for Templates, if GCA is set to track those separately, and if there is a non-zero point value for them. When you change the setting in Options, the Points Bar at the bottom of the window will not automatically update to include/exclude the Templates block. You will need to do something to force that change, such as hitting F5 to recalculate.

Be aware that with this option on, you will be potentially mixing positive and negative point values into a single total, which may be misleading to you.

The option to track Template points separately was not supported by any of the included sheets when showing the ‘summarized’ totals. I have updated the points boxes on the sheets to include Templates when this option may be in use with the summarized display, but Templates will still only be shown if the total is non-zero.

* Zoom

Made some minor adjustments to the Transform Manager and the Loadout Manager to try and get their central grids to respect the font size for the user’s zoom level.

The Library Pane and Layout buttons on the Unified View toolbar should now size back down correctly when you switch off Jumbo toolbar buttons.

I have added a new Extra Large option to the Zoom menu. I can’t guarantee that every dialog will fit on everyone’s screen when using this option, so if things don’t fit and can’t be resized to work, I’m afraid you’ll have to use a smaller zoom. But let me know! I may be able to redesign the problematic windows to work differently. Note: The location boxes for the various protection displays will almost certainly be too small, with clipped text. Those boxes are set using fixed pixel sizes and locations in order to work on the images, and that doesn’t match well with font-based scaling for the text within them.

* Classic View Attributes

Added some additional options to the right-click menu for Attributes in Classic View: Modifiers, to open the Modifiers dialog; Highlight, to make available the highlighting options; and GM Sheet, to include or exclude from the traits marked for inclusion on the GM Sheet (or for other things that use those watched traits).

Not all output options are necessarily set up to allow for Attributes on the GM Sheet watchlist, so you may have to let me know if they don’t appear somewhere, or in some fashion, that you think they should. (They should automatically appear in Special Abilities on the GM Control Sheet itself.)

* Accessibilty: Input box

The Input box used when GCA needed a quick user entry, such as in the #Input directives and when changing a profile name, used a built-in feature of my programming framework. Unfortunately, that feature did not appear to support accessibility features. It has now been replaced in all use cases by my own input box dialog, which has been updated a bit to better handle accessibility needs.

Character handling has now been plumbed with a new event and handler to allow for requesting this new Input.

* Sheets

The Official Character Sheet has been updated to reflect the use of Separate Template Costs in the Point Summary when the Templates total is non-zero.

The GCA Prime Sheet and Spring Bandit Sheet have been updated to reflect the use of Separate Template Costs in the Point Summary when showing ‘summarized’ point totals and the Templates total is non-zero.

Plugging in a bit of accessibility (b215)

b215

* Editing and Calculations

Edits made to traits in the Edit Traits dialog that are supposed to create new links between traits, such as changes to default() or needs(), were not prompting those links to be created. A full Recalculate All (F5) would update everything correctly, but just changing something that is newly defaulted from, for example, wouldn’t flow the change through as expected. That should now be fixed; GCA will refresh linkages related to edited traits after the Edit Traits dialog is closed.

* Unified View Trait boxes

The Options menu from the gear button has been simplified a bit, as some options are just available from a More Options selection that launches an Options dialog.

The trait boxes can now assign a function to right-clicking the gear button. This function can be one of these options: do nothing (the default), open the Options menu (what left-clicking does), or launch the traits dialog. This should improve usability for tablets and for those who have trouble double-clicking the button when that option is set. This is available through More Options on the gear menu.

I’ve also added an option to swap the left-click and right-click functions, so that you can have right-click be the Options menu and left-click do one of the other things. If you also want to have double-click to launch the Traits dialog enabled, that must always be double left-clicking.

Finally, I added an option to allow mimicing the gear button clicking behavior across the entire title bar. This means right-clicking or left-clicking on the ‘Skills’ header area will work the same as clicking on the gear button, although the area won’t highlight like the button does (and double-clicking is not handled). The title area does not include the column heads, since those are clicked on to change sorting. (To be consistent across Unified View, this option should be available for other boxes, also, but it is not at this time.)

Since each trait box remembers its own individual settings, you’ll unfortunately have to set the desired options individually for each one.

* Called Plugins

I have created a new class of plugin, the Called Plugin using the ICalledPlugin Interface, which doesn’t do anything until you launch it from the Tools > Launch submenu. Authors of these plugins will have to manage their own UI if needed, which does add some complexity. GCA does provide a SheetOptionsManager for persisting user settings, however.

I have created an example of this kind of plugin that uses a form to interact with the user, it is cleverly called ‘CalledPluginExample’. Note that such a plugin must instantiate the form independently as part of its normal operation; DO NOT use the form itself as the plugin. Get the example plugin at my GCA5 blog here: https://www.misersoft.com/gca5/?page_id=1108

Most of the required interface isn’t actually needed for a form-less plugin; structurally that’s pretty simple: Start gets called, do some work there, raise the ShutDown event at the end.

For sheet options for this type of plugin, GCA calls CreateOptions to create them, and will call SetOptions when it launches the plugin, before it calls Start. If you use the ShowOptions event to show the user an Options dialog, GCA will also call SetOptions after the user is done with the Options dialog, but it will not call Start again. This kind of plugin does not have sheet option profiles available, so all options saved and loaded by GCA will be stored under the PluginName alone.

Note that these plugins can sit around and work over time. If you launch a window, for example, the window is non-modal and can be refreshed and interacted with alongside GCA. The example plugin does this to some extent, updating the interface as traits and characters change.

* Accessibilty: Point Summary dialog

I have created a new dialog, available from the Character menu. This Point Summary dialog simply shows the point summary information in text format as a serious of text lines. Since the points bar at the bottom of the main window is not really accessible to screen readers, adding this dialog seemed like the best route to making that information available.

* Accessibilty: MiserCheckedListBox

The custom checked listbox used in various places, such as in the Choose Multi dialog, did not allow you to check the selected item using the spacebar. That is fixed.

In addition, the list did not correctly return any useful information for the accessibility text, which made using the listbox impossible for screen readers. That is now fixed.

In addition to adding useful text returns, the list has been updated to rebuild when the state of a checkbox changes, so that the returned text will remain correct (and the reader should re-read the changed state; at least Windows Reader does).

* Accessibilty: ChooseMulti dialog

In addition to the changes resulting from updating the MiserCheckedListBox, the hint bar at the bottom will now return accessibility text reflecting the current status of the desired selections, so tabbing to it will provide feedback on what’s still required, if anything.

* Accessibilty: Campaign Log

Fixed the return text for the button that changes the order of the entries in the All Log Entries list.

Added actual text returns for the entries in the All Log Entries list.

In the Points & Money Earned pane, added explicit names for the various fields, and fixed the tab order.

Added explicit names for the fields in the Selected Log Entry pane.

Changed returns for the Search, Add, and Delete buttons.

Adjusted tab order.

The text of the log entries in the list would get repainted when changes were made, but the Accessible text returned to a screen reader would not be updated unless the list was rebuilt. I have adjusted the refresh process so that the list will get rebuilt. This may result in the position of the entry within the list changing when editing a log entry in the edit area, but the selected list entry should still remain visible and selected in the list.

* Accessibilty: Classic View

Added button names for the buttons in the filter panes for the Classic View standard trait panes.

As with many other things that use listboxes, the text for traits would not get updated for screen readers unless the item itself was replaced, even though it appeared correctly on-screen. That should now be fixed for the various trait lists in Classic View.

* Accessibilty: Loadout Manager

Added column names for the Item, Quantity, and Weight columns in the grid.

In the Acitve Loadout pane, changed the reported text for the fields of Encumbrance Level and Load Weight to actually report “Encumbrance Level” and “Load Weight”.

The gear menu button should now report “Gear menu”.

Changed the tab order a bit.

 

Calculating a bit of context (b214)

b214

* Miscellaneous

Made a fix to how GCA returns baseweightconverted() for baseweight(). It should now work properly and more safely.

For backward compatibility reasons there were two different but nearly identical versions of the damage special-case substitution handling routine. I have now updated one to just call the other.

* Mode-Specific Calculations

People often lose track of the context required for bonuses to modes and the use of mode-specific values. It’s not possible for GCA to get or use the value of a mode-tag from outside of the calculation of that mode. That’s why bonuses that make use of mode-specific values, such as ‘chareffectivest’ or ‘charskillscore’ have to be done as bonuses to ::damage$. Bonuses to ::damage$ are simply aggregated with the existing damage() tag and then calculated all together, along with normal bonuses. This allows GCA to have on hand the values needed for mode-specific requests made with $modetag().

This is very easy to lose track of, and can be confusing, I know, but it’s just not possible for a bonus to know the values of the mode it’s being applied to in advance, when there are so many possible modes to which it might apply..

In the existing data files, this necessary context was lost for some bonuses, causing them to return inaccurate or non-context-sensitive results.

In light of this, and to render those bonuses functional again, I added some new features which should address the issue.

First, I have added support for a Mode to return BaseSwDice and BaseThDice for itself. It does this by checking to see if it has a ‘chareffectivest’ value, and if so uses that with the @BaseSWDice() or @BaseTHDice() function of the Solver and returns the result; otherwise it returns the BaseSWDice or BaseTHDice from the Character.

Second, I have added some new special case damage substitutions. If the damage text being calculated contains ‘owner::basethdice’ or ‘me::basethdice’, GCA will replace that text with the Mode’s new BaseThDice result. Likewise, if the damage string contains ‘owner::baseswdice’ or ‘me::baseswdice’, GCA will replace that text with the Mode’s new BaseSwDice result. Note that this is because owner:: is only used from modifiers, and isn’t applicable in a late-resolution bonus string such as those to ::damage$, so it’s assumed that it’s intended to be the target item’s score, the same as me:: would be.

Note that you can now also use $modetag(basethdice) or $modetag(baseswdice) to get those mode-specific results, even though they aren’t technically mode tags, and using this construction is preferable to owner::baseXXdice for clarity.

These changes together with those in Special Damage Text section below should fix the known problems with these bonuses, in place, without users having to make changes to existing character data.

* Special Damage Text

There are sometimes problems calculating certain specialty damage types. For example, calculating something like ‘slam+3’ and granting it bonuses might result in ‘slam+3+lots of nonsense code’ or such, usually because of the hoops that need to be jumped through to do mode-specific adjustments to damages. On the other hand, something like an affliction with damage() of ‘HT-$solver(me::level – 1)’ correctly returns HT+X, but if it too gets a bonus, it might also return ugly unhelpful results.

My previous attempt at addressing this incorrectly resulted in damage for afflictions and some weapons returning empty damages, because I didn’t realize the full impact at the time.

My new attempt tries to work around the issue by recognizing that some damages are based on a ‘prefix’ such as ‘slam’ or ‘HT’ and calculating the stuff that isn’t the prefix, then returning it at the end recombined with the prefix.

This new method includes support for user-specified prefixes simply by enclosing them in square brackets [] as the very first part of the damage() tag for that mode. Support for ‘slam’ is built in without needing the brackets, and for things like afflictions you shouldn’t need to use it unless you’re adding bonuses and don’t like the resulting HT+X+Y that may occur. But if you do change it to ‘[HT]+$solver(me::level – 1)’, then GCA should use the new method to return a more pleasing HT+X result with the combined values.

Currently, if the calcs result in a prefix+0, that +0 will still be shown, it will not be dropped. In addition, if the prefix isn’t explicitly specified (or built-in like ‘slam’), then it may be lost if a damage bonus includes some number of dice, and then you’ll need to add brackets around the prefix, such as in the affliction example above..

Up a bit, down a bit (b213)

b213

Added some safety checks to the CalcApplicableModeTargetTagXXX(Mode, String) routines, because it is possible to try to use them without an actual mode set, and that is bad.

The special #note() directive for Select() list items has been improved. Displayed notes are now indented to make a more clear separation between the note and the general list items. Also, you can now use limited BBCode formatting in the note, and if you do that, you should use ‘[BB]’ or ‘[BBCode]’ as the first characters in the #note(); they will be stripped off, but tell GCA to use the BBCode engine to draw the text.

GCA will now remove packageupdater2.exe from the appdata folder during the startup process that cleans up after updates.

* SkillScore and Parry for Attacks

Most of the time, a bonus to an attack’s SkillScore is intended to raise the general use of the skill for the attack, including Parry for melee attacks. However, there are certain times where the bonus is intended to apply only to the attack usage, and not to the parry usage. The way to reflect that in the bonus was to subtract back out the bonus from the calculated Parry, and that was quite complex and confusing because it would get applied after all normal calculations for parry were already made. Here’s an example of that:

gives(+1 to owner::skillscore, 
      =-(@int($modetag(charskillscore)/2) - @int(($modetag(charskillscore) - $solver(me::level))/2)) to owner::parryscore$ _
)

I have now added a new bonus target for use during the calculation of ParryScore: preparryscore. This allows you to simply apply an adjustment to the version of charskillscore that will be used in the parryat() calculation, before the parryat() calculation is made. This means that you can now simply apply a negative version of the positive bonus going to ::skillscore to ::preparryscore to counter it out for parry purposes. Here’s an example:

gives(+1 to owner::skillscore, 
      -1 to owner::preparryscore _
)

This should be faster and easier for everyone.

* Ammo

I did all the code necessary to convert ammo() to charammo() and store charammounits() for reference. And then I discovered that Ultra-Tech uses ammo() for something completely different, which looks like letter codes of some kind. That’s obviously incompatible, so I’ve disabled the ammo() calc stuff until I can figure out what that’s all about and if I can move things around or if I’ll just have to ignore that for a while.

* Weights and unit conversions

GCA will now create two new calculated tags when calculating equipment items: baseweightconverted() and baseweightunconverted(). The value in baseweightunconverted() is the solved value of baseweight(), or the result of baseweightformula() if that is used, before any automatic unit conversion is performed. The value of baseweightconverted() is that value after automatic unit conversion is performed.

Now, when GCA processes a reference to ::baseweight or TagItem(“baseweight”) it will return the value from baseweightconverted() instead. If you really need the unconverted value, reference it explicitly.

This change comes about due to the discovery that all the calculations for items are using the units-converted value, but bonuses referencing ::baseweight would be getting the unconverted original tag value from GCA. So calculations proceeding from that point would include values using two different scales of units, and the final result would be incorrect.

If you’re not using unit conversion, then this should not affect any results, and all three values should be the same.

* Solver

Added a new function, @getnum(<text>) which returns the first numeric portion found in the given text, as best as it can determine. Note that special case substitutions and $ functions will be resolved before the function is called (that’s how the solver works), but embedded @ functions will not be resolved within this function because the purpose of the function is to get a number out of text, and if you need it solved, you don’t need this function.

The text is searched from left to right to find the first number. If it finds a – it will allow for a negative number, but only if the – is immediately to the left of the first numeric character. It will allow for decimal values if the decimal follows a number or is the first character of the text being checked and is followed by a number.

* TagDefs.xml

Added entries for baseweightconverted and baseweightunconverted.

Just a couple bits and a sheet (b211)

b211

The RequestRunSpecificOptions system was not implemented for Print Previewing at all, and was incompletely implemented for Printing. I have fixed that. Note that this system is not available for Sheet View, or when printing from the print buttons on the Sheet View or Print Preview dialog because those buttons print the displayed sheet, they do not cause the sheet to go through the setup process again, which is required to enable RequestRunSpecificOptions. When Run Specific Options are available in a sheet, you will want to set them by using Print Preview or using a print option from GCA’s primary toolbar or menu system.

The default Sheet View sheet for the system was empty, so it would default to the first sheet in the list if not otherwise set. That has now been changed to the Official sheet.

* GM Control Sheet

Version 1.0 included.

Been a bit to get a bit (b210)

b210

There was an issue that trait prereqs would always be auto-added when a trait was added, even if the Auto Add Needs option was off, so that was fixed to respect the option.

* Damage

Fixed broken damage results, such as Afflictions of the type “HT±5” and weapons of the type ‘6dx3’. To do this, I reverted a change to the routine that calculates damage, related to how it returns the damage text when calculations don’t appear to result in some dice of damage, but a damage value was specified. My change was meant to return any partially calculated damage that did exist, which was meant to account for damage bonuses that might apply other factors to the damage. However, that change broke previously working damage strings, such as those for Afflictions.

I will try to find another way to correct for the bonuses issue, if I can find a way to see that again, since my notes don’t include an example, and I can’t remember what caused the issue I was trying to address.

I’ve now also added support for solving $TextFunctions and damage-specific special case substitutions when DamageIsText(yes) is set. This should allow for still getting some solving completed in a damage string that might otherwise not correctly evaluate using normal damage calculation methods.

(Changes apply to regular damage and to mini-modes.)

* Page Numbers

In the Info pane, GCA will now display the full name of the book being referenced by a page number. This will be in parentheses after the page number, so that the page link remains clickable.

In addition, if you click a page link that leads to a PDF that isn’t actually found, GCA can now launch the PDFs dialog to allow you to specify the PDF that should be launched when such links are clicked.

* Options Dialog

In the Windows & Boxes block, I’ve now added an option for “Dereference page numbers” which controls the page number dereferencing mentioned above. This is enabled by default.

In the PDF Launching box, I’ve added an option for “Pick launch PDF when not found” which controls whether GCA will actually ask you to pick one, as mentioned above. This is enabled by default.

The option for Auto Add Needs was never surfaced to the user (and never saved/loaded), so it was always True. You can now turn this on or off in Options, in the Windows & Boxes block.

Roll up a bit of text (b208)

b208

* Modes

New Mode function RollToText() as String will now return the ‘extra roll info’ text. This is a string like this: “Roll to [mode]: [charskillscore]”. This is the text normally displayed when the user turns on ‘extra roll info’. Having GCA generate this text instead of pushing it onto the sheets allows for customizing it more easily. You can access the function directly or as TagItem(“rolltotext”).

To customize the returned RollToText, there are now the RollTo() and RollToPhrase() tags. These allow you to replace the extra roll info of “Roll to” with something else. RollTo() simply replaces the “Roll to” text with the text specified. RollToPhrase() provides a way to fully replace the entire “Roll to [mode]: [charskillscore]” phrase with a new one you specify, with Text Function Support and two special variables: %mode% for the name of the mode, and %score% for the value of charskillscore; variable replacement is done before Text Functions. If RollToPhrase() exists it overrides any provided RollTo().

* GCA Prime Sheet

Updated to use RollToText() for modes if run on a newer version of GCA.

* GCA5.xsd

Added elements ‘rollto’ and ‘rolltophrase’ to GCAAttackMode block