00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <movement/TargetMovement.h>
00022 #include <movement/TargetMovementEntryShips.h>
00023 #include <movement/TargetMovementEntryBoids.h>
00024 #include <movement/TargetMovementEntrySpline.h>
00025 #include <common/RandomGenerator.h>
00026 #include <engine/ScorchedContext.h>
00027 #include <landscapemap/LandscapeMaps.h>
00028 #include <landscapedef/LandscapeTex.h>
00029 #include <landscapedef/LandscapeDefn.h>
00030 #include <landscapedef/LandscapeMovement.h>
00031
00032 TargetMovement::TargetMovement()
00033 {
00034 }
00035
00036 TargetMovement::~TargetMovement()
00037 {
00038 }
00039
00040 void TargetMovement::generate(ScorchedContext &context)
00041 {
00042 while (!movements_.empty())
00043 {
00044 TargetMovementEntry *movement = movements_.back();
00045 movements_.pop_back();
00046 delete movement;
00047 }
00048
00049 LandscapeTex &tex =
00050 *context.getLandscapeMaps().getDefinitions().getTex();
00051 LandscapeDefn &defn =
00052 *context.getLandscapeMaps().getDefinitions().getDefn();
00053 RandomGenerator random;
00054 random.seed(context.getLandscapeMaps().getDefinitions().getSeed());
00055
00056 addMovements(context, random, tex.texDefn.includes);
00057 addMovements(context, random, defn.texDefn.includes);
00058 }
00059
00060 void TargetMovement::addMovements(ScorchedContext &context,
00061 RandomGenerator &random,
00062 std::vector<LandscapeInclude *> &movements)
00063 {
00064 std::vector<LandscapeInclude *>::iterator itor;
00065 for (itor = movements.begin();
00066 itor != movements.end();
00067 itor++)
00068 {
00069 LandscapeInclude *movement = (*itor);
00070 addMovementType(context, random, movement->movements);
00071 }
00072 }
00073
00074 void TargetMovement::addMovementType(ScorchedContext &context,
00075 RandomGenerator &random,
00076 std::vector<LandscapeMovementType *> &movementtypes)
00077 {
00078 std::vector<LandscapeMovementType *>::iterator itor;
00079 for (itor = movementtypes.begin();
00080 itor != movementtypes.end();
00081 itor++)
00082 {
00083 LandscapeMovementType *movementtype = (*itor);
00084
00085 TargetMovementEntry *entry = 0;
00086 switch(movementtype->getType())
00087 {
00088 case LandscapeMovementType::eBoids:
00089 entry = new TargetMovementEntryBoids();
00090 break;
00091 case LandscapeMovementType::eShips:
00092 entry = new TargetMovementEntryShips();
00093 break;
00094 case LandscapeMovementType::eSpline:
00095 entry = new TargetMovementEntrySpline();
00096 break;
00097 default:
00098 DIALOG_ASSERT(0);
00099 break;
00100 }
00101 entry->generate(context, random, movementtype);
00102 movements_.push_back(entry);
00103 }
00104 }
00105
00106 void TargetMovement::simulate(ScorchedContext &context, fixed frameTime)
00107 {
00108 std::vector<TargetMovementEntry *>::iterator itor;
00109 for (itor = movements_.begin();
00110 itor != movements_.end();
00111 itor++)
00112 {
00113 TargetMovementEntry *movementEntry = *itor;
00114 movementEntry->simulate(context, frameTime * 20);
00115 }
00116 }
00117
00118 void TargetMovement::draw()
00119 {
00120 std::vector<TargetMovementEntry *>::iterator itor;
00121 for (itor = movements_.begin();
00122 itor != movements_.end();
00123 itor++)
00124 {
00125 TargetMovementEntry *movementEntry = *itor;
00126 movementEntry->draw();
00127 }
00128 }
00129
00130 bool TargetMovement::writeMessage(NetBuffer &buffer)
00131 {
00132 std::vector<TargetMovementEntry *>::iterator itor;
00133 for (itor = movements_.begin();
00134 itor != movements_.end();
00135 itor++)
00136 {
00137 TargetMovementEntry *movementEntry = *itor;
00138 if (!movementEntry->writeMessage(buffer)) return false;
00139 }
00140 return true;
00141 }
00142
00143 bool TargetMovement::readMessage(NetBufferReader &reader)
00144 {
00145 std::vector<TargetMovementEntry *>::iterator itor;
00146 for (itor = movements_.begin();
00147 itor != movements_.end();
00148 itor++)
00149 {
00150 TargetMovementEntry *movementEntry = *itor;
00151 if (!movementEntry->readMessage(reader)) return false;
00152 }
00153 return true;
00154 }