diff --git a/src/gameloop.c b/src/gameloop.c index b227d94..72205dc 100644 --- a/src/gameloop.c +++ b/src/gameloop.c @@ -22,7 +22,7 @@ long l, gameTime; World world = { 0 }; int - /* 1: Main menu + /* 0: Main menu * 2: World select * 3: World creation * 4: Loading @@ -135,6 +135,11 @@ int gameLoop ( if (state_title(renderer, inputs, &gameState)) return 0; break; + // World creation menu + case 3: + state_newWorld(renderer, inputs, &gameState, &world.type); + break; + // Generate a world and present a loading screen case 4: if (state_loading(renderer, &world, seed, player.pos)) { diff --git a/src/gui.c b/src/gui.c index 33e3418..d42084e 100644 --- a/src/gui.c +++ b/src/gui.c @@ -43,7 +43,7 @@ int drawChar (SDL_Renderer *renderer,int c, int x, int y) { * specified x and y coordinates, and then returns the x position * it left off on. */ -int drawStr (SDL_Renderer *renderer,char *str, int x, int y) { +int drawStr (SDL_Renderer *renderer, const char *str, int x, int y) { while (*str > 0) { x += drawChar(renderer, *(str++), x, y); } @@ -53,7 +53,7 @@ int drawStr (SDL_Renderer *renderer,char *str, int x, int y) { /* shadowStr * Identical to drawStr, but draws white text with a grey shadow. */ -int shadowStr (SDL_Renderer *renderer, char *str, int x, int y) { +int shadowStr (SDL_Renderer *renderer, const char *str, int x, int y) { SDL_SetRenderDrawColor(renderer, 77, 77, 77, 255); drawStr(renderer, str, x + 1, y + 1); white(renderer); @@ -63,18 +63,17 @@ int shadowStr (SDL_Renderer *renderer, char *str, int x, int y) { /* centerStr * Identical to drawStr, but centers the text */ -int centerStr (SDL_Renderer *renderer, char *str, int x, int y) { +int centerStr (SDL_Renderer *renderer, const char *str, int x, int y) { x *= 2; - char *strsave = str; - while (*str > 0) { - x -= font[(int)*(str++)][8]; + int i = 0; + while (str[i] > 0) { + x -= font[(int)str[i++]][8]; } - str = strsave; x /= 2; - - while(*str > 0) { - x += drawChar(renderer, *(str++), x, y); + i = 0; + while(str[i] > 0) { + x += drawChar(renderer, str[i++], x, y); } return x; @@ -83,7 +82,7 @@ int centerStr (SDL_Renderer *renderer, char *str, int x, int y) { /* shadowStr * Identical to centerStr, but draws white text with a grey shadow. */ -int shadowCenterStr (SDL_Renderer *renderer, char *str, int x, int y) { +int shadowCenterStr (SDL_Renderer *renderer, const char *str, int x, int y) { SDL_SetRenderDrawColor(renderer, 77, 77, 77, 255); centerStr(renderer, str, x + 1, y + 1); white(renderer); @@ -93,15 +92,14 @@ int shadowCenterStr (SDL_Renderer *renderer, char *str, int x, int y) { /* drawBig * Draws centered text at a large scale */ -int drawBig (SDL_Renderer *renderer, char *str, int x, int y) { - char *strsave = str; - while (*str > 0) - x -= font[(int)*(str++)][8]; +int drawBig (SDL_Renderer *renderer, const char *str, int x, int y) { + int i = 0; + while (str[i] > 0) + x -= font[(int)str[i++]][8]; - str = strsave; - - while (*str > 0) { - int c = *(str++); + i = 0; + while (str[i] > 0) { + int c = str[i++]; for (int yy = 0; yy < 16; yy++) { for (int xx = 0; xx < 16; xx++) { if ((font[c][yy / 2] >> (7 - xx / 2)) & 0x1) { @@ -126,16 +124,15 @@ int drawBig (SDL_Renderer *renderer, char *str, int x, int y) { */ int drawBGStr ( SDL_Renderer *renderer, - char *str, int x, int y + const char *str, int x, int y ) { static int len; static SDL_Rect bg = {0, 0, 0, 9}; - static char *strBak; - strBak = str; + int i = 0; len = 0; - while(*str > 0) { - len += font[(int)*(str++)][8]; + while(str[i] > 0) { + len += font[(int)str[i++]][8]; } bg.x = x; @@ -146,7 +143,7 @@ int drawBGStr ( SDL_RenderFillRect(renderer, &bg); white(renderer); - return drawStr(renderer, strBak, ++x, ++y); + return drawStr(renderer, str, ++x, ++y); } /* button @@ -156,7 +153,7 @@ int drawBGStr ( */ int button ( SDL_Renderer *renderer, - char *str, + const char *str, int x, int y, int w, int mouseX, int mouseY ) { @@ -288,7 +285,7 @@ void dirtBg (SDL_Renderer *renderer) { */ void loadScreen ( SDL_Renderer *renderer, - char *str, + const char *str, float prog, float max ) { dirtBg(renderer); @@ -317,7 +314,7 @@ void loadScreen ( /* chatAdd * Adds a message to chat */ -void chatAdd (char *str) { +void chatAdd (const char *str) { chatHistoryFade[chatHistoryIndex] = 480; memcpy ( chatHistory[(chatHistoryIndex)++], diff --git a/src/gui.h b/src/gui.h index 65c22fb..0d31ca9 100644 --- a/src/gui.h +++ b/src/gui.h @@ -8,18 +8,18 @@ #include "textures.h" void strnum (char*, int, int); -int drawChar (SDL_Renderer*, int, int, int); -int drawStr (SDL_Renderer*, char*, int, int); -int shadowStr (SDL_Renderer*, char*, int, int); -int centerStr (SDL_Renderer*, char*, int, int); -int shadowCenterStr (SDL_Renderer*, char*, int, int); -int drawBig (SDL_Renderer*, char*, int, int); -int drawBGStr (SDL_Renderer*, char*, int, int); -int button (SDL_Renderer*, char*, int, int, int, int, int); +int drawChar (SDL_Renderer*, int, int, int); +int drawStr (SDL_Renderer*, const char*, int, int); +int shadowStr (SDL_Renderer*, const char*, int, int); +int centerStr (SDL_Renderer*, const char*, int, int); +int shadowCenterStr (SDL_Renderer*, const char*, int, int); +int drawBig (SDL_Renderer*, const char*, int, int); +int drawBGStr (SDL_Renderer*, const char*, int, int); +int button (SDL_Renderer*, const char*, int, int, int, int, int); int drawSlot (SDL_Renderer*, InvSlot*, int, int, int, int); void dirtBg (SDL_Renderer*); -void loadScreen (SDL_Renderer*, char*, float, float); -void chatAdd (char*); +void loadScreen (SDL_Renderer*, const char*, float, float); +void chatAdd (const char*); void white (SDL_Renderer*); void tblack (SDL_Renderer*); diff --git a/src/menus.c b/src/menus.c index c31e1eb..3ef0bcc 100644 --- a/src/menus.c +++ b/src/menus.c @@ -4,10 +4,7 @@ int menu_optionsMain (SDL_Renderer *, Inputs *, int *, int *); /* === GAME STATES === */ -int state_title ( - SDL_Renderer *renderer, Inputs *inputs, - int *gameState -) { +int state_title (SDL_Renderer *renderer, Inputs *inputs, int *gameState) { inputs->mouse.x /= BUFFER_SCALE; inputs->mouse.y /= BUFFER_SCALE; @@ -27,7 +24,7 @@ int state_title ( inputs->mouse.x, inputs->mouse.y) && inputs->mouse.left ) { - *gameState = 4; + *gameState = 3; } if (button(renderer, "Options", @@ -49,6 +46,49 @@ int state_title ( return 0; } +const char *terrainNames[16] = { + "Classic terrain", + "New terrain", + "Flat stone", + "Flat grass" +}; + +void state_newWorld ( + SDL_Renderer *renderer, + Inputs *inputs, + int *gameState, + int *type +) { + inputs->mouse.x /= BUFFER_SCALE; + inputs->mouse.y /= BUFFER_SCALE; + + dirtBg(renderer); + + if (button(renderer, terrainNames[*type], + BUFFER_HALF_W - 64, 20, 128, + inputs->mouse.x, inputs->mouse.y) && + inputs->mouse.left + ) { + *type = (*type + 1) % 4; + } + + if (button(renderer, "Cancel", + BUFFER_HALF_W - 64, 64, 61, + inputs->mouse.x, inputs->mouse.y) && + inputs->mouse.left + ) { + *gameState = 0; + } + + if (button(renderer, "Generate", + BUFFER_HALF_W + 3, 64, 61, + inputs->mouse.x, inputs->mouse.y) && + inputs->mouse.left + ) { + *gameState = 4; + } +} + int state_loading ( SDL_Renderer *renderer, World *world, @@ -72,7 +112,7 @@ int state_loading ( world, seed, chunkLoadCoords.x, chunkLoadCoords.y, - chunkLoadCoords.z, 1, 1, + chunkLoadCoords.z, world->type, 1, center ); loadScreen ( diff --git a/src/menus.h b/src/menus.h index 1127a13..8e6db73 100644 --- a/src/menus.h +++ b/src/menus.h @@ -5,6 +5,7 @@ #include "main.h" int state_title (SDL_Renderer *, Inputs *, int *); +void state_newWorld (SDL_Renderer *, Inputs *, int *, int *); int state_loading (SDL_Renderer *, World *, unsigned int, Coords); void state_options (SDL_Renderer *, Inputs *, int *, int *, int *); void state_egg (SDL_Renderer *, Inputs *, int *); diff --git a/src/terrain.h b/src/terrain.h index d7781da..c2c9d6b 100644 --- a/src/terrain.h +++ b/src/terrain.h @@ -52,5 +52,6 @@ struct _Chunk { * Stores chunks. */ struct _World { + int type; Chunk chunk[CHUNKARR_SIZE]; };