
Zitat von
Sascha_S3
2. Kann man, um ein Tor zu öffnen, ein Passwort hinterlegen?
Hier möchte ich, dass man nur mit Eingabe eines Codes das Tor öffnen kann.
moin sascha,
wie versprochen, nun zur zweiten Aufgabe und deren Lösung:
1.) Dem Spieler ein Rätsel vorlegen. Kann ein Worträtsel, ein Zahlenrätsel, oder sonstwas sein. Die richtige Lösung wird vom Mapersteller vorgegeben und sollte der Logic des Rätsels folgen.
Als Beispiel eine Reihenaddition deren Ergebnis die Zahl 55 ist:
Dem Torwärter sind nur sieben Zahlen dieser Additionskette bekannt und die achte wird gesucht:
Erste Zahl 2 Zweite Zahl 3 Dritte Zahl 5 Vierte Zahl 8 Fünfte Zahl 13 Sechste Zahl 21 Siebte Zahl 34 Achte Zahl ??"
"Wie lautet die achte Zahl?" ...wäre dann die Zahl, die der Spieler in die Abfragezeile eingeben muss. Denkt man die Aufgabe logisch durch, dann ist die Addition der jeweiligen zwei Vorzahlen immer das Ergebnis der nächsten Zahl:
2+3=5 / 3+5=8 / 5+8=13 / 8+13=21 / 13+21=34 / 21+34= 55
Nun also zur Frage, wie löst man das funktionstechnisch.
Zunächst muss dafür gesorgt werden, dass der Spieler bei Falscheingabe weitere Versuche hat, bis letztendlich die richtige Lösung gefunden wurde.
Das geht sehr gut über zwei Distanzen und einem sog. "Doppelcallback"
Aufruf:
Code:
ZahlenSchlossCall_1()
Die Funktion dieses Doppelcallbacks:
Code:
function ZahlenSchlossCall_1()
ZahlenSchlossCall = {
EntityName = "erec",
TargetName = "zoellner",
Distance = 800,
Distance2 = 1500,
Callback = ZahlenKombi,
Callback2 = function()
ZahlenSchlossCall_1()
end
}
SetupRoExpedition(ZahlenSchlossCall)
end
Hinweis:
Für obige Funktion werden die Comfort-Funktionen:
Code:
function SetupRoExpedition(_table)
myExpedition = myExpedition or {}
table.insert(myExpedition,_table)
if not gvRoExpedition then
gvRoExpedition = StartSimpleJob("UeberwacheRoExpedition")
end
end
function UeberwacheRoExpedition()
for i = table.getn(myExpedition) ,1, -1 do
if IsNear(myExpedition[i].EntityName,myExpedition[i].TargetName,
myExpedition[i].Distance) and not myExpedition[i].fertig then
if myExpedition[i].Callback() then table.remove(myExpedition,i) return end
if not myExpedition[i].Distance2 then
table.remove(myExpedition,i)
else
myExpedition[i].fertig =true
end
end
if myExpedition[i].Distance2 and myExpedition[i].fertig then
if not IsNear(myExpedition[i].EntityName,myExpedition[i].TargetName,
myExpedition[i].Distance2) then
local func = myExpedition[i].Callback2
table.remove(myExpedition,i)
func()
end
end
end
if table.getn(myExpedition) == 0 then
gvRoExpedition = nil
return true
end
end
... benötigt!
Nun aber zur Eingabe-Funktion:
Code:
function ZahlenKombi()
if geschafft then return true end
XGUIEng.ShowWidget( XGUIEng.GetWidgetID( "ChatInput" ), 1 )
GameCallback_GUI_ChatStringInputDone = function (_M)
if string.upper(_M) == "55" then
Camera.FollowEntity(GetEntityId("zoellner"))
local briefing = {}
BRIEFING_ZOOMDISTANCE = 2500
BRIEFING_ZOOMANGLE = 35
local AP, ASP = AddPages(briefing)
ASP("zoellner","Zoellner","Ja genau! Das ist die richtige Zahl.")
briefing.finished = function()
geschafft = true
function ZahlenSchlossCall_1() end
-- Folgefunktion. Also hier Tor gegen ein offenes Tor replacen.
end
StartBriefing(briefing);
else
Camera.FollowEntity(GetEntityId("zoellner"))
local briefing = {}
BRIEFING_ZOOMDISTANCE = 2500
BRIEFING_ZOOMANGLE = 35
local AP, ASP = AddPages(briefing)
ASP("zoellner","Zoellner"," Nein, das war nicht die richtige Zahl. "..
"Geht ein Stück zurück, komm wieder und versucht es noch mal.")
briefing.finished = function()
end
StartBriefing(briefing);
end
end
end
Kurze Erklärung:
Erreicht "erec" die Entity "zoellner" auf der ersten Ditanz von 800, wird die Eingabezeile aufgerufen. Bei richtiger Lösung wird das "Doppelcallback" beendet und die Folgefunktion eingeleitet.
Wird eine Falsche Lösung eingegeben, wird die zweite Distanz von 1500 abgefragt und bei Erreichen, die function ZahlenSchlossCall_1() erneut eingeleitet.
Hinweis:
Für die obige Briefing-Form werden die Comfort-Funktionen:
Code:
function AddPages( _briefing )
und
Code:
function CreateShortPage( _entity, _title, _text, _dialog, _explore)
...mit allem was dazugehört benötigt!
Ich hoffe, das alles hilft Dir bei Deiner Frage weiter.
Lesezeichen