Taste just a bit

GCA will now remember the trait type selections in the library lists of the Compact and Sheet Views between sessions.

Fixed bug in #DeleteByTag data file command.

Fixed bug in Edit dialog that didn’t save changes to Page.

Fixed bug in Edit dialog that displayed Show Modes checkbox when it shouldn’t.

Added an option in the Compact View display options to specify if you want the blocks to wrap or not (it is on by default). Turning wrapping off will result in all the blocks displaying linearly, which may be easier to view/reference for some folks when the primary scrolling is along just one axis.

Added an additional ‘bold link’ option to the PDF Launcher options.

Added an ‘Export PDF…’ button to Print Preview.

Apparently I changed the default footnote style when I updated the FootnoteManager. You should be sure to set the FootnoteStyle to the desired type after initializing the FootnoteManager.

Fixed ColorBlockSheet to address the issue with footnotes.

Updated ColorBlockSheet with some additional features and options.

Updated OfficialCharacterSheet to display the ‘Included’ and ‘Conditional’ lines for bonuses to traits in the various trait listings. Also added a sheet option to allow for setting a different font for these lines.

Take yer bits

Fixed some bugs in the new stuff for the Protection box in Compact View.

Protection box’s Copy to Clipboard option now copies the entire graphic area (except the buttons in the header).

The Protection box will now add a message between the paper doll and the armor list if the user has enabled Allow Deflect Stacking or Allow Fortify Stacking on the character.

Made attack modes a separately managed collection of objects within a trait. This has upsides and downsides, but obviously I feel the upsides outweigh the downsides. This means various places had to be updated or modified. For sheet authors, I tried to retain all previous methods of access as well as allowing for the new system. In addition to the old access methods, accessing mode data can now be handled through the ModeManager class that all traits now have (Modes as ModeManager), and individual mode data can be accessed through that or by getting a single mode as a Mode object.

Note: Because of the new Modes system, notes() and itemnotes() are explicitly mode enabled tags. This means a Mode will be created if a notes() or itemnotes() tag exists, even if no other mode data applies.

The ItemNotes system implemented last build no longer applies given the new Modes handling, so it has been removed. Equivalent functionality has been included in the Mode object.

Adjusted the Edit Trait dialog weapon mode displays; they now allow for setting DamageBasedOn individually within them, and will display ItemNotes() if present.

For the record, these are all the currently supported, GCA-handled Mode tags (also available from the ModeTags collection in GCACharacter):

  • “mode”, “notes”, “itemnotes”, “damageistext”, “minstbasedon”, “damagebasedon”, “lc”
  • “acc”, “armordivisor”, “break”, “damage”, “dmg”, “damtype”, “minst”, “parry”, “radius”, “rangehalfdam”, “rangemax”, “reach”, “rcl”, “rof”, “shots”, “skillused”
  • “characc”, “chararmordivisor”, “charbreak”, “chardamage”, “chardamtype”, “charminst”, “charparry”, “charradius”, “charrangehalfdam”, “charrangemax”, “charreach”, “charrcl”, “charrof”, “charshots”, “charskillused”, “charskillscore”, “charparryscore”

Adjusted calculation of charlocation() so that there will now always be a charlocation() tag if there was also a location() tag.

Added code to handle partial coverage for armor items, finally making use of the coverage() tag. This system will use charlocation() and coverage() to generate new charcoverage() and locationcoverage() tags, and to rebuild the charlocation() tag if it had mulitiple entries for the same body part. The system takes tags that might look like this: “location(Skull, Face, Face, Face),coverage(1, 1/6, 2/6, 1/6*)” and should end up with something that looks like this: “charlocation(Skull, Face),charcoverage(1, 4/6*),locationcoverage(Skull, Face (4/6*))”. For technical reasons, coverage() may have values that are empty or are some other whole value to represent full coverage; any partial coverage should be in the form of X/6.

I also created a correction routine to fix location() values that may have partial coverage values within them. For example, location(Skull, Face (1/6)), which aren’t valid within GCA itself, but are generated by some of the existing armor builder items. GCA will see and fix these so that they are correctly formatted location() items without the partial coverage values. If a coverage() tag already exists, the coverage values in location() are discarded; if no coverage() exists, GCA creates it from the values in the location() tag.

Updated the Protection dialog, Layers dialog, and the Protection box to show the new locationcoverage() value where applicable.

Touched a lot more places to update code and strengthen type references.

Updated the FootnoteManager to allow for Alpha footnote markers. Also allows for optionally enclosing the marker in parens, braces, or brackets when returning the FootnoteWithMarker() or FootnoteBlock(). This did change the interfaces a bit, so plugins will need to be recompiled.

  • Public Function FootnoteBlock(Optional ByVal Separator As String = vbCrLf, Optional ByVal MarkerEnclosure As FootnoteEnclosureStyle = FootnoteEnclosureStyle.None) As String
  • Public Function FootnoteWithMarker(ByVal Index As Integer, Optional ByVal MarkerEnclosure As FootnoteEnclosureStyle = FootnoteEnclosureStyle.None) As String

Updated ColorBlockSheet to use LocationCoverage() in the Protection section.

I got yer bits right here

Addressed an element name case-matching error related to ‘launchcodes.xsd’ tripping an XML error message.

When GCA saves backup copies of open characters, it now saves current program settings as well.

In the Launch PDFs window, adjusted the base system folder used when browsing for the home PDF bin.

Added support for the ItemNotes system:

* Public Function ItemNotesModeCount() As Integer

Returns the number of modes represented in the ItemNotes

* Public Function ItemNotes(Mode As Integer) As Collection

Returns a Collection containing all the ItemNotes for a given mode. Collection will be empty if no notes are found. If Mode is < 1, data for first Mode is returned. If Mode is > Mode count, data for last found Mode is returned.

* Public Function ItemNotesModeCollections() As Collection

Represents a Collection of Modes, each Mode item containing a Collection of ItemNotes. (You have a collection of Modes, with count = ItemNotesModeCount(); each collection item contains a collection of item notes as per ItemNotes(Mode as Integer) as Collection.)

* Public Function ItemNotesText(Mode As Integer, Optional ByVal Sep As String = ” • “) As String

Returns all the ItemNotes for a given mode as a single string, separated by Sep. (Default Sep is a bullet.)

Updated some of the things in the Protection system:

* Layers

If using User Managed Layers, the markers used to designate correspondence between armor items and layer values have been changed to use capital letters instead of the various footnote symbols. Within the location’s DR/DB value strings, the letters will be within brackets. This system appears much more readable and much easier to cross-reference.

* Deflect and Fortify stacking

The way Deflect and Fortify stacking issues are flagged has changed. If using User Managed Layers, then the layer that has had its Deflect or Fortify value ignored due to stacking will have a lower case ‘s’ appended to the Layer marker within the brackets. If not using User Managed Layers, then the ‘s’ marker just appears in brackets after the value string.

If there are Deflect or Fortify stacking issues at a location, a ‘-s’ marker is appended to the layers ‘L’ marker in the location box title.

* Other

Updated the values displayed in the Layers listbox of the Layers panel of the Protection window.

Updated the Protection box in Compact View to include a list of the applied armor. Clicking on an armor item will now highlight in gold all affected location boxes on the paper-doll. Conversely, clicking on a location box will highlight the armor items that affect it.

Updated the drawing of thee Protection box to reduce flashing during self-contained redraws.

Updated the default display order of the boxes in Compact View: Protection now comes directly after Equipment and before Melee Attacks; Messages is moved to the end.

In the Options dialog, the active character in GCA should now be the initial character active on the Current Character Options tab.

Updated ColorBlockSheet character sheet to include a listing of the applied armor and shields for the current loadout in the Protection block.

Updated code in a bunch of places to make use of newer systems and references, and to correct some hidden bugs resulting from bad references.

Updated some menu item handling.

Updated the Random Character system, and added support for it to the ChoiceList dialog and some of the message dialogs. The system will now allow for creating multiple random characters from the selected character template, or simply applying the randomized character template to the current character.

Updated Options for the hide/unhide of the explainer on the Random Character dialog.

I have changed the IDKey generation in GCA5 to be sourced from the System, rather than independently per character. The character still saves the last key it was issued, and this serves as a floor for future key requests in case a situation should arise where the System last key is lost. The new System key floor starts at 10,000 and increments from there–unless given a floor above the current last key, in which case the new key jumps to floor+1. This new system should ensure that all IDKeys are unique for all traits across all characters across an installation of GCA5 — assuming that no existing characters already had keys over 10,000.

IMPORTANT: I was going to do something a bit more complex for the new IDKey generation, and therefore had changed the IDKey to use Long values instead of Integer values. Changing to Long values required touching a lot of places in the code, and some may have been missed. If you encounter an overflow error, or a math exception, please let me know! This is very unlikely to be noticed until the auto-incrementing actually reaches the limits of Integer values.

Just a few little bits

Updated some of the menu icons.

Added a Traits menu to the main menu bar, which allows access to the same features as the right-click menu in trait lists.

Added options and UI to allow the user to select and use a page number link color of their choice, and to underline the links if desired. The default color is blue. (Changed the data file ‘touches’ tracking info text to the purple color.)

Added support for various default PDF readers to the launchcodes.xml file, which will be available for selection in the Options dialog by clicking the ‘…’ button next to the ‘PDF reader’ text box. Selecting one of the options will replace the text in the related text boxes with the info from the selected option. Only has codes for Acrobat and Sumatra right now.

Trying out a new trait icon in the right-side icon column: eye glasses, to show that the trait is to be included on the GM sheet.

Added a couple additional small bits of info to the View Info text for character traits: “Include on GM Sheet” if the trait is so flagged; and “Component Of: X” if the trait is a component item. Both of these also currently have icons in the right-side icon column of trait lists, but icon precedence may prevent the icons from showing, or make them difficult to see.

Launched bits

Fixed an issue related to needs items in braces when auto-adding prereqs.

Added a ‘Copy from Default’ button to Current Character Options.

Added trap to exit a Random selection of traits in a Select dialog if too many tries has still failed to create a valid set of random selections.

In Select dialogs, you can now add traits that already exist on the character to the character list from the Available list. Such items in the Available list are marked with a green check mark. Note that the points already spent in the trait won’t count against the points needed in the dialog. (Doing this previously required using the existing() tag on a #newitem to reference a known existing trait that you wanted to make use of. That option still remains.) This should simplify some constructions in templates.

Added an “override requirements” checkbox to the Select dialog. This allows you to activate the OK button and move on with the template, even though you may not have satisfied the specified requirements.

Adjusted the layout of the Select dialog a little, allowing for dynamic resizing of the user instruction area, and added an Explainer panel.

Added the UI in Options for the hiding of the Explainer panel in the Select dialog.

Moved the page info higher up in the View Info text display.

Added code to allow double-clicking on a page reference in View Info to launch the associated PDF. If GCA has information about a PDF for the given page reference, the page info will be a purple color, and double-clicking will perform the launch. If the page number isn’t purple, it’s not a link, and double-clicking will only irritate you. Right now, all page info is in the “bookcodes.xml” file in the GCA install folder. It only has a couple test references, since I don’t have any idea what the default names are for the official PDFs.

Added code & UI to Options to allow the user to specify their PDF reader and necessary launch arguments. Default is for Acrobat.

Added code & UI for a dialog, accessible from the PDF Launching box in Options, to allow the user to set a base PDF bin, and to set specific files and offsets for the PDFs that match the various book references that GCA uses. Changes made here are saved to a user version of the “bookcodes.xml” file in the user’s Books bin.

Bits modifiers

Added code to allow the Sheets drop-down on the Sheet View and Print Preview dialog toolbars to stretch out more if there is room for it.

Added some functions to SortedTraitCollection.

Restored drag-n-drop to Sheet view.

Sheet View should now retain its view position as much as possible when adding or removing items from the character sheet.

Added initial support for a Substitutions system, which allows one trait to substitute for another when GCA is tracking down references. This means you could create a ‘Guns (Small)’ skill that substitutes for ‘Guns (Pistol)’, and then when a reference to ‘Guns (Pistol)’ is being sought by GCA, ‘Guns (Small)’ would be considered a valid return. You create a substitution table by using the subsfor() tag in the item that is intended to substitute for the others. For example, our ‘Guns (Small)’ item would include ‘subsfor(“SK:Guns (Pistol)”)’ in order to create the substitution table. Multiple entries can be submitted at once in subsfor() by separating them with commas. The trait type prefix code is required in the subsfor() definition. Implementation is currently limited, but should be working in most places, such as defaults and weapons tables. Note that the item that is the substitute also qualifies as an existing instance of anything for which it substitutes, so adding one of those items after the substitution table is created would be considered a duplicate by GCA, and will be refused by default.

If the CTRL button is held down when drag-n-dropping a system item into a Character list in Compact View or Classic View, or onto the sheet in Sheet View, GCA will now add that trait even if it is a duplicate of an existing trait.

Added initial support for tracking what files ‘touch’ system items as they’re created and modified by data files. This will allow data file authors or debuggers to click on a system item and see in the View Info pane how the item was affected by various data files. Currently supports trait creation, replacing of previous traits, automatic replacement or merging of duplicate tag data, cloning, mergetags, and replacetags. (The related option in Options must be On when the fastload files are built in order for the data to be available; GCA won’t bother to track it if the option is Off.)

Added UI for the data file ‘touch’ tracking system option to Options, and altered the title/text of the enclosing options block from Logging to Book Processing.

Added #CloneMod data file command. Works like #Clone, but clones a modifier. Unlike traits, modifiers don’t have an item type, so they’re unique within their groups, so #CloneMod requires specifying the group and the full name of the modifier, like so: #CloneMod “group:modifier name” as “group 2:modifier name 2”.

Added #MergeModTags and #ReplaceModTags data file commands. You must target them using a group and name as specified for #CloneMod, but otherwise work as you’d expect from #MergeTags and #ReplaceTags. (For example: #replacemodtags in “Burning Attack Enhancements:Partial Dice” with “cost(+1/+2),formula(%level * 5)” ) The ALL keyword is not supported.

Added #DeleteModsFromGroup data file command. This allows for deleting specific modifiers from existing data. Similar to #DeleteFromGroup in structure, you specify the Mod Group from which you’re deleting items, then a space, then all the modifiers from that group that you want to delete, in a comma separated list. Enclose the mod group name in quotes, and enclose any modifier names that contain commas inside quotes as well. (For example: #DeleteModsFromGroup “Burning Attack Enhancements” Partial Dice, “Partial Dice, Per Die” )

Added #DeleteModGroup data file command. This allows deleting an entire group and all its modifiers at once. Specify the mod group name to remove, and its all removed. (For example: #DeleteModGroup “Burning Attack Limitations”)

Updated OfficialCharacterSheet to correctly reduce the component name column widths by the component indent level when printing traits.

Rebuilt plugins.

That’s a lotta bits

Missed from b44: Fixed an issue when pasting modifiers into an item that prevented proper recalculating of those modifiers and any bonuses they granted.

Updated Protection dialog to note the Deflect and Fortify values for armor in the Apply Armor list.

Updated Armor Layers Manager, and the Layers list in Protection, to show Fortify values.

Updated Loadout code to properly clear footnote markers for items that may have lost applicability for the current ordered layers.

Adjusted some of the GCACharacter properties/functions related to sheets.

Added some Sheet View related functions to GCACharacter.

Characters should now remember the sheet selected for Sheet View, and should switch to it if you switch between characters.

Switching between characters should now terminate editing within a Sheet View sheet.

Within a session, characters will now remember their position and zoom factor in Sheet View when switching between characters, or between views.

Added InSheetView property to the SheetOptionsManager, which is set to True when GCA runs a sheet in Sheet View.

GCA should now remember settings for default character options of stacking deflect and fortify.

Fixed Compact View box for Encumbrance & Move to let the encumbered move values be 0 if the starting score is 0.

Hooked up Options UI for default player name, and saving/loading of it.

Hooked up Options UI for default Character Sheet and Alternative Sheets, as well as the per-character selections, and the saving/loading of them all.

Hooked up the drop-down lists for Print/Preview buttons on the main window’s File toolbar, to make use of the active character’s specified sheets. (Since GCA5 handles sheets via plugins, and GCA4 handled them via script files, older characters will have things show up here that won’t work.)

Updated the GCATrait XML output to include chardeflect() and charfortify() in the ‘armordata’ block.

Renamed some internal controls.

Made some changes to the text/functionality of the dialog for restoring characters from auto-backups after a crash.

Updated the way GCA checks for the library & books used by a saved character.

Made some changes to the text used in the dialog when there are issues with a character’s library references.

Added a function to the character (QuickRulesOptionsCode(Optional ByVal Sep As String = “”) As String) which returns a short string code for which rules options are being used by that character. Returns only the non-default options in use, so the string will be empty if only the standard rules are being used.

Fixed an oversight in the handling of trait vars when assigning them to vars() using TagItem().

Updated the GCA5.xsd to include a reference for the SheetViewSheet to the GCACharacter ‘output’ block.

Updated the GCA5.xsd to include references for ‘chardeflect’ and ‘charfortify’ in the  ‘armordata’ block of GCATrait.

Updated ColorBlockSheet to include an Encumbrance & Move block, and modified the internal gridlines of the various blocks a little bit. Also added the QuickRulesOptionsCode output to the footer in parens after the GCA ident (but it only shows up if non-default options are in use).

Bits of bits and bits

Added the @totalchildrentag(<tag>) function, which will total up the values of a specified tag from all children. Note that children only are viewed; it does not recurse through nested children. It does, however, multiply the tag value by the child’s Count to get the total value. If you don’t want the value * count, include the #nomult directive in the function call: @totalchildrentag(<tag>#nomult).

Added the @totalownerchildrentag(<tag>) function, which is the same as @totalchildrentag() but meant to be used from a modifier, to get the owning trait’s children.

Added a small chunk of code to improve handling of needs checks that use ‘me’ references, such as needs(me::childrenweights<40).

Adjusted some text in Options.

Adjusted the Armor Layers Manager dialog explainer a bit.

Adjusted the Portrait dialog a bit.

Updated Explainer on Random Character dialog to remove problematic third-party controls.

Updated the Save Body Type dialog to remove problematic third-party controls.

Updated the Message dialogs to resize the caption space as needed.

Updated the Resynchronize dialog to remove problematic third-party controls.

Added support for the #DeleteMe directive, which instructs GCA to delete the item once it’s been fully processed. This may seem a bit odd, but it allows for creating templates that add things to the character and are then removed, so that the user doesn’t have to manually remove them later when they no longer serve any purpose. (Note that many users will find it confusing if a trait doesn’t appear in the Character list after they’ve added it, so this directive is mostly for those that want to use it in their custom data.)

Fixed a bug that prevented Modifiers from correctly importing extended tag blocks from XML data, resulting in the loss of some tag data, and having other data incorrectly assigned to incorrect tags within the modifier.

When creating the protection values for body parts, GCA will now honor the RAW that Deflect and Fortify bonuses do not stack on protected areas. (This does require that those bonuses be from the chardeflect() and charfortify() tags so that GCA knows what’s going on.) Only the best value will be applied, and in the case of ties, the first one found is used (usually the innermost layer with that value).

Added UI items to the Options dialog to support the new options that will allow stacking of Deflect and Fortify bonuses.

Fixed a bug in the logic for building and simplifying the default protection values.

Made a change to loadouts so that only items with a db() value (rather than a chardb() value) might be considered shields. This is because GCA is now also calculating chardb() for non-shield items that get a Deflect bonus.

Updated the GCA5.xsd to include the new character options that allow stacking of Deflect and Fortify bonuses.

Display Names and Totals from Children

This preview is of something a bit more esoteric than the previews we’ve done so far, and also covers two different things that I can show the results of in one image:

gca5_totalchildrentag

Here on the right side, you can see the use of the new displaynameformula() tag to create a custom name for each of the grimoire items, which includes the number of pages contained in that chunk. And the pages are totaled up using the new @totalchildrentag() function, coupled with custom pages() and pages#() tags.

This combination of features allows you to customize things a bit more, although it’s definitely not the easiest of things to do. The data file code for the three items above looks like this:

Grimoire Book, basecost(1000), baseweight(10), pages(0), pages#(me::pages + @totalchildrentag(pages#)), isparent(yes), displaynameformula($val(me::basedisplayname) ($eval(me::pages#) pages))

Grimoire Chapter, basecost(100),baseweight(1), pages(12), pages#(me::pages + @totalchildrentag(pages#)), displaynameformula($val(me::basedisplayname) ($eval(me::pages#) pages))

Grimoire Signature, basecost(50),baseweight(0.5), pages(6), pages#(me::pages + @totalchildrentag(pages#)), displaynameformula($val(me::basedisplayname) ($eval(me::pages#) pages))

The pages() tags include the number of pages each individual item contains.

The pages#() tag is a separate tag from pages(), but is auto-calculated by GCA when referenced (as denoted by the # in the name), and returns the total pages for the chunk and all children.

The displaynameformula() tag defines the display name as the default display name, plus the number of pages in parens after that. It determines the number of pages using the pages#() tag, so that children and nested children will all be included automatically.

As I said, this particular thing isn’t the easiest to deal with, but perhaps we can improve on that in the future.