4 #include "cmd/planet_generic.h"
5 #include "cmd/unit_generic.h"
6 #include "cmd/unit_collide.h"
7 #include "cmd/collection.h"
8 #include "gfx/cockpit_generic.h"
14 #include "cmd/music.h"
19 #include "cmd/nebula_generic.h"
21 #include "cmd/script/mission.h"
23 #include "cmd/script/flightgroup.h"
26 #include "cmd/unit_util.h"
27 #include "cmd/unit_factory.h"
28 #include "cmd/unit_collide.h"
31 #include "networking/netclient.h"
34 #include <boost/version.hpp>
35 #if BOOST_VERSION != 102800
37 #if defined (_MSC_VER) && _MSC_VER <= 1200
44 #if defined (_MSC_VER) && _MSC_VER <= 1200
51 #include <boost/python/detail/extension_class.hpp>
58 for (
unsigned int i = 0; i <
pendingjump.size(); ++i)
61 ss->
JumpTo( un, jumppoint, system );
69 radius *= jump_radius_scale*game_speed;
78 collidemap[Unit::UNIT_ONLY] =
new CollideMap( Unit::UNIT_ONLY );
79 collidemap[Unit::UNIT_BOLT] =
new CollideMap( Unit::UNIT_BOLT );
94 collidemap[Unit::UNIT_ONLY] =
new CollideMap( Unit::UNIT_ONLY );
95 collidemap[Unit::UNIT_BOLT] =
new CollideMap( Unit::UNIT_BOLT );
102 bolts =
new bolt_draw;
106 LoadXML( filename, centr, timeofyear );
108 name = strdup( filename );
125 for (un_iter iter =
drawList.createIterator(); (unit = *iter); ++iter)
131 vector< StarSystem* >activ;
136 fprintf( stderr,
"Avoided fatal error in deleting star system %s\n",
getFileName().c_str() );
139 while ( activ.size() ) {
153 while ( faction >= (
int) fg.size() ) {
154 fg.push_back(
new Flightgroup() );
155 fg.back()->nr_ships = 0;
157 if (fg[faction]->nr_ships == 0) {
161 fg[
faction]->ainame =
"default";
164 fg[
faction]->nr_waves_left = 0;
165 fg[
faction]->nr_ships_left = 0;
175 static vector< Flightgroup* >fg;
183 static vector< Flightgroup* >fg;
190 static vector< Flightgroup* >fg;
197 static vector< Flightgroup* >fg;
204 static vector< Flightgroup* >fg;
216 ( (
StarSystem*) userData )->endElement( name );
227 return string(
name );
234 if (unit->specInterdiction > 0 || unit->isPlanet() || unit->isJumppoint() || unit->isUnit() == ASTEROIDPTR) {
248 unit->activeStarSystem =
this;
249 UnitFactory::broadcastUnit( unit,
GetZone() );
250 unsigned int priority = UnitUtil::getPhysicsPriority( unit );
260 for (
unsigned int locind = 0; locind < Unit::NUM_COLLIDE_MAPS; ++locind)
261 if ( !is_null( un->location[locind] ) ) {
262 collidemap[locind]->erase( un->location[locind] );
263 set_null( un->location[locind] );
265 bool removed2 =
false;
274 bool removed =
false;
276 for (un_iter iter =
drawList.createIterator(); (unit = *iter); ++iter)
286 for (un_iter iter =
physics_buffer[i].createIterator(); (unit = *iter); ++iter)
304 for (un_iter iter =
getUnitList().createIterator(); (unit = *iter); ++iter) {
306 unit->ResetThreatLevel();
309 catch (
const boost::python::error_already_set) {
310 if ( PyErr_Occurred() ) {
322 return (Unit*) 0x31337;
327 un->SetVelocity( Vector( un->GetVelocity().i, 0, un->GetVelocity().k ) );
328 un->curr_physical_state.position = QVector( un->curr_physical_state.position.i,
330 un->curr_physical_state.position.k );
351 if (faction != system_faction) {
353 this->system_faction =
faction;
355 for (un_iter ui = ss->
getUnitList().createIterator();
361 size_t iter = navCheckIter;
363 if ( iter >= navs[0].size() ) {
364 iter -= navs[0].size();
367 if ( iter >= navs[1].size() ) {
368 iter -= navs[1].size();
371 size_t totalnavchecking = 25;
372 size_t totalsyschecking = 25;
373 while ( iter < totalnavchecking && iter < navs[k].size() ) {
374 if (navs[k][iter].GetUnit() == NULL) {
375 navs[k].erase( navs[k].begin()+iter );
381 if ( k == 2 && iter >= navs[k].size() )
383 size_t sortedsize = ss->
collidemap[Unit::UNIT_ONLY]->sorted.size();
384 int sysfac = system_faction;
385 size_t counter = checkIter+totalsyschecking;
386 for (; checkIter < counter && checkIter < sortedsize; ++checkIter) {
387 Collidable *collide = &ss->
collidemap[Unit::UNIT_ONLY]->sorted[checkIter];
388 if (collide->radius > 0) {
389 Unit *un = collide->ref.unit;
390 float rel = UnitUtil::getRelationFromFaction( un, sysfac );
403 if (checkIter >= sortedsize && sortedsize
404 > (
unsigned int) (enemycount+neutralcount+friendlycount
406 citizencount = newcitizencount;
408 enemycount = newenemycount;
410 neutralcount = newneutralcount;
412 friendlycount = newfriendlycount;
413 newfriendlycount = 0;
420 float rel = UnitUtil::getRelationFromFaction( un, system_faction );
431 if ( un->GetDestinations().size() )
432 jumpPoints[un->GetDestinations()[0]].SetUnit( un );
433 if ( UnitUtil::isSignificant( un ) ) {
436 if ( un->isPlanet() && !un->isJumppoint() )
439 if ( UnitUtil::isAsteroid( un ) ) k = 2;
440 navs[k].push_back( UnitContainer( un ) );
446 float rel = UnitUtil::getRelationFromFaction( un, system_faction );
457 if ( un->GetDestinations().size() ) {
459 jumpPoints[(un->GetDestinations()[0])].SetUnit( NULL );
461 jumpPoints.erase( jumpPoints.find( un->GetDestinations()[0] ) );
463 if ( UnitUtil::isSignificant( un ) ) {
464 for (
int k = 0; k < 3; ++k)
465 for (
size_t i = 0; i < navs[k].size();) {
466 if (navs[k][i].GetUnit() == un)
468 navs[k].erase( navs[k].begin()+i );
488 while ( (unit = *iter) && *iter != un )
491 un->predicted_priority = 0;
500 static bool phytoggle =
true;
504 double collidetime = 0;
505 double flattentime = 0;
512 for (++batchcount; batchcount > 0; --batchcount) {
525 int priority = UnitUtil::getPhysicsPriority( unit );
527 int predprior = unit->predicted_priority;
529 if (priority != predprior) {
532 unit->curr_physical_state = unit->cumulative_transformation;
534 predprior = priority;
541 unit->sim_atom_multiplier = priority;
545 unit->ResetThreatLevel();
547 unit->UpdatePhysics( identity_transformation, identity_matrix, Vector( 0,
555 unit->predicted_priority = predprior;
558 catch (
const boost::python::error_already_set) {
559 if ( PyErr_Occurred() ) {
567 Bolt::UpdatePhysics(
this );
572 if (Unit::NUM_COLLIDE_MAPS > 1)
577 int priority = unit->sim_atom_multiplier;
589 collidetime += dd-cc;
598 for (un_iter iter =
getUnitList().createIterator(); (unit = *iter); ++iter) {
601 unit->UpdatePhysics( identity_transformation, identity_matrix, Vector( 0,
643 printf(
"MISSION NOT ERASED\n" );
662 bool firstframe =
true;
672 Unit::ProcessDeleteQueue();
675 for (un_iter iter =
drawList.createIterator(); (unit = *iter); ++iter)
676 unit->SetNebula( NULL );
691 bool firstframe =
true;
692 double pythontime = 0;
712 Unit::ProcessDeleteQueue();
719 static int dothis = 0;
721 if ( (++dothis)%2 == 0 )
758 while ( !
sigIter.isDone() && !UnitUtil::isSignificant( *
sigIter) )
777 star_system_table.
Put( mname,
this );
789 std::string ssys(
string( system )+
string(
".system" ) );
791 ss = star_system_table.
Get( ssys );
806 for (
unsigned int kk = 0; kk <
pendingjump.size(); ++kk) {
811 QVector delta = ( jp->LocalPosition()-un->LocalPosition() );
812 float dist = delta.Magnitude();
816 if (dist > 10 && player) {
818 un->SetCurPosition( un->LocalPosition()+
SIMULATION_ATOM*delta*(speed/dist) );
819 }
else if (!player) {
820 un->SetVelocity( Vector( 0, 0, 0 ) );
822 static bool setshieldzero =
841 if (
Network == NULL || playernum < 0 || (
Network != NULL && playernum >= 0 &&
Network[playernum].readyToJump() ) ) {
846 Network[playernum].downloadZoneInfo();
859 if ( un->TransferUnitToSystem( kk, savedStarSystem, dosightandsound ) )
860 un->DecreaseWarpEnergy(
false, 1.0f );
871 if (playernum >= 0) {
873 Network[playernum].unreadyToJump();
880 double calc_blend_factor(
double frac,
int priority,
unsigned int when_it_will_be_simulated,
int cur_simulation_frame )
885 int relwas = when_it_will_be_simulated-priority;
887 int relcur = cur_simulation_frame-relwas-1;
889 return (relcur+frac)/(double) priority;
895 jumppoint->graphicOptions.Animating = 1;
897 for (un_iter i = jumppoint->getSubUnits(); NULL != (un = *i); ++i)
901 static bool isJumping(
const vector< unorigdest* > &pending, Unit *un )
903 for (
size_t i = 0; i < pending.size(); ++i)
904 if (pending[i]->un == un)
915 QVector dir = finish-start;
916 if ( dir.MagnitudeSquared() ) {
921 if ( pos.MagnitudeSquared() ) pos.Normalize();
924 return QVector( 0, 0, 0 );
927 bool StarSystem::JumpTo( Unit *un, Unit *jumppoint,
const std::string &system,
bool force,
bool save_coordinates )
929 if ( ( un->DockedOrDocking()&(~Unit::DOCKING_UNITS) ) != 0 )
931 if (
Network == NULL || force) {
932 if (un->jump.drive >= 0)
938 std::string ssys( system+
".system" );
940 ss = star_system_table.
Get( ssys );
941 bool justloaded =
false;
956 pendingjump.push_back(
new unorigdest( un, jumppoint,
this, ss, un->GetJumpStatus().delay, ani, justloaded,
958 system ) : QVector( 0, 0, 0 ) ) );
970 Network->jumpRequest( system, jumppoint->GetSerial() );