beta-01, Initial DLC2

His Dad [08-20-18 - 04:43]
beta-01, Initial DLC2
Filename
Doc/Changelog.txt
HistOfflineBeta.lua
data/DLC.lua
data/en/en.lua
data/ids.lua
data/utility.lua
diff --git a/Doc/Changelog.txt b/Doc/Changelog.txt
index 9e2e1e6..f8dc1b0 100644
--- a/Doc/Changelog.txt
+++ b/Doc/Changelog.txt
@@ -1,3 +1,8 @@
+2018-08-15 version 52-beta-01
+	Now have HistOfflineBeta.lua.
+	Additional DLC data.
+
+
 2018-08-14 version 52
 	Preliminary Support for Wolfhunter
 	Fix mouseover on a tab
diff --git a/HistOfflineBeta.lua b/HistOfflineBeta.lua
new file mode 100644
index 0000000..93dd30a
--- /dev/null
+++ b/HistOfflineBeta.lua
@@ -0,0 +1,1382 @@
+-- The MIT License (MIT) http://opensource.org/licenses/MIT
+-- Copyright (c) 2014-2016 His Dad
+
+-- Some code from the luatz project (MIT Licence)
+
+-- Configuration ==========
+--local dateformat = "%Y-%m-%d, %H:%M"
+local dateformat_log = "%Y-%m-%d, %H:%M:%S"
+local FG_Colour_Not_Complete = "#FFB67D"
+local FG_Colour_Complete = "#000000"
+local BG_Colour_Not_Complete = "#FFB67D"
+local BG_Colour_Complete = "#A4FF5A"
+local Colour_Heading_Complete = "#58FA58"
+local dname, key, count, ccount, colour, bgcolour
+
+--force_lang = "fr"  --	or "de" or "fr"  for debugging
+
+-- ========================
+version= "52-Beta-01"
+require( "iuplua" )
+require( "iupluacontrols" )
+require( "iupluamatrixex" )
+iup.SetGlobal("UTF8MODE","YES")
+dofile "../../SavedVariables/History.lua"
+Trials_Dat={}
+Trials_Order={"N","V","VH"}
+Grp_Dat={}
+
+Grp_Order={"1N","1V","1VH","2N","2V","2VH"}
+Grp1_Order={"1N","1V","1VH"}
+Grp2_Order={"2N","2V","2VH"}
+
+
+for _,i in ipairs(Grp_Order) do
+	Grp_Dat[i]={}
+end
+for _,i in ipairs(Trials_Order) do
+	Trials_Dat[i]={}
+end
+
+dofile "./data/Keys.lua"		--Linking tables, must do first
+dofile "./data/DLC.lua"			--Achievement to Grid lookup, language independent
+dofile "./data/Group1.lua"		-- Grp Mode 1 data, N, V, VH
+dofile "./data/Group2.lua"		-- Grp Mode 2 data, N, V, VH
+dofile "./data/Public.lua"
+dofile "./data/Quest.lua"
+dofile "./data/Veteran.lua"		-- Auxiliary Achievements for Vet Dungeons
+dofile "./data/WB.lua"
+dofile "./data/Trials.lua"
+dofile "./data/Special.lua"		-- Record of non standard Achievement ID's we need to keep.
+dofile "./data/utility.lua"		-- utility functions
+
+--generate_id ()			-- Generate the file the addon uses to filter Achievement ID's
+-- This is used by the in game part history.lua to only record achievements that are used.
+-- Uncomment when need to run.
+
+
+-- generate achievement lookups from key (cell)
+for _,i in ipairs(Grp_Order) do
+	Grp_Dat[i].reverse_id = reverse_id(Grp_Dat[i].id)
+end
+
+for _,i in ipairs(Trials_Order) do
+	Trials_Dat[i].reverse_id = reverse_id(Trials_Dat[i].id)
+end
+
+Pub_Dat_Char.reverse_id = reverse_id(Pub_Dat_Char.id)
+DLC_Dat.reverse_id = reverse_id(DLC_Dat.id)
+
+lingua= {}		-- Translated data
+load_lang = function (lang)
+	if lingua[lang] ~= nil
+	then return
+	end
+
+	local path = "./data/" .. lang .. "/"
+
+	dofile (path .. lang .. ".lua")
+	dofile (path .. lang .."-data.lua")			--Achievement Data from game
+	lingua[lang] = {}
+
+	lingua[lang].Area_names = Area_names		-- dofile writes to global variables
+	lingua[lang].L = L
+	lingua[lang].pub_names = pub_names
+	lingua[lang].grp_names = grp_names
+	lingua[lang].DLC_Location_names = DLC_Location_names
+	lingua[lang].Ach_Detail = Ach_Detail
+end
+
+
+
+
+--SQ_Dat loaded  from Quest.lua
+SQ_Info= {} -- keyed by "LC" string as the  ZONE Identifier
+for id,_ in pairs (SQ_dat) do  -- Load all Quest Data by Achievement ID
+		local L = SQ_dat[id].L
+		local C = SQ_dat[id].C
+		local key = tostring(L) .. tostring(C)	-- make name key
+
+		if SQ_Info[key] == nil then
+			SQ_Info[key] = {}
+			SQ_Info[key].ids = {}	--Array of Achievement ID's
+		end
+		table.insert(SQ_Info[key].ids,id)
+end
+
+--WB_Dat loaded  from WB.lua
+WB_Info= {} -- keyed by "LC" string as the  ZONE Identifier
+for id,_ in pairs (WB_dat) do  -- Load all WB Data by Achievement ID
+		local L = WB_dat[id].L
+		local C = WB_dat[id].C
+		local key = tostring(L) .. tostring(C)	-- make name key
+
+		if WB_Info[key] == nil then
+			WB_Info[key] = {}
+			WB_Info[key].ids = {}	--Array of Achievement ID's
+		end
+		table.insert(WB_Info[key].ids,id)
+end
+
+
+
+
+accounts = {}
+accounts_list = {}		-- String list for selection dialog
+playerNames = {}		-- Get name from ID.
+
+for acc,_ in pairs(History_SV["Default"]) do
+	accounts[acc] = {}
+	accounts[acc].worlds = {}
+	accounts[acc].hasblankworlds = false
+	accounts[acc].player = {}
+	accounts[acc].playerIDs = {}	-- intermediate table for sorting. WIP. Controls presentation order
+	accounts[acc].playerIDs_vet= {}	-- subset of names which are >L50
+	table.insert(accounts_list, acc)
+
+  -- ===	Load Language Tables
+    accounts[acc].lang = (History_SV["Default"][acc]["$AccountWide"].lang)
+	if accounts[acc].lang == nil then
+		accounts[acc].lang = "en"
+	end
+
+	if force_lang ~= nil then
+		accounts[acc].lang = force_lang	-- Force the language for testing
+	end
+	load_lang(accounts[acc].lang)
+	-- Reset Globals
+	Area_names = lingua[accounts[acc].lang].Area_names
+	L = lingua[accounts[acc].lang].L
+	pub_names = lingua[accounts[acc].lang].pub_names
+	grp_names = lingua[accounts[acc].lang].grp_names
+	DLC_Location_names = lingua[accounts[acc].lang].DLC_Location_names
+	Ach_Detail = lingua[accounts[acc].lang].Ach_Detail
+-- load worlds
+	nworlds = 0
+	if History_SV["Default"][acc]["$AccountWide"]["worlds"] ~= nil then
+		for i,j in pairs(History_SV["Default"][acc]["$AccountWide"]["worlds"]) do
+			nworlds = nworlds +1
+			table.insert(accounts[acc].worlds, i)
+		end
+	end
+
+-- insert marker for older chars
+--	table.insert(accounts[acc].worlds, "##NEITHER##")
+
+
+-- Load Character Data
+	for playerID, _ in pairs(History_SV["Default"][acc]["$AccountWide"]["data"]) do
+
+		if playerID == "" then
+		print("acct: " .. acc)
+		end
+		table.insert (accounts[acc].playerIDs, playerID)
+		accounts[acc].player[playerID] = {}		-- stub table to hold char data, later becomes "me"
+--
+		local me = accounts[acc].player[playerID]											-- shorter reference: our code
+		local thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB
+		-- Pull in some char data for processing
+		if thischar.name == nil  then --	Old Format
+	--	    print("Old Format  " .. playerID)
+			me.name = playerID
+		else
+			me.name = thischar.name
+		end
+		playerNames[playerID]=me.name
+
+		-- == Gender
+		if thischar.Gender =="M" then
+			me.gender = L.Male
+		elseif thischar.Gender == "F" then
+			me.gender = L.Female
+		end
+		-- ==Level
+		local level = thischar.level
+
+		me.level = level
+		if (level <=50) then
+			me.levelstr = tostring(level)
+			me.isvet = false
+		else
+			me.levelstr = "V" .. tostring(level -50)
+			me.isvet = true
+			table.insert(accounts[acc].playerIDs_vet,playerID)
+		end
+		-- == Cumulative TimePlayed
+		if thischar.timeplayed == nil then
+			me.timeplayed = math.floor(thischar.levels[level].time/60)   -- Old version compat
+		else
+			me.timeplayed = math.floor(thischar.timeplayed/60)
+		end
+		-- world
+
+		if thischar.world == nil then
+			accounts[acc].hasblankworlds = true		-- causes display of "##NEITHER##
+		else
+			me.world = thischar.world		-- server
+		end
+
+		-- a quick link to my Achievements
+		me.Ach = thischar.Ach
+	end
+
+	table.sort(accounts[acc].playerIDs,function(a,b)  return (playerNames[a] < playerNames[b]) end)
+	table.sort(accounts[acc].playerIDs_vet,function(a,b) return (playerNames[a] < playerNames[b]) end)
+end
+
+
+
+--[[ ==========================================
+	Iterate over all accounts and PlayerIDs creating display items
+--]]
+ for acc,_ in pairs (accounts) do
+
+  -- ====  Accountwide Data
+  -- Setup Log data
+	accounts[acc].logtabs  =iup.tabs{}
+	-- Log Display table presentation
+	accounts[acc].logtable = {}
+	accounts[acc].logtable=iup.matrix{numcol=2, numcol_visible=2,  numlin=0,numlin_visible=8}
+	accounts[acc].logtable:setcell(0,0, L.TStamp)
+	iup.SetAttribute(accounts[acc].logtable,  "ALIGNMENT0", "ACENTER")
+	iup.SetAttribute(accounts[acc].logtable,  "ALIGNMENT2", "ALEFT")
+	iup.SetAttribute(accounts[acc].logtable,  "WIDTH0", 80)
+	iup.SetAttribute(accounts[acc].logtable,  "WIDTH1", 100)
+	iup.SetAttribute(accounts[acc].logtable,  "WIDTH2", 300)
+	iup.SetAttribute(accounts[acc].logtable,  "READONLY", "YES")
+	-- Load log data
+
+	local Line=0
+	local TimeStr = ""
+	accounts[acc].logtable.numlin = Line
+	for _,j in ipairs (History_SV["Default"][acc]["$AccountWide"]["log"]) do
+		Line= Line +1
+		accounts[acc].logtable.numlin = Line
+		TimeStr = os.date(dateformat_log,j["TimeStamp"])
+		accounts[acc].logtable:setcell( Line,0, TimeStr)
+		if j["Char"] ~= nil then
+			accounts[acc].logtable:setcell( Line,1, j["Char"])
+		end
+		accounts[acc].logtable:setcell( Line,2, j["text"])
+	end
+
+	-- Setup Log Display
+	accounts[acc].log_tab=iup.vbox {
+			["tabtitle"] =L.LogTab,
+			accounts[acc].logtable,
+			iup.fill{}
+			}
+	-- Top Level Panels
+	-- accounts[acc].world_zbox = iup.zbox{}  -- display main panel containing worlds (servers)  -- not used ATM
+	accounts[acc].mode_zbox = iup.zbox{}  -- display submain panel containing tabs and dungeons
+	accounts[acc].char_tabs = iup.tabs{}  -- Top level of Char_Tabs, Character Info in Here
+	accounts[acc].dung_tabs = iup.tabs{}  -- Top level of Dung_Tabs, Dungeon  Info in Here
+
+
+	iup.Append(accounts[acc].mode_zbox, accounts[acc].char_tabs)
+
+	detail_name = iup.label {title="",expand = "HORIZONTAL"}
+	detail_desc = iup.label {title="",expand = "HORIZONTAL"}
+	Status_bar = iup.label{title=L.Welcome .. " " .. L.Version .. " " .. version .. ".", expand = "HORIZONTAL"}
+	iup.Append(accounts[acc].mode_zbox, accounts[acc].dung_tabs)
+
+  -- Mode Buttons (Toggles)
+  --[[  These control the display.
+   Char mode lists the characters and information for them (default for prior versions)
+   Dung Mode lists the dungeons and which characters have done them.
+   Buttons are arranged in radio mode
+   --]]
+
+   accounts[acc].char_tog = iup.toggle{ title = L.Characters}
+   accounts[acc].dung_tog = iup.toggle{ title = L.Dungeons}
+   accounts[acc].view_tog = iup.toggle{ title = L.View_Toggle, VISIBLE = "NO"}
+
+  local tog = accounts[acc].char_tog
+  function tog:action(x)
+	if x == 1 then
+	accounts[acc].mode_zbox.value =accounts[acc].char_tabs
+	iup.SetAttribute(accounts[acc].view_tog, "VISIBLE", "NO")
+	end
+  end
+
+
+  tog = accounts[acc].dung_tog
+  function tog:action(x)
+	if x == 1 then
+	accounts[acc].mode_zbox.value = accounts[acc].dung_tabs
+	iup.SetAttribute(accounts[acc].view_tog, "VISIBLE", "YES")
+	end
+  end
+
+
+
+
+  accounts[acc].mode = iup.frame {
+								iup.hbox{
+									iup.radio {
+										iup.hbox{
+												accounts[acc].char_tog,
+												accounts[acc].dung_tog,
+												},
+										},
+									accounts[acc].view_tog,
+									}
+								}
+
+  accounts[acc].mode.title =  L.Mode
+  accounts[acc].mode.margin = "15x5"
+
+  accounts[acc].alldungeons = {}
+  -- Prepare for Dungeon data recording as we iterate through characters.
+  accounts[acc].dung = {}		-- put all dungeon mode stuff here. Populate it with character data.
+  -- N Normal,   V Vet,    VH   Vet hard mode
+  dung = accounts[acc].dung
+  dung.pub = {}
+  dung.pub.box = {}
+  dung.pub.key = {}
+  dung.pub.name = "pub"
+  table.insert(accounts[acc].alldungeons,dung.pub)
+
+  dung.DLC = {}
+  dung.DLC.box = {}
+  dung.DLC.key = {}
+  dung.DLC.name = "DLC"
+  table.insert(accounts[acc].alldungeons,dung.DLC)
+  dung.Grp = {}		-- these ones are indexed.
+  dung.Trials = {}
+  tog = accounts[acc].view_tog
+
+  function tog:action(x)
+		if x == 1 then   --hide completed columns
+			for _, ADung in pairs (accounts[acc].alldungeons) do	-- for each dungeon
+			    if (ADung.ShowColumn == nil)  then
+					print ("ADung.ShowColumn is nil for " .. ADung.name)
+					break
+				end
+				for col,show in pairs(ADung.ShowColumn) do
+					if show  then
+						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
+					else
+						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"0")
+					end
+				end  --]]
+			end
+		else   -- show all
+			for _, ADung in pairs (accounts[acc].alldungeons) do	-- for each dungeon
+			    if (ADung.ShowColumn == nil)  then
+					print ("ADung.ShowColumn is nil for " .. ADung.name)
+					break
+				end
+
+				for col,show in pairs(ADung.ShowColumn) do
+						iup.SetAttribute(ADung.box, "WIDTH"..tostring(col) ,"100")
+				end
+			end
+		end
+	end
+
+  -- Set up dungeon mode Group Dungeons
+  for _,i in ipairs(Grp_Order) do
+	dung.Grp[i]= {}
+	dung.Grp[i].name = "Grp: " .. L.Grp_TabName[i]
+	dung.Grp[i].key ={}   -- key lookup
+	dung.Grp[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,     numlin=_size(Grp_Dat[i].id), widthdef=100}
+	iup.SetAttribute(dung.Grp[i].box, "READONLY", "YES")
+
+	dung.Grp[i].tab = iup.vbox {
+						["tabtitle"] =L.Grp_TabName[i],
+						dung.Grp[i].box,
+						iup.fill{},
+					}
+
+-- Mouseover
+	dung.Grp[i].box.dat = Grp_Dat[i]
+--	dung.Grp[i].box.mousemove_cb = box_mousemove_cb
+--	dung.Grp[i].box.leavewindow_cb = box_leavewindow_cb
+
+	--set lines Heading
+	dung.Grp[i].box:setcell(0,0, L.Location)
+	--Set Line titles
+	for line,key in ipairs(Grp_Dat[i].key) do
+		dung.Grp[i].box:setcell(line, 0, grp_names[key])
+	end
+
+	--Create Columns for Chars
+	for col ,playerID in ipairs(accounts[acc].playerIDs) do
+		dung.Grp[i].box:setcell(0, col, playerNames[playerID])
+	end
+
+	table.insert(accounts[acc].alldungeons,dung.Grp[i])
+  end
+
+  -- a table for each dungeon to which we add characters
+  for _,i in ipairs(Grp1_Order) do
+    for _,key in ipairs(grp1tokey) do
+	  dung.Grp[i].key[key] = {}
+	  for _,playerID in ipairs(accounts[acc].playerIDs) do
+		dung.Grp[i].key[key][playerID] = false
+	  end
+	end
+  end
+
+  for _,i in ipairs(Grp2_Order) do
+    for _,key in ipairs(grp2tokey) do
+	  dung.Grp[i].key[key] = {}
+	  for _,playerID in ipairs(accounts[acc].playerIDs) do
+		dung.Grp[i].key[key][playerID] = false
+	  end
+	end
+  end
+
+  -- Set up dungeon mode  Trials
+  for _,i in ipairs(Trials_Order) do
+		dung.Trials[i]= {}
+		dung.Trials[i].name = L.Trial_TabName[i]
+		dung.Trials[i].key ={}   -- key lookup
+		dung.Trials[i].box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=_size(Trials_Dat[i].id), widthdef=100}
+		iup.SetAttribute(dung.Trials[i].box, "READONLY", "YES")
+
+		dung.Trials[i].tab = iup.vbox {
+							["tabtitle"] =L.Trial_TabName[i],
+							dung.Trials[i].box,
+							iup.fill{},
+						}
+		dung.Trials[i].box.dat = Trials_Dat[i]
+	--	dung.Trials[i].box.mousemove_cb = box_mousemove_cb
+		dung.Trials[i].box.leavewindow_cb = box_leavewindow_cb
+
+
+		--set lines Heading
+		dung.Trials[i].box:setcell(0,0, L.Location)
+		--Set Line titles
+		for line,key in ipairs(Trials_Dat[i].key) do
+			dung.Trials[i].box:setcell(line, 0, Trials_Names[i][key])
+		end
+
+		--Create Columns for Chars
+		for col ,playerID in ipairs(accounts[acc].playerIDs) do
+			dung.Trials[i].box:setcell(0, col, playerNames[playerID])
+		end
+
+
+
+		-- a table for each dungeon to which we add characters
+		for _,key in ipairs(Trials2key[i]) do
+		  dung.Trials[i].key[key] = {}
+		  for _,playerID in ipairs(accounts[acc].playerIDs) do
+			dung.Trials[i].key[key][playerID] = false
+		  end
+		end
+		table.insert(accounts[acc].alldungeons,dung.Trials[i])
+  end
+
+
+
+
+--  for _,i in ipairs(Pub_Dat_Char.key) do
+--	  dung.pub.key[i] = {}
+--  end
+
+  for _,i in ipairs(DLC2key) do
+	  dung.DLC.key[i] = {}
+  end
+
+  -- ================  END Accountwide Data
+
+  --=================  START OF CHARACTER MODE DISPLAY
+
+-- Creates boxes, stage from names to allow sorting
+	for _,playerID in ipairs(accounts[acc].playerIDs) do
+		local me = accounts[acc].player[playerID]											-- shorter reference: our code
+		local thischar = History_SV["Default"][acc]["$AccountWide"]["data"][playerID]	-- shorter reference: History DB
+
+
+		-- Generate the leveling box.  ============================
+
+		me.leveling_box = iup.matrix {numcol=6, numcol_visible=6,  widthdef=60}
+		me.leveling_box:setcell(0,1, L.Level)
+		me.leveling_box:setcell(0,2, L.PTime)
+		me.leveling_box:setcell(0,3, L.Start)
+		me.leveling_box:setcell(0,4, L.Deaths)
+		me.leveling_box:setcell(0,5, L.APts)
+		me.leveling_box:setcell(0,6, L.Location)
+		iup.SetAttribute(me.leveling_box, "WIDTH6", "100")
+		iup.SetAttribute(me.leveling_box, "READONLY", "YES")
+
+
+		-- levels as stored are unsorted, so create a level table which is sorted,
+		local levels = {}
+		for i,_ in pairs(thischar.levels) do
+			table.insert(levels, i)
+		end
+
+		table.sort(levels)
+
+		for i,j in ipairs(levels) do		-- traverse in sorted order
+			local timelevel = math.floor(thischar.levels[j].time)
+			me.leveling_box.numlin = i
+			me.leveling_box:setcell(i,1, j)
+			me.leveling_box:setcell(i,2, math.floor(timelevel/60))
+			me.leveling_box:setcell(i,3, os.date("%Y-%m-%d",thischar.levels[j].begin))
+			me.leveling_box:setcell(i,4, thischar.levels[j].deaths)
+			me.leveling_box:setcell(i,5, thischar.levels[j].Ach_Points)
+			-- Do we have map name for this level?
+			if thischar.levels[j].map ~= nil then
+				me.leveling_box:setcell(i,6, thischar.levels[j].map)
+			end
+		end
+		-- Create Grp Dungeon Boxes ====================================
+		me.Grp ={}		-- Put them all together
+
+		for _, i in ipairs(Grp_Order) do		-- For Each Grp Dungeon
+			me.Grp[i] = {}						--  Dungeon data storage
+			me.Grp[i].vet = Grp_Dat[i].vet
+			me.Grp[i].box = iup.matrix {numcol=4, numcol_visible=4,  numlin=Grp_Dat[i].lines, widthdef=100}
+			iup.SetAttribute(me.Grp[i].box, "READONLY", "YES")
+
+			me.Grp[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
+			me.Grp[i].box.dat = Grp_Dat[i]		-- for mouseover
+			me.Grp[i].box.mousemove_cb = box_mousemove_cb
+			me.Grp[i].box.leavewindow_cb = box_leavewindow_cb
+
+			--Set Column titles in box
+			for j=1, 4 do
+				me.Grp[i].box:setcell(0,j, Area_names[j].long)
+			end
+
+
+			-- set background to red
+		--	iup.SetAttribute(me.Grp[i].box,  "BGCOLOR", BG_Colour_Not_Complete)
+
+			-- set text to black if achievement found.
+
+			for id, Gdat in pairs (Grp_Dat[i].id) do
+				local bgcolour,key
+				if thischar.ach[id] ~= nil then
+					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
+					iup.SetAttribute(me.Grp[i].box, bgcolour, BG_Colour_Complete)
+					-- Add char to dungeon
+					key = tostring(Gdat.L .. Gdat.C)
+					if  dung.Grp[i].key[key] == nil then
+						print ("dung.Grp[i].key[key]   key:  " .. key .. " is nil.")
+					end
+					dung.Grp[i].key[key][playerID] = true
+				else
+					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
+					iup.SetAttribute(me.Grp[i].box, bgcolour, BG_Colour_Not_Complete)
+				end
+			end
+
+			-- Create display tab
+			me.Grp[i].tab = iup.vbox {
+						["tabtitle"] =L.Grp_TabName[i],
+						me.Grp[i].box,
+						iup.fill{},
+				}
+		end
+
+		-- these IDs are in Specials.lua
+		--Set background of heading if all done
+		if thischar.ach[1073] ~= nil then  --EP Vanquisher
+				iup.SetAttribute(me.Grp["1N"].box,  "BGCOLOR0:1", Colour_Heading_Complete)
+		end
+
+		if thischar.ach[1074] ~= nil then  --DC Vanquisher
+				iup.SetAttribute(me.Grp["1N"].box ,  "BGCOLOR0:2", Colour_Heading_Complete)
+		end
+
+		if thischar.ach[1075] ~= nil then  --AD Vanquisher
+				iup.SetAttribute(me.Grp["1N"].box ,  "BGCOLOR0:3", Colour_Heading_Complete)
+		end
+
+		for _,i in ipairs(Grp_Order) do
+			for _, id in pairs (Grp_Dat[i].id) do
+				local key = tostring(id.L).. tostring(id.C)	-- make name key
+				me.Grp[i].box:setcell(id.L, id.C, grp_names[key])
+			end
+		end
+
+		-- Create Trials Dungeon Boxes ====================================
+		me.Trials ={}		-- Put them all together
+
+		for _, i in ipairs(Trials_Order) do		-- For Each Dungeon
+			me.Trials[i] = {}						-- Dungeon data storage
+			me.Trials[i].vet = Trials_Dat[i].vet
+			me.Trials[i].box = iup.matrix {numcol=1, numcol_visible=1, numlin=_size(Trials_Dat[i].id), widthdef=120}
+
+			me.Trials[i].box.ach = thischar.ach		-- Put the Achievements here so the mouseover can get the users details
+			me.Trials[i].box.dat = Trials_Dat[i]		-- for mouseover
+			me.Trials[i].box.mousemove_cb = box_mousemove_cb
+			me.Trials[i].box.leavewindow_cb = box_leavewindow_cb
+
+			--Set Column titles in box
+			for line,key in ipairs (Trials2key[i]) do  -- Load Dungeons Name. Info LC is the Dungeon Identifier
+					me.Trials[i].box:setcell(line,0, Trials_Names[i][key])
+			end
+
+
+			iup.SetAttribute(me.Trials[i].box,  "BGCOLOR*:1", BG_Colour_Not_Complete)
+			--iup.SetAttribute(me.Trials[i].box,  "FGCOLOR*:1", "DEFAULT")
+			-- set text if achievement found and change background
+			for id, Gdat in pairs (Trials_Dat[i].id) do
+				local bgcolour
+				if thischar.ach[id] ~= nil then
+					bgcolour = "BGCOLOR" .. Gdat.L .. ":" .. Gdat.C
+					me.Trials[i].box:setcell(Gdat.L,Gdat.C, L.YesLabel)
+					iup.SetAttribute(me.Trials[i].box, bgcolour, BG_Colour_Complete)
+					-- Add char to dungeon
+					dung.Trials[i].key[Gdat.key][playerID] = true
+				else
+					me.Trials[i].box:setcell(Gdat.L,Gdat.C, L.NoLabel)
+				end
+
+			end
+
+			-- Create display tab
+			me.Trials[i].tab = iup.vbox {
+						["tabtitle"] =L.Trial_TabName[i],
+						me.Trials[i].box,
+						iup.fill{},
+				}
+		end
+
+
+		-- Create Pub Dungeon Achievements Box==========================
+		me.Pub_box = iup.matrix {READONLY="YES",numcol=4, numcol_visible=4,  numlin=5, widthdef=100}
+		me.Pub_box.dat = Pub_Dat_Char
+		me.Pub_box.ach = thischar.ach
+		me.Pub_box.mousemove_cb = box_mousemove_cb
+		me.Pub_box.leavewindow_cb = box_leavewindow_cb
+
+		for i=1, 4 do  -- Load text
+			me.Pub_box:setcell(0,i, Area_names[i].long)
+		end
+
+		iup.SetAttribute(me.Pub_box,  "BGCOLOR" , BG_Colour_Not_Complete)
+
+		for id,_ in pairs (Pub_Dat_Char.id) do
+			local bgcolour = "BGCOLOR" .. Pub_Dat_Char.id[id].L .. ":" .. Pub_Dat_Char.id[id].C
+			if thischar.ach[id] ~= nil then
+				iup.SetAttribute(me.Pub_box, bgcolour, BG_Colour_Complete)
+				-- Add char to dungeon
+				local key = tostring(Pub_Dat_Char.id[id].L .. Pub_Dat_Char.id[id].C)
+				if dung.pub.key[key] == nil then	-- Add if needed
+					dung.pub.key[key]  = {}
+				end
+				dung.pub.key[key][playerID] = true
+			else
+				iup.SetAttribute(me.Pub_box, bgcolour, BG_Colour_Not_Complete)
+			end
+		end
+
+		if thischar.ach[1068] ~= nil then  --EP Conqueror
+				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:1", Colour_Heading_Complete)
+		end
+
+		if thischar.ach[1070] ~= nil then  --DC Conqueror
+				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:2", Colour_Heading_Complete)
+		end
+
+		if thischar.ach[1069] ~= nil then  --AD Conqueror
+				iup.SetAttribute(me.Pub_box,  "BGCOLOR0:3", Colour_Heading_Complete)
+		end
+
+		for id,dat in pairs (Pub_Dat_Char.id) do  -- Load text
+				local key = tostring(tostring(dat.L) .. tostring(dat.C))	-- make name key
+				local dname = pub_names[key]
+					if dname == nil then
+				dname = "key " .. key .." not found in pub_names"
+				end
+				me.Pub_box:setcell(dat.L,dat.C,dname)
+		end
+
+		-- Create Locations Box==============================================
+		me.Map_box= iup.matrix {numcol=6, numcol_visible=6,  numlin=0, widthdef=70}
+
+		me.Map_box:setcell(0,0, L.Location)
+		me.Map_box:setcell(0,1, L.Visits)
+		me.Map_box:setcell(0,2, L.FirstVisited)
+		me.Map_box:setcell(0,3, L.FirstLevel)
+		me.Map_box:setcell(0,4, L.TimesLeveled)
+		me.Map_box:setcell(0,5, L.FirstDeath)
+		me.Map_box:setcell(0,6, L.Deaths)
+
+		iup.SetAttribute(me.Map_box, "READONLY", "YES")
+		iup.SetAttribute(me.Map_box, "ALIGNMENT0", "ALEFT")
+		iup.SetAttribute(me.Map_box, "WIDTH0", "100")
+		iup.SetAttribute(me.Map_box, "WIDTH1", "40")
+		iup.SetAttribute(me.Map_box, "WIDTH4", "55")
+		iup.SetAttribute(me.Map_box, "WIDTH6", "40")
+
+
+		local map_names = {}
+		for map,_ in pairs(thischar.maps) do
+			table.insert(map_names,map)
+		end
+
+		table.sort(map_names)
+		local Line =1
+		for _, map in ipairs(map_names) do
+			me.Map_box.numlin = Line
+
+			me.Map_box:setcell( Line,0, map)
+
+			if thischar.maps[map].visit ~= nil then
+				me.Map_box:setcell( Line,1, thischar.maps[map].visit)
+			end
+
+			if thischar.maps[map].firstvisitdate ~= nil then
+				local firstvisit = os.date(dateformat,thischar.maps[map].firstvisitdate)
+				me.Map_box:setcell( Line,2, firstvisit)
+			end
+
+			if thischar.maps[map].firstlevel ~= nil then
+				me.Map_box:setcell( Line,3, thischar.maps[map].firstlevel)
+			end
+
+			if thischar.maps[map].timeslevel ~= nil then
+				me.Map_box:setcell( Line,4, thischar.maps[map].timeslevel)
+			end
+
+			if thischar.maps[map].firstdeathlevel ~= nil then
+				me.Map_box:setcell( Line,5, thischar.maps[map].firstdeathlevel)
+			end
+
+			if thischar.maps[map].deaths ~= nil then
+				me.Map_box:setcell( Line,6, thischar.maps[map].deaths )
+			end
+		Line= Line +1
+		end
+-- Create WorldBoss Achievements Box==========================
+		me.WB_box= iup.matrix {numcol=4, numcol_visible=4,  numlin=5, widthdef=110}
+
+		for i=1, 4 do  -- Load headings, not Trials
+			me.WB_box:setcell(0,i, Area_names[i].long)
+		end
+		me.WB_box:setcell(0,0, L.Zone)
+		me.WB_box:setcell(1,0, "1")
+		me.WB_box:setcell(2,0, "2")
+		me.WB_box:setcell(3,0, "3")
+		me.WB_box:setcell(4,0, "4")
+		me.WB_box:setcell(5,0, "5")
+		iup.SetAttribute(me.WB_box, "READONLY", "YES")
+		iup.SetAttribute(me.WB_box, "ALIGNMENT0", "ACENTER")
+
+
+		-- Need to keep track of multiple achievements for WB in Zones. Index them by zone LineColumn.
+		WB_Area={}
+    local dname, key, count, ccount
+-- Scan over all Slots, see what we have
+		for C=1, 4 do
+			ccount = 0		-- per column
+			for L = 1, 5 do
+				key = tostring(L) .. tostring(C)	-- make name key
+				dname = Locations[key]				-- Zone Locations
+				if dname == nil then
+					break	-- only 1 in Coldharbour,1 morrowind, not worry about empty slots
+				end
+
+				count = 0
+				if WB_Info[key] == nil then
+					break	-- Some Locations not necessarily have WB
+				end
+				for _, id in ipairs (WB_Info[key].ids) do	-- get the WB of the zone
+
+					if  thischar.ach[id] ~= nil then	-- Have we got it?
+						count =count +1
+					end
+				end
+				ccount = ccount + count		-- Track the faction (Column)
+				me.WB_box:setcell(L,C,dname .. " (" .. tostring(count) .. ")")
+
+				colour = "FGCOLOR" .. L .. ":" .. C
+				bgcolour = "BGCOLOR" .. L .. ":" .. C
+				if count == #WB_Info[key].ids then		-- Got them all??
+					iup.SetAttribute(me.WB_box, colour   , FG_Colour_Complete)  -- Yup
+					iup.SetAttribute(me.WB_box, bgcolour , BG_Colour_Complete)
+				end
+			end   -- L
+
+			--Set Column Heading Colours
+			if ccount >= 15 then
+				iup.SetAttribute(me.WB_box, "BGCOLOR0:" .. tostring(C), Colour_Heading_Complete)
+			end
+		end		-- C
+---
+-- Create WorldBoss Achievements Detail Boxes=======================
+
+		me.WB_Detail_box = {}
+		me.WB_Detail_Zbox = iup.zbox{}
+
+
+		for key, dat  in pairs(WB_Info) do	-- for each zone
+			me.WB_Detail_box[key]= iup.matrix {numcol=2, numcol_visible=2,  numlin=#dat.ids}
+
+			me.WB_Detail_box[key]:setcell(0,0, L.Ach_ID)
+			me.WB_Detail_box[key]:setcell(0,1, L.Name)
+			me.WB_Detail_box[key]:setcell(0,2, L.Detail)
+			iup.SetAttribute(me.WB_Detail_box[key], "READONLY", "YES")
+			iup.SetAttribute(me.WB_Detail_box[key], "ALIGNMENT0", "ACENTER")
+			iup.SetAttribute(me.WB_Detail_box[key], "ALIGNMENTLIN0", "ALEFT")
+			iup.SetAttribute(me.WB_Detail_box[key], "ALIGNMENT1", "ALEFT")
+			iup.SetAttribute(me.WB_Detail_box[key], "ALIGNMENT2", "ALEFT")
+			iup.SetAttribute(me.WB_Detail_box[key],"WIDTH0", "30")
+			iup.SetAttribute(me.WB_Detail_box[key],"WIDTH1", "150")
+			iup.SetAttribute(me.WB_Detail_box[key],"WIDTH2", "300")
+			for line, id in ipairs (dat.ids) do	-- get the Ach of zone
+				me.WB_Detail_box[key]:setcell(line,0, tostring(id))
+
+				if Ach_Detail[id] == nil then
+					name = "UNKN"
+					Desc = ""
+				else
+					name = Ach_Detail[id].name
+					Desc = Ach_Detail[id].description
+				end
+				me.WB_Detail_box[key]:setcell(line,1, name)
+				me.WB_Detail_box[key]:setcell(line,2, Desc)
+
+				-- Set Detail Colours on achievement
+				if thischar.ach[id] == nil  then
+					iup.SetAttribute(me.WB_Detail_box[key],"FGCOLOR" .. tostring(line) .. ":*", FG_Colour_Not_Complete)	-- Nope
+				else
+					iup.SetAttribute(me.WB_Detail_box[key],"BGCOLOR" .. tostring(line) .. ":*", BG_Colour_Complete)		-- Yes
+				end
+			end
+			iup.Append(me.WB_Detail_Zbox, me.WB_Detail_box[key])
+		end
+
+
+		function me.WB_box:enteritem_cb(L,C)
+			me.WB_Detail_Zbox.value = me.WB_Detail_box[tostring(L) .. tostring(C)]
+		end
+
+
+
+-- Create SkillQuest Achievements Box==========================
+
+		me.SQ_box= iup.matrix {numcol=4, numcol_visible=4,  numlin=5, widthdef=110}
+		for i=1, 4 do  -- Load headings
+			me.SQ_box:setcell(0,i, Area_names[i].long)
+		end
+		me.SQ_box:setcell(0,0, L.Zone)
+		me.SQ_box:setcell(1,0, "1")
+		me.SQ_box:setcell(2,0, "2")
+		me.SQ_box:setcell(3,0, "3")
+		me.SQ_box:setcell(4,0, "4")
+		me.SQ_box:setcell(5,0, "5")
+		iup.SetAttribute(me.SQ_box, "READONLY", "YES")
+		iup.SetAttribute(me.SQ_box, "ALIGNMENT0", "ACENTER")
+
+		iup.SetAttribute(me.SQ_box,  "FGCOLOR*:1", FG_Colour_Not_Complete)
+		iup.SetAttribute(me.SQ_box,  "FGCOLOR*:2", FG_Colour_Not_Complete)
+		iup.SetAttribute(me.SQ_box,  "FGCOLOR*:3", FG_Colour_Not_Complete)
+		iup.SetAttribute(me.SQ_box,  "FGCOLOR*:4", FG_Colour_Not_Complete)
+		iup.SetAttribute(me.SQ_box,  "FGCOLOR*:5", FG_Colour_Not_Complete)
+
+		-- Need to keep track of multiple achievements for SQ in Zones. Index them by zone LineColumn.
+
+		for C=1, 4 do
+			ccount = 0		-- per column
+			for L = 1, 5 do
+				key = tostring(L) .. tostring(C)	-- make name key
+				dname = Locations[key]				-- Zone Locations
+				if dname == nil then
+					break	-- only 1 in Coldharbour,1 morrowind not worry about empty slots
+				end
+
+				count = 0
+				if SQ_Info[key] == nil then
+					break	-- Some Locations not necessarily have Skill Quests
+				end
+				for _, id in ipairs (SQ_Info[key].ids) do	-- get the quests of the zone
+
+					if  thischar.ach[id] ~= nil then	-- Have we got it?
+						count =count +1
+					end
+				end
+				ccount = ccount + count		-- Track the faction (Column)
+				me.SQ_box:setcell(L,C,dname .. " (" .. tostring(count) .. ")")
+
+				colour = "FGCOLOR" .. L .. ":" .. C
+				bgcolour = "BGCOLOR" .. L .. ":" .. C
+				if count == #SQ_Info[key].ids then		-- Got them all??
+					iup.SetAttribute(me.SQ_box, colour   , FG_Colour_Complete)  -- Yup
+					iup.SetAttribute(me.SQ_box, bgcolour , BG_Colour_Complete)
+				end
+			end   -- L
+
+			--Set Column Heading Colours
+			if ccount >= 15 then
+				iup.SetAttribute(me.SQ_box, "BGCOLOR0:" .. tostring(C), Colour_Heading_Complete)
+			end
+		end		-- C
+---
+-- Create SkillQuest Achievements Detail Boxes=======================
+
+		me.SQ_Detail_box = {}
+		me.SQ_Detail_Zbox = iup.zbox{}
+
+		local  link
+		for key, dat in pairs(SQ_Info) do	-- for each zone
+			me.SQ_Detail_box[key]= iup.matrix {numcol=2, numcol_visible=2,  numlin=#dat.ids}
+
+			me.SQ_Detail_box[key]:setcell(0,0, L.Ach_ID)
+			me.SQ_Detail_box[key]:setcell(0,1, L.Name)
+			me.SQ_Detail_box[key]:setcell(0,2, L.Link)
+			iup.SetAttribute(me.SQ_Detail_box[key], "READONLY", "YES")
+			iup.SetAttribute(me.SQ_Detail_box[key], "ALIGNMENT0", "ACENTER")
+			iup.SetAttribute(me.SQ_Detail_box[key], "ALIGNMENTLIN0", "ALEFT")
+			iup.SetAttribute(me.SQ_Detail_box[key], "ALIGNMENT1", "ALEFT")
+			iup.SetAttribute(me.SQ_Detail_box[key], "ALIGNMENT2", "ALEFT")
+			iup.SetAttribute(me.SQ_Detail_box[key],"WIDTH0", "30")
+			iup.SetAttribute(me.SQ_Detail_box[key],"WIDTH1", "150")
+			iup.SetAttribute(me.SQ_Detail_box[key],"WIDTH2", "250")
+			for line, id in ipairs (dat.ids) do	-- get the quests of the zone
+				me.SQ_Detail_box[key]:setcell(line,0, tostring(id))
+
+				if Ach_Detail[id] == nil then
+					name = "UNKN"
+				else
+					name = Ach_Detail[id].name
+				end
+				link = SQ_dat[id].link1
+				me.SQ_Detail_box[key]:setcell(line,1, name)
+				me.SQ_Detail_box[key]:setcell(line,2, link)
+				-- Set Detail Colours on achievement
+				if thischar.ach[id] == nil  then
+					iup.SetAttribute(me.SQ_Detail_box[key],"FGCOLOR" .. tostring(line) .. ":*", FG_Colour_Not_Complete)	-- Nope
+				else
+					iup.SetAttribute(me.SQ_Detail_box[key],"BGCOLOR" .. tostring(line) .. ":*", BG_Colour_Complete)		-- Yes
+				end
+
+			iup.Append(me.SQ_Detail_Zbox, me.SQ_Detail_box[key])
+			end
+		-- Click on Link,
+		local thisSQDetail = me.SQ_Detail_box[key]	-- The function def below doesn't like the [key]
+		function thisSQDetail:click_cb(L,C)
+				if C == 2 then
+					iup.Help(self:getcell(L,C))		-- Launch Browser
+				else
+					return IUP_IGNORE
+				end
+			end
+
+		end
+
+		function me.SQ_box:enteritem_cb(L,C)
+			me.SQ_Detail_Zbox.value = me.SQ_Detail_box[tostring(L) .. tostring(C)]
+		end
+--========== DLC
+
+		me.DLC_box= iup.matrix {numcol=6, numcol_visible=6,  numlin=4, widthdef=105}
+		iup.SetAttribute(me.DLC_box, "READONLY", "YES")
+		me.DLC_box.dat = DLC_Dat
+		me.DLC_box.ach = thischar.ach
+		me.DLC_box.mousemove_cb = box_mousemove_cb
+		me.DLC_box.leavewindow_cb = box_leavewindow_cb
+		--Set Column titles
+
+		me.DLC_box:setcell(0,1, Area_names[6].long)		-- Orsinium
+		me.DLC_box:setcell(0,2, Area_names[8].long)		-- IC
+		me.DLC_box:setcell(0,3, Area_names[9].long)		-- Hist
+		me.DLC_box:setcell(0,4, Area_names[10].long)	-- Horns
+		me.DLC_box:setcell(0,5, Area_names[11].long)	-- Bones
+--		me.DLC_box:setcell(0,6, Area_names[12].long)	-- VVardenfell
+		me.DLC_box:setcell(0,6, Area_names[14].long)	-- Wolf
+
+		for id,_ in pairs (DLC_Dat.id) do
+				local L = DLC_Dat.id[id].L
+				local C = DLC_Dat.id[id].C
+				local key = tostring(L).. tostring(C)	-- make name key
+				me.DLC_box:setcell(L, C, DLC_Location_names[key])
+		end
+
+
+		-- set text to black and bg to green if achievement found.
+		for id,_ in pairs (DLC_Dat.id) do
+			local bgcolour = "BGCOLOR" .. DLC_Dat.id[id].L .. ":" .. DLC_Dat.id[id].C
+			if thischar.ach[id] ~= nil then
+				iup.SetAttribute(me.DLC_box, bgcolour, BG_Colour_Complete)
+				-- Add char to dungeon
+				key = tostring(DLC_Dat.id[id].L .. DLC_Dat.id[id].C)
+				dung.DLC.key[key][playerID] = true
+			else
+				iup.SetAttribute(me.DLC_box, bgcolour, BG_Colour_Not_Complete)
+			end
+		end
+
+		if thischar.ach[1248] ~= nil then  --"Hero of Wrothgar",
+				iup.SetAttribute(me.DLC_box,  "BGCOLOR0:1", Colour_Heading_Complete)
+		end
+
+		me.DLC2 = {}
+		me.DLC2_tabs = iup.tabs{}		-- we add our tabs to here for display. (list of vboxes)
+
+
+
+		for i,dlc in ipairs (DLC_Order) do
+
+			me.DLC2[dlc] = {}
+			me.DLC2[dlc].box = iup.matrix {READONLY="YES", numcol=4, numcol_visible=4, numlin=#DLC_Dat2[dlc].line, widthdef=110}
+			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH1", 50)
+			iup.SetAttribute(me.DLC2[dlc].box,"WIDTH3", 350)
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT1", "ACENTER")
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT2", "ALEFT")
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT3", "ALEFT")
+			iup.SetAttribute(me.DLC2[dlc].box,"ALIGNMENT4", "ALEFT")
+			me.DLC2[dlc].box:setcell(0, 1, L.Ach_ID)
+			me.DLC2[dlc].box:setcell(0, 2, L.Achievement)
+			me.DLC2[dlc].box:setcell(0, 4, L.Completed)
+
+			me.DLC2[dlc].box.name = dlc
+
+
+			--Add data
+			for line,id in ipairs(DLC_Dat2[dlc].line) do
+				me.DLC2[dlc].box:setcell(line, 1, tostring(id))
+				me.DLC2[dlc].box:setcell(line, 2, Ach_Detail[id].name)
+				me.DLC2[dlc].box:setcell(line, 3, Ach_Detail[id].description)
+
+				local bgcolour1 = "BGCOLOR" .. tostring(line) .. ":1"	--Detail and Description Columns
+				local bgcolour2 = "BGCOLOR" .. tostring(line) .. ":2"
+				local bgcolour3 = "BGCOLOR" .. tostring(line) .. ":3"
+				local bgcolour4 = "BGCOLOR" .. tostring(line) .. ":4"
+				if thischar.ach[id] ~= nil then
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour1, BG_Colour_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour2, BG_Colour_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour3, BG_Colour_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour4, BG_Colour_Complete)
+					me.DLC2[dlc].box:setcell(line, 4, os.date(dateformat,thischar.ach[id].time))
+
+
+					-- Add char to dungeon
+	--				key = tostring(DLC_Dat.id[id].L .. DLC_Dat.id[id].C)
+	--				dung.DLC.key[key][playerID] = true
+				else
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour1, BG_Colour_Not_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour2, BG_Colour_Not_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour3, BG_Colour_Not_Complete)
+					iup.SetAttribute(me.DLC2[dlc].box, bgcolour4, BG_Colour_Not_Complete)
+				end
+			end	--lines in box
+
+			-- make a tab out that DLC.
+			me.DLC2[dlc].tab = iup.vbox{
+				me.DLC2[dlc].box,
+				iup.fill{}
+			}
+			me.DLC2[dlc].tab.tabtitle=DLC_Names[i]
+
+
+			--Check for Special Completion
+			if (DLC_Dat2[dlc].complete ~= nil and thischar.ach[DLC_Dat2[dlc].complete]) then
+			 print(me.name ..  "  Complete.")
+
+			end
+
+			iup.Append(me.DLC2_tabs,me.DLC2[dlc].tab)			--Accumulate here for display
+
+		end
+
+
+
+ -- ====================================
+	--  == Prepare for the character data display tabs
+		me.tab = iup.vbox{
+					["tabtitle"] = me.name,		-- This vbox will be a tab and the tab text is this
+
+					iup.hbox{		--Top Information bar
+							Alignment = "ACENTER",
+							iup.label{title=thischar.world,PADDING="10X0"},
+							iup.label{title=me.gender, FONT="Times,BOLD,10"},
+							iup.label{title=thischar.Race .." / ".. thischar.Class, PADDING="10X0", FONT="Times,BOLD,10"},
+							iup.label{title=thischar.Alliance, PADDING="10X0"},
+							iup.label{title=L.Level .. ": ".. me.levelstr, PADDING="10X0"},
+							iup.label{title=L.Created .. os.date(dateformat,thischar.Created), PADDING="10X0"},
+							iup.label{title=L.LLog .. os.date(dateformat,thischar.LoginTime), PADDING="10X0"},
+							iup.label{title=L.TPlayed .. me.timeplayed .." " .. L.Hrs},
+							iup.fill{}
+							},
+					iup.label{SEPARATOR="HORIZONTAL"}
+					}
+
+		me.data_tabs = iup.tabs{} --Data tabs for Char
+		-- All Grp Dungeons
+		for _,i in ipairs (Grp_Order) do
+			if me.isvet or me.Grp[i].vet == false then
+				-- non vet chars only see non-vet dungeons
+				iup.Append(me.data_tabs, me.Grp[i].tab)
+			end
+		end
+
+		-- All Trials Dungeons
+		for _,i in ipairs (Trials_Order) do
+			if me.isvet or me.Trials[i].vet == false then
+				-- non vet chars only see non-vet dungeons
+				iup.Append(me.data_tabs, me.Trials[i].tab)
+			end
+		end
+
+		iup.Append(me.data_tabs,	iup.vbox {	["tabtitle"] =L.PubDungeon,
+												iup.label{title=L.PubLab,expand="HORIZONTAL"},
+												me.Pub_box,
+												iup.fill{}
+											})
+		if me.isvet then
+		--[[
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.VetDungeon,
+												iup.label{title=L.VetLab,expand="HORIZONTAL"},
+												me.Vet_box,
+												iup.fill{}
+											})
+
+--]]
+		end
+
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.Leveling,
+										--		iup.label{title="LevLabel",expand="HORIZONTAL"},
+												me.leveling_box,
+												iup.fill{}
+											})
+
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.Locations,
+											--	iup.label{title="LevLabel",expand="HORIZONTAL"},
+												me.Map_box,
+												iup.fill{}
+											})
+
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.WBosses,
+												iup.label{title=L.WBLab,expand="HORIZONTAL"},
+												me.WB_box,
+												iup.label{title=L.WB_Detail},
+												me.WB_Detail_Zbox,
+												iup.fill{}
+											})
+
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.SkillQuests,
+												iup.label{title=L.SkillLab,expand="HORIZONTAL"},
+												me.SQ_box,
+												iup.label{title=L.SQ_Detail},
+												me.SQ_Detail_Zbox,
+												iup.fill{}
+											})
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =L.DLC,
+												iup.label{title=L.DLCLab,expand="HORIZONTAL"},
+												me.DLC_box,
+												iup.fill{}
+											})
+
+		iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] ="DLC2",
+						iup.label{title=L.DLCLab,expand="HORIZONTAL"},
+						me.DLC2_tabs,
+						iup.fill{},
+					})
+
+
+
+		iup.Append(me.tab,me.data_tabs)		-- Add Dungeons/Data under the Character
+
+		iup.Append(accounts[acc].char_tabs,me.tab) -- Add Char tab to Account
+
+		local wide =((#accounts[acc].playerIDs+1) * 110)
+		if wide < 690  then
+			wide = 690
+		elseif wide >960 then
+			wide =  960
+		end
+
+		accounts[acc].panelsize =  tostring(wide) ..  "x350"
+	end  -- Chars
+
+-- Add to end of Characters
+iup.Append(accounts[acc].char_tabs, accounts[acc].log_tab)
+
+--=================  END OF CHARACTER MODE DISPLAY
+--=================  START OF DUNGEON MODE DISPLAY
+
+   -- Generic function for populating these tables
+	populate = function(ADung,Grp_key)
+		if ADung.key == nil  then
+			print ("ADung.key  is nil (fatal)")
+		end
+
+		ADung.ShowColumn = {}		-- Save Column Completion Information
+		-- Set Column Show Information to false
+		for col,playerID in ipairs(accounts[acc].playerIDs) do
+			ADung.ShowColumn[col] = false
+		end
+
+
+		for line, key in ipairs(Grp_key) do  -- for lines going down, get the key
+
+			-- does that char exist in the table. Check by PlayerID
+			for col,playerID in ipairs(accounts[acc].playerIDs) do	-- over each char in order
+				if ADung.key[key] == nil  then
+					ADung.key[key] = {}
+				end
+
+				if ADung.key[key][playerID]  then
+					ADung.box:setcell(line,col, L.YesLabel)
+					iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Complete)
+				else
+					ADung.box:setcell(line,col, L.NoLabel)
+					iup.SetAttribute(ADung.box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(col), BG_Colour_Not_Complete)
+					ADung.ShowColumn[col] = true		-- flag entire column as not complete, thus to show it.
+				end
+			end
+		end
+
+		--Ok, Set the Column Width flag Hide sometimes
+		--And column Heading background Always
+		for col,state in pairs(ADung.ShowColumn) do
+			if state then
+				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Not_Complete)
+			else
+				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Complete)
+			end
+		end
+
+	end
+
+	-- Create Pub Dungeon Character Box=========================
+
+	dung.pub.box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#Pub_Dat_Char.key, widthdef=100}
+
+		dung.pub.box.dat = Pub_Dat_Char
+--	dung.pub.box.mousemove_cb = box_mousemove_cb
+	dung.pub.box.leavewindow_cb = box_leavewindow_cb
+
+	--Set Line titles
+	for line,key in ipairs(Pub_Dat_Char.key) do
+		dung.pub.box:setcell(line, 0, pub_names[key])
+	end
+	--set lines
+	dung.pub.box:setcell(0,0, L.Location)
+
+	--Create Columns for Chars
+	for col ,playerID in ipairs(accounts[acc].playerIDs) do
+		dung.pub.box:setcell(0, col, playerNames[playerID])
+	end
+
+	iup.SetAttribute(dung.pub.box, "READONLY", "YES")
+
+	-- Populate with character data ============================
+	-- print ("Populating Pub")
+	populate(dung.pub,Pub_Dat_Char.key)
+
+	-- Create Pub Dungeon Tab ==================================
+
+	dung.pub.tab = iup.vbox {
+						["tabtitle"] =L.Pub,
+						dung.pub.box,
+						iup.fill{},
+				}
+
+	iup.Append(accounts[acc].dung_tabs, dung.pub.tab)
+
+	-- Grp Dungeons  ===========================================
+
+	for _,i in ipairs (Grp_Order) do
+		iup.Append(accounts[acc].dung_tabs, dung.Grp[i].tab)
+		-- Populate with character data ============================
+		-- print ("populate Grp,i: " .. i)
+		populate(dung.Grp[i], Grp_Dat[i].key)
+	end
+
+	-- Create DLC Dungeon Character Box=========================
+
+	dung.DLC.box = iup.matrix {numcol=#accounts[acc].playerIDs ,  numlin=#DLC2key, widthdef=100}
+
+	dung.DLC.box.dat = DLC_Dat
+--	dung.DLC.box.mousemove_cb = box_mousemove_cb
+	dung.DLC.box.leavewindow_cb = box_leavewindow_cb
+
+	--Set Line titles
+	for i, key in ipairs(DLC2key) do
+		dung.DLC.box:setcell(i, 0, DLC_Location_names[key])
+	end
+	--set lines
+	dung.DLC.box:setcell(0,0, L.Location)
+	--Create Columns for Chars
+	for i,playerID in ipairs(accounts[acc].playerIDs ) do
+		dung.DLC.box:setcell(0, i, playerNames[playerID])
+	end
+
+	iup.SetAttribute(dung.DLC.box, "READONLY", "YES")
+
+	populate(dung.DLC,DLC_Dat.key)
+
+
+	-- Create DLC Dungeon Tab ==================================
+	dung.DLC.tab = iup.vbox {
+						["tabtitle"] =L.DLC,
+						dung.DLC.box,
+						iup.fill{},
+				}
+	iup.Append(accounts[acc].dung_tabs, dung.DLC.tab)
+
+
+-- Commented out because we expect all dung to be populated
+-- if #accounts[acc].playerIDs_vet > 0  then  -- skip vet and trials if no eligible chars
+
+		-- Create Trials  Tab ============================================
+		for _,i in ipairs (Trials_Order) do
+			iup.Append(accounts[acc].dung_tabs, dung.Trials[i].tab)
+			-- Populate with character data ============================
+		--	print ("populate Trials")
+			populate(dung.Trials[i], Trials_Dat[i].key)
+		end
+
+--end -- has vet chars
+
+end -- Accounts
+
+table.sort(accounts_list)
+
+function select_account()
+	local selected
+		if #accounts_list > 1 then
+			selected = iup.ListDialog (1, L.SelectA,
+					#accounts_list,	--Size
+					accounts_list,
+					1, --Initial
+					1,#accounts_list	--MaxCol MaxLine
+					)
+
+			if selected <0 then
+				return nil		-- Canceled				iup.SetAttribute(ADung.box,"BGCOLOR" .. "0:" .. tostring(col), BG_Colour_Not_Complete)
+			else
+				return accounts_list[selected+1]
+			end
+		else
+		return accounts_list[1]		-- only 1 account, no need for Dialog
+		end
+end
+
+
+-- Create dialog to choose account
+myaccount=select_account()
+
+
+if myaccount ~=nil then
+	-- Create dialog if not cancelled
+	dlg = iup.dialog{iup.vbox{
+							accounts[myaccount].mode,
+							accounts[myaccount].mode_zbox,
+							detail_name,		-- Hover over information
+							detail_desc,
+							Status_bar,	-- Bottom Status bar.
+							margin="5x5",
+							ngap="3",
+							},
+					title=L.title .. myaccount ,
+					size=accounts[myaccount].panelsize,
+					}
+	-- Shows dialog in the centre of the screen
+	dlg:showxy(iup.CENTER, iup.CENTER)
+
+	if (iup.MainLoopLevel()==0) then
+	  iup.MainLoop()
+	end
+end
diff --git a/data/DLC.lua b/data/DLC.lua
index 951d17a..d90800f 100644
--- a/data/DLC.lua
+++ b/data/DLC.lua
@@ -1,5 +1,16 @@
 -- Group Dungeons
 DLC_Dat = {}
+DLC_Dat2 = {}
+
+--These match the datafiles used in the game
+DLC_Order= {"Thieves Guild", "Dark Brotherhood", "Orsinium", "Imperial City", "Shadows of the Hist", "Horns of the Reach", "Dragon Bones","Clockwork City", "Morrowind", "Summerset", "Wolfhunter"}
+--DLC_Order= {"Orsinium"}
+
+for _,dlc in ipairs (DLC_Order) do
+	DLC_Dat2[dlc] = {}
+	DLC_Dat2[dlc].line = {}
+end
+

 DLC_Dat.id ={
 --Orsinium
@@ -42,13 +53,414 @@ DLC_Dat.id ={
 -- No Group Dungeons in Vvardenfell
 -- No Group Dungeons in Thieves Guild
 -- No Group Dungeons in Summerset
+}

+DLC_Dat.key = DLC2key
+DLC_Dat2["Orsinium"].line = {
+1324,	-- Wrothgar Master Relic Hunter,  Collect all 20 relics for the House of Orsimer Glories museum.
+1257,	-- Wrothgar Dungeon Slayer,  Complete both Wrothgar public dungeon boss achievements.
+1331,	-- Wrothgar Cliff Jumper,  Leap from the cliff west of Frostbreak Ridge and survive.
+1237,	-- Rkindaleft Vanquisher,  Defeat 3 champions in the Rkindaleft public dungeon.
+1235,	-- Rkindaleft Group Event,  Activate the ancient centurion in Rkindaleft.
+1236,	-- Rkindaleft Conqueror,  Defeat all of Rkindaleft's champions.
+1326,	-- Orc King's Marshal,  Complete quest "The Anger of a King" in Wrothgar.
+1325,	-- Orc King's Councilor,  Complete quest "A King-Sized Problem" in Wrothgar.
+1327,	-- Orc King's Conqueror,  Complete quest "Blood on a King's Hands" in Wrothgar.
+1247,	-- One Last Brawl,  Grant 5 elderly Orc warriors a glorious death.
+1240,	-- Old Orsinium Vanquisher,  Defeat 3 champions in the Old Orsinium public dungeon.
+1238,	-- Old Orsinium Group Event,  Resist the cultist onslaught in Old Orsinium.
+1239,	-- Old Orsinium Conqueror,  Defeat all of the champions in Old Orsinium.
+1330,	-- Maelstrom Arena: Perfect Run,  Complete Veteran Maelstrom Arena in a single attempt, without dying or leaving the arena.
+1305,	-- Maelstrom Arena Conqueror,  Conquer all challengers in Veteran Maelstrom Arena.
+1304,	-- Maelstrom Arena Champion,  Conquer all challengers and earn the title of Maelstrom Arena Champion.
+1260,	-- Kingmaker,  Complete Wrothgar's main quests.
+1286,	-- Kill Zandadunoz the Reborn,  Defeat Zandadunoz the Reborn at the Unfinished Dolmen.
+1285,	-- Kill Old Snagara,  Kill Old Snagara the echatere in the Poacher's Encampment.
+1290,	-- Kill Nyzchaleft,  Kill Nyzchaleft the Dwarven Centurion at Nyzchaleft Falls.
+1289,	-- Kill Mad Urkazbur the Ogre,  Kill Mad Urkazbur at the Mad-Ogre's Altar.
+1287,	-- Kill King-Chief Edu,  Kill the Riekr regent King-Chief Edu at the King-Chief's Throne.
+1288,	-- Kill Corintthac the Abomination,  Kill the Winterborn Briarheart Warrior, Corintthac the Abomination, at the Accursed Nursery.
+1248,	-- Hero of Wrothgar,  Complete quests, defeat bosses, and explore delves to become the Hero of Wrothgar.
+1249,	-- Defender of Orsinium,  Defeat 4 Wrothgar world bosses.

 }

-DLC_Dat.key = DLC2key
+DLC_Dat2["Orsinium"].complete = 1248

+DLC_Dat2["Clockwork City"].line = {
+2074,	-- Wind-up Rodent Wrecker,  Slow the spread of secrets by destroying 100 Skeevatons.
+2048,	-- Treasure of the Brass Fortress,  Travel to the Brass Fortress in Clockwork City.
+2063,	-- The Real Sotha Sil,  Complete the "Where Shadows Lie" quest.
+2064,	-- The Burden of Knowledge,  Complete the "The Light of Knowledge" quest.
+2081,	-- Swift Mercy,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold within a time limit of 15 minutes in Veteran Asylum Sanctorium. Timer starts when players enter the Sanctuary Atrium.
+2059,	-- Smoke and Mirrors,  Complete the "The Strangeness of Seht" quest.
+2062,	-- Shadow Boxing,  Complete the "Unto the Dark" quest.
+2080,	-- Sanctified,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold without suffering a group member death in Veteran Asylum Sanctorium.
+2085,	-- Righteous Condemnation,  Defeat Saint Olms the Just and Saint Llothis the Pious in the same battle in Veteran Asylum Sanctorium.
+1958,	-- Precursor Maker,  Collect and install all of the parts necessary to reconstruct the Precursor factotum.
+2083,	-- Placid Projections,  Defeat Saint Felms the Bold without allowing either of his Pneuma Projections to enrage in Veteran Asylum Sanctorium.
+2087,	-- Perfect Purification,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in the same battle without suffering a group member death within 15 minutes of entering the Sanctuary Atrium in Veteran Asylum Sanctorium.
+2046,	-- Murderer of Crows,  Defeat Ithoxis, Abathoth, and Ssatinot in Exarchs' Egress.
+2060,	-- Middle-Man,  Complete the "Deepening Shadows" quest.
+2050,	-- Land of Gears and Cogs,  Complete the "To the Clockwork City" quest.
+2028,	-- Imperfection,  Defeat The Imperfect in the Sanctuary of Verification.
+2084,	-- Imperfect Attendance,  Defeat Saint Llothis the Pious without dismantling his Imperfect Attendants in Veteran Asylum Sanctorium.
+2049,	-- Hero of Clockwork City,  Complete quests, defeat bosses, and explore delves to become the Hero of Clockwork City.
+2086,	-- Executioners' Judgement,  Defeat Saint Olms the Just and Saint Felms the Bold in the same battle in Veteran Asylum Sanctorium.
+2047,	-- Clockwork City Defender,  Defeat both world bosses in Clockwork City.
+2058,	-- Clockwork Citizen,  Complete the "In Search of a Sponsor" quest.
+2061,	-- Birds of a Feather,  Complete the "Lost in the Gloam" quest.
+2082,	-- Beatific Beatdown,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold at the same time without allowing Saint Felms or Saint Llothis to enrage during the fight in Veteran Asylum Sanctorium.
+2079,	-- Asylum Sanctorium Vanquisher,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in the same fight in Veteran Asylum Sanctorium.
+2075,	-- Asylum Sanctorium Redeemer,  Complete the listed achievements for Asylum Sanctorium.
+2078,	-- Asylum Sanctorium Contender,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in the same fight in Asylum Sanctorium.
+2077,	-- Asylum Sanctorium Conqueror,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Veteran Asylum Sanctorium.
+2076,	-- Asylum Sanctorium Completed,  Defeat Saint Olms the Just, Saint Llothis the Pious, and Saint Felms the Bold in Asylum Sanctorium.
+}
+DLC_Dat2["Clockwork City"].complete = 2049

+DLC_Dat2["Dark Brotherhood"].line = {
+1443,	-- Wrath of Sithis,  Complete "The Wrath of Sithis" Dark Brotherhood quest in the Gold Coast.
+1444,	-- Silencer,  Complete the "Filling the Void" Dark Brotherhood quest in the Gold Coast.
+1438,	-- Sermonizer Subduer,  Complete the "A Lesson in Silence" Dark Brotherhood quest in the Gold Coast.
+1437,	-- New-blade,  Complete the "Welcome Home" Dark Brotherhood quest in the Gold Coast.
+1454,	-- Lonely Sentinel,  Closely observe the silent vigil of the Ayleid Sentinel at Beldaburo in the Gold Coast.
+1410,	-- Litany of Blood,  Execute all targets listed in the Litany of Blood and collect your reward.
+1449,	-- Hidden Sacrament,  Complete a Black Sacrament contract without being detected.
+1421,	-- Gold Coast Tourist,  Visit the Gold Coast and take in the local scenery.
+1458,	-- Gold Coast Connections,  Aid each of the notable figures recently arrived on the Gold Coast.
+1463,	-- Flawless Sacrament,  Complete each achievement associated with the Speaker's Black Sacrament contracts.
+1445,	-- First Sacrament,  Complete your first Black Sacrament contract, as the Speaker commanded.
+1459,	-- First Cut,  Murder your first innocent with the Blade of Woe.
+1451,	-- First Contract,  Complete your first murder contract from the "Marked for Death" tome.
+1435,	-- First Blood,  Join the Dark Brotherhood and complete the "Voices in the Dark" quest.
+1425,	-- Defender of the Gold Coast,  Defeat both world bosses in the Gold Coast.
+1419,	-- Defeat Limenauruus,  Defeat Limenauruus the possessed minotaur and the shadow spirits at Tribune's Folly.
+1442,	-- Dark Investigator,  Complete the "A Ghost from the Past" Dark Brotherhood quest in the Gold Coast.
+1436,	-- Dark Initiate,  Complete the "Signed in Blood" Dark Brotherhood quest in the Gold Coast.
+1441,	-- Dark Discovery,  Complete the "Dark Revelations" Dark Brotherhood quest in the Gold Coast.
+1420,	-- Conquer the Kvatch Arena,  Enter the Kvatch Arena and defeat all challengers.
+1439,	-- Brethren Benefactor,  Complete the "Questions of Faith" Dark Brotherhood quest in the Gold Coast.
+1457,	-- Blood Tour,  In the capital city of each alliance, murder an innocent with the Blade of Woe.
+1450,	-- Blackest Sacrament,  Assassinate every target named by a Black Sacrament contract when commanded to by the Speaker.
+1434,	-- Bane of the Gold Coast,  Complete quests, defeat bosses, and explore delves to become the Bane of the Gold Coast.
+1440,	-- Assassin,  Complete the "A Special Request" Dark Brotherhood quest in the Gold Coast.
+}
+DLC_Dat2["Dark Brotherhood"].complete = 1434
+
+
+DLC_Dat2["Imperial City"].line = {
+1261,	-- Xivkyn Assassin,  Kill 1 member of the Coldharbour Elite Guard.
+1346,	-- White-Gold Tower Vanquisher,  Defeat the Adjudicator, the Elite Guard, the Planar Inhibitor, and Molag Kena in White-Gold Tower.
+1120,	-- White-Gold Tower Conqueror,  Defeat the Adjudicator, the Elite Guard, the Planar Inhibitor, and Molag Kena in Veteran White-Gold Tower.
+1182,	-- Trove Scamp Seeker,  Kill 1 Trove Scamp while adventuring in the Imperial Sewers.
+1276,	-- To Spite a Tharn,  Defeat the Adjudicator, the Empress Regent's Guard, the Planar Inhibitor, and Molag Kena in Veteran White-Gold Tower without experiencing the death of a group member.
+1175,	-- The Sublime Protector,  Bring an end to Molag Bal's secret plot in the Imperial City.
+1109,	-- Sewer Subjugator,  Kill all the named champions lurking in the Imperial Sewers
+1185,	-- Protector of the Faith,  Complete the Imperial City Temple event by defeating the Daedric Titan, Uzuruz.
+1306,	-- Out of the Frying Pan,  In Veteran White-Gold Tower, become completely engulfed in flame by the Planar Inhibitor's Heat Stroke attack before it completes its Daedric Catastrophe attack. Then stay alive until the Planar Inhibitor is defeated.
+1133,	-- Out of Sight,  In Imperial City Prison, defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, and Lord Warden Dusk without any group member being noticed by the Vigilant Watchers.
+1128,	-- No Prison Can Hold Me,  Defeat all mini-boss and boss enemies in Veteran Imperial City Prison within forty five minutes of starting the dungeon. Timer starts when players enter The Bastion.
+1303,	-- Lord Warden's Retaliation,  In Veteran Imperial City Prison, destroy the Warden's Tome, then defeat Lord Warden Dusk.
+1129,	-- Life Sentence,  Defeat all mini-boss and boss enemies in Veteran Imperial City Prison without suffering a group member death.
+1279,	-- Ire of the Storm,  In Veteran White-Gold Tower, complete the ritual listed in the Obelisk Tome, then defeat Molag Kena.
+1273,	-- Imperial Lightbringer,  Complete the Barathrum Centrata event deep beneath the Imperial City.
+1345,	-- Imperial City Prison Vanquisher,  Defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, the Lord Warden's Council, and Lord Warden Dusk in the Imperial City Prison.
+880,	-- Imperial City Prison Conqueror,  Defeat the Overfiend, Ibomez the Flesh Sculptor, the Gravelight Sentry, the Flesh Abomination, the Lord Warden's Council, and Lord Warden Dusk in Veteran Imperial City Prison.
+1132,	-- Imperial City Challenger,  Complete the listed Challenges for veteran dungeons in Imperial City.
+1184,	-- Imperial Arena Champion,  Complete the Imperial City Arena by slaying the Ringmaster and her monstrous servants.
+1174,	-- Horror of Horrors,  Defeat all the Patrolling Horrors in the Imperial City.
+1275,	-- First to the Top,  Defeat the Adjudicator, the Empress Regent's Guard, the Planar Inhibitor, and Molag Kena in Veteran White-Gold Tower within 30 minutes of starting the dungeon. Timer starts when you enter Green Emperor Way.
+1280,	-- Entry Denied,  In Veteran White-Gold Tower, destroy all portals to prevent the arrival of the Planar Inhibitor's reinforcements.
+1142,	-- Darklight Dancer,  Defeat the Lord Warden Dusk of Imperial City Prison while you and your group members avoid every Darklight Burst.
+1268,	-- Cunning Scamp Seeker,  Kill 1 Cunning Scamp while adventuring in the Imperial Sewers.
+1122,	-- Blockbuster,  Free prisoners from their cell blocks in Imperial City Prison.
+}
+
+DLC_Dat2["Imperial City"].complete = 1132 -- Challenger

+DLC_Dat2["Thieves Guild"].line = {
+1377,	-- What Price, Freedom?,  Complete quest "Everyone Has A Price" in Hew's Bane.
+1371,	-- Welcome to the Thieves Guild,  Join the Thieves Guild by completing quest "Partners in Crime" in Hew's Bane.
+1362,	-- Wedding Crashers,  Complete quest "Forever Hold Your Peace" in Hew's Bane.
+1367,	-- Time Trial: Maw of Lorkhaj,  Complete Veteran Maw of Lorkhaj within a time limit of 40 minutes. Your trial begins when you cross the threshold of the Temple of Seven Riddles.
+1376,	-- Seeds Untilled,  Complete quest "That Which Was Lost" in Hew's Bane.
+1361,	-- Never, Ever Steal From the Guild,  Complete quest "A Flawless Plan" in Hew's Bane.
+1389,	-- Maw of Lorkhaj: Void Avoided,  Defeat Rakkhat in Veteran Maw of Lorkhaj, with a maximum of two players ever being afflicted by the Breath of Lorkhaj.
+1369,	-- Maw of Lorkhaj: Unchained Ambush,  Use both chain switches within ten seconds in Veteran Maw of Lorkhaj, then defeat the dro-m'Athra invaders.
+1388,	-- Maw of Lorkhaj: Two-Moons Dance,  In Veteran Maw of Lorkhaj, force Rakkhat into his final phase within two lunar cycles, then defeat him.
+1386,	-- Maw of Lorkhaj: Stainless Souls,  Defeat Rakkhat without anyone dying while afflicted by the Breath of Lorkhaj.
+1392,	-- Maw of Lorkhaj: Spotless Triumph,  Complete Veteran Maw of Lorkhaj without suffering a group member death.
+1391,	-- Maw of Lorkhaj: Moons' Champion,  Complete all achievements related to defeating Rakkhat, Fang of Lorkhaj in Veteran Maw of Lorkhaj.
+1390,	-- Maw of Lorkhaj: Fang Focused,  Defeat Rakkhat in Veteran Maw of Lorkhaj, with at least three dro-m'Athra Dreadstalkers still alive.
+1344,	-- Maw of Lorkhaj Difficult Mode,  Defeat Rakkhat after empowering him at the lunar shrines in Veteran Maw of Lorkhaj.
+1368,	-- Maw of Lorkhaj Conqueror,  Defeat Rakkhat, Fang of Lorkhaj and his legions of dro-m'Athra in Veteran Maw of Lorkhaj.
+1343,	-- Maw of Lorkhaj Completed,  Drive the dro-m'Athra back to the void and close the Maw of Lorkhaj in Normal Mode.
+1378,	-- Loose Ends,  Complete quest "The One That Got Away" in Hew's Bane.
+1370,	-- Iron Wheel Infiltration,  Complete quest "The Long Game" in Hew's Bane.
+1365,	-- Hero of Hew's Bane,  Complete quests, defeat bosses, and explore delves to become the Hero of Hew's Bane.
+1394,	-- Five Finger Discount,  Successfully pick pockets at each of the four most popular shops in Abah's Landing.
+1354,	-- Defender of Hew's Bane,  Defeat both Hew's Bane world bosses.
+1352,	-- Deepest Shallows,  Kill Syvarra of the Deep at Ko Estaran.
+1404,	-- Deep Pockets,  Receive the highest possible reward in 5 heists for the Thieves Guild.
+1353,	-- Cutting the Keel,  Kill Captain Virindi Slave-Taker at Thrall Cove.
+1363,	-- Broken Wheel,  Complete quest "Prison Break" in Hew's Bane.
+1349,	-- Breaking and Entering,  Trespass in seven locked locations throughout Abah's Landing.
+1402,	-- And Then They Were Gone,  Evade justice with the help of the "Timely Escape" Thieves Guild skill, as well as a friendly footpad.
+1360,	-- Always Travel Separately,  Complete quest "Cleaning House" in Hew's Bane.
+1375,	-- A Life Deferred,  Complete quest "His Greatest Treasure" in Hew's Bane.
+}
+DLC_Dat2["Thieves Guild"].complete = 1365

+DLC_Dat2["Shadows of the Hist"].line = {
+1533,	-- Web Walker,  Defeat Velidreth in Veteran Cradle of Shadows without any party members dying in the catacombs.
+1536,	-- Venomous Evasion,  Defeat Velidreth in Cradle of Shadows without any party members being hit by venom sacs.
+1524,	-- Velidreth's Vengeance,  Defeat Velidreth in Veteran Cradle of Shadows, after first enraging her by defiling her statue of Mephala.
+1508,	-- Unbowed,  Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun without suffering a group member death.
+1506,	-- Tree-Minder's Mania,  In Veteran Ruins of Mazzatun, defeat Tree-Minder Na-Kesh after enraging her by destroying her alchemical notes on Amber Plasm.
+1519,	-- Sticky Situation Savvy,  Defeat Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun without any party members being struck by Blistering Amber.
+1538,	-- Shadows of the Hist Delver,  Complete Veteran Cradle of Shadows and Veteran Ruins of Mazzatun.
+1531,	-- Shadowplay,  Defeat Khephidaen the Spiderkith in Veteran Cradle of Shadows without relighting any extinguished braziers.
+1513,	-- Savior of the Su-Zahleel,  Rescue all six of the Su-Zahleel Elders from the Ritual Chamber in Veteran Ruins of Mazzatun.
+1514,	-- Sapped Sludge Slingers,  Complete Ruins of Mazzatun without ever allowing a Sludge Slinger to empower one of its allies with Amber Plasm.
+1504,	-- Ruins of Mazzatun Vanquisher,  Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in the Ruins of Mazzatun.
+1505,	-- Ruins of Mazzatun Conqueror,  Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun.
+1511,	-- Ruins of Mazzatun Challenger,  Complete the listed achievements for Veteran Ruins of Mazzatun.
+1507,	-- Ruination,  Defeat Zatzu the Spine-Breaker, The Mighty Chudan, Xal-Nur the Slaver, and Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun within 30 minutes of starting the dungeon. Timer starts on passing through the first archway.
+1516,	-- Obedience Training,  Defeat Xal-Nur the Slaver in Veteran Ruins of Mazzatun without unleashing any Wamasu to assist you.
+1535,	-- Nothing to See Here,  Defeat Velidreth in Veteran Cradle of Shadows without any party members being caught by her Shadow Sense.
+1512,	-- Mazzatun Massacre,  Defeat Tree-Minder Na-Kesh after first eliminating all other enemies in Ruins of Mazzatun.
+1515,	-- Haj Mota Matador,  Defeat the Mighty Chudan in Veteran Ruins of Mazzatun without any party members being hit by Bog Rush.
+1530,	-- Fear No Darkness,  Pass through the spider caves in Veteran Cradle of Shadows without lighting more than two braziers.
+1525,	-- Exterminator,  Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in Veteran Cradle of Shadows within 30 minutes of starting the dungeon. Timer starts on entering the initial caverns.
+1534,	-- Embrace the Shadow,  Defeat Velidreth in Veteran Cradle of Shadows without using the Atronach's Light synergy.
+1532,	-- Divided He Fell,  Defeat Dranos Velador in Veteran Cradle of Shadows without absorbing any orbs.
+1522,	-- Cradle of Shadows Vanquisher,  Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in the Cradle of Shadows.
+1523,	-- Cradle of Shadows Conqueror,  Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in Veteran Cradle of Shadows.
+1529,	-- Cradle of Shadows Challenger,  Complete the listed achievements for Veteran Cradle of Shadows.
+1517,	-- Clean Freak,  Defeat Xal-Nur the Slaver in Veteran Ruins of Mazzatun with only one party member cleansing the Swamp Spice. Other party members may still touch the Swamp Spice.
+1518,	-- Blind Luck,  Defeat Tree-Minder Na-Kesh in Veteran Ruins of Mazzatun without any party members using the Reveal synergy to identify the real Avatar of the Hist.
+1526,	-- Beacon in the Night,  Defeat Sithera, Khephidaen the Spiderkith, the Votary of Velidreth, Dranos Velador, and Velidreth the Lady of Lace in Veteran Cradle of Shadows without suffering a group member death.
+}
+-- Multiple DLC_Dat2["Shadows of the Hist"].complete
+
+DLC_Dat2["Horns of the Reach"].line = {
+1819,	-- Wildlife Sanctuary,  Defeat Caillaoife without allowing any Nirnblooded creatures to remain within her Nature's Preservation barrier for more than three seconds while in Veteran Bloodroot Forge.
+1949,	-- Wild and Woolly,  Defeat the Siege Mammoth in Falkreath Hold without being affected by an enemy stun, stagger, or knockback ability.
+1945,	-- War Chronicler,  Discover the Urgent Missive, Unfinished Letter to Marika, In Reply to Concerning Rumors, and Epitaph of Bjarfrud Skjoralmor within Falkreath Hold.
+1703,	-- The Unbroken Line,  Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Veteran Falkreath Hold, without suffering a group member death.
+1696,	-- Tempered Tantrum,  Defeat the Earthgore Amalgam in Veteran Bloodroot Forge after invoking the Scroll of Glorious Battle.
+1704,	-- Taking the Bull by the Horns,  Defeat Domihaus the Bloody-Horned in Veteran Falkreath Hold after sounding the Warhorn in the Jarl's Hall.
+1821,	-- Shalk Shaker,  Defeat Galchobhar without anyone in your group killing a Fire Shalk during your battle with him in Veteran Bloodroot Forge.
+1694,	-- Right to the Root of the Problem,  Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Veteran Bloodroot Forge within twenty minutes of starting the dungeon. Timer starts when players pass the first Dreadhorn campsite.
+1695,	-- Parched Earth,  Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Veteran Bloodroot Forge, without suffering a group member death.
+1947,	-- Oathbreaker,  While fighting Cernunnon and his oath-bound, banish all three of the spiritmasters' souls within five seconds of each other throughout the fight in Veteran Falkreath Hold.
+1818,	-- Magma Masher,  Use Galchobhar's Mantle Breaker attack to dissipate a Lava Ball fired by a Fire Shalk while in Veteran Bloodroot Forge.
+1817,	-- Hot Pursuit,  Complete Veteran Bloodroot Forge without any member of your group ever being struck by a Lava Ball spit by a Fire Shalk.
+1937,	-- Horns of the Reach Delver,  Complete Veteran Falkreath Hold and Veteran Bloodroot Forge.
+1822,	-- Hand Wrought Victory,  Defeat the Earthgore Amalgam in Veteran Bloodroot Forge without any member of your group activating the Stonefire Crucible or Flameslake Cauldron.
+1698,	-- Falkreath Hold Vanquisher,  Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Falkreath Hold.
+1699,	-- Falkreath Hold Conqueror,  Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Veteran Falkreath Hold.
+1942,	-- Falkreath Hold Challenger,  Complete the listed achievements for Veteran Falkreath Hold.
+1948,	-- Epic Undertaking,  While fighting Deathlord Bjarfrud Skjoralmor in Veteran Falkreath Hold, have your group cleanse 15 corpses within the span of five seconds.
+1950,	-- Endure the Elements,  Defeat Domihaus the Bloody-Horned in Veteran Falkreath Hold with at least one of each type of atronach still alive.
+1946,	-- Deck Diver,  Defeat every boss without ever personally being struck by siege weapon fire in Veteran Falkreath Hold, including siege engines commanded by Morrigh Bullblood.
+1816,	-- Cooling Your Heels,  Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam without taking damage from the Molten Nirncrux flowing through Veteran Bloodroot Forge.
+1951,	-- Column Caretaker,  Defeat Domihaus the Bloody-Horned in Veteran Falkreath Hold with 2 or more pillars still standing in the Jarl's Hall.
+1702,	-- Bull Rush,  Defeat Morrigh Bullblood, the Siege Mammoth, Cernunnon, Deathlord Bjarfrud Skjoralmor, and Domihaus the Bloody-Horned in Veteran Falkreath Hold within twenty minutes of starting the dungeon. Timer starts when players engage the first group of Dreadhorn invaders.
+1820,	-- Boulder Bounder,  Defeat Galchobhar without any group members being affected by his Scorched Earth and Flames of Galchobhar attacks in Veteran Bloodroot Forge.
+1690,	-- Bloodroot Forge Vanquisher,  Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Bloodroot Forge.
+1691,	-- Bloodroot Forge Conqueror,  Defeat Mathgamain, Caillaoife, Stoneheart, Galchobhar, Gherig Bullblood and his attendants, and the Earthgore Amalgam in Veteran Bloodroot Forge.
+1941,	-- Bloodroot Forge Challenger,  Complete the listed achievements for Veteran Bloodroot Forge.
+1697,	-- Blood, Sweat and Fire,  Use the Stonefire Crucible to stun five targets and the Flameslake Cauldron to cool five lava pools within Bloodroot Forge.
+1823,	-- Artisan of Pain,  Personally use both the Stonefire Crucible and the Flameslake Cauldron to defeat the Earthgore Amalgam in Veteran Bloodroot Forge.
+}
+--multiple DLC_Dat2["Horns of the Reach"].complete=
+
+DLC_Dat2["Dragon Bones"].line = {
+1989,	-- Watch Your Step,  Defeat Matriarch Aldis without any member of your group taking damage from the water that surrounds her during the fight in Veteran Scalecaller Peak.
+1987,	-- Tremor Trouble,  Defeat Orzun the Foul-Smelling and Rinaerus the Rancid in Veteran Scalecaller Peak without a single group member being killed by a Terrorizing Tremor.
+1963,	-- The Quick and the Dead,  Defeat all encounters in addition to Lizabet Charnis, the Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus and Orryn the Black and Thurvokun in Veteran Fang Lair in under 30 minutes. Timer starts upon engaging the first group of Blackmarrow necromancers.
+1986,	-- Stony Situation,  Defeat Doylemish Ironheart in Veteran Scalecaller Peak without a single group member becoming Petrified by Stony Gaze.
+1969,	-- Starved Scarabs,  Defeat Orryn the Black and Thurvokun without any party members being hit by a Giant Scarab's Degenerative Acid in Veteran Fang Lair.
+1990,	-- Stand Your Ground,  Defeat Zaan the Scalecaller without being knocked back by her shield.
+1985,	-- Scalecaller Savior,  Collect both of the necessary ingredients and cure Jorvuld Davaux of the cult's plague.
+1975,	-- Scalecaller Peak Vanquisher,  Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Scalecaller Peak.
+1976,	-- Scalecaller Peak Conqueror,  Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Veteran Scalecaller Peak.
+1982,	-- Scalecaller Peak Challenger,  Complete the listed achievements for Veteran Scalecaller Peak.
+1984,	-- Pustulent Problems,  Defeat Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller without a single group member taking damage from a Skeever's Pestilent Pus in Veteran Scalecaller Peak.
+1979,	-- Peak Performance,  Defeat all encounters in addition to Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Veteran Scalecaller Peak in under 30 minutes. Timer starts when players engage the first group of Scalecaller creatures.
+1980,	-- On Top,  Defeat all encounters in addition to Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller in Veteran Scalecaller Peak, without suffering a group member death.
+1970,	-- Obedience Maiming,  Defeat the Cadaverous Menagerie without a party member being killed by the Cadaverous Senche-Tiger's Death Grip in Veteran Fang Lair.
+1964,	-- Not a Statistic,  Defeat Lizabet Charnis, the Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, Orryn the Black and Thurvokun, and all of their minions in Veteran Fang Lair, without suffering a group member death.
+1972,	-- Nonplussed,  Defeat Ulfnor and Sabina Cedus without a party member being affected by Sabina Cedus's Haunting Spectre in Veteran Fang Lair.
+1983,	-- Mountain God,  Defeat all encounters in addition to Rinaerus the Rancid and Orzun the Foul-Smelling, Doylemish Ironheart, Matriarch Aldis, Plague Concocter Mortieu, and Zaan the Scalecaller after reading Zaan's Ritual Scroll in Veteran Scalecaller Peak in under 30 minutes without dying.
+1967,	-- Minimal Animosity,  Defeat Orryn the Black and Thurvokun while only destroying a maximum of one Animus Crystal before Orryn merges with Thurvokun in Veteran Fang Lair.
+1965,	-- Let Bygones Be Bygones,  Defeat Orryn the Black and Thurvokun after reading the incantation in Orryn's Notes in Veteran Fang Lair.
+2102,	-- Leave No Bone Unbroken,  Defeat all encounters in addition to Lizabet Charnis, the Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Hard Mode Veteran Fang Lair in under 30 minutes without suffering a party member death.
+1974,	-- Horrific Halitosis,  When hit by Thurvokun's Plague Breath in Fang Lair, be under the protection of Yisareh's Life Ward while standing in direct contact with three other party members who also have Yisareh's Life Ward.
+1968,	-- Fungi Free,  Defeat the Cadaverous Menagerie without anyone in your group taking damage from Volatile Fungi in Veteran Fang Lair.
+1959,	-- Fang Lair Vanquisher,  Defeat Lizabet Charnis, the Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Fang Lair.
+1960,	-- Fang Lair Conqueror,  Defeat Lizabet Charnis, The Cadaverous Menagerie, Caluurion, Ulfnor and Sabina Cedus, and Orryn the Black and Thurvokun in Veteran Fang Lair.
+1966,	-- Fang Lair Challenger,  Complete the listed achievements for Veteran Fang Lair.
+1971,	-- Elementary Anatomy,  Deactivate each of Caluurion's Relics using elemental Bonefiends in Veteran Fang Lair.
+2103,	-- Dragon Bones Delver,  Complete Veteran Fang Lair and Veteran Scalecaller Peak.
+1988,	-- Doctor's Orders,  Defeat Plague Concocter Mortieu in Veteran Scalecaller Peak with four living group members all suffering from two of Mortieu's infections simultaneously.
+1991,	-- Daedric Deflector,  Defeat Zaan the Scalecaller without taking damage from her Pestilent Breath attack and without using the same avoidance method twice after reading Zaan's Ritual Scroll in Veteran Scalecaller Peak.
+1973,	-- Cold Pursuit,  After reciting the incantations in Orryn's Notes, defeat Orryn the Black and Thurvokun without any party members being hit by Orryn's Wraith Thralls in Veteran Fang Lair.
+1981,	-- Breaker of Spells,  Defeat Zaan the Scalecaller after reading Zaan's Ritual Scroll in Veteran Scalecaller Peak.
+}
+
+
+DLC_Dat2["Morrowind"].line = {
+1806,	-- Wuyuvus Slayer,  Defeat Wuyuvus the Hunger at Sulipund Grange.
+1811,	-- Well-Oiled Machine,  Complete Veteran Halls of Fabrication without suffering a group member death.
+1849,	-- Voice of the Failed Incarnates,  Disprove the dangerous claims of the Ashlander Chodala.
+1809,	-- Time Trial: Halls of Fabrication,  Complete Veteran Halls of Fabrication within a time limit of 40 minutes. Your trial begins when you enter Abanabi Cave beneath Tel Fyr.
+1827,	-- The Pilgrim's Path,  Visit the Shrines of the Seven Graces and read the inscription on each shine.
+1834,	-- Terminal Terminator,  Defeat the Assembly General in Veteran Halls of Fabrication without letting any Terminals complete their activation sequence.
+1826,	-- Strider Caravaner,  Visit the silt strider caravaner at each of the stations in Vvardenfell.
+1837,	-- Stress Tested,  Complete Veteran Halls of Fabrication after resetting the circuit breaker and empowering the Assembly General, all without suffering a group member death.
+1802,	-- Songbird Silencer,  Defeat the nereid Kimbrudhil the Songbird at Shipwreck Cove.
+1871,	-- Scarlet Judge,  Help the Scarlet Judge foil Marshal Hlaren's plot in Suran.
+1868,	-- Savior of Morrowind,  Complete quests, defeat bosses, and explore delves to become the Savior of Morrowind.
+1803,	-- Salothan's Cursebreaker,  Defeat Orator Salothan, Regent Beleth, General Tanasa, and Councilor Raynis at Salothan's Council.
+1869,	-- Rising Sun,  Help the Argonian slave, Sun-in-Shadow, gain her freedom.
+1831,	-- Power House,  Defeat the Pinnacle Factotum without ever using energy from the generator to break a Refabricated Sphere's shield, in Veteran Halls of Fabrication.
+1832,	-- Planned Obsolescence,  Defeat the Refabrication Committee in Veteran Halls of Fabrication without ever allowing the Reclaimer to overcharge a Ruined Factotum.
+1874,	-- Pilgrim Protector,  End the threat to the pilgrims at Molag Mar.
+1853,	-- Nchuleftingth Vanquisher,  Defeat three of the champions in Nchuleftingth.
+1846,	-- Nchuleftingth Group Event,  Defeat Nchulaeon the Eternal in Nchuleftingth.
+1854,	-- Nchuleftingth Conqueror,  Defeat all of the champions in Nchuleftingth.
+1870,	-- Naryu's Confidant,  Help Naryu Virian and the Morag Tong in and around Balmora.
+1875,	-- Narsis's Apprentice,  Help Narsis Dren discover the secret of the Veloth Ancestral Tomb.
+1847,	-- Loop Eradicator,  Save Dubdil Alar from the consequences of his temporal experiments.
+1838,	-- Like Clockwork,  Complete Veteran Halls of Fabrication after resetting the circuit breaker and empowering the Assembly General, all within 40 minutes of entering Abanabi Cave and without suffering a group member death.
+1872,	-- Kwama Miner,  Save the people of Gnisis from economic ruin by restoring the future of their kwama mine.
+1839,	-- Kill Process,  Defeat one Hunter-Killer Fabricant while the other still has at least half of its health remaining, before defeating the remaining Fabricant in Veteran Halls of Fabrication.
+1873,	-- Hand of the Mistress,  Foil a usuper's plot, and assist Mistress Dratha with plans to prolong her life.
+1851,	-- Hand of a Living God,  Follow a grave threat into Clockwork City, and recover Lord Vivec's stolen power.
+1829,	-- Halls of Fabrication Vanquisher,  Defeat the Assembly General after empowering it by resetting the circuit breaker in Veteran Halls of Fabrication.
+1810,	-- Halls of Fabrication Conqueror,  Defeat the Assembly General in Veteran Halls of Fabrication.
+1808,	-- Halls of Fabrication Completed,  Defeat the Assembly General and assist Divayth Fyr in stopping the flood of animunculi coming from the Halls of Fabrication.
+1856,	-- Forgotten Wastes Vanquisher,  Defeat three of the champions in the Forgotten Wastes.
+1855,	-- Forgotten Wastes Group Event,  Defeat Stone-Boiler Omalas, Brander Releth, and Mountain-Caller Hlaren in the Forgotten Wastes.
+1857,	-- Forgotten Wastes Conqueror,  Defeat all of the champions in the Forgotten Wastes.
+1833,	-- Environmentally Conscious,  Defeat the Assembly General in Veteran Halls of Fabrication without any group member dying to traps and hazards.
+1877,	-- Ebony Enforcer,  Discover the truth behind the sudden spike in production at Vassir-Didanat ebony mine.
+1836,	-- Dynamo,  Complete each of the following achievements related to defeating the Assembly General:
+1848,	-- Defender of Morrowind,  Defeat all six world bosses in Vvardenfell.
+1804,	-- Consort Killer,  Defeat the Queen's Consort at Missir-Dadalit Egg Mine.
+1807,	-- Cheater Defeater,  Defeat the Skaafin, Mehz the Cozener, at Dubdil Alar Tower and seal the rift to Oblivion.
+1852,	-- Champion of Vivec,  Restore Lord Vivec's lost power, save Vivec City, and be named Champion of Vivec.
+1805,	-- Breaker of the Unbroken,  Defeat the nix-ox Nilthog the Unbroken at Nilthog's Hollow.
+1850,	-- Bearer of the Blessed Staff,  Recover the Blessed Staff, Sunna'rah, from the Ashlander Chodala, and determine the true nature of the threat to Lord Vivec.
+1840,	-- Arc-Custodian,  In Veteran Halls of Fabrication, defeat the Archcustodian using six or fewer Shock Pylons without ever missing an opportunity to disable it with one.
+1876,	-- Ald'ruhn Annalist,  Discover the secret of the Hleran Ancestral Tomb.
+1835,	-- Accept No Substitute,  Defeat 5 of each of the Tactical Facsimiles that the Assembly General creates, on any difficulty.
+}
+DLC_Dat2["Morrowind"].completed=1852
+
+DLC_Dat2["Summerset"].line = {
+2235,	-- Yaghra Blockade,  While battling Z'Maja during a single Shadow World event, prevent all yaghra from entering the gateway and crossing into the mortal realm on 15 separate occasions in Cloudrest.
+2208,	-- What Must Be Done,  Complete the "The Crystal Tower" quest.
+2221,	-- Wave Breaker,  Defeat Muustikar Wave-Eater at an Abyssal Geyser.
+2238,	-- Valorous Combustion,  While battling Siroria's shade by itself, every Roaring Flare throughout the entire encounter must be split between at least 6 players in Cloudrest.
+2206,	-- Unreliable Narrator,  Complete the "Lost in Translation" quest.
+2213,	-- To the Depths,  Defeat Sheefar of the Depths at an Abyssal Geyser.
+2243,	-- Tidal Grave,  Defeat Tidewrack at an Abyssal Geyser.
+2135,	-- Three's Deadly Company,  Defeat Z'Maja with two Welkynar shades fighting by her side in Veteran Cloudrest.
+2139,	-- The Path to Alaxon,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same battle without suffering a group member death within 15 minutes of entering the Cloudrest Aerie in Veteran Cloudrest.
+2236,	-- The Mystic's Ice,  Have Galenwe's shade destroy 20 roaming Hoarfrost cyclones with his Spiked Ice attack in Cloudrest.
+2194,	-- The Good of the Many,  Stop the conspiracy sowing chaos through Summerset, protect the Crystal Tower, and forge a new alliance to restore the Isles to order.
+2039,	-- Talon Taker,  Defeat Haeliata and Nagravia at Gryphon Run.
+2205,	-- Sweet Dreams,  Complete the "The Dreaming Cave" quest.
+2138,	-- Surviving the Shadows,  Defeat Z'Maja, Siroria, Relequen, and Galenwe without suffering a group member death in Veteran Cloudrest.
+2182,	-- Sunhold Vanquisher,  Defeat three of the champions in Sunhold.
+2095,	-- Sunhold Group Event,  Interrupt the executioners and defeat Konnugil the Leviathan in Sunhold.
+2093,	-- Sunhold Conqueror,  Defeat all of the champions in Sunhold.
+2137,	-- Speedy Sload Slayer,  Defeat Z'Maja, Siroria, Relequen, and Galenwe within a time limit of 15 minutes in Veteran Cloudrest. Timer starts when players enter the Cloudrest Aerie.
+2244,	-- Snake Charmer,  Defeat Vsskalvor at an Abyssal Geyser.
+2237,	-- Shocking Instinct,  While battling Relequen's shade by itself, no player is hit by Voltaic Overload and no player spreads Voltaic Current to other players throughout the entire encounter in Cloudrest.
+2038,	-- Sea Sload Slugger,  Defeat the Sea Sload B'Korgen at Welenkin Cove.
+2193,	-- Savior of Summerset,  Complete quests, defeat bosses, and explore delves to become the Savior of Summerset.
+2204,	-- Resolute Guardian,  Complete the "The Tower Sentinels" quest.
+2036,	-- Reef Raider,  Defeat Queen of the Reef at The Queen's Hatchery.
+2242,	-- Radiant Riot,  Defeat Eejoba the Radiant at an Abyssal Geyser.
+2100,	-- Put a Cork In It,  Destroy the Abyssal Pearl at each Abyssal Geyser in Summerset.
+2255,	-- Psijic Staff Finder,  Complete "The Towers' Remains" Psijic Order quest in Summerset.
+2256,	-- Psijic Shadow-Walker,  Complete the "Time in Doomcrag's Shadow" Psijic Order quest in Summerset.
+2210,	-- Psijic Sage,  Complete "The Towers' Fall" Psijic Order quest in Summerset.
+2249,	-- Psijic Responder,  Complete "The Psijics' Calling" Psijic Order quest in Summerset.
+2252,	-- Psijic Repairer,  Complete "The Shattered Staff" Psijic Order quest in Summerset.
+2251,	-- Psijic Regulator,  Complete the "Breaches of Frost and Fire" Psijic Order quest in Summerset.
+2250,	-- Psijic Pursuer,  Complete the "Breaches on the Bay" Psijic Order quest in Summerset.
+2254,	-- Psijic Mudslinger,  Complete the "A Time for Mud and Mushrooms" Psijic Order quest in Summerset.
+2253,	-- Psijic Forester,  Complete the "A Breach Amid the Trees" Psijic Order quest in Summerset.
+2257,	-- Psijic Chronologer,  Complete the "A Breach Beyond the Crags" Psijic Order quest in Summerset.
+2202,	-- Precious Pearl,  Complete the "A Pearl of Great Price" quest.
+2231,	-- One Core, No More,  Defeat Z'Maja with each group member picking up and destroying only one Malevolent Core in Veteran Cloudrest.
+2232,	-- Misery Loves Company,  While battling Z'Maja with all three of the Welkynars' shades by her side, a player with the Hoarfrost affliction and two other players with the Voltaic Overload affliction share the damage of the Roaring Flare eruption in Veteran Cloudrest.
+2203,	-- Mind Games,  Complete the "Buried Memories" quest.
+2211,	-- Message in a Bottle,  Learn the fate of the Lost Sailor.
+2041,	-- Keel Hauler,  Defeat Keelsplitter at Keelsplitter's Nest.
+2181,	-- Karnwasten Vanquisher,  Defeat three of the champions in Karnwasten.
+2096,	-- Karnwasten Group Event,  Defeat the Sea Sload K'Garza in Karnwasten.
+2094,	-- Karnwasten Conqueror,  Defeat all of the champions in Karnwasten.
+2222,	-- Hammer Meet Nail,  Defeat Reefhammer at an Abyssal Geyser.
+2201,	-- For the Queen,  Complete the "The Queen's Decree" quest.
+2233,	-- Flares and Deadly Shadows,  While battling Z'Maja with Siroria's shade by her side, utilize a Roaring Flare attack and achieve 20 killing blows against Shadows of the Fallen in Veteran Cloudrest.
+2207,	-- Enemy of My Enemy,  Complete the "A Necessary Alliance" quest.
+2042,	-- Defender of Summerset,  Defeat all six world bosses in Summerset.
+2184,	-- Declawed,  Defeat Ruella Many-Claws at an Abyssal Geyser.
+2241,	-- Deadly Allure,  Defeat Darkstorm the Alluring at an Abyssal Geyser.
+2234,	-- Core Coordination,  While battling Z'Maja, after activating a single Welkynar's Light, activate two more Welkynar's Lights and destroy three Malevolent Cores within the next 6 seconds in Veteran Cloudrest.
+2136,	-- Cloudrest Vanquisher,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same fight in Veteran Cloudrest.
+2140,	-- Cloudrest Savior,  Complete the listed achievements for Cloudrest.
+2132,	-- Cloudrest Contender,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in the same fight in Cloudrest.
+2133,	-- Cloudrest Conqueror,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in Veteran Cloudrest.
+2131,	-- Cloudrest Completed,  Defeat Z'Maja, Siroria, Relequen, and Galenwe in Cloudrest.
+2185,	-- Churug's Chagrin,  Defeat Churug of the Abyss at an Abyssal Geyser.
+2220,	-- Calm and Calculated,  Defeat Girawell the Erratic at an Abyssal Geyser.
+2037,	-- Bucking the Matriarchy,  Defeat Caanerin at Indrik Frolic.
+2101,	-- Back to the Abyss,  Defeat each of the following bosses that can appear at Abyssal Geysers.
+2212,	-- Asp Awareness,  Defeat Keelsplitter without stepping on any of the snakes.
+2040,	-- Amphibian Agitator,  Defeat Graveld at Graveld's Hideaway.
+2134,	-- A Sload and Her Shadow,  Defeat Z'Maja with one Welkynar shade fighting by her side in Veteran Cloudrest.
+2171,	-- A Book and its Cover,  Completed Bailiff Naramin's investigation of Choixth.
+}
+
+DLC_Dat2["Wolfhunter"].line = {
+2170,	-- Wolfhunter Delver,  Complete Veteran Moon Hunter Keep and Veteran March of Sacrifices.
+2297,	-- Unending Rage,  Defeat Mylenne Moon-Caller without cleansing her Enrage ability in Veteran Moon Hunter Keep.
+2306,	-- Trick and Trap,  Lead Balorgh into Tharas' Trap 10 times in Veteran March of Sacrifices.
+2302,	-- The Great Indrik Hunt,  Complete all three Golden Indrik Hunts and gain their boons within March of Sacrifices.
+2154,	-- The Alpha Predator,  Defeat Vykosa the Ascendant after reading the Scroll of Glorious Battle in Veteran Moon Hunter Keep.
+2166,	-- Survival of the Fittest,  Defeat all encounters in addition to the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in Veteran March of Sacrifices without suffering a group member death.
+2301,	-- Strangling Cowardice,  Defeat Vykosa the Ascendant after reading the Scroll of Glorious Battle, defeating 7 Stranglers, and never causing her pet wolves to cower in Veteran Moon Hunter Keep.
+2310,	-- Stalwart Sisterhood,  Defeat the Wyrd Sisters while preventing them from ever using their auras to augment each other in Veteran March of Sacrifices.
+2308,	-- Sidestepping Stranglers,  Defeat Hedge Maze Guardian without any group member being caught by a Strangler Snare within the Moon Hunter Keep Gardens in Veteran Moon Hunter Keep.
+2303,	-- Seasonal Slaying,  Defeat Aghaedh of the Solstice while making sure to defeat all of her Lurchers within their primary season in Veteran March of Sacrifices.
+2155,	-- Running with the Pack,  Defeat all encounters in addition to Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Veteran Moon Hunter Keep in under 30 minutes. Timer starts when players engage the first group of Moon Hunter enemies.
+2309,	-- Root of the Problem,  Defeat Hedge Maze Guardian while avoiding its Lurcher Roots attack in Veteran Moon Hunter Keep.
+2159,	-- Pure Lunacy,  Defeat all encounters in addition to Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant after activating Hard Mode in Veteran Moon Hunter Keep in under 30 minutes without suffering a group member death.
+2165,	-- Pure Instinct,  Defeat all encounters in addition to the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in Veteran March of Sacrifices in under 30 minutes. Timer starts when players jump or teleport into Bloodscent Pass.
+2312,	-- Perfect Hunt,  Defeat Balorgh after desecrating the Moon Hunter Pack's banner and without being hit by his Fire Remnant ability for the duration of the encounter in Veteran March of Sacrifices.
+2300,	-- On a Short Leash,  Defeat Vykosa the Ascendant without any party member taking damage from her restrained wolf pet in Veteran Moon Hunter Keep.
+2152,	-- Moon Hunter Keep Vanquisher,  Defeat Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Moon Hunter Keep.
+2153,	-- Moon Hunter Keep Conqueror,  Defeat Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Veteran Moon Hunter Keep.
+2158,	-- Moon Hunter Keep Challenger,  Complete the listed achievements for Veteran Moon Hunter Keep.
+2305,	-- Mist Walker,  Defeat Tarcyr without the indrik teleporting any group members during its Shrouding Mist ability in Veteran March of Sacrifices.
+2162,	-- March of Sacrifices Vanquisher,  Defeat the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in March of Sacrifices.
+2163,	-- March of Sacrifices Conqueror,  Defeat the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh in Veteran March of Sacrifices.
+2167,	-- March of Sacrifices Challenger,  Complete the listed achievements for Veteran March of Sacrifices.
+2304,	-- Light on Your Feet,  Defeat Dagrund the Bulky while always dodging his Upheaval ability in Veteran March of Sacrifices.
+2164,	-- Hircine's Champion,  Defeat Balorgh after desecrating the Moon Hunter Pack's banner and driving him into a murderous rage in Veteran March of Sacrifices.
+2156,	-- Head of the Pack,  Defeat all encounters in addition to Jailer Melitus, Hedge Maze Guardian, Mylenne Moon-Caller, Archivist Ernarde, and Vykosa the Ascendant in Veteran Moon Hunter Keep without suffering a group member death.
+2311,	-- Element of Surprise,  Defeat Balorgh while avoiding both Lightning Water and Poison Plants in Veteran March of Sacrifices.
+2299,	-- Book Smarts,  Defeat the Archivist without taking group member damage from Symbols of Xarxes in Moon Hunter Keep.
+2307,	-- Bloody Mess,  Defeat Jailer Melitus without being damaged by Bloody Geysers in Moon Hunter Keep.
+2168,	-- Apex Predator,  Defeat all encounters in addition to the Wyrd Sisters, Aghaedh of the Solstice, Dagrund the Bulky, Tarcyr, and Balorgh after desecrating the Moon Hunter Pack's Banner in Veteran March of Sacrifices within 30 minutes without suffering a group member death.
+2298,	-- A Hulking Ally,  Defeat Archivist Ernarde without killing his first Hulking Werewolf ally in Moon Hunter Keep.
+}

diff --git a/data/en/en.lua b/data/en/en.lua
index e48d486..aaf91a4 100644
--- a/data/en/en.lua
+++ b/data/en/en.lua
@@ -84,6 +84,7 @@ L = {
 	SkillQuests = "SkillQuests",
 	SkillLab = "Quests Awarding a Skill Point. Click for Detail",
 	Ach_ID = "Ach ID",
+
 	Name = "Name",
 	Link = "Link (Click to launch)",
 	SQ_Detail = "SQ_Detail",
@@ -112,8 +113,10 @@ L = {
 	Version = "Version",
 	View_Toggle = "Hide Complete",
 	Completed = "Completed on: ",		-- Mouseover achievement detail
+	Achievement = "Achievement",
+
 }
-
+
 L.Grp_TabName["1N"] = "Mode 1N"
 L.Grp_TabName["1V"] = "Mode 1V"
 L.Grp_TabName["1VH"] = "Mode 1VH"
@@ -311,3 +314,10 @@ DLC_Location_names = {
 ["36"]	= "March of Sacrifices",
 ["46"]	= "March of Sacrifices (Vet)",
 }
+
+--With Dungeons  No thieves guild or dark brotherhood
+-- In DLC.lua, the canonical naming DLC_Category= {"Orsinium", "Imperial City", "Shadows of the Hist", "Horns of the Reach", "Dragon Bones","Clockwork City", "Morrowind", "Summerset", "Wolfhunter")
+
+--Our Naming
+
+DLC_Names= {"Thieves Guild", "Dark Brotherhood", "Orsinium", "Imperial City", "Shadows of the Hist", "Horns of the Reach", "Dragon Bones","Clockwork City", "Morrowind", "Summerset", "Wolfhunter"}
\ No newline at end of file
diff --git a/data/ids.lua b/data/ids.lua
index 3e2530a..099f251 100644
--- a/data/ids.lua
+++ b/data/ids.lua
@@ -35,7 +35,6 @@ hist.IDs = {
 [1647] = true,
 -- GRP 1VH
 [1658] = true,
-[1617] = true,
 [1586] = true,
 [1640] = true,
 [1652] = true,
@@ -371,5 +370,274 @@ hist.IDs = {
 [1068] = true,
 [1069] = true,
 [1070] = true,
-[1139] = true,
+-- DLC2
+-- DLC2 Thieves Guild
+[1377] = true,
+[1371] = true,
+[1362] = true,
+[1376] = true,
+[1361] = true,
+[1378] = true,
+[1370] = true,
+[1365] = true,
+[1394] = true,
+[1354] = true,
+[1404] = true,
+[1363] = true,
+[1349] = true,
+[1402] = true,
+[1360] = true,
+[1375] = true,
+-- DLC2 Dark Brotherhood
+[1443] = true,
+[1444] = true,
+[1438] = true,
+[1437] = true,
+[1454] = true,
+[1410] = true,
+[1449] = true,
+[1421] = true,
+[1458] = true,
+[1463] = true,
+[1445] = true,
+[1459] = true,
+[1451] = true,
+[1435] = true,
+[1425] = true,
+[1442] = true,
+[1436] = true,
+[1441] = true,
+[1439] = true,
+[1457] = true,
+[1450] = true,
+[1434] = true,
+[1440] = true,
+-- DLC2 Orsinium
+[1324] = true,
+[1257] = true,
+[1331] = true,
+[1237] = true,
+[1235] = true,
+[1326] = true,
+[1325] = true,
+[1327] = true,
+[1247] = true,
+[1240] = true,
+[1238] = true,
+[1330] = true,
+[1260] = true,
+[1286] = true,
+[1285] = true,
+[1290] = true,
+[1289] = true,
+[1287] = true,
+[1288] = true,
+[1249] = true,
+-- DLC2 Imperial City
+[1261] = true,
+[1182] = true,
+[1276] = true,
+[1175] = true,
+[1109] = true,
+[1185] = true,
+[1306] = true,
+[1133] = true,
+[1128] = true,
+[1303] = true,
+[1129] = true,
+[1279] = true,
+[1273] = true,
+[1132] = true,
+[1184] = true,
+[1174] = true,
+[1275] = true,
+[1280] = true,
+[1142] = true,
+[1268] = true,
+[1122] = true,
+-- DLC2 Shadows of the Hist
+[1533] = true,
+[1536] = true,
+[1524] = true,
+[1508] = true,
+[1506] = true,
+[1519] = true,
+[1538] = true,
+[1531] = true,
+[1513] = true,
+[1514] = true,
+[1511] = true,
+[1507] = true,
+[1516] = true,
+[1535] = true,
+[1512] = true,
+[1515] = true,
+[1530] = true,
+[1525] = true,
+[1534] = true,
+[1532] = true,
+[1529] = true,
+[1517] = true,
+[1518] = true,
+[1526] = true,
+-- DLC2 Horns of the Reach
+[1819] = true,
+[1949] = true,
+[1945] = true,
+[1703] = true,
+[1696] = true,
+[1704] = true,
+[1821] = true,
+[1694] = true,
+[1695] = true,
+[1947] = true,
+[1818] = true,
+[1817] = true,
+[1937] = true,
+[1822] = true,
+[1942] = true,
+[1948] = true,
+[1950] = true,
+[1946] = true,
+[1816] = true,
+[1951] = true,
+[1702] = true,
+[1820] = true,
+[1941] = true,
+[1697] = true,
+[1823] = true,
+-- DLC2 Dragon Bones
+[1989] = true,
+[1987] = true,
+[1963] = true,
+[1986] = true,
+[1969] = true,
+[1990] = true,
+[1985] = true,
+[1982] = true,
+[1984] = true,
+[1979] = true,
+[1980] = true,
+[1970] = true,
+[1964] = true,
+[1972] = true,
+[1983] = true,
+[1967] = true,
+[1965] = true,
+[2102] = true,
+[1974] = true,
+[1968] = true,
+[1966] = true,
+[1971] = true,
+[2103] = true,
+[1988] = true,
+[1991] = true,
+[1973] = true,
+[1981] = true,
+-- DLC2 Clockwork City
+[2074] = true,
+[2048] = true,
+[2063] = true,
+[2064] = true,
+[2059] = true,
+[2062] = true,
+[1958] = true,
+[2060] = true,
+[2050] = true,
+[2049] = true,
+[2047] = true,
+[2058] = true,
+[2061] = true,
+-- DLC2 Morrowind
+[1806] = true,
+[1849] = true,
+[1827] = true,
+[1826] = true,
+[1871] = true,
+[1868] = true,
+[1874] = true,
+[1853] = true,
+[1846] = true,
+[1875] = true,
+[1872] = true,
+[1873] = true,
+[1851] = true,
+[1856] = true,
+[1855] = true,
+[1877] = true,
+[1836] = true,
+[1848] = true,
+[1850] = true,
+[1876] = true,
+[1835] = true,
+-- DLC2 Summerset
+[2235] = true,
+[2208] = true,
+[2221] = true,
+[2206] = true,
+[2213] = true,
+[2243] = true,
+[2135] = true,
+[2194] = true,
+[2205] = true,
+[2182] = true,
+[2095] = true,
+[2244] = true,
+[2193] = true,
+[2204] = true,
+[2242] = true,
+[2100] = true,
+[2255] = true,
+[2256] = true,
+[2210] = true,
+[2249] = true,
+[2252] = true,
+[2251] = true,
+[2250] = true,
+[2254] = true,
+[2253] = true,
+[2257] = true,
+[2202] = true,
+[2203] = true,
+[2211] = true,
+[2181] = true,
+[2096] = true,
+[2222] = true,
+[2201] = true,
+[2207] = true,
+[2042] = true,
+[2184] = true,
+[2241] = true,
+[2185] = true,
+[2220] = true,
+[2101] = true,
+[2171] = true,
+-- DLC2 Wolfhunter
+[2170] = true,
+[2297] = true,
+[2306] = true,
+[2302] = true,
+[2154] = true,
+[2166] = true,
+[2301] = true,
+[2310] = true,
+[2308] = true,
+[2303] = true,
+[2155] = true,
+[2309] = true,
+[2159] = true,
+[2165] = true,
+[2312] = true,
+[2300] = true,
+[2158] = true,
+[2305] = true,
+[2167] = true,
+[2304] = true,
+[2164] = true,
+[2156] = true,
+[2311] = true,
+[2299] = true,
+[2307] = true,
+[2168] = true,
+[2298] = true,
 }
diff --git a/data/utility.lua b/data/utility.lua
index 48f3295..485119a 100644
--- a/data/utility.lua
+++ b/data/utility.lua
@@ -135,6 +135,8 @@ end

 generate_id=function()
 --write a combined list of achievement id we look for to add to the in-game part (cut and paste) for filtering
+    local unique_id= {}   -- (id,true}
+
 	outfile=io.open("data/ids.lua", "w")

 	if outfile == nil then
@@ -145,41 +147,76 @@ generate_id=function()
 	for _,i in ipairs(Grp_Order) do
 		outfile:write("-- GRP " .. i ..  "\n")
 		for j,_ in pairs (Grp_Dat[i].id) do
-			outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
+
 		end
 	end

 	for _,i in ipairs(Trials_Order) do
 		outfile:write("-- Trial " .. i .. "\n")
 		for j,_ in pairs (Trials_Dat[i].id) do
-			outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
 		end
 	end

 	outfile:write("-- DLC " .. "\n")
 	for j,_ in pairs (DLC_Dat.id) do
-		outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
 	end

 	outfile:write("-- SQ " .. "\n")
 	for j,_ in pairs (SQ_dat) do
-		outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
 	end

 	outfile:write("-- Pub " .. "\n")
 	for j,_ in pairs (Pub_Dat_Char.id) do
-		outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
 	end

 	outfile:write("-- WB " .. "\n")
 	for j,_ in pairs (WB_dat) do
-		outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
 	end

 	outfile:write("-- Specials " .. "\n")
 	for j,_ in pairs (Special_dat) do
-		outfile:write("[" .. j .. "] = true,\n")
+		    if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
 	end
+
+	outfile:write("-- DLC2 " .. "\n")
+
+	for _,dlc in ipairs (DLC_Order) do
+		outfile:write("-- DLC2 " .. dlc .."\n")
+		for _,j in pairs (DLC_Dat2[dlc].line) do
+			if unique_id[j] == nil then
+				unique_id[j] = true
+				outfile:write("[" .. j .. "] = true,\n")
+			end
+		end
+	end
+
 	outfile:write("}" .. "\n")
 	outfile:close()
 end