//------ Begin of function Nation::ai_sea_attack_target ------// // // <int> targetXLoc, targetYLoc - the location of the target. // int Nation::ai_sea_attack_target(int targetXLoc, int targetYLoc) { UnitMarine* unitMarine; int targetRegionId = world.get_region_id(targetXLoc, targetYLoc); int rc = 0; for( int i=0 ; i<ai_ship_count ; i++ ) { unitMarine = (UnitMarine*) unit_array[ ai_ship_array[i] ]; if( unitMarine->attack_count==0 ) continue; if( !unitMarine->is_ai_all_stop() ) continue; //----- if the ship is in the harbor now -----// if( unitMarine->unit_mode == UNIT_MODE_IN_HARBOR ) { FirmHarbor* firmHarbor = (FirmHarbor*) firm_array[unitMarine->unit_mode_para]; if( firmHarbor->sea_region_id != targetRegionId ) continue; firmHarbor->sail_ship(unitMarine->sprite_recno, COMMAND_AI); } if( !unitMarine->is_visible() ) // no space in the sea for placing the ship continue; if( unitMarine->region_id() != targetRegionId ) continue; //------ order the ship to attack the target ------// unitMarine->attack_unit( targetXLoc, targetYLoc ); rc = 1; } return rc; }
//-------- Begin of function Nation::ai_find_transport_ship -------// // // Locate a ship for transporting units. // // <int> seaRegionId - region id. of the sea which the ship should appear in. // <int> unitXLoc, unitYLoc - the location of the units to be picked up, // try to select a harbor close to this location. // [int] findBest - whether need to find the best ship or just return // one if there is one found. (default: 1) // // return: <int> the recno of the ship located. // int Nation::ai_find_transport_ship(int seaRegionId, int unitXLoc, int unitYLoc, int findBest) { //------- locate a suitable ship --------// UnitMarine* unitMarine; int curRating, bestRating=0, bestUnitRecno=0; for( int i=0 ; i<ai_ship_count ; i++ ) { unitMarine = (UnitMarine*) unit_array[ ai_ship_array[i] ]; err_when( unit_res[unitMarine->unit_id]->unit_class != UNIT_CLASS_SHIP ); if( unitMarine->unit_count > 0 || // if there are already units in the ship unit_res[unitMarine->unit_id]->carry_unit_capacity==0 ) // if the ship does not carry units { continue; } //------- if this ship is in the harbor ---------// if( unitMarine->unit_mode == UNIT_MODE_IN_HARBOR ) { FirmHarbor* firmHarbor = (FirmHarbor*) firm_array[unitMarine->unit_mode_para]; err_when( firmHarbor->firm_id != FIRM_HARBOR ); if( firmHarbor->sea_region_id != seaRegionId ) continue; } //--------- if this ship is on the sea ----------// else { if( !unitMarine->is_ai_all_stop() ) continue; if( unitMarine->region_id() != seaRegionId ) continue; err_when( !unitMarine->is_visible() ); if( !unitMarine->is_visible() ) continue; } //--------- check if the sea region is matched ---------// if( !findBest ) // return immediately when a suitable one is found return unitMarine->sprite_recno; curRating = world.distance_rating( unitXLoc, unitYLoc, unitMarine->next_x_loc(), unitMarine->next_y_loc() ); curRating += (int)unitMarine->hit_points/10 // damage + (int)unitMarine->max_hit_points/10; // ship class if( curRating > bestRating ) { bestRating = curRating; bestUnitRecno = unitMarine->sprite_recno; } } return bestUnitRecno; }