TargetMovement.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 <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 }

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