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.
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.
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).
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.
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.
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.
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:
| 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.
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.
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 |
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!
PickRandom und einem leichten Umbau der Schaltung, ein Zahlenschloss mit einer zufälligen Kombination generieren, dass z.B. alle 5min die Kombination ändert. Diese könnt ihr dann beispielsweise in einem Kontrollraum auf der anderen Seite der Map anzeigen, um das Teamplay ein bisschen anzukurbeln.
Eurer Fantasie sind keine Grenzen gesetzt!
— Richman 2005/08/03 02:17