intro_gui.c
changeset 4300 687a17c9c557
parent 4171 3fadda3afe70
child 4308 61f5aa8143f6
equal deleted inserted replaced
4299:b86602eaaff1 4300:687a17c9c557
     9 #include "gfx.h"
     9 #include "gfx.h"
    10 #include "player.h"
    10 #include "player.h"
    11 #include "network.h"
    11 #include "network.h"
    12 #include "variables.h"
    12 #include "variables.h"
    13 #include "settings.h"
    13 #include "settings.h"
    14 
    14 #include "heightmap.h"
    15 extern void SwitchMode(int new_mode);
    15 #include "genworld.h"
    16 
    16 
    17 static const Widget _select_game_widgets[] = {
    17 static const Widget _select_game_widgets[] = {
    18 {    WWT_CAPTION, RESIZE_NONE, 13,   0, 335,   0,  13, STR_0307_OPENTTD,       STR_NULL},
    18 {    WWT_CAPTION, RESIZE_NONE, 13,   0, 335,   0,  13, STR_0307_OPENTTD,       STR_NULL},
    19 {     WWT_IMGBTN, RESIZE_NONE, 13,   0, 335,  14, 196, STR_NULL,               STR_NULL},
    19 {     WWT_IMGBTN, RESIZE_NONE, 13,   0, 335,  14, 176, STR_NULL,               STR_NULL},
    20 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  22,  33, STR_0140_NEW_GAME,      STR_02FB_START_A_NEW_GAME},
    20 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  22,  33, STR_0140_NEW_GAME,      STR_02FB_START_A_NEW_GAME},
    21 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  22,  33, STR_0141_LOAD_GAME,     STR_02FC_LOAD_A_SAVED_GAME},
    21 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  22,  33, STR_0141_LOAD_GAME,     STR_02FC_LOAD_A_SAVED_GAME},
    22 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  40,  51, STR_0220_CREATE_SCENARIO,STR_02FE_CREATE_A_CUSTOMIZED_GAME},
    22 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  40,  51, STR_029A_PLAY_SCENARIO, STR_0303_START_A_NEW_GAME_USING},
    23 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  40,  51, STR_029A_PLAY_SCENARIO, STR_0303_START_A_NEW_GAME_USING},
    23 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  40,  51, STR_PLAY_HEIGHTMAP,     STR_PLAY_HEIGHTMAP_HINT},
    24 {    WWT_PANEL_2, RESIZE_NONE, 12,  10,  86,  59, 113, 0x1312,                 STR_030E_SELECT_TEMPERATE_LANDSCAPE},
    24 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167,  58,  69, STR_0220_CREATE_SCENARIO,STR_02FE_CREATE_A_CUSTOMIZED_GAME},
    25 {    WWT_PANEL_2, RESIZE_NONE, 12,  90, 166,  59, 113, 0x1314,                 STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE},
    25 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325,  58,  69, STR_MULTIPLAYER,        STR_0300_SELECT_MULTIPLAYER_GAME},
    26 {    WWT_PANEL_2, RESIZE_NONE, 12, 170, 246,  59, 113, 0x1316,                 STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE},
    26 
    27 {    WWT_PANEL_2, RESIZE_NONE, 12, 250, 326,  59, 113, 0x1318,                 STR_0311_SELECT_TOYLAND_LANDSCAPE},
    27 {    WWT_PANEL_2, RESIZE_NONE, 12,  10,  86,  77, 131, 0x1312,                 STR_030E_SELECT_TEMPERATE_LANDSCAPE},
    28 
    28 {    WWT_PANEL_2, RESIZE_NONE, 12,  90, 166,  77, 131, 0x1314,                 STR_030F_SELECT_SUB_ARCTIC_LANDSCAPE},
    29 {      WWT_PANEL, RESIZE_NONE, 12, 219, 254, 120, 131, STR_NULL,               STR_NULL},
    29 {    WWT_PANEL_2, RESIZE_NONE, 12, 170, 246,  77, 131, 0x1316,                 STR_0310_SELECT_SUB_TROPICAL_LANDSCAPE},
    30 {    WWT_TEXTBTN, RESIZE_NONE, 12, 255, 266, 120, 131, STR_0225,               STR_NULL},
    30 {    WWT_PANEL_2, RESIZE_NONE, 12, 250, 326,  77, 131, 0x1318,                 STR_0311_SELECT_TOYLAND_LANDSCAPE},
    31 {      WWT_PANEL, RESIZE_NONE, 12, 279, 314, 120, 131, STR_NULL,               STR_NULL},
    31 
    32 {    WWT_TEXTBTN, RESIZE_NONE, 12, 315, 326, 120, 131, STR_0225,               STR_NULL},
    32 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 139, 150, STR_0148_GAME_OPTIONS,  STR_0301_DISPLAY_GAME_OPTIONS},
    33 
    33 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 139, 150, STR_01FE_DIFFICULTY,    STR_0302_DISPLAY_DIFFICULTY_OPTIONS},
    34 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 138, 149, STR_SINGLE_PLAYER,      STR_02FF_SELECT_SINGLE_PLAYER_GAME},
    34 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 157, 168, STR_CONFIG_PATCHES,     STR_CONFIG_PATCHES_TIP},
    35 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 138, 149, STR_MULTIPLAYER,        STR_0300_SELECT_MULTIPLAYER_GAME},
    35 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 157, 168, STR_0304_QUIT,          STR_0305_QUIT_OPENTTD},
    36 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 159, 170, STR_0148_GAME_OPTIONS,  STR_0301_DISPLAY_GAME_OPTIONS},
       
    37 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 159, 170, STR_01FE_DIFFICULTY,    STR_0302_DISPLAY_DIFFICULTY_OPTIONS},
       
    38 { WWT_PUSHTXTBTN, RESIZE_NONE, 12,  10, 167, 177, 188, STR_CONFIG_PATCHES,     STR_CONFIG_PATCHES_TIP},
       
    39 { WWT_PUSHTXTBTN, RESIZE_NONE, 12, 168, 325, 177, 188, STR_0304_QUIT,          STR_0305_QUIT_OPENTTD},
       
    40 {    WIDGETS_END },
    36 {    WIDGETS_END },
    41 };
    37 };
    42 
    38 
    43 extern void HandleOnEditText(WindowEvent *e);
    39 extern void HandleOnEditText(WindowEvent *e);
    44 extern void HandleOnEditTextCancel(void);
    40 extern void HandleOnEditTextCancel(void);
    45 
    41 
    46 static inline void CreateScenario(void) {_switch_mode = SM_EDITOR;}
       
    47 
       
    48 static inline void SetNewLandscapeType(byte landscape)
    42 static inline void SetNewLandscapeType(byte landscape)
    49 {
    43 {
    50 	_opt_newgame.landscape = landscape;
    44 	_opt_newgame.landscape = landscape;
    51 	InvalidateWindowClasses(WC_SELECT_GAME);
    45 	InvalidateWindowClasses(WC_SELECT_GAME);
    52 }
    46 }
    53 
    47 
    54 static void SelectGameWndProc(Window *w, WindowEvent *e)
    48 static void SelectGameWndProc(Window *w, WindowEvent *e)
    55 {
    49 {
    56 	/* We do +/- 6 for the map_xy because 64 is 2^6, but it is the lowest available element */
       
    57 	static const StringID mapsizes[] = {STR_64, STR_128, STR_256, STR_512, STR_1024, STR_2048, INVALID_STRING_ID};
       
    58 
       
    59 	switch (e->event) {
    50 	switch (e->event) {
    60 	case WE_PAINT:
    51 	case WE_PAINT:
    61 		w->click_state = (w->click_state & ~(1 << 14) & ~(0xF << 6)) | (1 << (_opt_newgame.landscape + 6)) | (1 << 14);
    52 		w->click_state = (w->click_state & ~(0xF << 8)) | (1 << (_opt_newgame.landscape + 8));
    62 		SetDParam(0, STR_6801_EASY + _opt_newgame.diff_level);
    53 		SetDParam(0, STR_6801_EASY + _opt_newgame.diff_level);
    63 		DrawWindowWidgets(w);
    54 		DrawWindowWidgets(w);
    64 
       
    65 		DrawStringRightAligned(216, 121, STR_MAPSIZE, 0);
       
    66 		DrawString(223, 121, mapsizes[_patches_newgame.map_x - 6], 0x10);
       
    67 		DrawString(270, 121, STR_BY, 0);
       
    68 		DrawString(283, 121, mapsizes[_patches_newgame.map_y - 6], 0x10);
       
    69 		break;
    55 		break;
    70 
    56 
    71 	case WE_CLICK:
    57 	case WE_CLICK:
    72 		switch (e->click.widget) {
    58 		switch (e->click.widget) {
    73 		case 2: AskForNewGameToStart(); break;
    59 		case 2: ShowGenerateLandscape(); break;
    74 		case 3: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
    60 		case 3: ShowSaveLoadDialog(SLD_LOAD_GAME); break;
    75 		case 4: CreateScenario(); break;
    61 		case 4: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break;
    76 		case 5: ShowSaveLoadDialog(SLD_LOAD_SCENARIO); break;
    62 		case 5: ShowSaveLoadDialog(SLD_LOAD_HEIGHTMAP); break;
    77 		case 6: case 7: case 8: case 9:
    63 		case 6: ShowCreateScenario(); break;
    78 			SetNewLandscapeType(e->click.widget - 6);
    64 		case 7:
    79 			break;
       
    80 		case 10: case 11: /* Mapsize X */
       
    81 			ShowDropDownMenu(w, mapsizes, _patches_newgame.map_x - 6, 11, 0, 0);
       
    82 			break;
       
    83 		case 12: case 13: /* Mapsize Y */
       
    84 			ShowDropDownMenu(w, mapsizes, _patches_newgame.map_y - 6, 13, 0, 0);
       
    85 			break;
       
    86 		case 15:
       
    87 #ifdef ENABLE_NETWORK
    65 #ifdef ENABLE_NETWORK
    88 			if (!_network_available) {
    66 			if (!_network_available) {
    89 				ShowErrorMessage(INVALID_STRING_ID, STR_NETWORK_ERR_NOTAVAILABLE, 0, 0);
    67 				ShowErrorMessage(INVALID_STRING_ID, STR_NETWORK_ERR_NOTAVAILABLE, 0, 0);
    90 			} else {
    68 			} else {
    91 				ShowNetworkGameWindow();
    69 				ShowNetworkGameWindow();
    92 			}
    70 			}
    93 #else
    71 #else
    94 			ShowErrorMessage(INVALID_STRING_ID ,STR_NETWORK_ERR_NOTAVAILABLE, 0, 0);
    72 			ShowErrorMessage(INVALID_STRING_ID ,STR_NETWORK_ERR_NOTAVAILABLE, 0, 0);
    95 #endif
    73 #endif
    96 			break;
    74 			break;
    97 		case 16: ShowGameOptions(); break;
    75 		case 8: case 9: case 10: case 11:
    98 		case 17: ShowGameDifficulty(); break;
    76 			SetNewLandscapeType(e->click.widget - 8);
    99 		case 18: ShowPatchesSelection(); break;
    77 			break;
   100 		case 19: AskExitGame(); break;
    78 		case 12: ShowGameOptions(); break;
       
    79 		case 13: ShowGameDifficulty(); break;
       
    80 		case 14: ShowPatchesSelection(); break;
       
    81 		case 15: AskExitGame(); break;
   101 		}
    82 		}
   102 		break;
    83 		break;
   103 
       
   104 	case WE_ON_EDIT_TEXT: HandleOnEditText(e); break;
       
   105 	case WE_ON_EDIT_TEXT_CANCEL: HandleOnEditTextCancel(); break;
       
   106 
       
   107 	case WE_DROPDOWN_SELECT: /* Mapsize selection */
       
   108 		switch (e->dropdown.button) {
       
   109 			/* We need a *hacky* here because generateworld is called with _patches
       
   110 			 * but it only gets the new value INSIDE generateworld so not setting it would
       
   111 			 * break generating a new game on the run (eg MP) */
       
   112 			case 11: _patches.map_x = _patches_newgame.map_x = e->dropdown.index + 6; break;
       
   113 			case 13: _patches.map_y = _patches_newgame.map_y = e->dropdown.index + 6; break;
       
   114 		}
       
   115 		SetWindowDirty(w);
       
   116 		break;
       
   117 	}
    84 	}
   118 
       
   119 }
    85 }
   120 
    86 
   121 static const WindowDesc _select_game_desc = {
    87 static const WindowDesc _select_game_desc = {
   122 	WDP_CENTER, WDP_CENTER, 336, 197,
    88 	WDP_CENTER, WDP_CENTER, 336, 177,
   123 	WC_SELECT_GAME,0,
    89 	WC_SELECT_GAME,0,
   124 	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
    90 	WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
   125 	_select_game_widgets,
    91 	_select_game_widgets,
   126 	SelectGameWndProc
    92 	SelectGameWndProc
   127 };
    93 };
   128 
    94 
   129 void ShowSelectGameWindow(void)
    95 void ShowSelectGameWindow(void)
   130 {
    96 {
   131 	AllocateWindowDesc(&_select_game_desc);
    97 	AllocateWindowDesc(&_select_game_desc);
   132 }
       
   133 
       
   134 void GenRandomNewGame(uint32 rnd1, uint32 rnd2)
       
   135 {
       
   136 	_random_seeds[0][0] = rnd1;
       
   137 	_random_seeds[0][1] = rnd2;
       
   138 
       
   139 	SwitchMode(SM_NEWGAME);
       
   140 }
       
   141 
       
   142 void StartScenarioEditor(uint32 rnd1, uint32 rnd2)
       
   143 {
       
   144 	_random_seeds[0][0] = rnd1;
       
   145 	_random_seeds[0][1] = rnd2;
       
   146 
       
   147 	SwitchMode(SM_START_SCENARIO);
       
   148 }
    98 }
   149 
    99 
   150 static const Widget _ask_abandon_game_widgets[] = {
   100 static const Widget _ask_abandon_game_widgets[] = {
   151 { WWT_CLOSEBOX, RESIZE_NONE,  4,   0,  10,   0,  13, STR_00C5,      STR_018B_CLOSE_WINDOW},
   101 { WWT_CLOSEBOX, RESIZE_NONE,  4,   0,  10,   0,  13, STR_00C5,      STR_018B_CLOSE_WINDOW},
   152 {  WWT_CAPTION, RESIZE_NONE,  4,  11, 179,   0,  13, STR_00C7_QUIT, STR_NULL},
   102 {  WWT_CAPTION, RESIZE_NONE,  4,  11, 179,   0,  13, STR_00C7_QUIT, STR_NULL},