From 59a1e81c6e49b96229f4aeb6d892888375da03f4 Mon Sep 17 00:00:00 2001 From: Linus Probert Date: Mon, 18 Mar 2019 11:39:26 +0100 Subject: [PATCH] Implementation of keys. Completely untested --- src/item_builder.c | 40 ++++++++++++++++++++++++++++++++++++++++ src/item_builder.h | 3 +++ src/main.c | 3 +-- src/map.c | 14 ++++++++++++++ src/map.h | 3 +++ src/player.c | 10 ++++++++++ src/player.h | 4 ++++ 7 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/item_builder.c b/src/item_builder.c index f49703b..12e60ed 100644 --- a/src/item_builder.c +++ b/src/item_builder.c @@ -18,6 +18,7 @@ #include #include +#include #include "item_builder.h" #include "texture.h" @@ -28,6 +29,7 @@ #include "texturecache.h" #include "sprite.h" #include "sprite_util.h" +#include "map.h" static ItemBuilder *builder = NULL; @@ -150,6 +152,44 @@ item_builder_build_treasure(Treasure type, double goldAmt) return item; } +static void +pickup_silver_key(Item *item, Player *player) +{ + UNUSED(item); + player->equipment.keys &= LOCK_SILVER; +} + +static void +pickup_gold_key(Item *item, Player *player) +{ + UNUSED(item); + player->equipment.keys &= LOCK_GOLD; +} + +Item * +item_builder_build_key(unsigned int type) +{ + char label[20]; + SDL_Rect clip = CLIP16(0, 0); + Item *item; + switch (type) { + case 1: + m_sprintf(label, 20, "a silver key"); + item = create_item("Items/Key.png", NULL, clip, &pickup_silver_key); + break; + case 2: + m_sprintf(label, 20, "a gold key"); + item = create_item("Items/Key.png", NULL, clip, &pickup_gold_key); + clip.x = 16; + break; + default: + fatal("Bad keytype provided"); + } + + m_strcpy(item->label, 20, label); + return item; +} + static Item * create_treasure(int current_level) { diff --git a/src/item_builder.h b/src/item_builder.h index 38cff4a..5d595ba 100644 --- a/src/item_builder.h +++ b/src/item_builder.h @@ -56,6 +56,9 @@ item_builder_build_container(const char *path0, const char *path1, SDL_Rect clip Item * item_builder_build_treasure(Treasure type, double goldAmt); +Item * +item_builder_build_key(unsigned int type); + void item_builder_close(void); diff --git a/src/main.c b/src/main.c index 070d5a2..8ec6c0f 100644 --- a/src/main.c +++ b/src/main.c @@ -640,8 +640,7 @@ resetGame(void) info("Building new map"); gMap = map_lua_generator_run(cLevel, mode, gPlayer, gRenderer); - gPlayer->sprite->pos = (Position) { - TILE_DIMENSION, TILE_DIMENSION }; + player_reset_on_levelchange(gPlayer); map_set_current_room(gMap, &gPlayer->sprite->pos); camera_follow_position(gCamera, &gPlayer->sprite->pos); diff --git a/src/map.c b/src/map.c index f757c34..dc76e9a 100644 --- a/src/map.c +++ b/src/map.c @@ -26,6 +26,7 @@ #include "particle_engine.h" #include "update_data.h" #include "trap.h" +#include "mixer.h" static Room* create_room(void) @@ -450,6 +451,19 @@ map_trigger_tile_fall(MapTile *tile) tile->lethal = true; } +bool +map_open_door(MapTile *tile, Player *player) +{ + if (tile->lockType == LOCK_NONE || tile->lockType & player->equipment.keys) { + // Open the door + mixer_play_effect(DOOR_OPEN); + tile->sprite->texture_index = 1; + tile->collider = false; + return true; + } + return false; +} + void map_destroy(Map *map) { diff --git a/src/map.h b/src/map.h index 20d99b5..ad0524c 100644 --- a/src/map.h +++ b/src/map.h @@ -128,6 +128,9 @@ map_set_current_room(Map*, Position*); void map_trigger_tile_fall(MapTile *tile); +bool +map_open_door(MapTile *tile, Player *player); + void map_destroy(Map*); diff --git a/src/player.c b/src/player.c index 78b37fe..c3f4d50 100644 --- a/src/player.c +++ b/src/player.c @@ -240,6 +240,7 @@ has_collided(Player *player, RoomMatrix *matrix, Vector2d direction) if (space->monster) { on_monster_collision(player, space->monster, matrix, direction); } else if (space->door) { + // Open the door mixer_play_effect(DOOR_OPEN); space->door->sprite->texture_index = 1; space->door->collider = false; @@ -521,6 +522,7 @@ player_create(class_t class, Camera *cam) player->animationTimer = _timer_create(); player->swordAnimation = animation_create(5); player->equipment.hasArtifacts = false; + player->equipment.keys = 0; player->stateData.shopOwnerKiller = false; build_sword_animation(player, cam->renderer); @@ -574,6 +576,14 @@ player_create(class_t class, Camera *cam) return player; } +void +player_reset_on_levelchange(Player *player) +{ + player->sprite->pos = (Position) { + TILE_DIMENSION, TILE_DIMENSION }; + player->equipment.keys = 0; +} + ExperienceData player_get_xp_data(Player *p) { ExperienceData data; diff --git a/src/player.h b/src/player.h index b0cde67..b8f3216 100644 --- a/src/player.h +++ b/src/player.h @@ -60,6 +60,7 @@ typedef struct ArtifactData { typedef struct PlayerEquipment { ArtifactData artifacts[LAST_ARTIFACT_EFFECT]; bool hasArtifacts; + Uint32 keys; } PlayerEquipment; typedef struct PlayerStateData { @@ -88,6 +89,9 @@ typedef struct Player { Player* player_create(class_t, Camera*); +void +player_reset_on_levelchange(Player *player); + ExperienceData player_get_xp_data(Player*);