00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <placement/PlacementObjectHeight.h>
00022 #include <common/RandomGenerator.h>
00023 #include <XML/XMLParser.h>
00024
00025 PlacementObjectHeight::PlacementObjectHeight()
00026 {
00027 }
00028
00029 PlacementObjectHeight::~PlacementObjectHeight()
00030 {
00031 }
00032
00033 bool PlacementObjectHeight::readXML(XMLNode *initialNode)
00034 {
00035 XMLNode *node;
00036 while (initialNode->getNamedChild("heightobject", node, false))
00037 {
00038 HeightObject heightObject;
00039
00040 if (!node->getNamedChild("minheight", heightObject.min)) return false;
00041 if (!node->getNamedChild("maxheight", heightObject.max)) return false;
00042
00043
00044 std::string objecttype;
00045 XMLNode *objectNode;
00046 if (!node->getNamedChild("object", objectNode)) return false;
00047 if (!objectNode->getNamedParameter("type", objecttype)) return false;
00048 if (!(heightObject.object = PlacementObject::create(objecttype.c_str()))) return false;
00049 if (!heightObject.object->readXML(objectNode)) return false;
00050
00051 objects_.push_back(heightObject);
00052 }
00053 if (!node->failChildren()) return false;
00054
00055 return PlacementObject::readXML(node);
00056 }
00057
00058 void PlacementObjectHeight::createObject(ScorchedContext &context,
00059 RandomGenerator &generator,
00060 unsigned int &playerId,
00061 PlacementType::Position &position)
00062 {
00063 fixed offset = generator.getRandFixed() * 10 - 5;
00064 fixed height = position.position[2] + offset;
00065
00066 std::vector<HeightObject>::iterator itor;
00067 for (itor = objects_.begin();
00068 itor != objects_.end();
00069 itor++)
00070 {
00071 HeightObject &object = (*itor);
00072
00073 if (height >= object.min &&
00074 height <= object.max)
00075 {
00076 PlacementObject *entry = object.object;
00077 entry->createObject(context, generator, playerId, position);
00078 break;
00079 }
00080 }
00081 }