[game] pc port progress menu (#1281)

* fix typo

* more typo

* shorten discord rpc text

* allow expanding enums after the fact (untested)

* make `game_text` work similar to subtitles

* update progress decomp

* update some types + `do-not-decompile` in bitfield

* fixes and fall back to original progress code

* update `progress` decomp with new enums

* update config files

* fix enums and debug menu

* always allocate (but not use) a lot of particles

* small rework to display mode options

* revert resolution/aspect-ratio symbol mess

* begin the override stuff

* make `progress-draw` more readable

* more fixes

* codacy good boy points

* first step overriding code

* finish progress overrides, game options menu fully functional!

* minor fixes

* Update game.gp

* Update sparticle-launcher.gc

* clang

* change camera controls text

* oops

* some cleanup

* derp

* nice job

* implement menu scrolling lol

* make scrollable menus less cramped, fix arrows

* make some carousell things i guess

* add msaa carousell to test

* oops

* Update progress-pc.gc

* make `pc-get-screen-size` (untested)

* resolution menu

* input fixes

* return when selecting resolution

* scroll fixes

* Update progress-pc.gc

* add "fit to screen" button

* bug

* complete resolutions menu

* aspect ratio menu

* subtitles language

* subtitle speaker

* final adjustments

* ref test

* fix tests

* fix ref!

* reduce redundancy a bit

* fix mem leaks?

* save settings on progress exit

* fix init reorder

* remove unused code

* rename goal project-like files to the project extension

* sha display toggle

* aspect ratio settings fixes

* dont store text db's in compiler

* properly save+load native aspect stuff
This commit is contained in:
ManDude
2022-04-11 23:38:54 +01:00
committed by GitHub
parent b408c78698
commit a7eee4fdc9
185 changed files with 6172 additions and 11465 deletions
+54 -7
View File
@@ -737,7 +737,10 @@ void PutDisplayEnv(u32 ptr) {
}
/*!
* PC Port function to get a 300MHz timer value.
* PC PORT FUNCTIONS BEGIN
*/
/*!
* Get a 300MHz timer value.
*/
u64 read_ee_timer() {
u64 ns = ee_clock_timer.getNs();
@@ -745,14 +748,14 @@ u64 read_ee_timer() {
}
/*!
* PC Port function to do a fast memory copy.
* Do a fast memory copy.
*/
void c_memmove(u32 dst, u32 src, u32 size) {
memmove(Ptr<u8>(dst).c(), Ptr<u8>(src).c(), size);
}
/*!
* PC Port function to return the current OS as a symbol.
* Return the current OS as a symbol. Actually returns what it was compiled for!
*/
u64 get_os() {
#ifdef _WIN32
@@ -765,7 +768,7 @@ u64 get_os() {
}
/*!
* PC Port function
* Returns size of window.
*/
void get_window_size(u32 w_ptr, u32 h_ptr) {
if (w_ptr) {
@@ -779,7 +782,7 @@ void get_window_size(u32 w_ptr, u32 h_ptr) {
}
/*!
* PC Port function
* Returns scale of window. This is for DPI stuff.
*/
void get_window_scale(u32 x_ptr, u32 y_ptr) {
float* x = x_ptr ? Ptr<float>(x_ptr).c() : NULL;
@@ -787,6 +790,23 @@ void get_window_scale(u32 x_ptr, u32 y_ptr) {
Gfx::get_window_scale(x, y);
}
/*!
* Returns resolution of the monitor.
*/
void get_screen_size(s64 vmode_idx, u32 w_ptr, u32 h_ptr, u32 c_ptr) {
s32 *w_out = 0, *h_out = 0, *c_out = 0;
if (w_ptr) {
w_out = Ptr<s32>(w_ptr).c();
}
if (h_ptr) {
h_out = Ptr<s32>(h_ptr).c();
}
if (c_ptr) {
c_out = Ptr<s32>(c_ptr).c();
}
Gfx::get_screen_size(vmode_idx, w_out, h_out, c_out);
}
void update_discord_rpc(u32 discord_info) {
if (gDiscordRpcEnabled) {
DiscordRichPresence rpc;
@@ -814,7 +834,7 @@ void update_discord_rpc(u32 discord_info) {
strcat(state, std::to_string(cells).c_str());
strcat(state, " | Orbs: ");
strcat(state, std::to_string(orbs).c_str());
strcat(state, " | Scout flies: ");
strcat(state, " | Flies: ");
strcat(state, std::to_string(scout_flies).c_str());
}
rpc.state = state;
@@ -846,6 +866,28 @@ void mkdir_path(u32 filepath) {
file_util::create_dir_if_needed_for_file(filepath_str);
}
u32 get_fullscreen() {
switch (Gfx::get_fullscreen()) {
default:
case Gfx::DisplayMode::Windowed:
return intern_from_c("windowed").offset;
case Gfx::DisplayMode::Borderless:
return intern_from_c("borderless").offset;
case Gfx::DisplayMode::Fullscreen:
return intern_from_c("fullscreen").offset;
}
}
void set_fullscreen(u32 symptr, s64 screen) {
if (symptr == intern_from_c("windowed").offset || symptr == s7.offset) {
Gfx::set_fullscreen(Gfx::DisplayMode::Windowed, screen);
} else if (symptr == intern_from_c("borderless").offset) {
Gfx::set_fullscreen(Gfx::DisplayMode::Borderless, screen);
} else if (symptr == intern_from_c("fullscreen").offset) {
Gfx::set_fullscreen(Gfx::DisplayMode::Fullscreen, screen);
}
}
void InitMachine_PCPort() {
// PC Port added functions
make_function_symbol_from_c("__read-ee-timer", (void*)read_ee_timer);
@@ -869,9 +911,11 @@ void InitMachine_PCPort() {
make_function_symbol_from_c("pc-get-os", (void*)get_os);
make_function_symbol_from_c("pc-get-window-size", (void*)get_window_size);
make_function_symbol_from_c("pc-get-window-scale", (void*)get_window_scale);
make_function_symbol_from_c("pc-get-fullscreen", (void*)get_fullscreen);
make_function_symbol_from_c("pc-get-screen-size", (void*)get_screen_size);
make_function_symbol_from_c("pc-set-window-size", (void*)Gfx::set_window_size);
make_function_symbol_from_c("pc-set-letterbox", (void*)Gfx::set_letterbox);
make_function_symbol_from_c("pc-set-fullscreen", (void*)Gfx::set_fullscreen);
make_function_symbol_from_c("pc-set-fullscreen", (void*)set_fullscreen);
make_function_symbol_from_c("pc-renderer-tree-set-lod", (void*)Gfx::SetLod);
// file related functions
@@ -897,6 +941,9 @@ void InitMachine_PCPort() {
intern_from_c("*pc-settings-folder*")->value = make_string_from_c(settings_path.string().c_str());
intern_from_c("*pc-settings-built-sha*")->value = make_string_from_c(GIT_SHORT_SHA);
}
/*!
* PC PORT FUNCTIONS END
*/
void vif_interrupt_callback() {
// added for the PC port for faking VIF interrupts from the graphics system.