#! /usr/bin/perl # # Dateiname: autozug.pl # benutzt: config.inf als Konfigurationsdatei für Schiffsaktionen # produkte.txt als Konfigurationsdatei für verkäufliche Produkte # # Zweck: Liest die UV5-Auswertung und erstellt eine Zugdatei. # # Bisher implementiert: # WERFT TANKEN für alle Schiffe, die tanken können # STATION TANKEN für alle Schiffe, die tanken können # SPEICHER ENTLADEN für alle in ../config.inf eingetragenen Schiffe # STATION VERKAUF für alle eigenen Schiffe und alle verkäuflichen Produkte # SCHIFF RICHTUNG und # SCHIFF GESCHWINDIGKEIT für alle in ../config.inf eingetragenen Schiffe # MINE ABBAUEN für Minen ohne Ertrag # SPEICHER ABBAUEN für Speicher ohne Ertrag # # ... und eine kleine Statistik. # # Autor: Peter Gallert (pgallert@chronator.ch) # frei nach Ideen und Vorlagen von Robin Ebser # ######################################################################################################## $config = "../config.inf"; $produkte = "../produkte.txt"; open (CFG, "$config") || die("Kann $config nicht öffnen.\n"); ### Einlesen aus config.inf @zeilen = ; print "\nLese Konfigurationsdatei $config "; foreach $zeile(@zeilen){ if ($zeile =~ /Route: ([^,]*),(\S*)/) { ### $1 = Schiffsname, $2 = Route $route{$1} = $2; print "."; } if ($zeile =~ /Einladen: ([^,]*),(.*)/) { ### wer soll wo einladen $solleinladen{$1} = $2; print "."; } if ($zeile =~ /Ausgabe nach: (.*)/g) { ### Was ist die Ausgabedatei $zugdatei = "../".$1; print "."; } if ($zeile =~ /Einlesen aus: (.*)/g) { ### Was ist die Auswertung $auswertung = "../".$1; print "."; } } print "\n"; close CFG; open (PRD, "$produkte") || die("Kann $produkte nicht öffnen.\n"); ### Einlesen aus produkte.txt @zeilen = ; print "Lese Produktdatei $produkte "; foreach $zeile (@zeilen) { chomp $zeile; unless ($zeile =~ /#.*/g) { ### Zeile auskommentiert? push (@waren,$zeile); print "."; } } print "\n"; close PRD; open (AUS, "$auswertung") || die("Kann $auswertung nicht öffnen.\n"); @zeilen = ; $hs = "nein"; $werft = "nein"; $verkaufen = "ja"; $planet_aktuell = 0; print "Lese Auswertungsdatei $auswertung "; foreach $zeile(@zeilen) { if ($zeile =~ /Name: (\w+)/) { ### Spielername gefunden ! $spielername = $1; } if ($zeile =~ /.* \((\d+?)\) \(.*?\) \(([\d\-]+?),([\d\-]+).*/) { ### Planet gefunden ! push (@planeten, $1); $planet_aktuell = $1; $xkoordinate{$1} = $2; $ykoordinate{$1} = $3; $hs = "nein"; ### Info zu HS erneuern $werft = "nein"; ### Info zu Werft erneuern %speicher = (); ### Info zu Speichern erneuern print "."; } if ($zeile =~ /# SpeicherFeld (\d+?), \d+ FUs: \d+ BRT Speicherplatz. Gelagert werden (\d+) BRT .*./) { $speicher{$1} = $2; ### Speicherfeld gefunden ! } if ($zeile =~ /# Werft .* \(\d\), 200 FUs/) { ### Werft gefunden ! $werft = "ja"; ### Info zu Werft erneuern } if ($zeile =~ /§ Handelsstation.*/) { ### HS gefunden ! $hs = "ja"; ### Info zu HS erneuern } if ($zeile =~ /# Agrarfeld (\d+),.*\.0 BRT Ertrag./) { ### Nutzloses Agrarfeld gefunden! push (@planetenzuege, "AGRARFELD ABBAUEN, $planet_aktuell, $1\n");### weg damit } if ($zeile =~ /# Mine (\d+),.*Nichts gefunden./) { ### Nutzlose Mine gefunden! push (@planetenzuege, "MINE ABBAUEN, $planet_aktuell, $1\n"); ### weg damit } if ($zeile =~ /\* Schiff (.*) \((.*)\) (\d+) BRT/) { ### Schiff gefunden! $letztesschiff = $1; if ($2 eq $spielername) { ### Schiff gehört mir! push (@meineschiffe, $1); $besitzer{$1} = $2; $tonnage{$1} = $3; $hs{$1} = $hs; $werft{$1} = $werft; $orbit{$1} = $planet_aktuell; } else { ### Schiff gehört nicht mir! push (@fremdeschiffe, $1); $besitzer{$1} = $2; $tonnage{$1} = $3; $hs{$1} = $hs; $werft{$1} = $werft; $orbit{$1} = $planet_aktuell; } if ($solleinladen{$planet_aktuell} eq $1) { ### Schiff soll Produkte transportieren foreach $item(keys %speicher) { push (@schiffszuege, "SPEICHER ENTLADEN, $item, $speicher{$item}, \"$1\"\n"); } %speicher = (); } } if ($zeile =~ /Treibstofftanks: (\d+)\/(\d+) BRT/) { ### Schiffsstatus: Tank und Traktorstrahl gefunden ! $tankinhalt{$letztesschiff} = $1; $tankvolumen{$letztesschiff} = $2; } if ($zeile =~ / (\d+). (.*?) \((\d+) BRT, (.+)\)/) { ### Schiffsladung auf eigenem Schiff gefunden ! $verkaufen = "nein"; foreach $item (@waren) { if ($item eq $2) { $verkaufen = "ja"; } } if ($hs{$letztesschiff} eq "ja" && $verkaufen eq "ja" && $4 eq $spielername) { push (@schiffszuege, "STATION VERKAUF, \"$letztesschiff\", $1\n"); } } if ($zeile =~ /Zone.*\(\d+\) \((.*)\) \((\d+) FUs\)/) { ### Planet: Zone gefunden! if ($1 eq $spielername) { ### Zone gehört mir! $zonenzahl++; $zonenfu+=$2; $eigene_zone="ja"; } else { $eigene_zone="nein"; } } if ($zeile =~ /# Stadt .*, (\d+) FUs:.*/) { ### Stadt gefunden ! if ($eigene_zone="ja") { ### Stadt gehört mir! $stadtfu+=$1; $stadtzahl++; } } if ($zeile =~ /# Mine .* FUs: (.+) .*\.(\d+) BRT Ertrag./) { ### Mine mit Ertrag gefunden ! if ($eigene_zone="ja") { ### Mine gehört mir! $minenertrag{$1}+=$2; $minenzahl{$1}++; } } if ($zeile =~ /.*für gesamthaft (\d+) Cr veräussert/) { ### Verkaufserlös gefunden! $verkauf+=$1; } if ($zeile =~ /.*hat (\d+) Steuern eingebracht./) { ### Stadterlös gefunden! $stadt+=$1; } } print "\n"; foreach $schiff(sort @meineschiffe) { unless ($orbit{$schiff} == 0) { $tankmenge = $tankvolumen{$schiff} - $tankinhalt{$schiff}; if ($tankmenge > 0 && $werft{$schiff} eq "ja") { ### Hat der Planet eine Werft? - Tanken! push (@schiffszuege, "WERFT TANKEN, \"$schiff\", $tankmenge\n"); } else { if ($tankmenge > 0 && $hs{$schiff} eq "ja") { ### Hat der Planet eine HS? - Tanken! push (@schiffszuege, "STATION TANKEN, \"$schiff\", $tankmenge\n"); } } if ($route{$schiff} =~ /.*$orbit{$schiff},([^,]*)/) { ### Ist das Schiff im Orbit eines seiner Flugpunkte? if (defined $xkoordinate{$1}) { ### Gibt es den Zielplaneten? $entfernung = sqrt (($xkoordinate{$orbit{$schiff}} - $xkoordinate{$1})**2 + ($ykoordinate{$orbit{$schiff}} - $ykoordinate{$1})**2); $schub = sprintf ("%.4f", $entfernung/100); push (@schiffszuege, "SCHIFF RICHTUNG, \"$schiff\", 1, $xkoordinate{$1}, $ykoordinate{$1}\n"); push (@schiffszuege, "SCHIFF GESCHWINDIGKEIT, \"$schiff\", 1, 1, $schub\n"); } else { print "\n!Schiff $schiff: Kann Zielkoordinaten nicht extrahieren.\n"; } } } } open (ZUG, ">$zugdatei") || die("Kann $zugdatei nicht öffnen.\n"); print "Erstelle Schiffsbefehle "; foreach $schiff (sort @meineschiffe) { ### Befehle für eigene Schiffe, sortiert nach Schiffen print "."; foreach $zeile(sort @schiffszuege) { if ($zeile =~ /.*$schiff.*/) { print ZUG $zeile; $hat_befehl{$schiff} = "ja"; } } if ($hat_befehl{$schiff} eq "ja") { print ZUG "\n"; } } foreach $schiff (sort @fremdeschiffe) { ### Befehle für fremde Schiffe, sortiert nach Schiffen print "."; foreach $zeile(sort @schiffszuege) { if ($zeile =~ /.*$schiff.*/) { print ZUG $zeile; $hat_befehl{$schiff} = "ja"; } } if ($hat_befehl{$schiff} eq "ja") { print ZUG "\n"; } } print "\n"; print "Erstelle Planetenbefehle "; foreach $zeile (sort @planetenzuege) { ### Befehle für Planeten, sortiert nach Planeten print "."; print ZUG $zeile; } print "\n\n"; print "Erstelle Statistik:\n\n"; printf "Sie besitzen $zonenzahl Zonen mit insgesamt $zonenfu FUs (Schnitt: %i FU/Zone).\n", $zonenfu/$zonenzahl; printf "Sie besitzen $stadtzahl Städte mit insgesamt $stadtfu FUs (Schnitt: %i FU/Stadt).\n", $stadtfu/$stadtzahl; print "\n"; foreach $ware(@waren) { if ($minenzahl{$ware} > 0) { print "Sie besitzen $minenzahl{$ware} ", $ware."minen", ", die insgesamt $minenertrag{$ware} Ertrag gebracht haben "; printf "(Schnitt: %i BRT/Mine).\n", $minenertrag{$ware}/$minenzahl{$ware}; } } print "\n"; printf "Sie haben Waren im Wert von %.1f Mio Cr verkauft.\n", $verkauf/1000000; printf "Sie haben aus Städten %.1f Mio Cr Steuern eingenommen.\n", $stadt/1000000; print "\n"; close (AUS); close (ZUG);