diff --git a/src/map/script.cpp b/src/map/script.cpp index a9e632dd1b..8db855f8e5 100644 --- a/src/map/script.cpp +++ b/src/map/script.cpp @@ -5566,33 +5566,51 @@ BUILDIN_FUNC(return) return SCRIPT_CMD_SUCCESS; } -/// Returns a random number from 0 to -1. -/// Or returns a random number from to . -/// If is greater than , their numbers are switched. -/// rand() -> -/// rand(,) -> +/// Returns a random number. +/// rand() -> in the mathematical range [0, ] +/// rand(,) -> in the mathematical range [, ] BUILDIN_FUNC(rand) { - int range; - int min; + int64 minimum; + int64 maximum; - if( script_hasdata(st,3) ) - {// min,max - int max = script_getnum(st,3); - min = script_getnum(st,2); - if( max < min ) - SWAP(min, max); - range = max; + // min,max + if( script_hasdata( st, 3 ) ){ + minimum = script_getnum64( st, 2 ); + maximum = script_getnum64( st, 3 ); + + if( minimum > maximum ){ + ShowWarning( "buildin_rand: minimum (%" PRId64 ") is bigger than maximum (%" PRId64 ").\n", minimum, maximum ); + // rnd_value already fixes this by swapping minimum and maximum automatically + } + // range + }else{ + minimum = 0; + maximum = script_getnum64( st, 2 ); + + if( maximum < 0 ){ + ShowError( "buildin_rand: range (%" PRId64 ") is negative.\n", maximum ); + st->state = END; + return SCRIPT_CMD_FAILURE; + } + + // The range version is exclusive maximum + maximum -= 1; + + if( maximum < 1 ){ + ShowError( "buildin_rand: range (%" PRId64 ") is too small. No randomness possible.\n", maximum ); + st->state = END; + return SCRIPT_CMD_FAILURE; + } } - else - {// range - min = 0; - range = script_getnum( st, 2 ) - 1; + + if( minimum == maximum ){ + ShowError( "buildin_rand: minimum (%" PRId64 ") and maximum (%" PRId64 ") are equal. No randomness possible.\n", minimum, maximum ); + st->state = END; + return SCRIPT_CMD_FAILURE; } - if( range <= 1 ) - script_pushint(st, min); - else - script_pushint( st, rnd_value( min, range ) ); + + script_pushint64( st, rnd_value( minimum, maximum ) ); return SCRIPT_CMD_SUCCESS; }