-------------------------------------------------------------------------------- B356 - RELEASE VERSION -------------------------------------------------------------------------------- Addressed issue with missing files in data sets improperly getting created as 0 length files, and therefore appearing to exist when they should not. The #DeleteByTag command can now use EchoLogShort instead of EchoLog. EchoLogShort will only print the command itself, and each trait that's being deleted, to the log. Added quotes around modifier names saved to data files by GCA as part of a template or trait. ----- Changes to Installer: Will delete old versions (if user approves) of outdated data files. Will move GURPS Basic Set 3e data file (if it exists) to data files\3e books\ folder. -------------------------------------------------------------------------------- B355 -------------------------------------------------------------------------------- * GCA will now remove unused trait list categories automatically after loading data files. This renders #DeleteCat obsolete. * Data file command LoadAfter= now supports LoadAfter=All, which tells GCA that the file should be loaded after all other regular data files. Multiple LoadAfter=All files will not conflict with each other, so long as they make up all of the last files loaded. If one must be loaded after another, you can still use LoadAfter=,All or Requires=. * Changed button text on trait tabs/dialogs from "Customize" to "Customize..." * Added support to #DeleteByTag for some special case "comparisons" that can be done when working with Text. can use the format HasInList or Contains . In the HasInList case, the being checked will be considered to be a comma delimited list, and the must match one of the items in that list. In the Contains case, the whole string of text in the will be looked at, and if appears anywhere in the string, it will be considered to match. Both of these are case insensitive. * Added support for an Unless clause in #DeleteByTag, to allow for an exception to the rule. Unless supports all the same comparisons as the standard clause. You create an Unless section by including the keyword Unless followed by the comparison to be made. You may also include the same Numeric or Text designations immediately after the Unless keyword, if you want to use a different type from the base comparision. Here is an example: #DeleteByTag Equipment, Numeric IgnoreEmpty EchoLog, techlvl >= 5 unless $ techlvl contains ^ * Added support to #DeleteByTag for two additional special text comparison operators: IsNumeric and IsNotNumeric. These test if the tag value would qualify as a numeric value or not. While making a Numeric test, remember that non-numeric values usually evaluate to 0 (or the value of any numbers beginning the text). If testing IsNumeric, it only qualifies as true if the entire value qualifies as a number. An example: #DeleteByTag Equipment, Numeric IgnoreEmpty EchoLog, techlvl < 5 unless $ techlvl IsNotNumeric A numeric test of the techlvl() tag would be done, and a number of special cases would be deleted if not saved by the Unless clause, which allows for preserving those values due to the fact that they're not actually numbers, just text that were converted to 0 for the simple numeric comparison. -------------------------------------------------------------------------------- B354 -------------------------------------------------------------------------------- * GCA will now include existing taboos in the Needs Check results. * Edit Item Advanced renamed Advanced Edit. * GCA will now honor displaycost() and displayweight() for equipment items. * When turning off a custom trait list filter, GCA should now correctly restore the display to All categories if the filter was the previously selected category option. * Changed the order of a couple things in the calculation code. This should result in certain types of situations reflecting accurately/immediately a bit more often. * Added a new data file command: #DeleteByTag , , is the list to look in, such as Skills, Equipment, or All for everything. is everything needed to specify what GCA should do with the comparison; usually, this means specifying Num or # for a numeric comparison, or $ or Text for a text comparison; this will vary by tag. You can also specify IgnoreEmpty to have GCA ignore tags that are empty (this prevents IsEmpty or IsNotEmpty from working; see below), and EchoLog if you want to fill your log with endless lines of GCA showing you what it looked at and did or didn't delete as a result. is the name of the tag, the comparison to make, and the value you're looking for. The tag name should be exactly as used by GCA, and the value should be the exact text or number to compare against. Valid comparisons are >, <, =, >=, <=, or <>. Also, because comparing text for/against an empty tag can result in unexpected behavior during text comparisons (numeric comparisons convert empty tags to 0, so use IgnoreEmpty for those if 0 doesn't work for you in such cases), there are two special text comparison operators that have no "value" portion, and these are IsEmpty and IsNotEmpty. IsEmpty counts as True if the specified tag is empty, and IsNotEmpty counts as True if the tag is not empty. Here are a couple examples: #DeleteByTag Equipment, Num IgnoreEmpty, techlvl < 5 This command will delete any equipment items that have specified a techlvl() tag, and for which the numeric value contained in that tag is less than 5. Note, however, that Numeric comparisons convert text values to numbers, and if there's not a number as the text value, it is probably going to convert to 0. This means that in our example here, traits such as "_New Armor", that have a techlvl([techlevel]) like this, will appear to evaluate to techlvl(0), which means in our example it would be deleted. To avoid this kind of result, you'll probably need to do a Text comparison, and compare each techlvl you want to delete, like so: #DeleteByTag Equipment, Text IgnoreEmpty, techlvl = 0 #DeleteByTag Equipment, Text IgnoreEmpty, techlvl = 1 #DeleteByTag Equipment, Text IgnoreEmpty, techlvl = 2 #DeleteByTag Equipment, Text IgnoreEmpty, techlvl = 3 #DeleteByTag Equipment, Text IgnoreEmpty, techlvl = 4 Be aware that in this particular example, there are a number of traits, such as "_New Innate Attack", that are currently marked as techlvl(0), which you probably don't really want to delete. But, for our purposes here, this set of commands would delete everything below techlvl(5), but not delete traits with other text values. #DeleteByTag All, Text, x IsNotEmpty This command will delete any trait where the x() tag has anything in it at all. (This would remove pretty much everything in GCA that appears with a little wrench icon next to it in the Available lists.) -------------------------------------------------------------------------------- B353 -------------------------------------------------------------------------------- Edit Items (Simple) window renamed Simple Edit. Added TL box on Simple Edit, if the trait being edited already has a value for TL. Added 'familiarities' to Full Edit list of tags supported. If a familiarities() tag already exists for a skill item, a Familiarities box will appear on Simple Edit. If there isn't one, a button will show under User Notes that allows for adding one. (I'm not sure if the button is really worth the effort, as it only saves us displaying one line, albeit a line that will rarely be used.) Addressed issue with character tab not updating name correctly when entered. There is now a "Customize" button to the right of the category drop-down list on the trait tabs and dialogs. This brings up the window that allows for customizing the category selection process used to display traits in the Available and Character trait lists. It's possible to include or exclude traits based on selected categories in various ways. GCA will place the created filter in the category drop-down so that it can be used along with the standard single category filtering. (For now, only one custom filter per trait type can exist at any time.) -------------------------------------------------------------------------------- B352 -------------------------------------------------------------------------------- Fixed variable re-initialization issue with ::damage$ multipliers. Fixed issue with GCA crashing if the same sheet is listed more than once as the default or alternate character sheet. Increased GCA's minimum allowed height and width. -------------------------------------------------------------------------------- B351 -------------------------------------------------------------------------------- Fixed bug where being in the Character Name or Player Name fields on the Attribute tab would result in the corresponding name being changed on a different character if you changed to that character while still in the edit field. Changed how preservation of #message is handled for modifiers, so it won't affect traits. Reduced font size a bit and adjusted the height slightly of the 'level name' field in Simple Edit, to better display level names that are long and take up two lines in the field. Fixed display issue in Message dialog when Cancel button is showing. Added support for targeted ::damage$ with multipliers. Incorporated another flag in the header portion of a data file. LoadAfter= designates that the file should be loaded after any of the files listed, if they're being loaded. The portion of LoadAfter= should be the full name of the GDF file (without path info), and can consist of multiple file names separated by commas. File names may be enclosed in quotes or braces if they might contain a comma. LoadAfter= is intended for specifying files that this file may modify or make use of, but that are not actually required. -------------------------------------------------------------------------------- B350 -------------------------------------------------------------------------------- GCA will now not complain (to the log) as often about unknown directives that are actually just valid data from other tags. Incorporated another flag in the header portion of a data file. Requires= designates files that should be loaded *before* this file in the load order. The portion of Requires= should be the full name of the GDF file (without path info) that must be loaded, and can consist of multiple file names separated by commas. File names may be enclosed in quotes or braces if they might contain a comma. Requires= is intended for specifying files that this file is dependent on to work correctly in the loading stages, not necessarily for files that should be loaded when things are being added to the character. If the file includes commands that change previously loaded data definitions, for example, Requires= would be a good bet. Updated Equipment traits so that equipment that is a meta-trait (it has owned traits) will include the cost and weight of owned traits as part of the final base cost and weight of the owning trait. NOTE that this is significant, because it functions differently than how parent/child relationships are handled, where the cost and weight of children is included as an add-on to the cost and weight of the parent. To illustrate, Example 1: item A weighs 100 lbs, and owns item B which weighs 50 lbs; item A will be considered to weigh 150 lbs, and incrementing the count for item A will result in two of them weighing 300 lbs total. Counter, Example 2: item A has item B as a child item; item A is still considered to weigh 100 lbs, so incrementing the count will show a final weight of 250 lbs -- 200 lbs for two items A, and 50 lbs for one child item B. Changed the words "Damage Breaks" to "Damage Conversions" where presented to the user. -------------------------------------------------------------------------------- B349 -------------------------------------------------------------------------------- The #message directive is no longer removed when traits using it are added to the character, so that it can be re-displayed if modifiers are duped-n-pasted to other traits. Fixed a bug in needs checking where a needed trait without a prefix tag relied on the default requirements for its type, and would incorrectly be considered satisfied so long as it had any value at all, even 0. This largely affected only spells, as in most other cases needs() includes prefix tags for all referenced traits. (This bug can be seen in previous builds by adding a simple spell with only one or two pre-req spells, setting all points to 0, then checking needs--all should be incorrectly marked as satisfied.) Added code to de-GCAbabble needs text presented to the user a little bit, so they'll see ">=1pts" instead of ">=1::baseappoints". -------------------------------------------------------------------------------- B348 -------------------------------------------------------------------------------- * In needs() checking, if 'pts' are specified in the need, GCA will now check the baseappponts() tag, instead of the points() tag, to verify if that number of points are 'spent' on the trait. * Incorporated a system to flag some additional issues with data files. In the header portion of a data file, where the Program= and Description= lines are, you can now use Incomplete=Yes to designate an incomplete or unfinished data file, WorldBook=Yes to designate a World Book (which often contains changes to Basic Set assumptions, and therefore will almost certainly clash with other World Book files), and Taboo= to designate taboo file(s) that shouldn't be loaded with this file. The portion of Taboo= should be the full name of the GDF file (without path info) that must be avoided, and can consist of multiple file names separated by commas. File names may be enclosed in quotes or braces if they might contain a comma. Note that Taboo= is intended for alternate baseline files that most certainly will clash, such as Lite vs Basic Set. WorldBook= is intended for most other cases of possible incompatibilities. At this time, these flags are only checked when in a window that allows for changing the current data files, or data files in a data set. If the user does not choose data sets at startup, and never changes their loaded files, they'll never see the warning dialog. Incomplete= is mostly for convenience. If the other issues exist, GCA will pop up a message box, and allow for correction of the condition before leaving the file choosing dialog. If only Incomplete= exists, it will simply be logged. WorldBook= issues will only arise if more than one WorldBook=Yes file is loaded, and Taboo= issues will only arise if loading files specified in a Taboo= line. A sample file header might now look like this: Version=3 * The version information above MUST be the first line of the data file Description=Armin's data file for testing stuff _ and for allowing for testing of various things. Program=4.0.347 Incomplete=Yes WorldBook=Yes Taboo=My Custom Data.gdf -------------------------------------------------------------------------------- B347 -------------------------------------------------------------------------------- Targeting ::basepoints has been removed. The implications of allowing for such a thing originally were not fully considered, and it does not work as intended. It's also unnecessary, as simpler changes fulfill the needed functionality. Added the baseapppoints() tag. This is similar in function to the apppoints() tag, except it includes only the effective points in the skill (from bonuses or any other sources) before any effective "default" points are included. This allows checking for points spent in the skill from any source, including from user bonuses or bonuses from other traits. When GCA generates needs() items from adds() or creates() items, it will now put quotes around the added item's name (and prefix) in the needs() item that it creates. -------------------------------------------------------------------------------- B346 -------------------------------------------------------------------------------- Damage multipler modifiers calc code was inadvertantly disconnected during testing, before building the last build. It has been restored. -------------------------------------------------------------------------------- B345 -------------------------------------------------------------------------------- GCA should now allow bonuses to a skill's ::basepoints target. This is a special case bonus that will include the bonus points in the total points displayed in the Pts column, and is treated in nearly all cases just like points that have been spent by the user to raise the level of the skill. GCA should now allow bonuses to a weapon's ::effectivest target. This is a special case bonus that will improve the effective ST score for the calculation of muscle-powered range and damage, if applicable, by the bonus given to this target. This bonus will work with damagebasedon, or with standard damage entries; it will not work with damage that already makes use of the @thr()/@thrx() or @sw()/@swx() specialty functions. GCA now loads data files slightly differently, which should be a tad bit faster, and should be forgiving of different line endings (LF instead of CR/LF, or CR instead of CR/LF). First draft of handling damage multiplier modifiers. Such modifiers are applied before any other modifiers are included. Updated #Clone command to correctly work with target names that include commas. This means that a command such as #Clone "AD:Empathy" as "AD:Bard-Song, Empathy" will now work. -------------------------------------------------------------------------------- B344 -------------------------------------------------------------------------------- The Modifiers window now has an available description pane, like the trait windows. If open, this will show the modifier group, the name of the modifier, the page (if any), and the description of the modifier (if any) for the selected modifiers in the Available list. Block for Conditional Bonuses being received will now appear in Simple Edit (if any). The first bit of text in the Description block of Simple Edit will now be the item's page number, if one is available. The Modifiers' Simple Edit window now contains a block for Description, and above that a line for the modifier group the modifier is from. GCA should now better immediately recalc mode values for range and such when the DamageBasedOn value is changed in the Simple Edit window. -------------------------------------------------------------------------------- B343 -------------------------------------------------------------------------------- GCA was not honoring round(down) tags for modifiers if the last modifier processed in the tier had no round() tags. That has been fixed. Fixed issue that resulted in modifiers being wrapped in double braces instead of single braces, when saving characters as templates to data files. Range calculation of muscle-powered ranges should now replace the "ST" keyword with "ST:Striking ST", or with the DamageBasedOn value, if there is one. NOTE: If you add a modifier that adds a new mode with the weapon, such as adding Bodkin Point arrows, you may need to do some editing acrobatics to see the correct ranges with DamageBasedOn--you'll need to copy the DamageBasedOn value to the other modes, or delete it from the first and put it into the general field, and then you'll need to re-open the Modifiers window, and click OK, to get recalculated ranges to appear correctly. It's unfortunate, but due to the way many of those modifiers are constructed, they need to be calculated when they're initially created by the modifiers, and that calculation will often result in using the default Striking ST, rather than any value you originally entered for the first mode's DamageBasedOn. You'll need to do this any time you change the DamageBasedOn value, as well. GCA should no longer crash when loading/creating a character and the toolbar is not displayed. The Close Character button on the menu bar should no longer disappear from the current character when the character is saved. GCA will now attempt to verify that the running version is correctly patched, by checking it's CRC32 value against one stored for it in the 'gcacheck.crc' file. It will do this only the first time it's run for any particular version if the CRC check matches the stored value. This will slow down the launch of GCA that first time, but shouldn't have much impact after that if the CRC was valid. GCA should no longer try to calculate features of weapon modes while typing into the DamageBasedOn fields. GCA should instead wait for you to leave the field before performing the calculations. GCA will now use a processed form of the gives() values that it displays in the Simple Edit window. This means that if a formula is used to determine what the bonus is, just the result will be displayed, rather than the entire formula. The rest of the expression will be displayed as listed in the gives(). The full text of the bonus will be available normally in the Full Edit window. -------------------------------------------------------------------------------- B342 - RELEASE VERSION -------------------------------------------------------------------------------- Added Vista as a recognized Windows version. On the Options window, Default Character Options tab, changed Character Options frame title to Default Campaign Options. -------------------------------------------------------------------------------- B341 -------------------------------------------------------------------------------- Added code to catch unknown Windows version for Vista in future build. Special case added for #mergetags handling of initmods(), since initmods() separates sections with the | character, instead of the standard comma. When saving traits from the full Edit window, GCA will now save multiple levels of modifiers, if applicable. Modifier forceformula(yes) should now be honored for multiplier mods. A modifier with modifiers can set "roundmods(no)" to *not* round off the calculated values of the modifiers being applied to it. (This is the only way to prevent rounding of fractional values if any modifiers to the modifier exist.) Modifiers will now store a numeric only version of the modifier's value in the valuenum() tag. This won't include any operator signs, or percentage signs, but will include a - if the value is negative. Updated QuickView to support infinity symbol for armor divisor. Updated QuickView and Simple Edit to support weapon radius. -------------------------------------------------------------------------------- B340 -------------------------------------------------------------------------------- When sorting character traits by clicking on column headers, GCA will now ensure secondary sorting by fullname. Added a dialog to modifiers that use addmode(), which warns users of the undoable change made if that modifier is added. This dialog includes an option to turn off future warnings. Changed dialog alerting users of duplicate template components, to allow for turning off those alerts. Added a new section "Alert Dialog Options" to the Options window, Program Options tab, which allows for setting/unsetting the two dialog options mentioned above. Added modifiers button to Table View of attributes tab. The Normal View works differently, and additional work would be required to add a modifiers button on that view. Font for mode display listings in Simple Edit changed to Arial to support special characters. When Resynchronizing, GCA will now re-process any addmode() tags from modifiers. -------------------------------------------------------------------------------- B339 -------------------------------------------------------------------------------- * Support for 'nocalc' added to calculation of charrange tags. * Modifiers now support the initmods() tag. * ItemsByType collections added to character, for referencing lists of traits directly by type of trait. On a character sheet, these would be used like "Char.ItemsByType(ItemType).Item(curItem).TagItem("hide")" or whatever. * ItemsByType can also be ordered by specified tags. Referencing the ordered list would be done using OrderedItem() instead of Item(), like so: "Char.ItemsByType(ItemType).OrderedItem(curItem).TagItem("hide")". Note that the 'curItem' index into OrderedItems *must* be a numeric index, not a collection key. This is intended to be used in a loop, and it does *not* support the use of string keys. To create the OrderedItem listings, *which must be done before using them, or any time items may have changed*, call the OrderItems method, like so: Char.ItemsByType(ItemType).OrderItems. To set the order to use, use the OrderBy method, like so: Char.ItemsByType(ItemType).OrderBy "orderdefinition" "orderdefinition" is a comma separated list of tag names, each tag name suffixed with a + or - and a $ or #, like this: "points-#, fullname+$". The + or - denotes ascending or descending, the # or $ tells GCA to treat the data as numeric or text. Leaving off the +/- and/or $/# will result in GCA treating it as ascending and/or text, depending on what's missing. Note that sorting numeric data as text often gives unsatisfactory results. In the example shown, the traits are being sorted in descending order of points, and items with the same point costs are sorted by name in ascending order. Setting the OrderBy only needs to be done once per session--it'll be remembered in subsequent uses, until it's changed. Setting an order does not affect the order of child items. * Clicking on the header row of the lists of character trait data in the trait windows will set an OrderBy for that window's character data, by the column clicked. Clicking it again will reverse the order. Clicking the header of the icon column will simply cause the data to be refreshed (for example, sorting by points, and then raising the point value of a trait will not cause it to move in the displayed order until something else happens to cause a full refresh, such as adding or removing another trait, or clicking in the header row). GCA will remember these settings between sessions. * GCA now uses the character ItemsByType lists for displaying in trait windows. -------------------------------------------------------------------------------- B338 -------------------------------------------------------------------------------- The New toolbar button on the template builder should now work. The Template Builder will now support setting attributes to values using sets(). Calcing of charradius() upgraded again, to support some included unit markers, as per calcing range values. Made change to routine handling creates() to support == assignment operator. Made change to routine that examines assignment operators to better avoid finding operators in the middle of protected text (text inside braces, parens, or quotes). It should no longer be possible to crash GCA by double-clicking the Load Now button in Options. Adds() and creates() modified to propagate the value of a template's hides() tag to component's hide() tag. Templates can now use the new lockstep(yes) tag to try and require that component ads/disads have the same level as the template. A template must have a multiple cost in the standard format, even if it is 0/0 or something, in order to be leveled. -------------------------------------------------------------------------------- B337 -------------------------------------------------------------------------------- Addressed some type conversion issues in Simple Edit. Adjusted the code for saving templates from the builder to a file. Added some capping to things related to trait scores and levels. Trait scores can be calculated, but if they're level based (you can increment/decrement them), they're limited to 2 billion levels. Allowed for larger values to be returned from @thr() and @sw(), but the values they'll support are capped at 2 billion. Charradius() calculation expanded to handle multiple modes. Addmode() support now evaluates radius() tags. Addmode(), when evaluating armordivisor(), will set the mode tag value to "" when the evaluated value is 0 or 1. Template Builder saving to file is now smarter, and will save to the existing Templates section if one exists in the file already. Made a couple more changes to stuff affected by the Double adjustment. Made some adjustments to the damage calculation routine for items. -------------------------------------------------------------------------------- B336 -------------------------------------------------------------------------------- Added automatic determination and support of multitype(yes) to SelectX() of templates written from Template Builder. Template Builder will now remember various sizes and states. Creates block now working in Template Builder. When a modifier uses addmode(), GCA will now calculate a number of tag mode expressions for the mode being added (as best it can, in a similar fashion to how they're calculated if a bonus is applied). The tags listed here will be evaluated: armordivisor, acc, rangehalfdam, rangemax, shots, minst, reach. Bear in mind that they will not necessarily be evaluated as you might expect, for example, having a new mode Reach of "%copyfirst+5" with a mode 1 Reach of 1, will not result in a Reach of 6, because GCA does not determine charreach() based on simple math evaluation--you'll see a Reach of 1+5 instead. If you want to evaluate the two into a single number, you'd have to use "$eval(%copyfirst+5)" to get the Reach of 6. As I said above, for each tag this will be no different than how GCA determines charX values, but it gets put into the base tag, not the charX version, so exactly what happens will vary by the tag being evaluated. The raiseruleof() tag as a feature of modifiers has been removed. Instead, it is a tag on an attribute that allows for raising the Rule Of cap for defaults from that attribute by the value of the raiseruleof() tag. This tag can not be manually set--it will always be calculated/reset by GCA based on target tag bonuses targetted at ::raiseruleof for the attribute in question. Addressed type conversion issue in GetItemVal for empty values. And even more changes made in an attempt to get things working right for the Double adjustment, including code changes to the Evaluate routine to support addition and subtraction with exponential numbers. -------------------------------------------------------------------------------- B335 -------------------------------------------------------------------------------- Missed a bunch of necessary changes for the Double adjustment. Changed those. -------------------------------------------------------------------------------- B334 -------------------------------------------------------------------------------- CalcRange set to always calculate. A number of data type changes were made to support the use of a Double type for attribute scores. I made more changes than were strictly necessary for the intended application of the Double type, but I wanted to head off a number of potential problems based on related changes, since it's likely a reference might happen to the extra large value somewhere in some data that it probably shouldn't. -------------------------------------------------------------------------------- B333 -------------------------------------------------------------------------------- Added support for CTRL+SHIFT+D, CTRL+SHIFT+P duplication/pasting of a trait's modifiers to the attributes window. Added support for a special tag for modifiers: raiseruleof(). Normally, the RuleOf setting caps skill defaults from attributes at 20. A modifier with this tag, applied to an attribute, can raise the RuleOf cap by the level of the modifier when a skill is being defaulted from the attribute. The raiseruleof() tag is math enabled, and should evaluate to a non-zero value to be turned on, and should contain nothing/not exist, or evaluate to a zero value, to be turned off. Calcing charminst() should now round up any fractional values. Simple Edit should no longer crash returning from the Mods window if a mode-adding mod was applied. The campaign TL should no longer be incorrectly reset to the default value when using the Campaign Log. Made small adjustment to bonus handling code so target tagging ::level or ::points would work correctly. In the addmode() feature of modifiers, %copyfirst and %copyprev are now replaced in place with their respective values, so they may be used as part of a longer expression. Added additional features to the needs block in the template builder. -------------------------------------------------------------------------------- B332 -------------------------------------------------------------------------------- Additional work on template builder, including fix of crash on minimize, appearance adjustments, and a splitter between trait lists and builder features. Added simple Prereqs block. In character sheet options, the entire character sheet script is now loaded, so included helper functions and such may now be used. Remember that there is no print wrapper available, however, so don't try running code that depends on any of the printing related features. DebugLog has been made available. -------------------------------------------------------------------------------- B331 -------------------------------------------------------------------------------- Added support for the childof() tag, which allows for specifying a trait which the added item is to be made a child of. Usually, you'll want to add that item with adds() or something, first, or otherwise ensure that it's likely to be on the character already. If the trait being targeted by childof() is not found, the item is still added to the character, just not as a child. Changed text in weapon mode displays on QuickView and Simple Edit to remove the word Mode. Corrected small issue with trimming spaces around assignments in adds(). A good deal of work has now been done on a template builder window. More is needed, but this will give a sample of the direction I'm going, and give a basis for comments. You can find it from the Tools menu. Everything currently on the window should be functional, including the ability to save what's there to a template in a data file. -------------------------------------------------------------------------------- B330 -------------------------------------------------------------------------------- Fixed some issues related to the new DamageBasedOn() handling in Simple Edit. Made some additional changes to the way DamageBasedOn is handled between the main drop-down, and the per-mode versions. Changed the code handling the way "thr" and "sw" are replaced when using DamageBasedOn. -------------------------------------------------------------------------------- B329 -------------------------------------------------------------------------------- Fixed a number of instances in GCA where it looked for a hide() tag to have an actual "yes" value, instead of being the flag-tag it was supposed to be. When adding items from a template that makes use of #ChoiceList, you can now use the 'respond' keyword to select an option from that #ChoiceList for the user, much as you can make choices for #Input. The value of the response for a #ChoiceList should be an integer representing the option index to select. The index number is based on the order of the options presented *in the data file* for the #ChoiceList (just as the default options are selected in #ChoiceList)--do not set the choice desired based on the order presented in the pick dialog, as those options are sorted alphabetically, and may not represent the order that GCA will use to make the selection. If you are setting the response for a #ChoiceList that expects more than one pick, you may have your response text be a list of integers separated by commas, but remember to enclose the entire list in quotes, not each separate integer (otherwise it will appear to be responses for separate dialogs). Updated some DamageModeX properties/functions to use ByVal for less nutty interaction with character sheet scripting. Updated Simple Edit to show User Notes field for attributes also. Updated Simple Edit to allow for setting of DamageBasedOn() tag, either globally once, or per supporting mode. This was kind of tricky, so it may not yet be entirely correct. The > carets to the right of the Damage value in the Mode display will pop open the field to set the per-mode DamageBasedOn() value. -------------------------------------------------------------------------------- B328 -------------------------------------------------------------------------------- Addjusted the internal creation/initialization process of modifiers a bit. Modifiers are now ordered alphabetically. Alternatively, by changing an option, they can be grouped by type (% together, + together, - together, etc.) before being ordered alphabetically within type, although that requires closing any open characters and reloading them, or things will get messy. Added an option to Options to allow for trait modifier grouping. As a side-effect of the more controlled modifier handling, pasting modifiers from the buffer to a trait will no longer allow for duplicate modifiers. Added the ability to have a tiny bit more flexibility in the display of lists in the SelectX() dialog, with the addition of the "multitype(yes)" option to the SelectX() tag list. So, in addition to the text(), pointswanted(), and other tags available inside SelectX(), you can now include "multitype(yes)" as one of them, and GCA will display the listings in a fashion more friendly to mixing skill-type items with advantage-type items. (Normally, the SelectX() window expects only one type of trait to be presented, and displays listings with the style appropriate to that trait.) Fixed display of template costs within the SelectX() selection window. QuickView page 3 will now truncate listings to avoid overflowing the page, and will limit Hand Weapon Modes to ensure some space for Ranged Weapon Modes. -------------------------------------------------------------------------------- B327 -------------------------------------------------------------------------------- * The BonusList record keeping has been changed internally, and can now be accessed in two ways: 1) the old way as TagItem("bonuslist") which returns a comma separated list of bonus items, or 2) by individual bonus list items, using the two new item specific functions: BonusListItemsCount() which returns a number containing the number of items in the list, and BonusListItems(Index) which returns a string for the specified list item number (requesting an out of range list item will return an empty string). * Added an input box to the Edit Modifier window to allow entering a level directly, without having to use the spin button or go to the advanced edit window. * Character sheet options can now store an optText item that is blank, even when the default given is not blank. (In the SheetOptions.INI file, the option value will appear as "{{null}}", but GCA converts that to "" internally before returning the option value to the user or the sheet script.) * Page 3: Weapon Modes has been added to the QuickView tab. Nothing is editable, but it gives a nice summary of weapon capabilities. * One or more traits' modifiers can be copied into a buffer by first selecting the traits in the Character list of the appropriate trait tab or dialog (not in QuickView), then pressing CTRL+SHIFT+D. All modifiers from the selected traits are then in the buffer, and can be applied to one or more other traits by selecting the new traits in the Character list of the appropriate trait tab or dialog (not in QuickView), and pressing CTRL+SHIFT+P. This process can result in duplicate modifiers, which is normally not allowed by GCA. You can also do this from the right-click menu within those Character lists, using the Copy Modifiers TO Buffer and Copy Modifiers FROM Buffer options. * Modifiers can now make use of the addmode() tag, which allows them to add a mode to the owning trait. (A modifier to a modifier with addmode() would apply it to the root owning trait, not to the owning modifier.) The format of the tag is like this: addmode(mode name, modetag1(data), modetag2(data), etc()) If specifying more than one mode, they should be separated with | characters, and for safety should be enclosed in braces, like so: addmode({mode1 name, mode1tag1(data), mode1tag2(data)} | {mode2 name, mode2tag1(data), mode2tag2(data)}) Mode names must be unique. If the mode name specified already exists on the item, the data provided will replace the data for that mode, instead of another mode of the same name being created. All data required for a mode must be specified, as data from previous modes will not be carried through. There are two special case variables that can be used as data for a new mode tag, to get data from previous modes: %copyprev will copy the value for this mode from the immediately preceding mode. %copyfirst will copy the value for this mode from the first mode. Be aware that GCA has no way of knowing what the original data was once it's been adjusted with this tag. You can't just delete the modifier, or change some of the addmode() data, and expect GCA to restore the original modes for you. * The following procedures have been added to the Options object for character sheets, which allow for getting/setting data directly from/to the saved options in the sheetoptions.ini file. NOTE: There is normally no need to use these routines, as GCA handles option management for you automatically based on the existence of your CharacterSheetOptions routine. However, having these options would allow you to check for a particular value (say an out of date version) in the CharacteSheetOptions routine, and correct it in the file before GCA loads the options for the user. Function FileGetColor(OptionName As String [, OptionDefault] ) Function FileGetFont(OptionName As String [, OptionDefault] ) Function FileGetList(OptionName As String [, OptionDefault] ) Function FileGetListFlag(OptionName As String [, OptionDefault] ) Function FileGetListNumber(OptionName As String [, OptionDefault] ) Function FileGetListOrdered(OptionName As String [, OptionDefault] ) Function FileGetText(OptionName As String [, OptionDefault] ) Function FileGetTrueFalse(OptionName As String [, OptionDefault] ) Function FileGetYesNo(OptionName As String [, OptionDefault] ) Sub FileSetColor(OptionName, OptionValue) Sub FileSetFont(OptionName, OptionValue) Sub FileSetList(OptionName, OptionValue) Sub FileSetListFlag(OptionName, OptionValue) Sub FileSetListNumber(OptionName, OptionValue) Sub FileSetListOrdered(OptionName, OptionValue) Sub FileSetText(OptionName, OptionValue) Sub FileSetTrueFalse(OptionName, OptionValue) Sub FileSetYesNo(OptionName, OptionValue) The following routine has been added to the Options object to allow for immediately deleting all the saved options for the current sheet. Sub FileDeleteSettings() IMPORTANT: These procedures, if you use them in the CharacterSheetOptions routine, are run when the sheet is loaded for printing/previewing, *and* when the sheet is loaded by the Character Sheet Options window. ALSO, changes you make using the Set or Delete routines can *not* be undone by pressing Cancel in the Character Sheet Options window. -------------------------------------------------------------------------------- B326 -------------------------------------------------------------------------------- Campaign Log caption and notes fields should now correctly remember what you've typed into them when you click around to other items in the Campaign Log window. The notes field should also highlight the current text when you first enter the field, as other fields do. The Character Name and Player Name fields on the Attributes window should now correctly update that data on the character, even if you don't leave the field before trying to Save. Expanded the text, and changed the order slightly, of some options in the Rules Options section of the Program Options tab in Options. GCA should no longer add a useless comma to the front of a needs() listing that was created for a template entirely from added adds() or creates() items. New Simple Edit window. -------------------------------------------------------------------------------- B325 -------------------------------------------------------------------------------- The web links on the Help menu should now go to the correct places. The first web link (Check For Update!) should now be shown. Reorganized some internal operations for when GCA starts up. DamageModeType() now correctly returns a value for the chardamtype tag for the specified mode, rather than damtype. Added support for the parentof() tag, which allows for a list of items which are to be made children of the item when it is added to the character. Usually, you'll want to add those items with adds() or something, first. Note that parentof() will steal the specified items from another parent, if they happen to already be assigned to another one. MinST checks are now based on Striking ST by default, as per the offical statement by Kromm, rather than Lifting ST as we previously thought. If damagebasedon() is specified, that value will also be used for MinST checks. This can be overridden by specifying the minstbasedon() with the preferred value. Character sheets can now refer to .OtherDB synonymously with .OtherPD. Fixed issue of damage functions returning high ST damage values based only on Striking ST, instead of the actual value declared in the functions. Improved trickle-thru recalcs based on bonuses owned by modifiers, which gave bonuses to items not otherwise affected by the modifier's owner. This was an issue in particular cases such as the Arm ST advantage, which uses a modifier to grant a bonus to the One Arm Lifting/Striking ST attributes, rather than doing so directly. Previously, once the bonus was created, that initial +1 would be applied, but incrementing the Arm ST wouldn't continue to increment the attributes unless a recalc on the attributes was initiated. -------------------------------------------------------------------------------- B324 -------------------------------------------------------------------------------- Resync will now preserve usernotes() in traits. GCA should now honor the group() tag on traits. The group() tag allows for including an item in a Group without having to adjust the Groups listing in the data file--in fact, a corresponding Groups listing is not required, so completely off the cuff groups could be created and handled strictly through the use of the group() tag. Any needs() or gives() that affects a GR:Group will affect any item that includes the specified GR:Group in the group() tag. The group() tag works just like a cat() tag, in that it's a list of group names separated by commas. The GR: prefix should *not* be used inside the group() tag. For example, a gives(+2 to GR:Alpha) would affect any trait that had a group(Alpha) tag, as well as any item listed in any existing Alpha group listing in a data file. -------------------------------------------------------------------------------- B323 -------------------------------------------------------------------------------- Changed Find Trait... to Find Traits... on the Tools menu and toolbar. Removed toolbar debugging items from log. The option pages drop-down list in Sheet Options will now filter && to & in the section names. The option pages drop-down list in Sheet Options should no longer be reset when the window is resized. If a NoCalc option is on, and character is being printed, and user says Yes, correctly recalcs secondary features as well as fully recalcing character. In PrintWrapper, minor update to DebugLog function: DebugLog(Text$, Optional Hilite). If hilite = 1, text is Red. In PrintWrapper, added AbortPrintJob property. Set to True, and GCA will not send the job to the printer or screen when the job completes. It's still up to the sheet author to exit from the script gracefully. GCA should now round fractions of .5 or higher to the next higher integer value for CharMinST when some modifier applied to MinST might result in a fractional value. If GCA doesn't find the sheet to be used for print/preview, it uses the default sheet if it can find that. GCA puts a message in the log when this happens. Now, GCA prints the log message in red, and beeps, if this happens. -------------------------------------------------------------------------------- B322 -------------------------------------------------------------------------------- The // comment marker must now either be the first non-whitespace characters on the line, or be preceded by a space within other text, to be counted as a comment marker; otherwise it will be treated as normal text. View menu, Window Tabs option changed to Trait Tabs. Character loading should be fractionally faster. Made some minor text adjustments on Options items. Adjusted layout of items on Data Sets tab. Fixed Resynchronize window to correctly update Body checkbox when Select All or Clear All is chosen. Did some additional work to try catching more empty data sets, or missing files in data sets. Minor changes to allow GCA to load without any actual data. (Will not do anything, but won't crash now.) Special "hidden" feature added: Pressing CTRL+F12 while inside a trait tab page will toggle the interface between tabbed mode and an "MDI-Lite" mode. In "MDI-Lite" mode, the trait tab pages are simple windows inside the workspace. Character Sheet Options window now has the option of displaying the options in one long list (default, existing behavior) or in sections, using a drop-down list. (The sections displayed are determined by the use of the header option by the sheet author.) DEBUGGING: A couple bits of text should now be put into the Logging window when a toolbar option is selected. -------------------------------------------------------------------------------- B321 -------------------------------------------------------------------------------- Renamed Windows menu Tabs. Re-structured and re-organized Options window. -------------------------------------------------------------------------------- B320 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed inability of closed tabs to stay closed. QuickView, if closed, will no longer pop up again anyway. (This issue was introduced during the recent change to the 'tab' version display.) -------------------------------------------------------------------------------- B319 -------------------------------------------------------------------------------- Fixed issue with items that didn't have a minst not having their damage calculated. Fixed issue with damages based on thr or sw not always recalcing in step with changes to base thr and sw. -------------------------------------------------------------------------------- B318 -------------------------------------------------------------------------------- Fixed Protection window to provide access to HP and BaseHP fields for different body parts, in the property list. (GCA does NOT fill these in automatically.) Simple Edit window for Modifiers will no longer lose a changed name extension when you click on the spin button. Simple Edit for traits should now retain and honor the points or level entered if Enter is pressed to OK the window while in the corresponding edit field. Fixed charskillscore check for minst() with "M" (mounted) items. charminst() is now calculated from minst(), and target tag bonuses to minst are now honored. Charskillscore() now uses charminst() for checking against minimum strength usage. Equipment Simple Edit window now displays the charminst() score for the ST field. Rebuilt charshots() calculation to include multiple mode support. Rebuilt characc() calculation to include multiple mode support. GCA will now cap effective ST (or given ST-equivalent value) for melee weapon damage (weapons with a reach() tag) at 3 x MinST. Added the special @thrx() and @swx() functions for damage, which are equivalent to @thr() and @sw(), except their given values will *not* be capped by 3 x MinST. Support for the minstbasedon() tag in calculating the charskillscore has been expanded. It now allows for solvable expressions, and supports modes. -------------------------------------------------------------------------------- B317 -------------------------------------------------------------------------------- * In the PrintWrapper, DrawBox has been expanded a bit to allow for rounded corners: DrawBox(BoxLeft, BoxTop, BoxRight, BoxBottom, Optional ByVal Shadow As Integer = True, Optional ByVal BoxColor As Long = 0, Optional ByVal BoxFillColor As Long = &HFFFFFF, Optional ByVal ShadowColor As Long = &HDDDDDD, Optional ByVal hradius = 0, Optional ByVal vradius = 0) hradius and vradius describe the radius of the circle representing the corner, from the horizontal and vertical directions, respectively (allowing for an ellipse). If you want them to be the same (the traditional rounded corner), then you can set the hradius and ignore the vradius, and they'll both use the same value. If you set hradious to one value, and vradius to another value, you'll get elliptical arcs, which allows for creating a non-symmetrical rounded edges look, if you're into that. Note that using rounded edges is *NOT* compatible with the default Shadow drawing, so if you want rounded edges and a shadow, you should set Shadow = False, and draw the drop shadow yourself. (Drawing an offset darker box for the shadow, and then drawing the box you want at the regular position over the top, works if you know the size of the box you'll need before you print any text to that area--printing the box after the text with this method will cover the text with the boxes.) * In the PrintWrapper, DrawCircle has been added: DrawCircle(CenterX, CenterY, Radius, Optional ByVal CircleColor As Long = 0, Optional ByVal CircleFillColor As Long = &HFFFFFF, Optional ByVal StartPoint = 0, Optional ByVal EndPoint = 0) CenterX and CenterY position the center of the circle on the page, Radius is the radius. Set CircleColor for the color of the circle drawn, and CircleFillColor for the color of the fill, if any. If CircleFillColor = -1 then no fill is used. StartPoint and EndPoint allow you to define an arc of the circle to draw, instead of the entire circle. StartPoint and EndPoint are in radians, and start from the 3 o'clock position = 0. If both StartPoint and EndPoint are 0, then a full circle is drawn. To get a filled wedge defined by the arc, simply set a fill color. To draw just the circle arc without the filled wedge, set CircleFillColor to -1. * In the PrintWrapper, DrawEllipse has been added: DrawEllipse(BoxLeft, BoxTop, BoxRight, BoxBottom, Optional ByVal CircleColor As Long = 0, Optional ByVal CircleFillColor As Long = &HFFFFFF, Optional ByVal StartPoint = 0, Optional ByVal EndPoint = 0) BoxLeft, BoxTop, BoxRight, and BoxBottom define the box that bounds the ellipse. Note that making a square box is functionally equivalent to drawing a circle. CircleColor, CircleFillColor, StartPoint, and EndPoint are all as for DrawCircle. -------------------------------------------------------------------------------- B316 -------------------------------------------------------------------------------- OK should now be the default button on windows where it appears. This is in line with Windows standards, but means that if you're used to pressing Enter to 'finish' editing, you may sometimes find the window closing, because you've "pressed" the OK button. Cancel should now be the 'cancel' button where it appears. This is in line with Windows standards, and means that pressing the Escape key should be the same as clicking the Cancel button. (The OK and Cancel button changes were made due to an annoying issue finally being worked around. Previously, it made things simpler if those buttons were simply not working normally, due to the fact that the Enter key-press that activated the OK button was being passed through to the underlying form, causing odd behavior such as the item you just added to the character being added again--ad infinitum. If you still see this behavior, please let me know where.) If the minst() of a weapon has an 'M' listed after it, GCA will now assume that the weapon is being used in its mounted configuration, and not adjust the charskillscore() for being below the minst() value. Added a BodyFormat option for the DrawBodyPartsPicture stuff. This option is PrintHPValues which can be set to True or False. False by default. This prints HP values if True. Note that this *replaces* the DB values, so you can not print both DB and HP values. (Note that currently GCA does not fill in the HP values, and the user must enter them manually if they wish to make use of them.) GCA will now preserve certain specific suffixes in range calculations, which denote range in miles or kilometers. If the end of the range number ends in "mi.", "miles", or "km" (ignoring case) then GCA will remove that suffix before calculations begin, and replace it after the range has been calculated. GCA now supports limited use of target tag bonuses to acc$ and shots$. -------------------------------------------------------------------------------- B315 -------------------------------------------------------------------------------- Character close button now filled with a light grey color that matches most of the standard menu bar colors. This allows the button to look less odd when highlighted. Character close button no longer appears when no characters are loaded. Apparently a bunch of body parts were part of the wrong groups, and I hadn't previously corrected these as I thought I had. Therefore, even more body parts have been corrected to not be covered by locations that they're not a part of: Head, Eyes, LeftEye, RightEye, Skull, and Face are not part of Full Suit; Neck is part of Body, not Head. Added the body part "All", and all body parts are in the All group. GCA will now Resync the Body upon loading older characters, which had a lot of body part assignment problems. The Resync will not destroy existing DR or DB values, but those values may still be applied to some areas where they do not actually belong. The user will have to fix those manually. Body now appears as an option in the Resynchronize window. Adjusted how the toolbar is built. Included button for Character Sheet Options on toolbar, after program Options button. Added Party Log Entry... to Party menu, for creating a campaign log entry that can be posted to all currently loaded characters. When GCA suggests a file name, it will now change most of the illegal or problematic characters to the underscore character. GCA will now calculate/create the dmg() tag when calculating character damage for a weapon. This will contain thr, sw, or a number equal to the number of dice in damage done. (This is a mode sensitive tag, so may have multiple values for multiple modes.) Note that all values are determined based on the *base* damage for the weapon, not for the damage after any modifiers have been applied. -------------------------------------------------------------------------------- B314 -------------------------------------------------------------------------------- User Interface changes: More tab-centric--no longer able to use interface as "MDI" windows (that's still what it is--that much of a change would take too long at this point--but it won't act so much like it). Character close box on right side of menu bar, instead of window control buttons. Close active tab from right-click menu on tab strip. New menus. -------------------------------------------------------------------------------- B313 -------------------------------------------------------------------------------- * Added an option to save plain text versions of normally RTF text blocks in the character file. (These are saved instead of the RTF versions, not in addition to them.) This affects the character's Notes and Description blocks, and the Notes field of the Campaign Log. In the plain text versions, nearly all text and paragraph formatting is lost,(tabs are included as tab characters), and all line breaks are marked with a "" tag, so that they can be reconstituted by GCA or other tools later. * Load Character dialog will no longer default the File Name to the last file opened during the session. * GCA should no longer save redundant parentkey() and childkeylist() info to the saved character file. * When the option "Allow decrementing to level zero" is turned on, GCA will now put '0' or '-0' on non-leveled traits that are turned "off" by being decremented to level zero, in addition to the existing behavior of setting the cost to 0. * Changed the way we do the stuff for the DrawBodyPartsPicture related stuff. I have removed the options from the call for that routine, so it now looks like this: DrawBodyPartsPicture(char As GCACharacter, PicLeft, PicTop, PicWidth, PicHeight) And the various options we might use are now set in the BodyFormat object, or in its collection of BodyParts, which is parallel to the char.body object items, but contains formatting options. BodyFormat contains only a few properties right now: InitializeBody(Char As GCACharacter) which has to be called with the Char object to initialize the parallel BodyParts collection. DrawAreaBoxes which can be set to True or False. True by default. This draws the various boxes for visible body parts and their armor values. PrintDBValues which can be set to True or False. True by default. This prints DB values if True. FontName is the font to use for the text items. Default is "Arial". FontSize is the font size to use for the text items. Default is 10. Each BodyPart in BodyFormat.BodyParts contains these properties: Name which contains the name of the part, and also serves as an index into the BodyParts collection. BoxColor which is a Long value for the color of the bounding box for the body part. BoxShadeColor which is the background shade of the area inside the bounding box. CaptionShadeColor which is the background shade of the caption (body part name) area inside the box. CaptionColor which is the color of the caption (body part name) text. TextColor which is the color of the rest of the text inside the box. -------------------------------------------------------------------------------- B312 -------------------------------------------------------------------------------- Added ability to load a character "party" from a ".gca4party" file, which is just a list of character files (with full path info). Added Party menu to GCA, after the Tools menu, for Party features. Right now, Save Party List... is the only option on this menu, and it saves the file names of all currently loaded characters to a ".gca4party" file. Added the ".gca4party" extension to the file association section of Options, and to the list of registry entries made by the setup program. GCA will no longer put the calculation times in the log so often. New tag ndl() specifies that the tagged item is not to be included in total disad points measured against the disadvantage limit. ('ndl' is short for 'no disad limit'.) This is math enabled, in that a formula can be used, and any non-zero result will cause the tagged trait to not be included against the disad limit. Added a check box in the Simple Edit window to allow for turning the new ndl() tag on and off. Note that if a formula is specified, the user checking the box on or off will delete or replace that formula, and it can not be recovered short of re-entering it in the Advanced edit window, or doing a resync. The check box will only appear if the point value of the trait is negative. Moved the GM Sheet check box on the simple edit window to the bottom of the window, renamed it "Include on GM Sheet", and placed the new "Do Not Count Against Disadvantage Limit" check box below it. Weights in the Available Equipment list should now all be correctly left aligned. The Load-Out Manager button on the toolbar is no longer enabled if the character has no equipment. Re-worked some things in the Load-Out Manager window: * The default empty load-out is now the "" load-out. * It is no longer possible to select/deselect items in the "" load-out, since that's actually controlled by whether any items are assigned to real load-outs. * When the Encumbrance Load-Out is still set to "", it will update the Load Weight values as items are assigned to/removed from other load-outs. * When clicking OK to close the window, GCA will ask if you're sure about that, if any created load-outs currently have no items assigned to them. (Any load-outs without items assigned to them are lost when the window is closed.) Addressed some internationalization issues related to modifiers with decimal values. Fixed recent issue of templates not satisfying needs for them, because they were no longer being assigned a level. They are now once again being assigned a level of 1. -------------------------------------------------------------------------------- B311 -------------------------------------------------------------------------------- Fixed last minute bug introduced in b310 that prevented the Apply Armor listing from showing any armor. Fixed issue with Apply Armor related to application order of armor coverage. -------------------------------------------------------------------------------- B310 -------------------------------------------------------------------------------- Pressing the + or - keys in the trait lists will no longer double increment/decrement the selected traits. Pressing the + or - keys in the trait dialog will now correctly reflect the new level/points in the list. Pressing the + or - keys in the modifiers window will now correctly reflect the new level/cost for leveled modifiers. Active Defenses in the Protection window can now be selected from any trait with a parryat() or blockat() tag. In the Protection window, the DR and DB bonuses are now separated from the Other DR and Other DB sections, to make it more clear that the DR Bonus and DB Bonus values are not related to the Other DR or Other DB text. Changed the names of "Other DR" and "Other DB" to "Other DR Notes" and "Other DB Notes" to make it more clear that these are for notes related to same, and that they don't directly affect anything else. Fixed the body parts to correctly save/load base values for DR and DB. (Note that only Skull has a base DR, so nothing was really lost here by not having these working before.) The Protection window now has two tabs on the left side: Protection and Apply Armor. Protection is the same as was there before (as updated above). The Apply Armor tab allows the user to apply armor values to the character. This is very simplistic, and not very smart, but will help in most cases. GCA does not attempt any armor value math, it just puts all the values applied to one location together in a list separated by + signs. Any item checked for applying to the character will also be assigned the aa() tag with a value of 1. No aa() tag means it's not being applied. -------------------------------------------------------------------------------- B309 -------------------------------------------------------------------------------- * In the body parts hierarchy, hands are no longer children of arms or limbs, and feet are no longer children of legs or limbs. (This means if you set a DR value for a leg, the foot value will no longer change to match.) * Save As will now set the current character folder to the folder where the character was saved. * Added a routine to the print wrapper to allow for printing of the character protection graphic. Note that the input controls for setting DR and such aren't easily reproduced for the output, so the routine does not draw them the same way. The routine template looks like this: DrawBodyPartsPicture(char As GCACharacter, PicLeft, PicTop, PicWidth, PicHeight, Optional ByVal DrawArmorValues As Integer = True, Optional ByVal ShadeCaption As Integer = True, Optional ByVal ShadeColor As Long = 13421772, Optional ByVal PrintDBValues As Integer = True) It's necessary to pass the character reference so that the correct DR/DB values can be retrieved for printing, since this routine can do the entire structure (unlike most features that require the author to create their own formats). DrawArmorValues = False means that the boxes containing the area name, DR, and DB values won't be drawn at all. The sheet author could them draw these themselves, if they so desired. ShadeCaption = False means that the default shading on the caption line inside the armor values box will not be drawn. ShadeColor can be set to the color desired, if the default light grey is not adequate. PrintDBValues = False means that only DR values will be printed. There is also a routine to determine the optimal size of the protection graphic. That routine is: BodyPartsPictureOptimalSize PicWidth, PicHeight which returns PicWidth and PicHeight containing the size of the graphic. This can then be used by the sheet designer to allocate the necessary space for the graphic, or to figure out a decent ratio for resizing the graphic to fit the space that's already available. The DrawBodyPartsPicture() routine will always preserve the picture's aspect ratio when stretching or squeezing the picture to fit the allocated space. -------------------------------------------------------------------------------- B308 -------------------------------------------------------------------------------- Recalculate Everything now has a shortcut key of F5. Clicking Cancel on the Equipment Simple Edit window should no longer cause the loss of modifiers to modifiers. The missing Modifiers button on the Equipment Simple Edit window has been added. The change to calculations for Template items with modifiers has been undone. Modifiers will no longer affect template costs. Added a Stop button to the Find Traits window to stop the searching process. The Find Traits window should be more clear about the fact that it's working. It should also close down gracefully if it's closed while searching, and not crash if you click on the results list when starting a new search. The item lists in GCA should now support the scroll wheel. -------------------------------------------------------------------------------- B307 -------------------------------------------------------------------------------- Fixed Save As Template bug I added last build. Added the #NoNeeds directive to adds() and creates(). Including this directive means that the item being added will not be auto-added to the template's needs() tag. In all other ways the tagged item is treated normally for the template. It should be used similarly to the #DoNotOwn directive, but is not needed if #DoNotOwn is used. Moved the search button on the toolbar to the end of the second section, where it has less chance of being confused for the print preview button. GCA will now ask where to save, and what to call, exported files. GCA will now remember the printer selection made in Print Setup.... Added two new functions: @baseswdice() and @basethdice(). @baseswdice(value) returns the base swing dice for a ST score equivalent to the value of 'value'. @basethdice(value) returns the base thrust dice for a ST score equivalent to the value of 'value'. GCA will now calculate Template items differently from other trait types with regard to modifiers. All other types of traits have modifiers applied before any child item costs are included in the final, total point cost. Templates, effectively being defined as the collection of owned traits, will instead apply modifiers to the final cost of all component items. This means that a template with a total cost of 150pts, which then has a -50% modifier applied, will then cost 75pts (while all component traits will still show their full point costs). -------------------------------------------------------------------------------- B306 -------------------------------------------------------------------------------- * GCA now supports the use of curly braces {} in adds() and creates() to surround items, instead of quotes. Because braces are correctly nestable, this avoids many of the problems inherent in using quotes, such as nested quotes crashing GCA in some cases. * GCA now saves characters as templates using curly braces around items in adds() and creates(), rather than quotes. * The Modifiers window now shows the tier (if any is specified, and it's non-zero) for the Available Modifiers, as it does for the Character Modifiers, in the flag column along the left side of the list. As a reminder: all modifiers on tier 0 (or no value displayed) will be calculated at the same time, while modifiers on tier 1 will be applied to the value determined at tier 0, and modifiers on tier -1 will be calculated before tier 0, and used as the basis for continued calculation by modifiers at tier 0. * Traits with damages should now be correctly updated/recalced automatically when appropriate. * The damagebasedon() tag should now work correctly with different modes. * GCA should now remember Show Hidden settings between sessions. * You can no longer disable non-component items. * Compacted the right-click menu a bit. * Added the #DoNotOwn directive to adds() and creates(). Including this directive means that the item being added will not be owned, locked, or hidden by the template, even if the flags are set to do so. It will also not get auto-added to the template's needs() tag. This allows for adding items that go along with the template (such as a skill receiving a racial skill point bonus), without having those skills end up as part of the template. The #DoNotOwn directive will be found whereever it appears within the item, but should generally be attached to the value assignment, or immediately after the quotes or curly braces closing the item. It should look something like this: adds(_ {SK:Merchant}==0pts#DONOTOWN_ ) or adds(_ {SK:Merchant}#DONOTOWN_ ) -------------------------------------------------------------------------------- B305 -------------------------------------------------------------------------------- GCA now removes the x(), init(), and initmods() tags from items after they have been created. GCA should now correctly save and load templates with equipment items having a count other than one. Adjusted the internal left margin of the sheet options UI prompts. When adding to a template's needs tag for items added or created from adds() or creates(), GCA will now surround the existing needs() list in parens if it contains an | block. GCA should now abort cleanly, rather than crash, when using an export sheet that encounters an error. Addressed issue where a non-existant file from the data set file list would crash GCA during the process to CRC check files for FastLoading. GCA should no longer print lines to the log every time the DrawBitmap routine is used in a character file. GCA is now capable of repairing character files that have lost carriage returns due to being emailed. This should happen fairly transparently to the user, although GCA will make note of it in the log, and save the original file with an altered name. This will not help with files that have been reformatted (aka mangled) due to being emailed as part of the body of an email--that will still require manual handling. However, this will cover the vast majority of problems we've seen with emailed characters sowing confusion and discontent. -------------------------------------------------------------------------------- B304 -------------------------------------------------------------------------------- * Fixed issue with * type modifiers being set to 0 when having modifiers applied to them. * Fixed issue with rounding equipment costs when modifiers are applied. * Fixed incomplete directive support in mods. * Adjusted resizing parameters of character sheet options UI elements. * Fixed vertical sizing for character sheet options UI elements. * Added a DisplayFormat field to AddOption for character sheets. This field is a string containing formatting information for the UI for setting options. This serves the same purpose as I was using the Default setting for optCaption earlier, and in the case of optCaption, replaces it. The new display format string for optCaption is like this: "BackColor|ForeColor|Bold|Italic|TopMargin|BottomMargin|InnerBackColor" and for all other options, it's currently this: "BackColor|ForeColor" and the new Options.AddOption looks like this: Options.AddOption OptionName, OptionType, OptionList, OptionDefault, UserPrompt, DisplayFormat -------------------------------------------------------------------------------- B303 -------------------------------------------------------------------------------- Updated copyright date. Fixed issue related to calculation tracking for base character features. Fixed issue related to calculations not always trickling through correctly when incrementing/decrementing attributes with up/down buttons. Added space in Options to have GCA set its file associations, instead of having GCA attempting to set them automatically within the start-up process. (They should be set by the setup program now, so this should only be necessary if they're lost for some reason.) Character Sheet Options should now remove the new option types correctly when resetting the window UI. Character Sheet options UI elements should now resize to fit display area. The optListFlag sheet option type will now support up to 31 options. In Sheet Options, option types Text and ListOrdered can now have text up to 4096 characters in length. Other text option values are still limited to 255 characters. Implemented "Reset to Defaults" button for Character Sheet Options window. This will reset all options for the current sheet to their default values. -------------------------------------------------------------------------------- B302 -------------------------------------------------------------------------------- * Initial loading of print/preview sheets should now be a great deal faster. * Fixed a couple places that weren't honoring the option to show/not show bonuses coming from the trait itself, or from modifiers it owns. * Fixed "Save as Template" creation of attribute bonuses to respect step values, so that any attribute with step values other than one (such as Basic Speed) should now work correctly. * GCA will now only build information to display in the description pane or the View Info window if they are open. * Added support for optList and optListNumber (option types 2 and 3) to the character sheet options. Both of these are for providing the user with a list of options (in the OptionList parameter, text items separated by | characters) from which to choose, and allowing the user to select a single option from the list. Both options work identically from the user point of view, but the option value returned is the text of the list item for optList, and the number of the list item for optListNumber (one-based, so selecting the first list item would return 1, not 0). For optList, setting the default to a non-existent list item will result in GCA selecting the first list item as the default. For optListNumber, setting the default to a number below 1 will result in the first item being selected by default, while setting the default to a number beyond the number of items in the list will result in the last item being selected by default. * Added support for optListFlag (option type 4) to the character sheet options. This option lets the user select multiple options from the list, and GCA will return a flag-value equivalent number for the selected options. That is, if the list is "Alpha|Bravo|Charlie|Delta|Echo", Alpha has a value of 1, Bravo a value of 2, Charlie a value of 4, Delta a value of 8, Echo a value of 16. If the user selects Alpha and Charlie, 5 is returned by GCA for this option. If no selection is made, 0 is returned. * Added support for optListOrdered (option type 8) to the character sheet options. This option provides the user with a list of items that they can then reorder as they prefer. GCA returns the list in the order created by the user (list items are separated by | in the return string, just as they're created for the OptionList parameter). * Added an optCaption (option type 9) to the character sheet options. This allows for displaying a block of text within the various displayed options that the user can set. No user settable values for this type, but a default value can be set in order to change the display appearance of the text block, and this is done by setting the Default to a string with the following format: "Bold|Italic|LeadSpace|FollowSpace|CaptionForeColor|CaptionBackColor|AreaBackColor" where Bold and Italic are non-zero or "True" to display the text in bold or italic, and are 0 or False (or empty) to not use bold or italic. LeadSpace is twips based, is 60 by default, and is the amount of space between the start of the caption area and the end of the previous option block. FollowSpace is twips based, is 60 by default, and is the amount of space between the end of the caption area, and the start of the following option block. CaptionForeColor is the color to use for the text of the caption text. CaptionBackColor is the color to use for the background of the caption text area. AreaBackColor is the color to use for the background of the option block that is not covered by the caption text area, and includes the area covered by LeadSpace and FollowSpace. Any of the option default sections in the text string can be left out to use the default values, but you must use the | separators to ensure that the sections that you do set fall into the correct location. You don't have to include any settings beyond those you are changing. -------------------------------------------------------------------------------- B301 -------------------------------------------------------------------------------- It should no longer be possible to add the "[..] - Parent Folder" item to data sets. Made some changes to how GCA views/tracks attribute scores, to address some additional internationalization issues. Again, to address some internationalization issues, I made some changes to how GCA handles obtaining/storing certain values within the Solver. This type of change may have unexpected consequences in other areas of calculation, so please watch for things that may no longer be calculated correctly. -------------------------------------------------------------------------------- B300 -------------------------------------------------------------------------------- Fixed View Info so that it will once again actually show information about the selected system items. Added Prereq Count to the info in View Info for spells. Added ability to show/not show bonuses coming from the trait itself, or from modifiers it owns. By default, these will no longer be shown. Changes made in the Edit window should be more immediately/correctly reflected by the auto-calc engine now. GCA's new recalculation engine should now correctly be tracking and updating traits affected by changes to base character features. (This affects such traits as Money and Remaining Funds, and others with a "char::" reference.) Added UI to Options for the child item sorting options. -------------------------------------------------------------------------------- B299 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed error messages for Make Child Of... that were swapped based on whether parents existed, or were excluded. Find Traits window completed. For some reason I did the implementation of the Size Modifier adjustment, when saving as a template, as a gives() section, while I did all the other attributes as advantage or disadvantage items (so they can be disabled). I have changed the Size Modifier implementation to also create an advantage/disadvantage item to grant the size modifier adjustment. Correct "affects" links should now be rebuilt when traits are resynced, as should correct bonus links. -------------------------------------------------------------------------------- B298 -------------------------------------------------------------------------------- Persistant FastLoad files are now working. This allows for trading off disk space for faster loading times. Tests on my machine have the FastLoad system taking about half the time it would take to load the actual data files when using the FastLoad files (and there's no need to process display strings or any of that related stuff). The three FastLoad files, however, together take up 30% - 50% *more* space on disk then the component files themselves do, so you're not quite doubling the amount of space devoted to the files used - *for each data set*. Of course, if you're constantly changing the files included in each data set, you'll rarely get the speed bonuses for FastLoading, since GCA will constantly have to recreate the FastLoad files from the source files. There is an option to turn on/off persistant FastLoad files in Options. It's on by default. Started 'Find Traits' window. Updated the starting position of various windows. -------------------------------------------------------------------------------- B297 -------------------------------------------------------------------------------- * GCA should now be able to handle percentage modifiers with decimal values. * GCA now has some options as to how it will handle the ordering of child items under parent items. I do not yet have a UI for accessing these features, but they're changeable through the GCA.INI file right now. At this time, these options are only global default levels, and they can't be changed per item. Changing these options only affects existing children if a new child is added to the list of the parent--so for existing parent/child relationships, you'd need to Unmake Child one of the children, then Make Child Of... it again, at which point the sorting options would be used. Here are the options, which are listed in the [ParentChild] group in the INI file: ChildrenGroupByType=0 : can be set "=0" (off) or "=-1" (on). Off by default. When on, this has the children grouped with like items, such as all advantages together, all disadvantages together, etc. ChildrenSortOrder=0 : can be set "=1" (ascending), "=0" (none), "=-1" (descending). No sorting by default. When set to 1 or -1, this will allow for sorting the children based on the other SortBy options below. ChildrenSortByName=-1 : can be set "=0" (no) or "=-1" (yes). Yes by default. Note that this won't be used if ChildrenSortOrder is off. If this option is on, ByPoints and ByTag should be off. When on, children are sorted by their full name. ChildrenSortByPoints=0 : can be set "=0" (no) or "=-1" (yes). No by default. Note that this won't be used if ChildrenSortOrder is off. If this option is on, ByName and ByTag should be off. When on, children are sorted by their point value. (When sorting by points, a secondary sort is done by name, ascending, within the point value groups.) ChildrenSortByTag=0 : can be set "=0" (no) or "=-1" (yes). No by default. Note that this won't be used if ChildrenSortOrder is off. If this option is on, ByName and ByPoints should be off. When on, children are sorted by the value of a specified tag (see below), which is assumed to contain text values. ChildrenTagForSorting=TAGNAME : "TAGNAME" should be set to a text value representing the name of a tag by which you want the child items sorted. By default, no tag is specified, and this option will not appear in the INI file. Specifying a tag containing numeric values will likely not return the expected results. -------------------------------------------------------------------------------- B296 -------------------------------------------------------------------------------- GCA will no longer incorrectly include the locked() and hide() tags with items saved to data files. Created a small options window that will pop up when saving a character as a template. Templates saved from within GCA may now optionally use adds() instead of creates(), when GCA can do so. (Basically, it can't do so if the corresponding item in the system list has a wrench icon.) Characters saved as templates will now order the saved traits together in groups based on type (all ads together, all skills together, etc.) within each adds() or creates() block. GCA will now calculate charradius() based on an existing radius(). Calculation of the skill score for the skill used for weapons should now reference mode specific MinST, rather than simply using the first MinST value. If MinST check results in a penalty, that penalty is now noted in the bonuslist text. There is now a special minstbasedon() tag. If this tag exists, GCA will use the stat specified within instead of Lifting ST to do the MinST check. If the stat specified within can't be found, GCA will instead use the default Lifting ST to do the check. There is now a special damagebasedon() tag. If this tag exists, GCA will use the stat specified within for determining damage for an item or trait. In effect, GCA will replace damage codes of 'thr' or 'sw' with '@thr()' or '@sw()', using the stat specified within the function. -------------------------------------------------------------------------------- B295 -------------------------------------------------------------------------------- Fixed bug that crashed GCA when loading data files written for previous versions. GCA 2 characters appear to load again without crashing. Saving items to data file should now preserve categories, in addition to listing them in the User Items category. Saving characters to a template in a data file should now include Size Modifier if it's not zero. Saving character templates that include bonuses/penalties to attributes, and the template name includes parenthesis, should now work correctly. (The created ads/disads to reflect this now put the template name last, so any parentheticals would go into the name extension.) GCA will no longer incorrectly include the owned(), keep(), isparent(), childkeylist(), and parentkey() tags with items saved to data files. GCA will no longer trim spaces from data in the character's bonuses section, so that it won't lose the spaces given as part of certain bonuses for things such as various damage types and listas() info. -------------------------------------------------------------------------------- B294 -------------------------------------------------------------------------------- Fixed missing recalc for initial starting values for new characters. Fixed issue related to conditionals being added to certain bonuses lists in the new "affects" system. Streamlined system for application of target tag bonuses into "affects" system, so there are no more redundant checks for them during item calculation. Fixed improper auto-formatting of Date in Campaign Log. User may now format the date in any way desired, and the format of the default date entry is the Windows Short Date format. Addressed some of the issues with the list control in the Campaign Log. The character's Date Created now uses the Long Date format. The fastload file is now named the same as the data set file, with ".fst" tacked on the end. This is in preparation for persistant fastload files down the line. A second file for the fastload system is now created, with ".fstcrc" tacked on the end. This is also in preparation for persistant fastload files down the line. -------------------------------------------------------------------------------- B293 -------------------------------------------------------------------------------- Stage 2, and therefore the full intended implementation, of the new "affects" cross-linking system for recalcing items should now be done. Except for anything I forgot, of course. -------------------------------------------------------------------------------- B292 -------------------------------------------------------------------------------- Added creating of "affects" cross-links to items when loading from a saved character. Improved finding of items that are affected by other items. Added initial unlinking of "affects" items when necessary. ----- Added to the Print Wrapper: GCAVer() function, which returns GCA's version number. -------------------------------------------------------------------------------- B291 -------------------------------------------------------------------------------- Fixed filling of GCA's old DR() array, which was filling DR(1) with the Body value, instead of the Torso value. Started work on new cross-linked "affects" system to handle the trickle-through of changed values. Theoretically, this will result in a huge speed improvement when adjusting the values of existing items. -------------------------------------------------------------------------------- B290 -------------------------------------------------------------------------------- * Fixed bug in determination of tags based on skillused(), where it would use a skill's Level for finding the best skill to use, but would then send the skill name into the routine to calc final level and parry, which meant the Solver would solve for the skill name, which by default would return the BaseLevel. This is now corrected, and the Level should be used as intended. * GCA should now look for the DB stat to show in the Protection window for the general/other DB bonus. (We need the DB stat in the data files.) * The @textindexedvalue() function now allows for the use of quotes or braces around the item values in the item/value pairs, like so: @textindexedvalue( "INDEXITEM", ("ITEM1", "ITEM1VALUE"), ({ITEM2}, {ITEM2VALUE}), (ETC...) [, else VALUE] ) This allows for embedding formulas and math functions into the ITEMxVALUE sections. (The quotes or braces are stripped before the value is processed.) * Added the @sametext() function: @sametext("Text1", "Text2"). Returns 1 if both Text items are the same, otherwise returns 0. (Ignores case, as per usual.) NOTE: IMPORTANT: This function is necessary because GCA's @if and $if both *solve* the items in the if comparison, which means you can't really make any text-only comparisions in any of our if statements, so if you have something like this: @if("hello" = "goodbye" then 10 else 1) GCA would return 10, not 1, because "hello" and "goodbye" will both solve out to 0, and 0 = 0 is True. The @sametext() function, on the other hand, would allow for this example to correctly return 1: @if( @sametext("hello", "goodbye") then 10 else 1) So, in this example, since 0 is returned by @sametext(), the @if goes to the Else portion instead of the Then portion, for our returned result of 1. * Added an additional breakdown in the log of the building of the display strings, to hopefully help determine where the odd slow-down for Magic might be (if it's due to standard or short display strings, anyway). * Fixed issue with Save-Character-As-Template, which would carry over the modifiers of one item to all following items that didnt' have modifiers of their own. * Fixed issue with Spells that were saved from within GCA--they would use the skill format, instead of specifying a type() tag as they are supposed to. * Improved error trapping a bit when something requests an item index outside of bounds. * Trying Marzo's shield image for the toolbar, Protection window button. -------------------------------------------------------------------------------- B289 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed bug in XML export. -------------------------------------------------------------------------------- B288 -------------------------------------------------------------------------------- Addressed internationalization bug that crept in late to crash GCA when calculating equipment items that had decimal values for cost or weight (only affected country settings that use a comma for the decimal separator). Added option to turn off auto-check for new data files. Added a line to the logging window when GCA starts building the display strings, so users know what might be happening as GCA pauses to do that. -------------------------------------------------------------------------------- B287 - RELEASE VERSION -------------------------------------------------------------------------------- The Load-Out Manager can now be minimized without crashing GCA. The Logging window can now be minimized. -------------------------------------------------------------------------------- B286 -------------------------------------------------------------------------------- Added the global parry bonus represented by the Parry attribute into the calculation of charparryscore(), because I forgot to include it. -------------------------------------------------------------------------------- B285 -------------------------------------------------------------------------------- Points bar should no longer display on startup, if no character is loaded. $Function handling should no longer be destructive, so if GCA encounters something that looks like a $function, but actually isn't, it will no longer be incorrectly excised from the string being processed. GCA will now create the parryatbonus() and parryatmult() tags, if necessary, to hold bonuses being applied to parryat() in the calculation of parrylevel(). These are for aiding in the later calculation of a weapon's charparryscore(). GCA now calculates the charparryscore() using a new method. This new method uses the parryat() and the charskillscore() of the charskillused(), using the parryat() as the template, and the charskillscore() in place of the level or score reference in the parryat(). This allows for calculating the correct charparryscore() even when adjustments need to be made to the charskillscore() for some reason, including operating from default or at an additional penalty. It includes any bonuses existing in parryatbonus() and parryatmult(), and adjusts for charparry(). As before, it needs to add back adjustments from parryat() included after the +3, to avoid double penalties. GCA will now adjust charskillscore() if minst() is more than the character's ST. -------------------------------------------------------------------------------- B284 -------------------------------------------------------------------------------- * I noticed an issue with adds() or creates()--if they included an item that had a gives(), GCA would incorrectly create a bonus for the template item that matched the embedded gives() bonus. This should now be corrected. * Save As... Template within Data File seems to be working as intended now. (I used creates() exclusively, for maximum portability. I suppose I can add options in the future to allow for using adds() instead.) * Adjusted chardamtype() determination to still process if it looks like it might contain a $function, but doesn't have any bonuses. * Addressed another problem with improper token caching of expressions with non-cacheable values. * Addressed issue with attribute symbols (aka abbreviations) not being properly reset in token cache when attribute value changed. (This was causing stuck or one-step-behind results of calcs with those symbols.) * Fixed a bug in the function that returned damage values for the @sw() damage function. * Removed a bunch of redundant code in the @thr() and @sw() damage functions. * Fixed @thr() and @sw() damage functions to use the given score, not the character's ST score, when calculating values using the formula for values beyond those given. * Fixed a bug in the setting of bonus values in the routine to calculate features based on skillused(). * Added two data file commands: #DeleteCat and #DeleteAllCats #DeleteCat allows the file to remove a particular category for a certain list of items. The template looks like this: #DeleteCat , "" should be the name of the list, such as Skills for skills, or Ads for advantages. You can also use the common two letter prefix tags, such as QU for quirks or ST for stats/attributes. GCA will find all the categories for the list specified that match the and remove it from the category list. If you specify a of All, GCA will delete the from any item type where it finds it. Note that GCA will dynamically re-add the category to the list of categories if it exists in a file loaded later, or if it's specified in an item definition that's loaded later. #DeleteAllCats allows the file to remove all categories specified for a certain list of items. The template looks like this: #DeleteAllCats should be defined in the same manor as specifed above for #DeleteCat. If you specify All for , all categories will be removed, and only categories defined by items or files loaded later will appear. -------------------------------------------------------------------------------- B283 -------------------------------------------------------------------------------- The fix made to avoid crashing GCA when making the last visible item a child of another item introduced another issue. I have implemented a new fix which should address both issues. Added the new UseDiceAddsConversion option, which means the [ConvertDice] section of the data file no longer needs to be commented out, but it will only be used when this option is True. Fixed bug that caused GCA to stop reading a data file when it hit the Program= line. Oops. Fixed Campaign Settings window so values changed will be kept, even if you don't leave the entry box before pressing Enter to accept the changes and close the window. Files created from within GCA by using Save to Data File... or character Save As... template now include Program= information. Traits saved to files from within GCA are now saved under the category. -------------------------------------------------------------------------------- B282 -------------------------------------------------------------------------------- Fixed an issue that caused the Print dialog to appear twice when printing via Print... or Print Using... on the File menu. Added a special case bonus item for giving a bonus to damage$: =nocalc. This is only enabled for damage$. If you have a gives like this: gives(=nocalc to owner::damage$), then GCA will handle the '=nocalc' as a special case, and will not attempt to calculate the damage from the damage string--instead, GCA will simply use the damage string as the chardamage(). GCA will still perform all special case substitutions and other processing, however. If using both =nobase and =nocalc, you can combine the two like so: =nobasenocalc or =nocalcnobase. Made an adjustment to calculation of bonuses. If the bonus is targeted at a $, GCA will no longer also attempt to calculate a numeric value for the bonus. (It will still process any $functions, of course.) Fixed incomplete saving/loading of bonus information to character file, which prevented loaded characters from having any of their $ bonuses work. Fixed bug with conditionals that could occasionally crash GCA when checking for items that might be affected by them. GCA will now process up to 99 selectX() tags. Remember that these are processed in numerical order (select1() is processed before select2(), even if you list select2() first in the template), and that GCA stops processing any further selectX() tags as soon as it hits a number that doesn't exist. So if your template goes from select2() to select4(), GCA will never process select4() because there was no select3(). Fixed XML output to include Perks. Fixed handling of 'nobase' and 'nocalc' to remove all instances. Consolidated some redundant code in the 'char' tag routines. Removed ability to target item damage bonuses to 'chardamage'. Like all other such bonuses, the bonus should be targeted against the tag that becomes the char version, or 'damage' in this case. Restructured the systems applying target tag bonuses to the target tags that are being calculated. Improved performance a bit, but be on the watch for improper results. -------------------------------------------------------------------------------- B281 -------------------------------------------------------------------------------- * Adjusted calculation code a bit more to further reduce the number of times any particular bonus will be looked at when calculating an item. * GCA will now use the skillused() tag to determine the best skill used for the item. It will store the trait used in the charskillused() tag (sometimes it's an attribute). It will store the skill level, adjusted by any bonuses, for the trait to be used, in the charskillscore() tag. Bonuses that apply specifically to the skill level when making use of a particular weapon would be targetted at ::skillscore. * GCA will now find the charparryscore() based on the skill found in the charskillused() tag. If, for some reason, the skillused() included a bonus or penalty, and that was reflected in the charskillused(), then that same bonus or penalty will be reflected in the charparryscore(). This is a special case, and is different than any bonuses being applied directly to the calculation of the parry score, which should be applyed by using a target of ::parryscore. Calculating the parry score also takes into account the weapons parry adjustment, as reflected charparry(), and the final charparryscore() will include any 'U' or 'F' flag from the parry adjustment. * The parryat() and blockat() tags can now receive bonuses, which will be reflected in the final calculated parryskill() and blockskill() tags, respectively. * Fixed char.parryscore and char.blockscore to return the correct value based on the parrylevel() or blocklevel() of the selected trait. * Added an option to the Operations tab in Options to disable calculation of the secondary trait features, unless a Recalculate Everything is being performed. This is intended for the same types of situations as turning off auto-recalculation of traits, where folks only care about such things once in a while, and the rest of the time don't want GCA wasting precious time on those calculations. Secondary trait features include parrylevel(), blocklevel(), chardamage(), chardamtype(), charrange(), charreach(), chardr(), chardb(), characc(), chararmordivisor(), charparry(), charskillused(), charskillscore(), charparryscore(), charrof(), charshots(), charrcl(), and maybe one or two such tags that I forgot. * Added a check in the print/preview routine for NoAutoRecalc or NoCalcSecondaryFeatures being turned on. If either option is selected, it will warn the user that there are likely incorrect values that would normally be printed, and asks if the user wishes to recalculate characters before proceeding with the print/preview. * Added a check to GCA for data files that might need features from a particular version of GCA, or later. This is specified in the data file by using a 'Program=version' line near the top of the file, like so Program=4.0.280 The version information must be in the three part format shown, with the major version, the minor version, and then the build number. Not following this format may result in GCA incorrectly flagging files as needed newer versions of GCA than are actually available, or may not correctly notify users when they don't have a new enough version of the application. The 'Program=version' part of the data file must come before any [section], and I recommend that it always start on the line immediately before, or immediately after, the Description= information. There must be no space between the word 'Program' and the '=' sign. "Program=4" is okay, "Program = 4" is not. Together, the top few lines of a GDF file might now look like this: Version=3 * The version information above MUST be the first line of the data file Description=This data file contains information taken from the GURPS Powers sourcebook. _ GURPS Powers is Copyright(C) 2005 by Steve Jackson Games Incorporated. All rights reserved. Program=4.0.280 -------------------------------------------------------------------------------- B280 -------------------------------------------------------------------------------- Added some further customizing of the system items. This should actually result in snappier performance for changing lists of traits (when changing the category drop-down), and loading up the program in general (due to construction of those lists, and the traits bar in QuickView). Testing initial work for storing the majority of the system item tag list on disk, instead of in memory. I'm thinking that this shouldn't make a noticeable difference in performance, since the majority of what the system items are used for is showing what's available, and that info is cached anyway. When the full system tag list is necessary, it's usually pretty quick (relatively speaking, as perceived by the user) to grab it out of the file. PLEASE if you see anything in the logging window that includes "Sys.UseFastFile = True" on the line, let me know--that should never appear, and if it does, I've screwed something up. -------------------------------------------------------------------------------- B279 -------------------------------------------------------------------------------- Changed routine that saves traits from the 'Save to Data File...' button (in the Full Edit Window), to make it easier to update and maintain. Updated 'Save to Data File...' to save any modifiers the items have as initmods(). This allows for creating fully customized traits, saving them using the button, and then applying them to other characters in the future. Fixed Optional Specialty check box in Simple Edit window to appear if the skill is already an optional specialty, even if it's an IQ/E skill. Characters can now be saved as a 'GCA4Base' file, which is a base character file. Available in the Save As... dialog. This is basically a simple character file that can be used as the base for other characters, much like a racial template, or a character template could be (although it doesn't support the idea of making choices). This is for all intents and purposes a normal character file, with the exception that when loaded into GCA, it's loaded as a 'new' character, and will default to a new file name when you try to save it. This allows you to save, for example. your standard 'mook' as a 'GCA4base' file, then load it up later to create a custom Mook, and save that custom Mook without running the risk of accidentally saving over the top of your 'mook' base file. First draft of ability to save a character as a race-style template. This is also available when doing a Save As..., and if you select an existing data file, the template will be saved at the end, in a new [Templates] block. By typing in a file name that doesn't exist, GCA will ask to create it. Fixed a bug that could crash GCA when trying to add an alternative character sheet to a character in Options. -------------------------------------------------------------------------------- B278 -------------------------------------------------------------------------------- * Changed the class representing a system item inside GCA, tossing a bunch of stuff that it never used. This should result in a lower memory footprint for GCA's system data (which populates the Available lists). * Fixed issue with token cache when loading an existing character. The cache wasn't being cleared, resulting in 'stuck' attribute values for skills and such. The cache is now being cleared. * Recalculate Everything will now also reset the token cache, just to make sure it does recalc everything, including the tokens. * The #InputToTag directive can now specify the default value for the input, and the title of the input window. The function template looks like this: #InputToTag( , [, [, ]] ) If you include the title, you must also include the default text, although it can simply be left empty, like this: #InputToTag( "Enter a name extension:", nameext, , "Input Name Extension" ) * The #InputToTagReplace directive can now specify the default value for the input, and the title of the input window. See #InputToTag info above. * The #Input directive can now specify the default value for the input, and the title of the input window, in addition to the prompt to the user. The template would now be: #Input( [ <prompt> [, <default text> [, <title> ]]] ) * The #InputReplace directive can now specify the default value for the input, and the title of the input window, in addition to the prompt to the user and the variable value to replace. NOTE: This directive has a bit of an odd construction, in that the normal template is #InputReplace( [ <prompt>, ] <targettext> ) You can specify the additional items only if the <prompt> is also specified, so the template that includes the default value and the window title would be this one: #InputReplace( <prompt>, <targettext> [, <default text> [, <title> ]] ) * Char version of parry() will now be created and placed in charparry(). NOTE that this is the parry adjustment for individual weapons, as found in equipment lists. Remember that parry() is mode specific in many cases, and changes or bonuses would be applied to all mode values. As with reach(), you can use $modetag() and $functions to adjust processing for different modes. * Adjusted Equipment Simple Edit window to show charparry() value in parry slot. * Added a block for a file description to the Change Data Files window (you can reach this window by clicking the button on the Data Sets tab of Options that says "Change & Load Files..."). This will show descriptions for data files that the user clicks on. Right now, no files have descriptions, but I'm hoping perhaps Eric might add them :). The information for the description is usually in the files already as part of the Author section, and doesn't need to be complicated. For example, the description for the GURPS Powers file might be like this: Description=This data file contains information taken from the GURPS Powers sourcebook. GURPS Powers is Copyright(C) 2005 by Steve Jackson Games Incorporated. All rights reserved. The 'Description=text' part of the data file must come before any [section], and I recommend that it always start on the third line of each data file. The description should be short, and must all appear on one line (although line continuation characters are allowed, following the normal rules for them). There must be no space between the word 'Description' and the '=' sign. "Description=X" is okay, "Description = X" is not. Together, the top few lines of a GDF file might now look like this: Version=3 * The version information above MUST be the first line of the data file Description=This data file contains information taken from the GURPS Powers sourcebook. _ GURPS Powers is Copyright(C) 2005 by Steve Jackson Games Incorporated. All rights reserved. -------------------------------------------------------------------------------- B277 -------------------------------------------------------------------------------- Updated GCA to use correct multiplicative percentage modifiers rule (there is a setting in Options to use it). Fixed some continued improper caching of tokens %level, %count, etc. Enabled $function handling in item damage calculation. Updated QuickView to use the same taboo markers as the other trait forms, when a taboo is being violated and the trait also has other markers. Made some additional minor value storage changes. Updated conditional bonus checking to be less redundant. The tag created when a trait has a parryat() tag is now called parrylevel(). This contains the level to parry using that trait. (It used to be called parry(), but that tag is used in equipment for another purpose, so this change was made.) The tag created when a trait has a blockat() tag is now called blocklevel(). This contains the level to block using that trait. (This change was made to be parallel to the parrylevel() change.) GCA will now automatically fill in the old PD() (which is now aliased as DB() as well) and DR() values, for backward compatibility with older character sheets. The new method uses Body("Partname").DB or .DR instead (or, if looping through, Body(i).Name gives the name, which is also the index into the collection). For example, Char.DR(0) would have the same value as Char.Body("Head").DR, and Char.DR(4) would have the same value as Char.Body("Hands").DR. Now using the SJGames picture for armor locations on the Protection window for body locations. Removed the old body location DR fields from the Protection window. GCA will now use existing DR() character values to fill the new body().DR values, if they exist when the character is loaded (to avoid losing those values when loading existing characters into this version or later of GCA). GCA will now save & load the new body() values. -------------------------------------------------------------------------------- B276 -------------------------------------------------------------------------------- Trying out a new parser that I wrote based on something Marzo taught me. Should be faster, might frell everything up. Added an additional place or two where GCA will skip trying to calculate something that shouldn't have a value, based on other values (such as an attribute with no step() tag means GCA shouldn't try to calculate the points for it). Fixed an issue with $bonuses and $functions. The $functions will now be evaluated as part of the bonus calcs, rather than later as part of the target's evaluation. GCA is now caching tokens for values of entire expressions in calculations. It doesn't cache any expressions that contain any version of the @hasmod() functions, or anything that includes references to 'char::', 'owner::', or 'me::', or anything that includes these keywords: %level, %count, prereq, lowprereq, or default. I think avoiding caching of those items will avoid GCA caching incorrect values for various expressions, but it's possible I'm wrong, or missed something. This either speeds things up a lot, or frells things up a lot. -------------------------------------------------------------------------------- B275 -------------------------------------------------------------------------------- Immediate bug fix of problem with new data file check code. -------------------------------------------------------------------------------- B274 -------------------------------------------------------------------------------- Fixed bug in $function handling for needs(). Added bonus$ processing for rof(), shots() and rcl(). As with other such tags, mode may be an issue. This also means that there is a resulting char version of each such tag. Added a "Change & Load Files" button to the Data Sets tab of Options. I'm hoping that offering a simpler, more obvious option to changing the current data files will result in fewer confused users unable to figure out how to load the data files they want. This button calls up a window that works like the lower portion of the Data Sets window, allowing the users to add and remove data files for the current set only. If they make changes and click OK, those changes will be loaded immediately. Changed the "Browse..." button next to the current data set on the Data Sets tab of Options to read "Change..." instead. GCA will now store a list of the data files it sees in the GCA\data files\ folder. If it sees different files in the future, and the user does not have "Choose Data Set at start-up" turned on, then GCA will notify the user of the change in files, and ask if they want to view and/or change what's currently being loaded. If they say Yes, they'll be presented with the new Change Data Files window mentioned above. GCA now supports the armordivisor() tag, and will calculate a chararmordivisor() tag if necessary. This tag is assumed to be numeric in nature, and GCA will fully calculate it with bonuses and such. Because this is now a tag on its own merits, don't include the data inside it within additional parens--the parens will be added as necessary when GCA builds the output. Remember modes blah blah blah. Removed the recalc stack in the TrickleThru routine, as it was not working correctly. -------------------------------------------------------------------------------- B273 -------------------------------------------------------------------------------- Fixed missing Notes toolbar image. Adjusted routine that determines valid defaults to insert an additional -2 when defaulting from an optional specialty. You can now check a box on the Simple Edit window to turn a skill into an optional specialty. You can now select a skill in a trait window, then choose "Create Optional Specialty..." from the right-click menu to create a new optional specialty based on that skill. If the selected skill is a general skill (not an optional specialty already), doing so will also add a generic default to the selected skill so that it can default from the new optional specialty. If you are making a new optional specialty based on an existing optional specialty, the new default entry will not be created. Added an option to allow for optional specialties created from non-IQ based skills. Expanded the scope of tokens cached to include tokens for items not in existance. Added a recalc stack to the TrickleThru routine, so an item will be less likely to be recalced multiple times when just once would do. Added an earlier check for a numeric value in the solver, which eliminates a lot of redundant calculation work. -------------------------------------------------------------------------------- B272 -------------------------------------------------------------------------------- Char versions of Acc, DR, DB, Range, and Reach may now be calculated using target tag bonuses even if the target item has no such tag to begin with. (Major speed hit with this change....) Char version of damtype() will now be created and placed in chardamtype(). Because of the nature of damtype(), only targeted bonuses to damtype$ will be processed for creation of chardamtype(). Remember that damtype() is mode specific in many cases, and changes or bonuses would be applied to all mode values. As with reach(), you can use $modetag() and $functions to adjust processing for different modes. Reworked how GCA determines if a bonus applies to a particular calculation, so that it determines just once which particular bonuses are applicable to the item in general, and then applies them as appropriate to the correct situations in the internal calculations when they come up. (Major speed improvement with this change. This eliminates all the speed hit mentioned above, and a bit more as well.) Fixed bonus application code to not be case sensitive. $Functions will now be processed in needs() prior to needs checking. Removed the Apply button from the Protection window. Changes to the body parts property list are now applied as they're entered. With body parts (for armor DB and DR), changes made to more encompassing body parts are applied to the contained body parts. For example, changing the DR of Arms will change the DR for LeftArm and RightArm as well. Basically, if you change a body part that is listed in the Group listing for any other body part, those other parts will get the changes made to them as well. For this reason, when making many changes to values, the changes should be made to the more encompassing parts first, and then to the more specific parts, to avoid losing changes and having to re-enter them. This update structure allows GCA to keep all body parts relatively well synced up at greater detail levels, if you need to change between those levels for some reason. Added the additional body part of Full Suit, which allows for applying changed DR and DB values to all body parts at once. Implemented start of cached tokens for values of traits in calculations. If those items are recalculated and their value changes, the tokens are reset, otherwise the value of the token will be used instead of a normal item lookup when other items that might rely on it are calculated. Tokens are removed from the cache when the related item is removed or disabled. -------------------------------------------------------------------------------- B271 -------------------------------------------------------------------------------- Changed method by which work-bug is updated, making it spin more consistently. Updated some additional routines to reflect that they're working by spinning the work-bug. Updated copyright notice. Toolbar should now properly update to disable buttons that aren't applicable when no characters are loaded. Added proper disabled versions of the toolbar buttons. Fixed a bug that would crash GCA if you made the last trait remaining on a trait list into a child item of a parent that was not being displayed on that same list. Fixed the main window so that it will not start up minimized, even if it was closed that way, because it can occasionally render GCA unusable. With all the new stuff that can be calculated now in GCA, the time it takes to calculate a trait has climbed drastically. The last release version, b260, took about 4.5 seconds to do a Recalculate Everything on a brand new character. With b270, we were up to 11.3 seconds, a huge increase. As of this build, I've managed to rein that back down to 8.8 seconds--still way too long, but I'll continue looking at ways to cut it back. (All timings based on my current machine.) -------------------------------------------------------------------------------- B270 -------------------------------------------------------------------------------- * GCA will now determine a charreach() tag for items with reach() tags. GCA does not calculate this tag, it simply builds it if there are any bonuses to reach. Important: Reach() is mode specific in many cases--any changes or bonuses to reach would be applied equally to *all* values for all modes. However, the special case substitution $modetag(), described for b263 will work here as well to help mitigate this, if different values are needed for different modes. In addition, GCA supports the use of the new $functions (see below) in the construction of the charreach() tag. * The same special case substitution that handles $modetag() will also replace any occurance of %curmode with the number of the mode currently being processed. * When assigning a specific string value to a tag from a bonus, such as "1-2 to owner::reach$", you should generally do so using a static assignment, using the = sign. Doing so will prevent GCA from including the + sign as part of the text. If assigning a string in this fashion, you may include the text in quotes, and GCA will strip the quotes during the creation of the text bonus. So, to set reach to "2,3", for example, you might use a gives() like so: gives(=nobase to owner::reach$, ="2,3" to owner::reach$) * Changed 'nobase' a bit. Proper use of 'nobase' should now generally be '=nobase' instead of '+nobase'. * Updated handling of range calcs (the rangehalfdam and rangemax tags) to support use of 'nobase' * Updated handling of range calcs (the rangehalfdam and rangemax tags) so that if 'nobase' is used, and no other bonuses apply, the character range tags will be returned empty (