You've already forked HackerSM64
mirror of
https://github.com/HackerN64/HackerSM64.git
synced 2026-01-21 10:35:32 -08:00
Autogenerate button combo string from the combo define
This commit is contained in:
@@ -1,4 +1,5 @@
|
||||
#include <PR/ultratypes.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "config.h"
|
||||
#include "area.h"
|
||||
@@ -97,6 +98,27 @@ ALIGNED4 static const struct ControllerIcon gControllerIcons[] = {
|
||||
{ .type = CONT_TYPE_GCN_DANCEPAD, .texture = texture_controller_gcn_dancepad },
|
||||
};
|
||||
|
||||
#if (NUM_SUPPORTED_CONTROLLERS > 1)
|
||||
static const char* sButtonStr[16] = {
|
||||
"A", // A_BUTTON
|
||||
"B", // B_BUTTON
|
||||
"Z", // Z_TRIG
|
||||
"START", // START_BUTTON
|
||||
"D UP", // U_JPAD
|
||||
"D DOWN", // D_JPAD
|
||||
"D LEFT", // L_JPAD
|
||||
"D RIGHT", // R_JPAD
|
||||
"X", // X_BUTTON
|
||||
"Y", // Y_BUTTON
|
||||
"L", // L_TRIG
|
||||
"R", // R_TRIG
|
||||
"C UP", // U_CBUTTONS
|
||||
"C DOWN", // D_CBUTTONS
|
||||
"C LEFT", // L_CBUTTONS
|
||||
"C RIGHT", // R_CBUTTONS
|
||||
};
|
||||
#endif
|
||||
|
||||
Vp gViewport = {
|
||||
.vp = {
|
||||
.vscale = { (SCREEN_WIDTH * 2), (SCREEN_HEIGHT * 2), (G_MAXZ / 2), 0 },
|
||||
@@ -395,6 +417,29 @@ static const Gfx dl_controller_icons_end[] = {
|
||||
gsSPEndDisplayList(),
|
||||
};
|
||||
|
||||
#if (NUM_SUPPORTED_CONTROLLERS > 1)
|
||||
/**
|
||||
* Creates a string from a combination of buttons and adds it to 'strp'.
|
||||
*/
|
||||
static u32 button_combo_to_string(char *strp, u16 buttons) {
|
||||
u32 count = 0;
|
||||
|
||||
for (int i = 0; i < ARRAY_COUNT(sButtonStr); i++) {
|
||||
if (buttons & ((1 << (ARRAY_COUNT(sButtonStr) - 1)) >> i)) { // 0x8000 >> i
|
||||
if (count) {
|
||||
strcat(strp, "+");
|
||||
count += strlen("+");
|
||||
}
|
||||
|
||||
strcat(strp, sButtonStr[i]);
|
||||
count += strlen(sButtonStr[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Displays controller info (eg. type and player number) while polling for controller statuses.
|
||||
*/
|
||||
@@ -407,7 +452,7 @@ void render_controllers_overlay(void) {
|
||||
const s32 texH = 32;
|
||||
Texture *texture_controller = texture_controller_unknown;
|
||||
OSPortInfo *portInfo = NULL;
|
||||
char text_buffer[32];
|
||||
char text_buffer[32] = "";
|
||||
int port;
|
||||
|
||||
if (!gContStatusPolling) {
|
||||
@@ -468,7 +513,11 @@ void render_controllers_overlay(void) {
|
||||
sprintf(text_buffer, "PRESS BUTTON TO ASSIGN P%d", gNumPlayers);
|
||||
drawSmallStringCol(&dlHead, (SCREEN_CENTER_X - 77), (SCREEN_CENTER_Y - 28), text_buffer, col, col, col);
|
||||
#if (NUM_SUPPORTED_CONTROLLERS > 1)
|
||||
drawSmallStringCol(&dlHead, (SCREEN_CENTER_X - 62), (SCREEN_CENTER_Y + 28), "OR A+B+START TO EXIT", col, col, col);
|
||||
char comboStr[32] = "";
|
||||
u32 count = button_combo_to_string(comboStr, TOGGLE_CONT_STATUS_POLLING_COMBO);
|
||||
sprintf(text_buffer, "OR %s TO EXIT", comboStr);
|
||||
s32 xOffset = ((strlen("ORTOEXIT") + 1 + count) / 2) * 7; // Center the text based on char count.
|
||||
drawSmallStringCol(&dlHead, (SCREEN_CENTER_X - xOffset), (SCREEN_CENTER_Y + 28), text_buffer, col, col, col);
|
||||
#endif
|
||||
} else {
|
||||
drawSmallStringCol(&dlHead, (SCREEN_CENTER_X - 84), (SCREEN_CENTER_Y - 28), "RELEASE ALL INPUTS TO START", col, col, col);
|
||||
|
||||
@@ -20,11 +20,11 @@
|
||||
#define CONT_STATUS_POLLING_TIME 15
|
||||
|
||||
struct DemoInput {
|
||||
u8 timer; // time until next input. if this value is 0, it means the demo is over
|
||||
s8 rawStickX;
|
||||
s8 rawStickY;
|
||||
u8 buttonMask;
|
||||
};
|
||||
/*0x00*/ u8 timer; // time until next input. if this value is 0, it means the demo is over
|
||||
/*0x01*/ s8 rawStickX;
|
||||
/*0x02*/ s8 rawStickY;
|
||||
/*0x03*/ u8 buttonMask;
|
||||
}; /*0x04*/
|
||||
|
||||
// Player Controllers
|
||||
extern struct Controller gControllers[MAXCONTROLLERS];
|
||||
|
||||
Reference in New Issue
Block a user