Uranor\\
Über Briefings mit mehrfacher Auswahlmöglichkeit ( Multiple Choice ), ( briefings_mit_mehrfacher_auswahlmoeglichkeit ) werden 2 cp-Seiten (cp = ChoicePage) für die Erfassung der logischen Situations-Möglichkeiten „Heute nicht“, „Wir helfen, doch es fehlen Ressourcen“, „Wir können helfen und helfen jetzt“ benötigt. Wenn allerdings nur eine Frage an den Spieler sinnvoll erscheint, könnt ihr mit nur einer cp-Seite ausgekommen. Dabei wird im Briefing nicht der gesamte Aufgabenblock abgearbeitet. Aus der .finished-Funktion des Briefings wird eine Abfragefunktion gestartet, auf welche dann die noch fehlenden Aktionen nach korrekter Logik erfolgen. Die passenden weiteren benötigten Briefing-Seiten werden über die Funktion StartBriefing( _briefing ) unmittelbar aus der Abfragefunktion heraus gestartet. Die Dialogabfolge lässt sich nach der dargestellten Methode sehr gefällig und bedarfskonform gestalten.\\
Das nachfolgende Beispiel beinhaltet den benötigten Scriptaufbau und zeigt ergänzende Möglichkeiten auf. Die Erweiterungen könnt ihr dem Bedarf angepasst oder auch ganz weglassen. Hier genutzte Parameterübergaben können dabei überflüssig werden. An den Kommentaren seht ihr, welche das sind.\\
Eine callback-Funktion ermöglicht die Erstellung des NPC sowie weitere Regelungen, bevor das eigentliche Briefing gestartet wird:
------------------------------------------------------------------------------------------------------- -- function(_npcId, _heroId) Der Aufruf der Parameter ermöglicht das Ansprechen des -- kommunizierenden Helden mit dessen Scriptname. -- BringRessourcen(_npcId, _heroId) ruft das Briefing auf und übergibt die Parapeter. -- SetzeNeutral() kann in kampfbetonten Zeiten während eines Briefings sinnvoll sein. Zwar herrscht -- während Briefings Unverwundbarkeit, doch während eines Waffenstillstandes wird der Feind -- Kampfanliegen nicht vortragen bzw. begonnene Aktionen unterbrechen. function CallBringRessourcen() local npc = { name = "Ungeduldix", callback = function(_npcId, _heroId) BringRessourcen(_npcId, _heroId) SetzeNeutral() end, } CreateNPC(npc) end
Das Briefing:
function BringRessourcen(_npcId, _heroId) local brief = {} -- local declariertes Briefing brief.restoreCamera = true -- Kameraposition aktualisieren local heroName = GetEntityName(_heroId) -- Variable Scriptname des ansprechenden Helden belegen. -- Blickrichtungen der Gesprächspartner LookAt( "Ungeduldix", heroName ) LookAt( heroName, "Ungeduldix" ) -- ASP( _name, _title, _text, _dialog); _dialog "true" -> Nahsicht, ansonsten einfach weg lassen! local AP, ASP = AddPages(brief); ASP( "Ungeduldix", -- Seite 1 "Ungeduldix", "Beim Balzruf des Hirsches! @cr @cr Die Zeit ist beinahe Überfällig, "..heroName.."! Bringt ".. "Ihr Holz oder die leere Hand? Nun sagt schon!", true) local cp = AP{ -- Seite 2 - Auswahlseite für die Auswertung in Variable speichern. mc = { title = heroName, text = "Wie üblich macht Ihr Eurem Namen alle Ehre, Ungeduldix!", firstText = "Heute kommen wir nur auf einen Plausch!", secondText = "Wir werden Hilfe leisten!", firstSelected = 3, secondSelected = 5, }, } ASP( "Ungeduldix", -- Seite 3 "Ungeduldix", "Es tobt rundum erbitterter Krieg, doch Ihr beliebt zu plauschen, "..heroName.."? Welcher ".. "Moral zollt Ihr den Tribut? @cr @cr Vergesst die 2000 Stämme nicht!", true) AP() -- Seite 4 - Leere Seite notwendig, da das Briefing hier zu Ende sein könnte. ASP( "Ungeduldix", -- Seite 5 heroName, "Lasst mich die Bücher befragen!", true) -- Nach der letzten Briefing-Seite ist keine leere Seite mehr notwendig. brief.finished = function() -- Was soll nach dem Ablauf des briefings geschehen? if GetSelectedBriefingMCButton(cp) == 1 then -- Der erste Auswahl-Button wurde bedient. -- An jedem möglichen Briefing-Ausstiegspunkt: StartCountdown(6, KaempftWeiter); -- AI's wieder auf feindlich setzen. CallUngeduldixHolz(); -- Vertröstungsauswahl gewählt, Briefing erneut aufrufen. elseif GetSelectedBriefingMCButton(cp) == 2 then -- Der zweite Auswahl-Button wurde bedient. PruefeRessourcen(_npcId, _heroId); -- Prüfen, ob genügend Ressourcen vorhanden sind. end end StartBriefing(brief); -- Der NPC wurde in der callback-Funktion kriert. end ------------------------------------------------------------------------------------------------------- function PruefeRessourcen(_npcId, _heroId) -- Prüf-Funktion if GetWood(1) > 1900 then -- wenn genügend Ressourcen vorhanden. UngeduldixNehmt(_npcId, _heroId); -- Übergabefunktion aufrufen. else -- ansonsten ZuWenigHolz(_npcId, _heroId); -- Ich_kann_nicht_bezahlen-Funktion aufrufen. end end ------------------------------------------------------------------------------------------------------- function UngeduldixNehmt(_npcId, _heroId) -- Bezahlen, ggf. Quest erledigen. local brief = {} -- Briefing wird austomatisch als Folgebriefing gestartet. brief.restoreCamera = true local heroName = GetEntityName(_heroId) local AP, ASP = AddPages(brief) ASP( "Ungeduldix", heroName, "Öffnet den schober, die Leibeigenen wollen abladen!", true) -- false für die weite Kamera-Ansicht ASP( "Ungeduldix", "Ungeduldix", heroName..", eine andere Antwort hättet Ihr nicht wagen dürfen, bei den Lanzen ".. "meiner Krieger!", true) brief.finished = function() --ResolveBriefing(HolzHilfe) -- nur bei Bedarf, falls ein Quest abgehakt werden soll. AddWood(1, -2000) StartCountdown(6, KaempftWeiter); -- Briefing-Ausstieg, also Waffenstillstand beenden. --UngeduldixArbeite() -- bei Bedarf Folgebriefing oder NPC-Aktion. end StartBriefing(brief) end ------------------------------------------------------------------------------------------------------- -- Ausrede-briefing für den ressourcenarmen Player, wird automatisch als Folge-Briefing gestartet -- (da kein Held kreiert sondern StartBriefing(brief) genutzt wird). function ZuWenigHolz(_npcId, _heroId) local brief = {} brief.restoreCamera = true local heroName = GetEntityName(_heroId) local AP, ASP = AddPages(brief) ASP( "Ungeduldix", heroName, "Der Krieg ließ uns nichts. Die Arbeiter schuften, wir werden wieder kommen!", true) ASP( "Ungeduldix", "Ungeduldix", "Oh beinahe dem Tode geweihter! Hier in der Schnitzerei werden die Pfeile geschnitten. ".. "@cr @cr Bedenkt das, "..heroName.."!", true) brief.finished = function() StartCountdown(6, KaempftWeiter); -- der dritte, letzte mögliche Ausstiegspunkt. CallUngeduldixHolz(); end StartBriefing(brief); end ------------------------------------------------------------------------------------------------------- function SetzeNeutral() -- Nur bei Bedarf. for i = 2, 4 do -- über i werden die betroffenen AI eingetragen. SetNeutral(1,i); end end ------------------------------------------------------------------------------------------------------- function KaempftWeiter() -- Nach Briefing-Waffenstillstand muss wieder Feindschaft folgen. for i = 2, 4 do -- Die AI 2, 3 und 4 werden gegenüber dem Player (AI 1) wieder feindlich. SetHostile(1,i); end end
function AddPages( _briefing ) local AP = function(_page) table.insert(_briefing, _page); return _page; end local ASP = function(_entity, _title, _text, _dialog) return AP(CreateShortPage(_entity, _title, _text, _dialog)); end return AP, ASP; end
function CreateShortPage( _entity, _title, _text, _dialog) local page = { title = _title, text = _text, position = GetPosition( _entity ), dialogCamera = _dialog }; return page; end
Ihr solltet dann noch den folgenden Workaround von Chromix im Skript einfügen, denn sonst werden die bereits angeklickten Buttons gräulich gekennzeichnet. Bei mehreren Abfragen und erneuten Aufrufen sieht das nicht schön aus, bzw. es kann den Spieler ggf. auch irritieren.
-- MultipleChoice ButtonHighlight workaround from CHROMIX ( thx! ) function Briefing_ExtraWrapper( _v1, _v2 ) for i = 1, 2 do local theButton = "CinematicMC_Button" .. i; XGUIEng.DisableButton( theButton, 1 ); XGUIEng.DisableButton( theButton, 0 ); end Briefing_ExtraOrig( _v1, _v2 ); end Briefing_ExtraOrig = Briefing_Extra; Briefing_Extra = Briefing_ExtraWrapper;
Zur Nutzung der Funktion StartCountdown(_Limit, _Callback, _Show) benötigt ihr den entsprechenden Funktionscode.\\