Inhaltsverzeichnis

Zahlenschloss

Vielleicht kennt ihr noch das Zahlenschloss Tutorial aus HL1. In HL2 ist es ebenfalls möglich, ein Zahlenschloss zu realisieren, doch bei weitem nicht so aufwendig, wie in HL1, dafür aber ein bisschen Komplizierter. Sehr gute Kenntnisse des Input/Output-Systems von HL2 sind aber schon voraussetzung.

Das Prinzip

Die Idee ist folgende: Man hat 10 Zahlentasten. Wenn die erste gedrückt wird, wird die Zahl *100 zu einem Pool hinzuaddiert. Wird die zweite Taste gedrückt, wird diese Zahl *101 auch zum Pool addiert. So erhält man in diesem Pool eine Zahl, dessen Zahlenreihenfolge genau umgekehrt dem Code entspricht. Soviel zur Theorie, jetzt zur Praxis.

Die Tasten

Was natürlich für ein Zahlenschloss unentbehrlich ist, sind die Tasten. Deshalb mappen wir hier mal 11 Tasten, für jede Zahl von 0 bis 9 eine (die Zahlentasten), und noch eine weitere um das Ganze zurück zu setzen (die Resettaste).

code_buttons.jpg

Jede dieser Tasten macht ihr zu einem separaten func_button. Die Einstellungen sind hier nicht sonderlich wichtig, wichtig sind für uns später nur die Outputs.

Die Schaltung

Für unsere Schaltung brauchen wir folgende Entities:


Nehmen wir den ersten math_counter. Dieser verarbeitet den Rohwert der Zahlentasten, ich nenne ihn mal math_wert. Diesem math_counter tragen wir nun als Initial Value 1 ein. Der zweite math_counter sammelt alle Eingaben der Zahlentasten, und hat eine Initial Value von 0. Ich nenne ihn math_pool. Der dritte math_counter dient als eine Art Exponent und so nenne ich ihn math_exp, und hat eine Inital Value von 1.

Die Zahlentasten

Jetzt brauchen wir erst mal die Outputs aller Zahlentasten. Und zwar erstellt ihr hier bei jedem func_button folgende Outputs, wobei <zahlenwert> der Nummer der Zahlentaste entspricht (Beachtet die 0.05s Delay beim zweiten Output!):

Output Target Entity Target Input Parameter Delay
OnIn math_wert Multiply <zahlenwert> 0.00
OnIn math_exp Multiply 10 0.05


Die Zahlentasten sind nun soweit fertig. Kommen wir zurück zu den math_counters.

Der Pool

Nun haben wir einen Zahlenwert, der mit der 1 im math_counter math_wert multipliziert wird. Dieser Wert addieren wir nun mit folgendem Output des ersten math_counters math_wert zum zweiten math_pool:

Output Target Entity Target Input Parameter Delay
OutValue math_pool Add <none> 0.00


Etwas wichtiges fehlt jetzt aber noch! Und zwar der Output des dritten math_counters math_exp. Dieser wird ja bei jedem Tastendrück um 10 multipliziert. Und damit uns das auch was bringt, erstellen wir beim math_counter math_exp noch folgenden Output:

Der Exponent

Output Target Entity Target Input Parameter Delay
OutValue math_wert SetValueNoFire <none> 0.00


Nun wird kontinuierlich bei jedem Tastendrück ein neuer Wert zum zweiten math_counter math_pool addiert. Der Wert im math_counter math_pool entspricht nun unserem eingegeben Code, wenn man ihn von hinten nach vorne liest. Was bringt es jedoch ein Code einzugeben, wenn dieser nicht auf Korrektheit geprüft werden kann? Deshalb nehmen wir uns jetzt das logic_compare vor.

Der Vergleich

Gebt dem logic_compare einen Namen, mit dem ihr es triggern könnt. Die Initial Value lassen wir auf 0, und bei der Compare Value können wir jetzt unseren Code eingeben, also der den man in umgekehrter Reihenfolge eingeben muss. Also geben wir hier 4321 ein, damit der Spieler später 1234 drücken muss.

So, jetzt haben wir das logic_compare, aber es hat erst den Referenzcode. Jetzt erstellen wir beim zweiten math_counter math_pool folgenden Output:

Output Target Entity Target Input Parameter Delay
OutValue <logic_compare> SetValueCompare <none> 0.00


So, jetzt sollte unsere Zahlenschloss schon richtig funktionieren, vorausgesetzt, man gibt beim ersten Mal gleich den richtigen Code ein.

Die Reset-Funktion

Damit der Spieler nach einer falschen eingabe das Spiel nicht nochmal neu laden muss, fügen wir eine Reset-Funktion ein. Dazu benötigen wir die elfte Taste, also die Resettaste und unser übriggebliebenes logic_relay.

Das logic_relay nennen wir irgendwie relay_reset oder so. Das ist wie immer, eure entscheidung, ihr müsst es einfach später wieder finden. Als Output geben wir hier nun folgendes ein:

Output Target Entity Target Input Parameter Delay
OnTrigger math_wert SetValueNoFire 1 0.00
OnTrigger math_pool SetValueNoFire 0 0.00
OnTrigger math_exp SetValueNoFire 1 0.00
OnTrigger <logic_compare> SetValue 0 0.00


Dieses logic_relay müssen wir nun nur noch triggern. Dazu haben wir ja unsere Resettaste. Hier fügen wir einen ganz simplen Output ein:

Output Target Entity Target Input Parameter Delay
OnIn relay_reset Trigger <none> 0.00


Das Ziel

Damit jetzt aber überhaupt etwas passiert, wenn wir den richtigen Code eingeben, müssen wir natürlich noch bei unserem logic_compare einen Output erstellen. Was genau wie getriggert wird ist euch überlassen. Wichtig ist nur, dass es mit dem Output OnEqual ausgelöst wird, d.h. wenn nämlich unser Code korrekt eingegen wurde.

Wir haben es geschafft. Das Zahlenschloss funktioniert, und ich bin auch bald fertig mit diesem Tut. So, jetzt nur noch testen obs funktioniert, und wenns nicht funktioniert Richman aus dem Forum anhauen. ;-)

Beachtet: Das Zahlenschloss funktioniert offenbar nur bis zu 9 Stellen!

Ich wünsche weiterhin noch viel Spass und Erfolg, und dass ihr die Tutorials intensiv nutzen möget!

Download Beispielmap

Zahlencode Beispielmap

Bemerkungen

Eurer Fantasie sind keine Grenzen gesetzt!

Richman 2005/08/03 02:17