From 3257bb449e8a5e21d9e3424abe06dc3db470f3ac Mon Sep 17 00:00:00 2001 From: Masashi Date: Wed, 17 Dec 2025 18:32:29 +0530 Subject: [PATCH] idk anymore --- .gitmodules | 3 + compile.sh | 2 +- fishsoup/main | Bin 43560 -> 0 bytes fishsoup/main.o | Bin 45304 -> 0 bytes libfishsoup | 1 + libsuicmez/libsuicmez.c | 145 ++++++++++++++++ libsuicmez/libsuicmez.h | 66 ++++++++ libsuicmez/perlin | 1 + soup/config.sui | 61 +++++++ {fishsoup => soup}/main.c | 1 - soup/main.o | Bin 0 -> 50712 bytes {fishsoup => soup}/main.sui | 6 +- src/c_lowerer/statements_transpiler.rs | 11 +- src/codegen/transpiler.rs | 23 +++ src/typechecker.rs | 226 +++++++++++++++++++++++-- test_player.c | 46 ----- test_player.sui | 1 - test_window.sui | 1 - test_window.c => tests/test_new_apis.c | 20 ++- 19 files changed, 537 insertions(+), 77 deletions(-) create mode 100644 .gitmodules delete mode 100755 fishsoup/main delete mode 100755 fishsoup/main.o create mode 160000 libfishsoup create mode 160000 libsuicmez/perlin create mode 100644 soup/config.sui rename {fishsoup => soup}/main.c (98%) create mode 100755 soup/main.o rename {fishsoup => soup}/main.sui (97%) delete mode 100644 test_player.c delete mode 100644 test_player.sui delete mode 100644 test_window.sui rename test_window.c => tests/test_new_apis.c (68%) diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..9ee4f41 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "libfishsoup"] + path = libfishsoup + url = https://gitea.nishi.boats/fishsoup/libfishsoup diff --git a/compile.sh b/compile.sh index 73c720b..9f66f30 100755 --- a/compile.sh +++ b/compile.sh @@ -65,7 +65,7 @@ RAYLIB_LIBS=$(pkg-config --libs raylib 2>/dev/null || echo "-lraylib -lm") ODE_CFLAGS=$(pkg-config --cflags ode 2>/dev/null || echo "-I/usr/include") ODE_LIBS=$(pkg-config --libs ode 2>/dev/null || echo "-lode -lm") -# Compile C to executable with raylib and ODE support +# Compile C to executable with libsuicmez, raylib, and ODE support echo "Compiling C code and linking with libsuicmez, raylib, and ODE..." gcc $OPTIMIZE_FLAG -I. "$C_FILE" libsuicmez/libsuicmez.c libsuicmez/suicmez_gc.c $RAYLIB_CFLAGS $RAYLIB_LIBS $ODE_CFLAGS $ODE_LIBS -lm -o "$OUTPUT_BINARY" || exit 1 diff --git a/fishsoup/main b/fishsoup/main deleted file mode 100755 index 2a5d72124fff864969cda6ef9c7f95d8781210c5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 43560 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 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 +#include +#include + +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(); +} diff --git a/libsuicmez/libsuicmez.h b/libsuicmez/libsuicmez.h index 0042020..686bbba 100644 --- a/libsuicmez/libsuicmez.h +++ b/libsuicmez/libsuicmez.h @@ -16,6 +16,9 @@ // ODE support #include +// Perlin noise support +#include "perlin/perlin.h" + // Logging levels typedef enum suic_log_level { SUIC_LOG_ALL = 0, @@ -326,4 +329,67 @@ void suic_player_controller_jump(suic_player_controller* player); void suic_player_controller_get_position(suic_player_controller* player, float *x, float *y, float *z); void suic_player_controller_set_position(suic_player_controller* player, float x, float y, float z); +/* ===== FILE I/O API ===== */ + +typedef void* FileHandle; +typedef enum { + FILE_READ = 0, + FILE_WRITE = 1, + FILE_APPEND = 2 +} FileMode; + +/* Open a file and return a handle. Returns NULL on failure. */ +FileHandle suic_file_open(const char* path, FileMode mode); + +/* Close a file handle */ +void suic_file_close(FileHandle handle); + +/* Read up to size bytes from file. Returns number of bytes read. */ +int suic_file_read(FileHandle handle, void* buffer, int size); + +/* Write up to size bytes to file. Returns number of bytes written. */ +int suic_file_write(FileHandle handle, const void* buffer, int size); + +/* Get file size in bytes. Returns -1 on failure. */ +int suic_file_size(FileHandle handle); + +/* ===== RANDOM NUMBER GENERATION API ===== */ + +/* Seed the random number generator */ +void suic_random_seed(uint32_t seed); + +/* Get a random integer between 0 and 2^31-1 */ +uint32_t suic_random_int(void); + +/* Get a random integer between min and max (inclusive) */ +int suic_random_int_range(int min, int max); + +/* Get a random float between 0.0 and 1.0 */ +float suic_random_float(void); + +/* Get a random float between min and max */ +float suic_random_float_range(float min, float max); + +/* ===== TIME API ===== */ + +/* Get current time in milliseconds since program start */ +uint64_t suic_get_time_ms(void); + +/* Get current time in microseconds since program start */ +uint64_t suic_get_time_us(void); + +/* Get current Unix timestamp in seconds */ +uint64_t suic_get_unix_time(void); + +/* Sleep for milliseconds */ +void suic_sleep_ms(uint32_t ms); + +/* ===== UUID GENERATION API ===== */ + +/* Generate a random UUID v4 and return as string */ +const char* suic_uuid_generate_v4(void); + +/* Generate a random UUID v4 from seed */ +const char* suic_uuid_generate_v4_seeded(uint64_t seed); + #endif // LIBSUICMEZ_H diff --git a/libsuicmez/perlin b/libsuicmez/perlin new file mode 160000 index 0000000..78efd36 --- /dev/null +++ b/libsuicmez/perlin @@ -0,0 +1 @@ +Subproject commit 78efd369ac89a1db0dee71e277bf5e74309ef9fe diff --git a/soup/config.sui b/soup/config.sui new file mode 100644 index 0000000..110da39 --- /dev/null +++ b/soup/config.sui @@ -0,0 +1,61 @@ +# ===== GAME SETTINGS ===== +let GAME_NAME = "Soup" +let GAME_VERSION = "0.1.0" + +# ===== WINDOW/GRAPHICS ===== +let WINDOW_WIDTH = 1280 +let WINDOW_HEIGHT = 720 +let WINDOW_TITLE = "Soup - Voxel Battle Royale" +let TARGET_FPS = 60 +let USE_MSAA_4X = 1 + +# ===== WORLD SETTINGS ===== +# Island generation +let ISLAND_SIZE_X = 512 +let ISLAND_SIZE_Z = 512 +let ISLAND_MAX_HEIGHT = 128 +let ISLAND_VOXEL_SIZE = 1.0 # Size of each voxel in world units + +# Island generation seed (0 = random) +let ISLAND_SCALE = 50.0 # Noise scale for generation +let ISLAND_PERSISTENCE = 0.5 +let ISLAND_LACUNARITY = 2.0 +let ISLAND_OCTAVES = 6 + +# ===== PLAYER SETTINGS ===== +let PLAYER_MOVE_SPEED = 5.0 +let PLAYER_SPRINT_SPEED = 8.0 +let PLAYER_JUMP_FORCE = 8.0 +let PLAYER_HEIGHT = 1.6 +let PLAYER_WIDTH = 0.8 +let PLAYER_MASS = 1.0 +let PLAYER_MOUSE_SENSITIVITY = 0.003 + +# ===== NETWORKING SETTINGS ===== +let SERVER_HOST = "127.0.0.1" +let SERVER_PORT = 8888 +let MAX_PLAYERS = 100 +let MAX_CONNECTIONS = 128 +let NETWORK_TICK_RATE = 20 # Updates per second +let NETWORK_TIMEOUT_MS = 30000 # 30 seconds + +# Message buffer sizes +let MAX_MESSAGE_SIZE = 4096 +let RECV_BUFFER_SIZE = 65536 + +# ===== BATTLE ROYALE SETTINGS ===== +let MATCH_DURATION_SECONDS = 600 # 10 minutes +let ZONE_SHRINK_START = 120 # Seconds before first zone shrink +let ZONE_SHRINK_INTERVAL = 60 # Seconds between zone shrinks +let INITIAL_SAFE_ZONE_RADIUS = 200.0 +let FINAL_SAFE_ZONE_RADIUS = 20.0 + +# ===== PHYSICS SETTINGS ===== +let GRAVITY = -9.81 +let GROUND_FRICTION = 0.5 + +# ===== DEBUG SETTINGS ===== +let DEBUG_MODE = 1 +let SHOW_FPS_METER = 1 +let SHOW_PHYSICS_DEBUG = 0 +let SHOW_NETWORK_DEBUG = 0 diff --git a/fishsoup/main.c b/soup/main.c similarity index 98% rename from fishsoup/main.c rename to soup/main.c index c8665b3..0b35402 100644 --- a/fishsoup/main.c +++ b/soup/main.c @@ -181,7 +181,6 @@ int suic_main(void) { suic_begin_drawing(); suic_clear_background(135, 206, 235, 255); suic_begin_mode3d(camera_x, camera_y, camera_z, target_x, target_y, target_z, 0.000000, 1.000000, 0.000000, 45.000000, 0); - suic_draw_cube(0.000000, -1.000000, 0.000000, 100.000000, 0.100000, 100.000000, 34, 139, 34, 255); suic_draw_cube(cube1_x, cube1_y, cube1_z, 1.000000, 1.000000, 1.000000, 255, 0, 0, 255); suic_draw_cube_wires(cube1_x, cube1_y, cube1_z, 1.000000, 1.000000, 1.000000, 0, 0, 0, 255); suic_draw_cube(cube2_x, cube2_y, cube2_z, 1.000000, 1.000000, 1.000000, 0, 255, 0, 255); diff --git a/soup/main.o b/soup/main.o new file mode 100755 index 0000000000000000000000000000000000000000..1a3592b35c3db32752d08de1ff8efc9b09cde006 GIT binary patch literal 50712 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 int do # Enable antialiasing @@ -260,9 +261,6 @@ fn main() -> int do # 3D mode with calculated camera begin_mode3d(camera_x, camera_y, camera_z, target_x, target_y, target_z, 0.0, 1.0, 0.0, 45.0, 0) - # Draw ground plane - draw_cube(0.0, -1.0, 0.0, 100.0, 0.1, 100.0, 34, 139, 34, 255) # Green ground - # Draw cubes draw_cube(cube1_x, cube1_y, cube1_z, 1.0, 1.0, 1.0, 255, 0, 0, 255) # Red draw_cube_wires(cube1_x, cube1_y, cube1_z, 1.0, 1.0, 1.0, 0, 0, 0, 255) diff --git a/src/c_lowerer/statements_transpiler.rs b/src/c_lowerer/statements_transpiler.rs index 2c6f76c..9f4a1a9 100644 --- a/src/c_lowerer/statements_transpiler.rs +++ b/src/c_lowerer/statements_transpiler.rs @@ -153,7 +153,6 @@ impl StatementsTranspiler { )) } TypedExprKind::Assign(lhs, rhs) => { - // Assignments are expressions in C, so we can transpile them let c_lhs = self.transpile_expr(lhs)?; let c_rhs = self.transpile_expr(rhs)?; Ok(CExpr::Assign(Box::new(c_lhs), Box::new(c_rhs))) @@ -346,7 +345,15 @@ impl StatementsTranspiler { Some(else_expr) => self.expr_to_loop_stmts(else_expr)?, None => vec![], }; - Ok(CStmt::If(c_cond, then_stmts, if else_stmts.is_empty() { None } else { Some(else_stmts) })) + Ok(CStmt::If( + c_cond, + then_stmts, + if else_stmts.is_empty() { + None + } else { + Some(else_stmts) + }, + )) } _ => { // For other expressions, treat as expression statements diff --git a/src/codegen/transpiler.rs b/src/codegen/transpiler.rs index 66a1caa..dd49774 100644 --- a/src/codegen/transpiler.rs +++ b/src/codegen/transpiler.rs @@ -631,6 +631,29 @@ impl Transpiler { // Math functions "sin" => "sin", "cos" => "cos", + "floor" => "floor", + // Perlin noise functions + "pnoise3d" => "pnoise3d", + // File I/O API + "file_open" => "suic_file_open", + "file_close" => "suic_file_close", + "file_read" => "suic_file_read", + "file_write" => "suic_file_write", + "file_size" => "suic_file_size", + // Random number generation API + "random_seed" => "suic_random_seed", + "random_int" => "suic_random_int", + "random_int_range" => "suic_random_int_range", + "random_float" => "suic_random_float", + "random_float_range" => "suic_random_float_range", + // Time API + "get_time_ms" => "suic_get_time_ms", + "get_time_us" => "suic_get_time_us", + "get_unix_time" => "suic_get_unix_time", + "sleep_ms" => "suic_sleep_ms", + // UUID generation API + "uuid_generate_v4" => "suic_uuid_generate_v4", + "uuid_generate_v4_seeded" => "suic_uuid_generate_v4_seeded", _ => func, }; diff --git a/src/typechecker.rs b/src/typechecker.rs index 2490631..84e2f27 100644 --- a/src/typechecker.rs +++ b/src/typechecker.rs @@ -739,21 +739,44 @@ impl TypeChecker { // Key constants let keys = vec![ - "KEY_W", "KEY_A", "KEY_S", "KEY_D", "KEY_SPACE", "KEY_LEFT_SHIFT", - "KEY_EQUAL", "KEY_MINUS", "KEY_KP_ADD", "KEY_KP_SUBTRACT", - "KEY_ESCAPE", "KEY_ENTER", "KEY_TAB", "KEY_BACKSPACE", "KEY_DELETE", - "KEY_HOME", "KEY_END", "KEY_F1", "KEY_F2", "KEY_F3" + "KEY_W", + "KEY_A", + "KEY_S", + "KEY_D", + "KEY_SPACE", + "KEY_LEFT_SHIFT", + "KEY_EQUAL", + "KEY_MINUS", + "KEY_KP_ADD", + "KEY_KP_SUBTRACT", + "KEY_ESCAPE", + "KEY_ENTER", + "KEY_TAB", + "KEY_BACKSPACE", + "KEY_DELETE", + "KEY_HOME", + "KEY_END", + "KEY_F1", + "KEY_F2", + "KEY_F3", ]; for (i, key) in keys.iter().enumerate() { let id = 1000 + i; self.env.name_to_id.insert(key.to_string(), BindingId(id)); - self.env.vars.insert(BindingId(id), VarInfo { - ty: Type::Int, - kind: BindingKind::Default, - name: key.to_string(), - usage: 0, - span: Span { start: 0, end: 0, file: "builtin".to_string() }, - }); + self.env.vars.insert( + BindingId(id), + VarInfo { + ty: Type::Int, + kind: BindingKind::Default, + name: key.to_string(), + usage: 0, + span: Span { + start: 0, + end: 0, + file: "builtin".to_string(), + }, + }, + ); } // Drawing @@ -973,6 +996,33 @@ impl TypeChecker { }, ); + // Perlin noise functions + self.env.functions.insert( + "pnoise3d".to_string(), + FunctionType { + type_params: vec![], + params: vec![ + Type::Float, + Type::Float, + Type::Float, + Type::Float, + Type::Int, + Type::Int, + ], // x, y, z, persistence, octaves, seed + return_type: Type::Float, + }, + ); + + // Other math functions + self.env.functions.insert( + "floor".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Float], + return_type: Type::Float, + }, + ); + // Raylib matrix operations self.env.functions.insert( "rl_push_matrix".to_string(), @@ -1006,6 +1056,150 @@ impl TypeChecker { return_type: Type::Unit, }, ); + + // ===== FILE I/O API ===== + self.env.functions.insert( + "file_open".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Ptr(Box::new(Type::Int)), Type::Int], // path (string), mode + return_type: Type::Ptr(Box::new(Type::Unit)), // FileHandle + }, + ); + self.env.functions.insert( + "file_close".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Ptr(Box::new(Type::Unit))], // handle + return_type: Type::Unit, + }, + ); + self.env.functions.insert( + "file_read".to_string(), + FunctionType { + type_params: vec![], + params: vec![ + Type::Ptr(Box::new(Type::Unit)), + Type::Ptr(Box::new(Type::Int)), + Type::Int, + ], // handle, buffer, size + return_type: Type::Int, + }, + ); + self.env.functions.insert( + "file_write".to_string(), + FunctionType { + type_params: vec![], + params: vec![ + Type::Ptr(Box::new(Type::Unit)), + Type::Ptr(Box::new(Type::Int)), + Type::Int, + ], // handle, buffer, size + return_type: Type::Int, + }, + ); + self.env.functions.insert( + "file_size".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Ptr(Box::new(Type::Unit))], // handle + return_type: Type::Int, + }, + ); + + // ===== RANDOM NUMBER GENERATION API ===== + self.env.functions.insert( + "random_seed".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Int], + return_type: Type::Unit, + }, + ); + self.env.functions.insert( + "random_int".to_string(), + FunctionType { + type_params: vec![], + params: vec![], + return_type: Type::Int, + }, + ); + self.env.functions.insert( + "random_int_range".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Int, Type::Int], // min, max + return_type: Type::Int, + }, + ); + self.env.functions.insert( + "random_float".to_string(), + FunctionType { + type_params: vec![], + params: vec![], + return_type: Type::Float, + }, + ); + self.env.functions.insert( + "random_float_range".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Float, Type::Float], // min, max + return_type: Type::Float, + }, + ); + + // ===== TIME API ===== + self.env.functions.insert( + "get_time_ms".to_string(), + FunctionType { + type_params: vec![], + params: vec![], + return_type: Type::Int, // milliseconds + }, + ); + self.env.functions.insert( + "get_time_us".to_string(), + FunctionType { + type_params: vec![], + params: vec![], + return_type: Type::Int, // microseconds + }, + ); + self.env.functions.insert( + "get_unix_time".to_string(), + FunctionType { + type_params: vec![], + params: vec![], + return_type: Type::Int, // Unix timestamp + }, + ); + self.env.functions.insert( + "sleep_ms".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Int], // milliseconds + return_type: Type::Unit, + }, + ); + + // ===== UUID GENERATION API ===== + self.env.functions.insert( + "uuid_generate_v4".to_string(), + FunctionType { + type_params: vec![], + params: vec![], + return_type: Type::String, + }, + ); + self.env.functions.insert( + "uuid_generate_v4_seeded".to_string(), + FunctionType { + type_params: vec![], + params: vec![Type::Int], // seed + return_type: Type::String, + }, + ); } fn collect_definitions(&mut self, node: &ASTNode) -> Result<(), TypeError> { @@ -1380,6 +1574,7 @@ impl TypeChecker { ExprKind::Tuple(elements) => { let mut typed_elements = Vec::new(); let mut types = Vec::new(); + let len = elements.len(); for elem in elements { let typed_elem = self.typecheck_expr(elem)?; @@ -1387,7 +1582,14 @@ impl TypeChecker { typed_elements.push(typed_elem); } - (TypedExprKind::Tuple(typed_elements), Type::Tuple(types)) + ( + TypedExprKind::Tuple(typed_elements), + if len != 0 { + Type::Tuple(types) + } else { + Type::Unit + }, + ) } ExprKind::BinOp(left, op, right) => { diff --git a/test_player.c b/test_player.c deleted file mode 100644 index 28c6fa0..0000000 --- a/test_player.c +++ /dev/null @@ -1,46 +0,0 @@ -#include "../libsuicmez/libsuicmez.h" -#include -#include -#include -#include - -void* gc_alloc(const TypeInfo* type, size_t size); -void gc_init(void); -void gc_shutdown(void); - -// Helper for allocating arrays -static void* suic_alloc_array(const TypeInfo* type, size_t elem_size, size_t len, void* init_data) { - void* ptr = gc_alloc(type, elem_size * len); - if (init_data) memcpy(ptr, init_data, elem_size * len); - return ptr; -} - -// Helper for allocating structs -static void* suic_alloc_struct(const TypeInfo* type, size_t size, void* init_data) { - void* ptr = gc_alloc(type, size); - if (init_data) memcpy(ptr, init_data, size); - return ptr; -} - - - - -int suic_main(void); - - -int suic_main(void) { - void* p = suic_player_controller_create(0.000000, 1.000000, 2.000000); - return 0; -} - -int main(int argc, char* argv[]) { - // Initialize GC - gc_init(); - // init globals - // init event loop - int result = suic_main(); - // Shutdown GC - gc_shutdown(); - return result; -} - diff --git a/test_player.sui b/test_player.sui deleted file mode 100644 index 2fb5b01..0000000 --- a/test_player.sui +++ /dev/null @@ -1 +0,0 @@ -fn main() -> int do let p = player_controller_create(0.0, 1.0, 2.0); 0 end diff --git a/test_window.sui b/test_window.sui deleted file mode 100644 index 6a87cfa..0000000 --- a/test_window.sui +++ /dev/null @@ -1 +0,0 @@ -fn main() -> int do init_window(800, 600, "Test"); set_target_fps(60); while window_should_close() == false do begin_drawing(); clear_background(255, 0, 0, 255); end_drawing(); end; close_window(); 0 end diff --git a/test_window.c b/tests/test_new_apis.c similarity index 68% rename from test_window.c rename to tests/test_new_apis.c index a986976..3f43f86 100644 --- a/test_window.c +++ b/tests/test_new_apis.c @@ -1,4 +1,5 @@ -#include "../libsuicmez/libsuicmez.h" +#include "libsuicmez/libsuicmez.h" +#include "libfishsoup/suicmez_stdlib.h" #include #include #include @@ -29,14 +30,15 @@ int suic_main(void); int suic_main(void) { - suic_init_window(800, 600, suic_alloc_array(NULL, sizeof(char), 5, "Test")); - suic_set_target_fps(60); - while ((suic_window_should_close() == false)) { - suic_begin_drawing(); - suic_clear_background(255, 0, 0, 255); - suic_end_drawing(); - } - suic_close_window(); + suic_random_seed(42); + int r = suic_random_int(); + int r_range = suic_random_int_range(1, 10); + float f = suic_random_float(); + int t_ms = suic_get_time_ms(); + int t_us = suic_get_time_us(); + int unix_ts = suic_get_unix_time(); + char* uuid = suic_uuid_generate_v4(); + char* uuid2 = suic_uuid_generate_v4_seeded(12345); return 0; }