package demonchime import "base:runtime" import "core:c" import "core:c/libc" import "core:fmt" import "core:log" import "core:mem" import os "core:os/os2" import rl "vendor:raylib" import "draw" import "phys" Vec2 :: [2]f32 Rect :: struct { start: Vec2, size: Vec2, } state: struct { camera: rl.Camera2D, platform_list: Entity_List(Platform), } logger: log.Logger raylib_log :: proc "c" ( msg_type: rl.TraceLogLevel, fmt: cstring, args: ^c.va_list, ) { context = runtime.default_context() context.logger = logger msg_bytes: [1028]u8 libc.vsnprintf(raw_data(msg_bytes[:]), 1028, fmt, args) msg := string(msg_bytes[:]) #partial switch msg_type { case .DEBUG: log.debug(msg) case .INFO: log.info(msg) case .WARNING: log.warn(msg) case .ERROR: log.error(msg) case .FATAL: log.fatal(msg) } } die :: proc(msg: string, args: ..any, #any_int exit_code := 1) { log.fatalf(msg, args) os.exit(exit_code) } init :: proc() { state.camera.zoom = 1 init_keybinds() draw.init() init_player() open_room(.ROOM_BEGIN) } frame :: proc() { update_player(rl.GetFrameTime()) draw.new_frame() rl.BeginMode2D(state.camera) draw_player() draw_room(current_room.id) // draw_platforms() rl.EndMode2D() fps_text := fmt.caprintf( "FPS: %v", rl.GetFPS(), allocator = context.temp_allocator, ) rl.DrawText(fps_text, 5, 5, 8, rl.GREEN) draw.end_frame() } cleanup :: proc() { delete_player() delete_entity_list(state.platform_list) phys.destroy_world() } main :: proc() { when ODIN_DEBUG { track: mem.Tracking_Allocator mem.tracking_allocator_init(&track, context.allocator) context.allocator = mem.tracking_allocator(&track) defer { if len(track.allocation_map) > 0 { fmt.eprintf( "=== %v allocations not freed: ===\n", len(track.allocation_map), ) total := 0 for _, entry in track.allocation_map { fmt.eprintf( "- %v bytes @ %v (%v, mode %v)\n", entry.size, entry.location, entry.err, entry.mode, ) total += entry.size } fmt.eprintf("=== a total of %v bytes unfreed ===\n", total) } mem.tracking_allocator_destroy(&track) } } logger = log.create_console_logger() context.logger = logger defer log.destroy_console_logger(logger) rl.SetTraceLogCallback(raylib_log) rl.InitWindow(480 * 2, 360 * 2, "Demonchime") rl.SetWindowState({.WINDOW_RESIZABLE}) rl.SetTargetFPS(240) init() for !rl.WindowShouldClose() { frame() free_all(context.temp_allocator) } cleanup() }