408 lines
9.3 KiB
GDScript
408 lines
9.3 KiB
GDScript
class_name Random
|
|
|
|
static var _arrayFloatHelper: Array[float] = []
|
|
|
|
var initialSeed: int = 1
|
|
var _hasFloatNormalSpare: bool = false
|
|
var _floatNormalRand1: float = 0.0
|
|
var _floatNormalRand2: float = 0.0
|
|
var _twoPI: float = PI * 2
|
|
var _floatNormalRho: float = 0.0
|
|
var internalSeed: float = 1.0
|
|
|
|
func _init(InitialSeed = null) -> void:
|
|
if (InitialSeed != null):
|
|
var NewSeed: int = InitialSeed
|
|
var tempNumber
|
|
if (NewSeed < 1):
|
|
tempNumber = 1
|
|
else:
|
|
tempNumber = NewSeed
|
|
var lowerBound: float = tempNumber
|
|
var tempNumber1
|
|
if (lowerBound > 2147483646):
|
|
tempNumber1 = 2147483646
|
|
else:
|
|
tempNumber1 = lowerBound
|
|
var NewSeed2: int = int(tempNumber1)
|
|
var tempNumber2
|
|
if (NewSeed2 < 1):
|
|
tempNumber2 = 1
|
|
else:
|
|
tempNumber2 = NewSeed2
|
|
var lowerBound2: float = tempNumber2
|
|
if true:
|
|
var tempNumber3
|
|
if (lowerBound2 > 2147483646):
|
|
tempNumber3 = 2147483646
|
|
else:
|
|
tempNumber3 = lowerBound2
|
|
self.internalSeed = int(tempNumber3)
|
|
self.initialSeed = int(self.internalSeed)
|
|
else:
|
|
var Value: int = int(randf() * 2147483647)
|
|
var tempNumber3
|
|
if (Value < 1):
|
|
tempNumber3 = 1
|
|
else:
|
|
tempNumber3 = Value
|
|
var lowerBound: float = tempNumber3
|
|
var tempNumber4
|
|
if (lowerBound > 2147483646):
|
|
tempNumber4 = 2147483646
|
|
else:
|
|
tempNumber4 = lowerBound
|
|
var NewSeed: int = int(tempNumber4)
|
|
var tempNumber5
|
|
if (NewSeed < 1):
|
|
tempNumber5 = 1
|
|
else:
|
|
tempNumber5 = NewSeed
|
|
var lowerBound2: float = tempNumber5
|
|
var tempNumber6
|
|
if (lowerBound2 > 2147483646):
|
|
tempNumber6 = 2147483646
|
|
else:
|
|
tempNumber6 = lowerBound2
|
|
var NewSeed2: int = int(tempNumber6)
|
|
var tempNumber7
|
|
if (NewSeed2 < 1):
|
|
tempNumber7 = 1
|
|
else:
|
|
tempNumber7 = NewSeed2
|
|
var lowerBound3: float = tempNumber7
|
|
if true:
|
|
var tempNumber
|
|
if (lowerBound3 > 2147483646):
|
|
tempNumber = 2147483646
|
|
else:
|
|
tempNumber = lowerBound3
|
|
self.internalSeed = int(tempNumber)
|
|
self.initialSeed = int(self.internalSeed)
|
|
|
|
func resetInitialSeed() -> int:
|
|
var tempNumber
|
|
|
|
if true:
|
|
var Value: int = int(randf() * 2147483647)
|
|
var tempNumber1
|
|
if true:
|
|
var tempNumber2
|
|
if (Value < 1):
|
|
tempNumber2 = 1
|
|
else:
|
|
tempNumber2 = Value
|
|
var lowerBound: float = tempNumber2
|
|
if (lowerBound > 2147483646):
|
|
tempNumber1 = 2147483646
|
|
else:
|
|
tempNumber1 = lowerBound
|
|
tempNumber = int(tempNumber1)
|
|
|
|
var NewSeed: int = tempNumber
|
|
var tempNumber3
|
|
|
|
if true:
|
|
var tempNumber4
|
|
if (NewSeed < 1):
|
|
tempNumber4 = 1
|
|
else:
|
|
tempNumber4 = NewSeed
|
|
var lowerBound: float = tempNumber4
|
|
if (lowerBound > 2147483646):
|
|
tempNumber3 = 2147483646
|
|
else:
|
|
tempNumber3 = lowerBound
|
|
|
|
var NewSeed2: int = int(tempNumber3)
|
|
|
|
if true:
|
|
var tempNumber2
|
|
if true:
|
|
var tempNumber1
|
|
if (NewSeed2 < 1):
|
|
tempNumber1 = 1
|
|
else:
|
|
tempNumber1 = NewSeed2
|
|
var lowerBound: float = tempNumber1
|
|
if (lowerBound > 2147483646):
|
|
tempNumber2 = 2147483646
|
|
else:
|
|
tempNumber2 = lowerBound
|
|
self.internalSeed = int(tempNumber2)
|
|
|
|
var tempRight: int = int(self.internalSeed)
|
|
|
|
self.initialSeed = tempRight
|
|
|
|
return self.initialSeed
|
|
|
|
func _int(Min: int = 0, Max: int = 2147483647, Excludes = null) -> int:
|
|
if (Min == 0 && Max == 2147483647 && Excludes == null):
|
|
var tempNumber
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempNumber = self.internalSeed
|
|
return int(tempNumber)
|
|
else:
|
|
if (Min == Max):
|
|
return Min
|
|
else:
|
|
if (Min > Max):
|
|
Min = Min + Max
|
|
Max = Min - Max
|
|
Min = Min - Max
|
|
if (Excludes == null):
|
|
var tempResult
|
|
if true:
|
|
var tempLeft
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft = self.internalSeed
|
|
var v: float = Min + tempLeft / 2147483647 * (Max - Min + 1)
|
|
tempResult = int(floor(v))
|
|
return tempResult
|
|
else:
|
|
var result: int = 0
|
|
while true:
|
|
var tempRight
|
|
if true:
|
|
var tempLeft1
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft1 = self.internalSeed
|
|
var v: float = Min + tempLeft1 / 2147483647 * (Max - Min + 1)
|
|
tempRight = int(floor(v))
|
|
result = tempRight
|
|
if !(Excludes.find(result) >= 0):
|
|
break
|
|
return result
|
|
|
|
func _float(Min: float = 0, Max: float = 1, Excludes = null) -> float:
|
|
var result: float = 0
|
|
|
|
if (Min == 0 && Max == 1 && Excludes == null):
|
|
var tempLeft
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft = self.internalSeed
|
|
return tempLeft / 2147483647
|
|
else:
|
|
if (Min == Max):
|
|
result = Min
|
|
else:
|
|
if (Min > Max):
|
|
Min = Min + Max
|
|
Max = Min - Max
|
|
Min = Min - Max
|
|
if (Excludes == null):
|
|
var tempLeft1
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft1 = self.internalSeed
|
|
result = Min + tempLeft1 / 2147483647 * (Max - Min)
|
|
else:
|
|
while true:
|
|
var tempLeft2
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft2 = self.internalSeed
|
|
result = Min + tempLeft2 / 2147483647 * (Max - Min)
|
|
if !(Excludes.find(result) >= 0):
|
|
break
|
|
|
|
return result
|
|
|
|
func floatNormal(Mean: float = 0, StdDev: float = 1) -> float:
|
|
if (self._hasFloatNormalSpare):
|
|
self._hasFloatNormalSpare = false
|
|
var scale: float = StdDev * self._floatNormalRho
|
|
return Mean + scale * self._floatNormalRand2
|
|
|
|
self._hasFloatNormalSpare = true
|
|
|
|
var tempLeft
|
|
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft = self.internalSeed
|
|
|
|
var theta: float = self._twoPI * (tempLeft / 2147483647)
|
|
var tempLeft1
|
|
|
|
if true:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
tempLeft1 = self.internalSeed
|
|
|
|
self._floatNormalRho = sqrt(-2 * log(1 - tempLeft1 / 2147483647))
|
|
|
|
var scale: float = StdDev * self._floatNormalRho
|
|
|
|
self._floatNormalRand1 = cos(theta)
|
|
self._floatNormalRand2 = sin(theta)
|
|
|
|
return Mean + scale * self._floatNormalRand1
|
|
|
|
func _bool(Chance: float = 50) -> bool:
|
|
return self._float(0, 100, null) < Chance
|
|
|
|
func _sign(Chance: float = 50) -> int:
|
|
var tempResult
|
|
|
|
if (self._float(0, 100, null) < Chance):
|
|
tempResult = 1
|
|
else:
|
|
tempResult = -1
|
|
|
|
return tempResult
|
|
|
|
func weightedPick(WeightsArray: Array[float]) -> int:
|
|
var totalWeight: float = 0
|
|
var pick: int = 0
|
|
|
|
if true:
|
|
var _g: int = 0
|
|
while (_g < WeightsArray.size()):
|
|
var i: float = WeightsArray[_g]
|
|
_g += 1
|
|
totalWeight += i
|
|
|
|
totalWeight = self._float(0, totalWeight, null)
|
|
|
|
if true:
|
|
var _g: int = 0
|
|
var _g1: int = WeightsArray.size()
|
|
while (_g < _g1):
|
|
var tempNumber
|
|
if true:
|
|
_g += 1
|
|
tempNumber = _g - 1
|
|
var i: int = tempNumber
|
|
if (totalWeight < WeightsArray[i]):
|
|
pick = i
|
|
break
|
|
totalWeight -= WeightsArray[i]
|
|
|
|
return pick
|
|
|
|
func generate() -> float:
|
|
var intermediate: float = self.internalSeed * 48271.0
|
|
var intermediate2: int = int(intermediate)
|
|
|
|
self.internalSeed = intermediate2 % 2147483647
|
|
|
|
return self.internalSeed
|
|
|
|
func set_initialSeed(NewSeed: int) -> int:
|
|
var tempNumber
|
|
|
|
if true:
|
|
var tempNumber1
|
|
if (NewSeed < 1):
|
|
tempNumber1 = 1
|
|
else:
|
|
tempNumber1 = NewSeed
|
|
var lowerBound: float = tempNumber1
|
|
if (lowerBound > 2147483646):
|
|
tempNumber = 2147483646
|
|
else:
|
|
tempNumber = lowerBound
|
|
|
|
var NewSeed2: int = int(tempNumber)
|
|
var tempNumber2
|
|
|
|
if true:
|
|
var tempNumber1
|
|
if (NewSeed2 < 1):
|
|
tempNumber1 = 1
|
|
else:
|
|
tempNumber1 = NewSeed2
|
|
var lowerBound: float = tempNumber1
|
|
if (lowerBound > 2147483646):
|
|
tempNumber2 = 2147483646
|
|
else:
|
|
tempNumber2 = lowerBound
|
|
|
|
self.internalSeed = int(tempNumber2)
|
|
|
|
var tempRight: int = int(self.internalSeed)
|
|
|
|
self.initialSeed = tempRight
|
|
|
|
return self.initialSeed
|
|
|
|
func get_currentSeed() -> int:
|
|
return int(self.internalSeed)
|
|
|
|
func set_currentSeed(NewSeed: int) -> int:
|
|
var tempNumber
|
|
var tempNumber1
|
|
|
|
if (NewSeed < 1):
|
|
tempNumber1 = 1
|
|
else:
|
|
tempNumber1 = NewSeed
|
|
|
|
var lowerBound: float = tempNumber1
|
|
|
|
if (lowerBound > 2147483646):
|
|
tempNumber = 2147483646
|
|
else:
|
|
tempNumber = lowerBound
|
|
|
|
self.internalSeed = int(tempNumber)
|
|
|
|
return int(self.internalSeed)
|
|
|
|
static func rangeBound(Value: int) -> int:
|
|
var tempNumber
|
|
var tempNumber1
|
|
|
|
if (Value < 1):
|
|
tempNumber1 = 1
|
|
else:
|
|
tempNumber1 = Value
|
|
|
|
var lowerBound: float = tempNumber1
|
|
|
|
if (lowerBound > 2147483646):
|
|
tempNumber = 2147483646
|
|
else:
|
|
tempNumber = lowerBound
|
|
|
|
return int(tempNumber)
|
|
|
|
static func bound(Value: float, Min = null, Max = null) -> float:
|
|
var tempNumber
|
|
|
|
if (Min != null && Value < Min):
|
|
tempNumber = Min
|
|
else:
|
|
tempNumber = Value
|
|
|
|
var lowerBound: float = tempNumber
|
|
var tempResult
|
|
|
|
if (Max != null && lowerBound > Max):
|
|
tempResult = Max
|
|
else:
|
|
tempResult = lowerBound
|
|
|
|
return tempResult
|