Warning: include_once(/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php): failed to open stream: No such file or directory in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: include_once(): Failed opening '/var/www/html/pmwiki-2.2.86/cookbook/soap4pmwiki/soap4pmwiki.php' for inclusion (include_path='.:/opt/php/lib/php') in /var/www/html/fields/dbp09/local/config.php on line 4

Warning: Cannot modify header information - headers already sent by (output started at /var/www/html/fields/dbp09/local/config.php:4) in /var/www/html/pmwiki-2.2.86/pmwiki.php on line 1250
Datenbankpraktikum SS 2009 - Gruppe 1 - Backend-flottenbewegungen

Flottenbewegungen

Um Schiffe zwischen Planeten und Sonnensystemen zu bewegen wurde das Model TroopMovement erstellt. Damit werden die Schiffe in der Datenbank gespeichert, die gerade unterwegs sind. Jedes TroopMovement hat einen User, einen Start- und Zielplanet, eine AuftragsID, eine Ankunftszeit, Ressourcen und Schiffe. Um ein TroopMovement zu erstellen, muss zuerst ein BackendTroopMovementController mit dem Befehl BackendTroopMovementController.new erstellt werden. Hieran werden jetzt die folgenden Methoden aufgerufen.

Zunächst wird mit der Methode create_troop_movement ein TroopMovement erstellt. Als Parameter werden der User, dem die Flotte gehören soll, der Start- und Zielplanet sowie die AuftragsID benötigt. Der Rückgabewert ist ein Fehlercode, falls der Auftrag aufgrund des Besitzers des Zielplaneten nicht ausgeführt werden kann, oder das erstellte TroopMovement. Welche Aufträge auf welchen Planeten ausgeführt werden können, zeigt die nachfolgende Tabelle.

AuftragSpielerAllianzmitgliedunbewohntfremder Spieler
Spionage XXX
TransportXX X
StationierenX   
Übergabe X X
Besiedeln  X 
Angriff   X

Jetzt werden mit add_ships die Schiffe der Flotte hinzugefügt. Die Parameter sind das TroopMovement, die Schiffsart und die Anzahl. Der Rückgabewert ist ein Boolean. True, falls das Hinzufügen geklappt hat oder false, falls nicht genug Schiffe des Typs auf dem Startplaneten vorhanden sind.

Bei jedem Flug können Ressourcen mitgenommen werden, falls sich ein oder mehrere Transporter in der Flotte befinden. Dies geschieht mittels der Methode add_resources. Parameter sind hierbei das TroopMovement und die Anzahl Erz, Kristall und Gas, die mitgenommen werden sollen. Der Rückgabewert ist ein Fehlercode, der aussagt ob Transporter fehlen oder nicht genug Ressourcen auf dem Planeten vorhanden sind.

Zum Schluss wird mit der Methode starting die Flotte gestartet. Hierbei muss nur das TroopMovement übergeben werden. Der Rückgabewert ist auch hier ein Fehlercode, der aussagt ob noch ein spezielles Schiff für einen Auftrag fehlt oder ob genug Gas für den Flug vorhanden ist. Die Methode ruft zwei weitere Methoden auf, mit denen der Gasverbrauch berechnet und das Gas vom Startplaneten abgezogen wird (mileage) und die Ankunftszeit berechnet und gesetzt wird (set_appraoch_time).

set_approach_time berechnet die Ankunftszeit, indem zunächst das langsamste Schiff der Flotte bestimmt wird und dann die Flugzeit auf die aktuelle Zeit addiert wird.

Ein Problem war, dass sich die Besitzverhältnisse des Zielplaneten während des Fluges ändern konnten, und somit der Auftrag nicht mehr ausgeführt werden konnte (z. B. Besiedeln eines schon bewohnten Planeten). Daher wird bei jeder Auftragsmethode der Besitzer des Planeten ermittelt und entsprechend reagiert. Meistens lief es auf einen Rückflug zum Startplaneten hinaus, weshalb die Methode flight_back entstand. Diese vertauscht die Start- und Zielplaneten und setzt die AuftragsID auf den Auftrag 'Stationieren'. Danach wird noch mit set_approach_time die Ankunftszeit neu berechnet. Allerdings kann es jetzt auch passieren, dass der Startplanet in der Zwischenzeit erobert wurde. Deshalb wird beim setzten des Zielplaneten überprüft, ob der Besitzer des Planeten und der Besitzer der Flotte derselbe User sind. Andernfalls wird als Zielplanet der Heimatplanet gesetzt, da dieser nicht erobert werden kann.

Da die Schiffe Gas verbrauchen sollen, muss beim Start der Verbrauch der Flotte berechnet werden und die entsprechende Menge Gas vom Startplaneten abgezogen werden. Da jedoch aufgrund der oben beschriebenen Problematik evtl. größere Entfernungen zurückgelegt werden müssen, wird als Kompromiss die doppelte Menge abgezogen, um genug für den Rückflug zu haben. Falls kein Rückflug erforderlich ist wird der Rest mit der Methode gas_surplus_transfer auf den Zielplaneten übertragen.

Wenn die Ankunftszeit erreicht ist, ruft der Ticker die Methode arriving auf (Parameter: TroopMovement). Diese wiederum ruft abhängig von der AuftragsID die jeweilige Methode zum Abarbeiten des Auftrags auf.

Nachfolgend eine kurze Erklärung zu den einzelnen Auftragsarten:

Spionage

Für den Spionageauftrag muss eine Spionagesonde der Flotte hinzugefügt werden. Als Zielplanet kann nur ein unbewohnter oder von einem anderen Spieler bewohnter Planet gewählt werden. Sollte der Planet während des Fluges vom Spieler erobert worden sein, wird trotzdem ein Spionagebericht abgeschickt. Dieser enthält die Größe, den Bonus sowie den Besitzer des Planeten und ob es sich um seinen Heimatplaneten handelt. Außerdem werden die Gebäude und die stationierten Schiffe angezeigt. Falls es sich nicht um einen Heimatplaneten handelt, wird noch berechnet wie viele Truppentransporter man braucht um den Planeten zu erobern. Zum Schluss wird eine Spionagesonde zerstört und der eventuelle Rest der Flotte kehrt zum Startplaneten zurück.

Transport

Der Auftrag Transport wird genutzt um Ressourcen an sich selbst oder an anderen Spieler zu schicken. Hierfür muss der Flotte mindestens ein Transporter hinzugefügt werden. Unbewohnte Planeten können nicht als Zielplanet ausgewählt werden. Sollte der Empfänger während des Fluges seinen Account gelöscht haben und damit der Zielplanet unbewohnt geworden sein, fliegt die Flotte zurück und lädt die Ressourcen wieder auf den Startplanet. Ansonsten werden sie auf dem Zielplaneten ausgeladen und die Flotte kehrt wieder zurück. Sollte die Lagerkapazität des Planeten nicht ausreichen, werden die restlichen Ressourcen wieder mit zurück genommen.

Stationieren

Mit dem Auftrag Stationieren können Schiffe auf andere eigene Planeten geschickt werden. Daher können auch nur solche Planeten als Zielplanet dienen. Sollte dieser während des Fluges erobert worden sein, fliegt die Flotte wieder zum Startplanet. Andernfalls landet sie und lädt eventuelle Ressourcen und das ungenutzte Gas für den Rückflug aus.

Übergabe

Der Auftrag Übergabe dient zum Verschicken von Schiffen an andere Spieler. Eigene oder unbewohnte Planeten können keine Zielplaneten sein. Hat der Empfänger während des Fluges seinen Account gelöscht, kehrt die Flotte zum Startplaneten zurück. Wurde der Zielplanet erobert wird der Auftrag trotzdem ausgeführt.

Kolonisieren

Mit Kolonisieren können unbewohnte Planeten besiedelt werden. Daher können auch nur solche Planeten als Zielplanet ausgewählt werden. Außerdem muss sich ein Kolonieschiff in der Flotte befinden. Wurde der Zielplanet während des Fluges schon kolonisiert, fliegt die Flotte wieder zum Startplaneten zurück. Andernfalls wird der Planet an den Spieler überschrieben und ein Kolonieschiff zerstört. Danach landet die Flotte und lädt eventuelle Ressourcen und das ungenutzte Gas für den Rückflug aus.

Angriff

Mit diesem Auftrag können fremde Planeten angegriffen werden. Zielplanet kann daher kein eigener oder unbewohnter Planet sein. Hat der angegriffene Spieler seinen Account gelöscht, fliegt die Flotte zum Startplaneten zurück. Wurde der Zielplanet schon von einem selbst erobert, landet die Flotte dort. Ansonsten wird der Kampfverlauf berechnet und der Sieger ermittelt. Mehr dazu beim BackendFightController. Befinden sich genug Truppentransporter in der Flotte und hat der Angreifer gewonnen, wird der Planet an ihn überschrieben und die Flotte landet. Befindet sich ein Transporter in der Flotte, werden Ressourcen vom Planeten geraubt. Ansonsten wird nur der Kampf ausgeführt. Gewinnt der Angreifer fliegt der Rest der Flotte zurück zum Startplaneten. Während bei allen anderen Aufträgen nur der Besitzer der Flotte einen Bericht erhält, wird beim Angriff auch der Verteidiger informiert.


Page last modified on January 22, 2010, at 04:14 PM