idk anymore

This commit is contained in:
Masashi 2025-12-17 18:32:29 +05:30
commit 3257bb449e
19 changed files with 537 additions and 77 deletions

View file

@ -777,3 +777,148 @@ void suic_player_controller_set_position(suic_player_controller *player,
}
}
/* ===== FILE I/O IMPLEMENTATION ===== */
FileHandle suic_file_open(const char* path, FileMode mode) {
const char* mode_str;
switch (mode) {
case FILE_READ: mode_str = "rb"; break;
case FILE_WRITE: mode_str = "wb"; break;
case FILE_APPEND: mode_str = "ab"; break;
default: return NULL;
}
FILE* f = fopen(path, mode_str);
return (FileHandle)f;
}
void suic_file_close(FileHandle handle) {
if (handle) {
fclose((FILE*)handle);
}
}
int suic_file_read(FileHandle handle, void* buffer, int size) {
if (!handle) return -1;
return (int)fread(buffer, 1, size, (FILE*)handle);
}
int suic_file_write(FileHandle handle, const void* buffer, int size) {
if (!handle) return -1;
return (int)fwrite(buffer, 1, size, (FILE*)handle);
}
int suic_file_size(FileHandle handle) {
if (!handle) return -1;
FILE* f = (FILE*)handle;
long current = ftell(f);
fseek(f, 0, SEEK_END);
long size = ftell(f);
fseek(f, current, SEEK_SET);
return (int)size;
}
/* ===== RANDOM NUMBER GENERATION IMPLEMENTATION ===== */
static uint32_t _random_state = 12345;
void suic_random_seed(uint32_t seed) {
_random_state = seed ? seed : 12345;
srand(seed);
}
/* Linear congruential generator */
uint32_t suic_random_int(void) {
_random_state = (_random_state * 1103515245 + 12345) & 0x7fffffff;
return _random_state;
}
int suic_random_int_range(int min, int max) {
if (min > max) {
int tmp = min;
min = max;
max = tmp;
}
uint32_t range = max - min + 1;
return min + (suic_random_int() % range);
}
float suic_random_float(void) {
return (float)suic_random_int() / 2147483647.0f;
}
float suic_random_float_range(float min, float max) {
return min + (max - min) * suic_random_float();
}
/* ===== TIME IMPLEMENTATION ===== */
#include <time.h>
#include <sys/time.h>
#include <unistd.h>
static uint64_t _start_time_ms = 0;
static void _init_time(void) {
if (_start_time_ms == 0) {
struct timeval tv;
gettimeofday(&tv, NULL);
_start_time_ms = (uint64_t)tv.tv_sec * 1000 + (uint64_t)tv.tv_usec / 1000;
}
}
uint64_t suic_get_time_ms(void) {
_init_time();
struct timeval tv;
gettimeofday(&tv, NULL);
uint64_t now = (uint64_t)tv.tv_sec * 1000 + (uint64_t)tv.tv_usec / 1000;
return now - _start_time_ms;
}
uint64_t suic_get_time_us(void) {
_init_time();
struct timeval tv;
gettimeofday(&tv, NULL);
uint64_t now = (uint64_t)tv.tv_sec * 1000000 + (uint64_t)tv.tv_usec;
return now - (_start_time_ms * 1000);
}
uint64_t suic_get_unix_time(void) {
return (uint64_t)time(NULL);
}
void suic_sleep_ms(uint32_t ms) {
usleep(ms * 1000);
}
/* ===== UUID GENERATION IMPLEMENTATION ===== */
/* Simple UUID v4 generator - not cryptographically secure but good enough for game IDs */
const char* suic_uuid_generate_v4(void) {
static char uuid_buffer[37]; // UUID is 36 chars + null terminator
uint32_t a = suic_random_int();
uint32_t b = suic_random_int();
uint32_t c = suic_random_int();
uint32_t d = suic_random_int();
/* Set version 4 (random) and variant bits */
b = (b & 0x0fff) | 0x4000;
c = (c & 0x3fff) | 0x8000;
snprintf(uuid_buffer, sizeof(uuid_buffer),
"%08x-%04x-%04x-%04x-%08x%04x",
a,
(uint16_t)(b >> 16),
(uint16_t)b,
(uint16_t)(c >> 16),
(uint32_t)c,
(uint16_t)d);
return uuid_buffer;
}
const char* suic_uuid_generate_v4_seeded(uint64_t seed) {
suic_random_seed((uint32_t)seed);
return suic_uuid_generate_v4();
}