Refactor and expand Translation and Quest management.
This commit is contained in:
parent
4660216504
commit
5f21775771
20 changed files with 2546 additions and 9969 deletions
126
Addon/Code/DataApi.lua
Executable file
126
Addon/Code/DataApi.lua
Executable file
|
@ -0,0 +1,126 @@
|
|||
local QuestTextMethod = {
|
||||
Description = GetQuestText,
|
||||
Objective = GetObjectiveText,
|
||||
};
|
||||
|
||||
local function GetQuestText(method)
|
||||
local text = QuestTextMethod[method]();
|
||||
if text then
|
||||
return text
|
||||
else
|
||||
return ""
|
||||
end
|
||||
end
|
||||
|
||||
local function GetQuestLogQuestIndex(questID)
|
||||
local numEntries = C_QuestLog.GetNumQuestLogEntries()
|
||||
for questLogIndex = 1, numEntries do
|
||||
local info = C_QuestLog.GetInfo(questLogIndex)
|
||||
if info and info.questID == questID then
|
||||
return questLogIndex
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
||||
|
||||
local function ReplacePlaceholders(text)
|
||||
if text == nil then
|
||||
return text
|
||||
end
|
||||
|
||||
local playerName = UnitName("player")
|
||||
local _, playerClass = UnitClass("player")
|
||||
local _, playerRace = UnitRace("player")
|
||||
|
||||
local class = CzechQuestsAddon:GetData("class", playerClass);
|
||||
local race = CzechQuestsAddon:GetData("race", playerRace);
|
||||
|
||||
local formatted = text;
|
||||
formatted = string.gsub(formatted, '<name>', playerName);
|
||||
|
||||
formatted = string.gsub(formatted, '<cF0>', class.f0);
|
||||
formatted = string.gsub(formatted, '<cF1>', class.f1);
|
||||
formatted = string.gsub(formatted, '<cF2>', class.f2);
|
||||
formatted = string.gsub(formatted, '<cF3>', class.f3);
|
||||
formatted = string.gsub(formatted, '<cF4>', class.f4);
|
||||
formatted = string.gsub(formatted, '<cF5>', class.f5);
|
||||
|
||||
formatted = string.gsub(formatted, '<cM0>', class.m0);
|
||||
formatted = string.gsub(formatted, '<cM1>', class.m1);
|
||||
formatted = string.gsub(formatted, '<cM2>', class.m2);
|
||||
formatted = string.gsub(formatted, '<cM3>', class.m3);
|
||||
formatted = string.gsub(formatted, '<cM4>', class.m4);
|
||||
|
||||
formatted = string.gsub(formatted, '<cP0>', class.p0);
|
||||
formatted = string.gsub(formatted, '<cP1>', class.p1);
|
||||
formatted = string.gsub(formatted, '<cP3>', class.m3);
|
||||
|
||||
formatted = string.gsub(formatted, '<rF0>', race.f0);
|
||||
formatted = string.gsub(formatted, '<rF1>', race.f1);
|
||||
formatted = string.gsub(formatted, '<rF2>', race.f2);
|
||||
formatted = string.gsub(formatted, '<rF3>', race.f3);
|
||||
formatted = string.gsub(formatted, '<rF4>', race.f4);
|
||||
formatted = string.gsub(formatted, '<rF5>', race.f5);
|
||||
|
||||
formatted = string.gsub(formatted, '<rM0>', race.m0);
|
||||
formatted = string.gsub(formatted, '<rM1>', race.m1);
|
||||
formatted = string.gsub(formatted, '<rM2>', race.m2);
|
||||
formatted = string.gsub(formatted, '<rM3>', race.m3);
|
||||
formatted = string.gsub(formatted, '<rM4>', race.m4);
|
||||
|
||||
formatted = string.gsub(formatted, '<rP0>', race.p0);
|
||||
formatted = string.gsub(formatted, '<rP1>', race.p1);
|
||||
formatted = string.gsub(formatted, '<rP3>', race.p3);
|
||||
|
||||
return formatted
|
||||
end
|
||||
|
||||
local function TransformText(text)
|
||||
return ReplacePlaceholders(text)
|
||||
end
|
||||
|
||||
local function ResolveGender(maleVersion, femaleVersion)
|
||||
local gender = UnitSex("player")
|
||||
if gender == 2 then
|
||||
return TransformText(maleVersion)
|
||||
else
|
||||
return femaleVersion == nil and TransformText(maleVersion) or TransformText(femaleVersion)
|
||||
end
|
||||
end
|
||||
|
||||
local function GetQuest(id)
|
||||
local quest = CzechQuestsAddon.data.quest[id];
|
||||
if quest then
|
||||
local description = ""
|
||||
local objective = ""
|
||||
if QuestMapDetailsScrollFrame and QuestMapDetailsScrollFrame:IsVisible() then
|
||||
local index = GetQuestLogQuestIndex(id)
|
||||
description, objective = GetQuestLogQuestText(index)
|
||||
else
|
||||
description = GetQuestText("Description")
|
||||
objective = GetQuestText("Objective")
|
||||
end
|
||||
return {
|
||||
title = ResolveGender(quest.titleMale, quest.titleFemale),
|
||||
objective = CzechQuestsAddon:TransformIntoParagraphs(
|
||||
objective, ResolveGender(quest.objectiveMale, quest.objectiveFemale)
|
||||
),
|
||||
description = CzechQuestsAddon:TransformIntoParagraphs(
|
||||
description, ResolveGender(quest.descriptionMale, quest.descriptionFemale)
|
||||
),
|
||||
progress = ResolveGender(quest.progressMale, quest.progressFemale),
|
||||
completion = ResolveGender(quest.completionMale, quest.completionFemale),
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
function CzechQuestsAddon:GetData(key, id)
|
||||
if CzechQuestsAddon.data[key] then
|
||||
if key == "quest" then
|
||||
return GetQuest(id)
|
||||
elseif CzechQuestsAddon.data[key][id] then
|
||||
return CzechQuestsAddon.data[key][id]
|
||||
end
|
||||
end
|
||||
return nil
|
||||
end
|
144
Addon/Code/Quest.lua
Executable file
144
Addon/Code/Quest.lua
Executable file
|
@ -0,0 +1,144 @@
|
|||
function CzechQuestsAddon:ShowQuestTranslation(event)
|
||||
-- Hide frame, may contain old texts
|
||||
CzechQuestsAddon.translationQuestFrame:Hide()
|
||||
|
||||
-- Classic Era has QuestLogFrame
|
||||
if QuestLogFrame then
|
||||
if QuestLogFrame:IsShown() then
|
||||
local questIndex = GetQuestLogSelection()
|
||||
if questIndex > 0 then
|
||||
local questId = select(8, GetQuestLogTitle(questIndex))
|
||||
local questData = CzechQuestsAddon:GetData("quest", questId)
|
||||
if questData then
|
||||
local suffix = CzechQuestsAddon_Store.config.DEBUG_MODE and " (" .. questId .. ")" or ""
|
||||
local questTitle = questData.title .. suffix
|
||||
CzechQuestsAddon:ShowTranslationQuestFrame(
|
||||
questTitle,
|
||||
questData.objective,
|
||||
"Popis",
|
||||
questData.description,
|
||||
QuestLogFrame,
|
||||
-14,
|
||||
0
|
||||
)
|
||||
CzechQuestsAddon.translationQuestFrame:Show()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- Retail has QuestMapDetailsScrollFrame
|
||||
if QuestMapDetailsScrollFrame then
|
||||
if QuestMapDetailsScrollFrame:IsVisible() then
|
||||
local questId = C_QuestLog.GetSelectedQuest()
|
||||
local hasModel = QuestModelScene:IsVisible()
|
||||
local questData = CzechQuestsAddon:GetData("quest", questId)
|
||||
if questData then
|
||||
local suffix = CzechQuestsAddon_Store.config.DEBUG_MODE and " (" .. questId .. ")" or ""
|
||||
local questTitle = questData.title .. suffix
|
||||
local xOffset = hasModel and 210 or 50
|
||||
CzechQuestsAddon:ShowTranslationQuestFrame(
|
||||
questTitle,
|
||||
questData.objective,
|
||||
"Popis",
|
||||
questData.description,
|
||||
QuestMapFrame,
|
||||
0,
|
||||
xOffset
|
||||
)
|
||||
CzechQuestsAddon.translationQuestFrame:Show()
|
||||
else
|
||||
CzechQuestsAddon.translationQuestFrame:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- If quest is right from NPC, this work for both wow version
|
||||
if event ~= nil then
|
||||
local questId = GetQuestID()
|
||||
local hasModel = QuestModelScene and QuestModelScene:IsShown() or false
|
||||
if questId then
|
||||
local questData = CzechQuestsAddon:GetData("quest", questId)
|
||||
if questData then
|
||||
CzechQuestsAddon.translationQuestFrame:Show()
|
||||
local suffix = CzechQuestsAddon_Store.config.DEBUG_MODE and " (" .. questId .. ")" or ""
|
||||
local questTitle = questData.title .. suffix
|
||||
local xOffset = hasModel and 210 or 0
|
||||
if event == "QUEST_PROGRESS" then
|
||||
CzechQuestsAddon:ShowTranslationQuestFrame(
|
||||
questTitle,
|
||||
questData.progress,
|
||||
"",
|
||||
"",
|
||||
QuestFrame,
|
||||
-20,
|
||||
xOffset
|
||||
)
|
||||
elseif event == "QUEST_COMPLETE" then
|
||||
CzechQuestsAddon:ShowTranslationQuestFrame(
|
||||
questTitle,
|
||||
questData.completion,
|
||||
"",
|
||||
"",
|
||||
QuestFrame,
|
||||
-20,
|
||||
xOffset
|
||||
)
|
||||
elseif event == "QUEST_DETAIL" then
|
||||
CzechQuestsAddon:ShowTranslationQuestFrame(
|
||||
questTitle,
|
||||
questData.description,
|
||||
"Cíl úkolu",
|
||||
questData.objective,
|
||||
QuestFrame,
|
||||
-20,
|
||||
xOffset
|
||||
)
|
||||
else
|
||||
CzechQuestsAddon.translationQuestFrame:Hide()
|
||||
end
|
||||
else
|
||||
CzechQuestsAddon.translationQuestFrame:Hide()
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function CzechQuestsAddon:ShowQuestItemTranslation()
|
||||
-- Hide frame, may contain old texts
|
||||
CzechQuestsAddon.translationQuestFrame:Hide()
|
||||
|
||||
-- should work for both wow version
|
||||
if ItemTextFrame:IsShown() then
|
||||
local item = {}
|
||||
|
||||
-- get item name
|
||||
local itemName = ItemTextGetItem();
|
||||
local titlePage = CzechQuestsAddon:GetData("item", itemName)
|
||||
|
||||
-- check if item is translated
|
||||
if titlePage ~= nil then
|
||||
item.name = titlePage.titleMale;
|
||||
local pageNum = ItemTextGetPage()
|
||||
local contentPage = CzechQuestsAddon:GetData("item", itemName .. '__' .. pageNum)
|
||||
|
||||
-- check if item is translated
|
||||
if contentPage ~= nil then
|
||||
item.content = contentPage.text
|
||||
if item.name ~= nil and item.content ~= nil then
|
||||
CzechQuestsAddon:ShowTranslationQuestFrame(
|
||||
item.name,
|
||||
item.content,
|
||||
"",
|
||||
"",
|
||||
ItemTextFrame,
|
||||
-20,
|
||||
0
|
||||
)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
CzechQuestsAddon.translationQuestFrame:Show()
|
||||
end
|
||||
end
|
51
Addon/Code/QuestParser.lua
Executable file
51
Addon/Code/QuestParser.lua
Executable file
|
@ -0,0 +1,51 @@
|
|||
local function SplitParagraphs(text)
|
||||
local paragraphs = {}
|
||||
for paragraph in string.gmatch(text, "([^\n]+)") do
|
||||
table.insert(paragraphs, paragraph)
|
||||
end
|
||||
return paragraphs
|
||||
end
|
||||
|
||||
local function SplitSentences(paragraph)
|
||||
local sentences = {}
|
||||
for sentence in string.gmatch(paragraph, "([^%.%?!]+[%.%?!]?)[%s]*") do
|
||||
local trimmed = sentence:gsub("^%s+", ""):gsub("%s+$", "")
|
||||
if #trimmed > 0 then
|
||||
table.insert(sentences, trimmed)
|
||||
end
|
||||
end
|
||||
return sentences
|
||||
end
|
||||
|
||||
function CzechQuestsAddon:TransformIntoParagraphs(original_text, translation_text)
|
||||
if original_text == "" or original_text == nil then
|
||||
return translation_text
|
||||
end
|
||||
|
||||
local original_paragraphs = SplitParagraphs(original_text)
|
||||
local translation_paragraphs = {}
|
||||
|
||||
local translation_sentences = SplitSentences(translation_text)
|
||||
local counter = 1
|
||||
|
||||
for _, orig_paragraph in ipairs(original_paragraphs) do
|
||||
local orig_sentences = SplitSentences(orig_paragraph)
|
||||
|
||||
local paragraph_sentence_count = #orig_sentences
|
||||
local collected = {}
|
||||
|
||||
for i = 1, paragraph_sentence_count do
|
||||
if translation_sentences[counter] then
|
||||
table.insert(collected, translation_sentences[counter])
|
||||
counter = counter + 1
|
||||
else
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
table.insert(translation_paragraphs, table.concat(collected, " "))
|
||||
end
|
||||
|
||||
local final_text = table.concat(translation_paragraphs, "\n")
|
||||
return final_text
|
||||
end
|
67
Addon/Code/Speeches.lua
Executable file
67
Addon/Code/Speeches.lua
Executable file
|
@ -0,0 +1,67 @@
|
|||
local messages = {}
|
||||
local function ReflowMessages()
|
||||
local offsetY = 5
|
||||
for i = #messages, 1, -1 do
|
||||
local msg = messages[i]
|
||||
msg:ClearAllPoints()
|
||||
msg:SetPoint(
|
||||
"BOTTOMLEFT",
|
||||
CzechQuestsAddon.translationSpeechFrame.content,
|
||||
"BOTTOMLEFT",
|
||||
10,
|
||||
offsetY
|
||||
)
|
||||
offsetY = offsetY + msg:GetHeight()
|
||||
end
|
||||
|
||||
CzechQuestsAddon.translationSpeechFrame.content:SetHeight(offsetY + 5)
|
||||
end
|
||||
|
||||
local function RemoveMessage(frame)
|
||||
local emptyMessages = true
|
||||
for i, fs in ipairs(messages) do
|
||||
emptyMessages = false
|
||||
if fs == frame then
|
||||
local fadeAnimationGroup = fs:CreateAnimationGroup()
|
||||
local fadeOut = fadeAnimationGroup:CreateAnimation("Alpha")
|
||||
fadeOut:SetFromAlpha(1)
|
||||
fadeOut:SetToAlpha(0)
|
||||
fadeOut:SetDuration(0.2)
|
||||
fadeOut:SetStartDelay(0)
|
||||
|
||||
fadeAnimationGroup:SetScript("OnFinished", function()
|
||||
table.remove(messages, i)
|
||||
fs:Hide()
|
||||
ReflowMessages()
|
||||
end)
|
||||
|
||||
fs:Show()
|
||||
fadeAnimationGroup:Play()
|
||||
|
||||
break
|
||||
end
|
||||
end
|
||||
|
||||
if emptyMessages then
|
||||
CzechQuestsAddon.translationSpeechFrame:Hide()
|
||||
end
|
||||
end
|
||||
|
||||
local function AddMessage(sender, message)
|
||||
local formattedText = string.format("|cffffd200%s|r\n%s", sender, message)
|
||||
local frame = CzechQuestsAddon:CreateTranslationSpeechFrameMessage(formattedText)
|
||||
|
||||
CzechQuestsAddon.translationSpeechFrame:Show()
|
||||
|
||||
table.insert(messages, frame)
|
||||
ReflowMessages()
|
||||
|
||||
C_Timer.After(30, function()
|
||||
RemoveMessage(frame)
|
||||
end)
|
||||
end
|
||||
|
||||
function CzechQuestsAddon:ShowSpeechTranslation(sender, message)
|
||||
local text = CzechQuestsAddon:GetData("speech", message) or message
|
||||
AddMessage(sender, text)
|
||||
end
|
Loading…
Add table
Add a link
Reference in a new issue