00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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
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
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 }