static void mmrnmhrm_postprocess (ELEMENT *ElementPtr) { STARSHIP *StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); /* take care of transform effect */ if (ElementPtr->next.image.farray != ElementPtr->current.image.farray) { CHARACTERISTIC_STUFF t; ProcessSound (SetAbsSoundIndex ( /* TRANSFORM */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 1), ElementPtr); DeltaEnergy (ElementPtr, -StarShipPtr->RaceDescPtr->characteristics.special_energy_cost); StarShipPtr->weapon_counter = 0; t = otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)]; otherwing_desc[WHICH_SIDE(ElementPtr->state_flags)] = StarShipPtr->RaceDescPtr->characteristics; StarShipPtr->RaceDescPtr->characteristics = t; StarShipPtr->RaceDescPtr->cyborg_control.ManeuverabilityIndex = 0; if (ElementPtr->next.image.farray == StarShipPtr->RaceDescPtr->ship_data.special) { StarShipPtr->RaceDescPtr->cyborg_control.WeaponRange = LONG_RANGE_WEAPON - 1; StarShipPtr->RaceDescPtr->ship_info.ship_flags &= ~IMMEDIATE_WEAPON; StarShipPtr->RaceDescPtr->ship_info.ship_flags |= SEEKING_WEAPON; StarShipPtr->RaceDescPtr->ship_data.ship_sounds = SetAbsSoundIndex (StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 2); StarShipPtr->cur_status_flags &= ~(SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED); } else { StarShipPtr->RaceDescPtr->cyborg_control.WeaponRange = CLOSE_RANGE_WEAPON; StarShipPtr->RaceDescPtr->ship_info.ship_flags &= ~SEEKING_WEAPON; StarShipPtr->RaceDescPtr->ship_info.ship_flags |= IMMEDIATE_WEAPON; StarShipPtr->RaceDescPtr->ship_data.ship_sounds = SetAbsSoundIndex (StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 0); if (StarShipPtr->cur_status_flags & (SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED)) StarShipPtr->cur_status_flags |= SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED; } } }
static void mmrnmhrm_preprocess (ELEMENT *ElementPtr) { if (ElementPtr->state_flags & APPEARING) { COUNT i; i = WHICH_SIDE (ElementPtr->state_flags); otherwing_desc[i].max_thrust = YWING_MAX_THRUST; otherwing_desc[i].thrust_increment = YWING_THRUST_INCREMENT; otherwing_desc[i].energy_regeneration = YWING_ENERGY_REGENERATION; otherwing_desc[i].weapon_energy_cost = YWING_WEAPON_ENERGY_COST; otherwing_desc[i].special_energy_cost = YWING_SPECIAL_ENERGY_COST; otherwing_desc[i].energy_wait = YWING_ENERGY_WAIT; otherwing_desc[i].turn_wait = YWING_TURN_WAIT; otherwing_desc[i].thrust_wait = YWING_THRUST_WAIT; otherwing_desc[i].weapon_wait = YWING_WEAPON_WAIT; otherwing_desc[i].special_wait = YWING_SPECIAL_WAIT; otherwing_desc[i].ship_mass = SHIP_MASS; } else { STARSHIP *StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); if ((StarShipPtr->cur_status_flags & SPECIAL) && StarShipPtr->special_counter == 0) { if (StarShipPtr->RaceDescPtr->ship_info.energy_level < StarShipPtr->RaceDescPtr->characteristics.special_energy_cost) DeltaEnergy (ElementPtr, -StarShipPtr->RaceDescPtr->characteristics.special_energy_cost); /* so text will flash */ else { if (ElementPtr->next.image.farray == StarShipPtr->RaceDescPtr->ship_data.ship) ElementPtr->next.image.farray = StarShipPtr->RaceDescPtr->ship_data.special; else ElementPtr->next.image.farray = StarShipPtr->RaceDescPtr->ship_data.ship; ElementPtr->next.image.frame = SetEquFrameIndex (ElementPtr->next.image.farray[0], ElementPtr->next.image.frame); ElementPtr->state_flags |= CHANGING; StarShipPtr->special_counter = StarShipPtr->RaceDescPtr->characteristics.special_wait; } } } }
void UninitShips (void) { COUNT crew_retrieved; SIZE i; HELEMENT hElement, hNextElement; STARSHIP *SPtr[NUM_PLAYERS]; StopSound (); UninitSpace (); for (i = 0; i < NUM_PLAYERS; ++i) SPtr[i] = 0; // Count the crew floating in space. crew_retrieved = CountCrewElements(); for (hElement = GetHeadElement (); hElement != 0; hElement = hNextElement) { ELEMENT *ElementPtr; extern void new_ship (ELEMENT *ElementPtr); LockElement (hElement, &ElementPtr); hNextElement = GetSuccElement (ElementPtr); if ((ElementPtr->state_flags & PLAYER_SHIP) || ElementPtr->death_func == new_ship) { STARSHIP *StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); // There should only be one ship left in battle. // He gets the crew still floating in space. if (StarShipPtr->RaceDescPtr->ship_info.crew_level) { if (crew_retrieved >= StarShipPtr->RaceDescPtr->ship_info.max_crew - StarShipPtr->RaceDescPtr->ship_info.crew_level) StarShipPtr->RaceDescPtr->ship_info.crew_level = StarShipPtr->RaceDescPtr->ship_info.max_crew; else StarShipPtr->RaceDescPtr->ship_info.crew_level += crew_retrieved; } if (StarShipPtr->RaceDescPtr->uninit_func != NULL) (*StarShipPtr->RaceDescPtr->uninit_func) ( StarShipPtr->RaceDescPtr); /* Record crew left after battle */ StarShipPtr->crew_level = StarShipPtr->RaceDescPtr->ship_info.crew_level; SPtr[WHICH_SIDE (ElementPtr->state_flags)] = StarShipPtr; free_ship (StarShipPtr->RaceDescPtr, TRUE, TRUE); StarShipPtr->RaceDescPtr = 0; } UnlockElement (hElement); } GLOBAL (CurrentActivity) &= ~IN_BATTLE; if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) { } else if (LOBYTE (GLOBAL (CurrentActivity)) <= IN_ENCOUNTER && !(GLOBAL (CurrentActivity) & CHECK_ABORT)) { // XXX: This has no purpose for SuperMelee // In full-game, the sole purpose of this is to record the crew // left in the last ship standing. The crew left is first recorded // into STARSHIP.crew_level just a few lines above here. for (i = NUM_PLAYERS - 1; i >= 0; --i) { if (SPtr[i]) GetEncounterStarShip (SPtr[i], i); } } if (LOBYTE (GLOBAL (CurrentActivity)) != IN_ENCOUNTER) { // Remove any ships left from the race queue. for (i = 0; i < NUM_PLAYERS; i++) ReinitQueue (&race_q[i]); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE) FreeHyperspace (); } }
void UninitShips (void) { BYTE crew_retrieved; SIZE i; HELEMENT hElement, hNextElement; STARSHIPPTR SPtr[NUM_PLAYERS]; StopSound (); UninitSpace (); for (i = 0; i < NUM_PLAYERS; ++i) SPtr[i] = 0; // Count the crew floating in space. crew_retrieved = 0; for (hElement = GetHeadElement (); hElement != 0; hElement = hNextElement) { ELEMENTPTR ElementPtr; LockElement (hElement, &ElementPtr); hNextElement = GetSuccElement (ElementPtr); if (ElementPtr->state_flags & CREW_OBJECT) ++crew_retrieved; UnlockElement (hElement); } for (hElement = GetHeadElement (); hElement != 0; hElement = hNextElement) { ELEMENTPTR ElementPtr; extern void new_ship (PELEMENT ElementPtr); LockElement (hElement, &ElementPtr); hNextElement = GetSuccElement (ElementPtr); if ((ElementPtr->state_flags & PLAYER_SHIP) || ElementPtr->death_func == new_ship) { STARSHIPPTR StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); // There should only be one ship left in battle. // He gets the crew still floating in space. if (StarShipPtr->RaceDescPtr->ship_info.crew_level) { if (crew_retrieved >= StarShipPtr->RaceDescPtr->ship_info.max_crew - StarShipPtr->RaceDescPtr->ship_info.crew_level) StarShipPtr->RaceDescPtr->ship_info.crew_level = StarShipPtr->RaceDescPtr->ship_info.max_crew; else StarShipPtr->RaceDescPtr->ship_info.crew_level += crew_retrieved; } if (StarShipPtr->RaceDescPtr->uninit_func != NULL) (*StarShipPtr->RaceDescPtr->uninit_func) ( StarShipPtr->RaceDescPtr); StarShipPtr->ShipFacing = StarShipPtr->RaceDescPtr->ship_info.var2; StarShipPtr->special_counter = StarShipPtr->RaceDescPtr->ship_info.crew_level; SPtr[WHICH_SIDE (ElementPtr->state_flags)] = StarShipPtr; free_ship (StarShipPtr, TRUE); } UnlockElement (hElement); } GLOBAL (CurrentActivity) &= ~IN_BATTLE; if (LOBYTE (GLOBAL (CurrentActivity)) == IN_LAST_BATTLE) { } else if (LOBYTE (GLOBAL (CurrentActivity)) <= IN_ENCOUNTER && !(GLOBAL (CurrentActivity) & CHECK_ABORT)) { for (i = NUM_PLAYERS - 1; i >= 0; --i) { if (SPtr[i]) GetEncounterStarShip (SPtr[i], i); } } if (LOBYTE (GLOBAL (CurrentActivity)) != IN_ENCOUNTER) { ReinitQueue (&race_q[0]); ReinitQueue (&race_q[1]); if (LOBYTE (GLOBAL (CurrentActivity)) == IN_HYPERSPACE) FreeHyperspace (); } }