(svn r3726) - [6/6] Finalize conversion, finally save the patches struct.
authorDarkvater
Thu, 02 Mar 2006 02:22:15 +0000
changeset 3121 2e50f731567a
parent 3120 1b41287d4ee9
child 3122 cb8145459c39
(svn r3726) - [6/6] Finalize conversion, finally save the patches struct.
- Remove the temporary synchronisation in during the map-transfer as this is no longer needed
- The saved patches work just like the saved gameoptions. You have a _patches and a _patches_newgame struct. The _patches_newgame struct contains the values from the configuration file and thus the defaults for new games. When a new game is started or an older game is loaded, the default values are copied over to _patches to be used. When you load a game that has PATS saved, the default values are also loaded, but immediately overwritten by the values from the savegame. This ensures that player-based values are always taken from your personal preferences.
- The current implementation also changes the default values if you change player-based settings in the game. For example changing window_snap_radius in a certain game will also change it for all next OpenTTD sessions.
- The savegame version has been increased to 22.
- The last 6 orso patches close the following reports:
[ 1366446 ] different names for patches: all patch settings have the same name as in the configuration file and are reachable from the console.
[ 1288024 ] Strange string on OTTD initial screen: configuration (and this includes patches) inputs are validated and clamped to their minimum/maximum values.
[ 1423198 ] Make "Signals on Drive side" player, not server, based: this is only visual so current setting is to save it with the savegame but not synchronise in multiplayer.
[ 1208070 ] Patches and New GRF options saved: apart from newgrf this is done
functions.h
misc.c
network_client.c
network_data.h
network_server.c
openttd.c
saveload.c
settings.c
settings_gui.c
--- a/functions.h	Thu Mar 02 02:03:21 2006 +0000
+++ b/functions.h	Thu Mar 02 02:22:15 2006 +0000
@@ -227,6 +227,7 @@
 TileIndex AdjustTileCoordRandomly(TileIndex a, byte rng);
 
 void AfterLoadTown(void);
+void UpdatePatches(void);
 void GenRandomNewGame(uint32 rnd1, uint32 rnd2);
 void StartScenarioEditor(uint32 rnd1, uint32 rnd2);
 void AskExitGame(void);
--- a/misc.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/misc.c	Thu Mar 02 02:22:15 2006 +0000
@@ -191,6 +191,8 @@
 	// Make sure everything is done via OWNER_NONE
 	_current_player = OWNER_NONE;
 
+	UpdatePatches();
+
 	_generating_world = true;
 	InitializeGame(mode == GW_RANDOM ? 0 : IG_DATE_RESET, size_x, size_y);
 	SetObjectToPlace(SPR_CURSOR_ZZZ, 0, 0, 0);
--- a/network_client.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/network_client.c	Thu Mar 02 02:22:15 2006 +0000
@@ -16,7 +16,6 @@
 #include "command.h"
 #include "gfx.h"
 #include "window.h"
-#include "settings.h"
 #include "console.h"
 #include "variables.h"
 #include "ai/ai.h"
@@ -32,8 +31,6 @@
 
 static uint32 last_ack_frame;
 
-static void NetworkRecvPatchSettings(NetworkClientState* cs, Packet* p);
-
 // **********
 // Sending functions
 //   DEF_CLIENT_SEND_COMMAND has no parameters
@@ -504,10 +501,6 @@
 		InvalidateWindow(WC_NETWORK_STATUS_WINDOW, 0);
 	}
 
-	if (maptype == MAP_PACKET_PATCH) {
-		NetworkRecvPatchSettings(MY_CLIENT, p);
-	}
-
 	// Check if this was the last packet
 	if (maptype == MAP_PACKET_END) {
 		fclose(file_pointer);
@@ -826,37 +819,6 @@
 // If this fails, check the array above with network_data.h
 assert_compile(lengthof(_network_client_packet) == PACKET_END);
 
-extern const SettingDesc _patch_settings[];
-
-// This is a TEMPORARY solution to get the patch-settings
-//  to the client. When the patch-settings are saved in the savegame
-//  this should be removed!!
-static void NetworkRecvPatchSettings(NetworkClientState* cs, Packet* p)
-{
-	const SettingDesc *item;
-
-	item = _patch_settings;
-
-	for (; item->save.cmd != SL_END; item++) {
-		void *var = ini_get_variable(&item->save, &_patches);
-		switch (GetVarMemType(item->save.conv)) {
-			case SLE_VAR_BL:
-			case SLE_VAR_I8:
-			case SLE_VAR_U8:
-				*(uint8 *)(var) = NetworkRecv_uint8(cs, p);
-				break;
-			case SLE_VAR_I16:
-			case SLE_VAR_U16:
-				*(uint16 *)(var) = NetworkRecv_uint16(cs, p);
-				break;
-			case SLE_VAR_I32:
-			case SLE_VAR_U32:
-				*(uint32 *)(var) = NetworkRecv_uint32(cs, p);
-				break;
-		}
-	}
-}
-
 // Is called after a client is connected to the server
 void NetworkClient_Connected(void)
 {
--- a/network_data.h	Thu Mar 02 02:03:21 2006 +0000
+++ b/network_data.h	Thu Mar 02 02:22:15 2006 +0000
@@ -58,7 +58,6 @@
 typedef enum {
 	MAP_PACKET_START,
 	MAP_PACKET_NORMAL,
-	MAP_PACKET_PATCH,
 	MAP_PACKET_END,
 } MapPacket;
 
--- a/network_server.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/network_server.c	Thu Mar 02 02:22:15 2006 +0000
@@ -19,14 +19,11 @@
 #include "saveload.h"
 #include "vehicle.h"
 #include "station.h"
-#include "settings.h"
 #include "variables.h"
 
 // This file handles all the server-commands
 
 static void NetworkHandleCommandQueue(NetworkClientState* cs);
-static void NetworkSendPatchSettings(NetworkClientState* cs);
-
 void NetworkPopulateCompanyInfo(void);
 
 // Is the network enabled?
@@ -322,12 +319,7 @@
 			NetworkSend_Packet(p, cs);
 			if (feof(file_pointer)) {
 				// Done reading!
-				Packet *p;
-
-				// XXX - Delete this when patch-settings are saved in-game
-				NetworkSendPatchSettings(cs);
-
-				p = NetworkSend_Init(PACKET_SERVER_MAP);
+				Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
 				NetworkSend_uint8(p, MAP_PACKET_END);
 				NetworkSend_Packet(p, cs);
 
@@ -1187,43 +1179,6 @@
 // If this fails, check the array above with network_data.h
 assert_compile(lengthof(_network_server_packet) == PACKET_END);
 
-
-extern const SettingDesc _patch_settings[];
-
-// This is a TEMPORARY solution to get the patch-settings
-//  to the client. When the patch-settings are saved in the savegame
-//  this should be removed!!
-static void NetworkSendPatchSettings(NetworkClientState* cs)
-{
-	const SettingDesc *item;
-	Packet *p = NetworkSend_Init(PACKET_SERVER_MAP);
-	NetworkSend_uint8(p, MAP_PACKET_PATCH);
-	// Now send all the patch-settings in a pretty order..
-
-	item = _patch_settings;
-
-	for (; item->save.cmd != SL_END; item++) {
-		const void *var = ini_get_variable(&item->save, &_patches);
-		switch (GetVarMemType(item->save.conv)) {
-			case SLE_VAR_BL:
-			case SLE_VAR_I8:
-			case SLE_VAR_U8:
-				NetworkSend_uint8(p, *(uint8 *)var);
-				break;
-			case SLE_VAR_I16:
-			case SLE_VAR_U16:
-				NetworkSend_uint16(p, *(uint16 *)var);
-				break;
-			case SLE_VAR_I32:
-			case SLE_VAR_U32:
-				NetworkSend_uint32(p, *(uint32 *)var);
-				break;
-		}
-	}
-
-	NetworkSend_Packet(p, cs);
-}
-
 // This update the company_info-stuff
 void NetworkPopulateCompanyInfo(void)
 {
--- a/openttd.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/openttd.c	Thu Mar 02 02:22:15 2006 +0000
@@ -1312,6 +1312,8 @@
 		} END_TILE_LOOP(tile, MapSizeX(), MapSizeY(), 0);
 	}
 
+	if (CheckSavegameVersion(22))  UpdatePatches();
+
 	FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
 
 	return true;
--- a/saveload.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/saveload.c	Thu Mar 02 02:22:15 2006 +0000
@@ -29,7 +29,7 @@
 #include "variables.h"
 #include <setjmp.h>
 
-const uint16 SAVEGAME_VERSION = 21;
+const uint16 SAVEGAME_VERSION = 22;
 uint16 _sl_version;       /// the major savegame version identifier
 byte   _sl_minor_version; /// the minor savegame version, DO NOT USE!
 
--- a/settings.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/settings.c	Thu Mar 02 02:22:15 2006 +0000
@@ -15,6 +15,9 @@
 #include "console.h"
 #include "saveload.h"
 
+/** The patch values that are used for new games and/or modified in config file */
+Patches _patches_newgame;
+
 typedef struct IniFile IniFile;
 typedef struct IniItem IniItem;
 typedef struct IniGroup IniGroup;
@@ -1229,7 +1232,7 @@
 #endif /* WIN32 */
 
 	proc(ini, _gameopt_settings, "gameopt",  &_opt_newgame);
-	proc(ini, _patch_settings,   "patches",  &_patches);
+	proc(ini, _patch_settings,   "patches",  &_patches_newgame);
 	proc(ini, _currency_settings,"currency", &_custom_currency);
 
 #ifdef ENABLE_NETWORK
@@ -1276,7 +1279,7 @@
 	if (sd == NULL) return CMD_ERROR;
 
 	if (flags & DC_EXEC) {
-		Patches *patches_ptr = &_patches;
+		Patches *patches_ptr = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 		void *var = ini_get_variable(&sd->save, patches_ptr);
 		Write_ValidateSetting(var, sd, (int32)p2);
 
@@ -1303,6 +1306,11 @@
 	if (sd->save.conv & SLF_NETWORK_NO) {
 		void *var = ini_get_variable(&sd->save, object);
 		Write_ValidateSetting(var, sd, value);
+
+		if (_game_mode != GM_MENU) {
+		 void *var2 = ini_get_variable(&sd->save, &_patches_newgame);
+		 Write_ValidateSetting(var2, sd, value);
+		}
 	} else {
 		DoCommandP(0, index, value, NULL, CMD_CHANGE_PATCH_SETTING);
 	}
@@ -1336,7 +1344,7 @@
 	}
 
 	sscanf(value, "%d", &val);
-	patches_ptr = &_patches;
+	patches_ptr = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 	ptr = ini_get_variable(&sd->save, patches_ptr);
 
 	SetPatchValue(index, patches_ptr, val);
@@ -1362,7 +1370,7 @@
 		return;
 	}
 
-	ptr = ini_get_variable(&sd->save, &_patches);
+	ptr = ini_get_variable(&sd->save, (_game_mode == GM_MENU) ? &_patches_newgame : &_patches);
 
 	if (sd->desc.cmd == SDT_BOOLX) {
 		snprintf(value, sizeof(value), (*(bool*)ptr == 1) ? "on" : "off");
@@ -1439,6 +1447,20 @@
 	SaveSettings(_gameopt_settings, &_opt);
 }
 
+static void Load_PATS(void)
+{
+	/* Copy over default setting since some might not get loaded in
+	 * a networking environment. This ensures for example that the local
+	 * signal_side stays when joining a network-server */
+	_patches = _patches_newgame;
+	LoadSettings(_patch_settings, &_patches);
+}
+
+static void Save_PATS(void)
+{
+	SaveSettings(_patch_settings, &_patches);
+}
+
 void CheckConfig(void)
 {
 	// fix up news_display_opt from old to new
@@ -1453,12 +1475,21 @@
 
 	// Increase old default values for pf_maxdepth and pf_maxlength
 	// to support big networks.
-	if (_patches.pf_maxdepth == 16 && _patches.pf_maxlength == 512) {
-		_patches.pf_maxdepth = 48;
-		_patches.pf_maxlength = 4096;
+	if (_patches_newgame.pf_maxdepth == 16 && _patches_newgame.pf_maxlength == 512) {
+		_patches_newgame.pf_maxdepth = 48;
+		_patches_newgame.pf_maxlength = 4096;
 	}
 }
 
+void UpdatePatches(void)
+{
+	/* Since old(er) savegames don't have any patches saved, we initialise
+	 * them with the default values just as it was in the old days.
+	 * Also new games need this copying-over */
+	_patches = _patches_newgame; /* backwards compatibility */
+}
+
 const ChunkHandler _setting_chunk_handlers[] = {
-	{ 'OPTS', Save_OPTS, Load_OPTS, CH_RIFF | CH_LAST}
+	{ 'OPTS', Save_OPTS, Load_OPTS, CH_RIFF},
+	{ 'PATS', Save_PATS, Load_PATS, CH_RIFF | CH_LAST},
 };
--- a/settings_gui.c	Thu Mar 02 02:03:21 2006 +0000
+++ b/settings_gui.c	Thu Mar 02 02:22:15 2006 +0000
@@ -673,6 +673,8 @@
 	{_patches_ai,           lengthof(_patches_ai)},
 };
 
+extern Patches _patches_newgame;
+
 /** The main patches window. Shows a number of categories on top and
  * a selection of patches in that category.
  * Uses WP(w, def_d) macro - data_1, data_2, data_3 */
@@ -682,7 +684,7 @@
 
 	switch (e->event) {
 	case WE_CREATE:
-		patches_ptr = &_patches;
+		patches_ptr = (_game_mode == GM_MENU) ? &_patches_newgame : &_patches;
 		break;
 
 	case WE_PAINT: {