Fix: [Script] ScriptBase::Rand() return value was between -MIN(int32) and MAX(int32) (#10443)

Also ensure the parameters for ScriptBase::RandRange() and ScriptBase::Chance() are in [0-MAX(uint32)] range
pull/484/head
Loïc Guilloux 1 year ago committed by GitHub
parent 7bd475b86c
commit 6b99b6672e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -88,9 +88,9 @@
abs( 21): 21
--AIBase--
Rand(): -2062310602
Rand(): -1780331126
Rand(): -397928569
Rand(): 2232656694
Rand(): 2514636170
Rand(): 3897038727
RandRange(0): 0
RandRange(0): 0
RandRange(0): 0
@ -421,36 +421,36 @@
1099 => 46158
Randomize ListDump:
1 => 688298322
2 => -1709546982
2 => 2585420314
1000 => 1701392078
1001 => -1630848421
1002 => -886500935
1003 => -196324972
1004 => -436037402
1005 => -520341784
1006 => -1485224804
1007 => -311036236
1008 => -1503442439
1009 => -110945695
1010 => -82825175
1001 => 2664118875
1002 => 3408466361
1003 => 4098642324
1004 => 3858929894
1005 => 3774625512
1006 => 2809742492
1007 => 3983931060
1008 => 2791524857
1009 => 4184021601
1010 => 4212142121
1011 => 46859773
1012 => -1199223018
1013 => -1190555925
1012 => 3095744278
1013 => 3104411371
1014 => 326384434
1015 => 1486817960
1016 => -1411425597
1017 => -508426854
1016 => 2883541699
1017 => 3786540442
1018 => 820019294
1019 => 710762995
1020 => -760867032
1021 => -709611146
1020 => 3534100264
1021 => 3585356150
1022 => 732190215
1023 => 236336673
1024 => 740596257
1025 => 1135321785
1026 => 2067474156
1027 => -1395683607
1028 => -240528699
1027 => 2899283689
1028 => 4054438597
1029 => 928616892
1030 => 1712486685
1031 => 1994118287
@ -462,46 +462,46 @@
1037 => 1359697121
1038 => 1888433963
1039 => 941623020
1040 => -1925663292
1041 => -771540264
1042 => -1058341359
1040 => 2369304004
1041 => 3523427032
1042 => 3236625937
1043 => 182127597
1044 => 646955927
1045 => -1424621714
1045 => 2870345582
1046 => 623062612
1047 => -1986955586
1048 => -1268826980
1049 => -456776220
1051 => -1112555329
1052 => -1532134052
1047 => 2308011710
1048 => 3026140316
1049 => 3838191076
1051 => 3182411967
1052 => 2762833244
1053 => 1960404034
1054 => 1573325453
1055 => -316619303
1055 => 3978347993
1056 => 699712177
1057 => 863274966
1058 => 1728276475
1059 => -246695889
1059 => 4048271407
1060 => 1919485436
1061 => 111273464
1062 => 125435213
1063 => 155132602
1064 => -171674076
1064 => 4123293220
1065 => 655046914
1066 => 1577399562
1067 => 1028818150
1068 => 447058239
1069 => -1057920269
1070 => -1326215323
1071 => -198688588
1069 => 3237047027
1070 => 2968751973
1071 => 4096278708
1072 => 1523643051
1073 => 231373233
1074 => 1121759962
1075 => 1449439846
1076 => -1615270753
1077 => -1509293864
1076 => 2679696543
1077 => 2785673432
1078 => 2116903943
1079 => 672822173
1080 => -969573911
1080 => 3325393385
1081 => 1589904755
1082 => 1148782015
1083 => 663503316
@ -510,54 +510,54 @@
1086 => 402172048
1087 => 1812250453
1088 => 667300501
1089 => -1838825777
1090 => -856474776
1089 => 2456141519
1090 => 3438492520
1091 => 420696035
1092 => 2131427774
1093 => -435303548
1094 => -160883878
1093 => 3859663748
1094 => 4134083418
1095 => 1969629634
1096 => -555794155
1097 => -835119691
1098 => -1460907909
1099 => -1146924084
1096 => 3739173141
1097 => 3459847605
1098 => 2834059387
1099 => 3148043212
KeepTop(10):
1 => 688298322
2 => -1709546982
2 => 2585420314
1000 => 1701392078
1001 => -1630848421
1002 => -886500935
1003 => -196324972
1004 => -436037402
1005 => -520341784
1006 => -1485224804
1007 => -311036236
1001 => 2664118875
1002 => 3408466361
1003 => 4098642324
1004 => 3858929894
1005 => 3774625512
1006 => 2809742492
1007 => 3983931060
KeepBottom(8):
1000 => 1701392078
1001 => -1630848421
1002 => -886500935
1003 => -196324972
1004 => -436037402
1005 => -520341784
1006 => -1485224804
1007 => -311036236
1001 => 2664118875
1002 => 3408466361
1003 => 4098642324
1004 => 3858929894
1005 => 3774625512
1006 => 2809742492
1007 => 3983931060
RemoveBottom(2):
1000 => 1701392078
1001 => -1630848421
1002 => -886500935
1003 => -196324972
1004 => -436037402
1005 => -520341784
1001 => 2664118875
1002 => 3408466361
1003 => 4098642324
1004 => 3858929894
1005 => 3774625512
RemoveTop(2):
1002 => -886500935
1003 => -196324972
1004 => -436037402
1005 => -520341784
1002 => 3408466361
1003 => 4098642324
1004 => 3858929894
1005 => 3774625512
RemoveList({1003, 1004}):
1002 => -886500935
1005 => -520341784
1002 => 3408466361
1005 => 3774625512
KeepList({1003, 1004, 1005}):
1005 => -520341784
1005 => 3774625512
AddList({1005, 4000, 4001, 4002}):
1005 => 1005
4000 => 8000

@ -13,33 +13,36 @@
#include "../../safeguards.h"
/* static */ uint32 ScriptBase::Rand()
/* static */ SQInteger ScriptBase::Rand()
{
return ScriptObject::GetRandomizer().Next();
}
/* static */ uint32 ScriptBase::RandItem(int unused_param)
/* static */ SQInteger ScriptBase::RandItem(SQInteger unused_param)
{
return ScriptBase::Rand();
}
/* static */ uint ScriptBase::RandRange(uint max)
/* static */ SQInteger ScriptBase::RandRange(SQInteger max)
{
max = Clamp<SQInteger>(max, 0, UINT32_MAX);
return ScriptObject::GetRandomizer().Next(max);
}
/* static */ uint32 ScriptBase::RandRangeItem(int unused_param, uint max)
/* static */ SQInteger ScriptBase::RandRangeItem(SQInteger unused_param, SQInteger max)
{
return ScriptBase::RandRange(max);
}
/* static */ bool ScriptBase::Chance(uint out, uint max)
/* static */ bool ScriptBase::Chance(SQInteger out, SQInteger max)
{
out = Clamp<SQInteger>(out, 0, UINT32_MAX);
max = Clamp<SQInteger>(max, 0, UINT32_MAX);
EnforcePrecondition(false, out <= max);
return ScriptBase::RandRange(max) < out;
}
/* static */ bool ScriptBase::ChanceItem(int unused_param, uint out, uint max)
/* static */ bool ScriptBase::ChanceItem(SQInteger unused_param, SQInteger out, SQInteger max)
{
return ScriptBase::Chance(out, max);
}

@ -25,50 +25,56 @@ public:
* Get a random value.
* @return A random value between 0 and MAX(uint32).
*/
static uint32 Rand();
static SQInteger Rand();
/**
* Get a random value.
* @param unused_param This parameter is not used, but is needed to work with lists.
* @return A random value between 0 and MAX(uint32).
*/
static uint32 RandItem(int unused_param);
static SQInteger RandItem(SQInteger unused_param);
/**
* Get a random value in a range.
* @param max The first number this function will never return (the maximum it returns is max - 1).
* The value will be clamped to 0 .. MAX(uint32).
* @return A random value between 0 .. max - 1.
*/
static uint RandRange(uint max);
static SQInteger RandRange(SQInteger max);
/**
* Get a random value in a range.
* @param unused_param This parameter is not used, but is needed to work with lists.
* @param max The first number this function will never return (the maximum it returns is max - 1).
* The value will be clamped to 0 .. MAX(uint32).
* @return A random value between 0 .. max - 1.
*/
static uint RandRangeItem(int unused_param, uint max);
static SQInteger RandRangeItem(SQInteger unused_param, SQInteger max);
/**
* Returns approximately 'out' times true when called 'max' times.
* After all, it is a random function.
* @param out How many times it should return true.
* The value will be clamped to 0 .. MAX(uint32).
* @param max Out of this many times.
* The value will be clamped to 0 .. MAX(uint32).
* @pre \a out is at most equal to \a max.
* @return True if the chance worked out.
*/
static bool Chance(uint out, uint max);
static bool Chance(SQInteger out, SQInteger max);
/**
* Returns approximately 'out' times true when called 'max' times.
* After all, it is a random function.
* @param unused_param This parameter is not used, but is needed to work with lists.
* @param out How many times it should return true.
* The value will be clamped to 0 .. MAX(uint32).
* @param max Out of this many times.
* The value will be clamped to 0 .. MAX(uint32).
* @pre \a out is at most equal to \a max.
* @return True if the chance worked out.
*/
static bool ChanceItem(int unused_param, uint out, uint max);
static bool ChanceItem(SQInteger unused_param, SQInteger out, SQInteger max);
};
#endif /* SCRIPT_BASE_HPP */

Loading…
Cancel
Save