PlacementType.cpp

Go to the documentation of this file.
00001 ////////////////////////////////////////////////////////////////////////////////
00002 //    Scorched3D (c) 2000-2009
00003 //
00004 //    This file is part of Scorched3D.
00005 //
00006 //    Scorched3D is free software; you can redistribute it and/or modify
00007 //    it under the terms of the GNU General Public License as published by
00008 //    the Free Software Foundation; either version 2 of the License, or
00009 //    (at your option) any later version.
00010 //
00011 //    Scorched3D is distributed in the hope that it will be useful,
00012 //    but WITHOUT ANY WARRANTY; without even the implied warranty of
00013 //    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00014 //    GNU General Public License for more details.
00015 //
00016 //    You should have received a copy of the GNU General Public License
00017 //    along with Scorched3D; if not, write to the Free Software
00018 //    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 #include <placement/PlacementType.h>
00022 #include <placement/PlacementObject.h>
00023 #include <placement/PlacementTypeMask.h>
00024 #include <placement/PlacementTypeDirect.h>
00025 #include <placement/PlacementTypeTree.h>
00026 #include <placement/PlacementTypeCount.h>
00027 #include <placement/PlacementTypeBounds.h>
00028 #include <placement/PlacementTypeTankStart.h>
00029 #include <landscapemap/LandscapeMaps.h>
00030 #include <target/TargetContainer.h>
00031 #include <target/TargetLife.h>
00032 #include <engine/ScorchedContext.h>
00033 #include <common/DefinesString.h>
00034 #include <XML/XMLParser.h>
00035 
00036 PlacementType *PlacementType::create(const char *type)
00037 {
00038         if (0 == strcmp(type, "trees")) return new PlacementTypeTree;
00039         if (0 == strcmp(type, "mask")) return new PlacementTypeMask;
00040         if (0 == strcmp(type, "direct")) return new PlacementTypeDirect;
00041         if (0 == strcmp(type, "count")) return new PlacementTypeCount;
00042         if (0 == strcmp(type, "bounds")) return new PlacementTypeBounds;
00043         if (0 == strcmp(type, "tankstart")) return new PlacementTypeTankStart;
00044         S3D::dialogMessage("PlacementType", S3D::formatStringBuffer("Unknown placement type %s", type));
00045         return 0;
00046 }
00047 
00048 PlacementType::PlacementType()
00049 {
00050 }
00051 
00052 PlacementType::~PlacementType()
00053 {
00054 }
00055 
00056 bool PlacementType::readXML(XMLNode *node)
00057 {
00058         std::string objecttype;
00059         XMLNode *objectNode;
00060         if (!node->getNamedChild("object", objectNode)) return false;
00061         if (!objectNode->getNamedParameter("type", objecttype)) return false;
00062         if (!(placementobject = PlacementObject::create(objecttype.c_str()))) return false;
00063         if (!placementobject->readXML(objectNode)) return false;
00064         return node->failChildren();
00065 }
00066 
00067 void PlacementType::createObjects(ScorchedContext &context,
00068         RandomGenerator &generator,
00069         unsigned int &playerId,
00070         ProgressCounter *counter)
00071 {
00072         std::list<Position> returnPositions;
00073         getPositions(context, generator, returnPositions, counter);
00074 
00075         std::list<Position>::iterator itor;
00076         for (itor = returnPositions.begin();
00077                 itor != returnPositions.end();
00078                 itor++)
00079         {
00080                 Position &position = *itor;
00081                 placementobject->createObject(
00082                         context, generator, playerId, position);
00083         }
00084 }
00085 
00086 bool PlacementType::checkCloseness(FixedVector &position,
00087         ScorchedContext &context,
00088         std::list<Position> &returnPositions,
00089         fixed mincloseness)
00090 {
00091         // Check for border closeness for targets
00092         std::map<unsigned int, Target *> &targets = 
00093                 context.getTargetContainer().getTargets();
00094         std::map<unsigned int, Target *>::iterator targetsitor;
00095         for (targetsitor = targets.begin();
00096                 targetsitor != targets.end();
00097                 targetsitor++)
00098         {
00099                 Target *target = (*targetsitor).second;
00100                 if (!target->isTarget()) continue;
00101 
00102                 fixed distx = target->getLife().getTargetPosition()[0] - position[0];
00103                 fixed disty = target->getLife().getTargetPosition()[1] - position[1];
00104                 fixed closeness = mincloseness + target->getBorder();
00105 
00106                 if (closeness > 0)
00107                 {
00108                         if (distx.abs() < closeness &&
00109                                 disty.abs() < closeness)
00110                         {
00111                                 return false;
00112                         }
00113                 }
00114         }
00115 
00116         // Check for mincloseness closeness for objects in the current group
00117         if (mincloseness > 0)
00118         {
00119                 std::list<Position>::iterator currentItor;
00120                 for (currentItor = returnPositions.begin();
00121                         currentItor != returnPositions.begin();
00122                         currentItor++)
00123                 {
00124                         Position *object = &(*currentItor);
00125 
00126                         fixed distx = object->position[0] - position[0];
00127                         fixed disty = object->position[1] - position[1];
00128 
00129                         if (distx.abs() < mincloseness &&
00130                                 disty.abs() < mincloseness)
00131                         {
00132                                 return false;
00133                         }       
00134                 }
00135         }
00136 
00137         return true;
00138 }

Generated on Mon Feb 16 15:14:51 2009 for Scorched3D by  doxygen 1.5.3