settings_gui.c
changeset 625 40c83b088bb8
parent 579 e977d17c89b1
child 629 4bb1f0fb0109
equal deleted inserted replaced
624:f834e073c2dc 625:40c83b088bb8
     7 #include "command.h"
     7 #include "command.h"
     8 #include "engine.h"
     8 #include "engine.h"
     9 #include "screenshot.h"
     9 #include "screenshot.h"
    10 #include "newgrf.h"
    10 #include "newgrf.h"
    11 #include "network.h"
    11 #include "network.h"
       
    12 #include "console.h"
    12 
    13 
    13 static uint32 _difficulty_click_a;
    14 static uint32 _difficulty_click_a;
    14 static uint32 _difficulty_click_b;
    15 static uint32 _difficulty_click_b;
    15 static byte _difficulty_timeout;
    16 static byte _difficulty_timeout;
    16 
    17 
   556 
   557 
   557 typedef struct PatchEntry {
   558 typedef struct PatchEntry {
   558 	byte type;										// type of selector
   559 	byte type;										// type of selector
   559 	byte flags;										// selector flags
   560 	byte flags;										// selector flags
   560 	StringID str;									// string with descriptive text
   561 	StringID str;									// string with descriptive text
       
   562 	char console_name[40];				// the name this patch has in console
   561 	void *variable;								// pointer to the variable
   563 	void *variable;								// pointer to the variable
   562 	int32 min,max;								// range for spinbox setting
   564 	int32 min,max;								// range for spinbox setting
   563 	uint32 step;									// step for spinbox
   565 	uint32 step;									// step for spinbox
   564 	PatchButtonClick *click_proc;	// callback procedure
   566 	PatchButtonClick *click_proc;	// callback procedure
   565 } PatchEntry;
   567 } PatchEntry;
   577 	PF_MULTISTRING	= 4,
   579 	PF_MULTISTRING	= 4,
   578 	PF_PLAYERBASED	= 8, // This has to match the entries that are in settings.c, patch_player_settings
   580 	PF_PLAYERBASED	= 8, // This has to match the entries that are in settings.c, patch_player_settings
   579 };
   581 };
   580 
   582 
   581 static const PatchEntry _patches_ui[] = {
   583 static const PatchEntry _patches_ui[] = {
   582 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_VEHICLESPEED,			&_patches.vehicle_speed,						0,  0,  0, NULL},
   584 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_VEHICLESPEED,		"vehicle_speed",		&_patches.vehicle_speed,						0,  0,  0, NULL},
   583 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_LONGDATE,					&_patches.status_long_date,					0,  0,  0, NULL},
   585 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_LONGDATE,				"long_date",				&_patches.status_long_date,					0,  0,  0, NULL},
   584 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_SHOWFINANCES,			&_patches.show_finances,						0,  0,  0, NULL},
   586 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_SHOWFINANCES,		"show_finances",		&_patches.show_finances,						0,  0,  0, NULL},
   585 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_AUTOSCROLL,				&_patches.autoscroll,								0,  0,  0, NULL},
   587 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_AUTOSCROLL,			"autoscroll",				&_patches.autoscroll,								0,  0,  0, NULL},
   586 
   588 
   587 	{PE_UINT8,	PF_PLAYERBASED, STR_CONFIG_PATCHES_ERRMSG_DURATION,	&_patches.errmsg_duration,					0, 20,  1, NULL},
   589 	{PE_UINT8,	PF_PLAYERBASED, STR_CONFIG_PATCHES_ERRMSG_DURATION,	"errmsg_duration",	&_patches.errmsg_duration,					0, 20,  1, NULL},
   588 
   590 
   589 	{PE_UINT8,	PF_MULTISTRING | PF_PLAYERBASED, STR_CONFIG_PATCHES_TOOLBAR_POS, &_patches.toolbar_pos,			0,  2,  1, &v_PositionMainToolbar},
   591 	{PE_UINT8,	PF_MULTISTRING | PF_PLAYERBASED, STR_CONFIG_PATCHES_TOOLBAR_POS, "toolbar_pos", &_patches.toolbar_pos,			0,  2,  1, &v_PositionMainToolbar},
   590 	{PE_UINT8,	PF_0ISDIS | PF_PLAYERBASED, STR_CONFIG_PATCHES_SNAP_RADIUS, &_patches.window_snap_radius,     1, 32,  1, NULL},
   592 	{PE_UINT8,	PF_0ISDIS | PF_PLAYERBASED, STR_CONFIG_PATCHES_SNAP_RADIUS, "window_snap_radius", &_patches.window_snap_radius,     1, 32,  1, NULL},
   591 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_INVISIBLE_TREES,	&_patches.invisible_trees,					0,  1,  1, &InvisibleTreesActive},
   593 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_INVISIBLE_TREES,	"invisible_trees", &_patches.invisible_trees,					0,  1,  1, &InvisibleTreesActive},
   592 };
   594 };
   593 
   595 
   594 static const PatchEntry _patches_construction[] = {
   596 static const PatchEntry _patches_construction[] = {
   595 	{PE_BOOL,		0, STR_CONFIG_PATCHES_BUILDONSLOPES,		&_patches.build_on_slopes,					0,  0,  0, NULL},
   597 	{PE_BOOL,		0, STR_CONFIG_PATCHES_BUILDONSLOPES,		"build_on_slopes",	&_patches.build_on_slopes,					0,  0,  0, NULL},
   596 	{PE_BOOL,		0, STR_CONFIG_PATCHES_EXTRADYNAMITE,		&_patches.extra_dynamite,						0,  0,  0, NULL},
   598 	{PE_BOOL,		0, STR_CONFIG_PATCHES_EXTRADYNAMITE,		"extra_dynamite",		&_patches.extra_dynamite,						0,  0,  0, NULL},
   597 	{PE_BOOL,		0, STR_CONFIG_PATCHES_LONGBRIDGES,			&_patches.longbridges,							0,  0,  0, NULL},
   599 	{PE_BOOL,		0, STR_CONFIG_PATCHES_LONGBRIDGES,			"long_bridges",			&_patches.longbridges,							0,  0,  0, NULL},
   598 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SIGNALSIDE,				&_patches.signal_side,							0,  0,  0, NULL},
   600 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SIGNALSIDE,				"signal_side",			&_patches.signal_side,							0,  0,  0, NULL},
   599 
   601 
   600 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SMALL_AIRPORTS,		&_patches.always_small_airport,			0,  0,  0, NULL},
   602 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SMALL_AIRPORTS,		"always_small_airport", &_patches.always_small_airport,			0,  0,  0, NULL},
   601 	{PE_UINT8,	PF_PLAYERBASED, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY, &_patches.drag_signals_density, 1, 20,  1, NULL},
   603 	{PE_UINT8,	PF_PLAYERBASED, STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY, "drag_signals_density", &_patches.drag_signals_density, 1, 20,  1, NULL},
   602 
   604 
   603 };
   605 };
   604 
   606 
   605 static const PatchEntry _patches_vehicles[] = {
   607 static const PatchEntry _patches_vehicles[] = {
   606 	{PE_BOOL,		0, STR_CONFIG_PATCHES_REALISTICACCEL,		&_patches.realistic_acceleration,		0,  0,  0, NULL},
   608 	{PE_BOOL,		0, STR_CONFIG_PATCHES_REALISTICACCEL,		"realistic_acceleration", &_patches.realistic_acceleration,		0,  0,  0, NULL},
   607 	{PE_BOOL,		0, STR_CONFIG_PATCHES_MAMMOTHTRAINS,		&_patches.mammoth_trains,						0,  0,  0, NULL},
   609 	{PE_BOOL,		0, STR_CONFIG_PATCHES_MAMMOTHTRAINS,		"mammoth_trains", &_patches.mammoth_trains,						0,  0,  0, NULL},
   608 	{PE_BOOL,		0, STR_CONFIG_PATCHES_GOTODEPOT,				&_patches.gotodepot,								0,  0,  0, NULL},
   610 	{PE_BOOL,		0, STR_CONFIG_PATCHES_GOTODEPOT,				"goto_depot", &_patches.gotodepot,								0,  0,  0, NULL},
   609 	{PE_BOOL,		0, STR_CONFIG_PATCHES_ROADVEH_QUEUE,		&_patches.roadveh_queue,						0,  0,  0, NULL},
   611 	{PE_BOOL,		0, STR_CONFIG_PATCHES_ROADVEH_QUEUE,		"roadveh_queue", &_patches.roadveh_queue,						0,  0,  0, NULL},
   610 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEW_DEPOT_FINDING,&_patches.new_depot_finding,				0,  0,  0, NULL},
   612 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEW_DEPOT_FINDING,"depot_finding", &_patches.new_depot_finding,				0,  0,  0, NULL},
   611 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEW_TRAIN_PATHFIND,				&_patches.new_pathfinding,	0,  0,  0, NULL},
   613 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEW_TRAIN_PATHFIND,"new_pathfinding", &_patches.new_pathfinding,	0,  0,  0, NULL},
   612 
   614 
   613 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_WARN_INCOME_LESS, &_patches.train_income_warn,				0,  0,  0, NULL},
   615 	{PE_BOOL,		PF_PLAYERBASED, STR_CONFIG_PATCHES_WARN_INCOME_LESS, "train_income_warn", &_patches.train_income_warn,				0,  0,  0, NULL},
   614 	{PE_UINT8,	PF_MULTISTRING | PF_PLAYERBASED, STR_CONFIG_PATCHES_ORDER_REVIEW,&_patches.order_review_system,0,2,  1, NULL},
   616 	{PE_UINT8,	PF_MULTISTRING | PF_PLAYERBASED, STR_CONFIG_PATCHES_ORDER_REVIEW, "order_review_system", &_patches.order_review_system,0,2,  1, NULL},
   615 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES,		&_patches.never_expire_vehicles,0,0,0, NULL},
   617 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES, "never_expire_vehicles", &_patches.never_expire_vehicles,0,0,0, NULL},
   616 
   618 
   617 	{PE_UINT16, PF_0ISDIS | PF_PLAYERBASED, STR_CONFIG_PATCHES_LOST_TRAIN_DAYS, &_patches.lost_train_days,	180,720, 60, NULL},
   619 	{PE_UINT16, PF_0ISDIS | PF_PLAYERBASED, STR_CONFIG_PATCHES_LOST_TRAIN_DAYS, "lost_train_days", &_patches.lost_train_days,	180,720, 60, NULL},
   618 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AUTORENEW_VEHICLE,&_patches.autorenew,								0,  0,  0, NULL},
   620 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AUTORENEW_VEHICLE,"autorenew", &_patches.autorenew,								0,  0,  0, NULL},
   619 	{PE_INT16,	0, STR_CONFIG_PATCHES_AUTORENEW_MONTHS, &_patches.autorenew_months,				-12, 12,  1, NULL},
   621 	{PE_INT16,	0, STR_CONFIG_PATCHES_AUTORENEW_MONTHS, "autorenew_months", &_patches.autorenew_months,				-12, 12,  1, NULL},
   620 	{PE_CURRENCY, 0, STR_CONFIG_PATCHES_AUTORENEW_MONEY,&_patches.autorenew_money,					0, 2000000, 100000, NULL},
   622 	{PE_CURRENCY, 0, STR_CONFIG_PATCHES_AUTORENEW_MONEY,"autorenew_money", &_patches.autorenew_money,					0, 2000000, 100000, NULL},
   621 
   623 
   622 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_TRAINS,				&_patches.max_trains,								0,240, 10, NULL},
   624 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_TRAINS,				"max_trains", &_patches.max_trains,								0,240, 10, NULL},
   623 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_ROADVEH,			&_patches.max_roadveh,							0,240, 10, NULL},
   625 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_ROADVEH,			"max_roadveh", &_patches.max_roadveh,							0,240, 10, NULL},
   624 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_AIRCRAFT,			&_patches.max_aircraft,							0,240, 10, NULL},
   626 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_AIRCRAFT,			"max_aircraft", &_patches.max_aircraft,							0,240, 10, NULL},
   625 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_SHIPS,				&_patches.max_ships,								0,240, 10, NULL},
   627 	{PE_UINT8,	0, STR_CONFIG_PATCHES_MAX_SHIPS,				"max_ships", &_patches.max_ships,								0,240, 10, NULL},
   626 
   628 
   627 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SERVINT_ISPERCENT,&_patches.servint_ispercent,				0,  0,  0, &CheckInterval},
   629 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SERVINT_ISPERCENT,"servint_isperfect",&_patches.servint_ispercent,				0,  0,  0, &CheckInterval},
   628 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_TRAINS,		&_patches.servint_trains,		5,800,  5, &InValidateDetailsWindow},
   630 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_TRAINS,		"servint_trains",   &_patches.servint_trains,		5,800,  5, &InValidateDetailsWindow},
   629 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_ROADVEH,	&_patches.servint_roadveh,	5,800,  5, &InValidateDetailsWindow},
   631 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_ROADVEH,	"servint_roadveh",  &_patches.servint_roadveh,	5,800,  5, &InValidateDetailsWindow},
   630 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT, &_patches.servint_aircraft, 5,800,  5, &InValidateDetailsWindow},
   632 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_AIRCRAFT, "servint_aircraft", &_patches.servint_aircraft, 5,800,  5, &InValidateDetailsWindow},
   631 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_SHIPS,		&_patches.servint_ships,		5,800,  5, &InValidateDetailsWindow},
   633 	{PE_UINT16, PF_0ISDIS, STR_CONFIG_PATCHES_SERVINT_SHIPS,		"servint_ships",    &_patches.servint_ships,		5,800,  5, &InValidateDetailsWindow},
   632 };
   634 };
   633 
   635 
   634 static const PatchEntry _patches_stations[] = {
   636 static const PatchEntry _patches_stations[] = {
   635 	{PE_BOOL,		0, STR_CONFIG_PATCHES_JOINSTATIONS,			&_patches.join_stations,						0,  0,  0, NULL},
   637 	{PE_BOOL,		0, STR_CONFIG_PATCHES_JOINSTATIONS,			"join_stations", &_patches.join_stations,						0,  0,  0, NULL},
   636 	{PE_BOOL,		0, STR_CONFIG_PATCHES_FULLLOADANY,			&_patches.full_load_any,						0,  0,  0, NULL},
   638 	{PE_BOOL,		0, STR_CONFIG_PATCHES_FULLLOADANY,			"full_load_any", &_patches.full_load_any,						0,  0,  0, NULL},
   637 	{PE_BOOL,		0, STR_CONFIG_PATCHES_IMPROVEDLOAD,			&_patches.improved_load,						0,  0,  0, NULL},
   639 	{PE_BOOL,		0, STR_CONFIG_PATCHES_IMPROVEDLOAD,			"improved_load", &_patches.improved_load,						0,  0,  0, NULL},
   638 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SELECTGOODS,			&_patches.selectgoods,							0,  0,  0, NULL},
   640 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SELECTGOODS,			"select_goods",  &_patches.selectgoods,							0,  0,  0, NULL},
   639 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEW_NONSTOP,			&_patches.new_nonstop,							0,  0,  0, NULL},
   641 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NEW_NONSTOP,			"new_nonstop", &_patches.new_nonstop,							0,  0,  0, NULL},
   640 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NONUNIFORM_STATIONS, &_patches.nonuniform_stations,		0,  0,  0, NULL},
   642 	{PE_BOOL,		0, STR_CONFIG_PATCHES_NONUNIFORM_STATIONS, "nonuniform_stations", &_patches.nonuniform_stations,		0,  0,  0, NULL},
   641 	{PE_UINT8,	0, STR_CONFIG_PATCHES_STATION_SPREAD,		&_patches.station_spread,						4, 64,  1, NULL},
   643 	{PE_UINT8,	0, STR_CONFIG_PATCHES_STATION_SPREAD,		"station_spread", &_patches.station_spread,						4, 64,  1, NULL},
   642 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SERVICEATHELIPAD, &_patches.serviceathelipad,					0,  0,  0, NULL},
   644 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SERVICEATHELIPAD, "service_at_helipad", &_patches.serviceathelipad,					0,  0,  0, NULL},
   643 	{PE_BOOL, 0, STR_CONFIG_PATCHES_CATCHMENT, &_patches.modified_catchment},
   645 	{PE_BOOL, 0, STR_CONFIG_PATCHES_CATCHMENT, "modified_catchment", &_patches.modified_catchment},
   644 
   646 
   645 };
   647 };
   646 
   648 
   647 static const PatchEntry _patches_economy[] = {
   649 static const PatchEntry _patches_economy[] = {
   648 	{PE_BOOL,		0, STR_CONFIG_PATCHES_INFLATION,				&_patches.inflation,								0,  0,  0, NULL},
   650 	{PE_BOOL,		0, STR_CONFIG_PATCHES_INFLATION,				"inflation", &_patches.inflation,								0,  0,  0, NULL},
   649 	{PE_BOOL,		0, STR_CONFIG_PATCHES_BUILDXTRAIND,			&_patches.build_rawmaterial_ind,		0,  0,  0, NULL},
   651 	{PE_BOOL,		0, STR_CONFIG_PATCHES_BUILDXTRAIND,			"build_rawmaterial", &_patches.build_rawmaterial_ind,		0,  0,  0, NULL},
   650 	{PE_BOOL,		0, STR_CONFIG_PATCHES_MULTIPINDTOWN,		&_patches.multiple_industry_per_town,0, 0,  0, NULL},
   652 	{PE_BOOL,		0, STR_CONFIG_PATCHES_MULTIPINDTOWN,		"multiple_industry_per_town", &_patches.multiple_industry_per_town,0, 0,  0, NULL},
   651 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SAMEINDCLOSE,			&_patches.same_industry_close,			0,  0,  0, NULL},
   653 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SAMEINDCLOSE,			"same_industry_close", &_patches.same_industry_close,			0,  0,  0, NULL},
   652 	{PE_BOOL,		0, STR_CONFIG_PATCHES_BRIBE,						&_patches.bribe,										0,  0,  0, NULL},
   654 	{PE_BOOL,		0, STR_CONFIG_PATCHES_BRIBE,						"bribe", &_patches.bribe,										0,  0,  0, NULL},
   653 	{PE_UINT8,	0, STR_CONFIG_PATCHES_SNOWLINE_HEIGHT,	&_patches.snow_line_height,					2, 13,  1, NULL},
   655 	{PE_UINT8,	0, STR_CONFIG_PATCHES_SNOWLINE_HEIGHT,	"snow_line_height", &_patches.snow_line_height,					2, 13,  1, NULL},
   654 
   656 
   655 	{PE_INT32,	PF_NOCOMMA, STR_CONFIG_PATCHES_COLORED_NEWS_DATE, &_patches.colored_news_date, 1900, 2200, 5, NULL},
   657 	{PE_INT32,	PF_NOCOMMA, STR_CONFIG_PATCHES_COLORED_NEWS_DATE, "colored_new_data", &_patches.colored_news_date, 1900, 2200, 5, NULL},
   656 	{PE_INT32,	PF_NOCOMMA, STR_CONFIG_PATCHES_STARTING_DATE, &_patches.starting_date,	 1920,2100, 1, NULL},
   658 	{PE_INT32,	PF_NOCOMMA, STR_CONFIG_PATCHES_STARTING_DATE, "starting_date", &_patches.starting_date,	 1920,2100, 1, NULL},
   657 
   659 
   658 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SMOOTH_ECONOMY,		&_patches.smooth_economy,						0,  0,  0, NULL},
   660 	{PE_BOOL,		0, STR_CONFIG_PATCHES_SMOOTH_ECONOMY,		"smooth_economy", &_patches.smooth_economy,						0,  0,  0, NULL},
   659 };
   661 };
   660 
   662 
   661 static const PatchEntry _patches_ai[] = {
   663 static const PatchEntry _patches_ai[] = {
   662 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AINEW_ACTIVE, &_patches.ainew_active, 0, 1, 1, &AiNew_PatchActive_Warning},
   664 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AINEW_ACTIVE, "ainew_active", &_patches.ainew_active, 0, 1, 1, &AiNew_PatchActive_Warning},
   663 
   665 
   664 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_TRAINS, &_patches.ai_disable_veh_train,			0,  0,  0, NULL},
   666 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_TRAINS, "ai_disable_veh_train", &_patches.ai_disable_veh_train,			0,  0,  0, NULL},
   665 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH,&_patches.ai_disable_veh_roadveh,		0,  0,  0, NULL},
   667 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_ROADVEH,"ai_disable_veh_roadveh",&_patches.ai_disable_veh_roadveh,		0,  0,  0, NULL},
   666 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT, &_patches.ai_disable_veh_aircraft,0,  0,  0, NULL},
   668 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT,"ai_disable_veh_aircraft",&_patches.ai_disable_veh_aircraft,0,  0,  0, NULL},
   667 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_SHIPS,	&_patches.ai_disable_veh_ship,			0,  0,  0, NULL},
   669 	{PE_BOOL,		0, STR_CONFIG_PATCHES_AI_BUILDS_SHIPS,"ai_disable_veh_ship",&_patches.ai_disable_veh_ship,			0,  0,  0, NULL},
   668 };
   670 };
   669 
   671 
   670 typedef struct PatchPage {
   672 typedef struct PatchPage {
   671 	const PatchEntry *entries;
   673 	const PatchEntry *entries;
   672 	uint num;
   674 	uint num;
   974 	}
   976 	}
   975 
   977 
   976 	return 0;
   978 	return 0;
   977 }
   979 }
   978 
   980 
       
   981 /* Those 2 functions need to be here, else we have to make some stuff non-static
       
   982     and besides, it is also better to keep stuff like this at the same place */
       
   983 void ConsoleSetPatchSetting(char *name, char *value)
       
   984 {
       
   985 	const PatchPage *page;
       
   986 	const PatchEntry *pe;
       
   987 	bool found = false;
       
   988 	int i, j;
       
   989 	int val;
       
   990 
       
   991 	/* Search for the name in the patch-settings */
       
   992 	for (i = 0; i < lengthof(_patches_page); i++) {
       
   993 		page = &_patches_page[i];
       
   994 		for (j = 0; j < page->num; j++) {
       
   995 			pe = &page->entries[j];
       
   996 			if (strncmp(pe->console_name, name, sizeof(pe->console_name)) == 0) {
       
   997 				/* We found the name */
       
   998 				found = true;
       
   999 				break;
       
  1000 			}
       
  1001 		}
       
  1002 		if (found)
       
  1003 			break;
       
  1004 	}
       
  1005 
       
  1006 	/* We did not found the patch setting */
       
  1007 	if (!found) {
       
  1008 		IConsolePrintF(_iconsole_color_warning, "'%s' is an unkown patch settings", name);
       
  1009 		return;
       
  1010 	}
       
  1011 
       
  1012 	val = atoi(value);
       
  1013 
       
  1014 	if (pe->type == PE_CURRENCY) {
       
  1015 		val /= GetCurrentCurrencyRate();
       
  1016 	}
       
  1017 
       
  1018 	// If an item is playerbased, we do not send it over the network (if any)
       
  1019 	if (pe->flags & PF_PLAYERBASED) {
       
  1020 		WritePE(pe, val);
       
  1021 	} else {
       
  1022 		// Else we do
       
  1023 		DoCommandP(0, i + (j << 8), val, NULL, CMD_CHANGE_PATCH_SETTING);
       
  1024 	}
       
  1025 
       
  1026 	switch(pe->type) {
       
  1027 		case PE_BOOL:
       
  1028 			if (val == 1)
       
  1029 				snprintf(value, sizeof(value), "enabled");
       
  1030 			else
       
  1031 				snprintf(value, sizeof(value), "disabled");
       
  1032 			break;
       
  1033 		default:
       
  1034 			break;
       
  1035 	}
       
  1036 
       
  1037 	IConsolePrintF(_iconsole_color_warning, "'%s' changed in:", name);
       
  1038 	IConsolePrintF(_iconsole_color_warning, "  '%s'", value);
       
  1039 }
       
  1040 
       
  1041 void ConsoleGetPatchSetting(char *name)
       
  1042 {
       
  1043 	const PatchPage *page;
       
  1044 	const PatchEntry *pe;
       
  1045 	char value[50];
       
  1046 	bool found = false;
       
  1047 	int i, j;
       
  1048 
       
  1049 	/* Search for the name in the patch-settings */
       
  1050 	for (i = 0; i < lengthof(_patches_page); i++) {
       
  1051 		page = &_patches_page[i];
       
  1052 		for (j = 0; j < page->num; j++) {
       
  1053 			pe = &page->entries[j];
       
  1054 			if (strncmp(pe->console_name, name, sizeof(pe->console_name)) == 0) {
       
  1055 				/* We found the name */
       
  1056 				found = true;
       
  1057 				break;
       
  1058 			}
       
  1059 		}
       
  1060 		if (found)
       
  1061 			break;
       
  1062 	}
       
  1063 
       
  1064 	/* We did not found the patch setting */
       
  1065 	if (!found) {
       
  1066 		IConsolePrintF(_iconsole_color_warning, "'%s' is an unkown patch settings", name);
       
  1067 		return;
       
  1068 	}
       
  1069 
       
  1070 	/* 'pe' is now the correct patch setting */
       
  1071 	switch(pe->type) {
       
  1072 		case PE_BOOL:
       
  1073 			if (ReadPE(pe) == 1)
       
  1074 				snprintf(value, sizeof(value), "enabled");
       
  1075 			else
       
  1076 				snprintf(value, sizeof(value), "disabled");
       
  1077 			break;
       
  1078 		case PE_UINT8:
       
  1079 		case PE_INT16:
       
  1080 		case PE_UINT16:
       
  1081 		case PE_INT32:
       
  1082 		case PE_CURRENCY:
       
  1083 			snprintf(value, sizeof(value), "%d", ReadPE(pe));
       
  1084 			break;
       
  1085 	}
       
  1086 
       
  1087 	IConsolePrintF(_iconsole_color_warning, "Current value for '%s' is:", name);
       
  1088 	IConsolePrintF(_iconsole_color_warning, "  '%s'", value);
       
  1089 }
       
  1090 
   979 static const Widget _patches_selection_widgets[] = {
  1091 static const Widget _patches_selection_widgets[] = {
   980 {   WWT_CLOSEBOX,    10,     0,    10,     0,    13, STR_00C5,												STR_018B_CLOSE_WINDOW},
  1092 {   WWT_CLOSEBOX,    10,     0,    10,     0,    13, STR_00C5,												STR_018B_CLOSE_WINDOW},
   981 {    WWT_CAPTION,    10,    11,   369,     0,    13, STR_CONFIG_PATCHES_CAPTION,			STR_018C_WINDOW_TITLE_DRAG_THIS},
  1093 {    WWT_CAPTION,    10,    11,   369,     0,    13, STR_CONFIG_PATCHES_CAPTION,			STR_018C_WINDOW_TITLE_DRAG_THIS},
   982 {      WWT_PANEL,    10,     0,   369,    14,    41, 0x0,															STR_NULL},
  1094 {      WWT_PANEL,    10,     0,   369,    14,    41, 0x0,															STR_NULL},
   983 {      WWT_PANEL,    10,     0,   369,    42,   320, 0x0,															STR_NULL},
  1095 {      WWT_PANEL,    10,     0,   369,    42,   320, 0x0,															STR_NULL},