From: hellcatv <hel...@us...> - 2005-09-29 09:06:38
|
Update of /cvsroot/vegastrike/vegastrike/src/cmd In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6213/cmd Modified Files: beam.cpp beam.h beam_generic.cpp beam_server.cpp bolt.cpp bolt.h bolt_generic.cpp collide.cpp collide_map.cpp collide_map.h key_mutable_set.h mount.cpp unit_collide.cpp unit_generic.cpp unit_generic.h unit_util_generic.cpp Log Message: awesome new collision system with old collision code still left in there Index: beam.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/beam.cpp,v retrieving revision 1.58 retrieving revision 1.59 diff -C2 -r1.58 -r1.59 *** beam.cpp 6 Sep 2005 12:01:38 -0000 1.58 --- beam.cpp 29 Sep 2005 09:06:28 -0000 1.59 *************** *** 25,29 **** beamdrawqueue.push_back (vector<DrawContext>()); } ! Init(trans,clne,own,firer); impact=UNSTABLE; } --- 25,29 ---- beamdrawqueue.push_back (vector<DrawContext>()); } ! Init(trans,clne,own); impact=UNSTABLE; } Index: beam.h =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/beam.h,v retrieving revision 1.20 retrieving revision 1.21 diff -C2 -r1.20 -r1.21 *** beam.h 6 Sep 2005 12:01:38 -0000 1.20 --- beam.h 29 Sep 2005 09:06:28 -0000 1.21 *************** *** 46,60 **** bool listen_to_owner; void * owner;//may be a dead pointer...never dereferenced - float owner_rsize;//useful - int owner_faction;//also useful QVector center;//in world coordinates as of last physics frame... Vector direction; void RecalculateVertices(); ! void CollideHuge(const LineCollide &, Unit * targetToCollideWith); public: void ListenToOwner(bool listen){listen_to_owner=listen;} Beam (const Transformation & trans, const weapon_info & clne, void * own, Unit * firer, int sound); ! void Init (const Transformation & trans, const weapon_info & clne, void * own, Unit * firer); ~Beam(); void RemoveFromSystem(bool eradicate); --- 46,58 ---- bool listen_to_owner; void * owner;//may be a dead pointer...never dereferenced QVector center;//in world coordinates as of last physics frame... Vector direction; void RecalculateVertices(); ! void CollideHuge(const LineCollide &, Unit * targetToCollideWith, Unit * firer, Unit * superunit); public: void ListenToOwner(bool listen){listen_to_owner=listen;} Beam (const Transformation & trans, const weapon_info & clne, void * own, Unit * firer, int sound); ! void Init (const Transformation & trans, const weapon_info & clne, void * own); ~Beam(); void RemoveFromSystem(bool eradicate); *************** *** 63,72 **** void SetPosition (const QVector &); void SetOrientation(const Vector &p, const Vector &q, const Vector &r); ! void UpdatePhysics(const Transformation & , const Matrix & , class Unit * target, float trackingcone, Unit * targetToCollideWith/*prevent AI friendly fire--speed up app*/, float HeatSink); void Draw(const Transformation & , const Matrix & ,class Unit * target, float trackingcone); void Destabilize () {impact=UNSTABLE;} bool Dissolved () {return curthick==0;} bool Ready () {return curthick==0&&refiretime>refire;} ! bool Collide (class Unit * target); static void ProcessDrawQueue(); --- 61,70 ---- void SetPosition (const QVector &); void SetOrientation(const Vector &p, const Vector &q, const Vector &r); ! void UpdatePhysics(const Transformation & , const Matrix & , class Unit * target, float trackingcone, Unit * targetToCollideWith/*prevent AI friendly fire--speed up app*/, float HeatSink, Unit* firer, Unit * superunit); void Draw(const Transformation & , const Matrix & ,class Unit * target, float trackingcone); void Destabilize () {impact=UNSTABLE;} bool Dissolved () {return curthick==0;} bool Ready () {return curthick==0&&refiretime>refire;} ! bool Collide (class Unit * target, Unit * firer, Unit * superunit/*for cargo*/); static void ProcessDrawQueue(); Index: beam_generic.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/beam_generic.cpp,v retrieving revision 1.22 retrieving revision 1.23 diff -C2 -r1.22 -r1.23 *** beam_generic.cpp 6 Sep 2005 12:01:38 -0000 1.22 --- beam_generic.cpp 29 Sep 2005 09:06:28 -0000 1.23 *************** *** 40,44 **** extern Unit* getTopLevelOwner(); ! void Beam::Init (const Transformation & trans, const weapon_info &cln , void * own, Unit * firer) { //Matrix m; CollideInfo.object.b = NULL; --- 40,44 ---- extern Unit* getTopLevelOwner(); ! void Beam::Init (const Transformation & trans, const weapon_info &cln , void * own) { //Matrix m; CollideInfo.object.b = NULL; *************** *** 67,72 **** impact= ALIVE; owner = own; - owner_rsize = firer->rSize(); - owner_faction = firer->faction; numframes=0; --- 67,70 ---- *************** *** 256,260 **** #endif } ! void Beam::UpdatePhysics(const Transformation &trans, const Matrix &m, Unit * targ, float tracking_cone, Unit * targetToCollideWith, float HeatSink) { curlength += SIMULATION_ATOM*speed; if (curlength<0) { --- 254,258 ---- #endif } ! void Beam::UpdatePhysics(const Transformation &trans, const Matrix &m, Unit * targ, float tracking_cone, Unit * targetToCollideWith, float HeatSink, Unit * firer, Unit * superunit) { curlength += SIMULATION_ATOM*speed; if (curlength<0) { *************** *** 299,303 **** } else { ! CollideHuge(CollideInfo,listen_to_owner?targetToCollideWith:NULL); if (!(curlength<range&&curlength>0)) {//if curlength just happens to be nan --- 297,301 ---- } else { ! CollideHuge(CollideInfo,listen_to_owner?targetToCollideWith:NULL,firer,superunit); if (!(curlength<range&&curlength>0)) {//if curlength just happens to be nan *************** *** 331,335 **** } extern Cargo * GetMasterPartList (const char *); ! bool Beam::Collide (Unit * target) { if (this==NULL||target==NULL){ VSFileSystem::vs_fprintf (stderr,"Recovering from nonfatal beam error when beam inactive\n"); --- 329,333 ---- } extern Cargo * GetMasterPartList (const char *); ! bool Beam::Collide (Unit * target, Unit * firer, Unit * superunit) { if (this==NULL||target==NULL){ VSFileSystem::vs_fprintf (stderr,"Recovering from nonfatal beam error when beam inactive\n"); *************** *** 409,413 **** if ((appldam<0&&phasdam>0)||(appldam>0&&phasdam<0)) { bool fp = o_fp, fi = o_fi; ! if (target->faction == owner_faction) fp = f_fp, fi = f_fi; else if (target->faction == upgradesfaction) fp = u_fp, fi = u_fi; else if (target->faction == cargofaction) --- 407,411 ---- if ((appldam<0&&phasdam>0)||(appldam>0&&phasdam<0)) { bool fp = o_fp, fi = o_fi; ! if (target->faction == superunit->faction) fp = f_fp, fi = f_fi; else if (target->faction == upgradesfaction) fp = u_fp, fi = u_fi; else if (target->faction == cargofaction) *************** *** 417,421 **** if (fp||target->isTractorable(Unit::tractorPush)) { float lighting=o_lighting; ! if (target->faction == owner_faction) lighting = f_lighting; else if (target->faction == upgradesfaction) lighting = u_lighting; else if (target->faction == cargofaction) --- 415,419 ---- if (fp||target->isTractorable(Unit::tractorPush)) { float lighting=o_lighting; ! if (target->faction == superunit->faction) lighting = f_lighting; else if (target->faction == upgradesfaction) lighting = u_lighting; else if (target->faction == cargofaction) *************** *** 425,438 **** float ors_m=o_ors_m,trs_m=o_trs_m,ofs=o_o; ! if (target->faction == owner_faction) ors_m = f_ors_m, trs_m = f_trs_m, ofs = f_o; else if (target->faction == upgradesfaction) ors_m = u_ors_m, trs_m = u_trs_m, ofs = u_o; else if (target->faction == cargofaction) ors_m = c_ors_m, trs_m = c_trs_m, ofs = c_o; ! if ((fi||target->isTractorable(Unit::tractorIn))&&((center-target->Position()).Magnitude()<(ors_m*owner_rsize+trs_m*target->rSize()+ofs))) { un_iter ui= _Universe->activeStarSystem()->getUnitList().createIterator(); Unit *un; ! for (;(un=*ui)!=NULL;++ui) { ! if (((void *)un)==owner) { if (target->faction==upgradesfaction||owner_rsize*nbig>target->rSize()) { //we have our man! --- 423,437 ---- float ors_m=o_ors_m,trs_m=o_trs_m,ofs=o_o; ! if (target->faction == superunit->faction) ors_m = f_ors_m, trs_m = f_trs_m, ofs = f_o; else if (target->faction == upgradesfaction) ors_m = u_ors_m, trs_m = u_trs_m, ofs = u_o; else if (target->faction == cargofaction) ors_m = c_ors_m, trs_m = c_trs_m, ofs = c_o; ! float owner_rsize=superunit->rSize(); if ((fi||target->isTractorable(Unit::tractorIn))&&((center-target->Position()).Magnitude()<(ors_m*owner_rsize+trs_m*target->rSize()+ofs))) { un_iter ui= _Universe->activeStarSystem()->getUnitList().createIterator(); Unit *un; ! { ! { ! if (target->faction==upgradesfaction||owner_rsize*nbig>target->rSize()) { //we have our man! Index: beam_server.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/beam_server.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** beam_server.cpp 6 Sep 2005 12:01:38 -0000 1.5 --- beam_server.cpp 29 Sep 2005 09:06:28 -0000 1.6 *************** *** 10,14 **** listen_to_owner=false;//warning this line of code is also present in beam.cpp change one, change ALL ! Init(trans,clne,own,self); impact=UNSTABLE; } --- 10,14 ---- listen_to_owner=false;//warning this line of code is also present in beam.cpp change one, change ALL ! Init(trans,clne,own); impact=UNSTABLE; } Index: bolt.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/bolt.cpp,v retrieving revision 1.48 retrieving revision 1.49 diff -C2 -r1.48 -r1.49 *** bolt.cpp 29 Aug 2005 18:24:39 -0000 1.48 --- bolt.cpp 29 Sep 2005 09:06:28 -0000 1.49 *************** *** 77,81 **** curdist = 0; CopyMatrix (drawmat,orientationpos); ! if (typ->type==weapon_info::BOLT) { ScaleMatrix (drawmat,Vector (typ->Radius,typ->Radius,typ->Length)); --- 77,81 ---- curdist = 0; CopyMatrix (drawmat,orientationpos); ! Vector vel=shipspeed+orientationpos.getR()*typ->Speed; if (typ->type==weapon_info::BOLT) { ScaleMatrix (drawmat,Vector (typ->Radius,typ->Radius,typ->Length)); *************** *** 89,92 **** --- 89,93 ---- q->cachedecals.push_back (blargh); } + this->location=_Universe->activeStarSystem()->collidemap->insert(Collidable(Bolt::BoltIndex(q->bolts[decal].size(),decal,false).bolt_index,(shipspeed+orientationpos.getR()*typ->Speed).Magnitude()*.5,cur_position+vel*SIMULATION_ATOM*.5)); q->bolts[decal].push_back (*this); } else { *************** *** 105,108 **** --- 106,110 ---- q->balls.push_back (vector <Bolt> ()); } + this->location=_Universe->activeStarSystem()->collidemap->insert(Collidable(Bolt::BoltIndex(q->balls[decal].size(),decal,true).bolt_index,(shipspeed+orientationpos.getR()*typ->Speed).Magnitude()*.5,cur_position+vel*SIMULATION_ATOM*.5)); q->balls[decal].push_back (*this); } *************** *** 190,195 **** GFXColor4f(1,1,1,1); } - extern void BoltDestroyGeneric(Bolt * whichbolt, int index, int decal, bool isBall); void Bolt::Destroy (int index) { VSDESTRUCT2 --- 192,197 ---- GFXColor4f(1,1,1,1); } + extern void BoltDestroyGeneric(Bolt * whichbolt, int index, int decal, bool isBall); void Bolt::Destroy (int index) { VSDESTRUCT2 Index: bolt.h =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/bolt.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -r1.14 -r1.15 *** bolt.h 24 Sep 2005 21:38:28 -0000 1.14 --- bolt.h 29 Sep 2005 09:06:28 -0000 1.15 *************** *** 6,12 **** #include "gfx/matrix.h" #include "gfx/quaternion.h" ! class Animation; class Unit; class Bolt { private: --- 6,13 ---- #include "gfx/matrix.h" #include "gfx/quaternion.h" ! #include "collide_map.h" class Animation; class Unit; + class StarSystem; class Bolt { private: *************** *** 19,24 **** float curdist; int decal;//which image it uses - bool Collide (Unit * target); public: bool operator == (const Bolt & b) const{ --- 20,30 ---- float curdist; int decal;//which image it uses public: + CollideMap::iterator location; + + bool Collide (Unit * target); + static bool CollideAnon (Collidable::CollideRef bolt_name, Unit* target); + static Bolt * BoltFromIndex(StarSystem* ss,Collidable::CollideRef bolt_name); + static Collidable::CollideRef BoltIndex(int index, int decal, bool isBall); bool operator == (const Bolt & b) const{ *************** *** 33,36 **** --- 39,43 ---- bool Update(int index); bool Collide(int index); + void noop()const{} }; Index: bolt_generic.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/bolt_generic.cpp,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -r1.5 -r1.6 *** bolt_generic.cpp 6 Sep 2005 12:01:38 -0000 1.5 --- bolt_generic.cpp 29 Sep 2005 09:06:28 -0000 1.6 *************** *** 14,18 **** extern double interpolation_blend_factor; ! bool Bolt::Update (int index) { const weapon_info *type=this->type; --- 14,18 ---- extern double interpolation_blend_factor; ! bool Bolt::Update (int index) { const weapon_info *type=this->type; *************** *** 25,28 **** --- 25,31 ---- return false; } + Collidable updated(**location); + updated.SetPosition(.5*(prev_position+cur_position)); + _Universe->activeStarSystem()->collidemap->changeKey(location,updated); return true; } *************** *** 33,36 **** --- 36,40 ---- for (vector <vector <Bolt> >::iterator i= tmp->begin();i!=tmp->end();i++) { for (int j=0;j<i->size();j++) { + int size=i->size(); Bolt * b=&((*i)[j]); ///warning these require active star system to be set appropriately *************** *** 90,94 **** --- 94,124 ---- return false; } + size_t nondecal_index(Collidable::CollideRef b) { + return b.bolt_index>>8; + } + Bolt * Bolt::BoltFromIndex(StarSystem * ss, Collidable::CollideRef b) { + size_t ind =nondecal_index(b); + if (b.bolt_index&128) { + return &ss->bolts->balls[b.bolt_index&0x7f][ind]; + }else{ + return &ss->bolts->bolts[b.bolt_index&0x7f][ind]; + } + } + bool Bolt::CollideAnon(Collidable::CollideRef b, Unit *un) { + Bolt * tmp=BoltFromIndex(_Universe->activeStarSystem(),b); + if (tmp->Collide(un)) { + tmp->Destroy(nondecal_index(b)); + } + } + union Collidable::CollideRef; + Collidable::CollideRef Bolt::BoltIndex(int index, int decal, bool isBall) { + Collidable::CollideRef temp; + temp.bolt_index=index; + temp.bolt_index<<=8; + temp.bolt_index|=decal; + temp.bolt_index|=isBall?128:0; + return temp; + } void BoltDestroyGeneric (Bolt * whichbolt, int index, int decal, bool isBall) { *************** *** 102,111 **** } vector<Bolt> * vec=&(*target)[decal]; ! if (&(*vec)[index]==whichbolt) { ! (*vec)[index]=vec->back();//just a memcopy, yo vec->pop_back();//pop that back up }else { ! VSFileSystem::vs_fprintf (stderr,"Bolt Fault Nouveau! Not found in draw queue! Attempting to recover\n"); vector <Bolt>::iterator tmp= std::find ((*target)[decal].begin(),(*target)[decal].end(),*whichbolt); if (tmp!=(*target)[decal].end()) { --- 132,148 ---- } vector<Bolt> * vec=&(*target)[decal]; ! int fsize=vec->size(); if (&(*vec)[index]==whichbolt) { ! int tsize=vec->size(); ! (*vec->back().location)->ref=(*(*vec)[index].location)->ref; ! assert (index<tsize); ! _Universe->activeStarSystem()->collidemap->erase((*vec)[index].location); ! (*vec)[index]=vec->back();//just a memcopy, yo vec->pop_back();//pop that back up }else { ! VSFileSystem::vs_fprintf (stderr,"Bolt Fault Nouveau! Not found in draw queue! No Chance to recover\n"); ! fflush(stderr); ! assert(0); ! /* vector <Bolt>::iterator tmp= std::find ((*target)[decal].begin(),(*target)[decal].end(),*whichbolt); if (tmp!=(*target)[decal].end()) { *************** *** 130,133 **** --- 167,171 ---- } } + */ } } Index: collide.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/collide.cpp,v retrieving revision 1.16 retrieving revision 1.17 diff -C2 -r1.16 -r1.17 *** collide.cpp 18 Aug 2005 18:37:58 -0000 1.16 --- collide.cpp 29 Sep 2005 09:06:28 -0000 1.17 *************** *** 122,144 **** } bool Bolt::Collide (int index) { ! UnitCollection *candidates[2]; ! bool use_huge_list=usehuge_table(); ! _Universe->activeStarSystem()->collidetable->c.Get (cur_position,candidates,use_huge_list); ! LineCollide minimaxi;//might as well have this so we can utilize common function ! minimaxi.Mini= ( prev_position.Min (cur_position)); ! minimaxi.Maxi= ( prev_position.Max (cur_position)); ! for (unsigned int j=0;j<2;j++) { ! Unit * un; ! for (un_iter i=candidates[j]->createIterator();(un=*i)!=NULL;++i) { ! ! if (lcwithin (minimaxi,(un)->GetCollideInfo ())) { ! if (this->Collide (un)) { ! if (j==0&&use_huge_list) { ! _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(un); ! } ! Destroy(index); ! return true; ! } ! } } --- 122,152 ---- } bool Bolt::Collide (int index) { ! static bool New_Collide_System=XMLSupport::parse_bool(vs_config->getVariable("physics","new_collisions","true")); ! if (New_Collide_System) { ! Collidable updated(**location); ! updated.SetPosition(.5*(prev_position+cur_position)); ! return _Universe->activeStarSystem()->collidemap->CheckCollisions(this,updated); ! }else { ! ! UnitCollection *candidates[2]; ! bool use_huge_list=usehuge_table(); ! _Universe->activeStarSystem()->collidetable->c.Get (cur_position,candidates,use_huge_list); ! LineCollide minimaxi;//might as well have this so we can utilize common function ! minimaxi.Mini= ( prev_position.Min (cur_position)); ! minimaxi.Maxi= ( prev_position.Max (cur_position)); ! for (unsigned int j=0;j<2;j++) { ! Unit * un; ! for (un_iter i=candidates[j]->createIterator();(un=*i)!=NULL;++i) { ! ! if (lcwithin (minimaxi,(un)->GetCollideInfo ())) { ! if (this->Collide (un)) { ! if (j==0&&use_huge_list) { ! _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(un); ! } ! Destroy(index); ! return true; ! } ! ! } } } *************** *** 146,151 **** return false; } ! ! void Beam::CollideHuge (const LineCollide & lc, Unit * targetToCollideWith) { UnitCollection *colQ [tablehuge+1]; bool use_huge_list = usehuge_table(); --- 154,215 ---- return false; } ! static bool beamCheckCollision (QVector pos, float len, const Collidable & un) { ! ! return (un.GetPosition()-pos).MagnitudeSquared()<=len*len+2*len*un.radius+un.radius*un.radius; ! } ! void Beam::CollideHuge (const LineCollide & lc, Unit * targetToCollideWith, Unit * firer, Unit * superunit) { ! static bool newUnitCollisions=XMLSupport::parse_bool(vs_config->getVariable("physics","new_collisions","true")); ! if (newUnitCollisions) { ! QVector x0=center; ! QVector v=direction*curlength; ! if (curlength) { ! double t = v.Dot(x0)/v.Dot(v);//find where derivative of radius is zero ! float r0= x0.MagnitudeSquared(); ! float r1 = (x0+v.Scale((t<0||t>1)?1.0f:t)).MagnitudeSquared(); ! float r2 = (x0+v.Scale(1.0f)).MagnitudeSquared(); ! float minsqr=r0<r1?(r0<r2?r0:r2):r1; ! float maxsqr=r0<r1?(r1<r2?r2:r1):r0; ! maxsqr+=(maxsqr-(*superunit->location)->GetMagnitudeSquared())+2*curlength*curlength;//double damage, yo ! minsqr+=(minsqr-(*superunit->location)->GetMagnitudeSquared())-2*curlength*curlength; ! // (a+2*b)^2-(a+b)^2 = 3b^2+2ab = 2b^2+(a+b)^2-a^2 ! CollideMap * cm=_Universe->activeStarSystem()->collidemap; ! if (superunit->location!=cm->begin()&& ! minsqr<(*superunit->location)->GetMagnitudeSquared()){ ! //less traversal ! CollideMap::iterator tless=superunit->location; ! --tless; ! while((*tless)->GetMagnitudeSquared()>=minsqr) { ! CollideMap::iterator curcheck=tless; ! bool breakit=false; ! if (tless!=cm->begin()) { ! --tless; ! }else { ! breakit=true; ! } ! if ((*curcheck)->radius>0) { ! if (beamCheckCollision(center,curlength,(**curcheck))) { ! this->Collide((**curcheck).ref.unit,firer,superunit); ! } ! } ! if (breakit) ! break; ! ! } ! } ! if (maxsqr>(*superunit->location)->GetMagnitudeSquared()) { ! //greater traversal ! CollideMap::iterator tmore=superunit->location; ! ++tmore; ! while (tmore!=cm->end()&&(*tmore)->GetMagnitudeSquared()<=maxsqr){ ! if ((*tmore)->radius>0) { ! Unit *un=(*tmore)->ref.unit; ! if (beamCheckCollision(center,curlength,**tmore++)) { ! this->Collide(un,firer,superunit); ! } ! }else ++tmore; ! } ! } ! } ! }else { UnitCollection *colQ [tablehuge+1]; bool use_huge_list = usehuge_table(); *************** *** 157,161 **** if (lcwithin(lc,(un)->GetCollideInfo())) { ! if (this->Collide (un)) { if (j==0&&use_huge_list) { _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(un); --- 221,225 ---- if (lcwithin(lc,(un)->GetCollideInfo())) { ! if (this->Collide (un,firer,superunit)) { if (j==0&&use_huge_list) { _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(un); *************** *** 167,171 **** }else { if (targetToCollideWith&&(!use_huge_list)) { ! this->Collide(targetToCollideWith); }else { un_iter i=_Universe->activeStarSystem()->getUnitList().createIterator(); --- 231,235 ---- }else { if (targetToCollideWith&&(!use_huge_list)) { ! this->Collide(targetToCollideWith,firer,superunit); }else { un_iter i=_Universe->activeStarSystem()->getUnitList().createIterator(); *************** *** 173,177 **** for (;(un=*i)!=NULL;++i) { if (lcwithin (lc,(un)->GetCollideInfo())) { ! this->Collide(un); if ((un!=targetToCollideWith)&&targetToCollideWith!=NULL) { ListenToOwner(false); --- 237,241 ---- for (;(un=*i)!=NULL;++i) { if (lcwithin (lc,(un)->GetCollideInfo())) { ! this->Collide(un,firer,superunit); if ((un!=targetToCollideWith)&&targetToCollideWith!=NULL) { ListenToOwner(false); *************** *** 181,184 **** --- 245,249 ---- } } + } } Index: collide_map.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/collide_map.cpp,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** collide_map.cpp 25 Sep 2005 10:16:20 -0000 1.2 --- collide_map.cpp 29 Sep 2005 09:06:28 -0000 1.3 *************** *** 0 **** --- 1,136 ---- + #include "collide_map.h" + #include "unit_generic.h" + #include "bolt.h" + CollideMap null_collide_map; + + Collidable::Collidable(Unit *un):radius(un->rSize()){ + this->SetPosition(un->LocalPosition()); + ref.unit=un; + } + extern size_t nondecal_index(Collidable::CollideRef b); + template <class T> class CollideChecker + {public:static bool CheckCollisions(CollideMap* cm, T* un, const Collidable& collider){ + CollideMap::iterator tless,tmore; + float sortedloc=sqrt(collider.GetMagnitudeSquared()); + float rad=collider.radius; + float maxlook=sortedloc+2.0625*fabs(rad); + float minlook=sortedloc-2.0625*fabs(rad); + float maxsqr=maxlook*maxlook; + float minsqr=minlook*minlook; + if (!isNew(cm,un)) { + cm->changeKey(un->location,collider,tless,tmore); + }else { + tless=tmore=un->location; + if (tless!=cm->begin()) + --tless; + ++tmore; + } + if (un->location!=cm->begin()) { + while((*tless)->GetMagnitudeSquared()>=minsqr) { + bool boltSpecimen=(*tless)->radius<0; + Collidable::CollideRef ref=(*tless)->ref; + if (tless==cm->begin()) { + if (boltSpecimen) { + if (CheckCollision(un,collider,ref,**tless)){ + if (endAfterCollide(un)) { + return true; + }else break; + }else break; + + }else { + if (CheckCollision(un,collider,ref.unit,**tless)){ + if (endAfterCollide(un)){ + return true; + }else break; + }else break; + } + }else { + if (boltSpecimen) { + if (CheckCollision(un,collider,ref,**tless--)) { + if (endAfterCollide(un)) + return true; + } + }else { + if (CheckCollision(un,collider,ref.unit,**tless--)){ + if (endAfterCollide(un)) + return true; + } + } + } + + + } + } + while (tmore!=cm->end()&&(*tmore)->GetMagnitudeSquared()<=maxsqr){ + bool boltSpecimen=(*tmore)->radius<0; + Collidable::CollideRef ref=(*tmore)->ref; + if (boltSpecimen) { + if (CheckCollision(un,collider,ref,**tmore++)) + return true; + }else { + if (CheckCollision(un,collider,ref.unit,**tmore++)) + return true; + } + } + + return false; + } + static bool endAfterCollide(Bolt * b) { + return true; + } + static bool endAfterCollide(Unit * un) { + if (un->location==null_collide_map.begin()) + return true; + return false; + } + static bool isNew(CollideMap * cm, Unit * b) { + if (b->location==null_collide_map.begin()) { + b->location=cm->insert(Collidable(b)); + return true; + } + return false; + } + static bool isNew(CollideMap *cm, Bolt * b) { + return false; + } + static bool Apart(const Collidable &a, const Collidable &b) { + return (a.GetPosition()-b.GetPosition()).MagnitudeSquared()>a.radius*a.radius+fabs(a.radius*b.radius)*2+b.radius*b.radius; + } + static bool CheckCollision(Unit* a, const Collidable& aiter, Unit * b, const Collidable& biter) { + if (!Apart(aiter,biter)) + return a->Collide(b); + return false; + } + static bool CheckCollision(Bolt* a, const Collidable &aiter, Unit * b, const Collidable& biter) { + if (!Apart(aiter,biter)) { + if (a->Collide(b)) { + a->Destroy(nondecal_index(aiter.ref)); + return true; + } + } + return false; + } + static bool CheckCollision (Bolt * a, const Collidable &aiter, Collidable::CollideRef b, const Collidable &biter) { + return false; + } + static bool CheckCollision (Unit * un, const Collidable &aiter, Collidable::CollideRef b, const Collidable &biter) { + if (!Apart(aiter,biter)) { + return Bolt::CollideAnon(b,un); + } + return false; + } + }; + + + bool CollideMap::CheckCollisions (Bolt * bol, const Collidable &updated) { + return CollideChecker<Bolt>::CheckCollisions(this,bol, updated); + } + bool CollideMap::CheckCollisions (Unit * un, const Collidable &updated) { + //need to check beams + if (un->activeStarSystem==NULL) { + un->activeStarSystem = _Universe->activeStarSystem(); + } else { + assert (un->activeStarSystem==_Universe->activeStarSystem()); + } + return CollideChecker<Unit>::CheckCollisions(this,un, updated); + } Index: collide_map.h =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/collide_map.h,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -r1.2 -r1.3 *** collide_map.h 25 Sep 2005 10:08:57 -0000 1.2 --- collide_map.h 29 Sep 2005 09:06:28 -0000 1.3 *************** *** 1,2 **** --- 1,4 ---- + #ifndef _COLLIDE_MAP_H_ + #define _COLLIDE_MAP_H_ #include "key_mutable_set.h" #include "vegastrike.h" *************** *** 5,11 **** class Bolt; class Collidable{ ! QVector pos; public: float radius;//radius == 0, bolt radius <0 beam, radius >0 unit union CollideRef{ Unit * unit; --- 7,15 ---- class Bolt; class Collidable{ ! float key; ! QVector position; public: float radius;//radius == 0, bolt radius <0 beam, radius >0 unit + union CollideRef{ Unit * unit; *************** *** 13,33 **** }ref; QVector GetPosition() const{ ! return pos; } void SetPosition(const QVector &bpos) { //in case we want to drop in an xtra radius parameter when we get performance testing ! this->pos=bpos; } bool operator <(const Collidable &other) const { ! return pos.MagnitudeSquared()<other.pos.MagnitudeSquared(); } Collidable(Unit * un); Collidable(unsigned int bolt_index, float speed, const QVector &p){ ref.bolt_index=bolt_index; ! radius=speed*SIMULATION_ATOM; ! this->pos=p; } }; class CollideMap:public KeyMutableSet<Collidable> { //Check collisions takes an item to check collisions with, and returns whether that item collided with a Unit only bool CheckCollisions(Bolt * bol, const Collidable & updated); --- 17,40 ---- }ref; QVector GetPosition() const{ ! return position; } void SetPosition(const QVector &bpos) { //in case we want to drop in an xtra radius parameter when we get performance testing ! this->position=bpos; ! key=bpos.MagnitudeSquared(); } + float GetMagnitudeSquared()const {return key;} bool operator <(const Collidable &other) const { ! return key<other.key; } Collidable(Unit * un); Collidable(unsigned int bolt_index, float speed, const QVector &p){ ref.bolt_index=bolt_index; ! radius=-speed*SIMULATION_ATOM; ! this->SetPosition(p); } }; class CollideMap:public KeyMutableSet<Collidable> { + public: //Check collisions takes an item to check collisions with, and returns whether that item collided with a Unit only bool CheckCollisions(Bolt * bol, const Collidable & updated); *************** *** 35,36 **** --- 42,44 ---- }; extern CollideMap null_collide_map; + #endif Index: key_mutable_set.h =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/key_mutable_set.h,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -r1.1 -r1.2 *** key_mutable_set.h 25 Sep 2005 09:10:05 -0000 1.1 --- key_mutable_set.h 29 Sep 2005 09:06:28 -0000 1.2 *************** *** 1,2 **** --- 1,4 ---- + #ifndef _KEY_MUTABLE_SET_H_ + #define _KEY_MUTABLE_SET_H_ #include <set> #include <assert.h> *************** *** 34,38 **** void changeKey (typename SUPER::iterator &iter, const T & newKey, typename SUPER::iterator &templess, typename SUPER::iterator &rettempmore) { MutableShell<T> newKeyShell(newKey); ! templess=tempmore=iter; ++rettempmore; typename SUPER::iterator tempmore=rettempmore; --- 36,40 ---- void changeKey (typename SUPER::iterator &iter, const T & newKey, typename SUPER::iterator &templess, typename SUPER::iterator &rettempmore) { MutableShell<T> newKeyShell(newKey); ! templess=rettempmore=iter; ++rettempmore; typename SUPER::iterator tempmore=rettempmore; *************** *** 51,55 **** (*iter).get()=newKey; } ! return iter; } --- 53,57 ---- (*iter).get()=newKey; } ! //return iter; } *************** *** 60,61 **** --- 62,64 ---- } }; + #endif Index: mount.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/mount.cpp,v retrieving revision 1.51 retrieving revision 1.52 diff -C2 -r1.51 -r1.52 *** mount.cpp 6 Sep 2005 12:01:38 -0000 1.51 --- mount.cpp 29 Sep 2005 09:06:28 -0000 1.52 *************** *** 222,226 **** case weapon_info::BEAM: if (ref.gun) ! ref.gun->Init(Transformation(orient,pos.Cast()),*type,owner,caller); break; case weapon_info::BOLT: --- 222,226 ---- case weapon_info::BEAM: if (ref.gun) ! ref.gun->Init(Transformation(orient,pos.Cast()),*type,owner); break; case weapon_info::BOLT: Index: unit_collide.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/unit_collide.cpp,v retrieving revision 1.98 retrieving revision 1.99 diff -C2 -r1.98 -r1.99 *** unit_collide.cpp 16 Sep 2005 09:58:32 -0000 1.98 --- unit_collide.cpp 29 Sep 2005 09:06:28 -0000 1.99 *************** *** 16,20 **** #include "configxml.h" #include "collide.h" ! void Unit::RemoveFromSystem() { #define UNSAFE_COLLIDE_RELEASE --- 16,22 ---- #include "configxml.h" #include "collide.h" ! static bool operator == (const Collidable &a,const Collidable &b) { ! return memcmp(&a,&b,sizeof(Collidable))==0; ! } void Unit::RemoveFromSystem() { #define UNSAFE_COLLIDE_RELEASE *************** *** 25,29 **** --- 27,95 ---- } #endif + /* + Collidable test1(0,0,QVector(0,0,0)),test2(0,0,QVector(0,0,0)); + QVector tpos; + tpos.i=100; + tpos.j=1000; + tpos.k=1327.405240803957; + test1.SetPosition(tpos); + test1.radius=13.5689259; + test1.ref.bolt_index=189160920; + test2=test1; + double a=(test1).GetPosition().MagnitudeSquared(); + double b=(test2).GetPosition().MagnitudeSquared(); + + printf ("(%f %f %f) and (%f %f %f) %f < %f %d %d!!!", + (test1).GetPosition().i, + (test1).GetPosition().j, + (test1).GetPosition().k, + (test2).GetPosition().i, + (test2).GetPosition().j, + (test2).GetPosition().k, + (test1).GetPosition().MagnitudeSquared(), + (test2).GetPosition().MagnitudeSquared(), + (test1).GetPosition().MagnitudeSquared()<(test2).GetPosition().MagnitudeSquared(), + a<b); + */ + + if (this->location!=null_collide_map.begin()) { + if (activeStarSystem==NULL) { + printf ("NONFATAL NULL activeStarSystem detected...please fix\n"); + activeStarSystem=_Universe->activeStarSystem(); + } + if (activeStarSystem->collidemap->find(*this->location)==activeStarSystem->collidemap->end()){ + CollideMap::iterator i; + CollideMap::iterator j=activeStarSystem->collidemap->begin(); + + bool found=false; + for (i=activeStarSystem->collidemap->begin(); + i!=activeStarSystem->collidemap->end();++i) { + if (i==this->location) { + printf ("hussah %d\n",*i==*this->location); + found=true; + } + if(**i<**j) { + printf ("(%f %f %f) and (%f %f %f) %f < %f %d!!!", + (**i).GetPosition().i, + (**i).GetPosition().j, + (**i).GetPosition().k, + (**j).GetPosition().i, + (**j).GetPosition().j, + (**j).GetPosition().k, + (**i).GetPosition().MagnitudeSquared(), + (**j).GetPosition().MagnitudeSquared(), + (**i).GetPosition().MagnitudeSquared()< + (**j).GetPosition().MagnitudeSquared()); + } + j=i; + } + printf ("fin %d %d ",*(int*)&i,found); + activeStarSystem->collidemap->checkSet(); + assert(0); + } + activeStarSystem->collidemap->erase(this->location); + this->location=null_collide_map.begin(); + } #ifndef UNSAFE_COLLIDE_RELEASE #ifdef SAFE_COLLIDE_DEBUG *************** *** 78,82 **** CollideInfo.Maxi=Puffmax; CollideInfo.type=LineCollide::UNIT; ! AddCollideQueue (CollideInfo,activeStarSystem); } else { CollideInfo.Mini= Puffmin; --- 144,148 ---- CollideInfo.Maxi=Puffmax; CollideInfo.type=LineCollide::UNIT; ! AddCollideQueue (CollideInfo,_Universe->activeStarSystem()); } else { CollideInfo.Mini= Puffmin; *************** *** 87,128 **** void Unit::CollideAll() { static bool noUnitCollisions=XMLSupport::parse_bool(vs_config->getVariable("physics","no_unit_collisions","false")); if (isSubUnit()||killed||noUnitCollisions) return; ! ! UnitCollection * colQ [tablehuge+1]; ! bool usehuge = usehuge_table()||GetJumpStatus().drive>=0; ! int sizecolq = _Universe->activeStarSystem()->collidetable->c.Get (&CollideInfo,colQ,usehuge); ! if (CollideInfo.hhuge&&GetJumpStatus().drive>=0) { ! _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(this); ! } ! ! int j = 0; ! for (;j<sizecolq;j++) { ! Unit *un; ! for (un_iter i=colQ[j]->createIterator();(un=(*i))!=NULL;++i) {//warning CANNOT use iterator (except for this sort of collide queue now that I fixed the list ! //UNITS MAY BE DELETED FROM THE CURRENT POINTED TO colQ IN THE PROCESS OF THEIR REMOVAL!!!! //BUG TERMINATED! ! LineCollide * tmp = &(un)->CollideInfo; ! if (tmp->lastchecked==this) ! continue;//ignore duplicates ! tmp->lastchecked = this;//now we're the last checked. ! ! if ((!Unit::CollideInfo.hhuge||(CollideInfo.hhuge&&tmp->type==LineCollide::UNIT))&&((tmp->object.u>this||GetJumpStatus().drive>=0||un->GetJumpStatus().drive>=0||(!CollideInfo.hhuge&&j==0))))//the first stuffs are in the huge array ! if (Position().i+radial_size>tmp->Mini.i&& ! Position().i-radial_size<tmp->Maxi.i&& ! Position().j+radial_size>tmp->Mini.j&& ! Position().j-radial_size<tmp->Maxi.j&& ! Position().k+radial_size>tmp->Mini.k&& ! Position().k-radial_size<tmp->Maxi.k) { ! if (un->Collide(this)) { ! if (j==0&&usehuge) { ! _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(un); ! } ! } ! } } } } ! Vector Vabs (const Vector &in) { return Vector (in.i>=0?in.i:-in.i, --- 153,199 ---- void Unit::CollideAll() { static bool noUnitCollisions=XMLSupport::parse_bool(vs_config->getVariable("physics","no_unit_collisions","false")); + if (isSubUnit()||killed||noUnitCollisions) return; ! static bool newUnitCollisions=XMLSupport::parse_bool(vs_config->getVariable("physics","new_collisions","true")); ! if (newUnitCollisions) { ! this->getStarSystem()->collidemap->CheckCollisions(this,Collidable(this)); ! }else{ ! UnitCollection * colQ [tablehuge+1]; ! bool usehuge = usehuge_table()||GetJumpStatus().drive>=0; ! int sizecolq = _Universe->activeStarSystem()->collidetable->c.Get (&CollideInfo,colQ,usehuge); ! if (CollideInfo.hhuge&&GetJumpStatus().drive>=0) { ! _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(this); ! } + int j = 0; + for (;j<sizecolq;j++) { + Unit *un; + for (un_iter i=colQ[j]->createIterator();(un=(*i))!=NULL;++i) {//warning CANNOT use iterator (except for this sort of collide queue now that I fixed the list + //UNITS MAY BE DELETED FROM THE CURRENT POINTED TO colQ IN THE PROCESS OF THEIR REMOVAL!!!! //BUG TERMINATED! + LineCollide * tmp = &(un)->CollideInfo; + if (tmp->lastchecked==this) + continue;//ignore duplicates + tmp->lastchecked = this;//now we're the last checked. + + if ((!Unit::CollideInfo.hhuge||(CollideInfo.hhuge&&tmp->type==LineCollide::UNIT))&&((tmp->object.u>this||GetJumpStatus().drive>=0||un->GetJumpStatus().drive>=0||(!CollideInfo.hhuge&&j==0))))//the first stuffs are in the huge array + if (Position().i+radial_size>tmp->Mini.i&& + Position().i-radial_size<tmp->Maxi.i&& + Position().j+radial_size>tmp->Mini.j&& + Position().j-radial_size<tmp->Maxi.j&& + Position().k+radial_size>tmp->Mini.k&& + Position().k-radial_size<tmp->Maxi.k) { + if (un->Collide(this)) { + if (j==0&&usehuge) { + _Universe->activeStarSystem()->collidetable->c.AddHugeToActive(un); + } + } + } + + } } } } ! Vector Vabs (const Vector &in) { return Vector (in.i>=0?in.i:-in.i, Index: unit_generic.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/unit_generic.cpp,v retrieving revision 1.393 retrieving revision 1.394 diff -C2 -r1.393 -r1.394 *** unit_generic.cpp 27 Sep 2005 03:07:03 -0000 1.393 --- unit_generic.cpp 29 Sep 2005 09:06:28 -0000 1.394 *************** *** 632,635 **** --- 632,636 ---- void Unit::Init() { + location=null_collide_map.begin(); specInterdiction=0; sim_atom_multiplier=1; *************** *** 1755,1759 **** extern float getAutoRSize (Unit * orig,Unit * un, bool ignore_friend=false); extern void SetShieldZero(Unit*); ! void Unit::UpdatePhysics (const Transformation &trans, const Matrix &transmat, const Vector & cum_vel, bool lastframe, UnitCollection *uc) { static float VELOCITY_MAX=XMLSupport::parse_float(vs_config->getVariable ("physics","velocity_max","10000")); static float SPACE_DRAG=XMLSupport::parse_float(vs_config->getVariable ("physics","unit_space_drag","0.000000")); --- 1756,1760 ---- extern float getAutoRSize (Unit * orig,Unit * un, bool ignore_friend=false); extern void SetShieldZero(Unit*); ! void Unit::UpdatePhysics (const Transformation &trans, const Matrix &transmat, const Vector & cum_vel, bool lastframe, UnitCollection *uc, Unit * superunit) { static float VELOCITY_MAX=XMLSupport::parse_float(vs_config->getVariable ("physics","velocity_max","10000")); static float SPACE_DRAG=XMLSupport::parse_float(vs_config->getVariable ("physics","unit_space_drag","0.000000")); *************** *** 1942,1946 **** autotarg = target; } ! mounts[i].ref.gun->UpdatePhysics (cumulative_transformation, cumulative_transformation_matrix,autotarg,trackingcone, target,(HeatSink?HeatSink:1.0f)*mounts[i].functionality); } } else { --- 1943,1947 ---- autotarg = target; } ! mounts[i].ref.gun->UpdatePhysics (cumulative_transformation, cumulative_transformation_matrix,autotarg,trackingcone, target,(HeatSink?HeatSink:1.0f)*mounts[i].functionality,this,superunit); } } else { *************** *** 1997,2001 **** UnitCollection::UnitIterator iter=getSubUnits(); while ((su=iter.current())) { ! su->UpdatePhysics(cumulative_transformation,cumulative_transformation_matrix,cumulative_velocity,lastframe,uc); su->cloaking = (unsigned int) cloaking; //short fix if (hull<0) { --- 1998,2002 ---- UnitCollection::UnitIterator iter=getSubUnits(); while ((su=iter.current())) { ! su->UpdatePhysics(cumulative_transformation,cumulative_transformation_matrix,cumulative_velocity,lastframe,uc,superunit); su->cloaking = (unsigned int) cloaking; //short fix if (hull<0) { Index: unit_generic.h =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/unit_generic.h,v retrieving revision 1.130 retrieving revision 1.131 diff -C2 -r1.130 -r1.131 *** unit_generic.h 24 Sep 2005 21:38:28 -0000 1.130 --- unit_generic.h 29 Sep 2005 09:06:28 -0000 1.131 *************** *** 54,57 **** --- 54,58 ---- #include <set> #include <string> + #include "collide_map.h" using std::string; *************** *** 784,788 **** ///Updates physics given unit space transformations and if this is the last physics frame in the current gfx frame // Not needed here, so only in NetUnit and Unit classes ! void UpdatePhysics (const Transformation &trans, const Matrix &transmat, const Vector & CumulativeVelocity, bool ResolveLast, UnitCollection *uc=NULL); void AddVelocity(float difficulty); virtual void UpdatePhysics2 (const Transformation &trans, const Transformation & old_physical_state, const Vector & accel, float difficulty, const Matrix &transmat, const Vector & CumulativeVelocity, bool ResolveLast, UnitCollection *uc=NULL); --- 785,789 ---- ///Updates physics given unit space transformations and if this is the last physics frame in the current gfx frame // Not needed here, so only in NetUnit and Unit classes ! void UpdatePhysics (const Transformation &trans, const Matrix &transmat, const Vector & CumulativeVelocity, bool ResolveLast, UnitCollection *uc, Unit * superunit); void AddVelocity(float difficulty); virtual void UpdatePhysics2 (const Transformation &trans, const Transformation & old_physical_state, const Vector & accel, float difficulty, const Matrix &transmat, const Vector & CumulativeVelocity, bool ResolveLast, UnitCollection *uc=NULL); *************** *** 1067,1070 **** --- 1068,1072 ---- ///The information about the minimum and maximum ranges of this unit. Collide Tables point to this bit of information. LineCollide CollideInfo; + CollideMap::iterator location; struct collideTrees * colTrees; ///Sets the parent to be this unit. Unit never dereferenced for this operation Index: unit_util_generic.cpp =================================================================== RCS file: /cvsroot/vegastrike/vegastrike/src/cmd/unit_util_generic.cpp,v retrieving revision 1.35 retrieving revision 1.36 diff -C2 -r1.35 -r1.36 *** unit_util_generic.cpp 21 Sep 2005 04:51:56 -0000 1.35 --- unit_util_generic.cpp 29 Sep 2005 09:06:28 -0000 1.36 *************** *** 22,26 **** --- 22,36 ---- return ((1<<(unsigned int)my_unit->combatRole())&capitaltypes)!=0; } + static int jitter(int input) { + if (input<=2) return input; + int half=input/2; + int amt=rand()%(half*2); + int output=input-half+amt; + if (output>SIM_QUEUE_SIZE) + return SIM_QUEUE_SIZE; + return output; + } int getPhysicsPriority (Unit* un) { + return 1; float rad= un->rSize(); clsptr untype=un->isUnit(); *************** *** 61,79 **** if (un->owner==getTopLevelOwner()||un->faction==cargofac||un->faction==upfac||un->faction==neutral) { if (dist<tooclose) ! return LOW_PRIORITY; else ! return LOWEST_PRIORITY; } Unit * targ = un->Target(); if (_Universe->isPlayerStarship(targ)) { ! return HIGH_PRIORITY; } string obj = UnitUtil::getFgDirective(un); if (!(obj.length()==0||(obj.length()>=1&&obj[0]=='b'))) { ! return MEDIUM_PRIORITY; } if (dist<gun_range) ! return MEDIUM_PRIORITY; if (dist<missile_range) ! return LOW_PRIORITY; if (targ){ float speed; --- 71,89 ---- if (un->owner==getTopLevelOwner()||un->faction==cargofac||un->faction==upfac||un->faction==neutral) { if (dist<tooclose) ! return jitter(LOW_PRIORITY); else ! return jitter(LOWEST_PRIORITY); } Unit * targ = un->Target(); if (_Universe->isPlayerStarship(targ)) { ! return jitter(HIGH_PRIORITY); } string obj = UnitUtil::getFgDirective(un); if (!(obj.length()==0||(obj.length()>=1&&obj[0]=='b'))) { ! return jitter(MEDIUM_PRIORITY); } if (dist<gun_range) ! return jitter(MEDIUM_PRIORITY); if (dist<missile_range) ! return jitter(LOW_PRIORITY); if (targ){ float speed; *************** *** 81,88 **** double distance=UnitUtil::getDistance(un,targ); if (distance<=gun_range) ! return NOT_VISIBLE_COMBAT_HIGH; if (distance<missile_range) ! return NOT_VISIBLE_COMBAT_MEDIUM; ! return NOT_VISIBLE_COMBAT_LOW; } return NO_ENEMIES; --- 91,98 ---- double distance=UnitUtil::getDistance(un,targ); if (distance<=gun_range) ! return jitter(NOT_VISIBLE_COMBAT_HIGH); if (distance<missile_range) ! return jitter(NOT_VISIBLE_COMBAT_MEDIUM); ! return jitter(NOT_VISIBLE_COMBAT_LOW); } return NO_ENEMIES; |