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 <weapons/ShieldRound.h> 00022 #include <common/VectorLib.h> 00023 #include <common/Defines.h> 00024 #include <math.h> 00025 00026 REGISTER_ACCESSORY_SOURCE(ShieldRound); 00027 00028 ShieldRound::ShieldRound() : 00029 glow_(true) 00030 { 00031 } 00032 00033 ShieldRound::~ShieldRound() 00034 { 00035 } 00036 00037 Shield::ShieldType ShieldRound::getShieldType() 00038 { 00039 return ShieldTypeRoundNormal; 00040 } 00041 00042 bool ShieldRound::inShield(FixedVector &offset) 00043 { 00044 if (offset.Magnitude() <= radius_) 00045 { 00046 if (!halfShield_) return true; 00047 00048 FixedVector normal = offset.Normalize(); 00049 FixedVector up(0, 0, 1); 00050 if (normal.dotP(up) > fixed(true, 7000)) 00051 { 00052 return true; 00053 } 00054 } 00055 return false; 00056 } 00057 00058 bool ShieldRound::tankInShield(FixedVector &offset) 00059 { 00060 if (offset.Magnitude() <= radius_) 00061 { 00062 return true; 00063 } 00064 return false; 00065 } 00066 00067 bool ShieldRound::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode) 00068 { 00069 if (!Shield::parseXML(context, accessoryNode)) return false; 00070 00071 // Get the penetration 00072 if (!accessoryNode->getNamedChild("radius", radius_)) return false; 00073 if (radius_ <= 0) return accessoryNode->returnError("ShieldRound radius must be > 0"); 00074 00075 // Get the half size 00076 if (!accessoryNode->getNamedChild("halfshield", halfShield_)) return false; 00077 00078 accessoryNode->getNamedChild("glow", glow_, false); 00079 00080 return true; 00081 }
1.5.3