(svn r979) Allow more realistically sized catchment areas
authorCelestar
Wed, 08 Dec 2004 15:46:13 +0000
changeset 568 b0d0df062880
parent 567 e63b977925f7
child 569 1e1755ba1572
(svn r979) Allow more realistically sized catchment areas
ai.c
ai_new.c
airport_gui.c
dock_gui.c
gui.h
lang/english.txt
macros.h
misc_gui.c
rail_gui.c
road_gui.c
settings.c
settings_gui.c
station.h
station_cmd.c
variables.h
--- a/ai.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/ai.c	Wed Dec 08 15:46:13 2004 +0000
@@ -1530,6 +1530,7 @@
 	uint values[NUM_CARGO];
 	int w,h;
 	uint tile2;
+	int rad;
 
 	for(;p->mode != 4;p++) if (p->mode == 1) {
 		tile2 = TILE_ADD(tile, p->tileoffs);
@@ -1538,11 +1539,18 @@
 		h = ((p->attr>>4) & 7);
 		if (p->attr&1) intswap(w, h);
 
+
+		if (_patches.modified_catchment) {
+			rad = CA_TRAIN;
+		} else {
+			rad = 4;
+		}
+
 		if (cargo & 0x80) {
-			GetProductionAroundTiles(values, tile2, w, h);
+			GetProductionAroundTiles(values, tile2, w, h, rad);
 			return values[cargo & 0x7F] != 0;
 		} else {
-			GetAcceptanceAroundTiles(values, tile2, w, h);
+			GetAcceptanceAroundTiles(values, tile2, w, h, rad);
 			if (!(values[cargo] & ~7))
 				return false;
 			if (cargo != CT_MAIL)
@@ -2472,16 +2480,24 @@
 static bool AiCheckRoadResources(TileIndex tile, const AiDefaultBlockData *p, byte cargo)
 {
 	uint values[NUM_CARGO];
+	int rad;
+	
+	if (_patches.modified_catchment) {
+		rad = CA_TRUCK;		//Same as CA_BUS at the moment? 
+	} else {			//change that at some point?
+		rad = 4;
+	}
+	
 	for(;;p++) {
 		if (p->mode == 4) {
 			return true;
 		} else if (p->mode == 1) {
 			uint tile2 = TILE_ADD(tile, p->tileoffs);
 			if (cargo & 0x80) {
-				GetProductionAroundTiles(values, tile2, 1, 1);
+				GetProductionAroundTiles(values, tile2, 1, 1, rad);
 				return values[cargo & 0x7F] != 0;
 			} else {
-				GetAcceptanceAroundTiles(values, tile2, 1, 1);
+				GetAcceptanceAroundTiles(values, tile2, 1, 1, rad);
 				return (values[cargo]&~7) != 0;
 			}
 		}
@@ -3336,16 +3352,23 @@
 	uint values[NUM_CARGO];
 	int w,h;
 	uint tile2;
+	int rad;
+	
+	if (_patches.modified_catchment) {
+		rad = CA_AIR_LARGE;		//I Have NFI what airport the 
+	} else {				//AI is going to build here
+		rad = 4;
+	}
 
 	for(;p->mode==0;p++) {
 		tile2 = TILE_ADD(tile, p->tileoffs);
 		w = _airport_size_x[p->attr];
 		h = _airport_size_y[p->attr];
 		if (cargo & 0x80) {
-			GetProductionAroundTiles(values, tile2, w, h);
+			GetProductionAroundTiles(values, tile2, w, h, rad);
 			return values[cargo & 0x7F] != 0;
 		} else {
-			GetAcceptanceAroundTiles(values, tile2, w, h);
+			GetAcceptanceAroundTiles(values, tile2, w, h, rad);
 			return values[cargo] >= 8;
 		}
 	}
--- a/ai_new.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/ai_new.c	Wed Dec 08 15:46:13 2004 +0000
@@ -611,7 +611,8 @@
 	    		if (IS_TILETYPE(new_tile, MP_CLEAR) || IS_TILETYPE(new_tile, MP_TREES)) {
 	    			// This tile we can build on!
 	    			// Check acceptance
-	    			GetAcceptanceAroundTiles(accepts, new_tile, 1, 1);
+						// XXX - Get the catchment area
+	    			GetAcceptanceAroundTiles(accepts, new_tile, 1, 1, 4);
 	    			// >> 3 == 0 means no cargo
 	    			if (accepts[p->ainew.cargo] >> 3 == 0) continue;
 	    			// See if we can build the station
--- a/airport_gui.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/airport_gui.c	Wed Dec 08 15:46:13 2004 +0000
@@ -134,6 +134,8 @@
 
 static void BuildAirportPickerWndProc(Window *w, WindowEvent *e)
 {
+	int rad;
+	
 	switch(e->event) {
 	case WE_PAINT: {
 		int sel;
@@ -155,13 +157,28 @@
 		// select default the coverage area to 'Off' (8)
 		w->click_state = ((1<<3) << sel) | ((1<<8) << _station_show_coverage);
 		SetTileSelectSize(_airport_size_x[sel],_airport_size_y[sel]);
-		if (_station_show_coverage)	SetTileSelectBigSize(-4, -4, 8, 8);
+
+     if (_patches.modified_catchment) {
+       switch (sel) {
+         case AT_OILRIG: rad = CA_AIR_OILPAD; break;
+         case AT_HELIPORT: rad = CA_AIR_HELIPORT; break;
+         case AT_SMALL:    rad = CA_AIR_SMALL; break;
+         case AT_LARGE:    rad = CA_AIR_LARGE; break;
+         case AT_METROPOLITAN: rad = CA_AIR_METRO; break;
+         case AT_INTERNATIONAL: rad = CA_AIR_INTER; break;
+       }
+     } else {
+       rad = 4;
+     }
+
+	
+		if (_station_show_coverage)	SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
 
 		DrawWindowWidgets(w);
     // strings such as 'Size' and 'Coverage Area'
 		DrawStringCentered(74, 16, STR_305B_SIZE, 0);
 		DrawStringCentered(74, 78, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
-		DrawStationCoverageAreaText(2, 104, (uint)-1);
+		DrawStationCoverageAreaText(2, 104, (uint)-1, rad);
 		break;
 	}
 
--- a/dock_gui.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/dock_gui.c	Wed Dec 08 15:46:13 2004 +0000
@@ -2,6 +2,7 @@
 #include "ttd.h"
 #include "table/strings.h"
 #include "window.h"
+#include "station.h"
 #include "gui.h"
 #include "viewport.h"
 #include "gfx.h"
@@ -203,12 +204,21 @@
 
 static void BuildDockStationWndProc(Window *w, WindowEvent *e)
 {
+	int rad;
+	
 	switch(e->event) {
 	case WE_PAINT: {
 		if (WP(w,def_d).close)
 			return;
 		DrawWindowWidgets(w);
-		DrawStationCoverageAreaText(2, 15, (uint)-1);
+		//Add some code for the coverage area eariler or later!!
+		if (_patches.modified_catchment) {
+			rad = CA_DOCK;
+		} else {
+			rad = 4;
+		}
+		
+		DrawStationCoverageAreaText(2, 15, (uint)-1, rad);
 	} break;
 
 	case WE_CLICK: {
--- a/gui.h	Wed Dec 08 15:26:57 2004 +0000
+++ b/gui.h	Wed Dec 08 15:46:13 2004 +0000
@@ -78,7 +78,7 @@
 void ShowEstimatedCostOrIncome(int32 cost, int x, int y);
 void ShowErrorMessage(StringID msg_1, StringID msg_2, int x, int y);
 
-void DrawStationCoverageAreaText(int sx, int sy, uint mask);
+void DrawStationCoverageAreaText(int sx, int sy, uint mask,int rad);
 void CheckRedrawStationCoverage(Window *w);
 
 void ShowSmallMap();
--- a/lang/english.txt	Wed Dec 08 15:26:57 2004 +0000
+++ b/lang/english.txt	Wed Dec 08 15:46:13 2004 +0000
@@ -973,6 +973,7 @@
 STR_CONFIG_PATCHES_ON					:On
 STR_CONFIG_PATCHES_VEHICLESPEED			:{LTBLUE}Show vehicle speed in status bar: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_BUILDONSLOPES		:{LTBLUE}Allow building on slopes and coasts: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_CATCHMENT			:{LTBLUE}Allow more realistically sized catchment areas: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_EXTRADYNAMITE		:{LTBLUE}Allow removal of more town-owned roads, bridges, tunnels, etc: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_MAMMOTHTRAINS		:{LTBLUE}Enable building very long trains: {ORANGE}{STRING}
 STR_CONFIG_PATCHES_REALISTICACCEL		:{LTBLUE}Enable realistic acceleration for trains: {ORANGE}{STRING}
--- a/macros.h	Wed Dec 08 15:26:57 2004 +0000
+++ b/macros.h	Wed Dec 08 15:46:13 2004 +0000
@@ -173,6 +173,16 @@
 #define CHANCE16R(a,b,r) ((uint16)(r=Random()) <= (uint16)((65536 * a) / b))
 #define CHANCE16I(a,b,v) ((uint16)(v) <= (uint16)((65536 * a) / b))
 
+#define FIND_CATCHMENT_RADIUS(st,rad)           \
+	{\
+	if (st->bus_tile || st->lorry_tile || (st->airport_tile && st->airport_type == AT_OILRIG)) rad = 3;             \
+	if (st->train_tile || (st->airport_tile && (st->airport_type == AT_HELIPORT || st->airport_type == AT_SMALL))) rad = 4;        \
+	if (st->dock_tile || (st->airport_tile && st->airport_type == AT_LARGE)) rad = 5;               \
+	if (st->airport_tile && st->airport_type == AT_METROPOLITAN) rad = 6;                           \
+	if (st->airport_tile && st->airport_type == AT_INTERNATIONAL) rad = 8;          }
+
+
+
 #define BEGIN_TILE_LOOP(var,w,h,tile)		\
 		{int h_cur = h;									\
 		uint var = tile;									\
--- a/misc_gui.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/misc_gui.c	Wed Dec 08 15:46:13 2004 +0000
@@ -640,12 +640,12 @@
 	DrawStringMultiLine(str_x, str_y, STR_SPEC_USERSTRING, 144);
 }
 
-void DrawStationCoverageAreaText(int sx, int sy, uint mask) {
+void DrawStationCoverageAreaText(int sx, int sy, uint mask, int rad) {
 	int x = _thd.pos.x;
 	int y = _thd.pos.y;
 	uint accepts[NUM_CARGO];
 	if (x != -1) {
-		GetAcceptanceAroundTiles(accepts, TILE_FROM_XY(x,y), _thd.new_size.x >> 4, _thd.new_size.y >> 4);
+		GetAcceptanceAroundTiles(accepts, TILE_FROM_XY(x,y), _thd.new_size.x >> 4, _thd.new_size.y >> 4, rad);
 		DrawStationCoverageText(accepts, sx, sy, mask);
 	}
 }
--- a/rail_gui.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/rail_gui.c	Wed Dec 08 15:46:13 2004 +0000
@@ -849,6 +849,7 @@
 }
 
 static void StationBuildWndProc(Window *w, WindowEvent *e) {
+	int rad;
 	switch(e->event) {
 	case WE_PAINT: {
 		uint bits;
@@ -876,8 +877,15 @@
 				SetTileSelectSize(x, y);
 		}
 
+       if (_patches.modified_catchment) {
+         rad = CA_TRAIN;
+       } else {
+         rad = 4;
+       }
+
+
 		if (_station_show_coverage)
-			SetTileSelectBigSize(-4, -4, 8, 8);
+			SetTileSelectBigSize(-rad, -rad, 2 * rad, 2 * rad);
 
 		DrawWindowWidgets(w);
 
@@ -889,7 +897,7 @@
 		DrawStringCentered(74, 101, STR_3004_PLATFORM_LENGTH, 0);
 		DrawStringCentered(74, 141, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
 
-		DrawStationCoverageAreaText(2, 166, (uint)-1);
+		DrawStationCoverageAreaText(2, 166, (uint)-1, rad);
 	} break;
 
 	case WE_CLICK: {
--- a/road_gui.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/road_gui.c	Wed Dec 08 15:46:13 2004 +0000
@@ -7,6 +7,9 @@
 #include "gfx.h"
 #include "sound.h"
 #include "command.h"
+//needed for catchments
+#include "station.h"
+
 
 static void ShowBusStationPicker();
 static void ShowTruckStationPicker();
@@ -400,6 +403,9 @@
 }
 
 static void RoadStationPickerWndProc(Window *w, WindowEvent *e) {
+
+	int rad;
+	
 	switch(e->event) {
 	case WE_PAINT: {
 		int image;
@@ -409,8 +415,15 @@
 		DrawWindowWidgets(w);
 
 		SetTileSelectSize(1, 1);
+		
+		if (_patches.modified_catchment) {
+			rad = CA_TRUCK; // = CA_BUS
+		} else {
+			rad = 4;
+		}
+		
 		if (_station_show_coverage)
-			SetTileSelectBigSize(-4, -4, 8, 8);
+			SetTileSelectBigSize(-rad, -rad, 2*rad, 2*rad);
 
 		image = (w->window_class == WC_BUS_STATION) ? 0x47 : 0x43;
 
@@ -421,8 +434,8 @@
 
 		DrawStringCentered(70, 120, STR_3066_COVERAGE_AREA_HIGHLIGHT, 0);
 		DrawStationCoverageAreaText(2, 146,
-			((w->window_class == WC_BUS_STATION) ? (1<<CT_PASSENGERS) : ~(1<<CT_PASSENGERS))
-		);
+			((w->window_class == WC_BUS_STATION) ? (1<<CT_PASSENGERS) : ~(1<<CT_PASSENGERS)),
+			3);
 
 	} break;
 
--- a/settings.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/settings.c	Wed Dec 08 15:46:13 2004 +0000
@@ -795,6 +795,8 @@
 	{"join_stations",				SDT_BOOL,		(void*)true,	&_patches.join_stations,				NULL},
 	{"station_spread",			SDT_UINT8,	(void*)12,		&_patches.station_spread,				NULL},
 	{"full_load_any",				SDT_BOOL,		(void*)true,	&_patches.full_load_any,				NULL},
+	{"modified_catchment", SDT_BOOL, (void*)true, &_patches.modified_catchment},
+
 
 	{"inflation",						SDT_BOOL,		(void*)true,	&_patches.inflation,						NULL},
 	{"selectgoods",					SDT_BOOL,		(void*)true,	&_patches.selectgoods,					NULL},
--- a/settings_gui.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/settings_gui.c	Wed Dec 08 15:46:13 2004 +0000
@@ -640,6 +640,8 @@
 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NONUNIFORM_STATIONS, &_patches.nonuniform_stations,		0,  0,  0, NULL},
 	{PE_UINT8,	0, STR_CONFIG_PATCHES_STATION_SPREAD,		&_patches.station_spread,						4, 64,  1, NULL},
 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SERVICEATHELIPAD, &_patches.serviceathelipad,					0,  0,  0, NULL},
+	{PE_BOOL, 0, STR_CONFIG_PATCHES_CATCHMENT, &_patches.modified_catchment},
+
 };
 
 static const PatchEntry _patches_economy[] = {
--- a/station.h	Wed Dec 08 15:26:57 2004 +0000
+++ b/station.h	Wed Dec 08 15:46:13 2004 +0000
@@ -73,6 +73,19 @@
 	HVOT_BUOY = 1 << 6
 };
 
+enum {
+	CA_BUS = 3,
+	CA_TRUCK = 3,
+	CA_AIR_OILPAD = 3,
+	CA_TRAIN = 4,
+	CA_AIR_HELIPORT = 4,
+	CA_AIR_SMALL = 4,
+	CA_AIR_LARGE = 5,
+	CA_DOCK = 5,
+	CA_AIR_METRO = 6, 
+	CA_AIR_INTER = 8,
+}; 
+
 void ModifyStationRatingAround(TileIndex tile, byte owner, int amount, uint radius);
 
 TileIndex GetStationTileForVehicle(Vehicle *v, Station *st);
@@ -88,8 +101,8 @@
 #define FOR_ALL_STATIONS(st) for(st=_stations; st != endof(_stations); st++)
 
 
-void GetProductionAroundTiles(uint *produced, uint tile, int w, int h);
-void GetAcceptanceAroundTiles(uint *accepts, uint tile, int w, int h);
+void GetProductionAroundTiles(uint *produced, uint tile, int w, int h, int rad);
+void GetAcceptanceAroundTiles(uint *accepts, uint tile, int w, int h, int rad);
 uint GetStationPlatforms(Station *st, uint tile);
 
 
--- a/station_cmd.c	Wed Dec 08 15:26:57 2004 +0000
+++ b/station_cmd.c	Wed Dec 08 15:46:13 2004 +0000
@@ -376,7 +376,7 @@
 }
 
 // Get a list of the cargo types being produced around the tile.
-void GetProductionAroundTiles(uint *produced, uint tile, int w, int h)
+void GetProductionAroundTiles(uint *produced, uint tile, int w, int h, int rad)
 {
 	int x,y;
 	int x1,y1,x2,y2;
@@ -390,11 +390,11 @@
 
 	// expand the region by 4 tiles on each side
 	// while making sure that we remain inside the board.
-	x2 = min(x + w+4, TILE_X_MAX+1);
-	x1 = max(x-4, 0);
-
-	y2 = min(y + h+4, TILE_Y_MAX+1);
-	y1 = max(y-4, 0);
+	x2 = min(x + w + rad, TILE_X_MAX+1);
+	x1 = max(x-rad, 0);
+
+	y2 = min(y + h + rad, TILE_Y_MAX+1);
+	y1 = max(y-rad, 0);
 
 	assert(x1 < x2);
 	assert(y1 < y2);
@@ -425,7 +425,7 @@
 }
 
 // Get a list of the cargo types that are accepted around the tile.
-void GetAcceptanceAroundTiles(uint *accepts, uint tile, int w, int h)
+void GetAcceptanceAroundTiles(uint *accepts, uint tile, int w, int h, int rad)
 {
 	int x,y;
 	int x1,y1,x2,y2;
@@ -438,10 +438,10 @@
 
 	// expand the region by 4 tiles on each side
 	// while making sure that we remain inside the board.
-	x2 = min(x + w + 4, TILE_X_MAX+1);
-	y2 = min(y + h + 4, TILE_Y_MAX+1);
-	x1 = max(x-4, 0);
-	y1 = max(y-4, 0);
+	x2 = min(x + w + rad, TILE_X_MAX+1);
+	y2 = min(y + h + rad, TILE_Y_MAX+1);
+	x1 = max(x-rad, 0);
+	y1 = max(y-rad, 0);
 
 	assert(x1 < x2);
 	assert(y1 < y2);
@@ -473,6 +473,7 @@
 	TileIndex span[1+1+2+2+1];
 	int i;
 	int min_x, min_y, max_x, max_y;
+	int rad = 4;	//Put this to surpress a compiler warning
 	uint accepts[NUM_CARGO];
 
 	// Don't update acceptance for a buoy
@@ -509,10 +510,15 @@
 			max_y = max(max_y,GET_TILE_Y(tile));
 		}
 	}
+	if (_patches.modified_catchment) {
+		FIND_CATCHMENT_RADIUS(st,rad)
+	} else {
+		rad = 4;
+	}
 
 	// And retrieve the acceptance.
 	if (max_x != 0) {
-		GetAcceptanceAroundTiles(accepts, TILE_XY(min_x, min_y), max_x - min_x + 1, max_y-min_y+1);
+		GetAcceptanceAroundTiles(accepts, TILE_XY(min_x, min_y), max_x - min_x + 1, max_y-min_y+1,rad);
 	} else {
 		memset(accepts, 0, sizeof(accepts));
 	}
@@ -2451,13 +2457,29 @@
 	uint best_rating, best_rating2;
 	Station *st1, *st2;
 	int t;
+	int rad=0;
+	int w_prod=0, h_prod=0; //width and height of the "producer" of the cargo
+	int x_min_prod, x_max_prod;     //min and max coordinates of the producer
+	int y_min_prod, y_max_prod;     //relative
+	int x_dist, y_dist;
+	int max_rad;
+
 
 	memset(around, 0xff, sizeof(around));
 
-	w += 8;
-	h += 8;
-
-	BEGIN_TILE_LOOP(cur_tile, w, h, tile - TILE_XY(4,4))
+	if (_patches.modified_catchment) {
+		w_prod = w;
+		h_prod = h;
+		w += 16;
+		h += 16;
+		max_rad = 8;
+	} else {
+ 		w += 8;
+ 		h += 8;
+		max_rad = 4;
+	}
+
+	BEGIN_TILE_LOOP(cur_tile, w, h, tile - TILE_XY(max_rad,max_rad))
 		cur_tile = TILE_MASK(cur_tile);
 		if (IS_TILETYPE(cur_tile, MP_STATION)) {
 			st_index = _map2[cur_tile];
@@ -2470,16 +2492,43 @@
 							(!_patches.selectgoods || st->goods[type].last_speed) && // if last_speed is 0, no vehicle has been there.
 							((st->facilities & (byte)~FACIL_BUS_STOP)!=0 || type==CT_PASSENGERS) && // if we have other fac. than a bus stop, or the cargo is passengers
 							((st->facilities & (byte)~FACIL_TRUCK_STOP)!=0 || type!=CT_PASSENGERS)) { // if we have other fac. than a cargo bay or the cargo is not passengers
-
-						around[i] = st_index;
-						around_ptr[i] = st;
-					}
+								if (_patches.modified_catchment) {
+									FIND_CATCHMENT_RADIUS(st,rad)
+									x_min_prod = y_min_prod = 9;
+									x_max_prod = 8 + w_prod;
+									y_max_prod = 8 + h_prod;
+		
+									x_dist = min(w_cur - x_min_prod, x_max_prod - w_cur);
+		
+									if (w_cur < x_min_prod) {
+										x_dist = x_min_prod - w_cur;
+									} else {        //save cycles
+										if (w_cur > x_max_prod) x_dist = w_cur - x_max_prod;
+									}
+		
+									y_dist = min(h_cur - y_min_prod, y_max_prod - h_cur);
+									if (h_cur < y_min_prod) {
+										y_dist = y_min_prod - h_cur;
+									} else {
+										if (h_cur > y_max_prod) y_dist = h_cur - y_max_prod;
+									}
+		
+								} else {
+									x_dist = y_dist = 0;
+								}
+		
+								if ( !(x_dist > rad) && !(y_dist > rad) ) {
+
+									around[i] = st_index;
+									around_ptr[i] = st;
+								}
+							}
 					break;
 				} else if (around[i] == st_index)
 					break;
 			}
 		}
-	END_TILE_LOOP(cur_tile, w, h, tile - TILE_XY(4,4))
+	END_TILE_LOOP(cur_tile, w, h, tile - TILE_XY(max_rad, max_rad))
 
 	/* no stations around at all? */
 	if (around[0] == 0xFF)
--- a/variables.h	Wed Dec 08 15:26:57 2004 +0000
+++ b/variables.h	Wed Dec 08 15:46:13 2004 +0000
@@ -82,6 +82,7 @@
 // ********* END OF SAVE REGION
 
 typedef struct Patches {
+	bool modified_catchment;	//different-size catchment areas
 	bool vehicle_speed;			// show vehicle speed
 	bool build_on_slopes;		// allow building on slopes
 	bool mammoth_trains;		// allow very long trains