[[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