Dragged bits

Loading a character should no longer spit the character’s load-log into the Info pane.

Altered the library loading of system traits to make duplicate x() tags merge their list values when duplicates are found, rather than the standard behavior of replacing values. There is a lot of ‘dirty’ data in the data files where these tags are duplicated to add additional info, and in the case of the x() tag, this was passively allowed in GCA4 (due to it finding the #directives anywhere in the tag data, regardless of duplicate tags). Due to GCA5 actively refusing duplicate tags during the loading process, the duplicate data for the x() tag is lost, so the old, forgiving way does not work now. This new merging behavior should allow the multiple x() tags to work in GCA5 by merging all the duplicate data into a single x() tag. This means that a number of ‘wizard’ type traits, such as the various skills starting with _, and of type %typelist, will now work as intended again.

Also altered library loading of page() to merge values.

The changes to Library loading of system trait x() and page() tags necessitates rebuilding FastLoad files, so the FastLoad version has been changed. Your FastLoad files will be rebuilt as a result.

Updated the code in the Classic View character trait lists so that double clicking the column headers will allow you to turn back off the OrderedBy status. That is, double-clicking will cycle through Ascending, Descending, and Off. Off will restore the list display to the standard order.

Updated the Classic View character trait lists so that adjusting the points/level/cost of traits will preserve their OrderedBy status within the list–rebuilding the list to show the updated order as traits are incremented or decremented. (Note that this may not be entirely desireable when you have a giant list of items, but it works reasonably well for moderate or small lists.)

Updated the Compact View trait boxes to allow double-clicking on the column headers to order the box contents, as in Classic View. Note that the Compact boxes will not re-order the display while adjusting values, unlike Classic View, because the boxes allow for adjusting directly on the trait line itself, and it’s rather annoying to have the interaction area jump to another part of the box while you’re trying to use it.

Changed the sort order markers in trait lists to always be small triangles, although it’s possible to choose between gray (the default), red, and yellow markers. This selection is still by right-clicking on the headers in Classic View, and is now on the box’s option menu (the gear icon) in Compact View. Each marker selection is individual to the type of items. You can also set them in the Colors & Layout dialog.

You may now drag and drop traits from the Library panel onto trait boxes in Compact View, to add them to the character. Any type of trait may be dropped onto any trait box, but they’re added only to the appropriate box. You may now also drop traits onto the sheet area of the Sheet View to add them to the character.

You may now drag and drop traits from the Library list to the Character list in the Classic View.

You may now drag and drop to rearrange the order of User Ordered Layers in the Armor Layers Manager.

The Colors & Layout dialog has been upgraded. It now uses the correct boxes for each box type, and will use sample data from the current character (or from a system sample character, if no other character is loaded). You can also drag and drop the box names within the list box to reorder them, instead of having to use the up and down buttons.

You can now elect to manage the ordering of your character’s traits yourself, if you turn on User Trait Ordering in Options > Current Character Options. When in this mode, traits are shown in the order they are added to the character, but you can drag and drop the traits into new positions in the various trait lists. [Plug-ins note: If you want to implement display support for this feature, check the AllowUserTraitOrdering property, and if True, access traits with either DirectItem(Index as Integer) instead of Item(Index as Integer), or use the new Item overload Item(Index As Integer, DirectAccess As Boolean).]

The OrderBy system in the SortedTraitCollection has been adjusted. [Plug-ins note: If you change OrderBy, it will automatically rebuild the ordered list. However, calling OrderBy if the OrderBy string has not changed will not trigger an OrderItems rebuild. You should still call OrderItems to rebuild the list as necessary if you’re ordering by something that changes, such as points or level, but there’s no need to call OrderItems when new items are added to the collection otherwise, as they’ll be inserted into the ordered list as items are added to SortedTraitCollection.]

Function bits

* The Find Traits window is now available.

* Added support for upformula() and downformula() for Attributes. Using these tags allows you to specify a formula to use for calculating the cost of the attribute when raising or lowing the attribute from the base value.

* Added support for an ‘onlyif’ clause in bonuses. This is basically the same as the ‘unless’ clause, but may be easier for some folks to visualize, because it’s positive instead of negative. OnlyIf is used in the gives() bonus structure after ‘upto’ but before ‘unless’, like so:

‘+2 to SK:Skill [ upto 10][ onlyif TARGET::tag > 0][ unless TARGET::tag = 0][ when “running from danger”][ listas “Some bonus text”]

OnlyIf and Unless both restrict when a bonus is applied. You may use either or both, but if you use both in the same bonus, you must keep in mind that OnlyIf is checked first, and if the target DOES NOT satisfy the requirement, then the bonus WILL NOT be applied, regardless of the Unless statement. The Unless clause further restricts bonus application to traits that satisfy the OnlyIf requirement; it never restricts or excepts the results of the OnlyIf clause. If you only use one or the other clause, then when the exception or requirement applies should be fairly clear.

* Added the @TextIsInText(<IsThis>, <WithinThis>) function to the Solver, which returns 1 if the <IsThis> text is contained within the <WithinThis> text, and 0 if not. As with most such things in GCA, case is ignored.

* Added two new functions to the Solver, which allow for searching for a text item within a list of text items:

@TextIsInList(<IsThis>, {<Within This Comma Separated List of Items>})
@TextIsInListAlt(<IsThis>, <UsingThisSeparatorCharacter>, {<Within This List of Items>})

These are similar, except that @TextIsInList assumes a comma separated list of items, as is used in the cat() or page() tags, while @TextIsInListAlt allows you to specify the character used for separating the items in the list, such as the pipe (|) character used in skillused(). You should always enclose the list parameter inside braces to ensure safely defining the list of items as a single unit. You can, of course, either specify the list items manually, or obtain them using something like $textvalue(me::cat). Comparison of items ignores case, as always. The value returned is 0 if the item was not found, or the index number (1-based) of the list item that was matched.

* Addressed some drawing/refresh related things on the Protection Window.

* Addressed issue related to body image file support in the Protection Window.

* Fixed a bug locating the system images bin.

* Fixed an initialization issue with system traits.

* Made some minor adjustments to the list-based trait boxes in Compact View.

NOTE:

* Removed the old versions of the various trait boxes in Compact View. Please let me know if you see any issues with screen updates or other weird behavior in Compact View.

* Changed the folder references used internally. Also changed how they’re stored in the Folders section of the gca5.prefs file. If you’ve never changed these, nothing should be different, because the defaults are the same. However, if you have changed them, you’ll need to update the new versions.

Scaled bits

You can now right-click on the paperdoll image in the Protection window to access a context menu of some related functions.

You can now resize the body part boxes on the Protection window using the mouse.

Fixed a teeny little wiggle of an issue with the dragging of body part boxes in the Protection window.

Adjusted the look of a couple things in the Protection window.

Addressed some major issues related to scaling the Protection window for Zoom modes other than Normal.

The Library panel (used in Compact and Sheet views) has been updated so that type-to-search works like it does in other places. It has also been updated to respond to the same keys as other areas for adding traits to the character.

Ordered bits

Updated Protection and Loadout windows to add and remove items from loadouts, related protection lists, and ordered layer lists, more robustly.

Removed the Loadout Manager button from the Protection window. It doesn’t actually work correctly given the need to allow the user to Cancel out of the window.

When doing the User Ordered Layers, I forgot to include support for the overall DR bonus, which comes from an attribute that has no location() or dr() tags. I worked up some code to include support for it.

Added some spiffy new interactive stuff to the Protection window.

You can also now drag the body part boxes around with the mouse in the Protection window. This should greatly simplify creating custom layouts.

Because it’s now so easy to adjust the location of the displayed body part boxes on the paperdoll, I’ve allowed the print/Compact view versions of the paperdoll image to grow the box downward as necessary to display excess content.

When using User Ordered Layers, GCA will now tag each layer’s value in the DR box with a footnote symbol, and the footnote symbol will be associated with the item granting that layer of protection. (The footnote symbols are the standard SJGames ones, without the * of course, so they’ll double and triple up once each of the available four symbols is used.) For now, you can see the symbol associations in the Layers pane (see below) of the Protection window. I’ll see about doing something for the Compact view Protection boxes later.

Testing some stuff: If you have User Ordered Layers, a Layers pane (much like the Layers window) will appear on the Protection window. You can resize this pane. You can click one of the two buttons in it to switch orientation between Horizontal and Vertical. You can click the other button to toggle between three different separators for the DR values: plus sign (the default), bullet, and space.

Body of bits

* Done long ago, but probably not mentioned: the prefix tags for Cultural Familiarities and Languages are CU: and LA:, respectively

* Made some adjustments to bonus handling:

(1) Added support for granting bonuses “to Cultures” or “to Languages”
(2) Added support for granting bonuses to a Cultural Familiarity or Language based on their category using “to CUCAT:<X>” or “to LACAT:<X>”.

* Moved a prefix-tag related routine to a different module.

* You can now save your customized Body Type (locations and image) to a data file from the Locations tab in the Protection window.

* You can now select between the available paperdoll body images on the Locations tab of the Protection window, if the associations have been set in the data files.

* The first draft of the user-ordered armor layering system is now working. This is available from the Layers button on the Protection window. This will allow you to arrange the order in which DR is applied, and will result in the DR values on the paperdoll image being listed out individually, rather than having GCA do its best to combine them into a single value. There’s currently no system in place to show what armor item each layer value comes from on the paperdoll; that’s still something I have to figure out.

* The display of the paperdoll image in the Compact view and when printed now more closely reflects the sizes of the boxes shown in the Protection window. However, the display of the data has also been improved to make better use of the space, which should help when there are a lot of layer values to display:

(1) The “DR:” label is now only shown when DB is also being printed
(2) Content will now wrap within the content area of the box.
(3) The box will allow one additional line of height if needed to display all the content.

Signifibits

* $If() should now support ElseIf blocks.

* Updated verbose data file logging a bit.

* Select()/SelectX() handling will now support use of mixedtype(yes) as synonym for multitype(yes).

* GCA will now reject #newitem() command in Select()/SelectX() that don’t include proper prefix tags.

* Triggers() processing of the various sub-tags now supports initial $function processing of each tag’s contents. This means, for example, that you could use an $if() function to dynamically allow for different possible versions of the same tag, based on other values.

* Triggers() processing of the various sub-tags now supports #BuildSelectList processing of each tag’s contents. In most cases, #BuildSelectList isn’t necessary, or even makes no sense at all. However, it does allow for one way of dynamically changing the intended content of trigger tags based on previous activity in the triggers() tag sequence.

* Added an option to the View > Zoom menu that makes the toolbar icons jumbo sized to better support touch screens. If this looks promising, I’ll expand it out to jumbo-sizing other features as well.

* In support of the jumbo icons, I’ve been moving most toolbar and button icons to the newer image sets that I have, which support larger sizes and alpha channels. Unfortunately, I don’t have the exact same icons in some cases, so some images will look different from what they have been. And I don’t have a 48×48 shield icon at all, so it’s going to look blocky compared to the other icons.

* Added and improved some stuff on the Protection window.

* Traits may now have the location() tag targeted. GCA will currently only create a charlocation() tag if there are bonuses being applied to location(). However, this does allow us to make the Partial: Location modifiers for Damage Resistance more functional, because now their gives could be changed to something like this one for Partial: Arms:

gives(=-Owner::Level to DR, =+owner::level to owner::dr, =arms+nobase to owner::location$)

which will allow GCA to correctly apply the location-specific DR to the correct locations on the paper doll, and will allow the Protection window to display these limited forms in the From Other Sources listing.

* GCA will no longer automatically upscale the Body part coordinates when reading them from data files.

* GCA will now save/load the body part info for the Body corresponding to the “All unassigned items” locations.

* GCA now supports assigning custom images for body types. You can set these in the data files using the [BodyImages] block, where each section in the block corresponds to a body type, and each line in each section corresponds to an image file to use for the body type. GCA will currently use the first image reference it finds, even if it’s invalid (any invalid image will result in GCA using the default image). We’ll expand things in the future to allow the user to select from multiple options, if available. A BodyImages block might look like this:

[BodyImages]
<Humanoid>
test.txt
<Humanoid Expanded>
image_body_locations.png

Note that valid image types are BMP and PNG and whatever else .Net supports natively. (The test.txt in this example was to provoke an error for testing purposes; text files are not valid images.)

GCA will search for the images in the following order: 1) using any fully qualified path that is specified; 2) using any specified path using the standard shortcut variables (%app%, %sys%, %user%, %userbase%); 3) in the System image bin (%sys%\images\); 4) in the User image bin (%user%\images\).

This will also be expanded in the future to allow for removing images for the specified body types.

Complibits

* Random SelectX processing will now support the possibility of incrementing the level of leveled items, and will remove items that fail taboo checks.

* Bonuses now support the ability to declare an exception to the bonus, so that items can exclude themselves from receiving the bonus if they fall under the exception’s parameters.

Create the exception using the new “unless” keyword, which should fall between the “upto” and “when” keywords in the full structure. The full bonus structure now looks kinda like this (order is important!):

‘+2 to SK:Skill [ upto 10][ unless TARGET::tag = 0][ when “running from danger”][ listas “Some bonus text”]

(with appropriate adjustments for types and targets and whatnot.)

Note that the TARGET keyword is also required if you’re looking to create the exception based on the value of one of the bonus receiver’s tags. The Unless block should solve down to a True or False value, much like the If part of the @if() function. The Unless block is fully Solver enabled.

As an example, the bonus for Jack of All Trades might now be written like this:

gives(+1 to skills unless target::points > 0)

(Note that I don’t know off the top of my head if the Jack of All Trades bonus is supposed to apply to all defaults, like the bonus here, or only to defaults from attributes, in which case this example would need additional work.)

I believe every place that gathers bonus information for a trait currently supports these new exceptions, but I may have missed something if it has special handling.

* GCA now supports the triggers() tag. This is a wrapper/processor tag that contains all of the various “command” tags, or tags that are “triggered” by an item being added to a character. This new tag allows for all of those trigger tags to be included and processed in the order desired. Plus, you may include any number of each tag that you may wish. That means you could include an adds() then a removes() and then another adds(). You may also include select() tags, which no longer need to be numbered sequentially; they’ll be processed in the order they’re included within the triggers() tag, as they’re encountered. (If you do number them, GCA will ignore the numbers and still process them in the order listed.)

The syntax for each of the trigger tags within triggers() remains exactly the same.

The existing system for the trigger tags still remains, and still works in the exact same fashion it always has, with the exact same processing order, and the same limitation of one tag of each type. (And for that system, you must still use the sequentially numbered SelectX() tags, as well.) The new triggers() tag contents will be processed first, before any of the old system tags are processed.

Here are all the trigger tags currently recognized by GCA:

addmods(), adds(), bodytype(), charheight(), charweight(), childof(), creates(), mergetags(), parentof(), race(), removemods(), removes(), removesbytag(), replacetags(), selectX(), select(), sets()

Short Bits

* Fixed a display bug in the simple edit area.

* Made some adjustments to the new Resync internals.

* I stuffed in a simpl(e|istic) way to create random characters based on templates. This is basically a simple wrapper and a couple shims that allows for the simple auto-choosing of items in Select dialogs. The Select dialogs will flash on-screen as the process is being done (assuming the user picks a template that actually has selections to be made). This is pretty simplistic in that it doesn’t even have the ability to try different levels of leveled items, will allow taboo items, and so forth. But it’s working. I also stuck a little Random button on the Select dialog, so folks can randomly select options in a particular Select without randomly choosing the others. The Random Character and New Random Character options are in the Tools menu.

Bits

From the beta list post for the newest build:

* Fixed a typo and some sizing things on Loadout Manager.

* Added the ability to turn on and off the display of the toolbars, in the View menu.

* GCA will now remember the border widths, flow direction, and column widths set in the Colors & Layout window.

* Fixed a refresh bug in attack mode boxes.

* Added support for the where() tag (‘Where It’s Kept’) in the Simple Edit dialog for Equipment, for those who like to detail out where each item is placed on their characters.

* Did adjust a couple things in the FastLoad files to see if that would speed up the threaded processing a bit more.

* Mucked about with some stuff on the Classic view trait lists, including something I’m just trying out.

* Mucked about with the Campaign Log window a bit. The window now supports reversing the display order of the log entries, and you can now search through the log entries for a text string (currently very simple searching only, although you can restrict it to only captions or only notes using the prefixes “caption:” or “notes:”, respectively).

* Fixed an issue where clicking on the non-trait-list boxes in the new set of Compact View boxes would cause an exception.

* The Resynchronize function has now been restored. Access the Resync window from the Character menu. I’ve changed some of how the internals work from the way GCA4 did it, which will hopefully allow for more flexibility. I do have some thoughts on additional features that might be nice, so there is a disabled portion of the window (that I may or may not hook up later).

Loadouts & Protection

How loadouts are handled is being seriously upgraded in GCA5, allowing you to change the active loadout and see the changes to encumbrance and protection reflected immediately (see our first post, on Compact View, where you can see the dropdowns for Loadout in the Encumbrance and Protection boxes). This helps make GCA a bit more useful in play, which is something I’m trying to improve.

The big changes in internal handling required the Loadout Manager to be pretty much completely rewritten from scratch, so I took the opportunity to upgrade its features a bit as well.

gca5_loadout_manager

GCA5’s new Loadout Manager

Now, you can see all your equipment and all your loadouts in one grid, which more easily allows you to assign gear to whatever various loadouts you may want to use. (However, equipment contained inside a parent item is not shown; only the parent will be shown.) You can more easily see which items haven’t been assigned to any loadout yet, and you can sort the various columns of the grid as well.

The new loadouts system is integrated with the protection system, so assigning armor is based on the loadout that contains the armor or shield in question. That’s what those little shield icons in the grid mean—the armor on that row is currently being used to provide protection for that loadout.

So, GCA5 links your protection (armor and shields) to the loadout you’re using. That means you need to be able to assign protection based on loadouts, and that’s what the updated Protection window does.

Protection window

Protection window

This window is mostly an update from the existing one, although things have been rearranged a bit. Plus, as you can see in the top left corner of the window, you can switch between loadouts and assign the armor and shields you want to use in each.

GCA5 is a bit smarter in trying to parse down and integrate different armor values into simpler numbers, but we still haven’t yet attempted the more advanced armor system we’ve talked about in years past. That’s still up in the air as to whether I’ll be tackling it for the initial release.

And, for those folks who hate loadouts and don’t use them, your basic GCA4 style functionality is still there for All Unassigned Items, if you need it.

So, there’s a quick overview of Loadouts and Protection in GCA5. I hope you like it.