(svn r2817) -Codechange: [autoreplace]: moved autoreplace and autorenew to serverside

-This means that one company can only have one setting for renew and replacing
    more clients will not fight due to different settings anymore
  -This is a needed step in the line to fix autoreplacing dualheaded locomotives
  NOTE: savegame revision bump (peter1138 + me in coop)
This commit is contained in:
bjarni
2005-08-06 16:07:22 +00:00
parent a1a91eb7f7
commit 9952ff0b59
14 changed files with 234 additions and 75 deletions

131
players.c
View File

@@ -474,7 +474,7 @@ static Player *AllocatePlayer(void)
Player *DoStartupNewPlayer(bool is_ai)
{
Player *p;
int index;
int index, i;
p = AllocatePlayer();
if (p == NULL) return NULL;
@@ -497,6 +497,14 @@ Player *DoStartupNewPlayer(bool is_ai)
p->inaugurated_year = _cur_year;
p->face = Random();
/* Engine renewal settings */
for (i = 0; i < 256; i++)
p->engine_replacement[i] = INVALID_ENGINE;
p->engine_renew = false;
p->engine_renew_months = -6;
p->engine_renew_money = 100000;
GeneratePresidentName(p);
InvalidateWindow(WC_GRAPH_LEGEND, 0);
@@ -661,6 +669,119 @@ static void DeletePlayerStuff(int pi)
p->president_name_1 = 0;
}
/** Change engine renewal parameters
* @param x,y unused
* @param p1 bits 0-3 command
* - p1 = 0 - change auto renew bool
* - p1 = 1 - change auto renew months
* - p1 = 2 - change auto renew money
* - p1 = 3 - change auto renew array
* - p1 = 4 - change bool, months & money all together
* @param p2 value to set
* if p1 = 0, then:
* - p2 = enable engine renewal
* if p1 = 1, then:
* - p2 = months left before engine expires to replace it
* if p1 = 2, then
* - p2 = minimum amount of money available
* if p1 = 3, then:
* - p2 bits 0-15 = old engine type
* - p2 bits 16-31 = new engine type
* if p1 = 4, then:
* - p1 bit 15 = enable engine renewal
* - p1 bits 16-31 = months left before engine expires to replace it
* - p2 bits 0-31 = minimum amount of money available
*/
int32 CmdReplaceVehicle(int x, int y, uint32 flags, uint32 p1, uint32 p2)
{
Player *p;
if (!(_current_player < MAX_PLAYERS))
return CMD_ERROR;
p = GetPlayer(_current_player);
switch (GB(p1, 0, 3)) {
case 0:
if (p->engine_renew == (bool)GB(p2, 0, 1))
return CMD_ERROR;
if (flags & DC_EXEC) {
p->engine_renew = (bool)GB(p2, 0, 1);
if (_current_player == _local_player) {
_patches.autorenew = p->engine_renew;
InvalidateWindow(WC_GAME_OPTIONS, 0);
}
}
break;
case 1:
if (p->engine_renew_months == (int16)p2)
return CMD_ERROR;
if (flags & DC_EXEC) {
p->engine_renew_months = (int16)p2;
if (_current_player == _local_player) {
_patches.autorenew_months = p->engine_renew_months;
InvalidateWindow(WC_GAME_OPTIONS, 0);
}
}
break;
case 2:
if (p->engine_renew_money == (uint32)p2)
return CMD_ERROR;
if (flags & DC_EXEC) {
p->engine_renew_money = (uint32)p2;
if (_current_player == _local_player) {
_patches.autorenew_money = p->engine_renew_money;
InvalidateWindow(WC_GAME_OPTIONS, 0);
}
}
break;
case 3: {
EngineID old_engine_type = GB(p2, 0, 16);
EngineID new_engine_type = GB(p2, 16, 16);
if (new_engine_type != INVALID_ENGINE) {
/* First we make sure that it's a valid type the user requested
* check that it's an engine that is in the engine array */
if(!IsEngineIndex(new_engine_type))
return CMD_ERROR;
// check that the new vehicle type is the same as the original one
if (GetEngine(old_engine_type)->type != GetEngine(new_engine_type)->type)
return CMD_ERROR;
// make sure that we do not replace a plane with a helicopter or vise versa
if (GetEngine(new_engine_type)->type == VEH_Aircraft && HASBIT(AircraftVehInfo(old_engine_type)->subtype, 0) != HASBIT(AircraftVehInfo(new_engine_type)->subtype, 0))
return CMD_ERROR;
// make sure that the player can actually buy the new engine
if (!HASBIT(GetEngine(new_engine_type)->player_avail, _current_player))
return CMD_ERROR;
}
if (flags & DC_EXEC) {
p->engine_replacement[old_engine_type] = new_engine_type;
}
} break;
case 4:
if (flags & DC_EXEC) {
p->engine_renew = (bool)GB(p1, 15, 1);
p->engine_renew_months = (int16)GB(p1, 16, 16);
p->engine_renew_money = (uint32)p2;
if (_current_player == _local_player) {
_patches.autorenew = p->engine_renew;
_patches.autorenew_months = p->engine_renew_months;
_patches.autorenew_money = p->engine_renew_money;
InvalidateWindow(WC_GAME_OPTIONS, 0);
}
}
break;
}
return 0;
}
/** Control the players: add, delete, etc.
* @param x,y unused
* @param p1 various functionality
@@ -706,6 +827,8 @@ int32 CmdPlayerCtrl(int x, int y, uint32 flags, uint32 p1, uint32 p2)
_local_player = p->index;
MarkWholeScreenDirty();
}
} else if (p->index == _local_player) {
DoCommandP(0, (_patches.autorenew << 15 ) | (_patches.autorenew_months << 16) | 4, _patches.autorenew_money, NULL, CMD_REPLACE_VEHICLE);
}
#ifdef ENABLE_NETWORK
if (_network_server) {
@@ -1022,6 +1145,12 @@ static const SaveLoad _player_desc[] = {
SLE_CONDVAR(Player,is_ai, SLE_UINT8, 2, 255),
SLE_CONDVAR(Player,is_active, SLE_UINT8, 4, 255),
// Engine renewal settings
SLE_CONDARR(Player,engine_replacement, SLE_UINT16, 256, 16, 255),
SLE_CONDVAR(Player,engine_renew, SLE_UINT8, 16, 255),
SLE_CONDVAR(Player,engine_renew_months, SLE_INT16, 16, 255),
SLE_CONDVAR(Player,engine_renew_money, SLE_UINT32, 16, 255),
// reserve extra space in savegame here. (currently 64 bytes)
SLE_CONDARR(NullStruct,null,SLE_FILE_U64 | SLE_VAR_NULL, 8, 2, 255),