Benutzer-Werkzeuge

Webseiten-Werkzeuge


utilscripts:briefings_alternativ

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
utilscripts/briefings_alternativ.txt · Zuletzt geändert: 2021/09/18 19:15 (Externe Bearbeitung)