Improved Object signature assignment and made sure there will be no duplicates; Also used short-ranged values only so Demo system won't screw up

This commit is contained in:
zicodxx 2010-01-28 15:26:27 +00:00
parent 5d3ea4051f
commit 61e67d9fe9
6 changed files with 38 additions and 25 deletions

View file

@ -7,6 +7,7 @@ main/newdemo.c: Added a new code to properly re-record view/cockpit-events at be
arch/sdl/window.c, main/automap.c, main/escort.c, main/game.c, main/gamecntl.c, main/kconfig.c, main/menu.c, main/net_ipx.c, main/net_udp.c, main/newmenu.c: Make response to EVENT_WINDOW_CLOSE conform to 'handling' system - returning 1 means abort closing
main/kconfig.c, main/newmenu.c: Tidy up newmenu_show/hide_cursor calls
main/newmenu.c: Allow user to abort close, for whatever reason (helps with my next commit)
main/gamesave.c, main/newdemo.c, main/object.c, main/object.h, main/state.c: Improved Object signature assignment and made sure there will be no duplicates; Also used short-ranged values only so Demo system won't screw up
20100127
--------

View file

@ -786,7 +786,7 @@ int load_game_data(CFILE *LoadFile)
}
//===================== READ PLAYER INFO ==========================
Object_next_signature = 0;
//===================== READ OBJECT INFO ==========================
@ -801,7 +801,7 @@ int load_game_data(CFILE *LoadFile)
read_object(&Objects[i], LoadFile, game_top_fileinfo_version);
Objects[i].signature = Object_next_signature++;
Objects[i].signature = obj_get_signature();
verify_object( &Objects[i] );
}

View file

@ -454,6 +454,7 @@ object *prev_obj=NULL; //ptr to last object read in
void nd_read_object(object *obj)
{
memset(obj, 0, sizeof(object));
short shortsig = 0;
/*
* Do render type first, since with render_type == RT_NONE, we
@ -466,20 +467,8 @@ void nd_read_object(object *obj)
nd_read_byte((sbyte *) &(obj->id));
nd_read_byte((sbyte *) &(obj->flags));
nd_read_short((short *)&(obj->signature));
/* This doesn't make sense, since the object signature is supposed to
be an int, but a short is probably half the size on many platforms.
The problem then is that probably only half the signature will be
initialized. This is definitely not portable.
See the typedef struct object's signature field in object.h to see
what I mean. The compiler warning with my gcc 4.2.3 seems to be
warranted.
Kip (kip@thevertigo.com)
*/
nd_read_short(&shortsig);
obj->signature = shortsig; // It's OKAY! We made sure, obj->signature is never has a value which short cannot handle!!! We cannot do this otherwise, without breaking the demo format!
nd_read_shortpos(obj);
if ((obj->type == OBJ_ROBOT) && (obj->id == SPECIAL_REACTOR_ROBOT))
@ -690,6 +679,7 @@ void nd_read_object(object *obj)
void nd_write_object(object *obj)
{
int life;
short shortsig = 0;
if ((obj->type == OBJ_ROBOT) && (obj->id == SPECIAL_REACTOR_ROBOT))
Int3();
@ -705,7 +695,8 @@ void nd_write_object(object *obj)
nd_write_byte(obj->id);
nd_write_byte(obj->flags);
nd_write_short((short)obj->signature);
shortsig = obj->signature; // It's OKAY! We made sure, obj->signature is never has a value which short cannot handle!!! We cannot do this otherwise, without breaking the demo format!
nd_write_short(shortsig);
nd_write_shortpos(obj);
if ((obj->type != OBJ_HOSTAGE) && (obj->type != OBJ_ROBOT) && (obj->type != OBJ_PLAYER) && (obj->type != OBJ_POWERUP) && (obj->type != OBJ_CLUTTER)) {

View file

@ -1031,7 +1031,29 @@ void obj_unlink(int objnum)
Assert(Objects[0].prev != 0);
}
int Object_next_signature = 1; //player gets 0, others start at 1
// Returns a new, unique signature for a new object
int obj_get_signature()
{
static short sig = 0; // Yes! Short! a) We do not need higher values b) the demo system only stores shorts
int free = 0, i = 0;
while (!free)
{
free = 1;
sig++;
if (sig < 0)
sig = 0;
for (i = 0; i <= MAX_OBJECTS; i++)
{
if ((sig == Objects[i].signature) && (Objects[i].type != OBJ_NONE))
{
free = 0;
}
}
}
return sig;
}
int Debris_object_count=0;
@ -1217,7 +1239,7 @@ int obj_create(ubyte type,ubyte id,int segnum,vms_vector *pos,
// in uninitialized fields.
memset( obj, 0, sizeof(object) );
obj->signature = Object_next_signature++;
obj->signature = obj_get_signature();
obj->type = type;
obj->id = id;
obj->last_pos = *pos;
@ -1311,7 +1333,7 @@ int obj_create_copy(int objnum, vms_vector *new_pos, int newsegnum)
obj_link(newobjnum,newsegnum);
obj->signature = Object_next_signature++;
obj->signature = obj_get_signature();
//we probably should initialize sub-structures here

View file

@ -423,6 +423,9 @@ extern void extract_shortpos(object *objp, shortpos *spp, int swap_bytes);
// between levels if clear_all is set, clear even proximity bombs
void clear_transient_objects(int clear_all);
// Returns a new, unique signature for a new object
int obj_get_signature();
// returns the number of a free object, updating Highest_object_index.
// Generally, obj_create() should be called to get an object, since it
// fills in important fields and does the linking. returns -1 if no

View file

@ -894,7 +894,6 @@ int state_restore_all_sub(char *filename, int secret_restore)
Highest_object_index = i-1;
object_read_n_swap(Objects, i, swap, fp);
Object_next_signature = 0;
for (i=0; i<=Highest_object_index; i++ ) {
obj = &Objects[i];
obj->rtype.pobj_info.alt_textures = -1;
@ -902,8 +901,6 @@ int state_restore_all_sub(char *filename, int secret_restore)
obj->next = obj->prev = obj->segnum = -1;
if ( obj->type != OBJ_NONE ) {
obj_link(i,segnum);
if ( obj->signature > Object_next_signature )
Object_next_signature = obj->signature;
}
//look for, and fix, boss with bogus shields
@ -921,8 +918,7 @@ int state_restore_all_sub(char *filename, int secret_restore)
}
special_reset_objects();
Object_next_signature++;
// 1 = Didn't die on secret level.
// 2 = Died on secret level.
if (secret_restore && (Current_level_num >= 0)) {