// if you pass in -1's for x and y, we'll figure out where it can go, and return where it went int32_t LogisticsVariant::addComponent(LogisticsComponent* pComponent, int32_t& xCoord, int32_t& yCoord) { int32_t retVal = canAddComponent(pComponent, xCoord, yCoord); if(retVal == 0) { if(addComponent(pComponent->getID(), xCoord, yCoord)) return 0; else return ADD_COMPONENT_FAILED; } return retVal; }
void MechLabScreen::update() { if ( bSaveDlg ) { pCurDialog->update(); if ( pCurDialog->isDone() ) { if ( pCurDialog->getStatus() == YES ) { LogisticsData::instance->acceptMechModifications( pCurDialog->getFileName() ); pCurDialog->end(); status = UP; bSaveDlg = 0; } else if ( pCurDialog->getStatus() == NO ) { bSaveDlg = 0; pCurDialog->end(); } } return; } else if ( bErrorDlg ) { LogisticsOneButtonDialog::instance()->update(); if ( LogisticsOneButtonDialog::instance()->isDone() ) bErrorDlg = 0; return; } if ( !pVariant || status != RUNNING ) return; camera.update(); int oldSel = componentListBox.GetSelectedItem(); // need to check this before we update the list box for ( int i = 0; i < MECH_LAB_ATTRIBUTE_METER_COUNT; i++ ) attributeMeters[i].update(); if ( !MPlayer || !ChatWindow::instance()->pointInside(userInput->getMouseX(), userInput->getMouseY()) ) LogisticsScreen::update(); updateDiagramInput(); variantList.update(); bool vals[4]; if ( pVariant && status == RUNNING ) // sensor help texts { int sensorID = pVariant->getSensorID(); for ( int i = 0; i < 3; i++ ) { if ( sensorID == sensorHelpIDs[i] - IDS_HELP_COMP0 ) vals[i] = true; else vals[i] = false; } vals[3] = pVariant->getECM() > 0; for ( i = 0; i < 4; i++ ) { if ( vals[i] ) { if ( sensorRects[i].left <= userInput->getMouseX() && sensorRects[i].right >= userInput->getMouseX() && sensorRects[i].top <= userInput->getMouseY() && sensorRects[i].bottom >= userInput->getMouseY() && !helpTextID ) { helpTextID = sensorHelpIDs[i]; break; } } } } // hack, in case the variant list sets the helpID if ( ::helpTextID ) { textObjects[helpTextArrayID].setText( helpTextID ); } // see if the variant changed EString tmp; variantList.EditBox().getEntry(tmp); if ( varName.Compare( tmp ) != 0 ) { swapVariant(); } if ( status != RUNNING ) // can change after button updates return; // update the list box componentListBox.update(); int newSel = componentListBox.GetSelectedItem(); if ( oldSel != newSel ) { if ( newSel != -1 ) { pSelectedComponent = NULL; selI = selJ = -1; } else { bool bFound = 0; for ( int i = 0; i < componentListBox.GetItemCount(); i++ ) { if ( componentListBox.GetItem( i )->getState() != aListItem::DISABLED && !canAddComponent( ((ComponentListItem*)componentListBox.GetItem( i ))->getComponent() ) ) { bFound = 1; break; } } if ( !bFound ) selectFirstDiagramComponent(); } } bool bNoDelete = !canRemoveComponent( pSelectedComponent ); if ( pSelectedComponent ) { setComponent( pSelectedComponent ); if ( bNoDelete || (selI == -1 && selJ == -1) ) getButton( MB_MSG_REMOVE )->disable( 1 ); else getButton( MB_MSG_REMOVE )->disable( 0 ); getButton( MB_MSG_ADD )->disable( 1 ); } else { LogisticsComponent* pComp = componentListBox.getComponent(); if ( pComp ) { setComponent( pComp ); getButton( MB_MSG_ADD )->disable( 0 ); getButton( MB_MSG_REMOVE )->disable( 1 ); } else getButton( MB_MSG_REMOVE )->disable( 1 ); } long color = 0xffffffff; float newCost = pVariant->getCost(); // figure out change float costChange = newCost - originalCost; if ( curCount && curCount + g_deltaTime < countDownTime ) { curCount += g_deltaTime; float curAmount = previousAmount - (curCount/countDownTime * previousAmount); costChange += curAmount; color = 0xffa21600; if ( curAmount > 0 ) color = 0xffc8e100; } updateHeatMeter(); updateArmorMeter(); char text[64]; sprintf( text, "%.0lf ", costChange ); textObjects[5].setText( text ); textObjects[5].setColor( color ); if ( MPlayer && ChatWindow::instance() ) ChatWindow::instance()->update(); }
void MechLabScreen::setComponent( LogisticsComponent* pComponent, bool bMessageFromLB ) { if ( bMessageFromLB && canAddComponent( pComponent ) ) // if they clicked on a disabled item { componentListBox.SelectItem( -1 ); selI = selJ = -1; pSelectedComponent = NULL; getButton( MB_MSG_ADD )->disable( true ); } if ( pComponent && pComponent == pCurComponent ) return; pCurComponent = pComponent; // ammo doesn't deserve a meter attributeMeters[3].showGUIWindow( 0 ); char text[64]; if ( pCurComponent ) { //set the little spinning figure // uncomment this when the art is in, if ever... camera.setComponent( pCurComponent->getPictureFileName() ); textObjects[6].setText( pComponent->getName() ); // first figure out if this is a jump jet or not if ( pCurComponent->getType() == COMPONENT_FORM_JUMPJET ) { showJumpJetItems( 1 ); // set up jump range attributeMeters[4].setValue(((float)pVariant->getMaxJumpRange() * 25.0f) / MAX_JUMP_RANGE ); sprintf( text, "%ld", pVariant->getMaxJumpRange() * 25); textObjects[7].setText( text ); textObjects[7].setColor( 0xff005392 ); rects[16].setHelpID( IDS_HELP_PM_JUMP ); // set up heat attributeMeters[7].setValue(pCurComponent->getHeat()/LogisticsComponent::MAX_HEAT); attributeMeters[7].showGUIWindow( true ); sprintf( text, "%.1lf", pCurComponent->getHeat() ); textObjects[15].setText( text ); textObjects[8].setText( "" ); textObjects[9].setText( "" ); textObjects[10].setText( "" ); textObjects[13].setText( "" ); rects[17].setHelpID( IDS_HELP_MC_HEAT_GENERATED ); attributeMeters[0].showGUIWindow( false ); rects[18].setHelpID( 0 ); rects[19].setHelpID( 0 ); rects[20].setHelpID( 0 ); } else if ( pCurComponent->getType() == COMPONENT_FORM_HEATSINK ) { showJumpJetItems( 1 ); // hide jump range stuff attributeMeters[4].showGUIWindow( 0 ); textObjects[7].showGUIWindow( 0 ); statics[47].showGUIWindow( 0 ); textObjects[15].setText( "" ); // jump range statics[48].showGUIWindow( 0 ); // armor statics[49].showGUIWindow( 0 ); // damage statics[30].showGUIWindow( 0 ); // heat statics[55].showGUIWindow( 1 ); attributeMeters[7].showGUIWindow( 0 ); // set up heat, negative heat is stored in the damage area of heat sinks, god knows why attributeMeters[8].setValue(pCurComponent->getDamage()/LogisticsComponent::MAX_HEAT); attributeMeters[8].showGUIWindow( true ); sprintf( text, "+%.1lf", pCurComponent->getDamage() ); textObjects[16].setText( text ); textObjects[16].showGUIWindow( true ); textObjects[8].setText( "" ); textObjects[9].setText( "" ); textObjects[10].setText( "" ); textObjects[13].setText( "" ); attributeMeters[0].showGUIWindow( false ); rects[16].setHelpID( IDS_HELP_MC_HEAT_GENERATED ); rects[17].setHelpID( 0 ); rects[18].setHelpID( 0 ); rects[19].setHelpID( 0 ); rects[20].setHelpID( 0 ); } else if ( pCurComponent->getType() == COMPONENT_FORM_BULK ) { showJumpJetItems( 1 ); // jump range statics[48].showGUIWindow( 0 ); // armor statics[49].showGUIWindow( 1 ); // damage statics[30].showGUIWindow( 0 ); sprintf( text, "%.1lf", pCurComponent->getDamage() ); textObjects[7].setText( text ); textObjects[7].setColor( 0xff005392 ); textObjects[8].setText( "" ); textObjects[9].setText( "" ); textObjects[10].setText( "" ); textObjects[15].setText( "" ); textObjects[13].setText( "" ); attributeMeters[7].showGUIWindow( false ); for( int i = 0; i < 4; i++ ) { attributeMeters[i].showGUIWindow( 0 ); } rects[16].setHelpID( IDS_HELP_MC_ARMOR ); rects[17].setHelpID( 0 ); rects[18].setHelpID( 0 ); rects[19].setHelpID( 0 ); rects[20].setHelpID( 0 ); } else { long rangeColors[3] = {0xff6e7c00, 0xff005392,0xffa21600 }; showJumpJetItems( 0 ); textObjects[7].setText( pCurComponent->getRangeType() + IDS_SHORT_RANGE ); textObjects[7].setColor( rangeColors[pCurComponent->getRangeType()] ); attributeMeters[0].showGUIWindow( true ); attributeMeters[0].setValue(pCurComponent->getDamage()/LogisticsComponent::MAX_DAMAGE); sprintf( text, "%.1lf", pCurComponent->getDamage() ); textObjects[8].setText( text ); if ( pCurComponent->getRecycleTime() ) { attributeMeters[1].setValue((10.f/pCurComponent->getRecycleTime())/LogisticsComponent::MAX_RECYCLE); sprintf( text, "%.1lf", 10.f/pCurComponent->getRecycleTime() ); textObjects[9].setText( text ); } else { attributeMeters[1].setValue( 0.f ); sprintf( text, "%.1lf", 0.f ); textObjects[9].setText( text ); } attributeMeters[2].setValue(pCurComponent->getHeat()/LogisticsComponent::MAX_HEAT); sprintf( text, "%.1lf", pCurComponent->getHeat() ); textObjects[10].setText( text ); attributeMeters[7].showGUIWindow( false ); if ( !g_unlimitedAmmo ) { sprintf( text, "%ld", pCurComponent->getAmmo() ); textObjects[13].setText( text ); attributeMeters[3].setValue( ((float)pCurComponent->getAmmo())/164.f ); } else textObjects[13].setText( "" ); textObjects[15].setText( "" ); rects[16].setHelpID( IDS_HELP_MC_RANGE ); rects[17].setHelpID( IDS_HELP_MC_DAMAGE ); rects[18].setHelpID( IDS_HELP_MC_FIRE_RATE ); rects[19].setHelpID( IDS_HELP_MC_HEAT_GENERATED ); if ( !g_userPreferences.unlimitedAmmo ) rects[20].setHelpID( IDS_HELP_MC_AMMO ); else rects[20].setHelpID( 0 ); } } else { for ( int i = 7; i < 11; i++ ) { textObjects[i].setText( "" ); } textObjects[13].setText( "" ); for ( i = 0; i < 5; i++ ) { attributeMeters[i].setValue( 0 ); attributeMeters[i].showGUIWindow( 0 ); } } }