From a32b698ebf8f89e556d853b63caca9c5f1ac47ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Roman=20Jaro=C5=A1?= <hello@romanjaros.dev>
Date: Fri, 18 Apr 2025 14:03:11 +0200
Subject: [PATCH] Refactor encounter handling and placeholder logic

---
 Addon/Code/Encounter.lua        |  89 ++++++------
 Addon/Code/EncounterDataApi.lua |  39 ++++-
 Addon/Code/EncounterFrame.lua   |  10 +-
 Addon/Code/Shared.lua           |  43 ++++++
 Addon/Code/SpeechDataApi.lua    |  21 +--
 Addon/Data/retail/10.lua        | 155 +++++---------------
 Addon/Data/retail/11.lua        |  96 -------------
 Addon/Data/retail/9.lua         | 242 ++++++++++++++++----------------
 CzechQuests_Mainline.toc        |   2 +
 CzechQuests_Vanilla.toc         |   2 +
 10 files changed, 278 insertions(+), 421 deletions(-)
 create mode 100644 Addon/Code/Shared.lua

diff --git a/Addon/Code/Encounter.lua b/Addon/Code/Encounter.lua
index c9d1444..cc605de 100755
--- a/Addon/Code/Encounter.lua
+++ b/Addon/Code/Encounter.lua
@@ -24,6 +24,8 @@ local TAG_TO_ICON = {
     enrage = 11
 }
 
+local ORIGINALS = {}
+
 local function HideOtherContent()
     local frames = { "overviewScroll", "LootContainer", 'detailsScroll', 'model' }
     for _, frame in ipairs(frames) do
@@ -67,15 +69,6 @@ local function SetAbilityIcon(header, tags)
             EncounterJournal_SetFlagIcon(tex, index)
         end
     end
-
-
-
-end
-
-local function ColorSpellNames(text, color)
-    return text:gsub("%[(.-)%]", function(match)
-        return string.format("|c%s[%s]|r", color or "FF0000FF", match)
-    end)
 end
 
 local function RenderBossAbilities(data, parent, layer)
@@ -86,10 +79,10 @@ local function RenderBossAbilities(data, parent, layer)
     end
 
     for _, node in ipairs(data) do
-        local abilityValue = addon.API.ResolveGender(addon.API.GetEncounterAbility(node.key))
+        local abilityValue = addon.API.GetEncounterAbility(node.key)
 
         if abilityValue then
-            local abilityParts = addon.API.SplitAbilityParts(abilityValue, "|")
+            local abilityParts = addon.API.ParseAbilities(abilityValue, "|")
             local name = abilityParts[1]
             local tag = abilityParts[3]
             local description = abilityParts[5]
@@ -104,7 +97,7 @@ local function RenderBossAbilities(data, parent, layer)
                 end
 
                 header.description:SetWidth(header:GetWidth() - 20)
-                header.description:SetText(description)
+                header.description:SetText(addon.API.SetAbilityDescription(description, ORIGINALS[name]))
                 if description == "" then header.empty = true end
 
                 table.insert(parent.children, header)
@@ -119,49 +112,34 @@ local function RenderBossAbilities(data, parent, layer)
     end
 end
 
-local function RenderBossEncounter(bossName, bossKey)
+local function RenderBossEncounter(bossKey, bossName)
     local frame = addon.EncounterFrame
     HideOtherContent()
 
     local bossData = CzechQuestsAddon:GetData('encounter', bossKey)
 
-    local function CreateHeaderDescription(data)
-        local value = addon.API.ResolveGender(data)
-        local result = {}
-        for part in string.gmatch(value, "([^\n]+)") do
-            table.insert(result, part)
-        end
-        local description = ""
-        for i, part in pairs(result) do
-            description = description
-                    .. "- "
-                    .. ColorSpellNames(part)
-                    .. (i == #result and "" or "\n\n")
-        end
-        return description
-    end
-
     frame.summary:SetText(
-            ColorSpellNames(
-                    addon.API.ResolveGender(bossData.overview)
-            )
+        addon.API.SetAbilityDescription(bossData.overview, ORIGINALS['Overview'])
     )
 
     local tankHeader = frame:CreateHeader()
     tankHeader.button.title:SetText("Tank")
-    tankHeader.description:SetText(CreateHeaderDescription(bossData.tank))
+    local tankDescription = addon.API.SetSummaryDescription(bossData.tank, ORIGINALS['Tanks'])
+    tankHeader.description:SetText(tankDescription)
     table.insert(frame.headers, tankHeader)
     SetAbilityIcon(tankHeader, 'tank')
 
     local healHeader = frame:CreateHeader()
     healHeader.button.title:SetText("Healer")
-    healHeader.description:SetText(CreateHeaderDescription(bossData.healer))
+    local healerDescription = addon.API.SetSummaryDescription(bossData.healer, ORIGINALS['Healers'])
+    healHeader.description:SetText(healerDescription)
     table.insert(frame.headers, healHeader)
     SetAbilityIcon(healHeader, 'healer')
 
     local dpsHeader = frame:CreateHeader()
     dpsHeader.button.title:SetText("Damage Dealer")
-    dpsHeader.description:SetText(CreateHeaderDescription(bossData.dps))
+    local dpsDescription = addon.API.SetSummaryDescription(bossData.dps, ORIGINALS['Damage Dealers'])
+    dpsHeader.description:SetText(dpsDescription)
     table.insert(frame.headers, dpsHeader)
     SetAbilityIcon(dpsHeader, 'dps')
 
@@ -169,16 +147,31 @@ local function RenderBossEncounter(bossName, bossKey)
     bossHeader.button.title:SetText(bossName)
     bossHeader.empty = true
     table.insert(frame.headers, bossHeader)
-
-    -- abilities
     RenderBossAbilities(bossData.abilities, bossHeader, 1)
 
     frame:GetParent():Show()
     frame:UpdateHeaderPositions()
-    end
+end
+
+local function StoreBossAbilities()
+    ORIGINALS = {}
+    local stack, _, _, _, curSectionID = {}, EJ_GetEncounterInfo(ENCOUNTER_ID)
+    repeat
+        local info = C_EncounterJournal.GetSectionInfo(curSectionID)
+        if not info.filteredByDifficulty then
+            ORIGINALS[info.title] = info.description
+        end
+        table.insert(stack, info.siblingSectionID)
+        if not info.filteredByDifficulty then
+            table.insert(stack, info.firstChildSectionID)
+        end
+        curSectionID = table.remove(stack)
+    until not curSectionID
+end
 
 local function DetectBossToRender()
     local frame = addon.EncounterFrame
+
     local encounterName = EJ_GetEncounterInfo(ENCOUNTER_ID)
 
     local difficulty = 'lfg_raid' -- 17
@@ -196,14 +189,12 @@ local function DetectBossToRender()
         difficulty = 'mythic_dungeon'
     end
 
-    local bossName = nil
     local bossKey = nil
     for i = 1, 10 do
         local id, name = EJ_GetCreatureInfo(i);
         if id then
             local key = name .. "_" .. difficulty
             if addon.data.encounter[key] then
-                bossName = name
                 bossKey = key
                 break
             end
@@ -211,7 +202,8 @@ local function DetectBossToRender()
     end
 
     if bossKey then
-        RenderBossEncounter(bossName, bossKey)
+        StoreBossAbilities()
+        RenderBossEncounter(bossKey, encounterName)
     end
 
     if bossKey == nil then
@@ -220,11 +212,11 @@ local function DetectBossToRender()
     end
 end
 
-local function HideEncounterFrame()
+local function HideEncounterContent()
     addon.EncounterFrame:GetParent():Hide()
 end
 
-local function ShowEncounterFrame()
+local function ShowEncounterContent()
     CURRENT_TAB_ID = ENCOUNTER_TAB_ID
     HideOtherContent()
 
@@ -240,7 +232,7 @@ end
 
 local function SetupCustomTab()
     addon.EncounterFrame.tab:SetScript("OnClick", function()
-        ShowEncounterFrame()
+        ShowEncounterContent()
     end)
 
     hooksecurefunc("EncounterJournal_DisplayEncounter", function(encounterID)
@@ -248,7 +240,7 @@ local function SetupCustomTab()
         addon.EncounterFrame.tab:SetActive(true);
 
         if CURRENT_TAB_ID == ENCOUNTER_TAB_ID then
-            ShowEncounterFrame()
+            ShowEncounterContent()
         end
     end)
 
@@ -263,19 +255,19 @@ local function SetupCustomTab()
 
         PREVIOUS_TAB_ID = CURRENT_TAB_ID
         CURRENT_TAB_ID = tabId
-        HideEncounterFrame()
+        HideEncounterContent()
     end)
 
     hooksecurefunc("EncounterJournalBossButton_OnClick", function(encounterID)
         if PREVIOUS_TAB_ID == ENCOUNTER_TAB_ID then
-            ShowEncounterFrame()
+            ShowEncounterContent()
         end
     end)
 
     hooksecurefunc("EncounterJournal_UpdateDifficulty", function(difficulty)
         DIFFICULTY = difficulty
         if PREVIOUS_TAB_ID == ENCOUNTER_TAB_ID and ENCOUNTER_ID then
-            ShowEncounterFrame()
+            ShowEncounterContent()
         end
     end)
 end
@@ -283,7 +275,6 @@ end
 local function InitEncounters()
     local frame = addon.EncounterFrame
 
-    -- Register EncounterJournal events
     frame:RegisterEvent("ADDON_LOADED")
 
     frame:SetScript("OnEvent", function(self, event, addonName)
diff --git a/Addon/Code/EncounterDataApi.lua b/Addon/Code/EncounterDataApi.lua
index b3d0cbe..e0f1214 100755
--- a/Addon/Code/EncounterDataApi.lua
+++ b/Addon/Code/EncounterDataApi.lua
@@ -1,6 +1,6 @@
 local _, addon = ...
 
-local function SplitAbilityParts(input, delimiter)
+local function ParseAbilities(input, delimiter)
     local result = {}
     local pattern = "([^" .. delimiter .. "]*)"
     local normalizedAbility = string.gsub(input, "||", "|???|")
@@ -17,21 +17,46 @@ local function SplitAbilityParts(input, delimiter)
 
     return result
 end
-addon.API.SplitAbilityParts = SplitAbilityParts
+addon.API.ParseAbilities = ParseAbilities
 
+local function SetAbilityDescription(text, original)
+    local withNumbers = addon.API.FillNumbers(text, original)
+    return addon.API.ColorSpellNames(withNumbers)
+end
+addon.API.SetAbilityDescription = SetAbilityDescription
+
+local function SetSummaryDescription(text, original)
+    local withNumbers = addon.API.FillNumbers(text, original)
+
+    local lines = {}
+    for part in string.gmatch(withNumbers, "([^\n]+)") do
+        table.insert(lines, part)
+    end
+
+    local description = ""
+    for i, line in pairs(lines) do
+        description = description
+                .. "- "
+                .. addon.API.ColorSpellNames(line)
+                .. (i == #lines and "" or "\n\n")
+    end
+
+    return description
+end
+addon.API.SetSummaryDescription = SetSummaryDescription
 
 local function GetEncounterAbility(abilityKey)
-    return addon.data.encounter[abilityKey] or nil
+    return addon.data.encounter[abilityKey].m or nil
 end
 addon.API.GetEncounterAbility = GetEncounterAbility
 
 local function GetEncounter(bossKey)
     return {
         abilities = addon.data.encounter[bossKey] or nil,
-        overview = addon.data.encounter[bossKey .. "_summary_instance"] or nil,
-        tank = addon.data.encounter[bossKey .. "_summary_tank"] or nil,
-        healer = addon.data.encounter[bossKey .. "_summary_healer"] or nil,
-        dps = addon.data.encounter[bossKey .. "_summary_dps"] or nil,
+        overview = addon.data.encounter[bossKey .. "_summary_instance"].m or nil,
+        tank = addon.data.encounter[bossKey .. "_summary_tank"].m or nil,
+        healer = addon.data.encounter[bossKey .. "_summary_healer"].m or nil,
+        dps = addon.data.encounter[bossKey .. "_summary_dps"].m or nil,
     }
 end
 addon.API.GetEncounter = GetEncounter
\ No newline at end of file
diff --git a/Addon/Code/EncounterFrame.lua b/Addon/Code/EncounterFrame.lua
index 32e5380..90dfa99 100755
--- a/Addon/Code/EncounterFrame.lua
+++ b/Addon/Code/EncounterFrame.lua
@@ -120,7 +120,7 @@ function EncounterFrame:CreateHeader()
     HeaderFrame.expanded = false
     HeaderFrame.empty = false
 
-    HeaderFrame.button.title:SetPoint("TOPLEFT", HeaderFrame, "TOPLEFT", 40, -7);
+    HeaderFrame.button.title:SetPoint("TOPLEFT", HeaderFrame, "TOPLEFT", 30, -7);
     HeaderFrame.button.title:SetWidth(self:GetParent():GetWidth() - 110)
 
     for i = 1, #HeaderFrame.Bullets do
@@ -229,24 +229,16 @@ end
 function EncounterFrame:ClearHeaders()
     local function clear(headers)
         for _, header in ipairs(headers) do
-            -- Skrytí aktuálního záhlaví
             header:Hide()
             header:SetParent(nil)
-
-            -- Rekurzivně skrýváme podřízená záhlaví
             if header.children and #header.children > 0 then
                 clear(header.children)
             end
-
-            -- Vymazání záhlaví
             header = nil
         end
-
-        -- Vyprázdnění seznamu
         wipe(headers)
     end
 
-    -- Vymazání všech hlavních záhlaví
     clear(self.headers)
 end
 
diff --git a/Addon/Code/Shared.lua b/Addon/Code/Shared.lua
new file mode 100644
index 0000000..881e570
--- /dev/null
+++ b/Addon/Code/Shared.lua
@@ -0,0 +1,43 @@
+local _, addon = ...
+
+local function ClearNumberStringMarks(text)
+    -- Remove colors (|cffffff...)
+    text = text:gsub("|c%x%x%x%x%x%x%x%x", "")
+    -- Remove H marks
+    text = text:gsub("|H.-|h", "")
+    return text
+end
+
+local function FillNumbers(text, sourceText)
+    local numbers = {}
+    local currentIndex = 1
+
+    local source = ClearNumberStringMarks(sourceText)
+
+    for num in source:gmatch("(%d[%d,%.]*)") do
+        table.insert(numbers, num)
+    end
+
+    local replacedText = text:gsub("#%?", function()
+        local n = numbers[currentIndex]
+        currentIndex = currentIndex + 1
+
+        if n and source:match("%s+" .. n .. "%s+million") then
+            return n .. " mil."
+        elseif n and source:match("%s+" .. n .. "%s+million") then
+            return n .. " mil."
+        end
+
+        return n or "?"
+    end)
+
+    return replacedText
+end
+addon.API.FillNumbers = FillNumbers
+
+local function ColorSpellNames(text, color)
+    return text:gsub("%[(.-)%]", function(match)
+        return string.format("|c%s[%s]|r", color or "FF0000FF", match)
+    end)
+end
+addon.API.ColorSpellNames = ColorSpellNames
\ No newline at end of file
diff --git a/Addon/Code/SpeechDataApi.lua b/Addon/Code/SpeechDataApi.lua
index c7a80ba..0443d13 100755
--- a/Addon/Code/SpeechDataApi.lua
+++ b/Addon/Code/SpeechDataApi.lua
@@ -6,23 +6,6 @@ local function BuildIndex(text)
     return normalized
 end
 
-local function FillNumbers(text, sourceText)
-    local numbers = {}
-    local currentIndex = 1
-
-    for num in sourceText:gmatch("%d+%.?%d*") do
-        table.insert(numbers, num)
-    end
-
-    local replacedText = text:gsub("#%?", function()
-        local n = numbers[currentIndex]
-        currentIndex = currentIndex + 1
-        return n or "?"
-    end)
-
-    return replacedText
-end
-
 local function FillPlaceholders(text)
     if text == nil then
         return text
@@ -41,7 +24,9 @@ local function GetSpeech(message)
     local speech = addon.data.speech[index];
     local text = speech and speech.m or nil
     if text then
-        return FillPlaceholders(FillNumbers(text, message))
+        return FillPlaceholders(
+                addon.API.FillNumbers(text, message)
+        )
     else
         return nil
     end
diff --git a/Addon/Data/retail/10.lua b/Addon/Data/retail/10.lua
index 8c4f24e..a5b1502 100644
--- a/Addon/Data/retail/10.lua
+++ b/Addon/Data/retail/10.lua
@@ -1,126 +1,4 @@
 local _, addon = ...
-addon.data.speech["Cataloger Simone_Eyes on me! Ready? Set? Laugh!"] = {
-	m = "Sledujte mě! Připraven? Připravit? Směj se!", 
-}
-addon.data.speech["Cataloger Simone_Let's give a big wave to the camera! Big wave, come on!"] = {
-	m = "Zamávejme na kameru! Velká vlna, no tak!", 
-}
-addon.data.speech["Cataloger Simone_Eyes on me! Now wave to your fans!"] = {
-	m = "Sledujte mě! A teď zamávej svým fanouškům!", 
-}
-addon.data.speech["Cataloger Simone_Focus on me and show me you can dance!"] = {
-	m = "Soustřeď se na mě a ukaž, že umíš tančit!", 
-}
-addon.data.speech["Cataloger Simone_Wave to the camera! Wave to it, superstar!"] = {
-	m = "Zamávejte do kamery! Zamávej jí, superhvězdo!", 
-}
-addon.data.speech["Cataloger Simone_Show me the tears! Show me you can cry on cue!"] = {
-	m = "Ukažte mi slzy! Ukaž mi, že umíš plakat na povel!", 
-}
-addon.data.speech["Cataloger Simone_Let's see some muscle! Flex for me!"] = {
-	m = "Ukažte nám svaly! Oheň pro mě!", 
-}
-addon.data.speech["Cataloger Simone_<class>! You've got a look that says you know a thing or two about style!"] = {
-	m = "<cM0>! Tvůj vzhled napovídá, že o stylu něco víš!", 
-}
-addon.data.speech["Cataloger Simone_Let's see a strong salute! Focus on me and salute!"] = {
-	m = "Uvidíme silný pozdrav! Soustřeďte se na mě a salutujte!", 
-}
-addon.data.speech["Cataloger Simone_Show me your best dance moves!"] = {
-	m = "Ukažte mi své nejlepší taneční pohyby!", 
-}
-addon.data.speech["Cataloger Simone_Let's see how you dance. Focus on me and dance up a storm!"] = {
-	m = "Podívejme se, jak tančíš. Soustřeďte se na mě a tančete jako bouře!", 
-}
-addon.data.speech["Cataloger Simone_Roar! Let me see you roar! Let that beast out!"] = {
-	m = "Roar! Ukaž mi, jak řveš! Vypusť tu bestii ven!", 
-}
-addon.data.speech["Cataloger Simone_Strike a pose! Flex your muscles!"] = {
-	m = "Zapózujte! Napněte svaly!", 
-}
-addon.data.speech["Cataloger Simone_I need to see some emotion. Cry for me!"] = {
-	m = "Potřebuji vidět nějaké emoce. Plačte za mě!", 
-}
-addon.data.speech["Cataloger Simone_Dance like nobody's watching... But make sure you dance for the camera!"] = {
-	m = "Tancuj, jako by se nikdo nedíval... Ale nezapomeňte tančit před kamerou!", 
-}
-addon.data.quest["q86705_name"] = {
-	m = "Pracujte na tom", 
-}
-addon.data.quest["q86705_description"] = {
-	m = "Zkouška stylu nám dává příležitost vypadat dobře. <cM0>. Kamera se postará o to, abychom vypadali dobře i nadále. Takže se soustřeďte na mě a můj fotoaparát, dodržujte mé pokyny a já se postarám o to, abyste vypadali fantasticky!", 
-	f = "Zkouška stylu nám dává příležitost vypadat dobře. <cF0>. Kamera se stará o to, abychom stále vypadali dobře. Takže se soustřeďte na mě a můj fotoaparát, dodržujte mé pokyny a já se postarám o to, abyste vypadali fantasticky!", 
-}
-addon.data.quest["q86705_objective"] = {
-	m = "Soustřeďte se na fotografa a postupujte podle jeho pokynů.", 
-}
-addon.data.quest["q86705_progress"] = {
-	m = "Soustřeďte se na mě a řiďte se mými pokyny.\n\nPostarám se, abys vypadala skvěle.", 
-}
-addon.data.quest["q86705_completion"] = {
-	m = "Kamera nelže, <name>.\n\nJsi stylový <cM0>.", 
-	f = "Kamera nelže, <name>.\n\nJsi jedna stylová <cF0>.", 
-}
-addon.data.speech["Cataloger Grilka_Let's give a big wave to the camera! Big wave, come on!"] = {
-	m = "Zamávejme na kameru! Velká vlna, no tak!", 
-}
-addon.data.speech["Cataloger Grilka_Demon Hunter! You've got a look that says you know a thing or two about style!"] = {
-	m = "Lovec démonů! Tvůj vzhled napovídá, že se vyznáš ve stylu!", 
-}
-addon.data.speech["Cataloger Grilka_Laugh for me! Pretend I just told you the world's best joke, let's hear it!"] = {
-	m = "Smějte se za mě! Představte si, že jsem vám právě řekl nejlepší vtip na světě, poslechněte si ho!", 
-}
-addon.data.speech["Cataloger Grilka_Eyes on me! Ready? Set? Laugh!"] = {
-	m = "Sledujte mě! Připraven? Připravit? Směj se!", 
-}
-addon.data.speech["Cataloger Grilka_I need to see some emotion. Cry for me!"] = {
-	m = "Potřebuji vidět nějaké emoce. Plačte za mě!", 
-}
-addon.data.speech["Cataloger Grilka_Focus on me and show me you can dance!"] = {
-	m = "Soustřeď se na mě a ukaž, že umíš tančit!", 
-}
-addon.data.speech["Cataloger Grilka_Dance like nobody's watching... But make sure you dance for the camera!"] = {
-	m = "Tancuj, jako by se nikdo nedíval... Ale nezapomeňte tančit před kamerou!", 
-}
-addon.data.speech["Cataloger Grilka_Show me your best salute!"] = {
-	m = "Ukaž mi svůj nejlepší pozdrav!", 
-}
-addon.data.speech["Cataloger Grilka_Let's see a strong salute! Focus on me and salute!"] = {
-	m = "Uvidíme silný pozdrav! Soustřeďte se na mě a salutujte!", 
-}
-addon.data.speech["Cataloger Grilka_Roar for me! Look at me and roar!"] = {
-	m = "Řvi za mě! Podívejte se na mě a zařvěte!", 
-}
-addon.data.speech["Cataloger Grilka_Roar! Let me see you roar! Let that beast out!"] = {
-	m = "Roar! Ukaž mi, jak řveš! Vypusť tu bestii ven!", 
-}
-addon.data.speech["Cataloger Grilka_Focus on me! Now show me your mightiest roar!"] = {
-	m = "Soustřeďte se na mě! Teď mi ukaž svůj nejsilnější řev!", 
-}
-addon.data.speech["Cataloger Grilka_Let's see your best laugh! Focus on me and laugh!"] = {
-	m = "Podívejme se na váš nejlepší smích! Soustřeďte se na mě a smějte se!", 
-}
-addon.data.speech["Cataloger Grilka_Strike a pose! Flex your muscles!"] = {
-	m = "Zapózujte! Napněte svaly!", 
-}
-addon.data.speech["Cataloger Grilka_Show me how strong you are. Flex those muscles!"] = {
-	m = "Ukaž mi, jak jsi silný. Napněte svaly!", 
-}
-addon.data.speech["Cataloger Grilka_<class>! You've got a look that says you know a thing or two about style!"] = {
-	m = "<cM0>! Tvůj vzhled napovídá, že o stylu něco víš!", 
-}
-addon.data.speech["Cataloger Grilka_Focus on me and cry. Let's see the tears!"] = {
-	m = "Soustřeďte se na mě a plačte. Uvidíme slzy!", 
-}
-addon.data.speech["Cataloger Grilka_Let's see some muscle! Flex for me!"] = {
-	m = "Ukažte nám svaly! Oheň pro mě!", 
-}
-addon.data.speech["Cataloger Grilka_Show me the tears! Show me you can cry on cue!"] = {
-	m = "Ukažte mi slzy! Ukaž mi, že umíš plakat na povel!", 
-}
-addon.data.speech["Cataloger Grilka_Death Knight! You've got a look that says you know a thing or two about style!"] = {
-	m = "Rytíř smrti! Tvůj vzhled napovídá, že o stylu něco víš!", 
-}
 addon.data.speech["Cataloger Grilka_Show me your best dance moves!"] = {
 	m = "Ukažte mi své nejlepší taneční pohyby!", 
 }
@@ -304,6 +182,39 @@ addon.data.speech["Heaps Morale Booster_THIS IS YOUR REMINDER TO MINE AS MANY CH
 addon.data.encounter["The Gobfather_normal_raid_a03b221c_00"] = {
 	m = "???||", 
 }
+addon.data.encounter["The Gobfather_normal_raid_0dd77eb8_0000"] = {
+	m = "Bombfield|Important|Gobfather rozptýlí Primed Boomcrawlery, které se potulují #? s. Šlápnutí na Primed Boomcrawlera způsobí jeho předčasnou detonaci a spustí Bomb Voyage.", 
+}
 addon.data.encounter["The Gobfather_normal_raid_3df09614_000000"] = {
 	m = "Primed Boomcrawler||", 
 }
+addon.data.encounter["The Gobfather_normal_raid_2dff6e6c_00000000"] = {
+	m = "Reinforced Plating||Zesílené opláštění snižuje poškození, které obdrží Primed Boomcrawler, o #? %.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_eeafee09_00000001"] = {
+	m = "Bomb Voyage||Primed Boomcrawler detonuje, způsobí #? Fire poškození a odhodí hráče v okruhu #? yardů.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_a4190c2f_0001"] = {
+	m = "Death From Above||Gobfather vypustí ze svých raketometů příval raket, které způsobí #? Fire poškození hráčům v okruhu #? yardů od každého zásahu.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_b3ae61ca_0002"] = {
+	m = "Giga-Rocket Slam||Gobfather udeří obrovskou silou do země, čímž všem hráčům způsobí #? Fire poškození a odhodí je zpět.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_c5b3601a_0003"] = {
+	m = "Flaming Flames||The Gobfather vypustí plamenný proud, který způsobí #? Fire poškození hráčům v čelním kuželu.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_09c97f46_0004"] = {
+	m = "Excessive Pollutants|Healer|Gobfather vypouští do vzduchu nebezpečné chemikálie, které způsobují #? Nature poškození v intervalu #? s.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_summary_instance"] = {
+	m = "Gobfather se nehodlá vzdát bez závěrečného boje, rozmetá Primed Boomcrawlers pomocí [Bombfield] a srazí hráče k zemi pomocí [Giga-Rocket Slam]. Při #? energiích vytasí veškerou sílu a zasype je [Death From Above].", 
+}
+addon.data.encounter["The Gobfather_normal_raid_summary_tank"] = {
+	m = "Primed Boomcrawlers explodují pomocí [Bomb Voyage] po sešlápnutí.  \nThe Gobfather způsobuje masivní poškození svými střelami [Death From Above].  \n[Flaming Flames] způsobují poškození hráčům před The Gobfatherem.", 
+}
+addon.data.encounter["The Gobfather_normal_raid_summary_healer"] = {
+	m = "Primed Boomcrawlers po sešlápnutí explodují pomocí [Bomb Voyage].  \n[Excessive Pollutants] neustále způsobuje poškození všem hráčům.  \nGobfather uděluje obrovské poškození svými střelami [Death From Above].", 
+}
+addon.data.encounter["The Gobfather_normal_raid_summary_dps"] = {
+	m = "Boomcrawleři Primed Boomcrawlers po sešlápnutí explodují pomocí [Bomb Voyage].  \nThe Gobfather způsobuje masivní poškození svými střelami [Death From Above].  \n[Flaming Flames] způsobují poškození hráčům před The Gobfatherem.", 
+}
diff --git a/Addon/Data/retail/11.lua b/Addon/Data/retail/11.lua
index f2004a8..cfe772f 100644
--- a/Addon/Data/retail/11.lua
+++ b/Addon/Data/retail/11.lua
@@ -40,99 +40,3 @@ addon.data.encounter["The Gobfather_normal_raid"] = {
 	},
 },
 }
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon"] = {
-{
-	key = "Big M.O.M.M.A._normal_dungeon_a03b221c_00",
-	children = {
-	{
-		key = "Big M.O.M.M.A._normal_dungeon_72fe5c6d_0000",
-		children = {
-		{
-			key = "Big M.O.M.M.A._normal_dungeon_af61785a_000000",
-			children = {},
-		},
-		},
-	},
-	{
-		key = "Big M.O.M.M.A._normal_dungeon_4728d502_0001",
-		children = {
-		{
-			key = "Big M.O.M.M.A._normal_dungeon_f30e1eb7_000100",
-			children = {
-			{
-				key = "Big M.O.M.M.A._normal_dungeon_bd9b8d8e_00010000",
-				children = {},
-			},
-			{
-				key = "Big M.O.M.M.A._normal_dungeon_81fd88f1_00010001",
-				children = {},
-			},
-			},
-		},
-		},
-	},
-	{
-		key = "Big M.O.M.M.A._normal_dungeon_606e5345_0002",
-		children = {},
-	},
-	{
-		key = "Big M.O.M.M.A._normal_dungeon_56351870_0003",
-		children = {},
-	},
-	{
-		key = "Big M.O.M.M.A._normal_dungeon_98198fd2_0004",
-		children = {},
-	},
-	},
-},
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon"] = {
-{
-	key = "Big M.O.M.M.A._mythic_dungeon_a03b221c_00",
-	children = {
-	{
-		key = "Big M.O.M.M.A._mythic_dungeon_72fe5c6d_0000",
-		children = {
-		{
-			key = "Big M.O.M.M.A._mythic_dungeon_af61785a_000000",
-			children = {},
-		},
-		},
-	},
-	{
-		key = "Big M.O.M.M.A._mythic_dungeon_4728d502_0001",
-		children = {
-		{
-			key = "Big M.O.M.M.A._mythic_dungeon_f30e1eb7_000100",
-			children = {
-			{
-				key = "Big M.O.M.M.A._mythic_dungeon_17f89169_00010000",
-				children = {},
-			},
-			{
-				key = "Big M.O.M.M.A._mythic_dungeon_bd9b8d8e_00010001",
-				children = {},
-			},
-			{
-				key = "Big M.O.M.M.A._mythic_dungeon_81fd88f1_00010002",
-				children = {},
-			},
-			},
-		},
-		},
-	},
-	{
-		key = "Big M.O.M.M.A._mythic_dungeon_606e5345_0002",
-		children = {},
-	},
-	{
-		key = "Big M.O.M.M.A._mythic_dungeon_56351870_0003",
-		children = {},
-	},
-	{
-		key = "Big M.O.M.M.A._mythic_dungeon_98198fd2_0004",
-		children = {},
-	},
-	},
-},
-}
diff --git a/Addon/Data/retail/9.lua b/Addon/Data/retail/9.lua
index a8fc51d..fd12cd2 100644
--- a/Addon/Data/retail/9.lua
+++ b/Addon/Data/retail/9.lua
@@ -2795,132 +2795,12 @@ addon.data.speech["Lost Soul_Here comes the heat!"] = {
 addon.data.speech["Brann Bronzebeard_Here's your take of the spoils!"] = {
 	m = "Tady je váš podíl na kořisti!", 
 }
-addon.data.encounter["The Gobfather_normal_raid_0dd77eb8_0000"] = {
-	m = "Bombfield|Important|Gobfather rozptýlí Primed Boomcrawlery, kteří se potulují po dobu 42 sekund. Šlápnutí na Primed Boomcrawlera způsobí jeho předčasnou detonaci a spustí Bomb Voyage.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_2dff6e6c_00000000"] = {
-	m = "Reinforced Plating||Zesílené opláštění snižuje poškození, které obdrží Primed Boomcrawler, o 99 %.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_eeafee09_00000001"] = {
-	m = "Bomb Voyage||Primed Boomcrawler detonuje, způsobí 1 219 866 Fire poškození a odhodí hráče v okruhu 5 yardů.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_a4190c2f_0001"] = {
-	m = "Death From Above||Gobfather vypustí ze svých raketometů příval raket, které způsobí 1 568 398 Fire poškození hráčům v okruhu 5 yardů od každého zásahu.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_b3ae61ca_0002"] = {
-	m = "Giga-Rocket Slam||The Gobfather udeří obrovskou silou do země, čímž způsobí všem hráčům 871 332 Fire poškození a odhodí je zpět.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_c5b3601a_0003"] = {
-	m = "Flaming Flames||Gobfather vypustí plamenný proud, který způsobí hráčům v čelním kuželu 2 091 198 Fire poškození.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_09c97f46_0004"] = {
-	m = "Excessive Pollutants|Healer|Gobfather vypouští do vzduchu nebezpečné chemikálie, které každé 2 sekundy způsobují 69 707 Nature poškození.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_summary_instance"] = {
-	m = "Gobfather se nehodlá vzdát bez závěrečného boje, rozmetá Primed Boomcrawlers pomocí [Bombfield] a srazí hráče k zemi pomocí [Giga-Rocket Slam]. Při 100 energiích se vytasí se vší silou a zasype je [Death From Above].", 
-}
-addon.data.encounter["The Gobfather_normal_raid_summary_tank"] = {
-	m = "Primed Boomcrawlers po sešlápnutí explodují pomocí [Bomb Voyage].  \nThe Gobfather způsobuje masivní poškození svými střelami [Death From Above].  \nPlameny [Flaming Flames] způsobují poškození hráčům před The Gobfatherem.", 
-}
-addon.data.encounter["The Gobfather_normal_raid_summary_healer"] = {
-	m = "Primed Boomcrawlers po sešlápnutí explodují pomocí [Bomb Voyage].  \n[Excessive Pollutants] neustále způsobuje poškození všem hráčům.  \nGobfather uděluje obrovské poškození svými střelami [Death From Above].", 
-}
-addon.data.encounter["The Gobfather_normal_raid_summary_dps"] = {
-	m = "Primed Boomcrawlers explodují po sešlápnutí pomocí [Bomb Voyage].  \nThe Gobfather způsobuje masivní poškození svými střelami [Death From Above].  \n[Flaming Flames] způsobují poškození hráčům před The Gobfatherem.", 
-}
 addon.data.quest["q90660_name"] = {
 	m = "Zlaté okolnosti", 
 }
 addon.data.quest["q90660_completion"] = {
 	m = "Přeji ti hodně štěstí ve všech tvých dobrodružstvích, <name>.", 
 }
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_a03b221c_00"] = {
-	m = "???||", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_72fe5c6d_0000"] = {
-	m = "Jumpstart|Important|Jakmile jsou všichni mechadroni Darkfuse poraženi, pokusí se Big M.O.M.M.A. nastartovat jejich vybitou baterii. Tento proces způsobí, že dostane o 200 % vyšší poškození a uvolňuje výboje energie každých 1,5 s po dobu 12 s. Každý náraz energie způsobí všem hráčům 206 983 Nature poškození. Jakmile se jejich zásoby plně dobijí, zanechá za sebou Big M.O.M.M.A. Excessive Electrification.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_af61785a_000000"] = {
-	m = "Excessive Electrification||Elektrizovaná země způsobuje hráčům, kteří stojí uvnitř, 287 477 Nature poškození každou 1 sekundu.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_4728d502_0001"] = {
-	m = "Mobilize Mechadrones|Important|Big M.O.M.M.A. přivolá 4 Darkfuse Mechadrony, aby mu pomohly v boji.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_f30e1eb7_000100"] = {
-	m = "Darkfuse Mechadrone||", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_bd9b8d8e_00010000"] = {
-	m = "Shoot||Mechadron vystřelí rychlou střelu na náhodného hráče a způsobí mu 143 738 Physical poškození.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_81fd88f1_00010001"] = {
-	m = "Doom Storm||Mechadron provede strafe se rozběhne směrem k hráči, bombarduje v přímé linii a způsobí 718 692 Nature poškození hráčům v okruhu 3 metry od každého nárazu.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_606e5345_0002"] = {
-	m = "Electrocrush|Tank|Big M.O.M.M.A. rozdrtí svůj cíl elektrizovaným drápem a udělí mu 1 293 646 Nature poškození a dalších 201 234 Nature poškození každou sekundu po dobu 10 sekund.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_56351870_0003"] = {
-	m = "Sonic Boom||Big M.O.M.M.A. vyšle směrem k hráči puls Sonic energie, který každých 0,5 sekundy způsobí 287 477 Sonic poškození a zároveň přetáhne a umlčí hráče uvnitř. Puls exploduje po nárazu do překážky a způsobí 718 692 Sonic poškození hráčům v okruhu 7 metrů.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_98198fd2_0004"] = {
-	m = "Kill-o-Block Barrier|DPS|Big M.O.M.M.A. se obklopí elektrickou bariérou, která sníží veškeré poškození o 80 %. Dokud je štít aktivní, způsobuje všem hráčům každé 2,5 sekundy 172 486 Nature poškození.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_summary_instance"] = {
-	m = "Big M.O.M.M.A. velí armádě dronů, kteří po porážce způsobí, že Big M.O.M.M.A. spustí [Jumpstart], což způsobí těžké poškození všem hráčům, ale Big M.O.M.M.A. obdrží zvýšené poškození. Poté Big M.O.M.M.A. zrekvíruje další letku dronů pomocí [Mobilize Mechadrones].", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_summary_tank"] = {
-	m = "Big M.O.M.M.A. spustí [Jumpstart] po poražení všech Darkfuse Mechadronů.  \n[Jumpstart] za sebou zanechá oblast [Excessive Electrification].  \n[Sonic Boom] pokračuje, dokud nenarazí na překážku.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_summary_healer"] = {
-	m = "Big M.O.M.M.A. spustí [Jumpstart] po poražení všech Darkfuse Mechadronů.  \n[Jumpstart] uděluje všem hráčům značné poškození.  \n[Sonic Boom] pokračuje, dokud nenarazí na překážku.", 
-}
-addon.data.encounter["Big M.O.M.M.A._normal_dungeon_summary_dps"] = {
-	m = "Big M.O.M.M.A. spustí [Jumpstart] po poražení všech Darkfuse Mechadronů.  \n[Jumpstart] způsobí, že Big M.O.M.M.A. utrpí výrazně vyšší poškození.  \n[Sonic Boom] pokračuje, dokud se nesrazí s překážkou.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_a03b221c_00"] = {
-	m = "???||", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_72fe5c6d_0000"] = {
-	m = "Jumpstart|Important|Jakmile jsou všichni mechadroni Darkfuse poraženi, pokusí se Big M.O.M.M.A. nastartovat jejich vybitou baterii. Tento proces způsobí, že dostane o 200 % vyšší poškození a uvolňuje výboje energie každých 1,5 s po dobu 12 s. Každý náraz energie způsobí všem hráčům 1 061 126 Nature poškození. Jakmile se jejich zásoby plně dobijí, zanechá za sebou Big M.O.M.M.A. Excessive Electrification.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_af61785a_000000"] = {
-	m = "Excessive Electrification||Elektrizovaná země způsobí každou 1 s 1 473 786 Nature poškození hráčům, kteří stojí uvnitř.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_4728d502_0001"] = {
-	m = "Mobilize Mechadrones|Mythic,Important|Big M.O.M.M.A. přivolá 4 Darkfuse Mechadrony, aby mu pomohli v boji.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_f30e1eb7_000100"] = {
-	m = "Darkfuse Mechadrone||", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_17f89169_00010000"] = {
-	m = "Maximum Distortion|Mythic,Interruptible|Mechadron přetíží svou komunikační soustavu, způsobí 1 473 786 Sonic poškození hráčům v okruhu 60 yardů a po dobu 12 sekund je každé 2 sekundy odstrčí.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_bd9b8d8e_00010001"] = {
-	m = "Shoot||Mechadron vystřelí rychlou střelu na náhodného hráče a způsobí mu 736 893 fyzického poškození.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_81fd88f1_00010002"] = {
-	m = "Doom Storm||Mechadron se rozběhne směrem k hráči, bombarduje ho v přímé linii a způsobuje 3 684 465 Nature poškození hráčům v okruhu 3 metrů od každého nárazu.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_606e5345_0002"] = {
-	m = "Electrocrush|Tank|Big M.O.M.M.A. rozdrtí svůj cíl elektrizovaným drápem a způsobí mu 6 632 038 Nature poškození a dalších 1 031 650 Nature poškození každou 1 s po dobu 10 s.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_56351870_0003"] = {
-	m = "Sonic Boom||Big M.O.M.M.A. vyšle směrem k hráči puls Sonic energie, který každých 0,5 s způsobí 1 473 786 Sonic poškození a zároveň přetáhne a umlčí hráče uvnitř. Puls exploduje po nárazu do překážky a způsobí 3 684 465 Sonic poškození hráčům v okruhu 7 yardů.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_98198fd2_0004"] = {
-	m = "Kill-o-Block Barrier|DPS|Big M.O.M.M.A. se obklopí elektrickou bariérou, která sníží veškeré způsobené poškození o 80 %. Dokud je štít aktivní, způsobuje všem hráčům každé 2,5 s 884 272 Nature poškození.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_summary_instance"] = {
-	m = "Big M.O.M.M.A. velí armádě dronů, které po porážce způsobí, že Big M.O.M.M.A. spustí [Jumpstart], což způsobí těžké poškození všem hráčům, ale Big M.O.M.M.A. dostane zvýšené poškození. Poté Big M.O.M.M.A. zrekvíruje další letku dronů pomocí [Mobilize Mechadrones].", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_summary_tank"] = {
-	m = "Big M.O.M.M.A. spustí [Jumpstart] po poražení všech Darkfuse Mechadronů.  \n[Jumpstart] za sebou zanechá oblast [Excessive Electrification].  \n[Sonic Boom] pokračuje, dokud nenarazí na překážku.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_summary_healer"] = {
-	m = "Big M.O.M.M.A. spustí [Jumpstart] po poražení všech Darkfuse Mechadronů.  \n[Jumpstart] uděluje všem hráčům značné poškození.  \n[Sonic Boom] pokračuje, dokud nenarazí na překážku.", 
-}
-addon.data.encounter["Big M.O.M.M.A._mythic_dungeon_summary_dps"] = {
-	m = "Big M.O.M.M.A. spustí [Jumpstart] po poražení všech Darkfuse Mechadronů.  \n[Jumpstart] způsobí, že Big M.O.M.M.A. utrpí výrazně vyšší poškození.  \n[Sonic Boom] pokračuje, dokud nenarazí na překážku.", 
-}
 addon.data.speech["Cataloger Judith_Laugh for me! Pretend I just told you the world's best joke, let's hear it!"] = {
 	m = "Smějte se za mě! Představte si, že jsem vám právě řekl nejlepší vtip na světě, poslechněte si ho!", 
 }
@@ -3114,3 +2994,125 @@ addon.data.speech["Cataloger Simone_Roar for me! Look at me and roar!"] = {
 addon.data.speech["Cataloger Simone_Let's see your best laugh! Focus on me and laugh!"] = {
 	m = "Podívejme se na váš nejlepší smích! Soustřeďte se na mě a smějte se!", 
 }
+addon.data.speech["Cataloger Simone_Eyes on me! Ready? Set? Laugh!"] = {
+	m = "Sledujte mě! Připraven? Připravit? Směj se!", 
+}
+addon.data.speech["Cataloger Simone_Let's give a big wave to the camera! Big wave, come on!"] = {
+	m = "Zamávejme na kameru! Velká vlna, no tak!", 
+}
+addon.data.speech["Cataloger Simone_Eyes on me! Now wave to your fans!"] = {
+	m = "Sledujte mě! A teď zamávej svým fanouškům!", 
+}
+addon.data.speech["Cataloger Simone_Focus on me and show me you can dance!"] = {
+	m = "Soustřeď se na mě a ukaž, že umíš tančit!", 
+}
+addon.data.speech["Cataloger Simone_Wave to the camera! Wave to it, superstar!"] = {
+	m = "Zamávejte do kamery! Zamávej jí, superhvězdo!", 
+}
+addon.data.speech["Cataloger Simone_Show me the tears! Show me you can cry on cue!"] = {
+	m = "Ukažte mi slzy! Ukaž mi, že umíš plakat na povel!", 
+}
+addon.data.speech["Cataloger Simone_Let's see some muscle! Flex for me!"] = {
+	m = "Ukažte nám svaly! Oheň pro mě!", 
+}
+addon.data.speech["Cataloger Simone_<class>! You've got a look that says you know a thing or two about style!"] = {
+	m = "<cM0>! Tvůj vzhled napovídá, že o stylu něco víš!", 
+}
+addon.data.speech["Cataloger Simone_Let's see a strong salute! Focus on me and salute!"] = {
+	m = "Uvidíme silný pozdrav! Soustřeďte se na mě a salutujte!", 
+}
+addon.data.speech["Cataloger Simone_Show me your best dance moves!"] = {
+	m = "Ukažte mi své nejlepší taneční pohyby!", 
+}
+addon.data.speech["Cataloger Simone_Let's see how you dance. Focus on me and dance up a storm!"] = {
+	m = "Podívejme se, jak tančíš. Soustřeďte se na mě a tančete jako bouře!", 
+}
+addon.data.speech["Cataloger Simone_Roar! Let me see you roar! Let that beast out!"] = {
+	m = "Roar! Ukaž mi, jak řveš! Vypusť tu bestii ven!", 
+}
+addon.data.speech["Cataloger Simone_Strike a pose! Flex your muscles!"] = {
+	m = "Zapózujte! Napněte svaly!", 
+}
+addon.data.speech["Cataloger Simone_I need to see some emotion. Cry for me!"] = {
+	m = "Potřebuji vidět nějaké emoce. Plačte za mě!", 
+}
+addon.data.speech["Cataloger Simone_Dance like nobody's watching... But make sure you dance for the camera!"] = {
+	m = "Tancuj, jako by se nikdo nedíval... Ale nezapomeňte tančit před kamerou!", 
+}
+addon.data.quest["q86705_name"] = {
+	m = "Pracujte na tom", 
+}
+addon.data.quest["q86705_description"] = {
+	m = "Zkouška stylu nám dává příležitost vypadat dobře. <cM0>. Kamera se postará o to, abychom vypadali dobře i nadále. Takže se soustřeďte na mě a můj fotoaparát, dodržujte mé pokyny a já se postarám o to, abyste vypadali fantasticky!", 
+	f = "Zkouška stylu nám dává příležitost vypadat dobře. <cF0>. Kamera se stará o to, abychom stále vypadali dobře. Takže se soustřeďte na mě a můj fotoaparát, dodržujte mé pokyny a já se postarám o to, abyste vypadali fantasticky!", 
+}
+addon.data.quest["q86705_objective"] = {
+	m = "Soustřeďte se na fotografa a postupujte podle jeho pokynů.", 
+}
+addon.data.quest["q86705_progress"] = {
+	m = "Soustřeďte se na mě a řiďte se mými pokyny.\n\nPostarám se, abys vypadala skvěle.", 
+}
+addon.data.quest["q86705_completion"] = {
+	m = "Kamera nelže, <name>.\n\nJsi stylový <cM0>.", 
+	f = "Kamera nelže, <name>.\n\nJsi jedna stylová <cF0>.", 
+}
+addon.data.speech["Cataloger Grilka_Let's give a big wave to the camera! Big wave, come on!"] = {
+	m = "Zamávejme na kameru! Velká vlna, no tak!", 
+}
+addon.data.speech["Cataloger Grilka_Demon Hunter! You've got a look that says you know a thing or two about style!"] = {
+	m = "Lovec démonů! Tvůj vzhled napovídá, že se vyznáš ve stylu!", 
+}
+addon.data.speech["Cataloger Grilka_Laugh for me! Pretend I just told you the world's best joke, let's hear it!"] = {
+	m = "Smějte se za mě! Představte si, že jsem vám právě řekl nejlepší vtip na světě, poslechněte si ho!", 
+}
+addon.data.speech["Cataloger Grilka_Eyes on me! Ready? Set? Laugh!"] = {
+	m = "Sledujte mě! Připraven? Připravit? Směj se!", 
+}
+addon.data.speech["Cataloger Grilka_I need to see some emotion. Cry for me!"] = {
+	m = "Potřebuji vidět nějaké emoce. Plačte za mě!", 
+}
+addon.data.speech["Cataloger Grilka_Focus on me and show me you can dance!"] = {
+	m = "Soustřeď se na mě a ukaž, že umíš tančit!", 
+}
+addon.data.speech["Cataloger Grilka_Dance like nobody's watching... But make sure you dance for the camera!"] = {
+	m = "Tancuj, jako by se nikdo nedíval... Ale nezapomeňte tančit před kamerou!", 
+}
+addon.data.speech["Cataloger Grilka_Show me your best salute!"] = {
+	m = "Ukaž mi svůj nejlepší pozdrav!", 
+}
+addon.data.speech["Cataloger Grilka_Let's see a strong salute! Focus on me and salute!"] = {
+	m = "Uvidíme silný pozdrav! Soustřeďte se na mě a salutujte!", 
+}
+addon.data.speech["Cataloger Grilka_Roar for me! Look at me and roar!"] = {
+	m = "Řvi za mě! Podívejte se na mě a zařvěte!", 
+}
+addon.data.speech["Cataloger Grilka_Roar! Let me see you roar! Let that beast out!"] = {
+	m = "Roar! Ukaž mi, jak řveš! Vypusť tu bestii ven!", 
+}
+addon.data.speech["Cataloger Grilka_Focus on me! Now show me your mightiest roar!"] = {
+	m = "Soustřeďte se na mě! Teď mi ukaž svůj nejsilnější řev!", 
+}
+addon.data.speech["Cataloger Grilka_Let's see your best laugh! Focus on me and laugh!"] = {
+	m = "Podívejme se na váš nejlepší smích! Soustřeďte se na mě a smějte se!", 
+}
+addon.data.speech["Cataloger Grilka_Strike a pose! Flex your muscles!"] = {
+	m = "Zapózujte! Napněte svaly!", 
+}
+addon.data.speech["Cataloger Grilka_Show me how strong you are. Flex those muscles!"] = {
+	m = "Ukaž mi, jak jsi silný. Napněte svaly!", 
+}
+addon.data.speech["Cataloger Grilka_<class>! You've got a look that says you know a thing or two about style!"] = {
+	m = "<cM0>! Tvůj vzhled napovídá, že o stylu něco víš!", 
+}
+addon.data.speech["Cataloger Grilka_Focus on me and cry. Let's see the tears!"] = {
+	m = "Soustřeďte se na mě a plačte. Uvidíme slzy!", 
+}
+addon.data.speech["Cataloger Grilka_Let's see some muscle! Flex for me!"] = {
+	m = "Ukažte nám svaly! Oheň pro mě!", 
+}
+addon.data.speech["Cataloger Grilka_Show me the tears! Show me you can cry on cue!"] = {
+	m = "Ukažte mi slzy! Ukaž mi, že umíš plakat na povel!", 
+}
+addon.data.speech["Cataloger Grilka_Death Knight! You've got a look that says you know a thing or two about style!"] = {
+	m = "Rytíř smrti! Tvůj vzhled napovídá, že o stylu něco víš!", 
+}
diff --git a/CzechQuests_Mainline.toc b/CzechQuests_Mainline.toc
index d0c867f..8cb08bd 100755
--- a/CzechQuests_Mainline.toc
+++ b/CzechQuests_Mainline.toc
@@ -24,6 +24,8 @@ Addon/Data/11.lua
 
 Addon/Data/other.lua
 
+Addon/Code/Shared.lua
+
 Addon/Code/DataApi.lua
 Addon/Code/Paragraphs.lua
 Addon/Code/FontUtils.lua
diff --git a/CzechQuests_Vanilla.toc b/CzechQuests_Vanilla.toc
index fb28e07..2f46b2f 100755
--- a/CzechQuests_Vanilla.toc
+++ b/CzechQuests_Vanilla.toc
@@ -33,6 +33,8 @@ Addon/Data/22.lua
 
 Addon/Data/other.lua
 
+Addon/Code/Shared.lua
+
 Addon/Code/DataApi.lua
 Addon/Code/Paragraphs.lua
 Addon/Code/FontUtils.lua