-------------------------------------------------------------------------------- B423 - RELEASE VERSION -------------------------------------------------------------------------------- Added code to preserve bonus values with decimal portions for international settings that don't use a period as the decimal character. Added validation steps to the trait Edit windows to help enforce that blank trait names aren't allowed. -------------------------------------------------------------------------------- B422 -------------------------------------------------------------------------------- Fixed a bug that prevented defaulted skills/techniques, without points spent on them, from properly receiving bonuses they were due. Calculation of the chararmordivisor() has been customized, and now supports a special target tag bonus of "infinity", which works similarly to "nosize" or "nocalc". Assigning "infinity" to the armordivisor$ will result in the entire chararmordivisor() value being replaced with the infinity symbol (technically, it's currently replaced with !, which stands in for infinity for now). Adjusted QuickView to correct the sometimes incorrect display of the infinity symbol. Adjusted Simple Edit to display ! instead of the incorrect infinity symbol (shown as 8) when appropriate, and included a note in the window that this is due to a display limitation. -------------------------------------------------------------------------------- B421 - RELEASE VERSION -------------------------------------------------------------------------------- Addressed a crash issue related to closing a character when an edit field is open in QuickView but the user is viewing a different tab. Addressed an issue related to the red P pre-req markers being erroneously displayed for traits on newly loaded characters. -------------------------------------------------------------------------------- B420 -------------------------------------------------------------------------------- Addressed a crash issue related to changes made in b412 for the cross-linking code, and certain bonuses. -------------------------------------------------------------------------------- B419 - RELEASE VERSION -------------------------------------------------------------------------------- Now allow the InputBox to open in the default position when creating a new Load-out, which should avoid a crash situation when GCA is running on second or third monitors. -------------------------------------------------------------------------------- B418 -------------------------------------------------------------------------------- Corrected some text. Added a Specialty Option to Options, allowing for the dislay of the Character In Play check box on the Attributes tab. Using the Character In Play check box tells GCA to use the in play cost multipliers for attributes for that character, if any are defined (this is generally a 3rd Edition feature, but is used by some 4th Edition home campaigns). Changed some of the INI bookkeeping related to the Update User Files check. -------------------------------------------------------------------------------- B417 -------------------------------------------------------------------------------- Fixed another bug in the code for updating user files. Changed the confirmation window text. Added entry to the Alert Dialog portion of Options for the Update User Files check. Clarification for existing item: For optListArray options, the OptionValue and OptionDefault parameters for optListArray, and the related FileGetListArray/FileSetListArray should be a actual arrays. If not an array, GCA will make one, but it will be initialized to 0 values. The pipe-delimited string only works for the OptionList value. -------------------------------------------------------------------------------- B416 -------------------------------------------------------------------------------- Fixed a bug in the newest code for updating user files. -------------------------------------------------------------------------------- B415 -------------------------------------------------------------------------------- Improved support for "slam" as a type of damage. Improved the new code related to copying user files for new users, so that it can check and update newer files for existing users, as well. GCA will ask before updating existing files. -------------------------------------------------------------------------------- B414 -------------------------------------------------------------------------------- Added support for age() and appearance() tags in templates, for setting the character's age and appearance values. Added useslocation() to the list of tags preserved through a Resync. -------------------------------------------------------------------------------- B413 -------------------------------------------------------------------------------- optListArray values were being stored into strings for storage in the INI file directly from the Boolean values, which means they were being "helpfully" translated to the local equivalents for True/False. This is a problem, since they're then useless as data. GCA will now translate to 1 for True and 0 for False when writing the data to the strings, so that when read back from the INI file, the values still have some meaning. GCA will do its best to translate existing values in INI files to the new values, but if you're unlucky enough to have all values filled (and not with True or False), rather than False being an empty value, then likely you'll need to re-set your preferences in those cases, because they'll likely be all True. -------------------------------------------------------------------------------- B412 -------------------------------------------------------------------------------- Made some changes to the code that is used to cross-link traits. This should remove a lot of incorrectly linked traits, and improve calculation times by about 20% or so. Added code to CalcReach to trap for "Fol-Up" as a reach() value, otherwise GCA would crash when trying to adjust "Fol-Up" for Size Modifiers that affected reach. Added code to CalcReach to support 'nocalc' as a targeted string bonus, if the intention is to return a string value granted by string bonuses, where further calculations shouldn't be done. (As a reminder, 'nosize' exists already, as of 402, as a targeted string bonus for reach where adjustments for Size Modifier should be skipped - the same as adding reachbasedon(0) to the trait.) -------------------------------------------------------------------------------- B411 -------------------------------------------------------------------------------- Updated GCA so that it can copy the standard suite of User files into the expected My Documents folder structure for a new user (based on Windows account, not whoever happens to sit down at the machine), since those files would not have been installed for them otherwise. GCA will only do this once per user account (unless GCA.INI is wiped). Added support for charweight() and charheight() tags in templates, for setting the character's height and weight values. -------------------------------------------------------------------------------- B410 -------------------------------------------------------------------------------- It's now possible for sheets to check Options.InSheetOptions to see if GCA is loading the options inside the Character Sheet Options window. Options.InSheetOptions = True if in the window, Options.InSheetOptions = False if not. -------------------------------------------------------------------------------- B409 -------------------------------------------------------------------------------- The DrawBitmap routine in the print wrapper for character sheets should now use the FolderSheets path, if no path is given for the bitmap filename. Fixed issue with optArrayList control where deselecting the one and only previously selected option would not be seen as a changed option value. Fixed issue related to CharacterSheetOptionsUpgrade when attempting to upgrade sheet options from a profile with a different name than the profile being imported into. -------------------------------------------------------------------------------- B408 - RELEASE VERSION -------------------------------------------------------------------------------- Finally fixed #Clone issue with an existing target causing odd behavior. Rules Options block moved from Program Options to Default Character Options. -------------------------------------------------------------------------------- B407 -------------------------------------------------------------------------------- Fixed bad reference in character point cost calcs. Modified the right-click menu for the trait tab character lists. Added a check box to the Simple Edit window to allow turning on or off the Alternative Attacks child-profile for an eligible parent item. -------------------------------------------------------------------------------- B406 -------------------------------------------------------------------------------- GCA will now automatically run CharacterSheetOptionsUpgrade for character sheets (if they have it) before running CharacterSheetOptions when printing/previewing/QuickViewing. Added the missing Options.FileGetVar and Options.FileSetVar items for sheet options, to allow getting/setting Var options directly to/from the INI file. The armordivisor and break tags should now be able to receive bonuses that make use of modetag$() and other more advanced targeted bonus tools (when generating chararmordivisor and charbreak). The various Rules Options (rule of, global rule of, dice+adds conversion, multiplicative modifiers, and allowing non-IQ optional specialties) from Program Options have been made Character options, as these are the most likely options to be adjusted on a per campaign basis, and therefore on a character basis. Most other options are related to how GCA works, while these affect how GURPS works. Corresponding options can now be found on the Current Character Options tab, and the Rules Options will soon be moved from Program Options to Default Character Options. A warning has been included on the Current Character Options tab about changing the options only when the GM is using them. The Char.Cats collection will now return the number of categories it contains for a particular item type, using the TypeCount() property like so: "NumSkillCats = Char.Cats.TypeCount(Type_Skills)" assuming Type_Skills = 6. Added Don't Count Against Disadvantages Limit to the right-click menu. Fixed a couple minor point accounting errors introduced in b393 (had stopped respecting ndl() and counting TL as an advantage). -------------------------------------------------------------------------------- B405 -------------------------------------------------------------------------------- * GCA should now support modifers that use Cost Factor instead of percentages, by using CF instead of % in the modifier's costs. Note that this support goes only so far as modifiers applied directly to traits; it does not work for modifiers being applied to other modifiers. * Templates should now be able to set a character's body type, like they set race, by including a bodytype(BodyType) tag in the template. * Addressed issues with #Clone by updating the method used to insert desired clone traits into the system lists. * Added new data file command #DeleteFromGroup, which looks like this: #DeleteFromGroup GroupName SK:Whatever, SK:Whatever (Three), ALL SK:Buncha Skills The group name should be the first thing after the command, separated by spaces from the command and the list of items that follows. Then should be a list of items, separated by commas, that should be deleted from the specified group. You can use the ALL keyword before an item to specify that all such items should be deleted - this allows you to skip listing every possible name extension for specialized skills that may be in the group. Quotes should be used around any name that includes a comma, or around the group name if it includes a space. The GR: prefix may be used, but is not required for the group name. * Added support for Alternative Attacks in calculating child items of Advantages. It does this using the new childprofile() tag, where if childprofile() = 1, then the cost of the child items is calculated based on full cost for the most expensive child, and 1/5 cost for the other children. * Adjusted UI size for optListArray in Sheet Options slightly. -------------------------------------------------------------------------------- B404 -------------------------------------------------------------------------------- Addressed some more issues related to optListArray. Made the UI for optListArray in Sheet Options display more of the available options. GCA should no longer repeatedly reload sheet options for the QuickView, or when printing sheets also loaded in QuickView. GCA will now load the [Body] section from data files. Different body types may be specified by using within the Body section. If no category is specified, Humanoid will be the default. Body parts are unique by category and name, so be sure to use the categories. Characters now have a BodyType tag. This defaults to Humanoid. In the Protection window, the available body types are now displayed in a drop-down above the full body parts listing. (This means you must open that side of the window, since it's not shown by default.) Changing the body type in the drop-down should change the available body parts that are available, and display the new information as appropriate. -------------------------------------------------------------------------------- B403 -------------------------------------------------------------------------------- Altered some internals for the optListArray options, which should correct some issues. The internal upgrade of the sheetoptions.ini file should be a bit more robust now. Changed the behavior of the Import Profile window slightly, restoring the default filter to *.ini Altered the B402 entry of this file to remove a couple small points of confusion. -------------------------------------------------------------------------------- B402 -------------------------------------------------------------------------------- * GCA now offers an 'optListArray' option (option type = 10) setting that works much like optListFlag, except this one returns an array of True or False values corresponding to each item in the List, and whether it has been selected or not. (This is stored as a text list in the INI file, but GCA will convert to/from the array in all cases for you.) As with most other places in GCA, the array is 1-based. The OptionDefault value should be an array of True/False settings as desired for the list. Examples: OptionName = "DOCS_ListArray" OptionType = optListArray OptionList = "1|2|3|4|5|6|7|8" redim a(8) a(1) = True a(8) = True OptionDefault = a UserPrompt = "Example of a Check List Array option" DisplayFormat = "" & BackGround 'a text string in the form of "BackColor|ForeColor" Options.AddOption OptionName, OptionType, OptionList, OptionDefault, UserPrompt, DisplayFormat OptionName = "DOCS_ListArrayNoDefault" OptionType = optListArray OptionList = "1|2|3|4|5|6|7|8" OptionDefault = 0 UserPrompt = "Example of a Check List Array option with No defaults set" DisplayFormat = "" & BackGround 'a text string in the form of "BackColor|ForeColor" Options.AddOption OptionName, OptionType, OptionList, OptionDefault, UserPrompt, DisplayFormat * Corresponding to the new optListArray, there are now Options.FileGetListArray and Options.FileSetListArray routines for directly accessing the INI settings. * GCA now offers an 'optVar' option setting for sheet options. This type of option has no UI, and provides no means for the end user to change the value. A Var can be set with Options.AddOption as with any other option (OptionType = -99), where the only pertinent setting value is OptionDefault, which should be set to the intended value of the Var. Alternatively, Vars may be set using Options.SetVar "VarName", "Value" and retrieved using Value = Options.GetVar("VarName"). Note that Vars are stored in the same collection as other options, so the names should be unique from all other options. Examples: const optVar = -99 OptionName = "DOCS_Var" OptionType = optVar OptionDefault = 1.5 Options.AddOption OptionName, OptionType, , OptionDefault Options.SetVar "DOCS_Var2", "Hello" tmp = Options.GetVar("DOCS_Var2") * GCA now offers an intermediate step when importing sheet options, which will allow for certain sheets to attempt upgrading the options that are about to be imported, if necessary. During this step, GCA will call a sheet's CharacterSheetOptionsUpgrade routine, allowing the sheet to perform any needed checks and upgrades. GCA will then import the upgraded settings into the current sheet options profile. Note that it is not required for sheets to support this feature. * Changed the behavior of the Import Profile window slightly, removing the default file name and changing the file filter to all files. * Made some changes to saving/loading character sheet options so that GCA should no longer save/use the file path as part of the sheet options name. With profiles now available, the extra path info should no longer be necessary, and keeping the it ensures the loss of option settings if files are moved around. * GCA will now attempt to upgrade the SheetOptions.INI file, so that users will not lose settings due to GCA no longer saving path information for character sheet profiles. When in doubt, GCA converts path information into a profile name for the sheet, so that the settings can be retained. GCA will also create a backup of the original sheetoptions.ini file in the folder. * Made some adjustments to the reach calculation code. Size Modifier adjustments are now done *after* targeted bonuses to reach are calculated, so that they won't be lost during those adjustments. If SM should not be considered for the reach of an attack, use reachbasedon(0) on the trait, or target a "nosize" bonus to reach$, just like "nobase" is used. * Sheet profile names using ampersands should now display correctly for the toolbar Print/Preview buttons. * GCA will now calculate charbreak() based on break() and targeted bonuses. * Addressed "subscript out of range" error that popped up when GCA was launched with command line to check for updates. * Adjusted how sheet options were added to the sheet's options collection, which should be slightly faster. -------------------------------------------------------------------------------- B401 -------------------------------------------------------------------------------- Added the ability for user-created trait tags to be calculated/solved before their value is returned to a request. By including a $ or # at the end of the tag's name, GCA will run the value enclosed in that tag through the text-only function solver (for $), or the normal full numeric solver (for #), before returning the result. For example, if you were to include tag called halfval#() on traits, and included an expression, such as halfval#(me::level/2), and then referenced it elsewhere, either on another trait or on a character sheet, GCA would return the solved value when it looked up the value for "halfval#"; in the example, if level was 10, it would return 5, instead of the expression text. NOTE: The tag name must include the $ or #, it is officially part of the tag name. You can not use a tag with one name, then try referencing it with $ or # to get a certain type of processing, as that will not work. It's all or nothing here. Added "Highlight" and "Include on GM Sheet" to right-click menu of trait tabs. Traits saved to data files from within GCA should now properly enclose in quotes any item names that include a comma. GCA will now remove the previously overlooked charminstr() and chareffectivest() tags from items saved to data files from within GCA. Changed some of the text labels on the Default Character Options tab of the Options dialog. Credits updated. -------------------------------------------------------------------------------- B400 -------------------------------------------------------------------------------- Found and addressed issue that caused certain SelectX constructions to result in a Select dialog that had no visible text for the various options in the Available lists. Added points display and adjustment spinner to Combination Editor. The Combination Editor is now "live", and will show the levels of the component targeted attacks, as part of the combination, for a particular combination that you're editing. Added support for the #BuildCharItemList directive, which works pretty much exactly like #BuildSelectList (see B396 below), using character data, but is processed normally with other directives, rather than only when a particular SelectX() is processed. This allows for generating lists based on character data, when the containing trait is added to the character. GCA should now sort the data sets listed by the Data Sets window. Credits updated. -------------------------------------------------------------------------------- B399 -------------------------------------------------------------------------------- Duplicate to Other Character functionality fixed for trait dialogs. GCA now prevents directly changing the levels of combinations in trait tabs/dialogs. GCA should now sort the data files listed by the DataSetFiles control. The mitigator()/mitigated() tags have been expanded beyond being simple flags. Now, mitigator()/mitigated() can have several states: (1) mitigator(yes) will set mitigated(yes), which means bonuses will be changed to conditional bonuses, and taboos will be ignored; (2) mitigator(taboo) will set mitigated(taboo), which means taboos will be ignored, but bonuses will remain bonuses; (3) mitigator(gives) will set mitigated(gives), which means bonuses will become coniditionals, but taboos will remain. Processsing of addmode() tags damtype, rof, skillused, minstbasedon, damagebasedon, parry, lc, and rcl have been changed from the last build. The attempt at normal calc functions was removed, and "%calcme" is not needed. Instead, these tags will be processed by the text function solver, not the normal solver, which will preserve the text nature of most of these tags, without attempting to solve for a numeric value. Clicking the Print toolbar button will no longer automatically send the character to the printer immediately, but will now pop up the Print dialog first. -------------------------------------------------------------------------------- B398 -------------------------------------------------------------------------------- Added ability for additional addmode() tags to be processed with calculations/functions. The following tags now support the new operations: damtype, rof, skillused, minstbasedon, damagebasedon, parry, lc, rcl. NOTE: I haven't tested this, and it's entirely possible that all these tags are now destroyed when addmode() creates a new mode. IF these were set to auto-calculate, in many cases they definitely would be destroyed, so instead they will not be calculated unless the new variable "%calcme" is included. If included, %calcme will be replaced with nothing, and the tag will be calculated to find its value. First draft of Duplicate to Other Character right-click option added. Changed right-click menu item "Copy Modifiers FROM Buffer" to "Paste Modifiers FROM Buffer". Added some additional checks to try to weed out blank items in SelectX list() items before they reach the dialogs. Fixed bug that had GCA stop processing normal directives when it saw a directive that is processed elsewhere. The usescount() tag will now be preserved through a Resync. -------------------------------------------------------------------------------- B397 -------------------------------------------------------------------------------- * Export dialog should now allow selection of sheet profiles. * Added a "Dialog X of Y" message to the lower right corner of SelectX dialogs. * Added the ability to target bonuses to traits with a specific tag value. The target template looks like this: BYTAG: where [ is | isnot | includes | excludes | listincludes | listexcludes ] Yes, I liked the structure from #BuildSelectList so much I used it here, too. See that for details (under B396). Only real difference here is that you need the ByTag: prefix on the front so we can isolate the functionality from other types of bonus targets. * Added support for the new tagwith() tag to the SelectX() structure, allowing for any items added/modified by the SelectX() to be tagged with one or more tags and values after OK is clicked on the SelectX dialog. It might look like this: select1(_ text("Please select two knightly weapon skills to train."), tagwith(knightly(yes)), pointswanted(exactly 8), itemswanted(exactly 2), list(_ SK:Broadsword #codes(upto 4pts, downto 4pts), SK:Axe/Mace #codes(upto 4pts, downto 4pts), SK:Bow #codes(upto 4pts, downto 4pts)_ )_ ) It would then be possible to use that tag and value, if desired, with a #BuildSelectList to target those specific traits later. That might look like this: select3(_ text("Please select an appropriate number or value of these traits."), pointswanted(exactly 4), itemswanted(exactly 1), list(_ #BuildSelectList(Skills where knightly is "yes", template(_ #newitem(SK:Increase %ListItem% by 4 points, existing(SK:%ListItem%)) #codes(upto %points+4pts, downto %points+4pts)_ )_ )_ )_ ) -------------------------------------------------------------------------------- B396 -------------------------------------------------------------------------------- * Added support for removemods() to allow for removing modifiers to traits from other traits. It looks like this: removemods( from [, from ] ) where is the name and extension (if any) of the mod to be found and removed. The whole ModName can be enclosed in quotes or braces if necessary (such as when it includes the "to" keyword or a comma) is the name of the trait from which you want to remove the modifiers, including prefix tag, and name extension (if any). Enclose it in quotes or braces if necessary. You can also specify multiple modifiers or multiple targets by separating them with commas, but if you do so, you need to enclose the whole block in braces or parens, to be sure that they aren't parsed out separately before the correct time. Here is a nonsense example: removemods( (Bar, Zub) from (SK:Some Skill, SK:Another Skill) ) * Added support for addmods() to allow for adding modifiers to traits from other traits. It looks like this: addmods(: to [, : to ] ) or addmods(#newmod() to [, : to ]) where and should be self explanatory, but if not, is the group in which the modifier can be found, and is the name and extension (if any) of the mod to be found. and must be separated by a colon, and the whole group:name block can be enclosed in quotes or braces if necessary (such as when it includes the "to" keyword or a comma). is the name of the trait to which you want to add the modifiers, including prefix tag, and name extension (if any). Enclose it in quotes or braces if necessary. #newmod() allows you to specify a full modifier definition, as is required in some other parts of data files, instead of using a reference to an existing modifier. You can mix and match group:name or #newmod() blocks. You can also specify multiple modifiers or multiple targets by separating them with commas, but if you do so, you need to enclose the whole block in braces or parens, to be sure that they aren't parsed out separately before the correct time. Here's a nonsense example: addmods( (Foo:Bar, Flub:Zub) to (SK:Some Skill, SK:Another Skill), #newmod(Lub, +1, group(Zub)) to SK:Some Skill ) As you can see, you can add multiple modifiers to multiple skills, in multiple blocks, if desired. * Added a new SelectX() specific directive to allow for building a list of items for use in the SelectX item list, which is processed when the SelectX() becomes active. This means it may possibly include items from earlier SelectX() picks, which wouldn't be the case for normal such directives. #BuildSelectList( where , template( [some text]%ListItem%[more text] ) [, taglist] ) #BuildSelectList allows for creating a list of items that are built based on the specified template() text, where each occurance of the %ListItem% variable is replaced by the full name of any traits selected based on the Where statement that makes up the primary portion of this tag. Should no template() be included, then a list of the item names is returned. The Where clause works like this: should be replaced with the type of traits to be looked at. This is a word or prefix tag, such as "Skills" or "SK:" (without the quotes). should be replaced with the trait tag whose values we want to examine for our selection process. This is just the tag name, such as "cat" or "tl" (without the quotes). = [ is | isnot | includes | excludes | listincludes | listexcludes ] Select one of these comparison options. Be sure whichever one you use is *all one word*, or the #BuildSelectList will be rejected, and your template will fail. - "is" means the and the must match. - "isnot" means the and the must not match. - "includes" means the must include, anywhere, the - "excludes" means the must not include, anywhere, the - "listincludes" means the must have somewhere in its list of values the . So you could specify a tag of "cat" and a of "Hobbies", and as long as one of the cat() categories for an item is "Hobbies", it would be selected. - "listexcludes" means the must not have anywhere in its list of values the . So, using a tag of "cat" and a of "Hobbies", anything with "Hobbies" would be excluded from being in the result list. should be replaced with the value of the tag that should be looked at in the comparison. Include quotes or braces around this value if it includes spaces or commas, or just in general for safety. Let's look at an example: select3(_ text("Please select an appropriate number or value of these traits."), pointswanted(exactly 4), itemswanted(exactly 1), list(_ #BuildSelectList(Skills where cat includes "Melee Combat", template(_ #newitem(SK:Increase %ListItem% by 4 points, existing(SK:%ListItem%)) #codes(upto %points+4pts, downto %points+4pts)_ )_ )_ )_ ) In this SelectX(), we want to build a list of skills where some portion of the cat() tag includes the phrase "melee combat". For every such skill on the character, a #newitem() will be generated as a member of the list() tag for the SelectX(), and that item will allow for an existing skill to be increased by 4 points, and only 4 points. So, if the character had two skills from the "Combat/Weapons - Melee Combat" category of skills, let's say Broadsword and Axe/Mace, the result of the SelectX() statement above would look like this immediately before it was processed by the selection window, as if you'd written it this way: select3(_ text("Please select an appropriate number or value of these traits."), pointswanted(exactly 4), itemswanted(exactly 1), list(_ #newitem(SK:Increase Broadsword by 4 points, existing(SK:Broadsword)) #codes(upto %points+4pts, downto %points+4pts), #newitem(SK:Increase Axe/Mace by 4 points, existing(SK:Axe/Mace)) #codes(upto %points+4pts, downto %points+4pts)_ )_ ) * Fixed issues related to canceling out of a template when some of the traits added/changed were existing items. * Addressed issue that didn't allow multiple possible occurances of the same trait having been selected/modified in various different SelectX() windows for a single template. * Fixed bug in combo name editing for new combos being added to character. * Adjusted the step() value for Combinations, to reflect their level, rather than the giant negative value they were previously showing. -------------------------------------------------------------------------------- B395 -------------------------------------------------------------------------------- Added support in the SelectX() system for upgrading a character's existing traits, if they can be specified. This currently works by creating a #newitem (actually, an existing item would also work, if previously created specifically for this purpose) that includes the existing() tag, where the existing() tag specifies the name of the character's existing trait that is intended to be modified, such as existing(SK:Broadsword). You'd then use #codes() to specify upto/downto limiting the trait modification to the desired range. The upto/downto in #codes() can use two special variables that are specifically replaced when the character's trait is pulled up for this purpose: %points and %level will be replaced with the character's *existing* values, so that you can use them in #codes for relative values, such as #codes(upto %points+4pts, downto %points+4pts) to lock the trait down to previous value +4 additional points from the SelectX(). The Targeted Attack system 'builder' traits will now be at the top of the list of Available Attacks in the Combinations Editor, allowing the user to create additional targeted attacks while building combinations. Adjusted some of the combination calculations, so they should now be in line with Kromm's explanation. Additional work on the Combinations Editor. -------------------------------------------------------------------------------- B394 -------------------------------------------------------------------------------- Added option to lightly shade alternate lines of lists in the built-in QuickView display. It is now on by default. Altered QuickView trait printing code. May be slightly faster. Updated QuickView to handle combinations. Added option to Options / Display Options: "Show Available Spells items dimmed if pre-reqs aren't already met", and included warning: "(Not recommended, as it adds a very large delay to updating the Available Spells lists. Doesn't work with the QuickView trait list. Only updates when spells are added to the character, or when you trigger a list refresh another way, such as by changing the category drop-down.)" The default state of this option is False (off, not in use), which is the way GCA has worked up to now. Updated various things on the Combination Editor window. Updated various calculations related to combinations. Made canceling out of Combination Editor when adding a new combination cancel the addition of that trait, rather than allowing a 'blank' one to be added. Altered slightly the generation of Available lists in trait windows. May be slightly faster. -------------------------------------------------------------------------------- B393 Addendum -------------------------------------------------------------------------------- Combinations support currently makes use of two new skill types: [SKILLTYPES] Combo/2, cost(4/5), base(-6), defaultstat(%combo), relname(def), subzero(yes), zeropointsokay(yes) Combo/3, cost(5/6), base(-12), defaultstat(%combo), relname(def), subzero(yes), zeropointsokay(yes) The name of the type isn't important, but the defaultstat(), base(), subzero(), and zeropointsokay() are all required for any skill to be a Combination, and to work correctly. In conjunction with the new type, two new skills: [Skills] Combination (2 Attack), Combo/2, x(#BuildCombo(2)) Combination (3 Attack), Combo/3, x(#BuildCombo(3)) The Name should be Combination, but is not required to be; I thought it a good start, and users can rename that to give flavor if they wish. The Name Extension will be replaced during the build process. The type should match whatever was used in the SkillTypes section. The #BuildCombo directive tells GCA how many attacks should be part of the combination. -------------------------------------------------------------------------------- B393 -------------------------------------------------------------------------------- Started initial code to support combinations. This may have affected existing skill code, so watch for issues. GCA should now remove surrounding quotes or braces from items listed in the list() of a SelectX(). When exporting a sheet profile, the profile name should now be part of the suggested export filename. Fixed crash bug related to character damage bonus targeting. Adjusted startup info in logging window slightly. -------------------------------------------------------------------------------- B392 -------------------------------------------------------------------------------- GCA should now run only a single instance in most cases. It should now be possible to target the character's base damage (Char.BaseTH and Char.BaseSW) using gives(). Target tags are "char::baseswdice" and "char::basethdice" to add to the dice portion (Char.BaseTHDice and Char.BaseSWDice), or "char::basesw" and "char::baseth" to add to the adds portion (Char.BaseTHAdds and Char.BaseSWAdds). Finished code for reach calc adjustments. Added a bit of code to hopefully help with those getting a crash error after closing GCA. Updated the startup Windows version check (it just prints the version to the log). Added a couple lines to startup info in logging window. Fixed bug that would crash GCA if sheetoptions.ini didn't exist, and the user opened Options. -------------------------------------------------------------------------------- B391 -------------------------------------------------------------------------------- First draft of code for Size Modifier (or other such things that affect the X Reach attributes) affecting Reach has been added. This includes initial support for a reachbasedon() tag, to determine which Reach attribute applies (no UI is available for adjusting this tag yet). Added ability for Sheet Options window to remember how the user sizes and places it. Fixed bug preventing Options window from remembering how the user sized and placed it. Range calc results should now be rounded off to a whole number. It should now be possible to correctly load attributes with name extensions from data files. Adjusted the appearance of the Sheet Options dialog a bit. Added ability to export sheet profile settings to an external file, and the ability to import sheet profile settings from an external file. Changed the Delete Data Set toolbar image in the Change Data Sets dialog to a red version. Print/Preview Using... now supports sheet profiles. Polished up a few profile related things. -------------------------------------------------------------------------------- B390 -------------------------------------------------------------------------------- Character sheet options may now use option profiles instead of every sheet being limited to one set of options. GCA has been altered in most areas where selecting a sheet is possible, to allow selecting of a sheet profile instead. The Sheet Options window has been altered to support saving and deleting profiles. Messed about with the trapping of broken/missing character sheets in the sheet printing routine. Changed loading of crash-recovery files to allow for mass loading them in the new loader window. Addressed a bunch of path issues in the Options dialog related to character sheets. Changed behavior slightly, as well. GCA should now support GCS files being UTF-8 encoded, like other files. As usual, our encoding flag should be the first line, before the 'VBScript line. Data file loading now specifies file access as read-only, so perhaps that will prevent the copies in the virtual store some folks are seeing. Updated same-skill cross-TL defaulting to use book values, not incorrectly remembered values. Fixed bug in Modifiers window introduced with recent changes. Adjusted handling of Specified Categories in Modifiers, to also list them separately in the category drop-down (technically, it was always supposed to do so, but it appears that wasn't happening). And Equipment is now added to the Specified Categories list, if not there already, for any equipment traits, rather than being included but not listed for them as I was doing it in the last couple builds. Mitigated traits will no longer check for their taboos, and will not trigger most taboo checks against them. -------------------------------------------------------------------------------- B389 -------------------------------------------------------------------------------- Added support for blanket mitigators, which work like so: a modifier to a trait that includes the mitigator(yes) tag will cause the trait to have the mitigated(yes) tag; mitigated(yes) means all the trait's bonuses will be applied as conditionals, instead of as regular bonuses. Both mitigator() and mitigated() are flag tags. When the mitigator(yes) is no longer present on any of the trait's modifiers, mitigated(yes) will be deleted, and the bonuses will return to normal. It is not possible to apply mitigated(yes) manually and have it stick. It is not possible to have a partial mitigator. Only modifiers to traits can be mitigators; modifiers to modifiers can not be. Fixed display of character modifiers in Modifiers window for "All relevant modifiers" listing. In Options, the drop-downs for selecting the QuickView sheets for both Default and Current characters were not operating as intended. That should be fixed. When a new category is added to a trait's cat() tag through the Full or Advanced Edit windows, it should now update the character's Category collection to reflect the new category, if it was not already there. (Note that this may result in a lot of faulty categories added to the collection if you make a lot of corrections or changes.) GCA should now calc default Parry and Block values even when the Protection window has not been used. -------------------------------------------------------------------------------- B388 -------------------------------------------------------------------------------- GCA will now calculate a CharEffectiveST() tag (when deemed appropriate), which will hold the mode-aware effective ST for the trait. This is based on Striking ST, unless DamageBasedOn is set, in which case it's based on that tag. Any bonuses targeted to "effectivest" will be applied to the base value to result in chareffectivest(). First draft of same-skill cross-TL defaulting is now in place. 'Equipment' is now a default included category in the Modifiers window for equipment items when using the default Relevant mode. Modified the default behavior of the Modifiers window to allow only "All relevant categories" rather than "All categories". This will limit the display in the window to the trait's specified mods, plus the general mods (all those mod groups that start with an underscore _ character). But I've added back the option to return it to the previous behavior (all possible modifiers in the system) in the Options window, although I also mention there that it is not recommended. Added the SysPathToSheets() read-only property to the PrintWrapper. This returns the fully qualified path to the folder where GCA expects to find character sheets. Note that the existing ScriptFile property will return the fully qualified path and file name of the sheet that's currently being executed, which may not be in the same location where GCA normally looks for sheets. Addressed strange issue related to rounding and mods for mods affecting base traits. -------------------------------------------------------------------------------- B387 -------------------------------------------------------------------------------- * GCA should now be correctly loading/saving files to UTF-8 if they were not previously encoded as such, when saving traits or templates to the files from within GCA. * Corrected what appeared to be a bug in the #ChoiceList handling of requests for specific items from the alias lists. This should not ever have affected use of %choicealiaslist% as a list. * Added support to #ChoiceList for up to five %alt% lists, which are like alternative alias lists. Use is much like using %alias%, except you'd use %alt1% up to %alt5% instead. However, the alt lists do not currently support an equivalent to the %choicealiasnotlist% construct. You'd specify the available options for the alt lists using the tags alt1list() to alt5list(), and reference the chosen equivalent item lists using %choicealt1list% or as appropriate for the list number. * Added ability to needs-check for some number of perks or quirks, such as needs(5 quirks) or needs(2 perks). -------------------------------------------------------------------------------- B386 -------------------------------------------------------------------------------- An "Encoding=UTF-8" flag should now be the very first line of data files. Yes, even before the "Version=3" line. (Our message for the "Version=3" line should probably now reference both lines, and say line 2 for Version.) An "Encoding=UTF-8" flag should now be the very first line of characters saved from GCA. This should now be included automatically. Characters without the flag will be loaded with the default encoding, instead. Added a graphic to the character-loading splash window. Adjusted the Append mode of my file writer class, so hopefully it'll stop chopping line feeds off of lines. -------------------------------------------------------------------------------- B385 -------------------------------------------------------------------------------- Data saved from GCA (items from the edit window, or templates from the Builder) should now be saved as UTF-8 encoded. FastLoad files should now be saved/loaded as UTF-8 encoded. Data files should now be loaded as UTF-8 encoded. Character files should now be saved/loaded as UTF-8 encoded. Disabled the internal process of creating a complete new character in order to load a saved character into it. This will speed up character loading considerably, and all info should already be in the character file. Added a modal window that appears when loading a character or creating a new one. On slower machines, this should help to avoid issues with loading one character before another has completed loading, which caused some problems. Disabled plug-in script controller, since plug-ins were never publicly enabled. Added support for downto() in ad/disad calcs. (Previously only worked as part of a template.) -------------------------------------------------------------------------------- B384 -------------------------------------------------------------------------------- * Addressed an issue created by the Quick View window that would result in some bad data messing up certain calculations when the page-area was clicked to exit an entry field after changing a stat value, rather than exiting by Tabbing to the next field. * Addressed some (but not all) places that contributed to indent creep in the logging window. * Data Sets and Data Files windows are now correctly not mimimizable. * Added support for the roundlastonly(yes) flag tag, which is intended for traits that have fractional base values, which are supposed to be modified by modifiers, and should only be rounded up after all modifiers are finished, rather than GCA's normal method of rounding after each tier of modifiers. Use cautiously, as this overrides certain specialty modifiers that might normally request rounding down for some tier. * CountAsNeed() has been expanded in capability. This tag may still specify CountAsNeed(no) to never be counted as a valid prereq item, but the value may now, instead, be a list of special identifiers for which it is valid to count the item as a prereq, but any item not including a listed identifier may not count the item as a prereq. An item may now use the corresponding Ident() tag to specify one or more identifiers for purposes of needs checking, such as Ident(Summoner, Priest), in which case any CountAsNeed() tag that specifies 'Summoner', 'Priest', or both, would be a possible valid prereq for the item with that Ident(). -------------------------------------------------------------------------------- B383 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed odd (compiler?) issue with footnote symbols in the print wrapper. Print/Preview Using should now open in the Sheets folder (or the folder of the currently designated default character sheet for the character) as intended. -------------------------------------------------------------------------------- B382 -------------------------------------------------------------------------------- Added the pilcrow (¶) to the built-in list of footnote symbols in the print wrapper. -------------------------------------------------------------------------------- B381 -------------------------------------------------------------------------------- Addressed issue for DrawShieldArcPicture() and DrawShieldArcPictureUsingCache() routines where larger font sizes resulted in the drawing routine not correctly shading the hexes with ActiveHexColor or InactiveHexColor. The @if() function in the Solver now supports the ElseIf..Then construction, to allow for additional possible results without having to explictly embed additional @if() functions. It is structured like this: @if( then elseif then elseif then else ). As many ElseIf..Then blocks are allowed as are needed, but none are required. As with the existing function keywords Then and Else, you must include a space before and after the ElseIf keyword, or GCA will not parse it correctly. ElseIf must be written as a single word. GCA will only evaluate the ElseIf blocks if the If expression evaluates to 0 (False), and when evaluating, it goes in the order they are found, and ends with the first non-zero (True) result for a given ElseIf expression, using the corresponding Then block to find the function result. The Else block must be the last block in the function, after all ElseIf blocks. -------------------------------------------------------------------------------- B380 -------------------------------------------------------------------------------- * GCA will now save shortened path info for sheet paths in saved characters, even if they haven't gone into the Options dialog. Note that GCA will not be able to shorten older XP style "C:\Documents and Settings\USER\My Documents\" paths if you are now on Vista or Win7, because the new location of "C:\Users\USER\Documents\" isn't the same to GCA. * Addressed issue related to printing of pictures on sheets when the picture name provided was just a path, with no actual picture file included. * Expanded the capability of the DrawShieldArcPicture routine: Public Sub DrawShieldArcPicture(Char As GCACharacter, _ PicLeft, PicTop, PicWidth, PicHeight, _ Optional ByVal IncludeValues As Integer = True, _ Optional ByVal TextColor As Long = 0, _ Optional ByVal BoxColor As Long = 0, _ Optional ByVal ShadeColor As Long = &HFFFFFF, _ Optional ByVal BoxText As Integer = True, _ Optional ByVal ShadeBoxText As Integer = True, _ Optional ByVal ActiveHexColor As Long = &HC6C6FF, _ Optional ByVal InactiveHexColor As Long = &HFFFFFF) BoxText = True : will draw a box of color BoxColor around the text for the IncludeValues related text ShadeBoxText = True : will shade the background color of the IncludeValues related text ShadeBoxText = True and BoxText = False : will draw the shaded area of the box, but not the bounding box around the text ShadeBoxText = False and BoxText = True : will draw the bounding box, but not shade the interior (it will be the color of the hex) of the box * Added two routines to allow for printing the Shield Arcs image embedded within the Body Parts image. (This allows for a more transparent embedding, rather than having to print the entire block as would have to be done otherwise.) This routine: Public Sub DrawBodyPartsPictureCache(Char As GCACharacter, PicLeft, PicTop, PicWidth, PicHeight) works just like the normal DrawBodyPartsPicture() routine, except it doesn't draw the image to the printer (yet), instead it's printed into an image cache, for use with the DrawShieldArcPictureUsingCache() routine. The location and size info provided is cached until needed. This routine: Public Sub DrawShieldArcPictureUsingCache(Char As GCACharacter, _ dLeft, dTop, dWidth, dHeight, _ Optional ByVal IncludeValues As Integer = True, _ Optional ByVal TextColor As Long = 0, _ Optional ByVal BoxColor As Long = 0, _ Optional ByVal ShadeColor As Long = &HFFFFFF, _ Optional ByVal BoxText As Integer = True, _ Optional ByVal ShadeBoxText As Integer = True, _ Optional ByVal ActiveHexColor As Long = &HC6C6FF, _ Optional ByVal InactiveHexColor As Long = &HFFFFFF) works just like the normal DrawShieldArcPicture() routine, except the image is drawn into the Body Parts picture that was previously cached. The dLeft, dTop, dWidth, dHeight parameters are for location and size within the Body Parts picture, not for location and size on the page. The Shield Arcs image is drawn with a transparent background, so only the area used by the hexes covers the Body Parts image, rather than the entire rectangle encompassing the Shield Arcs image. DrawBodyPartsPictureCache() should be called first, then DrawShieldArcPictureUsingCache(), which will actually print the combined image to the printer. -------------------------------------------------------------------------------- B379 -------------------------------------------------------------------------------- Specialty tag skip() will now be preserved when resyncing traits. Fixed issue in needs checking where certain types of needs were not handled efficiently because GCA was not removing braces or quotes surrounding item names before certain checks. Fixed issue in needs checking / auto-adding of traits where a point value was specified, and GCA would not assign the correct number of points to an already existing trait that did not have the requested points spent. In saved character files, the dataset(), datafile(), and portraitfile() entries will now use shortened path variables when possible. GCA now uses an alias list file to see if a system data file that it fails to find has been moved to another folder, renamed, or deleted. GCA will put a notice in the log when it finds something it's looking for in the alias file, so that users can be informed of the change. -------------------------------------------------------------------------------- B378 -------------------------------------------------------------------------------- * Advantages, disadvantages, perks, quirks, and templates can now have their base level costs based on a formula, included in a formula() tag. If a formula() tag is included, the cost will always be calculated based on the given formula, but a cost() tag still needs to be provided if the trait is to be leveled, because that's what GCA uses to determine that there are multiple levels possible (that cost can be 0/0 or such). A displaycost() tag may also be appropriate. * Right-click menu items "Deactivate Bonuses" and "Reactivate Bonuses" have been expanded to "Deactivate Bonuses From Selected" and "Reactivate Bonuses From Selected", respectively. * Expanded handling of characters loaded from command line to allow short-path variables in the given paths. * It's now possible to have GCA automatically run, load characters, export them, then quit, by using the new command line option: /export. The format for the command is something like this: "/export=export filter.gce > outputfile.txt" "%user%\character1.gcs" or this: "/export=%user%\export filter.gce > %userbase%\%name%.txt" "character1" "character2" As when loading characters from the command line, character filenames should each be enclosed in quotes, and separated by spaces. The filenames can be fully qualified paths, no paths, or use the short-path variables. If no path is given, GCA will apply the %user% short-path for the characters folder. The /export= component should also be enclosed in quotes, and separated from any other command line items by spaces. The first item immediately after the = is the name of the export filter to use. Again, you may include the path, no path, or the short-path variables. If no path is specified, GCA will apply the %user% short-path for the sheets folder. The section of the /export command that includes, and follows, the > character is all optional. If used, this specifies the name of the export file, its location, and its extension. GCA uses the .TXT extension by default, and if this section is not included, it will export the file using the name of the character file, with the .TXT extension tacked onto the end. If this section is included, you may include the path, no path, or the short-path variables. If no path is specified, GCA will apply the %user% short-path for the characters folder. You can also use the special %name% variable, which will be replaced in each exported file with the name of the character file that was used. Be aware that if you use the optional destination file name, and do not use %name%, then all characters specified on the command line will use the same destination file, and you will end up with only the last character's information in the file after the process completes. There is no way to combine all characters into a single exported file. When using the /export command line, GCA will fully load, but will suppress all the user interface elements and windows, so unless an unexpected error occurs, you may only see a quick flash of the logging window, and nothing else, until the exported files appear in the destination folder. If things don't appear to go as you expect, but you don't see the files where you expect them, you can check the debug.run file for possible errors. This file appears in the Users\\AppData\Roaming\Steve Jackson Games\GURPS Character Assistant 4\ folder in Windows 7 and Vista, and in similar folders for XP and earlier. -------------------------------------------------------------------------------- B377 -------------------------------------------------------------------------------- Adjusted built-in QuickView sheet to wrap Notes column on Weapons tables (Page 3) if necessary. This previous change: "GCA was saving and loading . . . separate paths . . . GCA will use the set paths for Sheets instead . . ." in the last build broke the Default Character preferences in Options, preventing users from referencing any of those files in a folder other than the specified Sheets folder. This is not acceptable behavior. The previous method of tracking those files and paths has been restored. However, GCA now manages these paths more closely, and can more often use shortened paths to reference them, which should help reduce issues. The character sheet and quickview sheet settings in Options will now include the currently chosen sheet at the top of the drop-down selection lists. If the current selection is from a folder other than the Sheets folder, then this is the only option that will be using this non-Sheets folder--all other options will always be from the Sheets folder. There is now another short-path variable used by GCA: %userbase%, which is for the base folder set in My Documents for GCA files. This allows GCA to shorten paths that are in the same base structure, but which may not be in the normal folder specified for such files. -------------------------------------------------------------------------------- B376 -------------------------------------------------------------------------------- Fixed the bug that crashed GCA when trying to needs-check a trait that referenced a group that the character did not have. When changing the User Folders in Options, GCA should now automatically change the sub-folders for you when you change the GCA User Documents Folder, to use the newly set GCA User Documents Folder, if those sub-folders were using the same base location to start with. Also, when changing the folders, GCA should use the initial folder in the Browse window that's currently displayed in the window, rather than whatever the previously set configuration folder may have been. Color of links in the About window changed to blue. GCA was saving and loading a couple specific file path values (for character sheets) that were maintained separately from the paths set by the user for their folders in Options. Those separate paths have been removed, and GCA will use the set paths for Sheets instead (in most cases, these should have been the same anyway). Characters should now save their charactersheet(), altcharactersheet(), and quickviewsheet() data paths using the shortened form that uses "%user%\" to represent the default user specified folder for sheets. Full path info should only be included if the path for the sheet doesn't match the user's settings when expanded. This should help to reduce issues when moving data folders or sharing characters. Fixed issue that prevented changes to the File extension field in the Export Options dialog from being retained if the window was closed immediately after it was changed. Bonuses/conditionals to targets STSkillPoints, STSkills, DXSkillPoints, DXSkills, IQSkillPoints, IQSkills, HTSkillPoints, HTSkills, STSpellPoints, STSpells, DXSpellPoints, DXSpells, IQSpellPoints, IQSpells, HTSpellPoints, HTSpells should now be working. These affect skills/spells, or the points given to them, that have the skill type specified. So, a bonus to STSkills would give that bonus to any skill with a skill type that starts ST/. Conditional Bonus code was streamlined to use more of the standard Bonus code. There is now a Global Rule Of option that applies the Rule Of value to all standard defaults. For example, this would allow for capping at 20 a skill level that is being defaulted from, the same as attribute scores being defaulted from, if this option is enabled and the Rule Of value is 20. Techniques are not affected. -------------------------------------------------------------------------------- B375 -------------------------------------------------------------------------------- Sheet options dialog should support export sheets in the drop-down and in the Browse... dialog. Added "Bonuses Calculated from Other Sources" line above DR Bonus and DB Bonus in the Body Protection section of the Protection window, in hopes of making it more clear that these bonuses are displaying values from elsewhere, and are not for the user to enter values of their own. Added "Select skills here. For specific equipment items, see the information for that item." lines above the Parry and Block selections in the Active Defenses section of the Protection window, in hopes of making it more clear that these values are when using general skills, not specific weapons. Character will now save/load a new [ShieldArcs] section, which includes FacingDB() and HexMask data. These correspond to the new properties on the character of char.ShieldFacingDB(Index) as Integer and char.ShieldFacingHexMask() as String. These contain and provide access to data on the character's selected shield arcs and values. The HexMask is a six character string that contains a plus or a minus for each position, with the plus marking there is coverage there. The first position is the left flank, and the last position is the back, working clockwise. So, a hexmask(-----+) shows that there is only coverage for the back. The FacingDB() values are likewise from 1 to 6, so in this case char.SheildFacingDB(1) through char.ShieldFacingDB(5) are all 0, because there's no coverage, while char.ShieldFacingDB(6) would be the total DB for the coverage there. Yes, the HexMask() is largely redundant, but is used internally as a quick way to display the graphic showing the shield arc coverage. Two new functions in the print wrapper: Public Sub ShieldArcPictureOptimalSize(PicWidth, PicHeight) to return the optimal size for printing the shield arc coverage picture; and Public Sub DrawShieldArcPicture(Char As GCACharacter, PicLeft, PicTop, PicWidth, PicHeight, Optional ByVal IncludeValues As Integer = True, Optional ByVal TextColor As Long = 0, Optional ByVal BoxColor As Long = 0, Optional ByVal ShadeColor As Long = &HFFFFFF) for drawing the picture. If IncludeValues is passed as False, GCA will not automatically include the DB values for the coverage in each arc. (GCA will use the FontName and FontSize set in the BodyFormat object for DrawBodyPartsPicture when drawing the text for the values.) -------------------------------------------------------------------------------- B374 -------------------------------------------------------------------------------- Fixed bug that prevented category codes from being updated if the existing code is blank. Deactivate/Reactivate Bonuses should now affect bonuses granted by the trait's current modifiers also. -------------------------------------------------------------------------------- B373 -------------------------------------------------------------------------------- Added options to the right-click menu in trait tabs for Deactivate Bonuses and Reactivate Bonuses. Traits selected for Deactivate Bonuses will gain the inactive(yes) tag, and they will no longer grant any bonuses. Traits selected for Reactivate Bonuses will have the inactive(yes) tag removed and its bonuses will be recreated (if the inactive(yes) does not exist, nothing will happen to the trait). GCA will highlight the name of 'inactive' traits with a light red background in the name column. Increased the width of the Notes column slightly on the built-in QuickView sheet on the weapon tables. Addressed issue with created modes not propagating damageistext() correctly. -------------------------------------------------------------------------------- B372 -------------------------------------------------------------------------------- Added a browse button to Available Data Files for changing the folder used for user files in the data sets control. Added graphics file types .TIFF, .TGA, .JP2, and .JPX to the portrait load dialog. Added code to support a special case damage calculation tag: damageistext(). This is a mode-specific tag, so certain modes may be 'yes' while others are empty (this is a flag-tag, so empty means it doesn't apply, while any other value means it does apply). If damageistext(yes) is found for a mode, that mode will preserve the text value of the damage() given, and will calculate only the bonuses that might apply, tacking them on the end if available. GCA should now always use Portrait Letter for the paper selection of the built-in QuickView sheet. This should not affect any user-created sheets used in QuickView, which should continue to honor the Print Setup... selection. -------------------------------------------------------------------------------- B371 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed bug that caused Change Loaded Data Files dialog to pop up devoid of information, preventing it from functioning correctly, if the user's system data files have changed and they do not have "Choose Data Set at start-up" selected in Options, but they do have "Check for new data files on start-up" selected (this is the default configuration). -------------------------------------------------------------------------------- B370 -------------------------------------------------------------------------------- Fixed bug in Data Sets dialog that would sometimes mark Sys files as User files incorrectly, and be unable to find their description data as a result. Added checkbox to Flagged Files dialog, requiring it to be checked before OK button is enabled. This is to help enforce how important the flags on files are. WorldBook=[Setting] is now the correct way to use the WorldBook= data file flag. All files containing worldbook specific data can now be safely flagged with the same WorldBook=[Setting] flag, and they will not trip GCA's worldbook flag message, but having two different [Setting] values will trip the flag. The WorldBook flag message in the Flagged Files dialog will now show the setting each file is flagged with in the WorldBooks section. Fixed bug where GCA would duplicate all modifiers across all traits when clicking Cancel from an Edit window loaded with multiple traits. Traits affected by a createtags() or a mergetags() should update their relationships, helping to avoid apparent trickle-through issues. -------------------------------------------------------------------------------- B369 -------------------------------------------------------------------------------- Added column headers to the Apply Armor checklist. Added a Set Shields tab to the Protection window. Once shields are applied in the Apply Armor tab, you can set how they're carried here, and it'll show you the arc of protection you receive as a result. -------------------------------------------------------------------------------- B368 -------------------------------------------------------------------------------- Adjusted User Folders dialog appearance a bit. Did some work on Data Sets dialog to try catching non-existant data set files better. Deleting a data set in the Data Sets dialog will now delete the associated fastload files. The Data Sets dialog should now be better about saving files assigned to a data set when they're changed, or when you change to other data sets in the window. This does make the Save Data Set toolbit redundant, but I left it there anyway. The Data Sets dialog now supports the shortcut F2 for Rename Data Set. GCA should now look for character sheets in the default file location if it does not find the character sheet a character is asking for at the location saved with the character. Adjusted the starting folder for setting Sheet Options to reflect default sheet folder. Adjusted the starting save/load location for character related files to reflect default character folder. -------------------------------------------------------------------------------- B367 -------------------------------------------------------------------------------- Fixed bug where a trait with a name extension would not count as a member of a group that contained the trait's name but no extension, although it is supposed to do so. Fixed bug in compound bonus support. GCA will now set the basevalue() for the DB stat based on the shields equipped in the Protection window. (NOTES: It actually sets this based on any items with a db() value that do NOT have a location(). Also, there is currently no DB attribute in the data files, even though there is supposed to be.) Added function @IsEven(value) to Solver. Returns True if given value is an even integer, or false otherwise. Added function @Modulo(value1, value2) to Solver. Returns the remainder value after value1 is divided by value2. For example, @Modulo(10,2) would return 0, while @Modulo(10,6) would return 4. -------------------------------------------------------------------------------- B366 -------------------------------------------------------------------------------- Removed some obsolete procedures from the code. Finally finished updating ConditionalList to work like BonusList, where you can access the individual conditional bonus list items through ConditionalListItems(Index), and can find the number of them with ConditionalListItemsCount(). Of course, you can still get the old text string listing through TagItem("conditionallist"). New support added for "compound" bonuses. These are bonuses that use a single bonus listing to grant a bonus to one or more possible targets, but that will *not* add the bonus more than once to any particular target, no matter how many of the listed targets it may qualify as. For example, gives(+1 to (CO:Air, CO:Water)) is a compound bonus, as it grants a bonus to both the colleges of Air and Water, but any spell that might belong to both colleges will still only get a single +1 bonus, not a +2 for belonging to both colleges. Note that if the gives() had been written gives(+1 to CO:Air, +1 to CO:Water), a spell belonging to both colleges *would* receive a +2, because it would satisfy both targets for both bonuses--this is what compound bonuses are meant to address. Note that compound bonuses do not work with target tag bonuses, or with targets of me:: or owner::. To create a compound bonus, the structure is the same as any other gives() bonus, except that the targets should be enclosed in a parens as a comma separated list. If a target name includes commas, it may be enclosed in quotes or curly braces. -------------------------------------------------------------------------------- B365 -------------------------------------------------------------------------------- Adding or changing conditional() in the Edit Items window should now be reflected correctly. Adjusted calculations so that changes to bonuses based on owner:: values, as granted by modifiers, should be reflected correctly. Equipment items now have two additional tags: precountcost() and precountweight() which are the cost and weight of the item after modifiers, but before being multiplied by count(). Needs checking system modified to allow for the new CountAsNeed() tag. General usage should be CountAsNeed(no), if the trait is *not* meant to be used/allowed as a trait that might otherwise satisfy a prerequisite for some other trait. CountAsNeed() is a flag-tag, which means that any value assigned results in the tag being read as True, which means the trait will NOT satisfy prereqs. By using a value of 'no' in all appropriate cases now, no further changes should be required in the future if we expland the use of the CountAsNeed() tag. Fixed reference in damage dice conversion code that resulted in more complicated damage breaks not working correctly. -------------------------------------------------------------------------------- B364 -------------------------------------------------------------------------------- Addressed issue with GCA attempting to update the non-existant QuickView when closing the last character. Adjusted when equipment items apply modifiers, so that they are correctly applied before the Qty of the items is taken into account, rather than after. Added @round() function, which works like so: @round(VALUE [, DECIMALPLACES]). VALUE may be any valid math expression or numeric value, and DECIMALPLACES specifies how many decimal places VALUE should be rounded off to. If DECIMALPLACES is omitted, an integer value is returned. Fixed bug in Select Items dialog where pressing Delete to remove a selected item removed it, but did not correctly update tracked selection values. Text field lengths in Template Builder expanded. -------------------------------------------------------------------------------- B363 -------------------------------------------------------------------------------- * Added missing error handling for portrait loading errors. * Double-clicking a data set in the Data Sets window will now choose that data set and close the window. * Fixed type issue with PlainText() function in print wrapper. * Trait description area at bottom of Select Items window is now available. * QuickView will no longer allow deleting of locked traits. In fact, GCA will no longer show the Delete or Edit buttons on the edit bar for a locked trait. * Fixed recently created issue that prevented fields and buttons from working in QuickView with built-in sheet on pages beyond the first. * Adjusted how the QuickView edit bars are created and displayed. * It is now possible to adjust the display of the edit bars a little bit. The sizes of the fields, and the order they appear, can now be changed by using the EditBarAdFormat, EditBarSkillFormat, and EditBarEquipmentFormat properties of the print wrapper for character sheets. Each property takes a string formatted in a particular way to tell GCA how to handle displaying that edit bar. You can use % values in the string, like so: EditBarAdFormat = "Points%12.4" EditBarSkillFormat = "Points%11.4" EditBarEquipmentFormat = "Weight%11.4" Fields are separated by pipe | characters, and the first character of a field is how the data should be aligned in the display area: < for left, > for right, ^ for centered. The next segment is the name of the data piece to display, as shown above; these are currently the only options for each type of format. The final section is a percent sign % followed by the percentage value to use for the size of that display area. In our example strings above, EditBarAdFormat assigns 78% of the space available to the Name section, and 12.4% to the Points section. Note that the UpDown button always takes up 255 twips, which means you'll need to allow a little slop room for it in the percentages. You can also use fixed width values in the string, like so: EditBarAdFormat = "barwidth=2|Points+0.25" EditBarSkillFormat = "barwidth=2|>Points+0.25|Space+.0625|Level+0.25|UpDown" EditBarEquipmentFormat = "barwidth=2|Weight+0.25" Notice that if you do this, you should first tell GCA the intended "default" width of the edit bar. The barwidth section is not a display field, just extra information. (If you don't use "barwidth=X", GCA will assume the default bar size of approximately 3.84 inches) The size values are given after a + instead of after a %, and they're in units per the scale mode used for the sheet. The examples are using inches, and assume 0.177 inches will be used for each UpDown button. GCA will let you use both % and + sizes in the same format, but you should be careful doing so, as GCA will allow you to make unusable edit bars. Note that you can specify a section of empty space using the Space segment, which inserts that much space between displayed fields. ----- Created GCAClearAppData.exe: Created the GCAClearAppData.exe program, which deletes INI files, FastLoad files, and other application specific, non-user created Application Data for GCA4. -------------------------------------------------------------------------------- B362 -------------------------------------------------------------------------------- It is now possible to change the default folders used by GCA to store user-created files. There is an option and a window added for this purpose in Options. The character portrait window will now better display the file name information if the path is a long one. GCA will now add together strictly numeric values for armor DR and DB. It will still not add together split values, or values tagged with any non-numeric characters, such as F or *. Fixed another issue in Simple Edit where typing into some Damage Based On boxes for modes would cause insanity. GCA will no longer include the path in the Most Recently Used files listing on the File menu. Custom QuickView sheets should now pick up page settings from Print Setup. Characters should now save/load the QuickView sheet they're using. Now using the FreeImage library (http://freeimage.sourceforge.net) instead of the prior image import library. Added FreeImage copyright info to About/Splash screen. -------------------------------------------------------------------------------- B361 -------------------------------------------------------------------------------- Fixed bug that would crash GCA when removing meta-traits or their component traits from the selected traits list in a template Selection window. Body parts "paper-doll" image moved into resource file where it belongs. Protection window updated to use resource version. Print Wrapper routines for body parts image updated to use resource file image instead of trying to load Protection window to get the image. Changing things in other dialogs (Protection, Portrait, etc.) in GCA should now be reflected in the QuickView immediately when the window is closed. (If the sheet being used supports that data, of course.) -------------------------------------------------------------------------------- B360 -------------------------------------------------------------------------------- Added a green background to %user% files in Data Sets window, Change Data Files window, and Options. Fixed display of Included Data Files for data sets so that shifting files up or down would retain the correct icon and background color. Fixed bug that would crash GCA when clicking Cancel when adding character templates. Fixed bug with List item handling. GCA should now ignore needs() items that are blank. For example, needs(AD:Magery 0, ) appears to have two needs items due to the comma, but the second is blank, and may be the result of a typo or a $function that returned an empty result. Improved handling of sub-category display/selection for QuickView trait buttons. Added a separate "rendering" printer object for QuickView when using custom sheets. The existing display sheet should now no longer "bounce" to page 1 and back when making changes on other pages. This adds some hard-drive use. GCA now uses FieldType = 4 for text fields for settable calculated tags, which currently means only "score" and "level". This should replace the previous use of a special case of FieldType = 0, which should be for edit bars only now (although support for these tags is still there for the time being). Some trait names (or extensions) are using quotes within the text. GCA was enclosing trait names that it added to the needs() lists of templates in quotes. Quotes do not nest well, which caused crashes. GCA will now enclose the items that it adds to the needs() for templates in braces instead of quotes. Needs() should now support using braces around trait names where it might have used quotes before. Solver should now have more complete support for braces used where quotes may also be used. -------------------------------------------------------------------------------- B359 -------------------------------------------------------------------------------- Fixed tooltips on QuickView trait window buttons. Fixed ability for QuickView Page buttons to work beyond page 3. Adjusted code to better sync QuickView toolbar and display of sheet. Added code to scroll a field into view, if it's not visible when it becomes active. Added recalc for traits that have had a tag edited on a custom QuickView sheet. Added support for "level" in addition to "score" as special field tags supported by FieldType = 0 on custom QuickView sheets. Added Public Sub CalcPicture(PictureName, PictureWidth, PictureHeight) to PrintWrapper. This will take the PictureName, which should be the same as the picture you will be sending to the Picture routine, and will return its Width and Height. View Info and the Description sections of trait tabs and dialogs will now show information for traits selected in the Character lists, also. Likewise, clicking an appropriate character trait in QuickView will now show info in the View Info window. -------------------------------------------------------------------------------- B358 -------------------------------------------------------------------------------- Added FieldType = 3 for edit fields in QuickView. FieldType = 3 is a multi-line edit field for longer, larger text fields, such as character notes or description. Fixed issue with tabbing to the next/previous field in multi-page sheets. Fixed bug in setting tag values for FieldType = 1 and FieldType = 3 in QuickView. Fixed DB application in Apply Armor part of Protection window (except for shields). Fixed the source of one very slow memory leak related to print/preview. There is another related to the picture import library, and therefore is effectively unfixable until I can replace that library. I have, however, added an error trap so it at least won't crash GCA; it'll just not print the picture, and will put a notice in the log. Implemented a picture cache to partially work around the image library memory leak issue. When the Print Wrapper's Picture routine is called, it will cache the picture being drawn, so if the picture remains the same between calls, the image library will not need to be called again, there-by putting off the memory leak indefinitely when using the same picture, and greatly prolonging the time between failures when using other pictures in routine use. If constantly changing pictures the cache's effect will be reduced. -------------------------------------------------------------------------------- B357 -------------------------------------------------------------------------------- Addressed issue with trait lists not correctly displaying some items if for some reason the capitalization of the categories in an item's cat() tag didn't match the capitalization of the category name in the cat combo drop-down. (GCA is supposed to ignore capitalization issues.) Adjusted the detemination of the minimum size of the edit bars in QuickView. PrintWrapper property InQuickView() added, which returns True if the sheet is being run in QuickView. As intended way back when GCA4 was originally released, I have finally enabled support for running custom character sheets as the generator of QuickView, rather than the built-in display sheet. This may not stay in. The downside is that it's slower and clunkier than the built-in, especially for pages other than the first. I'm thinking of an option, which is the way it's done with the built-in, and that's to have separate PageXMain routines for each page--although that requires setting up the sheets more rigidly. The Fields collection and Field object have been added to the available objects in the print/preview system. This is so that the same sheet may be used without errors in both print/preview and in QuickView. (They won't be used by GCA in print/preview however; they're added to avoid Object Doesn't Exist errors.) An example sheet is available at http://www.misersoft.com/gca/filespec/quickview_sample.gcs and you can search for "Field." to find the pertinent parts as they're currently supported. (Note that the Field object speaks in twips, not centimeters or inches, so you'll have to manually adjust your measurements.) View Info is now available as a panel inside the main GCA window, as an alternative to a separate external window. View Info text now uses RTF to allow for enhanced display. TagItem("fullnametl") will now return the trait's full name including the /TL, if any, as displayed in GCA. In Options, Current Character Options, the Current Character drop-down that lets you select from the currently loaded characters will now be set to the currently active character by default. Added support in Options for selecting QuickView character sheets. Removed support for the old #Changes..#End block format for file commands. Use the straight #Command versions instead. Created new versions of Data Sets window, Change Data Files window, and updated Options. All first draft work on support for Windows standard file locations has now been completed. The standard location for - included data files is "Program Files\GURPS Character Assistant 4\data files\" - user data files is "My Documents\GURPS Character Assistant 4\data files\" - INI files is "Documents and Settings\user_name\Application Data\Steve Jackson Games\GURPS Character Assistant 4\" - fast load files is "Documents and Settings\user_name\Application Data\Steve Jackson Games\GURPS Character Assistant 4\data sets\" - debug.run is "Documents and Settings\user_name\Application Data\Steve Jackson Games\GURPS Character Assistant 4\" - debug.log exported from logging window is "My Documents\GURPS Character Assistant 4\" - data sets is "My Documents\GURPS Character Assistant 4\data sets\" - characters is "My Documents\GURPS Character Assistant 4\characters\" - character sheets and export filters is "My Documents\GURPS Character Assistant 4\sheets\" -------------------------------------------------------------------------------- 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 (as if the item had no range assigned, basically, which is different than a range of 0). * Updated the Simple Edit window for Equipment to reflect the use of characc() and charreach() for the Acc and Reach fields. * Updated error handling a bit, so that errors trapped by GCA, but which cause the program to shut down, will have the error message echoed to the Logging window (which means it will also be in the debug.run file, which will make some things a bit easier to track down). * Fixed a crash when updating the new toolbar when zooming in/out with the mouse in QuickView. * Updated the Protection window to include a button to shift display between Body picture with All Body Parts listing, and the Body Protection/Active Defenses and Body picture. Button is to the left of the body picture. * Updated the Protection window so that changes made on the body outline will be reflected in the property listing. Changes are reflected immediately upon the user leaving the field. * Added some $functions. Right now, these are only handled within the Solver, which handles all the math stuff in GCA. What the $functions do is return text values, rather than the numeric values returned by the @functions. We may add special cases where $functions are evaluated for particular tags at particular times, but right now they're limited to within math-enabled areas, which is pretty limiting indeed, since the end result of a math-enabled area is always a number. $Functions are generally evaluated *before* the @functions, but any math enabled portion in $functions may include embedded @functions and other math features normally. The following $functions now exist: + $if() : $if(EXPRESSION then RESULT else ALTRESULT) this is exactly like the @if() function, except RESULT and ALTRESULT are regular text that is put into the place of the $if function, depending on the result of evaluating the EXPRESSION. If RESULT or ALTRESULT are enclosed in quotes, the quotes will be stripped off before replacing the function with the result. + $indexedvalue() : $indexedvalue(INDEX, VALUEITEM1, VALUEITEM2, ETC...) this is exactly like the @indexedvalue() function, except the VALUEITEM items are text, and may be enclosed in quotes. If the INDEX evaluates to 0, then an empty text value is returned. If INDEX evaluates to a higher index than there are VALUEITEMs, then the last VALUEITEM will be returned. If a VALUEITEM is enclosed in quotes, the quotes will be stripped off before replacing the function with the result. + $textindexedvalue() : $textindexedvalue( INDEXITEM, (ITEM1, ITEM1VALUE), (ITEM2, ITEM2VALUE), (ETC...) [, else ELSEVALUE] ) this is exactly like the @textindexedvalue function, except the ITEMxVALUE items are text, in addition to the ITEMx values being text. If INDEXITEM is not found among the ITEMx entries, an empty text value is returned, unless an else portion is included, in which case the ELSEVALUE is returned. If the return value is enclosed in quotes, they are stripped off before the return value replaces the function. + $solver() : $solver( EXPRESSION ) this function allows for actually solving a math expression using the Solver, which may be handy, especially if the text function is being processed outside of the normal math areas. Sometimes, you need to be sure that something will return a numeric result, even if it's going to be used in a text function. This allows for that. * There is also a special case substitution value that works much like a $function, but is not. It has existed for a while now, but was never documented. It is $textvalue(). $textvalue() returns the text value of an item or item tag, just as if it was expressed in a math area, but returns the value without math processing. Because $textvalue() is processed as a special case substitution, it is handled before nearly all other functions or values, and does not gracefully handle embedded functions or other types of special case values. Its uses are actually rather limited, since general function handling and math evaluation will be better suited to processing needed values. -------------------------------------------------------------------------------- B269 -------------------------------------------------------------------------------- New icons for items on the toolbars. Added a special case bonus item for giving a bonus to damage$: +nobase. If you have a gives like this: gives(+nobase to owner::damage$), then GCA will handle the '+nobase' as a special case, and eliminate the base damage for the item. This means all damage, if any, will have to come from bonuses. Without any bonuses, chardamage would be 0. Users now have the option of using larger toolbar buttons (24x24 pixel images), instead of the smaller (16x16) buttons. The larger size is now turned on by default. Replaced the QuickView specific toolbar with one using the new toolbar style. (Although only 16x16 is available for now.) ----- Iconic characters updated by Eric. -------------------------------------------------------------------------------- B268 -------------------------------------------------------------------------------- Debugging build for Eric. Some extra info in the error message for the RefreshBody routine, and turned off transparency for the body area info. -------------------------------------------------------------------------------- B267 -------------------------------------------------------------------------------- Rewrote a bunch of stuff in the Edit and Simple Edit windows to fix an issue with losing modifiers to modifiers when Cancel is used to close out the window. Characters can now have alternative character sheets for use with print/preview. They can be added and removed using Current Character Options in the Options window, and the selected sheets will appear on the drop-down lists available on the toolbar for the Print and Print Preview buttons. A default list of alternative character sheets can now be set using the Default Character Options tab in Options. Added a 'Save to Data File...' option to the top-right of the Edit Items window (Full Edit only, not the Simple Edit). That button will save all the items currently in the window to a data file that the user may select or create. The items are stripped of all tags that aren't appropriate to data in a data file (although there are probably tags I've missed). I consider this to be a temporary stop-gap measure since the trait-builders are taking so long. This does *not* in any way help with building templates, and it requires users to know how to do the more difficult stuff such as creating needs() or gives(). But at least if they've created it within GCA, they can now save it out to a data file to use again later. -------------------------------------------------------------------------------- B266 -------------------------------------------------------------------------------- Made adjustment to damage calculation to support spells with "~" starting the damage code. Range values should now be calculated for any trait with appropriate range tags, not just equipment. DR values should now be calculated for any trait with a dr() tag. As with other tags calculated from a starting tag value, the results are put into the charX() version of the tag--chardr() in this case. DB values should now be calculated for any trait with a db() or pd() tag. Note that GCA will allow for the pd() tag to be used as a synonym for db() in this case, and when granting bonuses to the DB of an item ('owner::pd' is the same to GCA as 'owner::db', for example), but it will only create the chardb() tag to contain the result. Acc values should now be calculated for any trait with an acc() tag. Results in the characc() tag. In the case of an acc() with format X+Y, acc bonus is applied only to X. Fixed an overflow issue that would crash GCA in some cases if a character had maximum Wealth and tried to change the value of the Money stat. The Logging window should now remember whether or not it was last open or closed when GCA starts up. Improved toolbar integration a bit more. -------------------------------------------------------------------------------- B265 -------------------------------------------------------------------------------- * Fixed a bug in handling of conversion of extra damage bonus to damage dice. (When using optional ConvertDice.) * Corrected resizing issue with Logging window. * Completely removed old toolbar, and improved integration of new one. * Moved the 'work bug' in the status/points bar to the left side, so it's always visible. * In a case of Armin working on the weekend to do something that entertains him, I've been playing around with the Protection window a bit, adding an outline of a body, and having the various protection values appear on or near the body areas. This set up is somewhat customizable already, and I've included a temporary property sheet next to the graphic image, to allow for changing around the body areas shown and values used. You can change whether you want to show an Arms value, for example, or show both LeftArm and RightArm, or whatever. All the body parts are currently built into GCA, but allowing for them to be fully customizable (with defaults from a data file) would be quite easy. This would actually allow for a campaign to use different body areas than the GURPS default (for example, using individual arms, legs, and eyes, rather than a combo set for each; or perhaps just using a single Body value for a more D&D style approach to armor). This would also allow for a user to create a Centaur, for example, and adjust body parts appropriately, such as having a Torso for the human torso, a HorseTorso for the horse torso, and using LeftForeLeg, RightForeLeg, LeftHindLeg, and RightHindLeg if desired. The Location Groups property for each body part includes the 'target' groups to which that body part belongs, so that when I work out how to apply armor to the character, these will determine which areas receive protection from the pieces of gear that use location(). No guarantee that I have these set correctly right now, because I just assigned what I expected, not necessarily what GURPS actually used. Because the window with this new stuff was too wide to fit an 800x600 display, I rearranged stuff as well. -------------------------------------------------------------------------------- B264 -------------------------------------------------------------------------------- Modified application of standard equipment cost modifiers, so that any such modifiers to cost are applied before any child items are taken into consideration. (These would be the standard types of modifiers, such as those applied to advantages or whatever, where the cost of the modifier is applied to the item. This change has nothing to do with modifiers applied using the gives tag.) Modified application of standard point modifiers for ad-type items, so that any such modifiers to points are applied before any child items are taken into consideration. Created the new static multiplier bonus type, so a bonus can now begin "=*" to apply a fixed, non-level-adjusted multiplicative bonus to something. Made a change to the TrickleThru routine to simplify it slightly by making use of some routines that weren't written at the time TrickleThru was written. (This resulted in a miniscule speed increase as well.) Made a change to the TrickleThru routine to cache a couple values in the checking of certain sub-items, which resulted in another miniscule speed increase. Implementing a new control for handling the toolbar and status bar. -------------------------------------------------------------------------------- B263 -------------------------------------------------------------------------------- * Added a new math function to the Solver: @textindexedvalue(). The template is like this: @textindexedvalue( <indexitem>, (<item1>, <item1value>), (<item2>, <item2value>) [, (<etc...>) ] [, ELSE <value>] ) Basically, it consists of a text item used as an index, followed by any number of (Item, Value) pairs, enclosed in parens as shown. GCA will look at the index item, and do a text comparison (ignoring case) between it and the text item that makes up the first item in each result pair. When it finds a match, it returns the value of that pair, as indicated in the value portion of the pair. So, if you have this example: @textindexedvalue( "b", ("a", 1), ("b", 2), ("c", 3) ) The Solver would return a value of 2 for the function. (Quotes around the text items aren't required, but don't hurt, and are encouraged when using literal text.) A 0 is returned if no matches are found, unless the last value in the list is an ELSE entry, in which case the value following ELSE is used as the return value for any non-matches. For example: @textindexedvalue( "d", ("a", 1), ("b", 2), ("c", 3), ELSE 10 ) In this example, the Solver would return a value of 10, because of the ELSE entry. * Created a special case substitution value/function for use inside of damage calcs. This function is $modetag(), which will return the text value of a tag name included inside the parens, as it applies to the current weapon mode being calculated. For example, a weapon with two modes, one doing 1d cut and one doing 1d-1 imp, would return cut for $modetag(damtype) in mode 1, and imp for $modetag(damtype) in mode 2. An example of how this works is something like this: gives(=+@textindexedvalue( $modetag(damtype), ("cut", 1), ("imp", 1) ) to owner::damage$) which gives a bonus to damage *only* when the damage type is cut or imp. (It does result in the whole ugly formula going into the bonuslist(), which I don't like at all, but see no way around at the moment.) * GCA should now correctly save and load extra information required to apply bonuses correctly to target tags. * Added support for applying bonuses to 'childrencosts' tag of items. These bonuses are applied to the total cost of all children, before inclusion in the total cost of the item. * Added support for applying bonuses to 'childpoints' tag of traits. These bonuses are applied to the total points of all children (NOT components), before inclusion in the total points of the item. * Added support for applying bonuses to 'basecost' and 'cost' tags of items. Basecost bonuses are applied to the item itself, before any possible child items are included. Cost bonuses are applied to the total item cost, including children. * Made some changes to the way text is generated for the BonusList tag, to make use of some routines written later, which simplifies the routines applying the bonuses. * Added a new section to a gives() bonus declaration: ListAs. ListAs allows the writer of the bonus to specify exactly what text will appear in the BonusList() when this bonus is being applied. The ListAs keyword must have a space on each side, and the text for the ListAs section must appear in quotes following the ListAs keyword. ListAs must be the last part of the bonus declaration. Example: gives(+1 to Spells upto 4 listas "+%value% to 'Eerie Stuff' from '%name%'") or (what prompted this): gives(=+@textindexedvalue( $modetag(damtype), ("cut", 1), ("imp", 1) ) to owner::damage$ listas "+1 to cut and impale damage from Fine workmanship") There are several special case substitution variables available for use in a ListAs section, they are %value% for the current value of the bonus; %stringvalue% for the string value of the bonus; %name% for the name of the trait granting the bonus, and maybe more as necessary. -------------------------------------------------------------------------------- B262 -------------------------------------------------------------------------------- Added support for applying bonuses to 'baseweight' and 'weight' tags of items. Baseweight bonuses are applied to the item itself, before any possible child items are included. Weight bonuses are applied to the total item weight, including children. Added support for applying bonuses to 'childrenweights' tag of items. These bonuses are applied to the total weight of all children, before inclusion in the total weight of the item. Added support for applying bonuses to 'rangehalfdam' and 'rangemax' tags of items. Note that GCA does not always calculate ranges for items, so these bonuses may not always be applied. I have made an adjustment to the range calculation routine, however, so that if there is some bonus, and GCA can determine a non-zero numerical value for the range being looked at, GCA will go ahead and try to calculate the new range with bonus. (Previously, GCA only calculated ranges if ST was involved, or if there was a tag reference involved.) The Me object should now be a valid base target for bonuses to tags (such as "-1 to me::weight"). This allows for items to apply bonuses to their own tags without the need for modifiers, which may be helpful when creating custom magic items or whatever. -------------------------------------------------------------------------------- B261 -------------------------------------------------------------------------------- I have begun the process of allowing bonuses to be applied to other parts of traits. These bonuses can only be applied to tags that GCA will be calculating anyway, since obviously if GCA doesn't calculate it, GCA doesn't touch it. At present, the only such tag that is working is "damage" or "chardamage", both of which would be applied to the damage calculated for the character using that particular trait or equipment item. Applying the bonus is done in the usual fashion, by appending "::<tagname>" to the target of the bonus, such as "+1 to EQ:Broadsword::damage" to apply a one point bonus to damage done with the Broadsword equipment item. To apply dice of damage, you need to append a $ sign to the end of the tag, as that tells GCA that you're dealing with strings (text blocks) in the bonus, and it shouldn't calculate the bonus to get a value (that would lose the 'd' part of a die bonus during calculation). So, to add a +1d bonus to a Broadsword, you'd use "+1d to EQ:Broadsword::damage$", and GCA would append the "+1d" part to the damage string before sending it to the routine that calculates the final character damage. This will result in the correct damage being determined. It's important to remember that little $ sign when you want to add dice. To go along with the above change, the 'Owner' object should now be a valid target for bonuses from Modifiers, but currently only for modifiers applied to traits & equipment (not modifiers applied to other modifiers). So, for example, you could have a modifer that applied a +1d damage bonus to the item it was applied to, by using this gives() with the modifier: gives(+1d to owner::damage$). There was a bug in the routine that set an existing item to a needed value, such as used when auto-changing levels for needs(), or when adding items at some level with adds(). This bug was basically GCA building a "name (extension)" string without enclosing it in quotes before sending it to the Solver. This resulted in the name and extension being solved separately, and the two values stuck back together. This was done when checking the current level of the item which was being requested to be set to some other level, and as a result, might have a completely wacky level appear to be associated with it. I rewrote the routine to remove the building of the string, and that call to the Solver, and instead it checks directly for the value of the item (or the value of the specified tag, such as when needing a point value). Corrected FootnoteSymbol output for numeric footnotes to trim off leading space. ----- Added to the Print Wrapper: CalcText property (write only): calculates the rectangle on the page that is taken up by the provided text string. Useful for finding the height and width of a block of text. Calced from CurrentX and CurrentY, and the width and height are returned in TextWid and TextHei. -------------------------------------------------------------------------------- B260 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed a bug that crashed GCA when the character's saved character sheet file path was invalid. This only happened when trying to open the Preferences window. Removed the View > Trait Bar menu option, and put a Show/Hide Traits Bar button on the Quick View toolbar instead. This button is between the zoom buttons and the page buttons. Added ability to tab between the standard text fields on the Quick View, once you've clicked on one of them. (You still can't tab between traits that use edit bars.) ----- Added to the Print Wrapper: AddFootnote(NewText) function: adds a footnote item to the footnotes collection; returns the symbol for the footnote (if the footnote is unique, it gets a new symbol; if the footnote is the same as an existing one, it gets the existing symbol). ClearFootnotes: clears existing collection of footnotes. Footnote property: pass in an index, returns/sets the footnote for that index. (Normally footnotes would be added by AddFootnote rather than setting the value here, and this would be used just to read a particular footnote.) FootnoteCount property (read only): returns the number of footnote items. FootnoteStyle property: returns/sets the style to use for footnotes--0 (default) is SJGames standard (*, †, ‡, §), 1 is numbers corresponding to the index of the footnote. (Not all fonts support the characters specified in the SJGames style.) FootnoteSymbol(index) function: returns the symbol corresponding to the number of the footnote, as specified by index (depends on FootnoteStyle). -------------------------------------------------------------------------------- B259 -------------------------------------------------------------------------------- Added trap for missing character sheet info to sheet printing routine. Trait Bar in QuickView adjusted to allow for double-clicking to expand/collapse the section heads. Trait Bar will now honor the Enter key to do the same thing as double-clicking. Added menu item to View menu to show/hide Trait Bar on QuickView. Trait Bar adjusted to include appropriate icons and honor displaycost(). Altered the code that creates a bonus from a gives() string to support the target name in quotes. This also required changing the code that looked for the gives() keywords "to", "when", and "upto", to not look inside quoted strings. Updated a couple of the controls used in GCA. -------------------------------------------------------------------------------- B258 -------------------------------------------------------------------------------- Adjusted a number of windows to remove the frame-as-header stuff. Some were replaced, some had the frame extended to include the related items. QuickView window modified a bit. The space between the Trait Bar and the character sheet can now act as a splitter to adjust the relative sizes of the two areas. ----- Added to the Print Wrapper: BrushStyle property: sets the fill brush: 0 = solid, 1 = Transparent, 2 = Horizontal lines, 3 = Vertical lines, 4 = Diagonal lines up, 5 = Diagonal lines down, 6 = Crossed vert & horiz lines, 7 = Crossed diagonal lines ColumnSpacing property: sets/returns space between columns set with Columns CurrentColumn property: sets/returns current column (as set with Columns) ExportRaw property (write only): inserts "unprocessed" text directly into the export stream. PenStyle property: sets/returns the draw pen: 0 = solid, 1 = dashed, 2 = dotted, 3 = dash-dot, 4 = dash-dot-dot, 5 = transparent, 6 = solid line drawn inside shapes. (Note that non-solid settings only work when PenWidth is 0, which is one pixel wide.) PenWidth property: sets/returns the width of the draw pen (used pretty much any time lines are drawn). -------------------------------------------------------------------------------- B257 -------------------------------------------------------------------------------- Fixed a bug that crashed GCA when certain special circumstances resulted in a removed item triggering a recalc of an item that used to default from it, and the recalced item was the first item in the traits listings. This erroneously made GCA operate as if the recalcing item was somehow defaulting from itself, which would confuse GCA. Fixed a bug in duplicating equipment items. Addressed an issue to allow for more complete recalculating of all modifiers for items being recalculated (only affected modifiers using formulas). Added a LineSpacing property to the print wrapper. Added a PlainText(RTFText As String) function to the print wrapper (for getting the plain ASCII text from an RTF text string.) Added IndentFirst, IndentLeft, IndentRight, and IndentTab properties to the print wrapper. Made a change to the way duplicating parents in parent/child relationships works. If a parent is duplicated, all of its children are duplicated as well. Added some caching of lists of item types. Not implemented for most areas yet, but this should eventually improve display performance of system lists when changing category drop-downs or opening windows. -------------------------------------------------------------------------------- B256 -------------------------------------------------------------------------------- Fixed an issue with character names being used for file names. < and > are now replaced with [ and ]. Fixed an issue where #downto in SelectX wasn't correctly reflected in the actual points spent on a skill in the SelectX window. Added support for a downto() tag for skills. Adjusted how GCA reads saved character files. This should allow for CR/LF breaks entered into descriptions of traits to no longer cause GCA to crash when trying to read the file. The CR/LF breaks are preserved in the file and when loaded. This change affects Attributes, Advantages, Perks, Disadvantages, Quirks, Skills, Spells, Equipment, and Templates. -------------------------------------------------------------------------------- B255 -------------------------------------------------------------------------------- Added a Traits Bar to the left side of the Quick View window. -------------------------------------------------------------------------------- B254 -------------------------------------------------------------------------------- Fixed a bug in the routine that assembles the valid default list from the 'prereq' keyword, which resulted in only the last 'prereq' item being available for use as a default. Fixed a bug in the routine that assembles the valid default list from the 'prereq' keyword, which resulted in any item in quotes in the needs() being double quoted after assembly. This is because default() is math enabled through the whole tag, unlike needs(), so it automatically encloses all the item names in quotes when building the string from prereq. Unfortunately, it neglected to check if the item was already in quotes. Changed the default() handling a bit. What is 'defaulted from' is determined by the first item found in a default block, so if the default is "SK:Alpha - 2 + SK:Bravo - 4", SK:Alpha is the item that will appear as 'defaulted from'. I have fully math enable everything except that first item. This means that math functions and such may now appear outside of that first item slot. Added support to default() handling for the 'lowprereq' keyword, which will result in the lowest prereq option being used for the default. Removed the right-click menu from the Character list in the Select Items window. It was never supposed to be available there. Added the ReturnItemCollectionKeys(ItemType As Integer) As Variant() function to the print wrapper, which is the same as ReturnItemIndexes(ItemType As Integer) As Variant(), but returns the collection keys for the items of type ItemType. Removed a previous fix for some international issues in the print wrapper AddTable code. It messes things up all kinds of ways when using specified decimal values in the format strings. It seems that we'll have to specify only decimal values, otherwise things just won't cross regional settings correctly. Fixed a bug related to regional issues in ReturnFontSize(). The routine was ajdusted to return the correct value when decimal character is a comma (because the value returned from the Font type is using a period). Started a "doodle" of a form for a trait builder. ----- Added Eric's GCS.ICO icon file to those included with the program. -------------------------------------------------------------------------------- B253 -------------------------------------------------------------------------------- Fixed an issue that had control info from #codes carried over to all following items in the SelectX() statement that didn't have their own #codes block. Fixed a bug in TXT export that would crash GCA if a bug in the export sheet prevented completion of the export sheet. Fixed the "Exporting to " text in the Log to be correct in all cases. Added a Custom option to the Export window. This exports using the TXT option, but allows for a user specified extension to be used instead of .TXT. Added the ability to specify the desired extension for the Custom option in the name of the export filter, by enclosing it in braces. For example, if the file name is "export filter {ASC}.gce" then the extension box will automatically be filled in with "ASC" when this file is chosen to export with. Addressed an issue in the scaling of values in the AddTable routine, which was apparently being affected by international settings issues. Added caching of the scale-factor-adjusted Format string for AddTable, which should speed it up a good bit. Added an error trap to options code, for cases where a value is being requested for an option that doesn't exist. -------------------------------------------------------------------------------- B252 - RELEASE VERSION -------------------------------------------------------------------------------- Fixed an issue with re-loading of auto-backup characters after a crash. This was supposed to be fixed before, but apparently when disabling some debugging code after fixing it, I also inadvertantly disabled a necessary counter, which again disabled the loading of any characters after the first. -------------------------------------------------------------------------------- B251 -------------------------------------------------------------------------------- Fixed a bug in the TrickleThru routine that prevented some items from being recalculated correctly. This was a limited exposure bug, and would only have had an impact when different types of traits with the same name were giving bonuses one way or the other, or one was based on the other. Items based on one or the other, or affected by bonuses from one or the other, may have been affected as well, depending on their order. Fixed direct entry of Qty on Equipment window/dialog. -------------------------------------------------------------------------------- B250 -------------------------------------------------------------------------------- Fixed a bug that prevented the Quick View window from being properly disabled when an error was caught. Added code to allow a user to disable Quick View for a session when an error is caught for which a specific handler is not in place. Fixed a bug in the startup of Quick View that was previously masked when the setup code was improperly included in the Refresh routine. -------------------------------------------------------------------------------- B249 -------------------------------------------------------------------------------- Moved Quick View setup procedures out of the refresh routine, where they absolutely did not belong. Changed initializing of new characters a little bit. Reversed the order of Character Sheet Options... and Options... on the Tools menu. Added options to Default Character Options for Base Starting Points, Disadvantage Limit, and Quirk Limit, as found on the Campaign Settings window. Added the ability to directly enter points for skills and spells on the Simple Edit window. Updated what things appear on the Simple Edit window a little bit. Fixed some bugs in the Full Edit window that would crash GCA if the value in some fields was removed, rather than replaced. -------------------------------------------------------------------------------- B248 -------------------------------------------------------------------------------- * I found that the export routines would choke on long blocks of RTF text, as used in Notes or Description, even though it worked fine with Print/Preview. I therefore created a system to break the blocks down into smaller chunks. I added the following routines to deal with that: Public Sub RTFBlockProcess(RTFTextBlock As String) Public Property Get RTFHeader() As String Public Property Get RTFBlockCount() As Long Public Property Get RTFBlock(ByVal index As Variant) As String Then I found that the test case I was using wouldn't choke on export any more, even without the new code. Weird. Anyway, I left the new method in the Export Filter.GCS, as it seemed safer. * Fixed a newly introduced issue in adds() that had GCA improperly adding previous assignment values to newly added items that didn't specify an assignment, when creating the needs() entries for those items. -------------------------------------------------------------------------------- B247 -------------------------------------------------------------------------------- * NoAutoRecalc option added (in Options > Operations). This will turn off the auto-recalc, which will allow for faster entry of desired values for many traits, but will, of course, not automatically update other traits with those changes. In addition, making certain types of changes will still trigger a *limited* auto-recalc, so some values may appear blatantly incorrect afterwards--this is because some types of values may be affected by other things that were not recalculated. Display refreshes in many places may not happen correctly with this option on. If you're trying to adjust a value, and the changes you think you're making aren't appearing on the window, please let me know what you were adjusting, and how you were attempting to adjust it. * Updated various routines to add refreshes of the display, since refreshes aren't always triggered correctly with NoAutoRecalc turned On. * Added general character calculations to Recalculate Everything, since they were previously overlooked. * Corrected Select Items window to respect displaycost() if present. * Made a minor adjustment to the new chardamage calc routine, and now all test cases work without changes to their existing tags. However, any damage() tag that doesn't seem to resolve to include some number of dice may not work correctly, as it will instead keep the damage() tag for chardamage(). * Changed the Campaign Settings window. * Changed the default Disadavantage Limit to -75. -------------------------------------------------------------------------------- B246 -------------------------------------------------------------------------------- A lot of work on various places in the skill/spell calculation engine. This is in an effort to support negative levels for Ritual Magic. **** Please pay careful attention to skills/spells, as this may have totally frelled up the system. **** Upto() does not work correctly at negative levels, because the system was designed to be ignored unless upto() was greater than zero. Added support for a new option on Skill Type definitions. Adding "subzero(yes)" to a definition will allow that type to have negative levels. Currently, I think this will only work with Technique types (those with "defaultstat(%default)" settings), but I haven't finished work on everything yet. Changed the routine that finds the best default level to initialize with a large negative number, so that possible negative default values will be correctly found, rather than 0 being the result. Fixed the problem preventing a technique from defaulting from a skill that is defaulted and has no points invested in it. Updated weapon damage calculation to use new routine. Adjusted recalc engine slightly, so that changes to base damage values should better result in a recalc of items that have damage depending on them. SelectX() should now honor owns(). The Responding block in adds() will now use the keyword " respond " instead of " responding ". I've just decided I like it better. Adjusted routine that sets items to desired values to honor the '==' "must be equal to" operator. Previously, in the interests of not adjusting items to a lower value if it would be required to honor that setting, it only worked if the requested value was higher than the existing value. That's no longer the case, and it should allow for setting an adds() item to 0 if desired. In English: To force an adds() item to add the item at the specified level, even if that level is zero, use == instead of = for the assignment of the value. Adjusted adds() handling to correctly pass through to the level setting routine the '==' operator, if used, instead of assuming '=' (which is basically '>=' to GCA). Changed order processing, so that creates() is handled before adds(), and adds() is handled before SelectX(). Referring to sheet options by name for getting/setting values now ignores case. Added these routines to the Print Wrapper: Public Function FontStyleNew(StyleName As Variant, NewFontData As Variant) As Integer Public Sub FontStyleSetData(index As Variant, NewFontData As Variant) Public Property Get FontStyleBold(index As Variant) As Integer Public Property Let FontStyleBold(index As Variant, ByVal vNewValue As Integer) Public Property Get FontStyleItalic(index As Variant) As Integer Public Property Let FontStyleItalic(index As Variant, ByVal vNewValue As Integer) Public Property Get FontStyleName(index As Variant) As String Public Property Let FontStyleName(index As Variant, ByVal vNewValue As String) Public Property Get FontStyleSize(index As Variant) As Integer Public Property Let FontStyleSize(index As Variant, ByVal vNewValue As Integer) Public Sub SetFontStyle(index As Variant) Public Function ReturnLargerFontStyleHeight(SampleText As String, FontStyleList As String) As Single ----- Changes to Installers: Update installers should try and find an existing installation. If not found, they'll still let the user browse for them. When browsing for the installation folder, it will no longer append existing desired path info to the current folder. That was more annoying than helpful. -------------------------------------------------------------------------------- B245 -------------------------------------------------------------------------------- Added a ReturnItemIndexes(ItemType) function to the Char object. This returns a variant array containing the indexes to the Items collection for all the items of the type specified. This is intended for use with character sheets, to help reduce the amount of cycling through the entire Items list. Fixed issues with Campaign Log not refreshing point totals properly. Fixed bug in Campaign Log that prevented points from being updated when a log entry was deleted. Fixed an issue that prevented the Quick View from being updated correctly when campaign TL was changed. Added code to preserve a minimum amount of space for Perks, Disads, Quirks on the Quick View, so that no matter how many items of any section there are, there will at least always be a button for each section. Added some taboo checking to some needs checking areas, just for additional coverage. Added newmode() support to ad-types, skills, and stats being loaded from the data file. Added improved support for recalcing things that make use of "owner::". Fixed the color option in Character Sheet Options to correctly display the currently chosen color when opening the color dialog. Fixed a bug that prevented the use of TECAT: or PACAT: in needs() to refer to cats for Templates/Packages. As a refresher, the following category prefix tags may be used: SAMECAT: refers to an item from the specified category, of the same type as the item being needs checked. CA:, ADCAT: refers to an item from the specified category, for advantages. DICAT:, DISADCAT: refers to an item from the specified category, for disadvantages. CL:, SKCAT:, SKILLCAT: refers to an item from the specified category, for skills. CO:, SPCAT:, SPELLCAT: refers to an item from the specified category, for spells. EQCAT:, EQUIPCAT: refers to an item from the specified category, for equipment. TECAT:, PACAT: refers to an item from the specified category, for templates/packages. -------------------------------------------------------------------------------- B244 -------------------------------------------------------------------------------- Users can now correctly toggle the Show Hidden and Show Components modes for the various trait lists from the trait dialogs (off of QuickView). Users can now Make/Unmake Parents and Children from the trait dialogs (off of QuickView). Components can now be correctly Disabled or Re-Enabled from the trait dialogs (off of QuickView). Items that are owned by another item can no longer be made into children. Lists should be more correctly updated when unmaking children. Updated the selection list dialog for Make Children so that clicking OK with nothing selected is the same as clicking Cancel. GCA will no longer unnecessarily redraw the Available list in the trait windows when making Children. GCA will now try to keep your place in the list, roughly, when making child items. This is not easy, because the children could be added anywhere, which can really change the order of things in the list. -------------------------------------------------------------------------------- B243 -------------------------------------------------------------------------------- Adjusted the Load-Out Manager to not include child items. (This is because child items are included in the parent items cost and weight. Including them here would effectively mean including them twice.) Prevented the listing of parent items in the Make Child dialog that would result in the adding of an item as a child to itself, or to an item that was a child of itself. Resyncing equipment should now preserve quantity of the items, as well as load-outs. Resyncing items that are, or have, components should preserve more of the component related tags. Updated the installer to include Eric's versions of the Iconic characters. Added code to the Change Folder dialog to catch attempts to switch to an unavailable drive. Updated my checklist control to support multiple columns, and to allow for sorting the columns. Made 'level' a user editable value in the Full Edit Window for Advantages, Disadvantages, Skills, and Spells. Added a text entry box to Simple Edit to allow for directly entering the desired level of Advantages, Disadvantages, Skills, and Spells. Added a value in parens in the point bar after the Disads point total. This is the value of negative points being weighed against the campaign disad limit, which includes disads, quirks, lowered attribute scores, etc. Unfortunately, GURPS 4th has made simple point accounting a pain, so this value is necessary. (Lowered stats, for example, are included in the Stats total, but those negative points still count against the campaign disad limit, so you can't just look at the Disad total to see how you stand, anymore.) Limited most text entry boxes to some number of characters, usually 100. Users can now directly enter points spent into the lists for Skills and Spells. (Currently this goes directly into basepoints(). I may want to change that, so that it instead backfills basepoints() from the value entered, taking into account any bonus points that may be applied from somewhere.) Fixed a bug in the Show Components display when both children and components existed for the same item. Fixed a bug that crashed GCA when a package was added by an item, and no desired level or points was specified. That is, adds(PA:Package) would crash, but adds(PA:Package>=0) would not. Now, neither should crash. -------------------------------------------------------------------------------- B242 -------------------------------------------------------------------------------- * Added a system to handle auto-responses to the various InputX directives, for use with adds(). This should allow users to use adds() to add things that use those InputX directives, and provide automated responses to them so that users won't ever see the input dialogs. The format is something like this: adds(AD:Advantage = 2 with "mods" responding "Auto-Response") The format should be familiar, with just the addition of the responding block. Order is important, the responding block must come after the with block, if there is one. For the time being, " input " may be used instead of " responding ". I'm still not sure, but I like that " input " is shorter ;-). * Changed the construction of the needs() in the adds() routine, so that if something was added, the needs will be based on the name of the added item, rather than what was specified in the adds(). This should allow for items that get changed, such as Languages, to accurately be reflected in the needs(). * The above two changes together will work something like this. Using this simple example template: Adds Language, points(0), adds(AD:Language = 2 with "Native, -6" input "English") GCA will add Language to the character, and when Language looks for the InputToTagReplace() response, it will see the auto-response of "English" and use that. English will be added to the character with the Native mod. When building the needs() for the template, it will use "AD:English=2" instead of "AD:Language=2". * Changed a couple places in the AddSpecifiedItems routine to call the AddItemFromSystem routine using NoBuild as passed in, rather than with the fixed setting of True. In English, this means that the initmods() should now be used when a trait is auto-added to the character by the needs() checking. This change may have unexpected results, such as previously suppressed dialogs popping up to annoy the user. (Note that I haven't tested this fix.) * Fixed bug in Equipment calculation, that prevented child items from being included properly in cost and weight of parent. * Added some additional error trapping & tracking code to the Print/Preview system. -------------------------------------------------------------------------------- B241 -------------------------------------------------------------------------------- Added code to the Description/Notes window to completely clear the character's notes or description tags if the user has deleted all the actual text from that tab of the editor. Previously, RTF formatting information would make it appear as if there was data for a section, even if the user deleted all text. Note that this change will only affect a character that views the appropriate section with this new build. File > Print... option will now call up a Print dialog before the job is sent to the printer. This allows for changing printers, or Canceling, before wasting paper. (Note that due to rendering differences, changing printers often means you should Cancel, then use Print Setup... to change printers, so that the document will be re-rendered for the new printer when you next select Print...) Corrected some minor issues in loading items, where it wasn't properly supporting braces as containers. Ensured that items being loaded could have their names in quotes or braces, to allow the use of commas within the name of the item in the data file. (Otherwise, it would assume the next section of the data had started.) Quotes were already correctly supported, but the issue with braces prevented use of braces from working correctly. Added taboo variants for the various flags used for items in the Character lists. Changed the icons on the Portrait and Preview windows. GCA will now remember settings for Show Components. Show Components is now used to display parent/child items as well. Added the means to unmake parents and children. Fixed a bug that resulted in a child item disappearing if it was re-made a child of it's existing parent. Fixed a bug that allowed a child item to be made a child of another parent, and seemingly existing under both parents--at least until GCA tried to recalculate and got hung up. Fixed a bug in the display of child and component items. -------------------------------------------------------------------------------- B240 -------------------------------------------------------------------------------- * Added a spacer/header type for use with Sheet Options. Not really an option, just included for making the options listings prettier and more readable, and allowing for some grouping. * Added support for the optFont type for use with Sheet Options. This is the most odd of the various options, because it returns a value that is a composite, made up of the font name, it's size, bold flag, and italic flag, which might look something like this: "Bahamas|9.75|False|False" * Added some functions to the print wrapper to work with the font info format returned by the Font option. These functions are: Public Function ReturnFontBold(ByVal GCAFontItem As String) As Integer Public Function ReturnFontItalic(ByVal GCAFontItem As String) As Integer Public Function ReturnFontName(ByVal GCAFontItem As String) As String Public Function ReturnFontSize(ByVal GCAFontItem As String) As Integer where GCAFontItem is a string of the format referenced above, like this: "Bahamas|9.75|False|False" Note that the font size may be decimal, as shown here, because things aren't actually perfectly sized. The ReturnFontSize function will actually return the rounded off font size, so the example will result in a font size of 10. * Added support for the optColor type of option for use with Sheet Options. * Added code to respond to resizing of Sheet Options window. -------------------------------------------------------------------------------- B239 -------------------------------------------------------------------------------- Fixed an issue that would crash GCA if the edit box for the character's name was still in focus when changing to another area of GCA. Fixed a bug that allowed ad type traits to be set to 0, even if that option was not enabled. Fixed a bug in the Load-Out Manager related to regional settings for decimal places. Turned off exposure of character members in print/preview scripts. This basically just means that they must be referred to with the "char.member" construction, as I'd intended, rather than allowing for the "member" to be referenced alone. Resync now works on individual sections of the character, which the user can select. Added Save All and Close All to the File menu. Started code to restore parent/child relationships between items. This will allow child items to be "stored" inside of parent items. (You currently can create a parent item, then assign children to it, using the right-click menu. However, there's not currently any way to display the children, so they'll simply vanish from the lists.) Added functionality for the optText type in Sheet Options. -------------------------------------------------------------------------------- B238 -------------------------------------------------------------------------------- Changed shutdown procedure a bit, so that if GCA is being shut down by Windows (when you shut Windows down), it will ask you to save currently loaded characters. Fixed the crash-backup to save all characters currently loaded, rather than just the current character. Added code to the trait windows to try getting the list out of edit mode (if it was in edit mode for skills, spells, etc.) when the spin button is clicked. This should help to prevent the list from staying in edit mode, and therefore resetting the current item to the value in the edit box when focus correctly shifts to another part of the program. (There appears to be a bug in the spin button that doesn't allow it to correctly get the focus when it should.) Added additional bug catching assistance code to many routines. Fixed an issue related to undefined (or missing) skill types, which could result in a crash. Moved the CTRL+P shortcut to the Print option where it belongs. Made changes to allow Print Setup to correctly affect Print/Preview. (Note that most character sheets will require paper close to Letter size in width, at least (A4 should usually work), and in Portrait orientation.) Added code to support user editable options for character sheets. (Only TrueFalse and YesNo options currently allow for user setting on the Tools > Character Sheet Options page. All others should simply use the default setting.) Options set by the user are set in sheetoptions.ini. ---------- B237 - RELEASE VERSION ---------- Addressed an issue regarding the PE: prefix tag not being recognized. Changed the Export Filter extension to .GCE. It's too confusing to many people to have .GCS sheets and export enabled sheets both use the same extension, so I changed that to reduce annoyances to all involved. Adjusted the display of character sheets in Options to allow for using a .GCE export sheet as a character sheet. Added window size/position memory to the Print Preview window. Added memory for zoom factor/mode to the Print Preview window. ---------- B236 ---------- Fixed an issue that allowed the user to try setting a character sheet for a current character, even if no characters were currently loaded. Fixed default display of character spells to allow for /TL display. Spells of a technique type (it has defaultstat(%default)) should now be added at 0 points. Addressed some issues that prevented Spells from defaulting from other Spells. Added code to allow spells that are defaulting to be decremented to 0 points. ---------- B235 ---------- Fixed a bug that would crash GCA if trying to do certain functions (such as Print Preview) after loading an additional character. Finished XML output for Bonuses, Conditionals, BasicDamageList, DamageBreaks, SkillTypes, and ChangeLog. Added page info to the description area at the bottom of the trait windows. Added Marzo to the production artists credit. Addressed an issue in Quick View that resulted in distorted presentation of trait listings. ---------- B234 ---------- Credits Window (from Help menu). And I forgot to mention that as of b233, the Magic 4e.GDF is included in the installer. ---------- B233 ---------- Changed Save processing so it won't crash GCA if no charcter is loaded. In Splash screen, when mouse pointer moves over links (blue text) it should now change into a pointing hand pointer, which should help show that they are links. Added Credits window. (Not finished yet.) In the trait windows, Skills and Spells may now have Level edited directly, and Equipment may now have Qty edited directly (as the Score could be in Attributes). In the Quick View window, Skills and Spells may now have level edited directly in the Edit Bar, and Equipment may now have Qty edited directly in the Edit bar.