ACSUtils Wiki

An ACS library for ZDoom-based ports

User Tools

Site Tools


new:array

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
new:array [2018/02/20 23:46]
korshun
new:array [2018/02/21 13:57] (current)
korshun
Line 2: Line 2:
  
 <note warning>These functions will be added in ACSUtils 1.8.0</note> <note warning>These functions will be added in ACSUtils 1.8.0</note>
 +
 +Array sorting and shuffling functions use script names as callbacks.
  
 ===== SortArray ===== ===== SortArray =====
Line 11: Line 13:
   * ''script "lt" (int a, int b)'' must return the result of ''array[a] < array[b]'' using [[zdoom>SetReturnValue]]. If you return ''array[a] > array[b]'', sorting order is reversed.   * ''script "lt" (int a, int b)'' must return the result of ''array[a] < array[b]'' using [[zdoom>SetReturnValue]]. If you return ''array[a] > array[b]'', sorting order is reversed.
   * ''script "swap" (int a, int b)'' must swap ''array[a]'' with ''array[b]''.   * ''script "swap" (int a, int b)'' must swap ''array[a]'' with ''array[b]''.
 +
 +The sorted array may actually be an array of objects with multiple fields. ''lt'' can implement multi-field sorting. ''swap'' can swap all fields in the two array cells.
 +
 +<note important>''SortArray'' can sort up to ~2000 elements before hitting ZDoom's 2 million instructions per tic runaway limit. Maximum element count may depend on callback complexity and the initial state of the array.</note>
  
 Example: sorting a simple array of numbers: Example: sorting a simple array of numbers:
Line 38: Line 44:
 </code> </code>
  
-Example: making a scoreboard sorted by score:+Example: making a scoreboard sorted by score (uses [[swap|swap()]] for readability):
  
 <code> <code>
Line 49: Line 55:
     if (PlayerScores[a] == PlayerScores[b])     if (PlayerScores[a] == PlayerScores[b])
     {     {
-        // Scores are the same, sort by name then+        // Scores are same, sort by name then
         if (StrCmp(PlayerName(PlayerNumbers[a]), PlayerName(PlayerNumbers[b]) == -1);         if (StrCmp(PlayerName(PlayerNumbers[a]), PlayerName(PlayerNumbers[b]) == -1);
             return true;             return true;
Line 71: Line 77:
 function void BuildScoreboard(void) function void BuildScoreboard(void)
 { {
 +    // Clear scoreboard
 +    NumPlayers = 0;
 +
     // Fill scoreboard without sorting     // Fill scoreboard without sorting
     for (int player = 0; player < MAX_PLAYERS; player++)     for (int player = 0; player < MAX_PLAYERS; player++)
Line 85: Line 94:
 } }
 </code> </code>
 +
 +===== ShuffleArray =====
 +
 +''void ShuffleArray(int begin, int end, str swap)''
 +
 +Randomly reorders elements of an array with indices in range [begin, end). ''swap'' is the name of a script ''script (int a, int b)'' that must swap ''array[a]'' with ''array[b]''.
 +
 +Example:
 +
 +<code>
 +int array[10];
 +
 +script "swap" (int a, int b)
 +{
 +    int temp = array[a];
 +    array[a] = array[b];
 +    array[b] = temp;
 +}
 +
 +function void ShuffleTheArray(void)
 +{
 +    ShuffleArray(0, 10, "swap");
 +}
 +</code>
 +
 +
new/array.1519163214.txt.gz ยท Last modified: 2018/02/20 23:46 by korshun