/*
* 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 : OREMOTE.CPP
//Description : Object Remote
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
//---------- Define static variables ----------//
static int connection_failed = 0; // connect_game_disconnect_handler() will set connection_failed to 0
//---------- Define static functions ----------//
static void connect_game_disconnect_handler(DWORD playerId);
//--------- Begin of function Remote::Remote ----------//
Remote::Remote()
{
//--------------------------------------------//
packet_send_count = 0;
packet_receive_count = 0;
//--------------------------------------------//
common_msg_buf = mem_add( COMMON_MSG_BUF_SIZE );
mp_ptr = NULL;
connectivity_mode = 0;
// handle_vga_lock = 1;
handle_vga_lock = 0; // lock vga front in MulitPlayerDP
process_queue_flag = 0;
nation_processing = 0;
// ###### patch begin Gilbert 22/1 #######//
sync_test_level = 0; // 0=disable, bit0= random seed, bit1=crc, bit7=error encountered
// ###### patch end Gilbert 22/1 #######//
}
//--------- End of function Remote::Remote ----------//
//--------- Begin of function Remote::~Remote ----------//
Remote::~Remote()
{
deinit();
mem_del( common_msg_buf );
}
//--------- End of function Remote::~Remote ----------//
//--------- Begin of function Remote::init ----------//
//
// connectivityMode - connectivity mode can be:
// REMOTE_WSOCK_TCPIP, REMOTE_WSOCK_IPX,
// REMOTE_MODEM, REMOTE_NULL_MODEM
//
void Remote::init(MultiPlayerType *mp)
{
if( connectivity_mode )
deinit();
connectivity_mode = 1;
poll_msg_flag = 0;
mp_ptr = mp;
// ###### patch begin Gilbert 22/1 #######//
sync_test_level = (m.is_file_exist("SYNC1.SYS") ? 1 : 0)
| (m.is_file_exist("SYNC2.SYS") ? 2 : 0);
// 0=disable, bit0= random seed, bit1=crc
// ###### patch end Gilbert 22/1 #######//
reset_process_frame_delay();
set_alternating_send(1); // send every frame
}
//--------- End of function Remote::init ----------//
//--------- Begin of function Remote::deinit ----------//
void Remote::deinit()
{
if( connectivity_mode )
{
connectivity_mode = 0;
}
// ###### patch begin Gilbert 22/1 #######//
sync_test_level = 0; // 0=disable, bit0= random seed, bit1=crc
// ###### patch end Gilbert 22/1 #######//
}
//--------- End of function Remote::deinit ----------//
//--------- Begin of function Remote::create_game ---------//
//
int Remote::create_game()
{
//--------- initialize session parameters ---------//
is_host = TRUE;
return 1;
}
//--------- End of function Remote::create_game ---------//
//--------- Begin of function Remote::connect_game ---------//
//
int Remote::connect_game()
{
is_host = FALSE;
return 1;
}
//--------- End of function Remote::connect_game ---------//
//-------- Begin of function Remote::is_enable ---------//
//
int Remote::is_enable()
{
return connectivity_mode;
}
//--------- End of function Remote::is_enable ----------//
/*
//-------- Begin of function Remote::can_start_game ---------//
//
int Remote::can_start_game()
{
err_when(!connectivity_mode);
return wsock_ptr->can_start_game();
}
//--------- End of function Remote::can_start_game ----------//
*/
//-------- Begin of function Remote::number_of_opponent ---------//
//
int Remote::number_of_opponent()
{
err_when(!connectivity_mode);
//return wsock_ptr->number_of_player;
return mp_ptr->player_pool.size()-1;
}
//--------- End of function Remote::number_of_opponent ----------//
//-------- Begin of function Remote::self_player_id ---------//
//
DWORD Remote::self_player_id()
{
err_when(!connectivity_mode);
// return wsock_ptr->self_player_id;
return mp_ptr->my_player_id;
}
//--------- End of function Remote::self_player_id ----------//
/*
//-------- Begin of function Remote::set_disconnect_handler ---------//
//
void Remote::set_disconnect_handler(DisconnectFP disconnectFP)
{
err_when(!connectivity_mode);
wsock_ptr->set_disconnect_handler(disconnectFP);
}
//--------- End of function Remote::set_disconnect_handler ----------//
*/
//-------- Begin of function Remote::start_game ---------//
//
void Remote::start_game()
{
err_when(!connectivity_mode);
// wsock_ptr->start_game();
}
//--------- End of function Remote::start_game ----------//
//----- Begin of function connect_game_disconnect_handler -----//
//
// Disconnection handler for Remote::connect_game()
//
static void connect_game_disconnect_handler(DWORD playerId)
{
connection_failed = 1;
}
//------ End of function connect_game_disconnect_handler ------//
//-------- Begin of function Remote::reset_process_frame_delay ---------//
void Remote::reset_process_frame_delay()
{
// process_frame_delay = 1;
process_frame_delay = MAX_PROCESS_FRAME_DELAY;
err_when( process_frame_delay > MAX_PROCESS_FRAME_DELAY );
}
//-------- End of function Remote::reset_process_frame_delay ---------//
//-------- Begin of function Remote::get_process_frame_delay ---------//
int Remote::get_process_frame_delay()
{
return process_frame_delay;
}
//-------- End of function Remote::get_process_frame_delay ---------//
//-------- Begin of function Remote::set_process_frame_delay ---------//
void Remote::set_process_frame_delay(int f)
{
// must not be called after init_receive_queue()
if( f < 1 )
f = 1;
if( f > MAX_PROCESS_FRAME_DELAY )
f = MAX_PROCESS_FRAME_DELAY;
process_frame_delay = f;
}
//-------- End of function Remote::set_process_frame_delay ---------//
//-------- Begin of function Remote::calc_process_frame_delay ---------//
int Remote::calc_process_frame_delay(int milliSecond)
{
// expected : f = 1 + milliSecond / 100;
// int f = 1 + (milliSecond+20)/100;
int f = 1 + (milliSecond+40)/60;
if( f < 1 )
f = 1;
if( f > MAX_PROCESS_FRAME_DELAY )
f = MAX_PROCESS_FRAME_DELAY;
return f;
}
//-------- End of function Remote::calc_process_frame_delay ---------//
//-------- Begin of function Remote::set_alternating_send ---------//
void Remote::set_alternating_send(int rate)
{
if( rate <= 0 || rate > 100 || (sync_test_level != 0 && rate != 1) )
{
err_here();
// must not have any sync testing to enable alternating send
// tell_random_seed and crc checking must send data every frame
}
else
alternating_send_rate = rate;
}
//-------- End of function Remote::set_alternating_send ---------//
//-------- Begin of function Remote::set_alternating_send ---------//
int Remote::get_alternating_send()
{
return alternating_send_rate;
}
//-------- End of function Remote::set_alternating_send ---------//
//-------- Begin of function Remote::has_send_frame ---------//
int Remote::has_send_frame(int nationRecno, DWORD frameCount)
{
return ((frameCount + nationRecno) % alternating_send_rate) == 0;
}
//-------- End of function Remote::has_send_frame ---------//
//-------- Begin of function Remote::next_send_frame ---------//
// if has_send_frame is true, return frameCount
// otherwise return the next frame which has_send_frame return true
DWORD Remote::next_send_frame(int nationRecno, DWORD frameCount)
{
DWORD remainder = ((frameCount + nationRecno) % alternating_send_rate);
if(remainder == 0)
return frameCount;
else
return frameCount + alternating_send_rate - remainder;
}
//-------- End of function Remote::next_send_frame ---------//