00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
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 *> ¶chutes =
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
00081 if (useParachutes_) selectFirstParachute(tank);
00082
00083
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 }