/*
* 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 : OREMOTEM.CPP
//Description : Object RemoteMsg
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
// ##### patch begin Gilbert 20/1 #######//
#include
// ##### patch end Gilbert 20/1 #######//
//---------------- Define variable type ---------------//
typedef void (RemoteMsg::*MsgProcessFP)();
//----------- Define function pointers array -----------//
static MsgProcessFP msg_process_function_array[] =
{
&RemoteMsg::queue_header,
&RemoteMsg::queue_trailer,
&RemoteMsg::new_nation,
&RemoteMsg::update_game_setting,
&RemoteMsg::start_game,
&RemoteMsg::next_frame,
&RemoteMsg::request_resend,
&RemoteMsg::tell_send_time,
&RemoteMsg::set_speed,
&RemoteMsg::tell_random_seed,
&RemoteMsg::request_save_game,
&RemoteMsg::player_quit,
&RemoteMsg::unit_stop,
&RemoteMsg::unit_move,
&RemoteMsg::unit_set_force_move,
&RemoteMsg::unit_attack,
&RemoteMsg::unit_assign,
&RemoteMsg::unit_change_nation,
&RemoteMsg::unit_build_firm,
&RemoteMsg::unit_burn,
&RemoteMsg::units_settle,
&RemoteMsg::unit_set_guard,
&RemoteMsg::unit_set_rank,
&RemoteMsg::unit_dismount,
&RemoteMsg::unit_reward,
&RemoteMsg::units_transform,
&RemoteMsg::unit_resign,
&RemoteMsg::units_assign_to_ship,
&RemoteMsg::units_ship_to_beach,
&RemoteMsg::unit_succeed_king,
&RemoteMsg::units_return_camp,
&RemoteMsg::caravan_change_goods,
&RemoteMsg::caravan_set_stop,
&RemoteMsg::caravan_del_stop,
&RemoteMsg::caravan_selected,
&RemoteMsg::ship_unload_unit,
&RemoteMsg::ship_unload_all_units,
&RemoteMsg::ship_change_goods,
&RemoteMsg::ship_set_stop,
&RemoteMsg::ship_del_stop,
&RemoteMsg::ship_change_mode,
&RemoteMsg::ship_selected,
&RemoteMsg::god_cast,
&RemoteMsg::change_spy_nation,
&RemoteMsg::notify_cloaked_nation,
&RemoteMsg::unit_change_aggressive_mode,
&RemoteMsg::spy_change_notify_flag,
//#### trevor 15/10 ######//
&RemoteMsg::spy_assassinate,
//#### trevor 15/10 ######//
&RemoteMsg::unit_add_way_point,
&RemoteMsg::firm_sell,
&RemoteMsg::firm_cancel,
&RemoteMsg::firm_destruct,
&RemoteMsg::firm_set_repair,
&RemoteMsg::firm_train_level,
&RemoteMsg::mobilize_worker,
&RemoteMsg::mobilize_overseer,
&RemoteMsg::mobilize_builder,
&RemoteMsg::firm_toggle_link_firm,
&RemoteMsg::firm_toggle_link_town,
&RemoteMsg::firm_pull_town_people,
&RemoteMsg::firm_set_worker_home,
&RemoteMsg::firm_bribe,
&RemoteMsg::firm_capture,
&RemoteMsg::firm_reward,
&RemoteMsg::camp_patrol,
&RemoteMsg::toggle_camp_patrol,
&RemoteMsg::inn_hire,
&RemoteMsg::market_scrap,
&RemoteMsg::market_hire_caravan,
&RemoteMsg::research_start,
&RemoteMsg::build_weapon,
&RemoteMsg::cancel_weapon,
&RemoteMsg::skip_build_weapon,
&RemoteMsg::build_ship,
&RemoteMsg::sail_ship,
&RemoteMsg::skip_build_ship,
&RemoteMsg::factory_change_product,
&RemoteMsg::base_mobilize_prayer,
&RemoteMsg::invoke_god,
&RemoteMsg::town_recruit,
&RemoteMsg::town_skip_recruit,
&RemoteMsg::town_migrate,
&RemoteMsg::town_collect_tax,
&RemoteMsg::town_reward,
&RemoteMsg::town_toggle_link_firm,
&RemoteMsg::town_toggle_link_town,
&RemoteMsg::town_auto_tax,
&RemoteMsg::town_auto_grant,
&RemoteMsg::town_grant_independent,
&RemoteMsg::wall_build,
&RemoteMsg::wall_destruct,
&RemoteMsg::spy_cycle_action,
&RemoteMsg::spy_leave_town,
&RemoteMsg::spy_leave_firm,
&RemoteMsg::spy_capture_firm,
&RemoteMsg::spy_drop_identity,
&RemoteMsg::spy_reward,
&RemoteMsg::spy_exposed,
&RemoteMsg::send_talk_msg,
&RemoteMsg::reply_talk_msg,
&RemoteMsg::nation_contact,
&RemoteMsg::nation_set_should_attack,
&RemoteMsg::chat,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
&RemoteMsg::compare_remote_object,
};
//---------- Declare static functions ----------//
static void validate_selected_unit_array(short* selectedUnitArray, short& selectedCount);
static short validate_firm(short firmRecno, unsigned flags = 0);
static short validate_town(short townRecno, unsigned flags = 0);
//------ Begin of function RemoteMsg::process_msg -----//
//
void RemoteMsg::process_msg()
{
if( id==0 )
return;
err_when( idLAST_REMOTE_MSG_ID );
MsgProcessFP msgProcessFP = msg_process_function_array[id-FIRST_REMOTE_MSG_ID];
(this->*msgProcessFP)(); // call the corrsponding function to return the news process_msg
}
//------- End of function RemoteMsg::process_msg -----//
//-------- Begin of function RemoteMsg::queue_header ---------//
//
// Nothing here, it shouldn't be called at all.
//
void RemoteMsg::queue_header()
{
}
//--------- End of function RemoteMsg::queue_header ---------//
//-------- Begin of function RemoteMsg::queue_trailer ---------//
//
// Nothing here
//
void RemoteMsg::queue_trailer()
{
#ifdef DEBUG
long_log->printf("Queue trailer of nation %d\n", *(short *)data_buf);
#endif
}
//--------- End of function RemoteMsg::queue_trailer ---------//
//-------- Begin of function RemoteMsg::new_nation ---------//
//
// Create a remote player.
//
// Sent from a client to the host when the client start a new nation.
//
// Client --> MSG_NEW_NATION --> Host
//
// Sent from the host to a newly joined client to update it with all
// existing nations.
//
// Host --> UPDATE_GAME_SETTING --> Client
//
// structure of data_buf:
//
// - Nation object of the newly joined nation
//
void RemoteMsg::new_nation()
{
//-------- create a new nation now --------//
if( !remote.is_host ) // ignore this message if this is not the host
return;
Nation* nationPtr = (Nation*)(this->data_buf);
int nationRecno = nation_array.new_nation( NATION_REMOTE, nationPtr->race_id, nationPtr->color_scheme_id, nationPtr->player_id );
game.mp_broadcast_setting();
}
//--------- End of function RemoteMsg::new_nation ---------//
//-------- Begin of function RemoteMsg::update_game_setting ---------//
//
// Sent from the host to clients, update the client with the latest
// game settings.
//
// Host --> UPDATE_GAME_SETTING --> Client
//
// structure of data_buf:
//
// - random seed
// - The number of nations joined
// - An array of nation objects
//
void RemoteMsg::update_game_setting()
{
//------- get parameters -----------//
char* dataPtr = data_buf;
//------- set random seed -----------//
m.set_random_seed(*(long*)dataPtr);
dataPtr += sizeof(long);
//------- update nation_array -----------//
int nationCount = *(short*)dataPtr;
dataPtr += sizeof(short);
char nationType;
int i, ownCount=0;
nation_array.deinit(); // deinit() first and then recreate it as follows
for( i=0 ; i1 );
}
//--------- End of function RemoteMsg::update_game_setting ---------//
//-------- Begin of function RemoteMsg::start_game ---------//
//
// The host sends MSG_START_GAME to the clients to notify them
// to start the game.
//
void RemoteMsg::start_game()
{
game.started_flag = 1;
}
//--------- End of function RemoteMsg::start_game ---------//
//-------- Begin of function RemoteMsg::next_frame ---------//
//
// Notify the others that we are ready to proceed to the next
// frame.
//
// structure of data_buf:
//
// - nation recno of the message queue
//
void RemoteMsg::next_frame()
{
short nationRecno = *((short*)data_buf);
if( !nation_array.is_deleted(nationRecno) )
{
nation_array[nationRecno]->next_frame_ready=1;
}
}
//--------- End of function RemoteMsg::next_frame ---------//
//-------- Begin of function RemoteMsg::request_resend ---------//
//
// Request a specific player to resend its packets.
//
// structure of data_buf:
//
// - player id.
// - frame count of the message queue
//
void RemoteMsg::request_resend()
{
DWORD *dwordPtr = (DWORD*) data_buf;
err_when( dwordPtr[0] == (~nation_array)->player_id ); // sent to itself
remote.send_backup_now(dwordPtr[0], dwordPtr[1]);
}
//--------- End of function RemoteMsg::request_resend ---------//
//-------- Begin of function RemoteMsg::tell_send_time ---------//
//
// Display the delivery time of the packet
//
void RemoteMsg::tell_send_time()
{
String str;
unsigned long sendTime = *((unsigned long*)data_buf);
str = "Packet Delivery Time: ";
str += m.get_time() - sendTime;
str += " ms ";
str += m.get_time();
font_san.disp( ZOOM_X1, 4, str, ZOOM_X1+249);
}
//--------- End of function RemoteMsg::tell_send_time ---------//
//-------- Begin of function RemoteMsg::set_speed ---------//
//
// Order the selected units to stop.
//
// structure of data_buf:
//
// - the game speed setting.
//
void RemoteMsg::set_speed()
{
err_when( id != MSG_SET_SPEED);
short* shortPtr = (short*) data_buf;
sys.set_speed(shortPtr[0], COMMAND_REMOTE); // 1-remote call
}
//--------- End of function RemoteMsg::set_speed ---------//
//-------- Begin of function RemoteMsg::tell_random_seed ---------//
//
// structure of data_buf:
//
// - nation recno
// - random seed
//
void RemoteMsg::tell_random_seed()
{
// ######## patch begin Gilbert 20/1 #########//
char *p = data_buf;
short nationRecno = *(short *)p;
p += sizeof(short);
long remoteSeed = *(long *)p;
#if defined(DEBUG) && defined(ENABLE_LOG)
String logLine("remote random seed ");
logLine += nationRecno;
logLine += ",";
logLine += remoteSeed;
LOG_MSG(logLine);
#endif
// it assume random seed of each nation come in sequence
// if may fails when connection lost
static long lastRemoteSeed = -1;
static short lastNation = 0x7fff;
if( nationRecno <= lastNation)
{
// assume the smallest human nation
lastRemoteSeed = remoteSeed;
}
else
{
if( lastRemoteSeed != remoteSeed )
{
#ifdef DEBUG
// delete long_log;
// long_log = NULL;
#endif
LOG_DUMP;
if( (remote.sync_test_level & 1) && (remote.sync_test_level >= 0) )
{
remote.sync_test_level = ~remote.sync_test_level; // signal error encountered
if( sys.debug_session )
err.run( "Multiplayer Random Seed Sync Error." );
else
box.msg( "Multiplayer Random Seed Sync Error." );
}
}
}
lastNation = nationRecno;
// ######## patch end Gilbert 20/1 #########//
}
//-------- End of function RemoteMsg::tell_random_seed ---------//
//-------- Begin of function RemoteMsg::request_save_game ---------//
void RemoteMsg::request_save_game()
{
err_when( id != MSG_REQUEST_SAVE );
// message struct : frame when the game should save
#ifdef DEBUG
long_log->printf("Request save on %d\n", *(DWORD*)data_buf);
#endif
sys.mp_request_save( *(DWORD*)data_buf);
}
//-------- End of function RemoteMsg::request_save_game ---------//
//-------- Begin of function RemoteMsg::unit_stop ---------//
//
// Order the selected units to stop.
//
// structure of data_buf:
//
// - no. of selected unit.
// - selected unit recno array
//
void RemoteMsg::unit_stop()
{
err_when( id != MSG_UNIT_STOP);
short* shortPtr = (short*) data_buf;
validate_selected_unit_array(shortPtr+1, shortPtr[0]);
if(shortPtr[0] > 0)
{
#ifdef DEBUG
long_log->printf("stop units : ");
for(int i = 0; i < shortPtr[0]; ++i)
{
long_log->printf("%d,", shortPtr[1+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
#endif
unit_array.stop( shortPtr+1, shortPtr[0], COMMAND_REMOTE ); // 1-remote action
}
}
//--------- End of function RemoteMsg::unit_stop ---------//
//-------- Begin of function RemoteMsg::unit_move ---------//
//
// Order the selected units to move to the specified location.
//
// structure of data_buf:
//
// - destXLoc
// - destYLoc
// - no. of selected unit.
// - selected unit recno array
//
void RemoteMsg::unit_move()
{
err_when( id != MSG_UNIT_MOVE);
short* shortPtr = (short*) data_buf;
validate_selected_unit_array(shortPtr+4, shortPtr[2]);
if( shortPtr[2] > 0)
{
#ifdef DEBUG
long_log->printf("move to (%d,%d), units : ", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[2]; ++i)
{
long_log->printf("%d,", shortPtr[4+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.move_to( shortPtr[0], shortPtr[1], shortPtr[3], shortPtr+4, shortPtr[2], COMMAND_REMOTE ); // 1-remote action
}
}
//--------- End of function RemoteMsg::unit_move ---------//
//--------- Begin of function RemoteMsg::unit_set_force_move ---------//
void RemoteMsg::unit_set_force_move()
{
err_when(id != MSG_UNIT_SET_FORCE_MOVE);
// packet structure : ...
short* shortPtr = (short*) data_buf;
validate_selected_unit_array(shortPtr+1, shortPtr[0]);
if( shortPtr[0] > 0)
{
int i;
#ifdef DEBUG
long_log->printf("set force move to , units : ");
for(i = 0; i < shortPtr[0]; ++i)
{
long_log->printf("%d,", shortPtr[1+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
for( i = 0; i < shortPtr[0]; ++i )
{
unit_array[shortPtr[1+i]]->force_move_flag = 1;
}
}
}
//--------- End of function RemoteMsg::unit_set_force_move ---------//
//-------- Begin of function RemoteMsg::unit_attack ---------//
//
// Order the selected units to attack at the specified location.
//
// structure of data_buf:
//
// - targetXLoc
// - targetYLoc
// - unitRecno
// - no. of selected unit.
// - divided;
// - selected unit recno array
//
void RemoteMsg::unit_attack()
{
err_when( id != MSG_UNIT_ATTACK);
short* shortPtr = (short*) data_buf;
// ###### patch begin Gilbert 5/8 ###########//
validate_selected_unit_array(shortPtr+5, shortPtr[3]);
if( shortPtr[3] > 0)
{
#ifdef DEBUG
long_log->printf("attack (%d,%d), units : ", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[3]; ++i)
{
long_log->printf("%d,", shortPtr[5+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
int passCount = unit_array.divide_attack_by_nation(remote.nation_processing, shortPtr+5, shortPtr[3]);
if( passCount > 0 )
unit_array.attack( shortPtr[0], shortPtr[1], shortPtr[4], shortPtr+5, passCount, COMMAND_REMOTE, shortPtr[2] ); // 1-remote action
}
// ###### patch end Gilbert 5/8 ###########//
}
//--------- End of function RemoteMsg::unit_attack ---------//
//-------- Begin of function RemoteMsg::unit_assign ---------//
//
// Order the selected units to move to the specified location.
//
// structure of data_buf:
//
// - destXLoc
// - destYLoc
// - no. of selected unit.
// - selected unit recno array
//
void RemoteMsg::unit_assign()
{
err_when( id != MSG_UNIT_ASSIGN);
short* shortPtr = (short*) data_buf;
validate_selected_unit_array(shortPtr+4, shortPtr[2]);
if( shortPtr[2] > 0)
{
#ifdef DEBUG
long_log->printf("assign to (%d,%d), units : ", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[2]; ++i)
{
long_log->printf("%d,", shortPtr[4+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.assign( shortPtr[0], shortPtr[1], shortPtr[3], COMMAND_REMOTE, shortPtr+4, shortPtr[2]);
}
}
//--------- End of function RemoteMsg::unit_assign ---------//
//-------- Begin of function RemoteMsg::unit_change_nation ---------//
//
// Order the selected units to move to the specified location.
//
// structure of data_buf:
//
// - newNationRecno
// - no. of selected unit.
// - selected unit recno array
//
void RemoteMsg::unit_change_nation()
{
/*
short* shortPtr = (short*) data_buf;
short* selectedUnitArray = shortPtr+2;
int selectedCount = shortPtr[1];
validate_selected_unit_array(selectedUnitArray, selectedCount);
unit_array.change_nation( shortPtr[0], selectedUnitArray, selectedCount, COMMAND_REMOTE ); // 1-remote action
*/
}
//--------- End of function RemoteMsg::unit_change_nation ---------//
//------ Begin of static function validate_selected_unit_array ------//
//
// Validate all units in selectedUnitArray, remove deleted units from
// selectedUnitArray.
//
static void validate_selected_unit_array(short* selectedUnitArray, short& selectedUnitCount)
{
for( int i=0 ; iis_visible() || !unitPtr->is_nation(remote.nation_processing) )
{
memmove( selectedUnitArray+i, selectedUnitArray+i+1, sizeof(short) * (selectedUnitCount-i-1) );
selectedUnitCount--;
i--; // stay with the current recno as the records have been moved. The recno in the current position is actually the next record.
}
}
}
//------- End of static function validate_selected_unit_array -------//
//------ Begin of static function validate_firm ------//
//
// return the firmRecno if the firm is controllable by the remote player
//
// bit 0 - skip firm's nation checking
//
static short validate_firm(short firmRecno, unsigned flags)
{
err_when( !(flags & 1) && remote.nation_processing == 0);
Firm* firmPtr;
if( firmRecno && !firm_array.is_deleted(firmRecno)
&& (firmPtr = firm_array[firmRecno])
&& ((flags & 1) || firmPtr->nation_recno == remote.nation_processing) )
return firmRecno;
else
return 0;
}
//------ End of static function validate_firm ------//
//------ Begin of static function validate_town ------//
//
// return the townRecno if the town is controllable by the remote player
//
// bit 0 - skip town's nation checking
//
static short validate_town(short townRecno, unsigned flags)
{
Town* townPtr;
err_when( !(flags & 1) && remote.nation_processing == 0);
if( townRecno && !town_array.is_deleted(townRecno)
&& (townPtr = town_array[townRecno])
&& ((flags & 1) || townPtr->nation_recno == remote.nation_processing) )
return townRecno;
else
return 0;
}
//------ End of static function validate_firm ------//
// ------- Begin of function RemoteMsg::unit_build ---------//
void RemoteMsg::unit_build_firm()
{
err_when( id != MSG_UNIT_BUILD_FIRM);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 )
{
#ifdef DEBUG
long_log->printf("unit %d build firm %d at (%d,%d)\n", shortPtr[0], shortPtr[3], shortPtr[1], shortPtr[2]);
#endif
unit_array[*shortPtr]->build_firm( shortPtr[1], shortPtr[2],
shortPtr[3], COMMAND_REMOTE );
}
}
// ------- End of function RemoteMsg::unit_build_firm ---------//
// ------- Begin of function RemoteMsg::unit_burn ---------//
void RemoteMsg::unit_burn()
{
err_when( id != MSG_UNIT_BURN);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 )
{
#ifdef DEBUG
long_log->printf("unit %d burn at (%d,%d)\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
unit_array[*shortPtr]->burn(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::unit_burn ---------//
// ------- Begin of function RemoteMsg::units_settle ---------//
void RemoteMsg::units_settle()
{
err_when( id != MSG_UNITS_SETTLE);
// packet structure :
short *shortPtr = (short *)data_buf;
validate_selected_unit_array(shortPtr+4, shortPtr[2]);
if( shortPtr[2] > 0)
{
#ifdef DEBUG
long_log->printf("settle at (%d,%d), units : ", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[2]; ++i)
{
long_log->printf("%d,", shortPtr[4+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.settle(shortPtr[0], shortPtr[1], shortPtr[3], COMMAND_REMOTE, shortPtr+4, shortPtr[2]);
}
}
// ------- End of function RemoteMsg::units_settle ---------//
// ------- Begin of function RemoteMsg::unit_set_guard ---------//
//
// **BUGHERE, this function is no longer needed.
//
void RemoteMsg::unit_set_guard()
{
/*
err_when( id != MSG_UNIT_SET_GUARD);
// packet structure :
short *shortPtr = (short *)data_buf;
unit_array[*shortPtr]->guard_mode = (char) shortPtr[1];
*/
}
// ------- End of function RemoteMsg::unit_set_guard ---------//
// ------- Begin of function RemoteMsg::unit_set_rank ---------//
void RemoteMsg::unit_set_rank()
{
err_when( id != MSG_UNIT_SET_RANK);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
// ignore parameter
// unit_array[*shortPtr]->set_rank(shortPtr[1]);
if( unitCount > 0)
{
#ifdef DEBUG
long_log->printf("unit %d promote/demote to %d\n", shortPtr[0], shortPtr[1]);
#endif
switch(unit_array[*shortPtr]->rank_id)
{
case RANK_SOLDIER:
unit_array[*shortPtr]->set_rank(RANK_GENERAL);
break;
case RANK_GENERAL:
unit_array[*shortPtr]->set_rank(RANK_SOLDIER);
break;
}
}
}
// ------- End of function RemoteMsg::unit_set_rank ---------//
// ------- Begin of function RemoteMsg::unit_dismount ---------//
void RemoteMsg::unit_dismount()
{
err_when( id != MSG_UNIT_DISMOUNT);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 )
{
#ifdef DEBUG
long_log->printf("unit %d dismount\n", shortPtr[0]);
#endif
UnitVehicle *uv = (UnitVehicle *) unit_array[*shortPtr];
uv->dismount();
}
}
// ------- End of function RemoteMsg::unit_dismount ---------//
// ------- Begin of function RemoteMsg::unit_reward ---------//
void RemoteMsg::unit_reward()
{
//###### begin trevor 9/6 #######//
err_when( id != MSG_UNIT_REWARD);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 )
{
#ifdef DEBUG
long_log->printf("nation %d rewards unit %d\n", shortPtr[1], shortPtr[0]);
#endif
unit_array[*shortPtr]->reward(shortPtr[1]);
}
//###### end trevor 9/6 #######//
}
// ------- End of function RemoteMsg::unit_reward ---------//
// ------- Begin of function RemoteMsg::units_transform ------//
void RemoteMsg::units_transform()
{
err_when( id != MSG_UNITS_TRANSFORM );
// packet structure ...
short *shortPtr = (short *)data_buf;
validate_selected_unit_array(shortPtr+2, shortPtr[1]);
if( unit_array.is_deleted(*shortPtr) )
{
// if is dead, use the first unit in
// the unit group
if( shortPtr[1] >= 1)
{
*shortPtr = shortPtr[2];
unit_array[*shortPtr]->group_transform(COMMAND_REMOTE,
shortPtr +2, shortPtr[1]);
}
}
else
{
unit_array[*shortPtr]->group_transform(COMMAND_REMOTE,
shortPtr +2, shortPtr[1]);
}
}
// ------- End of function RemoteMsg::units_transform ------//
// ------- Begin of function RemoteMsg::unit_resign ---------//
void RemoteMsg::unit_resign()
{
err_when( id != MSG_UNIT_RESIGN);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 && unit_array[*shortPtr]->is_nation(shortPtr[1])
&& unit_array[*shortPtr]->can_resign() )
{
#ifdef DEBUG
long_log->printf("nation %d resigns unit %d\n", shortPtr[1], shortPtr[0]);
#endif
unit_array[*shortPtr]->resign(COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::unit_resign ---------//
// ------- Begin of function RemoteMsg::units_assign_to_ship ---------//
void RemoteMsg::units_assign_to_ship()
{
err_when( id != MSG_UNITS_ASSIGN_TO_SHIP);
// ##### patch begin Gilbert 5/8 ######//
// packet structure :
short *shortPtr = (short *)data_buf;
validate_selected_unit_array(shortPtr+5, shortPtr[3]);
if( shortPtr[3] > 0)
{
#ifdef DEBUG
long_log->printf("assign to ship at (%d,%d), units : ", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[3]; ++i)
{
long_log->printf("%d,", shortPtr[5+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.assign_to_ship(shortPtr[0], shortPtr[1], shortPtr[4], shortPtr+5, shortPtr[3], COMMAND_REMOTE, shortPtr[2]);
}
// ##### patch end Gilbert 5/8 ######//
}
// ------- End of function RemoteMsg::units_assign_to_ship ---------//
// ------- Begin of function RemoteMsg::units_ship_to_beach ---------//
void RemoteMsg::units_ship_to_beach()
{
err_when( id != MSG_UNITS_SHIP_TO_BEACH);
// packet structure :
short *shortPtr = (short *)data_buf;
validate_selected_unit_array(shortPtr+4, shortPtr[2]);
if( shortPtr[2] > 0)
{
#ifdef DEBUG
long_log->printf("move ships to beach at (%d,%d), units : ", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[2]; ++i)
{
long_log->printf("%d,", shortPtr[4+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.ship_to_beach(shortPtr[0], shortPtr[1], shortPtr[3], shortPtr+4, shortPtr[2], COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::units_assign_to_ship ---------//
// ------- Begin of function RemoteMsg::unit_succeed_king ------//
void RemoteMsg::unit_succeed_king()
{
err_when( id != MSG_UNIT_SUCCEED_KING);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 && !nation_array.is_deleted(shortPtr[1]) &&
unit_array[*shortPtr]->nation_recno == shortPtr[1] )
{
#ifdef DEBUG
long_log->printf("unit %d succeed nation %d\n", shortPtr[0], shortPtr[1]);
#endif
nation_array[shortPtr[1]]->succeed_king(*shortPtr);
if(unit_array.selected_recno == *shortPtr)
info.disp();
}
}
// ------- End of function RemoteMsg::unit_succeed_king ------//
// ------- Begin of function RemoteMsg::units_return_camp ------//
void RemoteMsg::units_return_camp()
{
err_when( id != MSG_UNITS_RETURN_CAMP );
// packet structure :
short *shortPtr = (short *)data_buf;
validate_selected_unit_array(shortPtr+1, *shortPtr);
if( *shortPtr > 0)
{
#ifdef DEBUG
long_log->printf("return to camp, units : ");
for(int i = 0; i < *shortPtr; ++i)
{
long_log->printf("%d,", shortPtr[1+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.return_camp(COMMAND_REMOTE, shortPtr+1, *shortPtr);
}
}
// ------- Begin of function RemoteMsg::caravan_change_goods ------//
void RemoteMsg::caravan_change_goods()
{
err_when( id != MSG_U_CARA_CHANGE_GOODS );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitCaravan *caravanPtr;
if( unitPtr->unit_id != UNIT_CARAVAN)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("caravan %d change goods row %d, %d\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
caravanPtr = (UnitCaravan *)unitPtr;
// caravanPtr->stop_array[shortPtr[1]].pick_up_type = (char) shortPtr[2];
caravanPtr->set_stop_pick_up(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
//if( unit_array.selected_recno == *shortPtr )
// info.disp();
}
}
}
// ------- End of function RemoteMsg::caravan_change_goods ------//
// ------- Begin of function RemoteMsg::caravan_set_stop ------//
void RemoteMsg::caravan_set_stop()
{
err_when( id != MSG_U_CARA_SET_STOP );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitCaravan *caravanPtr;
if( unitPtr->unit_id != UNIT_CARAVAN)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("caravan %d set stop %d at (%d,%d)\n", shortPtr[0], shortPtr[1], shortPtr[2], shortPtr[3]);
#endif
caravanPtr = (UnitCaravan *)unitPtr;
caravanPtr->set_stop(shortPtr[1], shortPtr[2], shortPtr[3], COMMAND_REMOTE);
// if( unit_array.selected_recno == *shortPtr )
// info.disp();
}
}
}
// ------- End of function RemoteMsg::caravan_set_stop ------//
// ------- Begin of function RemoteMsg::caravan_del_stop ------//
void RemoteMsg::caravan_del_stop()
{
err_when( id != MSG_U_CARA_DEL_STOP );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitCaravan *caravanPtr;
if( unitPtr->unit_id != UNIT_CARAVAN)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("caravan %d delete stop %d, %d\n", shortPtr[0], shortPtr[1]);
#endif
caravanPtr = (UnitCaravan *)unitPtr;
caravanPtr->del_stop(shortPtr[1], COMMAND_REMOTE);
//if( unit_array.selected_recno == *shortPtr )
// info.disp();
}
}
}
// ------- End of function RemoteMsg::caravan_del_stop ------//
// ------- Begin of function RemoteMsg::ship_unload_unit ---------//
void RemoteMsg::ship_unload_unit()
{
err_when( id != MSG_U_SHIP_UNLOAD_UNIT );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
if( unitPtr->sprite_info->sprite_type == 'U'
&& unitPtr->sprite_info->sprite_sub_type == 'M')
{
UnitMarine *shipPtr = (UnitMarine *)unitPtr;
if( shortPtr[1] <= shipPtr->unit_count )
{
// check if the unit is a ship
#ifdef DEBUG
long_log->printf("ship %d unload unit %d\n", shortPtr[0], shortPtr[1]);
#endif
shipPtr->unload_unit(shortPtr[1], COMMAND_REMOTE);
if( unit_array.selected_recno == *shortPtr )
info.disp();
}
}
else
{
err_here();
}
}
}
// ------- End of function RemoteMsg::ship_unload_unit ---------//
// ----- Begin of function RemoteMsg::ship_unload_all_units ----- //
void RemoteMsg::ship_unload_all_units()
{
err_when( id != MSG_U_SHIP_UNLOAD_ALL_UNITS );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
if( unitPtr->sprite_info->sprite_type == 'U'
&& unitPtr->sprite_info->sprite_sub_type == 'M')
{
// check if the unit is a ship
#ifdef DEBUG
long_log->printf("ship %d unload all units\n", shortPtr[0]);
#endif
UnitMarine *shipPtr = (UnitMarine *)unitPtr;
shipPtr->unload_all_units(COMMAND_REMOTE);
if( unit_array.selected_recno == *shortPtr )
info.disp();
}
else
{
err_here();
}
}
}
// ----- End of function RemoteMsg::ship_unload_all_units ----- //
// ------- Begin of function RemoteMsg::ship_change_goods ------//
void RemoteMsg::ship_change_goods()
{
err_when( id != MSG_U_SHIP_CHANGE_GOODS );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitMarine *shipPtr;
if( unitPtr->sprite_info->sprite_sub_type != 'M')
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("ship %d change goods, row %d, %d\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
shipPtr = (UnitMarine *)unitPtr;
// shipPtr->stop_array[shortPtr[1]].pick_up_type = (char) shortPtr[2];
shipPtr->set_stop_pick_up(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
// if( unit_array.selected_recno == *shortPtr )
// info.disp();
}
}
}
// ------- End of function RemoteMsg::ship_change_goods ------//
// ------- Begin of function RemoteMsg::ship_set_stop ------//
void RemoteMsg::ship_set_stop()
{
err_when( id != MSG_U_SHIP_SET_STOP );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitMarine *shipPtr;
if( unitPtr->sprite_info->sprite_sub_type != 'M')
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("ship %d set stop %d at (%d,%d)\n", shortPtr[0], shortPtr[1], shortPtr[2], shortPtr[3]);
#endif
shipPtr = (UnitMarine *)unitPtr;
shipPtr->set_stop(shortPtr[1], shortPtr[2], shortPtr[3], COMMAND_REMOTE);
}
}
}
// ------- End of function RemoteMsg::ship_set_stop ------//
// ------- Begin of function RemoteMsg::ship_del_stop ------//
void RemoteMsg::ship_del_stop()
{
err_when( id != MSG_U_SHIP_DEL_STOP );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitMarine *shipPtr;
if( unitPtr->sprite_info->sprite_sub_type != 'M')
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("ship %d delete stop %d\n", shortPtr[0], shortPtr[1]);
#endif
shipPtr = (UnitMarine *)unitPtr;
shipPtr->del_stop(shortPtr[1], COMMAND_REMOTE);
}
}
}
// ------- End of function RemoteMsg::ship_del_stop ------//
// ------- Begin of function RemoteMsg::ship_change_mode ------//
void RemoteMsg::ship_change_mode()
{
err_when( id != MSG_U_SHIP_CHANGE_MODE );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
UnitMarine *shipPtr;
if( unitPtr->sprite_info->sprite_sub_type != 'M')
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("ship %d changes mode %d\n", shortPtr[0], shortPtr[1]);
#endif
shipPtr = (UnitMarine *)unitPtr;
shipPtr->auto_mode = (char) shortPtr[1];
if(*shortPtr==unit_array.selected_recno)
info.disp();
}
}
}
// ------- End of function RemoteMsg::ship_change_mode ------//
// ------- Begin of function RemoteMsg::change_spy_nation ------//
void RemoteMsg::change_spy_nation()
{
err_when( id != MSG_UNIT_SPY_NATION );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
#ifdef DEBUG
long_log->printf("unit %d changes nation %d\n", shortPtr[0], shortPtr[1]);
#endif
unit_array[*shortPtr]->spy_change_nation(shortPtr[1], COMMAND_REMOTE);
if( unit_array.selected_recno == *shortPtr ||
unit_array[*shortPtr]->selected_flag)
info.disp();
}
}
// ------- End of function RemoteMsg::change_spy_nation ------//
// ------- Begin of function RemoteMsg::notify_cloaked_nation ------//
void RemoteMsg::notify_cloaked_nation()
{
err_when( id != MSG_UNIT_SPY_NOTIFY_CLOAKED_NATION );
// packet structure
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0)
{
if( !unit_array[*shortPtr]->spy_recno )
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("unit %d notify cloaked nation %d\n", shortPtr[0], shortPtr[1]);
#endif
spy_array[unit_array[*shortPtr]->spy_recno]->notify_cloaked_nation_flag
= (char) shortPtr[1];
}
if( unit_array.selected_recno == *shortPtr ||
unit_array[*shortPtr]->selected_flag)
info.disp();
}
}
// ------- End of function RemoteMsg::notify_cloaked_nation ------//
//------ Begin of function RemoteMsg::unit_change_aggressive_mode -----//
//
void RemoteMsg::unit_change_aggressive_mode()
{
err_when( id != MSG_UNIT_CHANGE_AGGRESSIVE_MODE);
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount > 0 )
{
#ifdef DEBUG
long_log->printf("unit %d %s aggressive mode\n", shortPtr[0], shortPtr[1] ? "set" : "clear");
#endif
unit_array[*shortPtr]->aggressive_mode = (char) shortPtr[1];
}
}
//------- End of function RemoteMsg::unit_change_aggressive_mode ------//
//------ Begin of function RemoteMsg::spy_change_notify_flag -----//
//
void RemoteMsg::spy_change_notify_flag()
{
err_when( id != MSG_SPY_CHANGE_NOTIFY_FLAG) ;
// packet structure :
short *shortPtr = (short *)data_buf;
spy_array[*shortPtr]->notify_cloaked_nation_flag = (char) shortPtr[1];
}
//------- End of function RemoteMsg::spy_change_notify_flag ------//
//########## begin trevor 15/10 #############//
//------ Begin of function RemoteMsg::spy_assassinate -----//
//
void RemoteMsg::spy_assassinate()
{
err_when( id != MSG_SPY_ASSASSINATE );
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d assassinate unit %d", shortPtr[0], shortPtr[1]);
#endif
spy_array[*shortPtr]->assassinate( shortPtr[1], COMMAND_REMOTE );
}
}
//------- End of function RemoteMsg::spy_assassinate ------//
//########## end trevor 15/10 #############//
// ------- Begin of function RemoteMsg::firm_sell ---------//
void RemoteMsg::firm_sell()
{
err_when( id != MSG_FIRM_SELL);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("sell firm %d\n", shortPtr[0]);
#endif
firm_array[*shortPtr]->sell_firm(COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::firm_sell ---------//
// ------- Begin of function RemoteMsg::firm_cancel ---------//
void RemoteMsg::firm_cancel()
{
err_when( id != MSG_FIRM_CANCEL);
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("firm %d cancel construction\n", shortPtr[0]);
#endif
firm_array[*shortPtr]->cancel_construction(COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::firm_cancel ---------//
// ------- Begin of function RemoteMsg::firm_destruct ---------//
void RemoteMsg::firm_destruct()
{
err_when( id != MSG_FIRM_DESTRUCT);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("destruct firm %d\n", shortPtr[0]);
#endif
firm_array[*shortPtr]->destruct_firm(COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::firm_destruct ---------//
// ------- Begin of function RemoteMsg::firm_set_repair ---------//
void RemoteMsg::firm_set_repair()
{
//##### begin trevor 19/6 ######//
/*
err_when( id != MSG_FIRM_SET_REPAIR);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
firm_array[*shortPtr]->is_repairing = (char)shortPtr[1];
*/
//##### end trevor 19/6 ######//
}
// ------- End of function RemoteMsg::firm_set_repair ---------//
// ------- Begin of function RemoteMsg::firm_train_level ---------//
void RemoteMsg::firm_train_level()
{
/* //**BUGHERE, no more training in game
err_when( id != MSG_FIRM_TRAIN_LEVEL);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !firm_array.is_deleted(*shortPtr) )
firm_array[*shortPtr]->train_level = (char)shortPtr[1];
*/
}
// ------- End of function RemoteMsg::firm_train_level ---------//
// ------- Begin of function RemoteMsg::mobilize_worker ---------//
void RemoteMsg::mobilize_worker()
{
err_when( id != MSG_FIRM_MOBL_WORKER);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) && shortPtr[1] <= firm_array[*shortPtr]->worker_count)
{
#ifdef DEBUG
long_log->printf("firm %d mobilize worker %d\n", shortPtr[0], shortPtr[1]);
#endif
firm_array[*shortPtr]->mobilize_worker(shortPtr[1],COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::mobilize_worker ---------//
// ------- Begin of function RemoteMsg::mobilize_overseer ---------//
void RemoteMsg::mobilize_overseer()
{
err_when( id != MSG_FIRM_MOBL_OVERSEER);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) && firm_array[*shortPtr]->overseer_recno )
{
#ifdef DEBUG
long_log->printf("firm %d mobilize overseer\n", shortPtr[0]);
#endif
firm_array[*shortPtr]->assign_overseer(0);
}
}
// ------- End of function RemoteMsg::mobilize_overseer ---------//
// ------- Begin of function RemoteMsg::mobilize_builder ---------//
void RemoteMsg::mobilize_builder()
{
err_when( id != MSG_FIRM_MOBL_BUILDER);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) && firm_array[*shortPtr]->builder_recno )
{
#ifdef DEBUG
long_log->printf("firm %d mobilize builder\n", shortPtr[0]);
#endif
firm_array[*shortPtr]->set_builder(0);
}
}
// ------- End of function RemoteMsg::mobilize_builder ---------//
// ------ Begin of function RemoteMsg::firm_toggle_link_firm ----//
void RemoteMsg::firm_toggle_link_firm()
{
err_when( id != MSG_FIRM_TOGGLE_LINK_FIRM);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
// ###### begin Gilbert 10/11 #######//
Firm *firmPtr = firm_array[*shortPtr];
short linkedFirmRecno = 0;
if( shortPtr[1] <= firmPtr->linked_firm_count
&& (linkedFirmRecno = firmPtr->linked_firm_array[shortPtr[1]-1])
&& validate_firm(linkedFirmRecno, 1) )
{
#ifdef DEBUG
long_log->printf("firm %d %s firm link %d\n", shortPtr[0],
shortPtr[2] ? "set":"clear", shortPtr[1]);
#endif
firm_array[*shortPtr]->toggle_firm_link(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
}
// ###### end Gilbert 10/11 #######//
}
}
// ------ End of function RemoteMsg::firm_toggle_link_firm ----//
// ------ Begin of function RemoteMsg::firm_toggle_link_town ----//
void RemoteMsg::firm_toggle_link_town()
{
err_when( id != MSG_FIRM_TOGGLE_LINK_TOWN);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
// ###### begin Gilbert 10/11 ########//
Firm *firmPtr = firm_array[*shortPtr];
short linkedTownRecno = 0;
if( shortPtr[1] <= firmPtr->linked_town_count
&& (linkedTownRecno = firmPtr->linked_town_array[shortPtr[1]-1])
&& validate_town(linkedTownRecno, 1) )
{
#ifdef DEBUG
long_log->printf("firm %d %s town link %d\n", shortPtr[0],
shortPtr[2] ? "set":"clear", shortPtr[1]);
#endif
firmPtr->toggle_town_link(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
// update town loyalty if the firm is FIRM_CAMP
if( firmPtr->firm_id == FIRM_CAMP )
{
Town *townPtr = town_array[linkedTownRecno];
if( townPtr->nation_recno )
townPtr->update_target_loyalty();
else
townPtr->update_target_resistance();
townPtr->update_camp_link();
}
}
// ###### end Gilbert 10/11 ########//
}
}
// ------ End of function RemoteMsg::firm_toggle_link_town ----//
// ------ Begin of function RemoteMsg::firm_pull_town_people ----//
void RemoteMsg::firm_pull_town_people()
{
err_when( id != MSG_FIRM_PULL_TOWN_PEOPLE);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) && validate_town(shortPtr[1]) )
{
#ifdef DEBUG
long_log->printf("firm %d %s pull race %d from town %d\n", shortPtr[0],
shortPtr[3] ? "forcely" : "", shortPtr[2], shortPtr[1]);
#endif
firm_array[*shortPtr]->pull_town_people(shortPtr[1], COMMAND_REMOTE, shortPtr[2], shortPtr[3]);
}
}
// ------ End of function RemoteMsg::firm_pull_town_people ----//
// ------ Begin of function RemoteMsg::firm_set_worker_home ----//
void RemoteMsg::firm_set_worker_home()
{
err_when( id != MSG_FIRM_SET_WORKER_HOME);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) && validate_town(shortPtr[1]) )
{
#ifdef DEBUG
long_log->printf("firm %d workder %d migrate to town %d\n", shortPtr[0], shortPtr[2], shortPtr[1]);
#endif
firm_array[*shortPtr]->set_worker_home_town(shortPtr[1], COMMAND_REMOTE, shortPtr[2]);
}
}
// ------ End of function RemoteMsg::firm_set_worker_home ----//
// ------ Begin of function RemoteMsg::firm_bribe ----//
void RemoteMsg::firm_bribe()
{
err_when( id != MSG_FIRM_BRIBE);
// packet structure
short *shortPtr = (short *)data_buf;
// ###### begin Gilbert 10/11 #######//
Firm *firmPtr;
if( validate_firm(*shortPtr, 1) && !spy_array.is_deleted(shortPtr[1])
&& (firmPtr = firm_array[*shortPtr])
&& (shortPtr[2] == 0 && firmPtr->overseer_recno ||
shortPtr[2] >= 1 && shortPtr[2] <= firm_array[*shortPtr]->worker_count) )
// ###### end Gilbert 10/11 #######//
{
#ifdef DEBUG
long_log->printf("firm %d, spy %d briber worker %d\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
firm_array[*shortPtr]->spy_bribe(shortPtr[3], shortPtr[1], shortPtr[2]);
}
}
// ------ End of function RemoteMsg::firm_bribe ----//
// ------ Begin of function RemoteMsg::firm_capture ----//
void RemoteMsg::firm_capture()
{
err_when( id != MSG_FIRM_CAPTURE);
// packet structure
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr, 1) )
{
#ifdef DEBUG
long_log->printf("firm %d, capture by nation %d\n", shortPtr[0], shortPtr[1]);
#endif
firm_array[*shortPtr]->capture_firm(shortPtr[1]);
}
}
// ------ End of function RemoteMsg::firm_capture ----//
// ------- Begin of function RemoteMsg::camp_patrol ---------//
void RemoteMsg::camp_patrol()
{
err_when( id != MSG_F_CAMP_PATROL);
if( validate_firm(*(short *)data_buf) )
{
FirmCamp *camp = firm_array[*(short *)data_buf]->cast_to_FirmCamp();
if(camp)
{
if(camp->overseer_recno || camp->worker_count > 0)
{
#ifdef DEBUG
long_log->printf("camp %d patrols\n", *(short *)data_buf);
#endif
camp->patrol();
}
}
else
{
err_here();
}
}
}
// ------- End of function RemoteMsg::camp_patrol ---------//
// ------- Begin of function RemoteMsg::toggle_camp_patrol ---------//
void RemoteMsg::toggle_camp_patrol()
{
err_when( id != MSG_F_CAMP_TOGGLE_PATROL);
// packet structure
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmCamp *camp = firm_array[*shortPtr]->cast_to_FirmCamp();
if(camp)
{
#ifdef DEBUG
long_log->printf("camp %d %s patrol flag\n", shortPtr[0],
shortPtr[1] ? "set":"clear");
#endif
camp->defense_flag = char(shortPtr[1]);
if( firm_array.selected_recno == *shortPtr)
info.disp();
}
else
{
err_here();
}
}
}
// ------- End of function RemoteMsg::toggle_camp_patrol ---------//
// ------- Begin of function RemoteMsg::firm_reward ---------//
void RemoteMsg::firm_reward()
{
err_when( id != MSG_FIRM_REWARD);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
Firm *firmPtr = firm_array[*shortPtr];
// ##### begin Gilbert 10/11 ########//
if( shortPtr[1] == 0 && firmPtr->overseer_recno ||
shortPtr[1] >= 1 && shortPtr[1] <= firmPtr->worker_count )
{
#ifdef DEBUG
long_log->printf("firm %d reward worker %d\n", shortPtr[0], shortPtr[1]);
#endif
firmPtr->reward(shortPtr[1], COMMAND_REMOTE);
}
// ##### end Gilbert 10/11 ########//
}
}
// ------- End of function RemoteMsg::firm_reward ---------//
// ------- Begin of function RemoteMsg::inn_hire ---------//
void RemoteMsg::inn_hire()
{
err_when( id != MSG_F_INN_HIRE);
// packet structure : ,
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmInn *inn = firm_array[*shortPtr]->cast_to_FirmInn();
if(inn)
{
#ifdef DEBUG
long_log->printf("inn %d hire %d, by nation %d\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
inn->hire(shortPtr[1]);
if( shortPtr[2] == nation_array.player_recno)
{
inn->put_info(INFO_REPAINT);
}
}
else
{
err_here();
}
}
}
// ------- End of function RemoteMsg::inn_hire ---------//
// ------- Begin of function RemoteMsg::market_scrap ---------//
void RemoteMsg::market_scrap()
{
err_when( id != MSG_F_MARKET_SCRAP );
// packet structure : |
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmMarket *firmMarket = firm_array[*shortPtr]->cast_to_FirmMarket();
if(!firmMarket)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("market %d scrap good row %d\n", shortPtr[0], shortPtr[1]);
#endif
MarketGoods* marketGoods = firmMarket->market_goods_array + shortPtr[1];
err_when(marketGoods->raw_id && marketGoods->product_raw_id);
if(marketGoods->raw_id)
{
firmMarket->market_raw_array[marketGoods->raw_id-1] = NULL;
marketGoods->raw_id = 0;
}
else if(marketGoods->product_raw_id)
{
firmMarket->market_product_array[marketGoods->product_raw_id-1] = NULL;
marketGoods->product_raw_id = 0;
}
marketGoods->stock_qty = (float) 0;
if( firm_array.selected_recno == *shortPtr )
info.disp();
}
}
}
// ------- End of function RemoteMsg::market_scrap ---------//
// ------- Begin of function RemoteMsg::market_hire_caravan ---------//
void RemoteMsg::market_hire_caravan()
{
err_when( id != MSG_F_MARKET_HIRE_CARA );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmMarket *market = firm_array[*shortPtr]->cast_to_FirmMarket();
if(!market)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("market %d hire caravan\n", shortPtr[0]);
#endif
market->hire_caravan(COMMAND_REMOTE);
}
}
}
// ------- End of function RemoteMsg::market_hire_caravan ---------//
// ------- Begin of function RemoteMsg::research_start ---------//
void RemoteMsg::research_start()
{
err_when( id != MSG_F_RESEARCH_START );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmResearch *research = firm_array[*shortPtr]->cast_to_FirmResearch();
if(!research)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("tower of science %d start research tech %d\n", shortPtr[0], shortPtr[1]);
#endif
research->start_research(shortPtr[1], COMMAND_REMOTE);
}
}
}
// ------- End of function RemoteMsg::research_start ---------//
// ------- Begin of function RemoteMsg::build_weapon ---------//
void RemoteMsg::build_weapon()
{
err_when( id != MSG_F_WAR_BUILD_WEAPON );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmWar *warFactory = firm_array[*shortPtr]->cast_to_FirmWar();
if(!warFactory)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("war factory %d start building unit id %d\n", shortPtr[0], shortPtr[1]);
#endif
warFactory->add_queue(shortPtr[1]);
}
}
}
// ------- End of function RemoteMsg::build_weapon ---------//
// ------- Begin of function RemoteMsg::cancel_weapon ---------//
void RemoteMsg::cancel_weapon()
{
err_when( id != MSG_F_WAR_CANCEL_WEAPON );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmWar *warFactory = firm_array[*shortPtr]->cast_to_FirmWar();
if(!warFactory)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("war factory %d cancel building unit id %d\n", shortPtr[0], shortPtr[1]);
#endif
warFactory->remove_queue(shortPtr[1]);
}
}
}
// ------- End of function RemoteMsg::cancel_weapon ---------//
// ------- Begin of function RemoteMsg::skip_build_weapon ---------//
void RemoteMsg::skip_build_weapon()
{
err_when( id != MSG_F_WAR_SKIP_WEAPON );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmWar *warFactory = firm_array[*shortPtr]->cast_to_FirmWar();
if(!warFactory)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("war factory %d skip weapon building\n", shortPtr[0]);
#endif
warFactory->cancel_build_unit();
}
}
}
// ------- End of function RemoteMsg::skip_build_weapon ---------//
// ------- Begin of function RemoteMsg::build_ship ---------//
void RemoteMsg::build_ship()
{
err_when( id != MSG_F_HARBOR_BUILD_SHIP );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmHarbor *harbor = firm_array[*shortPtr]->cast_to_FirmHarbor();
if(!harbor)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("harbor %d start building unit id %d\n", shortPtr[0], shortPtr[1]);
#endif
// harbor->build_ship(shortPtr[1], COMMAND_REMOTE);
if( shortPtr[1] > 0)
harbor->add_queue(shortPtr[1]);
else if( shortPtr[1] < 0)
harbor->remove_queue(-shortPtr[1]);
else
{
err_here();
}
}
}
}
// ------- End of function RemoteMsg::build_ship ---------//
// ------- Begin of function RemoteMsg::sail_ship ---------//
void RemoteMsg::sail_ship()
{
err_when( id != MSG_F_HARBOR_SAIL_SHIP );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmHarbor *harbor = firm_array[*shortPtr]->cast_to_FirmHarbor();
if(!harbor)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("ship %d depart from harbor %d\n", shortPtr[1], shortPtr[0]);
#endif
harbor->sail_ship(shortPtr[1], COMMAND_REMOTE);
}
}
}
// ------- End of function RemoteMsg::sail_ship --------//
// ------- Begin of function RemoteMsg::skip_build_ship ---------//
void RemoteMsg::skip_build_ship()
{
err_when( id != MSG_F_HARBOR_SKIP_SHIP );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmHarbor *harbor = firm_array[*shortPtr]->cast_to_FirmHarbor();
if(!harbor)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("harbr %d skip ship building\n", shortPtr[0]);
#endif
harbor->cancel_build_unit();
}
}
}
// ------- End of function RemoteMsg::skip_build_ship ---------//
// ------- Begin of function RemoteMsg::factory_change_product ---------//
void RemoteMsg::factory_change_product()
{
#define DEFAULT_FACTORY_MAX_STOCK_QTY 500
#define DEFAULT_FACTORY_MAX_RAW_STOCK_QTY 500
err_when( id != MSG_F_FACTORY_CHG_PROD );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmFactory *factory = firm_array[*shortPtr]->cast_to_FirmFactory();
if(!factory)
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("factory %d change product to %d\n", shortPtr[0], shortPtr[1]);
#endif
factory->product_raw_id = shortPtr[1];
factory->stock_qty = (float) 0;
factory->max_stock_qty = (float) DEFAULT_FACTORY_MAX_STOCK_QTY;
factory->raw_stock_qty = (float) 0;
factory->max_raw_stock_qty = (float) DEFAULT_FACTORY_MAX_RAW_STOCK_QTY;
}
}
}
// ------- End of function RemoteMsg::factory_change_product --------//
void RemoteMsg::base_mobilize_prayer()
{
err_when( id != MSG_F_BASE_MOBL_PRAYER);
err_here();
/*
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmBase *base = firm_array[*shortPtr]->cast_to_FirmBase();
if( !base )
{
err_here();
}
else
{
#ifdef DEBUG
long_log->printf("seat of power %d mobilize prayer\n", shortPtr[0]);
#endif
base->resign_prayer();
}
}
*/
}
void RemoteMsg::invoke_god()
{
err_when( id != MSG_F_BASE_INVOKE_GOD);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_firm(*shortPtr) )
{
FirmBase *base = firm_array[*shortPtr]->cast_to_FirmBase();
if( !base )
{
err_here();
}
else
{
// ##### begin Gilbert 10/11 ########//
if( base->can_invoke() )
{
#ifdef DEBUG
long_log->printf("seat of power %d invoke god\n", shortPtr[0]);
#endif
base->invoke_god();
}
// ##### end Gilbert 10/11 ########//
}
}
}
// ------- Begin of function RemoteMsg::town_recruit ---------//
void RemoteMsg::town_recruit()
{
err_when( id != MSG_TOWN_RECRUIT);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d train skill %d of race %d\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
if( shortPtr[2] > 0 )
{
if( shortPtr[1] == -1 ) // recruit unskilled unit
town_array[*shortPtr]->recruit(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
else // add train worker skill
town_array[*shortPtr]->add_queue((char) shortPtr[1], (char) shortPtr[2]);
}
else if( shortPtr[2] == -1)
{
// remove train worker skill
town_array[*shortPtr]->remove_queue((char) shortPtr[1]);
}
else
{
err_here();
}
if( town_array.selected_recno == *shortPtr )
info.update();
}
}
// ------- End of function RemoteMsg::town_recruit ---------//
// ------- Begin of function RemoteMsg::town_skip_recruit ---------//
void RemoteMsg::town_skip_recruit()
{
err_when( id != MSG_TOWN_SKIP_RECRUIT);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d skip unit training\n", shortPtr[0]);
#endif
town_array[*shortPtr]->cancel_train_unit();
if( town_array.selected_recno == *shortPtr )
info.disp();
}
}
// ------- End of function RemoteMsg::town_skip_recruit ---------//
// ------- Begin of function RemoteMsg::town_migrate ---------//
void RemoteMsg::town_migrate()
{
err_when( id != MSG_TOWN_MIGRATE);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) && validate_town(shortPtr[1]) )
{
#ifdef DEBUG
long_log->printf("town %d race %d migrate to town %d\n", shortPtr[0], shortPtr[2], shortPtr[1]);
#endif
town_array[*shortPtr]->migrate_to(shortPtr[1], COMMAND_REMOTE, shortPtr[2]);
}
}
// ------- End of function RemoteMsg::town_migrate ---------//
// ------- Begin of function RemoteMsg::town_collect_tax ---------//
void RemoteMsg::town_collect_tax()
{
//### begin trevor 6/8 ####//
err_when( id != MSG_TOWN_COLLECT_TAX );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d collect tax\n", shortPtr[0]);
#endif
town_array[*shortPtr]->collect_tax(COMMAND_REMOTE);
}
//### end trevor 6/8 ####//
}
// ------- End of function RemoteMsg::town_collect_tax ---------//
// ------- Begin of function RemoteMsg::town_reward ---------//
void RemoteMsg::town_reward()
{
//### begin trevor 6/8 ####//
err_when( id != MSG_TOWN_REWARD );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d reward\n", shortPtr[0]);
#endif
town_array[*shortPtr]->reward(COMMAND_REMOTE);
}
//### end trevor 6/8 ####//
}
// ------- End of function RemoteMsg::town_reward ---------//
// ------ Begin of function RemoteMsg::town_toggle_link_firm ----//
void RemoteMsg::town_toggle_link_firm()
{
err_when( id != MSG_TOWN_TOGGLE_LINK_FIRM);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d %s firm link %d\n", shortPtr[0],
shortPtr[2] ? "set" : "clear", shortPtr[1]);
#endif
Town *townPtr = town_array[*shortPtr];
// ####### begin Gilbert 10/11 #######//
short linkedFirmRecno = 0;
if( shortPtr[1] <= townPtr->linked_firm_count
&& (linkedFirmRecno = townPtr->linked_firm_array[shortPtr[1]-1])
&& validate_firm(linkedFirmRecno, 1) )
{
townPtr->toggle_firm_link(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
// update loyalty if the linked firm is FIRM_BASE
if( firm_array[linkedFirmRecno]->firm_id == FIRM_CAMP )
{
if(townPtr->nation_recno)
townPtr->update_target_loyalty();
else
townPtr->update_target_resistance();
townPtr->update_camp_link();
}
}
// ####### end Gilbert 10/11 #######//
}
}
// ------ End of function RemoteMsg::town_toggle_link_firm ----//
// ------ Begin of function RemoteMsg::town_toggle_link_town ----//
void RemoteMsg::town_toggle_link_town()
{
err_when( id != MSG_TOWN_TOGGLE_LINK_TOWN);
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr) )
{
// ###### begin Gilbert 10/11 #######//
Town *townPtr = town_array[*shortPtr];
short linkedTownRecno = 0;
if( shortPtr[1] <= townPtr->linked_town_count
&& (linkedTownRecno = townPtr->linked_town_array[shortPtr[1]-1])
&& validate_town(linkedTownRecno, 1) )
{
#ifdef DEBUG
long_log->printf("town %d %s town link %d\n", shortPtr[0],
shortPtr[2] ? "set" : "clear", shortPtr[1]);
#endif
town_array[*shortPtr]->toggle_town_link(shortPtr[1], shortPtr[2], COMMAND_REMOTE);
}
// ###### end Gilbert 10/11 #######//
}
}
// ------ End of function RemoteMsg::town_toggle_link_town ----//
// ------ Begin of function RemoteMsg::town_auto_tax -------//
void RemoteMsg::town_auto_tax()
{
err_when( id != MSG_TOWN_AUTO_TAX );
// packet structure :
// or <-nation recno>
short *shortPtr = (short *)data_buf;
if( *shortPtr > 0)
{
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d auto collect tax at loyal %d\n", shortPtr[0], shortPtr[1]);
#endif
town_array[*shortPtr]->set_auto_collect_tax_loyalty(shortPtr[1]);
if( town_array.selected_recno == *shortPtr )
info.disp();
}
}
else
{
short nationRecno = -*shortPtr;
err_when( !nationRecno );
#ifdef DEBUG
long_log->printf("nation %d auto collect tax at loyal %d\n", nationRecno, shortPtr[1]);
#endif
if( !nation_array.is_deleted(nationRecno) )
{
nation_array[nationRecno]->set_auto_collect_tax_loyalty(shortPtr[1]);
for( int townRecno=town_array.size() ; townRecno>0 ; townRecno-- )
{
Town *townPtr;
if( !town_array.is_deleted(townRecno) && (townPtr = town_array[townRecno]) &&
townPtr->nation_recno == nationRecno )
{
townPtr->set_auto_collect_tax_loyalty(shortPtr[1]);
if( town_array.selected_recno == townRecno )
info.disp();
}
}
}
}
}
// ------ End of function RemoteMsg::town_auto_tax -------//
// ------ Begin of function RemoteMsg::town_auto_grant -------//
void RemoteMsg::town_auto_grant()
{
err_when( id != MSG_TOWN_AUTO_GRANT );
// packet structure :
// or <-nation recno>
short *shortPtr = (short *)data_buf;
if( *shortPtr > 0 )
{
if( validate_town(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("town %d auto grant at loyal %d\n", shortPtr[0], shortPtr[1]);
#endif
town_array[*shortPtr]->set_auto_grant_loyalty(shortPtr[1]);
if( town_array.selected_recno == *shortPtr )
info.disp();
}
}
else
{
short nationRecno = -*shortPtr;
err_when( !nationRecno );
#ifdef DEBUG
long_log->printf("nation %d auto grant at loyal %d\n", nationRecno, shortPtr[1]);
#endif
if( !nation_array.is_deleted(nationRecno) )
{
nation_array[nationRecno]->set_auto_grant_loyalty(shortPtr[1]);
for( int townRecno=town_array.size() ; townRecno>0 ; townRecno-- )
{
Town *townPtr;
if( !town_array.is_deleted(townRecno) && (townPtr = town_array[townRecno]) &&
townPtr->nation_recno == nationRecno )
{
townPtr->set_auto_grant_loyalty(shortPtr[1]);
if( town_array.selected_recno == townRecno )
info.disp();
}
}
}
}
}
// ------ End of function RemoteMsg::town_auto_grant -------//
// ------ Begin of function RemoteMsg::town_grant_independent -------//
void RemoteMsg::town_grant_independent()
{
err_when( id != MSG_TOWN_GRANT_INDEPENDENT );
// packet structure :
short *shortPtr = (short *)data_buf;
if( validate_town(*shortPtr, 1) && !nation_array.is_deleted(shortPtr[1]) )
{
town_array[*shortPtr]->grant_to_non_own_town(shortPtr[1], COMMAND_REMOTE);
}
}
// ------ Begin of function RemoteMsg::town_grant_independent -------//
// ------- Begin of function RemoteMsg::wall_build---------//
void RemoteMsg::wall_build()
{
err_when( id != MSG_WALL_BUILD);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !nation_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("nation %d build wall at (%d,%d)\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
world.build_wall_tile( shortPtr[1], shortPtr[2], shortPtr[0], COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::wall_build---------//
// ------- Begin of function RemoteMsg::wall_destruct ---------//
void RemoteMsg::wall_destruct()
{
err_when( id != MSG_WALL_DESTRUCT);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !nation_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("nation %d destruct wall at (%d,%d)\n", shortPtr[0], shortPtr[1], shortPtr[2]);
#endif
world.destruct_wall_tile( shortPtr[1], shortPtr[2], shortPtr[0], COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::wall_build---------//
// ------- Begin of function RemoteMsg::spy_cycle_action -------//
void RemoteMsg::spy_cycle_action()
{
err_when( id != MSG_SPY_CYCLE_ACTION);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d change action\n", shortPtr[0]);
#endif
spy_array[*shortPtr]->set_next_action_mode();
}
}
// ------- End of function RemoteMsg::spy_cycle_action -------//
// ------- Begin of function RemoteMsg::spy_leave_town -------//
void RemoteMsg::spy_leave_town()
{
err_when( id != MSG_SPY_LEAVE_TOWN);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d leave town\n", shortPtr[0]);
#endif
//##### trevor 10/10 #####//
if( spy_array[*shortPtr]->spy_place == SPY_TOWN )
{
spy_array[*shortPtr]->mobilize_town_spy();
spy_array[*shortPtr]->notify_cloaked_nation_flag = 0;
}
//##### trevor 10/10 #####//
}
}
// ------- End of function RemoteMsg::spy_leave_town -------//
// ------- Begin of function RemoteMsg::spy_leave_firm -------//
void RemoteMsg::spy_leave_firm()
{
err_when( id != MSG_SPY_LEAVE_FIRM);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d leave firm\n", shortPtr[0]);
#endif
//##### trevor 10/10 #####//
if( spy_array[*shortPtr]->spy_place == SPY_FIRM )
{
spy_array[*shortPtr]->mobilize_firm_spy();
spy_array[*shortPtr]->notify_cloaked_nation_flag = 0;
}
//##### trevor 10/10 #####//
}
}
// ------- End of function RemoteMsg::spy_leave_firm -------//
// ------- Begin of function RemoteMsg::spy_capture_firm -------//
void RemoteMsg::spy_capture_firm()
{
err_when( id != MSG_SPY_CAPTURE_FIRM);
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d capture firm\n", shortPtr[0]);
#endif
spy_array[*shortPtr]->capture_firm();
}
}
// ------- End of function RemoteMsg::capture_firm -------//
// ------- Begin of function RemoteMsg::spy_drop_identity ------//
void RemoteMsg::spy_drop_identity()
{
err_when( id != MSG_SPY_DROP_IDENTITY );
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d drop identity\n", shortPtr[0]);
#endif
spy_array[*shortPtr]->drop_spy_identity();
}
}
// ------- End of function RemoteMsg::spy_drop_identity ------//
// ------- Begin of function RemoteMsg::spy_reward ------//
void RemoteMsg::spy_reward()
{
err_when( id != MSG_SPY_REWARD );
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d reward\n", shortPtr[0]);
#endif
spy_array[*shortPtr]->reward(COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::spy_reward ------//
// ------- Begin of function RemoteMsg::spy_set_exposed ------//
void RemoteMsg::spy_exposed()
{
err_when( id != MSG_SPY_EXPOSED );
// packet structure :
short *shortPtr = (short *)data_buf;
if( !spy_array.is_deleted(*shortPtr) )
{
#ifdef DEBUG
long_log->printf("spy %d set exposed\n", shortPtr[0]);
#endif
spy_array[*shortPtr]->set_exposed(COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::spy_set_exposed ------//
// ------- Begin of function RemoteMsg::send_talk_msg -------//
void RemoteMsg::send_talk_msg()
{
err_when( id != MSG_SEND_TALK_MSG);
// packet structure :
#ifdef DEBUG
TalkMsg *talkMsg = (TalkMsg *)data_buf;
long_log->printf("talk message from %d to %d, id %d, para1=%d, para2=%d\n",
talkMsg->from_nation_recno, talkMsg->to_nation_recno,
talkMsg->talk_id, talkMsg->talk_para1, talkMsg->talk_para2);
#endif
talk_res.send_talk_msg( (TalkMsg *)data_buf, COMMAND_REMOTE);
}
// ------- End of function RemoteMsg::send_talk_msg -------//
// ------- Begin of function RemoteMsg::reply_talk_msg -------//
void RemoteMsg::reply_talk_msg()
{
err_when( id != MSG_REPLY_TALK_MSG);
// packet structure :
//####### begin trevor 28/8 ########//
int talkMsgRecno = *(int*)data_buf;
if( !talk_res.is_talk_msg_deleted(talkMsgRecno) )
{
#ifdef DEBUG
long_log->printf("reply talk message %d, %d\n", talkMsgRecno, data_buf[sizeof(int)]);
#endif
talk_res.reply_talk_msg( talkMsgRecno, data_buf[sizeof(int)], COMMAND_REMOTE);
}
//####### end trevor 28/8 ########//
}
// ------- End of function RemoteMsg::reply_talk_msg -------//
// ------- Begin of function RemoteMsg::nation_contact -------//
void RemoteMsg::nation_contact()
{
err_when( id != MSG_NATION_CONTACT);
// packet structure :
short *shortPtr = (short *)data_buf;
err_when( *shortPtr != remote.nation_processing );
if( !nation_array.is_deleted(*shortPtr) && !nation_array.is_deleted(shortPtr[1]) )
{
//####### begin trevor 30/8 #######//
#ifdef DEBUG
long_log->printf("nation %d discover nation %d\n", shortPtr[0], shortPtr[1]);
#endif
nation_array[shortPtr[0]]->establish_contact(shortPtr[1]);
//####### end trevor 30/8 #######//
}
}
// ------- End of function RemoteMsg::nation_contact -------//
// ------- Begin of function RemoteMsg::nation_set_should_attack -------//
void RemoteMsg::nation_set_should_attack()
{
err_when( id != MSG_NATION_SET_SHOULD_ATTACK );
// packet structure :
short *shortPtr = (short *)data_buf;
err_when( *shortPtr != remote.nation_processing );
if( !nation_array.is_deleted(*shortPtr) && !nation_array.is_deleted(shortPtr[1]) )
{
#ifdef DEBUG
long_log->printf("nation %d %s instruct attack nation %d\n", shortPtr[0],
shortPtr[2] ? "set":"clear", shortPtr[1]);
#endif
nation_array[shortPtr[0]]->set_relation_should_attack(shortPtr[1], (char)shortPtr[2], COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::nation_set_should_attack -------//
// ------- Begin of function RemoteMsg::caravan_selected -------//
void RemoteMsg::caravan_selected()
{
err_when( id != MSG_U_CARA_SELECTED );
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if( unitCount <= 0)
return;
#ifdef DEBUG
Unit *unitPtr = unit_array[*shortPtr];
err_when( unitPtr->unit_id != UNIT_CARAVAN);
#endif
//------ help to check syn. for multiplayer ------//
#ifdef DEBUG
m.random(100);
#endif
unit_array.mp_add_selected_caravan(*shortPtr);
}
// ------- End of function RemoteMsg::caravan_selected -------//
// ------- Begin of function RemoteMsg::ship_selected -------//
void RemoteMsg::ship_selected()
{
err_when( id != MSG_U_SHIP_SELECTED );
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if(unitCount <= 0)
return;
#ifdef DEBUG
Unit *unitPtr = unit_array[*shortPtr];
err_when(unit_res[unitPtr->unit_id]->unit_class != UNIT_CLASS_SHIP || unitPtr->unit_id==UNIT_TRANSPORT);
#endif
//------ help to check syn. for multiplayer ------//
#ifdef DEBUG
m.random(100);
#endif
unit_array.mp_add_selected_ship(*shortPtr);
}
// ------- End of function RemoteMsg::ship_selected -------//
//##### begin trevor 30/9 #######//
//------- Begin of function RemoteMsg::chat -------//
//
// Packet structure :
//
void RemoteMsg::chat()
{
short *shortPtr = (short *)data_buf;
int toNationRecno = shortPtr[0];
int fromNationRecno = shortPtr[1];
#ifdef DEBUG
long_log->printf("nation %d send chat message to %d\n",
shortPtr[1], shortPtr[0]);
#endif
if( toNationRecno == nation_array.player_recno ||
(toNationRecno == 0 && fromNationRecno != nation_array.player_recno) ||
(toNationRecno == -1 && !nation_array.is_deleted(fromNationRecno) &&
nation_array[fromNationRecno]->is_allied_with_player) )
{
news_array.chat_msg( fromNationRecno, (char*)(shortPtr+2) );
}
}
//------- End of function RemoteMsg::chat -------//
//##### end trevor 30/9 #######//
//------- Begin of function RemoteMsg::compare_remote_object -------//
void RemoteMsg::compare_remote_object()
{
err_when( id < MSG_COMPARE_NATION || id > MSG_COMPARE_TALK );
// ###### patch begin Gilbert 20/1 #######//
if( (remote.sync_test_level & 2) && (remote.sync_test_level >= 0)
&& crc_store.compare_remote(id, data_buf) )
{
remote.sync_test_level = ~remote.sync_test_level; // signal error encountered
if( sys.debug_session )
err.run( "Multiplayer Random Seed Sync Error." );
else
box.msg( "Multiplayer Random Seed Sync Error." );
}
// ###### patch end Gilbert 20/1 #######//
}
//------- End of function RemoteMsg::compare_remote_object -------//
//------- Begin of function RemoteMsg::unit_add_way_point -------//
void RemoteMsg::unit_add_way_point()
{
//### begin alex 16/10 ###//
err_when( id != MSG_UNIT_ADD_WAY_POINT);
short* shortPtr = (short*) data_buf;
validate_selected_unit_array(shortPtr+3, shortPtr[2]);
if( shortPtr[2] > 0)
{
#ifdef DEBUG
long_log->printf("add way point at (%d,%d)\n", shortPtr[0], shortPtr[1]);
for(int i = 0; i < shortPtr[2]; ++i)
{
long_log->printf("%d,", shortPtr[3+i]);
if( i % 20 == 19)
long_log->printf("\n");
}
long_log->printf("\n");
#endif
unit_array.add_way_point(shortPtr[0], shortPtr[1], shortPtr+3, shortPtr[2], COMMAND_REMOTE); // 1-remote action
}
//#### end alex 16/10 ####//
}
//------- End of function RemoteMsg::unit_add_way_point -------//
// ------- Begin of function RemoteMsg::god_cast -------//
void RemoteMsg::god_cast()
{
err_when( id != MSG_U_GOD_CAST );
// packet structure :
short *shortPtr = (short *)data_buf;
short unitCount =1;
validate_selected_unit_array(shortPtr, unitCount);
if(unitCount > 0)
{
Unit *unitPtr = unit_array[*shortPtr];
err_when(unit_res[unitPtr->unit_id]->unit_class != UNIT_CLASS_GOD);
#ifdef DEBUG
long_log->printf("god %d cast power %d at(%d,%d)\n", shortPtr[0], shortPtr[3],
shortPtr[1], shortPtr[2]);
#endif
unitPtr->go_cast_power(shortPtr[1], shortPtr[2], (char) shortPtr[3], COMMAND_REMOTE);
}
}
// ------- End of function RemoteMsg::god_cast -------//
// ------- Begin of function RemoteMsg::player_quit ---------//
void RemoteMsg::player_quit()
{
// to let other player know a player quit voluntarily, not by error condition
err_when( id != MSG_PLAYER_QUIT );
// packet structure :
short *shortPtr = (short *)data_buf;
if( shortPtr[1])
news_array.multi_retire(*shortPtr);
else
news_array.multi_quit_game(*shortPtr);
}
// ------- End of function RemoteMsg::player_quit ---------//
|