Incomplete monster key fixes
This commit is contained in:
parent
59a1e81c6e
commit
18987e2c2a
|
@ -214,16 +214,16 @@ function module.load_textures(map, wall_xoffset, wall_yoffset)
|
|||
doors = {
|
||||
door_top_nolock = { t_door0, t_door1, 0, 0, true },
|
||||
door_left_nolock = { t_door0, t_door1, 16, 0, true },
|
||||
door_top_silverlock = { t_door0, t_door1, 32, 0, true },
|
||||
door_left_silverlock = { t_door0, t_door1, 48, 0, true },
|
||||
door_top_goldlock = { t_door0, t_door1, 64, 0, true },
|
||||
door_left_goldlock = { t_door0, t_door1, 80, 0, true },
|
||||
door_top_silverlock = { t_door0, t_door1, 32, 0, true, false, false, false, 1 },
|
||||
door_left_silverlock = { t_door0, t_door1, 48, 0, true, false, false, false, 1 },
|
||||
door_top_goldlock = { t_door0, t_door1, 64, 0, true, false, false, false, 2 },
|
||||
door_left_goldlock = { t_door0, t_door1, 80, 0, true, false, false, false, 2 },
|
||||
gate_top_nolock = { t_door0, t_door1, 0, 32, true },
|
||||
gate_left_nolock = { t_door0, t_door1, 16, 32, true },
|
||||
gate_top_silverlock = { t_door0, t_door1, 32, 32, true },
|
||||
gate_left_silverlock = { t_door0, t_door1, 48, 32, true },
|
||||
gate_top_goldlock = { t_door0, t_door1, 64, 32, true },
|
||||
gate_left_goldlock = { t_door0, t_door1, 80, 32, true },
|
||||
gate_top_silverlock = { t_door0, t_door1, 32, 32, true, false, false, false, 1 },
|
||||
gate_left_silverlock = { t_door0, t_door1, 48, 32, true, false, false, false, 1 },
|
||||
gate_top_goldlock = { t_door0, t_door1, 64, 32, true, false, false, false, 2 },
|
||||
gate_left_goldlock = { t_door0, t_door1, 80, 32, true, false, false, false, 2 },
|
||||
}
|
||||
|
||||
lights = {
|
||||
|
@ -351,6 +351,10 @@ function draw_layout_to_room(room, matrix, roomx, roomy)
|
|||
room.chests[i][j] = chest
|
||||
elseif matrix[i][j] == "d" then
|
||||
room.doors[i][j] = getDoor(matrix, i, j, doors.door_top_nolock, doors.door_left_nolock)
|
||||
elseif matrix[i][j] == "S" then
|
||||
room.doors[i][j] = getDoor(matrix, i, j, doors.door_top_silverlock, doors.door_left_silverlock)
|
||||
elseif matrix[i][j] == "G" then
|
||||
room.doors[i][j] = getDoor(matrix, i, j, doors.door_top_goldlock, doors.door_left_goldlock)
|
||||
elseif matrix[i][j] == "g" then
|
||||
room.doors[i][j] = getDoor(matrix, i, j, doors.gate_top_nolock, doors.gate_left_nolock)
|
||||
end
|
||||
|
|
|
@ -1,12 +1,12 @@
|
|||
++++++++++++++++
|
||||
++++++++++++++++
|
||||
++"#####d####"++
|
||||
++"#####G####"++
|
||||
++#-c--c--c--#++
|
||||
++#----------#++
|
||||
++#-c--c--c--#++
|
||||
++d----------d++
|
||||
++G----------S++
|
||||
++#-c--c--c--#++
|
||||
++#----------#++
|
||||
++"#####d####"++
|
||||
++"#####S####"++
|
||||
++++++++++++++++
|
||||
++++++++++++++++
|
|
@ -132,6 +132,7 @@ local function generate_path ()
|
|||
room.type = "shop"
|
||||
shopAdded = true
|
||||
end
|
||||
room.type = "locked"
|
||||
roomCount = roomCount + 1
|
||||
room_builder.build_room(room, i-1, j-1)
|
||||
if room.type ~= "shop" then
|
||||
|
|
|
@ -121,7 +121,8 @@ local function repack(data)
|
|||
isCollider = data[5] or false,
|
||||
isLightSource = data[6] or false,
|
||||
isLevelExit = data[7] or false,
|
||||
isLethal = data[8] or false
|
||||
isLethal = data[8] or false,
|
||||
lockType = data[9] or 0
|
||||
}
|
||||
end
|
||||
|
||||
|
@ -509,6 +510,8 @@ function module.build_room(room, roomx, roomy)
|
|||
build_coridoor_room(room)
|
||||
elseif room.type == "shop" then
|
||||
build_shop_room(room, roomx, roomy)
|
||||
elseif room.type == "locked" then
|
||||
build_locked_room(room, roomx, roomy)
|
||||
else
|
||||
build_normal_room(room)
|
||||
--build_locked_room(room, roomx, roomy)
|
||||
|
|
|
@ -456,6 +456,9 @@ map_open_door(MapTile *tile, Player *player)
|
|||
{
|
||||
if (tile->lockType == LOCK_NONE || tile->lockType & player->equipment.keys) {
|
||||
// Open the door
|
||||
if (tile->lockType != LOCK_NONE)
|
||||
gui_log("You unlocked a door!");
|
||||
|
||||
mixer_play_effect(DOOR_OPEN);
|
||||
tile->sprite->texture_index = 1;
|
||||
tile->collider = false;
|
||||
|
|
|
@ -182,6 +182,7 @@ extract_tile_data(lua_State *L,
|
|||
int tile_x, tile_y;
|
||||
int t_index0, t_index1, tile_clip_x, tile_clip_y;
|
||||
bool collider, lightsource, levelExit, lethal;
|
||||
int lockType;
|
||||
|
||||
map = luaL_checkmap(L, 1);
|
||||
tile_x = (int) luaL_checkinteger(L, 2);
|
||||
|
@ -200,18 +201,20 @@ extract_tile_data(lua_State *L,
|
|||
lua_getfield(L, 4, "isLightSource");
|
||||
lua_getfield(L, 4, "isLevelExit");
|
||||
lua_getfield(L, 4, "isLethal");
|
||||
lua_getfield(L, 4, "lockType");
|
||||
|
||||
t_index0 = (int) luaL_checkinteger(L, -8);
|
||||
t_index1 = (int) luaL_checkinteger(L, -7);
|
||||
tile_clip_x = (int) luaL_checkinteger(L, -6);
|
||||
tile_clip_y = (int) luaL_checkinteger(L, -5);
|
||||
collider = lua_toboolean(L, -4);
|
||||
lightsource = lua_toboolean(L, -3);
|
||||
levelExit = lua_toboolean(L, -2);
|
||||
lethal = lua_toboolean(L, -1);
|
||||
t_index0 = (int) luaL_checkinteger(L, -9);
|
||||
t_index1 = (int) luaL_checkinteger(L, -8);
|
||||
tile_clip_x = (int) luaL_checkinteger(L, -7);
|
||||
tile_clip_y = (int) luaL_checkinteger(L, -6);
|
||||
collider = lua_toboolean(L, -5);
|
||||
lightsource = lua_toboolean(L, -4);
|
||||
levelExit = lua_toboolean(L, -3);
|
||||
lethal = lua_toboolean(L, -2);
|
||||
lockType = (int) luaL_checkinteger(L, -1);
|
||||
|
||||
// Clear the stack
|
||||
lua_pop(L, 8);
|
||||
lua_pop(L, 9);
|
||||
|
||||
Position tilePos = (Position) { tile_x, tile_y };
|
||||
SDL_Rect clip = (SDL_Rect) { tile_clip_x, tile_clip_y, 16, 16 };
|
||||
|
@ -227,6 +230,7 @@ extract_tile_data(lua_State *L,
|
|||
tile->lightsource = lightsource;
|
||||
tile->levelExit = levelExit;
|
||||
tile->lethal = lethal;
|
||||
tile->lockType = lockType;
|
||||
|
||||
f_add_tile(map, &tilePos, tile);
|
||||
}
|
||||
|
@ -386,6 +390,24 @@ l_add_chest(lua_State *L)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
l_add_key_to_random_monster(lua_State *L)
|
||||
{
|
||||
Map *map = luaL_checkmap(L, 0);
|
||||
int keytype = (int) luaL_checkinteger(L, 1);
|
||||
|
||||
unsigned int max = linkedlist_size(&map->monsters);
|
||||
unsigned int index = bh_map_rand(max - 1);
|
||||
|
||||
Monster *m = linkedlist_get(&map->monsters, index);
|
||||
if (!m)
|
||||
return 0;
|
||||
|
||||
m->items.keyType = keytype;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
l_add_monster(lua_State *L)
|
||||
{
|
||||
|
|
|
@ -266,6 +266,7 @@ monster_create(void)
|
|||
m->state.forceCount = 0;
|
||||
m->boss = false;
|
||||
m->bloodlust = false;
|
||||
m->items.keyType = LOCK_NONE;
|
||||
monster_set_behaviour(m, NORMAL);
|
||||
|
||||
return m;
|
||||
|
@ -704,6 +705,12 @@ monster_drop_loot(Monster *monster, Map *map, Player *player)
|
|||
linkedlist_append(&map->items, treasure);
|
||||
}
|
||||
|
||||
if (monster->items.keyType != LOCK_NONE) {
|
||||
Item *key = item_builder_build_key(monster->items.keyType);
|
||||
key->sprite->pos = monsterTilePos;
|
||||
linkedlist_append(&map->items, key);
|
||||
}
|
||||
|
||||
if (monster->stats.lvl > 2 && get_random(29) == 0) {
|
||||
Artifact *a = artifact_create_random(player, 1);
|
||||
a->sprite->pos = monsterTilePos;
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
#include "linkedlist.h"
|
||||
|
||||
struct UpdateData;
|
||||
enum DoorLockType;
|
||||
|
||||
typedef enum {
|
||||
PACIFIST,
|
||||
|
@ -63,6 +64,10 @@ typedef struct MonsterStateIndicator {
|
|||
int displayCount;
|
||||
} MonsterStateIndicator;
|
||||
|
||||
typedef struct MonsterItems {
|
||||
enum DoorLockType keyType;
|
||||
} MonsterItems;
|
||||
|
||||
typedef struct Monster {
|
||||
char *label;
|
||||
char *lclabel;
|
||||
|
@ -71,6 +76,7 @@ typedef struct Monster {
|
|||
State state;
|
||||
MonsterStateIndicator stateIndicator;
|
||||
MonsterBehaviour behaviour;
|
||||
MonsterItems items;
|
||||
unsigned int steps;
|
||||
bool boss;
|
||||
bool bloodlust;
|
||||
|
|
12
src/player.c
12
src/player.c
|
@ -239,15 +239,15 @@ has_collided(Player *player, RoomMatrix *matrix, Vector2d direction)
|
|||
gamecontroller_rumble(0.30f, 100);
|
||||
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;
|
||||
} else if (space->door && map_open_door(space->door, player)) {
|
||||
// Door opened, pass
|
||||
} else {
|
||||
mixer_play_effect(BONK);
|
||||
camera_shake(direction, 100);
|
||||
gui_log("Ouch! There is something in the way");
|
||||
if (space->door)
|
||||
gui_log("Ouch! That door seems to be locked");
|
||||
else
|
||||
gui_log("Ouch! There is something in the way");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue