diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index d1fa47e2..9f1db6d7 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -368,6 +368,14 @@ struct enemy : public entity { virtual int base_xp() { return 0; } }; +struct vtrap : public entity { + xy siz() override { return {6, 18}; } + string glyph() override { return "^"; } + color_t color() override { return 0xD00000FF; } + void act() override; + string get_name() override { return "moving trap"; } + string get_help() override { return "A deadly but invisible trap."; } + }; struct boar : public enemy { xy siz() override { return {18, 18}; } diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index 956ce772..2233624a 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -581,6 +581,21 @@ void bat::act() { } } +void vtrap::act() { + auto v = vel; + stay_on_screen(); + apply_walls_reflect(); + if(v.y * vel.y < 0) { + auto dat = get_dat(); + vel.y = (rand() % 100 + 100) * (vel.y > 0 ? 1 : -1) * 0.005 * dat.modv * dat.d; + } + apply_vel(); + + if(intersect(get_pixel_bbox(), m.get_pixel_bbox())) { + if(m.reduce_hp(200)) addMessage("The trap zaps you!"); + } + } + void kestrel::attacked(int dmg) { enemy::attacked(dmg); if(where.x < m.where.x) vel.x = -abs(vel.x); diff --git a/rogueviz/ru/map.ru b/rogueviz/ru/map.ru index 512cc6a2..c7505434 100644 --- a/rogueviz/ru/map.ru +++ b/rogueviz/ru/map.ru @@ -870,25 +870,26 @@ OK MOVE 3 Central Cavern ROOM Central Cavern Bottom Right # wall -. air -- staircase -A platform + door +- staircase +. air +A platform +B secret passage | column MAP ....#....#.-..........-....#A..........######################################### ....#....+..-........-.....#A..........######################################### ....#....+...-......-......#A...........######################################## ....##########AAAAA-########A............####################################### -....#.............-.#......#A.............###################################### -....#............-..#......#A.............###################################### +....#.............-.#......#A.............++.................................... +....#............-..#......#A.............+b.................................... ....#...........-...#......#A............####################################### -....#..........-....#......#A...........######################################## -....#.........-.....+......#A..........######################################### -....#........-......+......#A........########################################### -....###AAAAA-###############A......############################################# -....|......-....|..........|A.....############################################## -....|.....-.....|..........|A..################################################# +....#..........-....#......#A...........##.##################################### +....#.........-.....+......#A..........##..##################################### +....#........-......+......#A........####..##################################### +....###AAAAA-###############A......######..##################################### +....|......-....|..........|A.....#######..##################################### +....|.....-.....|..........|A..##########..##################################### ....|....-......|..........|A.################################################## ....|...-.......|..........|#################################################### ....|..-........|........####################################################### @@ -1376,3 +1377,77 @@ LOOT 1 fire The giant frog extract will let you produce fire! But you need to take it to a magic fountain first. OK + +MOVE 4 Central Cavern Bottom Right +ROOM Bouncy Spike Maze +# wall +- staircase +. air +A wall sign +B bouncy wall +X sign +^ spike +| column +MAP +################################################################################ +################################################################################ +################################################################################ +################################################################################ +................................................................................ +................................................................................ +####............................................................................ +####............................................................................ +####....XXX..................................................................... +####.....|...................................................................... +####.....|...................................................................... +####--########################################################################## +####--########################################################################## +####-b............................................^^^^^......^.................. +####--.................................^^.........^..........^.................. +####-b................^...........................^..........^.................. +####--#########--.............................^...^..........^.....--########### +####-b##########-.................................^..........^.....-############ +####--###########.................................^..........^.....############# +####-b###########............................................^.....############# +####--###########...........^^^^^^............^..............^.....############# +####-b###########...........^b^b^b...........................^.....############# +####--###########.............................^..............^.....############# +####-b###########..................................................############# +####..........###.^...........................^....................############# +####..........###..................................................############# +####..........###..................................................############# +#######.......###.............................^....................############# +####..........###......................^^^^............^^^^^.......############# +####..........###.......................^b....^....................############# +####AAA##########BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB############# +################################################################################ +################################################################################ +################################################################################ +################################################################################ +#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b +################################################################################ +#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b +################################################################################ +#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b#b +NPC 76 77 0 +@Forest Sign +DEADLY TRAPS AHEAD +NPC 43 232 0 +@Floor Engraving +Ad Aerarium +VTRAP 145 56 +VTRAP 160 56 +VTRAP 175 56 +VTRAP 200 56 +VTRAP 210 56 +VTRAP 220 56 +VTRAP 230 56 +VTRAP 280 56 +VTRAP 290 56 +VTRAP 300 56 +VTRAP 310 56 +VTRAP 400 56 +VTRAP 410 56 +VTRAP 420 56 +VTRAP 430 56 +OK diff --git a/rogueviz/ru/save.cpp b/rogueviz/ru/save.cpp index 9aff9aa9..e5e3763e 100644 --- a/rogueviz/ru/save.cpp +++ b/rogueviz/ru/save.cpp @@ -186,6 +186,15 @@ void load_room(fhstream& f, cell *c) { b->respawn = b->where; b->postfix(); r.entities.emplace_back(std::move(b)); } + else if(cap == "VTRAP") { + auto b = std::make_unique(); + sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y); + auto dat = b->get_dat(); + b->vel.x = 0; b->vel.y = 150 * 0.005 * dat.modv * dat.d; + + b->postfix(); + r.entities.emplace_back(std::move(b)); + } else if(cap == "GRIDBUG") { auto b = std::make_unique(); sscanf(param.c_str(), "%lf%lf", &b->where.x, &b->where.y);