/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OU_MARI2.CPP
//Description : Marine Units AI functions
#include
#include
#include
#include
//------- Begin of function UnitMarine::init_derived --------//
void UnitMarine::init_derived()
{
last_load_goods_date = info.game_date;
}
//------- End of function UnitMarine::init_derived --------//
//------- Begin of function UnitMarine::process_ai --------//
//
void UnitMarine::process_ai()
{
//-- Think about removing stops whose owner nation is at war with us. --//
// AI does do any sea trade
// if( info.game_date%30 == sprite_recno%30 )
// think_del_stop();
//---- Think about setting new trade route -------//
if( info.game_date%15 == sprite_recno%15 )
{
if( stop_defined_num < 2 && is_visible() && is_ai_all_stop() )
ai_sail_to_nearby_harbor();
}
//------ Think about resigning this caravan -------//
if( info.game_date%60 == sprite_recno%60 )
think_resign();
}
//------- End of function UnitMarine::process_ai --------//
//--------- Begin of function UnitMarine::is_ai_all_stop --------//
int UnitMarine::is_ai_all_stop()
{
if( cur_action != SPRITE_IDLE || ai_action_id )
return 0;
//---- if the ship is on the beach, it's action mode is always ACTION_SHIP_TO_BEACH, so we can't check it against ACTION_STOP ---//
if( action_mode2 == ACTION_SHIP_TO_BEACH )
{
if( in_beach && (extra_move_in_beach==NO_EXTRA_MOVE || extra_move_in_beach==EXTRA_MOVE_FINISH) )
return 1;
}
return action_mode==ACTION_STOP && action_mode2==ACTION_STOP;
}
//---------- End of function UnitMarine::is_ai_all_stop --------//
//------- Begin of function UnitMarine::think_resign --------//
int UnitMarine::think_resign()
{
//---- only resign when the ship has stopped ----//
if( !is_ai_all_stop() )
return 0;
//--- retire this ship if we have better ship technology available ---//
if( unit_id == UNIT_TRANSPORT )
{
if( unit_res[UNIT_CARAVEL]->get_nation_tech_level(nation_recno) > 0 ||
unit_res[UNIT_GALLEON]->get_nation_tech_level(nation_recno) > 0 )
{
if( !nation_array[nation_recno]->ai_is_sea_travel_safe() )
{
resign(COMMAND_AI);
return 1;
}
}
}
return 0;
}
//------- End of function UnitMarine::think_resign --------//
//------- Begin of function UnitMarine::think_del_stop --------//
//
// Think about removing stops whose owner nation is at war with us.
//
void UnitMarine::think_del_stop()
{
if( !is_visible() ) // cannot del stop if the caravan is inside a market place.
return;
Nation* nationPtr = nation_array[nation_recno];
for( int i=stop_defined_num ; i>0 ; i-- )
{
if( firm_array.is_deleted(stop_array[i-1].firm_recno) )
{
del_stop(i, COMMAND_AI);
continue;
}
//----------------------------------------------//
int nationRecno = firm_array[ stop_array[i-1].firm_recno ]->nation_recno;
if( nationPtr->get_relation_status(nationRecno) == NATION_HOSTILE )
{
del_stop(i, COMMAND_AI);
}
}
}
//------- End of function UnitMarine::think_del_stop --------//
//--------- Begin of function UnitMarine::ai_sail_to_nearby_harbor --------//
void UnitMarine::ai_sail_to_nearby_harbor()
{
Nation *ownNation = nation_array[nation_recno];
FirmHarbor *firmHarbor, *bestHarbor=NULL;
int curRating, bestRating=0;
int curXLoc=cur_x_loc(), curYLoc=cur_y_loc();
int curRegionId=region_id();
for( int i=0 ; iai_harbor_count ; i++ )
{
firmHarbor = (FirmHarbor*) firm_array[ ownNation->ai_harbor_array[i] ];
if( firmHarbor->sea_region_id != curRegionId )
continue;
curRating = world.distance_rating( curXLoc, curYLoc, firmHarbor->center_x, firmHarbor->center_y );
curRating += (MAX_SHIP_IN_HARBOR - firmHarbor->ship_count) * 100;
if( curRating > bestRating )
{
bestRating = curRating;
bestHarbor = firmHarbor;
}
}
if( bestHarbor )
assign(bestHarbor->loc_x1, bestHarbor->loc_y1);
}
//---------- End of function UnitMarine::ai_sail_to_nearby_harbor --------//
//--------- Begin of function UnitMarine::ai_ship_being_attacked --------//
//
// This function is called by Unit::hit_target() when the king is
// under attack.
//
// attackerUnitRecno - recno of the attacker unit.
//
void UnitMarine::ai_ship_being_attacked(int attackerUnitRecno)
{
Unit* attackerUnit = unit_array[attackerUnitRecno];
if( attackerUnit->nation_recno == nation_recno ) // this can happen when the unit has just changed nation
return;
if( info.game_date%5 == sprite_recno%5 )
{
nation_array[nation_recno]->ai_sea_attack_target( attackerUnit->next_x_loc(), attackerUnit->next_y_loc() );
}
}
//---------- End of function UnitMarine::ai_ship_being_attacked --------//