Tag Archives: ColdIron

Software Engineering I, WS1112

Einleitung

ColdIron ist ein Multiplayer Echtzeit Strategiespiel. Es spielt in einer längst vergangenen Zeit, in der neben den Rohstoffen Holz und Stein insbesondere Eisen von unschätzbaren Wert ist. Um diesen Rohstoff kämpfen verschiedene Stämme und bekriegen sich auf dem Schlachtfeld mit Schwertkämpfern, Bogenschützen, Ritter und schweren Katapulten. Das Ziel ist simpel: Nur einer kann Herrscher über den kalten Stahl werden!

Die Kämpfe werden auf verschiedenen Schlachtfeldern (Karten) ausgetragen, die aus verschiedenen Sektoren bestehen. Auf jedem Sektor können die Stämme verschiedene Rohstoffe finden die zum Bau von Gebäuden und Einheiten benötigt werden.

Spielablauf

  • Um am Kampf um den Rohstoff teilzunehmen, muss zunächst in der Lobby ein Spiel erzeugt werden:CREATE GAME <gamename> (-players (<user>+))? (-map <mapname>)?Der Spielname kann frei gewählt werden. Optional können die erlaubten Spielernamen und die gewünschte Karte angegeben werden.
  • Dem erzeugten Spiel können dann verschiedene Spieler beitreten:JOIN GAME <gamename> (Siehe Command Beschreibung)
  • Nachdem einem Spiel beigetreten wurde, wechselt der Server in das JSON Protokoll. Als nächstes muss der Startsektor gewählt werden:CHOOSE_SECTOR (Siehe Command Beschreibung)
  • Sobald man bereit ist, kann das Spiel gestartet werden:START_GAME  (Siehe Command Beschreibung)Das Spiel wird erst gestartet, wenn alle am Spiel teilnehmenden Spieler einen Startsektor gewählt haben!
  • Die Spielsimulation startet und jeder Spieler bekommt regelmäßig Updates über die aktuelle Spielsituation. Zu Beginn erhält jeder Spieler ein Hauptgebäude (Stronghold), eine Farm sowie 3 Arbeiter (Peons). Nun sollte durch abbauen von Ressourcen, errichten von Gebäuden und erzeugen von Einheiten dafür gesorgt werden, dass die anderen Stämme möglichst schnell in die Schranken gewiesen werden.

Spielelemente

In diesem Abschnitt soll ein Überblick über die in ColdIron vorkommenden Spielelemente gegeben werden.

Karten

Karten besitzen einen Namen und bestehen aus Sektoren, die einer bestimmten Weise angeordnet sind. Sie können beliebig groß werden, die kleinste Karte hat 2×2 Sektoren. Wichtig: Die Anordnung der Sektoren kann auch Formen wie z.B. eine “H-Form” annehmen. Hier fehlen bspw. die Sektoren mit der Koordinaten (1,0) und (1,2). Inseln (d.h. nicht verbundene Sektoren) kommen nicht vor!

Sektoren

Ein Sektor besitzt 2D-Koordinaten die die Position des Sektors auf der Karte angeben. Hier bezeichnet die Koordinate (0,0) die linke obere Ecke der Karte und (n,n) die rechte untere Ecke der Karte. Sektoren beherbergen eine begrenzte Anzahl von Ressourcen die abgebaut werden können. Zudem können auf Sektoren Gebäude errichtet und Einheiten positioniert werden.

Ressourcen

Ohne Ressourcen läuft nichts. In ColdIron gibt es 3 verschiedene Arten von Ressourcen:

  • Wald
  • Stein
  • Eisen

Nicht jede Ressource ist auf jedem Sektor zu finden!

Gebäude

In Gebäuden werden auf Sektoren gebaut und produzieren in der Regel Einheiten. Gebäude gibt es in verschiedenen Ausbaustufen, die wiederrum das Bauen besserer Einheiten erlauben.

WICHTIG: Da das Balancing der Spielsimulation noch nicht abgeschlossen ist, können sich die bei Level X angegebenen Werte noch ändern!

Gebäude Beschreibung Level 1 Level 2 Level 3
Stronghold Hauptgebäude. Im Hauptgebäude werden Arbeiter (Peons) erzeugt die Ressourcen abbauen und Gebäude errichten können. HP: 1000
Bauzeit: 50s
Ressourcen:

  • 200 Holz

 

HP: 2000
Bauzeit: 70s
Ressourcen:

  • 200 Holz
  • 100 Steine

Benötigt:

  • Stronghold Level 1
HP: 5000
Bauzeit: 90s
Ressourcen:

  • 250 Holz
  • 250 Steine

Benötigt:

  • Stronghold Level 2
Farm Farmen erhöhen das Bevölkerungslimit. HP: 400
Bauzeit: 20s
Ressourcen:

  • 80 Holz

Benötigt:

  • Stronghold Level 1

Ermöglicht:

  • Erhöht Bevölkerungslimit um 10
Barrack In Barracken werden Einheiten rekrutiert. Es können Schwertkämpfer, Bogenschützer und Ritter rekrutiert in verschiedenen Leveln rekrutiert werden. HP: 500
Bauzeit: 30s
Ressourcen:

  • 120 Holz

Benötigt:

  • Stronghold Level 1

Ermöglicht:

  • Schwertkämpfer Level 1
  • Bogenschütze Level 1
  • Ritter Level 1
HP: 750
Bauzeit: 40s
Ressourcen:

  • 100 Holz
  • 100 Steine

Benötigt:

  • Stronghold Level 2

Ermöglicht:

  • Schwertkämpfer Level 2
  • Bogenschütze Level 2
  • Ritter Level 2
HP: 1000
Bauzeit: 50s
Ressourcen:

  • 150 Holz
  • 150 Steine

Benötigt:

  • Stronghold Level 3

Ermöglicht:

  • Schwertkämpfer Level 3
  • Bogenschütze Level 3
  • Ritter Level 3
Forge In der Schmiede können schwere katapulte gebaut werden. HP: 800
Bauzeit: 90s
Ressourcen:

  • 200 Steine
  • 300 Eisen

Benötigt:

  • Stronghold Level 2
  • Barrack Level 2

Ermöglicht:

  • Katapult
Tower Verteidigungstürme die mit Bogenschützen besetzt werden können. HP: 800
Bauzeit: 40s
Ressourcen:

  • 80 Holz
  • 100 Steine

Benötigt:

  • Stronghold Level 1

Ermöglicht:

  • Beherbergen von 2 Bogenschützen

Besonderheit:

  • Archer bekommen nur 70% Schaden
HP: 1200
Bauzeit: 60s
Ressourcen:

  • 100 Holz
  • 150 Steine

Benötigt:

  • Stronghold Level 2

Ermöglicht:

  • Berherbergen von 3 Bogenschützen

Besonderheit:

  • Archer bekommen nur 55% Schaden
HP: 2000
Bauzeit: 80s
Ressourcen:

  • 120 Holz
  • 200 Steine

Benötigt:

  • Stronghold Level 3

Ermöglicht:

  • Berherbergen von 4 Bogenschützen

Besonderheit:

  • Archer bekommen nur 40% Schaden

Einheiten

Im Folgenden eine Übersicht über die in ColdIron vorkommenden Einheiten und wo diese erzeugt werden können.

WICHTIG: Da das Balancing der Spielsimulation noch nicht abgeschlossen ist, können sich die bei Level X angegebenen Werte noch ändern!

Einheit Beschreibung Gebäude Level 1 Level 2 Level 3
Peon Peons sind einfache Arbeiter. Sie werden zum Abbau von Ressourcen, sowie zum Aufbauen und Reparieren von Gebäuden benötigt Stronghold HP: 20
Stärke: 1
Bauzeit: 5sRessourcen:

  • 10 Holz
Swordsman Schwertkämpfer sind die klassischen Nahkampfeinheiten. Bestückt mit Schwert und Schild schlagen sie ihre Feinde in die Flucht. Barrack HP: 30
Stärke: 3
Bauzeit: 10s

Ressourcen:

  • 20 Holz

Benötigt:

  • Barrack Level 1

HP: 70
Stärke: 6
Bauzeit: 20s

Ressourcen:

  • 30 Holz
  • 20 Eisen

Benötigt:

  • Barrack Level 2

HP: 100
Stärke: 9
Bauzeit: 40s

Ressourcen:

  • 40 Holz
  • 50 Eisen

Benötigt:

  • Barrack Level 3
Archer Agile Bogenschützen greifen ihren Feind aus der Ferne an und sind insbesondere in Verteidigungstürmen von großem Nutzen. Barrack HP: 20
Stärke:  4
Bauzeit: 10sRessourcen:

  • 20 Holz

Benötigt:

  • Barrack Level 1

Besonderheit:

  • Können in Türmen platziert werden
HP: 50
Stärke: 7
Bauzeit: 20s
Ressourcen:

  • 30 Holz
  • 20 Eisen

Benötigt:

  • Barrack Level 2

Besonderheit:

  • Können in Türmen platziert werden
HP: 70
Stärke: 10
Bauzeit: 40s
Ressourcen:

  • 40 Holz
  • 50 Eisen

Benötigt:

  • Barrack Level 3

Besonderheit:

  • Können in Türmen platziert werden
Knight Auf dem Pferd unterwegs bewegen sich Ritter schnell über das Schlachtfeld und stecken den ein oder anderen Treffer gut weg. Barrack HP: 40
Stärke:  5
Bauzeit: 20sRessourcen:

  • 30 Holz
  • 30 Eisen

Benötigt:

  • Barrack Level 1
HP: 80
Stärke:  8
Bauzeit: 40s

Ressourcen:

  • 40 Holz
  • 40 Eisen

Benötigt:

  • Barrack Level 2
HP: 120
Stärke:  11
Bauzeit: 60s

Ressourcen:

  • 50 Holz
  • 70 Eisen

Benötigt:

  • Barrack Level 3
Catapult Ein schweres Katapult welches zum zerstören von Gebäuden besonders nutzvoll ist. Forge HP: 200
Stärke: 20
Bauzeit: 60sRessourcen:

  • 100 Holz
  • 150 Steine
  • 150 Eisen

Benötigt:

  • Forge

Besonderheit:

  • Besonders effektiv gegen Gebäude

Befehle

Eine genaue Auflistung aller möglichen Befehle ist hier zu finden:  Command Beschreibung. Falls ein Befehl nicht korrekt ausgeführt werden kann, bekommt der Spieler eine Fehlermeldung vom Server. Typische Fehler sind:

  • Befehl existiert nicht
  • Syntax ist nicht korrekt. Es könnten z.B. nötige Parameter fehlen.
  • Befehl ist nicht ausführbar. Beispiele:
    • Vorraussetzungen sind nicht erfüllt
    • Es wird versucht gegnerische Einheiten zu befehligen
Software Engineering I, WS1112

Der Server spricht generell ein zeilenbasiertes String Protokoll. Daher kann man eine telnet Verbindung benutzen um das Protokoll zu erkunden. Nach dem öffnen einer Konsole und der Eingabe von

 telnet se1.cs.uni-kassel.de 5000

kann man mit HELP eine Liste aller verfügbaren Befehle abrufen.

Allgemeine Informationen

  • Um sich beim Server anzumelden, benötigt man zunächst einen eigenen Login. Diesen bekommt ihr von eurem Betreuer beim nächsten Treffen.
  • Jedes erfolgreiche Kommando wird vom Server mit einem OK beendet. Fehler werden mit einer Zeile beantwortet die mit ERROR beginnt.
  • Der Server kommuniziert durch zwei verschiedene Protokollarten:
    • “Klartextprotokoll”: Bei einloggen und in der Lobby verwendet der Server ein simples “Klartextprotokoll” um mit seinen Clients zu kommunizieren.
    • JSON-Protokoll: Nach einem erfolgreichen JOIN GAME Kommando das mit OK bestätigt wurde wechselt der Server in ein JSON basiertes Protokoll, bei dem er JSON codierte Events verschickt und JSON codierte Commands erwartet.
  • Um einen Timeout zu vermeiden sollte vom Client in regelmäßigen abständen ein NOOP geschickt werden.

Klartextprotokoll

Sobald man eine Verbindung zum Server aufgebaut hat, kommuniziert dieser mit einem simplen Klartextprotokoll mit dem Client. Nicht alle Befehle sind überall verfügbar. Eine genaue Auflistung inkl. Gruppierung der Befehle liefert der HELP Befehl. Hier eine Übersicht über die verschiedenen Befehle:

  • Immer:
    • HELP <command>
  • Nach der Begrüßung vom Server:
    • LOGIN (<login>|<email>) <password>
    • LOGOUT
  • Nach dem Anmelden:
    • LIST USERS
    • LIST GAMES
    • CREATE GAME <gamename> (-players (<user>)+)? (-map <mapname>)?
    • JOIN GAME <gamename> (-visitor [true|false])?
    • MSG (ALL)? ( ( USER | TEAM ) <recipient> ) )? <message>
    • CHANGE PASSWORD <newPassword> <newPassword>

JSON Protokoll

Das Ingame JSON Protokoll kennt in Serverrichtung Commands und in Clientrichtung Events.

Commands

Die Commands müssen mindestens ein action Attribut enthalten welches folgende Werte annehmen kann (keys in Klammern sind optional):

Action Keys Beispiel Bemerkung
NOOP keiner {"@action":"NOOP"} Command der in regelmäßigen Abständen abgeschickt werden kann, um die Verbindung aufrecht zu erhalten.
CHOOSE_SECTOR sector {"@action":"CHOOSE_SECTOR","properties":{"entry":{"key":"sector","value":"Sector@1a3b6f"}}} Wählt den Startsektor aus. sector muss eine ID sein.
START_GAME keiner {"@action":"START_GAME"} Startet das spiel wenn jeder Spieler einen Startsektor gewählt hat.
LEAVE_GAME keiner {"@action":"LEAVE_GAME"} Verlässt das aktuelle Spiel.
CREATE_BUILDING sector, buildingtype {"@action":"CREATE_BUILDING","properties":{"entry":{"key":"sector","value":"Sector@d54a23"},"entry":{"key":"buildingtype","value":"STRONGHOLD"}}} Baut ein Gebäude vom Typ buildingtype im angegebenen Sektor.
DROP_BUILDING building {"@action":"DROP_BUILDING","properties":{"entry":{"key":"building","value":"Stronghold@d43b23"}}} Das Gebäude wird zerstört. Falls das Gebäude noch nicht fertig gebaut wurde, bekommt man seine Ressourcen zurück. Es können nur eigene Gebäude zerstört werden.
CREATE_UNIT building, unittype, (level)? {"@action":"CREATE_UNIT","properties":{"entry":{"key":"building","value":"Stronghold@d54a23"},"entry":{"key":"unittype","value":"PEON"},"entry":{"key":"level","value":"1"}}} Erzeugt eine Einheit vom gewünschten Typ im per ID übergebenen Gebäude mit dem gewünschten Level. Ist kein Level angegeben wird das maximal mögliche verwendet. Falls bereits eine Einheit in diesem Gebäde erzeugt wird oder das übergebene Level zu hoch für das Gebäude ist, wird ein Error erzeugt.
BUILD_UP building, peons {"@action":"BUILD_UP","properties":{"entry":{"key":"building","value":"Stronghold@5974b827"}, "entry":{"key":"peons","value":"Peon@ghz4b827,Peon@ghz4b333"}}} Veranlasst die gewählten peons am angegebenen Gebäude zu arbeiten.
MOVE_UNITS units,target {"@action":"MOVE_UNITS","properties":{"entry":{"key":"units","value":"Knight@d54a23,Swordsman@d533uf"},"entry":{"key":"target","value":"Sector@1a3b6f"}}} Versetzt die angegebenen units an das angegebene target. Peons können zu Ressourcen geschickt werden. Swordsman, Knights, Catapults und Archer können auf Sektoren geschickt werden. Archer können zusätzlich Tower besetzen.
UPGRADE building, level {"@action":"UPGRADE","properties":{"entry":{"key":"building","value":"Stronghold@5974b827"}, "entry":{"key":"level","value":"2"}}} Wertet das entsprechende Gebäude auf die gewählte Stufe auf (falls möglich)
REPAIR building, peons {"@action":"REPAIR","properties":{"entry":{"key":"building","value":"Stronghold@5974b827"}, "entry":{"key":"peons","value":"Peon@ghz4b827,Peon@ghz4b333"}}} Repariert das Gebäude building mit den angegebenen Peons.
CREATE_ALLIANCE name, (color)? {"@action":"CREATE_ALLIANCE","properties":{"entry":{"key":"name","value":"MyAlliance"}, "entry":{"key":"color","value":"FFFF00"}}} Legt eine neue Allianz mit dem übergebenen Namen und, wenn verhanden, der gewählten Farbe an. Der erzeugende User wird der Allianz automatisch hinzugefügt.
JOIN_ALLIANCE alliance {"@action":"JOIN_ALLIANCE","properties":{"entry":{"key":"alliance","value":"Alliance@1924b867"}}} Fügt den User der gewählten Allianz hinzu. Falls er sich nicht bereits in einer Allianz befindet, wechselt er in die neue Allianz.
DELETE_ALLIANCE alliance {"@action":"DELETE_ALLIANCE","properties":{"entry":{"key":"alliance","value":"Alliance@1924b867"}}} Löscht die Allianz. Dies kann nur durch ein Mitglied der Allianz erfolgen.
LEAVE_ALLIANCE keiner {"@action":"LEAVE_ALLIANCE"} Du verlässt deine Allianz, falls du dich in einer befindest.
CHANGE_ALLIANCE_COLOR alliance, color {"@action":"CHANGE_ALLIANCE_COLOR","properties":{"entry":{"key":"alliance","value":"Alliance@1924b867"}, "entry":{"key":"color","value":"FFFF00"}}} Ändert die Allianzfarbe. Dies kann nur durch ein Mitglied der Allianz erfolgen.
CHANGE_USER_COLOR color {"@action":"CHANGE_USER_COLOR","properties":{"entry":{"key":"color","value":"FFFF00"}}} Ändert die Userfarbe.
MESSAGE message, (audience)?, (recipient)? {"@action":"MESSAGE","properties":{"entry":{"key":"message","value":"Hallo"},"entry":{"key":"audience","value":"USER"},"entry":{"key":"recipient","value":"zenobios"}}} Verschickt eine Nachricht an alle oder den angegebenen User/Team/Allianz. Der Parameter audience erlaubt folgende Werte: ALL, USER, TEAM, ALLIANCE. Folgende Kombinationen von audience und recipient sind möglich:

audience: leer, recipient:leer -> Nachricht wird an alle User im Spiel geschickt
audience: leer, recipient:nicht leer -> Nachricht wird nicht verschickt

audience: ALL, recipient:leer -> Nachricht wird an alle User im Spiel geschickt
audience: ALL, recipient:nicht leer-> Nachricht wird nicht verschickt

audience: USER, recipient:leer -> Nachricht wird nicht verschickt
audience: USER, recipient:username -> Nachricht wird an user username verschickt

audience: TEAM, recipient:leer -> Nachricht wird an das eigene Team geschickt
audience: TEAM, recipient:teamname -> Nachricht wird an das Team teamname verschickt

audience: ALLIANCE, recipient:leer -> Nachricht wird an die eigene Allianz verschickt, falls der sendende User einer Allianz angehört
audience: ALLIANCE, recipient:alliancename -> Nachricht wird an die Allianz alliancename verschickt

Events, die durch diesen Command ausgelöst werden übergeben die Art der Message mit, um im Client eine Unterscheidung durchführen zu können. Mögliche Werte sind:

ERROR, MESSAGE, PUBLIC_MESSAGE, USER_MESSAGE, TEAM_MESSAGE, ALLIANCE_MESSAGE

Events

Der Server schickt Events in der Form

{"@ts":"199027638079229","@src":"Player@1f8882e","@prop":"name","@nv":"ascharf","@ov":"zenobios"}

In diesem Fall wurde zum Timestamp 199027638079229 von der source Player@1f8882e die property name von zenobios (old value) auf ascharf (new value) geändert.
Wer sich die Events vom Server genauer anschaut wird feststellen, dass Werte die null sind in JSON wegoptimiert werden.

Tipp: Das nötige Datenmodell lässt sich größtenteils aus dem Eventstream ableiten.