Completes crumbling rooms.

This commit is contained in:
Linus Probert 2018-10-15 22:19:23 +02:00
parent 6e6f28dd8e
commit feed0e29fa
9 changed files with 32 additions and 18 deletions

View File

@ -222,28 +222,28 @@ local function add_pits_to_room(room)
return true return true
end end
local function add_tiles_to_room (room) local function add_tiles_to_room (room, singletile)
for i=0,15 do for i=0,15 do
for j=0,11 do for j=0,11 do
if (i >= 1 and i <= 14 and j >= 1 and j <= 10) then if (i >= 1 and i <= 14 and j >= 1 and j <= 10) then
if (i == 1 and j == 1) then if (i == 1 and j == 1) then
room.tiles[i][j] = floor.topleft room.tiles[i][j] = singletile and floor.single or floor.topleft
elseif (i == 14 and j == 1) then elseif (i == 14 and j == 1) then
room.tiles[i][j] = floor.topright room.tiles[i][j] = singletile and floor.single or floor.topright
elseif (i == 1 and j == 10) then elseif (i == 1 and j == 10) then
room.tiles[i][j] = floor.bottomleft room.tiles[i][j] = singletile and floor.single or floor.bottomleft
elseif (i == 14 and j == 10) then elseif (i == 14 and j == 10) then
room.tiles[i][j] = floor.bottomright room.tiles[i][j] = singletile and floor.single or floor.bottomright
elseif (i == 1) then elseif (i == 1) then
room.tiles[i][j] = floor.left room.tiles[i][j] = singletile and floor.single or floor.left
elseif (i == 14) then elseif (i == 14) then
room.tiles[i][j] = floor.right room.tiles[i][j] = singletile and floor.single or floor.right
elseif (j == 1) then elseif (j == 1) then
room.tiles[i][j] = floor.top room.tiles[i][j] = singletile and floor.single or floor.top
elseif (j == 10) then elseif (j == 10) then
room.tiles[i][j] = floor.bottom room.tiles[i][j] = singletile and floor.single or floor.bottom
else else
room.tiles[i][j] = floor.center room.tiles[i][j] = singletile and floor.single or floor.center
end end
end end
end end
@ -422,17 +422,22 @@ local function add_level_exit(room)
end end
local function build_normal_room(room) local function build_normal_room(room)
add_tiles_to_room(room) local crumbling = CURRENT_LEVEL > 3 and random(8) == 1
add_tiles_to_room(room, crumbling)
add_random_decor_to_room(room) add_random_decor_to_room(room)
add_walls_to_room(room) add_walls_to_room(room)
add_exits_to_room(room) add_exits_to_room(room)
local pitsAdded = add_pits_to_room(room) local pitsAdded = crumbling or add_pits_to_room(room)
if room.goal then if room.goal then
add_level_exit(room) add_level_exit(room)
end end
if CURRENT_LEVEL > 5 and random(8) == 1 then if crumbling then
room.modifier.type = "CRUMBLING"
room.modifier.arg = ""
elseif CURRENT_LEVEL > 3 and random(8) == 1 then
room.modifier.type = "FIRE" room.modifier.type = "FIRE"
room.modifier.arg = "" room.modifier.arg = ""
elseif ((not pitsAdded and CURRENT_LEVEL > 1) or CURRENT_LEVEL > 3) and random(8) == 1 then elseif ((not pitsAdded and CURRENT_LEVEL > 1) or CURRENT_LEVEL > 3) and random(8) == 1 then
@ -546,6 +551,7 @@ function module.load_textures(map)
floor.singlebottom = { t_floor, -1, xo + 48, yo + 32, false } floor.singlebottom = { t_floor, -1, xo + 48, yo + 32, false }
floor.singleleft = { t_floor, -1, xo + 64, yo + 16, false } floor.singleleft = { t_floor, -1, xo + 64, yo + 16, false }
floor.singleright = { t_floor, -1, xo + 96, yo + 16, false } floor.singleright = { t_floor, -1, xo + 96, yo + 16, false }
floor.single = { t_floor, -1, xo + 80, yo + 0, false }
local pit_yo = (random(5) + random(3)) * (16 * 2) local pit_yo = (random(5) + random(3)) * (16 * 2)
pits.topleft = { t_pit0, t_pit1, 0, pit_yo, false, false, false, true } pits.topleft = { t_pit0, t_pit1, 0, pit_yo, false, false, false, true }

View File

@ -291,7 +291,8 @@ map_update(UpdateData *data)
Room *room = map->rooms[roomPos.x][roomPos.y]; Room *room = map->rooms[roomPos.x][roomPos.y];
for (size_t i=0; i < MAP_ROOM_WIDTH; ++i) { for (size_t i=0; i < MAP_ROOM_WIDTH; ++i) {
for (size_t j=0; j < MAP_ROOM_HEIGHT; ++j) { for (size_t j=0; j < MAP_ROOM_HEIGHT; ++j) {
sprite_update(room->tiles[i][j]->sprite, data); if (room->tiles[i][j])
sprite_update(room->tiles[i][j]->sprite, data);
} }
} }
} }

View File

@ -119,6 +119,9 @@ l_map_set_current_room_modifier(lua_State *L)
} else if (strcmp(modifier, "FIRE") == 0) { } else if (strcmp(modifier, "FIRE") == 0) {
Room *room = map->rooms[map->currentRoom.x][map->currentRoom.y]; Room *room = map->rooms[map->currentRoom.x][map->currentRoom.y];
room->modifier.type = RMOD_TYPE_FIRE; room->modifier.type = RMOD_TYPE_FIRE;
} else if (strcmp(modifier, "CRUMBLING") == 0) {
Room *room = map->rooms[map->currentRoom.x][map->currentRoom.y];
room->modifier.type = RMOD_TYPE_CRUMBLING;
} else { } else {
luaL_error(L, "Unknown room modifier: %s", modifier); luaL_error(L, "Unknown room modifier: %s", modifier);
return 1; return 1;

View File

@ -29,7 +29,7 @@ typedef enum RoomModifierType_e {
RMOD_TYPE_NONE, RMOD_TYPE_NONE,
RMOD_TYPE_WINDY, RMOD_TYPE_WINDY,
RMOD_TYPE_FIRE, RMOD_TYPE_FIRE,
RMOD_TYPE_FALLING_TILES RMOD_TYPE_CRUMBLING
} RoomModifierType; } RoomModifierType;
typedef struct WindData { typedef struct WindData {

View File

@ -104,12 +104,14 @@ menu_create_character_selector(void (*onCharacterSelect)(const char *))
s1->clip = CLIP16(0, 48); s1->clip = CLIP16(0, 48);
s1->dim = DIM(64, 64); s1->dim = DIM(64, 64);
s1->pos = POS(xoffset - 32, 256); s1->pos = POS(xoffset - 32, 256);
s1->fixed = true;
Sprite *s2 = sprite_create(); Sprite *s2 = sprite_create();
sprite_set_texture(s2, texturecache_add(spriteSheets[i]), 0); sprite_set_texture(s2, texturecache_add(spriteSheets[i]), 0);
s2->clip = CLIP16(0, 0); s2->clip = CLIP16(0, 0);
s2->dim = DIM(64, 64); s2->dim = DIM(64, 64);
s2->pos = POS(xoffset - 32, 256); s2->pos = POS(xoffset - 32, 256);
s2->fixed = true;
menu_item_add(menu, s1, s2, (void (*)(void *)) onCharacterSelect); menu_item_add(menu, s1, s2, (void (*)(void *)) onCharacterSelect);
MenuItem *item = linkedlist_get(&menu->items, (Uint32) i); MenuItem *item = linkedlist_get(&menu->items, (Uint32) i);

View File

@ -586,7 +586,7 @@ monster_update(Monster *m, UpdateData *data)
sprite_update(m->sprite, data); sprite_update(m->sprite, data);
if (m->sprite->hidden == SPRITE_STATE_FALLING && m->sprite->hidden) { if (m->sprite->state == SPRITE_STATE_PLUMMETED) {
m->stats.hp = 0; m->stats.hp = 0;
player_monster_kill_check(data->player, m); player_monster_kill_check(data->player, m);
return; return;

View File

@ -294,7 +294,8 @@ move(Player *player, RoomMatrix *matrix, Vector2d direction)
if (!has_collided(player, matrix, direction)) { if (!has_collided(player, matrix, direction)) {
action_spent(player); action_spent(player);
RoomSpace *lastSpace = &matrix->spaces[lastPos.x][lastPos.y]; RoomSpace *lastSpace = &matrix->spaces[lastPos.x][lastPos.y];
if (lastPos.x > 1 && if (matrix->modifier->type == RMOD_TYPE_CRUMBLING &&
lastPos.x > 1 &&
lastPos.y > 1 && lastPos.y > 1 &&
lastPos.x < 14 && lastPos.x < 14 &&
lastPos.y < 10 && lastPos.y < 10 &&

View File

@ -138,7 +138,7 @@ sprite_update(Sprite *s, UpdateData *data)
} }
if (s->dim.width < 4) { if (s->dim.width < 4) {
s->hidden = true; s->hidden = true;
s->state = SPRITE_STATE_DEFAULT; s->state = SPRITE_STATE_PLUMMETED;
} }
} }
} }

View File

@ -31,6 +31,7 @@ typedef struct UpdateData UpdateData;
typedef enum SpriteState { typedef enum SpriteState {
SPRITE_STATE_FALLING, SPRITE_STATE_FALLING,
SPRITE_STATE_PLUMMETED,
SPRITE_STATE_DEFAULT SPRITE_STATE_DEFAULT
} SpriteState; } SpriteState;