WorldSim  inDev
2D tile-based sandbox RPG with procedurally generated fantasy world simulator 🌏
Menu_WorldGenerator.hpp
Go to the documentation of this file.
1 #pragma once
2 #ifndef WORLDSIM_MENU_WORLD_GENERATOR_HPP
3 #define WORLDSIM_MENU_WORLD_GENERATOR_HPP
4 
5 /* WorldSim: Menu_WorldGenerator.hpp
6  #include "Menu_WorldGenerator.hpp"
7 
8  Implementation of GUI interface.
9  This menu is displayed upon starting the game app. It allows the player to start a new game, load a saved game, access the options menu, and quit the application.
10 
11 */
12 
13 #include <Graphics/GUI/GUI.hpp>
14 
15 #include <Device/Display/DisplayInterface.hpp>
16 #include <Device/Mouse/MouseInterface.hpp>
17 #include <Data/Debug/DebugMacro.hpp>
18 
19 #include <Data/DataTools.hpp> /* To check if seed is numeric */
20 
21 #include "Menu_AdventureMode.hpp"
22 
23 class Menu_WorldGenerator: public GUI_Interface
24 {
25  private:
26  GUI_Manager guiManager;
27 
28  /* Colours / theme. */
29  ColourRGB <unsigned char> cNormal;
30  ColourRGB <unsigned char> cSelected;
31  ColourRGB <unsigned char> cDropPanel;
32  ColourRGB <unsigned char> cHighlight;
33 
34  /* Background image */
35  Texture* backgroundTexture;
36  /* Button: Back to main menu. */
37  GUI_Button buttonBack;
38  /* Button: Expand preview window. */
39  GUI_Button buttonExpandPreviewWindow;
40  /* Textbox: Title for menu. */
41  GUI_TextBox textMenuTitle;
42  /* TextEntry: Name of the world. */
43  GUI_TextEntry textEntryWorldName;
44  /* TextEntry: Full seed value. */
45  GUI_TextEntry textEntryFullSeed;
46  /* TextEntry: Full biome value. */
47  GUI_TextEntry textEntryFullBiome;
48  /* Button: Generate the world. */
49  GUI_Button buttonGenerate;
50  /* Button: Keep this world and move to world simulation phase. */
51  GUI_Button buttonSimWorld;
52  /* Button: Export a bunch of data about the generated world. */
53  GUI_Button buttonExportData;
54  /* Button: Load a world. Note this only loads starting data. Which is geographic data and starting positions. */
55  GUI_Button buttonLoadWorld;
56  /* Number entry: World size (tiles). The world is square, so only one input is needed. */
57  GUI_CycleButton worldSize;
58  /* Textbox: Caption for worldsize selector. */
59  GUI_TextBox textWorldSize;
60  /* Number entry: World size (tiles). The world is square, so only one input is needed. */
61  GUI_CycleButton freeSteps;
62  /* Textbox: Caption for worldsize selector. */
63  GUI_TextBox textFreeSteps;
64  /* WrapX */
65  GUI_CycleButton guiWrapX;
66  GUI_TextBox textWrapX;
67  /* WrapY */
68  GUI_CycleButton guiWrapY;
69  GUI_TextBox textWrapY;
70  /* Island Mode */
71  GUI_CycleButton guiIslandMode;
72  GUI_TextBox textIslandMode;
73  /* Ocean percent */
74  GUI_NumberInput nLandPercent;
75  GUI_TextBox textOceanPercent;
76  /* Number entry: Number of civs to spawn into the world. */
77  GUI_NumberInput nCiv;
78  GUI_TextBox guiCaptionNCiv;
79  /* Number entry: Number of human tribes to spawn into the world. */
80  GUI_NumberInput nTribe;
81  GUI_TextBox guiCaptionNTribe;
82  /* Number entry: Number of Dwarven tribes to spawn into the world. */
83  GUI_NumberInput nTribeDwarven;
84  GUI_TextBox guiCaptionNTribeDwarven;
85  /* Number entry: Number of Elven tribes to spawn into the world. */
86  GUI_NumberInput nTribeElven;
87  GUI_TextBox guiCaptionNTribeElven;
88 
89  bool fullScreenPreview;
90 
91  public:
92 
94  {
95  fullScreenPreview=false;
97  worldViewer.active = false;
99  minimap.active=false;
100  buttonGenerate.clicked=false;
101  }
102 
103  void setFont(Wildcat::Font* _font)
104  {
105  font = _font;
106  guiManager.setFont(_font);
107  }
108 
109  void logicTick()
110  {
111  // if(menuWorldSimulator.active==true)
112  // {
113  // menuWorldSimulator.logicTick();
114  // }
115  }
116 
117  void init()
118  {
119  backgroundTexture=&TEX_NEW_GAME_BACKGROUND;
120  active=false;
121  fullScreenPreview=true;
122 
123  /* Initialise theme. */
124  cNormal.set(200,200,200);
125  cSelected.set(180,180,180);
126  cDropPanel.set(170,170,170);
127  cHighlight.set(170,170,170);
128 
129  buttonExpandPreviewWindow.setPanel(0,0,32,32);
130 
131  if(fullScreenPreview==false)
132  {
133 
134  int panelSizeX = panelX2-panelX1;
135  int panelSizeY = panelY2-panelY1;
136 
137  int worldPreviewX1=panelX1+(panelSizeX/2);
138  int worldPreviewY1=panelY1+(panelSizeY/2);
139 
140  //worldViewer.setPanel(worldPreviewX1,worldPreviewY1,panelX2,panelY2);
141  //buttonExpandPreviewWindow.setPanel(worldPreviewX1,worldPreviewY1,worldPreviewX1+16,worldPreviewY1+16);
142 
143  /* Put worldviewer in top right corner of panel. */
144  worldViewer.setPanel(panelX2/2,panelY2/2,panelX2,panelY2);
145  }
146  else
147  {
148  //worldViewer.setPanel(panelX1,panelY1,panelX2,panelY2);
149  //buttonExpandPreviewWindow.setPanel(panelX1,panelY1,panelX1+16,panelY1+16);
150 
151  /* Make worldviewer fill screen. */
152  worldViewer.setPanel(panelX1,panelY1,panelX2,panelY2);
153  }
154 
155  buttonBack.text="Back";
156  buttonBack.setColours(cNormal,cHighlight,0);
157 
158  /* WORLD SIZE */
159  worldSize.currentOption=DEFAULT_WORLD_SIZE_SLOT;
160  //worldSize.addOption("17");
161  worldSize.addOption("33");
162  worldSize.addOption("65");
163  worldSize.addOption("129");
164  worldSize.addOption("257");
165  worldSize.addOption("513");
166  worldSize.addOption("1025");
167  worldSize.addOption("2049");
168  worldSize.addOption("4097");
169  worldSize.addOption("8193");
170  worldSize.texCycleButton=&TEX_GUI_DECREMENT;
171  worldSize.setColours(cNormal,cHighlight,0);
172 
173  freeSteps.currentOption=0;
174  freeSteps.addOption("0");
175  freeSteps.addOption("1");
176  freeSteps.addOption("2");
177  freeSteps.addOption("3");
178  freeSteps.addOption("4");
179  freeSteps.addOption("5");
180  freeSteps.addOption("6");
181  freeSteps.addOption("7");
182  freeSteps.addOption("8");
183  freeSteps.addOption("9");
184  freeSteps.addOption("10");
185  freeSteps.addOption("11");
186  freeSteps.addOption("12");
187  freeSteps.texCycleButton=&TEX_GUI_DECREMENT;
188  freeSteps.setColours(cNormal,cHighlight,0);
189 
190  /* WrapX */
191  guiWrapX.currentOption=0;
192  guiWrapX.addOption("Yes");
193  guiWrapX.addOption("No");
194  guiWrapX.texCycleButton=&TEX_GUI_DECREMENT;
195  guiWrapX.setColours(cNormal,cHighlight,0);
196  guiWrapX.wrap=true;
197 
198  /* WrapY */
199  guiWrapY.currentOption=1;
200  guiWrapY.addOption("Yes");
201  guiWrapY.addOption("No");
202  guiWrapY.texCycleButton=&TEX_GUI_DECREMENT;
203  guiWrapY.setColours(cNormal,cHighlight,0);
204  guiWrapY.wrap=true;
205 
206  /* Island mode */
207  guiIslandMode.currentOption=0;
208  guiIslandMode.addOption("Yes");
209  guiIslandMode.addOption("No");
210  guiIslandMode.texCycleButton=&TEX_GUI_DECREMENT;
211  guiIslandMode.setColours(cNormal, cHighlight,0);
212  guiIslandMode.wrap=true;
213 
214  /* N CIV */
215  nCiv.setNumbers(0,128,DEFAULT_NUMBER_CIVS);
216  nCiv.setColours(cNormal,cHighlight,0);
217  nCiv.texIncrement = &TEX_GUI_INCREMENT;
218  nCiv.texDecrement = &TEX_GUI_DECREMENT;
219  guiCaptionNCiv.text="# civs:";
220  guiCaptionNCiv.setColours(cNormal);
221  guiCaptionNCiv.centeredY=true;
222 
223  /* Ocean percent */
224  nLandPercent.setNumbers(0,100,66);
225  nLandPercent.setColours(cNormal,cHighlight,0);
226  nLandPercent.texIncrement = &TEX_GUI_INCREMENT;
227  nLandPercent.texDecrement = &TEX_GUI_DECREMENT;
228  textOceanPercent.text="Land percent:";
229  textOceanPercent.setColours(cNormal);
230  textOceanPercent.centeredY=true;
231 
232  /* N TRIBE */
233  nTribe.setNumbers(0,100,DEFAULT_NUMBER_TRIBES_HUMAN);
234  nTribe.setColours(cNormal,cHighlight,0);
235  nTribe.texIncrement = &TEX_GUI_INCREMENT;
236  nTribe.texDecrement = &TEX_GUI_DECREMENT;
237  guiCaptionNTribe.text="# human tribes:";
238  guiCaptionNTribe.setColours(cNormal);
239  guiCaptionNTribe.centeredY=true;
240 
241  /* N TRIBE DWARVEN */
242  nTribeDwarven.setNumbers(0,100,DEFAULT_NUMBER_TRIBES_DWARVEN);
243  nTribeDwarven.setColours(cNormal,cHighlight,0);
244  nTribeDwarven.texIncrement = &TEX_GUI_INCREMENT;
245  nTribeDwarven.texDecrement = &TEX_GUI_DECREMENT;
246  guiCaptionNTribeDwarven.text="# Dwarven forts:";
247  guiCaptionNTribeDwarven.setColours(cNormal);
248  guiCaptionNTribeDwarven.centeredY=true;
249 
250  /* N TRIBE ELVEN */
251  nTribeElven.setNumbers(0,100,DEFAULT_NUMBER_TRIBES_ELVEN);
252  nTribeElven.setColours(cNormal,cHighlight,0);
253  nTribeElven.texIncrement = &TEX_GUI_INCREMENT;
254  nTribeElven.texDecrement = &TEX_GUI_DECREMENT;
255  guiCaptionNTribeElven.text="# Elven tribes:";
256  guiCaptionNTribeElven.setColours(cNormal);
257  guiCaptionNTribeElven.centeredY=true;
258 
259  /* GENERATE BUTTON */
260  buttonGenerate.text="1. Generate";
261  buttonGenerate.setColours(cNormal,cHighlight,0);
262 
263  /* WORLD NAME */
264  textEntryWorldName.setColours(cNormal,cHighlight);
265  textEntryWorldName.fieldName="World name:";
266  textEntryWorldName.characterLimit=20;
267  /* Give the world a random name */
268  //textEntryWorldName.input = globalNameGen.generateName();
269  textEntryWorldName.input = "testworld";
270 
271  /* WORLD SEED */
272  textEntryFullSeed.setColours(cNormal,cHighlight);
273  textEntryFullSeed.fieldName="World seed:";
274  textEntryFullSeed.characterLimit=16 ;
275  //textEntryFullSeed.input="1902830183";
276  textEntryFullSeed.input="";
277 
278  /* BIOME SEED */
279  textEntryFullBiome.setColours(cNormal,cHighlight);
280  textEntryFullBiome.fieldName="Biome seed:";
281  textEntryFullBiome.characterLimit=16;
282  textEntryFullBiome.input="";
283 
284  textWorldSize.text="World size:";
285  textWorldSize.setColours(cNormal);
286  textWorldSize.centeredY=true;
287 
288  textFreeSteps.text="Fragmentation:";
289  textFreeSteps.setColours(cNormal);
290  textFreeSteps.centeredY=true;
291 
292  textWrapX.text="Wrap X:";
293  textWrapX.setColours(cNormal);
294  textWrapX.centeredY=true;
295 
296  textWrapY.text="Wrap Y:";
297  textWrapY.setColours(cNormal);
298  textWrapY.centeredY=true;
299 
300  textIslandMode.text="Island mode:";
301  textIslandMode.setColours(cNormal);
302  textIslandMode.centeredY=true;
303 
304  textMenuTitle.text="World Generator";
305  textMenuTitle.setColours(cNormal);
306 
307  textMenuTitle.centeredX=true;
308  textMenuTitle.centeredY=true;
309 
310  buttonSimWorld.text="2. Simulate World";
311  buttonSimWorld.setColours(cNormal,cHighlight,0);
312 
313  buttonExportData.text="Export World Data (N/A)";
314  buttonExportData.setColours(cNormal,cHighlight,0);
315 
316  buttonLoadWorld.text="Load world (N/A)";
317  buttonLoadWorld.setColours(cNormal,cHighlight,0);
318 
319  buttonExpandPreviewWindow.texture = &TEX_GUI_EXPAND;
320 
321  guiManager.add(&textMenuTitle);
322  //Not currently functional
323  //guiManager.add(&buttonBack);
324  guiManager.add(&textEntryWorldName);
325  guiManager.add(&textEntryFullSeed);
326  guiManager.add(&textEntryFullBiome);
327  guiManager.add(&buttonGenerate);
328  guiManager.add(&textWorldSize);
329  guiManager.add(&textFreeSteps);
330  guiManager.add(&textIslandMode);
331  guiManager.add(&textWrapX);
332  guiManager.add(&textWrapY);
333  guiManager.add(&worldSize);
334  guiManager.add(&freeSteps);
335  guiManager.add(&guiIslandMode);
336  guiManager.add(&guiWrapX);
337  guiManager.add(&guiWrapY);
338  //guiManager.add(&guiCaptionNCiv);
339  guiManager.add(&textOceanPercent);
340  //guiManager.add(&nCiv);
341  guiManager.add(&nLandPercent);
342  guiManager.add(&guiCaptionNTribe);
343  guiManager.add(&guiCaptionNTribeDwarven);
344  guiManager.add(&guiCaptionNTribeElven);
345  guiManager.add(&nTribe);
346  guiManager.add(&nTribeDwarven);
347  guiManager.add(&nTribeElven);
348  guiManager.add(&buttonSimWorld);
349  //guiManager.add(&buttonExportData);
350  //guiManager.add(&buttonLoadWorld);
351  //guiManager.add(&buttonExpandPreviewWindow);
352 
353  // A TEMPORARY FIX TO STOP ACCIDENTALLY HITTING
354  // HOTKEYS WHILE TYPING.
355  globalGuiManager.add(&textEntryWorldName);
356  globalGuiManager.add(&textEntryFullSeed);
357  globalGuiManager.add(&textEntryFullBiome);
358 
359  guiManager.setFont(font);
360 
361  }
362 
363  void eventResize()
364  {
365  /* Menu title. */
366  textMenuTitle.setPanel(panelX1, panelY2, panelX2/2, panelY2-20);
367 
368  /* Bottom left corner. */
369  buttonBack.setPanel(panelX1,panelY1+20,panelX1+120,panelY1);
370  /* Left column, centered. */
371  const int leftColumnCenterX = panelX1+(panelNX/4);
372  textEntryWorldName.setPanel(panelX1+20, panelY2-30, (panelX2/2)-20, panelY2-40);
373 
374  textEntryFullSeed.setPanel(panelX1+20, panelY2-40, (panelX2/2)-20, panelY2-50);
375 
376  textEntryFullBiome.setPanel(panelX1+20, panelY2-50, (panelX2/2)-20, panelY2-60);
377 
378  int ySpacing = 2;
379  int ySize = 10;
380 
381  int currentY1 = panelY2 - 60;
382  int currentY2 = currentY1-ySize;
383 
384  currentY1 -= (ySize+ySpacing);
385  currentY2 -= (ySize+ySpacing);
386 
387  textWorldSize.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
388  worldSize.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
389 
390  currentY1 -= (ySize+ySpacing);
391  currentY2 -= (ySize+ySpacing);
392 
393  textFreeSteps.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
394  freeSteps.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
395 
396  currentY1 -= (ySize+ySpacing);
397  currentY2 -= (ySize+ySpacing);
398 
399  textIslandMode.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
400  guiIslandMode.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
401 
402  currentY1 -= (ySize+ySpacing);
403  currentY2 -= (ySize+ySpacing);
404 
405  textWrapX.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
406  guiWrapX.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
407 
408  currentY1 -= (ySize+ySpacing);
409  currentY2 -= (ySize+ySpacing);
410 
411  textWrapY.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
412  guiWrapY.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
413 
414  currentY1 -= (ySize+ySpacing);
415  currentY2 -= (ySize+ySpacing);
416 
417  textOceanPercent.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
418  nLandPercent.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
419 
420  currentY1 -= (ySize+ySpacing);
421  currentY2 -= (ySize+ySpacing);
422 
423  nCiv.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
424  guiCaptionNCiv.setPanel(leftColumnCenterX-120, currentY1, leftColumnCenterX-20, currentY2);
425 
426  currentY1 -= (ySize+ySpacing);
427  currentY2 -= (ySize+ySpacing);
428 
429  nTribeDwarven.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
430  guiCaptionNTribeDwarven.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
431 
432  currentY1 -= (ySize+ySpacing);
433  currentY2 -= (ySize+ySpacing);
434 
435  nTribeElven.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
436  guiCaptionNTribeElven.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
437 
438  currentY1 -= (ySize+ySpacing);
439  currentY2 -= (ySize+ySpacing);
440 
441  nTribe.setPanel(leftColumnCenterX-20, currentY1, leftColumnCenterX+120, currentY2);
442  guiCaptionNTribe.setPanel(leftColumnCenterX-180, currentY1, leftColumnCenterX-20, currentY2);
443 
444  currentY1 -= (ySize+ySpacing);
445  currentY2 -= (ySize+ySpacing);
446 
447  buttonGenerate.setPanel(leftColumnCenterX-170, currentY1, leftColumnCenterX+110, currentY2);
448 
449  currentY1 -= (ySize+ySpacing);
450  currentY2 -= (ySize+ySpacing);
451 
452  buttonSimWorld.setPanel(leftColumnCenterX-170, currentY1, leftColumnCenterX+110, currentY2);
453 
454  currentY1 -= (ySize+ySpacing);
455  currentY2 -= (ySize+ySpacing);
456 
457  buttonExportData.setPanel(leftColumnCenterX-170, currentY1, leftColumnCenterX+110, currentY2);
458 
459  currentY1 -= (ySize+ySpacing);
460  currentY2 -= (ySize+ySpacing);
461 
462  buttonLoadWorld.setPanel(leftColumnCenterX-170, currentY1, leftColumnCenterX+110, currentY2);
463 
464  buttonExpandPreviewWindow.setPanel(0,0,32,32);
465 
466 
467  if(fullScreenPreview==false)
468  {
469  //std::cout<<"Preview mode.\n";
470  int panelSizeX = panelX2-panelX1;
471  int panelSizeY = panelY2-panelY1;
472 
473  int worldPreviewX1=panelX1+(panelSizeX/2);
474  int worldPreviewY1=panelY1+(panelSizeY/2);
475 
476  //worldViewer.setPanel(worldPreviewX1,worldPreviewY1,panelX2,panelY2);
477  //buttonExpandPreviewWindow.setPanel(worldPreviewX1,worldPreviewY1,worldPreviewX1+16,worldPreviewY1+16);
478 
479  /* Put worldviewer in top right corner of panel. */
480  //worldViewer.setPanel(panelX2/2,panelY2/2,panelX2,panelY2);
481  worldViewer.setPanel(panelX2/2,panelY1 ,panelX2,panelY2);
482  }
483  else
484  {
485  //std::cout<<"Fullscreen preview.\n";
486  //worldViewer.setPanel(panelX1,panelY1,panelX2,panelY2);
487  //buttonExpandPreviewWindow.setPanel(panelX1,panelY1,panelX1+16,panelY1+16);
488  /* Make worldviewer fill screen. */
489  worldViewer.setPanel(panelX1,panelY1,panelX2,panelY2);
490  }
491  }
492 
493  void render()
494  {
495 
496  //This is a quickstart option to quickly generate a world.
497  // For some reason generating a world too early can cause a crash on
498  // subsequent generate calls.
499  // Moving the quickstart to the first render call seems to resolve this.
500  if ( QUICKSTART_GENERATOR )
501  {
502  eventGenerate();
503  QUICKSTART_GENERATOR=false;
504  }
505 
506  // if ( textEntryWorldName.selected == true )
507  // { HOTKEYS_ENABLED=false; }
508  // else
509  // { HOTKEYS_ENABLED=true; }
510 
511 
512  /* World preview takes top-right quarter of screen. */
513  if(fullScreenPreview==false)
514  {
515  int panelSizeX = panelX2-panelX1;
516  int panelSizeY = panelY2-panelY1;
517 
518  int worldPreviewX1=panelX1+(panelSizeX/2);
519  //int worldPreviewY1=panelY1+(panelSizeY/2);
520  int worldPreviewY1=panelY1;
521 
522 
523  /* Background image. */
524  //Renderer::placeTexture4(panelX1,panelY1,panelX2,panelY2,backgroundTexture,true);
525  //Renderer::placeTexture4(panelX1,panelY1,panelX2,panelY2,&TEX_WORLD_UNIT_NOMAD_01,true);
526  //Renderer::placeColour4(0,0,0,worldPreviewX1,worldPreviewY1,panelX2,panelY2);
527 
528  //worldViewer.setPanel(worldPreviewX1,worldPreviewY1,panelX2,panelY2);
529  //buttonExpandPreviewWindow.setPanel(worldPreviewX1,worldPreviewY1,worldPreviewX1+16,worldPreviewY1+16);
530 
531 
532 
533  }
534  else
535  {
536  //Renderer::placeColour4(0,0,0,panelX1,panelY1,panelX2,panelY2);
537  //worldViewer.setPanel(panelX1,panelY1,panelX2,panelY2);
538  //buttonExpandPreviewWindow.setPanel(panelX1,panelY1,panelX1+16,panelY1+16);
539 
540  }
541  Renderer::placeTexture4(panelX1,panelY1,panelX2,panelY2,backgroundTexture,true);
542  //Renderer::placeTexture4(panelX1,panelY1,panelX2,panelY2,backgroundTexture,true);
544  /* Render GUI controls. */
545  guiManager.render();
546 
547 
548  }
549 
550  bool keyboardEvent(Keyboard* _keyboard)
551  {
552  if ( guiManager.keyboardEvent(_keyboard) )
553  {
554  return true;
555  }
556 
557  // TAB will switch between adventure mode and god mode.
558  else if(_keyboard->isPressed(Keyboard::TAB))
559  {
560  std::cout<<"Enter World Simulator to enable Adventure mode\n";
561  _keyboard->unpress(Keyboard::TAB);
562  }
563 
564  else if(_keyboard->isPressed(Keyboard::ONE)) /* Flush console. */
565  {
566  eventGenerate();
567  _keyboard->unpress(Keyboard::ONE);
568  return true;
569  }
570 
571  else if(_keyboard->isPressed(Keyboard::TWO)) /* Flush console. */
572  {
573  _keyboard->unpress(Keyboard::TWO);
574  if (world.generated == true)
575  {
578  }
579  else
580  {
581  std::cout<<"You must first generate a world.\n";
582  }
583  }
584  else
585  {
586  worldViewer.keyboardEvent(_keyboard);
587  }
588 
589  return false;
590  }
591 
592  bool mouseEvent (Mouse* _mouse)
593  {
594  worldViewer.mouseEvent(_mouse);
595 
596  /* If the guiManager did something with the mouse event. */
597  if(guiManager.mouseEvent(_mouse)==true)
598  {
599 
600  if(buttonBack.clicked==true)
601  {
602  buttonBack.unclick();
603  active=false;
604  }
605  if(buttonGenerate.clicked==true)
606  {
607  buttonGenerate.unclick();
608  eventGenerate();
609  buttonGenerate.unclick();
610  }
611  if(buttonExpandPreviewWindow.clicked==true)
612  {
613  fullScreenPreview=!fullScreenPreview;
614  /* World preview takes top-right quarter of screen. */
615  if(fullScreenPreview==false)
616  {
617  /* Shrink the preview window. Restore GUI. */
618 
619  int panelSizeX = panelX2-panelX1;
620  int panelSizeY = panelY2-panelY1;
621 
622  int worldPreviewX1=panelX1+(panelSizeX/2);
623  int worldPreviewY1=panelY1+(panelSizeY/2);
624 
625  buttonSimWorld.active=true;
626  buttonExportData.active=true;
627  buttonLoadWorld.active=true;
628  buttonGenerate.active=true;
629  textEntryWorldName.active=true;
630  textEntryFullSeed.active=true;
631  textEntryFullBiome.active=true;
632  textWorldSize.active=true;
633  textFreeSteps.active=true;
634  textIslandMode.active=true;
635  textWrapX.active=true;
636  textWrapY.active=true;
637  //Not currently functional
638  //buttonBack.active=true;
639  buttonBack.active=false;
640  worldSize.active=true;
641  freeSteps.active=true;
642  guiWrapX.active=true;
643  guiWrapY.active=true;
644  guiIslandMode.active=true;
645 
646 
647 
648  worldViewer.setPanel(panelX2/2,panelY2/2,panelX2,panelY2);
649  }
650  else
651  {
652  /* Expand the preview window. Hide GUI. */
653  worldViewer.setPanel(panelX1,panelY1,panelX2,panelY2);
654  }
655  buttonExpandPreviewWindow.unclick();
656  }
657  if(buttonSimWorld.clicked==true)
658  {
659  buttonSimWorld.unclick();
660  if (world.generated == true)
661  {
664  }
665  else
666  {
667  std::cout<<"You must first generate a world.\n";
668  }
669 
670  }
671  if ( buttonExportData.clicked==true)
672  {
673  std::cout<<"Export data\n";
674  world.save();
675  buttonExportData.unclick();
676  }
677 
678  if ( buttonLoadWorld.clicked==true)
679  {
680  buttonLoadWorld.unclick();
681  }
682  }
683  return false;
684  }
685 
687  {
688  return guiManager.stealKeyboard();
689  }
690 
692  {
693  // First check to ensure the world has a name. Important because it's also the name of the savefile.
694 
695  if ( textEntryWorldName.input == "" )
696  {
697  std::cout<<"Error: World needs a name.\n";
698  }
699  else if (DataTools::isAlphaNumeric(textEntryWorldName.input,true) == false)
700  {
701  std::cout<<"Error: World name must be alphanumeric.\n";
702  textEntryWorldName.input="";
703  }
704  else
705  {
706  int worldSizeV = DataTools::toInt(worldSize.getCurrentOption());
707 
708  if (worldSizeV<0 || worldSizeV>100000)
709  {
710  std::cout<<"Warning. Strange worldsize. Attempting to continue.\n";
711  }
712  // If a seed string has been entered, either use the actual number,
713  // or hash it to a number if it contains non-numeric characters.
714  // This allows for a word seed to have a numeric equivalent.
715  int seed = 0;
716  if (textEntryFullSeed.input != "")
717  {
718  if ( DataTools::isNumeric(textEntryFullSeed.input))
719  {
720  seed = DataTools::toInt(textEntryFullSeed.input);
721  }
722  else
723  {
724  std::hash<std::string> hasher;
725  seed=hasher(textEntryFullSeed.input);
726  if ( seed < 0 )
727  {
728  seed *= -1;
729  }
730  }
731  }
732 
733  // GET FRAGMENTATION
734  int fragmentation = DataTools::toInt(freeSteps.getCurrentOption());
735 
736  bool islandMode = true;
737  if ( guiIslandMode.currentOption==1 )
738  {
739  islandMode=false;
740  }
741 
742  bool wrapX = true;
743  if ( guiWrapX.currentOption==1 )
744  {
745  wrapX=false;
746  }
747  bool wrapY = true;
748  if ( guiWrapY.currentOption==1 )
749  {
750  wrapY=false;
751  }
752 
753  double landPercent = (double) nLandPercent.currentValue / 100;
754 
755  world.generateWorld(textEntryWorldName.input,worldSizeV,worldSizeV,seed,fragmentation,islandMode,wrapX,wrapY,landPercent); /* MEMORY LEAK */
756  world.nameRegions();
757  world.generateTribes(nTribe.currentValue,nTribeDwarven.currentValue,nTribeElven.currentValue);
758  }
759  }
760 
761  // Load the specified world into the generator.
762  void eventLoad()
763  {
764  // First check to ensure the world has a name. Important because it's also the name of the savefile.
765  if ( textEntryWorldName.input == "" )
766  {
767  std::cout<<"Error: World needs a name.\n";
768  }
769  else if (DataTools::isAlphaNumeric(textEntryWorldName.input) == false)
770  {
771  std::cout<<"Error: World name must be alphanumeric.\n";
772  textEntryWorldName.input="";
773  }
774  else
775  {
776  world.loadWorld(textEntryWorldName.input);
777  }
778 
779  }
780 
781 };
782 
783 #endif
WorldViewer worldViewer
Definition: Driver.cpp:35
const int DEFAULT_WORLD_SIZE_SLOT
Definition: Driver_Settings.cpp:131
World * world
Definition: World_Viewer.hpp:90
void generateTribes(int, int, int)
Definition: World.cpp:853
void logicTick()
Definition: Menu_WorldGenerator.hpp:109
void generateWorld(const std::string, const int, const int, int, int, const bool, const bool, const bool, const double)
Definition: World.cpp:1469
void init()
Definition: Menu_WorldGenerator.hpp:117
World world
Definition: Driver.cpp:45
Menu_WorldGenerator()
Definition: Menu_WorldGenerator.hpp:93
void render()
Definition: World_Viewer.hpp:523
virtual void save()
Definition: World.cpp:2604
void eventGenerate()
Definition: Menu_WorldGenerator.hpp:691
WorldViewer_Minimap minimap
Definition: World_Viewer_Minimap.hpp:145
GUI_Manager globalGuiManager
Definition: Driver_GlobalObjects.hpp:102
void startSimulation()
Definition: World.cpp:218
bool QUICKSTART_GENERATOR
Definition: Driver_Settings.cpp:117
const int DEFAULT_NUMBER_TRIBES_HUMAN
Definition: Driver_Settings.cpp:134
Definition: Driver_Settings_Enums.hpp:24
bool mouseEvent(Mouse *_mouse)
Definition: Menu_WorldGenerator.hpp:592
Definition: Menu_WorldGenerator.hpp:23
void eventResize()
Definition: Menu_WorldGenerator.hpp:363
void eventLoad()
Definition: Menu_WorldGenerator.hpp:762
const int DEFAULT_NUMBER_TRIBES_ELVEN
Definition: Driver_Settings.cpp:135
void setFont(Wildcat::Font *_font)
Definition: Menu_WorldGenerator.hpp:103
enumMenu activeMenu
Definition: Driver_Settings_Enums.hpp:29
void setPanel(const int _x1, const int _y1, const int _x2, const int _y2)
Definition: World_Viewer.hpp:318
void render()
Definition: Menu_WorldGenerator.hpp:493
void nameRegions()
Definition: World.cpp:450
const int DEFAULT_NUMBER_CIVS
Definition: Driver_Settings.cpp:136
bool mouseEvent(Mouse *mouse)
Definition: World_Viewer.hpp:261
bool stealKeyboard()
Definition: Menu_WorldGenerator.hpp:686
bool generated
Definition: World.hpp:71
World * world
Definition: World_Viewer_Minimap.hpp:26
bool active
Definition: World_Viewer.hpp:66
const int DEFAULT_NUMBER_TRIBES_DWARVEN
Definition: Driver_Settings.cpp:133
bool keyboardEvent(Keyboard *_keyboard)
Definition: World_Viewer.hpp:181
bool loadWorld(std::string)
Definition: World.cpp:2474
bool keyboardEvent(Keyboard *_keyboard)
Definition: Menu_WorldGenerator.hpp:550