int LogisticsVariant::getComponentLocation( LogisticsComponent* pComp, long& x, long& y ) { const LogisticsChassis::ComponentInfo* pInfo = getComponentAtLocation( x, y ); x = y = -1; if ( pInfo ) { x = pInfo->xCoord; y = pInfo->yCoord; } else { for ( int i = 0; i < componentCount; i++ ) { if ( (components[i].component) == pComp ) { x = components[i].xCoord; y = components[i].yCoord; return 0; } } return COMPONENT_NOT_FOUND; } return 0; }
LogisticsComponent* LogisticsVariant::getCompAtLocation(int32_t i, int32_t j, int32_t& realI, int32_t& realJ) { realI = realJ = -1; const LogisticsChassis::ComponentInfo* pInfo = getComponentAtLocation(i, j); if(pInfo) { realI = pInfo->xCoord; realJ = pInfo->yCoord; return pInfo->component; } return 0; }
int LogisticsVariant::removeComponent( long xCoord, long yCoord ) { LogisticsChassis::ComponentInfo* info = const_cast<LogisticsChassis::ComponentInfo*>(getComponentAtLocation( xCoord, yCoord )); if ( !info ) return -1; if ( info->component && info->component->getType() == COMPONENT_FORM_HEATSINK ) { if ( getMaxHeat() - info->component->getDamage() < getHeat() ) return INSUFFICIENT_HEAT; } if ( !info ) return INVALID_LOCATION; for ( int i = 0; i < componentCount; i++ ) { if ( &components[i] == info ) { memmove( &components[i], &components[i + 1], (componentCount - ( i + 1 )) * sizeof( LogisticsChassis::ComponentInfo ) ); break; } } componentCount --; return 0; }
// if you pass in -1's for x and y, we'll figure out where it can go, and return where it went int LogisticsVariant::canAddComponent( LogisticsComponent* pComponent, long& x, long& y ) const { /* weight no longer matters int weight = getWeight(); if ( weight + pComponent->getWeight() > chassis->maxWeight ) return COMPONENT_TOO_HEAVY;*/ if ( getHeat() + pComponent->getHeat() > getMaxHeat() ) return COMPONENT_TOO_HOT; if ( pComponent->getType() == COMPONENT_FORM_JUMPJET ) { if ( !chassis->canHaveJumpJets ) return JUMPJETS_NOT_ALLOWED; else if ( hasJumpJets() ) return ONLY_ONE_JUMPJET_ALLOWED; else if ( ( x!= -1 && x != -2) || ( y != -1 && y != -2 ) ) return COMPONENT_SLOT_FULL; return 0; } else if ( x == -2 && y == -2 ) // trying to put something illegal in jump jet slot return COMPONENT_SLOT_FULL; if ( x!= -1 && y != -1 ) { for ( int i = 0; i < pComponent->getComponentWidth(); i++ ) { for ( int j = 0; j < pComponent->getComponentHeight(); j++ ) { if ( getComponentAtLocation( x + i, y + j) || x + i >= chassis->componentAreaWidth || j + y >= chassis->componentAreaHeight ) return COMPONENT_SLOT_FULL; } } } else { for ( int j = 0; j < chassis->componentAreaHeight && x == -1; j++ ) { for ( int i = 0; i < chassis->componentAreaWidth && x == -1; i++ ) { if ( !getComponentAtLocation( i, j ) ) { bool bAdd = true; for ( int l = 0; l < pComponent->getComponentHeight(); ++l ) { for ( int k =0; k < pComponent->getComponentWidth(); ++k ) { if ( getComponentAtLocation( i +k, j + l ) || ( i + k >= chassis->componentAreaWidth ) || ( j +l >= chassis->componentAreaHeight ) ) { bAdd = false; break; break; } } } if ( bAdd ) { x = i; y = j; } } } } if ( x == -1 || y == -1 ) { return ADD_COMPONENT_FAILED; } } if ( pComponent->getType() == COMPONENT_FORM_BULK ) { if ( getArmor() + 32 > getMaxArmor() ) return NO_MORE_ARMOR; } if ( pComponent->getType() == COMPONENT_FORM_SENSOR ) { if ( !chassis->canHaveAdvSensor ) return SENSORS_NOT_ALLOWED; else if ( hasSensor() ) return ONLY_ONE_SENSOR_ALLOWED; } if ( pComponent->getType() == COMPONENT_FORM_ECM ) { if ( !chassis->canHaveECM ) return ECM_NOT_ALLOWED; else if ( hasECM() ) return ONLY_ONE_ECM_ALLOWED; } return 0; }
bool LogisticsVariant::addComponent( int idFromFitFile, long& x, long& y ) { LogisticsComponent* pComponent = LogisticsData::instance->getComponent( idFromFitFile ); if ( !pComponent ) { // Assert( 0, idFromFitFile, "couldn't find the component in the fit file\n" ); delete pComponent; return false; } if ( pComponent->getType() == COMPONENT_FORM_JUMPJET ) { components[componentCount].location = LEGS; x = y = -2; } else if ( pComponent->getType() == COMPONENT_FORM_ECM || pComponent->getType() == COMPONENT_FORM_SENSOR ) { components[componentCount].location = HEAD; x = y = -3; } else { // need to see if this thing will fit long componentWidth = pComponent->getComponentWidth(); long componentHeight = pComponent->getComponentHeight(); if ( x == -1 && y == -1 ) { for ( int j = 0; j < chassis->componentAreaHeight && x == -1; j++ ) { for ( int i = 0; i < chassis->componentAreaWidth && x == -1; i++ ) { bool bAdd = true; for ( int l = 0; l < componentHeight; ++l ) { for ( int k =0; k < componentWidth; ++k ) { if ( getComponentAtLocation( i +k, j + l ) || ( i + k >= chassis->componentAreaWidth ) || ( j +l >= chassis->componentAreaHeight ) ) { bAdd = false; break; break; } } } if ( bAdd ) { x = i; y = j; } } } } if ( x == -1 && y == -1 ) return 0; if ( x > -1 ) { for ( int i =0; i < componentWidth; ++i ) { for ( int j = 0; j < componentHeight; ++j ) { if ( getComponentAtLocation( x +i, y + j ) ) { char errorString[1024]; sprintf( errorString, "couldn't add component %s to variant %s because another object was in the specified location", pComponent->getName(), this->getName().Data() ); // Assert( 0, 0, errorString ); return false; } } } } components[componentCount].location = CHEST; } components[componentCount].component = pComponent; components[componentCount].xCoord = x; components[componentCount].yCoord = y; componentCount++; return true; }