Hallo,
ich habe einen neuen Offline Kampfsimulator geschrieben. Natürlich gibt es bereits andere Simulatoren, die allen bekannt sein sollten. Allerdings sind sie nur geeignet um einen festen Zustand des Spiels zu simulieren. Änderungen im Spiel (z.B. neue Einheiten oder Anpassungen bestehender Einheiten) können nicht simuliert werden, zumindest solange nicht bis der Simulator aktualisiert wird.
Der neue Simulator versucht diese Lücke zu schließen, indem alle Daten aus Textdateien gelesen werden. Damit hat der Benutzer die Möglichkeit die Einheiten selber zu aktualisieren oder auch aus Spaß an der Freude nach seinen Vorstellungen anzupassen. Da diese Möglichkeiten nicht für alle (oder viele) Spieler relevant sind, ist der Simulator "einfach" implementiert und enthält auch keine grafische Oberfläche, d.h. es ist eine Konsolenanwendung (obwohl man es sich so einrichten kann, dass man trotzdem nur mit einem Mausklick simulieren kann).
Der Simulator kann hier heruntergeladen werden - aktuell ist Version v1_8946 : https://googledrive.com/host/0B6VRI6...dhc0lYZlV6ZGc/
(Beide Varianten *_mingw_* und *_msvc10_* sollten funktionieren, und sind nur mit verschiedenen Kompilern erzeugt)
Der Quellcode kann bei Interesse hier eingesehen werden : https://code.google.com/p/tsosim/
Die zip Dateien enthalten eine EXE Datei (den Simulator) und ein 'data' Verzeichnis, wo bereits alle Dateien enthalten sind welche alle Einheiten und eine Beispielkarte (IDF) definieren. Ebenfalls ist eine Datei für eine Beispielsimulation enthalten (data/sim_ex.txt).
Den Simulator ruft man wie folgt auf :
Code:
$> tsosim pfad/zur/simulationsdatei.txt
$> tsosim pfad/zur/simulationsdatei.txt > ausgabedatei.txt
$> tsosim pfad/zur/simulationsdatei.txt -out ausgabedatei.txt
Im ersten Fall erfolgt die Ausgabe direkt in der Konsole. Fall die Ausgabe lang ist, ist es empfehlenswert diese in eine Datei umzuleiten (zweite Variante) oder direkt in eine Datei zu schreiben (dritte Variante). Wenn man eine Verknüpfung auf den Simulator mit den entsprechenden Pfaden erzeugt, dann kann man mit einem Mausklick ein neues Simulationsergebnis erzeugen.
Im Folgenden möchte ich das Format der Simulationsdatei kurz erklären. Eine genauere Beschreibung ist in den mitgelieferten Dateien enthalten.
Eine einfache Simulation besteht aus der Definition von zwei Garnisonen und der Simulation selbst
Code:
-- Das ist eine Kommentarzeile
-- hier muss man den Pfad eintragen, der zu den mitgelieferten Textdateien zeigt
#usepath "D:/Pfad/zu/den/Daten"
-- relativer Pfad zu den Einheitendefinitionen, wenn man #usepath nicht benutzt, dann muss man hier einen
-- absoluten Pfad eintragen
#import "units/units.txt"
-- Spieler-Garnison
#garrison : player_1
Recruit : 100
Soldier : 300
General : 1
-- Computer-Garnison
#garrison : computer_1
Elite : 500
-- einfache Simulation, welche nur eine Statistik mit 100 Iterationen berechnet
#sim : player_1, computer_1
-- Simulation mit 200 Iterationen,
-- die Garnisone werden modifiziert, d.h. sie haben am Ende weniger Einheiten als zuvor
-- zusätzlich zu den Statistiken (STATS) wird eine detailierte Kampfbeschreibung (LOG) ausgegeben
#sim : player_1, computer_1
repeats : 200
modify : 1, 1
results : STATS, LOG
-- zweite Spieler-Garnison
#garrison : player_2
Militia : 200
Cannon : 300
General : 1
-- zweite Welle (weil der Angriff auf 'computer_1' davor modifizierend erfolgte)
#sim : player_2, computer_1
modify : 1,1
Wie man sieht, können beliebige Garnisonsgrößen gewählt werden. Aus dieser Freiheit erwächst natürlich auch eine Pflicht, dass für eine Simulation des derzeitigen Spielzustandes man selber aufpassen muss, dass nicht mehr als 250 (270) Einheiten mitgenommen werden.
Es können neue Einheiten definiert oder derzeitige Einheiten angepasst werden. So kann z.B. den Kanonieren die Fähigkeit zum Flächenschaden gegeben werden (dass ist zwar derzeit im Spiel nicht möglich, aber vielleicht kann man das machen wenn das Forschungssystem erweitert wird).
Code:
-- neue Einheit
#unit : unit_ID, unit_name
hitpoints : 123545
damage : 20, 500
accuracy : 99
skills : SPLASH_DAMAGE, FIRST_STRIKE
attack_id : 23546
-- attack_id wird benutzt im die Reihenfolge beim Angriff festzulegen (vergleiche dazu die IDs der anderen Einheiten)
-- Einheit umbenennen
#unit : u_Can, Kanonier
-- Einheitenparameter ändern
#unit : u_Can, Kanonier
skills : LAST_STRIKE, SPLASH_DAMAGE
Einer Einheit kann ein anderer Name vergeben werden. Wenn man Sonderzeichen benutzt, dann sollte man die Dateien im UTF-8 Format abspeichern, ansonsten können Fehler in der Ausgabe entstehen (siehe auch data/units/units_de.txt). Wenn man Einheitenparameter ändert, dann werden die angegebenen Werte geändert. Anderer Parameter bleiben erhalten, d.h. wenn man den 'skills'-Parameter ändert, dann bleibt 'damage' etc. so wie ursprünglich definiert.
Soviel zu der ersten Version des Simulators. Weitere Infos und Details können in den mitgelieferten Dateien (und im Quellcode) gefunden werden. Ich würde mich über Kommentare und weitere Anregungen freuen.