/*
* 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 : OUNITAMT.CPP
//Description : Object UnitArray, trading code of caravans and ships for multiplayer game
//Owner : Alex
//------------------------------------------------------------------------------------------------------//
// Parameters used for updating cargo info. of trade units in muliplayer game:
//
// 1) caravan
// mp_selected_caravan_recno[MAX_NATION]
// mp_selected_caravan_count
// mp_first_frame_to_select_caravan
// mp_pre_selected_caravan_recno
//
// 2) marine that can trade
// mp_selected_ship_recno[MAX_NATION]
// mp_selected_ship_count
// mp_first_frame_to_select_ship
// mp_pre_selected_ship_recno
//
// Functions used in multiplayer game
//
// 1) common
// update_selected_trade_unit_info(...)
//
// 2) caravan
// mp_mark_selected_caravan(...)
// mp_get_selected_caravan_count(...)
// mp_reset_selected_caravan_count(...)
// mp_add_selected_caravan(...)
// mp_is_selected_caravan(...)
//
// 3) marine that can trade
// mp_mark_selected_ship(...)
// mp_get_selected_ship_count(...)
// mp_reset_selected_ship_count(...)
// mp_add_selected_ship(...)
// mp_is_selected_ship(...)
//
// In mulitplayer game, any order to the units from one player to others player must experience delay
// of one frame. In order to update information of selected trade units in real time, the design used
// in this part of programming is obviously different from other general multiplayer messages. The
// documentation is only for caravans, since the method used for marine is absolutely equilvance.
//
// In this version of trading system, the player can only select one trade unit to view the unit detail
// at any time and there are maximum 7 players in the game. Thus, an array of size MAX_NATION is used
// to store the record number of trade units selected by each players. A count, mp_selected_caravan_count,
// is used to count the number of selected units in the array, mp_selected_caravan_recno.
//
// The process that a player select a unit can be divided into three part, first frame to select the
// unit, keep selecting the unit and unselect the unit. If the player selects a caravan, the flag
// mp_first_frame_to_select_caravan set to TRUE, mp_pre_selected_caravan_recno stores the record number
// of this unit. From now on, the message MSG_U_CARA_SELECTED for the unit keep on sending to other
// players every frame until the unit is unselected. Since the flag mp_first_frame_to_select_caravan is
// set to TRUE, this caravan information will not be shown in this frame.
//
// In the next frame, the flag mp_first_frame_to_select_caravan is set back to FLASE. The message
// MSG_U_CARA_SELECTED sent in the previous frame reaches other players' channel. The message takes effect
// to add a recno in the array mp_selected_caravan_recno. For each record number in the array, the system
// update the caravan information. The process continue and the cargo information is updated in real-time
// for the selected trade units.
//
//
// Functions description:
//
// mp_mark_selected_caravan()
// is called every frame to sent message to other players to notice them the recno of the trade unit selected
//
// mp_get_selected_caravan_count()
// for debug only
//
// mp_reset_selected_caravan_count()
// reset the array mp_selected_caravan_recno.
//
// mp_add_selected_caravan()
// handle message sent by other players to add recno in the array mp_selected_caravan_recno
//
// mp_is_selected_caravan()
// check whether the unit is selected, recno in the array mp_selected_caravan_recno
//
//------------------------------------------------------------------------------------------------------//
#include
#include
#include
#include
#include
//------------ define static variables ------------//
static short mp_selected_caravan_recno[MAX_NATION] = {0};
static int mp_selected_caravan_count = 0;
static short mp_selected_ship_recno[MAX_NATION] = {0};
static int mp_selected_ship_count = 0;
//--------- Begin of function UnitArray::mp_mark_selected_caravan ---------//
void UnitArray::mp_mark_selected_caravan()
{
//---------- send remote messages for selected caravan and ship ------------//
if(remote.is_enable())
{
if(selected_recno)
{
Unit *selectedUnitPtr = (Unit*)get_ptr(selected_recno);
//### begin alex 19/9 ###//
//if(selectedUnitPtr->unit_id==UNIT_CARAVAN && selectedUnitPtr->nation_recno==nation_array.player_recno)
if(selectedUnitPtr->unit_id==UNIT_CARAVAN && ((nation_array.player_recno &&
selectedUnitPtr->nation_recno==nation_array.player_recno) || config.show_ai_info))
//#### end alex 19/9 ####//
{
//---------- send message for multiplayer ---------//
short* shortPtr = (short*) remote.new_send_queue_msg(MSG_U_CARA_SELECTED, sizeof(short));
shortPtr[0] = selectedUnitPtr->sprite_recno;
if(selected_recno==mp_pre_selected_caravan_recno)
mp_first_frame_to_select_caravan = 0;
else
{
mp_pre_selected_caravan_recno = selected_recno;
mp_first_frame_to_select_caravan = 1;
}
}
else
mp_pre_selected_caravan_recno = 0;
}
else
mp_pre_selected_caravan_recno = 0;
mp_reset_selected_caravan_count();
}
}
//----------- End of function UnitArray::mp_mark_selected_caravan -----------//
//--------- Begin of function UnitArray::mp_get_selected_caravan_count ---------//
// function only for debug
//
int UnitArray::mp_get_selected_caravan_count()
{
//return selected_caravan_count;
if(mp_selected_caravan_count)
return mp_selected_caravan_recno[0];
else
return 0;
}
//----------- End of function UnitArray::mp_get_selected_caravan_count -----------//
//--------- Begin of function UnitArray::mp_reset_selected_caravan_count ---------//
void UnitArray::mp_reset_selected_caravan_count()
{
mp_selected_caravan_count = 0;
}
//----------- End of function Unit::mp_reset_selected_caravan_count -----------//
//--------- Begin of function UnitArray::mp_add_selected_caravan ---------//
// the specified recno is one of the caravans selected in the previous frame
// by one of the players
//
void UnitArray::mp_add_selected_caravan(short unitRecno)
{
err_when(mp_selected_caravan_count>=MAX_NATION);
mp_selected_caravan_recno[mp_selected_caravan_count++] = unitRecno;
}
//----------- End of function UnitArray::mp_add_selected_caravan -----------//
//--------- Begin of function UnitArray::mp_is_selected_caravan ---------//
// return 1 if the caravan is selected in the previous frame by one of the players
// return 0 otherwise
//
int UnitArray::mp_is_selected_caravan(short unitRecno)
{
err_when(mp_selected_caravan_count>=MAX_NATION);
for(int i=mp_selected_caravan_count-1; i>=0; --i)
{
if(mp_selected_caravan_recno[i] == unitRecno)
return 1;
}
return 0;
}
//----------- End of function UnitArray::mp_is_selected_caravan -----------//
//--------- Begin of function UnitArray::mp_mark_selected_ship ---------//
void UnitArray::mp_mark_selected_ship()
{
//---------- send remote messages for selected ship ------------//
if(remote.is_enable())
{
if(selected_recno)
{
Unit *selectedUnitPtr = (Unit*)get_ptr(selected_recno);
//### begin alex 19/9 ###//
//if(unit_res[selectedUnitPtr->unit_id]->unit_class == UNIT_CLASS_SHIP &&
// selectedUnitPtr->unit_id != UNIT_TRANSPORT && selectedUnitPtr->nation_recno == nation_array.player_recno)
if(unit_res[selectedUnitPtr->unit_id]->unit_class == UNIT_CLASS_SHIP &&
selectedUnitPtr->unit_id != UNIT_TRANSPORT && ((nation_array.player_recno &&
selectedUnitPtr->nation_recno == nation_array.player_recno) || config.show_ai_info))
//#### end alex 19/9 ####//
{
if(((UnitMarine*)selectedUnitPtr)->auto_mode)
{
//---------- send message for multiplayer ---------//
short* shortPtr = (short*) remote.new_send_queue_msg(MSG_U_SHIP_SELECTED, sizeof(short));
shortPtr[0] = selectedUnitPtr->sprite_recno;
if(selected_recno==mp_pre_selected_ship_recno)
mp_first_frame_to_select_ship = 0;
else
{
mp_pre_selected_ship_recno = selected_recno;
mp_first_frame_to_select_ship = 1;
}
}
else
mp_pre_selected_ship_recno = 0;
}
else
mp_pre_selected_ship_recno = 0;
}
else
mp_pre_selected_ship_recno = 0;
mp_reset_selected_ship_count();
}
}
//----------- End of function UnitArray::mp_mark_selected_ship -----------//
//--------- Begin of function UnitArray::mp_get_selected_ship_count ---------//
// function only for debug
//
int UnitArray::mp_get_selected_ship_count()
{
//return selected_ship_count;
if(mp_selected_ship_count)
return mp_selected_ship_recno[0];
else
return 0;
}
//----------- End of function UnitArray::mp_get_selected_ship_count -----------//
//--------- Begin of function UnitArray::mp_reset_selected_ship_count ---------//
void UnitArray::mp_reset_selected_ship_count()
{
mp_selected_ship_count = 0;
}
//----------- End of function Unit::mp_reset_selected_ship_count -----------//
//--------- Begin of function UnitArray::mp_add_selected_ship ---------//
// the specified recno is one of the ships selected in the previous frame
// by one of the players
//
void UnitArray::mp_add_selected_ship(short unitRecno)
{
err_when(mp_selected_ship_count>=MAX_NATION);
mp_selected_ship_recno[mp_selected_ship_count++] = unitRecno;
}
//----------- End of function UnitArray::mp_add_selected_ship -----------//
//--------- Begin of function UnitArray::mp_is_selected_ship ---------//
// return 1 if the ship is selected in the previous frame by one of the players
// return 0 otherwise
//
int UnitArray::mp_is_selected_ship(short unitRecno)
{
err_when(mp_selected_ship_count>=MAX_NATION);
for(int i=mp_selected_ship_count-1; i>=0; --i)
{
if(mp_selected_ship_recno[i] == unitRecno)
return 1;
}
return 0;
}
//----------- End of function UnitArray::mp_is_selected_ship -----------//