Releases: Jamiras/RATools
Releases · Jamiras/RATools
v1.14.1
- 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
- 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)
intoprev(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
What's Changed
- add
float_be
function - add
type
parameter toachievement
function for missables/progression - add
transform
parameter toascii_string_equals
andunicode_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 anunless()
- 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
- ensure
tally
withdeduct
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
- 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
- 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
- add
mbf32_le
function - add
substring
function - add
ascii_string_equals
andunicode_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
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