Inhaltsverzeichnis

Briefings mit Auswahlmöglichkeit (multiple choice, Ergänzungen)

Uranor\\

Prolog

Ü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.\\

Das Briefing und die Erweiterungen:

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

Weitere im Skript enötigte Funktionen:

1. Wegen dem Aufruf oben “local AP, ABP = AddPages(briefing);”:

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

2. Die zugehörige “CreatePage”-Funktion namens “CreateShortPage”:

function CreateShortPage( _entity, _title, _text, _dialog) 
	local page = {
		title = _title,
		text = _text,
		position = GetPosition( _entity ),
		dialogCamera = _dialog
	};
	return page;
end

3. Workaround für optisch schönere Button:

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;

4. Nutzung von StartCountdown(_Limit, _Callback, _Show):

Zur Nutzung der Funktion StartCountdown(_Limit, _Callback, _Show) benötigt ihr den entsprechenden Funktionscode.\\

Siehe auch


FIXME

Zur Tutorial-Übersicht