121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			121 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| #ifndef UTIL_H
 | |
| #define UTIL_H
 | |
| 
 | |
| 
 | |
| #include <SDL2/SDL.h>
 | |
| #include <physfs.h>
 | |
| 
 | |
| #include <stdlib.h>
 | |
| #include <stdint.h>
 | |
| #include <stdbool.h>
 | |
| #include <math.h>
 | |
| #include <stdnoreturn.h>
 | |
| 
 | |
| 
 | |
| /*                   */
 | |
| /* GENERAL UTILITIES */
 | |
| /*                   */
 | |
| 
 | |
| void cry_impl(const char *file, const int line, const char *title, const char *text);
 | |
| #define CRY(title, text) cry_impl(__FILE__, __LINE__, title, text)      
 | |
| #define CRY_SDL(title) cry_impl(__FILE__, __LINE__, title, SDL_GetError()) 
 | |
| #define CRY_PHYSFS(title)                                               \
 | |
| cry_impl(__FILE__, __LINE__, title, PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode()))
 | |
| 
 | |
| 
 | |
| void log_info(const char *restrict format, ...);
 | |
| void log_critical(const char *restrict format, ...);
 | |
| void log_warn(const char *restrict format, ...);
 | |
| 
 | |
| 
 | |
| /* for when there's absolutely no way to continue */
 | |
| noreturn void die_abruptly(void);
 | |
| 
 | |
| 
 | |
| /* "critical" allocation functions which will log and abort() on failure. */
 | |
| /* if it is reasonable to handle this gracefully, use the standard versions. */
 | |
| /* the stb implementations will be configured to use these */
 | |
| void *cmalloc(size_t size);
 | |
| void *crealloc(void *ptr, size_t size);
 | |
| void *ccalloc(size_t num, size_t size);
 | |
| 
 | |
| 
 | |
| /* DON'T FORGET ABOUT DOUBLE EVALUATION */
 | |
| /* YOU THINK YOU WON'T, AND THEN YOU DO */
 | |
| /* C23's typeof could fix it, so i will */
 | |
| /* leave them as macros to be replaced. */
 | |
| /* use the macro in tgmath.h for floats */
 | |
| #define MAX SDL_max
 | |
| #define MIN SDL_min
 | |
| 
 | |
| 
 | |
| /* sets buf_out to a pointer to a byte buffer which must be freed. */
 | |
| /* returns the size of this buffer. */
 | |
| int64_t file_to_bytes(const char *path, unsigned char **buf_out);
 | |
| 
 | |
| /* returns a pointer to a string which must be freed */
 | |
| char *file_to_str(const char *path);
 | |
| 
 | |
| 
 | |
| /* returns true if str ends with suffix */
 | |
| bool strends(const char *str, const char *suffix);
 | |
| 
 | |
| 
 | |
| /*                      */
 | |
| /* GAME LOGIC UTILITIES */
 | |
| /*                      */
 | |
| 
 | |
| /* 32-bit color data */
 | |
| typedef struct color {
 | |
|     uint8_t r;
 | |
|     uint8_t g;
 | |
|     uint8_t b;
 | |
|     uint8_t a;
 | |
| } t_color;
 | |
| 
 | |
| 
 | |
| /* a rectangle with the origin at the upper left (integer) */
 | |
| typedef struct rect {
 | |
|     int x, y;
 | |
|     int w, h;
 | |
| } t_rect;
 | |
| 
 | |
| 
 | |
| bool intersect_rect(const t_rect *a, const t_rect *b, t_rect *result);
 | |
| 
 | |
| 
 | |
| /* a rectangle with the origin at the upper left (floating point) */
 | |
| typedef struct frect {
 | |
|     float x, y;
 | |
|     float w, h;
 | |
| } t_frect;
 | |
| 
 | |
| 
 | |
| bool intersect_frect(const t_frect *a, const t_frect *b, t_frect *result);
 | |
| 
 | |
| t_frect to_frect(t_rect rect);
 | |
| 
 | |
| 
 | |
| /* a point in some space (integer) */
 | |
| typedef struct vec2 {
 | |
|     int x, y;
 | |
| } t_vec2;
 | |
| 
 | |
| 
 | |
| /* a point in some space (floating point) */
 | |
| typedef struct fvec2 {
 | |
|     float x, y;
 | |
| } t_fvec2;
 | |
| 
 | |
| 
 | |
| /* decrements an lvalue (which should be an int), stopping at 0 */
 | |
| /* meant for tick-based timers in game logic */
 | |
| /*
 | |
|  * example:
 | |
|  * tick_timer(&player->jump_air_timer);
 | |
|  */
 | |
| void tick_timer(int *value);
 | |
| 
 | |
| 
 | |
| #endif
 |