Bibliotheken

Was ist eine Bibliothek

Eine Bibliothek ist in diesem Fall nicht ein Haus mit vielen Büchern drin, wo man keinen Krach machen darf, sondern eine größere Funktionssammlung. Aber nicht querbeet, sondern zu einem Thema. Solche Bibliotheken gibt es in allen Programmiersprachen. Natürlich auch in Lua. Aber keine Angst, hier wird niemand mit den langweiligen Bibliotheken von Lua gequält, sondern mit Funktionsbibliotheken für unser schönes Spiel.

Bibliotheken sollen den Aufwand bei der Mapentwicklung senken. Alle Bibliotheken sind in der Lage zu unterscheiden in welche Skriptumgebung sie includiert (eingelesen) werden. Dadurch kannst du sie einfach per Script.Load wärend der Entwicklung laden und später mit den S6Tools in die Map reinkopieren. Zur Not können sie auch untereinander in die Skripte reinkopiert werden, ohne S6Tools zu verwenden. Dadurch verliert das Ganze jedoch an Sinn.

Was ich wissen muss:

Was mir das bringt:

  • mehr Übersicht über den Code
  • kürzere Lua-Datein
  • schnellere Entwicklung
  • einfachere Fehlersuche

Verfügbare Bibliotheken

Bibliothek Ausführliche Beschreibung Kurzbeschreibung Author
AI-Gebäudebau.lua KI-Gebäudebau Bau und Ausbau von Städten/Dörfern von KI-Spielern. totalwarANGEL
BriefingSystem.lua BriefingSystem Das klassische BriefingSystem von OMD mit Zusatzfunktionen von totalwarANGEL OldMacDonald / totalwarANGEL
Comforts.lua Comforts Große Sammlung von Standartfunktionen für globales und lokales Skript Verschiedene Autoren
InteractiveObject.lua Interaktive Objekte Erweiterte Nutzung von interaktiven Objekten totalwarANGEL
[*] Library Quest Behavior Skript zum erstellen von Quests und Sammelsorium von vielen bekannten Funktionen totalwarANGEL
NEP.lua NEP Bietet einige Erweiterungen, wie z.B. Abrissverbot und geänderte Aufstiegsbedungungen. OldMacDonald, Netsurfer
TravelingSalesman.lua Fahrender Händler Erstellt einen fliegenden Händler an einem Hafen totalwarANGEL

Bibliothek einlesen

Um eine Bibliothek nutzen zu können musst du sie dem Spieler (auch wenn nur du der Spieler bist) zur Verfügung stellen. Ob die Bibliotheken nun im normalen Skript liegen, mit den S6Tools an die Map angehangen werden oder auf dem Massenspeicher liegen ist relativ egal. Du musst nur dafür sorgen, dass das Spiel die Bibliotheken auch finden kann.

Wenn eine Bibliothek libary.lua auf dem Massenspeicher liegt, könnte dein Pfad so aussehen:

Script.Load("C:\\Scripts\\libary.lua")

Oder auch so:

local path = "C:\\Siedler\\Libaries\\"
Script.Load(path.."tools.lua")
Script.Load(path.."mission.lua")
Script.Load(path.."trade.lua")

Ist die Bibliothek mit den S6Tools angehangen, sieht dein Pfad so aus:

local path = "Maps\\ExternalMap\\"..Framework.GetCurrentMapName().."\\";
Script.Load(path.."tools.lua")
Script.Load(path.."mission.lua")
Script.Load(path.."trade.lua")

Willst du die Bibliotheken effizient nutzen, so ist dies die optimale Varriante.

Befinden sich die Bibliotheken im normalen Skript, so entfällt das einlesen.

** Beispiel: Globales Skript

Ein kleines Beispiel um die Funktionsweise zu erklären:

do
    local MapName = Framework.GetCurrentMapName();
    --local path = "Maps\\ExternalMap\\"..MapName.."\\";    -- Pfad Mapintern
    local path = "C:\\Scripts\\Libaries\\";                 -- Pfad Extern
    Script.Load(path.."texts.lua");
    Script.Load(path.."briefings.lua");
    Script.Load(path.."NEP.lua");
    Script.Load(path.."Wasauchimmer.lua");
end

function Mission_InitPlayers()
end

function Mission_SetStartingMonth()
    Logic.SetMonthOffset(10);
end

function Mission_InitMerchants()
end

function Mission_FirstMapAction()
    if Framework.IsNetworkGame() ~= true then
        Startup_Player();
        Startup_StartGoods();
        Startup_Diplomacy();
    end

    do
    local MapName = Framework.GetCurrentMapName()
        local ScriptName = "Maps\\ExternalMap\\"..MapName.."\\QuestSystemBehavior.lua";
        Script.Load(ScriptName);
    end

    Logic.ExecuteInLuaLocalState([[UserCreateQuests()]]);
end

Es ist nicht zu verkennen, dass die Variable path zweimal definiert wird. Einmal für den internen Pfad und einmal für den externen Pfad. Dabei ist der externe Pfad auskommentiert. Daraus erkennt man, dass sich die Map wohl noch in der Entwicklung befindet und die Skripte noch auf der Platine des Mappers liegen und noch nicht an die fertige Map angehangen sind. Wenn der Maper fertig ist, wird er den exteren Pfad auskommentieren und dafür den internen entkommentieren (Bindestriche davor entfernen). Danach werden die Skripte mit den S6Tools angehangen. Größer wird die Lua des globalen Skriptes nicht mehr. Alles was für die Mission gebraucht wird, befindet sich im Assistenten oder in den includierten Bibliotheken.

Bibliothek erstellen

Um eine eigene Bibliothek zu erstellen braucht es nicht viel. Du musst dir nur ein Lua-Skript erstellen, dass in der Lage ist zu erkennen, in welche Skriptumgebung es geladen wird.

Der einfachste Weg dies herauszufinden, ist zu Prüfen ob die Variable GUI gesetzt ist. GUI wird nur in der lokalen Skriptumgebung gesetzt. Deshalb kann man davon ausgehen, dass es sich um die globale Skriptumgebung handelt, wenn GUI nicht gesetzt ist.

--~~~~~~~
--~ GLOBAL
--~~~~~~~
if not GUI then

-- place code here

--~~~~~~~
--~ LOCAL
--~~~~~~~
else

-- place code here

end

Dies ist das Grundgerüst jeder Bibliothek.

Zurück zur Startseite | print | tags
Sofern nicht anders angegeben, steht der Inhalt dieser Seite unter Lizenz Creative Commons Attribution-ShareAlike 3.0 License