File indexing completed on 2024-12-08 06:47:09
0001 /* 0002 SPDX-FileCopyrightText: 2003 Russell Steffen <rsteffen@bayarea.net> 0003 SPDX-FileCopyrightText: 2003 Stephan Zehetner <s.zehetner@nevox.org> 0004 SPDX-FileCopyrightText: 2006 Dmitry Suzdalev <dimsuz@gmail.com> 0005 SPDX-FileCopyrightText: 2006 Inge Wallin <inge@lysator.liu.se> 0006 SPDX-FileCopyrightText: 2006 Pierre Ducroquet <pinaraf@gmail.com> 0007 SPDX-FileCopyrightText: 2011 Jeffrey Kelling <overlordapophis@gmail.com> 0008 0009 SPDX-License-Identifier: GPL-2.0-or-later 0010 */ 0011 0012 #include "gameview.h" 0013 0014 #include <QCheckBox> 0015 #include <QDockWidget> 0016 #include <QLabel> 0017 #include <QPushButton> 0018 #include <QLineEdit> 0019 #include <QTextEdit> 0020 #include <QPixmap> 0021 #include <QKeyEvent> 0022 #include <QIntValidator> 0023 #include <QDebug> 0024 0025 #include <KMessageBox> 0026 0027 #include "players/player.h" 0028 #include "players/localplayer.h" 0029 #include "images.h" 0030 #include "map/mapview.h" 0031 #include "map/mapscene.h" 0032 0033 #include "dialogs/newgamedlg.h" 0034 #include "dialogs/scoredlg.h" 0035 #include "dialogs/fleetdlg.h" 0036 0037 #include "view/standingswidget.h" 0038 0039 #include <cmath> 0040 0041 /********************************************************************* 0042 Game Board 0043 *********************************************************************/ 0044 0045 GameView::GameView(QWidget *parent, Game *game, QDockWidget *messagesDock, QDockWidget *standingsDock) 0046 : QWidget( parent ), 0047 m_msgWidgetLastTurn(0), 0048 m_messagesDock(messagesDock), 0049 m_standingsDock(standingsDock), 0050 m_game( game ), 0051 m_queueMessages(false), 0052 m_messageQueue(), 0053 m_showInformations(false), 0054 m_initCompleted( false ), 0055 m_cleanupNeeded( false ), 0056 m_guiState( NONE ) 0057 { 0058 QPalette blackPal; 0059 blackPal.setColor( backgroundRole(), Qt::black ); 0060 setPalette( blackPal ); 0061 setAutoFillBackground( true ); 0062 0063 QColor col(Qt::green); 0064 QPalette palette; 0065 palette.setColorGroup( QPalette::Active, Qt::white, Qt::black, 0066 col.lighter(), col.darker(), col, 0067 col.lighter(125), col.lighter(125), col.darker(), 0068 Qt::black ); 0069 palette.setColorGroup( QPalette::Inactive, Qt::white, Qt::black, 0070 col.lighter(), col.darker(), col, 0071 col.lighter(125), col.lighter(125), col.darker(), 0072 Qt::black ); 0073 palette.setColorGroup( QPalette::Disabled, Qt::white, QColor(Qt::darkGray).darker(), 0074 col.lighter(), col.darker(), col, 0075 col.darker(150), col.lighter(125), Qt::black, 0076 Qt::black ); 0077 0078 blackPal.setColor( QPalette::Base, Qt::black ); 0079 blackPal.setColor( QPalette::Window, Qt::black ); 0080 blackPal.setColor( QPalette::Button, QColor(Qt::darkGray).darker() ); 0081 blackPal.setColor( QPalette::Text, Qt::white ); 0082 blackPal.setColor( QPalette::ButtonText, Qt::white ); 0083 blackPal.setColor( QPalette::WindowText, Qt::white ); 0084 0085 //******************************************************************** 0086 // Create the widgets in the main window 0087 //******************************************************************** 0088 m_mapScene = new MapScene(m_game); 0089 m_mapWidget = new MapView( m_mapScene, this ); 0090 m_mapWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); 0091 m_mapWidget->setFrameShape(QFrame::NoFrame); 0092 0093 m_msgWidget = new QTextEdit(); 0094 m_msgWidget->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); 0095 m_msgWidget->setReadOnly(true); 0096 m_msgWidget->setPalette( blackPal ); 0097 m_msgWidget->setAutoFillBackground( true ); 0098 0099 m_messagesDock->setWidget(m_msgWidget); 0100 0101 m_standingsWidget = new StandingsWidget(nullptr); 0102 m_standingsDock->setWidget(m_standingsWidget); 0103 0104 m_gameMessage = new QLabel( this ); 0105 m_gameMessage->setPalette( palette ); 0106 0107 m_endTurnBtn = new QPushButton( i18n("End Turn"), this ); 0108 m_endTurnBtn->setFixedSize( m_endTurnBtn->sizeHint() ); 0109 m_endTurnBtn->setPalette( palette ); 0110 0111 m_shipCountEdit = new QLineEdit( this ); 0112 m_shipValidator = new QIntValidator(1, 32767, this ); 0113 m_shipCountEdit->setValidator( m_shipValidator ); 0114 m_shipCountEdit->setMinimumSize( 40, 0 ); 0115 m_shipCountEdit->setMaximumSize( 32767, 40 ); 0116 m_shipCountEdit->setEnabled(false); 0117 m_shipCountEdit->setPalette( palette ); 0118 m_shipCountEdit->setEchoMode( QLineEdit::Password ); 0119 0120 m_standingOrder = new QCheckBox(i18n("Standing order"), this); 0121 m_standingOrder->setEnabled(false); 0122 m_standingOrder->setPalette( palette ); 0123 m_standingOrder->setCheckState(Qt::Unchecked); 0124 0125 m_splashScreen = new QLabel( this ); 0126 m_splashScreen->setPixmap(QPixmap(IMAGE_SPLASH)); 0127 m_splashScreen->setScaledContents(true); 0128 0129 setMouseTracking( true ); 0130 setFocusPolicy( Qt::StrongFocus ); 0131 setFocus(); 0132 0133 //******************************************************************** 0134 // Layout the main window 0135 //******************************************************************** 0136 QVBoxLayout *mainLayout = new QVBoxLayout( this ); 0137 QHBoxLayout *topLineLayout = new QHBoxLayout; 0138 0139 topLineLayout->addSpacing( 5 ); 0140 topLineLayout->addWidget( m_gameMessage, 10 ); 0141 topLineLayout->addWidget( m_standingOrder, 1 ); 0142 topLineLayout->addWidget( m_shipCountEdit, 1 ); 0143 topLineLayout->addWidget( m_endTurnBtn, 1 ); 0144 0145 mainLayout->addLayout( topLineLayout ); 0146 mainLayout->addWidget( m_mapWidget ); 0147 0148 //********************************************************************** 0149 // Set up signal/slot connections 0150 //********************************************************************** 0151 connect(m_mapScene, &MapScene::planetSelected, this, &GameView::planetSelected); 0152 connect(m_shipCountEdit, &QLineEdit::returnPressed, this, &GameView::newShipCount); 0153 connect(m_standingOrder, &QCheckBox::clicked, this, &GameView::standingOrdersClicked); 0154 connect(m_endTurnBtn, &QPushButton::clicked, this, &GameView::nextPlayer); 0155 0156 changeGameView(); 0157 } 0158 0159 //********************************************************************** 0160 // Destructor 0161 //********************************************************************** 0162 GameView::~GameView() 0163 { 0164 // Nothing much to do yet 0165 } 0166 0167 //************************************************************************ 0168 // Event handlers 0169 //************************************************************************ 0170 void GameView::standingOrdersClicked() { 0171 m_shipCountEdit->setFocus(); 0172 if(m_standingOrder->checkState() == Qt::Checked) 0173 m_shipValidator->setTop(INT_MAX); 0174 else 0175 m_shipValidator->setTop(sourcePlanet->fleet().shipCount()); 0176 } 0177 0178 void 0179 GameView::resizeEvent ( QResizeEvent * ) { 0180 m_splashScreen->setGeometry( 0, 0, width(), height() ); 0181 } 0182 0183 void 0184 GameView::keyPressEvent( QKeyEvent *e ) 0185 { 0186 // Check for the escape key 0187 if( e->key() == Qt::Key_Escape ) { 0188 switch( m_guiState ) { 0189 case DEST_PLANET: 0190 case SHIP_COUNT: 0191 case RULER_SOURCE: 0192 case RULER_DEST: 0193 m_guiState = SOURCE_PLANET; 0194 haveSourcePlanet = false; 0195 haveDestPlanet = false; 0196 turn(); 0197 break; 0198 default: 0199 break; 0200 } 0201 m_mapScene->displayPlanetInfo( nullptr ); 0202 m_mapScene->unselectPlanet(); 0203 m_showInformations = false; 0204 return; 0205 } 0206 0207 if( e->text().isEmpty() || e->text().at(0).isSpace() ) { 0208 e->ignore(); 0209 return; 0210 } 0211 0212 if ( e->text() == QLatin1String("?") ) { 0213 // Switch the information key info... 0214 m_showInformations = !m_showInformations; 0215 return; 0216 } 0217 0218 QString planetName; 0219 0220 planetName += e->text().toUpper(); 0221 0222 for (Planet *p : m_game->planets()) { 0223 if( p->name() == planetName ) { 0224 if ( m_showInformations ) { 0225 m_mapScene->selectPlanet(p); 0226 m_mapScene->displayPlanetInfo( p ); 0227 m_showInformations = false; 0228 } else { 0229 m_mapScene->displayPlanetInfo( nullptr ); 0230 m_mapScene->selectPlanet(p); 0231 planetSelected( p ); 0232 } 0233 break; 0234 } 0235 } 0236 0237 } 0238 0239 0240 //************************************************************************ 0241 // Game engine/state machine 0242 //************************************************************************ 0243 0244 /** 0245 * Prepare the turn for a local player by updating the informational widgets. 0246 */ 0247 0248 void 0249 GameView::turnPreparation() 0250 { 0251 m_standingsWidget->update(m_game->players()); 0252 0253 turn(); 0254 } 0255 0256 0257 void 0258 GameView::turn() 0259 { 0260 switch( m_guiState ) { 0261 case NONE : 0262 // The standby state, waiting for clicking on a planet or starting 0263 // to measure a distance.. 0264 m_guiState = SOURCE_PLANET; 0265 haveSourcePlanet = false; 0266 haveDestPlanet = false; 0267 haveShipCount = false; 0268 standingOrder = false; 0269 shipCount = 0; 0270 m_mapScene->unselectPlanet(); 0271 0272 turn(); 0273 setFocus(); 0274 break; 0275 0276 case SOURCE_PLANET : 0277 // The user has clicked on a source planet for moving some fleets. 0278 if( haveSourcePlanet ) { 0279 m_guiState = DEST_PLANET; 0280 0281 m_mapScene->selectPlanet(sourcePlanet); 0282 turn(); 0283 0284 } else { 0285 m_shipCountEdit->setEnabled(false); 0286 m_shipCountEdit->setText( QString() ); 0287 m_standingOrder->setEnabled(false); 0288 m_standingOrder->setCheckState(Qt::Unchecked); 0289 m_mapScene->unselectPlanet(); 0290 m_gameMessage->setText( i18n("%1: Select source planet...", m_game->currentPlayer()->coloredName()) ); 0291 setFocus(); 0292 } 0293 0294 break; 0295 0296 case DEST_PLANET : 0297 // The user has chosen a destination planet and should now 0298 // specify a number of ships. 0299 if( haveDestPlanet ) { 0300 m_mapScene->unselectPlanet(); 0301 m_guiState = SHIP_COUNT; 0302 turn(); 0303 } else { 0304 m_shipCountEdit->setEnabled(false); 0305 m_standingOrder->setEnabled(false); 0306 m_mapScene->selectPlanet(sourcePlanet); 0307 m_gameMessage->setText( i18n("%1: Select destination planet...", m_game->currentPlayer()->coloredName()) ); 0308 setFocus(); 0309 } 0310 0311 break; 0312 0313 case SHIP_COUNT: 0314 // The user has selected, source, distance, ship count. 0315 if( haveShipCount ) { 0316 // We now have a complete fleet to send, so send it 0317 if( !m_game->attack(sourcePlanet, destPlanet, shipCount, standingOrder) ) { 0318 KMessageBox::error( this, i18n("Not enough ships to send.") ); 0319 } 0320 0321 m_shipCountEdit->setEnabled(false); 0322 m_standingOrder->setEnabled(false); 0323 0324 m_guiState = NONE; 0325 turn(); 0326 0327 m_endTurnBtn->setFocus(); 0328 0329 } else { 0330 m_gameMessage->setText( i18n("%1: How many ships?", m_game->currentPlayer()->coloredName()) ); 0331 0332 m_shipCountEdit->setEnabled(true); 0333 m_standingOrder->setEnabled(true); 0334 m_shipCountEdit->setFocus(); 0335 0336 m_mapScene->unselectPlanet(); 0337 } 0338 0339 break; 0340 0341 case RULER_SOURCE: 0342 // The user has selected to measure a distance with the ruler. 0343 if( haveSourcePlanet ) { 0344 m_guiState = RULER_DEST; 0345 m_mapScene->selectPlanet(sourcePlanet); 0346 turn(); 0347 } else { 0348 m_shipCountEdit->setEnabled(false); 0349 m_mapScene->unselectPlanet(); 0350 0351 m_gameMessage->setText( i18n("Ruler: Select starting planet.") ); 0352 setFocus(); 0353 } 0354 break; 0355 0356 case RULER_DEST: 0357 if( haveDestPlanet ) { 0358 m_mapScene->unselectPlanet(); 0359 0360 // Display the distance between the two planets 0361 double dist = m_game->map()->distance( sourcePlanet, 0362 destPlanet ); 0363 0364 QString msg; 0365 msg = i18n("The distance from Planet %1 to Planet %2 is %3 light years.\n" 0366 "A ship leaving this turn will arrive on turn %4", 0367 sourcePlanet->name(), 0368 destPlanet->name(), 0369 QString::number(dist, 'f', 1), 0370 m_game->turnCounter() + (int)std::ceil(dist)); 0371 KMessageBox::information( this, msg, i18n("Distance")); 0372 0373 m_guiState = NONE; 0374 turn(); 0375 } else { 0376 m_gameMessage->setText( i18n("Ruler: Select ending planet.") ); 0377 m_shipCountEdit->setEnabled(false); 0378 m_mapScene->selectPlanet(sourcePlanet); 0379 0380 setFocus(); 0381 } 0382 break; 0383 0384 default: 0385 break; 0386 } 0387 0388 m_endTurnBtn->setEnabled(m_guiState == SOURCE_PLANET); 0389 0390 Q_EMIT newGUIState( m_guiState ); 0391 } 0392 0393 void 0394 GameView::gameMsg(const KLocalizedString &msg, Player *player, Planet *planet, 0395 Player *planetPlayer) 0396 { 0397 bool isHumanInvolved = false; 0398 0399 QString color = QStringLiteral("white"); 0400 KLocalizedString colorMsg = msg; 0401 KLocalizedString plainMsg = msg; 0402 0403 if (player) { 0404 if (!player->isAiPlayer()) 0405 isHumanInvolved = true; 0406 colorMsg = colorMsg.subs(player->coloredName()); 0407 plainMsg = plainMsg.subs(player->name()); 0408 } 0409 0410 if (planet) { 0411 if (!planetPlayer) 0412 planetPlayer = planet->player(); 0413 if (!planetPlayer->isAiPlayer() && !planetPlayer->isNeutral()) 0414 isHumanInvolved = true; 0415 0416 QString color = planetPlayer->color().name(); 0417 colorMsg = colorMsg.subs(QStringLiteral("<font color=\"%1\">%2</font>") 0418 .arg(color, planet->name())); 0419 plainMsg = plainMsg.subs(planet->name()); 0420 } 0421 0422 if (m_msgWidgetLastTurn < m_game->turnCounter()) { 0423 m_msgWidgetLastTurn = m_game->turnCounter(); 0424 0425 m_msgWidget->append(QLatin1String("<font color=\"gray\">") 0426 + i18n("Turn %1:", m_game->turnCounter()) 0427 + QLatin1String("</font>")); 0428 } 0429 0430 m_msgWidget->append(QLatin1String("- <font color=\"") + color + QLatin1String("\">") 0431 + colorMsg.toString()+QLatin1String("</font>")); 0432 m_msgWidget->moveCursor(QTextCursor::End); 0433 0434 if (isHumanInvolved) { 0435 if ( m_queueMessages ) { 0436 GameMessage msg; 0437 0438 msg.text = colorMsg.toString(); 0439 msg.sender = player; 0440 msg.receiver = planetPlayer; 0441 m_messageQueue.append(msg); 0442 } else { 0443 KMessageBox::information(this, plainMsg.toString()); 0444 } 0445 } 0446 } 0447 0448 //************************************************************************ 0449 // Confirm aborting existing game 0450 //************************************************************************ 0451 bool GameView::confirmNewGame() 0452 { 0453 if( m_game->isRunning() ) 0454 return shutdownGame(); 0455 0456 return true; 0457 } 0458 0459 //************************************************************************ 0460 // Set up the game board for a new game 0461 //************************************************************************ 0462 void 0463 GameView::startNewGame() 0464 { 0465 NewGameDlg *newGame = new NewGameDlg( this, m_game ); 0466 0467 if( !newGame->exec() ) { 0468 delete newGame; 0469 return; 0470 } 0471 0472 newGame->save(); // Save settings for next time 0473 0474 delete newGame; 0475 0476 for (Player *player : m_game->players()) { 0477 if (player->isSpectator()) { 0478 0479 // All planets a spectator player has assigned are turned into 0480 // neutral planets so that a spectator player starts without 0481 // any planet. 0482 0483 m_game->map()->turnOverPlayerPlanets(player, m_game->neutral()); 0484 } 0485 0486 LocalPlayer *local = qobject_cast<LocalPlayer*>(player); 0487 if (local) 0488 connect(local, &LocalPlayer::canPlay, this, &GameView::turnPreparation); 0489 } 0490 0491 connect(m_game, &Game::finished, this, &GameView::gameOver); 0492 m_game->start(); 0493 0494 // Fix all the widgets to run a new game. 0495 changeGameView(); 0496 0497 // setup the map scene 0498 m_mapScene->mapUpdate(); 0499 0500 // Set up the base GUI for a new game. 0501 m_msgWidget->clear(); 0502 m_msgWidgetLastTurn = 0; 0503 m_shipCountEdit->setEnabled(false); 0504 m_initCompleted = true; 0505 0506 //call GameView::gameOver now if needed happens if the game ends immediately after starting. 0507 if(m_cleanupNeeded) 0508 gameOver(); 0509 } 0510 0511 0512 //************************************************************************ 0513 // Shut down the current game 0514 //************************************************************************ 0515 bool 0516 GameView::shutdownGame() 0517 { 0518 if (!m_game->isRunning()) 0519 return true; 0520 0521 int choice = KMessageBox::warningContinueCancel 0522 ( this, 0523 i18n("Do you wish to retire this game?"), 0524 i18nc("@title:window", "End Game"), 0525 KStandardGuiItem::ok() ); 0526 0527 if( choice == KMessageBox::Cancel ) 0528 return false; 0529 0530 gameOver(); 0531 return true; 0532 } 0533 0534 0535 void 0536 GameView::gameOver() 0537 { 0538 if (m_initCompleted) { 0539 //qDebug() << "Game over"; 0540 0541 /** 0542 * @todo This is an attempt to remove duplicate information from screen. 0543 * It is not a final solution, but only the best we came up with. The 0544 * problem is that the messages cannot be seen anymore, so the player 0545 * cannot check what happened last. Furthermore, this sudden change of 0546 * the GUI setup can be confusing for players. 0547 */ 0548 0549 m_messagesDock->hide(); 0550 m_standingsDock->hide(); 0551 0552 ScoreDlg *scoreDlg = new ScoreDlg(this, i18nc("@title:window", "Final Standings"), m_game->players()); 0553 scoreDlg->exec(); 0554 scoreDlg->deleteLater(); 0555 0556 cleanupGame(); 0557 } 0558 else 0559 m_cleanupNeeded = true; 0560 } 0561 0562 0563 void 0564 GameView::cleanupGame() 0565 { 0566 m_mapScene->clearMap(); 0567 m_game->stop(); 0568 0569 m_endTurnBtn->setEnabled( false ); 0570 0571 changeGameView(); 0572 m_guiState = NONE; 0573 0574 //m_game->cleanupGame(); 0575 0576 m_initCompleted = false; 0577 m_cleanupNeeded = false; 0578 Q_EMIT newGUIState(m_guiState); 0579 } 0580 0581 0582 //************************************************************************ 0583 // Player selected a planet 0584 //************************************************************************ 0585 void 0586 GameView::planetSelected( Planet *planet ) 0587 { 0588 //qDebug() << "planetSelected with " << m_guiState; 0589 switch( m_guiState ) { 0590 case SOURCE_PLANET: 0591 if( planet->player() == m_game->currentPlayer() ) { 0592 // got a match 0593 m_shipValidator->setRange(1, planet->fleet().shipCount()); 0594 haveSourcePlanet = true; 0595 sourcePlanet = planet; 0596 0597 turn(); 0598 return; 0599 } 0600 break; 0601 case RULER_SOURCE: 0602 haveSourcePlanet = true; 0603 sourcePlanet = planet; 0604 turn(); 0605 return; 0606 case DEST_PLANET: 0607 case RULER_DEST: 0608 if( planet != sourcePlanet ) { 0609 // got a match 0610 haveDestPlanet = true; 0611 destPlanet = planet; 0612 0613 turn(); 0614 } 0615 return; 0616 default: 0617 break; 0618 } 0619 0620 // The selected planet just cannot be selected, cancel it. 0621 m_mapScene->unselectPlanet(); 0622 } 0623 0624 0625 //************************************************************************ 0626 // Player hit return in the ship count edit box 0627 //************************************************************************ 0628 void 0629 GameView::newShipCount() 0630 { 0631 bool ok; 0632 0633 switch (m_guiState) { 0634 case SHIP_COUNT: 0635 shipCount = m_shipCountEdit->text().toInt(&ok); 0636 standingOrder = m_standingOrder->checkState() == Qt::Checked; 0637 if (ok) 0638 haveShipCount = true; 0639 m_shipCountEdit->setText( QString() ); 0640 m_standingOrder->setCheckState(Qt::Unchecked); 0641 turn(); 0642 break; 0643 0644 default: 0645 break; 0646 }; 0647 } 0648 0649 //********************************************************************** 0650 // transition board from play to non-play 0651 //********************************************************************** 0652 void 0653 GameView::changeGameView() 0654 { 0655 bool isRunning = m_game->isRunning(); 0656 0657 //qDebug() << "Calling GameView::changeGameView" << isRunning; 0658 0659 m_messagesDock->setVisible(isRunning); 0660 0661 if (!isRunning) { 0662 0663 // Only hide the standings dock if the game is not running, but do not 0664 // automatically show it as soon as the game is running. 0665 0666 m_standingsDock->hide(); 0667 } 0668 0669 m_mapWidget->setVisible(isRunning); 0670 m_gameMessage->setVisible(isRunning); 0671 m_standingOrder->setVisible(isRunning); 0672 m_shipCountEdit->setVisible(isRunning); 0673 m_endTurnBtn->setVisible(isRunning); 0674 m_splashScreen->setVisible(!isRunning); // negation 0675 } 0676 0677 0678 //************************************************************************ 0679 // Player clicked the 'End Turn' button 0680 //************************************************************************ 0681 void 0682 GameView::nextPlayer() 0683 { 0684 // Hum, this should be straightforward 0685 Player *currentPlayer = m_game->currentPlayer(); 0686 LocalPlayer *humanPlayer = qobject_cast<LocalPlayer*>(currentPlayer); 0687 if (humanPlayer) 0688 humanPlayer->done(); 0689 /* 0690 if(m_game->options().BlindMap && m_game->humanPlayerCount() > 1) { 0691 QString name = m_gameLogic->currentPlayer()->name(); 0692 m_gameLogic->setBlindBreak(true); 0693 m_mapScene->update(); 0694 KMessageBox::information(this, "Blind Map " + name + " Turn done"); 0695 m_gameLogic->setBlindBreak(false); 0696 } 0697 */ 0698 } 0699 0700 //************************************************************************ 0701 // Toolbar items 0702 //************************************************************************ 0703 void 0704 GameView::measureDistance() 0705 { 0706 switch( m_guiState ) { 0707 case SOURCE_PLANET: 0708 m_guiState = RULER_SOURCE; 0709 turn(); 0710 default: 0711 break; 0712 } 0713 } 0714 0715 0716 void 0717 GameView::showFleets() 0718 { 0719 Player *current = m_game->currentPlayer(); 0720 FleetDlg *fleetDlg = new FleetDlg( this, current->attackList(), 0721 current->newAttacks(), current->standingOrders()); 0722 if (fleetDlg->exec()) { 0723 const AttackFleetList *deleteAttacks = fleetDlg->uncheckedFleets(); 0724 for (AttackFleet *curFleet : *deleteAttacks) { 0725 current->cancelNewAttack(curFleet); 0726 } 0727 delete deleteAttacks; 0728 m_mapScene->update(); 0729 } 0730 fleetDlg->deleteLater(); 0731 } 0732 0733 #include "moc_gameview.cpp"