Some big chonky bits (b192)

This is a much bigger update than usual. I have been putting the money from my Patreon to good use! Much of the new stuff in here is only available now thanks to the funding provided by my Patreon supporters. If you’d like to see improvements, bug fixes, expansions, and more added to GCA sooner rather than later, please consider pledging if you can afford to do so. (Not required, not expected, but very, very much appreciated!)

b192

* Miscellaneous

In Options, Current Character Options, in the Symbols and Optional Display box, some of the text for the options related to showing Break and Malf values was incorrect. Fixed.

The Attributes trait box in Unified View will no longer offer the little increment/decrement buttons if the attribute doesn’t actually support being adjusted.

The Edit Traits dialog will now disable the increment/decrement buttons for attributes that do not support being adjusted.

The colors for the header and border of the applicable modifiers list in the Modifiers dialog have been fixed.

I changed the data type for Penalty in the Hit Location Table lines, making it a string field instead of an integer one. This allows for more flexibility in possible table entries. I have updated the code in various places, including the Hit Location Table object and the Protection dialog, to reflect this change and to allow for unconverted string data.

I added an alias of ‘reskin’ for the tag ‘displaynameformula’ for both traits and modifiers. An alias just means that you can use that name for the tag instead of the expected name, but the expected name is the one that stays in the tag list. So, you can Add Tag ‘reskin’ with a value of “TEST”, and it will appear that way in Advanced Edit Traits until you click OK and the tags are written back to the tag list; at that point ‘reskin’ will become ‘displaynameformula’, and when you open Advanced Edit Traits again, you’ll see ‘displaynameformula’ instead of ‘reskin’. You can also use an alias as a reference, such as ‘me::reskin’ to get the value of the ‘displaynameformula’ tag. NOTE: If you use an alias to Add Tag a tag that already exists in the tag list in its dereferenced form, it’s a crap-shoot as to which tag value you’ll end up with when you click OK.

Made changes in a whole bunch of places where BonusList entries are made, so that the bonus text shows as coming from the giver’s DisplayName instead of its FullName.

Added a couple new BonusListSpecialCaseSubs for use with ListAs, since %name% now returns DisplayName instead of FullName. You can now use %displayname% if you want to, but that’s the same as %name% now. You can also use %fullname% to explicitly get FullName.

Adjusted the ‘name’ provided for the skill that is being defaulted from, when that’s happening, to use DisplayName instead of FullName.

Made it so CTRL+A should select all the text in the Message dialog’s text box.

Some users were seeing the ‘double-click to open the traits dialog’ optional feature in the Trait boxes on Unified not work for some lists. I believe this is because the pop-up menu will sometimes cover the button when the pop-up menu gets pushed upward to avoid parts of it appearing off-screen. I’ve set the pop-up to open to the right of the button, instead of below the button, which I think will fix the issue.

The Solver’s routine for getting an item’s value would return 0 in many cases instead of a negative number, if a negative number was the best or only result in those cases. This has now been fixed to allow returning that negative number if it is the best or only result.

* Templates

We’re seeing some issues with some of the more esoteric features of templates and related traits. It appears that this is because the various features of a template (adding traits and whatnot) are processed before the template itself is calculated. This is necessary, because some of those features might build things that change the template itself. However, without having values yet, even though the template may appear on the trait lists, it won’t appear to exist if something checks for it because it’ll have a level of 0. This can be a problem. So, I’ve moved the basic initialization to occur before the template features are processed, and now do a calculation based on those values. Since most of the template doesn’t exist yet, the results of the calculation at this stage won’t be ‘correct’, but they will provide initial levels and points, so that the trait should appear to exist when checked for. This applies to all traits, because any type may use some template features. Because most of the template isn’t actually initialized yet, the calculation should be very quick, but it also means that if a more comprehensive tag or value of the template is required, it won’t be there until after the template has finished being built.

I’ve created the new flag command #preserve for use with replacetags() and mergetags() in templates. Just stick it into the ‘with’ block somewhere; GCA will strip it out when found, but that will tell GCA not to create a changelog entry for it. (GCA has very few ‘undo’ features, but this is one place where there is some of that, and if you do a replacetags() or mergetags() and then remove the template that performed it, GCA will undo that tag change. Unless you now use #preserve to make it stick.) For example, replacetags(in char with “Profession(Bandit)”) will change (or add) a Profession tag to the character, with a value of Bandit, but removing the template that made that change will remove the tag value again (or change it back to what it was); using replacetags(in char with “Profession(Bandit)”#preserve) will ensure that the profession remains, even if that template is removed.

* ArmorDivisor() / CharArmorDivisor()

Stacking of armor divisor bonuses was not working correctly. Since armor divisor is a multiplicative adjustment, bonuses should multiply, not add. However, bonuses were being granted as adders instead of multipliers, because without any adders, the result would often be 0 (since adders are often used to create the base value, and without any, the base value stays 0).

So, armor divisor has to be handled as a special case, and in this special case, all adder bonuses are treated as multiplier bonuses instead, and a bonus value of 0 is treated as a bonus of 1 instead. Then, when the math is handled to sum adders together to get the base, GCA ensures that a base of 0 becomes a base of 1. The multipliers are then multiplied against that base.

GCA must also do something similar for all targeted text bonuses, since that has been the only way to create a bonus that only applies to certain modes. However, that creates or modifies the base value based on the orginal mode tag value, which could somehow cause a problem at some point (although right now I haven’t seen it). So, if a text bonus to armordivisor$ must *not* be pre-solved and converted to a multiplier as is now done, use the +noaddcheck keyword. GCA will remove the keyword from the bonus text, and then simply apply the remaining bonus text to the tag value (as is usually done for other tags) before eventually getting sent to the Solver for final evaluation.

Handling this special case in this way means all existing adder bonuses to armor divisor should now work correctly (as multipliers), and if users changed some to be mulitpliers, those should also continue to work correctly.

* Modes and Bonuses

So far, bonuses that need to differentiate by mode have to do a complicated text bonus. That’s dumb, but I just never really noticed it before. Shouldn’t it be possible to target a bonus right to a particular mode, without having to deal with the complex world of text bonuses to the $ version of a tag?

Yes, it should. It does require a little more overhead, because the bonuses have to be checked on a per-mode basis to see if they apply in the current case. But otherwise, it should be possible, and should be so without affecting anything else about how bonuses work, or any existing bonuses.

So, here’s what I’ve done to enable this.

I’ve added a new clause to creating a bonus using gives(), and that clause is ByMode, and it looks like this:

bymode [where] TAG COMPARISON VALUE

The bymode keyword is required but the where keyword is optional (it just helps readability to have it there).

TAG is the mode-enabled tag that you’re looking at, such as ‘damtype’.

COMPARISON is the comparison you’re making, and uses the same selection as Trait Selectors, which are these: is (TAG and VALUE are the same), isnot (TAG and VALUE are not the same), includes (VALUE can be found inside TAG), excludes (VALUE is not found inside TAG), listincludes (TAG is treated as a list, and VALUE is found as one of the list items), and listexcludes (TAG is treated as a list, and VALUE is not found as one of the list items).

VALUE is the value that you’re comparing TAG against.

Right now, this is basically all string/text based, so there’s no less than or greater than or such comparisons. I can add something to do that if needed down the line.

If the ByMode clause exists for the bonus, and the comparison returns TRUE, then the bonus applies for the mode.

Here’s an example gives() that might be applied by a modifier:

=+5 to owner::armordivisor bymode where damtype contains “cut”

This bonus to armor divisor is only applied when the owner’s mode is something that does cutting damage, so if there’s a hammer on the back doing crushing, it will not suddenly get an armor divisor as well.

To make all that new ByMode stuff actually work right in calculations, I also had to touch a lot of places and write some new routines, so that gathering up the applicable bonuses could be done per-mode instead of just once per-tag. Assuming that all of those changes have been done correctly, there should be no difference in results for any currently existing characters or bonuses, but the new functionality should now be available to all mode-specific target tags.

I have now updated the Trait Selector code to allow for better parsing, and to support subcriteria in the selection. This means that if you use ByMode, you can specify subcriteria for the COMPARISON specified, using the keywords “oneof”, “anyof”, “allof”, or “noneof”. This allows you to specify a list of options to use for the TAG value that satisfy or fail the requirement. This makes the template look like this:

bymode [where] TAG COMPARISON [SUBCRITERIA] VALUE

and allows VALUE to be a list of possible options separated by commas (quotes or braces blah blah blah).

Here’s our example using this:

=+5 to owner::armordivisor bymode where damtype contains anyof “cut,imp”

This bonus now allows the +5 to the owner’s armor divisor to be applied for any mode where damtype contains any occurence of “cut” or “imp”.

NOTE: many combinations of COMPARISON with SUBCRITERIA will make no sense, or will be incredibly confusing to figure out, especially if they’re negative in connotation, such as ‘excludes’ with ‘noneof’. I encourage you to always use positives when possible.

* Build Campaign Book

I’ve made some improvements. The dialog now allows for having a reference library and your book file both. The reference library is basically the same as before if you haven’t saved a book yet, but now you can have one in addition to an active book. This means you can load a book and the reference library and work with the same data you were using before, without having to start all over again. When you load both, GCA will use the book to set all the starting ‘deleted’ traits for you, based on comparing the book against the reference library. This means you’ll be able to improve and refine your book, or add new books to the reference library and add get new traits to add to your book.

It’s important to remember that GCA will not be able to remember the ‘deleted’ traits. Those are filled through a comparison of the book file with the reference library. Any traits found in the library that are not in the book will be put into the Deleted Traits list. Then, you can remove those traits from the Deleted list if they’re ones that you want to include now. This is the only way to ‘add’ new traits from new library books to your campaign book in this dialog. To say again, they’ll have been auto-deleted, and you have to *undelete* them to add them to the book. (Of course you can save traits to your book inside GCA normally, or add them manually if you wish.)

Books saved from this dialog will now include a reference to the library, so if you load the book in the dialog later, it will be able to set the library for you.

You can also change the library you are using as the reference library, and GCA will adjust the traits kept or deleted through the same comparison to the book.

When the Campaign Book includes traits that are *not* in the reference library, GCA will notify you of that, and will add all those traits from the book into the library. It will also flag all of those traits so that it’s clear which are not found in the reference library.

Once you have loaded both the book and the reference library, you’re working strictly with the library data (which may have had book data added to it, if it was missing, as mentioned above). Nothing you do changes the *book* until you save the library to the book.

Also: Fixed a couple bugs in Campaign Settings where changing the Disad Limit would change Base Points instead, and changing Quirk Limit would result in it being set to Disadvantage Limit. Enabled double-clicking in the library list to remove a trait, and in the deleted items list to restore the trait.

* Money

GCA has been updated to *not* include char::campaigntotalmoney in the calculations for the Points Bar to display equipment and money values based on the Remaining Funds and Money attributes, *if* those attributes already include char::campaigntotalmoney in their basevalue() tags.

It did not used to be possible to retrieve the value of the total money earned from the Campaign Log in the calculations for a trait. Once it was possible, it didn’t get applied to the attributes right away, so the value of the Money and Remaining Funds attributes would not correctly reflect actual values once Camapign Log entries were included. The Points Bar values, however, did include the Campaign Log values. This resulted in an unnecessarily confusing disconnect between the character’s value and the value displayed in the UI, and a Money value that would be incorrect when printed to character sheets.

This adjustment should fix that going forward, in conjunction with the changes to the book files that define these attributes. The Basic Set, Discworld, Dungeon Fantasy, and Lite book files have all been updated in support of this change.

As with all changes that include adjustments to data, *existing characters will not have this change*. You must Resynchronize Attributes in order to update a character with the updated attributes.

(If you wish, instead of a Resynchronize, you could manually add “+ char::campaigntotalmoney” (without the quotes) to the end of the basevalue() tag values for Money and Remaining Funds.)

* GCA5.xsd

Changed element ‘penalty’ in GCAHitLocationLine to a string.

* BookCodes.xml

* Data Files

NOTE: The updates to the data files are included here because they were released to my private beta testers. However, they are *not* yet released to the public. When that happens, I’ll post a Package Update notice.

(I’m sorry, but the data files updates here includes both new stuff since the previous update, and stuff that was in the previous update, because I’m just keeping one list that will go up on my blog when the Official Release version goes out.)

————————————————————
Discworld RPG.gdf
————————————————————
[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

————————————————————
Dungeon Fantasy RPG.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

[Body]
<Humanoid>
Updated body part display locations to better fit default image.

[HitTables]
<Humanoid>
Added.
Updated rolls and notes to match those in Exploits, but edited to fit a simple Humanoid body (no extra limbs, tails, wings, etc.)

<Universal Dungeon Fantasy>
Added this table to match the table in Exploits, which includes adjustments and notes for extra limbs, tails, wings, etc.

[Modifiers]
<Arrow>
Flaming
Added

<_General>
Continual Light
Haversack
Resistance
Deflect
All of these added from Matthew Woods, with some adjustments from Armin.

<Melee Quality>
Accuracy
Puissance
Penetrating Weapon
Shatterproof
Defending Weapon
Flaming Weapon
Icy Weapon
Lightning Weapon
Ghost Weapon
Graceful Weapon
Loyal Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Bow Quality>
Accuracy
Puissance
Penetrating Weapon
Shatterproof
Ghost Weapon
Loyal Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Arrow>
Accuracy
Puissance
Penetrating Weapon
Flaming Weapon
Icy Weapon
Lightning Weapon
Ghost Weapon
All of these added from Matthew Woods, with some adjustments from Armin.

<Armor>
Fortify
Deflect
Lighten
All of these added from Matthew Woods, with some adjustments from Armin.

<Shield>
Defending Shield
Deflect
Lighten
All of these added from Matthew Woods, with some adjustments from Armin.

[Disadvantages]
<_General>
Odious Personal Habit (“Constant Humming or Singing”)
Added

Compulsive Carousing
Compulsive Generosity
Compulsive Lying
Added conditional bonuses/penalties.

[Equipment]
<Ammunition>
Arrow (Bodkin Point)
Arrow (Cutting Point)
Crossbow Bolt (Bodkin Point)
Crossbow Bolt (Cutting Point)
Added

<Clothing>
“Clothing, Complete Outfit”
Added

<Weapons>
Composite Bow (ST %choice%)
Composite Crossbow (ST %choice%)
Crossbow (ST %choice%)
Longbow (ST %choice%)
Pistol Crossbow (ST %choice%)
Regular Bow (ST %choice%)
Short Bow (ST %choice%)
Added modes for Standard Point, Bodkin Point, Cutting Point, and Flaming: Follow-Up

<Other Magic Items>
Bottomless Purse
Cornucopia Quiver
Gem of Healing
Ironskin Amulet
Moly Amulet
Necklace of Fireballs
Salamander Amulet
Serpent’s Amulet
Siege Stone
Wizard’s Staff
Wizard’s Wand
Added.

[Spells]
<Movement:Mo>
Added SP:Quick March (Druidic)

————————————————————
Dungeon Fantasy RPG – Companion 3.gdf
————————————————————
Book added. Thanks to Matthew Woods.

————————————————————
GCA5 Symbols.GDF
————————————————————
[SYMBOLS]
A number of the rules referred to the _Cinematic.png image. That image was removed a long time ago, but the rules weren’t updated to reflect that. That is now fixed.

————————————————————
GURPS Basic Set 4th Ed.–Characters.gdf
————————————————————
Corrected some ‘enegy’ typos to ‘energy’.

[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

[Advantages]
<Mundane Social, Mundane, Social>
Pitiable
gives(+1 to SK:Panhandling) changed to gives(+3 to SK:Panhandling)

[Body]
<Humanoid>
Updated body part locations to better fit default image.

[Equipment]
“Auto Shotgun, 12G”
Removed the duplicate malf() entries from each newmode().

————————————————————
GURPS High-Tech Pulp Guns Volume 1.gdf
————————————————————
[Equipment]
Added quotes around so very many item names.

Colt Model 1878
H&H Paradox Gun
Winchester Model 97
FN-Browning Auto-5
H&R Model 8 Standard
Merkel Modell 145
Winchester Model 12
Greener Police Gun, 14.5G 2.56”
Remington Model 17, 20G 2.75”
LeFever Nitro Special, 12G 2.75”
Ithaca Auto & Burglar, 20G 2.5”
Ithaca NID Field, 12G 2.75”
Winchester Model 21, 12G 2.75”
Remington Model 32, 12G 2.75”
Manville M12, 12G 2.75”
Removed the extraneous mode() tag.

Greener F35 Far-Killer
Removed the extraneous mode() tag.
Renamed second newmode() to Slug.

Winchester Model 1887
Removed the extraneous mode() tag.
Removed the second newmode() tag because it was largely a duplicate of the first, and the other stats didn’t seem to make sense for that.

————————————————————
GURPS Lite 4th Ed.–Characters.gdf
————————————————————
[Attributes]
Money
Remaining Funds
Both of these now include “+ char::campaigntotalmoney” in their basevalue() so that they will include money received through the Campaign Log as part of their totals. Normally, GCA automatically adds that value to these attributes when making calculations for the Points Bar display, so it needs to be updated to *not* do that when it is already included in the attribute score.
* This change will not affect existing characters unless you Resynchronize the character and check the Attributes box. *
* If the Money $ display on the Points Bar does not match the Money attribute on your character, be sure that you have Resynchronized Attributes and that your GCA5 version is higher than 5.0.192. *

————————————————————
GURPS Low Tech 4e.gdf
————————————————————
[BODY]
<Humanoid – Low Tech>
Now showing Chest and Abdomen instead of Torso.
Updated body part locations to better fit default image.

[HitTables]
<Humanoid – Low Tech>
Added this hit location table to go along with the Body “Humanoid – Low Tech”.
Some of the hit penalties here are worked out with Kromm because they’re not specifically noted in the book.

[Equipment]
“Qian Kun Ri Yue Dao”
Fixed a missing comma between a couple newmodes()

————————————————————
GURPS Martial Arts 4e.gdf
————————————————————
[Equipment]
Large Hungamunga
Removed the tag mode() from newmode(Thrown).

————————————————————
GURPS Powers 4e.gdf
————————————————————
[Modifiers]
<Damage Resistance>
Force Field
Added gives(=All+nobase to owner::location$) to automatically change DR to cover all locations

————————————————————
GURPS Steampunk 3 – Soldiers and Scientists.gdf
————————————————————
Book added. Thanks to Gareth Parker.

————————————————————
GURPS Thaumatology 4e.gdf
————————————————————
Section for Raw Magic added to end of file. (Thanks to Symbiode)

[Advantages]
<Raw Magic>
Raw Magic Store
Added

[SPELLS]
<Meta-Spells>
Detect Raw Magic
Analyze Raw Magic
Process Raw Magic
Added

<~Ritual – Meta-Spells:MS>
Detect Raw Magic (Ritual)
Analyze Raw Magic (Ritual)
Process Raw Magic (Ritual)
Added

————————————————————
GURPS Ultra-Tech 4e.gdf
————————————————————
[Modifiers]
<Melee Quality>
Composition: Hyperdense Blade (TL11)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=5 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 5), (“imp”, 5) ) to owner::armordivisor$”

<Sword Class Quality>
Weapon Quality: Superfine (TL9+)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=2 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 2), (“imp”, 2) ) to owner::armordivisor$”

Composition: Monowire Blade (TL9^+)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+10 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 10) ) to owner::armordivisor$”

Composition: Vibroblade (TL10)
Composition: Vibroblade (TL11)
Composition: Vibroblade (TL12)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+3 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 3) ) to owner::armordivisor$”

Composition: Nanothorn Blade (TL11^)
gives()
“=nobase to owner::armordivisor” changed to “=nobase to owner::armordivisor$”
“=+10 to owner::armordivisor” changed to “=+@textindexedvalue( $modetag(damtype), (“cut”, 10) ) to owner::armordivisor$”

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.