• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Bestimmung des Zonen-Kontextes

satanklaus

Geomaster
Zum Problem:
Ich bastle gerade einen Hint-Generator, den der Spieler ständig im Inventory hat und der abhängig vom jeweiligen Kontext Hilfe anbietet. Dazu habe ich einige generische Funktionen für die "Streng-Dich-erstmal-selber-an-Motivation": mit jedem Mal Hilfe anfordern verdoppelt sich die Wartezeit auf den Hint. Und nun brauche ich noch einen kontext-spezifischen Teil: Je nach Zone soll ein anderer Hilfetext kommen.
Dazu muss ich unterscheiden, ob ich a) überhaupt in einer Zone bin und wenn ja b) in welcher.

Bisher habe ich dazu eine String-Variable, die über globale OnEnter/OnExit Zone-Events entweder auf CurrentZone.Name oder "None" gesetzt wird. Die werte ich dann entsprechend aus und generiere den passenden Hint.
Funktioniert grundsätzlich, mich interessiert nun, ob ich die Kontext-Info auch nur bei Bedarf abfragen kann - also nur, wenn der Spieler das "Orakel" tatsächlich befragt.
Mein Problem ist, dass ich den Fall nicht vernünftig identifizieren kann, wenn der Spieler zum Zeitpunkt der Abfrage in keiner Zone ist.
Ein Compare von CurrentZone.Name mit nil hat in Urwigo nicht funktioniert und in Lua komme ich an das CurrentZone-Objekt nicht ran. Jetzt wo ich das schreibe fällt mir auf, dass ich noch mit einem leeren String ("") statt mit nil vergleichen könnte... aber egal:
Habt ihr Tipps, wie ich das lösen könnte? Vielleicht sind die CurrentXXX Objekte ja auch ein Holzweg?

Danke!
 

jonny65

Geomaster
Ich verwende sowas in ähnlicher Form mehrfach in meinen Wherigos und es wird ausnahmslos
ganz simpel durch die Urwigo Funktion "Contains" realisiert. Der Spieler benutzt z.b das Item "Spoilomat" und je nachdem wo er aktuell ist, wird in dem Augenblick der richtige Hint zugewiesen, wenn man so will also in "Echtzeit" und nicht durch ein voriges Enter Ereignis.

if Zone.Brunnen contains Player > [Hilfemodul mit Timer ...] > Message "Schmeiß zuerst die Prinzessin in den Brunnen und rette dann den Frosch ..."

[weitere Zone contains Player Abfragen...]

else Message "Diese Zone oder Spielsituation bietet leider keinen Hint an ..."

Falls es das so ist, was du meinst, zumindest hab ichs so verstanden :???:
 
OP
satanklaus

satanklaus

Geomaster
Ja, das meinte ich.
Interessante Anregung: du hast das Herangehen umgedreht. Anstatt über das Current-Objekt quasi den Player zu fragen, wo er ist, fragst du die Zonen, ob der Player zum Zeitpunkt der Abfrage dort ist.
Spart wie gewünscht die globalen Events, und falls Zonen neu angelegt, umbenannt oder gelöscht werden, gibt es genau ein mehr oder weniger langes if/elseif Konstrukt, das damit konsistent gehalten werden muss. Der else Zweig ist dann dem Fall vorbehalten, dass der Player gerade in keiner Zone ist.

Da hat es sich doch schon mal gelohnt, hier zu fragen. Danke!

PS: könnte man contains auch durch in proximity ersetzen und es etwas robuster zu machen, falls der Spieler genau am Rand steht? (Würde natürlich voraussetzen, dass Contains eine Untermenge von In Proximity ist...)
 

Charlenni

Geomaster
Das Verfahren schlägt dann fehl, wenn der Spieler in zwei Zonen gleichzeitig ist. Dann wird nur die zuerst gefragte ausgewertet. Wenn es keine überlappende Zonen gibt, dann ist es kein Problem.

Das mit dem Proximity geht nicht. Dafür gibt es keine Abfrage. Die müsste man sich selbst schreiben.
 

jonny65

Geomaster
satanklaus schrieb:
PS: könnte man contains auch durch in proximity ersetzen und es etwas robuster zu machen, falls der Spieler genau am Rand steht? (Würde natürlich voraussetzen, dass Contains eine Untermenge von In Proximity ist...)

Wie Charlenni schon schreibt, gehts nicht, wie sollte die Abfrage auch stabil funktionieren wenn z.b 2 Zonen nebeneinander liegen, der Spieler in der Mitte durchgeht, nähert er sich ja beiden Zonen gleichzeitig. Proximity ist für mich nachwievor Wischiwaschi und "nicht so digital" wie Enter/Exit. Eine Zwitterlösung wäre eine 3 Punktzone (3 gleiche Koordinaten) anzulegen die auf OnProximity reagiert, eine Zone aktiviert die um diesen Punkt gespannt ist, deren Ausmaße größer sind als die Triggerentfernung der Punktzone. Also Proximity z.b 10 Meter, die Zone drumrum 30x30 Meter, so steht der Spieler schon 5 Meter in der Zone bevor sie überhaupt aktiv ist. Das "beliebte" Zonenflattern ist somit ausgeschlossen und die Contains Funktion reagiert auch stabil und verlässlich.
 
OP
satanklaus

satanklaus

Geomaster
jonny65 schrieb:
satanklaus schrieb:
PS: könnte man contains auch durch in proximity ersetzen und es etwas robuster zu machen, falls der Spieler genau am Rand steht? (Würde natürlich voraussetzen, dass Contains eine Untermenge von In Proximity ist...)

...
Das "beliebte" Zonenflattern ist somit ausgeschlossen und die Contains Funktion reagiert auch stabil und verlässlich.

Verstehe: eine Kombination von Krolocks Punktzonen und dem dynamischen Zonen-Vergrößern bei Eintritt aus dem Handbuch.

Ich habe mir auch schon überlegt, dass ich die aktuelle Zone ja nur brauche, um den richtigen Hint auszugeben. Nun gibt es mehrere Bsp. dafür, dass die Identifikation einer Zone nicht immer robust und eindeutig funktioniert.
Eine andere Idee wäre, den Kontext an eine Variable oder einen Task zu koppeln.
Der Ansatz mit der Variable speichert dort den jeweiligen Spielstatus (z.B. als String "Suche den Code") und kann den passenden Hint ("UV") erzeugen. (In Karls Zombie/Paranoia Runde sogar mehrstufig, je nachdem, wie sehr man auf dem Schlauch steht. Damit kommt man sogar bei komplett gemuggelten Stationen weiter :2thumbs: )

Das Erwähnen einer Aufgabe als Hilfskontext gibt ja eigentlich schon einen Tipp, dass man das Ganze an einen WIG-Task koppeln sollte. Der ist unabhängig von Zonen aktiv und hat nicht das GPS-Jitter-/ Zonenflatter-Problem. Das wäre eigentlich die Königslösung.
Und es gibt sogar sowas wie ein CurrentTask Objekt. Aber da ist mir noch schleierhafter als bei CurrentZone, was es repräsentiert und wie ich es benutzen kann. Besonders, weil es meines Wissens ja mehrere oder keinen aktiven Task geben kann.
(Gut, das kann ich als WIG-Autor ja beeinflussen/vermeiden...)

Hat jemand Erfahrung, wie man den Task Kontext bestimmen kann? Muss ich dazu in der Task-Detailansicht sein. Oder ist es der erste/einzige aktive aber noch nicht komplettierte?
 

Charlenni

Geomaster
Tja, bodenseepingu hat doch schon alles wichtige geschrieben. Es handelt sich offenbar nur um eine Variable. Was Du damit machst, bleibt Dir überlassen.
 
Oben