mirror of
https://github.com/PodeCaradox/GalaxyQuest-SteamFrame.git
synced 2026-10-18 22:01:24 +02:00
The sources of Petari (https://github.com/SMGCommunity/Petari), the Super Mario Galaxy decompilation by the SMGCommunity, at commit 0a5c6608dc3b4c44a9aa68c2535d1793dc565f02, unchanged but for LF line endings: LICENSE (as LICENSE-Petari.txt; CC0 1.0), include/, libs/ and src/. Left out: the game data Petari keeps from the original executable, the error message archive (include/Game/System/ ErrorArchive.hpp) and two tables (src/Game/System/GalaxyID.bcsv and StoryEvent.bcsv); GalaxyQuest's converter takes them from the player's own disc. The port's changes follow in the next commit, so `git diff petari-base -- decomp` shows them. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
374 lines
10 KiB
C++
374 lines
10 KiB
C++
#pragma once
|
|
|
|
#include "Inline.hpp"
|
|
#include <revolution.h>
|
|
|
|
namespace MR {
|
|
/// @brief A contiguous reallocatable array.
|
|
template < class T >
|
|
class AssignableArray {
|
|
public:
|
|
typedef T Item;
|
|
|
|
/// @brief Creates a new `AssignableArray`.
|
|
AssignableArray() {
|
|
mArr = 0;
|
|
mMaxSize = 0;
|
|
}
|
|
|
|
/// @brief Creates a new `AssignableArray`.
|
|
/// @param num The number of elements.
|
|
AssignableArray(s32 num) {
|
|
init(num);
|
|
}
|
|
|
|
/// @brief Destroys the `AssignableArray`.
|
|
~AssignableArray();
|
|
|
|
/// @brief Returns the element at the given position.
|
|
/// @param idx The position of the element.
|
|
/// @return The reference to the element.
|
|
T& operator[](int idx) {
|
|
return mArr[idx];
|
|
}
|
|
|
|
/// @brief Returns the element at the given position.
|
|
/// @param idx The position of the element.
|
|
/// @return The reference to the element.
|
|
const T& operator[](int idx) const {
|
|
return mArr[idx];
|
|
}
|
|
|
|
/// @brief Allocates memory for the array.
|
|
/// @param num The number of elements.
|
|
void init(s32 num) {
|
|
mArr = new T[num];
|
|
mMaxSize = num;
|
|
}
|
|
|
|
/// @brief Returns the number of elements.
|
|
/// @return The number of elements.
|
|
int size() const {
|
|
return mMaxSize;
|
|
}
|
|
|
|
/// @brief Returns an iterator to the first element.
|
|
/// @return The pointer to the first element.
|
|
T* begin() {
|
|
return &mArr[0];
|
|
}
|
|
|
|
/// @brief Returns an iterator to the first element.
|
|
/// @return The pointer to the first element.
|
|
const T* begin() const {
|
|
return &mArr[0];
|
|
}
|
|
|
|
/// @brief Returns an iterator to the reverse first element.
|
|
/// @return The pointer to the reverse first element.
|
|
T* rbegin() {
|
|
return &mArr[mMaxSize - 1];
|
|
}
|
|
|
|
/// @brief Returns an iterator to the reverse first element.
|
|
/// @return The pointer to the reverse first element.
|
|
const T* rbegin() const {
|
|
return &mArr[mMaxSize - 1];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the last element.
|
|
/// @return The pointer past the last element.
|
|
T* end() {
|
|
return &mArr[mMaxSize];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the last element.
|
|
/// @return The pointer past the last element.
|
|
const T* end() const {
|
|
return &mArr[mMaxSize];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the reverse last element.
|
|
/// @return The pointer past the reverse last element.
|
|
T* rend() {
|
|
return &mArr[0] - 1;
|
|
}
|
|
|
|
/// @brief Returns an iterator past the reverse last element.
|
|
/// @return The pointer past the reverse last element.
|
|
const T* rend() const {
|
|
return &mArr[0] - 1;
|
|
}
|
|
|
|
/// @brief The pointer to the array of elements.
|
|
/* 0x0 */ T* mArr;
|
|
|
|
/// @brief The number of elements.
|
|
/* 0x4 */ s32 mMaxSize;
|
|
};
|
|
|
|
/// @brief A contiguous fixed-size array.
|
|
template < class T, int N >
|
|
class FixedArray {
|
|
public:
|
|
typedef T Item;
|
|
template < class X >
|
|
struct RemovePtr {
|
|
typedef X Type;
|
|
};
|
|
template < class X >
|
|
struct RemovePtr< X* > {
|
|
typedef X Type;
|
|
};
|
|
typedef typename RemovePtr< T >::Type Base;
|
|
|
|
/// @brief Returns the element at the given position.
|
|
/// @param idx The position of the element.
|
|
/// @return The reference to the element.
|
|
T& operator[](int idx) {
|
|
return mArr[idx];
|
|
}
|
|
|
|
/// @brief Returns the element at the given position.
|
|
/// @param idx The position of the element.
|
|
/// @return The reference to the element.
|
|
const T& operator[](int idx) const {
|
|
return mArr[idx];
|
|
}
|
|
|
|
/// @brief Returns the number of elements.
|
|
/// @return The number of elements.
|
|
int size() const {
|
|
return N;
|
|
}
|
|
|
|
/// @brief Returns an iterator to the first element.
|
|
/// @return The pointer to the first element.
|
|
T* begin() {
|
|
return &mArr[0];
|
|
}
|
|
|
|
/// @brief Returns an iterator to the first element.
|
|
/// @return The pointer to the first element.
|
|
const T* begin() const {
|
|
return &mArr[0];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the last element.
|
|
/// @return The pointer past the last element.
|
|
T* end() {
|
|
return &mArr[N];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the last element.
|
|
/// @return The pointer past the last element.
|
|
const T* end() const {
|
|
return &mArr[N];
|
|
}
|
|
|
|
template < class U >
|
|
void callAllFunc(void (U::*pFunction)()) {
|
|
for (T* it = begin(); it != end(); it++) {
|
|
((*it)->*pFunction)();
|
|
}
|
|
}
|
|
|
|
inline int indexOf(T* pItem) const {
|
|
return pItem - begin();
|
|
}
|
|
|
|
private:
|
|
/// @brief The array of elements.
|
|
/* 0x0 */ T mArr[N];
|
|
};
|
|
|
|
/// @brief A contiguous growable array.
|
|
template < class T >
|
|
class Vector {
|
|
public:
|
|
typedef typename T::Item Item;
|
|
|
|
/// @brief Creates a new `Vector`.
|
|
Vector();
|
|
|
|
/// @brief Destroys the `Vector`.
|
|
~Vector();
|
|
|
|
/// @brief Returns the element at the given position.
|
|
/// @param idx The position of the element.
|
|
/// @return The reference to the element.
|
|
Item& operator[](int idx) {
|
|
return mArray[idx];
|
|
}
|
|
|
|
/// @brief Returns the element at the given position.
|
|
/// @param idx The position of the element.
|
|
/// @return The reference to the element.
|
|
const Item& operator[](int idx) const {
|
|
return mArray[idx];
|
|
}
|
|
|
|
/// @brief Allocates memory for the array.
|
|
/// @param num The number of elements.
|
|
void init(s32 num) {
|
|
mArray.init(num);
|
|
}
|
|
|
|
/// @brief Returns the number of elements.
|
|
/// @return The number of elements.
|
|
int size() const {
|
|
return mCount;
|
|
}
|
|
|
|
/// @brief Returns the number of elements that can be stored without reallocating.
|
|
/// @return The number of elements that can be stored.
|
|
int capacity() const {
|
|
return mArray.size();
|
|
}
|
|
|
|
/// @brief Appends a copy of `rItem` to the end of the container.
|
|
/// @param rItem The reference to the value to append.
|
|
void push_back(const Item& rItem);
|
|
|
|
Item* insert(Item* pIter, const Item& rItem) {
|
|
for (Item* p = end(); p != pIter; p--) {
|
|
*p = *(p - 1);
|
|
}
|
|
|
|
*pIter = rItem;
|
|
mCount++;
|
|
return pIter;
|
|
}
|
|
|
|
void pop_back() {
|
|
mCount--;
|
|
}
|
|
|
|
/// @brief Removes the value at the given position from the container.
|
|
/// @param pIter The pointer to the position where the value should be removed.
|
|
/// @return The pointer to the position of the removed value.
|
|
Item* erase(Item* pIter) {
|
|
if (end() - pIter - 1 > 0) {
|
|
for (Item* p = pIter; p + 1 != end(); p++) {
|
|
*p = *(p + 1);
|
|
}
|
|
}
|
|
|
|
mCount--;
|
|
|
|
return pIter;
|
|
}
|
|
|
|
/// @brief Removes all values from the container.
|
|
void clear() {
|
|
mCount = 0;
|
|
}
|
|
|
|
/// @brief Returns an iterator to the first element.
|
|
/// @return The pointer to the first element.
|
|
Item* begin() {
|
|
return &mArray[0];
|
|
}
|
|
|
|
/// @brief Returns an iterator to the first element.
|
|
/// @return The pointer to the first element.
|
|
const Item* begin() const {
|
|
return &mArray[0];
|
|
}
|
|
|
|
/// @brief Returns an iterator to the reverse first element.
|
|
/// @return The pointer to the reverse first element.
|
|
Item* rbegin() {
|
|
return end() - 1;
|
|
}
|
|
|
|
/// @brief Returns an iterator to the reverse first element.
|
|
/// @return The pointer to the reverse first element.
|
|
const Item* rbegin() const {
|
|
return end() - 1;
|
|
}
|
|
|
|
/// @brief Returns an iterator past the last element.
|
|
/// @return The pointer past the last element.
|
|
Item* end() {
|
|
return &mArray[mCount];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the last element.
|
|
/// @return The pointer past the last element.
|
|
const Item* end() const {
|
|
return &mArray[mCount];
|
|
}
|
|
|
|
/// @brief Returns an iterator past the reverse last element.
|
|
/// @return The pointer past the reverse last element.
|
|
Item* rend() {
|
|
return begin() - 1;
|
|
}
|
|
|
|
/// @brief Returns an iterator past the reverse last element.
|
|
/// @return The pointer past the reverse last element.
|
|
const Item* rend() const {
|
|
return begin() - 1;
|
|
}
|
|
|
|
/// @brief The array of elements.
|
|
/* 0x0 */ T mArray;
|
|
|
|
/// @brief The number of valid elements.
|
|
/* 0x? */ s32 mCount;
|
|
};
|
|
|
|
template < class T, int S >
|
|
class FixedRingBuffer {
|
|
public:
|
|
class iterator {
|
|
public:
|
|
inline iterator() {
|
|
}
|
|
|
|
iterator(T* head, T* tail);
|
|
|
|
void operator++();
|
|
|
|
T* mHead; // 0x0
|
|
T* mTail; // 0x4
|
|
T* mEnd; // 0x8
|
|
};
|
|
|
|
inline FixedRingBuffer() {
|
|
}
|
|
|
|
FixedRingBuffer(T* pBuffer, T* pBuffer2) : mHead(pBuffer, pBuffer2), mEnd(pBuffer, pBuffer2), mCount(0) {
|
|
}
|
|
|
|
void push_back(const T& val);
|
|
|
|
T mBuffer[S]; // 0x00
|
|
iterator mHead; // 0x40 for S=16
|
|
iterator mEnd; // 0x4C for S=16
|
|
s32 mCount; // 0x58 for S=16
|
|
};
|
|
|
|
template < class T >
|
|
AssignableArray< T >::~AssignableArray() {
|
|
if (mArr != nullptr) {
|
|
delete[] mArr;
|
|
}
|
|
}
|
|
|
|
template < class T >
|
|
Vector< T >::Vector() {
|
|
clear();
|
|
}
|
|
|
|
template < class T >
|
|
Vector< T >::~Vector() {
|
|
}
|
|
|
|
template < class T >
|
|
void Vector< T >::push_back(const Item& rItem) {
|
|
mArray[mCount++] = rItem;
|
|
}
|
|
}; // namespace MR
|