From 7e1dffb45ea4ec9d6ad4db73d1ab44ef2435fa94 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Thu, 7 Mar 2019 11:09:14 +0100 Subject: [PATCH] Shops implemented Only need to add the shopkeeper now --- data/layoutparser.lua | 11 +++++-- data/mapgen.lua | 22 +++++++++++--- data/maproombuilder.lua | 12 +++++++- data/menumapgen.lua | 2 +- data/shoplayouts.dat | 64 +++++++++++++++++++++++++++++++++++++++++ src/artifact.c | 49 ++++++++++++++++++++++--------- src/artifact.h | 3 +- src/item_builder.c | 21 -------------- src/main.c | 5 +++- src/map_lua.c | 48 ++++++++++++++++++++++++++++--- src/map_lua.h | 2 +- 11 files changed, 189 insertions(+), 50 deletions(-) create mode 100644 data/shoplayouts.dat diff --git a/data/layoutparser.lua b/data/layoutparser.lua index 97bd89e..28a4a4a 100644 --- a/data/layoutparser.lua +++ b/data/layoutparser.lua @@ -153,7 +153,7 @@ function module.load_textures(map, wall_xoffset, wall_yoffset) fences = { topleft = { t_fence, nil, 0, yo, true }, top = { t_fence, nil, 16, yo, true }, - single = { t_fence, nil, 16, yo + 16, true }, + single = { t_fence, nil, 0, yo + 16, true }, topright = { t_fence, nil, 32, yo, true }, left = { t_fence, nil, 0, yo + 16, true }, bottomleft = { t_fence, nil, 0, yo + 32, true }, @@ -167,7 +167,7 @@ function module.load_textures(map, wall_xoffset, wall_yoffset) } end -function draw_layout_to_room(room, matrix) +function draw_layout_to_room(room, matrix, roomx, roomy) -- Chose a random layout matrix = matrix[random(#matrix)] for i=2,13 do @@ -178,6 +178,8 @@ function draw_layout_to_room(room, matrix) setBlockTile(room, matrix, i, j, walls, "#", false) elseif matrix[i][j] == "f" then setBlockTile(room, matrix, i, j, fences, "f", true) + elseif matrix[i][j] == "a" then + create_shop_artifact(map, (roomx*512) + i*32, (roomy * 384) + j*32) end end end @@ -201,4 +203,9 @@ function module.add_pits_to_room(room) return true end +function module.add_shop_layout(room, roomx, roomy) + draw_layout_to_room(room, readLayoutFile("shoplayouts.dat"), roomx, roomy) + return true +end + return module diff --git a/data/mapgen.lua b/data/mapgen.lua index ff7f3c8..6c17ab9 100644 --- a/data/mapgen.lua +++ b/data/mapgen.lua @@ -49,9 +49,11 @@ local function generate_path () local direction = 0 local lastDirection = 0 local coridoor_count = 0 + local shopLevel = CURRENT_LEVEL % 4 == 0 local bossLevel = CURRENT_LEVEL % 5 == 0 if QUICK_MODE then bossLevel = CURRENT_LEVEL % 3 == 0 + shopLevel = CURRENT_LEVEL % 2 == 0 end local coverage = 8 + CURRENT_LEVEL if bossLevel or CURRENT_LEVEL == 1 then @@ -59,6 +61,11 @@ local function generate_path () end if ARCADE_MODE then coverage = 40 + shopLevel = true + end + + if shopLevel then + coverage = coverage + 1 end -- Create the first room @@ -114,17 +121,24 @@ local function generate_path () local roomCount = 0 local bossAdded = false + local shopAdded = false -- Build all the rooms for i=1,10 do for j=1,10 do room = map_matrix[i][j] if room then + if roomCount > 3 and shopLevel and not shopAdded then + room.type = "shop" + shopAdded = true + end roomCount = roomCount + 1 - room_builder.build_room(room) - monster_gen.add_monsters_to_room(room, i-1, j-1) - trap_gen.add_traps_to_room(room, i-1, j-1) - chest_gen.add_chests_to_room(room, i-1, j-1) + room_builder.build_room(room, i-1, j-1) + if room.type ~= "shop" then + monster_gen.add_monsters_to_room(room, i-1, j-1) + trap_gen.add_traps_to_room(room, i-1, j-1) + chest_gen.add_chests_to_room(room, i-1, j-1) + end if roomCount > 3 and bossLevel and not bossAdded then bossAdded = true monster_gen.add_boss_to_room(room, i-1, j-1) diff --git a/data/maproombuilder.lua b/data/maproombuilder.lua index c8bcdf5..eb60d9c 100644 --- a/data/maproombuilder.lua +++ b/data/maproombuilder.lua @@ -345,6 +345,14 @@ local function add_level_exit(room) end end +local function build_shop_room(room, roomx, roomy) + add_tiles_to_room(room, false) + add_walls_to_room(room) + add_exits_to_room(room) + layoutparser.add_shop_layout(room, roomx, roomy) + return room +end + local function build_normal_room(room) local crumbling = (CURRENT_LEVEL > 3 or QUICK_MODE) and random(8) == 1 @@ -429,9 +437,11 @@ function module.create_empty_room() return room end -function module.build_room(room) +function module.build_room(room, roomx, roomy) if room.type == "coridoor" then build_coridoor_room(room) + elseif room.type == "shop" then + build_shop_room(room, roomx, roomy) else build_normal_room(room) end diff --git a/data/menumapgen.lua b/data/menumapgen.lua index 1f041ad..82b949a 100644 --- a/data/menumapgen.lua +++ b/data/menumapgen.lua @@ -9,7 +9,7 @@ room_builder.load_textures(map) set_current_room(map, 0, 0) local room = room_builder.create_empty_room() -room_builder.build_room(room) +room_builder.build_room(room, 0, 0) room_builder.add_full_lighting(room) monster_gen.add_monsters_to_room(room, 0, 0) trap_gen.add_traps_to_room(room, 0, 0) diff --git a/data/shoplayouts.dat b/data/shoplayouts.dat new file mode 100644 index 0000000..cfe0d7d --- /dev/null +++ b/data/shoplayouts.dat @@ -0,0 +1,64 @@ +++++++++++++++++ +++++++++++++++++ +++##ffffffff##++ +++##--------##++ +++f---a--a---f++ +++-----------f++ +++-----------f++ +++f---a--a---f++ +++##--------##++ +++##ffffffff##++ +++++++++++++++++ +++++++++++++++++ + +++++++++++++++++ +++++++++++++++++ +++ffff----ffff++ +++fppf-a--fppf++ +++ffff----ffff++ +++------a-----++ +++------------++ +++ffff-a--ffff++ +++fppf----fppf++ +++ffff--a-ffff++ +++++++++++++++++ +++++++++++++++++ + +++++++++++++++++ +++++++++++++++++ +++############++ +++#----------#++ +++#-########-#++ +++--#aa--aa#-#++ +++--#--------#++ +++#-########-#++ +++#----------#++ +++############++ +++++++++++++++++ +++++++++++++++++ + +++++++++++++++++ +++++++++++++++++ +++--pppppppp--++ +++--pffffffp--++ +++--pf---afp--++ +++-------afp--++ +++-------afp--++ +++--pf---afp--++ +++--pffffffp--++ +++--pppppppp--++ +++++++++++++++++ +++++++++++++++++ + +++++++++++++++++ +++++++++++++++++ +++pppppppppppp++ +++ppffffffffpp++ +++fffa----afff++ +++------------++ +++------------++ +++fffa----afff++ +++ppffffffffpp++ +++pppppppppppp++ +++++++++++++++++ +++++++++++++++++ diff --git a/src/artifact.c b/src/artifact.c index 5315376..84b456d 100644 --- a/src/artifact.c +++ b/src/artifact.c @@ -22,6 +22,7 @@ #include "particle_engine.h" #include "player.h" #include "random.h" +#include "sprite_util.h" static void artifact_set_effect(Artifact *a, MagicalEffect effect) @@ -91,6 +92,20 @@ static int RogueArtifacts[] = { PHASE_IMPROVEMENT // 7 }; +static void +add_level_sprite(Artifact *a) +{ + Sprite *sprite = sprite_util_create_text_sprite("GUI/SDS_8x8.ttf", + 8, + C_BLUE, + C_BLACK, + "%u", + a->level); + sprite->pos = a->sprite->pos; + sprite->offset = POS(32 - sprite->dim.width, 32 - sprite->dim.height); + a->levelSprite = sprite; +} + Artifact * artifact_create_random(Player *p, Uint8 level) { @@ -110,25 +125,22 @@ artifact_create_random(Player *p, Uint8 level) Artifact *a = artifact_create(artifactPool[option]); a->level = level; + if (level > 1) + add_level_sprite(a); return a; } void -artifact_add_price(Artifact *a, unsigned int price, SDL_Renderer *renderer) +artifact_add_price(Artifact *a, unsigned int price) { - Sprite *sprite = sprite_create(); - sprite_load_text_texture(sprite, "GUI/SDS_8x8.ttf", 0, 8, 1); - char priceLabel[9]; - m_sprintf(priceLabel, 9, "$%d", price); - texture_load_from_text(sprite->textures[0], - priceLabel, - C_YELLOW, - C_BLACK, - renderer); - - sprite->dim = sprite->textures[0]->dim; - + Sprite *sprite = sprite_util_create_text_sprite("GUI/SDS_8x8.ttf", + 8, + C_YELLOW, + C_BLACK, + "$%u", + price); + sprite->pos = a->sprite->pos; a->price = price; a->priceSprite = sprite; } @@ -196,6 +208,7 @@ artifact_create(MagicalEffect effect) Artifact *a = ec_malloc(sizeof(Artifact)); a->sprite = artifact_sprite_for(effect); a->priceSprite = NULL; + a->levelSprite = NULL; a->sprite->dim = GAME_DIMENSION; a->collected = false; a->level = 1; @@ -220,8 +233,14 @@ artifact_render(Artifact *a, Camera *cam) pos.x += 4; pos.y += 4; particle_engine_sparkle(pos, DIM(24, 24), C_PURPLE, false); - if (a->priceSprite) + if (a->priceSprite) { + a->priceSprite->pos = a->sprite->pos; sprite_render(a->priceSprite, cam); + } + if (a->levelSprite) { + a->levelSprite->pos = a->sprite->pos; + sprite_render(a->levelSprite, cam); + } } void @@ -230,5 +249,7 @@ artifact_destroy(Artifact *a) sprite_destroy(a->sprite); if (a->priceSprite) sprite_destroy(a->priceSprite); + if (a->levelSprite) + sprite_destroy(a->levelSprite); free(a); } diff --git a/src/artifact.h b/src/artifact.h index 17f841f..3c5d24e 100644 --- a/src/artifact.h +++ b/src/artifact.h @@ -41,6 +41,7 @@ typedef struct ArtifactInfo { typedef struct Artifact { Sprite *sprite; Sprite *priceSprite; + Sprite *levelSprite; MagicalEffect effect; ArtifactInfo info; bool collected; @@ -55,7 +56,7 @@ Artifact * artifact_create_random(Player*, Uint8 level); void -artifact_add_price(Artifact*, unsigned int price, SDL_Renderer *renderer); +artifact_add_price(Artifact*, unsigned int price); Artifact * artifact_create(MagicalEffect); diff --git a/src/item_builder.c b/src/item_builder.c index 4ebad69..d779b60 100644 --- a/src/item_builder.c +++ b/src/item_builder.c @@ -101,27 +101,6 @@ create_item(const char *path0, const char *path1, SDL_Rect clip, void (*cb)(Item return item; } -static Item * -create_priced_item(double price, - const char *path0, - const char *path1, - SDL_Rect clip, - void (*cb)(Item *, Player*)) -{ - Item *item = create_item(path0, path1, clip, cb); - item->price = price; - - Sprite *priceSprite = sprite_util_create_text_sprite("GUI/SDS_8x8.ttf", - 8, - C_YELLOW, - C_BLACK, - "$%.0f", - price); - linkedlist_append(&item->subsprites, priceSprite); - - return item; -} - static void pickup_gold(Item *item, Player *player) { diff --git a/src/main.c b/src/main.c index c873b58..7f57606 100644 --- a/src/main.c +++ b/src/main.c @@ -350,6 +350,9 @@ startGame(void) if (gPlayer) player_destroy(gPlayer); gPlayer = player_create(playerClass, gCamera); +#ifdef DEBUG + gPlayer->gold = 400; +#endif mixer_play_music(GAME_MUSIC0 + get_random(2)); resetGame(); skillbar_reset(gSkillBar); @@ -636,7 +639,7 @@ resetGame(void) mode = ARCADE; info("Building new map"); - gMap = map_lua_generator_run(cLevel, mode, gRenderer); + gMap = map_lua_generator_run(cLevel, mode, gPlayer, gRenderer); gPlayer->sprite->pos = (Position) { TILE_DIMENSION, TILE_DIMENSION }; diff --git a/src/map_lua.c b/src/map_lua.c index e2bd492..65ae4dc 100644 --- a/src/map_lua.c +++ b/src/map_lua.c @@ -37,6 +37,7 @@ #include "item_builder.h" #include "random.h" #include "bh_random.h" +#include "artifact.h" static lua_State* load_lua_state(void) @@ -94,6 +95,18 @@ SDL_Renderer* luaL_checksdlrenderer(lua_State *L) return renderer; } +static Player* +luaL_checkplayer(lua_State *L) +{ + Player *player; + lua_getglobal(L, "_game_player"); + if (!lua_islightuserdata(L, -1)) + fatal("in luaL_checkplayer(), pointer lost in lua script"); + + player = lua_touserdata(L, -1); + return player; +} + static int l_map_set_current_room_modifier(lua_State *L) { @@ -492,8 +505,29 @@ l_get_random(lua_State *L) return 1; } +static int +l_create_shop_artifact(lua_State *L) +{ + Player *player = luaL_checkplayer(L); + + if (player == NULL) + return 0; + + Map *map = luaL_checkmap(L, 1); + int x = (int) luaL_checkinteger(L, 2); + int y = (int) luaL_checkinteger(L, 3); + + Artifact *a = artifact_create_random(player, 2); + a->sprite->pos = POS(x, y); + artifact_add_price(a, map->level * 50); + + linkedlist_append(&map->artifacts, a); + + return 0; +} + static Map* -generate_map(unsigned int level, const char *file, GameMode gameMode, SDL_Renderer *renderer) +generate_map(unsigned int level, const char *file, GameMode gameMode, Player *player, SDL_Renderer *renderer) { int status, result; @@ -515,6 +549,12 @@ generate_map(unsigned int level, const char *file, GameMode gameMode, SDL_Render lua_pushlightuserdata(L, renderer); lua_setglobal(L, "_sdl_renderer"); + lua_pushlightuserdata(L, player); + lua_setglobal(L, "_game_player"); + + lua_pushcfunction(L, l_create_shop_artifact); + lua_setglobal(L, "create_shop_artifact"); + lua_pushcfunction(L, l_create_map); lua_setglobal(L, "create_map"); @@ -594,13 +634,13 @@ generate_map(unsigned int level, const char *file, GameMode gameMode, SDL_Render Map* map_lua_generator_single_room__run(unsigned int level, SDL_Renderer *renderer) { char file[] = "menumapgen.lua"; - return generate_map(level, file, REGULAR, renderer); + return generate_map(level, file, REGULAR, NULL, renderer); } -Map* map_lua_generator_run(unsigned int level, GameMode gameMode, SDL_Renderer *renderer) +Map* map_lua_generator_run(unsigned int level, GameMode gameMode, Player *player, SDL_Renderer *renderer) { char file[] = "mapgen.lua"; - return generate_map(level, file, gameMode, renderer); + return generate_map(level, file, gameMode, player, renderer); } diff --git a/src/map_lua.h b/src/map_lua.h index 2a5b568..0392973 100644 --- a/src/map_lua.h +++ b/src/map_lua.h @@ -22,7 +22,7 @@ #include "map.h" #include "defines.h" -Map* map_lua_generator_run(unsigned int level, GameMode gameMode, SDL_Renderer *renderer); +Map* map_lua_generator_run(unsigned int level, GameMode gameMode, Player *player, SDL_Renderer *renderer); Map* map_lua_generator_single_room__run(unsigned int level, SDL_Renderer *renderer); #endif // MAP_LUA_H_