A lightweight package that implements Godot-style signals to enable the observer pattern in Odin
HealthStruct :: struct {
health: int,
max: int,
damage_taken: int
}
Player :: struct {
health: int,
max: int,
health_changed: osignals.Signal(HealthStruct)
}
player_init :: proc(p: ^Player) {
p.health = 100
p.max = 100
osignals.signal_init(&p.health_changed)
}
player_destroy :: proc(p: ^Player) {
osignals.signal_destroy(&p.health_changed)
}
player_take_damage :: proc(p: ^Player, amount: int) {
old_health := p.health
p.health = max(0, p.health - amount)
data := HealthStruct{
health = p.health,
max = p.max,
damage_taken = amount,
}
osignals.signal_emit(&p.health_changed, data)
}
player_health_updated :: proc(data: HealthStruct) {
fmt.println("Current health: ", data.health)
fmt.println("Damage Taken: ", data.damage_taken)
}
main :: proc() {
player: Player
player_init(&player)
defer player_destroy(&player)
osignals.signal_connect(&player.health_changed, player_health_updated)
player_take_damage(&player, 10)
}