Skip to content

Releases: Jamiras/RATools

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

v1.9.1

23 Jun 01:00
Compare
Choose a tag to compare
  • show error when server returns non-JSON authentication error
  • improve diff logic for rich presence lookups
  • fix optimization of division by self in leaderboard value
  • fix line endings causing rich presence to appear modified
  • fix back navigation when an asset has changed

v1.9.0

14 Jun 16:11
Compare
Choose a tag to compare
  • upgrade from .NET Framework 4.6 to .NET Core 6.0
  • add forward/backward navigation via mouse4/mouse5 buttons
  • use APIs for Analysis dialogs (fixes failures caused by scraping website when site changes)
    • added Web API Key field to settings dialog
  • add User Mastery analysis dialog (warning: fetches game stats for every game user has mastered)
  • add Unlock Distance analysis dialog
  • add Rich Presence to the Update Local dialog
  • update Rich Presence size warning to 64KB
  • fix issue dumping script with measured(tally(), when=...) clause
  • fix issue dumping script with tally(1, ...) clause
  • fix issue dumping script when local leaderboards are present
  • fix issue dumping leaderboard value with AddAddress and non-integer multiplier
  • fix issue generating rich presence when lookup is hardcoded for value=0
  • fix issue pasting multiline text into a line with an error indicator
  • fix error generating leaderboard value with measured(..., when=repeated() && never())
  • fix error using multiple nevers in a single repeated clause
  • fix whitespace not being required after else keyword

v1.8.5

03 Apr 17:22
Compare
Choose a tag to compare
  • many improvements to generating scripts from existing achievements
    • support for generating from local achievements
    • support for built-in macros
    • support for compound code note sizes i.e. "[32-bit float]"
    • convert PauseIf with hitcounts/ResetNextIf logic to disable_when()
    • convert AddHits chain to tally()
    • fix exception if macro has no parameter
    • fix exception when no tickets are found
  • add array_map() function
  • add tally_of() function
  • add logic to convert "A<1||A>1" into "A!=1"
  • support for multiple conditions in a ResetNextIf using OrNext
  • make error more user-friendly when an if expression cannot be evaluated at compile time
  • fix multiple conditions in a repeated() in measured(when=) getting split into separate MeasuredIfs

v1.8.4

15 Feb 16:27
Compare
Choose a tag to compare
  • support for bitwise and (&)
  • add lower_is_better flag to leaderboard() function
  • support for collapsing AddSource bit chain into BitCount
  • support joining multiple MeasuredIfs for when parameter of measured() function when dumping New Script
  • allow || in when parameter of measured() function.
  • use core badge when merging local/generated achievement with badge "00000"
  • improved matching for trigger diffs - most notably, when alt group indices change
  • show serialization warnings when using Update Local dialog
  • fix premature optimization of subclause causing complex condition to evaluate to always_false()
  • fix exception when line-wrapping some complex expressions when dumping script via New Script

v1.8.3

04 Jan 20:28
Compare
Choose a tag to compare
  • add true and false constants for script logic (continue to use always_true() and always_false() for trigger definitions)
  • add word_be, tbyte_be, and dword_be big-endian memory accessor functions
  • add max_of helper function for leaderboard value clause
  • add rich_presence_macro function
  • support for floating point numbers
  • support for writing leaderboards to local file (direct import to 0.80 DLL)
  • support for generating code for leaderboards from New Script dialog
  • add format parameter to measured function to support raw vs. percent display
  • allow negative offsets when processing pointers
  • allow bcd() to be called inside prev()
  • allow trigger(a || b) to expand to alt groups
  • allow loading file without a game id
  • lookup entries that match the fallback value are no longer included in the generated Rich Presence script
  • improved underflow adjustment calculations
  • fix empty array/dictionary showing up orange
  • fix loss of hit target when final condition of clause is optimized out
  • fix loss of ResetIf when used in Measured value
  • fix cannot apply Trigger to ResetIf error when using never inside repeated in trigger_when
  • fix highlighting issue when pasting lines that start with combining characters (&&, +, ...)
  • fix stack overflow processing very long chain of conditions
  • fix maximum recursion error when processing very long AddSource chain inside prev
  • fix maximum recursion error when editing the same function over and over
  • fix crash updating local achievements when system culture uses comma as decimal separator
  • fix stats not showing up without an ApiKey

v1.8.2

22 Aug 23:51
Compare
Choose a tag to compare
  • add disable_when() function
  • add any_of(), all_of(), none_of(), and sum_of() functions
  • allow functions to have default parameters
  • allow functions to be assigned to variables
  • support for anonymous functions
  • support for collapsing duplicated rich presence strings into keyed ranges
  • improved badge handling for non-local achievements
  • modify underflow adjustment logic to generate statements that don't require underflow adjustment
    • for example [a - b > n] => [b + n < a] instead of [a - b - n + max(b) > max(b)]
  • add links to view user achievement history from game stats dialog
  • fix error indicator not updating when lines added/removed earlier in the script
  • fix goto source not going to the correct line when lines added/removed earlier in the script
  • fix scaled modifiers not supported in leaderboard values
  • fix indirect addresses not supported in bit() function
  • fix underflow adjustment for prev() comparisons
  • fix impossible comparison [byte > 400] affecting neighboring conditions

v1.8.1

09 May 15:50
Compare
Choose a tag to compare
  • add trigger_when() function
  • add deduct() helper for tally() function
  • support scaling for modifier conditions (AddSource, SubSource, AddAddress)
  • support for hex constants (hXX) when deconstructing rich presence and leaderboards from server data
  • add copy to clipboard links for leaderboard title/description
  • fix bitcount() not being allowed in prev() and prior() functions
  • fix syntax highlighting in dictionary when not ordered by key
  • fix stack overflow evaluating very long chain of ANDed conditions
  • fix issue simplifying comparison with multiple constants

v1.8.0

27 Feb 21:19
Compare
Choose a tag to compare
  • dynamic recompilation (only process the parts of the script affected by changes)
  • several other optimizations around script processing
  • several minor improvements to better report the actual cause of an error
  • update analysis queries for website changes (NOTE: ticket list now requires setting a Cookie value in the ini file)
  • fix multiplication not being distributed over complex term
  • fix wrong condition being removed when two never() conditions overlap
  • fix PauseIf being removed from alt if it also exists in core