/*
* 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: UnitMarine - functions for displaying info.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "gettext.h"
#ifdef DEBUG
#include
#endif
//--------- Define static vars ----------//
static short unit_disp_y1, unit_info_disp_y1, stop_disp_y1;
static Button3D button_unload_all;
static ButtonGroup button_mode(2);
static Button button_auto_trade;
static Button button_set_stop[MAX_STOP_FOR_SHIP];
static Button button_go_stop[MAX_STOP_FOR_SHIP];
static Button button_cancel_stop[MAX_STOP_FOR_SHIP];
//static Button button_select_attack;
static ButtonCustom button_select_array[MAX_STOP_FOR_SHIP][MAX_GOODS_SELECT_BUTTON];
static void i_disp_marine_select_button(ButtonCustom *button, int repaintBody);
//--------- Begin of function UnitMarine::disp_info ---------//
//
void UnitMarine::disp_info(int refreshFlag)
{
disp_basic_info(INFO_Y1, refreshFlag);
if( !should_show_info() )
return;
//---- display the switch between the units and goods menu ----//
UnitInfo* unitInfo = unit_res[unit_id];
int y=INFO_Y1+54;
if( unitInfo->carry_unit_capacity && unitInfo->carry_goods_capacity )
{
if( refreshFlag == INFO_REPAINT )
{
vga_util.d3_panel_up( INFO_X1, y, INFO_X2, y+22 );
button_mode[0].create_text( INFO_X1+5, y+3, INFO_X1+80, y+19, _("Units") );
button_mode[1].create_text( INFO_X1+90, y+3, INFO_X1+155, y+19, _("Goods") );
button_mode.paint(menu_mode);
button_auto_trade.paint_text( INFO_X1+165, y+3, INFO_X2-10, y+19, auto_mode ? (char*)"T" : (char*)"C");
}
y += 25;
}
//-------------------------------------------------------------//
switch( menu_mode )
{
case SHIP_MENU_GOODS:
disp_goods_menu(y, refreshFlag);
break;
case SHIP_MENU_UNIT:
disp_unit_menu(y, refreshFlag);
break;
}
}
//----------- End of function UnitMarine::disp_info -----------//
//--------- Begin of function UnitMarine::detect_info ---------//
//
void UnitMarine::detect_info()
{
if(!is_visible())
return;
if( detect_basic_info() )
return;
if( detect_select_hotkey() )
return;
if( !is_own() )
return;
//----- detect switching the menu mode -----//
UnitInfo* unitInfo = unit_res[unit_id];
if( unitInfo->carry_unit_capacity && unitInfo->carry_goods_capacity )
{
int rc;
if( (rc=button_mode.detect()) >= 0 )
{
menu_mode = rc;
info.disp();
return;
}
}
if( !is_own() && !config.show_ai_info)
return;
//--------- detect menu mode --------//
switch( menu_mode )
{
case SHIP_MENU_GOODS:
detect_goods_menu();
break;
case SHIP_MENU_UNIT:
detect_unit_menu();
break;
}
//---- detect toggling auto trade mode ----//
if( button_auto_trade.detect() )
{
if( !remote.is_enable() )
{
auto_mode = !auto_mode;
button_auto_trade.paint_text( INFO_X1+165, INFO_Y1+57, INFO_X2-10, INFO_Y1+73, auto_mode ? (char*)"T" : (char*)"C");
}
else
{
// packet structure
short *shortPtr = (short *)remote.new_send_queue_msg(MSG_U_SHIP_CHANGE_MODE, 2*sizeof(short) );
*shortPtr = sprite_recno;
shortPtr[1] = !auto_mode;
}
}
}
//----------- End of function UnitMarine::detect_info -----------//
//--------- Begin of function UnitMarine::is_in_build_menu ---------//
// Returns true if a unit is currently in build mode.
// Only reliable if this unit is the selected unit.
// Used by Info to detect if the build mode is opened.
//
bool UnitMarine::is_in_build_menu()
{
return false;
}
//----------- End of function UnitMarine::is_in_build_menu -----------//
//-------- Begin of function UnitMarine::should_show_info ------//
//
int UnitMarine::should_show_info()
{
if( config.show_ai_info || nation_recno==nation_array.player_recno )
return 1;
//--- if any of the units on the ship are spies of the player ---//
for( int i=0 ; iis_own() )
return 1;
}
return 0;
}
//---------- End of function UnitMarine::should_show_info --------//
//--------- Begin of function UnitMarine::disp_unit_menu ---------//
//
void UnitMarine::disp_unit_menu(int dispY1, int refreshFlag)
{
disp_unit_list(dispY1 , refreshFlag);
disp_unit_info(dispY1+90, refreshFlag);
if( !is_own() )
return;
if( refreshFlag==INFO_REPAINT )
button_unload_all.paint( INFO_X1, dispY1+165, 'A', "OUTSHIP" );
if( can_unload_unit() )
button_unload_all.enable();
else
button_unload_all.disable();
// if( refreshFlag == INFO_REPAINT )
// button_select_attack.paint_text( INFO_X2-50, INFO_Y1+180, INFO_X2-5, INFO_Y1+200, "0" );
}
//----------- End of function UnitMarine::disp_unit_menu -----------//
//--------- Begin of function UnitMarine::can_unload_unit ---------//
//
int UnitMarine::can_unload_unit()
{
err_when(cur_action==SPRITE_ATTACK && (cur_x!=next_x || cur_y!=next_y));
return unit_count>0 &&
(cur_action==SPRITE_IDLE || cur_action==SPRITE_ATTACK) &&
is_on_coast();
}
//----------- End of function UnitMarine::can_unload_unit -----------//
//--------- Begin of function UnitMarine::detect_unit_menu ---------//
//
void UnitMarine::detect_unit_menu()
{
//------- detect clicking on the units --------//
if( detect_unit_list() )
disp_unit_info(unit_info_disp_y1, INFO_UPDATE);
if( !is_own() )
return;
//----------- detect the unload all button -----------//
if( button_unload_all.detect('R') )
{
unload_all_units(COMMAND_PLAYER);
info.disp();
// ##### begin Gilbert 25/9 ######//
se_ctrl.immediate_sound("TURN_ON");
// ##### end Gilbert 25/9 ######//
}
/*
if(button_select_attack.detect())
{
se_ctrl.immediate_sound("TURN_ON", 100, 0);
select_attack_weapon();
}
*/
}
//----------- End of function UnitMarine::detect_unit_menu -----------//
//--------- Begin of function UnitMarine::select_attack_weapon ---------//
void UnitMarine::select_attack_weapon()
{
// ###### begin Gilbert 25/6 ########//
if( attack_count == 0 ) // TRANSPORT can't select attack weapon
return;
// ###### end Gilbert 25/6 ########//
char oldAttackRange = attack_info_array[0].attack_range;
if(attack_mode_selected>unit_count)
attack_mode_selected = 0;
else
{
Unit *unitPtr;
int found = 0;
for(int i=attack_mode_selected+1; i<=unit_count; i++)
{
unitPtr = unit_array[unit_recno_array[i-1]];
if(unitPtr->attack_count && unit_res[unitPtr->unit_id]->unit_class==UNIT_CLASS_WEAPON)
{
//ship_attack_info = *unit_res.get_attack_info(unit_res[unitPtr->unit_id]->first_attack);
ship_attack_info = *unitPtr->attack_info_array;
ship_attack_info.eqv_attack_next = 0;
ship_attack_info.bullet_out_frame = unit_res.get_attack_info(unit_res[unit_id]->first_attack)->bullet_out_frame;
attack_count = 1;
attack_info_array = &ship_attack_info;
found++;
attack_mode_selected = i;
//cur_action = SPRITE_READY_TO_MOVE;
break;
}
}
if(!found)
attack_mode_selected = 0;
}
if(attack_mode_selected==0)
{
ship_attack_info = *unit_res.get_attack_info(unit_res[unit_id]->first_attack);
attack_count = 1;
attack_info_array = &ship_attack_info;
}
//-------- update attacking if neccessary --------//
if(attack_info_array[0].attack_range unit_count )
selected_unit_id = 0;
dispY1+=4;
for( int i=0 ; iunit_id )
{
vga_front.d3_panel_up( x, y, x+27, y+23, 1 );
// ###### begin Gilbert 17/10 ########//
vga_front.put_bitmap(x+2, y+2, unit_res[unitPtr->unit_id]->get_small_icon_ptr(unitPtr->rank_id));
// ###### end Gilbert 17/10 ########//
}
//----- highlight the selected unit -------//
if( selected_unit_id == i+1 )
vga_front.rect( x-2, y-2, x+29, y+25, 2, V_YELLOW );
else
vga_front.rect( x-2, y-2, x+29, y+25, 2, vga_front.color_up );
//---------- display hit point ----------//
font_san.disp(x+32, y+6, (int) unitPtr->hit_points, 1, x+61);
last_unit_id_array[i] = unitPtr->unit_id;
//------- set help parameters ---------//
if( mouse.in_area(x, y, x+27, y+23) )
help.set_unit_help( unitPtr->unit_id, unitPtr->rank_id, x, y, x+27, y+23 );
}
else
{
if( last_unit_id_array[i] != 0 )
{
vga_util.blt_buf( x-2, y-2, x+49, y+25, 0 );
last_unit_id_array[i] = 0;
}
}
}
}
//----------- End of function UnitMarine::disp_unit_list -----------//
//--------- Begin of function UnitMarine::detect_unit_list ---------//
//
int UnitMarine::detect_unit_list()
{
//------- detect buttons on hiring firm units -------//
int i, x, y;
for( i=0 ; i unit_count )
selected_unit_id = unit_count;
//---------------- paint the panel --------------//
if( refreshFlag == INFO_REPAINT )
{
vga_util.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+71 );
}
else
{
if( lastSelected != selected_unit_id > 0 )
{
lastSelected = selected_unit_id > 0;
vga_util.blt_buf( INFO_X1, dispY1, INFO_X2, dispY1+71, 0 );
}
}
//-----------------------------------------------//
if( selected_unit_id > 0 )
{
int x=INFO_X1+4, y=dispY1+4, x1=x+100;
Unit* unitPtr = unit_array[ unit_recno_array[selected_unit_id-1] ];
if( unitPtr->race_id && unitPtr->rank_id != RANK_KING )
info.disp_loyalty( x, y, x1, unitPtr->loyalty, unitPtr->target_loyalty, nation_recno, refreshFlag);
else
font_san.field( x, y, _("Loyalty"), x1, _("N/A"), INFO_X2-2, refreshFlag ); // no loyalty because it does not belong to your empire
y+=16;
font_san.field( x, y, _("Combat"), x1, unitPtr->skill.combat_level, 1, INFO_X2-2, refreshFlag);
y+=16;
//----------------------------------------------//
String str;
str = (int) unitPtr->hit_points;
str += "/";
str += unitPtr->max_hit_points;
font_san.field( x, y, _("Hit Points"), x1, str, INFO_X2-2, refreshFlag);
y += 16;
//----------------------------------------------//
if( unitPtr->skill.skill_id )
{
if( refreshFlag == INFO_REPAINT )
font_san.field( x, y, unitPtr->skill.skill_des(), x1, unitPtr->skill.skill_level , 1, INFO_X2-2, refreshFlag );
else
{
font_san.put( x+2, y+2, unitPtr->skill.skill_des(), 1, x1-2 );
font_san.update_field( x1, y, unitPtr->skill.skill_level, 1, INFO_X2-10);
}
}
else
{
if( refreshFlag == INFO_REPAINT )
font_san.field( x, y, "", x1, "", INFO_X2-2, refreshFlag );
else
{
font_san.put( x+2, y+2, "", 1, x1-2 );
font_san.update_field( x1, y, "", INFO_X2-10);
}
}
}
}
//----------- End of function UnitMarine::disp_unit_info -----------//
//--------- Begin of function UnitMarine::disp_goods_menu ---------//
//
void UnitMarine::disp_goods_menu(int dispY1, int refreshFlag)
{
disp_stop(dispY1, refreshFlag);
disp_goods(dispY1+180, refreshFlag);
}
//----------- End of function UnitMarine::disp_goods_menu -----------//
//--------- Begin of function UnitMarine::detect_goods_menu ---------//
//
void UnitMarine::detect_goods_menu()
{
detect_stop();
}
//---------- End of function UnitMarine::detect_goods_menu ----------//
//--------- Begin of function UnitMarine::disp_stop ---------//
//
void UnitMarine::disp_stop(int dispY1, int refreshFlag)
{
//###### begin trevor 3/10 #######//
if(refreshFlag!=INFO_REPAINT && refreshFlag!=INFO_UPDATE)
return;
int i, x=INFO_X1, y=dispY1, needRefresh;
Firm *firmPtr;
static short last_firm_recno_array[MAX_STOP_FOR_CARAVAN];
for(i=0 ; ination_recno]->disp_nation_color(x+4, y+4);
font_san.put(x+20, y+4, firmPtr->firm_name());
font_san.put(x+4, y+19, _("Pick up:"));
#if(defined(FRENCH))
button_set_stop[i].paint_text( x+4, y+37, x+90, y+56, "Faire Escale" );
#else
button_set_stop[i].paint_text( x+4, y+37, x+80, y+56, _("Set Stop") );
#endif
button_set_stop[i].set_help_code( "SSETSTOP" );
#if(defined(FRENCH))
button_go_stop[i].paint_text( x+94, y+37, x+180, y+56, "Voir Escale" );
#else
button_go_stop[i].paint_text( x+84, y+37, x+180, y+56, _("View Stop") );
#endif
button_go_stop[i].set_help_code( "SGOSTOP" );
button_cancel_stop[i].paint_text( x+184, y+37, INFO_X2-4, y+56, "X" );
button_cancel_stop[i].set_help_code( "SDELSTOP" );
}
disp_goods_select_button(i, y+1, refreshFlag);
}
}
//###### end trevor 3/10 #######//
}
//---------- End of function UnitMarine::disp_stop ----------//
//------ Begin of function UnitMarine::disp_goods_select_button -------//
//
void UnitMarine::disp_goods_select_button(int stopNum, int dispY1, int refreshFlag)
{
if(refreshFlag!=INFO_REPAINT && refreshFlag!=INFO_UPDATE)
return;
#define SHIFT_X_OFFSET 73
#define SELECT_BUTTON_WIDTH 16
#define SELECT_BUTTON_HEIGHT 16
ShipStop *stopPtr = &stop_array[stopNum];
Firm *harborPtr = firm_array[stopPtr->firm_recno];
int x=INFO_X1+SHIFT_X_OFFSET, y=dispY1+17, x1, pick_up_goods = 0;
char *pickUpArray = stopPtr->pick_up_array;
char isPush;
//###### begin trevor 3/10 #######//
for(int i=1 ;i<=MAX_PICK_UP_GOODS; ++i, pickUpArray++)
{
int rawId = i;
if( rawId < 1 || rawId > MAX_RAW )
rawId = 0;
int productId = i-MAX_RAW;
if( productId < 1 || productId > MAX_PRODUCT )
productId = 0;
int stock = -1;
for(int j=harborPtr->linked_firm_count-1; j>=0 && stock<0; --j)
{
err_when(firm_array.is_deleted(harborPtr->linked_firm_array[j]));
Firm *firmPtr = firm_array[harborPtr->linked_firm_array[j]];
if( FirmMarket *firmMarket = firmPtr->cast_to_FirmMarket() )
{
MarketGoods *marketGoods;
if( rawId )
{
marketGoods = firmMarket->market_raw_array[rawId-1];
err_when( marketGoods && marketGoods->raw_id != rawId );
}
else if( productId )
{
marketGoods = firmMarket->market_product_array[productId-1];
err_when( marketGoods && marketGoods->product_raw_id != productId );
}
else
{
err_here();
marketGoods = NULL;
}
if( marketGoods )
{
stock = (int) marketGoods->stock_qty;
}
}
else if( FirmMine *firmMine = firmPtr->cast_to_FirmMine() )
{
if( rawId && firmMine->raw_id == rawId )
{
stock = (int) firmMine->stock_qty;
}
}
else if( FirmFactory *firmFactory = firmPtr->cast_to_FirmFactory() )
{
if( productId && firmFactory->product_raw_id == productId )
{
stock = (int) firmFactory->stock_qty;
}
//else if( rawId && firmFactory->product_raw_id == rawId )
//{
// stock = (int) firmFactory->raw_stock_qty;
//}
}
}
x1 = x + i*SELECT_BUTTON_WIDTH;
if( stock >= 0 )
{
isPush = stopPtr->pick_up_array[i-1];
err_when(isPush && (stopPtr->pick_up_type==AUTO_PICK_UP || stopPtr->pick_up_type==NO_PICK_UP));
button_select_array[stopNum][i].paint(x1, y, x1+SELECT_BUTTON_WIDTH,
y+SELECT_BUTTON_HEIGHT, i_disp_marine_select_button, ButtonCustomPara(this, i),
0, isPush); // 0 for inelastic
pick_up_goods++;
}
else
{
vga_util.blt_buf( x1, y, x1+SELECT_BUTTON_WIDTH, y+SELECT_BUTTON_HEIGHT, 0 );
}
}
//---------------- draw the buttons for auto_pick_up and no_pick_up -------------//
if( pick_up_goods>1 )
{
x1 = x;
isPush = (stopPtr->pick_up_type==AUTO_PICK_UP);
button_select_array[stopNum][AUTO_PICK_UP].paint(x1, y, x1+SELECT_BUTTON_WIDTH,
y+SELECT_BUTTON_HEIGHT, i_disp_marine_select_button, ButtonCustomPara(this, AUTO_PICK_UP),
0, isPush); // 0 for inelastic
x1 = x+SELECT_BUTTON_WIDTH*NO_PICK_UP;
button_select_array[stopNum][NO_PICK_UP].paint(x1, y, x1+SELECT_BUTTON_WIDTH,
y+SELECT_BUTTON_HEIGHT, i_disp_marine_select_button, ButtonCustomPara(this, NO_PICK_UP));
}
else
{
x1 = x;
vga_util.blt_buf( x1, y, x1+SELECT_BUTTON_WIDTH, y+SELECT_BUTTON_HEIGHT, 0 );
x1 = x+SELECT_BUTTON_WIDTH*NO_PICK_UP;
vga_util.blt_buf( x1, y, x1+SELECT_BUTTON_WIDTH, y+SELECT_BUTTON_HEIGHT, 0 );
}
//###### end trevor 3/10 #######//
}
//---------- End of function UnitMarine::disp_goods_select_button ----------//
//--------- Begin of function UnitMarine::detect_stop ---------//
//
void UnitMarine::detect_stop()
{
int i, x=INFO_X1, y=INFO_Y1+54+25;
for( i=0 ; i=stop_defined_num)
continue;
if(button_cancel_stop[i].detect())
{
if(is_visible())
{
del_stop(i+1, COMMAND_PLAYER);
// ##### begin Gilbert 25/9 ######//
se_ctrl.immediate_sound("TURN_ON");
// ##### end Gilbert 25/9 ######//
}
}
for(int b=0; bcenter_x, firmPtr->center_y);
}
}
}
//---------- End of function UnitMarine::detect_stop ----------//
//--------- Begin of function UnitMarine::set_stop_pick_up ---------//
//
// Set the pickup type of a specific stop of this marine.
//
// stopId - id. of the stop. (1 - MAX_STOP_FOR_SHIP)
// newPickUpType - set the pickup type of the specific stop. (0 - MAX_GOODS_SELECT_BUTTON-1)
// remoteActoin - remote action type
//
void UnitMarine::set_stop_pick_up(int stopId, int newPickUpType, int remoteAction)
{
if(remote.is_enable())
{
if(!remoteAction)
{
// packet structure :
short *shortPtr = (short *)remote.new_send_queue_msg(MSG_U_SHIP_CHANGE_GOODS, 3*sizeof(short));
*shortPtr = sprite_recno;
shortPtr[1] = stopId;
shortPtr[2] = newPickUpType;
return;
}
else //-------- validate remote message ----------//
{
//-*******************************************************-//
/*char mess[255];
sprintf(mess, "Change Seed !!!! \r\n");
OutputDebugString(mess);
Firm *firmPtr = firm_array[stop_array[stopId-1].firm_recno];
switch(firmPtr->firm_id)
{
case FIRM_MINE:
//firmPtr->sell_firm(COMMAND_AUTO);
//firm_array[stop_array[0].firm_recno]->sell_firm(COMMAND_AUTO);
break;
case FIRM_FACTORY:
break;
case FIRM_MARKET:
break;
}
update_stop_list();
if(unit_array.selected_recno == sprite_recno)
{
if(!remote.is_enable() || nation_recno==nation_array.player_recno || config.show_ai_info)
{
int y=INFO_Y1+54;
UnitInfo* unitInfo = unit_res[unit_id];
if( unitInfo->carry_unit_capacity && unitInfo->carry_goods_capacity )
y+=25;
disp_stop(y, INFO_UPDATE);
}
}*/
//-*******************************************************-//
err_when(!is_visible()); // no action if the unit is invisible
if(firm_array.is_deleted(stop_array[stopId-1].firm_recno))
return; // firm is deleted
if(stop_defined_numPICK_UP_PRODUCT_LAST);
stop_array[stopId-1].pick_up_toggle(newPickUpType);
break;
}
if( unit_array.selected_recno == sprite_recno )
{
if(nation_recno==nation_array.player_recno || config.show_ai_info)
{
int y=INFO_Y1+54;
UnitInfo* unitInfo = unit_res[unit_id];
if( unitInfo->carry_unit_capacity && unitInfo->carry_goods_capacity )
y+=25;
disp_stop(y, INFO_UPDATE);
}
}
}
//---------- End of function UnitMarine::set_stop_pick_up ----------//
//--------- Begin of function UnitMarine::disp_goods ---------//
//
void UnitMarine::disp_goods(int dispY1, int refreshFlag)
{
if( refreshFlag == INFO_REPAINT )
vga_util.d3_panel_up( INFO_X1, dispY1, INFO_X2, dispY1+42 );
int x=INFO_X1+20, y=dispY1+5;
String str;
int i;
for(i=0; ix1;
int y1 = button->y1;
int x2 = button->x2;
int y2 = button->y2;
int shift;
//------------- modify x1,y1, x2,y2 to the button body ---------------//
if(button->pushed_flag)
{
int colorDown = Vga::active_buf->color_down; // change the color of the body area to yellow to highlight the change
Vga::active_buf->color_down = (char) V_YELLOW;
Vga::active_buf->d3_panel_down(x1, y1, x2, y2);
Vga::active_buf->color_down = (char) colorDown;
x1++;
y1++;
shift = 2;
}
else
{
Vga::active_buf->d3_panel_up(x1, y1, x2, y2);
x2--;
y2--;
shift = 3;
}
//-------------- put goods icon ---------------//
int id = button->custom_para.value;
const char *iconName=NULL;
int x = x1+shift;
int y = y1+shift;
if(id==AUTO_PICK_UP)
{
iconName = "AUTOPICK";
}
else if(id==NO_PICK_UP)
{
iconName = "NOPICK";
}
else if(id>=PICK_UP_RAW_FIRST && id<=PICK_UP_RAW_LAST)
{
raw_res.put_small_raw_icon( x, y, id-PICK_UP_RAW_FIRST+1 );
}
else if(id>=PICK_UP_PRODUCT_FIRST && id<=PICK_UP_PRODUCT_LAST)
{
raw_res.put_small_product_icon( x, y, id-PICK_UP_PRODUCT_FIRST+1 );
}
else
err_here();
if( iconName )
{
help.set_help( x, y, x+9, y+9, iconName );
Vga::active_buf->put_bitmap_trans( x, y, image_icon.get_ptr(iconName) );
}
}
//---------- end static function i_disp_marine_select_button ---------------//
//---------- Begin of function UnitMarine::fix_attack_info ----------//
void UnitMarine::fix_attack_info()
{
Unit::fix_attack_info();
err_when( attack_mode_selected < 0 || attack_mode_selected > unit_count );
if( attack_count > 0 )
{
err_when(attack_count > 1);
if( attack_mode_selected == 0 )
{
ship_attack_info = *unit_res.get_attack_info(unit_res[unit_id]->first_attack);
}
attack_info_array = &ship_attack_info;
}
}
//---------- End of function UnitMarine::fix_attack_info ----------//
//--------- Begin of function UnitMarine::set_stop ---------//
// stopId - the id. of the stop
// stopXLoc, stopYLoc - the location of the stop
//
void UnitMarine::set_stop(int stopId, int stopXLoc, int stopYLoc, char remoteAction)
{
//-------------------------------------------------------//
// check if there is a station in the given location
//-------------------------------------------------------//
Location *locPtr = world.get_loc(stopXLoc, stopYLoc);
if(!locPtr->is_firm())
return;
Firm *firmPtr = firm_array[locPtr->firm_recno()];
if( !can_set_stop( firmPtr->firm_recno ) )
return;
//-------------------------------------------------------//
// return if the harbor stop is in another territory
//-------------------------------------------------------//
FirmHarbor *harborPtr = (FirmHarbor*) firmPtr;
if(world.get_loc(next_x_loc(), next_y_loc())->region_id!=harborPtr->sea_region_id)
return;
//-----------------------------------------//
if(!remoteAction && remote.is_enable())
{
// packet structure :
short *shortPtr = (short *) remote.new_send_queue_msg(MSG_U_SHIP_SET_STOP, 4*sizeof(short));
*shortPtr = sprite_recno;
shortPtr[1] = stopId;
shortPtr[2] = stopXLoc;
shortPtr[3] = stopYLoc;
return;
}
if(!stop_array[stopId-1].firm_recno)
stop_defined_num++; // no plus one if the recno is defined originally
//-------------------------------------------------------//
// set the station recno of the stop
//-------------------------------------------------------//
ShipStop *stopPtr = stop_array + stopId - 1;
if(stopPtr->firm_recno==firmPtr->firm_recno)
{
err_when(stopPtr->firm_loc_x1!=firmPtr->loc_x1 || stopPtr->firm_loc_y1!=firmPtr->loc_y1);
return; // same stop as before
}
short oldStopFirmRecno = dest_stop_id ? stop_array[dest_stop_id-1].firm_recno : 0;
stopPtr->firm_recno = firmPtr->firm_recno;
stopPtr->firm_loc_x1 = firmPtr->loc_x1;
stopPtr->firm_loc_y1 = firmPtr->loc_y1;
//-------------------------------------------------------//
// set pick up selection based on availability
//-------------------------------------------------------//
stopPtr->pick_up_set_auto();
int goodsId, goodsNum = 0;
for(int i=harborPtr->linked_firm_count-1; i>=0 && goodsNum<2; --i)
{
MarketGoods *goodsPtr;
int id = 0;
err_when(firm_array.is_deleted(harborPtr->linked_firm_array[i]));
firmPtr = firm_array[harborPtr->linked_firm_array[i]];
switch(firmPtr->firm_id)
{
case FIRM_MINE:
id = ((FirmMine*)firmPtr)->raw_id;
if(id)
{
if(!goodsNum)
goodsId = id;
goodsNum++;
}
break;
case FIRM_FACTORY:
id = ((FirmFactory*)firmPtr)->product_raw_id+MAX_RAW;
if(id)
{
if(!goodsNum)
goodsId = id;
goodsNum++;
}
break;
case FIRM_MARKET:
goodsPtr = ((FirmMarket*) firmPtr)->market_goods_array;
for(int j=0; jraw_id)
{
id = goodsPtr->raw_id;
if(!goodsNum)
goodsId = id;
goodsNum++;
}
else if(goodsPtr->product_raw_id)
{
id = goodsPtr->product_raw_id+MAX_RAW;
if(!goodsNum)
goodsId = id;
goodsNum++;
}
}
break;
default:
err_here();
break;
}
}
if(goodsNum==1)
stopPtr->pick_up_toggle(goodsId); // cancel auto_pick_up
else if(!goodsNum)
stopPtr->pick_up_set_none();
//-------------------------------------------------------//
// remove duplicate stop or stop change nation
//-------------------------------------------------------//
update_stop_list();
if(dest_stop_id)
{
short newStopFirmRecno;
err_when(firm_array.is_deleted(stop_array[dest_stop_id-1].firm_recno));
if((newStopFirmRecno=stop_array[dest_stop_id-1].firm_recno) != oldStopFirmRecno)
{
firmPtr = firm_array[newStopFirmRecno];
err_when(firmPtr->firm_id!=FIRM_HARBOR);
move_to_firm_surround(firmPtr->loc_x1, firmPtr->loc_y1, sprite_info->loc_width, sprite_info->loc_height, FIRM_HARBOR);
journey_status = ON_WAY_TO_FIRM;
}
}
else
stop2();
//-------------------------------------------------------//
// refresh stop info area
//-------------------------------------------------------//
if(unit_array.selected_recno==sprite_recno)
{
if(nation_recno==nation_array.player_recno || config.show_ai_info)
info.disp();
}
}
//---------- End of function UnitMarine::set_stop ----------//