From a5cc323f00126324ed9e625ff9c90fbb7d2c7539 Mon Sep 17 00:00:00 2001 From: Nat Quayle Nelson Date: Wed, 6 Aug 2025 13:45:40 -0500 Subject: [PATCH] draw and give tooltips for more map features --- src/game/boe.locutils.cpp | 12 ++++++++ src/game/boe.locutils.hpp | 3 ++ src/game/boe.main.cpp | 31 ++++++++++++++++++++ src/game/boe.town.cpp | 59 ++++++++++++++++++++++++++------------- src/gfx/render_shapes.hpp | 1 + 5 files changed, 86 insertions(+), 20 deletions(-) diff --git a/src/game/boe.locutils.cpp b/src/game/boe.locutils.cpp index 061a9015..f01f4348 100644 --- a/src/game/boe.locutils.cpp +++ b/src/game/boe.locutils.cpp @@ -600,3 +600,15 @@ void alter_space(short i,short j,ter_num_t ter) { univ.town->set_up_lights(); } } + +bool vehicle_is_here(const cVehicle& vehicle) { + if(!vehicle.exists) return false; + if(is_out()){ + location party_sector = univ.party.outdoor_corner; + party_sector.x += univ.party.i_w_c.x; + party_sector.y += univ.party.i_w_c.y; + return vehicle.which_town == 200 && vehicle.sector == party_sector; + }else{ + return vehicle.which_town == univ.party.town_num; + } +} \ No newline at end of file diff --git a/src/game/boe.locutils.hpp b/src/game/boe.locutils.hpp index ecf6e0c5..01f14713 100644 --- a/src/game/boe.locutils.hpp +++ b/src/game/boe.locutils.hpp @@ -1,6 +1,7 @@ #include #include "location.hpp" +#include "vehicle.hpp" bool is_explored(short i,short j); void make_explored(short i,short j); @@ -43,3 +44,5 @@ location push_loc(location from_where,location to_where); bool spot_impassable(short i,short j); void swap_ter(short i,short j,ter_num_t ter1,ter_num_t ter2); void alter_space(short i,short j,ter_num_t ter); +// Whether a vehicle is in the current town/outdoor section shown on the map +bool vehicle_is_here(const cVehicle& vehicle); \ No newline at end of file diff --git a/src/game/boe.main.cpp b/src/game/boe.main.cpp index 5faaa4db..28d59b79 100644 --- a/src/game/boe.main.cpp +++ b/src/game/boe.main.cpp @@ -1456,12 +1456,43 @@ void handle_one_minimap_event(const sf::Event& event) { std::string tooltip_text = ""; if(is_explored(tile.x, tile.y)){ + // Area rectangle hovered const std::vector& area_desc = is_out() ? univ.out->area_desc : univ.town->area_desc; for(info_rect_t area : area_desc){ if(area.contains(tile)){ tooltip_text += area.descr + " |"; } } + + // Sign hovered + const std::vector& sign_locs = is_out() ? univ.out->sign_locs : univ.town->sign_locs; + for(sign_loc_t sign : sign_locs){ + if(sign == tile){ + tooltip_text += "Sign: " + sign.text + " |"; + } + } + // Town entrance hovered + if(is_out()){ + const std::vector& city_locs = univ.out->city_locs; + for(spec_loc_t city : city_locs){ + if(city == tile){ + tooltip_text += univ.scenario.towns[city.spec]->name + " |"; + } + } + } + // Vehicle hovered + for(auto& boat : univ.party.boats) { + if(!vehicle_is_here(boat)) continue; + if(boat.loc == tile){ + tooltip_text += (boat.property ? "Boat (Not Yours)" : "Your Boat"); + } + } + for(auto& horse : univ.party.horses) { + if(!vehicle_is_here(horse)) continue; + if(horse.loc == tile){ + tooltip_text += (horse.property ? "Horses (Not Yours)" : "Your Horses"); + } + } } if(tooltip_text != last_tooltip_text) draw_map(false, tooltip_text); diff --git a/src/game/boe.town.cpp b/src/game/boe.town.cpp index b3860ba3..92af62f4 100644 --- a/src/game/boe.town.cpp +++ b/src/game/boe.town.cpp @@ -62,7 +62,7 @@ location town_force_loc; bool shop_button_active[12]; rectangle map_title_rect = {3,50,15,300}; rectangle map_bar_rect = {15,50,27,300}; -rectangle map_tooltip_rect = {270,50,307,350}; +rectangle map_tooltip_rect = {270,50,307,300}; void force_town_enter(short which_town,location where_start) { town_force = which_town; @@ -1510,37 +1510,56 @@ void draw_map(bool need_refresh, std::string tooltip_text) { if(canMap) { rect_draw_some_item(map_gworld().getTexture(),the_rect,mini_map(),area_to_draw_on); + auto mark_loc = [view_rect, &draw_rect, area_to_draw_on](location where, sf::Color inner, sf::Color outer) -> void { + if((is_explored(where.x,where.y)) && + ((where.x >= view_rect.left) && (where.x < view_rect.right) + && where.y >= view_rect.top && where.y < view_rect.bottom)){ + draw_rect.left = area_to_draw_on.left + 6 * (where.x - view_rect.left); + draw_rect.top = area_to_draw_on.top + 6 * (where.y - view_rect.top); + draw_rect.right = draw_rect.left + 6; + draw_rect.bottom = draw_rect.top + 6; + + fill_rect(mini_map(), draw_rect, inner); + frame_circle(mini_map(), draw_rect, outer); + } + }; + // Now place PCs and monsters if(draw_pcs) { if((is_town()) && (univ.party.status[ePartyStatus::DETECT_LIFE] > 0)) for(short i = 0; i < univ.town.monst.size(); i++) if(univ.town.monst[i].is_alive()) { where = univ.town.monst[i].cur_loc; - if((is_explored(where.x,where.y)) && - ((where.x >= view_rect.left) && (where.x < view_rect.right) - && where.y >= view_rect.top && where.y < view_rect.bottom)){ - - draw_rect.left = area_to_draw_on.left + 6 * (where.x - view_rect.left); - draw_rect.top = area_to_draw_on.top + 6 * (where.y - view_rect.top); - draw_rect.right = draw_rect.left + 6; - draw_rect.bottom = draw_rect.top + 6; - - fill_rect(mini_map(), draw_rect, Colours::GREEN); - frame_circle(mini_map(), draw_rect, Colours::BLUE); - } + mark_loc(where, Colours::GREEN, Colours::BLUE); } if((overall_mode != MODE_SHOPPING) && (overall_mode != MODE_TALKING)) { where = (is_town()) ? univ.party.town_loc : global_to_local(univ.party.out_loc); - draw_rect.left = area_to_draw_on.left + 6 * (where.x - view_rect.left); - draw_rect.top = area_to_draw_on.top + 6 * (where.y - view_rect.top); - draw_rect.right = draw_rect.left + 6; - draw_rect.bottom = draw_rect.top + 6; - fill_rect(mini_map(), draw_rect, Colours::RED); - frame_circle(mini_map(), draw_rect, sf::Color::Black); - + mark_loc(where, Colours::RED, Colours::BLACK); } } + + // Draw signs + const std::vector& sign_locs = is_out() ? univ.out->sign_locs : univ.town->sign_locs; + for(sign_loc_t sign : sign_locs){ + mark_loc(sign, Colours::TRANSPARENT, Colours::YELLOW); + } + // Draw town entrances + if(is_out()){ + const std::vector& city_locs = univ.out->city_locs; + for(spec_loc_t city : city_locs){ + mark_loc(city, Colours::TRANSPARENT, Colours::GREEN); + } + } + // Draw vehicles + for(auto& boat : univ.party.boats) { + if(!vehicle_is_here(boat)) continue; + mark_loc(boat.loc, Colours::MAROON, Colours::BLACK); + } + for(auto& horse : univ.party.horses) { + if(!vehicle_is_here(horse)) continue; + mark_loc(horse.loc, Colours::MAROON, Colours::BLACK); + } } win_draw_string(mini_map(), map_tooltip_rect,tooltip_text,eTextMode::WRAP,style); diff --git a/src/gfx/render_shapes.hpp b/src/gfx/render_shapes.hpp index d56610ae..3ae03c84 100644 --- a/src/gfx/render_shapes.hpp +++ b/src/gfx/render_shapes.hpp @@ -58,6 +58,7 @@ namespace Colours { const sf::Color YELLOW { 0xff, 0xff, 0x31}; const sf::Color ORANGE { 0xff, 0x80, 0x00}; const sf::Color LIGHT_BLUE { 0xad, 0xd8, 0xe6 }; // Spell points on dark background + const sf::Color TRANSPARENT { 0x00, 0x00, 0x00, 0x00 }; // Text colours for shopping / talking // TODO: The Windows version appears to use completely different colours? const sf::Color SHADOW { 0x00, 0x00, 0x68}; // formerly c[3] QD colour = {0,0,26623} (shop/character name shadow, shop subtitle)