Releases: Jamiras/RATools
Releases · Jamiras/RATools
v1.10.1
v1.10.0
- 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()
andalways_false()
are no longer supported in logic chains. Logic
such as:0=1 && never(byte(0x1234) == 3)
will now collapse tofalse
as0=1
can never be
true. Script authors must replace the0=1
with analways_false()
to preserve the logic in
the output. - Memory addresses can no longer be compared to
true
orfalse
. Compare to1
or0
instead. always_true()
andalways_false()
are no longer supported for leaderboard values.
usemeasured(repeated(0, always_true()))
and0
instead.- Integer division is no longer implicitly converted to floats for leaderboard values:
byte(0x1234) * 3 / 2
will no longer be automatically converted tobyte(0x1234) * 1.5
.
usebyte(0x1234) * 3.0 / 2
for automatic conversion. - Calling
repeated
ortally
with a count of 0 is no longer supported outside of ameasured
clause of a value expression. Doing so implies an unbounded hit requirement which cannot be
reached and is equivalent toalways_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 wasA && measured(B)
ormeasured(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 analways_false()
condition to hold the total count.once(unless(A))
will now generate an error. useunless(once(A))
ordisable_when(A)
instead.
Similarly,unless
cannot be used insiderepeated
ortally
clauses.repeated(10, trigger_when(A))
will now generate an error. usetrigger_when(repeated(10, A))
instead.repeated(10, measured(A))
will now generate an error. usemeasured(repeated(10, A))
instead.
- Implicit
- 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 tomeasured(byte(X) == 255)
- fix
measured(X + 100 > 200)
being converted tomeasured(X > 100)
- fix
float(X) < 0
being converted toalways_false()
- fix
never
intally
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
- 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
- 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
never
s in a singlerepeated
clause - fix whitespace not being required after
else
keyword
v1.8.5
- 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 todisable_when()
- convert
AddHits
chain totally()
- 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
usingOrNext
- make error more user-friendly when an if expression cannot be evaluated at compile time
- fix multiple conditions in a
repeated()
inmeasured(when=)
getting split into separateMeasuredIf
s
v1.8.4
- support for bitwise and (
&
) - add
lower_is_better
flag toleaderboard()
function - support for collapsing
AddSource
bit chain intoBitCount
- support joining multiple
MeasuredIf
s forwhen
parameter ofmeasured()
function when dumping New Script - allow
||
inwhen
parameter ofmeasured()
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
- add
true
andfalse
constants for script logic (continue to usealways_true()
andalways_false()
for trigger definitions) - add
word_be
,tbyte_be
, anddword_be
big-endian memory accessor functions - add
max_of
helper function forleaderboard
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 tomeasured
function to support raw vs. percent display - allow negative offsets when processing pointers
- allow
bcd()
to be called insideprev()
- 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
insiderepeated
intrigger_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
- add
disable_when()
function - add
any_of()
,all_of()
,none_of()
, andsum_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)
]
- for example [
- 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
- add
trigger_when()
function - add
deduct()
helper fortally()
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 inprev()
andprior()
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
- 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