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
Next revisionBoth sides next revision
new:array [2018/02/20 23:43] korshunnew:array [2018/02/21 13:56] 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.</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.txt · Last modified: 2018/02/21 13:57 by korshun