From 415eec4efb25f5d317f2182b960dda8cb7445087 Mon Sep 17 00:00:00 2001 From: avolkov Date: Fri, 30 Oct 2009 22:33:09 +0000 Subject: [PATCH] Battle & ship code cleanup: Destruction of WHICH_SIDE(); removal of turn_wait abuse in new_ship() git-svn-id: svn://svn.code.sf.net/p/sc2/code/trunk@3265 8092fc87-c524-0410-9efc-e669fe64eaf9 --- sc2/src/uqm/element.h | 7 ----- sc2/src/uqm/init.c | 2 +- sc2/src/uqm/netplay/checksum.c | 16 +--------- sc2/src/uqm/ships/androsyn/androsyn.c | 8 +++-- sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c | 19 ++++++------ sc2/src/uqm/ships/umgah/umgah.c | 24 ++++++++++----- sc2/src/uqm/tactrans.c | 44 +++++++++++---------------- sc2/src/uqm/weapon.c | 4 +-- 8 files changed, 54 insertions(+), 70 deletions(-) diff --git a/sc2/src/uqm/element.h b/sc2/src/uqm/element.h index 747a2c1a1..0c5638518 100644 --- a/sc2/src/uqm/element.h +++ b/sc2/src/uqm/element.h @@ -166,13 +166,6 @@ extern PRIMITIVE DisplayArray[MAX_DISPLAY_PRIMS]; #define GRAVITY_MASS(m) ((m) > MAX_SHIP_MASS * 10) #define GRAVITY_THRESHOLD (COUNT)255 -static inline BYTE -ElementFlagsSide (ELEMENT_FLAGS flags) -{ - return (BYTE) ((flags & BAD_GUY) >> 1); -} -#define WHICH_SIDE(flags) ElementFlagsSide (flags) - #define OBJECT_CLOAKED(eptr) \ (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) >= NUM_PRIMS \ || (GetPrimType (&GLOBAL (DisplayArray[(eptr)->PrimIndex])) == STAMPFILL_PRIM \ diff --git a/sc2/src/uqm/init.c b/sc2/src/uqm/init.c index c6c1cb3f3..5b0618e0c 100644 --- a/sc2/src/uqm/init.c +++ b/sc2/src/uqm/init.c @@ -316,7 +316,7 @@ UninitShips (void) /* Record crew left after battle */ StarShipPtr->crew_level = StarShipPtr->RaceDescPtr->ship_info.crew_level; - SPtr[WHICH_SIDE (ElementPtr->state_flags)] = StarShipPtr; + SPtr[StarShipPtr->playerNr] = StarShipPtr; free_ship (StarShipPtr->RaceDescPtr, TRUE, TRUE); StarShipPtr->RaceDescPtr = 0; } diff --git a/sc2/src/uqm/netplay/checksum.c b/sc2/src/uqm/netplay/checksum.c index 5ed6560a7..5d687f06a 100644 --- a/sc2/src/uqm/netplay/checksum.c +++ b/sc2/src/uqm/netplay/checksum.c @@ -28,8 +28,6 @@ // for DUMP_CRC_OPS #include "netconnection.h" #include "netmelee.h" -#include "../tactrans.h" - // for new_ship #include "libs/log.h" #include "libs/mathlib.h" @@ -121,19 +119,7 @@ crc_processELEMENT(crc_State *state, const ELEMENT *val) { crc_processCOUNT(state, val->life_span); crc_processCOUNT(state, val->crew_level); crc_processBYTE(state, val->mass_points); - - // HACK: when a ship is being destroyed, turn_wait is abused to store - // the side this ship is on. This must be excluded from the checksum - // as this does not have to be the same for both sides. - { - BYTE turn_wait = val->turn_wait; - - if (val->preprocess_func == new_ship) - turn_wait = 0; - - crc_processBYTE(state, turn_wait); - } - + crc_processBYTE(state, val->turn_wait); crc_processBYTE(state, val->thrust_wait); crc_processVELOCITY_DESC(state, &val->velocity); crc_processSTATE(state, &val->current); diff --git a/sc2/src/uqm/ships/androsyn/androsyn.c b/sc2/src/uqm/ships/androsyn/androsyn.c index 26f818b59..10435b6e8 100644 --- a/sc2/src/uqm/ships/androsyn/androsyn.c +++ b/sc2/src/uqm/ships/androsyn/androsyn.c @@ -20,6 +20,8 @@ #include "resinst.h" #include "libs/mathlib.h" +#include "uqm/init.h" + // for NUM_PLAYERS #define MAX_CREW 20 @@ -322,7 +324,7 @@ androsynth_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, } } -static CollisionFunc *ship_collision_func[2]; +static CollisionFunc *ship_collision_func[NUM_PLAYERS]; #define BLAZER_TURN_WAIT 1 @@ -355,7 +357,7 @@ androsynth_postprocess (ELEMENT *ElementPtr) ElementPtr->mass_points = BLAZER_MASS; StarShipPtr->RaceDescPtr->characteristics.turn_wait = BLAZER_TURN_WAIT; - ship_collision_func[WHICH_SIDE(ElementPtr->state_flags)] + ship_collision_func[StarShipPtr->playerNr] = ElementPtr->collision_func; ElementPtr->collision_func = blazer_collision; } @@ -424,7 +426,7 @@ androsynth_preprocess (ELEMENT *ElementPtr) StarShipPtr->RaceDescPtr->characteristics.special_wait; StarShipPtr->RaceDescPtr->characteristics.energy_regeneration = ENERGY_REGENERATION; ElementPtr->mass_points = SHIP_MASS; - ElementPtr->collision_func = ship_collision_func[WHICH_SIDE(ElementPtr->state_flags)]; + ElementPtr->collision_func = ship_collision_func[StarShipPtr->playerNr]; ElementPtr->next.image.farray = StarShipPtr->RaceDescPtr->ship_data.ship; ElementPtr->next.image.frame = diff --git a/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c b/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c index 353481167..d78e59ff8 100644 --- a/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c +++ b/sc2/src/uqm/ships/mmrnmhrm/mmrnmhrm.c @@ -20,6 +20,7 @@ #include "resinst.h" #include "uqm/init.h" + // for NUM_PLAYERS #define MAX_CREW 20 @@ -50,7 +51,7 @@ #define MMRNMHRM_OFFSET 16 #define LASER_RANGE DISPLAY_TO_WORLD (125 + MMRNMHRM_OFFSET) -static CHARACTERISTIC_STUFF otherwing_desc[NUM_SIDES]; +static CHARACTERISTIC_STUFF otherwing_desc[NUM_PLAYERS]; static RACE_DESC mmrnmhrm_desc = { @@ -372,8 +373,8 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr) StarShipPtr->weapon_counter = 0; - t = otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)]; - otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)] = StarShipPtr->RaceDescPtr->characteristics; + t = otherwing_desc[StarShipPtr->playerNr]; + otherwing_desc[StarShipPtr->playerNr] = StarShipPtr->RaceDescPtr->characteristics; StarShipPtr->RaceDescPtr->characteristics = t; StarShipPtr->RaceDescPtr->cyborg_control.ManeuverabilityIndex = 0; @@ -407,11 +408,14 @@ mmrnmhrm_postprocess (ELEMENT *ElementPtr) static void mmrnmhrm_preprocess (ELEMENT *ElementPtr) { + STARSHIP *StarShipPtr; + + GetElementStarShip (ElementPtr, &StarShipPtr); + if (ElementPtr->state_flags & APPEARING) { - COUNT i; - - i = WHICH_SIDE (ElementPtr->state_flags); + // Set here because playerNr is unknown during init() + COUNT i = StarShipPtr->playerNr; otherwing_desc[i].max_thrust = YWING_MAX_THRUST; otherwing_desc[i].thrust_increment = YWING_THRUST_INCREMENT; otherwing_desc[i].energy_regeneration = YWING_ENERGY_REGENERATION; @@ -426,9 +430,6 @@ mmrnmhrm_preprocess (ELEMENT *ElementPtr) } else { - STARSHIP *StarShipPtr; - - GetElementStarShip (ElementPtr, &StarShipPtr); if ((StarShipPtr->cur_status_flags & SPECIAL) && StarShipPtr->special_counter == 0) { diff --git a/sc2/src/uqm/ships/umgah/umgah.c b/sc2/src/uqm/ships/umgah/umgah.c index 22da34fbe..03bf367c6 100644 --- a/sc2/src/uqm/ships/umgah/umgah.c +++ b/sc2/src/uqm/ships/umgah/umgah.c @@ -20,6 +20,8 @@ #include "resinst.h" #include "libs/mathlib.h" +#include "uqm/init.h" + // for NUM_PLAYERS #define MAX_CREW 10 @@ -37,7 +39,7 @@ #define SHIP_MASS 1 -static FRAME LastShipFrame[2]; +static FRAME LastShipFrame[NUM_PLAYERS]; static RACE_DESC umgah_desc = { @@ -254,6 +256,7 @@ umgah_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, if (!(StarShipPtr->ship_input_state & SPECIAL)) StarShipPtr->RaceDescPtr->characteristics.special_wait = 0xFF; } + static COUNT initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[]) { @@ -281,9 +284,11 @@ initialize_cone (ELEMENT *ShipPtr, HELEMENT ConeArray[]) MissileBlock.preprocess_func = cone_preprocess; MissileBlock.blast_offs = MISSILE_OFFSET; - if (ShipPtr->next.image.frame != LastShipFrame[WHICH_SIDE(ShipPtr->state_flags)]) + // This func is called every frame while the player is holding down WEAPON + // Don't reset the cone FRAME to the first image every time + if (ShipPtr->next.image.frame != LastShipFrame[StarShipPtr->playerNr]) { - LastShipFrame[WHICH_SIDE(ShipPtr->state_flags)] = ShipPtr->next.image.frame; + LastShipFrame[StarShipPtr->playerNr] = ShipPtr->next.image.frame; StarShipPtr->RaceDescPtr->ship_data.special[0] = SetAbsFrameIndex ( @@ -330,13 +335,18 @@ umgah_postprocess (ELEMENT *ElementPtr) static void umgah_preprocess (ELEMENT *ElementPtr) { + STARSHIP *StarShipPtr; + + GetElementStarShip (ElementPtr, &StarShipPtr); + if (ElementPtr->state_flags & APPEARING) - LastShipFrame[WHICH_SIDE(ElementPtr->state_flags)] = 0; + { + // Reset prevously set value, if any. It could only have been + // set by another ship of the same player, though. + LastShipFrame[StarShipPtr->playerNr] = 0; + } else { - STARSHIP *StarShipPtr; - - GetElementStarShip (ElementPtr, &StarShipPtr); if (ElementPtr->thrust_wait == 0 && (StarShipPtr->cur_status_flags & SPECIAL) && DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST)) diff --git a/sc2/src/uqm/tactrans.c b/sc2/src/uqm/tactrans.c index 131b5c16c..65f54aa29 100644 --- a/sc2/src/uqm/tactrans.c +++ b/sc2/src/uqm/tactrans.c @@ -289,12 +289,11 @@ new_ship (ELEMENT *DeadShipPtr) } MusicStarted = FALSE; - DeadShipPtr->turn_wait = (BYTE)( - DeadShipPtr->state_flags & (GOOD_GUY | BAD_GUY)); - // DeadShipPtr->turn_wait is abused to store which - // side this element is for, because this information - // will be lost from state_flags when the element is - // set up for deletion below. + // XXX: Set to 0 to be vaguely checksum-compatible with previous + // Netplay builds which abused turn_wait to store the ship's side. + // The value is irrelevant at this point. + DeadShipPtr->turn_wait = 0; + for (hElement = GetHeadElement (); hElement; hElement = hSuccElement) { ELEMENT *ElementPtr; @@ -348,7 +347,7 @@ new_ship (ELEMENT *DeadShipPtr) } if (DeadShipPtr->life_span || !readyForBattleEnd ( - WHICH_SIDE (DeadShipPtr->turn_wait))) + DeadStarShipPtr->playerNr)) { DeadShipPtr->state_flags &= ~DISAPPEARING; ++DeadShipPtr->life_span; @@ -369,7 +368,10 @@ new_ship (ELEMENT *DeadShipPtr) DeadStarShipPtr->RaceDescPtr); free_ship (DeadStarShipPtr->RaceDescPtr, TRUE, TRUE); DeadStarShipPtr->RaceDescPtr = 0; -UnbatchGraphics (); + + // Graphics are batched while the draw queue is processed, + // but we are going to draw the ship selection box now + UnbatchGraphics (); #ifdef NETPLAY initBattleStateDataConnections (); @@ -389,8 +391,7 @@ UnbatchGraphics (); } #endif /* NETPLAY */ - if (GetNextStarShip (DeadStarShipPtr, - WHICH_SIDE (DeadShipPtr->turn_wait))) + if (GetNextStarShip (DeadStarShipPtr, DeadStarShipPtr->playerNr)) { #ifdef NETPLAY { @@ -420,18 +421,7 @@ UnbatchGraphics (); GLOBAL (CurrentActivity) |= CHECK_ABORT; } #endif - -#ifdef NETPLAY - // Turn_wait was abused to store the side this element was on. - // We don't want this included in checksums, as it can be different - // for both sides of a connection. - // While preprocess_func == new_ship, turn_wait isn't included in - // the checksum at all all, but now that new_ship is done, - // it would be. As the value is irrelevant at this point, we can - // just set it to the same value on either side. - DeadShipPtr->turn_wait = 0; -#endif -BatchGraphics (); + BatchGraphics (); } } @@ -520,10 +510,13 @@ ship_death (ELEMENT *ShipPtr) StopMusic (); + GetElementStarShip (ShipPtr, &StarShipPtr); + if (ShipPtr->mass_points <= MAX_SHIP_MASS) - { - COUNT side = ElementFlagsSide (ShipPtr->state_flags); - battle_counter[side]--; + { // Not running away and not reincarnating (Pkunk) + // When a ship tries to run away, it is (dis)counted in DoRunAway(), + // so when it dies while running away, we will not count it again + battle_counter[StarShipPtr->playerNr]--; } VictoriousStarShipPtr = 0; @@ -548,7 +541,6 @@ ship_death (ELEMENT *ShipPtr) UnlockElement (hElement); } - GetElementStarShip (ShipPtr, &StarShipPtr); StarShipPtr->cur_status_flags &= ~PLAY_VICTORY_DITTY; DeltaEnergy (ShipPtr, diff --git a/sc2/src/uqm/weapon.c b/sc2/src/uqm/weapon.c index 4cd290d76..5fcdb49d3 100644 --- a/sc2/src/uqm/weapon.c +++ b/sc2/src/uqm/weapon.c @@ -279,8 +279,8 @@ ModifySilhouette (ELEMENT *ElementPtr, STAMP *modify_stamp, } ObjectIntersect.IntersectStamp.origin.y += - (WHICH_SIDE (ElementPtr->state_flags) - ? BAD_GUY_YOFFS : GOOD_GUY_YOFFS); + (ElementPtr->state_flags & GOOD_GUY) ? + GOOD_GUY_YOFFS : BAD_GUY_YOFFS; if (modify_flags & MODIFY_SWAP) {