TankAICurrentDefenses.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 <tankai/TankAICurrentDefenses.h>
00022 #include <tank/Tank.h>
00023 #include <tank/TankAccessories.h>
00024 #include <weapons/Accessory.h>
00025 #include <target/TargetLife.h>
00026 #include <target/TargetShield.h>
00027 #include <target/TargetParachute.h>
00028 #include <coms/ComsDefenseMessage.h>
00029 #include <server/ServerDefenseHandler.h>
00030 #include <XML/XMLNode.h>
00031 #include <stdlib.h>
00032 
00033 TankAICurrentDefenses::TankAICurrentDefenses()
00034 {
00035 }
00036 
00037 
00038 TankAICurrentDefenses::~TankAICurrentDefenses()
00039 {
00040 }
00041 
00042 bool TankAICurrentDefenses::parseConfig(XMLNode *node)
00043 {
00044         if (!node->getNamedChild("useparachutes", useParachutes_)) return false;
00045         if (!node->getNamedChild("useshields", useShields_)) return false;
00046         if (!node->getNamedChild("usebatteries", useBatteries_)) return false;
00047         return node->failChildren();    
00048 }
00049 
00050 void TankAICurrentDefenses::selectFirstShield(Tank *tank)
00051 {
00052         if (tank->getShield().getCurrentShield()) return;
00053 
00054         std::list<Accessory *> &shields =
00055                 tank->getAccessories().getAllAccessoriesByType(
00056                         AccessoryPart::AccessoryShield);
00057         if (!shields.empty())
00058         {
00059                 Accessory *shield = shields.front();
00060                 shieldsUpDown(tank, shield->getAccessoryId());
00061         }
00062 }
00063 
00064 void TankAICurrentDefenses::selectFirstParachute(Tank *tank)
00065 {
00066         if (tank->getParachute().getCurrentParachute()) return;
00067 
00068         std::list<Accessory *> &parachutes =
00069                 tank->getAccessories().getAllAccessoriesByType(
00070                         AccessoryPart::AccessoryParachute);
00071         if (!parachutes.empty())
00072         {
00073                 Accessory *parachute = parachutes.front();
00074                 parachutesUpDown(tank, parachute->getAccessoryId());
00075         }
00076 }
00077 
00078 void TankAICurrentDefenses::raiseDefenses(Tank *tank)
00079 {
00080         // Try to enable parachutes (fails if we don't have any)
00081         if (useParachutes_) selectFirstParachute(tank);
00082 
00083         // Try to raise shields (fails if we don't have any)
00084         if (useShields_) selectFirstShield(tank);
00085 }
00086 
00087 void TankAICurrentDefenses::parachutesUpDown(Tank *tank, unsigned int paraId)
00088 {
00089         ComsDefenseMessage defenseMessage(
00090                 tank->getPlayerId(),
00091                 (paraId!=0)?ComsDefenseMessage::eParachutesUp:ComsDefenseMessage::eParachutesDown,
00092                 paraId);
00093 
00094         ServerDefenseHandler::instance()->processDefenseMessage(defenseMessage, tank);
00095 }
00096 
00097 void TankAICurrentDefenses::shieldsUpDown(Tank *tank, unsigned int shieldId)
00098 {
00099         ComsDefenseMessage defenseMessage(
00100                 tank->getPlayerId(),
00101                 (shieldId!=0)?ComsDefenseMessage::eShieldUp:ComsDefenseMessage::eShieldDown,
00102                 shieldId);
00103 
00104         ServerDefenseHandler::instance()->processDefenseMessage(defenseMessage, tank);
00105 }

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