6 require(dirname(dirname(__FILE__)) . "/inc/config.php");
8 // Load all include files
9 require(PATH . "inc/includes.php");
11 // Load all game classes
12 require(PATH . "inc/classes.php");
14 // Set default application
15 FrameworkConfiguration::getInstance()->setConfigEntry("default_application", "ship-simu");
17 // Set testing mode (no starter.php will be loaded!)
18 define('TEST_MODE', true);
20 // Wir tun hier so, als waere schon das Reederei-Objekt generiert und wir wollen
21 // jetzt die Personalliste wiederherstellen
23 $personell = SimulatorPersonell::createSimulatorPersonellByID("SimulatorPersonell@829292aeca3f6bf78c16e25fc4f75c98");
24 } catch (InvalidIDFormatException $e) {
25 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
28 } catch (InvalidArrayCountException $e) {
29 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
32 } catch (NullPointerException $e) {
33 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
36 } catch (NoObjectException $e) {
37 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
40 } catch (MissingMethodException $e) {
41 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
44 } catch (FileIsEmptyException $e) {
45 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
48 } catch (FilePointerNotOpenedException $e) {
49 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
52 } catch (InvalidArrayCountException $e) {
53 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
56 } catch (InvalidMD5ChecksumException $e) {
57 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
60 } catch (InvalidDataLengthException $e) {
61 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
64 } catch (InvalidSimulatorIDException $e) {
65 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
68 } catch (MismatchingCompressorsException $e) {
69 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
72 } catch (ContainerItemIsNullException $e) {
73 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
76 } catch (ContainerItemIsNoArrayException $e) {
77 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
80 } catch (ContainerMaybeDamagedException $e) {
81 die(sprintf("[Main:] Die Personenliste konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
86 // Personal-Objekt debuggen
87 if (defined('DEBUG_PERSONELL_OBJ')) {
88 DebugMiddleware::getInstance()->output(sprintf("Das Personal-Objekt sieht wie folgt aus:<br />
90 print_r($personell, true)
95 $harbor = Harbor::createHarbor("Hamburger Hafen");
98 DebugMiddleware::getInstance()->output(sprintf("Der <strong>%s</strong> ist gegründet worden.<br />\n",
99 $harbor->getHarborName()
102 // Hafen-Objekt debuggen
103 if (defined('DEBUG_HARBOR_OBJ')) {
104 DebugMiddleware::getInstance()->output(sprintf("Der <strong>%s</strong> sieht wie folgt aus:<br />
106 $harbor->getHarborName(),
107 print_r($harbor, true)
112 $merchant = Merchant::createMerchant("Namenlos", $harbor);
114 // Array mit Einbauten erstellen
116 'parts' => array( // *** Die zu einbauenden Schiffsteile ***
117 'Motor' => array( // --- Maschinenraum mit Motor ---
118 "Ocean-Power 2000", // Bezeichnung
119 20000, // Pferdestaerken
121 2.5, 2, 3.5 // Abmasse (Breite/Hoehe/Laenge)
123 'Bridge' => array( // --- Kommandobruecke ---
124 26, 2.5, 15 // Abmasse (Breite/Hoehe/Laenge)
126 'CarDeck' => array( // --- Autodecks ---
127 'amount' => 8, // Anzahl Autodecks (einige liegen hintereinander im selben Deck!)
128 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
132 'TruckDeck' => array( // --- Decks fuer LKW/Busse haben vielleicht ein anderes Belueftgungssystem, etc. ---
133 'amount' => 1, // Anzahl der Decks
134 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
135 8, 5, 195 // Geht durchs gesamte Schiff!
138 'TrainDeck' => array( // --- Decks fuer Zuege haben Schienen... ---
139 'amount' => 1, // Anzahl der Decks
140 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
141 8, 4, 195 // Geht durchs gesamte Schiff!
144 'LuxuryCabin' => array( // --- Luxuskabinen ---
145 'amount' => 20, // Anzahl Luxuskabinen im Schiff
146 'rooms' => 4, // Raeume: 2 Schlafzimmer, 1 Auffenthaltszimmer, 1 Bad mit Dusche/Toilette/Waschbecken
147 'bed' => 3, // Anzahl Betten (1 Doppelbett 2 Einzelbetten, Doppel-/Einzelbetten in getrennte Raeume)
148 'dim' => array( // Abmessung der Luxuskabine (Breite/Hoehe/Laenge)
152 'PremierCabin' => array( // --- Mittlere Kabinen ---
153 'amount' => 40, // Anzahl
154 'rooms' => 2, // Raeume: Schlafzimmer, Bad mit Toilette/Waschbecken
155 'bed' => 2, // Anzahl Betten (1 Doppelbett, 1 Einzelbett; gemeinsamer Raum)
156 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
160 'LowCabin' => array( // --- Untere Kabinen (befinden sich in den Unterbauten) ---
161 'amount' => 90, // Anzahl
162 'rooms' => 1, // Raeume: Schlafzimmer, Waschbecken
163 'bed' => 2, // Anzahl Betten (2 Etagenbetten)
164 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
168 'EconomyCabin' => array( // --- Unterste Kabinen (befinden sich tief unten im Schiffsbauch) ---
169 'amount' => 140, // Anzahl
170 'rooms' => 1, // Raeume: Schlafzimmer, Waschbecken
171 'bed' => 1, // Anzahl Betten (1 Etagenbett)
172 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
177 'builds' => array( // *** Welche Oberklasse verwendet werden sollen ***
178 'Motor' => "MaschineRoom",
179 'Bridge' => "BaseUpperStructure",
180 'LuxuryCabin' => "BaseCabin",
181 'PremierCabin' => "BaseCabin",
182 'LowCabin' => "BaseCabin",
183 'EconomyCabin' => "BaseCabin",
184 'CarDeck' => "BaseDeck",
185 'TrainDeck' => "BaseDeck",
186 'TruckDeck' => "BaseDeck"
190 // Preisliste auffuellen
191 foreach ($einbauten['parts'] as $key=>$part) {
192 // Create item array string
194 foreach ($part as $idx=>$itemPart) {
195 if (is_string($itemPart)) {
197 $item .= sprintf("\"%s\", ", $itemPart);
198 } elseif (is_int($itemPart)) {
200 $item .= sprintf("%d, ", $itemPart);
201 } elseif (is_float($itemPart)) {
203 $item .= sprintf("%f, ", $itemPart);
204 } elseif (is_array($itemPart)) {
208 // Go all items through
209 foreach ($itemPart as $idx2=>$subPart) {
210 if (is_int($subPart)) {
211 // Integer again found
212 $item .= sprintf("%d, ", $subPart);
213 } elseif (is_float($subPart)) {
215 $item .= sprintf("%f, ", $subPart);
217 // Unsupport part found
218 die(sprintf("[Main:] Unsupported sub-array element on pos <strong>%d</strong> in array <strong>%s</strong> found: <u>%s</u>", $idx2, $idx, $subPart));
222 // Remove trailing comma
223 $item = substr($item, 0, -2);
225 // Add closing bracket
228 // Unsupport part found
229 die(sprintf("[Main:] Unsupported array element on pos <strong>%d</strong>: <u>%s</u>", $idx, $itemPart));
233 // Remove trailing comma
234 $item = substr($item, 0, -2);
237 $price = mt_rand(5, 12) * 10000;
241 // Generate command for adding objects to a price list
242 $eval = sprintf("\$merchant->addItemToPriceList(%s::create%s(%s), %d);",
250 if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) DebugMiddleware::getInstance()->output(sprintf("[Main:] Konstruierte PHP-Anweisung: <pre><em>%s</em></pre><br />\n",
254 // Run the constructed command
256 } catch (ItemNotTradeableException $e) {
257 die(sprintf("[Main:] Die Preisliste des Händlers <strong>%s</strong> kann nicht befüllt werden. Grund: <strong>%s</strong><br />\n",
258 $merchant->getMerchantName(),
264 // Haendler-Objekt debuggen
265 if (defined('DEBUG_MERCHANT_OBJ')) {
266 DebugMiddleware::getInstance()->output(sprintf("Der Händler <strong>%s</strong> sieht wie folgt aus:<br />
268 $merchant->getMerchantName(),
269 print_r($merchant, true)
274 $shipping = ShippingCompany::createShippingCompany("Hanseatic Travel Company", $harbor);
276 // Firmenschef setzen
278 $shipping->setCompanyFounder(CompanyEmployee::createCompanyEmployee("Roland", "Häder", "M", 1977, 9, 26, true, 2000));
279 } catch (BirthdayInvalidException $e) {
280 die(sprintf("[Main:] Reederei-Gründer konnte nicht gesetzt werden. Grund: <strong>%s</strong><br />\n",
285 // Dann mal ausgeben...
286 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> ist von <strong>%s %s</strong> gegründet worden.<br />\n",
287 $shipping->getCompanyName(),
288 $shipping->getFounderInstance()->getSurname(),
289 $shipping->getFounderInstance()->getFamily()
292 // Die Reederei stellt Personal ein und bedient sich an der $personell-Instanz
294 $shipping->recruitRandomEmployees(10, $personell);
295 } catch (ToMuchEmployeesException $e) {
296 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal einstellen. Grund: <strong>%s</strong><br />\n",
297 $shipping->getCompanyName(),
300 } catch (OutOfBoundsException $e) {
301 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal einstellen. Grund: <strong>%s</strong><br />\n",
302 $shipping->getCompanyName(),
307 // Anzahl Personal ausgeben
308 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat nun <strong>%d</strong> weitere Mitarbeiter.<br />\n",
309 $shipping->getCompanyName(),
310 $shipping->getTotalEmployee()
313 // Dann die ersten 3 Werften in den Hafen einbauen und Personal zuweisen
314 $shipping->createShipyardInHarbor("Werft 1", $harbor);
315 $shipping->createShipyardInHarbor("Werft 2", $harbor);
316 $shipping->createShipyardInHarbor("Werft 3", $harbor);
318 // In alle Werften sollen Passagierschiffe gebaut werden koennen
320 $shipping->addShipTypeToAllShipyards("PassengerShip");
321 } catch (ClassNotFoundException $e) {
322 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
323 $shipping->getCompanyName(),
326 } catch (ClassMismatchException $e) {
327 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
328 $shipping->getCompanyName(),
331 } catch (NoObjectException $e) {
332 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
333 $shipping->getCompanyName(),
338 // Personal auf die Werften verteilen
340 $shipping->distributeAllPersonellOnShipyards();
341 } catch (NoShipyardsConstructedException $e) {
342 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
343 $shipping->getCompanyName(),
346 } catch (ClassMismatchException $e) {
347 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
348 $shipping->getCompanyName(),
351 } catch (NullPointerException $e) {
352 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
353 $shipping->getCompanyName(),
356 } catch (NoObjectException $e) {
357 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
358 $shipping->getCompanyName(),
363 // Normale Meldung ausgeben
364 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",
365 $shipping->getCompanyName(),
366 $shipping->getTotalEmployee(),
367 $shipping->getTotalShipyards()
370 // Dann nimmt die Reederei ihren ersten Bauauftrag entgegen.
371 // Sie muss auch sich selber Bauauftraege erteilen!
373 $shipping->addNewWorksContract(WorksContract::createWorksContract("PassengerShip", "M/S Poseidon", $shipping));
374 } catch (ClassNotFoundException $e) {
375 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
378 } catch (NullPointerException $e) {
379 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
382 } catch (NoObjectException $e) {
383 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
386 } catch (MissingMethodException $e) {
387 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
390 } catch (EmptyStructuresListException $e) {
391 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
396 // Auftrag-Instanz holen
397 $contract = $shipping->getLastContractInstance();
399 // Die Reederei hat einen Haendler gewaehlt
401 $shipping->setMerchantInstance($merchant);
402 } catch (NullPointerException $e) {
403 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
404 $merchant->getMerchantName(),
407 } catch (NoObjectException $e) {
408 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
409 $merchant->getMerchantName(),
412 } catch (ClassMismatchException $e) {
413 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
414 $merchant->getMerchantName(),
419 // Den Bauauftrag mit der Reederei abgleichen, ob sie den Schiffstyp bauen koennen
421 $typeValid = $shipping->validateWorksContractShipType($contract);
422 } catch (NullPointerException $e) {
423 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht validieren. Grund: <strong>%s</strong><br />\n",
424 $shipping->getCompanyName(),
427 } catch (NoObjectException $e) {
428 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht validieren. Grund: <strong>%s</strong><br />\n",
429 $shipping->getCompanyName(),
434 // Kann gebaut werden?
436 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> kann Schiffe vom Typ <strong>%s</strong> bauen.<br />\n",
437 $shipping->getCompanyName(),
438 $contract->getShipInstance()->getPartDescr()
441 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> kann keine Schiffe vom Typ <strong>%s</strong> bauen!<br />\n",
442 $shipping->getCompanyName(),
443 $contract->getShipInstance()->getPartDescr()
448 // Dann den Bauauftrag verfeinern
449 foreach ($einbauten['parts'] as $key=>$part) {
451 $contract->addContractDetails($key, $einbauten['builds'][$key], $part);
452 } catch (ShipPartNotConstructableException $e) {
454 die($e->getMessage());
455 } catch (ShipNotConstructedException $e) {
457 die($e->getMessage());
458 } catch (ItemNotInPriceListException $e) {
459 die(sprintf("[Main:] Der Artikel <strong>%s</strong> konnte nicht in der Preisliste gefunden werden. Grund: <strong>%s</strong><br />\n",
463 } catch (InvalidArrayCountException $e) {
464 die(sprintf("[Main:] Der Artikel <strong>%s</strong> konnte nicht in der Preisliste gefunden werden. Grund: <strong>%s</strong><br />\n",
471 // Reederei-Objekt ausgeben
472 if (defined('DEBUG_COMPANY_OBJ')) {
473 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> sieht wie folgt aus:<br />
475 $shipping->getCompanyName(),
476 print_r($shipping, true)
488 // Gesamtwert ausgeben
490 $totalValue = $contract->getTotalPrice();
491 } catch (NullPointerException $e) {
492 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
495 } catch (NoObjectException $e) {
496 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
499 } catch (MissingMethodException $e) {
500 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
503 } catch (EmptyStructuresListException $e) {
504 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
507 } catch (TotalPriceNotCalculatedException $e) {
508 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
514 DebugMiddleware::getInstance()->output(sprintf("Der Bau der <strong>%s</strong> wird der Reederei <strong>%s</strong> voraussichtlich <strong>%s</strong> kosten.<br />\n",
515 $contract->getShipInstance()->getShipName(),
516 $shipping->getCompanyName(),
517 $contract->formatCurrency($totalValue)
523 // Den Bauvertrag unterschreiben (damit wird er in den Bau-Queue aufgenommen)
525 $shipping->signContract($contract, $shipping);
526 } catch (NullPointerException $e) {
527 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
528 $shipping->getCompanyName(),
531 } catch (NoObjectException $e) {
532 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
533 $shipping->getCompanyName(),
536 } catch (MissingMethodException $e) {
537 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
538 $shipping->getCompanyName(),
541 } catch (InvalidContractPartnerException $e) {
542 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
543 $shipping->getCompanyName(),
546 } catch (ContractAllreadySignedException $e) {
547 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
548 $shipping->getCompanyName(),
551 } catch (WrongContractPartnerException $e) {
552 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht unterzeichnen. Grund: <strong>%s</strong><br />\n",
553 $shipping->getCompanyName(),
559 if ($contract->isSigned()) {
560 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat den Bau der <strong>%s</strong> zugestimmt.<br />\n",
561 $shipping->getCompanyName(),
562 $contract->getShipInstance()->getShipName()
565 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat den Bau der <strong>%s</strong> abgelehnt.<br />\n",
566 $shipping->getCompanyName(),
567 $contract->getShipInstance()->getShipName()
572 // Auftrag-Objekt ausgeben
573 if (defined('DEBUG_CONTRACT_OBJ')) {
574 DebugMiddleware::getInstance()->output(sprintf("Der Bauauftrag sieht wie folgt aus:<br />
576 print_r($contract, true)
580 // Erstmal bis hier hin...
583 // Anzahl Betten ermitteln
585 $totalBeds = $contract->getShipInstance()->calcTotalBeds();
586 } catch (StructuresOutOfBoundsException $e) {
587 die(sprintf("[Main:] Anzahl Betten konnten nicht ermittelt werden. Grund: <strong>%s</strong><br />\n",
590 } catch (EmptyStructuresListException $e) {
591 die(sprintf("[Main:] Anzahl Betten konnten nicht ermittelt werden. Grund: <strong>%s</strong><br />\n",
596 // Bettenanzahl ausgeben
597 DebugMiddleware::getInstance()->output(sprintf("Es stehen <strong>%d</strong> Betten zur Verfügung.",