Signed-off-by: His Dad <John@hisdad.org>

His Dad [09-20-16 - 07:45]
Signed-off-by: His Dad <John@hisdad.org>
Filename
HistOffline.lua
data/Group1.lua
data/Group2.lua
data/en/en.lua
diff --git a/HistOffline.lua b/HistOffline.lua
index 5b0ab41..f6bcce0 100644
--- a/HistOffline.lua
+++ b/HistOffline.lua
@@ -16,7 +16,16 @@ version= "23"
 require( "iuplua" )
 require( "iupluacontrols" )
 dofile "../../SavedVariables/History.lua"
-Grp={}
+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
+
 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
@@ -77,7 +86,7 @@ function load_lang(lang)
 	end

 	local path = "./data/" .. lang .. "/"
-	print ("path: " .. path)
+
 	dofile (path .. lang .. ".lua")
 	dofile (path .. lang .."-data.lua")			--Achievement Data from game
 	lingua[lang] = {}
@@ -238,30 +247,37 @@ end
   -- N Normal,   V Vet,    VH   Vet hard mode
   dung = accounts[acc].dung
   dung.pub = {}
-  dung.grp1N = {}
-  dung.grp1V = {}
-  dung.grp1VH = {}
-  dung.grp2N = {}
-  dung.grp2V = {}
-  dung.grp2VH = {}
+  dung.Grp = {}
+
+  for _,i in ipairs(Grp_Order) do
+	dung.Grp[i]= {}
+  end

   dung.trials = {}
   dung.DLC = {}


   -- a table for each dungeon to which we add characters
+  for _,i in ipairs(Grp1_Order) do
+    for _,j in ipairs(grp1tokey) do
+	  dung.Grp[i][j] = {}
+	  dung.Grp[i][j] = {}
+	  dung.Grp[i][j] = {}
+	end
+  end
+
+  for _,i in ipairs(Grp2_Order) do
+    for _,j in ipairs(grp2tokey) do
+	  dung.Grp[i][j] = {}
+	  dung.Grp[i][j] = {}
+	  dung.Grp[i][j] = {}
+	end
+  end
+
   for _,i in ipairs(grp1tokey) do
 	  dung.pub[i] = {}
-	  dung.grp1N[i] = {}
-	  dung.grp1V[i] = {}
-	  dung.grp1VH[i] = {}
   end

-  for _,i in ipairs(grp2tokey) do
-	  dung.grp2N[i] = {}
-	  dung.grp2V[i] = {}
-	  dung.grp2VH[i] = {}
-  end

   for _,i in ipairs(trial2key) do
 	  dung.trials[i] = {}
@@ -346,82 +362,45 @@ end
 		-- Create Grp Dungeon Boxes ====================================
 		me.Grp ={}		-- Put them all together
 		me.Grp_Display_Order ={}	-- Store also in here for display by ipairs
-		me.Grp["1N"]  = {}
-		me.Grp["1N"].vet = false
-		me.Grp["1N"].name= L.Grp1N
-		table.insert(me.Grp_Display_Order, me.Grp["1N"])
-
-		me.Grp["1V"]  = {}
-		me.Grp["1V"].vet = true
-		me.Grp["1V"].name= L.Grp1V
-		table.insert(me.Grp_Display_Order, me.Grp["1V"])
-
-		me.Grp["1VH"] = {}
-		me.Grp["1VH"].vet = true
-		me.Grp["1VH"].name= L.Grp1VH
-		table.insert(me.Grp_Display_Order, me.Grp["1VH"])
-
-		me.Grp["2N"]  = {}
-		me.Grp["2N"].vet = false
-		me.Grp["2N"].name= L.Grp2N
-		table.insert(me.Grp_Display_Order, me.Grp["2N"])
-
-		me.Grp["2V"]  = {}
-		me.Grp["2V"].vet = true
-		me.Grp["2V"].name= L.Grp2V
-		table.insert(me.Grp_Display_Order, me.Grp["2V"])
-
-		me.Grp["2VH"] = {}
-		me.Grp["2VH"].vet = true
-		me.Grp["2VH"].name= L.Grp2VH
-		table.insert(me.Grp_Display_Order, me.Grp["2VH"])
-
-		for _,i in pairs (me.Grp) do
-			i.box= iup.matrix {numcol=4, numcol_visible=4,  numlin=5, widthdef=100}
-			--Set Column titles
+		for _, i in ipairs(Grp_Order) do		-- For Each Grp Dungeon
+			me.Grp[i] = {}						--  Dungeon data storage
+			me.Grp[i].name= L.Grp_TabName[i]
+			me.Grp[i].vet = Grp_Dat[i].vet
+			me.Grp[i].box = iup.matrix {numcol=4, numcol_visible=4,  numlin=5, widthdef=100}
+
+			--Set Column titles in box
 			for j=1, 4 do
-				i.box:setcell(0,j, Area_names[j].long)
+				me.Grp[i].box:setcell(0,j, Area_names[j].long)
 			end

-			iup.SetAttribute(i.box, "READONLY", "YES")
+			iup.SetAttribute(me.Grp[i].box, "READONLY", "YES")
 			-- set all text to red
-			iup.SetAttribute(i.box,  "FGCOLOR*:1", FG_Colour_Not_Complete)
-			iup.SetAttribute(i.box,  "FGCOLOR*:2", FG_Colour_Not_Complete)
-			iup.SetAttribute(i.box,  "FGCOLOR*:3", FG_Colour_Not_Complete)
-			iup.SetAttribute(i.box,  "FGCOLOR*:4", FG_Colour_Not_Complete)
-
-		end
-
---[[
-		--set lines
-		me.Grp1N_box:setcell(0,0, L.Level)
-		me.Grp1N_box:setcell(1,0, "10+")
-		me.Grp1N_box:setcell(2,0, "17+")
-		me.Grp1N_box:setcell(3,0, "24+")
-		me.Grp1N_box:setcell(4,0, "31+")
-		me.Grp1N_box:setcell(5,0, "38+")
-
-		me.Grp2N_box:setcell(0,0, L.Level)
-		me.Grp2N_box:setcell(1,0, "10+")
-		me.Grp2N_box:setcell(2,0, "17+")
-		me.Grp2N_box:setcell(3,0, "24+")
-		me.Grp2N_box:setcell(4,0, "31+")
-		me.Grp2N_box:setcell(5,0, "38+")
-
-]]
-
-
-
-		-- set text to black if achievement found.
-		for id,_ in pairs (grp1N_dat) do
-			local colour,key
-			if thischar.ach[id] ~= nil then
-				colour = "FGCOLOR" .. grp1N_dat[id].L .. ":" .. grp1N_dat[id].C
-				iup.SetAttribute(me.Grp["1N"].box, colour, FG_Colour_Complete)
-				-- Add char to dungeon
-				key = tostring(grp1N_dat[id].L .. grp1N_dat[id].C)
-				dung.grp1N[key][playerID] = "Y"
+			iup.SetAttribute(me.Grp[i].box,  "FGCOLOR*:1", FG_Colour_Not_Complete)
+			iup.SetAttribute(me.Grp[i].box,  "FGCOLOR*:2", FG_Colour_Not_Complete)
+			iup.SetAttribute(me.Grp[i].box,  "FGCOLOR*:3", FG_Colour_Not_Complete)
+			iup.SetAttribute(me.Grp[i].box,  "FGCOLOR*:4", FG_Colour_Not_Complete)
+
+			table.insert(me.Grp_Display_Order, me.Grp[i])
+
+			-- set text to black if achievement found.
+
+			for id,_ in pairs (Grp_Dat[i]) do
+				local colour,key
+				if thischar.ach[id] ~= nil then
+					colour = "FGCOLOR" .. Grp_Dat[i][id].dat.L .. ":" .. Grp_Dat[i][id].dat.C
+					iup.SetAttribute(me.Grp[i].box, colour, FG_Colour_Complete)
+					-- Add char to dungeon
+					key = tostring(Grp_Dat[i][id].dat.L .. Grp_Dat[i][id].dat.C)
+					dung.Grp[i][key][playerID] = "Y"
+				end
 			end
+
+			-- Create display tab
+			me.Grp[i].tab = iup.vbox {
+						["tabtitle"] =me.Grp[i].name,
+						me.Grp[i].box,
+						iup.fill{},
+				}
 		end

 		--Set background of heading if all done
@@ -438,14 +417,15 @@ end
 		end

 --		local key = ""
-		for id,_ in pairs (grp1N_dat) do
-				local L = grp1N_dat[id].L
-				local C = grp1N_dat[id].C
-				local key = tostring(L).. tostring(C)	-- make name key
-				me.Grp["1N"].box:setcell(L, C, grp_names[key])
+		for _,i in ipairs(Grp_Order) do
+			for _, id in pairs (Grp_Dat[i].dat) do
+					local L = id.L
+					local C = id.C
+					local key = tostring(L).. tostring(C)	-- make name key
+					me.Grp[i].box:setcell(L, C, grp_names[key])
+			end
 		end

-
 		-- Create Pub Dungeon Achievements Box==========================
 		me.Pub_box = iup.matrix {numcol=4, numcol_visible=4,  numlin=5, widthdef=100}
 		for i=1, 4 do  -- Load text
@@ -913,11 +893,7 @@ end
 		for _,i in ipairs (me.Grp_Display_Order) do
 			if me.isvet or i.vet == false then
 				-- non vet chars only see non-vet dungeons
-				iup.Append(me.data_tabs, iup.vbox {	["tabtitle"] =i.name,
-														iup.label{title=L.GrpLab,expand="HORIZONTAL"},
-														i.box,
-														iup.fill{}
-													})
+				iup.Append(me.data_tabs, i.tab)
 			end
 		end

@@ -1037,170 +1013,6 @@ iup.Append(accounts[acc].char_tabs, accounts[acc].log_tab)
 	iup.Append(accounts[acc].dung_tabs, dung.Pub_tab)


-	-- Create Grp1N Dungeon Character Box=========================
-
-	dung.Grp1N_box = {}
-	dung.Grp1N_box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#grp2tokey, widthdef=100}
-	--Set Line titles
-	for i, key in ipairs(grp2tokey) do
-		dung.Grp1N_box:setcell(i, 0, grp_names[key])
-	end
-	--set lines
-	dung.Grp1N_box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp1N_box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.Grp1N_box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	for line,key in ipairs(grp2tokey) do		-- over each dungeon
-	    -- does that char exist in the table.
-		for i,playerID  in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-			if dung.grp1N[key][playerID] == nil then
-				dung.Grp1N_box:setcell(line,i, "N")
-				iup.SetAttribute(dung.Grp1N_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-			else
-				dung.Grp1N_box:setcell(line,i, "Y")
-				iup.SetAttribute(dung.Grp1N_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-			end
-		end
-	end
-
-
-
-	-- Create Grp1N Dungeon Tab ==================================
-	dung.Grp1N_tab = iup.vbox {
-						["tabtitle"] =L.Grp1N,
-						dung.Grp1N_box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.Grp1N_tab)
-
-	-- Create Grp1V Dungeon Character Box=========================
-
-	dung.Grp1V_box = {}
-	dung.Grp1V_box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#grp2tokey, widthdef=100}
-	--Set Line titles
-	for i, key in ipairs(grp2tokey) do
-		dung.Grp1V_box:setcell(i, 0, grp_names[key])
-	end
-	--set lines
-	dung.Grp1V_box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp1V_box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.Grp1V_box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	for line,key in ipairs(grp2tokey) do		-- over each dungeon
-	    -- does that char exist in the table.
-		for i,playerID  in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-			if dung.grp1V[key][playerID] == nil then
-				dung.Grp1V_box:setcell(line,i, "N")
-				iup.SetAttribute(dung.Grp1V_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-			else
-				dung.Grp1V_box:setcell(line,i, "Y")
-				iup.SetAttribute(dung.Grp1V_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-			end
-		end
-	end
-
-
-
-	-- Create Grp1V Dungeon Tab ==================================
-	dung.Grp1V_tab = iup.vbox {
-						["tabtitle"] =L.Grp1V,
-						dung.Grp1V_box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.Grp1V_tab)
-
-	-- Create Grp1VH Dungeon Character Box=========================
-
-	dung.Grp1VH_box = {}
-	dung.Grp1VH_box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#grp2tokey, widthdef=100}
-	--Set Line titles
-	for i, key in ipairs(grp2tokey) do
-		dung.Grp1VH_box:setcell(i, 0, grp_names[key])
-	end
-	--set lines
-	dung.Grp1VH_box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp1VH_box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.Grp1VH_box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	for line,key in ipairs(grp2tokey) do		-- over each dungeon
-	    -- does that char exist in the table.
-		for i,playerID  in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-			if dung.grp1VH[key][playerID] == nil then
-				dung.Grp1VH_box:setcell(line,i, "N")
-				iup.SetAttribute(dung.Grp1VH_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-			else
-				dung.Grp1VH_box:setcell(line,i, "Y")
-				iup.SetAttribute(dung.Grp1VH_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-			end
-		end
-	end
-
-
-
-	-- Create Grp1VH Dungeon Tab ==================================
-	dung.Grp1VH_tab = iup.vbox {
-						["tabtitle"] =L.Grp1VH,
-						dung.Grp1VH_box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.Grp1VH_tab)
-
-
-
-	-- Create Grp2N Dungeon Character Box=========================
-
-	dung.Grp2N_box = {}
-	dung.Grp2N_box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#grp2tokey, widthdef=100}
-	--Set Line titles
-	for i, key in ipairs(grp2tokey) do
-		dung.Grp2N_box:setcell(i, 0, grp_names[key])
-	end
-	--set lines
-	dung.Grp2N_box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp2N_box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.Grp2N_box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	for line,key in ipairs(grp2tokey) do		-- over each dungeon
-	    -- does that char exist in the table.
-		for i,playerID  in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-			if dung.grp2N[key][playerID] == nil then
-				dung.Grp2N_box:setcell(line,i, "N")
-				iup.SetAttribute(dung.Grp2N_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-			else
-				dung.Grp2N_box:setcell(line,i, "Y")
-				iup.SetAttribute(dung.Grp2N_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-			end
-		end
-	end
-
-	-- Create Grp2N Dungeon Tab ==================================
-	dung.Grp2N_tab = iup.vbox {
-						["tabtitle"] =L.Grp2N,
-						dung.Grp2N_box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.Grp2N_tab)
-
 	-- Create DLC Dungeon Character Box=========================

 	dung.DLC_box = {}
@@ -1232,89 +1044,6 @@ iup.Append(accounts[acc].char_tabs, accounts[acc].log_tab)
 		end
 	end

-	-- Create Grp2V Dungeon Character Box=========================
-
-	dung.Grp2V_box = {}
-	dung.Grp2V_box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#grp2tokey, widthdef=100}
-	--Set Line titles
-	for i, key in ipairs(grp2tokey) do
-		dung.Grp2V_box:setcell(i, 0, grp_names[key])
-	end
-	--set lines
-	dung.Grp2V_box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp2V_box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.Grp2V_box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	for line,key in ipairs(grp2tokey) do		-- over each dungeon
-	    -- does that char exist in the table.
-		for i,playerID  in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-			if dung.grp2V[key][playerID] == nil then
-				dung.Grp2V_box:setcell(line,i, "N")
-				iup.SetAttribute(dung.Grp2V_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-			else
-				dung.Grp2V_box:setcell(line,i, "Y")
-				iup.SetAttribute(dung.Grp2V_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-			end
-		end
-	end
-
-
-
-	-- Create Grp2V Dungeon Tab ==================================
-	dung.Grp2V_tab = iup.vbox {
-						["tabtitle"] =L.Grp2V,
-						dung.Grp2V_box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.Grp2V_tab)
-
-	-- Create Grp2VH Dungeon Character Box=========================
-
-	dung.Grp2VH_box = {}
-	dung.Grp2VH_box = iup.matrix {numcol=#accounts[acc].playerIDs,  numlin=#grp2tokey, widthdef=100}
-	--Set Line titles
-	for i, key in ipairs(grp2tokey) do
-		dung.Grp2VH_box:setcell(i, 0, grp_names[key])
-	end
-	--set lines
-	dung.Grp2VH_box:setcell(0,0, L.Location)
-	--Create Columns for Chars
-	for i,playerID in ipairs(accounts[acc].playerIDs) do
-		dung.Grp2VH_box:setcell(0, i, playerNames[playerID])
-	end
-
-	iup.SetAttribute(dung.Grp2VH_box, "READONLY", "YES")
-
-	-- Populate with character data ============================
-	for line,key in ipairs(grp2tokey) do		-- over each dungeon
-	    -- does that char exist in the table.
-		for i,playerID  in ipairs(accounts[acc].playerIDs) do	-- over each char in order
-			if dung.grp2VH[key][playerID] == nil then
-				dung.Grp2VH_box:setcell(line,i, "N")
-				iup.SetAttribute(dung.Grp2VH_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-			else
-				dung.Grp2VH_box:setcell(line,i, "Y")
-				iup.SetAttribute(dung.Grp2VH_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-			end
-		end
-	end
-
-
-
-	-- Create Grp2VH Dungeon Tab ==================================
-	dung.Grp2VH_tab = iup.vbox {
-						["tabtitle"] =L.Grp2VH,
-						dung.Grp2VH_box,
-						iup.fill{},
-				}
-	iup.Append(accounts[acc].dung_tabs, dung.Grp2VH_tab)
-
-

 	-- Create DLC Dungeon Tab ==================================
 	dung.DLC_tab = iup.vbox {
@@ -1326,57 +1055,7 @@ iup.Append(accounts[acc].char_tabs, accounts[acc].log_tab)



-
-
 	if #accounts[acc].playerIDs_vet > 0  then  -- skip vet and trials if no eligible chars
---[[
-	-- Create Vet Grp Dungeon Character Box=======================
-		dung.Vet1_box = {}
-		dung.Vet1_box = iup.matrix {numcol=#accounts[acc].playerIDs_vet,  numlin=#vet2tokey, widthdef=100}
-		--Set Line titles
-		for i,key in ipairs(vet2key) do
-			dung.Vet1_box:setcell(i, 0, grp_names[key])
-		end
-		--set lines
-		dung.Vet1_box:setcell(0,0, L.Location)
-
-		local col = 0
-		--Create Columns for Chars
-		for line,playerID  in ipairs(accounts[acc].playerIDs_vet) do
-			col = col +1
-			dung.Vet1_box.numcol = col
-			dung.Vet1_box:setcell(0, line, playerNames[playerID])
-		end
-
-		for line,key in ipairs(vet2key) do		-- over each dungeon
-			-- does that char exist in the table.
-			for i,playerID  in ipairs(accounts[acc].playerIDs_vet) do	-- over each char in order
-			if dung.vet[key] == nil then
-				print ("key: " .. key .. "  missing")
-			end
-				if dung.vet[key][playerID] == nil then
-					dung.Vet_box:setcell(line,i, "N")
-					iup.SetAttribute(dung.Vet_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Not_Complete)
-				else
-					dung.Vet_box:setcell(line,i, "Y")
-					iup.SetAttribute(dung.Vet_box,"BGCOLOR" .. tostring(line) .. ":" .. tostring(i), BG_Colour_Complete)
-				end
-			end
-		end
-
-
-		iup.SetAttribute(dung.Vet1_box, "READONLY", "YES")
-
-
-		-- Create Vet Dungeon Tab ==================================
-		dung.Vet1_tab = iup.vbox {
-							["tabtitle"] =L.Vet,
-							dung.Vet1_box,
-							iup.fill{},
-					}
-
-		iup.Append(accounts[acc].dung_tabs, dung.Vet1_tab)
---]]

 	-- Create Trials  Character Box=======================

diff --git a/data/Group1.lua b/data/Group1.lua
index 192e396..d0b614c 100644
--- a/data/Group1.lua
+++ b/data/Group1.lua
@@ -1,7 +1,7 @@
 --Mode 1 Data  N, V, VH

 -- key is Achievement ID, L,C are Line Column in Grid
-Grp["1N"].dat = {
+Grp_Dat["1N"].dat = {
 [294]= {L=1, C=1},		-- "Fungal Grotto I Vanquisher",
 [78]= {L=2, C=1},		-- "Darkshade Caverns I Vanquisher"
 [272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
@@ -22,9 +22,10 @@ Grp["1N"].dat = {

 [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
 }
-Grp["1N"].vet = false
+Grp_Dat["1N"].vet = false

-Grp["1V"].dat = {
+
+Grp_Dat["1V"].dat = {
 [1556]= {L=1, C=1},		-- "Fungal Grotto I Conqueror"
 [1581]= {L=2, C=1},		-- "Darkshade Caverns I Conqueror"
 [1604]= {L=3, C=1},		-- "Arx Corinium Conqueror"
@@ -45,10 +46,10 @@ Grp["1V"].dat = {

 [1653]= {L=5, C=4},		-- "Vaults of Madness Conqueror"
 }
-Grp["1V"].vet = true
+Grp_Dat["1V"].vet = true

 --Hard Mode
-Grp["1VH"].dat = {
+Grp_Dat["1VH"].dat = {
 [1561]= {L=1, C=1},		-- "Catch of the Day"
 [1585]= {L=2, C=1},		-- "Well Out of Warranty"
 [1608]= {L=3, C=1},		-- "Snake Skinner"
@@ -70,4 +71,4 @@ Grp["1VH"].dat = {
 [1658]= {L=5, C=4},		-- "New Mayor of Crazy Town"
 }

-Grp["1VH"].vet = true
\ No newline at end of file
+Grp_Dat["1VH"].vet = true
\ No newline at end of file
diff --git a/data/Group2.lua b/data/Group2.lua
index 9137c79..f65f08a 100644
--- a/data/Group2.lua
+++ b/data/Group2.lua
@@ -3,7 +3,7 @@
 -- key is Achievement ID, L,C are Line Column in Grid
 -- Not all dungeons have second mode

-Grp["2N"].dat = {
+Grp_Dat["2N"].dat = {
 [1562]= {L=1, C=1},		-- "Fungal Grotto II Vanquisher"
 [1587]= {L=2, C=1},		-- "Darkshade Caverns II Vanquisher"
 --[272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
@@ -24,9 +24,9 @@ Grp["2N"].dat = {

 -- [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
 }
-Grp["2N"].vet = false
+Grp_Dat["2N"].vet = false

-Grp["2V"].dat = {
+Grp_Dat["2V"].dat = {
 [343]= {L=1, C=1},		-- "Fungal Grotto II Conqueror"
 [464]= {L=2, C=1},		-- "Darkshade Caverns II Conqueror"
 --[272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
@@ -47,15 +47,15 @@ Grp["2V"].dat = {

 -- [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
 }
-Grp["2V"].vet = true
+Grp_Dat["2V"].vet = true

 -- Hard Mode Activated
-Grp["2VH"].dat = {
+Grp_Dat["2VH"].dat = {
 [324]= {L=1, C=1},		-- "Fearless Assaulter"
 [467]= {L=2, C=1},		-- "Deadly Engineer"
 -- 272]= {L=3, C=1},		-- "Arx Corinium Vanquisher"
 -- [357]= {L=4, C=1},		-- "Direfrost Keep Vanquisher"
--- [393]= {L=5, C=1},		-- Blessed Crucible
+-- [393]= {L=5, C=1},		-- Blessed Crucible

 [448]= {L=1, C=2},		-- "Compassionate Hero"
 [681]= {L=2, C=2},		-- "Pellingare Ghoul Slayer"
@@ -71,4 +71,4 @@ Grp["2VH"].dat = {

 -- [570]= {L=5, C=4},		-- "Vaults of Madness Vanquisher"
 }
-Grp["2VH"].vet = true
+Grp_Dat["2VH"].vet = true
diff --git a/data/en/en.lua b/data/en/en.lua
index a2f3732..0d5a3c7 100644
--- a/data/en/en.lua
+++ b/data/en/en.lua
@@ -68,6 +68,7 @@ DLC_names = {
 		Characters = "Characters",
 		Dungeons = "Dungeons",
 		Mode = "Showing",
+		Grp_TabName={},
 		Grp1N = "Mode 1N",
 		Grp1V = "Mode 1V",
 		Grp1VH = "Mode 1VH",
@@ -91,6 +92,13 @@ DLC_names = {
 		ChooseAccounttoDelete = "Choose Account to Delete",
 		ChooseChartoDelete = "Choose Character to Delete",
 	}
+L.Grp_TabName["1N"] = "Mode 1N"
+L.Grp_TabName["1V"] = "Mode 1V"
+L.Grp_TabName["1VH"] = "Mode 1VH"
+L.Grp_TabName["2N"] = "Mode 2N"
+L.Grp_TabName["2V"] = "Mode 2V"
+L.Grp_TabName["2VH"] = "Mode 2VH"
+

 pub_names = {
 --EP