package main import hm "core:container/handle_map" import rl "vendor:raylib" MAX_GFX :: 2 Handle :: hm.Handle32 MAX_ENTITIES :: 1024 BaseEntity :: struct { pos: rl.Vector2, vel: rl.Vector2, col_size: f32, marked: bool, gfx: [MAX_GFX]Graphics, } Actor :: struct { using base: BaseEntity, hp: i32, max_hp: i32, speed: f32, } EntityVariant :: union { Player, Enemy, GroundItem, FX, } Entity :: struct { handle: Handle, v: EntityVariant, } get_base :: proc(e: ^Entity) -> ^BaseEntity { #partial switch &v in e.v { case Player: return cast(^BaseEntity)&v case Enemy: return cast(^BaseEntity)&v case GroundItem: return cast(^BaseEntity)&v case FX: return cast(^BaseEntity)&v } return nil } get_actor :: proc(e: ^Entity) -> ^Actor { #partial switch &v in e.v { case Player: return &v.actor case Enemy: return &v.actor } return nil } get_player :: proc(state: ^GameState) -> (^Entity, ^Player) { e := get_entity(state, state.player) if e == nil do return nil, nil p, ok := &e.v.(Player) if !ok do return nil, nil return e, p }