Added world creation screen

This commit is contained in:
Sasha Koshka
2022-04-29 22:19:45 -04:00
parent 2bad750d07
commit d2dda9c93e
6 changed files with 89 additions and 45 deletions

View File

@@ -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)) {

View File

@@ -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)++],

View File

@@ -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*);

View File

@@ -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 (

View File

@@ -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 *);

View File

@@ -52,5 +52,6 @@ struct _Chunk {
* Stores chunks.
*/
struct _World {
int type;
Chunk chunk[CHUNKARR_SIZE];
};