getTokens: Difference between revisions

From RPTools Wiki
Jump to navigation Jump to search
(Clarified the layer parameter.)
m (mapname restored to parameters. mapID support not in this function)
 
(21 intermediate revisions by 5 users not shown)
Line 1: Line 1:
{{Languages|getTokens}}
{{MacroFunction
{{MacroFunction
|name=getTokens
|name=getTokens
Line 4: Line 5:
|version=1.3b48
|version=1.3b48
|description=
|description=
Gets a list containing the ids of all the tokens on the current map, or all the tokens that match the specified conditions. The type of the value returned depends on the delimiter parameter.  
Gets a list containing the ids of all the tokens on the current map (except lib:tokens and image:tokens), or all the tokens that match the specified conditions. The type of the value returned depends on the delimiter parameter.


Note: apparently the order of the list that getTokens() returns is also the z-order of the tokens, where the lowest z-order is the first in the list or array that is returned!
Note: apparently the order of the list that getTokens() returns is also the z-order of the tokens, where the lowest z-order is the first in the list or array that is returned!


|usage=
|usage=
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
getTokens()
getTokens()
</source>
<source lang="mtmacro" line>
getTokens(delim)
getTokens(delim)
</source>
<source lang="mtmacro" line>
getTokens(delim, conditions)
getTokens(delim, conditions)
</source>
</syntaxhighlight>
 
'''Parameters'''
'''Parameters'''
{{param|delim|The delimiter used to sepearate the values in the String List that is returned, defaults to {{code|","}}. If {{code|"json"}} is specified, a JSON array is returned instead of a String List.}}
{{param|delim|The delimiter used to sepearate the values in the String List that is returned, defaults to {{code|","}}. If {{code|"json"}} is specified, a [[JSON Array]] is returned instead of a String List.}}
{{param|conditions|A JSON object that contains various conditions that the tokens must fullfill. All conditions are optional.
{{param|conditions|A [[JSON Object]] that contains various conditions that the tokens must fullfill. All conditions are optional.
** {{code|setStates}} - A JSON array of states the token must have.  Any token which does not contain all of these states in the {{code|true}} condition will be removed from the returned list.
** {{code|setStates}} - A JSON array of states the token must have or a single state name as a string.  Any token which does not contain all of these states in the {{code|true}} condition will be removed from the returned list.
** {{code|unsetStates}} - A JSON array of states the token must '''not''' have.
** {{code|unsetStates}} - A JSON array of states the token must '''not''' have or a single state name as a string.
** {{code|npc}} - If the token must be a NPC, set to {{true}} or {{false}}.
** {{code|npc}} - If the token must be a NPC, set to {{true}} or {{false}}.
** {{code|pc}} - If the token must be a PC, set to {{true}} or {{false}}.
** {{code|pc}} - If the token must be a PC, set to {{true}} or {{false}}.
** {{code|propertyType}} - A JSON array of token types or a single token type as a string. Only tokens of a type included in the array will be returned.
** {{code|selected}} - If the token must be selected, set to {{true}} or {{false}}.
** {{code|selected}} - If the token must be selected, set to {{true}} or {{false}}.
** {{code|impersonated}} - If the token must be impersonated, set to {{true}} or {{false}}.
** {{code|impersonated}} - If the token must be impersonated, set to {{true}} or {{false}}.
** {{code|current}} - If the token must be the current token, set to {{true}} or {{false}}.
** {{code|current}} - If the token must be the current token, set to {{true}} or {{false}}.
** {{code|owned}} - If the token must be owned by the current player, set to {{true}} or {{false}}.
** {{code|owned}} - A [[JSON Array]] containing player names. All tokens that have at least one of the listed players as owner will be returned. Alternatively, a string containing '''one''' of the following options:
** {{code|visible}} - If the token must be visible to players, set to {{true}} or {{false}}.
*** {{code|self}} - tokens owned by the current player
*** <u>note</u>: '''GMs will be able to see everything, to test if a token is visible to a player with this function, you must have "Show as a Player" enabled. In addition, this appears to only affect the "Visible to players" flag - VBL and Fog of War do not seem to affect this'''.
*** {{code|notself}} - tokens not owned by the current player
** {{code|layer}} - A JSON array of layer names, or a single layer name as a string.  Only tokens on one of the listed layers will be returned. By default, tokens on the Token and Hidden layers are returned.(added in '''1.3b77''')
*** {{code|others}} - tokens owned by any player, but not owned by the current player
*** {{code|any}} - tokens owned by any player
*** {{code|none}} - tokens not owned by any player
*** {{code|single}} - tokens owned by a single player
*** {{code|multiple}} - tokens owned by more than one player
*** {{code|byall}} - tokens owned by all players
*** {{code|notbyall}} - tokens not owned by all players
** {{code|visible}} - If the token is visible in the current client's view. Set to {{true}} or {{false}}.
*** When the visible option is used only tokens on the TOKEN layer and which are shown within the client's current map view will be returned.
*** This is not a test of whether or not other tokens on the map out of view are visible to a specific token. See {{func|canSeeToken}}.
*** GMs will be able to see all tokens within the current map view.  Players (including View as Player) will only get returned those tokens that are shown in their current map view. Tokens returned will also be affected by server settings like Individual Views.
** {{code|layer}} - A JSON array of layer names, or a single layer name as a string.  Only tokens on one of the listed layers will be returned. By default, tokens on the Token and Hidden layers are returned.
** {{code|mapname}} - The Name of the map to get the tokens from. Defaults to the current map.
** {{code|range}} - A JSON object with range conditions, all range conditions are optional.
** {{code|range}} - A JSON object with range conditions, all range conditions are optional.
*** {{code|token}} - The id or name of the source token that the distance is measured from, defaults to the current token.  
*** {{code|token}} - The id or name of the source token that the distance is measured from, defaults to the current token.  
Line 44: Line 55:
**** {{code|x}} - The relative {{code|x}} position of the cell in relation to the {{code|token}} field. Measured in cells.
**** {{code|x}} - The relative {{code|x}} position of the cell in relation to the {{code|token}} field. Measured in cells.
**** {{code|y}} - The relative {{code|y}} position of the cell in relation to the {{code|token}} field. Measured in cells.}}
**** {{code|y}} - The relative {{code|y}} position of the cell in relation to the {{code|token}} field. Measured in cells.}}
** {{code|light}} - Can be a Boolean indicating tokens with any light source (1) or no light sources (0).  Alternatively a JSON object with the light specifications with any combination of the following:
*** {{code|value}} - Boolean indicating that the token must have the light(s) specified if true(1).
*** {{code|name}} - The name of the light as given in the Campaign Properties -> Light tab.
*** {{code|category}} - The category of the light as given in the Campaign Properties -> Light tab.




Line 56: Line 71:


*You can use the following code to print out the ids of all of the tokens on the current map:
*You can use the following code to print out the ids of all of the tokens on the current map:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h: ids = getTokens()]
[h: ids = getTokens()]
[foreach(id, ids, "<br>"): id]
[foreach(id, ids, "<br>"): id]
</source><br />
</syntaxhighlight><br />
*Find ALL the tokens on ALL the layers on the map:
*Find ALL the tokens on ALL the layers on the map:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[r:getTokens(",", json.set("{}", "layer", json.append("[]","TOKEN","HIDDEN","OBJECT","BACKGROUND")))]
[r:getTokens(",", json.set("{}", "layer", json.append("[]","TOKEN","HIDDEN","OBJECT","BACKGROUND")))]
</source><br />
</syntaxhighlight><br />
*Find and return a [[JSON Array]] containing all NPC tokens that are with 2 squares or hexes of the selected token:
*Find and return a [[JSON Array]] containing all NPC tokens that are with 2 squares or hexes of the selected token:
<source lang="mtmacro" line>[h: cond = '{ "range": {"upto":2, "distancePerCell":0, "token":"' +getSelected()+ '"}, "npc":1}']
<syntaxhighlight lang="mtmacro" line>[h: cond = '{ "range": {"upto":2, "distancePerCell":0, "token":"' +getSelected()+ '"}, "npc":1}']
[h: ids = getTokens("json", cond)]
[h: ids = getTokens("json", cond)]
</source><br />
</syntaxhighlight><br />
*Modifying the above example to exclude dead tokens:
*Modifying the above example to exclude dead tokens:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h: cond = '{ "range": {"upto":2, "distancePerCell":0, "token":"' +getSelected()+ '"}, "npc":1, "unsetStates":["Dead"] }']
[h: cond = '{ "range": {"upto":2, "distancePerCell":0, "token":"' +getSelected()+ '"}, "npc":1, "unsetStates":["Dead"] }']
[h: ids = getTokens("json", cond)]
[h: ids = getTokens("json", cond)]
</source><br />
</syntaxhighlight><br />
*Get all of the non dead NPC tokens in the square above, below, left, and to the right of the token, using the {{code|area}} option:
*Get all of the non dead NPC tokens in the square above, below, left, and to the right of the token, using the {{code|area}} option:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h: areaOffsets = '[ {x:1, y:0}, {x:0, y:1}, {x:-1, y:0}, {y:-1, x:0}]']
[h: areaOffsets = '[ {x:1, y:0}, {x:0, y:1}, {x:-1, y:0}, {y:-1, x:0}]']
[h: area = json.set("{}", "offsets", areaOffsets)]
[h: area = json.set("{}", "offsets", areaOffsets)]
[h: cond = json.set("{}", "area", area, "npc", 1, "unsetState", "['Dead']")]
[h: cond = json.set("{}", "area", area, "npc", 1, "unsetState", "['Dead']")]
[h: ids = getTokens("json", cond)]
[h: ids = getTokens("json", cond)]
</source><br />
</syntaxhighlight><br />
*The same could be achieved using the {{code|range}} option with {{code|NO_DIAGONALS}} metric:
*The same could be achieved using the {{code|range}} option with {{code|NO_DIAGONALS}} metric:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h: cond = '{ range: {upto:1, distancePerCell:0, metric:"NO_DIAGONALS"}, npc:1, unsetStates:["Dead"] }']
[h: cond = '{ range: {upto:1, distancePerCell:0, metric:"NO_DIAGONALS"}, npc:1, unsetStates:["Dead"] }']
[h: ids = getTokens("json", cond)]
[h: ids = getTokens("json", cond)]
</source>
</syntaxhighlight>
Simplest form of getting Tokens with Light sources
<syntaxhighlight lang="mtmacro" line>
[r: getTokens("json",'{"light":1}')]
</syntaxhighlight>
Getting tokens from the Object layer with a light source.
<syntaxhighlight lang="mtmacro" line>
[h: cond = json.set("", "layer",'["Object"]')]
[h: cond = json.set(cond, "light",'{"value":1}')]
[r: names = getTokens("json", cond)]
</syntaxhighlight>
Tokens with torches
<syntaxhighlight lang="mtmacro" line>
[h: cond = json.set("", "layer",'["Token"]')]
[h: cond = json.set(cond, "light",'{"value":1,"name":"Torch - 20","category":"D20"}')]
[r: names = getTokens("json", cond)]
</syntaxhighlight>
Tokens with Generic light sources.
<syntaxhighlight lang="mtmacro" line>
[h: cond = '{ "light": {"value":1, "category":"Generic"}}']
[r: names = getTokens("json", cond)]
</syntaxhighlight>
 
Please note that it in general is bad practice to create JSON objects and arrays by hand. This makes your code very bug prone. The proper way is to build you JSON object through code.<br />
Please note that it in general is bad practice to create JSON objects and arrays by hand. This makes your code very bug prone. The proper way is to build you JSON object through code.<br />
E.g.:
E.g.:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h: cond = '{ range: {upto:1, distancePerCell:0, metric:"NO_DIAGONALS"}, npc:1, unsetStates:["Dead"] }']
[h: cond = '{ range: {upto:1, distancePerCell:0, metric:"NO_DIAGONALS"}, npc:1, unsetStates:["Dead"] }']
</source>
</syntaxhighlight>
can better be created with:
can better be created with:
<source lang="mtmacro" line>
<syntaxhighlight lang="mtmacro" line>
[h: cond = json.set("{}", "range", json.set("{}", "upto", 1, "distancePerCell", 0, "metric", "NO_DIAGONALS"), "npc", 1, "unsetStates", json.append("[]","Dead"))]
[h: cond = json.set("{}", "range", json.set("{}", "upto", 1, "distancePerCell", 0, "metric", "NO_DIAGONALS"), "npc", 1, "unsetStates", json.append("[]","Dead"))]
</source>
</syntaxhighlight>
The big difference between the two methods is that doing it by hand, it's quite likely that when you make a mistake your code appears to 'work', that is you get no error reports, but only part of the conditions is met because you e.g. used <nowiki>''</nowiki> or "" where you should not have.<br />
The big difference between the two methods is that doing it by hand, it's quite likely that when you make a mistake your code appears to 'work', that is you get no error reports, but only part of the conditions is met because you e.g. used <nowiki>''</nowiki> or "" where you should not have.<br />
If you make a mistake in the automated method, there is a bigger chance you get an error report, allowing you to fix it. Of course typos like 'ragne' instead of 'range' won't trigger any errors.  
If you make a mistake in the automated method, there is a bigger chance you get an error report, allowing you to fix it. Of course typos like 'ragne' instead of 'range' won't trigger any errors.  


|changes=
|changes=
{{change|1.3b49|Added {{code|json}} delimiter option.}}
{{change|1.3b49|Add {{code|json}} delimiter option.}}
{{change|1.3b51|Added {{code|conditions}} parameter.}}
{{change|1.3b51|Add {{code|conditions}} parameter.}}
{{change|1.3b55|Added {{code|metric}} option to {{code|range}} option in {{code|conditions}} parameter.}}
{{change|1.3b55|Add {{code|metric}} option to {{code|range}} option in {{code|conditions}} parameter.}}
{{change|1.3b77|Add {{code|layer}} option to {{code|conditions}}.}}
{{change|1.5.5|Add {{code|propertyType}} option to {{code|conditions}}.}}
{{change|1.5.7|Add {{code|light}} and {{code|mapName}} options to {{code|conditions}}.}}
{{change|1.5.8|Add more options to {{code|owned}}.}}
 
|also=
{{func|getTokenNames}}
 
}}
}}
[[Category:Find Function]]
[[Category:Find Function]]
[[Category:Token Function]]
[[Category:Token Function]]
{{Languages|getTokens}}

Latest revision as of 23:58, 20 November 2024

Languages:  English  • 日本語


getTokens() Function

 Note: This function can only be used in a Trusted Macro

Introduced in version 1.3b48
Gets a list containing the ids of all the tokens on the current map (except lib:tokens and image:tokens), or all the tokens that match the specified conditions. The type of the value returned depends on the delimiter parameter. Note: apparently the order of the list that getTokens() returns is also the z-order of the tokens, where the lowest z-order is the first in the list or array that is returned!

Usage

getTokens()
getTokens(delim)
getTokens(delim, conditions)

Parameters

  • delim - The delimiter used to sepearate the values in the String List that is returned, defaults to ",". If "json" is specified, a JSON Array is returned instead of a String List.
  • conditions - A JSON Object that contains various conditions that the tokens must fullfill. All conditions are optional.
    • setStates - A JSON array of states the token must have or a single state name as a string. Any token which does not contain all of these states in the true condition will be removed from the returned list.
    • unsetStates - A JSON array of states the token must not have or a single state name as a string.
    • npc - If the token must be a NPC, set to true(1) or false(0).
    • pc - If the token must be a PC, set to true(1) or false(0).
    • propertyType - A JSON array of token types or a single token type as a string. Only tokens of a type included in the array will be returned.
    • selected - If the token must be selected, set to true(1) or false(0).
    • impersonated - If the token must be impersonated, set to true(1) or false(0).
    • current - If the token must be the current token, set to true(1) or false(0).
    • owned - A JSON Array containing player names. All tokens that have at least one of the listed players as owner will be returned. Alternatively, a string containing one of the following options:
      • self - tokens owned by the current player
      • notself - tokens not owned by the current player
      • others - tokens owned by any player, but not owned by the current player
      • any - tokens owned by any player
      • none - tokens not owned by any player
      • single - tokens owned by a single player
      • multiple - tokens owned by more than one player
      • byall - tokens owned by all players
      • notbyall - tokens not owned by all players
    • visible - If the token is visible in the current client's view. Set to true(1) or false(0).
      • When the visible option is used only tokens on the TOKEN layer and which are shown within the client's current map view will be returned.
      • This is not a test of whether or not other tokens on the map out of view are visible to a specific token. See canSeeToken().
      • GMs will be able to see all tokens within the current map view. Players (including View as Player) will only get returned those tokens that are shown in their current map view. Tokens returned will also be affected by server settings like Individual Views.
    • layer - A JSON array of layer names, or a single layer name as a string. Only tokens on one of the listed layers will be returned. By default, tokens on the Token and Hidden layers are returned.
    • mapname - The Name of the map to get the tokens from. Defaults to the current map.
    • range - A JSON object with range conditions, all range conditions are optional.
      • token - The id or name of the source token that the distance is measured from, defaults to the current token.
        • note: token parameter cannot be unset or empty unless you are calling your macro from a macroLink and aren't impersonating a token.
      • distancePerCell - If the Distance Per Cell multiplier should be used, set to true(1) or false(0).
      • from - A number specifying the minimum range that a token needs to be from the source.
      • upto - A number specifying the maximum range that a token can be from the source.
      • metric - The distance metric to use, if it is not specified the default from the users preferences is used.
    • area - A JSON object containing specific area information.
      • token - An optional field that contain the name or id of the token that resides at the center of the area. Defaults to the current token.
      • offsets - A JSON array of JSON objects that specify each individual cell that make up the area.
        • x - The relative x position of the cell in relation to the token field. Measured in cells.
        • y - The relative y position of the cell in relation to the token field. Measured in cells.
    • light - Can be a Boolean indicating tokens with any light source (1) or no light sources (0). Alternatively a JSON object with the light specifications with any combination of the following:
      • value - Boolean indicating that the token must have the light(s) specified if true(1).
      • name - The name of the light as given in the Campaign Properties -> Light tab.
      • category - The category of the light as given in the Campaign Properties -> Light tab.


The movement metric in range specifies the movement metric use, the metric can be one of the following strings:

  • NO_GRID - The grid is ignored and straight line distance between the tokens is returned.
  • ONE_TWO_ONE - First Diagonal movement costs 1, second 2, and so on (Square grid only).
  • ONE_ONE_ONE - Diagonal movement costs a single square (Square grid only).
  • MANHATTAN - Diagonal movement costs 2 (Square grid only).
  • NO_DIAGONALS - No diagonal movement is allowed (Square grid only).

Example

*You can use the following code to print out the ids of all of the tokens on the current map:
[h: ids = getTokens()]
[foreach(id, ids, "<br>"): id]

  • Find ALL the tokens on ALL the layers on the map:
[r:getTokens(",", json.set("{}", "layer", json.append("[]","TOKEN","HIDDEN","OBJECT","BACKGROUND")))]

  • Find and return a JSON Array containing all NPC tokens that are with 2 squares or hexes of the selected token:
[h: cond = '{ "range": {"upto":2, "distancePerCell":0, "token":"' +getSelected()+ '"}, "npc":1}']
[h: ids = getTokens("json", cond)]

  • Modifying the above example to exclude dead tokens:
[h: cond = '{ "range": {"upto":2, "distancePerCell":0, "token":"' +getSelected()+ '"}, "npc":1, "unsetStates":["Dead"] }']
[h: ids = getTokens("json", cond)]

  • Get all of the non dead NPC tokens in the square above, below, left, and to the right of the token, using the area option:
[h: areaOffsets = '[ {x:1, y:0}, {x:0, y:1}, {x:-1, y:0}, {y:-1, x:0}]']
[h: area = json.set("{}", "offsets", areaOffsets)]
[h: cond = json.set("{}", "area", area, "npc", 1, "unsetState", "['Dead']")]
[h: ids = getTokens("json", cond)]

  • The same could be achieved using the range option with NO_DIAGONALS metric:
[h: cond = '{ range: {upto:1, distancePerCell:0, metric:"NO_DIAGONALS"}, npc:1, unsetStates:["Dead"] }']
[h: ids = getTokens("json", cond)]

Simplest form of getting Tokens with Light sources

[r: getTokens("json",'{"light":1}')]

Getting tokens from the Object layer with a light source.

[h: cond = json.set("", "layer",'["Object"]')]
[h: cond = json.set(cond, "light",'{"value":1}')]
[r: names = getTokens("json", cond)]

Tokens with torches

[h: cond = json.set("", "layer",'["Token"]')]
[h: cond = json.set(cond, "light",'{"value":1,"name":"Torch - 20","category":"D20"}')]
[r: names = getTokens("json", cond)]

Tokens with Generic light sources.

[h: cond = '{ "light": {"value":1, "category":"Generic"}}']
[r: names = getTokens("json", cond)]

Please note that it in general is bad practice to create JSON objects and arrays by hand. This makes your code very bug prone. The proper way is to build you JSON object through code.
E.g.:

[h: cond = '{ range: {upto:1, distancePerCell:0, metric:"NO_DIAGONALS"}, npc:1, unsetStates:["Dead"] }']

can better be created with:

[h: cond = json.set("{}", "range", json.set("{}", "upto", 1, "distancePerCell", 0, "metric", "NO_DIAGONALS"), "npc", 1, "unsetStates", json.append("[]","Dead"))]

The big difference between the two methods is that doing it by hand, it's quite likely that when you make a mistake your code appears to 'work', that is you get no error reports, but only part of the conditions is met because you e.g. used '' or "" where you should not have.

If you make a mistake in the automated method, there is a bigger chance you get an error report, allowing you to fix it. Of course typos like 'ragne' instead of 'range' won't trigger any errors.

See Also

Version Changes

  • 1.3b49 - Add json delimiter option.
  • 1.3b51 - Add conditions parameter.
  • 1.3b55 - Add metric option to range option in conditions parameter.
  • 1.3b77 - Add layer option to conditions.
  • 1.5.5 - Add propertyType option to conditions.
  • 1.5.7 - Add light and mapName options to conditions.
  • 1.5.8 - Add more options to owned.

Languages:  English  • 日本語