7 require(dirname(dirname(__FILE__)) . "/inc/config.php");
9 // Load all include files
10 require(PATH . "inc/includes.php");
12 // Load all game classes
13 require(PATH . "inc/classes.php");
15 // Set default application
16 FrameworkConfiguration::getInstance()->setConfigEntry("default_application", "ship-simu");
18 // Set testing mode (no starter.php will be loaded!)
19 define('TEST_MODE', true);
21 // Load the "selector"
22 require(PATH . "inc/selector.php");
24 // Wir tun hier so, als waere schon das Reederei-Objekt generiert und wir wollen
25 // jetzt die Personalliste wiederherstellen
27 $personell = SimulatorPersonell::createSimulatorPersonellByID("SimulatorPersonell@829292aeca3f6bf78c16e25fc4f75c98");
28 } catch (InvalidIDFormatException $e) {
29 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
32 } catch (InvalidArrayCountException $e) {
33 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
36 } catch (NullPointerException $e) {
37 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
40 } catch (NoObjectException $e) {
41 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
44 } catch (MissingMethodException $e) {
45 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
48 } catch (FileIsEmptyException $e) {
49 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
52 } catch (FilePointerNotOpenedException $e) {
53 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
56 } catch (InvalidArrayCountException $e) {
57 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
60 } catch (InvalidMD5ChecksumException $e) {
61 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
64 } catch (InvalidDataLengthException $e) {
65 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
68 } catch (InvalidSimulatorIDException $e) {
69 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
72 } catch (MismatchingCompressorsException $e) {
73 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
76 } catch (ContainerItemIsNullException $e) {
77 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
80 } catch (ContainerItemIsNoArrayException $e) {
81 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
84 } catch (ContainerMaybeDamagedException $e) {
85 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
90 // Personal-Objekt debuggen
91 if (defined('DEBUG_PERSONELL_OBJ')) {
92 DebugMiddleware::getInstance()->output(sprintf("Das Personal-Objekt sieht wie folgt aus:<br />
94 print_r($personell, true)
99 $harbor = Harbor::createHarbor("Hamburger Hafen");
102 DebugMiddleware::getInstance()->output(sprintf("Der <strong>%s</strong> ist gegründet worden.<br />\n",
103 $harbor->getHarborName()
106 // Hafen-Objekt debuggen
107 if (defined('DEBUG_HARBOR_OBJ')) {
108 DebugMiddleware::getInstance()->output(sprintf("Der <strong>%s</strong> sieht wie folgt aus:<br />
110 $harbor->getHarborName(),
111 print_r($harbor, true)
116 $merchant = Merchant::createMerchant("Namenlos", $harbor);
118 // Array mit Einbauten erstellen
120 'parts' => array( // *** Die zu einbauenden Schiffsteile ***
121 'Motor' => array( // --- Maschinenraum mit Motor ---
122 "Ocean-Power 2000", // Bezeichnung
123 20000, // Pferdestaerken
125 2.5, 2, 3.5 // Abmasse (Breite/Hoehe/Laenge)
127 'Bridge' => array( // --- Kommandobruecke ---
128 26, 2.5, 15 // Abmasse (Breite/Hoehe/Laenge)
130 'CarDeck' => array( // --- Autodecks ---
131 'amount' => 8, // Anzahl Autodecks (einige liegen hintereinander im selben Deck!)
132 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
136 'TruckDeck' => array( // --- Decks fuer LKW/Busse haben vielleicht ein anderes Belueftgungssystem, etc. ---
137 'amount' => 1, // Anzahl der Decks
138 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
139 8, 5, 195 // Geht durchs gesamte Schiff!
142 'TrainDeck' => array( // --- Decks fuer Zuege haben Schienen... ---
143 'amount' => 1, // Anzahl der Decks
144 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
145 8, 4, 195 // Geht durchs gesamte Schiff!
148 'LuxuryCabin' => array( // --- Luxuskabinen ---
149 'amount' => 20, // Anzahl Luxuskabinen im Schiff
150 'rooms' => 4, // Raeume: 2 Schlafzimmer, 1 Auffenthaltszimmer, 1 Bad mit Dusche/Toilette/Waschbecken
151 'bed' => 3, // Anzahl Betten (1 Doppelbett 2 Einzelbetten, Doppel-/Einzelbetten in getrennte Raeume)
152 'dim' => array( // Abmessung der Luxuskabine (Breite/Hoehe/Laenge)
156 'PremierCabin' => array( // --- Mittlere Kabinen ---
157 'amount' => 40, // Anzahl
158 'rooms' => 2, // Raeume: Schlafzimmer, Bad mit Toilette/Waschbecken
159 'bed' => 2, // Anzahl Betten (1 Doppelbett, 1 Einzelbett; gemeinsamer Raum)
160 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
164 'LowCabin' => array( // --- Untere Kabinen (befinden sich in den Unterbauten) ---
165 'amount' => 90, // Anzahl
166 'rooms' => 1, // Raeume: Schlafzimmer, Waschbecken
167 'bed' => 2, // Anzahl Betten (2 Etagenbetten)
168 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
172 'EconomyCabin' => array( // --- Unterste Kabinen (befinden sich tief unten im Schiffsbauch) ---
173 'amount' => 140, // Anzahl
174 'rooms' => 1, // Raeume: Schlafzimmer, Waschbecken
175 'bed' => 1, // Anzahl Betten (1 Etagenbett)
176 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
181 'builds' => array( // *** Welche Oberklasse verwendet werden sollen ***
182 'Motor' => "MaschineRoom",
183 'Bridge' => "BaseUpperStructure",
184 'LuxuryCabin' => "BaseCabin",
185 'PremierCabin' => "BaseCabin",
186 'LowCabin' => "BaseCabin",
187 'EconomyCabin' => "BaseCabin",
188 'CarDeck' => "BaseDeck",
189 'TrainDeck' => "BaseDeck",
190 'TruckDeck' => "BaseDeck"
194 // Preisliste auffuellen
195 foreach ($einbauten['parts'] as $key=>$part) {
196 // Create item array string
198 foreach ($part as $idx=>$itemPart) {
199 if (is_string($itemPart)) {
201 $item .= sprintf("\"%s\", ", $itemPart);
202 } elseif (is_int($itemPart)) {
204 $item .= sprintf("%d, ", $itemPart);
205 } elseif (is_float($itemPart)) {
207 $item .= sprintf("%f, ", $itemPart);
208 } elseif (is_array($itemPart)) {
212 // Go all items through
213 foreach ($itemPart as $idx2=>$subPart) {
214 if (is_int($subPart)) {
215 // Integer again found
216 $item .= sprintf("%d, ", $subPart);
217 } elseif (is_float($subPart)) {
219 $item .= sprintf("%f, ", $subPart);
221 // Unsupport part found
222 die(sprintf("[Main:] Unsupported sub-array element on pos <strong>%d</strong> in array <strong>%s</strong> found: <u>%s</u>", $idx2, $idx, $subPart));
226 // Remove trailing comma
227 $item = substr($item, 0, -2);
229 // Add closing bracket
232 // Unsupport part found
233 die(sprintf("[Main:] Unsupported array element on pos <strong>%d</strong>: <u>%s</u>", $idx, $itemPart));
237 // Remove trailing comma
238 $item = substr($item, 0, -2);
241 $price = mt_rand(5, 12) * 10000;
245 // Generate command for adding objects to a price list
246 $eval = sprintf("\$merchant->addItemToPriceList(%s::create%s(%s), %d);",
254 if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) DebugMiddleware::getInstance()->output(sprintf("[Main:] Konstruierte PHP-Anweisung: <pre><em>%s</em></pre><br />\n",
258 // Run the constructed command
260 } catch (ItemNotTradeableException $e) {
261 die(sprintf("[Main:] Die Preisliste des Händlers <strong>%s</strong> kann nicht befüllt werden. Grund: <strong>%s</strong><br />\n",
262 $merchant->getMerchantName(),
268 // Haendler-Objekt debuggen
269 if (defined('DEBUG_MERCHANT_OBJ')) {
270 DebugMiddleware::getInstance()->output(sprintf("Der Händler <strong>%s</strong> sieht wie folgt aus:<br />
272 $merchant->getMerchantName(),
273 print_r($merchant, true)
278 $shipping = ShippingCompany::createShippingCompany("Hanseatic Travel Company", $harbor);
280 // Firmenschef setzen
282 $shipping->setCompanyFounder(CompanyEmployee::createCompanyEmployee("Roland", "Häder", "M", 1977, 9, 26, true, 2000));
283 } catch (BirthdayInvalidException $e) {
284 die(sprintf("[Main:] Reederei-Gründer konnte nicht gesetzt werden. Grund: <strong>%s</strong><br />\n",
289 // Dann mal ausgeben...
290 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> ist von <strong>%s %s</strong> gegründet worden.<br />\n",
291 $shipping->getCompanyName(),
292 $shipping->getFounderInstance()->getSurname(),
293 $shipping->getFounderInstance()->getFamily()
296 // Die Reederei stellt Personal ein und bedient sich an der $personell-Instanz
298 $shipping->recruitRandomEmployees(10, $personell);
299 } catch (ToMuchEmployeesException $e) {
300 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal einstellen. Grund: <strong>%s</strong><br />\n",
301 $shipping->getCompanyName(),
304 } catch (OutOfBoundsException $e) {
305 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal einstellen. Grund: <strong>%s</strong><br />\n",
306 $shipping->getCompanyName(),
311 // Anzahl Personal ausgeben
312 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat nun <strong>%d</strong> weitere Mitarbeiter.<br />\n",
313 $shipping->getCompanyName(),
314 $shipping->getTotalEmployee()
317 // Dann die ersten 3 Werften in den Hafen einbauen und Personal zuweisen
318 $shipping->createShipyardInHarbor("Werft 1", $harbor);
319 $shipping->createShipyardInHarbor("Werft 2", $harbor);
320 $shipping->createShipyardInHarbor("Werft 3", $harbor);
322 // In alle Werften sollen Passagierschiffe gebaut werden koennen
324 $shipping->addShipTypeToAllShipyards("PassengerShip");
325 } catch (ClassNotFoundException $e) {
326 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
327 $shipping->getCompanyName(),
330 } catch (ClassMismatchException $e) {
331 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
332 $shipping->getCompanyName(),
335 } catch (NoObjectException $e) {
336 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
337 $shipping->getCompanyName(),
342 // Personal auf die Werften verteilen
344 $shipping->distributeAllPersonellOnShipyards();
345 } catch (NoShipyardsConstructedException $e) {
346 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
347 $shipping->getCompanyName(),
350 } catch (ClassMismatchException $e) {
351 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
352 $shipping->getCompanyName(),
355 } catch (NullPointerException $e) {
356 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
357 $shipping->getCompanyName(),
360 } catch (NoObjectException $e) {
361 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
362 $shipping->getCompanyName(),
367 // Normale Meldung ausgeben
368 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> beschäftigt nun ihre <strong>%d</strong> Mitarbeiter in <strong>%d</strong> Werft(en):<br />\n",
369 $shipping->getCompanyName(),
370 $shipping->getTotalEmployee(),
371 $shipping->getTotalShipyards()
374 // Dann nimmt die Reederei ihren ersten Bauauftrag entgegen.
375 // Sie muss auch sich selber Bauauftraege erteilen!
377 $shipping->addNewWorksContract(WorksContract::createWorksContract("PassengerShip", "M/S Poseidon", $shipping));
378 } catch (ClassNotFoundException $e) {
379 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
382 } catch (NullPointerException $e) {
383 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
386 } catch (NoObjectException $e) {
387 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
390 } catch (MissingMethodException $e) {
391 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
394 } catch (EmptyStructuresListException $e) {
395 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
400 // Auftrag-Instanz holen
401 $contract = $shipping->getLastContractInstance();
403 // Die Reederei hat einen Haendler gewaehlt
405 $shipping->setMerchantInstance($merchant);
406 } catch (NullPointerException $e) {
407 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
408 $merchant->getMerchantName(),
411 } catch (NoObjectException $e) {
412 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
413 $merchant->getMerchantName(),
416 } catch (ClassMismatchException $e) {
417 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
418 $merchant->getMerchantName(),
423 // Den Bauauftrag mit der Reederei abgleichen, ob sie den Schiffstyp bauen koennen
425 $typeValid = $shipping->validateWorksContractShipType($contract);
426 } catch (NullPointerException $e) {
427 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht validieren. Grund: <strong>%s</strong><br />\n",
428 $shipping->getCompanyName(),
431 } catch (NoObjectException $e) {
432 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht validieren. Grund: <strong>%s</strong><br />\n",
433 $shipping->getCompanyName(),
438 // Kann gebaut werden?
440 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> kann Schiffe vom Typ <strong>%s</strong> bauen.<br />\n",
441 $shipping->getCompanyName(),
442 $contract->getShipInstance()->getPartDescr()
445 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> kann keine Schiffe vom Typ <strong>%s</strong> bauen!<br />\n",
446 $shipping->getCompanyName(),
447 $contract->getShipInstance()->getPartDescr()
452 // Dann den Bauauftrag verfeinern
453 foreach ($einbauten['parts'] as $key=>$part) {
455 $contract->addContractDetails($key, $einbauten['builds'][$key], $part);
456 } catch (ShipPartNotConstructableException $e) {
458 die($e->getMessage());
459 } catch (ShipNotConstructedException $e) {
461 die($e->getMessage());
462 } catch (ItemNotInPriceListException $e) {
463 die(sprintf("[Main:] Der Artikel <strong>%s</strong> konnte nicht in der Preisliste gefunden werden. Grund: <strong>%s</strong><br />\n",
467 } catch (InvalidArrayCountException $e) {
468 die(sprintf("[Main:] Der Artikel <strong>%s</strong> konnte nicht in der Preisliste gefunden werden. Grund: <strong>%s</strong><br />\n",
475 // Reederei-Objekt ausgeben
476 if (defined('DEBUG_COMPANY_OBJ')) {
477 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> sieht wie folgt aus:<br />
479 $shipping->getCompanyName(),
480 print_r($shipping, true)
492 // Gesamtwert ausgeben
494 $totalValue = $contract->getTotalPrice();
495 } catch (NullPointerException $e) {
496 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
499 } catch (NoObjectException $e) {
500 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
503 } catch (MissingMethodException $e) {
504 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
507 } catch (EmptyStructuresListException $e) {
508 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
511 } catch (TotalPriceNotCalculatedException $e) {
512 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
518 DebugMiddleware::getInstance()->output(sprintf("Der Bau der <strong>%s</strong> wird der Reederei <strong>%s</strong> voraussichtlich <strong>%s</strong> kosten.<br />\n",
519 $contract->getShipInstance()->getShipName(),
520 $shipping->getCompanyName(),
521 $contract->formatCurrency($totalValue)
527 // Den Bauvertrag unterschreiben (damit wird er in den Bau-Queue aufgenommen)
529 $shipping->signContract($contract, $shipping);
530 } catch (NullPointerException $e) {
531 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
532 $shipping->getCompanyName(),
535 } catch (NoObjectException $e) {
536 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
537 $shipping->getCompanyName(),
540 } catch (MissingMethodException $e) {
541 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
542 $shipping->getCompanyName(),
545 } catch (InvalidContractPartnerException $e) {
546 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
547 $shipping->getCompanyName(),
550 } catch (ContractAllreadySignedException $e) {
551 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
552 $shipping->getCompanyName(),
555 } catch (WrongContractPartnerException $e) {
556 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
557 $shipping->getCompanyName(),
563 if ($contract->isSigned()) {
564 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat den Bau der <strong>%s</strong> zugestimmt.<br />\n",
565 $shipping->getCompanyName(),
566 $contract->getShipInstance()->getShipName()
569 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat den Bau der <strong>%s</strong> abgelehnt.<br />\n",
570 $shipping->getCompanyName(),
571 $contract->getShipInstance()->getShipName()
576 // Auftrag-Objekt ausgeben
577 if (defined('DEBUG_CONTRACT_OBJ')) {
578 DebugMiddleware::getInstance()->output(sprintf("Der Bauauftrag sieht wie folgt aus:<br />
580 print_r($contract, true)
584 // Erstmal bis hier hin...
587 // Anzahl Betten ermitteln
589 $totalBeds = $contract->getShipInstance()->calcTotalBeds();
590 } catch (StructuresOutOfBoundsException $e) {
591 die(sprintf("[Main:] Anzahl Betten konnten nicht ermittelt werden. Grund: <strong>%s</strong><br />\n",
594 } catch (EmptyStructuresListException $e) {
595 die(sprintf("[Main:] Anzahl Betten konnten nicht ermittelt werden. Grund: <strong>%s</strong><br />\n",
600 // Bettenanzahl ausgeben
601 DebugMiddleware::getInstance()->output(sprintf("Es stehen <strong>%d</strong> Betten zur Verfügung.",