Frequenz
Das IR-Signal hat grundlegend eine Frequenz von 38 kHz. Ohne die Frequenz reagieren die IR-Empfänger Vishay TSOP 31238 nicht auf das Infrarotlicht.
Daten-Pakete
Ein Schuss besteht aus folgenden Daten:
[header] + [1. byte] + [2. byte] + [1 parity bit]
Der “Header” wird mit der Dauer von 2400 μs gesendet.
Ein Bit mit dem Wert “1” wird mit der Dauer von 1200 μs gesendet.
Ein Bit mit dem Wert “0” wird mit der Dauer von 600 μs gesendet.
Zwischen dem “Header”, der “1” oder “0” gibt es Pausen des Lichtsignals mit einer Dauer von 600 μs Dauer.
Inhalte der Daten eines Schusses:
[header] [0ppppppc] [tttddddd] [k]
Bedeutung der Bytes:
[0ppppppc]
Das erste Bit im ersten Byte ist eine 0 (Null). Dies bedeutet, dass es sich hierbei um einen virtuellen Schuss handelt. Danach folgt die SpielerID in den nächsten 6 Bit.
Ist das erste Bit eine 1, so handelt es sich hier um ein Kommando/System-Befehl.
Mit 6 Bit für die SpielerID lassen sich maximal 64 Spieler adressieren. Allerdings würde ich Spieler mit ID 0 vorerst nicht verwenden und erstmal ohne Verwendung markieren.
Dezimal-Wert | SpielerID |
---|---|
0 | nicht verwendet |
1-63 | SpielerID 1-63 |
Das letzte Bit gibt an, ob es sich beim Schuss um einen kritischen Treffer handelt. Kritische Treffer können zum Beispiel doppelten Schaden machen, oder den Gegner für eine kurze Zeit reaktionsunfähig machen. Wichtig an dieser Stelle: Wenn der Schuss kritisch ist, also das 8. Bit ist “1”, dann bleibt der eigentliche Schadenswert trotzdem identisch. Bedeutet, wenn die Waffe pro Schuss normalerweise 30 Schaden macht, dann wird bei einem kritischen Treffer beim senden daran nichts verändert. Nur das c-Bit wird 1 gesetzt.
Die Verdopplung des Schadens geschieht dann erst beim Empfänger. Das hat folgenden Hintergrund: ich kann mir vorstellen durch Power-Ups oder durch Spielerklassen (Sniper, Nahkampf, etc) eine gewisse natürliche Abhärtung gegen Kritische Treffer einzubauen. Das bedeutet, dass obwohl der Sender einen Kritischen Schuss gesendet hat, der Empfänger es aber ignoriert, weil genügend Abhärtung vorhanden ist (durch virtuelle Panzerung zum Beispiel).
[tttddddd]
Die ersten 3 Bit des 2. Bytes stehen für die TeamID. Mit 3 bit lassen sich maximal 8 Teams definieren. Das Team mit der ID 0 würde ich nun auch erst einmal nicht verwenden, allerdings könnte ich mir später eine Ausarbeitung als “Enviroment Damage” vorstellen, zum Beispiel als Radioaktivität, Feuer, Chemieschaden, Krankheit, etc.
Dezimal-Wert | Team |
---|---|
0 | Umgebungsschaden |
1 | Team Rot |
2 | Team Blau |
3 | Team Grün |
4 | Team Gelb |
5 | Team Rosa |
6 | Team Lila |
7 | Team Schwarz |
Die nächsten 4 Bit des 2. Bytes beinhalten den erzeugten Schaden der Waffe. Da sich mit 4 Bit nur 32 Werte übertragen lassen, müssen wir an dieser Stelle etwas kreativer sein.
Damage Mapping
Wert | erzeugter Schaden |
---|---|
0 | nicht verwendet |
1 | 1 |
2 | 2 |
3 | 3 |
4 | 4 |
5 | 5 |
6 | 7 |
7 | 9 |
8 | 11 |
9 | 13 |
10 | 15 |
11 | 18 |
12 | 21 |
13 | 24 |
14 | 27 |
15 | 30 |
16 | 35 |
17 | 40 |
18 | 45 |
19 | 50 |
20 | 60 |
21 | 70 |
22 | 80 |
23 | 90 |
24 | 100 |
25 | 115 |
26 | 130 |
27 | 145 |
28 | 160 |
29 | 180 |
30 | 200 |
31 | one shot kill |
Das letzte parity Bit folgt nach den 2 Byte. Es ist das 17. Bit und damit das letzte Bit in einem Schuss. Es dient als Prüfziffer. Und das funktioniert so: Es werden die “Einsen” eines Schusses gezählt. Ist die Zahl gerade, wird das parity Bit “0”. Ist die Zahl der Einsen ungerade, wird das parity Bit “1”. Somit kann man einen “falschen” Schuss schnell erkennen und aus der Wertungsberechnung ausschließen.
Beispiele:
0001 0010 0100 1101 0
shot – Player 9 – no crit – Team 2 – Damage 24 (13) – parity 0
0100 1101 1101 0110 1
shot – Player 38 – crit – Team 6 – Damage 80 (22) – parity 1