Compare commits

...
Author SHA1 Message Date
Mike Klaas 5a629f2430 Refresh terrain info when marker leaves view 2026-07-26 16:02:35 -07:00
Mike Klaas 2724f2308b [Et tu] Add world map terrain info 2026-07-26 15:35:52 -07:00
4 changed files with 45 additions and 0 deletions
+1
View File
@@ -48,6 +48,7 @@ The following settings were moved into [`<DAT>/config/game.cfg`](files/ce.dat/co
| `Misc` | `ViewXPos` | `start` | `worldmap_view_x` |
| `Misc` | `ViewYPos` | `start` | `worldmap_view_y` |
| `Misc` | `StartGDialogFix` | `dialog` | `start_gdialog_fix` |
| `Interface` | `WorldMapTerrainInfo` | `worldmap` | `terrain_info` |
## Opcodes / Metarules
+2
View File
@@ -120,6 +120,8 @@ repair=293
town_map_hotkeys_fix=1
; Set to 1 to show travel markers on the world map, or 2 to show only when sneaking.
trail_markers=0
; Set to 1 to show the current terrain name when hovering over the stopped party marker.
terrain_info=0
; Set to 1 to skip the encounter with Frank Horrigan.
disable_horrigan=0
; City reputation overrides. Syntax: city_id:global_id pairs separated by commas.
+1
View File
@@ -234,6 +234,7 @@ namespace {
{ kSfallMisc, "DisableHorrigan", CONTENT_CONFIG_WORLDMAP_SECTION, "disable_horrigan", "0" },
{ kSfallMisc, "CityRepsList", CONTENT_CONFIG_WORLDMAP_SECTION, "city_reputation_list" },
{ kSfallInterface, "WorldMapTravelMarkers", CONTENT_CONFIG_WORLDMAP_SECTION, "trail_markers", "0" },
{ kSfallInterface, "WorldMapTerrainInfo", CONTENT_CONFIG_WORLDMAP_SECTION, "terrain_info", "0" },
// [characters]
{ kSfallMisc, "PremadePaths", CONTENT_CONFIG_CHARACTERS_SECTION, "premade_paths" },
{ kSfallMisc, "PremadeFIDs", CONTENT_CONFIG_CHARACTERS_SECTION, "premade_fids" },
+41
View File
@@ -563,6 +563,7 @@ static int wmInterfaceDrawCircleOverlaySafe(CityInfo* city, CitySizeDescription*
static void wmInterfaceDrawSubTileRectFogged(unsigned char* dest, int width, int height, int pitch);
static int wmInterfaceDrawSubTileList(TileInfo* tileInfo, int column, int row, int x, int y, int a6);
static int wmDrawCursorStopped();
static void wmInterfaceDrawTerrainInfo();
static bool wmCursorIsVisible();
static int wmGetAreaName(CityInfo* city, char* name);
static void wmMarkAllSubTiles(int state);
@@ -944,6 +945,8 @@ static bool wmFaded = false;
static int wmForceEncounterMapId = -1;
static unsigned int wmForceEncounterFlags = 0;
static int worldmapTrailMarkers;
static bool worldmapTerrainInfo;
static bool wmTerrainInfoIsVisible;
static inline bool cityIsValid(int city)
{
@@ -996,6 +999,7 @@ int wmWorldMap_init()
// SFALL
configGetBool(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "town_map_hotkeys_fix", &gTownMapHotkeysFix, true);
configGetInt(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "trail_markers", &worldmapTrailMarkers, 0);
configGetBool(&gContentConfig, CONTENT_CONFIG_WORLDMAP_SECTION, "terrain_info", &worldmapTerrainInfo, false);
// CE: City size fids should be initialized during startup. They are used
// during |wmTeleportToArea| to calculate worldmap position when jumping
@@ -3206,6 +3210,7 @@ static int wmWorldMapFunc(int a1)
unsigned int partyHealTime = 0;
int map = -1;
int rc = 0;
wmTerrainInfoIsVisible = false;
while (true) {
sharedFpsLimiter.mark();
@@ -3224,6 +3229,18 @@ static int wmWorldMapFunc(int a1)
int worldX = wmWorldOffsetX + mouseX - WM_VIEW_X;
int worldY = wmWorldOffsetY + mouseY - WM_VIEW_Y;
bool terrainInfoIsVisible = worldmapTerrainInfo
&& !wmGenData.isWalking
&& wmGenData.currentAreaId == -1
&& wmCursorIsVisible()
&& mouseHitTestInWindow(wmBkWin, WM_VIEW_X, WM_VIEW_Y, WM_VIEW_WIDTH + WM_VIEW_X, WM_VIEW_HEIGHT + WM_VIEW_Y)
&& abs(wmGenData.worldPosX - worldX) < 8
&& abs(wmGenData.worldPosY - worldY) < 6;
if (terrainInfoIsVisible != wmTerrainInfoIsVisible) {
wmTerrainInfoIsVisible = terrainInfoIsVisible;
wmInterfaceRefresh();
}
if (keyCode == KEY_CTRL_Q || keyCode == KEY_CTRL_X || keyCode == KEY_F10) {
showQuitConfirmationDialog();
}
@@ -6044,9 +6061,33 @@ static int wmDrawCursorStopped()
}
}
wmInterfaceDrawTerrainInfo();
return 0;
}
static void wmInterfaceDrawTerrainInfo()
{
if (!wmTerrainInfoIsVisible || !wmCursorIsVisible()) {
return;
}
const char* text = wmGetCurrentTerrainName();
int textWidth = std::min(fontGetStringWidth(text), 200);
int textX = WM_VIEW_X + wmGenData.worldPosX - wmWorldOffsetX - textWidth / 2;
textX = std::clamp(textX, WM_VIEW_X, WM_VIEW_X + WM_VIEW_WIDTH - textWidth);
int textY = WM_VIEW_Y + wmGenData.worldPosY - wmWorldOffsetY - 17;
textY = std::clamp(textY, WM_VIEW_Y, WM_VIEW_Y + WM_VIEW_HEIGHT - fontGetLineHeight());
fontDrawText(
wmBkWinBuf + WM_WINDOW_WIDTH * textY + textX,
text,
textWidth,
WM_WINDOW_WIDTH,
COLOR_GREEN | DRAW_TEXT_FLAG_SHADOWED);
}
// 0x4C4490 wmCursorIsVisible
static bool wmCursorIsVisible()
{