Files
Microtransactions64/s2d_parse.c

120 lines
2.3 KiB
C
Raw Normal View History

2020-12-11 21:47:11 -05:00
#include <ultra64.h>
#include <PR/gs2dex.h>
#include <PR/gu.h>
#include <stdarg.h>
2020-12-11 21:47:11 -05:00
#include "config.h"
2020-12-11 21:47:11 -05:00
#include "s2d_draw.h"
2020-12-11 22:51:58 -05:00
#include "s2d_print.h"
#include "s2d_ustdlib.h"
2020-12-11 21:47:11 -05:00
2020-12-15 23:10:28 -05:00
void s2d_snprint(int x, int y, const char *str, uObjMtx *buf, int len) {
2020-12-11 21:47:11 -05:00
char *p = str;
int tmp_len = 0;
2020-12-15 23:06:09 -05:00
int orig_x = x;
int orig_y = y;
2020-12-15 23:36:40 -05:00
2020-12-16 18:06:46 -05:00
if (*p == '\0') return;
2020-12-19 14:16:59 -05:00
s2d_rdp_init();
2020-12-18 18:38:27 -05:00
// resets parameters
2020-12-15 23:36:40 -05:00
s2d_red = s2d_green = s2d_blue = 255;
s2d_alpha = 255;
2020-12-18 18:38:27 -05:00
drop_shadow = FALSE;
2020-12-11 22:51:58 -05:00
do {
2020-12-16 18:06:46 -05:00
char current_char = *p;
2020-12-16 18:06:46 -05:00
switch (current_char) {
2020-12-11 22:51:58 -05:00
case CH_SCALE:
CH_SKIP(p);
2020-12-16 18:06:46 -05:00
myScale = s2d_atoi(p, &p);
2020-12-11 21:47:11 -05:00
break;
2020-12-11 22:51:58 -05:00
case CH_ROT:
CH_SKIP(p);
2020-12-16 18:06:46 -05:00
myDegrees = s2d_atoi(p, &p);
2020-12-11 21:47:11 -05:00
break;
2020-12-11 22:51:58 -05:00
case CH_TRANSLATE:
CH_SKIP(p);
x = s2d_atoi(p, &p);
CH_SKIP(p);
CH_SKIP(p);
y = s2d_atoi(p, &p);
2020-12-12 15:33:14 -05:00
break;
2020-12-12 19:45:53 -05:00
case CH_COLOR:
CH_SKIP(p);
2020-12-12 19:45:53 -05:00
s2d_red = s2d_atoi(p, &p);
CH_SKIP(p); CH_SKIP(p);
2020-12-12 19:45:53 -05:00
s2d_green = s2d_atoi(p, &p);
CH_SKIP(p); CH_SKIP(p);
2020-12-12 19:45:53 -05:00
s2d_blue = s2d_atoi(p, &p);
CH_SKIP(p); CH_SKIP(p);
2020-12-12 19:45:53 -05:00
s2d_alpha = s2d_atoi(p, &p);
break;
2020-12-18 18:38:27 -05:00
case CH_DROPSHADOW:
drop_shadow ^= 1;
// CH_SKIP(p);
break;
2020-12-15 23:06:09 -05:00
case '\n':
x = orig_x;
y += TEX_HEIGHT;
2020-12-15 23:36:40 -05:00
break;
case '\t':
x += TAB_WIDTH_H;
break;
case '\v':
x += TAB_WIDTH_V;
y += TEX_HEIGHT;
2020-12-15 23:06:09 -05:00
break;
2020-12-11 21:47:11 -05:00
default:
2020-12-16 18:06:46 -05:00
if (current_char != '\0') {
draw_s2d_glyph(current_char, x, y, (buf++));
(x += (s2d_kerning_table[current_char] * myScale));
}
2020-12-11 21:47:11 -05:00
}
if (*p == '\0') break;
2020-12-13 22:24:18 -05:00
p++;
tmp_len++;
} while (tmp_len < len);
2020-12-11 22:51:58 -05:00
myScale = 1;
2020-12-12 15:33:14 -05:00
myDegrees = 0;
2020-12-11 21:47:11 -05:00
}
2020-12-11 22:51:58 -05:00
void s2d_print(int x, int y, const char *str, uObjMtx *buf) {
s2d_snprint(x, y, str, buf, s2d_strlen(str));
}
void s2d_print_alloc(int x, int y, const char *str) {
uObjMtx *b = alloc(sizeof(uObjMtx) * s2d_strlen(str));
s2d_snprint(x, y, str, b, s2d_strlen(str));
}
2020-12-15 23:10:28 -05:00
void s2d_type_print(int x, int y, const char *str, uObjMtx *buf, int *pos) {
int len = s2d_strlen(str);
s2d_snprint(x, y, str, buf, *pos);
if (s2d_timer % 2 == 0) {
if (*pos < len) {
(*pos)++;
}
}
2020-12-13 22:24:18 -05:00
}
2020-12-16 01:12:08 -05:00
// void s2d_vsprint(int x, int y, uObjMtx *buf, const char *str, ...) {
// int last_chr;
// va_list args;
// char *dst = alloc(s2d_strlen(str) * 2);
// va_start(args, str);
// last_chr = vsprintf(dst, str, str, args);
// if (last_chr >= 0) {
// dst[last_chr] = '\0';
// }
// s2d_print(x, y, dst, buf);
// }