03 Wherigo Cartridge – the structure of a Wherigo LUA File

Die LUA-Datei – Das Wherigo-Handbuch (das-wherigo-handbuch.de)

A Wherigo cartridge is always – no matter with which builder it was created – translated into the LUA programming language. You can also create Wherigo cartridges without a builder – i.e. you write the LUA file completely by yourself.

Urwigo creates the LUA file according to the following file structure:

--hier intialisiert Urwigo den LUA-Code
require "Wherigo"
               --Das Package Wherigo wird benoetigt


ZonePoint = Wherigo.ZonePoint
               --Diese Definitionen sind zum Verkürzen der Schreibweise, hier die im Package Wherigo definierte 
               --table für einen Punkt, bestehend aus Latitude (geografische Breite), Longitude (geografische Länge) 
               --und Altitude (Höhe)

Distance = Wherigo.Distance 
               -- Achtung einige Funktionen aus dem Package Wherigo benötigen den Datentyp Distance - 
               -- hier unbedingt beachten, wie man vom Typ Distance in eine Gleitkommazahl für Meter
               --(oder auch Fuß kommt) und anders herum

Player = Wherigo.Player
               -- Spieler-Objekt - enthält einige Attribute, die interessant sind - insbesonders 
               -- Player.OriginalPoint (vom Objekttyp ZonePoint) das immer die aktuelle Koordinate enthält

function _czTN(str)
               -- der Name ist beliebig
               -- diese Funktion dient dem Verschlüsseln der Texte
               -- die Tabelle dtable ist der Schlüssel
  local res = ""
  local dtable = "x%\006QF6MLe\022hA)J7o_+\021VK}\n\0162\029\0009$<H\005s0pG\0268T?N-!Z\027D\001]b\019C3(.q~g ;tOB\024/{u>v|nyX\t\0205^[\f41=&c\015I:\004\rf\018S\017\031a@#w\030mi\"\002zU'\014\bkl\\\023\028\003\a`Y*Wd,ER\vPj\025r"
  for i = 1, #str do
    local b = str:byte(i)
    if b > 0 and b <= 127 then
      res = res .. string.char(dtable:byte(b))
    else
      res = res .. string.char(b)
    end
  end
  return res
end 


-- es folgen nun eine Reihe von Funktionen, die Urwigo für das korrekte Funktionieren benötigt


objAdvent = Wherigo.ZCartridge()
              --Die Cartridge wird initialisiert, d.h. es wird ein einzige Cartridge Objekt angelegt.
              -- Die Daten der Cartridge werden später dann als Eigenschaften abgelegt


-- Media --
              --Hier werden die Media-Objekte - Bilder und Sound angelegt
_xTL7U = Wherigo.ZMedia(_clqD)
_xTL7U.Id = "533a5ac6-d250-4088-8783-82ab011d7cac"
_xTL7U.Name = _czTN("\f##m^B!")
_xTL7U.Description = ""
_xTL7U.AltText = ""
_xTL7U.Resources = {
  {
    Type = "mp3",
    Filename = "Applaus.mp3",
    Directives = {}
  }
}

-- Cartridge Info --
              --Hier landen alle Einstellungen der Cartridge
objAdvent.Id = "f8d030af-9734-41cb-b096-71347d242fb6"
objAdvent.Name = "Agent Karl Toffel "
objAdvent.Description = "Diese Runde fuehrt durch Kladow."
objAdvent.Visible = true
objAdvent.Activity = "Geocache"
objAdvent.StartingLocationDescription = "Hier muesst ihr starten"
objAdvent.StartingLocation = ZonePoint(52.472533, 13.135383, 0)
objAdvent.Version = "1"
objAdvent.Company = ""
objAdvent.Author = "Aski-Team"
objAdvent.BuilderVersion = "URWIGO 1.20.5218.24064"
objAdvent.CreateDate = "06/13/2014 20:17:27"
objAdvent.PublishDate = "1/1/0001 12:00:00 AM"
objAdvent.UpdateDate = "09/21/2014 16:58:43"
objAdvent.LastPlayedDate = "1/1/0001 12:00:00 AM"
objAdvent.TargetDevice = "PocketPC"
objAdvent.TargetDeviceVersion = "0"
objAdvent.StateId = "1"
objAdvent.CountryId = "2"
objAdvent.Complete = false
objAdvent.UseLogging = true
objAdvent.Media = _0ci


-- Zones --
              --Definition der Zonen
_zoneDrachenlager = Wherigo.Zone(objAdvent)
zoneDrachenlager.Id = "6215691a-b997-4277-b1b5-d4bf62368489"
zoneDrachenlager.Name = "Drachenlager"
zoneDrachenlager.Description = "Dies sollte nie angezeigt werden,"
zoneDrachenlager.Visible = false
zoneDrachenlager.DistanceRange = Distance(0, "meters")
zoneDrachenlager.ShowObjects = "OnEnter"
zoneDrachenlager.ProximityRange = Distance(0, "meters")
zoneDrachenlager.AllowSetPositionTo = false
zoneDrachenlager.Active = false
zoneDrachenlager.Points = {
  ZonePoint(52.51552, 13.57171, 0),
  ZonePoint(52.51552, 13.57213, 0),
  ZonePoint(52.51526, 13.57213, 0),
  ZonePoint(52.51526, 13.57171, 0)
}
zoneDrachenlager.OriginalPoint = ZonePoint(52.515389, 13.571918, 0)
zoneDrachenlager.DistanceRangeUOM = "Meters"
zoneDrachenlager.ProximityRangeUOM = "Meters"
zoneDrachenlager.OutOfRangeName = ""
zoneDrachenlager.InRangeName = ""


-- Characters --
              --Definition der Personen
objBlondine = Wherigo.ZCharacter({Cartridge = KlausKlabuster, Container = zBI})
objBlondine.Id = "8aec9cae-8d8f-402d-a33b-4f39abd04244"
objBlondine.Name = "Blondine"
objBlondine.Description = "Ein blonder Engel. Umschwirrt von Maennern wie Motten um ein Licht."
objBlondine.Visible = true
objBlondine.Media = objbarfrau
objBlondine.Icon = objicobarfrau
objBlondine.Commands = {
  cmdanquatschenundflirten = Wherigo.ZCommand({
    Text = "anquatschen und flirten",
    CmdWith = false,
    Enabled = true,
    EmptyTargetListText = "Nicht verfugbar"
  }),
  cmdzumTanzenauffordern = Wherigo.ZCommand({
    Text = "zum Tanzen auffordern",
    CmdWith = false,
    Enabled = true,
    EmptyTargetListText = "Nicht verfugbar"
  })
}
objBlondine.Commands.cmdanquatschenundflirten.Custom = true
objBlondine.Commands.cmdanquatschenundflirten.Id = "f8da54ff-157b-4927-a942-66b39c6b2596"
objBlondine.Commands.cmdanquatschenundflirten.WorksWithAll = true
objBlondine.Commands.cmdzumTanzenauffordern.Custom = true
objBlondine.Commands.cmdzumTanzenauffordern.Id = "47639b5b-e941-4fa8-a065-25a812946f87"
objBlondine.Commands.cmdzumTanzenauffordern.WorksWithAll = true
objBlondine.ObjectLocation = Wherigo.INVALID_ZONEPOINT
objBlondine.Gender = "Female"
objBlondine.Type = "NPC"

-- Items --
              --Definition der Items/Gegenstände
objMuelleimer = Wherigo.ZItem({Cartridge = KlausKlabuster, Container = zMP})
objMuelleimer.Id = "14e91fa0-8c16-412f-9c97-ff24031f83a0"
objMuelleimer.Name = "Muelleimer"
objMuelleimer.Description = ""
objMuelleimer.Visible = true
objMuelleimer.Media = objmuelleimer
objMuelleimer.Icon = objicomuelleimer
objMuelleimer.Commands = {
  cmdansehen = Wherigo.ZCommand({
    Text = "ansehen",
    CmdWith = false,
    Enabled = true,
    EmptyTargetListText = "Nothing available"
  })
}
objMuelleimer.Commands.cmdansehen.Custom = true
objMuelleimer.Commands.cmdansehen.Id = "210f3095-0117-42c0-b2cc-24c488d30200"
objMuelleimer.Commands.cmdansehen.WorksWithAll = true
objMuelleimer.ObjectLocation = Wherigo.INVALID_ZONEPOINT
objMuelleimer.Locked = false
objMuelleimer.Opened = false

-- Tasks -- 
              --Defintiion der Aufgaben
tGM = Wherigo.ZTask(KlausKlabuster)
tGM.Id = "a869d211-89ad-4328-a423-3caf43e167ff"
tGM.Name = "Gehe zum Marktplatz"
tGM.Description = "Gehe zum Spandauer Marktplatz in der Altstadt und stuerze Dich ins Leben."
tGM.Visible = true
tGM.Media = objMarktplatz
tGM.Icon = objicomarktplatz
tGM.Active = true
tGM.Complete = false
tGM.CorrectState = "None"

-- Cartridge Variables --
              --Definition der Variablen - alle Variablen werden in die Table ZVariables eingetragen, das ist 
              -- notwendig zum Speichern und wieder Laden - zu beachten für eigenen LUA-Code wenn die dortigen 
              -- Variablen gespeichert/geladen werden sollen (siehe unten)
KlausKlabuster.ZVariables = {
  objvarGeld = 34,
  iA = 0,
  objvarBartenderBestellung = false,
  iTV = 0,
  objvarOhneGummi = false,
  ...
}

-- Timers --
              --Definition der Timer
objHund2 = Wherigo.ZTimer(KlausKlabuster)
objHund2.Id = "8c527e68-ca80-44b3-97da-84775ee5461d"
objHund2.Name = "Hund"
objHund2.Description = ""
objHund2.Visible = true
objHund2.Duration = 120
objHund2.Type = "Countdown"

-- Inputs --
              --Defintion der Eingaben
              -- die eigentlichen Eingaben erfolgen in der jeweiligen Funktion und werden seperat definiert
objPasswort = Wherigo.ZInput(KlausKlabuster)
objPasswort.Id = "48eb287c-b820-4f03-8f0c-9bee83b7a470"
objPasswort.Name = "Passwort"
objPasswort.Description = ""
objPasswort.Visible = true
objPasswort.Media = objTuer
objPasswort.Icon = objicoTuer
objPasswort.InputType = "Text"
objPasswort.Text = "Wie ist das Kennwort"

objBestellungBartender.InputType = "MultipleChoice"
objBestellungBartender.Text = "Also, was mochtest Du:"


-- WorksWithList for object commands --
              --hier wird abgelegt, wenn Kommandos auf eine Liste von anderen Items etc. anwendbar sind
objRose1.Commands.cmdRosewegwerfen.WorksWithList = {
  objAschenbecher1,
  objMuelleimer,
  objBiographie
}

-- functions --
              --hier landen alle Funktionen - z.B. OnEnter-Events, Timer-Events etc. aus Urwigo

              --Beispiel für eine Eingabe:
                function objBestellungBartender:OnGetInput(input)
                  if input == nil then
                    input = ""
                  end
                  if Wherigo.NoCaseEquals(input, "Whiskey") then
                  ...
                  elseif Wherigo.NoCaseEquals(input, "Wein") then
                  ...

-- Begin user functions --
              --ab hier sind die User-Funktionen
              --aber zuerst mal Urwigo-Functions

-- End Urwigo functions --
              --und erst ab hier die eigentlichen User-Functions

-- End user functions -- 
              --und das wars - ggf. fehlen Abschnitte, wenn keine Defintionen da sind...

More information about the LUA package Wherigo can be found at webwig/wherigo.lua at master – Jakuje/webwig (github.com).