5 // Set testing mode (no starter.php will be loaded!)
6 define('TEST_MODE', true);
9 require(dirname(dirname(dirname(__FILE__))) . "/inc/config.php");
11 // Load all include files
12 require(PATH . 'inc/includes.php');
14 // Load all game classes
15 require(PATH . 'inc/classes.php');
17 // Load file I/O handler
18 require(PATH . 'inc/file_io.php');
20 // Load database layer
21 require(PATH . 'inc/database.php');
23 // Set default application
24 FrameworkConfiguration::getInstance()->setConfigEntry('default_application', 'ship-simu');
25 $application = 'ship-simu';
28 require(PATH . 'application/ship-simu/loader.php');
30 // Wir tun hier so, als waere schon das Reederei-Objekt generiert und wir wollen
31 // jetzt die Personalliste wiederherstellen
33 $personell = SimulatorPersonell::createSimulatorPersonellByID('SimulatorPersonell@829292aeca3f6bf78c16e25fc4f75c98');
34 } catch (InvalidIDFormatException $e) {
35 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
38 } catch (InvalidArrayCountException $e) {
39 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
42 } catch (NullPointerException $e) {
43 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
46 } catch (NoObjectException $e) {
47 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
50 } catch (MissingMethodException $e) {
51 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
54 } catch (FileIsEmptyException $e) {
55 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
58 } catch (FilePointerNotOpenedException $e) {
59 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
62 } catch (InvalidArrayCountException $e) {
63 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
66 } catch (InvalidMD5ChecksumException $e) {
67 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
70 } catch (InvalidDataLengthException $e) {
71 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
74 } catch (InvalidSimulatorIDException $e) {
75 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
78 } catch (MismatchingCompressorsException $e) {
79 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
82 } catch (ContainerItemIsNullException $e) {
83 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
86 } catch (ContainerItemIsNoArrayException $e) {
87 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
90 } catch (ContainerMaybeDamagedException $e) {
91 die(sprintf("[Main:] Could not create personal list for follwing reason: <strong>%s</strong><br />\n",
96 // Personal-Objekt debuggen
97 if (defined('DEBUG_PERSONELL_OBJ')) {
98 DebugMiddleware::getInstance()->output(sprintf("The personal object looks like this:<br />
100 print_r($personell, true)
105 $harbor = Harbor::createHarbor("Hamburger Hafen");
108 DebugMiddleware::getInstance()->output(sprintf("Der <strong>%s</strong> ist gegründet worden.<br />\n",
109 $harbor->getHarborName()
112 // Hafen-Objekt debuggen
113 if (defined('DEBUG_HARBOR_OBJ')) {
114 DebugMiddleware::getInstance()->output(sprintf("Der <strong>%s</strong> sieht wie folgt aus:<br />
116 $harbor->getHarborName(),
117 print_r($harbor, true)
122 $merchant = Merchant::createMerchant("Namenlos", $harbor);
124 // Array mit Einbauten erstellen
126 'parts' => array( // *** Die zu einbauenden Schiffsteile ***
127 'Motor' => array( // --- Maschinenraum mit Motor ---
128 "Ocean-Power 2000", // Bezeichnung
129 20000, // Pferdestaerken
131 2.5, 2, 3.5 // Abmasse (Breite/Hoehe/Laenge)
133 'Bridge' => array( // --- Kommandobruecke ---
134 26, 2.5, 15 // Abmasse (Breite/Hoehe/Laenge)
136 'CarDeck' => array( // --- Autodecks ---
137 'amount' => 8, // Anzahl Autodecks (einige liegen hintereinander im selben Deck!)
138 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
142 'TruckDeck' => array( // --- Decks fuer LKW/Busse haben vielleicht ein anderes Belueftgungssystem, etc. ---
143 'amount' => 1, // Anzahl der Decks
144 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
145 8, 5, 195 // Geht durchs gesamte Schiff!
148 'TrainDeck' => array( // --- Decks fuer Zuege haben Schienen... ---
149 'amount' => 1, // Anzahl der Decks
150 'dim' => array( // Abmessung (Breite/Hoehe/Laenge)
151 8, 4, 195 // Geht durchs gesamte Schiff!
154 'LuxuryCabin' => array( // --- Luxuskabinen ---
155 'amount' => 20, // Anzahl Luxuskabinen im Schiff
156 'rooms' => 4, // Raeume: 2 Schlafzimmer, 1 Auffenthaltszimmer, 1 Bad mit Dusche/Toilette/Waschbecken
157 'bed' => 3, // Anzahl Betten (1 Doppelbett 2 Einzelbetten, Doppel-/Einzelbetten in getrennte Raeume)
158 'dim' => array( // Abmessung der Luxuskabine (Breite/Hoehe/Laenge)
162 'PremierCabin' => array( // --- Mittlere Kabinen ---
163 'amount' => 40, // Anzahl
164 'rooms' => 2, // Raeume: Schlafzimmer, Bad mit Toilette/Waschbecken
165 'bed' => 2, // Anzahl Betten (1 Doppelbett, 1 Einzelbett; gemeinsamer Raum)
166 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
170 'LowCabin' => array( // --- Untere Kabinen (befinden sich in den Unterbauten) ---
171 'amount' => 90, // Anzahl
172 'rooms' => 1, // Raeume: Schlafzimmer, Waschbecken
173 'bed' => 2, // Anzahl Betten (2 Etagenbetten)
174 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
178 'EconomyCabin' => array( // --- Unterste Kabinen (befinden sich tief unten im Schiffsbauch) ---
179 'amount' => 140, // Anzahl
180 'rooms' => 1, // Raeume: Schlafzimmer, Waschbecken
181 'bed' => 1, // Anzahl Betten (1 Etagenbett)
182 'dim' => array( // Abmessungen der Kabine (Breite/Hoehe/Laenge)
187 'builds' => array( // *** Welche Oberklasse verwendet werden sollen ***
188 'Motor' => "MaschineRoom",
189 'Bridge' => "BaseUpperStructure",
190 'LuxuryCabin' => "BaseCabin",
191 'PremierCabin' => "BaseCabin",
192 'LowCabin' => "BaseCabin",
193 'EconomyCabin' => "BaseCabin",
194 'CarDeck' => "BaseDeck",
195 'TrainDeck' => "BaseDeck",
196 'TruckDeck' => "BaseDeck"
200 // Preisliste auffuellen
201 foreach ($einbauten['parts'] as $key=>$part) {
202 // Create item array string
204 foreach ($part as $idx=>$itemPart) {
205 if (is_string($itemPart)) {
207 $item .= sprintf("\"%s\", ", $itemPart);
208 } elseif (is_int($itemPart)) {
210 $item .= sprintf("%d, ", $itemPart);
211 } elseif (is_float($itemPart)) {
213 $item .= sprintf("%f, ", $itemPart);
214 } elseif (is_array($itemPart)) {
218 // Go all items through
219 foreach ($itemPart as $idx2=>$subPart) {
220 if (is_int($subPart)) {
221 // Integer again found
222 $item .= sprintf("%d, ", $subPart);
223 } elseif (is_float($subPart)) {
225 $item .= sprintf("%f, ", $subPart);
227 // Unsupport part found
228 die(sprintf("[Main:] Unsupported sub-array element on pos <strong>%d</strong> in array <strong>%s</strong> found: <u>%s</u>", $idx2, $idx, $subPart));
232 // Remove trailing comma
233 $item = substr($item, 0, -2);
235 // Add closing bracket
238 // Unsupport part found
239 die(sprintf("[Main:] Unsupported array element on pos <strong>%d</strong>: <u>%s</u>", $idx, $itemPart));
243 // Remove trailing comma
244 $item = substr($item, 0, -2);
247 $price = mt_rand(5, 12) * 10000;
251 // Generate command for adding objects to a price list
252 $eval = sprintf("\$merchant->addItemToPriceList(%s::create%s(%s), %d);",
260 if ((defined('DEBUG_EVAL')) || (defined('DEBUG_ALL'))) DebugMiddleware::getInstance()->output(sprintf("[Main:] Konstruierte PHP-Anweisung: <pre><em>%s</em></pre><br />\n",
264 // Run the constructed command
266 } catch (ItemNotTradeableException $e) {
267 die(sprintf("[Main:] Die Preisliste des Händlers <strong>%s</strong> kann nicht befüllt werden. Grund: <strong>%s</strong><br />\n",
268 $merchant->getMerchantName(),
274 // Haendler-Objekt debuggen
275 if (defined('DEBUG_MERCHANT_OBJ')) {
276 DebugMiddleware::getInstance()->output(sprintf("Der Händler <strong>%s</strong> sieht wie folgt aus:<br />
278 $merchant->getMerchantName(),
279 print_r($merchant, true)
284 $shipping = ShippingCompany::createShippingCompany("Hanseatic Travel Company", $harbor);
286 // Firmenschef setzen
288 $shipping->setCompanyFounder(CompanyEmployee::createCompanyEmployee("Roland", "Häder", "M", 1977, 9, 26, true, 2000));
289 } catch (BirthdayInvalidException $e) {
290 die(sprintf("[Main:] Reederei-Gründer konnte nicht gesetzt werden. Grund: <strong>%s</strong><br />\n",
295 // Dann mal ausgeben...
296 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> ist von <strong>%s %s</strong> gegründet worden.<br />\n",
297 $shipping->getCompanyName(),
298 $shipping->getFounderInstance()->getSurname(),
299 $shipping->getFounderInstance()->getFamily()
302 // Die Reederei stellt Personal ein und bedient sich an der $personell-Instanz
304 $shipping->recruitRandomEmployees(10, $personell);
305 } catch (ToMuchEmployeesException $e) {
306 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal einstellen. Grund: <strong>%s</strong><br />\n",
307 $shipping->getCompanyName(),
310 } catch (OutOfBoundsException $e) {
311 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal einstellen. Grund: <strong>%s</strong><br />\n",
312 $shipping->getCompanyName(),
317 // Anzahl Personal ausgeben
318 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat nun <strong>%d</strong> weitere Mitarbeiter.<br />\n",
319 $shipping->getCompanyName(),
320 $shipping->getTotalEmployee()
323 // Dann die ersten 3 Werften in den Hafen einbauen und Personal zuweisen
324 $shipping->createShipyardInHarbor("Werft 1", $harbor);
325 $shipping->createShipyardInHarbor("Werft 2", $harbor);
326 $shipping->createShipyardInHarbor("Werft 3", $harbor);
328 // In alle Werften sollen Passagierschiffe gebaut werden koennen
330 $shipping->addShipTypeToAllShipyards("PassengerShip");
331 } catch (ClassNotFoundException $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(),
336 } catch (ClassMismatchException $e) {
337 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
338 $shipping->getCompanyName(),
341 } catch (NoObjectException $e) {
342 die(sprintf("[Main:] Die Reederei <strong>%s</strong> kann ihre Werften nicht beschäftigen. Grund: <strong>%s</strong><br />\n",
343 $shipping->getCompanyName(),
348 // Personal auf die Werften verteilen
350 $shipping->distributeAllPersonellOnShipyards();
351 } catch (NoShipyardsConstructedException $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 (ClassMismatchException $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(),
361 } catch (NullPointerException $e) {
362 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
363 $shipping->getCompanyName(),
366 } catch (NoObjectException $e) {
367 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte kein Personal den Werften zuteilen. Grund: <strong>%s</strong><br />\n",
368 $shipping->getCompanyName(),
373 // Normale Meldung ausgeben
374 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",
375 $shipping->getCompanyName(),
376 $shipping->getTotalEmployee(),
377 $shipping->getTotalShipyards()
380 // Dann nimmt die Reederei ihren ersten Bauauftrag entgegen.
381 // Sie muss auch sich selber Bauauftraege erteilen!
383 $shipping->addNewWorksContract(WorksContract::createWorksContract("PassengerShip", "M/S Poseidon", $shipping));
384 } catch (ClassNotFoundException $e) {
385 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
388 } catch (NullPointerException $e) {
389 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
392 } catch (NoObjectException $e) {
393 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
396 } catch (MissingMethodException $e) {
397 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
400 } catch (EmptyStructuresListException $e) {
401 die(sprintf("[Main:] Der Bauauftrag konnte nicht erstellt werden. Grund: <strong>%s</strong><br />\n",
406 // Auftrag-Instanz holen
407 $contract = $shipping->getLastContractInstance();
409 // Die Reederei hat einen Haendler gewaehlt
411 $shipping->setMerchantInstance($merchant);
412 } catch (NullPointerException $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(),
417 } catch (NoObjectException $e) {
418 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
419 $merchant->getMerchantName(),
422 } catch (ClassMismatchException $e) {
423 die(sprintf("[Main:] Der Händler <strong>%s</strong> konnte nicht ausgewählt werden. Grund: <strong>%s</strong><br />\n",
424 $merchant->getMerchantName(),
429 // Den Bauauftrag mit der Reederei abgleichen, ob sie den Schiffstyp bauen koennen
431 $typeValid = $shipping->validateWorksContractShipType($contract);
432 } catch (NullPointerException $e) {
433 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht validieren. Grund: <strong>%s</strong><br />\n",
434 $shipping->getCompanyName(),
437 } catch (NoObjectException $e) {
438 die(sprintf("[Main:] Die Reederei <strong>%s</strong> konnte den Bauauftrag nicht validieren. Grund: <strong>%s</strong><br />\n",
439 $shipping->getCompanyName(),
444 // Kann gebaut werden?
446 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> kann Schiffe vom Typ <strong>%s</strong> bauen.<br />\n",
447 $shipping->getCompanyName(),
448 $contract->getShipInstance()->getObjectDescription()
451 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> kann keine Schiffe vom Typ <strong>%s</strong> bauen!<br />\n",
452 $shipping->getCompanyName(),
453 $contract->getShipInstance()->getObjectDescription()
458 // Dann den Bauauftrag verfeinern
459 foreach ($einbauten['parts'] as $key=>$part) {
461 $contract->addContractDetails($key, $einbauten['builds'][$key], $part);
462 } catch (ShipPartNotConstructableException $e) {
464 die($e->getMessage());
465 } catch (ShipNotConstructedException $e) {
467 die($e->getMessage());
468 } catch (ItemNotInPriceListException $e) {
469 die(sprintf("[Main:] Der Artikel <strong>%s</strong> konnte nicht in der Preisliste gefunden werden. Grund: <strong>%s</strong><br />\n",
473 } catch (InvalidArrayCountException $e) {
474 die(sprintf("[Main:] Der Artikel <strong>%s</strong> konnte nicht in der Preisliste gefunden werden. Grund: <strong>%s</strong><br />\n",
481 // Reederei-Objekt ausgeben
482 if (defined('DEBUG_COMPANY_OBJ')) {
483 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> sieht wie folgt aus:<br />
485 $shipping->getCompanyName(),
486 print_r($shipping, true)
498 // Gesamtwert ausgeben
500 $totalValue = $contract->getTotalPrice();
501 } catch (NullPointerException $e) {
502 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
505 } catch (NoObjectException $e) {
506 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
509 } catch (MissingMethodException $e) {
510 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
513 } catch (EmptyStructuresListException $e) {
514 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
517 } catch (TotalPriceNotCalculatedException $e) {
518 die(sprintf("[Main:] Gesamtbestellwert nicht ermittelbar. Grund: <strong>%s</strong><br />\n",
524 DebugMiddleware::getInstance()->output(sprintf("Der Bau der <strong>%s</strong> wird der Reederei <strong>%s</strong> voraussichtlich <strong>%s</strong> kosten.<br />\n",
525 $contract->getShipInstance()->getShipName(),
526 $shipping->getCompanyName(),
527 $contract->formatCurrency($totalValue)
533 // Den Bauvertrag unterschreiben (damit wird er in den Bau-Queue aufgenommen)
535 $shipping->signContract($contract, $shipping);
536 } catch (NullPointerException $e) {
537 die(sprintf("[Main:] The shipping company <strong>%s</strong> was not able to sign the contract for the following reason: <strong>%s</strong><br />\n",
538 $shipping->getCompanyName(),
541 } catch (NoObjectException $e) {
542 die(sprintf("[Main:] The shipping company <strong>%s</strong> was not able to sign the contract for the following reason: <strong>%s</strong><br />\n",
543 $shipping->getCompanyName(),
546 } catch (MissingMethodException $e) {
547 die(sprintf("[Main:] The shipping company <strong>%s</strong> was not able to sign the contract for the following reason: <strong>%s</strong><br />\n",
548 $shipping->getCompanyName(),
551 } catch (InvalidContractPartnerException $e) {
552 die(sprintf("[Main:] The shipping company <strong>%s</strong> was not able to sign the contract for the following reason: <strong>%s</strong><br />\n",
553 $shipping->getCompanyName(),
556 } catch (ContractAllreadySignedException $e) {
557 die(sprintf("[Main:] The shipping company <strong>%s</strong> was not able to sign the contract for the following reason: <strong>%s</strong><br />\n",
558 $shipping->getCompanyName(),
561 } catch (WrongContractPartnerException $e) {
562 die(sprintf("[Main:] The shipping company <strong>%s</strong> was not able to sign the contract for the following reason: <strong>%s</strong><br />\n",
563 $shipping->getCompanyName(),
569 if ($contract->isSigned()) {
570 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat den Bau der <strong>%s</strong> zugestimmt.<br />\n",
571 $shipping->getCompanyName(),
572 $contract->getShipInstance()->getShipName()
575 DebugMiddleware::getInstance()->output(sprintf("Die Reederei <strong>%s</strong> hat den Bau der <strong>%s</strong> abgelehnt.<br />\n",
576 $shipping->getCompanyName(),
577 $contract->getShipInstance()->getShipName()
582 // Auftrag-Objekt ausgeben
583 if (defined('DEBUG_CONTRACT_OBJ')) {
584 DebugMiddleware::getInstance()->output(sprintf("Der Bauauftrag sieht wie folgt aus:<br />
586 print_r($contract, true)
590 // Erstmal bis hier hin...
593 // Anzahl Betten ermitteln
595 $totalBeds = $contract->getShipInstance()->calcTotalBeds();
596 } catch (StructuresOutOfBoundsException $e) {
597 die(sprintf("[Main:] Anzahl Betten konnten nicht ermittelt werden. Grund: <strong>%s</strong><br />\n",
600 } catch (EmptyStructuresListException $e) {
601 die(sprintf("[Main:] Anzahl Betten konnten nicht ermittelt werden. Grund: <strong>%s</strong><br />\n",
606 // Bettenanzahl ausgeben
607 DebugMiddleware::getInstance()->output(sprintf("Es stehen <strong>%d</strong> Betten zur Verfügung.",