diff --git a/CHANGELOG.txt b/CHANGELOG.txt index bee03a083..f9bd416f4 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -6,6 +6,7 @@ arch/sdl/window.c: In window_close() prev window did not get EVENT_WINDOW_ACTIVA arch/ogl/ogl.c, include/ogl_init.h, main/ai.c, main/ai.h, main/aipath.c, main/aistruct.h, main/collide.c, main/controls.c, main/fuelcen.c, main/game.c, main/game.h, main/gamecntl.c, main/gameseq.c, main/gauges.c, main/laser.c, main/lighting.c, main/mglobal.c, main/multi.c, main/multi.h, main/multibot.c, main/net_ipx.c, main/net_udp.c, main/newdemo.c, main/object.c, main/object.h, main/player.c, main/player.h, main/playsave.c, main/playsave.h, main/powerup.c, main/state.c, main/state.h, main/weapon.c: Made GameTime to GameTime64 using fix64; Changed all structures saving GameTime64 for internal timer purposes to store fix64 and added converting functions to save such times in fix; For Savegames/Demos always reset GameTime64 to 0 while saving and putting all timer values to safe limits, Multiplayer objects are sent in similar fashion main/game.c: Use game_init_render_buffers for editor (for now), fixing crash main/gamecntl.c, main/net_udp.c: Fix warning for deliberate GameTime64 wrap; uncomment multi_object_to_object_rw and multi_object_rw_to_object prototypes +main/collide.c, main/object.c, main/object.h, main/state.c: added hitobj_list to struct laser_info to get a bit cleaner code 20101211 -------- diff --git a/main/collide.c b/main/collide.c index 26451fb1b..bdf5c10bb 100644 --- a/main/collide.c +++ b/main/collide.c @@ -807,9 +807,9 @@ void collide_weapon_and_controlcen( object * weapon, object *controlcen, vms_vec if (weapon->mtype.phys_info.flags & PF_PERSISTENT) { damage = weapon->shields*2; // to not alter Gameplay too much, multiply damage by 2. - if (!hitobj_list[weapon-Objects][controlcen-Objects]) + if (!weapon->ctype.laser_info.hitobj_list[controlcen-Objects]) { - hitobj_list[weapon-Objects][controlcen-Objects] = 1; + weapon->ctype.laser_info.hitobj_list[controlcen-Objects] = 1; weapon->ctype.laser_info.last_hitobj = controlcen-Objects; } else @@ -924,9 +924,9 @@ void collide_robot_and_weapon( object * robot, object * weapon, vms_vector *coll */ if (weapon->mtype.phys_info.flags & PF_PERSISTENT) { - if (!hitobj_list[weapon-Objects][robot-Objects]) + if (!weapon->ctype.laser_info.hitobj_list[robot-Objects]) { - hitobj_list[weapon-Objects][robot-Objects] = 1; + weapon->ctype.laser_info.hitobj_list[robot-Objects] = 1; weapon->ctype.laser_info.last_hitobj = robot-Objects; } else @@ -1247,9 +1247,9 @@ void collide_player_and_weapon( object * player, object * weapon, vms_vector *co */ if (weapon->mtype.phys_info.flags & PF_PERSISTENT) { - if (!hitobj_list[weapon-Objects][player-Objects]) + if (!weapon->ctype.laser_info.hitobj_list[player-Objects]) { - hitobj_list[weapon-Objects][player-Objects] = 1; + weapon->ctype.laser_info.hitobj_list[player-Objects] = 1; weapon->ctype.laser_info.last_hitobj = player-Objects; } else diff --git a/main/object.c b/main/object.c index 51febeb7b..47cf79d93 100644 --- a/main/object.c +++ b/main/object.c @@ -83,7 +83,6 @@ void obj_detach_one(object *sub); */ ubyte CollisionResult[MAX_OBJECT_TYPES][MAX_OBJECT_TYPES]; -ubyte hitobj_list[MAX_OBJECTS][MAX_OBJECTS]; // last_hitobj of laser_inof struct can only keep track of one object. Still a persistent laser can hit several objects at the same time. This list keeps track of those while last_hitobj will only represent the most recent (the last) hitobj. object *ConsoleObject; //the object that is the player @@ -1130,7 +1129,7 @@ int obj_create(ubyte type,ubyte id,int segnum,vms_vector *pos, obj->mtype.phys_info.flags |= (Weapon_info[obj->id].persistent*PF_PERSISTENT); obj->ctype.laser_info.creation_time = GameTime64; obj->ctype.laser_info.last_hitobj = -1; - memset(&hitobj_list[objnum], 0, sizeof(ubyte)*MAX_OBJECTS); + memset(&obj->ctype.laser_info.hitobj_list, 0, sizeof(ubyte)*MAX_OBJECTS); obj->ctype.laser_info.multiplier = F1_0; } diff --git a/main/object.h b/main/object.h index 0e80726ea..0c070d40f 100644 --- a/main/object.h +++ b/main/object.h @@ -167,24 +167,25 @@ typedef struct physics_info { //stuctures for different kinds of simulation typedef struct laser_info { - short parent_type; // The type of the parent of this object - short parent_num; // The object's parent's number - int parent_signature; // The object's parent's signature... - fix64 creation_time; // Absolute time of creation. - short last_hitobj; // For persistent weapons (survive object collision), object it most recently hit. NOTE: SEE hitobj_list!!! - short track_goal; // Object this object is tracking. - fix multiplier; // Power if this is a fusion bolt (or other super weapon to be added). + short parent_type; // The type of the parent of this object + short parent_num; // The object's parent's number + int parent_signature; // The object's parent's signature... + fix64 creation_time; // Absolute time of creation. + short last_hitobj; // For persistent weapons (survive object collision), object it most recently hit. + ubyte hitobj_list[MAX_OBJECTS]; // list of all objects persistent weapon has already damaged (useful in case it's in contact with two objects at the same time) + short track_goal; // Object this object is tracking. + fix multiplier; // Power if this is a fusion bolt (or other super weapon to be added). } __pack__ laser_info; // Same as above but structure Savegames/Multiplayer objects expect typedef struct laser_info_rw { - short parent_type; // The type of the parent of this object - short parent_num; // The object's parent's number - int parent_signature; // The object's parent's signature... - fix creation_time; // Absolute time of creation. - short last_hitobj; // For persistent weapons (survive object collision), object it most recently hit. NOTE: SEE hitobj_list!!! - short track_goal; // Object this object is tracking. - fix multiplier; // Power if this is a fusion bolt (or other super weapon to be added). + short parent_type; // The type of the parent of this object + short parent_num; // The object's parent's number + int parent_signature; // The object's parent's signature... + fix creation_time; // Absolute time of creation. + short last_hitobj; // For persistent weapons (survive object collision), object it most recently hit. + short track_goal; // Object this object is tracking. + fix multiplier; // Power if this is a fusion bolt (or other super weapon to be added). } __pack__ laser_info_rw; extern ubyte hitobj_list[MAX_OBJECTS][MAX_OBJECTS]; diff --git a/main/state.c b/main/state.c index fa7faabb8..db6ade031 100644 --- a/main/state.c +++ b/main/state.c @@ -328,6 +328,7 @@ void state_object_rw_to_object(object_rw *obj_rw, object *obj) obj->ctype.laser_info.parent_signature = obj_rw->ctype.laser_info.parent_signature; obj->ctype.laser_info.creation_time = obj_rw->ctype.laser_info.creation_time; obj->ctype.laser_info.last_hitobj = obj_rw->ctype.laser_info.last_hitobj; + obj->ctype.laser_info.hitobj_list[obj->ctype.laser_info.last_hitobj] = 1; // restore most recent hitobj to hitobj_list obj->ctype.laser_info.track_goal = obj_rw->ctype.laser_info.track_goal; obj->ctype.laser_info.multiplier = obj_rw->ctype.laser_info.multiplier; break; @@ -1235,17 +1236,6 @@ RetryObjectLoading: } obj_link(i,segnum); } - - // If weapon, restore the most recent hitobj to the list - if (obj->type == OBJ_WEAPON) - { - if (obj->ctype.laser_info.last_hitobj > 0 && obj->ctype.laser_info.last_hitobj < MAX_OBJECTS) - { - memset(&hitobj_list[i], 0, sizeof(ubyte)*MAX_OBJECTS); - hitobj_list[i][obj->ctype.laser_info.last_hitobj] = 1; - printf("RESTORE WEAPON[%i] LHO[%i]\n",i,obj->ctype.laser_info.last_hitobj); - } - } } special_reset_objects();