From 828160f548e266ca64c78f07eef371c71e3da5f3 Mon Sep 17 00:00:00 2001 From: Zeno Rogue Date: Sat, 3 May 2025 18:07:30 +0200 Subject: [PATCH] ru:: help while paused --- rogueviz/ru/classes.cpp | 9 ++++++++- rogueviz/ru/geometry.cpp | 4 ++++ rogueviz/ru/globals.cpp | 35 ++++++++++++++++++----------------- rogueviz/ru/ru.cpp | 31 +++++++++++++++++++++++++++++++ 4 files changed, 61 insertions(+), 18 deletions(-) diff --git a/rogueviz/ru/classes.cpp b/rogueviz/ru/classes.cpp index 6ed422e2..780ce3ed 100644 --- a/rogueviz/ru/classes.cpp +++ b/rogueviz/ru/classes.cpp @@ -213,6 +213,8 @@ struct entity { invinc_end = gframeid + 150; return true; } + + virtual string get_help() { return "No help about this."; } }; struct man : public entity { @@ -234,6 +236,7 @@ struct man : public entity { void draw() override; virtual bool hurt_by_spikes() { return true; } string get_name() override { return "alchemist"; } + string get_help() override { return "This is you."; } }; extern man m; @@ -249,7 +252,8 @@ struct moving_platform : public entity { void act() override; virtual moving_platform* as_platform() { return this; } string get_name() override { return "moving platform"; } - }; + string get_help() override { return "Moving platforms move."; } +}; struct ferris_platform : public moving_platform { xy location_at(ld t) override; @@ -265,6 +269,7 @@ struct npc : public entity { color_t color() override { return col; } void act() override; string get_name() override { return name; } + string get_help() override { return "Stay awhile and listen."; } }; struct boar : public entity { @@ -278,6 +283,7 @@ struct boar : public entity { void attacked(int s) override; void on_kill() override { entity::on_kill(); num_kills++; } string get_name() override { return "giant boar"; } + string get_help() override { return "Beware their tusks."; } }; struct hint : public entity { @@ -306,6 +312,7 @@ struct item : public entity { } } string get_name() override { return powers[id].name; } + string get_help() override { return powers[id].get_desc(); } }; struct missile : public entity { diff --git a/rogueviz/ru/geometry.cpp b/rogueviz/ru/geometry.cpp index 4813074f..3d9855ab 100644 --- a/rogueviz/ru/geometry.cpp +++ b/rogueviz/ru/geometry.cpp @@ -108,6 +108,10 @@ bbox extend(bbox a, int l, int r, int u, int d) { return a; } +bool contains(bbox a, xy pos) { + return pos.x >= a.minx && pos.x < a.maxx && pos.y >= a.miny && pos.y < a.maxy; + } + bbox extend_all(bbox a, int x) { return extend(a, x, x, x, x); } bbox get_intersect(bbox a, bbox b) { diff --git a/rogueviz/ru/globals.cpp b/rogueviz/ru/globals.cpp index ff3d9b17..0a27d331 100644 --- a/rogueviz/ru/globals.cpp +++ b/rogueviz/ru/globals.cpp @@ -52,6 +52,7 @@ struct ruwall { string glyph; color_t color; flagtype flags; + string help; }; enum eWall { wAir, wWall, wBouncy, wSpike, wWater, wFrozen, wDoor, wSmashedDoor, wLockedDoor, wFountain0, wFountain1, wBluePortal, wOrangePortal, wPlatform, wStaircase, wColumn, wForge, wGUARD }; @@ -67,23 +68,23 @@ flagtype W_FROZEN = 64; constexpr int qwall = int(wGUARD); ruwall walls[qwall] = { - {"air", ".", 0x40404080, W_TRANS}, - {"wall", "#", 0xFFFFFFFF, W_BLOCK}, - {"bouncy wall", "#", 0x80FF80FF, W_BLOCK | W_BOUNCY}, - {"spike", "^", 0xC08080FF, W_TRANS | W_PAIN}, - {"water", "~", 0x0000FFFF, W_BLOCK | W_TRANS}, - {"frozen water", "#", 0xC0C0FFFF, W_BLOCK | W_FROZEN}, - {"door", "+", 0xC06000FF, W_BLOCK}, - {"smashed door", "'", 0xC06000FF, W_TRANS}, - {"locked door", "+", 0xA05000FF, W_BLOCK}, - {"magic fountain", "!", 0x8080C0FF, W_TRANS}, - {"magic fountain (active)", "!", 0xA0A0FFFF, W_TRANS}, - {"blue portal", "=", 0x4040C0FF, W_TRANS}, - {"orange portal", "=", 0xC08040FF, W_TRANS}, - {"platform", "-", 0xFFFFFFFF, W_PLATFORM | W_TRANS }, - {"staircase", "-", 0xFFFF80FF, W_PLATFORM | W_TRANS | W_STAIRCASE }, - {"column", "|", 0x40404080, W_TRANS}, - {"forge", "&", 0xB0202080, W_TRANS | W_PAIN}, + {"air", ".", 0x40404080, W_TRANS, "Looks like an empty space, but actually necessary for survival."}, + {"wall", "#", 0xFFFFFFFF, W_BLOCK, "These kinds of tough walls can never be destroyed."}, + {"bouncy wall", "#", 0x80FF80FF, W_BLOCK | W_BOUNCY, "Like walls, but things bounce off them."}, + {"spike", "^", 0xC08080FF, W_TRANS | W_PAIN, "Dangerous!"}, + {"water", "~", 0x0000FFFF, W_BLOCK | W_TRANS, "Not used yet."}, + {"frozen water", "#", 0xC0C0FFFF, W_BLOCK | W_FROZEN, "Water magically turned into a slippery wall."}, + {"door", "+", 0xC06000FF, W_BLOCK, "Attack the doors with your weapon to open them."}, + {"smashed door", "'", 0xC06000FF, W_TRANS, "This door has been already opened."}, + {"locked door", "+", 0xA05000FF, W_BLOCK, "What is behind this door is not your business."}, + {"magic fountain", "!", 0x8080C0FF, W_TRANS, "Wow! A magic fountain!"}, + {"magic fountain (active)", "!", 0xA0A0FFFF, W_TRANS, "Wow! An active magic fountain!"}, + {"blue portal", "=", 0x4040C0FF, W_TRANS, "Blue portal."}, + {"orange portal", "=", 0xC08040FF, W_TRANS, "Orange portal."}, + {"platform", "-", 0xFFFFFFFF, W_PLATFORM | W_TRANS, "You can fall down through such platforms."}, + {"staircase", "-", 0xFFFF80FF, W_PLATFORM | W_TRANS | W_STAIRCASE, "You can climb staircases and ladders." }, + {"column", "|", 0x40404080, W_TRANS, "A background decoration." }, + {"forge", "&", 0xB0202080, W_TRANS | W_PAIN, "Used by runesmiths."}, }; int sel = 1; diff --git a/rogueviz/ru/ru.cpp b/rogueviz/ru/ru.cpp index 6f1813cc..74ad877b 100644 --- a/rogueviz/ru/ru.cpp +++ b/rogueviz/ru/ru.cpp @@ -264,6 +264,37 @@ void run() { if(current_target && current_target->existing) displayfr(vid.xres - vid.fsize, vid.fsize, 2, vid.fsize, "HP " + its(current_target->hp) + "/" + its(current_target->max_hp()) + " " + current_target->get_name(), titlecolor, 16); } + if(cmode == mode::paused) { + xy mousep(mousepx, mousepy); + string helpstr = ""; + entity* help_entity = nullptr; + + if(contains(m.get_pixel_bbox(), mousep)) { + help_entity = &m; + } + + for(auto& e: current_room->entities) + if(e->existing && e->visible(current_room) && e->visible_inv() && e->have_help()) + if(contains(e->get_pixel_bbox(), mousep)) + help_entity = &*e; + + if(help_entity) { + mouseovers = help_entity->get_name(); + helpstr = help_entity->get_help(); + } + + int x = mousepx / block_x, y = mousepy / block_y; + if(!help_entity && x >= 0 && y >= 0 && x < room_x && y < room_y) { + if(!current_room->fov[y][x]) mouseovers = "invisible", helpstr = "You need to explore to see what is there."; + else { + auto&w = walls[current_room->block_at[y][x] >> 3]; + mouseovers = w.name; + helpstr = w.help; + } + } + + dialog::add_key_action(SDLK_F1, [helpstr] { gotoHelp(helpstr); }); + } draw_pentagon(); break;