145 lines
3.3 KiB
C
145 lines
3.3 KiB
C
|
#if !defined(HANDMADE_SIM_REGION_H)
|
||
|
/* ========================================================================
|
||
|
$File: $
|
||
|
$Date: $
|
||
|
$Revision: $
|
||
|
$Creator: Casey Muratori $
|
||
|
$Notice: (C) Copyright 2015 by Molly Rocket, Inc. All Rights Reserved. $
|
||
|
======================================================================== */
|
||
|
|
||
|
struct move_spec
|
||
|
{
|
||
|
bool32 UnitMaxAccelVector;
|
||
|
real32 Speed;
|
||
|
real32 Drag;
|
||
|
};
|
||
|
|
||
|
enum entity_type
|
||
|
{
|
||
|
EntityType_Null,
|
||
|
|
||
|
EntityType_Space,
|
||
|
|
||
|
EntityType_Hero,
|
||
|
EntityType_Wall,
|
||
|
EntityType_Familiar,
|
||
|
EntityType_Monstar,
|
||
|
EntityType_Sword,
|
||
|
EntityType_Stairwell,
|
||
|
};
|
||
|
|
||
|
#define HIT_POINT_SUB_COUNT 4
|
||
|
struct hit_point
|
||
|
{
|
||
|
// TODO(casey): Bake this down into one variable
|
||
|
uint8 Flags;
|
||
|
uint8 FilledAmount;
|
||
|
};
|
||
|
|
||
|
// TODO(casey): Rename sim_entity to entity!
|
||
|
struct sim_entity;
|
||
|
union entity_reference
|
||
|
{
|
||
|
sim_entity *Ptr;
|
||
|
uint32 Index;
|
||
|
};
|
||
|
|
||
|
enum sim_entity_flags
|
||
|
{
|
||
|
// TODO(casey): Does it make more sense to have the flag be for _non_ colliding entities?
|
||
|
// TODO(casey): Collides and ZSupported probably can be removed now/soon
|
||
|
EntityFlag_Collides = (1 << 0),
|
||
|
EntityFlag_Nonspatial = (1 << 1),
|
||
|
EntityFlag_Moveable = (1 << 2),
|
||
|
EntityFlag_ZSupported = (1 << 3),
|
||
|
EntityFlag_Traversable = (1 << 4),
|
||
|
|
||
|
EntityFlag_Simming = (1 << 30),
|
||
|
};
|
||
|
|
||
|
introspect(category:"sim_region") struct sim_entity_collision_volume
|
||
|
{
|
||
|
v3 OffsetP;
|
||
|
v3 Dim;
|
||
|
};
|
||
|
|
||
|
introspect(category:"sim_region") struct sim_entity_collision_volume_group
|
||
|
{
|
||
|
sim_entity_collision_volume TotalVolume;
|
||
|
|
||
|
// TODO(casey): VolumeCount is always expected to be greater than 0 if the entity
|
||
|
// has any volume... in the future, this could be compressed if necessary to say
|
||
|
// that the VolumeCount can be 0 if the TotalVolume should be used as the only
|
||
|
// collision volume for the entity.
|
||
|
u32 VolumeCount;
|
||
|
sim_entity_collision_volume *Volumes;
|
||
|
};
|
||
|
|
||
|
introspect(category:"regular butter") struct sim_entity
|
||
|
{
|
||
|
// NOTE(casey): These are only for the sim region
|
||
|
world_chunk *OldChunk;
|
||
|
u32 StorageIndex;
|
||
|
b32 Updatable;
|
||
|
|
||
|
//
|
||
|
|
||
|
entity_type Type;
|
||
|
u32 Flags;
|
||
|
|
||
|
v3 P;
|
||
|
v3 dP;
|
||
|
|
||
|
r32 DistanceLimit;
|
||
|
|
||
|
sim_entity_collision_volume_group *Collision;
|
||
|
|
||
|
r32 FacingDirection;
|
||
|
r32 tBob;
|
||
|
|
||
|
s32 dAbsTileZ;
|
||
|
|
||
|
// TODO(casey): Should hitpoints themselves be entities?
|
||
|
u32 HitPointMax;
|
||
|
hit_point HitPoint[16];
|
||
|
|
||
|
entity_reference Sword;
|
||
|
|
||
|
// TODO(casey): Only for stairwells!
|
||
|
v2 WalkableDim;
|
||
|
r32 WalkableHeight;
|
||
|
|
||
|
// TODO(casey): Generation index so we know how "up to date" this entity is.
|
||
|
};
|
||
|
|
||
|
struct sim_entity_hash
|
||
|
{
|
||
|
sim_entity *Ptr;
|
||
|
uint32 Index;
|
||
|
};
|
||
|
|
||
|
introspect(category:"regular butter") struct sim_region
|
||
|
{
|
||
|
// TODO(casey): Need a hash table here to map stored entity indices
|
||
|
// to sim entities!
|
||
|
|
||
|
world *World;
|
||
|
r32 MaxEntityRadius;
|
||
|
r32 MaxEntityVelocity;
|
||
|
|
||
|
world_position Origin;
|
||
|
rectangle3 Bounds;
|
||
|
rectangle3 UpdatableBounds;
|
||
|
|
||
|
u32 MaxEntityCount;
|
||
|
u32 EntityCount;
|
||
|
sim_entity *Entities;
|
||
|
|
||
|
// TODO(casey): Do I really want a hash for this??
|
||
|
// NOTE(casey): Must be a power of two!
|
||
|
sim_entity_hash Hash[4096];
|
||
|
};
|
||
|
|
||
|
#define HANDMADE_SIM_REGION_H
|
||
|
#endif
|