Hi! I ended up needing a way to sort large, ever-growing arrays alphabetically without compromising the original array’s indexes. Regardless, if anyone ever finds the need to sort their own arrays, here’s my solutions:
Prereqs:
(Return var for mapping)
*temp/*create returnvar Z
(Array to sort)
*temp_array/*create_array source_array X Y
*temp/*create source_array_max X
(Array to map character values, this is just for the gosub to work)
*temp_array/*create_array intermediate_array X "0."
(Array to contain sorted values)
*temp_array/*create_array target_array X ""
Make sure X is all the same.
To use:
Place wherever and call through:
*gosub(_scene) (scene) alphabetize "name of source array" "name of intermediate array" "name of target array"
The Code
*label alphabetize
*params source_array intermediate_array target_array
*set count 0
*label loop1
*set count +1
*if count <= {source_array&"_max"}
*if ({source_array&"_${count}"} = 0) or ({source_array&"_${count}"} = "")
*set {intermediate_array&"_${count}"} 1
*goto loop1
*temp len length({source_array&"_${count}"})
*set revar 0
*label loop2
*set revar +1
*if revar <= len
*temp char ({source_array&"_${count}"}#revar)
*gosub map_char (char)
*set {intermediate_array&"_${count}"} &returnvar
*goto loop2
*goto loop1
*set count 0
*label loop3
*set count +1
*if count <= {source_array&"_max"}
*temp current_min {intermediate_array&"_1"}
*temp current_min_index 1
*set revar 0
*label loop4
*set revar +1
*if revar <= {source_array&"_max"}
*if {intermediate_array&"_${revar}"} < current_min
*set current_min_index revar
*set current_min {intermediate_array&"_${revar}"}
*goto loop4
*if current_min != 1
*set {target_array&"_${count}"} {source_array&"_${current_min_index}"}
*set {intermediate_array&"_${current_min_index}"} 1
*goto loop3
*return
*label map_char
*params char
*if (char = "a") or (char = "A")
*set returnvar "01"
*return
*elseif (char = "b") or (char = "B")
*set returnvar "02"
*return
*elseif (char = "c") or (char = "C")
*set returnvar "03"
*return
*elseif (char = "d") or (char = "D")
*set returnvar "04"
*return
*elseif (char = "e") or (char = "E")
*set returnvar "05"
*return
*elseif (char = "f") or (char = "F")
*set returnvar "06"
*return
*elseif (char = "g") or (char = "G")
*set returnvar "07"
*return
*elseif (char = "h") or (char = "H")
*set returnvar "08"
*return
*elseif (char = "i") or (char = "I")
*set returnvar "09"
*return
*elseif (char = "j") or (char = "J")
*set returnvar "10"
*return
*elseif (char = "k") or (char = "K")
*set returnvar "11"
*return
*elseif (char = "l") or (char = "L")
*set returnvar "12"
*return
*elseif (char = "m") or (char = "M")
*set returnvar "13"
*return
*elseif (char = "n") or (char = "N")
*set returnvar "14"
*return
*elseif (char = "o") or (char = "O")
*set returnvar "15"
*return
*elseif (char = "p") or (char = "P")
*set returnvar "16"
*return
*elseif (char = "q") or (char = "Q")
*set returnvar "17"
*return
*elseif (char = "r") or (char = "R")
*set returnvar "18"
*return
*elseif (char = "s") or (char = "S")
*set returnvar "19"
*return
*elseif (char = "t") or (char = "T")
*set returnvar "20"
*return
*elseif (char = "u") or (char = "U")
*set returnvar "21"
*return
*elseif (char = "v") or (char = "V")
*set returnvar "22"
*return
*elseif (char = "w") or (char = "W")
*set returnvar "23"
*return
*elseif (char = "x") or (char = "X")
*set returnvar "24"
*return
*elseif (char = "y") or (char = "Y")
*set returnvar "25"
*return
*elseif (char = "z") or (char = "Z")
*set returnvar "26"
*return
*else
*set returnvar "27"
*return
Example
The three arrays:
*temp_array test_array 15 ""
*set test_array[1] "chrismas"
*set test_array[2] "zipper"
*set test_array[3] "charisma"
*set test_array[4] "xpop"
*set test_array[5] "blue tooth"
*set test_array[6] "blades"
*set test_array[7] "blade"
*set test_array[8] "carumba"
*set test_array[9] "anecdote"
*set test_array[10] "carpool"
*temp test_array_max 15
*temp_array intermediate 15 "0."
*temp intermediate_max 15
*temp_array result 15 ""
*temp result_max 15
Calling the function:
*gosub alphabetize "test_array" "intermediate" "result"
Now result holds the sorted values. Looping through and printing them, for example, would give:
anecdote
blade
blades
blue tooth
carpool
carumba
charisma
chrismas
xpop
zipper
