Refactor encounter handling and placeholder logic
All checks were successful
forgejo/Czech Quests/addon/pipeline/head This commit looks good

This commit is contained in:
Roman Jaroš 2025-04-18 14:03:11 +02:00
parent c2eda51d7d
commit a32b698ebf
10 changed files with 278 additions and 421 deletions

View file

@ -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
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)

View file

@ -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

View file

@ -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

43
Addon/Code/Shared.lua Normal file
View file

@ -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

View file

@ -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

View file

@ -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.",
}

View file

@ -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 = {},
},
},
},
}

View file

@ -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íš!",
}

View file

@ -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

View file

@ -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