diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index f6417101..04aae650 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -1,11 +1,13 @@ namespace rogue_unlike { +/** a helper structure to mass to powerfun */ struct data { int keystate; double d; ld modv; ld moda; int dx; + struct power *p; }; using powerfun = hr::function; @@ -13,12 +15,15 @@ using powerfun = hr::function; struct power { int key; string name; + string xname; string desc; string glyph; color_t color; flagtype flags; powerfun pf; + int id_status; power(int key, string name, string desc, string glyph, color_t color, flagtype f, powerfun pf) : key(key), name(name), desc(desc), glyph(glyph), color(color), flags(f), pf(pf) { + id_status = 0; } }; @@ -132,9 +137,7 @@ struct entity { virtual double grav() { return 0.1; } - bool on_floor; - bool fallthru; - bool on_ice; + bool on_floor, fallthru, on_ice, wallhug, on_bounce; bool destroyed; void kino(); @@ -156,6 +159,11 @@ struct man : public entity { int facing; int attack_facing; int attack_when; + + int on_floor_when; + int jump_control, next_jump_control; + int coyote_time, next_coyote_time; + man() { facing = 1; attack_facing = 1; } double sx() override { return 12; } double sy() override { return 12; } @@ -176,13 +184,15 @@ struct sage : public entity { struct item : public entity { int id; + string pickup_message; double sx() override { return 12; } double sy() override { return 12; } string glyph() override { return powers[id].glyph; } color_t color() override { return powers[id].color; } void act() override { + kino(); if(intersect(get_pixel_bbox(), m.get_pixel_bbox())) { - addMessage("You pick up the " + powers[id].name + "."); + addMessage(pickup_message); destroyed = true; } } diff --git a/rogueviz/ru/entity.cpp b/rogueviz/ru/entity.cpp index 0a134118..f327e85a 100644 --- a/rogueviz/ru/entity.cpp +++ b/rogueviz/ru/entity.cpp @@ -30,6 +30,8 @@ void entity::apply_grav() { void entity::kino() { on_floor = false; on_ice = false; + wallhug = false; + on_bounce = false; // ld modv = 60. / game_fps; @@ -45,8 +47,9 @@ void entity::kino() { for(int x = obb.minx; x < obb.maxx; x++) for(int y = obb.maxy; y < jbb.maxy; y++) { eWall b = current_room->at(x, y); if(walls[b].flags & blocking) { + if(walls[b].flags & W_BOUNCY) { vel_y = -vel_y; on_bounce = true; goto again; } on_floor = true; - if(b == wFrozen) on_ice = true; + if(walls[b].flags & W_FROZEN) on_ice = true; vel_y /= 2; if(abs(vel_y) < 1e-6) vel_y = 0; if(freezing()) { @@ -85,6 +88,7 @@ void entity::kino() { if(walls[b].flags & W_BLOCK) { if(freezing()) { hit_wall(); } vel_x = (vel_x - max(vel_y, 0)/10) / 2; + wallhug = true; goto again; } } @@ -98,6 +102,7 @@ void entity::kino() { if(walls[b].flags & W_BLOCK) { if(freezing()) { hit_wall(); } vel_x = (vel_x + max(vel_y, 0)/10) / 2; + wallhug = true; goto again; } } diff --git a/rogueviz/ru/globals.cpp b/rogueviz/ru/globals.cpp index bf5f6f78..e46da79a 100644 --- a/rogueviz/ru/globals.cpp +++ b/rogueviz/ru/globals.cpp @@ -58,16 +58,18 @@ flagtype W_TRANS = 2; flagtype W_PLATFORM = 4; flagtype W_STAIRCASE = 8; flagtype W_PAIN = 16; +flagtype W_BOUNCY = 32; +flagtype W_FROZEN = 64; constexpr int qwall = 14; ruwall walls[qwall] = { {"air", ".", 0x40404080, W_TRANS}, {"wall", "#", 0xFFFFFFFF, W_BLOCK}, - {"bouncy wall", "#", 0x80FF80FF, W_BLOCK}, + {"bouncy wall", "#", 0x80FF80FF, W_BLOCK | W_BOUNCY}, {"spike", "^", 0xC08080FF, W_BLOCK | W_TRANS}, {"water", "~", 0x0000FFFF, W_BLOCK | W_TRANS}, - {"frozen water", "#", 0xC0C0FFFF, W_BLOCK}, + {"frozen water", "#", 0xC0C0FFFF, W_BLOCK | W_FROZEN}, {"door", "+", 0xC06000FF, W_BLOCK}, {"smashed door", "'", 0xC06000FF, W_TRANS}, {"magic fountain", "!", 0x8080C0FF, W_TRANS}, diff --git a/rogueviz/ru/man.cpp b/rogueviz/ru/man.cpp index 3da883aa..ce68d5ff 100644 --- a/rogueviz/ru/man.cpp +++ b/rogueviz/ru/man.cpp @@ -11,15 +11,21 @@ void man::act() { dat.moda = dat.modv * dat.modv; dat.dx = 0; + coyote_time = next_coyote_time; next_coyote_time = 0; + jump_control = next_jump_control; next_jump_control = 0; + + if(on_floor) on_floor_when = gframeid; + fallthru = false; handle_powers(dat); - if(on_floor && !on_ice) { + if((on_floor || jump_control || wallhug) && !on_ice) { vel_x = dat.dx * dat.d * dat.modv * 2.5; } - else { - vel_x += dat.dx * dat.d * .05 * dat.moda; + + if(on_bounce) { + vel_x += dat.dx * dat.d * dat.modv * 0.02; } if(dat.dx) facing = dat.dx; diff --git a/rogueviz/ru/map.ru b/rogueviz/ru/map.ru index 6614dc7b..40652a53 100644 --- a/rogueviz/ru/map.ru +++ b/rogueviz/ru/map.ru @@ -2,43 +2,43 @@ ROOM Red Rooster Inn # wall + door - platform -s staircase +A staircase . air MAP -...................##.............................+-...-+..---...##............. +...................##.............................+-....+..---...##............. ..................##################################----############............ -.................##.....................#.............s.......#....##........... -................##......................#............s........#.....##.......... -...............##.......................#...........s.........#......##......... -..............##........................#..........s..........#.......##........ -.............##.........................#.........s...........#........##....... -............##..........................+........s............+.........##...... -...........##...........................+.......s.............+..........##..... -..........############################################----##################.... -.........###........................................##.s............##....##.... -..........#b........................................#b..s...........#b....#b.... -..........##........................................##...s..........##....##.... -..........#b....---------..----------..----------...#b....s.........#b....#b.... -..........##........................................##.....s........##....##.... -..........#b........................................#b......s.......#b....#b.... -..........##........................................##.......s......##....##.... -..........#b....---------..----------..----------...#b........s.....#b....#b.... -..........##........................................##.........s....##....##.... -..........#b........................................#b..........s...#b....#b.... -..........##........................................##...........s..+.....##.... -..........#b........................................#b............s.+.....#b.... -..........##....---------..----------..----------...##...........s##########.... -..........#b........................................#b..........s...#b....#b.... -..........##........................................##.........s....##....##.... -..........#b........................................#b........s.....#b....#b.... -..........##....---------..----------..----------...##.......s......##....##.... -..........#b........................................#b......s.......#b....#b.... -..........##........................................##.....s........##....##.... -..........#b........................................#b....s.........#b....#b.... -..........++....---------..----------..----------...++...s..........##....##.... -..........+b........................................+b..s...........#b....#b.... -..........++........................................++.s............++....##.... -..........+b........................................+bs.............+b....#b.... +.................##.....................#..............A......#....##........... +................##......................#.............A.......#.....##.......... +...............##.......................#............A........#......##......... +..............##........................#...........A.........#.......##........ +.............##.........................#..........A..........#........##....... +............##..........................+.........A...........+.........##...... +...........##...........................+........A............+..........##..... +..........############################################------################.... +.........###........................................##.A..................##.... +--........#b........................................#b..A.................#b.... +..........##........................................##...A................##.... +..........#b.....--------...--------...--------.....#b....A...............#b.... +..........##........................................##.....A..............##.... +..........#b........................................#b......A.............#b.... +..........##........................................##.......A............##.... +--........#b....---------...--------...---------....#b........A...........#b.... +..........##........................................##.........A..........##.... +..........#b........................................#b..........A.........#b.... +..........##........................................##...........A........##.... +..........#b....---------...--------...---------....#b............A.......#b.... +..........##........................................##.............#------##.... +..........#b........................................#b...................A#b.... +..........##........................................##..................A.##.... +..........#b...----------..----------..----------...#b.................A..#b.... +..........##........................................##................A...##.... +..........#b........................................#b...............A....#b.... +..........##........................................##..............A.....##.... +..........#b...----------..----------..----------...#b.............A......#b.... +..........++........................................++............A.......##.... +..........+b........................................+b...........A........#b.... +..........++........................................++..........A.........##.... +..........+b........................................+b.........A..........#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 ################################################################################ @@ -90,13 +90,14 @@ MAP ......................#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...................... START 344 274 ITEM 382 287 dagger +You collect your trusty dagger from the drawer. OK MOVE 1 Red Rooster Inn @@ -144,6 +145,9 @@ MAP ....................................#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 +ITEM 484 123 +steel ring +You notice a crow nest. There is a shiny ring inside! OK MOVE 2 Red Rooster Inn @@ -194,6 +198,9 @@ MAP #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 +ITEM 279 65 +furry ring +Someone lost a small, weird ring here. Hopefully it will be useful to you. OK MOVE 2 Forest Path @@ -387,6 +394,9 @@ MAP #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 +ITEM 380 131 +strange blue crystal ball +What a shiny crystal ball! OK MOVE 2 Dungeon Entrance @@ -436,3 +446,254 @@ MAP #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 OK +MOVE 3 Dungeons of Doom +ROOM First Magic Fountain Cave +! magic fountain +# wall +- staircase +. air +A platform +MAP +###################.-########################################################### +###################.-########################################################### +###################.-########################################################### +###################.-########################################################### +###################.-########################################################### +################....-.........##############################.......############# +##############......-...........#########################............########### +############........-.............######################..............########## +###########.........-................################..................######### +##########..........-..................###########.....................######### +##########..........-.....................######.......................######### +#########...........-..................................................######### +#########...........-..................................................######### +##########..........-..................................................######### +##########..........-..................................................######### +##########..........-..................................................######### +###########.........-.................................................########## +############..........................................................########## +##############.......................................................########### +################....###..............................................########### +##########################..........................................############ +###############################..-..................................############ +################################.-.................................############# +#################################-................................############## +#################################-..............................################ +###############################..-.............................################# +##############################...-........!!.................################### +###############################..-........!b...............##################### +################################........######...........####################### +###################################.....#b#b#b....##AAAA######################## +####################################################----######################## +####################################################-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#b#b#b#b +OK + +MOVE 3 First Magic Fountain Cave +ROOM Watery Death +# wall +- staircase +. air +A platform +^ spike +~ water +MAP +#################################################################--############# +#################################################################--############# +#################################################################AA############# +#################################################################--############# +.................................................................--.........#### +.................................................................--..........### +.................................................................--..........### +.............................................................................### +.............................................................................### +..##################################################################.........### +..######################........................###################..........### +..#####################..........................#################...........### +.######################............................#####.....................### +.######################.............................####.....................### +.######################..............................###.....................### +#######################....############.....##........##........##...........### +#######################....#############..............##.......####..........### +#######################....#####......##...............#.......####..........### +#######################....#####......##......##.......#......######.........### +#######################....#####......##...............#......######.........### +#######################.....####--##..##...............#......######.........### +#######################.......##-b##..##...............#......######.........### +#######################........#--##..##......##..............######.........### +#######################........#-b##..##......................######.........### +#######################........#--##..##......................######~~~~~~~~~### +#######################....#####-b##..###.....................######^^^^^^^^^### +#######################....#####--##..####AA#################################### +#######################....#####-b##...###..#################################### +#######################....#####--##....##AA#################################### +#######################....#####-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 +OK + +MOVE 2 Watery Death +ROOM Jumping Course +# wall +- platform +. air +A bouncy wall +^ spike +MAP +################################################################################ +################################################################################ +################################################################################ +################################################################################ +...............################.....#####################....................... +................########.............#.......................................... +.....................................#.......................................... +.....................................#.......................................... +###########....---------.............#.......................................... +###########................####......#........................................## +###########...................###....#^.......................................## +###########..........................#........................................## +###########..........................#^......................................### +###########................--------..#.......................................### +###########..................................................................### +###########...............................-------...........................#### +###########....----.........................................................#### +###########.................................................................#### +###########.........................................-......................##### +###########.......-........................................................##### +###########................................................................##### +###########............................................######.............###### +###########..........AAAAAA..####....#....................................###### +###########...............................................................###### +###########..............................................................####### +###########..................................................##..........####### +###########..............................................................####### +############............................................................######## +############...................................###.............##.......######## +#############.............................#########.....................######## +###############......................##################.................######## +###############AAAAAAAAAAAAAAAAAAAAAA#####################.............######### +################################################################################ +################################################################################ +################################################################################ +#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 +OK + +MOVE 2 Jumping Course +ROOM Treasure Cave +# wall +- staircase +. air +MAP +################################################################################ +################################################################################ +################################################################################ +################################################################################ +######################################################################..--...... +#####################################################################...-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#b#b#b#b#b +ITEM 324 198 +Golden Shoelaces +Hopefully these golden shoelaces are valuable. +OK + +MOVE 3 Watery Death +ROOM Second Magic Fountain +! magic fountain +# wall +- staircase +. air +MAP +##################################################...##-.####################### +##################################################...##-.####################### +##################################################...##-.####################### +##################################################...##-.####################### +#########################################..............-.####################### +#########################################..............-.####################### +#########################################.!!...........-.####################### +#########################################.!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#b +OK + diff --git a/rogueviz/ru/powers.cpp b/rogueviz/ru/powers.cpp index 3055dcaf..ece6c3c2 100644 --- a/rogueviz/ru/powers.cpp +++ b/rogueviz/ru/powers.cpp @@ -2,9 +2,12 @@ namespace rogue_unlike { flagtype STARTING = Flag(1); flagtype WHILE_PAUSED = Flag(2); +flagtype TOGGLEABLE = Flag(4); +flagtype ACTIVE = Flag(8); +flagtype NEEDS_IDENTIFY = Flag(16); vector powers = { - power('1', "Potion of Extra Life", + power('1', "Potion of Extra Life", "You are really proud of this potion, which, after you die, will let you return to the moment of time when you drank it. " "Unfortunately it still requires an ingredient found only in the magical fountains of the Dungeons of Alchemy.\n\n" "You can only drink this potion when at a magical fountain. To protect yourself from dying permanently, it is drank " @@ -13,28 +16,33 @@ vector powers = { [] (data& d) { } ), - power('d', "move right", + power('d', "move right", "A special power of human beings, and most other animals, that they earn early in their life.", ">", 0xFF0000FF, STARTING, [] (data& d) { if(d.keystate & 1) d.dx += 1; } ), - power('a', "move left", + power('a', "move left", "Moving to the right was a mistake? If so, this special power can be used to ignore the consequences. In most cases, at least...", "<", 0xFF0000FF, STARTING, [] (data& d) { if(d.keystate & 1) d.dx -= 1; } ), - power('w', "jump", + power('w', "jump", "This power can be used to reach higher parts of the world. Its power is quite limited compared to move left and right, but " "you expect to find some ways to make it more powerful.", "^", 0xFF0000FF, STARTING, [] (data& d) { - if((d.keystate & 1) && m.on_floor) m.vel_y = -(non_hyperbolic ? 3 : 5) * d.d * d.modv; + if(d.keystate & 1) { + bool can_jump = m.on_floor; + println(hlog, "on_floor_when = ", m.on_floor_when, " gframeid = ", gframeid, " coyote_time = ", m.coyote_time); + if(gframeid <= m.on_floor_when + m.coyote_time) can_jump = true; + if(can_jump) m.vel_y = -(non_hyperbolic ? 3 : 5) * d.d * d.modv, m.on_floor_when = -1000; + } } ), - power('s', "fall", + power('s', "fall", "If you are on a platform, this ability can be used to drop down.", "v", 0xFF0000FF, STARTING, [] (data& d) { @@ -42,7 +50,7 @@ vector powers = { } ), - power('p', "pause", + power('p', "pause", "Becoming an alchemist requires intelligence: thinking quickly to react to surprising effects of experiments. " "To reflect this, you can use this power at any time to give yourself more time to think about the situation.", "-", 0xFF0000FF, STARTING | WHILE_PAUSED, @@ -50,7 +58,7 @@ vector powers = { if(d.keystate == 1) cmode = mode::paused; }), - power(' ', "dagger", + power(' ', "dagger", "This sharp dagger is very useful during the preparation of alchemical ingredients, but it works as a basic weapon too.", ")", 0xFFFFFFFF, 0, [] (data& d) { @@ -67,28 +75,113 @@ vector powers = { } }), - power('o', "Poincaré's Crystal Ball", - "This crystal ball will not let you predict the future or see things elsewhere, but will let you easily map the " - "parts of the world you have seen so far. This artifact is rumored to have been actually created by Beltrami, but " - "it was bought and presented to people by the famous wizard Poincaré, and people thought it was Poincaré's creation.", - "o", 0x00FF00FF, WHILE_PAUSED, + power('o', "strange blue crystal ball", "You feel an urge to look into it.", + "o", 0x00FF00FF, WHILE_PAUSED | NEEDS_IDENTIFY, [] (data& d) { + if(!(d.p->flags & NEEDS_IDENTIFY)) + d.p->name = "Poincaré's Crystal Ball", + d.p->desc = + "This crystal ball will not let you predict the future or see things elsewhere, but will let you easily map the " + "parts of the world you have seen so far. This artifact is rumored to have been actually created by Beltrami, but " + "it was bought and presented to people by the famous wizard Poincaré, and people thought it was Poincaré's creation."; if(d.keystate != 1) return; + d.p->flags &=~ NEEDS_IDENTIFY; switch_mapmode_to(cmapmode == mapmode::poincare ? mapmode::standard : mapmode::poincare); } ), - power('b', "Beltrami's Crystal Ball", - "Created by the ancient wizard Beltrami, this crystal ball will not let you predict the future or see things elsewhere, " - "but will let you easily map the parts of the world you have seen so far. Contrary to Poincaré's ball, straight lines are " - "mapped faithfully.", - "o", 0x00FFFFFF, WHILE_PAUSED, + power('b', "strange cyan crystal ball", "You feel an urge to look into it.", + "o", 0x00FFFFFF, WHILE_PAUSED | NEEDS_IDENTIFY, [] (data& d) { + if(!(d.p->flags & NEEDS_IDENTIFY)) + d.p->name = "Beltrami's Crystal Ball", + d.p->desc = + "Created by the ancient wizard Beltrami, this crystal ball will not let you predict the future or see things elsewhere, " + "but will let you easily map the parts of the world you have seen so far. Contrary to Poincaré's ball, straight lines are " + "mapped faithfully."; if(d.keystate != 1) return; + d.p->flags &=~ NEEDS_IDENTIFY; switch_mapmode_to(cmapmode == mapmode::klein ? mapmode::standard : mapmode::klein); } ), + power('c', "furry ring", + "This strange ring is too small to put on your finger, but maybe you could put it on your small toe?", + "=", 0xe1cbbeFF, TOGGLEABLE | NEEDS_IDENTIFY, + [] (data& d) { + if(!(d.p->flags & NEEDS_IDENTIFY)) + d.p->name = "Toe Ring of the Coyote", + d.p->desc = + "This ring, worn on a toe, will let you still jump after running off a platform. Just make sure that you run off with the foot that you are wearing this ring on!"; + if(d.keystate == 1) { + d.p->flags ^= ACTIVE; + if(d.p->flags & ACTIVE) addMessage("You put the " + d.p->name + " on your toe."); + else addMessage("You remove the " + d.p->name + " from your toe."); + } + if(d.p->flags & ACTIVE) m.next_coyote_time += 30; + if((d.p->flags & NEEDS_IDENTIFY) && (gframeid <= m.on_floor_when + m.coyote_time) && !m.on_floor) { + d.p->flags &=~ NEEDS_IDENTIFY; + addMessage("You feel a strange magical force wanting to hold your foot from below."); + } + } + ), + + power('g', "Golden Shoelaces", + "These shoelaces might bind you into place or give you freedom... or they could just be mundane shoelaces for rich people... one way to tell.", + "=", 0xFFD500FF, TOGGLEABLE, + [] (data& d) { + if(!(d.p->flags & NEEDS_IDENTIFY)) + d.p->desc = + "Normally you cannot control your jumps while you are flying. These shoelaces allow you some control over your jumps."; + if(d.keystate == 1) { + d.p->flags ^= ACTIVE; + if(d.p->flags & ACTIVE) addMessage("You put the Golden Shoelaces on your boots."); + else addMessage("You remove the Golden Shoelaces from your boots."); + } + if(d.p->flags & ACTIVE) { + m.next_jump_control++; + auto& ids = d.p->id_status; + bool id_up = (!!m.on_floor) == !!(ids & 1); + if(id_up) { + ids++; + if(ids == 2) { + addMessage("Something felt strange during this jump."); + } + if(ids == 4) { + addMessage("This jump was strange too."); + } + if(ids == 6) { + addMessage("You feel in control of the laws of physics."); + } + if(ids == 8) { + addMessage("You feel able to control your jumps while flying."); + } + if(ids == 10) { + d.p->flags |= NEEDS_IDENTIFY; + addMessage("This control originates from your golden shoelaces."); + } + } + } + } + ), + + power('r', "steel ring", + "Is it safe to put this ring on?", + "=", 0xC04040FF, TOGGLEABLE | NEEDS_IDENTIFY, + [] (data& d) { + if(!(d.p->flags & NEEDS_IDENTIFY)) + d.p->name = "Ring of Strength", + d.p->desc = + "This will raise your strength!"; + if(d.keystate == 1) { + d.p->flags ^= ACTIVE; + d.p->flags &=~ NEEDS_IDENTIFY; + if(d.p->flags & ACTIVE) addMessage("You put the Ring of Strength on your finger."); + else addMessage("You remove the Ring of Strength from your finger."); + } + } + ), + }; void handle_powers(data& d) { @@ -97,6 +190,7 @@ void handle_powers(data& d) { d.keystate = 0; if(keyheld(p.key)) d.keystate |= 1; if(keywasheld(p.key)) d.keystate |= 2; + d.p = &p; p.pf(d); } } diff --git a/rogueviz/ru/ru.cpp b/rogueviz/ru/ru.cpp index 8735975c..67a5656b 100644 --- a/rogueviz/ru/ru.cpp +++ b/rogueviz/ru/ru.cpp @@ -80,6 +80,7 @@ void editmap_frame() { dialog::display(); }); if(keypressed('f')) floodfill(mousepx / block_x, mousepy / block_y); + if(keypressed('t')) { m.where_x = mousepx; m.where_y = mousepy; m.vel_x = 0; m.vel_y = 0; } } void playing_frame() { @@ -198,7 +199,7 @@ void run() { if(cmode == mode::playing) sync_map(); render_the_map(); if(cmode == mode::editmap) dialog::add_key_action('p', [] { println(hlog, "p pressed"); switch_mapmode_to(mapmode::poincare); }); - if(cmode == mode::editmap) mouseovers = format("coordinates: %d %d", mousepx, mousepy); + if(cmode == mode::editmap) mouseovers = format("coordinates: %d %d (%.2lf)", mousepx, mousepy, double(get_scale_at(mousepy))); break; case mode::inventory: diff --git a/rogueviz/ru/save.cpp b/rogueviz/ru/save.cpp index 3765f391..49de65bf 100644 --- a/rogueviz/ru/save.cpp +++ b/rogueviz/ru/save.cpp @@ -115,6 +115,7 @@ void load_room(fhstream& f, cell *c) { b->id = -1; for(int i=0; iid = i; if(b->id == -1) println(hlog, "error: unknown item name ", s), b->id = 0; + b->pickup_message = scanline_noblank(f); r.entities.emplace_back(std::move(b)); } else println(hlog, "unknown mapline ", s);