static void shofixti_intelligence (PELEMENT ShipPtr, PEVALUATE_DESC ObjectsOfConcern, COUNT ConcernCounter) { STARSHIPPTR StarShipPtr; ship_intelligence (ShipPtr, ObjectsOfConcern, ConcernCounter); GetElementStarShip (ShipPtr, &StarShipPtr); if (StarShipPtr->special_counter == 0) { if (StarShipPtr->ship_input_state & SPECIAL) StarShipPtr->ship_input_state &= ~SPECIAL; else { PEVALUATE_DESC lpWeaponEvalDesc, lpShipEvalDesc; lpWeaponEvalDesc = &ObjectsOfConcern[ENEMY_WEAPON_INDEX]; lpShipEvalDesc = &ObjectsOfConcern[ENEMY_SHIP_INDEX]; if (StarShipPtr->RaceDescPtr->ship_data.special[0] && (GetFrameCount (StarShipPtr->RaceDescPtr->ship_data.captain_control.special) - GetFrameIndex (StarShipPtr->RaceDescPtr->ship_data.captain_control.special) > 5 || (lpShipEvalDesc->ObjectPtr != NULL_PTR && lpShipEvalDesc->which_turn <= 4) || (lpWeaponEvalDesc->ObjectPtr != NULL_PTR /* means IMMEDIATE WEAPON */ && (((lpWeaponEvalDesc->ObjectPtr->state_flags & PLAYER_SHIP) && ShipPtr->crew_level == 1) || (PlotIntercept (lpWeaponEvalDesc->ObjectPtr, ShipPtr, 2, 0) && lpWeaponEvalDesc->ObjectPtr->mass_points >= ShipPtr->crew_level && (TFB_Random () & 1)))))) StarShipPtr->ship_input_state |= SPECIAL; } } }
static void arilou_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, COUNT ConcernCounter) { STARSHIP *StarShipPtr; GetElementStarShip (ShipPtr, &StarShipPtr); StarShipPtr->ship_input_state |= THRUST; ObjectsOfConcern[ENEMY_SHIP_INDEX].MoveState = ENTICE; ship_intelligence (ShipPtr, ObjectsOfConcern, ConcernCounter); if (StarShipPtr->special_counter == 0) { EVALUATE_DESC *lpEvalDesc; StarShipPtr->ship_input_state &= ~SPECIAL; lpEvalDesc = &ObjectsOfConcern[ENEMY_WEAPON_INDEX]; if (lpEvalDesc->ObjectPtr && lpEvalDesc->which_turn <= 6) { BOOLEAN IsTrackingWeapon; STARSHIP *EnemyStarShipPtr; GetElementStarShip (lpEvalDesc->ObjectPtr, &EnemyStarShipPtr); if (((EnemyStarShipPtr->RaceDescPtr->ship_info.ship_flags & SEEKING_WEAPON) && lpEvalDesc->ObjectPtr->next.image.farray == EnemyStarShipPtr->RaceDescPtr->ship_data.weapon) || ((EnemyStarShipPtr->RaceDescPtr->ship_info.ship_flags & SEEKING_SPECIAL) && lpEvalDesc->ObjectPtr->next.image.farray == EnemyStarShipPtr->RaceDescPtr->ship_data.special)) IsTrackingWeapon = TRUE; else IsTrackingWeapon = FALSE; // JMS: Added the GASSY_SUBSTANCE clauses to prevent 'long teleport' if Baul gas is sticking to the Arilou ship. if (((lpEvalDesc->ObjectPtr->state_flags & PLAYER_SHIP) /* means IMMEDIATE WEAPON */ || (IsTrackingWeapon && (lpEvalDesc->which_turn == 1 || (lpEvalDesc->ObjectPtr->state_flags & CREW_OBJECT))) /* FIGHTERS!!! */ || (PlotIntercept (lpEvalDesc->ObjectPtr, ShipPtr, 3, 0) && (!(lpEvalDesc->ObjectPtr->state_flags & GASSY_SUBSTANCE) // Ignore stuck gas || (lpEvalDesc->ObjectPtr->state_flags & GASSY_SUBSTANCE && EnemyStarShipPtr->ship_input_state & WEAPON && ObjectsOfConcern[ENEMY_SHIP_INDEX].which_turn <= 20) // If sticking to gas, teleport when Baul is near&firing primary || (lpEvalDesc->ObjectPtr->state_flags & GASSY_SUBSTANCE && lpEvalDesc->ObjectPtr->state_flags & IGNORE_VELOCITY))) // non-stuck gas ) && !(TFB_Random () & 3)) { StarShipPtr->ship_input_state &= ~(LEFT | RIGHT | THRUST | WEAPON); StarShipPtr->ship_input_state |= SPECIAL; } } } if (StarShipPtr->RaceDescPtr->ship_info.energy_level <= SPECIAL_ENERGY_COST << 1) StarShipPtr->ship_input_state &= ~WEAPON; }
static void arilou_intelligence (ELEMENT *ShipPtr, EVALUATE_DESC *ObjectsOfConcern, COUNT ConcernCounter) { STARSHIP *StarShipPtr; GetElementStarShip (ShipPtr, &StarShipPtr); StarShipPtr->ship_input_state |= THRUST; ObjectsOfConcern[ENEMY_SHIP_INDEX].MoveState = ENTICE; ship_intelligence (ShipPtr, ObjectsOfConcern, ConcernCounter); if (StarShipPtr->special_counter == 0) { EVALUATE_DESC *lpEvalDesc; StarShipPtr->ship_input_state &= ~SPECIAL; lpEvalDesc = &ObjectsOfConcern[ENEMY_WEAPON_INDEX]; if (lpEvalDesc->ObjectPtr && lpEvalDesc->which_turn <= 6) { BOOLEAN IsTrackingWeapon; STARSHIP *EnemyStarShipPtr; GetElementStarShip (lpEvalDesc->ObjectPtr, &EnemyStarShipPtr); if (((EnemyStarShipPtr->RaceDescPtr->ship_info.ship_flags & SEEKING_WEAPON) && lpEvalDesc->ObjectPtr->next.image.farray == EnemyStarShipPtr->RaceDescPtr->ship_data.weapon) || ((EnemyStarShipPtr->RaceDescPtr->ship_info.ship_flags & SEEKING_SPECIAL) && lpEvalDesc->ObjectPtr->next.image.farray == EnemyStarShipPtr->RaceDescPtr->ship_data.special)) IsTrackingWeapon = TRUE; else IsTrackingWeapon = FALSE; if (((lpEvalDesc->ObjectPtr->state_flags & PLAYER_SHIP) /* means IMMEDIATE WEAPON */ || (IsTrackingWeapon && (lpEvalDesc->which_turn == 1 || (lpEvalDesc->ObjectPtr->state_flags & CREW_OBJECT))) /* FIGHTERS!!! */ || PlotIntercept (lpEvalDesc->ObjectPtr, ShipPtr, 3, 0)) && !(TFB_Random () & 3)) { StarShipPtr->ship_input_state &= ~(LEFT | RIGHT | THRUST | WEAPON); StarShipPtr->ship_input_state |= SPECIAL; } } } if (StarShipPtr->RaceDescPtr->ship_info.energy_level <= SPECIAL_ENERGY_COST << 1) StarShipPtr->ship_input_state &= ~WEAPON; }
int aiArilou(pPlayer ai, pObject ObjectsOfConcern, COUNT ConcernCounter) { pObject lpEvalDesc; pPlayer opp=(pPlayer)ai->opp; ObjectsOfConcern[ENEMY_SHIP_INDEX].MoveState = ENTICE; ship_intelligence (ai, ObjectsOfConcern, ConcernCounter); if (ai->special_turn == 0) { ai->ship_input_state &= ~SPECIAL; lpEvalDesc = &ObjectsOfConcern[ENEMY_WEAPON_INDEX]; if (lpEvalDesc->parent && lpEvalDesc->which_turn <= 6) { s8 IsTrackingWeapon; /*if (((opp->ship_flags & SEEKING_WEAPON) //&& lpEvalDesc->tr->next.image.farray == //EnemyStarShipPtr->RaceDescPtr->ship_data.weapon ) || ((opp->ship_flags & SEEKING_SPECIAL) // && lpEvalDesc->tr->next.image.farray == //EnemyStarShipPtr->RaceDescPtr->ship_data.special)) })*/ if ((opp->ship_flags & SEEKING_WEAPON)&&(opp->ship_flags & SEEKING_SPECIAL)) IsTrackingWeapon = 1; else IsTrackingWeapon = 0; if ((//(opp->ship_flags & IMMEDIATE_WEAPON)|| /* means IMMEDIATE WEAPON */ (IsTrackingWeapon && (lpEvalDesc->which_turn == 1 || (lpEvalDesc->type != CREW))) /* FIGHTERS!!! */ || PlotIntercept (ai,lpEvalDesc, 3, 0)) && !(ran(0,3))) { ai->ship_input_state &= ~(LEFT | RIGHT | THRUST | WEAPON); ai->ship_input_state |= SPECIAL; } } } if (ai->batt <= SPECIAL_ENERGY_COST << 1) ai->ship_input_state &= ~WEAPON; }
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; } }