00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponRedirect.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <engine/ActionController.h>
00024 #include <common/Defines.h>
00025 #include <tank/TankLib.h>
00026 #include <math.h>
00027
00028 REGISTER_ACCESSORY_SOURCE(WeaponRedirect);
00029
00030 WeaponRedirect::WeaponRedirect() :
00031 hredirect_(0), vredirect_(0),
00032 habs_(false), vabs_(false),
00033 nextAction_(0)
00034 {
00035
00036 }
00037
00038 WeaponRedirect::~WeaponRedirect()
00039 {
00040
00041 }
00042
00043 bool WeaponRedirect::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00044 {
00045 if (!Weapon::parseXML(context, accessoryNode)) return false;
00046
00047 if (!accessoryNode->getNamedChild("hredirect", hredirect_)) return false;
00048 if (!accessoryNode->getNamedChild("habs", habs_)) return false;
00049 if (!accessoryNode->getNamedChild("vredirect", vredirect_)) return false;
00050 if (!accessoryNode->getNamedChild("vabs", vabs_)) return false;
00051
00052 XMLNode *subNode = 0;
00053 if (!accessoryNode->getNamedChild("nextaction", subNode)) return false;
00054
00055
00056 AccessoryPart *accessory = context.getAccessoryStore().
00057 createAccessoryPart(context, parent_, subNode);
00058 if (!accessory || accessory->getType() != AccessoryPart::AccessoryWeapon)
00059 {
00060 return subNode->returnError("Failed to find sub weapon, not a weapon");
00061 }
00062 nextAction_ = (Weapon*) accessory;
00063
00064 return true;
00065 }
00066
00067 void WeaponRedirect::fireWeapon(ScorchedContext &context,
00068 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00069 {
00070 fixed currentMag = velocity.Magnitude();
00071 fixed currenth = (atan2x(velocity[1], velocity[0]) / fixed::XPI * 180) - 90;
00072 fixed dist = (velocity[0] * velocity[0] + velocity[1] * velocity[1]).sqrt();
00073 fixed currentv = atan2x(dist, velocity[2]) / fixed::XPI * 180;
00074
00075 if (habs_) currenth = hredirect_.getValue(context);
00076 else currenth += hredirect_.getValue(context);
00077 if (vabs_) currentv = vredirect_.getValue(context);
00078 else currentv += vredirect_.getValue(context);
00079
00080 FixedVector newVelocity = TankLib::getVelocityVector(currenth, fixed(90) - currentv);
00081 newVelocity.StoreNormalize();
00082 newVelocity *= currentMag;
00083
00084 nextAction_->fireWeapon(context, weaponContext, position, newVelocity);
00085
00086 }
00087