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 revisionPrevious revision
Next revision
Previous revision
new:array [2018/02/20 23:43] korshunnew: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>
-int Players[MAX_PLAYERS];+int PlayerNumbers[MAX_PLAYERS];
 int PlayerScores[MAX_PLAYERS]; int PlayerScores[MAX_PLAYERS];
 int NumPlayers; int NumPlayers;
Line 47: Line 53:
 script "lt" (int a, int b) script "lt" (int a, int b)
 { {
-    if (PlayerScores[a] PlayerScores[b]) +    if (PlayerScores[a] == PlayerScores[b]) 
-        return true; +    { 
-         +        // Scores are same, sort by name then 
-    // Scores are the same, sort by name then +        if (StrCmp(PlayerName(PlayerNumbers[a]), PlayerName(PlayerNumbers[b]) == -1); 
-    if (StrCmp(PlayerName(Players[a]), PlayerName(Players[b]) == -1); +            return true; 
-        return true;+    }
                  
-    return false;+    // Using > instead of < reverses sorting by score 
 +    return PlayerScores[a] > PlayerScores[b];
 } }
  
 script "swap" (int a, int b) script "swap" (int a, int b)
 { {
-    swap(Players[a], Players[b]);+    swap(PlayerNumbers[a], PlayerNumbers[b]);
     Players[a] = r1;     Players[a] = r1;
     Players[b] = r2;     Players[b] = r2;
Line 70: 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 75: Line 85:
         if (PlayerInGame(player))         if (PlayerInGame(player))
             continue;             continue;
-        Players[NumPlayers] = player;+        PlayerNumbers[NumPlayers] = player;
         PlayerScores[NumPlayers] = GET_PLAYER_SCORE(player);         PlayerScores[NumPlayers] = GET_PLAYER_SCORE(player);
         NumPlayers++;         NumPlayers++;
Line 84: 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.1519163024.txt.gz · Last modified: 2018/02/20 23:43 by korshun