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