/*
* 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.H
//Description : Header file of object Remote
#ifndef __OREMOTE_H
#define __OREMOTE_H
// #ifndef __WINDOWS_
// #include
// #endif
// #ifndef __OWSIPX_H
// #include
// #endif
#include
#include
//------ Define connectivity mode -------//
// enum { REMOTE_WSOCK_TCPIP=1,
// REMOTE_WSOCK_IPX,
// REMOTE_MODEM,
// REMOTE_NULL_MODEM,
// };
//---------- Define message id. ---------//
enum { FIRST_REMOTE_MSG_ID = 0x25D3 };
enum { MSG_QUEUE_HEADER=FIRST_REMOTE_MSG_ID,
MSG_QUEUE_TRAILER,
MSG_NEW_NATION,
MSG_UPDATE_GAME_SETTING,
MSG_START_GAME,
MSG_NEXT_FRAME,
MSG_REQUEST_RESEND,
MSG_TELL_SEND_TIME,
MSG_SET_SPEED,
MSG_TELL_RANDOM_SEED,
MSG_REQUEST_SAVE,
MSG_PLAYER_QUIT,
MSG_UNIT_STOP,
MSG_UNIT_MOVE,
MSG_UNIT_SET_FORCE_MOVE,
MSG_UNIT_ATTACK,
MSG_UNIT_ASSIGN,
MSG_UNIT_CHANGE_NATION,
MSG_UNIT_BUILD_FIRM,
MSG_UNIT_BURN,
MSG_UNITS_SETTLE,
MSG_UNIT_SET_GUARD,
MSG_UNIT_SET_RANK,
MSG_UNIT_DISMOUNT,
MSG_UNIT_REWARD,
MSG_UNITS_TRANSFORM,
MSG_UNIT_RESIGN,
MSG_UNITS_ASSIGN_TO_SHIP,
MSG_UNITS_SHIP_TO_BEACH,
MSG_UNIT_SUCCEED_KING,
MSG_UNITS_RETURN_CAMP,
MSG_U_CARA_CHANGE_GOODS,
MSG_U_CARA_SET_STOP,
MSG_U_CARA_DEL_STOP,
MSG_U_CARA_SELECTED,
MSG_U_SHIP_UNLOAD_UNIT,
MSG_U_SHIP_UNLOAD_ALL_UNITS,
MSG_U_SHIP_CHANGE_GOODS,
MSG_U_SHIP_SET_STOP,
MSG_U_SHIP_DEL_STOP,
MSG_U_SHIP_CHANGE_MODE,
MSG_U_SHIP_SELECTED,
MSG_U_GOD_CAST,
MSG_UNIT_SPY_NATION,
MSG_UNIT_SPY_NOTIFY_CLOAKED_NATION,
MSG_UNIT_CHANGE_AGGRESSIVE_MODE,
MSG_SPY_CHANGE_NOTIFY_FLAG,
//##### trevor 15/10 ######//
MSG_SPY_ASSASSINATE,
//##### trevor 15/10 ######//
//### begin alex 14/10 ###//
MSG_UNIT_ADD_WAY_POINT,
//#### end alex 14/10 ####//
MSG_FIRM_SELL,
MSG_FIRM_CANCEL,
MSG_FIRM_DESTRUCT,
MSG_FIRM_SET_REPAIR,
MSG_FIRM_TRAIN_LEVEL,
MSG_FIRM_MOBL_WORKER,
MSG_FIRM_MOBL_OVERSEER,
MSG_FIRM_MOBL_BUILDER,
MSG_FIRM_TOGGLE_LINK_FIRM,
MSG_FIRM_TOGGLE_LINK_TOWN,
MSG_FIRM_PULL_TOWN_PEOPLE,
MSG_FIRM_SET_WORKER_HOME,
MSG_FIRM_BRIBE,
MSG_FIRM_CAPTURE,
//### trevor 2/10 ###//
MSG_FIRM_REWARD,
MSG_F_CAMP_PATROL,
MSG_F_CAMP_TOGGLE_PATROL,
MSG_F_INN_HIRE,
//### trevor 2/10 ###//
MSG_F_MARKET_SCRAP,
MSG_F_MARKET_HIRE_CARA,
MSG_F_RESEARCH_START,
MSG_F_WAR_BUILD_WEAPON,
MSG_F_WAR_CANCEL_WEAPON,
MSG_F_WAR_SKIP_WEAPON,
MSG_F_HARBOR_BUILD_SHIP,
MSG_F_HARBOR_SAIL_SHIP,
MSG_F_HARBOR_SKIP_SHIP,
MSG_F_FACTORY_CHG_PROD,
MSG_F_BASE_MOBL_PRAYER,
MSG_F_BASE_INVOKE_GOD,
MSG_TOWN_RECRUIT,
MSG_TOWN_SKIP_RECRUIT,
MSG_TOWN_MIGRATE,
MSG_TOWN_COLLECT_TAX,
MSG_TOWN_REWARD,
MSG_TOWN_TOGGLE_LINK_FIRM,
MSG_TOWN_TOGGLE_LINK_TOWN,
MSG_TOWN_AUTO_TAX,
MSG_TOWN_AUTO_GRANT,
MSG_TOWN_GRANT_INDEPENDENT,
MSG_WALL_BUILD,
MSG_WALL_DESTRUCT,
MSG_SPY_CYCLE_ACTION,
MSG_SPY_LEAVE_TOWN,
MSG_SPY_LEAVE_FIRM,
MSG_SPY_CAPTURE_FIRM,
MSG_SPY_DROP_IDENTITY,
MSG_SPY_REWARD,
MSG_SPY_EXPOSED,
MSG_SEND_TALK_MSG, // for diplomacy
MSG_REPLY_TALK_MSG,
MSG_NATION_CONTACT,
MSG_NATION_SET_SHOULD_ATTACK,
MSG_CHAT,
MSG_COMPARE_NATION,
MSG_COMPARE_UNIT,
MSG_COMPARE_FIRM,
MSG_COMPARE_TOWN,
MSG_COMPARE_BULLET,
MSG_COMPARE_REBEL,
MSG_COMPARE_SPY,
MSG_COMPARE_TALK,
LAST_REMOTE_MSG_ID // keep this item last
};
enum { REMOTE_MSG_TYPE_COUNT= LAST_REMOTE_MSG_ID - FIRST_REMOTE_MSG_ID };
//--------- Define struct RemoteMsg ---------//
struct RemoteMsg
{
public:
DWORD id;
char data_buf[1];
public:
void process_msg();
//------ remote message processing functions ------//
void queue_header();
void queue_trailer();
void new_nation();
void update_game_setting();
void start_game();
void next_frame();
void request_resend();
void tell_send_time();
void set_speed();
void tell_random_seed();
void request_save_game();
void player_quit();
void unit_stop();
void unit_move();
void unit_set_force_move();
void unit_attack();
void unit_assign();
void unit_change_nation();
void unit_build_firm();
void unit_burn();
void units_settle();
void unit_set_guard();
void unit_set_rank();
void unit_dismount();
void unit_reward();
void units_transform();
void unit_resign();
void units_assign_to_ship();
void units_ship_to_beach();
void unit_succeed_king();
void units_return_camp();
void caravan_change_goods();
void caravan_set_stop();
void caravan_del_stop();
void caravan_selected();
void ship_unload_unit();
void ship_unload_all_units();
void ship_change_goods();
void ship_set_stop();
void ship_del_stop();
void ship_change_mode();
void ship_selected();
void god_cast();
void change_spy_nation();
void notify_cloaked_nation();
void unit_change_aggressive_mode();
void spy_change_notify_flag();
//##### trevor 15/10 #####//
void spy_assassinate();
//##### trevor 15/10 #####//
//### begin alex 14/10 ###//
void unit_add_way_point();
//#### end alex 14/10 ####//
void firm_sell();
void firm_cancel(); // cancel construction
void firm_destruct();
void firm_set_repair();
void firm_train_level();
void mobilize_worker();
void mobilize_overseer();
void mobilize_builder();
void firm_toggle_link_firm();
void firm_toggle_link_town();
void firm_pull_town_people();
void firm_set_worker_home();
void firm_bribe();
void firm_capture();
void camp_patrol();
void toggle_camp_patrol();
void firm_reward();
void inn_hire();
void market_scrap();
void market_hire_caravan();
void research_start();
void build_weapon();
void cancel_weapon();
void skip_build_weapon();
void build_ship();
void sail_ship();
void skip_build_ship();
void factory_change_product();
void base_mobilize_prayer();
void invoke_god();
void town_recruit();
void town_skip_recruit();
void town_migrate();
void town_collect_tax();
void town_reward();
void town_toggle_link_firm();
void town_toggle_link_town();
void town_auto_tax();
void town_auto_grant();
void town_grant_independent();
void wall_build();
void wall_destruct();
void spy_cycle_action();
void spy_leave_town();
void spy_leave_firm();
void spy_capture_firm();
void spy_drop_identity();
void spy_reward();
void spy_exposed();
void send_talk_msg();
void reply_talk_msg();
void nation_contact();
void nation_set_should_attack();
//##### trevor 30/9 #######//
void chat();
//##### trevor 30/9 #######//
void compare_remote_object();
};
//----------- Define class Remote -----------//
class MultiPlayerType;
class Remote
{
public:
enum { COMMON_MSG_BUF_SIZE = 1024, // Remote allocates a common RemoteMsg object with a data buffer of this size.
SEND_QUEUE_BUF_SIZE = 1024, // The default queue buffer size
SEND_QUEUE_BUF_INC_SIZE = 1024, // If the queue is full, expand with this size
RECEIVE_QUEUE_BUF_SIZE = 8192, // The default queue buffer size
RECEIVE_QUEUE_BUF_INC_SIZE = 2048, // If the queue is full, expand with this size
#ifdef AMPLUS
// MAX_PROCESS_FRAME_DELAY = 5, // process player action 1 frame later
MAX_PROCESS_FRAME_DELAY = 8, // process player action 1 frame later
#else
MAX_PROCESS_FRAME_DELAY = 1, // process player action 1 frame later
#endif
SEND_QUEUE_BACKUP = MAX_PROCESS_FRAME_DELAY+4,
RECEIVE_QUEUE_BACKUP = (MAX_PROCESS_FRAME_DELAY+1)*2,
};
public:
char is_host;
char handle_vga_lock;
int connectivity_mode;
int poll_msg_flag;
// Wsock* wsock_ptr;
MultiPlayerType* mp_ptr;
//--------- send queue -----------//
RemoteQueue send_queue[SEND_QUEUE_BACKUP]; // 0 for the latest, other for backup
DWORD send_frame_count[SEND_QUEUE_BACKUP];
/*
char* send_queue_buf;
char* send_queue_ptr;
int send_queue_buf_size;
int send_queued_size;
//------- send backup queue --------//
char* backup_queue_buf; // backup copy of the send_queue_buf
int backup_queued_size; // for handling resend request
DWORD backup_frame_count;
char* backup2_queue_buf; // backup copy of the send_queue_buf
int backup2_queued_size; // for handling resend request
DWORD backup2_frame_count;
*/
//------- receive queue ---------//
RemoteQueue receive_queue[RECEIVE_QUEUE_BACKUP];
DWORD receive_frame_count[RECEIVE_QUEUE_BACKUP];
/*
char* receive_queue_buf;
char* receive_queue_ptr;
int receive_queue_buf_size;
int receive_queued_size;
char* receive2_queue_buf;
char* receive2_queue_ptr;
int receive2_queue_buf_size;
int receive2_queued_size;
*/
char process_queue_flag;
//-------------------------------//
int packet_send_count;
int packet_receive_count;
//-------------------------------//
short nation_processing; // used in process_receive_queue
char save_file_name[MAX_PATH+1];
char *common_msg_buf;
// ###### patch begin Gilbert 22/1 #######//
char sync_test_level; // 0=disable, bit0= random seed, bit1=crc
// ###### patch end Gilbert 22/1 #######//
int process_frame_delay;
// --------- alternating send frame --------//
int alternating_send_rate; // 1=every frame, 2=send one frame per two frames...
public:
Remote();
~Remote();
void init(MultiPlayerType *);
void deinit();
void init_start_mp();
int is_enable();
// int can_start_game();
int number_of_opponent();
DWORD self_player_id();
// void set_disconnect_handler(DisconnectFP disconnectFP);
int create_game();
int connect_game();
void start_game();
void send_msg(RemoteMsg* remoteMsgPtr, int receiverId=0);
void send_free_msg(RemoteMsg* remoteMsgPtr, int receiverId=0);
RemoteMsg* new_msg(int msgId, int dataSize);
void free_msg(RemoteMsg* remoteMsgPtr);
char* new_send_queue_msg(int msgId, int msgSize);
int send_queue_now(int receiverId=0);
int send_backup_now(int receiverId, DWORD requestFrameCount);
void append_send_to_receive();
void copy_send_to_backup();
// int poll_msg(UINT message, UINT wParam, LONG lParam);
int poll_msg();
void enable_poll_msg();
void disable_poll_msg();
void process_receive_queue();
void process_specific_msg(DWORD msgId);
void init_send_queue(DWORD,short);
void init_receive_queue(DWORD);
void enable_process_queue();
void disable_process_queue();
void reset_process_frame_delay();
int get_process_frame_delay();
void set_process_frame_delay(int);
int calc_process_frame_delay(int milliSecond);
// ------- alternating send frame -------//
void set_alternating_send(int rate);
int get_alternating_send();
int has_send_frame(int nationRecno, DWORD frameCount);
DWORD next_send_frame(int nationRecno, DWORD frameCount);
};
extern Remote remote;
//------------------------------------//
#endif