From f5a23d679818ef7cc6e798c67d8528bf0dbfe335 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Tue, 5 Dec 2017 08:13:28 +0100 Subject: [PATCH] Nicer map creation with walls. --- TODO.txt | 10 ++++++++ data/mapgen.lua | 67 +++++++++++++++++++++++++++++++++---------------- src/camera.c | 4 +++ src/map.c | 34 ++++++++++++++----------- src/map.h | 8 +++--- src/map_lua.c | 40 +++++++++++++++++++++-------- src/player.c | 1 + 7 files changed, 115 insertions(+), 49 deletions(-) create mode 100644 TODO.txt diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 0000000..3efac50 --- /dev/null +++ b/TODO.txt @@ -0,0 +1,10 @@ +x Add walls and stuff to maps +- Implement simple box collisions +- Add enemies (generated through lua) +- Htting enemies +- Moving enemies +- Lower levels +- XP +- gui +- Items +- More gui diff --git a/data/mapgen.lua b/data/mapgen.lua index 3a859ec..19f924b 100644 --- a/data/mapgen.lua +++ b/data/mapgen.lua @@ -1,24 +1,46 @@ -function add_tiles_to_room (map, room_x, room_y, texture) - for i=0,11 do - for j=0,15 do +function add_tiles_to_room (map, texture) + for i=0,15 do + for j=0,11 do + if (i >= 1 and i <= 14 and j >= 1 and j <= 10) then + if (i == 1 and j == 1) then + add_tile(map, i, j, texture, 0, 48, false) + elseif (i == 1 and j == 10) then + add_tile(map, i, j, texture, 0, 80, false) + elseif (i == 14 and j == 1) then + add_tile(map, i, j, texture, 32, 48, false) + elseif (i == 14 and j == 10) then + add_tile(map, i, j, texture, 32, 80, false) + elseif (i == 1) then + add_tile(map, i, j, texture, 0, 64, false) + elseif (j == 1) then + add_tile(map, i, j, texture, 16, 48, false) + elseif (i == 14) then + add_tile(map, i, j, texture, 32, 64, false) + elseif (j == 10) then + add_tile(map, i, j, texture, 16, 80, false) + else + add_tile(map, i, j, texture, 16, 64, false) + end + end + end + end +end + +function add_walls_to_room (map, texture) + for i=0,15 do + for j=0,11 do if (i == 0 and j == 0) then - add_tile(map, room_x, room_y, i, j, texture, 0, 48) - elseif (i == 11 and j == 0) then - add_tile(map, room_x, room_y, i, j, texture, 0, 80) - elseif (i == 0 and j == 15) then - add_tile(map, room_x, room_y, i, j, texture, 32, 48) - elseif (i == 11 and j == 15) then - add_tile(map, room_x, room_y, i, j, texture, 32, 80) - elseif (i == 0) then - add_tile(map, room_x, room_y, i, j, texture, 16, 48) - elseif (j == 0) then - add_tile(map, room_x, room_y, i, j, texture, 0, 64) - elseif (i == 11) then - add_tile(map, room_x, room_y, i, j, texture, 16, 80) - elseif (j == 15) then - add_tile(map, room_x, room_y, i, j, texture, 32, 64) - else - add_tile(map, room_x, room_y, i, j, texture, 16, 64) + add_tile(map, i, j, texture, 0, 48, true) + elseif (i == 15 and j == 0) then + add_tile(map, i, j, texture, 32, 48, true) + elseif (i == 0 and j == 11) then + add_tile(map, i, j, texture, 0, 80, true) + elseif (i == 15 and j == 11) then + add_tile(map, i, j, texture, 32, 80, true) + elseif (i == 0 or i == 15) then + add_tile(map, i, j, texture, 0, 64, true) + elseif (j == 0 or j == 11) then + add_tile(map, i, j, texture, 16, 48, true) end end end @@ -29,9 +51,12 @@ map = create_map() -- add_tile(map, 1, 2, 3) local floorTexture = add_texture(map, "assets/Objects/Floor.png") +local wallTexture = add_texture(map, "assets/Objects/Wall.png") for i=0,9 do for j=0,9 do - add_tiles_to_room(map, i, j, floorTexture); + set_current_room(map, i, j); + add_tiles_to_room(map, floorTexture); + add_walls_to_room(map, wallTexture); end end diff --git a/src/camera.c b/src/camera.c index ea077ce..bf5a432 100644 --- a/src/camera.c +++ b/src/camera.c @@ -18,11 +18,15 @@ void camera_follow_position(Camera *cam, Position *pos) if (pos->x <= 0) cam->pos.x = 0; + else if (pos->x >= room_width * MAP_H_ROOM_COUNT) + cam->pos.x = room_width * (MAP_H_ROOM_COUNT - 1); else cam->pos.x = pos->x - (pos->x % room_width); if (pos->y <= 0) cam->pos.y = 0; + else if (pos->y >= room_height * MAP_V_ROOM_COUNT) + cam->pos.y = room_height * (MAP_V_ROOM_COUNT - 1); else cam->pos.y = pos->y - (pos->y % room_height); } diff --git a/src/map.c b/src/map.c index cbd63b0..cecccb4 100644 --- a/src/map.c +++ b/src/map.c @@ -9,8 +9,8 @@ Room* create_room() Room *room; room = ec_malloc(sizeof(Room)); - for (i=0; i < MAP_ROOM_HEIGHT; ++i) { - for (j=0; j < MAP_ROOM_WIDTH; ++j) { + for (i=0; i < MAP_ROOM_WIDTH; ++i) { + for (j=0; j < MAP_ROOM_HEIGHT; ++j) { room->tiles[i][j] = NULL; } } @@ -26,8 +26,8 @@ Map* map_create() map->currentRoom = (Position) { 0, 0 }; map->level = 1; - for (i=0; i < MAP_V_ROOM_COUNT; ++i) { - for (j=0; j < MAP_H_ROOM_COUNT; ++j) { + for (i=0; i < MAP_H_ROOM_COUNT; ++i) { + for (j=0; j < MAP_V_ROOM_COUNT; ++j) { map->rooms[i][j] = create_room(); } } @@ -35,9 +35,10 @@ Map* map_create() return map; } -void map_add_tile(Map *map, Position *room_pos, Position *tile_pos, MapTile *tile) +void map_add_tile(Map *map, Position *tile_pos, MapTile *tile) { - MapTile **oldTile = &map->rooms[room_pos->x][room_pos->y]->tiles[tile_pos->x][tile_pos->y]; + const Position *cr = &map->currentRoom; + MapTile **oldTile = &map->rooms[cr->x][cr->y]->tiles[tile_pos->x][tile_pos->y]; if (*oldTile != NULL) { free(*oldTile); *oldTile = NULL; @@ -87,11 +88,11 @@ void map_render(Map *map, Camera *cam) }; room = map->rooms[roomPos.x][roomPos.y]; - for (i=0; i < MAP_ROOM_HEIGHT; ++i) { - for (j=0; j < MAP_ROOM_WIDTH; ++j) { + for (i=0; i < MAP_ROOM_WIDTH; ++i) { + for (j=0; j < MAP_ROOM_HEIGHT; ++j) { Position tilePos = (Position) { - roomCords.x + j*TILE_DIMENSION, - roomCords.y + i*TILE_DIMENSION + roomCords.x + i*TILE_DIMENSION, + roomCords.y + j*TILE_DIMENSION }; map_tile_render(map, room->tiles[i][j], &tilePos, cam); } @@ -118,14 +119,19 @@ void map_set_current_room(Map *map, Position *pos) unsigned int room_cord_y = pos->y - (pos->y % room_height); map->currentRoom.y = room_cord_y / room_height; } + + if (map->currentRoom.x >= MAP_H_ROOM_COUNT) + map->currentRoom.x = MAP_H_ROOM_COUNT - 1; + if (map->currentRoom.y >= MAP_V_ROOM_COUNT) + map->currentRoom.y = MAP_V_ROOM_COUNT - 1; } static void map_room_destroy(Room *room) { int i, j; - for (i=0; i < MAP_ROOM_HEIGHT; ++i) { - for (j=0; j < MAP_ROOM_WIDTH; ++j) { + for (i=0; i < MAP_ROOM_WIDTH; ++i) { + for (j=0; j < MAP_ROOM_HEIGHT; ++j) { if (room->tiles[i][j]) { free(room->tiles[i][j]); } @@ -137,8 +143,8 @@ void map_room_destroy(Room *room) void map_destroy(Map *map) { int i, j; - for (i=0; i < MAP_V_ROOM_COUNT; ++i) { - for (j=0; j < MAP_H_ROOM_COUNT; ++j) { + for (i=0; i < MAP_H_ROOM_COUNT; ++i) { + for (j=0; j < MAP_V_ROOM_COUNT; ++j) { map_room_destroy(map->rooms[i][j]); } } diff --git a/src/map.h b/src/map.h index eacfb9c..1524d08 100644 --- a/src/map.h +++ b/src/map.h @@ -2,6 +2,7 @@ #define MAP_H_ #include +#include #include #include "sprite.h" @@ -17,14 +18,15 @@ typedef struct { unsigned int textureIndex; SDL_Rect clip; + bool collider; } MapTile; typedef struct { - MapTile* tiles[MAP_ROOM_HEIGHT][MAP_ROOM_WIDTH]; + MapTile* tiles[MAP_ROOM_WIDTH][MAP_ROOM_HEIGHT]; } Room; typedef struct { - Room* rooms[MAP_V_ROOM_COUNT][MAP_H_ROOM_COUNT]; + Room* rooms[MAP_H_ROOM_COUNT][MAP_V_ROOM_COUNT]; LinkedList *textures; Position currentRoom; int level; @@ -34,7 +36,7 @@ Map* map_create(); int map_add_texture(Map*, const char *path, SDL_Renderer*); -void map_add_tile(Map *map, Position *room_pos, Position *tile_pos, MapTile*); +void map_add_tile(Map *map, Position *tile_pos, MapTile*); void map_render(Map*, Camera*); diff --git a/src/map_lua.c b/src/map_lua.c index 43b7b7a..eb0428d 100644 --- a/src/map_lua.c +++ b/src/map_lua.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -54,6 +55,21 @@ SDL_Renderer* luaL_checksdlrenderer(lua_State *L) return renderer; } +static +int l_map_set_current_room(lua_State *L) +{ + Map *map; + unsigned int room_x, room_y; + + map = luaL_checkmap(L, 1); + room_x = luaL_checkinteger(L, 2); + room_y = luaL_checkinteger(L, 3); + + map->currentRoom = (Position) { room_y, room_x }; + + return 0; +} + static int l_add_texture(lua_State *L) { @@ -74,26 +90,25 @@ static int l_add_tile(lua_State *L) { Map *map; - int room_x, room_y, tile_x, tile_y; + int tile_x, tile_y; int texture_index, tile_clip_x, tile_clip_y; + bool collider; map = luaL_checkmap(L, 1); - room_x = luaL_checkinteger(L, 2); - room_y = luaL_checkinteger(L, 3); - tile_x = luaL_checkinteger(L, 4); - tile_y = luaL_checkinteger(L, 5); - texture_index = luaL_checkinteger(L, 6); - tile_clip_x = luaL_checkinteger(L, 7); - tile_clip_y = luaL_checkinteger(L, 8); + tile_x = luaL_checkinteger(L, 2); + tile_y = luaL_checkinteger(L, 3); + texture_index = luaL_checkinteger(L, 4); + tile_clip_x = luaL_checkinteger(L, 5); + tile_clip_y = luaL_checkinteger(L, 6); + collider = lua_toboolean(L, 7); - Position roomPos = (Position) { room_x, room_y }; Position tilePos = (Position) { tile_x, tile_y }; SDL_Rect clip = (SDL_Rect) { tile_clip_x, tile_clip_y, 16, 16 }; MapTile *tile = malloc(sizeof(MapTile)); - *tile = (MapTile) { texture_index, clip }; + *tile = (MapTile) { texture_index, clip, collider }; - map_add_tile(map, &roomPos, &tilePos, tile); + map_add_tile(map, &tilePos, tile); return 0; } @@ -125,6 +140,9 @@ Map* map_lua_generator_run(SDL_Renderer *renderer) lua_pushcfunction(L, l_add_texture); lua_setglobal(L, "add_texture"); + lua_pushcfunction(L, l_map_set_current_room); + lua_setglobal(L, "set_current_room"); + result = lua_pcall(L, 0, LUA_MULTRET, 0); if (result) { fprintf(stderr, "[!!] Failed to run script: %s\n", lua_tostring(L, -1)); diff --git a/src/player.c b/src/player.c index 2b247ca..f4ef29a 100644 --- a/src/player.c +++ b/src/player.c @@ -59,6 +59,7 @@ Sprite* player_create(class_t class, SDL_Renderer *renderer) } sprite_load_texture(player, asset, renderer); + player->pos = (Position) { 64, 64 }; player->texture->clip = (SDL_Rect) { 0, 0, 16, 16 }; player->texture->dim = (Dimension) { 64, 64 }; player->handle_event = &handle_player_input;