* @version 0.0.0 * @copyright Copyright(c) 2007, 2008 Roland Haeder, this is free software * @license GNU GPL 3.0 or any newer version * @link http://www.ship-simu.org * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ class BaseSimulator extends BaseFrameworkSystem { // Schiffsteilinstanz private $partInstance = null; // Abmasse (Breite/Hoehe/Laenge) private $width = 0; private $height = 0; private $length = 0; // Aktuelles Schiff und Schiffsteil private $currShip = null; private $currPart = null; // Faktoren zur Erweiterung der Masse. Beispielsweise soll der Maschinenraum groesser wie der Motor sein private $resizeFactorArray = array( 'width' => 1, 'height' => 1, 'length' => 1 ); // Konstruktor protected function __construct ($class) { // Call highest constructor parent::__construct($class); // Set part description and class name $this->setObjectDescription("Simulator-Basis-Einheit"); // Clean up a little, dies sollte ganz zum Schluss erfolgen! $this->removeResizeFactorArray(); $this->removeCurrPart(); $this->removeCurrShip(); } // Setter-Methode fuer Laenge public final function setLength ($length) { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] %dm Länge gesetzt.
\n", $this->__toString(), $length )); $this->length = (float) $length; } // Setter-Methode fuer Breite public final function setWidth ($width) { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] %dm Breite gesetzt.
\n", $this->__toString(), $width )); $this->width = (float) $width; } // Setter-Methode fuer Hoehe public final function setHeight ($height) { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] %dm Höhe gesetzt.
\n", $this->__toString(), $height )); $this->height = (float) $height; } // Getter-Methode fuer Laenge public final function getLength () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Länge angefordert.
\n", $this->__toString() )); return $this->length; } // Getter-Methode fuer Breite public final function getWidth () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Länge angefordert.
\n", $this->__toString() )); return $this->width; } // Getter-Methode fuer Hoehe public final function getHeight () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Höhe angefordert.
\n", $this->__toString() )); return $this->height; } // Setter-Methode fuer Teil-Instanz public final function setPartInstance (ConstructableShipPart $partInstance) { $this->partInstance = $partInstance; } // Getter-Methode fuer Teil-Instanz public final function getPartInstance () { if (!isset($this->partInstance)) { return null; } return $this->partInstance; } // Remover-Methode fuer die Teil-Instanz public final function removePartInstance () { if ($this->getPartInstance() !== null) { // Warnung ausgeben if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] partInstance ist nicht null! Instanz-Attribut wird nicht entfernt.
\n", $this->__toString() )); } else { // Leere Instanz kann entfernt werden if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] partInstance wurde entfernt.
\n", $this->__toString() )); unset($this->partInstance); } } // Prueft ob all Umberechnungsfaktoren gesetzt sind private function isResizeFactorValid () { return (($this->getResizeFactorElement('width') > 1) || ($this->getResizeFactorElement('height') > 1) || ($this->getResizeFactorElement('length') > 1) ); } // Baut einen Motor in das Schiff ein public function addShipPartToShip (ConstructableShip $shipInstance, ConstructableShipPart $partInstance) { // Schiff/-steil merken $this->currShip = $shipInstance; $this->currPart = $partInstance; if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Maschinenraum mit Motor %s wird fuer das Schiff %s konstruiert.
\n", $this->__toString(), $this->getCurrPart()->getObjectDescription(), $this->currShip->getShipName() )); // Passt ueberhaupt das Schiffsteil in's Schiff? if ($this->isShipPartSizeValid()) { // Berechnungen fuer umliegendes Objekt anpassen if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Das Schiffsteil %s vom Typ %s passt in das Schiff %s hinein.
\n", $this->__toString(), $this->getCurrPart()->getObjectDescription(), $this->getCurrPart()->__toString(), $this->currShip->getShipName() )); // Muessen die Masse angepasst werden? if ($this->isResizeFactorValid()) { // Neue Angaben berechnen (wir lassen etwas Lust fuer Kabelbaeume, Roehren, Maschinisten, etc.) $this->newWidth = (float) $this->getCurrPart()->getWidth() * $this->resizeFactorArray['width']; $this->newHeight = (float) $this->getCurrPart()->getHeight() * $this->resizeFactorArray['height']; $this->newLength = (float) $this->getCurrPart()->getLength() * $this->resizeFactorArray['length']; // Passt dies nun immer noch? if ($this->isNewSizeValid()) { // Das passt auch, dann Werte setzen und Motor-Instanz merken if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Das Schiffsteil %s passt in das Schiff %s hinein.
\n", $this->__toString(), $this->getObjectDescription(), $this->currShip->getShipName() )); $this->setWidth($this->newWidth); $this->setHeight($this->newHeight); $this->setLength($this->newLength); // Einige Dinge entfernen... $this->removeAllNewAttr(); } else { // Passt nicht! Also wieder Exception werfen... throw new StructureShipMismatchException(sprintf("[%s:] Das Schiffsteil %s vom Typ %s ist zu gross für das Schiff!", $this->getCurrPart()->__toString(), $this->getCurrPart()->getObjectDescription(), $this->getCurrPart()->__toString() ), 2); } } elseif ($this->currPart != null) { // Aktuelle Masse setzen $this->setWidth($this->getCurrPart()->getWidth()); $this->setHeight($this->getCurrPart()->getHeight()); $this->setLength($this->getCurrPart()->getLength()); } // Existiert ein Schiffsteil? if (!is_null($this->currPart)) { // Debug-Meldung ausgeben if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Schiffsteil %s gefunden.
\n", $this->getCurrPart()->realClass, $this->getCurrPart()->getObjectDescription() )); // Schiffsteil-Instanz setzen $this->setPartInstance($this->currPart); // Instanzen entfernen $this->getCurrPart()->removeCurrShip(); $this->getCurrPart()->removeCurrPart(); $this->getCurrPart()->removePartInstance(); $this->getCurrPart()->removeResizeFactorArray(); } } else { // Exception werfen! throw new StructureShipMismatchException(sprintf("[%s:] Das Schiffsteil %s vom Typ %s passt nicht in das Schiff!", $this->getCurrPart()->realClass, $this->getCurrPart()->getObjectDescription(), $this->getCurrPart()->__toString() ), 1); } // Nochmals Clean up a little $this->removeResizeFactorArray(); $this->removeCurrShip(); $this->removeCurrPart(); } // Array fuer Umrechnungstabelle entfernen public final function removeResizeFactorArray () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] removeResizeFactor erreicht.
\n", $this->__toString() )); unset($this->resizeFactorArray); } /** * Remove all new*** attributes * * @return void */ public final function removeAllNewAttr () { unset($this->newWidth); unset($this->newHeight); unset($this->newLength); } /** * Remove current ship instance * * @return void */ public final function removeCurrShip () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] removeCurrShip erreicht.
\n", $this->__toString() )); unset($this->currShip); } // Aktuelle Schiffsteil-Instanz entfernen public final function removeCurrPart () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] removeCurrPart erreicht.
\n", $this->__toString() )); unset($this->currPart); } // Breite entfernen public final function removeWidth () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Breite entfernt.
\n", $this->__toString() )); unset($this->width); } // Hoehe entfernen public final function removeHeight () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Höhe entfernt.
\n", $this->__toString() )); unset($this->height); } // Laenge entfernen public final function removeLength () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Länge entfernt.
\n", $this->__toString() )); unset($this->length); } // Tiefgang entfernen public final function removeDraught () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Tiefgang entfernt.
\n", $this->__toString() )); unset($this->draught); } // Getter-Methode fuer Element aus resizeFactor public final function getResizeFactorElement ($el) { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] getResizeFactorElement erreicht. (element=%s)
\n", $this->__toString(), $el )); if (isset($this->resizeFactorArray[$el])) { // Element gefunden return $this->resizeFactorArray[$el]; } else { // Element nicht gefunden! return 0; } } // Setter-Methode fuer Element in resizeFactor public final function setResizeFactorElement ($el, $value) { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] Umberechnungsfaktor %s=%s gesetzt.
\n", $this->__toString(), $el, $value )); $this->resizeFactorArray[$el] = (float) $value; } // Kontrolliert, ob die Abmasse Schiffsteil->Schiff stimmen public function isShipPartSizeValid () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] isShipPartSizeValid erreicht.
\n", $this->__toString() )); return ( ( ( // Already defined ship messurings ($this->getCurrPart()->getWidth() < $this->currShip->getWidth()) && ($this->getCurrPart()->getHeight() < $this->currShip->getDraught()) && ($this->getCurrPart()->getLength() < $this->currShip->getLength()) ) || ( // Ship messurings shall be calculated ($this->currShip->getWidth() == 0) && ($this->currShip->getHeight() == 0) && ($this->currShip->getLength() == 0) ) // The inserted part must be messured! ) && ($this->getCurrPart()->getWidth() > 0) && ($this->getCurrPart()->getHeight() > 0) && ($this->getCurrPart()->getLength() > 0) ); } // Kontrolliert, ob die Abmasse Maschinenraum->Schiff stimmen public function isNewSizeValid () { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] isNewSizeValid erreicht.
\n", $this->__toString() )); return ( ( // Already defined ship messurings ($this->newWidth < $this->currShip->getWidth()) && ($this->newHeight < $this->currShip->getDraught()) && ($this->newLength < $this->currShip->getLength()) ) || ( // Ship messurings shall be calculated ($this->currShip->getWidth() == 0) && ($this->currShip->getHeight() == 0) && ($this->currShip->getLength() == 0) ) ); } // Masse extrahieren public function extractDimensions ($dim) { if (defined('DEBUG_CORE')) $this->getDebugInstance()->output(sprintf("[%s:] extractDimensions erreicht für %s.
\n", $this->__toString(), $this->getObjectDescription() )); // Abmasse setzen if ((isset($dim)) && (is_array($dim)) && (count($dim) == 3)) { // Abmasse aus Array holen $this->setWidth($dim[0]); $this->setHeight($dim[1]); $this->setLength($dim[2]); } else { // Nicht gefundene Abmasse! throw new DimNotFoundInArrayException($this, self::EXCEPTION_DIMENSION_ARRAY_INVALID); } } /** * Getter for current part instance * * @return $currPart Instance of the current ship part object */ public final function getCurrPart () { return $this->currPart; } } // [EOF] ?>