Target.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 <math.h>
00022 #include <tankai/TankAIAdder.h>
00023 #include <target/Target.h>
00024 #include <target/TargetState.h>
00025 #include <target/TargetRenderer.h>
00026 #include <target/TargetLife.h>
00027 #include <target/TargetShield.h>
00028 #include <target/TargetParachute.h>
00029 #include <target/TargetGroup.h>
00030 #include <engine/ScorchedContext.h>
00031 #include <weapons/AccessoryStore.h>
00032 #include <common/Defines.h>
00033 #include <common/Logger.h>
00034 #include <common/OptionsScorched.h>
00035 
00036 Target::Target(unsigned int playerId, 
00037         const LangString &name,
00038         ScorchedContext &context) :
00039         playerId_(playerId),
00040         context_(context),
00041         deathAction_(0), burnAction_(0),
00042         renderer_(0), 
00043         border_(0)
00044 {
00045         setName(name);
00046 
00047         life_ = new TargetLife(context, playerId);
00048         shield_ = new TargetShield(context, playerId);
00049         parachute_ = new TargetParachute(context);
00050         group_ = new TargetGroup(context);
00051         targetState_ = new TargetState();
00052 
00053         life_->setTarget(this);
00054         life_->setBoundingSphere(true);
00055         shield_->setTarget(this);
00056         shield_->setCurrentShield(0);
00057         group_->setTarget(this);
00058 }
00059 
00060 Target::~Target()
00061 {
00062         life_->setLife(0);
00063 
00064         delete renderer_; renderer_ = 0;
00065         delete life_; life_ = 0;
00066         delete shield_; shield_ = 0;
00067         delete group_; group_ = 0;
00068         delete parachute_; parachute_ = 0;
00069         delete targetState_; targetState_ = 0;
00070         playerId_ = 0;
00071 }
00072 
00073 void Target::newGame()
00074 {
00075         life_->newGame();
00076         shield_->newGame();
00077         parachute_->newGame();
00078 }
00079 
00080 bool Target::isTemp()
00081 {
00082         return (isTarget() || 
00083                 getPlayerId() >= TargetID::MIN_TARGET_ID);
00084 }
00085 
00086 bool Target::getAlive()
00087 {
00088         return (life_->getLife() > 0);
00089 }
00090 
00091 void Target::setName(const LangString &name)
00092 {
00093         name_ = name;
00094         if (!context_.getOptionsGame().getAllowMultiLingualNames() &&
00095                 !isTarget())
00096         {
00097                 for (unsigned int *c = (unsigned int *)name_.c_str();
00098                         *c;
00099                         c++)
00100                 {
00101                         if (*c > 127) *c = '?';
00102                 }
00103         }
00104 }
00105 
00106 const std::string &Target::getCStrName()
00107 {
00108         cStrName_ = LangStringUtil::convertFromLang(name_);
00109         return cStrName_;
00110 }
00111 
00112 bool Target::writeMessage(NetBuffer &buffer)
00113 {
00114         buffer.addToBuffer(name_);
00115         if (!shield_->writeMessage(buffer)) return false;
00116         if (!life_->writeMessage(buffer)) return false;
00117         if (!parachute_->writeMessage(buffer)) return false;
00118         if (!targetState_->writeMessage(buffer)) return false;
00119         if (!group_->writeMessage(buffer)) return false;
00120         buffer.addToBuffer(border_);
00121         if (!context_.getAccessoryStore().writeWeapon(buffer, deathAction_)) return false;
00122         if (!context_.getAccessoryStore().writeWeapon(buffer, burnAction_)) return false;
00123 
00124         return true;
00125 }
00126 
00127 bool Target::readMessage(NetBufferReader &reader)
00128 {
00129         if (!reader.getFromBuffer(name_))
00130         {
00131                 Logger::log("Target::name_ read failed");
00132                 return false;
00133         }
00134         if (!shield_->readMessage(reader))
00135         {
00136                 Logger::log("Target::shield_ read failed");
00137                 return false;
00138         }
00139         if (!life_->readMessage(reader))
00140         {
00141                 Logger::log("Target::life_ read failed");
00142                 return false;
00143         }
00144         if (!parachute_->readMessage(reader))
00145         {
00146                 Logger::log("Target::parachute_ read failed");
00147                 return false;
00148         }
00149         if (!targetState_->readMessage(reader))
00150         {
00151                 Logger::log("Target::targetState_ read failed");
00152                 return false;
00153         }
00154         if (!group_->readMessage(reader))
00155         {
00156                 Logger::log("Target::group_ read failed");
00157                 return false;
00158         }
00159         if (!reader.getFromBuffer(border_))
00160         {
00161                 Logger::log("Target::border read failed");
00162                 return false;
00163         }
00164         deathAction_ = context_.getAccessoryStore().readWeapon(reader);
00165         burnAction_ = context_.getAccessoryStore().readWeapon(reader);
00166 
00167         return true;
00168 }

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