73 lines
1.1 KiB
Odin
73 lines
1.1 KiB
Odin
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,
|
|
Attack,
|
|
}
|
|
|
|
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
|
|
case Attack:
|
|
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
|
|
}
|