[[http://www.siedler-games.de|{{:sg-link.jpg|}}]] ====== Alternativer Briefingstil ====== Das ist bisher ein Experiment ohne praktischen Hintergrund. Es wird versucht, die Erstellung eines Briefings "objektorientiert" zu betreiben. Wen das interessiert, der kann es sich ansehen. ===== Anwendung ===== Ziel ist es, den einzelnen Briefingseiten einen Zusammenhang bzw. eine Zugehörigkeit zum Briefing zu geben. //local Briefing = NewBriefing()// erzeugt eine neue "Instanz" einer Art Briefing-Klasse.\\ Es stehen dann Methoden zum Einfügen von Seiten (AP, ASP), setzen einer Briefing-Finished Funktion (Callback), automatischem Zurücksetzen der Kamera und zum Starten des Briefings bereit. Außerdem kann man sich über die Get() Methode eine Repräsentation des Briefings als Table geben lassen (z.B. um einen NPC mit Briefing zu erstellen). function CreateTestBriefing() -- Erzeugen einer neuen "Instanz" local Briefing = NewBriefing() -- Äquivalent zu ASP und AP Briefing:AddShortPage("Hero", "Held", "Hallo! Hier wird getestet, ob das Briefing funktioniert.", true) Briefing:AddPage{ title = "Held", text = "Das hier ist die feindliche Burg.", -- Mögliche Fehlerquelle: GetPosition() vergessen. -- Fehler wird durch Script abgefangen und automatisch korrigiert. position = "Enemy", explore = BRIEFING_EXPLORATION_RANGE, } -- Kamera zurücksetzen Briefing:SetRestoreCamera() -- Briefing finished umgetauft in Callback Briefing:SetCallback( function() Message("Briefing hat funktioniert!") end ) -- Briefing starten Briefing:Start() CreateNPC{ name = "Hero", briefing = Briefing:Get(), -- Get() benutzen, um das Briefing Table zu bekommen } end ===== Code ===== Es soll versucht werden, möglichst viele Feherquellen abzufangen. Es ist immer besser Fehlermeldungen in bekannten Scripts zu bekommen, als in internen Dateien, die niemend einsehen kann. Wenn möglich (d.h. keine kritischen Fehler), sollen diese Fehler ohne Fehlermeldung "stillschweigend" korrigiert bzw. ignoriert werden, sofern dadurch keine unerwarteten Probleme auftreten (Das Ignorieren eines doppelten "Explore" auf eine Position wäre ein solch unkritischer Fehler, da das eigentliche Vorhaben - nämlich das Aufdecken der Karte - ja bereits an anderer Stelle erfolgte. function NewBriefing() -- Local briefing "class" that will be returned later local Briefing = {} -- This holds the briefing data Briefing.briefing = {} -- Table of explored positions, needed to avoid errors Briefing.exploredPositions = {} -- Set briefing finished function Briefing:SetCallback(_finished) -- Must be a function assert(type(_finished) == "function") self.briefing.finished = _finished end -- Set briefing restoreCamera function Briefing:SetRestoreCamera() self.briefing.restoreCamera = true end -- Add a new briefing page function Briefing:AddPage(_page) assert(type(_page) == "table") if type(_page.position) ~= "table" then -- No position table given, maybe this is an entity name or ID assert(IsExisting(_page.position)) _page.position = GetPosition(_page.position) end if _page.explore then -- Check if this position is already explored for _, explore in pairs(self.exploredPositions) do if _page.position == explore then -- Position found, ignore it to avoid errors _page.explore = nil break end end if _page.explore then -- Remember this exploration position table.insert(self.exploredPositions, _page.position) end end -- Add the Briefing page to the internal table table.insert(self.briefing, _page) return _page end -- Add a new short briefing page function Briefing:AddShortPage(_entity, _title, _text, _dialog) return self:AddPage{ title = _title, text = _text, position = _entity, dialogCamera = _dialog } end -- Return the briefing table function Briefing:Get() return self.briefing end -- Start the briefing function Briefing:Start() StartBriefing(self:Get()) end return Briefing end