src/openttd.cpp
branchgamebalance
changeset 9912 1ac8aac92385
parent 9911 0b8b245a2391
child 9913 e79cd19772dd
--- a/src/openttd.cpp	Wed Jun 13 11:45:14 2007 +0000
+++ b/src/openttd.cpp	Wed Jun 13 12:05:56 2007 +0000
@@ -64,6 +64,7 @@
 #include "newgrf_commons.h"
 #include "player_face.h"
 #include "group.h"
+#include "blitter/blitter.hpp"
 
 #include "bridge_map.h"
 #include "clear_map.h"
@@ -85,6 +86,8 @@
 extern Player* DoStartupNewPlayer(bool is_ai);
 extern void ShowOSErrorBox(const char *buf);
 
+const char *_default_blitter = "8bpp-optimzed";
+
 /* TODO: usrerror() for errors which are not of an internal nature but
  * caused by the user, i.e. missing files or fatal configuration errors.
  * Post-0.4.0 since Celestar doesn't want this in SVN before. --pasky */
@@ -159,6 +162,7 @@
 		"  -v drv              = Set video driver (see below)\n"
 		"  -s drv              = Set sound driver (see below) (param bufsize,hz)\n"
 		"  -m drv              = Set music driver (see below)\n"
+		"  -b drv              = Set the blitter to use (see below)\n"
 		"  -r res              = Set resolution (for instance 800x600)\n"
 		"  -h                  = Display this help text\n"
 		"  -t year             = Set starting year\n"
@@ -183,6 +187,9 @@
 
 	p = GetDriverList(p, lastof(buf));
 
+	/* List the blitters */
+	p = BlitterFactoryBase::GetBlittersInfo(p, lastof(buf));
+
 	/* ShowInfo put output to stderr, but version information should go
 	 * to stdout; this is the only exception */
 #if !defined(WIN32) && !defined(WIN64)
@@ -350,7 +357,7 @@
 {
 	int i;
 	const char *optformat;
-	char musicdriver[32], sounddriver[32], videodriver[32];
+	char musicdriver[32], sounddriver[32], videodriver[32], blitter[32];
 	int resolution[2] = {0, 0};
 	Year startyear = INVALID_YEAR;
 	uint generation_seed = GENERATE_NEW_SEED;
@@ -364,7 +371,7 @@
 	uint16 dedicated_port = 0;
 #endif /* ENABLE_NETWORK */
 
-	musicdriver[0] = sounddriver[0] = videodriver[0] = '\0';
+	musicdriver[0] = sounddriver[0] = videodriver[0] = blitter[0] = '\0';
 
 	_game_mode = GM_MENU;
 	_switch_mode = SM_MENU;
@@ -376,7 +383,7 @@
 	 *   a letter means: it accepts that param (e.g.: -h)
 	 *   a ':' behind it means: it need a param (e.g.: -m<driver>)
 	 *   a '::' behind it means: it can optional have a param (e.g.: -d<debug>) */
-	optformat = "m:s:v:hD::n::eit:d::r:g::G:c:xl:"
+	optformat = "m:s:v:b:hD::n::eit:d::r:g::G:c:xl:"
 #if !defined(__MORPHOS__) && !defined(__AMIGA__) && !defined(WIN32)
 		"f"
 #endif
@@ -389,6 +396,7 @@
 		case 'm': ttd_strlcpy(musicdriver, mgo.opt, sizeof(musicdriver)); break;
 		case 's': ttd_strlcpy(sounddriver, mgo.opt, sizeof(sounddriver)); break;
 		case 'v': ttd_strlcpy(videodriver, mgo.opt, sizeof(videodriver)); break;
+		case 'b': ttd_strlcpy(blitter, mgo.opt, sizeof(blitter)); break;
 #if defined(ENABLE_NETWORK)
 		case 'D':
 			strcpy(musicdriver, "null");
@@ -461,6 +469,7 @@
 	if (!StrEmpty(musicdriver)) ttd_strlcpy(_ini_musicdriver, musicdriver, sizeof(_ini_musicdriver));
 	if (!StrEmpty(sounddriver)) ttd_strlcpy(_ini_sounddriver, sounddriver, sizeof(_ini_sounddriver));
 	if (!StrEmpty(videodriver)) ttd_strlcpy(_ini_videodriver, videodriver, sizeof(_ini_videodriver));
+	if (StrEmpty(blitter)) ttd_strlcpy(blitter, _default_blitter, sizeof(blitter));
 	if (resolution[0] != 0) { _cur_resolution[0] = resolution[0]; _cur_resolution[1] = resolution[1]; }
 	if (startyear != INVALID_YEAR) _patches_newgame.starting_year = startyear;
 	if (generation_seed != GENERATE_NEW_SEED) _patches_newgame.generation_seed = generation_seed;
@@ -500,6 +509,9 @@
 	/* Initialize game palette */
 	GfxInitPalettes();
 
+	DEBUG(misc, 1, "Loading blitter '%s'...", blitter);
+	if (BlitterFactoryBase::SelectBlitter(blitter) == NULL)
+		error("Failed to select requested blitter '%s'; does it exist?", blitter);
 	DEBUG(driver, 1, "Loading drivers...");
 	LoadDriver(SOUND_DRIVER, _ini_sounddriver);
 	LoadDriver(MUSIC_DRIVER, _ini_musicdriver);
@@ -991,8 +1003,8 @@
 		Window *w = FindWindowById(WC_MAIN_WINDOW, 0);
 		assert(w);
 
-		WP(w,vp_d).scrollpos_x += ScaleByZoom(x, w->viewport->zoom);
-		WP(w,vp_d).scrollpos_y += ScaleByZoom(y, w->viewport->zoom);
+		WP(w,vp_d).dest_scrollpos_x += ScaleByZoom(x, w->viewport->zoom);
+		WP(w,vp_d).dest_scrollpos_y += ScaleByZoom(y, w->viewport->zoom);
 	}
 }
 
@@ -1284,6 +1296,8 @@
 
 	WP(w,vp_d).scrollpos_x = _saved_scrollpos_x;
 	WP(w,vp_d).scrollpos_y = _saved_scrollpos_y;
+	WP(w,vp_d).dest_scrollpos_x = _saved_scrollpos_x;
+	WP(w,vp_d).dest_scrollpos_y = _saved_scrollpos_y;
 
 	vp = w->viewport;
 	vp->zoom = _saved_scrollpos_zoom;
@@ -1444,6 +1458,7 @@
 
 	if (CheckSavegameVersion(61)) {
 		/* Added the RoadType */
+		bool old_bridge = CheckSavegameVersion(42);
 		for (TileIndex t = 0; t < map_size; t++) {
 			switch(GetTileType(t)) {
 				case MP_STREET:
@@ -1468,7 +1483,9 @@
 					break;
 
 				case MP_TUNNELBRIDGE:
-					if ((IsTunnel(t) ? GetTunnelTransportType(t) : GetBridgeTransportType(t)) == TRANSPORT_ROAD) {
+					/* Middle part of "old" bridges */
+					if (old_bridge && IsBridgeTile(t) && HASBIT(_m[t].m5, 6)) break;
+					if ((IsTunnel(t) ? GetTunnelTransportType(t) : (old_bridge ? (TransportType)GB(_m[t].m5, 1, 2) : GetBridgeTransportType(t))) == TRANSPORT_ROAD) {
 						SetRoadTypes(t, ROADTYPES_ROAD);
 					}
 					break;
@@ -1659,10 +1676,10 @@
 				case MP_RAILWAY:
 					if (HasSignals(t)) {
 						/* convert PBS signals to combo-signals */
-						if (HASBIT(_m[t].m2, 2)) SetSignalType(t, SIGTYPE_COMBO);
+						if (HASBIT(_m[t].m2, 2)) SetSignalType(t, TRACK_X, SIGTYPE_COMBO);
 
 						/* move the signal variant back */
-						SetSignalVariant(t, HASBIT(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
+						SetSignalVariant(t, TRACK_X, HASBIT(_m[t].m2, 3) ? SIG_SEMAPHORE : SIG_ELECTRIC);
 						CLRBIT(_m[t].m2, 3);
 					}
 
@@ -1716,7 +1733,10 @@
 
 	if (CheckSavegameVersion(34)) FOR_ALL_PLAYERS(p) ResetPlayerLivery(p);
 
-	FOR_ALL_PLAYERS(p) p->avail_railtypes = GetPlayerRailtypes(p->index);
+	FOR_ALL_PLAYERS(p) {
+		p->avail_railtypes = GetPlayerRailtypes(p->index);
+		p->avail_roadtypes = GetPlayerRoadtypes(p->index);
+	}
 
 	if (!CheckSavegameVersion(27)) AfterLoadStations();
 
@@ -1773,7 +1793,7 @@
 		FOR_ALL_INDUSTRIES(i) {
 			uint j;
 
-			if (i->type == IT_FARM || i->type == IT_FARM_2) {
+			if (GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_PLANT_ON_BUILT) {
 				for (j = 0; j != 50; j++) PlantRandomFarmField(i);
 			}
 		}
@@ -1993,6 +2013,18 @@
 		_opt.diff.number_towns++;
 	}
 
+	if (CheckSavegameVersion(64)) {
+		/* copy the signal type/variant and move signal states bits */
+		for (TileIndex t = 0; t < map_size; t++) {
+			if (IsTileType(t, MP_RAILWAY) && HasSignals(t)) {
+				SetSignalStates(t, GB(_m[t].m2, 4, 4));
+				SetSignalVariant(t, INVALID_TRACK, GetSignalVariant(t, TRACK_X));
+				SetSignalType(t, INVALID_TRACK, GetSignalType(t, TRACK_X));
+				CLRBIT(_m[t].m2, 7);
+			}
+		}
+	}
+
 	/* Recalculate */
 	Group *g;
 	FOR_ALL_GROUPS(g) {
@@ -2006,7 +2038,7 @@
 		}
 	}
 
-	if (CheckSavegameVersion(62)) {
+	if (CheckSavegameVersion(65)) {
 		Town *t;
 		FOR_ALL_TOWNS(t) t->SetActivity(1);
 	}