diff --git a/config.h b/config.h index 117c0cb3..138209b3 100644 --- a/config.h +++ b/config.h @@ -51,6 +51,9 @@ extern char s2d_kerning_table[]; #define gdl_head gDisplayListHead extern Gfx *gdl_head; +#include "src/game/game_init.h" +#define CONTROLLER_INPUT gPlayer1Controller->buttonPressed +#define CONTROLLER_HELD_INPUT gPlayer1Controller->buttonDown // Other games/Homebrew users: change these values diff --git a/s2d_parse.c b/s2d_parse.c index 98c2aceb..18f0e789 100644 --- a/s2d_parse.c +++ b/s2d_parse.c @@ -12,12 +12,13 @@ static int s2d_width(const char *str, int line, int len); -static void s2d_snprint(int x, int y, int align, const char *str, uObjMtx *buf, int len) { +static int s2d_snprint(int x, int y, int align, const char *str, uObjMtx *buf, int len) { char *p = str; int tmp_len = 0; int orig_x = x; int orig_y = y; int line = 0; + char button = '\0'; if (*p == '\0') return; @@ -93,6 +94,35 @@ static void s2d_snprint(int x, int y, int align, const char *str, uObjMtx *buf, // drop_x <<= 2; // drop_y <<= 2; + break; + case CH_BUTTON: + if (len - tmp_len == 1) break; + if (len - tmp_len > 2) { + CH_SKIP(p); + break; + } + button = p[1]; + CH_SKIP(p); + switch (button) { + case 'A': + if (!(CONTROLLER_HELD_INPUT & A_BUTTON)) return 1; + break; + case 'B': + if (!(CONTROLLER_HELD_INPUT & B_BUTTON)) return 1; + break; + case 'Z': + if (!(CONTROLLER_HELD_INPUT & Z_TRIG)) return 1; + break; + case 'L': + if (!(CONTROLLER_HELD_INPUT & L_TRIG)) return 1; + break; + case 'R': + if (!(CONTROLLER_HELD_INPUT & R_TRIG)) return 1; + break; + case 'S': + if (!(CONTROLLER_HELD_INPUT & START_BUTTON)) return 1; + break; + } break; case '\n': line++; @@ -144,6 +174,7 @@ static void s2d_snprint(int x, int y, int align, const char *str, uObjMtx *buf, drop_shadow = FALSE; drop_x = 0; drop_y = 0; + return 0; } void s2d_print(int x, int y, int align, const char *str, uObjMtx *buf) { @@ -173,14 +204,26 @@ void s2d_type_print(int x, int y, int align, const char *str, uObjMtx *buf, int len = s2d_strlen(str); - s2d_snprint(x, y, align, str, buf, *pos); + int result = s2d_snprint(x, y, align, str, buf, *pos); if (s2d_timer % 2 == 0) { - if (*pos < len) { + if (*pos < len && result != 1) { (*pos)++; } } } +void s2d_type_print_alloc(int x, int y, int align, const char *str, int *pos) { + int len; + + if (s2d_check_align(align) != 0) return; + if (s2d_check_str(str) != 0) return; + + len = s2d_strlen(str); + + uObjMtx *b = alloc(sizeof(uObjMtx) * len); + s2d_type_print(x, y, align, str, b, pos); +} + static int s2d_width(const char *str, int line, int len) { char *p = str; int tmp_len = 0; diff --git a/s2d_print.h b/s2d_print.h index b3e1e323..0c100120 100644 --- a/s2d_print.h +++ b/s2d_print.h @@ -9,6 +9,7 @@ #define BACKGROUND "\x85" // BACKGROUND (w) (h) (alpha) #define SEPARATOR "\x86" #define RESET "\x87" +#define BUTTON "\x88" #define CH_SCALE '\x80' #define CH_ROT '\x81' @@ -18,6 +19,7 @@ #define CH_BACKGROUND '\x85' #define CH_SEPARATOR '\x86' #define CH_RESET '\x87' +#define CH_BUTTON '\x88' // ASCII standard escape codes #define CH_NEWLINE '\n'