2010-11-08 14:28:59 +01:00
QuestHelper_File [ " director_find.lua " ] = " 4.0.1.$svnversion$ "
2010-10-24 23:17:33 +02:00
QuestHelper_Loadtime [ " director_find.lua " ] = GetTime ( )
local function getitall ( name )
local segments = { }
for i = 1 , # name - 1 do
local sub = name : sub ( i , i + 1 ) : lower ( )
if not sub : find ( " " ) then
local dbi = DB_GetItem ( " find " , sub : byte ( 1 ) * 256 + sub : byte ( 2 ) , true )
--print("inserting", sub)
if not dbi then return { } end
segments [ dbi ] = true
end
end
local segwork = { }
for k in pairs ( segments ) do
table.insert ( segwork , { k , 1 , k [ 1 ] } )
end
local found = { }
while true do
local lowest = segwork [ 1 ] [ 3 ]
local highest = segwork [ 1 ] [ 3 ]
local lid = 1
for i = 2 , # segwork do
local v = segwork [ i ] [ 3 ]
--print("loop", i, lowest, highest, v, segwork[i][2])
if v < lowest then
--print("lower")
lowest , lid = v , i
end
if v > highest then
--print("higher")
highest = v
end
end
if lowest == highest then
table.insert ( found , lowest )
segwork [ 1 ] [ 2 ] = segwork [ 1 ] [ 2 ] + 1
if not segwork [ 1 ] [ 1 ] [ segwork [ 1 ] [ 2 ] ] then break end
segwork [ 1 ] [ 3 ] = segwork [ 1 ] [ 3 ] + segwork [ 1 ] [ 1 ] [ segwork [ 1 ] [ 2 ] ]
else
while segwork [ lid ] [ 3 ] < highest do
segwork [ lid ] [ 2 ] = segwork [ lid ] [ 2 ] + 1
if not segwork [ lid ] [ 1 ] [ segwork [ lid ] [ 2 ] ] then break end
segwork [ lid ] [ 3 ] = segwork [ lid ] [ 3 ] + segwork [ lid ] [ 1 ] [ segwork [ lid ] [ 2 ] ]
end
end
if not segwork [ lid ] [ 1 ] [ segwork [ lid ] [ 2 ] ] then break end
end
return found
end
local function generate_objective ( dbi )
local clooster = { }
local why = { desc = dbi.name , tracker_desc = dbi.name }
for _ , v in ipairs ( dbi.loc ) do
QuestHelper : Assert ( QuestHelper_ParentLookup )
QuestHelper : Assert ( QuestHelper_ParentLookup [ v.p ] , v.p )
table.insert ( clooster , { loc = { x = v.x , y = v.y , c = QuestHelper_ParentLookup [ v.p ] , p = v.p } , cluster = clooster , tracker_hidden = true , why = why , map_desc = { QuestHelper : HighlightText ( dbi.name ) } , tracker_desc = dbi.name , map_suppress_ignore = true , map_custom_menu = function ( menu ) QuestHelper : CreateMenuItem ( menu , QHText ( " FIND_REMOVE " ) ) : SetFunction ( function ( ) QH_Route_ClusterRemove ( clooster ) end ) end } )
end
QH_Route_ClusterAdd ( clooster )
end
local msfires = { desc = QHText ( " FIND_CUSTOM_LOCATION " ) , tracker_desc = QHText ( " FIND_CUSTOM_LOCATION " ) }
function QH_FindName ( name )
local locd = name : match ( " ^loc (.+) " )
if locd then
-- I just know some guy's gonna get pissed off because he was trying to find "loc crocolisk" or something, but screw him
local locx , locy , locz
locx , locy = locd : match ( " ^(%d+) (%d+)$ " )
if locx and locy then
locx , locy = tonumber ( locx ) , tonumber ( locy )
locz = QuestHelper_NameLookup [ QuestHelper_IndexLookup [ QuestHelper.routing_c ] [ QuestHelper.routing_z ] ]
end
if not locx then
locz , locx , locy = locd : match ( " ^(.+) (%d+) (%d+)$ " )
locx , locy = tonumber ( locx ) , tonumber ( locy )
end
if locz then
for z , nam in pairs ( QuestHelper_NameLookup ) do
if nam : lower ( ) : find ( locz : lower ( ) ) then
locz = z
break
end
end
if type ( locz ) == " number " then
local ec , ez = unpack ( QuestHelper_ZoneLookup [ locz ] )
local c , x , y = QuestHelper.Astrolabe : GetAbsoluteContinentPosition ( ec , ez , locx / 100 , locy / 100 )
local node = { loc = { x = x , y = y , p = locz , c = QuestHelper_ParentLookup [ locz ] } , why = msfires , map_desc = { QHText ( " FIND_CUSTOM_LOCATION " ) } , tracker_desc = QHText ( " FIND_CUSTOM_LOCATION " ) , tracker_hidden = true }
local cluster = { node }
node.cluster = cluster
node.map_suppress_ignore = true
node.map_custom_menu = function ( menu ) QuestHelper : CreateMenuItem ( menu , QHText ( " FIND_REMOVE " ) ) : SetFunction ( function ( ) QH_Route_ClusterRemove ( cluster ) end ) end
QH_Route_ClusterAdd ( cluster )
end
end
else
if not DB_Ready ( ) then
QuestHelper : TextOut ( QHText ( " FIND_NOT_READY " ) )
return
end
if # name < 2 then
QuestHelper : TextOut ( QHText ( " FIND_USAGE " ) )
return
end
local found = getitall ( name )
local mennix = QuestHelper : CreateMenu ( )
QuestHelper : CreateMenuTitle ( mennix , QHText ( " RESULTS_TITLE " ) )
local made_item = false
local found_db = { }
local has_name = { }
local needs_postfix = { }
for _ , v in ipairs ( found ) do
local dbi = DB_GetItem ( " monster " , v )
--[[ assert(dbi) ]]
if dbi.loc then
table.insert ( found_db , dbi )
if has_name [ dbi.name ] then needs_postfix [ dbi.name ] = true end
has_name [ dbi.name ] = true
end
end
table.sort ( found_db , function ( a , b ) return a.name < b.name end )
for _ , v in ipairs ( found_db ) do
made_item = true
local name = v.name
if needs_postfix [ name ] then name = name .. " ( " .. QuestHelper_NameLookup [ v.loc [ 1 ] . p ] .. " ) " end
local opt = QuestHelper : CreateMenuItem ( mennix , name )
opt : SetFunction ( generate_objective , v )
end
if not made_item then
QuestHelper : CreateMenuItem ( mennix , QHText ( " NO_RESULTS " ) )
end
mennix : ShowAtCursor ( )
end
end