00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 }