From 3840fe22259022e6f02f9bb767bb2802de0325a3 Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Sat, 25 Jan 2020 18:03:12 -0300 Subject: *Cough cough* I present to yall, Tolchi Special Requests system. The latest, newest, most powerful money sink on the whole game. It beats lottery with so much grace and efficiency! Dear Saulc. --- npc/functions/array.txt | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) (limited to 'npc/functions/array.txt') diff --git a/npc/functions/array.txt b/npc/functions/array.txt index ca2d7fbd6..1bc54610d 100644 --- a/npc/functions/array.txt +++ b/npc/functions/array.txt @@ -447,3 +447,51 @@ function script array_highest { return .@idx; } +// relative_array_random() +// returns a random entry from the array, by relative probability +// the first key of the array should be 0 and every entries are a tuple +// of [value, probability] + +function script relative_array_random { + .@is_str = getdatatype(getarg(0)) & DATATYPE_STR; + .@total_prob = getelementofarray(getarg(0), 0); + .@initial_index = getarrayindex(getarg(0)); + .@initial_index = .@initial_index ? .@initial_index : 1; + freeloop(true); + + if (.@total_prob < 1 || getarg(1, false)) + { + // first calculation, or forced re-calculation + .@total_prob = 0; + .@size = getarraysize(getarg(0)); + + for (.@i = .@initial_index + 1; .@i < .@size; .@i += 2) { + if (.@is_str) { + .@total_prob += max(1, atoi(getelementofarray(getarg(0), .@i))); + } else { + .@total_prob += max(1, getelementofarray(getarg(0), .@i)); + } + } + + // we cache on the first key + set(getelementofarray(getarg(0), 0), .@total_prob); + } + + .@target_sum = rand(0, .@total_prob); + + for (.@i = .@initial_index; .@sum < .@target_sum; .@i += 2) { + if (.@is_str) { + .@sum += atoi(getelementofarray(getarg(0), .@i + 1)); + } else { + .@sum += getelementofarray(getarg(0), .@i + 1); + } + + if (.@sum >= .@target_sum) { + break; + } + } + + freeloop(false); + return getelementofarray(getarg(0), .@i); +} + -- cgit v1.2.3-60-g2f50