Implementation of keys. Completely untested
This commit is contained in:
parent
1065216b67
commit
59a1e81c6e
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#include <SDL.h>
|
#include <SDL.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
#include <assert.h>
|
||||||
|
|
||||||
#include "item_builder.h"
|
#include "item_builder.h"
|
||||||
#include "texture.h"
|
#include "texture.h"
|
||||||
|
@ -28,6 +29,7 @@
|
||||||
#include "texturecache.h"
|
#include "texturecache.h"
|
||||||
#include "sprite.h"
|
#include "sprite.h"
|
||||||
#include "sprite_util.h"
|
#include "sprite_util.h"
|
||||||
|
#include "map.h"
|
||||||
|
|
||||||
static ItemBuilder *builder = NULL;
|
static ItemBuilder *builder = NULL;
|
||||||
|
|
||||||
|
@ -150,6 +152,44 @@ item_builder_build_treasure(Treasure type, double goldAmt)
|
||||||
return item;
|
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 *
|
static Item *
|
||||||
create_treasure(int current_level)
|
create_treasure(int current_level)
|
||||||
{
|
{
|
||||||
|
|
|
@ -56,6 +56,9 @@ item_builder_build_container(const char *path0, const char *path1, SDL_Rect clip
|
||||||
Item *
|
Item *
|
||||||
item_builder_build_treasure(Treasure type, double goldAmt);
|
item_builder_build_treasure(Treasure type, double goldAmt);
|
||||||
|
|
||||||
|
Item *
|
||||||
|
item_builder_build_key(unsigned int type);
|
||||||
|
|
||||||
void
|
void
|
||||||
item_builder_close(void);
|
item_builder_close(void);
|
||||||
|
|
||||||
|
|
|
@ -640,8 +640,7 @@ resetGame(void)
|
||||||
info("Building new map");
|
info("Building new map");
|
||||||
gMap = map_lua_generator_run(cLevel, mode, gPlayer, gRenderer);
|
gMap = map_lua_generator_run(cLevel, mode, gPlayer, gRenderer);
|
||||||
|
|
||||||
gPlayer->sprite->pos = (Position) {
|
player_reset_on_levelchange(gPlayer);
|
||||||
TILE_DIMENSION, TILE_DIMENSION };
|
|
||||||
|
|
||||||
map_set_current_room(gMap, &gPlayer->sprite->pos);
|
map_set_current_room(gMap, &gPlayer->sprite->pos);
|
||||||
camera_follow_position(gCamera, &gPlayer->sprite->pos);
|
camera_follow_position(gCamera, &gPlayer->sprite->pos);
|
||||||
|
|
14
src/map.c
14
src/map.c
|
@ -26,6 +26,7 @@
|
||||||
#include "particle_engine.h"
|
#include "particle_engine.h"
|
||||||
#include "update_data.h"
|
#include "update_data.h"
|
||||||
#include "trap.h"
|
#include "trap.h"
|
||||||
|
#include "mixer.h"
|
||||||
|
|
||||||
static Room*
|
static Room*
|
||||||
create_room(void)
|
create_room(void)
|
||||||
|
@ -450,6 +451,19 @@ map_trigger_tile_fall(MapTile *tile)
|
||||||
tile->lethal = true;
|
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
|
void
|
||||||
map_destroy(Map *map)
|
map_destroy(Map *map)
|
||||||
{
|
{
|
||||||
|
|
|
@ -128,6 +128,9 @@ map_set_current_room(Map*, Position*);
|
||||||
void
|
void
|
||||||
map_trigger_tile_fall(MapTile *tile);
|
map_trigger_tile_fall(MapTile *tile);
|
||||||
|
|
||||||
|
bool
|
||||||
|
map_open_door(MapTile *tile, Player *player);
|
||||||
|
|
||||||
void
|
void
|
||||||
map_destroy(Map*);
|
map_destroy(Map*);
|
||||||
|
|
||||||
|
|
10
src/player.c
10
src/player.c
|
@ -240,6 +240,7 @@ has_collided(Player *player, RoomMatrix *matrix, Vector2d direction)
|
||||||
if (space->monster) {
|
if (space->monster) {
|
||||||
on_monster_collision(player, space->monster, matrix, direction);
|
on_monster_collision(player, space->monster, matrix, direction);
|
||||||
} else if (space->door) {
|
} else if (space->door) {
|
||||||
|
// Open the door
|
||||||
mixer_play_effect(DOOR_OPEN);
|
mixer_play_effect(DOOR_OPEN);
|
||||||
space->door->sprite->texture_index = 1;
|
space->door->sprite->texture_index = 1;
|
||||||
space->door->collider = false;
|
space->door->collider = false;
|
||||||
|
@ -521,6 +522,7 @@ player_create(class_t class, Camera *cam)
|
||||||
player->animationTimer = _timer_create();
|
player->animationTimer = _timer_create();
|
||||||
player->swordAnimation = animation_create(5);
|
player->swordAnimation = animation_create(5);
|
||||||
player->equipment.hasArtifacts = false;
|
player->equipment.hasArtifacts = false;
|
||||||
|
player->equipment.keys = 0;
|
||||||
player->stateData.shopOwnerKiller = false;
|
player->stateData.shopOwnerKiller = false;
|
||||||
|
|
||||||
build_sword_animation(player, cam->renderer);
|
build_sword_animation(player, cam->renderer);
|
||||||
|
@ -574,6 +576,14 @@ player_create(class_t class, Camera *cam)
|
||||||
return player;
|
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 player_get_xp_data(Player *p)
|
||||||
{
|
{
|
||||||
ExperienceData data;
|
ExperienceData data;
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct ArtifactData {
|
||||||
typedef struct PlayerEquipment {
|
typedef struct PlayerEquipment {
|
||||||
ArtifactData artifacts[LAST_ARTIFACT_EFFECT];
|
ArtifactData artifacts[LAST_ARTIFACT_EFFECT];
|
||||||
bool hasArtifacts;
|
bool hasArtifacts;
|
||||||
|
Uint32 keys;
|
||||||
} PlayerEquipment;
|
} PlayerEquipment;
|
||||||
|
|
||||||
typedef struct PlayerStateData {
|
typedef struct PlayerStateData {
|
||||||
|
@ -88,6 +89,9 @@ typedef struct Player {
|
||||||
Player*
|
Player*
|
||||||
player_create(class_t, Camera*);
|
player_create(class_t, Camera*);
|
||||||
|
|
||||||
|
void
|
||||||
|
player_reset_on_levelchange(Player *player);
|
||||||
|
|
||||||
ExperienceData
|
ExperienceData
|
||||||
player_get_xp_data(Player*);
|
player_get_xp_data(Player*);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue