From 9826c6944cbb60f45d2e8736a69daf4ab8a856fb Mon Sep 17 00:00:00 2001 From: Vladeta Putnikovic Date: Fri, 28 Aug 2026 13:02:32 +0200 Subject: [PATCH 01/10] Draw quest objective areas on the world map instead of pins Replaces the per-spawn dots for quest objectives on the world map with numbered areas, in the style of the retail quest POI blobs: - Objective coordinates of each quest on the current map are grouped by single-linkage clustering (8 map-% threshold), so a quest whose targets live in two separate places gets two areas. - Each cluster is drawn as its padded convex hull, filled as a triangle fan with Texture:SetVertexOffset, one uniform translucent colour for all quests. Areas are children of the map canvas so they zoom with it. - A badge at the cluster centroid shows the quest's position in the quest log (main.lua now records meta.ordinal). Hovering an area or badge shows the quest title and its objective lines; clicking the badge opens the quest in the quest log via QuestLog_SetSelection. - Areas rebuild, debounced, whenever the node tables or the map change; rebuilds while the map is closed are deferred to the next OnShow. - New WorldMap setting "worldmap_quest_area" (default on) switches between areas and the previous dots. The minimap is unchanged. Geometry (clustering, monotone-chain hull with octagon padding, centroid) lives in map-area-geometry.lua and is covered by tests/geometry_test.lua, runnable with lua5.1 or via tests/run_lupa.py when only Python is around. Co-Authored-By: Claude Fable 5 --- Locale/deDE.lua | 1 + Locale/enUS.lua | 1 + Locale/esES.lua | 1 + Locale/esMX.lua | 1 + Locale/frFR.lua | 1 + Locale/koKR.lua | 1 + Locale/ptBR.lua | 1 + Locale/ruRU.lua | 1 + Locale/zhCN.lua | 1 + Locale/zhTW.lua | 1 + load.xml | 2 + main.lua | 6 + map-area-geometry.lua | 149 +++++++++++++++++++ map-area.lua | 311 ++++++++++++++++++++++++++++++++++++++++ map.lua | 30 +++- setting.lua | 14 ++ tests/geometry_test.lua | 151 +++++++++++++++++++ tests/run_lupa.py | 14 ++ 18 files changed, 682 insertions(+), 5 deletions(-) create mode 100644 map-area-geometry.lua create mode 100644 map-area.lua create mode 100644 tests/geometry_test.lua create mode 100644 tests/run_lupa.py diff --git a/Locale/deDE.lua b/Locale/deDE.lua index 7a525e2..6ca7acf 100644 --- a/Locale/deDE.lua +++ b/Locale/deDE.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/enUS.lua b/Locale/enUS.lua index 2dc43cd..2365dc0 100644 --- a/Locale/enUS.lua +++ b/Locale/enUS.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/esES.lua b/Locale/esES.lua index 855f70f..9a2714c 100644 --- a/Locale/esES.lua +++ b/Locale/esES.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/esMX.lua b/Locale/esMX.lua index aa48915..8552789 100644 --- a/Locale/esMX.lua +++ b/Locale/esMX.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/frFR.lua b/Locale/frFR.lua index 60ae292..7201a6a 100644 --- a/Locale/frFR.lua +++ b/Locale/frFR.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/koKR.lua b/Locale/koKR.lua index 51e5a93..ae73ffc 100644 --- a/Locale/koKR.lua +++ b/Locale/koKR.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/ptBR.lua b/Locale/ptBR.lua index 72e36b2..78202fe 100644 --- a/Locale/ptBR.lua +++ b/Locale/ptBR.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Minium Drop Rate"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Size of WorldMap normal pins"; uil10n.worldmap_large_size = "Size of WorldMap BOSS pins"; diff --git a/Locale/ruRU.lua b/Locale/ruRU.lua index 4d1954b..a472086 100644 --- a/Locale/ruRU.lua +++ b/Locale/ruRU.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "Modifier of poping menu of pin"; -- map uil10n.min_rate = "Минимальный шанс выпадения"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "Alpha of icons on world map"; uil10n.worldmap_normal_size = "Размер большинства контактов"; uil10n.worldmap_large_size = "Размер отображения босса"; diff --git a/Locale/zhCN.lua b/Locale/zhCN.lua index bd18d3f..5c85f53 100644 --- a/Locale/zhCN.lua +++ b/Locale/zhCN.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "任务标记弹出菜单按键"; -- map uil10n.min_rate = "最低物品掉率"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "大地图图标透明度"; uil10n.worldmap_normal_size = "大地图普通标记点大小"; uil10n.worldmap_large_size = "大地图boss标记点大小"; diff --git a/Locale/zhTW.lua b/Locale/zhTW.lua index a6bb8e9..362c853 100644 --- a/Locale/zhTW.lua +++ b/Locale/zhTW.lua @@ -59,6 +59,7 @@ uil10n.node_menu_modifier = "任務标记彈出菜單按鍵"; -- map uil10n.min_rate = "最低物品掉率"; -- worldmap +uil10n.worldmap_quest_area = "Show quest areas instead of objective pins"; uil10n.worldmap_alpha = "大地圖圖標透明度"; uil10n.worldmap_normal_size = "大地圖普通標記點大小"; uil10n.worldmap_large_size = "大地圖boss標記點大小"; diff --git a/load.xml b/load.xml index f5e7902..a1d2197 100644 --- a/load.xml +++ b/load.xml @@ -16,6 +16,8 @@