00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponRepeat.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <engine/ActionController.h>
00024
00025 REGISTER_ACCESSORY_SOURCE(WeaponRepeat);
00026
00027 WeaponRepeat::WeaponRepeat() : delay_(0)
00028 {
00029
00030 }
00031
00032 WeaponRepeat::~WeaponRepeat()
00033 {
00034
00035 }
00036
00037 bool WeaponRepeat::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00038 {
00039 if (!Weapon::parseXML(context, accessoryNode)) return false;
00040
00041
00042 XMLNode *subNode = 0;
00043 if (!accessoryNode->getNamedChild("repeatweapon", subNode)) return false;
00044
00045
00046 AccessoryPart *accessory = context.getAccessoryStore().
00047 createAccessoryPart(context, parent_, subNode);
00048 if (!accessory || accessory->getType() != AccessoryPart::AccessoryWeapon)
00049 {
00050 return subNode->returnError("Failed to find sub weapon, not a weapon");
00051 }
00052 repeatWeapon_ = (Weapon*) accessory;
00053
00054 if (!accessoryNode->getNamedChild("repeat", repeat_)) return false;
00055
00056 accessoryNode->getNamedChild("delay", delay_, false);
00057
00058 return true;
00059 }
00060
00061 void WeaponRepeat::fireWeapon(ScorchedContext &context,
00062 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity)
00063 {
00064 if (delay_.getValue(context) == 0)
00065 {
00066 for (int i=0; i<repeat_; i++)
00067 {
00068 repeatWeapon_->fireWeapon(context, weaponContext, position, velocity);
00069 }
00070 }
00071 else
00072 {
00073 weaponCallback(context, weaponContext, position, velocity, repeat_);
00074 }
00075 }
00076
00077 void WeaponRepeat::weaponCallback(
00078 ScorchedContext &context,
00079 WeaponFireContext &weaponContext, FixedVector &position, FixedVector &velocity,
00080 unsigned int userData)
00081 {
00082 repeatWeapon_->fireWeapon(context, weaponContext, position, velocity);
00083
00084 if (userData > 1)
00085 {
00086 context.getActionController().addAction(
00087 new CallbackWeapon("WeaponRepeat", this, delay_.getValue(context), userData - 1,
00088 weaponContext, position, velocity));
00089 }
00090 }