Skip to content

Releases: Jamiras/RATools

v1.14.1

19 Jun 16:08
Compare
Choose a tag to compare
  • no longer generate leaderboard values with operator in final measured clause
  • fix exception typing a memory accessor before a clause surrounded in parentheses
  • fix dumping script containing AddSource and SubSource in multiple clauses of same achievement
  • fix migration of constants in measured statement using percent format

v1.14.0

31 May 13:16
Compare
Choose a tag to compare
  • support for multiline comments via /* */
  • add #MinimumVersion header meta-comment to specify some minimum target version for optional features
  • serialize addresses as 16-bit if script does not reference any addresses over 0xFFFF
  • support to translate prev(A == B) into prev(A) == prev(B)
  • support invoking functions stored in dictionaries without intermediate variables
  • support indexing function returns without intermediate variables
  • show output path as tooltip on local achievement count
  • allow character chords containing Ctrl (i.e. Ctrl+Alt+4 for left curly brace on French keyboards)
  • report error ORing hitcounts inside tally (instead of commas)
  • better error when summing expressions that cannot be converted to requirements
  • fix modification of nested dictionaries
  • fix arithmetic and bitwise modifications being combined incorrectly
  • fix constant modifier at end of AddSource chain becoming always_true()/always_false() when viewing logic
  • fix always_true() clause being removed from end of AddSource chain
  • fix IDs not being generated when using the CLI tool
  • fix modified comparisons being considered equal if they're equivalent without the modification
  • fix modified comparison losing modification when used inside tally()
  • fix error specifying anonymous function as default parameter
  • fix extra tally when dumping script containing AddHits chain inside Measured
  • fix address not updating when shrinking big endian sizes
  • fix exception processing repeated(N, always_true() && never(X))
  • fix exception doing a search and replace of some string to empty string
  • fix exception when cross-multipling conditions results in an always_true()
  • fix exception when predicate doesn't return a value

v1.13.0

04 Mar 17:17
Compare
Choose a tag to compare

What's Changed

  • add float_be function
  • add type parameter to achievement function for missables/progression
  • add transform parameter to ascii_string_equals and unicode_string_equals to support prev/prior logic
  • add rascript-cli.exe for command line processing of scripts
  • add leaderboard/rich presence value formats: TENS,HUNDREDS,THOUSANDS,FIXED1,FIXED2,FIXED3
  • support for trigger_when(measured(...)) via alt groups
  • allow max_of() to be called with an array of expressions
  • improved error messages for invalid function parameters
  • improved error message when trying to use a complex object as a dictionary key
  • fix assigning values to nested dictionaries
  • fix anonymous function error using boolean directly in if statement
  • fix "Input string was not in the correct format" on machines with locales using comma as a decimal separator
  • fix find at end of file not wrapping to start of file
  • fix mutually exclusive alts being collapsed into an always_true() clause
  • fix inverted bits being collapsed into a bitcount
  • fix never(always_true()) being discarded when guarded by an unless()
  • fix pointer offset calculation when subtracting a memory reference
  • fix exception comparing dictionary to value
  • fix exception processing code note containing both "bit" and "byte" substrings

Full Changelog: v1.12.2...v1.13.0

v1.12.2

07 Oct 19:23
Compare
Choose a tag to compare
  • ensure tally with deduct has at least one unbounded condition for total hit target
  • fix achievement containing only a modification to an AddSource constant not appearing modified
  • fix modifier being lost when comparing values with the same pointer chain
  • fix issue trying to process complex comparison to very large number
  • fix "Centiseconds" rich presence macro; support "SecondsAsMinutes" rich presence macro

v1.12.1

16 Jul 16:24
Compare
Choose a tag to compare
  • improve error message when parameter list has a trailing comma
  • improve error message when using measured with an untallied comparison
  • improve error message when building trigger from memory accessor without comparison
  • allow variables to be assigned to default parameters of functions to emulate constants
  • fix exception when viewport height change causes last line of script to be hidden
  • fix exception when local variable has same name as global function
  • fix ResetNextIf being converted to ResetIf when attached to a Trigger
  • fix modified AddAddress being optimized out of comparison
  • fix Measured target calculation when using tally
  • fix dumping achievement using measured unbounded tally

v1.12.0

23 Apr 21:40
Compare
Choose a tag to compare
  • only show first line of code notes in achievement/leaderboard views
  • new dialog to preview list of achievements as they would appear in the emulator
    • ability to export list of achievements from preview dialog
  • support for max_of when dumping leaderboards
  • improve error when function call contains a function used as a variable
  • fix infinite loop trying to find whitespace is a very long pointer chain
  • fix empty referenced memory addresses list when generating new script for game with no assets
  • fix issue generating multiple ResetNextIfs in an AndNext/OrNext chain
  • fix issue generating nested clauses in alt groups
  • fix infinite loop when underflow adjustment exceeds 32-bits
  • fix exception rebalancing comparison of unwrapped pointer offset and zero
  • fix exception when tally target is greater than 0x7FFFFFFF
  • fix exception generating script for game without name

v1.11.0

29 Jan 19:23
Compare
Choose a tag to compare
  • add mbf32_le function
  • add substring function
  • add ascii_string_equals and unicode_string_equals functions
  • add XOR operator (^)
  • add bitwise invert operator (~)
  • add horizontal scrollbar when file is sufficiently wide
  • ability to select entire lines by clicking on line number
  • support for merging bits into bitcount when pointers are involved
  • fix corruption of local notes containing newlines
  • fix dumping game using masked pointers
  • fix exception dumping game with no achievements or leaderboards
  • fix exception dumping game with incomplete leaderboards (one or more blank fields)
  • fix exception dumping rich presence with whitespace at the top of the file

v1.10.2

07 Dec 00:04
Compare
Choose a tag to compare
  • fix intersection of float comparisons

v1.10.1

03 Dec 16:43
Compare
Choose a tag to compare
  • fix any_of() logic for boolean predicates
  • fix dumping ResetNextIf for OR'd logic
  • fix intersecting optimization of OR'd logic
  • fix __ornext hint sometimes being optimized

v1.10.0

14 Nov 17:24
Compare
Choose a tag to compare
  • new internal representation of logic
    • small performance boost due to not having to reevaluate on each usage
    • allows for more optimization opportunities
      NOTE: this causes errors to be generated for several previously allowed syntaxes:
      • Implicit always_true() and always_false() are no longer supported in logic chains. Logic
        such as: 0=1 && never(byte(0x1234) == 3) will now collapse to false as 0=1 can never be
        true. Script authors must replace the 0=1 with an always_false() to preserve the logic in
        the output.
      • Memory addresses can no longer be compared to true or false. Compare to 1 or 0 instead.
      • always_true() and always_false() are no longer supported for leaderboard values.
        use measured(repeated(0, always_true())) and 0 instead.
      • Integer division is no longer implicitly converted to floats for leaderboard values:
        byte(0x1234) * 3 / 2 will no longer be automatically converted to byte(0x1234) * 1.5.
        use byte(0x1234) * 3.0 / 2 for automatic conversion.
      • Calling repeated or tally with a count of 0 is no longer supported outside of a measured
        clause of a value expression. Doing so implies an unbounded hit requirement which cannot be
        reached and is equivalent to always_false(). Using these to generate an AndNext/OrNext chain
        was not intended. If you absolutely want to prevent the OrNext from being converted to alt groups
        use the __ornext(condition) function. If you have a valid reason for forcing an AndNext chain
        let me know.
      • measured(A && B) will now generate an error instead of just setting the Measured flag on B.
        The actual logic it previously generated was A && measured(B) or measured(repeated(0, A && B))
        depending on whether it was being used in a trigger expression or a value expression.
      • once(A && once(B)) will now keep a separate hit count for B and for the entire clause by
        reordering the conditions or injecting an always_false() condition to hold the total count.
      • once(unless(A)) will now generate an error. use unless(once(A)) or disable_when(A) instead.
        Similarly, unless cannot be used inside repeated or tally clauses.
      • repeated(10, trigger_when(A)) will now generate an error. use trigger_when(repeated(10, A)) instead.
      • repeated(10, measured(A)) will now generate an error. use measured(repeated(10, A)) instead.
  • support for local code notes
  • add Progression analysis dialog (open from Game Stats dialog)
  • add ability to autogenerate function names in New Script dialog
  • fix measured(bitcount(X) == 8) being converted to measured(byte(X) == 255)
  • fix measured(X + 100 > 200) being converted to measured(X > 100)
  • fix float(X) < 0 being converted to always_false()
  • fix never in tally clause being replaced with AndNext
  • fix Copy to Clipboard not working on Rich Presence and Leaderboard title/description
  • fix duplicating of file extension for local badge images
  • fix dumping Rich Presence with measured value in display string
  • fix viewing Rich Presence diff where lookup was removed