====== Array sorting and shuffling ======
These functions will be added in ACSUtils 1.8.0
Array sorting and shuffling functions use script names as callbacks.
===== SortArray =====
''void SortArray(int begin, int end, str lt, str swap)''
Sorts an array with indices in range [begin, end). ''lt'' and ''swap'' are names of scripts that the function will call.
* ''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]''.
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.
''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.
Example: sorting a simple array of numbers:
int array[10];
script "compare_two_elements" (int a, int b)
{
SetResultValue(array[a] < array[b]);
}
script "swap_two_elements" (int a, int b)
{
int temp = array[a];
array[a] = array[b];
array[b] = temp;
}
function void SortTheArray(void)
{
SortArray(0, 10, "compare_two_elements", "swap_two_elements");
// You can also sort sub-arrays:
SortArray(3, 8, "compare_two_elements", "swap_two_elements");
}
Example: making a scoreboard sorted by score (uses [[swap|swap()]] for readability):
int PlayerNumbers[MAX_PLAYERS];
int PlayerScores[MAX_PLAYERS];
int NumPlayers;
script "lt" (int a, int b)
{
if (PlayerScores[a] == PlayerScores[b])
{
// Scores are same, sort by name then
if (StrCmp(PlayerName(PlayerNumbers[a]), PlayerName(PlayerNumbers[b]) == -1);
return true;
}
// Using > instead of < reverses sorting by score
return PlayerScores[a] > PlayerScores[b];
}
script "swap" (int a, int b)
{
swap(PlayerNumbers[a], PlayerNumbers[b]);
Players[a] = r1;
Players[b] = r2;
swap(PlayerScores[a], PlayerScores[b]);
PlayerScores[a] = r1;
PlayerScores[b] = r2;
}
function void BuildScoreboard(void)
{
// Clear scoreboard
NumPlayers = 0;
// Fill scoreboard without sorting
for (int player = 0; player < MAX_PLAYERS; player++)
{
if (PlayerInGame(player))
continue;
PlayerNumbers[NumPlayers] = player;
PlayerScores[NumPlayers] = GET_PLAYER_SCORE(player);
NumPlayers++;
}
// Sort it by score
SortArray(0, NumPlayers, "lt", "swap");
}
===== 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:
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");
}