BOOLEAN TimeSpaceMatterConflict (ELEMENT *ElementPtr) { HELEMENT hTestElement, hSuccElement; INTERSECT_CONTROL ElementControl; ElementControl.IntersectStamp.origin.x = WORLD_TO_DISPLAY (ElementPtr->current.location.x); ElementControl.IntersectStamp.origin.y = WORLD_TO_DISPLAY (ElementPtr->current.location.y); ElementControl.IntersectStamp.frame = SetEquFrameIndex (ElementPtr->current.image.farray[0], ElementPtr->current.image.frame); ElementControl.EndPoint = ElementControl.IntersectStamp.origin; for (hTestElement = GetHeadElement (); hTestElement != 0; hTestElement = hSuccElement) { ELEMENT *TestElementPtr; LockElement (hTestElement, &TestElementPtr); hSuccElement = GetSuccElement (TestElementPtr); if (TestElementPtr != ElementPtr && (CollidingElement (TestElementPtr) /* ship in transition */ || (TestElementPtr->state_flags & PLAYER_SHIP))) { INTERSECT_CONTROL TestElementControl; TestElementControl.IntersectStamp.origin.x = WORLD_TO_DISPLAY (TestElementPtr->current.location.x); TestElementControl.IntersectStamp.origin.y = WORLD_TO_DISPLAY (TestElementPtr->current.location.y); TestElementControl.IntersectStamp.frame = SetEquFrameIndex (TestElementPtr->current.image.farray[0], TestElementPtr->current.image.frame); TestElementControl.EndPoint = TestElementControl.IntersectStamp.origin; if (DrawablesIntersect (&ElementControl, &TestElementControl, MAX_TIME_VALUE)) { UnlockElement (hTestElement); break; } } UnlockElement (hTestElement); } return (hTestElement != 0 ? TRUE : FALSE); }
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; } } } }
static void androsynth_preprocess (ELEMENT *ElementPtr) { STARSHIP *StarShipPtr; STATUS_FLAGS cur_status_flags; GetElementStarShip (ElementPtr, &StarShipPtr); cur_status_flags = StarShipPtr->cur_status_flags; if (ElementPtr->next.image.farray == StarShipPtr->RaceDescPtr->ship_data.ship) { if (cur_status_flags & SPECIAL) { if (StarShipPtr->RaceDescPtr->ship_info.energy_level < SPECIAL_ENERGY_COST) DeltaEnergy (ElementPtr, -SPECIAL_ENERGY_COST); /* so text will flash */ else { cur_status_flags &= ~WEAPON; ElementPtr->next.image.farray = StarShipPtr->RaceDescPtr->ship_data.special; ElementPtr->next.image.frame = SetEquFrameIndex (StarShipPtr->RaceDescPtr->ship_data.special[0], ElementPtr->next.image.frame); ElementPtr->state_flags |= CHANGING; } } } else { cur_status_flags &= ~(THRUST | WEAPON | SPECIAL); /* protection against vux */ if (StarShipPtr->RaceDescPtr->characteristics.turn_wait > BLAZER_TURN_WAIT) { StarShipPtr->RaceDescPtr->characteristics.special_wait += StarShipPtr->RaceDescPtr->characteristics.turn_wait - BLAZER_TURN_WAIT; StarShipPtr->RaceDescPtr->characteristics.turn_wait = BLAZER_TURN_WAIT; } if (StarShipPtr->RaceDescPtr->ship_info.energy_level == 0) { ZeroVelocityComponents (&ElementPtr->velocity); cur_status_flags &= ~(LEFT | RIGHT | SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED); StarShipPtr->RaceDescPtr->characteristics.turn_wait = StarShipPtr->RaceDescPtr->characteristics.special_wait; StarShipPtr->RaceDescPtr->characteristics.energy_regeneration = ENERGY_REGENERATION; ElementPtr->mass_points = SHIP_MASS; ElementPtr->collision_func = (CollisionFunc *) StarShipPtr->RaceDescPtr->data; ElementPtr->next.image.farray = StarShipPtr->RaceDescPtr->ship_data.ship; ElementPtr->next.image.frame = SetEquFrameIndex (StarShipPtr->RaceDescPtr->ship_data.ship[0], ElementPtr->next.image.frame); ElementPtr->state_flags |= CHANGING; } else { if (ElementPtr->thrust_wait) --ElementPtr->thrust_wait; else { #define BLAZER_THRUST (60 << RESOLUTION_FACTOR) // JMS_GFX COUNT facing; facing = StarShipPtr->ShipFacing; if (ElementPtr->turn_wait == 0 && (cur_status_flags & (LEFT | RIGHT))) { if (cur_status_flags & LEFT) --facing; else ++facing; } SetVelocityVector (&ElementPtr->velocity, BLAZER_THRUST, NORMALIZE_FACING (facing)); cur_status_flags |= SHIP_AT_MAX_SPEED | SHIP_BEYOND_MAX_SPEED; } } } StarShipPtr->cur_status_flags = cur_status_flags; }
// Preprocess function for spawning a ship into or out of battle. // Used when a new ship warps in, or a ship escapes by warping out, but not // when a Pkunk ship is reborn. void ship_transition (ELEMENT *ElementPtr) { if (ElementPtr->state_flags & PLAYER_SHIP) { if (ElementPtr->state_flags & APPEARING) { ElementPtr->life_span = HYPERJUMP_LIFE; ElementPtr->preprocess_func = ship_transition; ElementPtr->postprocess_func = NULL; SetPrimType (&DisplayArray[ElementPtr->PrimIndex], NO_PRIM); ElementPtr->state_flags |= NONSOLID | FINITE_LIFE | CHANGING; } else if (ElementPtr->life_span < HYPERJUMP_LIFE) { if (ElementPtr->life_span == NORMAL_LIFE && ElementPtr->crew_level) { ElementPtr->current.image.frame = ElementPtr->next.image.frame = SetEquFrameIndex ( ElementPtr->current.image.farray[0], ElementPtr->current.image.frame); SetPrimType (&DisplayArray[ElementPtr->PrimIndex], STAMP_PRIM); InitIntersectStartPoint (ElementPtr); InitIntersectEndPoint (ElementPtr); InitIntersectFrame (ElementPtr); ZeroVelocityComponents (&ElementPtr->velocity); ElementPtr->state_flags &= ~(NONSOLID | FINITE_LIFE); ElementPtr->state_flags |= CHANGING; ElementPtr->preprocess_func = ship_preprocess; ElementPtr->postprocess_func = ship_postprocess; } return; } } { HELEMENT hShipImage; ELEMENT *ShipImagePtr; STARSHIP *StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); LockElement (StarShipPtr->hShip, &ShipImagePtr); if (!(ShipImagePtr->state_flags & NONSOLID)) { ElementPtr->preprocess_func = NULL; } else if ((hShipImage = AllocElement ())) { #define TRANSITION_SPEED DISPLAY_TO_WORLD (40 << RESOLUTION_FACTOR) // JMS_GFX #define TRANSITION_LIFE 1 COUNT angle; PutElement (hShipImage); angle = FACING_TO_ANGLE (StarShipPtr->ShipFacing); LockElement (hShipImage, &ShipImagePtr); ShipImagePtr->playerNr = NEUTRAL_PLAYER_NUM; ShipImagePtr->state_flags = APPEARING | FINITE_LIFE | NONSOLID; ShipImagePtr->thrust_wait = TRANSITION_LIFE; ShipImagePtr->life_span = ShipImagePtr->thrust_wait; // When the element "dies", in the death_func // 'cycle_ion_trail', it is given new life a number of // times, by setting life_span to thrust_wait. SetPrimType (&DisplayArray[ShipImagePtr->PrimIndex], STAMPFILL_PRIM); SetPrimColor (&DisplayArray[ShipImagePtr->PrimIndex], START_ION_COLOR); ShipImagePtr->colorCycleIndex = 0; ShipImagePtr->current.image = ElementPtr->current.image; ShipImagePtr->current.location = ElementPtr->current.location; if (!(ElementPtr->state_flags & PLAYER_SHIP)) { ShipImagePtr->current.location.x += COSINE (angle, TRANSITION_SPEED); ShipImagePtr->current.location.y += SINE (angle, TRANSITION_SPEED); ElementPtr->preprocess_func = NULL; } else if (ElementPtr->crew_level) { ShipImagePtr->current.location.x -= COSINE (angle, TRANSITION_SPEED) * (ElementPtr->life_span - 1); ShipImagePtr->current.location.y -= SINE (angle, TRANSITION_SPEED) * (ElementPtr->life_span - 1); ShipImagePtr->current.location.x = WRAP_X (ShipImagePtr->current.location.x); ShipImagePtr->current.location.y = WRAP_Y (ShipImagePtr->current.location.y); } ShipImagePtr->preprocess_func = ship_transition; ShipImagePtr->death_func = cycle_ion_trail; SetElementStarShip (ShipImagePtr, StarShipPtr); UnlockElement (hShipImage); } UnlockElement (StarShipPtr->hShip); } }
static void pkunk_preprocess (ELEMENT *ElementPtr) { STARSHIP *StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); if (ElementPtr->state_flags & APPEARING) { HELEMENT hPhoenix = 0; if ((BYTE)TFB_Random () & 1) hPhoenix = AllocElement (); if (hPhoenix) { ELEMENT *PhoenixPtr; LockElement (hPhoenix, &PhoenixPtr); PhoenixPtr->playerNr = ElementPtr->playerNr; PhoenixPtr->state_flags = FINITE_LIFE | NONSOLID | IGNORE_SIMILAR; PhoenixPtr->life_span = 1; PhoenixPtr->death_func = intercept_pkunk_death; SetElementStarShip (PhoenixPtr, StarShipPtr); UnlockElement (hPhoenix); InsertElement (hPhoenix, GetHeadElement ()); } StarShipPtr->RaceDescPtr->data = (intptr_t) hPhoenix; if (ElementPtr->hTarget == 0) StarShipPtr->RaceDescPtr->preprocess_func = 0; else { COUNT angle, facing; ProcessSound (SetAbsSoundIndex ( StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 1 ), ElementPtr); ElementPtr->life_span = PHOENIX_LIFE; SetPrimType (&(GLOBAL (DisplayArray))[ElementPtr->PrimIndex], NO_PRIM); ElementPtr->state_flags |= NONSOLID | FINITE_LIFE | CHANGING; facing = StarShipPtr->ShipFacing; for (angle = OCTANT; angle < FULL_CIRCLE; angle += QUADRANT) { StarShipPtr->ShipFacing = NORMALIZE_FACING ( facing + ANGLE_TO_FACING (angle) ); phoenix_transition (ElementPtr); } StarShipPtr->ShipFacing = facing; } } if (StarShipPtr->RaceDescPtr->preprocess_func) { StarShipPtr->cur_status_flags &= ~(LEFT | RIGHT | THRUST | WEAPON | SPECIAL); if (ElementPtr->life_span == NORMAL_LIFE) { ElementPtr->current.image.frame = ElementPtr->next.image.frame = SetEquFrameIndex ( ElementPtr->current.image.farray[0], ElementPtr->current.image.frame); SetPrimType (&(GLOBAL (DisplayArray))[ElementPtr->PrimIndex], STAMP_PRIM); InitIntersectStartPoint (ElementPtr); InitIntersectEndPoint (ElementPtr); InitIntersectFrame (ElementPtr); ZeroVelocityComponents (&ElementPtr->velocity); ElementPtr->state_flags &= ~(NONSOLID | FINITE_LIFE); ElementPtr->state_flags |= CHANGING; StarShipPtr->RaceDescPtr->preprocess_func = 0; } } }