void DrawScannedObjects (BOOLEAN Reversed) { HELEMENT hElement, hNextElement; for (hElement = Reversed ? GetTailElement () : GetHeadElement (); hElement; hElement = hNextElement) { ELEMENT *ElementPtr; LockElement (hElement, &ElementPtr); hNextElement = Reversed ? GetPredElement (ElementPtr) : GetSuccElement (ElementPtr); if (ElementPtr->state_flags & APPEARING) { STAMP s; s.origin = ElementPtr->current.location; s.frame = ElementPtr->next.image.frame; DrawStamp (&s); } UnlockElement (hElement); } }
void MoveSIS (SIZE *pdx, SIZE *pdy) { SIZE new_dx, new_dy; new_dx = *pdx; GLOBAL_SIS (log_x) -= new_dx; if (GLOBAL_SIS (log_x) < 0) { new_dx += (SIZE)GLOBAL_SIS (log_x); GLOBAL_SIS (log_x) = 0; } else if (GLOBAL_SIS (log_x) > MAX_X_LOGICAL) { new_dx += (SIZE)(GLOBAL_SIS (log_x) - MAX_X_LOGICAL); GLOBAL_SIS (log_x) = MAX_X_LOGICAL; } new_dy = *pdy; GLOBAL_SIS (log_y) -= new_dy; if (GLOBAL_SIS (log_y) < 0) { new_dy += (SIZE)GLOBAL_SIS (log_y); GLOBAL_SIS (log_y) = 0; } else if (GLOBAL_SIS (log_y) > MAX_Y_LOGICAL) { new_dy += (SIZE)(GLOBAL_SIS (log_y) - MAX_Y_LOGICAL); GLOBAL_SIS (log_y) = MAX_Y_LOGICAL; } if (new_dx != *pdx || new_dy != *pdy) { HELEMENT hElement, hNextElement; *pdx = new_dx; *pdy = new_dy; for (hElement = GetTailElement (); hElement != 0; hElement = hNextElement) { ELEMENT *ElementPtr; LockElement (hElement, &ElementPtr); if (!(ElementPtr->state_flags & PLAYER_SHIP)) hNextElement = GetPredElement (ElementPtr); else { ElementPtr->next.location.x = (LOG_SPACE_WIDTH >> 1) - new_dx; ElementPtr->next.location.y = (LOG_SPACE_HEIGHT >> 1) - new_dy; hNextElement = 0; } UnlockElement (hElement); } }
static BYTE count_marines (STARSHIPPTR StarShipPtr, BOOLEAN FindSpot) { BYTE num_marines, id_use[MAX_MARINES]; HELEMENT hElement, hNextElement; num_marines = MAX_MARINES; while (num_marines--) id_use[num_marines] = 0; num_marines = 0; for (hElement = GetTailElement (); hElement; hElement = hNextElement) { ELEMENTPTR ElementPtr; LockElement (hElement, &ElementPtr); hNextElement = GetPredElement (ElementPtr); if (ElementPtr->current.image.farray == StarShipPtr->RaceDescPtr->ship_data.special && ElementPtr->life_span && !(ElementPtr->state_flags & (FINITE_LIFE | DISAPPEARING))) { if (ElementPtr->state_flags & NONSOLID) { id_use[ElementPtr->turn_wait] = 1; } if (++num_marines == MAX_MARINES) { UnlockElement (hElement); hNextElement = 0; } } UnlockElement (hElement); } if (FindSpot) { num_marines = 0; while (id_use[num_marines]) ++num_marines; } return (num_marines); }
// Find the HELEMENT belonging to the Flagship. static HELEMENT findFlagshipElement (void) { HELEMENT hElement, hNextElement; ELEMENT *ElementPtr; // Find the ship element. for (hElement = GetTailElement (); hElement != 0; hElement = hNextElement) { LockElement (hElement, &ElementPtr); if ((ElementPtr->state_flags & PLAYER_SHIP) != 0) { UnlockElement (hElement); return hElement; } hNextElement = GetPredElement (ElementPtr); UnlockElement (hElement); } return 0; }
static void spawn_point_defense (PELEMENT ElementPtr) { STARSHIPPTR StarShipPtr; GetElementStarShip (ElementPtr, &StarShipPtr); if (ElementPtr->state_flags & PLAYER_SHIP) { HELEMENT hDefense; hDefense = AllocElement (); if (hDefense) { ELEMENTPTR DefensePtr; LockElement (hDefense, &DefensePtr); DefensePtr->state_flags = APPEARING | NONSOLID | FINITE_LIFE | (ElementPtr->state_flags & (GOOD_GUY | BAD_GUY)); { DefensePtr->death_func = spawn_point_defense; } GetElementStarShip (ElementPtr, &StarShipPtr); SetElementStarShip (DefensePtr, StarShipPtr); UnlockElement (hDefense); PutElement (hDefense); } } else { BOOLEAN PaidFor; HELEMENT hObject, hNextObject; ELEMENTPTR ShipPtr; PaidFor = FALSE; LockElement (StarShipPtr->hShip, &ShipPtr); for (hObject = GetTailElement (); hObject; hObject = hNextObject) { ELEMENTPTR ObjectPtr; LockElement (hObject, &ObjectPtr); hNextObject = GetPredElement (ObjectPtr); if (ObjectPtr != ShipPtr && CollidingElement (ObjectPtr) && !OBJECT_CLOAKED (ObjectPtr)) { #define LASER_RANGE (UWORD)100 SIZE delta_x, delta_y; delta_x = ObjectPtr->next.location.x - ShipPtr->next.location.x; delta_y = ObjectPtr->next.location.y - ShipPtr->next.location.y; if (delta_x < 0) delta_x = -delta_x; if (delta_y < 0) delta_y = -delta_y; delta_x = WORLD_TO_DISPLAY (delta_x); delta_y = WORLD_TO_DISPLAY (delta_y); if ((UWORD)delta_x <= LASER_RANGE && (UWORD)delta_y <= LASER_RANGE && (UWORD)delta_x * (UWORD)delta_x + (UWORD)delta_y * (UWORD)delta_y <= LASER_RANGE * LASER_RANGE) { HELEMENT hPointDefense; LASER_BLOCK LaserBlock; if (!PaidFor) { if (!DeltaEnergy (ShipPtr, -SPECIAL_ENERGY_COST)) break; ProcessSound (SetAbsSoundIndex ( /* POINT_DEFENSE_LASER */ StarShipPtr->RaceDescPtr->ship_data.ship_sounds, 1)); StarShipPtr->special_counter = StarShipPtr->RaceDescPtr->characteristics.special_wait; PaidFor = TRUE; } LaserBlock.cx = ShipPtr->next.location.x; LaserBlock.cy = ShipPtr->next.location.y; LaserBlock.face = 0; LaserBlock.ex = ObjectPtr->next.location.x - ShipPtr->next.location.x; LaserBlock.ey = ObjectPtr->next.location.y - ShipPtr->next.location.y; LaserBlock.sender = (ShipPtr->state_flags & (GOOD_GUY | BAD_GUY)) | IGNORE_SIMILAR; LaserBlock.pixoffs = 0; LaserBlock.color = BUILD_COLOR (MAKE_RGB15 (0x1F, 0x1F, 0x1F), 0x0F); hPointDefense = initialize_laser (&LaserBlock); if (hPointDefense) { ELEMENTPTR PDPtr; LockElement (hPointDefense, &PDPtr); SetElementStarShip (PDPtr, StarShipPtr); PDPtr->hTarget = 0; UnlockElement (hPointDefense); PutElement (hPointDefense); } } } UnlockElement (hObject); } UnlockElement (StarShipPtr->hShip); } }
static void chenjesu_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, COUNT ConcernCounter) { EVALUATE_DESC *lpEvalDesc; STARSHIP *StarShipPtr; GetElementStarShip (ShipPtr, &StarShipPtr); StarShipPtr->ship_input_state &= ~SPECIAL; lpEvalDesc = &ObjectsOfConcern[ENEMY_SHIP_INDEX]; if (lpEvalDesc->ObjectPtr) { STARSHIP *EnemyStarShipPtr; GetElementStarShip (lpEvalDesc->ObjectPtr, &EnemyStarShipPtr); if ((lpEvalDesc->which_turn <= 16 && MANEUVERABILITY ( &EnemyStarShipPtr->RaceDescPtr->cyborg_control ) >= MEDIUM_SHIP) || (MANEUVERABILITY ( &EnemyStarShipPtr->RaceDescPtr->cyborg_control ) <= SLOW_SHIP && WEAPON_RANGE ( &EnemyStarShipPtr->RaceDescPtr->cyborg_control ) >= LONG_RANGE_WEAPON * 3 / 4 && (EnemyStarShipPtr->RaceDescPtr->ship_info.ship_flags & SEEKING_WEAPON))) lpEvalDesc->MoveState = PURSUE; } if (StarShipPtr->special_counter == 1 && ObjectsOfConcern[ENEMY_WEAPON_INDEX].ObjectPtr && ObjectsOfConcern[ENEMY_WEAPON_INDEX].MoveState == ENTICE && ObjectsOfConcern[ENEMY_WEAPON_INDEX].which_turn <= 8) { lpEvalDesc = &ObjectsOfConcern[ENEMY_WEAPON_INDEX]; } ship_intelligence (ShipPtr, ObjectsOfConcern, ConcernCounter); if (lpEvalDesc->ObjectPtr) { HELEMENT h, hNext; ELEMENT *CrystalPtr; h = (StarShipPtr->old_status_flags & WEAPON) ? GetTailElement () : (HELEMENT)0; for (; h; h = hNext) { LockElement (h, &CrystalPtr); hNext = GetPredElement (CrystalPtr); if (!(CrystalPtr->state_flags & NONSOLID) && CrystalPtr->next.image.farray == StarShipPtr->RaceDescPtr->ship_data.weapon && CrystalPtr->preprocess_func && CrystalPtr->life_span > 0 && elementsOfSamePlayer (CrystalPtr, ShipPtr)) { if (ObjectsOfConcern[ENEMY_SHIP_INDEX].ObjectPtr) { COUNT which_turn; if ((which_turn = PlotIntercept (CrystalPtr, ObjectsOfConcern[ENEMY_SHIP_INDEX].ObjectPtr, CrystalPtr->life_span, FRAGMENT_RANGE / 2)) == 0 || (which_turn == 1 && PlotIntercept (CrystalPtr, ObjectsOfConcern[ENEMY_SHIP_INDEX].ObjectPtr, CrystalPtr->life_span, 0) == 0)) StarShipPtr->ship_input_state &= ~WEAPON; else if (StarShipPtr->weapon_counter == 0) { StarShipPtr->ship_input_state |= WEAPON; lpEvalDesc = &ObjectsOfConcern[ENEMY_SHIP_INDEX]; } UnlockElement (h); break; } hNext = 0; } UnlockElement (h); } if (h == 0) { if (StarShipPtr->old_status_flags & WEAPON) { StarShipPtr->ship_input_state &= ~WEAPON; if (lpEvalDesc == &ObjectsOfConcern[ENEMY_WEAPON_INDEX]) StarShipPtr->weapon_counter = 3; } else if (StarShipPtr->weapon_counter == 0 && ship_weapons (ShipPtr, lpEvalDesc->ObjectPtr, FRAGMENT_RANGE / 2)) StarShipPtr->ship_input_state |= WEAPON; } } if (StarShipPtr->special_counter < MAX_DOGGIES) { if (lpEvalDesc->ObjectPtr && StarShipPtr->RaceDescPtr->ship_info.energy_level <= SPECIAL_ENERGY_COST && !(StarShipPtr->ship_input_state & WEAPON)) StarShipPtr->ship_input_state |= SPECIAL; } }