2022-04-07 18:46:57 +02:00

304 lines
5.6 KiB
C

/**
* @file util.h
*/
#pragma once
/**
* @file util.h
* @author C. Hölzl
* @brief util header file
*/
#ifdef __cplusplus
extern "C" {
#endif
#include <nds.h>
#include <fat.h>
#include <stdio.h>
#include <string.h>
#define NAME_LEN 2
#define MAX(x,y) ((x)>(y)?(x):(y))
#define MIN(x,y) ((x)<(y)?(x):(y))
#define ABS(x) ((x)<0?(-(x)):(x))
#define MOD(x,y) (((y)==0)?0:((s32)((x)+(y)))%(y))
#define SIGN(a) ((a)/abs(a))
#define ARGB6(a,r,g,b) ( ((a) << 5) | ((r)|((g)<<5)|((b)<<10)))
#define HALF_BRIGHT_COLOR(color) ARGB16((color >> 15),\
(color & 0x1F)/2,\
((color >> 5) & 0x1F)/2,\
((color >> 10) & 0x1F)/2)
#define TRANSPARENT ARGB16(0,0,0,0)
#define DARK_DARK_WHITE ARGB16(1,7,7,7)
#define DARK_WHITE ARGB16(1,15,15,15)
#define WHITE ARGB16(1,29,29,30)
#define DARK_BLUE ARGB16(1,7,8,10)
#define BLUE ARGB16(1,11,16,21)
#define DARK_RED ARGB16(1,12,6,7)
#define RED ARGB16(1,23,12,13)
#define DARK_ORANGE ARGB16(1,13,8,7)
#define ORANGE ARGB16(1,25,16,14)
#define DARK_YELLOW ARGB16(1,15,13,9)
#define YELLOW ARGB16(1,29,25,17)
#define DARK_GREEN ARGB16(1,10,12,9)
#define GREEN ARGB16(1,20,23,17)
#define DARK_VIOLET ARGB16(1,11,9,11)
#define VIOLET ARGB16(1,11,9,11)
#define P_TRANSPARENT 31
#define P_WHITE 16
#define P_DARK_WHITE 17
#define P_DARK_DARK_WHITE 18
#define P_BLUE 19
#define P_DARK_BLUE 20
#define P_RED 21
#define P_DARK_RED 22
#define P_ORANGE 23
#define P_DARK_ORANGE 24
#define P_YELLOW 25
#define P_DARK_YELLOW 26
#define P_GREEN 27
#define P_DARK_GREEN 28
#define P_VIOLET 29
#define P_DARK_VIOLET 30
#define SET_PERSONAL_PALETTE(PTR)\
do {\
PTR[P_TRANSPARENT] = TRANSPARENT;\
PTR[P_WHITE] = WHITE;\
PTR[P_DARK_WHITE] = DARK_WHITE;\
PTR[P_DARK_DARK_WHITE] = DARK_DARK_WHITE;\
PTR[P_BLUE] = BLUE;\
PTR[P_DARK_BLUE] = DARK_BLUE;\
PTR[P_RED] = RED;\
PTR[P_DARK_RED] = DARK_RED;\
PTR[P_ORANGE] = ORANGE;\
PTR[P_DARK_ORANGE] = DARK_ORANGE;\
PTR[P_YELLOW] = YELLOW;\
PTR[P_DARK_YELLOW] = DARK_YELLOW;\
PTR[P_GREEN] = GREEN;\
PTR[P_DARK_GREEN] = DARK_GREEN;\
PTR[P_VIOLET] = VIOLET;\
PTR[P_DARK_VIOLET] = DARK_VIOLET;\
} while (false)
typedef enum {GGAME, GGAME_ALT, GMENU} gmode_t;
/*
* Initialize random number generator
*/
static inline void rand_init(u32 seed)
{
srand(seed);
}
/*
* Generate a random number within range
*/
static inline u32 rand_value(u32 range)
{
return ((u32)((float32) range * rand() / (RAND_MAX + 1.0)));
}
typedef enum { TA_LEFT, TA_RIGHT, TA_CENTER} textalign_t;
#define PNAME {PersonalData->name[0],PersonalData->name[1],0}
#define SCORE_TAB_SIZE 16
#define SECTIME_MAX_VALUE 9999
typedef struct {
char name[NAME_LEN + 1];
u32 time;
} pscore_t;
pscore_t highscore[SCORE_TAB_SIZE];
#define POWERDWN() powerOn(PM_SYSTEM_PWR)
static inline void write_score()
{
FILE* file = fopen("/nfh8_score.txt", "w+");
if (file != NULL) {
u32 i;
for (i = 0; i < SCORE_TAB_SIZE; ++i) {
fprintf(file, "%2s %u\n", highscore[i].name, highscore[i].time);
}
fclose(file);
}
}
static inline void insert_score(const pscore_t* score)
{
u32 i = SCORE_TAB_SIZE - 1;
//pscore_t tmp = {"++",SECTIME_MAX_VALUE};
while (i < SCORE_TAB_SIZE && score->time < highscore[i].time) {
if (i - 1 >= 0) {
strncpy(highscore[i].name, highscore[i - 1].name, NAME_LEN);
highscore[i].time = highscore[i - 1].time;
}
strncpy(highscore[i - 1].name, score->name, NAME_LEN);
highscore[i - 1].time = score->time;
++i;
}
}
static inline pscore_t* get_score()
{
return highscore;
}
static inline void read_score()
{
FILE* file = fopen("/nfh8_score.txt", "r");
if (file != NULL) {
u32 i;
for (i = 0; i < SCORE_TAB_SIZE; ++i) {
u8 r = fscanf(file, "%2s %u\n", highscore[i].name, &(highscore[i].time));
if (r != 2 || strnlen(highscore[i].name, NAME_LEN + 1) == 0 || highscore[i].time > SECTIME_MAX_VALUE) {
//strncpy(highscore[i].name, "--", NAME_LEN);
highscore[i].time = SECTIME_MAX_VALUE;
}
}
fclose(file);
} else {
u32 i;
for (i = 0; i < SCORE_TAB_SIZE; ++i) {
strncpy(highscore[i].name, "", NAME_LEN);
highscore[i].time = SECTIME_MAX_VALUE;
}
}
}
static inline u16 char_to_tile(char c)
{
if (c >= 'A' && c <= 'Z') {
return (c - 'A') + 1;
}
if (c >= 'a' && c <= 'z') {
return (c - 'a') + 39;
}
if (c >= '1' && c <= '9') {
return (c - '1') + 27;
}
if (c == '0') {
return 36;
}
switch (c) {
case '[':
return 37;
case ']':
return 38;
case '!':
return 65;
case '.':
return 66;
case '?':
return 67;
case '@':
return 68;
case '#':
return 69;
case '$':
return 70;
case '%':
return 71;
case '^':
return 72;
case '&':
return 73;
case '(':
return 74;
case ')':
return 75;
case ':':
return 76;
case ';':
return 77;
case ',':
return 78;
case '\'':
return 79;
case '+':
return 81;
case '-':
return 82;
case '=':
return 83;
case '{':
return 84;
case '}':
return 85;
case '\\':
return 86;
case '/':
return 87;
case '<':
return 88;
case '>':
return 89;
case '`':
return 90;
case '"':
return 91;
case ' ':
return 0;
default:
return 0;
}
}
#ifdef __cplusplus
}
#endif