SpaghettiKart
Loading...
Searching...
No Matches
TrackBrowser.h
Go to the documentation of this file.
1#ifndef TRACKBROWSER_H
2#define TRACKBROWSER_H
3
4#include <libultraship.h>
5#include "port/Game.h"
6
7
8#ifdef __cplusplus
9#include <vector>
13class TrackBrowser {
14private:
15 // Holds all available tracks
16 std::vector<const TrackInfo*> mTracks;
17 size_t mTrackIndex = 0;
18
19public:
20 static TrackBrowser* Instance;
21
22 TrackBrowser(const Registry<TrackInfo>& registry) {
23 mTracks = registry.GetAllInfo();
24
25 RemovePodiumCeremony();
26
27 std::sort(mTracks.begin(), mTracks.end(), [](const TrackInfo* a, const TrackInfo* b) {
28 return a->Id < b->Id;
29 });
30 Instance = this;
31 }
32
33 void FindCustomTracks();
34
35 void Refresh(const Registry<TrackInfo>& registry) {
36 mTracks.clear();
37 mTracks = registry.GetAllInfo();
38
39 RemovePodiumCeremony();
40
41 std::sort(mTracks.begin(), mTracks.end(), [](const TrackInfo* a, const TrackInfo* b) {
42 return a->Id < b->Id;
43 });
44 mTrackIndex = 0;
45 }
46
47 void Reset() {
48 mTrackIndex = 0;
49 }
50
51 // Podium is not a valid user selectable option in the menus, remove it.
52 void RemovePodiumCeremony() {
53 mTracks.erase(
54 std::remove_if(mTracks.begin(), mTracks.end(),
55 [](const TrackInfo* track) {
56 return track && track->ResourceName == "mk:podium_ceremony";
57 }),
58 mTracks.end()
59 );
60 }
61
62 void SetTrack(std::string name) {
63 if (gTrackRegistry.Find(name)) {
64 gTrackRegistry.Invoke(name);
65 } else {
66 throw std::runtime_error("[World] [SetTrack()] Track name not found in Track list: " + name);
67 }
68 }
69
70 void NextTrack() {
71 if (mTracks.empty()) return;
72
73 mTrackIndex = (mTrackIndex + 1) % mTracks.size();
74 gTrackRegistry.Invoke(mTracks[mTrackIndex]->ResourceName);
75 }
76
77 void PreviousTrack() {
78 if (mTracks.empty()) return;
79
80 mTrackIndex = (mTrackIndex + mTracks.size() - 1) % mTracks.size();
81 gTrackRegistry.Invoke(mTracks[mTrackIndex]->ResourceName);
82 }
83
84 size_t GetTrackIndex() {
85 return mTrackIndex;
86 }
87
88 const char* GetTrackName() {
89 if (mTracks.empty()) return "";
90
91 if (mTracks[mTrackIndex]) {
92 return mTracks[mTrackIndex]->Name.c_str();
93 }
94 return "";
95 }
96
97 const char* GetTrackDebugName() {
98 if (mTracks.empty()) return "";
99
100 if (mTracks[mTrackIndex]) {
101 return mTracks[mTrackIndex]->DebugName.c_str();
102 }
103 return "";
104 }
105
106 const char* GetTrackLength() {
107 if (mTracks.empty()) return "";
108
109 if (mTracks[mTrackIndex]) {
110 return mTracks[mTrackIndex]->Length.c_str();
111 }
112 return "";
113 }
114
124
125 void SetTrackByIdx(size_t trackIndex) {
126 if (trackIndex >= mTracks.size()) {
127 printf("[TrackBrowser] [SetTrackById] Error: trackIndex %zu out of bounds (max %zu)\n", trackIndex, mTracks.size());
128 return;
129 }
130 if (nullptr == mTracks[mTrackIndex]) {
131 printf("[TrackBrowser] [SetTrackById] Error: TrackInfo at index %zu is null\n", mTrackIndex);
132 return;
133 }
134 mTrackIndex = trackIndex;
135 gTrackRegistry.Invoke(mTracks[mTrackIndex]->ResourceName);
136 }
137
138 const char* GetTrackNameByIdx(size_t trackIndex) {
139 if (trackIndex >= mTracks.size()) {
140 printf("[TrackBrowser] [GetTrackNameByIdx] Error: trackIndex %zu out of bounds (max %zu)\n", trackIndex, mTracks.size());
141 return "";
142 }
143 if (nullptr == mTracks[trackIndex]) {
144 printf("[TrackBrowser] [GetTrackNameByIdx] Error: TrackInfo at index %zu is null\n", trackIndex);
145 return "";
146 }
147 return mTracks[trackIndex]->Name.c_str();
148 }
149
150 const char* GetTrackDebugNameByIdx(size_t trackIndex) {
151 if (trackIndex >= mTracks.size()) {
152 printf("[TrackBrowser] [GetTrackDebugNameByIdx] Error: trackIndex %zu out of bounds (max %zu)\n", trackIndex, mTracks.size());
153 return "";
154 }
155 if (nullptr == mTracks[trackIndex]) {
156 printf("[TrackBrowser] [GetTrackDebugNameByIdx] Error: TrackInfo at index %zu is null\n", trackIndex);
157 return "";
158 }
159 return mTracks[trackIndex]->DebugName.c_str();
160 }
161
162 const char* GetTrackLengthByIdx(size_t trackIndex) {
163 if (trackIndex >= mTracks.size()) {
164 printf("[TrackBrowser] [GetTrackLengthByIdx] Error: trackIndex %zu out of bounds (max %zu)\n", trackIndex, mTracks.size());
165 return "";
166 }
167 if (nullptr == mTracks[trackIndex]) {
168 printf("[TrackBrowser] [GetTrackLengthByIdx] Error: TrackInfo at index %zu is null\n", trackIndex);
169 return "";
170 }
171 return mTracks[trackIndex]->Length.c_str();
172 }
173
174 const char* GetMinimapTextureByIdx(size_t trackIndex) {
175 if (trackIndex >= mTracks.size()) {
176 printf("[TrackBrowser] [GetTrackMinimapTextureByIdx] Error: trackIndex %zu out of bounds (max %zu)\n", trackIndex, mTracks.size());
177 return NULL;
178 }
179 if (nullptr == mTracks[trackIndex]) {
180 printf("[TrackBrowser] [GetTrackMinimapTextureByIdx] Error: TrackInfo at index %zu is null\n", trackIndex);
181 return NULL;
182 }
183 return mTracks[trackIndex]->MinimapTexture;
184 }
185};
186
187#endif // __cplusplus
188
189#ifdef __cplusplus
190extern "C" {
191#endif // __cplusplus
192void TrackBrowser_SetTrack(const char* name);
193void TrackBrowser_SetTrackFromCup(void); // <-- Not in TrackBrowser class
194void TrackBrowser_NextTrack(void);
196size_t TrackBrowser_GetTrackIndex(void);
197const char* TrackBrowser_GetTrackName(void);
198const char* TrackBrowser_GetTrackDebugName(void);
199const char* TrackBrowser_GetTrackLength(void);
200void TrackBrowser_SetTrackByIdx(size_t trackIndex);
201const char* TrackBrowser_GetTrackNameByIdx(size_t trackIndex);
202const char* TrackBrowser_GetTrackDebugNameByIdx(size_t trackIndex);
203const char* TrackBrowser_GetTrackLengthByIdx(size_t trackIndex);
204const char* TrackBrowser_GetMinimapTextureByIdx(size_t trackIndex);
205#ifdef __cplusplus
206}
207#endif // __cplusplus
208
209#endif // TRACKBROWSER_H
Registry< TrackInfo > gTrackRegistry
Definition Game.cpp:78
const char * TrackBrowser_GetTrackLengthByIdx(size_t trackIndex)
Definition TrackBrowser.cpp:124
void TrackBrowser_PreviousTrack(void)
Definition TrackBrowser.cpp:91
const char * TrackBrowser_GetTrackName(void)
Definition TrackBrowser.cpp:99
void TrackBrowser_NextTrack(void)
Definition TrackBrowser.cpp:87
void TrackBrowser_SetTrack(const char *name)
Definition TrackBrowser.cpp:79
void TrackBrowser_SetTrackByIdx(size_t trackIndex)
Definition TrackBrowser.cpp:112
const char * TrackBrowser_GetTrackLength(void)
Definition TrackBrowser.cpp:108
const char * TrackBrowser_GetTrackNameByIdx(size_t trackIndex)
Definition TrackBrowser.cpp:116
size_t TrackBrowser_GetTrackIndex(void)
Definition TrackBrowser.cpp:95
const char * TrackBrowser_GetTrackDebugName(void)
Definition TrackBrowser.cpp:103
const char * TrackBrowser_GetMinimapTextureByIdx(size_t trackIndex)
Definition TrackBrowser.cpp:128
const char * TrackBrowser_GetTrackDebugNameByIdx(size_t trackIndex)
Definition TrackBrowser.cpp:120
void TrackBrowser_SetTrackFromCup(void)
Definition TrackBrowser.cpp:83
std::vector< const TInfo * > GetAllInfo() const
Definition Registry.h:101
#define NULL
Definition miniaudio.h:3851