Files
sfall/arrays/index.html
T

68 lines
40 KiB
HTML
Raw Normal View History

2026-01-01 02:00:04 +00:00
<!DOCTYPE html> <html lang="en-US"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=Edge"> <link rel="stylesheet" href="/sfall/assets/css/just-the-docs-default.css"> <link rel="stylesheet" href="/sfall/assets/css/just-the-docs-head-nav.css" id="jtd-head-nav-stylesheet"> <style id="jtd-nav-activation"> .site-nav > ul.nav-list:first-child > li:not(:nth-child(2)) > a, .site-nav > ul.nav-list:first-child > li > ul > li a { background-image: none; } .site-nav > ul.nav-list:not(:first-child) a, .site-nav li.external a { background-image: none; } .site-nav > ul.nav-list:first-child > li:nth-child(2) > a { font-weight: 600; text-decoration: none; }.site-nav > ul.nav-list:first-child > li:nth-child(2) > button svg { transform: rotate(-90deg); }.site-nav > ul.nav-list:first-child > li.nav-list-item:nth-child(2) > ul.nav-list { display: block; } </style> <script src="/sfall/assets/js/vendor/lunr.min.js"></script> <script src="/sfall/assets/js/just-the-docs.js"></script> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="/sfall/favicon.ico" type="image/x-icon"> <!-- Begin Jekyll SEO tag v2.8.0 --> <title>Arrays | sfall</title> <meta name="generator" content="Jekyll v3.9.0" /> <meta property="og:title" content="Arrays" /> <meta property="og:locale" content="en_US" /> <meta name="description" content="Sfall documentation" /> <meta property="og:description" content="Sfall documentation" /> <link rel="canonical" href="/sfall/arrays/" /> <meta property="og:url" content="/sfall/arrays/" /> <meta property="og:site_name" content="sfall" /> <meta property="og:type" content="website" /> <meta name="twitter:card" content="summary" /> <meta property="twitter:title" content="Arrays" /> <script type="application/ld+json"> {"@context":"https://schema.org","@type":"WebPage","description":"Sfall documentation","headline":"Arrays","url":"/sfall/arrays/"}</script> <!-- End Jekyll SEO tag --> <link rel="apple-touch-icon" sizes="180x180" href="/assets/favicon/apple-touch-icon.png"> <link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon/favicon-16x16.png"> <link rel="manifest" href="/assets/favicon/site.webmanifest"> <link rel="mask-icon" href="/assets/favicon/safari-pinned-tab.svg" color="#5bbad5"> <meta name="msapplication-TileColor" content="#da532c"> <meta name="msapplication-config" content="/assets/favicon/browserconfig.xml"> <meta name="theme-color" content="#ffffff"> </head> <body> <a class="skip-to-main" href="#main-content">Skip to main content</a> <svg xmlns="http://www.w3.org/2000/svg" class="d-none"> <symbol id="svg-link" viewBox="0 0 24 24"> <title>Link</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-link"> <path d="M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71"></path><path d="M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71"></path> </svg> </symbol> <symbol id="svg-menu" viewBox="0 0 24 24"> <title>Menu</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-menu"> <line x1="3" y1="12" x2="21" y2="12"></line><line x1="3" y1="6" x2="21" y2="6"></line><line x1="3" y1="18" x2="21" y2="18"></line> </svg> </symbol> <symbol id="svg-arrow-right" viewBox="0 0 24 24"> <title>Expand</title> <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="feather feather-chevron-right"> <polyline points="9 18 15 12 9 6"></polyline> </svg> </symbol> <!-- Feather. MIT License: https://github.com/feathericons/feather/blob/master/LICENSE --> <symbol id="svg-external-link" width="24" height="24" viewBox="0 0 24 24" fill="
2022-04-07 13:19:56 +00:00
<span class="n">list</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span> <span class="o">:=</span> <span class="s">"Value"</span><span class="p">;</span>
</code></pre></div></div> <p>There are 2 different types of arrays currently available:</p> <ul> <li> <p><strong>Lists</strong> - a set of values with specific size (number of elements), where all elements have numeric indexes starting from zero (0) up to array length minus one.</p> <p>For example:</p> <div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// this creates list with 3 elements. Element "A" has index 0, element "B" has index 1, element "C" - 2</span>
<span class="n">list</span> <span class="o">:=</span> <span class="p">[</span><span class="s">"A"</span><span class="p">,</span> <span class="s">"B"</span><span class="p">,</span> <span class="s">"C"</span><span class="p">];</span>
2022-01-20 05:43:23 +00:00
</code></pre></div> </div> <p>Limitations:</p> <ul> <li>all indexes are numeric, starting from 0;</li> <li>to assign value to a specific index, you must first resize array to contain this index (for example, if list is of size 3 (indexes from 0 to 2), you cant assign value to index 4 unless you change list size to 5 first).</li> </ul> </li> <li> <p><strong>Maps</strong> (or associative arrays) - a set of key=&gt;value pairs, where all elements (values) are accessed by corresponding keys.</p> <p>Differences from list:</p> <ul> <li>maps dont have specific size (to assign values, you dont need to resize array first);</li> <li>keys, just like values, can be of any type (but avoid using -1 as array keys or you wont be able to use some functions reliably).</li> </ul> </li> </ul> <p>Both array types have their pros and cons and are suited for different tasks.</p> <h2 id="arrays-syntax"> <a href="#arrays-syntax" class="anchor-heading" aria-labelledby="arrays-syntax"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Arrays syntax </h2> <p>Basically arrays are implemented using number of new operators (script functions). But for ease of use, there are some new syntax elements:</p> <ul> <li>Accessing elements. Use square brackets: <div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">display_msg</span><span class="p">(</span><span class="nx">arr</span><span class="p">[</span><span class="mi">5</span><span class="p">]);</span>
2022-04-07 13:19:56 +00:00
<span class="nx">mymap</span><span class="p">[</span><span class="dl">"</span><span class="s2">price</span><span class="dl">"</span><span class="p">]</span> <span class="p">:</span><span class="o">=</span> <span class="mf">515.23</span><span class="p">;</span>
2021-06-01 04:05:32 +00:00
</code></pre></div> </div> </li> <li>Alternative accessing for maps. Use dot: <div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">display_msg</span><span class="p">(</span><span class="nx">mymap</span><span class="p">.</span><span class="nx">name</span><span class="p">);</span>
<span class="nx">mymap</span><span class="p">.</span><span class="nx">price</span> <span class="p">:</span><span class="o">=</span> <span class="mf">232.23</span><span class="p">;</span>
2022-04-07 13:19:56 +00:00
</code></pre></div> </div> </li> <li>Array expressions. Create and fill arrays with just one expression: <div class="language-c++ highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// create list with 5 values</span>
<span class="p">[</span><span class="mi">5</span><span class="p">,</span> <span class="mi">777</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mf">3.14</span><span class="p">,</span> <span class="s">"Cool Value"</span><span class="p">]</span>
2021-06-01 04:05:32 +00:00
2022-04-07 13:19:56 +00:00
<span class="c1">// create map:</span>
<span class="p">{</span><span class="mi">5</span><span class="o">:</span> <span class="s">"Five"</span><span class="p">,</span> <span class="s">"health"</span><span class="o">:</span> <span class="mi">50</span><span class="p">,</span> <span class="s">"speed"</span><span class="o">:</span> <span class="mf">0.252</span><span class="p">}</span>
</code></pre></div> </div> <p><strong>NOTE:</strong> Make sure to call <code class="language-plaintext highlighter-rouge">fix_array</code> if you want the new array to be available in the next frame or <code class="language-plaintext highlighter-rouge">save_array</code> if you want to use it for a longer period (see next section for details).</p> </li> <li>Iterating in loop. Use <code class="language-plaintext highlighter-rouge">foreach</code> key word like this: <div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">foreach</span> <span class="p">(</span><span class="nx">item</span> <span class="k">in</span> <span class="nx">myarray</span><span class="p">)</span> <span class="nx">begin</span>
2021-06-01 04:05:32 +00:00
<span class="c1">// this block is executed for each array element, where "item" contains current value on each step</span>
<span class="nx">end</span>
<span class="c1">// alternative syntax:</span>
<span class="nx">foreach</span> <span class="p">(</span><span class="nx">key</span><span class="p">:</span> <span class="nx">item</span> <span class="k">in</span> <span class="nx">myarray</span><span class="p">)</span> <span class="nx">begin</span>
<span class="c1">// "key" will contain current key (or numeric index, for lists)</span>
<span class="nx">end</span>
2022-04-07 13:19:56 +00:00
</code></pre></div> </div> </li> </ul> <p>See “scripting_docs\compiler\sslc_readme.html” file for full information on new SSL syntax features.</p> <h2 id="storing-arrays"> <a href="#storing-arrays" class="anchor-heading" aria-labelledby="storing-arrays"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Storing arrays </h2> <p>Apart from lists/maps arrays are divided by how they are stored. There a 3 types of arrays:</p> <ul> <li> <p><strong>Temporary</strong>. They are created using <code class="language-plaintext highlighter-rouge">temp_array</code> function or when using array expressions. Arrays of this type are auto-deleted at the end of the frame. So, for example, if you have a global script which runs at regular intervals, where you create temp_array, it will not be available next time your global script is executed.</p> </li> <li> <p><strong>Permanent</strong>. They are created using <code class="language-plaintext highlighter-rouge">create_array</code> function or <code class="language-plaintext highlighter-rouge">fix_array</code> (from pre-existing temporary array). This type of arrays are always available (by their ID) until you start a new game or load a saved game (at which point they are deleted).</p> </li> <li> <p><strong>Saved</strong>. If you want your array to really stay for a while, use function <code class="language-plaintext highlighter-rouge">save_array</code> to make any array “saved”. However, they are, like permanent arrays, “deleted” from memory when loading game. In order to use them properly, you must load them from the savegame using <code class="language-plaintext highlighter-rouge">load_array</code> whenever you want to use them.</p> <p>Example:</p> <div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">variable</span> <span class="nx">savedArray</span><span class="p">;</span>
2021-06-01 04:05:32 +00:00
<span class="nx">procedure</span> <span class="nx">start</span> <span class="nx">begin</span>
<span class="k">if</span> <span class="nx">game_loaded</span> <span class="nx">then</span> <span class="nx">begin</span>
2022-04-07 13:19:56 +00:00
<span class="nx">savedArray</span> <span class="p">:</span><span class="o">=</span> <span class="nx">load_array</span><span class="p">(</span><span class="dl">"</span><span class="s2">traps</span><span class="dl">"</span><span class="p">);</span>
2021-06-01 04:05:32 +00:00
<span class="nx">end</span> <span class="k">else</span> <span class="nx">begin</span>
<span class="nx">foreach</span> <span class="nx">trap</span> <span class="k">in</span> <span class="nx">traps</span> <span class="nx">begin</span>
<span class="p">....</span>
<span class="nx">end</span>
<span class="nx">end</span>
<span class="nx">end</span>
</code></pre></div> </div> </li> </ul> <h2 id="practical-examples"> <a href="#practical-examples" class="anchor-heading" aria-labelledby="practical-examples"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Practical examples </h2> <h3 id="use-arrays-to-implement-variable-argument-procedures"> <a href="#use-arrays-to-implement-variable-argument-procedures" class="anchor-heading" aria-labelledby="use-arrays-to-implement-variable-argument-procedures"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Use arrays to implement variable-argument procedures </h3> <div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// define it</span>
<span class="nx">procedure</span> <span class="nx">give_item</span><span class="p">(</span><span class="nx">variable</span> <span class="nx">critter</span><span class="p">,</span> <span class="nx">variable</span> <span class="nx">pidList</span><span class="p">)</span> <span class="nx">begin</span>
<span class="nx">foreach</span> <span class="p">(</span><span class="nx">pid</span><span class="p">:</span> <span class="nx">qty</span> <span class="k">in</span> <span class="nx">pidList</span><span class="p">)</span> <span class="nx">begin</span>
<span class="nx">give_pid_qty</span><span class="p">(</span><span class="nx">critter</span><span class="p">,</span> <span class="nx">pid</span><span class="p">,</span> <span class="nx">qty</span><span class="p">);</span>
<span class="nx">end</span>
<span class="nx">end</span>
<span class="c1">// call it:</span>
<span class="nx">call</span> <span class="nx">give_item</span><span class="p">(</span><span class="nx">dude_obj</span><span class="p">,</span> <span class="p">{</span><span class="na">PID_SHOTGUN</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span> <span class="na">PID_SHOTGUN_SHELLS</span><span class="p">:</span> <span class="mi">4</span><span class="p">,</span> <span class="na">PID_STIMPAK</span><span class="p">:</span> <span class="mi">3</span><span class="p">});</span>
</code></pre></div></div> <h3 id="create-arrays-of-objects-maps-for-advanced-scripting"> <a href="#create-arrays-of-objects-maps-for-advanced-scripting" class="anchor-heading" aria-labelledby="create-arrays-of-objects-maps-for-advanced-scripting"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Create arrays of objects (maps) for advanced scripting </h3> <div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nx">variable</span> <span class="nx">traps</span><span class="p">;</span>
<span class="nx">procedure</span> <span class="nx">init_traps</span> <span class="nx">begin</span>
<span class="c1">// just a quick example, there is a better way of doing it...</span>
2022-04-07 13:19:56 +00:00
<span class="nx">traps</span> <span class="p">:</span><span class="o">=</span> <span class="nx">load_array</span><span class="p">(</span><span class="dl">"</span><span class="s2">traps</span><span class="dl">"</span><span class="p">);</span>
2021-06-01 04:05:32 +00:00
<span class="k">if</span> <span class="p">(</span><span class="nx">traps</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="nx">then</span> <span class="nx">begin</span>
<span class="nx">traps</span> <span class="p">:</span><span class="o">=</span> <span class="p">[];</span>
2022-04-07 13:19:56 +00:00
<span class="nx">save_array</span><span class="p">(</span><span class="dl">"</span><span class="s2">traps</span><span class="dl">"</span><span class="p">,</span> <span class="nx">traps</span><span class="p">);</span>
2021-06-01 04:05:32 +00:00
<span class="nx">end</span>
<span class="nx">foreach</span> <span class="nx">k</span><span class="p">:</span> <span class="nx">v</span> <span class="k">in</span> <span class="nx">traps</span> <span class="nx">begin</span>
2022-04-07 13:19:56 +00:00
<span class="nx">traps</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span> <span class="p">:</span><span class="o">=</span> <span class="nx">load_array</span><span class="p">(</span><span class="dl">"</span><span class="s2">trap_</span><span class="dl">"</span><span class="o">+</span><span class="nx">k</span><span class="p">);</span> <span class="c1">// each object is stored separately</span>
2021-06-01 04:05:32 +00:00
<span class="nx">end</span>
<span class="nx">end</span>
<span class="nx">procedure</span> <span class="nx">add_trap</span><span class="p">(</span><span class="nx">variable</span> <span class="nx">trapArray</span><span class="p">)</span> <span class="nx">begin</span>
<span class="nx">variable</span> <span class="nx">index</span><span class="p">;</span>
<span class="nl">index</span> <span class="p">:</span><span class="o">=</span> <span class="nx">len_array</span><span class="p">(</span><span class="nx">traps</span><span class="p">);</span>
2022-04-07 13:19:56 +00:00
<span class="nx">save_array</span><span class="p">(</span><span class="dl">"</span><span class="s2">trap_</span><span class="dl">"</span><span class="o">+</span><span class="nx">k</span><span class="p">,</span> <span class="nx">trapArray</span><span class="p">);</span>
2021-06-01 04:05:32 +00:00
<span class="nx">array_push</span><span class="p">(</span><span class="nx">traps</span><span class="p">,</span> <span class="nx">trapArray</span><span class="p">);</span>
<span class="nx">end</span>
<span class="c1">// use them:</span>
<span class="nx">foreach</span> <span class="nx">trap</span> <span class="k">in</span> <span class="nx">traps</span> <span class="nx">begin</span>
2022-04-07 13:19:56 +00:00
<span class="k">if</span> <span class="p">(</span><span class="nx">self_elevation</span> <span class="o">==</span> <span class="nx">trap</span><span class="p">[</span><span class="dl">"</span><span class="s2">elev</span><span class="dl">"</span><span class="p">]</span> <span class="nx">and</span> <span class="nx">tile_distance</span><span class="p">(</span><span class="nx">self_tile</span><span class="p">,</span> <span class="nx">trap</span><span class="p">[</span><span class="dl">"</span><span class="s2">tile</span><span class="dl">"</span><span class="p">])</span> <span class="o">&lt;</span> <span class="nx">trap</span><span class="p">[</span><span class="dl">"</span><span class="s2">radius</span><span class="dl">"</span><span class="p">])</span> <span class="nx">then</span>
2021-06-01 04:05:32 +00:00
<span class="c1">// kaboom!!!</span>
<span class="nx">end</span>
<span class="nx">end</span>
2023-10-16 03:36:10 +00:00
</code></pre></div></div> <h2 id="array-operators-reference"> <a href="#array-operators-reference" class="anchor-heading" aria-labelledby="array-operators-reference"><svg viewBox="0 0 16 16" aria-hidden="true"><use xlink:href="#svg-link"></use></svg></a> Array operators reference </h2> <p><em>*mixed means any type</em></p> <ul> <li><code class="language-plaintext highlighter-rouge">int create_array(int size, int flags)</code>: <ul> <li>creates permanent array (but not “saved”)</li> <li>if <code class="language-plaintext highlighter-rouge">size &gt;= 0</code>, creates list with given size</li> <li>if <code class="language-plaintext highlighter-rouge">size == -1</code>, creates map (associative array)</li> <li>if <code class="language-plaintext highlighter-rouge">size == -1</code> and <code class="language-plaintext highlighter-rouge">flags == 2</code>, creates a “lookup” map (associative array) in which the values of existing keys are read-only and cant be updated. This type of array allows you to store a zero (0) key value <ul> <li>NOTE: in earlier versions (up to 4.1.3/3.8.13) the second argument is not used, just use 0</li> </ul> </li> <li>returns arrayID (valid until array is deleted)</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">int temp_array(int size, int flags)</code>: <ul> <li>works exactly like <code class="language-plaintext highlighter-rouge">create_array</code>, only created array becomes “temporary”</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">void fix_array(int arrayID)</code>: <ul> <li>changes “temporary” array into “permanent” (“permanent” arrays are not automatically saved into savegames)</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">void set_array(int arrayID, mixed key, mixed value)</code>: <ul> <li>sets array value</li> <li>if used on list, “key” must be numeric and within valid index range (0..size-1)</li> <li>if used on map, key can be of any type</li> <li>to “unset” a value from map, just set it to zero (0) <ul> <li>NOTE: to add a value of 0 for the key, use the float value of 0.0</li> </ul> </li> <li>this works exactly like statement: <code class="language-plaintext highlighter-rouge">arrayID[key] := value;</code></li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">mixed get_array(int arrayID, mixed key)</code>: <ul> <li>returns array value by key or index</li> <li>if key doesnt exist or index is not in valid range, returns 0</li> <li>works exactly like expression: <code class="language-plaintext highlighter-rouge">(arrayID[key])</code></li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">void resize_array(int arrayID, int size)</code>: <ul> <li>changes array size</li> <li>applicable to maps too, but only to reduce elements</li> <li>there are number of special negative values of “size” which perform various operations on the array, use macros <code class="language-plaintext highlighter-rouge">sort_array</code>, <code class="language-plaintext highlighter-rouge">sort_array_reverse</code>, <code class="language-plaintext highlighter-rouge">reverse_array</code>, <code class="language-plaintext highlighter-rouge">shuffle_array</code> from <strong>sfall.h</strong> header</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">void free_array(int arrayID)</code>: <ul> <li>deletes any array</li> <li>if array was “saved”, it will be removed from a savegame</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">mixed scan_array(int arrayID, mixed value)</code>: <ul> <li>searches for a first occurrence of given value inside given array</li> <li>if value is found, returns its index (for lists) or key (for maps)</li> <li>if value is not found, returns -1 (be careful, as -1 can be a valid key for a map)</li> </ul> </li> <li><code class="language-plaintext highlighter-rouge">int len_array(int arrayID)</code>: <ul> <li>returns number of elements or key=&gt;value pairs in a given array</li> <li>if array is not found