Main      Site Guide    

As Smash matures, new functionality is being added to the language. This is a brief summary of recent additions to the language. See the Smash Tutorial for further information about any of the items below.


  • S: has been changed so that each supported value has a text tag that may be used in place of the number to retrieve system values. This should make code easier to read, because the text tag describes what the value is you're looking up, whereas the numerical values do not. For example, S:moves may now be used instead of S:0 to get the number of moves made by the player so far. Although the numerical values are still supported, the text tags are now the preferred means of accessing system values. This change may break existing code, although it is unlikely to. Previously, an expression like S:variable would evaluate the variable and access the correspondingly numbered system value. Now, "variable" is assumed to be a text tag that S: does not support, and an error is thrown. To fix this problem, use S:{variable} instead.
  • S:isnewloc (a.k.a. S:16) returns whether or not the player has just jumped to a new location. It is set to 1 after a location change takes place (after a "g" command takes effect, not when it is issued) and reverts back to 0 at the end of the turn. c S:isnewloc is the functional equivalent of G with the exception that c S:isnewloc lets you have a C block following it. Moreover, S:isnewloc can be used within more complex expressions.
  • A new x: operator evaluates a string of hexadecimal digits. For example, x:ff evaluates to 255. Hexadecimal strings are case-insensitive.


  • The I command was removed. This may break existing code. Instead, use the i command, which has a new (optional) priority parameter that can be used to guard against an area-level image overriding an action-level image. All installed code on the RinkWorks server has been updated with this change.
  • The E command was changed to !. This may break existing code. All installed code on the RinkWorks server has been updated with this change.


  • New inventory bag controls, which allow the programmer to manipulate entire sets of inventory without using a series of variables to keep track of individual items. The basic idea is that the normal a, d, and e work on the current "inventory bag." If you switch inventory bags with the b command, you can toggle between multiple sets of inventory. A commonly desired effect you can achieve with inventory bags is the player losing all items, then getting them back at a later time. New commands and operators to support this functionality are:
    • b command to switch inventory bags
    • B command to merge inventory bags
    • d can take no arguments to drop all items in the current bag
    • D command drops all items in a specified bag, or all of them if none is specified
    • b: operator returns the number of items in a bag
    • B: operator returns whether the specified bag is the current one
    • S:10 is the string-encoded bag name (or last 8 chars)
    • S:11 is the number of regular items in the given bag
    • S:12 is the number of distinct enumerated items in the given bag
    • S:13 is the number of total enumerated items in the given bag
    • S:14 is the number of distinct items in the given bag
    • S:15 is the number of total items in the given bag
  • S:9 returns the current random number seed, and the new x command lets you set the random number seed. This is useful if you want to make random number sequences repeatable.


  • Now @ + (with no option tag as an argument) will show all constant options; similarly, @ - will hide all constant options.
  • Correction to the Smash Tutorial: The E command is supposed to take a [text] as an argument, not a (str-exp). This means your custom error message is optional and, if present, can span multiple lines, just like the text arguments to . and p commands (for example) can. Note, however, that embedded images don't work in error message texts, even though that's also part of the "text" argument type.


  • A new R loop, which works like an L loop, except that the loop always executes at least once -- and, in fact, the first time through the loop, the loop expression isn't even evaluated. R loops are functionally equivalent to "do/while" loops in other languages such as C/C++.


  • A new .: operator, where .:N is shorthand for (1 << N).
  • A new .! operator, which evaluates to the negation of the .? operator, that is, evaluates to true if a given bit is NOT set.


  • A new l: operator converts an encoded string to lower case.
  • A new u: operator converts an encoded string to upper case.
  • A new U: operator capitalizes the words in an encoded string.


  • A new s: operator returns the sign of its argument.
  • S:7 returns 1 if area description text has been set; 0 otherwise.
  • S:8 returns 1 if action description text has been set; 0 otherwise.
  • A new .+ operator returns a value with a given bit set.
  • A new .- operator returns a value with a given bit cleared.
  • A new .~ operator returns a value with a given bit toggled.
  • A new .? operator returns 1 if a given bit has been set in a value.
  • Function blocks may now be defined in the copts.sma file. The intention is to allow functions called by the code in the constant option blocks to reside right there in the copts.sma file, but is still, of course, perfectly permissible to continue to place such functions elsewhere.
  • The z command now takes the optional argument of a location name. If present, only the state variables in the given location will be cleared. Note the command z {'S:5} for clearing the current location's state variables without introducing a dependency on what the current location's name is. This trick, of course, only works on location names that are not longer than eight characters.