Skip to content

Commit

Permalink
Tiberium Wars Replay Reader 0.9.5 from 2008-03-29
Browse files Browse the repository at this point in the history
  • Loading branch information
Chrissyx committed Jan 9, 2021
1 parent 6f2e127 commit c8b6949
Show file tree
Hide file tree
Showing 2 changed files with 55 additions and 33 deletions.
9 changes: 5 additions & 4 deletions doku.htm
Original file line number Diff line number Diff line change
Expand Up @@ -8,19 +8,20 @@
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
</head>
<body>
<h1>Tiberium Wars Replay Reader V0.9.2</h1>
<h1>Tiberium Wars Replay Reader V0.9.5</h1>
Ab V0.9.5 auch mit Support für Kanes Rache!<br><br>
<table border="1">
<tr><th>Eintrag im Array</th><th>Bedeutung</th><th>Erklärung</th></tr>
<tr><td>$replay[file]</td><td>Dateiname</td><td>Name der Replaydatei mit Endung</td></tr>
<tr><td>$replay[size]</td><td>Größe</td><td>Größe der Replaydatei in KB</td></tr>
<tr><td>$replay[name]</td><td>Spielname</td><td>Name des Spiels</td></tr>
<tr><td>$replay[desc]</td><td>Spielbeschreibung</td><td>Beschreibung des Spiels</td></tr>
<tr><td>$replay[mapname]</td><td>Kartenname</td><td>Name der gespielten Karte</td></tr>
<tr><td>$replay[picname]</td><td>Kartenbild</td><td>Alternativer Dateiname zur Darstellung eines Bildes der Karte ohne '</td></tr>
<tr><td>$replay[picname]</td><td>Kartenbildname</td><td>Alternativer Dateiname zur Darstellung eines Bildes der Karte ohne '</td></tr>
<tr><td>$replay[date]</td><td>Datum</td><td>Datum und Uhrzeit, wann das Spiel stattfand (dd.mm.yyyy, hh:mm:ss)</td></tr>
<tr><td>$replay[ini]</td><td>INI File Chunk</td><td><b>ARRAY</b> mit weiteren Angaben</td></tr>
<tr><td>$replay[ini][mapfilename]</td><td>Dateiname Karte</td><td>Pfad und Dateiname der Karte ohne Endung</td></tr>
<tr><td>$replay[ini][gametype]</td><td>Spielart</td><td>Beinhaltet mehrere Angaben zur Art des Spiels (Offline, Online, Unranked, Ranked, Clan, 1 vs. 1, 2 vs. 2)</td></tr>
<tr><td>$replay[ini][gametype]</td><td>Spielart</td><td>Beinhaltet mehrere Angaben zur Art des Spiels (Offline, Gefecht, LAN, Online, Unranked, Ranked, Clan, 1 vs. 1, 2 vs. 2)</td></tr>
<tr><td>$replay[ini][gamespeed]</td><td>Spielgeschwindigkeit</td><td>Spielgeschwindigkeit in Prozent</td></tr>
<tr><td>$replay[ini][startcash]</td><td>Startgeld</td><td>Startgeld in Dollar</td></tr>
<tr><td>$replay[ini][bc]</td><td>BattleCasted</td><td>Ob das Spiel über BattleCast veröffentlicht wurde (Ja, Nein)</td></tr>
Expand All @@ -42,7 +43,7 @@ <h1>Tiberium Wars Replay Reader V0.9.2</h1>
<tr><td>$replay[ini][players][<i>X</i>][aitype]</td><td>Persönlichkeit</td><td><i>Nur bei Computern:</i> Persönlichkeit der KI</td></tr>
<tr><td>$replay[ini][matchtype]</td><td>Spieltyp</td><td>Typ des Spiels (Automatch, Eigenes Match)</td></tr>
<tr><td>$replay[official]</td><td>Offizielle Karte</td><td>Ob eine offizielle Karte verwendet wurde (true, false)</td></tr>
<tr><td>$replay[version]</td><td>Version</td><td>Benutzte Version von Tiberium Wars</td></tr>
<tr><td>$replay[version]</td><td>Version</td><td>Benutzte Version von Tiberium Wars bzw. Kanes Rache</td></tr>
<tr><td>$replay[length]</td><td>Dauer</td><td>Länge des Spiels in Minuten (mm:ss)</td></tr>
</table>
</body>
Expand Down
79 changes: 50 additions & 29 deletions twrr.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
#######################################################################

# Tiberium Wars Replay Reader (TWRR)
# Version: 0.9.2 (2008-03-08)
# Version: 0.9.5 (2008-03-29)
# Thanks to...
# ...Quicksilver for GRR source code and inspiration
# ...MerlinSt for helpful hints and code fragments
Expand All @@ -17,19 +17,38 @@
# Gibt die Partei eines Spielers anhand des gegebenen Wertes zurück.
# (Returns the faction of a player by the given value.)
#
function getFaction($faction)
function getFaction($faction, $kw)
{
switch ($faction)
{
case -1: //Menschlicher Spieler mit zufälliger Partei (Human player with random faction)
case 1: return "Zufall"; //CPU Spieler mit zufälliger Partei (AI player with random faction)
case 2: return "Zuschauer"; //(Observer)
case 3: return "Kommentator"; //(Commentator)
case 6: return "GDI";
case 7: return "Nod";
case 8: return "Scrin";
default: return "<b>UNBEKANNT!</b>";
}
if ($kw)
switch ($faction)
{
case -1: //Menschlicher Spieler mit zufälliger Partei (Human player with random faction)
case 1: return "Zufall"; //CPU Spieler mit zufälliger Partei (AI player with random faction)
case 2: return "Zuschauer"; //(Observer)
case 3: return "Kommentator"; //(Commentator)
case 6: return "GDI";
case 7: return "Steel Talons";
case 8: return "ZOCOM";
case 9: return "Nod";
case 10: return "Schwarze Hand"; //(Black Hand)
case 11: return "Kanes Jünger"; //(The Marked of Kane)
case 12: return "Scrin";
case 13: return "Reaper-17";
case 14: return "Traveler-59";
default: return "<b>UNBEKANNT!</b>";
}
else
switch ($faction)
{
case -1: //Menschlicher Spieler mit zufälliger Partei (Human player with random faction)
case 1: return "Zufall"; //CPU Spieler mit zufälliger Partei (AI player with random faction)
case 2: return "Zuschauer"; //(Observer)
case 3: return "Kommentator"; //(Commentator)
case 6: return "GDI";
case 7: return "Nod";
case 8: return "Scrin";
default: return "<b>UNBEKANNT!</b>";
}
}

#
Expand Down Expand Up @@ -57,7 +76,7 @@ function getColor($color)
# Parst den INI String des Replays und gibt die Werte zurück.
# (Parse the INI string from the replay and returns the values.)
#
function parseINIString($ini)
function parseINIString($ini, $kw)
{
//String kürzen und auflösen (Trim and split string)
$ini = explode(";", substr($ini, 3, strlen($ini)-4)); //print_r($ini); //debug
Expand Down Expand Up @@ -91,8 +110,8 @@ function parseINIString($ini)
//Spielart bestimmen (Get game type)
switch (substr($rules[0], 3))
{
case 1: $iniarray['gametype'] = "Offline"; break;
//case 2: TODO! (unknown, maybe offline LAN games?)
case 1: $iniarray['gametype'] = "Offline, Gefecht"; break;
case 2: $iniarray['gametype'] = "Offline, LAN"; break;
case 3: $iniarray['gametype'] = "Online, Unranked"; break;
case 4: $iniarray['gametype'] = "Online, Ranked, 1 vs. 1"; break;
case 5: $iniarray['gametype'] = "Online, Ranked, 2 vs. 2"; break;
Expand Down Expand Up @@ -130,7 +149,7 @@ function parseINIString($ini)
#2 -> unknown number?
#3 -> Match type (FT=Automatch, TT=Custom match)
#4 -> Color: -1=random
#5 -> Faction: 6=GDI, 7=Nod, 8=Scrin, -1=random
#5 -> Faction: 6=GDI, 7=Nod, 8=Scrin, -1=random / KW: 6=GDI, 7=Steel Talons, 8=ZOCOM, 9=Nod, 13=Reaper-17, 14=Traveler-59
#6 -> Map position
#7 -> Team number
#8 -> Handicap?
Expand All @@ -157,7 +176,7 @@ function parseINIString($ini)
//Farbe bestimmen (Get color)
$playerarray[$i]['color'] = getColor($player[4]);
//Partei bestimmen (Get faction)
$playerarray[$i]['faction'] = getFaction($player[5]);
$playerarray[$i]['faction'] = getFaction($player[5], $kw);
//Spielposition bestimmen (Get map position)
$playerarray[$i]['mappos'] = ($player[6] == "-1") ? "Zufällig" : ($player[6]+1);
//Team bestimmen (Get team)
Expand All @@ -182,16 +201,16 @@ function parseINIString($ini)
//Schwierigkeit bestimmen (Get difficulty)
switch ($player[0])
{
case "CE": $playerarray[$i]['diff'] = "Leicht"; break;
case "CM": $playerarray[$i]['diff'] = "Mittel"; break;
case "CH": $playerarray[$i]['diff'] = "Schwer"; break;
case "CB": $playerarray[$i]['diff'] = "Brutal"; break;
case "CE": $playerarray[$i]['diff'] = ($kw) ? "Einfache KI" : "Leicht"; break;
case "CM": $playerarray[$i]['diff'] = ($kw) ? "Mittlere KI" : "Mittel"; break;
case "CH": $playerarray[$i]['diff'] = ($kw) ? "Schwierige KI" : "Schwer"; break;
case "CB": $playerarray[$i]['diff'] = ($kw) ? "Erbarmungslose KI" : "Brutal"; break;
default: $playerarray[$i]['diff'] = "<b>UNBEKANNT!</b>"; break;
}
//Farbe bestimmen (Get color)
$playerarray[$i]['color'] = getColor($player[1]);
//Partei bestimmen (Get faction)
$playerarray[$i]['faction'] = getFaction($player[2]);
$playerarray[$i]['faction'] = getFaction($player[2], $kw);
//Spielposition bestimmen (Get map position)
$playerarray[$i]['mappos'] = ($player[3] == "-1") ? "Zufällig" : ($player[3]+1);
//Team bestimmen (Get team)
Expand All @@ -202,7 +221,7 @@ function parseINIString($ini)
switch ($player[6])
{
case 0: $playerarray[$i]['aitype'] = "Ausgewogen"; break;
case 1: $playerarray[$i]['aitype'] = "Rusher"; break;
case 1: $playerarray[$i]['aitype'] = "Rushen"; break;
case 2: $playerarray[$i]['aitype'] = "Einigeln"; break;
case 3: $playerarray[$i]['aitype'] = "Guerilla"; break;
case 4: $playerarray[$i]['aitype'] = "Dampfwalze"; break;
Expand Down Expand Up @@ -252,12 +271,12 @@ function readBinString($fp)
# Öffnet eine Replaydatei und gibt die enthaltenen Informationen als Array zurück.
# (Opens a replay file and returns the contained informations as an array.)
#
function openReplay($file)
function openReplay($file, $kw=false)
{
//Dateiname (ohne Ordner) und Größe in Kilobytes (Replay filename (without folder) and size in kilobytes)
$replay = array('file' => substr($file, strpos($file, "/")+1), 'size' => round(filesize($file)/1024) . " KB");
//Replay öffnen (Open replay)
if (!$fp = fopen($file, "r")) return false;
if (!$fp = fopen($file, "rb")) return false;
//"C&C3 REPLAY HEADER" lesen (Read header)
if (strcmp(fread($fp, 18), "C&C3 REPLAY HEADER") != 0) return false;
//19 Bytes überspringen (Skip 19 Bytes)
Expand Down Expand Up @@ -299,7 +318,7 @@ function openReplay($file)
$ini .= $temp;
$temp = fread($fp, 1);
}
$replay['ini'] = parseINIString($ini);
$replay['ini'] = parseINIString($ini, $kw);
$replay['official'] = (stristr($replay['ini']['mapfilename'], "official")) ? true : false;
//Weitere Sachen überspringen und Versionsnummer suchen (Skip some things and search version number)
do
Expand Down Expand Up @@ -338,8 +357,10 @@ function openReplay($file)
#
function streamReplay($replay, $repfile="")
{
//Handelt es sich um Kanes Rache? (Is this Kane's Wrath?)
$kw = stristr($repfile, ".KWReplay") || stristr($replay, ".KWReplay");
//Bombensicherer Name (100% not assigned name)
$repfile = "tmp/" . (($repfile && !file_exists("tmp/" . $repfile)) ? $repfile : strtr(microtime(), array(" " => "", "." => "")) . ".CNC3Replay");
$repfile = "tmp/" . (($repfile && !file_exists("tmp/" . $repfile)) ? $repfile : strtr(microtime(), array(" " => "", "." => "")) . "." . (($kw) ? "KW" : "CNC3") . "Replay");
//Falls eine ältere PHP Version als 5.0 vorliegt, dürfen nur PHP4 Funktionen benutzt werden (In case of an older PHP version than 5.0, only use PHP4 functions)
if (substr(phpversion(), 0, 1) < 5)
{
Expand All @@ -352,7 +373,7 @@ function streamReplay($replay, $repfile="")
//Datei holen und lokal speichern [PHP5] (Get file and save local [PHP5])
else file_put_contents($repfile, file_get_contents($replay));
//Infos auslesen (Read infos)
$replay = openReplay($repfile);
$replay = openReplay($repfile, $kw);
//Replay wieder löschen (Finally delete replay)
unlink($repfile);
//Infos zurückgeben (Return infos)
Expand Down

0 comments on commit c8b6949

Please sign in to comment.