Files
st/include/System/Random.hpp
T
Yanis 3ab5bf6de9 Misc things (#30)
* match random init

* UnkSystem2_UnkSubSystem1_Derived1 related docs

* match func_ov031_020e9108 and FileSelect_UnkClass7::vfunc_00

* improve func_02017ea4

* rename next functions

* actor rupee improvements

* update gitignore

* fix broken match

* fileselectmain improvements

* fix broken match

* more misc progress

* fix build issues

* fix regressions
2026-02-03 19:59:20 +01:00

68 lines
1.4 KiB
C++

#pragma once
#include "global.h"
#include "nitro/math.h"
#include "types.h"
struct Random {
/* 00 */ u16 mRandomValue[4];
/* 08 */ u64 mFactor;
/* 10 */ u64 mAddend;
/* 18 */
/**
* @brief Gets the seed's value
*/
u64 GetRandomValue() {
return *(u64 *) this->mRandomValue;
}
/**
* @brief Updates the seed's value
*/
void UpdateRandomValue() {
*(u64 *) this->mRandomValue = this->mAddend + (this->mFactor * this->GetRandomValue());
}
/**
* @brief Generates a random number as a u16
*/
u16 Next16() {
this->UpdateRandomValue();
return this->GetRandomValue() >> 48;
}
/**
* @brief Generates a random number from 0 (inclusive) to `max` (exclusive) as a u32
*/
u32 Next32(u64 min, u64 max) {
this->UpdateRandomValue();
return (((this->GetRandomValue() >> 32) * (max - min)) >> 32) + min;
}
u32 ConditionalNext32(u32 value) {
this->UpdateRandomValue();
u64 result = this->GetRandomValue() >> 32;
if (value != 0) {
result = (result * value) >> 32;
}
return result;
}
Vec2us &NextPos(u16 xMax, u16 yMax) {
Vec2us pos;
pos.x = this->Next32(0, xMax);
pos.y = this->Next32(0, yMax);
return pos;
}
void Init();
};
extern Random gRandom;