00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <weapons/WeaponScatterPosition.h>
00022 #include <weapons/AccessoryStore.h>
00023 #include <engine/ActionController.h>
00024 #include <landscapemap/LandscapeMaps.h>
00025 #include <landscapedef/LandscapeTex.h>
00026 #include <common/Defines.h>
00027 #include <math.h>
00028
00029 REGISTER_ACCESSORY_SOURCE(WeaponScatterPosition);
00030
00031 WeaponScatterPosition::WeaponScatterPosition()
00032 {
00033
00034 }
00035
00036 WeaponScatterPosition::~WeaponScatterPosition()
00037 {
00038
00039 }
00040
00041 bool WeaponScatterPosition::parseXML(AccessoryCreateContext &context, XMLNode *accessoryNode)
00042 {
00043 if (!Weapon::parseXML(context, accessoryNode)) return false;
00044
00045
00046 XMLNode *subNode = 0;
00047 if (!accessoryNode->getNamedChild("aimedweapon", subNode)) return false;
00048
00049
00050 AccessoryPart *accessory = context.getAccessoryStore().
00051 createAccessoryPart(context, parent_, subNode);
00052 if (!accessory || accessory->getType() != AccessoryPart::AccessoryWeapon)
00053 {
00054 return subNode->returnError("Failed to find sub weapon, not a weapon");
00055 }
00056 aimedWeapon_ = (Weapon*) accessory;
00057
00058 if (!accessoryNode->getNamedChild("landonly", landonly_)) return false;
00059 if (!accessoryNode->getNamedChild("landheight", landheight_)) return false;
00060 if (!accessoryNode->getNamedChild("scatterpercentage", scatterpercentage_)) return false;
00061
00062 return true;
00063 }
00064
00065 void WeaponScatterPosition::fireWeapon(ScorchedContext &context,
00066 WeaponFireContext &weaponContext, FixedVector &p, FixedVector &velocity)
00067 {
00068
00069 fixed allowedHeight = 0;
00070 LandscapeTex &tex = *context.getLandscapeMaps().getDefinitions().getTex();
00071 if (tex.border->getType() == LandscapeTexType::eWater)
00072 {
00073 LandscapeTexBorderWater *water =
00074 (LandscapeTexBorderWater *) tex.border;
00075
00076 allowedHeight = water->height;
00077 }
00078
00079 fixed scatterpercentage = scatterpercentage_.getValue(context);
00080
00081 fixed arenaWidth = fixed(context.getLandscapeMaps().getGroundMaps().getArenaWidth());
00082 fixed arenaHeight = fixed(context.getLandscapeMaps().getGroundMaps().getArenaHeight());
00083 fixed scatterWidth = arenaWidth * scatterpercentage / 100;
00084 fixed scatterHeight = arenaHeight * scatterpercentage / 100;
00085
00086 FixedVector pos;
00087 RandomGenerator &random = context.getActionController().getRandom();
00088 bool ok = false;
00089 while (!ok)
00090 {
00091 ok = true;
00092
00093 pos[0] = p[0] + (random.getRandFixed() * scatterWidth) - (scatterWidth / 2);
00094 pos[1] = p[1] + (random.getRandFixed() * scatterHeight) - (scatterHeight / 2);
00095 pos[2] = p[2];
00096 if (landheight_)
00097 {
00098 pos[2] = context.getLandscapeMaps().getGroundMaps().getInterpHeight(
00099 pos[0], pos[1]);
00100 }
00101
00102 if (landonly_)
00103 {
00104 if (pos[2] < allowedHeight)
00105 {
00106 ok = false;
00107 allowedHeight -= fixed(true, 100);
00108 }
00109 }
00110 }
00111
00112 aimedWeapon_->fireWeapon(context, weaponContext, pos, velocity);
00113
00114 }
00115