alte Version
Aufgrund zwei kleiner Fehler (rot markiert) funktioniert die Erstellung zweisprachiger Quests nicht. Der Block am Anfang ist nutzlos und kann komplett raus. WikiQSB.GameLanguage gibt es nicht, muss durch Network.GetDesiredLanguage() ersetzt werden. Zu guter letzt fehlt ein Unterstrich vor field.Code:Logic.ExecuteInLuaLocalState([[local MessageText = XGUIEng.GetStringTableText("Feedback_TextLines/TextLine_GenericUnreachable") if MessageText == "Nicht erreichbar!" then GUI.SendScriptCommand('GameInstallationLanguage = "de" ') elseif MessageText == "Unreachable!" then GUI.SendScriptCommand('GameInstallationLanguage = "en" ') else GUI.SendScriptCommand('GameInstallationLanguage = "en"' ) end ]]) function MachQuests(_Quests,_GraphViz)-------------------------Alle vom Start weg aktiven Quests erstellen if not WikiQSB.GameLanguage then StartSimpleJobEx(function(_Q, _V) if WikiQSB.GameLanguage then MachQuests(_Q,_V) return true end; end, _Quests, _GraphViz) return end local Result = _GraphViz and {} local MapName = Framework.GetCurrentMapName() if _GraphViz then table.insert( Result, 'Von hier an ausschneiden==> \r\ndigraph G { graph [ fontname = "Helvetica-Oblique", fontsize = 30, label = "'..MapName.. '" ]\r\nnode [ fontname = "Courier-Bold" shape = "box" ]' ) end for _, QuestTable in ipairs(_Quests) do MachQuest(QuestTable, Result) end if _GraphViz then table.insert( Result, "}\r\n<=====Bis hier auschneiden") Framework.WriteToLog(table.concat( Result, "\r\n" )) end end function MachQuest(_MQT, Result)-------------------Einzelne Quest erstellen _MQT.QuestGeber = _MQT.QuestGeber or _MQT.Sender or 1 _MQT.QuestEmpfaenger = _MQT.QuestEmpfaenger or _MQT.Receiver or 1 _MQT.ZeitLimit = _MQT.ZeitLimit or _MQT.Time or 0 _MQT.EndeFunktion = _MQT.EndeFunktion or _MQT.EndFunction _MQT.LoopFunktion = _MQT.LoopFunktion or _MQT.LoopFunction _MQT.VersteckteQuest = _MQT.VersteckteQuest or _MQT.Hidden _MQT.Beschreibung = Umlaute(_MQT.Beschreibung or _MQT.Description) _MQT.ErfolgsNachricht = Umlaute(_MQT.ErfolgsNachricht or _MQT.SuccessMessage) _MQT.NiederlageNachricht = Umlaute(_MQT.NiederlageNachricht or _MQT.FailureMessage) _MQT.StartNachricht = Umlaute(_MQT.StartNachricht or _MQT.StartMessage) _MQT.VersteckeEndNachricht = _MQT.VersteckeEndNachricht or _MQT.HideEndMessage -- 1. Block Debug Checks if type(_MQT.Name) ~= "string" then return Logic.DEBUG_AddNote("DEBUG: Kein QuestName vergeben") elseif type(_MQT.QuestGeber) ~= "number" or _MQT.QuestGeber < 1 or _MQT.QuestGeber > 8 then return Logic.DEBUG_AddNote("DEBUG: QuestGeber in ".._MQT.Name.." hat falschen Wert") elseif type(_MQT.QuestEmpfaenger) ~= "number" or _MQT.QuestEmpfaenger < 1 or _MQT.QuestEmpfaenger > 8 then return Logic.DEBUG_AddNote("DEBUG: QuestEmpfaenger in ".._MQT.Name.." hat falschen Wert") elseif type(_MQT.ZeitLimit) ~= "number" or _MQT.ZeitLimit < 0 then return Logic.DEBUG_AddNote("DEBUG: ZeitLimit in ".._MQT.Name.." hat falschen Wert") end -- Behavior Table Building local BehaviourType, BehaviourFound = nil, nil local bTable = {Trigger = {}, Goal = {}, Reward = {}, Reprisal = {}} for k, v in ipairs(_MQT) do v = ( type(v) == "table" and type(v.Name) == "string" and type(v.Description) == "table" and v.Name ) or v if type(v) == "string" then for Key, Behavior in pairs(g_QuestBehaviorTypes) do if (Behavior.Name == v) then for beha, behaTable in pairs(bTable) do local BehaviorTemplate = GetBehaviorTemplateByName(v) if BehaviorTemplate["Get"..beha.."Table"] ~= nil then behaTable[#behaTable+1] = {v} BehaviourType = beha BehaviourFound = true break end end end end end if (not BehaviourFound) and BehaviourType then local b = bTable[BehaviourType] table.insert(b[#b], v) elseif not BehaviourFound then Logic.DEBUG_AddNote( "Falsche oder fehlende Verhaltensangabe in Quest ".._MQT.Name);return end BehaviourFound = false end -- 2. Block Debug Checks local gLanguage = WikiQSB.GameLanguage local debug1 = {"StartNachricht", "ErfolgsNachricht", "NiederlageNachricht", "Beschreibung" } local function cF(_field) if not field then Logic.DEBUG_AddNote("Translation missing in ".._MQT.Name) else return _field end; end for _, field in ipairs(debug1) do if type(_MQT[field]) == "table" then for Language, _ in pairs(_MQT[field]) do if type(Language) == "string" then if gLanguage == "de" or gLanguage == "en" then _MQT[field] = cF(_MQT[field][gLanguage]); break else _MQT[field] = cF(_MQT[field].en); break end elseif gLanguage == "de" then _MQT[field] = _MQT[field][1]; break elseif gLanguage == "en" then _MQT[field] = cF(_MQT[field][2]); break else _MQT[field] = cF(_MQT[field][2]); break end end end if _MQT[field] and type(_MQT[field]) ~= "string" then return Logic.DEBUG_AddNote("DEBUG: "..field.." in ".._MQT.Name.." ist kein String") end end if _MQT.EndeFunktion and type(_MQT.EndeFunktion) ~= "function" then return Logic.DEBUG_AddNote("DEBUG: Angegebene EndeFunktion in ".._MQT.Name.." existiert nicht") elseif _MQT.LoopFunktion and type(_MQT.LoopFunktion) ~= "function" then return Logic.DEBUG_AddNote("DEBUG: Angegebene LoopFunktion in ".._MQT.Name.." existiert nicht") elseif (#bTable.Goal == 0) or (#bTable.Trigger == 0) then return Logic.DEBUG_AddNote("DEBUG: Entweder fehlt ein Trigger oder ein Goal in ".._MQT.Name) end -------------------------------------Graphviz Ausgabe--------------------------------------------------------- if Result then local ArrowColorTable = {Succeed = 'color="#00ff00"', Fail = 'color="#ff0000"', Interrupt = 'color="#999999"', Default = 'color="#0000ff"' } local function EscapeString( _String ) return string.match( string.format( "%q", tostring(_String) ), '^"(.*)"$' ) or "nil" end local function LimitString( _String, _Limit ) assert( _String ) assert( _Limit > 3 ) if string.len( _String ) <= _Limit then return _String else return string.sub( _String, 1, _Limit - 3 ) .. "..." end end local fontColor = "" local BehaviorNames = {} local bTableCounter = 0 for _, behaType in pairs(bTable) do bTableCounter = bTableCounter + 1 for _, behavior in ipairs(behaType) do local BehaviorName = behavior[1] local BehaviorTemplate = GetBehaviorTemplateByName(BehaviorName) local FoundQuestNames = {} local BehaviorNameParameters = {} -- Set arrow color based on the behavior name (triggers on/causes quest success/failure) local ArrowColor = (string.find( BehaviorName, "Succe" ) and ArrowColorTable.Succeed) or (string.find( BehaviorName, "Fail" )and ArrowColorTable.Fail) or (string.find( BehaviorName, "Interrupt" )and ArrowColorTable.Interrupt) or ArrowColorTable.Default fontColor = (string.find( BehaviorName, "Wait" ) and 'fontcolor="red"') or "" -- Type of relation local BDependsOn = ( BehaviorTemplate.GetTriggerTable and "Triggers" ) or ( BehaviorTemplate.GetGoalTable and "Goals" ) -- Find all parameters that use a quest name for j = 2, #behavior do if GameCallback_QuestSytemBehavior_GetParameterType( "BB", BehaviorName, j-1 ) == ParameterType.QuestName then FoundQuestNames[behavior[j]] = true -- GraphViz relation definition table.insert( Result, (BDependsOn and string.format( '%q -> %q [%s]', behavior[j], _MQT.Name, ArrowColor )) or string.format( '%q -> %q [%s, arrowhead = "odot", arrowtail = "invempty" style="dashed"]', _MQT.Name, behavior[j], ArrowColor ) ) end table.insert( BehaviorNameParameters, behavior[j] ) end -- Entry for BehaviorName + Parameters table.insert( BehaviorNames, EscapeString((#BehaviorNameParameters > 0 and string.format( "%s (%s)", BehaviorName, table.concat(BehaviorNameParameters, ", ") ) ) or BehaviorName)) end -- Graphviz definition of the "quest bubbles" if bTableCounter == 4 then local Desc = EscapeString(LimitString(_MQT.Beschreibung or "", 40)) Desc = (Desc ~= "" and "\\nDesc: " .. Desc) or "" table.sort(BehaviorNames ) table.insert( Result, string.format( '%q [ %s label = "Name: %s%s%s\\n--- Params %d -> %d ---\\n%s" %s%s]', _MQT.Name, fontColor, EscapeString(_MQT.Name), Desc, _MQT.ZeitLimit ~= 0 and ('\\nTime: ' .. _MQT.ZeitLimit) or '', _MQT.QuestGeber, _MQT.QuestEmpfaenger, table.concat(BehaviorNames, "\\n"), _MQT.ZeitLimit ~= 0 and 'shape="octagon" ' or '', _MQT.VersteckteQuest and 'style="filled" fillcolor="#dddddd" ' or '' ) ) end end end ------------------------------------GraphVizAusgabeEnde-------------------------------------------------- local beTable = {Trigger = {}, Goal = {}, Reward = {}, Reprisal = {}} for beTypeName, bType in pairs(bTable) do local beType = beTable[beTypeName] for i = 1, #bType do local BehaviorTemplate = GetBehaviorTemplateByName(bType[i][1]) local NewBehavior = {} Table_Copy(NewBehavior, BehaviorTemplate) for k, v in pairs(bType[i]) do if k > 1 then assert(NewBehavior.AddParameter, "MachQuests: Wrong Behavior name in ".._MQT.Name) NewBehavior:AddParameter(k-2, v) end end beType[#beType + 1] = NewBehavior["Get" .. beTypeName .. "Table"](NewBehavior) if beTypeName == "Goal" then beType[#beType].Context = NewBehavior beType[#beType].FuncOverrideIcon = NewBehavior.GetIcon beType[#beType].FuncOverrideMsgKey = NewBehavior.GetMsgKey end end end local ShowEndMessage = (((_MQT.ErfolgsNachricht or _MQT.NiederlageNachricht) or ( _MQT.VersteckeEndNachricht == false)) and true) or nil -- quest ID local QuestID = QuestTemplate:New( _MQT.Name, _MQT.QuestGeber, _MQT.QuestEmpfaenger, beTable.Goal, beTable.Trigger, _MQT.ZeitLimit, beTable.Reward, beTable.Reprisal, _MQT.EndeFunktion, _MQT.LoopFunktion, (not _MQT.VersteckteQuest), ShowEndMessage, _MQT.Beschreibung, _MQT.StartNachricht, _MQT.ErfolgsNachricht, _MQT.NiederlageNachricht ) g_QuestNameToID[_MQT.Name] = QuestID if _MQT.VersteckeEndNachricht then Quests[QuestID].ShowEndMessage = false end return QuestID end
korrigierte Version
Code:function MachQuests(_Quests,_GraphViz)-------------------------Alle vom Start weg aktiven Quests erstellen if not WikiQSB.GameLanguage then StartSimpleJobEx(function(_Q, _V) if WikiQSB.GameLanguage then MachQuests(_Q,_V) return true end; end, _Quests, _GraphViz) return end local Result = _GraphViz and {} local MapName = Framework.GetCurrentMapName() if _GraphViz then table.insert( Result, 'Von hier an ausschneiden==> \r\ndigraph G { graph [ fontname = "Helvetica-Oblique", fontsize = 30, label = "'..MapName.. '" ]\r\nnode [ fontname = "Courier-Bold" shape = "box" ]' ) end for _, QuestTable in ipairs(_Quests) do MachQuest(QuestTable, Result) end if _GraphViz then table.insert( Result, "}\r\n<=====Bis hier auschneiden") Framework.WriteToLog(table.concat( Result, "\r\n" )) end end function MachQuest(_MQT, Result)-------------------Einzelne Quest erstellen _MQT.QuestGeber = _MQT.QuestGeber or _MQT.Sender or 1 _MQT.QuestEmpfaenger = _MQT.QuestEmpfaenger or _MQT.Receiver or 1 _MQT.ZeitLimit = _MQT.ZeitLimit or _MQT.Time or 0 _MQT.EndeFunktion = _MQT.EndeFunktion or _MQT.EndFunction _MQT.LoopFunktion = _MQT.LoopFunktion or _MQT.LoopFunction _MQT.VersteckteQuest = _MQT.VersteckteQuest or _MQT.Hidden _MQT.Beschreibung = Umlaute(_MQT.Beschreibung or _MQT.Description) _MQT.ErfolgsNachricht = Umlaute(_MQT.ErfolgsNachricht or _MQT.SuccessMessage) _MQT.NiederlageNachricht = Umlaute(_MQT.NiederlageNachricht or _MQT.FailureMessage) _MQT.StartNachricht = Umlaute(_MQT.StartNachricht or _MQT.StartMessage) _MQT.VersteckeEndNachricht = _MQT.VersteckeEndNachricht or _MQT.HideEndMessage -- 1. Block Debug Checks if type(_MQT.Name) ~= "string" then return Logic.DEBUG_AddNote("DEBUG: Kein QuestName vergeben") elseif type(_MQT.QuestGeber) ~= "number" or _MQT.QuestGeber < 1 or _MQT.QuestGeber > 8 then return Logic.DEBUG_AddNote("DEBUG: QuestGeber in ".._MQT.Name.." hat falschen Wert") elseif type(_MQT.QuestEmpfaenger) ~= "number" or _MQT.QuestEmpfaenger < 1 or _MQT.QuestEmpfaenger > 8 then return Logic.DEBUG_AddNote("DEBUG: QuestEmpfaenger in ".._MQT.Name.." hat falschen Wert") elseif type(_MQT.ZeitLimit) ~= "number" or _MQT.ZeitLimit < 0 then return Logic.DEBUG_AddNote("DEBUG: ZeitLimit in ".._MQT.Name.." hat falschen Wert") end -- Behavior Table Building local BehaviourType, BehaviourFound = nil, nil local bTable = {Trigger = {}, Goal = {}, Reward = {}, Reprisal = {}} for k, v in ipairs(_MQT) do v = ( type(v) == "table" and type(v.Name) == "string" and type(v.Description) == "table" and v.Name ) or v if type(v) == "string" then for Key, Behavior in pairs(g_QuestBehaviorTypes) do if (Behavior.Name == v) then for beha, behaTable in pairs(bTable) do local BehaviorTemplate = GetBehaviorTemplateByName(v) if BehaviorTemplate["Get"..beha.."Table"] ~= nil then behaTable[#behaTable+1] = {v} BehaviourType = beha BehaviourFound = true break end end end end end if (not BehaviourFound) and BehaviourType then local b = bTable[BehaviourType] table.insert(b[#b], v) elseif not BehaviourFound then Logic.DEBUG_AddNote( "Falsche oder fehlende Verhaltensangabe in Quest ".._MQT.Name);return end BehaviourFound = false end -- 2. Block Debug Checks local gLanguage = Network.GetDesiredLanguage() local debug1 = {"StartNachricht", "ErfolgsNachricht", "NiederlageNachricht", "Beschreibung" } local function cF(_field) if not _field then Logic.DEBUG_AddNote("Translation missing in ".._MQT.Name) else return _field end; end for _, field in ipairs(debug1) do if type(_MQT[field]) == "table" then for Language, _ in pairs(_MQT[field]) do if type(Language) == "string" then if gLanguage == "de" or gLanguage == "en" then _MQT[field] = cF(_MQT[field][gLanguage]); break else _MQT[field] = cF(_MQT[field].en); break end elseif gLanguage == "de" then _MQT[field] = _MQT[field][1]; break elseif gLanguage == "en" then _MQT[field] = cF(_MQT[field][2]); break else _MQT[field] = cF(_MQT[field][2]); break end end end if _MQT[field] and type(_MQT[field]) ~= "string" then return Logic.DEBUG_AddNote("DEBUG: "..field.." in ".._MQT.Name.." ist kein String") end end if _MQT.EndeFunktion and type(_MQT.EndeFunktion) ~= "function" then return Logic.DEBUG_AddNote("DEBUG: Angegebene EndeFunktion in ".._MQT.Name.." existiert nicht") elseif _MQT.LoopFunktion and type(_MQT.LoopFunktion) ~= "function" then return Logic.DEBUG_AddNote("DEBUG: Angegebene LoopFunktion in ".._MQT.Name.." existiert nicht") elseif (#bTable.Goal == 0) or (#bTable.Trigger == 0) then return Logic.DEBUG_AddNote("DEBUG: Entweder fehlt ein Trigger oder ein Goal in ".._MQT.Name) end -------------------------------------Graphviz Ausgabe--------------------------------------------------------- if Result then local ArrowColorTable = {Succeed = 'color="#00ff00"', Fail = 'color="#ff0000"', Interrupt = 'color="#999999"', Default = 'color="#0000ff"' } local function EscapeString( _String ) return string.match( string.format( "%q", tostring(_String) ), '^"(.*)"$' ) or "nil" end local function LimitString( _String, _Limit ) assert( _String ) assert( _Limit > 3 ) if string.len( _String ) <= _Limit then return _String else return string.sub( _String, 1, _Limit - 3 ) .. "..." end end local fontColor = "" local BehaviorNames = {} local bTableCounter = 0 for _, behaType in pairs(bTable) do bTableCounter = bTableCounter + 1 for _, behavior in ipairs(behaType) do local BehaviorName = behavior[1] local BehaviorTemplate = GetBehaviorTemplateByName(BehaviorName) local FoundQuestNames = {} local BehaviorNameParameters = {} -- Set arrow color based on the behavior name (triggers on/causes quest success/failure) local ArrowColor = (string.find( BehaviorName, "Succe" ) and ArrowColorTable.Succeed) or (string.find( BehaviorName, "Fail" )and ArrowColorTable.Fail) or (string.find( BehaviorName, "Interrupt" )and ArrowColorTable.Interrupt) or ArrowColorTable.Default fontColor = (string.find( BehaviorName, "Wait" ) and 'fontcolor="red"') or "" -- Type of relation local BDependsOn = ( BehaviorTemplate.GetTriggerTable and "Triggers" ) or ( BehaviorTemplate.GetGoalTable and "Goals" ) -- Find all parameters that use a quest name for j = 2, #behavior do if GameCallback_QuestSytemBehavior_GetParameterType( "BB", BehaviorName, j-1 ) == ParameterType.QuestName then FoundQuestNames[behavior[j]] = true -- GraphViz relation definition table.insert( Result, (BDependsOn and string.format( '%q -> %q [%s]', behavior[j], _MQT.Name, ArrowColor )) or string.format( '%q -> %q [%s, arrowhead = "odot", arrowtail = "invempty" style="dashed"]', _MQT.Name, behavior[j], ArrowColor ) ) end table.insert( BehaviorNameParameters, behavior[j] ) end -- Entry for BehaviorName + Parameters table.insert( BehaviorNames, EscapeString((#BehaviorNameParameters > 0 and string.format( "%s (%s)", BehaviorName, table.concat(BehaviorNameParameters, ", ") ) ) or BehaviorName)) end -- Graphviz definition of the "quest bubbles" if bTableCounter == 4 then local Desc = EscapeString(LimitString(_MQT.Beschreibung or "", 40)) Desc = (Desc ~= "" and "\\nDesc: " .. Desc) or "" table.sort(BehaviorNames ) table.insert( Result, string.format( '%q [ %s label = "Name: %s%s%s\\n--- Params %d -> %d ---\\n%s" %s%s]', _MQT.Name, fontColor, EscapeString(_MQT.Name), Desc, _MQT.ZeitLimit ~= 0 and ('\\nTime: ' .. _MQT.ZeitLimit) or '', _MQT.QuestGeber, _MQT.QuestEmpfaenger, table.concat(BehaviorNames, "\\n"), _MQT.ZeitLimit ~= 0 and 'shape="octagon" ' or '', _MQT.VersteckteQuest and 'style="filled" fillcolor="#dddddd" ' or '' ) ) end end end ------------------------------------GraphVizAusgabeEnde-------------------------------------------------- local beTable = {Trigger = {}, Goal = {}, Reward = {}, Reprisal = {}} for beTypeName, bType in pairs(bTable) do local beType = beTable[beTypeName] for i = 1, #bType do local BehaviorTemplate = GetBehaviorTemplateByName(bType[i][1]) local NewBehavior = {} Table_Copy(NewBehavior, BehaviorTemplate) for k, v in pairs(bType[i]) do if k > 1 then assert(NewBehavior.AddParameter, "MachQuests: Wrong Behavior name in ".._MQT.Name) NewBehavior:AddParameter(k-2, v) end end beType[#beType + 1] = NewBehavior["Get" .. beTypeName .. "Table"](NewBehavior) if beTypeName == "Goal" then beType[#beType].Context = NewBehavior beType[#beType].FuncOverrideIcon = NewBehavior.GetIcon beType[#beType].FuncOverrideMsgKey = NewBehavior.GetMsgKey end end end local ShowEndMessage = (((_MQT.ErfolgsNachricht or _MQT.NiederlageNachricht) or ( _MQT.VersteckeEndNachricht == false)) and true) or nil -- quest ID local QuestID = QuestTemplate:New( _MQT.Name, _MQT.QuestGeber, _MQT.QuestEmpfaenger, beTable.Goal, beTable.Trigger, _MQT.ZeitLimit, beTable.Reward, beTable.Reprisal, _MQT.EndeFunktion, _MQT.LoopFunktion, (not _MQT.VersteckteQuest), ShowEndMessage, _MQT.Beschreibung, _MQT.StartNachricht, _MQT.ErfolgsNachricht, _MQT.NiederlageNachricht ) g_QuestNameToID[_MQT.Name] = QuestID if _MQT.VersteckeEndNachricht then Quests[QuestID].ShowEndMessage = false end return QuestID end





LinkBack URL
Über LinkBacks
Zitieren
Lesezeichen