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

Bemerkungen

  • Es wäre auch möglich, das Zahlenschloss mit weniger als zehn Tasten zu realisieren. Es dürfen einfach nicht mehr sein. So könnte man auch nur drei Tasten machen, mit denen man einen Code eingeben kann. Man muss das einfach beim Referenzcode im logic_compare berücksichtigen.
  • Wie ihr den Reset machen wollt, ist euch überlassen. Das mit der Resettaste ist meine Idee. Ihr könnt es aber auch so lösen, dass ihr bei jeder Zahlentaste eine 1 zu einem vierten math_counter addiert. Somit könnt ihr je nach Maximalwert des vierten math_counter eine Zahlenkombiation mit beispielsweise höchstens vier oder sechs oder was weiss ich wieviel Zahlen vorgeben. Dann müsst ihr dem Spieler, beispielsweise mit einem Sound nur noch erklären, dass der von ihm eingegebene Code ungültig, bzw gültig war.
  • Der Code lässt sich übrigens ganz bequem, sogar InGame ändern. Aktiviert dazu sv_cheats 1 und gebt dann in die Console ent_fire <logic_compare> SetCompareValue 765 ein, wobei dann 765 der neue Code in umgekehrter Reihenfolge ist (der Spieler muss dann 567 eingeben).
  • Man könnte sogar mit einem logic_case mit dem Input 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.
  • Die Anzahl Stellen sind zwischen 1 und 9 frei wählbar. So kann mit oben genannten Varianten der Code auch unterschiedlich schwierig geändert werden, so dass dieser halt mal nur zwei und ein anderemal sechs Stellen hat.
  • Es ist sogar möglich, mehrere gültige Kombinationen zu machen. Dazu braucht ihr einfach ein logic_case anstelle des logic_compare. So könnte man dann je nach Code ein anderes Ereignis triggern, und das Zahlenschloss dann vielleicht als eine Art Telefon, oder sogar als Stargate Wahlgerät verwenden. ;-)

Eurer Fantasie sind keine Grenzen gesetzt!

Richman 2005/08/03 02:17

Die Verwendung aller Dokumente einschließlich der Abbildungen ausschließlich zu nichtkommerziellen Zwecken. Verbreitung des Dokuments auf Speichermedien, (insbesondere auf CD-ROMs als Beilage zu Zeitschriften und Magazinen oder sog. "Mission-Packs" etc.) ist untersagt.
 
half-life_2/tutorials/zahlenschloss.txt · Zuletzt geändert: 2010/06/16 23:18 von Adrian_Broher