From 3223d4f41d55c6af006d326b7b6f4450598fb0da Mon Sep 17 00:00:00 2001 From: wooshings Date: Fri, 16 Oct 2026 12:31:41 -0700 Subject: [PATCH] timers --- src/signals.odin | 25 +++++++++++++++++++++++++ src/systems.odin | 4 ++-- src/timer.odin | 38 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 src/signals.odin create mode 100644 src/timer.odin diff --git a/src/signals.odin b/src/signals.odin new file mode 100644 index 0000000..675058c --- /dev/null +++ b/src/signals.odin @@ -0,0 +1,25 @@ +package shoal + +@(private) +signal_buffer_b: [dynamic]string +@(private) +signal_buffer_a: [dynamic]string + +write :: proc(name: string) { + append(&signal_buffer_b, name) +} + +read :: proc(name: string) -> bool { + for s in signal_buffer_a { + if s == name {return true} + } + for s in signal_buffer_b { + if s == name {return true} + } + return false +} + +signal_system :: proc() { + signal_buffer_a = signal_buffer_b + clear(&signal_buffer_b) +} diff --git a/src/systems.odin b/src/systems.odin index c89b138..599d092 100644 --- a/src/systems.odin +++ b/src/systems.odin @@ -3,9 +3,9 @@ package shoal import rl "vendor:raylib" DefaultPlugin :: proc(app: ^App) { - app.systems = make(map[int][dynamic]proc()) - add_system(app, DRAW, draw_sprite) + add_system(app, UPDATE, signal_system) + add_system(app, UPDATE, run_timers) display := spawn_entity(app) add_component( diff --git a/src/timer.odin b/src/timer.odin new file mode 100644 index 0000000..72869ee --- /dev/null +++ b/src/timer.odin @@ -0,0 +1,38 @@ +package shoal + +import "core:fmt" +import rl "vendor:raylib" + +Timer :: struct { + lifetime: f32, + signal: string, +} + +@(private) +timers: [dynamic]Timer + +start_timer :: proc(time: f32, signal: string = "") -> int { + new_timer: Timer + new_timer.lifetime = time + append(&timers, new_timer) + return len(timers) +} + +get_timer :: proc(index: int) -> Timer { + if index <= len(timers) - 1 { + return timers[index] + } + return Timer{} +} + +run_timers :: proc() { + for &t, i in timers { + t.lifetime -= rl.GetFrameTime() + if t.lifetime <= 0 { + unordered_remove(&timers, i) + if t.signal != "" { + write(t.signal) + } + } + } +}