Use enum for object movement type

This commit is contained in:
Kp 2016-11-20 23:12:00 +00:00
parent 4497812674
commit 0c219e596e
8 changed files with 47 additions and 15 deletions

View file

@ -19,6 +19,13 @@
struct bitmap_index;
namespace dcx {
// Movement types
enum movement_type_t : uint8_t;
}
constexpr std::size_t MAX_OBJECTS = 350;
#ifdef dsx
namespace dsx {
@ -62,12 +69,6 @@ constexpr control_type_t CT_LIGHT = 14; // doesn't actually do anything
constexpr control_type_t CT_REMOTE = 15; // controlled by another net player
constexpr control_type_t CT_CNTRLCEN = 16; // the control center/main reactor
// Movement types
typedef unsigned movement_type_t;
constexpr movement_type_t MT_NONE = 0; // doesn't move
constexpr movement_type_t MT_PHYSICS = 1; // moves by physics
constexpr movement_type_t MT_SPINNING = 3; // this object doesn't move, just sits and spins
// Render types
typedef unsigned render_type_t;
constexpr render_type_t RT_NONE = 0; // does not render

View file

@ -75,6 +75,13 @@ enum object_type_t : uint8_t
OBJ_MARKER = 15, // a map marker
};
enum movement_type_t : uint8_t
{
MT_NONE = 0, // doesn't move
MT_PHYSICS = 1, // moves by physics
MT_SPINNING = 3, // this object doesn't move, just sits and spins
};
}
namespace dsx {
@ -371,7 +378,7 @@ struct object_base
ubyte id; // which form of object...which powerup, robot, etc.
objnum_t next,prev; // id of next and previous connected object in Objects, -1 = no connection
ubyte control_type; // how this object is controlled
ubyte movement_type; // how this object moves
movement_type_t movement_type; // how this object moves
ubyte render_type; // how this object renders
ubyte flags; // misc flags
segnum_t segnum; // segment number containing object
@ -516,6 +523,18 @@ struct obj_position
dxx_object_type_ref.type = static_cast<object_type_t>(dxx_object_type_value); \
} DXX_END_COMPOUND_STATEMENT )
#define set_object_movement_type(O,T) \
( DXX_BEGIN_COMPOUND_STATEMENT { \
object_base &dxx_object_movement_type_ref = (O); \
const uint8_t &dxx_object_movement_type_value = (T); \
assert( \
dxx_object_movement_type_value == MT_NONE || \
dxx_object_movement_type_value == MT_PHYSICS || \
dxx_object_movement_type_value == MT_SPINNING \
); \
dxx_object_movement_type_ref.movement_type = static_cast<movement_type_t>(dxx_object_movement_type_value); \
} DXX_END_COMPOUND_STATEMENT )
}
#define Highest_object_index (Objects.get_count() - 1)

View file

@ -364,7 +364,7 @@ static void read_object(const vobjptr_t obj,PHYSFS_File *f,int version)
}
#endif
obj->control_type = PHYSFSX_readByte(f);
obj->movement_type = PHYSFSX_readByte(f);
set_object_movement_type(*obj, PHYSFSX_readByte(f));
obj->render_type = PHYSFSX_readByte(f);
obj->flags = PHYSFSX_readByte(f);

View file

@ -254,7 +254,7 @@ void do_morph_frame(const vobjptr_t obj)
if (!md->n_submodels_active) { //done morphing!
md->obj->control_type = md->morph_save_control_type;
md->obj->movement_type = md->morph_save_movement_type;
set_object_movement_type(*md->obj, md->morph_save_movement_type);
md->obj->render_type = RT_POLYOBJ;

View file

@ -5792,7 +5792,7 @@ void multi_object_rw_to_object(object_rw *obj_rw, const vobjptr_t obj)
obj->next = obj_rw->next;
obj->prev = obj_rw->prev;
obj->control_type = obj_rw->control_type;
obj->movement_type = obj_rw->movement_type;
set_object_movement_type(*obj, obj_rw->movement_type);
obj->render_type = obj_rw->render_type;
obj->flags = obj_rw->flags;
obj->segnum = obj_rw->segnum;
@ -5820,6 +5820,8 @@ void multi_object_rw_to_object(object_rw *obj_rw, const vobjptr_t obj)
switch (obj->movement_type)
{
case MT_NONE:
break;
case MT_PHYSICS:
obj->mtype.phys_info.velocity.x = obj_rw->mtype.phys_info.velocity.x;
obj->mtype.phys_info.velocity.y = obj_rw->mtype.phys_info.velocity.y;

View file

@ -617,7 +617,11 @@ static void nd_read_object(const vobjptridx_t obj)
case OBJ_POWERUP:
obj->control_type = CT_POWERUP;
nd_read_byte(&obj->movement_type); // might have physics movement
{
uint8_t movement_type;
nd_read_byte(&movement_type); // might have physics movement
set_object_movement_type(*obj, movement_type);
}
obj->size = Powerup_info[get_powerup_id(obj)].size;
break;
@ -639,7 +643,11 @@ static void nd_read_object(const vobjptridx_t obj)
default:
nd_read_byte(&obj->control_type);
nd_read_byte(&obj->movement_type);
{
uint8_t movement_type;
nd_read_byte(&movement_type);
set_object_movement_type(*obj, movement_type);
}
nd_read_fix(&(obj->size));
break;
}

View file

@ -1132,7 +1132,7 @@ objptridx_t obj_create(object_type_t type, ubyte id,vsegptridx_t segnum,const vm
obj->orient = orient?*orient:vmd_identity_matrix;
obj->control_type = ctype;
obj->movement_type = mtype;
set_object_movement_type(*obj, mtype);
obj->render_type = rtype;
obj->contains_type = -1;
obj->contains_id = -1;

View file

@ -298,7 +298,7 @@ static void state_object_rw_to_object(const object_rw *const obj_rw, const vobjp
obj->next = obj_rw->next;
obj->prev = obj_rw->prev;
obj->control_type = obj_rw->control_type;
obj->movement_type = obj_rw->movement_type;
set_object_movement_type(*obj, obj_rw->movement_type);
obj->render_type = obj_rw->render_type;
obj->flags = obj_rw->flags;
obj->segnum = obj_rw->segnum;
@ -326,6 +326,8 @@ static void state_object_rw_to_object(const object_rw *const obj_rw, const vobjp
switch (obj->movement_type)
{
case MT_NONE:
break;
case MT_PHYSICS:
obj->mtype.phys_info.velocity.x = obj_rw->mtype.phys_info.velocity.x;
obj->mtype.phys_info.velocity.y = obj_rw->mtype.phys_info.velocity.y;
@ -1027,7 +1029,7 @@ int state_save_all_sub(const char *filename, const char *desc)
md = find_morph_data(objp);
if (md) {
md->obj->control_type = md->morph_save_control_type;
md->obj->movement_type = md->morph_save_movement_type;
set_object_movement_type(*md->obj, md->morph_save_movement_type);
md->obj->render_type = RT_POLYOBJ;
md->obj->mtype.phys_info = md->morph_save_phys_info;
md->obj = NULL;