diff options
Diffstat (limited to 'konquest')
51 files changed, 5728 insertions, 0 deletions
diff --git a/konquest/AUTHORS b/konquest/AUTHORS new file mode 100644 index 00000000..6d46c5fd --- /dev/null +++ b/konquest/AUTHORS @@ -0,0 +1,12 @@ +Galactic Konquest +----------------- + +Contributers are: + +- Russell Steffen <rsteffen@bayarea.net> + + +- Computer/AI Player +Stephan Zehetner <s.zehetner@nevox.org> + + diff --git a/konquest/ChangeLog b/konquest/ChangeLog new file mode 100644 index 00000000..0601252e --- /dev/null +++ b/konquest/ChangeLog @@ -0,0 +1,26 @@ +2005-02-18 Inge Wallin <ingwa@dhcp-254-182.lkpg.cendio.se> + + * version.h (KONQUEST_VERSION): Bumped version number to 1.1 + because of the upcoming release of KDE 3.4. + +2004-08-22 Inge Wallin <inge@lysator.liu.se> + + * gameboard.cc (nextTurn): Fixed a grammatical error. + +0.99.4 -- + Brought the KDE CVS tree in sync with my own. Changes from previous version + include: + -- removed dependence on libg++ random integer classes + -- fixed a couple of problems with the game state machine. + +0.0.4 -- + Fixed (hopefully) a compiler error. gamecore.cc would compile fine with + debug (-g), but not with the optimizer (-O2). Added a destructor + and things seem okay. + + Added the distance measuring function of the original game. It appears as a + in the toolbar. + +0.0.3 -- + wasn't keeping a changelog prior to 0.0.4 + diff --git a/konquest/Konquest.cc b/konquest/Konquest.cc new file mode 100644 index 00000000..90a6b6c6 --- /dev/null +++ b/konquest/Konquest.cc @@ -0,0 +1,34 @@ +#include <kapplication.h> +#include <klocale.h> +#include <kcmdlineargs.h> +#include <kaboutdata.h> + +#include "version.h" +#include "mainwin.h" +#include "map_widget.h" + +static const char description[] = I18N_NOOP("Galactic Strategy KDE Game"); + +int +main(int argc, char **argv) +{ + KAboutData aboutData( "konquest", I18N_NOOP("Konquest"), + KONQUEST_VERSION, description, KAboutData::License_GPL, + I18N_NOOP("Copyright (c) 1999-2001, Developers")); + aboutData.addAuthor("Russ Steffen",0, "rsteffen@bayarea.net"); + KCmdLineArgs::init( argc, argv, &aboutData ); + + KApplication a; + QApplication::setGlobalMouseTracking( true ); + KGlobal::locale()->insertCatalogue("libkdegames"); + + if (a.isRestored()) + RESTORE(MainWindow) + else { + MainWindow *w = new MainWindow; + a.setMainWidget(w); + w->show(); + } + return a.exec(); +} + diff --git a/konquest/Makefile.am b/konquest/Makefile.am new file mode 100644 index 00000000..e6b50150 --- /dev/null +++ b/konquest/Makefile.am @@ -0,0 +1,23 @@ +SUBDIRS = pics + +INCLUDES= -I$(top_srcdir)/libkdegames $(all_includes) +KDE_ICON = konquest + +bin_PROGRAMS = konquest +konquest_SOURCES = Konquest.cc gameboard.cc gamecore.cc int_validator.cc \ + mainwin.cc map_widget.cc minimap.cc newgamedlg.cc planet_info.cc \ + gameenddlg.cc scoredlg.cc fleetdlg.cc newGameDlg_ui.ui +konquest_LDFLAGS = $(all_libraries) $(KDE_RPATH) +konquest_LDADD = $(LIB_KDEGAMES) +konquest_DEPENDENCIES = $(LIB_KDEGAMES_DEP) + + +METASOURCES = AUTO + +xdg_apps_DATA = konquest.desktop + +rcdir = $(kde_datadir)/konquest +rc_DATA = konquestui.rc + +messages: rc.cpp + $(XGETTEXT) rc.cpp *.cc -o $(podir)/konquest.pot diff --git a/konquest/README b/konquest/README new file mode 100644 index 00000000..b8950f43 --- /dev/null +++ b/konquest/README @@ -0,0 +1,10 @@ +Konquest +---------------------------------------- + +Konquest is a multi-player strategy game. The goal of +the game is to expand your interstellar empire across the + galaxy and, of course, crush your rivals in the process. + +Please see the konquest help page for more information. + + diff --git a/konquest/TODO b/konquest/TODO new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/konquest/TODO @@ -0,0 +1 @@ + diff --git a/konquest/fleetdlg.cc b/konquest/fleetdlg.cc new file mode 100644 index 00000000..0117f74d --- /dev/null +++ b/konquest/fleetdlg.cc @@ -0,0 +1,88 @@ +#include <qlayout.h> +#include <kapplication.h> +#include <klocale.h> +#include <math.h> +#include <kglobal.h> +#include <kpushbutton.h> +#include <kstdguiitem.h> + +#include "fleetdlg.h" + +FleetDlgListViewItem::FleetDlgListViewItem(QListView *parent, QString s1, QString s2, QString s3, QString s4, QString s5) : QListViewItem(parent, s1, s2, s3, s4, s5) +{ +} + +int FleetDlgListViewItem::compare(QListViewItem *i, int col, bool) const +{ + if (col == 1) + { + if (text(col) > i -> text(col)) return 1; + else if (text(col) < i -> text(col)) return -1; + else return compare(i, 0, true); + } + else if (col == 3) + { + if (text(col).toDouble() > i -> text(col).toDouble()) return 1; + else if (text(col).toDouble() < i -> text(col).toDouble()) return -1; + else return compare(i, 0, true); + } + else + { + if (text(col).toInt() > i -> text(col).toInt()) return 1; + else if (text(col).toInt() < i -> text(col).toInt()) return -1; + else return compare(i, 0, true); + } +} + + +FleetDlg::FleetDlg( QWidget *parent, AttackFleetList *fleets ) + : QDialog(parent, "FleetDlg", true ), fleetList(fleets) +{ + setCaption( kapp->makeStdCaption(i18n("Fleet Overview")) ); + + fleetTable = new KListView( this, 0 ); + fleetTable->addColumn(i18n("Fleet No.")); + fleetTable->addColumn(i18n("Destination")); + fleetTable->addColumn(i18n("Ships")); + fleetTable->addColumn(i18n("Kill Percentage")); + fleetTable->addColumn(i18n("Arrival Turn")); + fleetTable->setMinimumSize( fleetTable->sizeHint() ); + + KPushButton *okButton = new KPushButton( KStdGuiItem::ok(), this ); + okButton->setMinimumSize( okButton->sizeHint() ); + okButton->setDefault(true); + + QVBoxLayout *layout1 = new QVBoxLayout( this ); + QHBoxLayout *layout2 = new QHBoxLayout; + + layout1->addWidget( fleetTable, 1 ); + layout1->addLayout( layout2 ); + + layout2->addStretch( 2 ); + layout2->addWidget( okButton ); + layout2->addStretch( 2 ); + + connect( okButton, SIGNAL(clicked()), this, SLOT(accept()) ); + + init(); + + resize( 580, 140 ); +} + +void +FleetDlg::init() +{ + AttackFleet *curFleet; + AttackFleetListIterator nextFleet( *fleetList ); + int fleetNumber = 0; + + while( (curFleet = nextFleet())) { + fleetNumber++; + new FleetDlgListViewItem(fleetTable, + QString("%1").arg(fleetNumber), + curFleet->destination->getName(), + QString("%1").arg(curFleet->getShipCount()), + QString("%1").arg(KGlobal::locale()->formatNumber(curFleet->killPercentage, 3)), + QString("%1").arg((int)ceil(curFleet->arrivalTurn))); + } +} diff --git a/konquest/fleetdlg.h b/konquest/fleetdlg.h new file mode 100644 index 00000000..abab1957 --- /dev/null +++ b/konquest/fleetdlg.h @@ -0,0 +1,29 @@ +#ifndef FLEETDLG_H +#define FLEETDLG_H + +#include <klistview.h> + +#include <qdialog.h> + +#include "gamecore.h" + +class FleetDlgListViewItem : public QListViewItem +{ + public: + FleetDlgListViewItem(QListView *parent, QString s1, QString s2, QString s3, QString s4, QString s5); + int compare(QListViewItem *i, int col, bool) const; +}; + +class FleetDlg : public QDialog { + +public: + FleetDlg( QWidget *parent, AttackFleetList *fleets ); + +private: + void init(); + + AttackFleetList *fleetList; + QListView *fleetTable; +}; + +#endif diff --git a/konquest/gameboard.cc b/konquest/gameboard.cc new file mode 100644 index 00000000..75e440d7 --- /dev/null +++ b/konquest/gameboard.cc @@ -0,0 +1,991 @@ +#include <qlayout.h> +#include <qcolor.h> +#include <qlabel.h> +#include <qslider.h> +#include <qevent.h> +#include <qkeycode.h> +#include <qlistbox.h> +#include <qpushbutton.h> +#include <qlineedit.h> +#include <qvalidator.h> +#include <qtextedit.h> + +#include <kapplication.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kglobal.h> +#include <kiconloader.h> + +#include <ctype.h> +#include <math.h> + +#include "gamecore.h" + +#include "int_validator.h" +#include "newgamedlg.h" +#include "gameenddlg.h" +#include "scoredlg.h" +#include "fleetdlg.h" +#include "gameboard.h" +#include "gameboard.moc" + + +/********************************************************************* + Game Board +*********************************************************************/ +GameBoard::GameBoard( QWidget *parent ) + : QWidget( parent ), gameInProgress( false ), gameState( NONE ) +{ + QColorGroup cg( white, black, green.light(), green.dark(), green, green.dark(75), green.dark() ); + QPalette palette( cg, cg, cg ); + + neutralPlayer = Player::createNeutralPlayer(); + map = new Map; + + planets.setAutoDelete(true); + players.setAutoDelete(true); + + //******************************************************************** + // Create the widgets in the main window + //******************************************************************** + mapWidget = new ConquestMap( map, this ); + msgWidget = new QTextEdit( this ); + msgWidget->setTextFormat(LogText); + msgWidget->setMinimumHeight(100); + msgWidget->setHScrollBarMode(QScrollView::AlwaysOff); + msgWidget->setPaper(QBrush(Qt::black)); + planetInfo = new PlanetInfo( this, palette ); + gameMessage = new QLabel( this ); + gameMessage->setPalette( palette ); + turnCounter = new QLabel( this ); + turnCounter->setPalette( palette ); + turnCounter->setText( "Turn" ); + turnCounter->setMaximumHeight( turnCounter->sizeHint().height() ); + + endTurn = new QPushButton( i18n("End Turn"), this ); + endTurn->setFixedSize( endTurn->sizeHint() ); + endTurn->setPalette( palette ); + + shipCountEdit = new QLineEdit( this ); + IntValidator *v = new IntValidator( 1, 32767, this ); + shipCountEdit->setValidator( v ); + shipCountEdit->setMinimumSize( 40, 0 ); + shipCountEdit->setMaximumSize( 32767, 40 ); + shipCountEdit->setEnabled(false); + shipCountEdit->setPalette( palette ); + shipCountEdit->setEchoMode( QLineEdit::Password ); + + splashScreen = new QLabel( this ); + splashScreen->setPixmap(QPixmap(IMAGE_SPLASH)); + splashScreen->setGeometry( 0, 0, 600, 550 ); + + setMinimumSize( 600, 600 ); + + setMouseTracking( true ); + setFocusPolicy( StrongFocus ); + setFocus(); + + //******************************************************************** + // Layout the main window + //******************************************************************** + QHBoxLayout *layout1 = new QHBoxLayout( this ); + QVBoxLayout *layout2 = new QVBoxLayout; + QHBoxLayout *layout3 = new QHBoxLayout; + QVBoxLayout *layout4 = new QVBoxLayout; + + layout1->addLayout( layout2 ); + layout2->addLayout( layout3 ); + + layout3->addSpacing( 5 ); + layout3->addWidget( gameMessage, 10 ); + layout3->addWidget( shipCountEdit, 1 ); + layout3->addWidget( endTurn, 1 ); + + layout2->addSpacing( 5 ); + layout2->addWidget( mapWidget, 0, AlignTop ); + layout2->addWidget( msgWidget ); + layout2->addStretch( 1 ); + + layout1->addSpacing( 5 ); + layout1->addLayout( layout4, 10 ); + + layout4->addWidget( planetInfo, 1 ); + layout4->addSpacing( 10 ); + layout4->addWidget( turnCounter, 1 ); + layout4->addStretch( 1 ); + + layout1->addStretch( 1 ); + + //********************************************************************** + // Set up signal/slot connections + //********************************************************************** + connect( mapWidget, SIGNAL( planetSelected(Planet *) ), this, SLOT(planetSelected(Planet *)) ); + connect( shipCountEdit, SIGNAL(returnPressed()), this, SLOT(newShipCount()) ); + connect( endTurn, SIGNAL( clicked() ), this, SLOT( nextPlayer() ) ); + connect( mapWidget, SIGNAL( planetHighlighted(Planet *)), planetInfo, SLOT(showPlanet(Planet *)) ); + + changeGameBoard( false ); +} + + +//********************************************************************** +// Destructor +//********************************************************************** +GameBoard::~GameBoard() +{ + // Nothing much to do yet +} + +#if 0 +QSize GameBoard::sizeHint() const +{ + return QSize( 600, 550 ); +} +#endif + +//************************************************************************ +// Keyboard Event handlers +//************************************************************************ +void +GameBoard::keyPressEvent( QKeyEvent *e ) +{ + // Check for the escape key + if( e->key() == Key_Escape ) { + switch( gameState ) { + case DEST_PLANET: + case SHIP_COUNT: + case RULER_SOURCE: + case RULER_DEST: + gameState = SOURCE_PLANET; + haveSourcePlanet = false; + haveDestPlanet = false; + turn(); + break; + default: + break; + } + return; + } + + if( !isgraph( e->ascii() ) ) { + e->ignore(); + return; + } + + PlanetListIterator planetSearch( planets ); + QString planetName; + + planetName += toupper( e->ascii() ); + + for(Planet *p = planetSearch.toFirst(); + p != NULL; + p = ++planetSearch ) { + + if( p->getName() == planetName ) + planetSelected( p ); + } + +} + +QString +GameBoard::playerString(Player *player) +{ + if (!player) + player = currentPlayer->current(); + return player->getColoredName(); +} + +//************************************************************************ +// Game engine/state machine +//************************************************************************ +void +GameBoard::turn() +{ + PlanetListIterator planetAi( planets ); + PlanetListIterator planetAttack( planets ); + Planet *target = 0; + + switch( gameState ) { + case NONE : + // stuff for none + gameState = SOURCE_PLANET; + haveSourcePlanet = false; + haveDestPlanet = false; + haveShipCount = false; + shipCount = 0; + mapWidget->unselectPlanet(); + + + turn(); + setFocus(); + break; + + case SOURCE_PLANET : + + if( haveSourcePlanet ) { + gameState = DEST_PLANET; + + sourcePlanet->select(); + turn(); + + } else { + shipCountEdit->hide(); + endTurn->setEnabled( true ); + mapWidget->unselectPlanet(); + + gameMessage->setText( "<qt>" + playerString() + ": " + + i18n("Select source planet...") + "</qt>" ); + setFocus(); + } + + break; + + case DEST_PLANET : + + if( haveDestPlanet ) { + mapWidget->unselectPlanet(); + gameState = SHIP_COUNT; + turn(); + + } else { + shipCountEdit->hide(); + endTurn->setEnabled( false ); + sourcePlanet->select(); + gameMessage->setText( "<qt>" + playerString() + ": " + + i18n("Select destination planet...") + "</qt>" ); + setFocus(); + } + + break; + + case SHIP_COUNT: + + if( haveShipCount ) { + // We now have a complete fleet to send, so send it + sendAttackFleet( sourcePlanet, destPlanet, shipCount); + + shipCountEdit->hide(); + endTurn->setEnabled( true ); + + gameState = NONE; + turn(); + + endTurn->setFocus(); + + } else { + gameMessage->setText( currentPlayer->current()->getName() + + i18n(": How many ships?") ); + + shipCountEdit->setText( "" ); + shipCountEdit->show(); + shipCountEdit->setEnabled(true); + shipCountEdit->setFocus(); + + endTurn->setEnabled( false ); + + mapWidget->unselectPlanet(); + } + + break; + + case RULER_SOURCE: + if( haveSourcePlanet ) { + gameState = RULER_DEST; + sourcePlanet->select(); + turn(); + } else { + shipCountEdit->hide(); + endTurn->setEnabled( true ); + mapWidget->unselectPlanet(); + + gameMessage->setText( i18n("Ruler: Select starting planet.") ); + setFocus(); + } + + break; + + case RULER_DEST: + if( haveDestPlanet ) { + mapWidget->unselectPlanet(); + + // Display the distance between the two planets + CoreLogic cl; + double dist = cl.distance( sourcePlanet, destPlanet ); + + QString msg; + msg = i18n("The distance from Planet %1 to Planet %2 is %3 light years.\n" + "A ship leaving this turn will arrive on turn %4") + .arg(sourcePlanet->getName()) + .arg(destPlanet->getName()) + .arg(KGlobal::locale()->formatNumber( dist, 2 )) + .arg(KGlobal::locale()->formatNumber( turnNumber + (int)dist, 0 )); + KMessageBox::information( this, msg, i18n("Distance")); + + gameState = NONE; + turn(); + } else { + gameMessage->setText( i18n("Ruler: Select ending planet.") ); + shipCountEdit->hide(); + endTurn->setEnabled( false ); + sourcePlanet->select(); + + setFocus(); + } + + break; + + case AI_PLAYER: + endTurn->setEnabled( false ); + gameMessage->setText( i18n("Computer Player thinking...") ); + + Planet *home; + + int ships; + planetAi.toFirst(); + + while ((home = planetAi())) { + if (home->getPlayer() == currentPlayer->current()) { + + bool hasAttack = false; + ships = (int)floor(home->getFleet().getShipCount() * 0.7 ); + + if (ships >= 20) { + + Planet *attack; + double minDistance = 100; + planetAttack.toFirst(); + while ((attack = planetAttack())) { + bool skip = false; + + CoreLogic cl; + double dist = cl.distance( home, attack ); + + if ((dist < minDistance) && (attack->getPlayer() != currentPlayer->current()) && + (attack->getFleet().getShipCount() < ships )) { + AttackFleetListIterator FleetsinFlight( currentPlayer->current()->getAttackList() ); + AttackFleet *curFleet; + + while ( (curFleet = FleetsinFlight())) { + if (curFleet->destination == attack) { + skip = true; + } + } + if (skip) continue; + + target = attack; + hasAttack = true; + minDistance = dist; + } + } + + if (hasAttack) { + sendAttackFleet( home, target, ships ); + } + else { + planetAttack.toFirst(); + minDistance = 100; + int shipsToSend = 0; + bool hasDestination = false; + + while ((attack = planetAttack())) { + bool skip = false; + CoreLogic cl; + double dist = cl.distance( home, attack ); + int homeships = (int)floor(home->getFleet().getShipCount() * 0.5 ); + + if ((dist < minDistance) && (attack->getPlayer() == currentPlayer->current()) && + (attack->getFleet().getShipCount() < homeships )) { + AttackFleetListIterator FleetsinFlight( currentPlayer->current()->getAttackList() ); + AttackFleet *curFleet; + + while ( (curFleet = FleetsinFlight())) { + if (curFleet->destination == attack) { + skip = true; + } + } + if (skip) continue; + + shipsToSend = (int)floor((home->getFleet().getShipCount() - attack->getFleet().getShipCount()) / 2) ; + + target = attack; + hasDestination = true; + minDistance = dist; + } + } + + if (hasDestination) { + sendAttackFleet( home, target, shipsToSend ); + } + } + } + } + } + + endTurn->setEnabled( true ); + nextPlayer(); + + break; + + default: + break; + } + + QString turnStr; + turnStr = i18n("Turn #: %1 of %2").arg(turnNumber).arg(lastTurn); + + turnCounter->setText( turnStr ); + + emit newGameState( gameState ); +} +//************************************************************************ +// To the end turn processing (resolve combat, etc.) +//************************************************************************ +void +GameBoard::nextTurn() +{ + resolveShipsInFlight(); + + scanForSurvivors(); + + // advance to first living player + while( currentPlayer->current() && !currentPlayer->current()->isInPlay() ) { + ++(*currentPlayer); + }; + + // advance turn counter + turnNumber++; + + // update the planets + PlanetListIterator nextPlanet( planets ); + Planet *planet; + + while( (planet = nextPlanet()) ) + { + planet->turn(); + } + + // Tell the status widget to update itself + planetInfo->rescanPlanets(); + + Player *winner = findWinner(); + if (winner) + { + mapWidget->repaint(true); + KMessageBox::information(this, + i18n("The mighty %1 has conquered the galaxy!").arg(winner->getName()), + i18n("Game Over")); + } + + if( (turnNumber == lastTurn) && !winner ) + { + mapWidget->repaint(true); + GameEndDlg *dlg = new GameEndDlg( this ); + + if( dlg->exec() == KDialogBase::Yes ) { + lastTurn += dlg->extraTurns(); + } + + delete dlg; + } + + if( winner || (turnNumber >= lastTurn) ) + { + // Game over, man! Game over. + + mapWidget->repaint(true); + + gameOver(); + }; +} + +//************************************************************************ +// determine the fate of the ships in transit +//************************************************************************ +void +GameBoard::resolveShipsInFlight() +{ + AttackFleetList arrivingShips; + PlayerListIterator nextPlayer( players ); + Player *plr; + + while( (plr = nextPlayer()) ) { + AttackFleetListIterator nextFleet( plr->getAttackList() ); + + AttackFleet *fleet; + + while( (fleet = nextFleet()) ) { + double fleetArrivalTurn = floor(fleet->arrivalTurn); + + if( turnNumber == int (fleetArrivalTurn) ) { + doFleetArrival( fleet ); + plr->getAttackList().removeRef( fleet ); + delete fleet; + } + } + } + +} + +Player * +GameBoard::findWinner() +{ + Player *winner = 0; + int activePlayers = 0; + + PlayerListIterator nextPlayer( players ); + Player *plr; + + while( (plr = nextPlayer()) ) { + if (plr->isInPlay()) + { + winner = plr; + activePlayers++; + } + else if (plr->getAttackList().count() != 0) + { + activePlayers++; + } + } + if (activePlayers == 1) + return winner; + + return 0; +} + +void +GameBoard::gameMsg(const QString &msg, Player *player, Planet *planet, Player *planetPlayer) +{ + bool isHumanInvolved = false; + + QString color = "white"; + QString colorMsg = msg; + QString plainMsg = msg; + + if (player) + { + if (!player->isAiPlayer()) + isHumanInvolved = true; + colorMsg = colorMsg.arg(playerString(player)); + plainMsg = plainMsg.arg(player->getName()); + } + + if (planet) + { + if (!planetPlayer) + planetPlayer = planet->getPlayer(); + if (!planetPlayer->isAiPlayer() && !planetPlayer->isNeutral()) + isHumanInvolved = true; + + QString color = planetPlayer->getColor().name(); + colorMsg = colorMsg.arg(QString("<font color=\"%1\">%2</font>").arg(color, planet->getName())); + plainMsg = plainMsg.arg(planet->getName()); + } + msgWidget->append(("<qt><font color=\"white\">Turn %1:</font> <font color=\""+color+"\">").arg(turnNumber)+colorMsg+"</font></qt>"); + msgWidget->scrollToBottom(); + + if (isHumanInvolved) + { + mapWidget->repaint(true); + KMessageBox::information(this, plainMsg); + } +} + +//************************************************************************ +// check to see any players have been eliminated +//************************************************************************ +void +GameBoard::scanForSurvivors() +{ + PlayerListIterator nextPlayer( players ); + PlayerList activePlayers; + PlayerList inactivePlayers; + + // insert all of the active players into a special + // list, the deactivate them + Player *plr; + while( (plr = nextPlayer()) ) { + if( plr->isInPlay() ) { + activePlayers.append( plr ); + plr->setInPlay( false ); + } else { + inactivePlayers.append( plr ); + } + } + + + // iterate through the list of planets and + // mark their owners in play + PlanetListIterator nextPlanet( planets ); + + Planet *planet; + while( (planet = nextPlanet()) ) { + planet->getPlayer()->setInPlay( true ); + } + + + PlayerListIterator nextActivePlayer( activePlayers ); + while( (plr = nextActivePlayer()) ) { + if( !plr->isInPlay() ) { + // Player has bitten the dust + QString msg; + msg = i18n("The once mighty empire of %1 has fallen in ruins."); + gameMsg(msg, plr); + } + } + + PlayerListIterator nextInactivePlayer( inactivePlayers ); + while( (plr = nextInactivePlayer()) ) { + if( plr->isInPlay() ) { + // Player has bitten the dust + QString msg; + msg = i18n("The fallen empire of %1 has staggered back to life."); + gameMsg(msg, plr); + } + } +} + +//************************************************************************ +// handle the arrival of a fleet at a planet +//************************************************************************ +void +GameBoard::doFleetArrival( AttackFleet *arrivingFleet ) +{ + // Check to see of (fleet owner) == (planet owner) + // if the planet and fleet owner are the same, then merge the fleets + // otherwise attack. + + if( (*arrivingFleet->owner) == (*arrivingFleet->destination->getPlayer())) { + if (!arrivingFleet->owner->isAiPlayer()) { + arrivingFleet->destination->getFleet().absorb(arrivingFleet); + + QString msg; + msg = i18n("Reinforcements (%1 ships) have arrived for planet %2.") + .arg(arrivingFleet->getShipCount()); + gameMsg(msg, 0, arrivingFleet->destination); + } + } else { + + // let's get ready to rumble... + + CoreLogic cl; + AttackFleet &attacker = *arrivingFleet; + DefenseFleet &defender = arrivingFleet->destination->getFleet(); + Planet &prizePlanet = *(arrivingFleet->destination); + + bool haveVictor = false; + bool planetHolds = true; + + while( !haveVictor ) { + double attackerRoll = cl.roll(); + double defenderRoll = cl.roll(); + + if( defenderRoll < prizePlanet.getKillPercentage() ) { + attacker.removeShips( 1 ); + } + + if( attacker.getShipCount() <= 0 ) { + haveVictor = true; + planetHolds = true; + continue; + } + + if( attackerRoll < attacker.killPercentage ) { + defender.removeShips( 1 ); + attacker.owner->statEnemyShipsDestroyed( 1 ); + } + + if( defender.getShipCount() <= 0 ) { + haveVictor = true; + planetHolds = false; + } + } + + if( planetHolds ) { + prizePlanet.getPlayer()->statEnemyFleetsDestroyed(1); + QString msg; + msg = i18n("Planet %2 has held against an attack from %1."); + gameMsg(msg, attacker.owner, &prizePlanet); + } else { + Player *defender = prizePlanet.getPlayer(); + attacker.owner->statEnemyFleetsDestroyed( 1 ); + + arrivingFleet->destination->conquer( arrivingFleet ); + + QString msg; + msg = i18n("Planet %2 has fallen to %1."); + gameMsg(msg, attacker.owner, &prizePlanet, defender); + } + } + + mapWidget->repaint(true); +} + +//************************************************************************ +// Set up the game board for a new game +//************************************************************************ +void +GameBoard::startNewGame() +{ + shutdownGame(); + + if( gameInProgress ) + return; + + NewGameDlg *newGame = new NewGameDlg( this, map, &players, neutralPlayer, &planets ); + + if( !newGame->exec() ) + { + delete newGame; + return; + } + newGame->save(); // Save settings for next time + + msgWidget->clear(); + + changeGameBoard( true ); + + planetInfo->setPlanetList(planets); + + shipCountEdit->hide(); + endTurn->setEnabled( true ); + + currentPlayer = new PlayerListIterator( players ); + currentPlayer->toFirst(); + + endTurn->show(); + gameMessage->show(); + + lastTurn = newGame->turns(); + + turnNumber = 1; + turn(); + + delete newGame; +} + +//************************************************************************ +// Shut down the current game +//************************************************************************ +void +GameBoard::shutdownGame() +{ + if( !gameInProgress ) + return; + + int choice = KMessageBox::warningContinueCancel + ( this, + i18n("Do you wish to retire this game?"), + i18n("End Game"), + KStdGuiItem::ok() ); + + if( choice == KMessageBox::Cancel ) + return; + + gameOver(); +} + +void +GameBoard::gameOver() +{ + ScoreDlg *scoreDlg = new ScoreDlg( this, i18n("Final Standings"), &players ); + scoreDlg->exec(); + + cleanupGame(); +} + +void +GameBoard::cleanupGame() +{ + map->clearMap(); + + planets.clear(); + players.clear(); + + delete currentPlayer; + currentPlayer = NULL; + + shipCountEdit->hide(); + endTurn->setEnabled( false ); + + gameMessage->hide(); + endTurn->hide(); + + changeGameBoard( false ); + gameState = NONE; + emit newGameState(gameState); +} + + +//************************************************************************ +// Player selected a planet +//************************************************************************ +void +GameBoard::planetSelected( Planet *planet ) +{ + switch( gameState ) { + case SOURCE_PLANET: + if( (*planet->getPlayer()) == (*currentPlayer->current()) ) { + // got a match + haveSourcePlanet = true; + sourcePlanet = planet; + + turn(); + } + + break; + + case RULER_SOURCE: + haveSourcePlanet = true; + sourcePlanet = planet; + turn(); + break; + + case DEST_PLANET: + case RULER_DEST: + if( planet != sourcePlanet ) { + // got a match + haveDestPlanet = true; + destPlanet = planet; + + turn(); + } + + break; + + default: + case NONE : + break; + } + +} + +//************************************************************************ +// Player hit return in the ship count edit box +//************************************************************************ +void +GameBoard::newShipCount() +{ + QString temp( shipCountEdit->text() ); + bool ok; + + switch( gameState ) { + case SHIP_COUNT: + shipCount = temp.toInt(&ok); + + if( ok ) + haveShipCount = true; + + shipCountEdit->setText( "" ); + + turn(); + break; + + default: + break; + }; + +} + +//********************************************************************** +// transition board from play to non-play +//********************************************************************** +void +GameBoard::changeGameBoard( bool inPlay ) +{ + gameInProgress = inPlay; + + if( gameInProgress ) { + mapWidget->show(); + planetInfo->show(); + gameMessage->show(); + endTurn->show(); + shipCountEdit->show(); + splashScreen->hide(); + setBackgroundColor( black ); + } else { + mapWidget->hide(); + planetInfo->hide(); + gameMessage->hide(); + endTurn->hide(); + shipCountEdit->hide(); + splashScreen->show(); + setBackgroundColor( black ); + } + +} + +//************************************************************************ +// Player clicked the 'End Turn' button +//************************************************************************ +void +GameBoard::nextPlayer() +{ + // end turn and advance to next player + Player *plr; + + while( (plr = ++(*currentPlayer)) && !(plr->isInPlay()) ) {} + + if( !plr ) { + // end of player list, new turn + currentPlayer->toFirst(); + nextTurn(); + } + + if( gameInProgress ) { + if (currentPlayer->current()->isAiPlayer()) { + gameState = AI_PLAYER; + } + else { + gameState = SOURCE_PLANET; + + } + turn(); + } +} + +//************************************************************************ +// A complete set of source, destination planets and ship count has been +// entered, so do something about it +//************************************************************************ +void +GameBoard::sendAttackFleet( Planet *source, Planet *dest, int ship ) +{ + bool ok; + + ok = currentPlayer->current()->NewAttack( source, dest, + ship, turnNumber ); + + if( !ok ) { + KMessageBox::error( this, + i18n("Not enough ships to send.") ); + } +} + +//************************************************************************ +// Toolbar items +//************************************************************************ +void +GameBoard::measureDistance() +{ + switch( gameState ) { + case SOURCE_PLANET: + gameState = RULER_SOURCE; + turn(); + default: + break; + } +} + +void +GameBoard::showScores() +{ + ScoreDlg *scoreDlg = new ScoreDlg( this, i18n("Current Standings"), &players ); + scoreDlg->show(); +} + +void +GameBoard::showFleets() +{ + FleetDlg *fleetDlg = new FleetDlg( this, &(currentPlayer->current()->getAttackList()) ); + fleetDlg->show(); +} diff --git a/konquest/gameboard.h b/konquest/gameboard.h new file mode 100644 index 00000000..5e3cddfa --- /dev/null +++ b/konquest/gameboard.h @@ -0,0 +1,119 @@ +#ifndef _GAMEBOARD_H_ +#define _GAMEBOARD_H_ + +#include <qwidget.h> + +#include "planet_info.h" +#include "map_widget.h" + +//************************************************************************ +// forward declarations +//************************************************************************ +class QSlider; +class QLabel; +class QListBox; +class QPushButton; +class QLineEdit; +class QTextEdit; + +enum GameState { NONE, SOURCE_PLANET, DEST_PLANET, SHIP_COUNT, RULER_SOURCE, RULER_DEST, AI_PLAYER }; + +//************************************************************************ +// GameBoard Widget +//************************************************************************ +class GameBoard : public QWidget +{ + Q_OBJECT + +public: + GameBoard( QWidget *parent ); + virtual ~GameBoard(); + + bool isGameInProgress(void) const { return gameInProgress; } + +// virtual QSize sizeHint() const; + +protected slots: + void startNewGame(); + void shutdownGame(); + void planetSelected( Planet * ); + void newShipCount(); + void nextPlayer(); + + //*************************************************************** + // Toolbar items + //*************************************************************** + void measureDistance(); + void showScores(); + void showFleets(); + +signals: + void newGameState( GameState newState ); + + //*************************************************************** + // Event Handlers + //*************************************************************** +protected: + virtual void keyPressEvent( QKeyEvent * ); + +private: + void turn(); + void nextTurn(); + void gameOver(); + + void resolveShipsInFlight(); + void sendAttackFleet( Planet *source, Planet *dest, int ships ); + void doFleetArrival( AttackFleet *arrivingFleet ); + void scanForSurvivors(); + + void gameMsg(const QString &msg, Player *player = 0, Planet *planet = 0, Player *planetPlayer = 0); + + void changeGameBoard( bool inPlay ); + void cleanupGame(); + Player *findWinner(); + + QString playerString(Player *player = 0); + + //*************************************************************** + // Game State information + //*************************************************************** + bool gameInProgress; + GameState gameState; + PlayerListIterator *currentPlayer; + + //*************************************************************** + // Display Widgets + //*************************************************************** + ConquestMap *mapWidget; + PlanetInfo *planetInfo; + QLabel *gameMessage; + QLabel *turnCounter; + QPushButton *endTurn; + QLineEdit *shipCountEdit; + QLabel *splashScreen; + QTextEdit *msgWidget; + + + //*************************************************************** + // Game objects + //*************************************************************** + int turnNumber; + int lastTurn; + + PlayerList players; + PlanetList planets; + Player *neutralPlayer; + Map *map; + + bool haveSourcePlanet; + Planet *sourcePlanet; + + bool haveDestPlanet; + Planet *destPlanet; + + bool haveShipCount; + int shipCount; + +}; + +#endif diff --git a/konquest/gamecore.cc b/konquest/gamecore.cc new file mode 100644 index 00000000..843c1a92 --- /dev/null +++ b/konquest/gamecore.cc @@ -0,0 +1,646 @@ +#include "gamecore.h" +#include "gamecore.moc" + +#include <stddef.h> +#include <math.h> + +#include <config.h> + +//******************************************************************* +// Game Core Logic +//******************************************************************* + +bool CoreLogic::class_init = false; + +CoreLogic::CoreLogic() +{ + random.setSeed(0); +} + +void +CoreLogic::generatePlanetCoordinates( int &x, int &y ) +{ + // 0 - 15 + x = random.getLong(16); + y = random.getLong(16); +} + +double +CoreLogic::generateKillPercentage() +{ + // 0.30 - 0.90 + return 0.30 + random.getDouble()*0.60; +} + +int +CoreLogic::generatePlanetProduction() +{ + // 5 - 15 + return 5 + random.getLong(10); +} + +double +CoreLogic::generateMorale() +{ + // constant + return 0.50; +} + +double +CoreLogic::distance( Planet *p1, Planet *p2 ) +{ + int k = (p1->getSector().getRow() - p2->getSector().getRow()) / 2; + int l = (p1->getSector().getColumn() - p2->getSector().getColumn()) / 2; + + return sqrt(double((k*k) + (l*l))); +} + +double +CoreLogic::roll() +{ + // 0.00 - 1.00 + return random.getDouble(); +} + +//--------------------------------------------------------------------------- +// class Map +//--------------------------------------------------------------------------- + + +Map::Map() + : QObject( 0, 0 ), freezeUpdates( false ), + rows( BOARD_ROWS ), columns( BOARD_COLS ), + hasSelectedSector( false ) +{ + // initialize the grid of Sectors + for( int x = 0; x < rows; x++ ) + { + for( int y = 0; y < columns; y++ ) + { + grid[x][y] = Sector( this, x, y ); + connect( &grid[x][y], SIGNAL( update() ), this, SLOT( childSectorUpdate() )); + } + } +} + +Map::~Map() +{ +} + +void +Map::populateMap( PlayerList &players, Player *neutral, + int numNeutralPlanets, PlanetList &thePlanets ) +{ + Freeze(); + + int index = 0; + QString names( "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890!@#$%^&*(),.<>;:[]{}/?-+\\|" ); + + // Create a planet for each player + Player *plr; + for( plr = players.first(); plr != 0; plr = players.next() ) + { + QString newName( names.mid( index++, 1 ) ); + Sector § = findRandomFreeSector(); + Planet *plrPlanet = Planet::createPlayerPlanet( sect, plr, newName ); + + thePlanets.append( plrPlanet ); + } + + for( int x = 0; x < numNeutralPlanets; x++ ) + { + QString newName( names.mid( index++, 1 ) ); + Sector § = findRandomFreeSector(); + Planet *neutralPlanet = Planet::createNeutralPlanet( sect, neutral, newName ); + + thePlanets.append( neutralPlanet ); + } + + Thaw(); + + emit update(); +} + +void +Map::clearMap() +{ + Freeze(); + + int x,y; + + for( x = 0; x < rows; x++ ) + for( y = 0; y < columns; y++ ) + { + grid[x][y].removePlanet(); + } + + + Thaw(); + + emit update(); +} + +Sector & +Map::findRandomFreeSector() +{ + CoreLogic cl; + + bool found = false; + + while( !found ) + { + int x,y; + + cl.generatePlanetCoordinates( x,y ); + + if( !grid[x][y].hasPlanet() ) + { + return grid[x][y]; + } + } + + // TODO: get rid of this + return grid[0][0]; + +} + +bool +Map::selectedSector( int &x, int &y ) const +{ + if( hasSelectedSector) + { + x = sel_x; + y = sel_y; + } + + return hasSelectedSector; + +} + +void +Map::setSelectedSector( int x, int y ) +{ + hasSelectedSector = true; + sel_x = x; + sel_y = y; + + emit update(); +} + +void +Map::setSelectedSector( const Planet &planet ) +{ + hasSelectedSector = true; + sel_x = planet.getSector().getRow(); + sel_y = planet.getSector().getColumn(); + + emit update(); +} + +void +Map::setSelectedSector() +{ + hasSelectedSector = false; + + emit update(); +} + + +void Map::childSectorUpdate() +{ + if( !freezeUpdates ) + emit update(); +} + +void Map::Freeze() +{ + freezeUpdates = true; +} + +void Map::Thaw() +{ + freezeUpdates = false; +} + +Sector &Map::getSector( int x, int y ) +{ + return grid[x][y]; +} + +const int Map::getRows() const +{ + return rows; +} + +const int Map::getColumns() const +{ + return columns; +} + +//--------------------------------------------------------------------------- +// class Sector +//--------------------------------------------------------------------------- + +Sector::Sector() +: QObject(0,0), planet( NULL ), parentMap(NULL ), x(0), y(0) +{} + +Sector::Sector( Map *newParentMap, int xPos, int yPos ) +: QObject(0,0), planet(NULL), parentMap( newParentMap ), x(xPos), y(yPos) +{ +} + +Sector::Sector( const Sector & other ) +: QObject(0,0), planet(other.planet), parentMap(other.parentMap), x(other.x), y(other.y) +{ +} + +bool Sector::hasPlanet() const +{ + return (planet != NULL); +} + + +void Sector::setPlanet( Planet *newPlanet ) +{ + planet = newPlanet; + + connect( planet, SIGNAL( update() ), this, SLOT( childPlanetUpdate() ) ); + + emit update(); +} + +Planet *Sector::getPlanet() +{ + return planet; +} + +void Sector::removePlanet() +{ + planet = NULL; + + emit update(); +} + + +void Sector::childPlanetUpdate() +{ + emit update(); +} + +Sector & +Sector::operator=( const Sector &other ) +{ + x = other.x; + y = other.y; + planet = other.planet; + parentMap = other.parentMap; + + return *this; +} + +void +Sector::select() +{ + parentMap->setSelectedSector( x, y ); + emit selected(); +} + +int Sector::getRow() +{ + return x; +} + +int Sector::getColumn() +{ + return y; +} + +//--------------------------------------------------------------------------- +// class Planet +//--------------------------------------------------------------------------- + +Planet::Planet( QString planetName, Sector &newParentSector, Player *initialOwner, + int newProd, double newKillP, double newMorale ) + : QObject(0,0), name(planetName), owner(initialOwner), parentSector(newParentSector), + homeFleet( this, newProd ), killPercentage(newKillP), morale( newMorale ), productionRate(newProd) + + +{ + parentSector.setPlanet( this ); +} + +Planet::~Planet() {} + +Planet * +Planet::createPlayerPlanet( Sector &parentSector, Player *initialOwner, QString planetName ) +{ + CoreLogic clogic; + + double morale = clogic.generateMorale(); + + return new Planet( planetName, parentSector, initialOwner, + 10, 0.400, morale ); +} + +Planet * +Planet::createNeutralPlanet( Sector &parentSector, Player *initialOwner, QString planetName ) +{ + CoreLogic clogic; + double morale = clogic.generateMorale(); + + double killP = clogic.generateKillPercentage(); + + int productionRate = (int)clogic.generatePlanetProduction(); + + return new Planet( planetName, parentSector, + initialOwner, productionRate, killP, morale ); +} + +double +Planet::getKillPercentage() +{ + return killPercentage; +} + +void +Planet::setKillPercentage( double newValue ) +{ + killPercentage = newValue; + + emit update(); +} + +double +Planet::getMorale() +{ + return morale; +} + +void +Planet::setMorale( double newMorale ) +{ + morale = newMorale; +} + +int +Planet::getProduction() +{ + return productionRate; +} + +void +Planet::setProduction( int newProduction ) +{ + productionRate = newProduction; +} + +void +Planet::select() +{ + parentSector.select(); + + emit selected(); +} + +DefenseFleet &Planet::getFleet() +{ + return homeFleet; +} + +Player * +Planet::getPlayer() const +{ + return owner; +} + +const QString & +Planet::getName() const +{ + return name; +} + +Sector & +Planet::getSector() const +{ + return parentSector; +} + +void +Planet::conquer( AttackFleet *conqueringFleet ) +{ + owner = conqueringFleet->owner; + owner->statPlanetsConquered(1); + homeFleet.become( conqueringFleet ); +} + +void +Planet::coup( Player *luckyPlayer ) +{ + owner = luckyPlayer; +} + +void +Planet::turn() +{ + if( !(owner->isNeutral()) ) { + homeFleet.addShips( productionRate ); + owner->statShipsBuilt( productionRate ); + } else { + homeFleet.addShips( 1 ); + } +} + +//--------------------------------------------------------------------------- +// class Player +//--------------------------------------------------------------------------- +Player::Player( QString newName, QColor newColor, int newPlrNum, bool isAi ) : name( newName ), color( newColor ), +playerNum( newPlrNum ), inPlay( true ), aiPlayer( isAi ), shipsBuilt(0), planetsConquered(0), fleetsLaunched(0), +enemyFleetsDestroyed(0), enemyShipsDestroyed(0) +{ +} + +Player::~Player() +{ +} + +bool +Player::operator==( const Player &otherPlayer ) const +{ + if( playerNum == otherPlayer.playerNum ) + return true; + else + return false; +} + +QString & +Player::getName() +{ + return name; +} + +QString +Player::getColoredName() +{ + return QString("<font color=\"%1\">%2</font>").arg(color.name(), name); +} + +Player *Player::createPlayer( QString newName, QColor color, int playerNum, bool isAi ) +{ + return new Player( newName, color, playerNum, isAi ); +} + +Player *Player::createNeutralPlayer() +{ + return new Player( QString::null, gray, NEUTRAL_PLAYER_NUMBER, false ); +} + +QColor &Player::getColor() +{ + return color; +} + +bool +Player::isNeutral() +{ + if( playerNum == NEUTRAL_PLAYER_NUMBER ) { + return true; + } else { + return false; + } +} + +bool Player::isInPlay() +{ + return inPlay; +} + +void Player::setInPlay( bool status ) +{ + inPlay = status; +} + +AttackFleetList & +Player::getAttackList() +{ + return attackList; +} + +bool +Player::NewAttack( Planet *sourcePlanet, Planet *destPlanet, int shipCount, int turn ) +{ + CoreLogic cl; + + double arrival = cl.distance( sourcePlanet, destPlanet ) + turn; + + AttackFleet *fleet = sourcePlanet->getFleet().spawnAttackFleet( destPlanet, shipCount, arrival ); + + + if( fleet ) { + attackList.append(fleet); + + statFleetsLaunched( 1 ); + + return true; + } + + return false; +} + +// Player Statistics collection +void Player::statShipsBuilt( int x ) +{ + shipsBuilt += x; +} + +void Player::statPlanetsConquered( int x ) +{ + planetsConquered += x; +} + +void Player::statFleetsLaunched( int x ) +{ + fleetsLaunched += x; +} + +void Player::statEnemyFleetsDestroyed( int x ) +{ + enemyFleetsDestroyed += x; +} + +void Player::statEnemyShipsDestroyed( int x ) +{ + enemyShipsDestroyed += x; +} + +bool Player::isAiPlayer() { + return aiPlayer; +} + +//--------------------------------------------------------------------------- +// class Fleet +// \---class AttackFleet +// \---class DefenseFleet +//--------------------------------------------------------------------------- + + +Fleet::Fleet( int initialShipCount ) +: shipCount( initialShipCount ) +{ +} + +int +Fleet::getShipCount() +{ + return shipCount; +} + +void +Fleet::removeShips( int lostShips ) +{ + shipCount -= lostShips; +} + +AttackFleet::AttackFleet( Planet *source, Planet *dest, int initialCount, double arrival ) +: Fleet( initialCount ), owner( source->getPlayer() ), destination( dest ), arrivalTurn( arrival ), +killPercentage( source->getKillPercentage() ) +{ +} + +DefenseFleet::DefenseFleet( Planet *newHome, int initialCount ) : Fleet( initialCount ), home( newHome ) +{ +} + +void +DefenseFleet::absorb( AttackFleet *fleet ) +{ + shipCount += fleet->getShipCount(); +} + +void +DefenseFleet::become( AttackFleet *fleet ) +{ + shipCount = fleet->getShipCount(); +} + + +AttackFleet * +DefenseFleet::spawnAttackFleet( Planet *dest, int count, double arrivalTurn ) +{ + if( shipCount < count ) { + return NULL; + } + + AttackFleet *newFleet = new AttackFleet( home, dest, count, arrivalTurn ); + + removeShips( count ); + + return newFleet; +} + +void +DefenseFleet::addShips( int newShips ) +{ + shipCount += newShips; +} + diff --git a/konquest/gamecore.h b/konquest/gamecore.h new file mode 100644 index 00000000..c8c7c39a --- /dev/null +++ b/konquest/gamecore.h @@ -0,0 +1,331 @@ +#ifndef _GAMECORE_H_ +#define _GAMECORE_H_ + +#include <krandomsequence.h> + +#include <qobject.h> +#include <qstring.h> +#include <qcolor.h> +#include <qptrlist.h> + +// Board Size Constants +#define BOARD_ROWS 16 +#define BOARD_COLS 16 + +// Maximum Number of Players +#define MAX_PLAYERS 10 + + +//********************************************************** +// Forward declarations for classes in this file +//********************************************************** +class Player; +class Planet; +class Sector; +class Map; +class Fleet; + + +//********************************************************** +// Core Logic routines +//********************************************************** + +class CoreLogic +{ +public: + CoreLogic(); + + void generatePlanetCoordinates( int &x, int &y ); + double generateKillPercentage(); + int generatePlanetProduction(); + double generateMorale(); + + double distance( Planet *p1, Planet *p2 ); + + double roll(); + +private: + KRandomSequence random; + static bool class_init; +}; + + +//********************************************************** +// class Fleet +// \--- class AttackFleet +// \--- class DefenseFleet +//********************************************************** + +class Fleet : public QObject +{ + +public: + + Fleet( int initialShipCount ); + virtual ~Fleet() {} + + int getShipCount(); + void removeShips( int lostShips ); + +protected: + int shipCount; +}; + +class AttackFleet : public Fleet +{ + +public: + AttackFleet( Planet *source, Planet *dest, int initialCount, double arrivalTurn ); + + Player *owner; + Planet *destination; + double arrivalTurn; + double killPercentage; + +}; + + +class DefenseFleet : public Fleet +{ + +public: + DefenseFleet( Planet *newHome, int initialCount ); + + void absorb( AttackFleet *fleet ); + void become( AttackFleet *fleet ); + + void addShips( int newShips ); + + AttackFleet *spawnAttackFleet( Planet *destination, int shipCount, double arrivalTurn ); + + Planet *home; + +}; + + +//************************************************************** +// class Player +//************************************************************** + +class Player : public QObject +{ + +public: + Player( QString newName, QColor color, int number, bool isAi ); + virtual ~Player(); + + enum { NEUTRAL_PLAYER_NUMBER = -1 }; + +public: + QString &getName(); + QString getColoredName(); + QColor &getColor(); + bool isNeutral(); + QPtrList<AttackFleet> &getAttackList(); + + // factory functions + static Player *createPlayer( QString newName, QColor newColor, int playerNum, bool isAi ); + static Player *createNeutralPlayer(); + + bool NewAttack( Planet *sourcePlanet, Planet *destPlanet, int shipCount, int departureTurn ); + + bool operator==( const Player &otherPlayer ) const; + + bool isInPlay(); + void setInPlay( bool ); + +private: + QString name; + QColor color; + int playerNum; + bool inPlay; + bool aiPlayer; + + QPtrList<AttackFleet> attackList; + + // statistics counters + int shipsBuilt; + int planetsConquered; + int fleetsLaunched; + int enemyFleetsDestroyed; + int enemyShipsDestroyed; + +public: + void statShipsBuilt( int ); + void statPlanetsConquered( int ); + void statFleetsLaunched( int ); + void statEnemyFleetsDestroyed( int ); + void statEnemyShipsDestroyed( int ); + + int getShipsBuilt() { return shipsBuilt; } + int getPlanetsConquered() { return planetsConquered; } + int getFleetsLaunched() { return fleetsLaunched; } + int getEnemyFleetsDestroyed() { return enemyFleetsDestroyed; } + int getEnemyShipsDestroyed() { return enemyShipsDestroyed; } + bool isAiPlayer(); + +}; + + +//************************************************************** +// class Planet +//************************************************************** + +class Planet : public QObject +{ + Q_OBJECT + +private: + + Planet( QString planetName, Sector &newParentSector, + Player *initialOwner, int newProd, + double newKillP, double newMorale ); + +public: + virtual ~Planet(); + + static Planet *createPlayerPlanet( Sector &parentSector, + Player *initialOwner, QString planetName ); + static Planet *createNeutralPlanet( Sector &parentSector, + Player *initialOwner, QString planetName ); + + Sector &getSector() const; + Player *getPlayer() const; + const QString &getName() const; + DefenseFleet &getFleet(); + + double getKillPercentage(); + void setKillPercentage( double newValue ); + double getMorale(); + void setMorale( double ); + int getProduction(); + void setProduction( int ); + + void select(); + void conquer( AttackFleet *conqueringFleet ); + void coup( Player *luckyPlayer ); + void turn(); + +signals: + void update(); + void selected(); + +private: + QString name; + Player *owner; + Sector &parentSector; + DefenseFleet homeFleet; + + double killPercentage; + double morale; + int productionRate; +}; + +//*************************************************************** +// class Sector +//*************************************************************** + +class Sector : public QObject +{ + Q_OBJECT + +public: + + // constructors + Sector(); + Sector( Map *parentMap, int xpos, int ypos ); + Sector( const Sector & ); + + // assignment operator (makes initialization easy) + Sector &operator=( const Sector & ); + + bool hasPlanet() const; + void setPlanet( Planet *newPlanet ); + Planet *getPlanet(); + void removePlanet(); + + void select(); + + int getRow(); + int getColumn(); + +signals: + void update(); + void selected(); + +protected slots: + void childPlanetUpdate( ); + + +protected: + Planet *planet; // a sector has 0 or 1 planets + Map *parentMap; + int x, y; + +}; + +//***************************************************************** +// class Map +//***************************************************************** + +class Map : public QObject +{ + Q_OBJECT + +public: + Map(); + virtual ~Map(); + + const int getRows() const; + const int getColumns() const; + + void populateMap( QPtrList<Player> &players, Player *neutral, + int numNeutralPlanets, QPtrList<Planet> &thePlanets ); + void clearMap(); + + bool selectedSector( int &x, int &y ) const; + void setSelectedSector( int x, int y ); + void setSelectedSector( const Planet & ); + void setSelectedSector(); + + Sector &getSector( int x, int y ); + +protected slots: + void childSectorUpdate(); + +signals: + void update(); + +protected: + void Freeze(); + void Thaw(); + bool freezeUpdates; + +private: + Sector &findRandomFreeSector(); + +protected: + Sector grid[BOARD_ROWS][BOARD_COLS]; // a map is a 2-D array of sectors; + const int rows; // size of grid in sectors + const int columns; + + // This is used to implement a selected sector, + // one who's boarder flashes. + bool hasSelectedSector; + int sel_x, sel_y; +}; + +//--------------------------------------------------------------------------------- +// Typedefs +//--------------------------------------------------------------------------------- +typedef QPoint Coordinate; // Gotta start using this instead of int x,y crap +typedef QPtrList<AttackFleet> AttackFleetList; +typedef QPtrListIterator<AttackFleet> AttackFleetListIterator; +typedef QPtrList<Player> PlayerList; +typedef QPtrList<Planet> PlanetList; +typedef QPtrListIterator<Player> PlayerListIterator; +typedef QPtrListIterator<Planet> PlanetListIterator; + +#endif // _GAMECORE_H_ + + diff --git a/konquest/gameenddlg.cc b/konquest/gameenddlg.cc new file mode 100644 index 00000000..080a8477 --- /dev/null +++ b/konquest/gameenddlg.cc @@ -0,0 +1,76 @@ +#include <qlabel.h> +#include <qlayout.h> +#include <qslider.h> +#include <qvbox.h> + +#include <kapplication.h> +#include <kconfig.h> +#include <klocale.h> +#include <kstdguiitem.h> + +#include "gameenddlg.h" +#include "gameenddlg.moc" + +GameEndDlg::GameEndDlg( QWidget *parent ) + : KDialogBase( i18n("Out of Turns"), + KDialogBase::Yes|KDialogBase::No, KDialogBase::Yes, KDialogBase::No, + parent, "end_game_dialog", true, true ) +{ + QVBox *page = makeVBoxMainWidget(); + + // Create controls + QLabel *label1 = new QLabel( i18n("This is the last turn.\nDo you wish to add extra turns?")+"\n\n", page ); + label1->setAlignment( AlignCenter ); + + turnCountLbl = new QLabel( page ); + turnCount = new QSlider( 1, 40, 1, 5, Qt::Horizontal, page ); + + KGuiItem addTurns(i18n("&Add Turns"), QString::null, QString::null, + i18n("Add the specified number of turns to the game and continue playing.")); + KGuiItem gameOver(i18n("&Game Over"), QString::null, QString::null, + i18n("Terminate the current game.")); + + setButtonGuiItem(KDialogBase::Yes, addTurns); + setButtonGuiItem(KDialogBase::No, gameOver); + + init(); + + connect( turnCount, SIGNAL(valueChanged( int )), this, SLOT(turnCountChange( int )) ); +} + +GameEndDlg::~GameEndDlg() +{ +} + +void +GameEndDlg::init() +{ + KConfig *config = kapp->config(); + config->setGroup("Game"); + int turns = config->readNumEntry("ExtraTurns", 10); + turnCount->setValue(turns); + turnCountChange(turns); +} + +void +GameEndDlg::slotYes() +{ + KConfig *config = kapp->config(); + config->setGroup("Game"); + config->writeEntry("ExtraTurns", extraTurns()); + config->sync(); + KDialogBase::slotYes(); +} + +int +GameEndDlg::extraTurns() +{ + return turnCount->value(); +} + +void +GameEndDlg::turnCountChange( int newTurnCount ) +{ + QString newLbl = i18n("Extra turns: %1").arg( newTurnCount ); + turnCountLbl->setText( newLbl); +} diff --git a/konquest/gameenddlg.h b/konquest/gameenddlg.h new file mode 100644 index 00000000..d1c982e3 --- /dev/null +++ b/konquest/gameenddlg.h @@ -0,0 +1,32 @@ +#ifndef _GAMEENDDLG_H_ +#define _GAMEENDDLG_H_ + +#include <kdialogbase.h> + +class QSlider; +class QPushButton; + +class GameEndDlg : public KDialogBase +{ + Q_OBJECT + +public: + GameEndDlg( QWidget *parent ); + virtual ~GameEndDlg(); + + int extraTurns(); + +private: + void init(); + +private slots: + void turnCountChange( int ); + void slotYes(); + +private: + QSlider *turnCount; + QLabel *turnCountLbl; +}; + +#endif // _GAMEENDDLG_H_ + diff --git a/konquest/hi128-app-konquest.png b/konquest/hi128-app-konquest.png Binary files differnew file mode 100644 index 00000000..3d980350 --- /dev/null +++ b/konquest/hi128-app-konquest.png diff --git a/konquest/hi16-app-konquest.png b/konquest/hi16-app-konquest.png Binary files differnew file mode 100644 index 00000000..87f6a2d5 --- /dev/null +++ b/konquest/hi16-app-konquest.png diff --git a/konquest/hi22-app-konquest.png b/konquest/hi22-app-konquest.png Binary files differnew file mode 100644 index 00000000..c9165e2f --- /dev/null +++ b/konquest/hi22-app-konquest.png diff --git a/konquest/hi32-app-konquest.png b/konquest/hi32-app-konquest.png Binary files differnew file mode 100644 index 00000000..fc252dfe --- /dev/null +++ b/konquest/hi32-app-konquest.png diff --git a/konquest/hi48-app-konquest.png b/konquest/hi48-app-konquest.png Binary files differnew file mode 100644 index 00000000..bd67b1b9 --- /dev/null +++ b/konquest/hi48-app-konquest.png diff --git a/konquest/hi64-app-konquest.png b/konquest/hi64-app-konquest.png Binary files differnew file mode 100644 index 00000000..7014729e --- /dev/null +++ b/konquest/hi64-app-konquest.png diff --git a/konquest/images.h b/konquest/images.h new file mode 100644 index 00000000..4c436a18 --- /dev/null +++ b/konquest/images.h @@ -0,0 +1,17 @@ +#ifndef _IMAGES_H +#include <kstandarddirs.h> +#define _IMAGES_H + +#define IMAGE_SPLASH locate("appdata", "pics/konquest-splash.png") +#define IMAGE_PLANET_1 locate("appdata", "pics/planet1.xpm") +#define IMAGE_PLANET_2 locate("appdata", "pics/planet2.xpm") +#define IMAGE_PLANET_3 locate("appdata", "pics/planet3.xpm") +#define IMAGE_PLANET_4 locate("appdata", "pics/planet4.xpm") +#define IMAGE_PLANET_5 locate("appdata", "pics/planet5.xpm") +#define IMAGE_PLANET_6 locate("appdata", "pics/planet6.xpm") +#define IMAGE_PLANET_7 locate("appdata", "pics/planet7.xpm") +#define IMAGE_PLANET_8 locate("appdata", "pics/planet8.xpm") +#define IMAGE_PLANET_9 locate("appdata", "pics/planet9.xpm") + +#endif // _IMAGES_H + diff --git a/konquest/int_validator.cc b/konquest/int_validator.cc new file mode 100644 index 00000000..85fd1779 --- /dev/null +++ b/konquest/int_validator.cc @@ -0,0 +1,53 @@ +#include <limits.h> + +#include "int_validator.h" +#include "int_validator.moc" + +IntValidator::IntValidator( QWidget *parent, const char *name ) : + QValidator( parent, name ) +{ +#ifdef INT_MIN + v_bottom = INT_MIN; +#else + v_bottom = ~INT_MAX; +#endif + v_top = INT_MIN; +} + +IntValidator::IntValidator( int bottom, int top, QWidget *parent, const char *name ) : +QValidator( parent, name ) +{ + v_bottom = bottom; + v_top = top; +} + +IntValidator::~IntValidator() {} + +QValidator::State +IntValidator::validate( QString &input, int & ) const +{ + if( input.isEmpty() ) { + return QValidator::Valid; + } else { + bool ok; + + int value = input.toInt( &ok ); + + if( !ok ) + return QValidator::Invalid; + + if( value < v_bottom || value > v_top ) + return QValidator::Valid; + + return QValidator::Acceptable; + } +} + +void +IntValidator::setRange( int b, int t ) +{ + v_bottom = b; + v_top = t; +} + + diff --git a/konquest/int_validator.h b/konquest/int_validator.h new file mode 100644 index 00000000..e5973fee --- /dev/null +++ b/konquest/int_validator.h @@ -0,0 +1,31 @@ +#ifndef _INT_VALIDATOR_H_ +#define _INT_VALIDATOR_H_ + +#include <qvalidator.h> + + +class IntValidator : public QValidator +{ + Q_OBJECT + +public: + IntValidator( QWidget *parent, const char *name = 0 ); + IntValidator( int bottom, int top, QWidget *parent, const char *name = 0 ); + + virtual ~IntValidator(); + + virtual QValidator::State validate( QString &, int & ) const; + + virtual void setRange( int bottom, int top ); + + int bottom() const { return v_bottom; } + int top() const { return v_top; } + +private: + int v_bottom, v_top; +}; + + + +#endif /* _INT_VALIDATOR_H_ */ + diff --git a/konquest/konquest.desktop b/konquest/konquest.desktop new file mode 100644 index 00000000..e300059d --- /dev/null +++ b/konquest/konquest.desktop @@ -0,0 +1,74 @@ +[Desktop Entry] +Icon=konquest +Name=Konquest +Name[ar]=لعبة الإحتلال (Konquest) +Name[be]=Заваёва +Name[bn]=কনকোয়েস্ট +Name[br]=KAloubadur +Name[da]=Erobring +Name[eo]=Konkero +Name[et]=Vallutus +Name[hi]=कॉन्क्वेस्ट +Name[hu]=Hódítás +Name[is]=Geimstyrjöld +Name[lt]=Užkariautojas +Name[ne]=कनक्वेष्ट +Name[pt]=Conquista +Name[ta]=கான்க்குவெஸ்ட் +Name[tg]=Истило +Name[zh_TW]=Konquest 征服 +Exec=konquest %i %m -caption %c +Type=Application +GenericName=Galactic Strategy Game +GenericName[be]=Стратэгічная галактычная гульня +GenericName[bg]=Галактическа игра +GenericName[bn]=গ্যালাকটিক কৌশলের খেলা +GenericName[bs]=Galaktička strateška igra +GenericName[ca]=Joc d'estratègia galàctica +GenericName[cs]=Strategická galaktická hra +GenericName[cy]=Gêm Strategaeth Galaethol +GenericName[da]=Galaktisk strategispil +GenericName[de]=Galaktisches Strategiespiel +GenericName[el]=Γαλαξιακό παιχνίδι στρατηγικής +GenericName[eo]=Galaksia Strategiludo +GenericName[es]=Juego de estrategia espacial +GenericName[et]=Galaktiline strateegiamäng +GenericName[eu]=Estrategia galaktikoaren jokoa +GenericName[fa]=بازی Galactic Strategy +GenericName[fi]=Galaktinen avaruuspeli +GenericName[fr]=Jeu de stratégie galactique +GenericName[he]=משחק אסטרטגיה גלקטי +GenericName[hr]=Galaktička igra strategije +GenericName[hu]=Stratégiai +GenericName[is]=Herkænskuleikur +GenericName[it]=Gioco galattico di strategia +GenericName[ja]=宇宙戦略ゲーム +GenericName[km]=ល្បែងយុទ្ធសាស្ត្រផ្កាយ +GenericName[ko]=우주 전략 게임 +GenericName[lt]=Galaktikos strateginis žaidimas +GenericName[lv]=Stratēģiska kosmiskā spēle +GenericName[mk]=Игра на галактичка стратегија +GenericName[nb]=Strategispillet Galactic +GenericName[nds]= Galaktsch Strategiespeel +GenericName[ne]=ग्यालाक्टिक रणनीति खेल +GenericName[nl]=Strategisch ruimtespel +GenericName[nn]=Strategispelet Galactic +GenericName[pl]=Gra strategiczna w kosmosie +GenericName[pt]=Jogo de Estratégia Galáctica +GenericName[pt_BR]=Jogo de Estratégia galáctico +GenericName[ru]=Завоевание +GenericName[se]=Strategiijaspeallu Galactic +GenericName[sk]=Galaktická strategická hra +GenericName[sl]=Galaktična strateška igra +GenericName[sr]=Галактичка стратешка игра +GenericName[sr@Latn]=Galaktička strateška igra +GenericName[sv]=Galaktiskt strategispel +GenericName[ta]=கலாட்டிக் தந்திர விளையாட்டு +GenericName[uk]=Галактична гра на стратегію +GenericName[wa]=Djeu di stratedjeye galactike +GenericName[zh_TW]=銀河戰略遊戲 +Terminal=false +DocPath=konquest/index.html +X-KDE-StartupNotify=true +X-DCOP-ServiceType=Multi +Categories=Qt;KDE;Game;StrategyGame; diff --git a/konquest/konquestui.rc b/konquest/konquestui.rc new file mode 100644 index 00000000..aff9e71a --- /dev/null +++ b/konquest/konquestui.rc @@ -0,0 +1,21 @@ +<!DOCTYPE kpartgui> +<kpartgui name="konquest" version="1"> + +<MenuBar> + <Menu name="game"><text>&Game</text> + <Action name="game_measure"/> + <Action name="game_scores"/> + <Action name="game_fleets"/> + </Menu> +</MenuBar> + +<ToolBar name="mainToolBar"><text>Main Toolbar</text> + <Action name="game_new"/> + <Action name="game_end"/> + <Separator/> + <Action name="game_measure"/> + <Action name="game_scores"/> + <Action name="game_fleets"/> +</ToolBar> + +</kpartgui> diff --git a/konquest/mainwin.cc b/konquest/mainwin.cc new file mode 100644 index 00000000..496d3ac0 --- /dev/null +++ b/konquest/mainwin.cc @@ -0,0 +1,77 @@ +#include <config.h> + +#include <qpushbutton.h> + +#include <kapplication.h> +#include <klocale.h> +#include <kglobal.h> +#include <kmenubar.h> +#include <ktoolbar.h> +#include <kiconloader.h> +#include <kaction.h> +#include <kstdaction.h> +#include <kstdgameaction.h> + +#include "version.h" +#include "gamecore.h" +#include "mainwin.h" +#include "mainwin.moc" +#include "gameboard.h" + +// KonquestMainWindow + + +MainWindow::MainWindow() +{ + setCaption( i18n("Galactic Conquest") ); + + setupGameBoard(); + setupKAction(); + setupGUI(); +} + +MainWindow::~MainWindow() +{ +} + +void +MainWindow::setupKAction() +{ + KStdGameAction::gameNew( gameBoard, SLOT( startNewGame() ), actionCollection() ); + KStdGameAction::quit( this, SLOT( close() ), actionCollection() ); + endAction = KStdGameAction::end( gameBoard, SLOT( shutdownGame() ), actionCollection() ); + endAction->setEnabled(false); + + //AB: there is no icon for disabled - KToolBar::insertButton shows the + //different state - KAction not :-( + measureAction = new KAction( i18n("&Measure Distance"), "ruler", 0, gameBoard, SLOT( measureDistance() ), actionCollection(), "game_measure" ); + measureAction->setEnabled(false); + standingAction = new KAction( i18n("&Show Standings"), "help", 0, gameBoard, SLOT( showScores() ), actionCollection(), "game_scores" ); + standingAction->setEnabled(false); + fleetAction = new KAction( i18n("&Fleet Overview"), "launch", 0, gameBoard, SLOT( showFleets() ), actionCollection(), "game_fleets" ); + fleetAction->setEnabled(false); + toolBar()->setBarPos( KToolBar::Left ); + toolBar()->setMovingEnabled( false ); +} + +void +MainWindow::setupGameBoard() +{ + gameBoard = new GameBoard( this ); + setCentralWidget(gameBoard); + + connect( gameBoard, SIGNAL( newGameState( GameState )), this, SLOT( gameStateChange( GameState ) ) ); +} + + +void +MainWindow::gameStateChange( GameState newState ) +{ + endAction->setEnabled( gameBoard->isGameInProgress() ); + measureAction->setEnabled( newState==SOURCE_PLANET ); + standingAction->setEnabled( newState==SOURCE_PLANET ); + fleetAction->setEnabled( newState==SOURCE_PLANET ); +} + + + diff --git a/konquest/mainwin.h b/konquest/mainwin.h new file mode 100644 index 00000000..2954039c --- /dev/null +++ b/konquest/mainwin.h @@ -0,0 +1,33 @@ +#ifndef _MAIN_WIN_H +#define _MAIN_WIN_H + +#include <kmainwindow.h> + +#include "gameboard.h" + +class ConquestMap; +class PlanetStatusTable; + +class MainWindow : public KMainWindow +{ + Q_OBJECT + +public: + MainWindow(); + ~MainWindow(); + +protected: + void setupKAction(); + void setupGameBoard(); + +private: + GameBoard *gameBoard; + KAction *endAction, *measureAction, *standingAction, *fleetAction; + +private slots: + void gameStateChange( GameState ); + +}; + +#endif + diff --git a/konquest/map_widget.cc b/konquest/map_widget.cc new file mode 100644 index 00000000..9bb1a632 --- /dev/null +++ b/konquest/map_widget.cc @@ -0,0 +1,243 @@ +#include <qpixmap.h> +#include <qpainter.h> +#include <qcolor.h> + +#include <kapplication.h> +#include <kiconloader.h> +#include <kglobalsettings.h> + +#include <kglobal.h> +#include "map_widget.moc" + +ConquestMap::ConquestMap( Map *newMap, QWidget *parent ) + : QGridView( parent ), + SECTOR_HEIGHT( 28 ), SECTOR_WIDTH( 28 ), + BOARD_HEIGHT( newMap->getRows() * SECTOR_HEIGHT ), + BOARD_WIDTH( newMap->getColumns() * SECTOR_WIDTH ), + map( newMap ), gridColor( 50, 80, 50 ), + hiLiteRow( -1 ), hiLiteCol( -1 ) +{ + labelFont = KGlobalSettings::generalFont(); + labelFont.setPointSize( 8 ); + + setFrameStyle( NoFrame ); + setPaletteBackgroundColor( black ); + setMinimumSize( BOARD_HEIGHT, BOARD_WIDTH ); + + setCellWidth( SECTOR_WIDTH ); + setCellHeight( SECTOR_HEIGHT ); + setNumRows( map->getRows() ); + setNumCols( map->getColumns() ); + + setMinimumSize( BOARD_HEIGHT, BOARD_WIDTH ); + setMaximumSize( BOARD_HEIGHT, BOARD_WIDTH ); + + connect( map, SIGNAL( update() ), this, SLOT( mapUpdate() ) ); + + QTimer *timer = new QTimer( this ); + connect( timer, SIGNAL(timeout()), this, SLOT(squareBlink()) ); + timer->start( 500, false ); + + viewport()->setMouseTracking( true ); + setMouseTracking( true ); + + show(); + + +} + +ConquestMap::~ConquestMap() +{ +} + + +void +ConquestMap::contentsMousePressEvent( QMouseEvent *e ) +{ + int row, col; + + row = rowAt( e->y() ); + col = columnAt( e->x() ); + + if( map->getSector( row, col ).hasPlanet() ) { + emit planetSelected( map->getSector( row, col ).getPlanet() ); + } + +} + +void +ConquestMap::contentsMouseMoveEvent( QMouseEvent *e ) +{ + // highlight the square under the mouse + int row, col; + + row = rowAt( e->y() ); + col = columnAt( e->x() ); + + // Check to make sure the mouse is in a valid grid location + if( (row < 0 || col < 0) || + (row >= BOARD_ROWS || col >= BOARD_COLS) ) { + return; + } + + + if( (hiLiteRow != -1) && (hiLiteCol != -1) ) { + QPainter p( viewport() ); + + p.translate( hiLiteCol * cellWidth(), hiLiteRow * cellHeight() ); + + drawSector( &p, map->getSector(hiLiteRow,hiLiteCol) ); + + hiLiteRow = -1; + hiLiteCol = -1; + + } + + if( map->getSector( row, col ).hasPlanet() ) { + QPainter p( viewport() ); + + p.translate( col * cellWidth(),row * cellHeight() ); + + drawSector( &p, map->getSector(row,col), false, true ); + emit planetHighlighted(map->getSector( row, col ).getPlanet() ); + + hiLiteRow = row; + hiLiteCol = col; + + } + +} + +void +ConquestMap::unselectPlanet() +{ + map->setSelectedSector(); +} + + +void +ConquestMap::paintCell( QPainter *p, int row, int col ) +{ + drawSector( p, map->getSector( row, col ) ); +} + +void +ConquestMap::squareBlink() +{ + static bool blinkState = true; + + int row, col; + if( map->selectedSector( row, col ) ) { + QPainter p( this, true ); + + p.translate( col * cellWidth(), row * cellHeight() ); + + if( blinkState ) { + drawSector( &p, map->getSector(row,col), true ); + } else { + drawSector( &p, map->getSector(row,col), false ); + } + } + + if( blinkState ) + blinkState = false; + else + blinkState = true; +} + + +void +ConquestMap::mapUpdate() +{ + viewport()->repaint(false); +} + + +void +ConquestMap::drawSector( QPainter *p, Sector §or, bool borderStrobe, bool highlight ) +{ + QColor labelColor( white ); + QPoint labelCorner; + + if( sector.hasPlanet() ) { + QPixmap pm; + + // simple (pathetic) way to "randomize" + // the planet graphic + // and also a really dirty hack to make the planet + // name more visible (hard coded pixel offsets) + switch( ((sector.getRow()+sector.getColumn()) % 9) + 1 ) { + case 1 : + pm = QPixmap( IMAGE_PLANET_1 ); + labelCorner = QPoint( 18, 14 ); + break; + case 2 : + pm = QPixmap( IMAGE_PLANET_2 ); + labelCorner = QPoint( 2, 14 ); + break; + case 3 : + pm = QPixmap( IMAGE_PLANET_3 ); + labelCorner = QPoint( 2, 26 ); + break; + case 4 : + pm = QPixmap( IMAGE_PLANET_4 ); + labelCorner = QPoint( 18, 26 ); + break; + case 5 : + pm = QPixmap( IMAGE_PLANET_5 ); + labelCorner = QPoint( 18, 26 ); + break; + case 6 : + pm = QPixmap( IMAGE_PLANET_6 ); + labelCorner = QPoint( 18, 26 ); + break; + case 7 : + pm = QPixmap( IMAGE_PLANET_7 ); + labelCorner = QPoint( 18, 26 ); + break; + case 8 : + pm = QPixmap( IMAGE_PLANET_8 ); + labelCorner = QPoint( 18, 26 ); + break; + case 9 : + pm = QPixmap( IMAGE_PLANET_9 ); + labelCorner = QPoint( 18, 26 ); + break; + } + + QPoint pos; + + pos.setX( ( SECTOR_HEIGHT / 2 ) - ( pm.height() / 2 ) ); + pos.setY( ( SECTOR_WIDTH / 2 ) - ( pm.width() / 2 ) ); + + p->drawPixmap( pos, pm, QRect(0, 0, pm.height(), pm.width() ) ); + + p->setFont( labelFont ); + p->setPen( labelColor ); + + p->drawText( labelCorner, sector.getPlanet()->getName() ); + + if( borderStrobe ) { + QPen gridPen( sector.getPlanet()->getPlayer()->getColor() ); + p->setPen( gridPen ); + } else if( highlight ) { + QPen gridPen( white ); + p->setPen( gridPen ); + } else { + QPen gridPen( gridColor ); + p->setPen( gridPen ); + } + + } else { + p->eraseRect( 0, 0, SECTOR_WIDTH, SECTOR_HEIGHT ); + + QPen gridPen( gridColor ); + + p->setPen( gridPen ); + } + + p->drawRect( 0, 0, SECTOR_HEIGHT, SECTOR_WIDTH ); + +} + + diff --git a/konquest/map_widget.h b/konquest/map_widget.h new file mode 100644 index 00000000..052d6e9d --- /dev/null +++ b/konquest/map_widget.h @@ -0,0 +1,59 @@ +#ifndef _MAP_WIDGET_H +#define _MAP_WIDGET_H + + +#include <qwidget.h> +#include <qframe.h> +#include <qpixmap.h> + +#include <qgridview.h> + +#include <qtimer.h> + +#include "gamecore.h" +#include "images.h" + +class ConquestMap : public QGridView +{ + Q_OBJECT + + // Constructors +public: + ConquestMap( Map *newMap, QWidget *parent = 0 ); + virtual ~ConquestMap(); + + // Interface +public: + void unselectPlanet(); + +protected: + virtual void contentsMousePressEvent( QMouseEvent *e ); + virtual void contentsMouseMoveEvent( QMouseEvent *e ); + virtual void paintCell( QPainter *p, int row, int col ); + +private slots: + void mapUpdate(); + void squareBlink(); + +signals: + void planetSelected( Planet * ); + void planetHighlighted( Planet * ); + +private: + const int SECTOR_HEIGHT; + const int SECTOR_WIDTH; + + const int BOARD_HEIGHT; + const int BOARD_WIDTH; + + void drawSector( QPainter *, Sector &, bool borderStrobe = true, bool highlight = false ); + + Map *map; + QColor gridColor; + QFont labelFont; + + int hiLiteRow, hiLiteCol; +}; + + +#endif diff --git a/konquest/minimap.cc b/konquest/minimap.cc new file mode 100644 index 00000000..eee1237b --- /dev/null +++ b/konquest/minimap.cc @@ -0,0 +1,79 @@ +#include <qpixmap.h> +#include <qpainter.h> + +#include <kapplication.h> +#include <kiconloader.h> + +#include "minimap.h" +#include "minimap.moc" + +MiniMap::MiniMap( QWidget *parent, const char *name ) + : QGridView( parent, name ), + SECTOR_HEIGHT( 12 ), SECTOR_WIDTH( 12 ), + BOARD_HEIGHT( 10 * SECTOR_HEIGHT ), + BOARD_WIDTH( 10 * SECTOR_WIDTH ), + map( 0 ) +{ + setFrameStyle( NoFrame ); + setPaletteBackgroundColor( black ); + setMinimumSize( BOARD_HEIGHT, BOARD_WIDTH ); + + setCellWidth( SECTOR_WIDTH ); + setCellHeight( SECTOR_HEIGHT ); + setNumRows( 10 ); + setNumCols( 10 ); + + setMinimumSize( BOARD_HEIGHT, BOARD_WIDTH ); + setMaximumSize( BOARD_HEIGHT, BOARD_WIDTH ); +} + +void +MiniMap::setMap(Map *newMap) +{ + map = newMap; + BOARD_HEIGHT = map->getRows() * SECTOR_HEIGHT; + BOARD_WIDTH = map->getColumns() * SECTOR_WIDTH; + setNumRows( map->getRows() ); + setNumCols( map->getColumns() ); + + setMinimumSize( BOARD_HEIGHT, BOARD_WIDTH ); + setMaximumSize( BOARD_HEIGHT, BOARD_WIDTH ); + + connect( map, SIGNAL( update() ), this, SLOT( mapUpdate() ) ); +} + +MiniMap::~MiniMap() +{ +} + + +void +MiniMap::paintCell( QPainter *p, int row, int col ) +{ + drawSector( p, map->getSector( row, col ) ); +} + +void +MiniMap::mapUpdate() +{ + updateContents(); +} + + +void +MiniMap::drawSector( QPainter *p, Sector §or ) +{ + QRect r( 0, 0, SECTOR_WIDTH, SECTOR_HEIGHT ); + + p->setPen( black ); + p->setBrush( black ); + p->drawRect( r ); + + if( sector.hasPlanet() ) { + p->setPen( sector.getPlanet()->getPlayer()->getColor() ); + p->setBrush( sector.getPlanet()->getPlayer()->getColor() ); + + p->drawPie( r, 0, (360 * 16)-1 ); + } +} + diff --git a/konquest/minimap.h b/konquest/minimap.h new file mode 100644 index 00000000..9d205abb --- /dev/null +++ b/konquest/minimap.h @@ -0,0 +1,44 @@ +#ifndef _MINIMAP_H +#define _MINIMAP_H + +#include <qwidget.h> +#include <qframe.h> +#include <qpixmap.h> +#include <qgridview.h> +#include <qtimer.h> + +#include "gamecore.h" +#include "images.h" + + +class MiniMap : public QGridView +{ + Q_OBJECT + + // Constructors +public: + MiniMap( QWidget *parent = 0, const char* name = 0 ); + virtual ~MiniMap(); + + void setMap( Map *newMap ); + +protected: + void paintCell( QPainter *p, int row, int col ); + +private slots: + void mapUpdate(); + +private: + int SECTOR_HEIGHT; + int SECTOR_WIDTH; + + int BOARD_HEIGHT; + int BOARD_WIDTH; + + void drawSector( QPainter *, Sector & ); + + Map *map; +}; + + +#endif // _MINIMAP_H_ diff --git a/konquest/newGameDlg_ui.ui b/konquest/newGameDlg_ui.ui new file mode 100644 index 00000000..2768e5f8 --- /dev/null +++ b/konquest/newGameDlg_ui.ui @@ -0,0 +1,440 @@ +<!DOCTYPE UI><UI version="3.3" stdsetdef="1"> +<class>NewGameDlgUI</class> +<widget class="QWidget"> + <property name="name"> + <cstring>NewGameDlgUI</cstring> + </property> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>661</width> + <height>461</height> + </rect> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout9</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout4</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelPlayers</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="buddy" stdset="0"> + <cstring>sliderPlayers</cstring> + </property> + </widget> + <widget class="QSlider"> + <property name="name"> + <cstring>sliderPlayers</cstring> + </property> + <property name="minValue"> + <number>2</number> + </property> + <property name="maxValue"> + <number>9</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>labelPlayerList</cstring> + </property> + <property name="text"> + <string>Player list:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>listPlayers</cstring> + </property> + </widget> + <widget class="QListView"> + <column> + <property name="text"> + <string>Name</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <column> + <property name="text"> + <string>New Column</string> + </property> + <property name="clickable"> + <bool>true</bool> + </property> + <property name="resizable"> + <bool>true</bool> + </property> + </column> + <property name="name"> + <cstring>listPlayers</cstring> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout3</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelNewPlayer</cstring> + </property> + <property name="text"> + <string>&Human player:</string> + </property> + <property name="buddy" stdset="0"> + <cstring>newPlayer</cstring> + </property> + </widget> + <widget class="QLineEdit"> + <property name="name"> + <cstring>newPlayer</cstring> + </property> + <property name="sizePolicy"> + <sizepolicy> + <hsizetype>7</hsizetype> + <vsizetype>0</vsizetype> + <horstretch>1</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + </property> + </widget> + </hbox> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout2</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>addPlayer</cstring> + </property> + <property name="text"> + <string>&Add Human Player</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer1</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer5</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Fixed</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout8</cstring> + </property> + <vbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <widget class="QLabel"> + <property name="name"> + <cstring>labelPlanets</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="buddy" stdset="0"> + <cstring>sliderPlanets</cstring> + </property> + </widget> + <widget class="QSlider"> + <property name="name"> + <cstring>sliderPlanets</cstring> + </property> + <property name="minValue"> + <number>1</number> + </property> + <property name="maxValue"> + <number>35</number> + </property> + <property name="value"> + <number>1</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>labelMap</cstring> + </property> + <property name="text"> + <string>Preview map:</string> + </property> + </widget> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout7</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer7</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="MiniMap"> + <property name="name"> + <cstring>map</cstring> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer7_2</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>0</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + <spacer> + <property name="name"> + <cstring>spacer6</cstring> + </property> + <property name="orientation"> + <enum>Vertical</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>20</width> + <height>16</height> + </size> + </property> + </spacer> + <widget class="QLayoutWidget"> + <property name="name"> + <cstring>layout5</cstring> + </property> + <hbox> + <property name="name"> + <cstring>unnamed</cstring> + </property> + <spacer> + <property name="name"> + <cstring>spacer3</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>31</width> + <height>20</height> + </size> + </property> + </spacer> + <widget class="QPushButton"> + <property name="name"> + <cstring>rejectMap</cstring> + </property> + <property name="text"> + <string>Reject &Map</string> + </property> + </widget> + <spacer> + <property name="name"> + <cstring>spacer4</cstring> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + <property name="sizeType"> + <enum>Expanding</enum> + </property> + <property name="sizeHint"> + <size> + <width>51</width> + <height>20</height> + </size> + </property> + </spacer> + </hbox> + </widget> + </vbox> + </widget> + </hbox> + </widget> + <widget class="Line"> + <property name="name"> + <cstring>line1</cstring> + </property> + <property name="frameShape"> + <enum>HLine</enum> + </property> + <property name="frameShadow"> + <enum>Sunken</enum> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + <widget class="QLabel"> + <property name="name"> + <cstring>labelTurns</cstring> + </property> + <property name="text"> + <string></string> + </property> + <property name="buddy" stdset="0"> + <cstring>sliderTurns</cstring> + </property> + </widget> + <widget class="QSlider"> + <property name="name"> + <cstring>sliderTurns</cstring> + </property> + <property name="minValue"> + <number>5</number> + </property> + <property name="maxValue"> + <number>40</number> + </property> + <property name="pageStep"> + <number>5</number> + </property> + <property name="orientation"> + <enum>Horizontal</enum> + </property> + </widget> + </vbox> +</widget> +<customwidgets> + <customwidget> + <class>MiniMap</class> + <header location="local">minimap.h</header> + <sizehint> + <width>250</width> + <height>250</height> + </sizehint> + <container>0</container> + <sizepolicy> + <hordata>0</hordata> + <verdata>0</verdata> + <horstretch>0</horstretch> + <verstretch>0</verstretch> + </sizepolicy> + <pixmap>image0</pixmap> + </customwidget> +</customwidgets> +<images> + <image name="image0"> + <data format="PNG" length="1002">89504e470d0a1a0a0000000d4948445200000016000000160806000000c4b46c3b000003b149444154789cad945f4c5b551cc73fe7dc4b7b4bcba0762d45c43114323599ee6192609c51d883892ce083f1718b3ebb185f8dc91e972cf39d2d2a2f1af664b6f1e0fe3863a0718969700eb0c52142da0242a1bd6d696f7bcff101585203ceb8fd9ece39f99dcff9fe7edf939f88c562ec465f5f9fe609442c161362173c3e3eae7b7a7ac8e7f36432196cdbfe4f907c3e4f2291201e8fe338cec3737357e9e8e828aded1e229d650e1f2d51754b082110124c13a4dc5ea341eb9dc284c0558a853f3ce8cb0677ef500fde7d39d2596679e326597b8e9abb85d7a770ab16ab6983ec5a05b487a70e36f0f4e10afe408d6a558310980108478dba4a1e8233990c5d474b64ed39aa3a8fe5f3317fbf81dbd70bccfeb205947632fd74f6589c1c6ea2f70d03a58ba0c1f2c9bdc1b66de3b8256a6e11cbe7e3ee1d181b590124fe2693aeee08d223c82c3a2c24b7b874bec8f26288774f7bd054504aef0dde6e99c0eb83f9fb266323cb80a27fb0958141836044605a2ee5523393371cc646fee2da37195aa35d0c0c5b4859ac03d7e91712dcaac5adab3650a3ff9d08ef7dd8404bb48869e5d958b5b87dadc4c9a1464e9f0d0326df7ebd86bd2e310cb1bf62d384d59441f2d70a070e1c60e09489929b988681bdd9cc97170bcc4c65595f71f8e0e3301337fc24a7732467831875a47f289652b0be5e4151e6d07316c1b0c0340d8ab92023e76d66a6b2840e36d2fb7a13fee632475e6edc367ea98a90fb98b7dd6310ca0328a44761582e1bab41befabcc0ec940d28bc5e93b68e064cab84e1d9beaeb48934eac1f53b01c1b000fca496aa54b61a99fcde61662a4b4b4b23d1680be9d426173e4df3602a48ea411989a4fd590f52a8fd156b05ed9d350e3defe3cfdf4b4c7ce770ea7d3fb9f520afbe1620daeee5c26735d20b9b9cfb6811a754a439e4e5c5639a4caa1e5caf586bfc0197b78702005cb9b4cae4cd3267ce8638fe964bd72b393e39d74928d242617303a756a37f284447770dcdbffc6384a05a85de1306e9a52057c7527c7131c3c42d3f475eb2303c82d4fc3276d6811db37efeb148723082d9b08f79f97c1e5729109a9a28307cc622d2d6cdf52b2b24efe548dedb00142009862cfa879ee1a71f6cec928353511472fbf4389148b0b0e0c108081412458dfe21c9f11351e67e7358595468246d1d1e5e38a6e9e851bc39d84ab502a669331dafec0d8ec7e3e8cb06e1a881d727d1ae40180a434a8c9db129a54126ad48a7358c2b4c5352c8c374bcccdab2bb37d8719cba79fab8211f9df218e0582c261e95f8bfc04f1a1e8bc5c4dfe0a19017a725d8c60000000049454e44ae426082</data> + </image> +</images> +<layoutdefaults spacing="6" margin="11"/> +<includehints> + <includehint>minimap.h</includehint> +</includehints> +</UI> diff --git a/konquest/newgamedlg.cc b/konquest/newgamedlg.cc new file mode 100644 index 00000000..c1beae4f --- /dev/null +++ b/konquest/newgamedlg.cc @@ -0,0 +1,325 @@ +#include <qheader.h> +#include <qlayout.h> +#include <qcolor.h> +#include <qlabel.h> +#include <qslider.h> +#include <qevent.h> +#include <qkeycode.h> +#include <qlistview.h> +#include <qpushbutton.h> +#include <qlineedit.h> + +#include <kapplication.h> +#include <kconfig.h> +#include <klocale.h> +#include <kmessagebox.h> +#include <kpushbutton.h> +#include <kstdguiitem.h> + +#include "newgamedlg.h" +#include "newgamedlg.moc" + +#include "newGameDlg_ui.h" + +/************************************************************************* + New Game Dialog Members + ************************************************************************/ + +NewGameDlg::NewGameDlg( QWidget *parent, Map *pmap, PlayerList *players, + Player *neutralPlayer, PlanetList *planets ) + : KDialogBase( parent, "new_game_dialog", true, i18n("Start New Game"), + KDialogBase::Ok|KDialogBase::Default|KDialogBase::Cancel, KDialogBase::NoDefault, true ), + plrList(players), plnetList(planets), neutral(neutralPlayer), + map(pmap) +{ + w = new NewGameDlgUI(this); + w->map->setMap(map); + w->listPlayers->header()->hide(); +// w->listPlayers->setMinimumSize( 100, 150 ); + w->listPlayers->setSortColumn(-1); + w->listPlayers->setHScrollBarMode(QScrollView::AlwaysOff); + w->sliderPlayers->setMinimumWidth(270); + w->sliderPlanets->setMinimumWidth(270); + + w->newPlayer->setMaxLength( 8 ); + + connect(w->sliderPlayers, SIGNAL(valueChanged(int)), this, SLOT(slotPlayerCount(int))); + connect(w->sliderPlanets, SIGNAL(valueChanged(int)), this, SLOT(slotNewMap())); + connect(w->sliderTurns, SIGNAL(valueChanged(int)), this, SLOT(slotTurns())); + connect(w->rejectMap, SIGNAL(clicked()), this, SLOT(slotNewMap())); + connect(w->newPlayer, SIGNAL(textChanged(const QString &)), this, SLOT(slotNewPlayer())); + connect(w->newPlayer, SIGNAL(returnPressed()), this, SLOT(slotAddPlayer())); + connect(w->addPlayer, SIGNAL(clicked()), this, SLOT(slotAddPlayer())); + + init(); + + setMainWidget(w); +} + +void +NewGameDlg::slotDefault() +{ + w->sliderPlayers->setValue(2); + w->sliderPlanets->setValue(3); + w->sliderTurns->setValue(15); + + w->listPlayers->clear(); + + setPlayerCount(2); + + updateMiniMap(); + updateLabels(); +} + +void +NewGameDlg::init() +{ + KConfig *config = kapp->config(); + config->setGroup("Game"); + int nrOfPlayers = config->readNumEntry("NrOfPlayers"); + if (nrOfPlayers < 2) + nrOfPlayers = 2; + if (nrOfPlayers > MAX_PLAYERS) + nrOfPlayers = MAX_PLAYERS; + + int nrOfPlanets = config->readNumEntry("NrOfPlanets", 3); + int nrOfTurns = config->readNumEntry("NrOfTurns", 15); + + w->sliderPlayers->setValue(nrOfPlayers); + w->sliderPlanets->setValue(nrOfPlanets); + w->sliderTurns->setValue(nrOfTurns); + setPlayerCount(nrOfPlayers); + slotNewPlayer(); + + // Restore player names + int plrNum = 0; + for( QListViewItem *item = w->listPlayers->firstChild(); + item; item = item->nextSibling(), plrNum++ ) + { + QString key = QString("Player_%1").arg(plrNum); + + QString playerName = config->readEntry(key); + if (playerName.isEmpty()) + continue; + + item->setText(2, "H"); // Human + item->setText(1, i18n("Human Player")); + item->setText(0, playerName); + } + + updateMiniMap(); + updateLabels(); +} + +void +NewGameDlg::slotNewPlayer() +{ + w->addPlayer->setEnabled(!w->newPlayer->text().isEmpty()); +} + +void +NewGameDlg::slotAddPlayer() +{ + QString playerName = w->newPlayer->text(); + if (playerName.isEmpty()) + return; + + QListViewItem *item; + do + { + item = w->listPlayers->firstChild(); + while( item ) + { + if (item->text(2) == "A") + break; + + item = item->nextSibling(); + } + if (!item) + { + int nrPlayers = w->listPlayers->childCount(); + if (nrPlayers >= MAX_PLAYERS) + return; // Too bad + nrPlayers++; + w->sliderPlayers->setValue(nrPlayers); + setPlayerCount(nrPlayers); + } + } + while(!item); + + item->setText(2, "H"); // Human + item->setText(1, i18n("Human Player")); + item->setText(0, playerName); + + w->newPlayer->setText(QString::null); + + updateMiniMap(); + updateLabels(); +} + +void +NewGameDlg::setPlayerCount(int playerCount) +{ + QColor PlayerColors[MAX_PLAYERS] = { QColor( 130, 130, 255 ), yellow, red, green, + white, cyan, magenta, QColor( 235, 153, 46 ), + QColor( 106, 157, 104 ), QColor( 131, 153, 128) }; + + int i = 0; + QListViewItem *lastItem = 0; + QListViewItem *item = 0; + QListViewItem *nextItem = w->listPlayers->firstChild(); + while( (item = nextItem) ) + { + nextItem = item->nextSibling(); + if (i >= playerCount) + { + delete item; + } + else + { + lastItem = item; + } + i++; + } + + while(w->listPlayers->childCount() < playerCount) + { + QString playerName = i18n("Generated AI player name", "Comp%1").arg(i+1); + QPixmap pm(16,16); + QColor color(PlayerColors[i]); + pm.fill(color); + QListViewItem *item = new QListViewItem(w->listPlayers, lastItem, playerName, i18n("Computer Player"), "A", color.name()); + item->setPixmap(0, pm); + lastItem = item; + i++; + } +} + +void +NewGameDlg::slotPlayerCount(int playerCount) +{ + if (w->listPlayers->childCount() == playerCount) + return; + + setPlayerCount(playerCount); + + updateMiniMap(); + updateLabels(); +} + +void +NewGameDlg::slotTurns() +{ + updateLabels(); +} + +void +NewGameDlg::slotNewMap() +{ + updateMiniMap(); + updateLabels(); +} + +int +NewGameDlg::turns() +{ + return w->sliderTurns->value(); +} + +void +NewGameDlg::updateLabels() +{ + w->labelPlayers->setText(i18n("Number of &players: %1").arg(w->sliderPlayers->value())); + w->labelPlanets->setText(i18n("Number of neutral p&lanets: %1").arg(w->sliderPlanets->value())); + w->labelTurns->setText(i18n("Number of &turns: %1").arg(w->sliderTurns->value())); +} + +void +NewGameDlg::slotOk() +{ + bool hasHumans = false; + for( QListViewItem *item = w->listPlayers->firstChild(); + item; item = item->nextSibling() ) + { + bool ai = (item->text(2) == "A"); + if (!ai) + hasHumans = true; + } + + if (!hasHumans) + { + KMessageBox::information(this, i18n("The game is much more fun when you add a human player!")); + w->newPlayer->setFocus(); + return; + } + KDialogBase::slotOk(); +} + +void +NewGameDlg::save() +{ + KConfig *config = kapp->config(); + config->setGroup("Game"); + + config->writeEntry("NrOfPlayers", w->sliderPlayers->value()); + config->writeEntry("NrOfPlanets", w->sliderPlanets->value()); + config->writeEntry("NrOfTurns", w->sliderTurns->value()); + + int plrNum = 0; + for( QListViewItem *item = w->listPlayers->firstChild(); + item; item = item->nextSibling() ) + { + QString key = QString("Player_%1").arg(plrNum); + QString playerName = item->text(0); + bool ai = (item->text(2) == "A"); + if (ai) + { + if (config->hasKey(key)) + config->deleteEntry(key); + } + else + { + config->writeEntry(key, playerName); + } + plrNum++; + } + config->sync(); +} + +void +NewGameDlg::updateMiniMap() +{ + // Clear map,, player and planet lists + map->clearMap(); + + Planet *planet; + planet = plnetList->first(); + for( planet = plnetList->take(); planet != 0; planet = plnetList->take() ) { + delete planet; + } + + Player *player; + player = plrList->first(); + for( player = plrList->take(); player != 0; player = plrList->take() ) { + delete player; + } + + // Make player list + // Does the name already exist in the list + int plrNum = 0; + for( QListViewItem *item = w->listPlayers->firstChild(); + item; item = item->nextSibling() ) + { + QString playerName = item->text(0); + bool ai = (item->text(2) == "A"); + QColor color(item->text(3)); + plrList->append( Player::createPlayer( playerName, color, plrNum, ai )); + plrNum++; + } + + // make the planets + map->populateMap( *plrList, neutral, + w->sliderPlanets->value(), + *plnetList ); +} + diff --git a/konquest/newgamedlg.h b/konquest/newgamedlg.h new file mode 100644 index 00000000..ed2d48d6 --- /dev/null +++ b/konquest/newgamedlg.h @@ -0,0 +1,51 @@ +#ifndef _NEWGAMEDLG_H_ +#define _NEWGAMEDLG_H_ + +#include <kdialogbase.h> + +#include "gamecore.h" +#include "minimap.h" + +class NewGameDlgUI; + +/************************************************************************* + New Game Dialog + ************************************************************************/ + +class NewGameDlg : public KDialogBase +{ + Q_OBJECT + +public: + NewGameDlg( QWidget *parent, Map *map, PlayerList *playerList, + Player *neutralPlayer, PlanetList *planetList ); + + int turns( void ); + + void save(); + +protected slots: + void slotPlayerCount(int playerCount); + void slotNewMap(); + void slotTurns(); + void slotNewPlayer(); + void slotAddPlayer(); + void slotDefault(); + void slotOk(); + +private: + void init(); + void updateMiniMap(); + void updateLabels(); + void setPlayerCount(int playerCount); + +private: + PlayerList *plrList; + PlanetList *plnetList; + Player *neutral; + Map *map; + + NewGameDlgUI *w; +}; + +#endif diff --git a/konquest/pics/Makefile.am b/konquest/pics/Makefile.am new file mode 100644 index 00000000..6c702a0e --- /dev/null +++ b/konquest/pics/Makefile.am @@ -0,0 +1,7 @@ + +# add here all files +pics_DATA = konquest-splash.png planet1.xpm planet2.xpm planet3.xpm planet4.xpm \ + planet5.xpm planet6.xpm planet7.xpm planet8.xpm planet9.xpm ruler.xpm + +picsdir = $(kde_datadir)/konquest/pics + diff --git a/konquest/pics/konquest-splash.png b/konquest/pics/konquest-splash.png Binary files differnew file mode 100644 index 00000000..6640b1a4 --- /dev/null +++ b/konquest/pics/konquest-splash.png diff --git a/konquest/pics/planet1.xpm b/konquest/pics/planet1.xpm new file mode 100644 index 00000000..fc867ba3 --- /dev/null +++ b/konquest/pics/planet1.xpm @@ -0,0 +1,228 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 201 2", +/* colors */ +" c #12222C", +" . c #121A2C", +" X c #96B2B4", +" o c #5E6E5C", +" O c #0A1E24", +" + c #161A1C", +" @ c #5E665C", +" # c #0A1A24", +" $ c #16161C", +" % c #0A1624", +" & c #A6AA9C", +" * c #8EA6AC", +" = c #3E6664", +" - c #4A625C", +" ; c #0E0E14", +" : c #AAA28C", +" > c #425E54", +" , c #7E969C", +" < c #3A524C", +" 1 c #2E5254", +" 2 c #9A927C", +" 3 c #324E44", +" 4 c #BEDAD4", +" 5 c #324A44", +" 6 c #264A4C", +" 7 c #324644", +" 8 c #7A8E84", +" 9 c #C2D2C4", +" 0 c #1E3E44", +" q c #8A866C", +" w c #7E8274", +" e c #BACABC", +" r c #AECAC4", +" t c #AEC6C4", +" y c #BAC2BC", +" u c #16363C", +" i c #5E827C", +" p c #222E34", +" a c #62766C", +" s c #0E2A34", +" d c #6E7264", +" f c #426E74", +" g c #121E24", +" h c #121A24", +" j c #52665C", +" k c #466664", +" l c #0A161C", +" z c #0A121C", +" x c #9AAA9C", +" c c #0A0E1C", +" v c #9AA69C", +" b c #92A294", +" n c #9E9E8C", +" m c #42564C", +" M c #365654", +" N c #2A565C", +" B c #365254", +" V c #729E9C", +" C c #8A968C", +" Z c #2E524C", +" A c #DEDAC4", +" S c #D2DACC", +" D c #829284", +" F c #1A464C", +" G c #32423C", +" H c #BECECC", +" J c #868A74", +" K c #2A3E34", +" L c #C2CABC", +" P c #B6CAC4", +" I c #2A3A34", +" U c #C2C6BC", +" Y c #1E3A3C", +" T c #1E363C", +" R c #BAC2B4", +" E c #22322C", +" W c #BABEB4", +" Q c #A2BEC4", +" ! c #162E34", +" ~ c #467A84", +" ^ c #B2B6AC", +" / c #3E767C", +" ( c #627264", +" ) c #1A2224", +" _ c #0E222C", +" ` c #92BAB4", +" ' c #1A1E24", +" ] c #0E1E2C", +" [ c #5A6A5C", +" { c #12161C", +" } c #12121C", +" | c #061224", +". c #526254", +".. c #DEEEE4", +".X c #3A6264", +".o c #0A0E14", +".O c #82A6A4", +".+ c #0A0A14", +".@ c #0A0614", +".# c #325A5C", +".$ c #32565C", +".% c #9E9A84", +".& c #929A8C", +".* c #869A94", +".= c #3E4A54", +".- c #2A5254", +".; c #3A4A3C", +".: c #D2D6C4", +".> c #2E4A44", +"., c #2E4644", +".< c #2E4244", +".1 c #22424C", +".2 c #26423C", +".3 c #BECEC4", +".4 c #1A4244", +".5 c #1A3E44", +".6 c #263A3C", +".7 c #6E867C", +".8 c #56828C", +".9 c #1E2E34", +".0 c #5A727C", +".q c #162A2C", +".w c #46767C", +".e c #566664", +".r c #0E1624", +".t c #AAAE9C", +".y c #566264", +".u c #0E1224", +".i c #426664", +".p c #2E6264", +".a c #9A9E8C", +".s c #325654", +".d c #D6DED4", +".f c #869E8C", +".g c #325254", +".h c #3E4E4C", +".j c #26465C", +".k c #7A8E94", +".l c #2A4A4C", +".z c #2A464C", +".x c #669294", +".c c #728E8C", +".v c #D2D2BC", +".b c #224644", +".n c #D2CEBC", +".m c #224244", +".M c #16424C", +".N c #5E828C", +".B c #BEC6BC", +".V c #1A3A3C", +".C c #6E8274", +".Z c #1A363C", +".A c #0E3644", +".S c #1A323C", +".D c #C2C2AC", +".F c #123234", +".G c #122E34", +".H c #66766C", +".J c #122A34", +".K c #5E7664", +".L c #A2B6B4", +".P c #5E7264", +".I c #467274", +".U c #0A222C", +".Y c #6A6A5C", +".T c #0A1E2C", +".R c #161A24", +".E c #A6AEA4", +".W c #3E6A6C", +".Q c #4A6664", +".! c #0E161C", +".~ c #0E121C", +".^ c #0E0E1C", +"./ c #AAA694", +".( c #9EA69C", +".) c #0E0A1C", +"._ c #E6EADC", +".` c #7EA6A4", +".' c #96A294", +".] c #42565C", +".[ c #7EA2A4", +".{ c #060614", +".} c #3A5E54", +".| c #D2EADC", +"X c #2E5A5C", +"X. c #3A5654", +"XX c #2E565C", +"Xo c #32524C", +"XO c #C2DACC", +"X+ c #CED6C4", +"X@ c #1E424C", +"X# c #728A84", +"X$ c #668A8C", +"X% c #2E3A34", +"X& c #B2C6BC", +"X* c #1A3234", +"X= c #6E7A6C", +"X- c #6E766C", +"X; c #B6BAAC", +"X: c #AABAB4", +"X> c #9EBABC", +/* pixels */ +" ).R {.~.~.^.^.^.^.).o.+.+ c ; ;.o ;.~ +", +" '.~.^.^.+.o c.+.+ %.r c.).+.+.+.).+ ; }", +" +.~ c.^.^ ..0 *X> Q X.[.N B ..+.+.+.o }", +" +.~.^.^.e HX+ yX&.L.c.W = f ~.j c.+.).~", +" }.o.u ,.B.E x C.tX& i.XX N.I.8 f z ;.~", +" {.^.k W./ C bX: eX+ H t.` XX>.x.p.A.+ }", +" }.] U.(.t L.n._.:.B.3.d.. r.x.4.A.M.T.~", +" +X: 9X;.a n & J q.D A S.3.. 4 V / F.5.^", +".=.v AX; w ( o aX#.B P.f C R S.| ` f.p g", +".y n & : 8.& v ^.a w DX=.H D.' vXO.O.w.S", +".yX- @. 2.%.% @ I E E.q K.K.C.>.C.*X$ ", +".y [.;X%X% d m.q g.r.! l ] I o.}.2 ZXo h", +".h. G.9.q.Y < _.q # # # O.G 7.7.i 6.5.~", +" p > K.9X* w., ! O O.U.U.FX* T >.W.G ;", +" { - 5.6 T.H TX* !.S s.F u u.V 0.bX | ;", +" } p j.,.h [.ZX* T.V.S.Z.m 3.#.l.V.U.+ c", +" $.o.h.P -.H < 3 5 M MX. -.#XXX@.U.{.@ ;", +" h.^.+.< k.Q M.g.sX..gXX 1 6 Y _.{.{.@.^", +" $ ;.+.@ g.1XX.$.#.-.z.b.4 s |.@.{.{.{ ;", +" + c.+.@.@.@ c ].J.J.U %.+.{.{.{.@.+.o.^" +}; diff --git a/konquest/pics/planet2.xpm b/konquest/pics/planet2.xpm new file mode 100644 index 00000000..f77d9ddb --- /dev/null +++ b/konquest/pics/planet2.xpm @@ -0,0 +1,190 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 163 2", +/* colors */ +" c #3E161C", +" . c #CEAE9C", +" X c #7A5A64", +" o c #EAAE7C", +" O c #7A5664", +" + c #361214", +" @ c #360E14", +" # c #F6EEE4", +" $ c #72525C", +" % c #2E0E0C", +" & c #724E5C", +" * c #A292AC", +" = c #EEE6DC", +" - c #FEEEC4", +" ; c #F2EACC", +" : c #AA968C", +" > c #C2927C", +" , c #E6DED4", +" < c #FADEAC", +" 1 c #A28684", +" 2 c #DECECC", +" 3 c #A27E84", +" 4 c #F2CEA4", +" 5 c #8E7684", +" 6 c #927674", +" 7 c #927274", +" 8 c #DABEB4", +" 9 c #CEBEBC", +" 0 c #766694", +" q c #DEC6A4", +" w c #D2C2AC", +" e c #A26E5C", +" r c #D2BAAC", +" t c #DEB6A4", +" y c #8A6A6C", +" u c #7E5E74", +" i c #CAB2A4", +" p c #FAFAF4", +" a c #DAB28C", +" s c #765A6C", +" d c #B6A6A4", +" f c #C2A29C", +" g c #360E0C", +" h c #6E4E64", +" j c #F6EEDC", +" k c #664A5C", +" l c #D69A74", +" z c #66425C", +" x c #B29A8C", +" c c #6A4A4C", +" v c #5E4654", +" b c #A69294", +" n c #5E3A54", +" m c #9E828C", +" M c #56324C", +" N c #927E94", +" B c #5A3A3C", +" V c #967E84", +" C c #DECAC4", +" Z c #D2CACC", +" A c #4E2A44", +" S c #8A768C", +" D c #523234", +" F c #522A34", +" G c #4A222C", +" H c #CEBAB4", +" J c #DEBE9C", +" K c #866674", +" L c #96625C", +" P c #7E626C", +" I c #3A1A1C", +" U c #CAB29C", +" Y c #CAAE9C", +" T c #3A121C", +" R c #320E14", +" E c #CEA68C", +" W c #B6A29C", +" Q c #F2EAE4", +" ! c #AA9AA4", +" ~ c #D2967C", +" ^ c #664A54", +" / c #AE9694", +" ( c #664654", +" ) c #663E54", +" _ c #EEE2CC", +" ` c #9E8284", +" ' c #F6D6AC", +" ] c #DECEBC", +" [ c #967A7C", +" { c #D2C6C4", +" } c #C6BACC", +" | c #A67264", +". c #8E7274", +".. c #CABEBC", +".X c #8E6E74", +".o c #BEB6C4", +".O c #4A2224", +".+ c #4A1E24", +".@ c #86666C", +".# c #C2B2B4", +".$ c #FEFEFC", +".% c #86626C", +".& c #7A5E74", +".* c #C6B2A4", +".= c #7E5E64", +".- c #3A1214", +".; c #FAF6E4", +".: c #765A5C", +".> c #BEA69C", +"., c #825254", +".< c #BE9E9C", +".1 c #320E0C", +".2 c #6A4E64", +".3 c #320A0C", +".4 c #6A4A64", +".5 c #E69E74", +".6 c #6A4664", +".7 c #B69E94", +".8 c #B69A94", +".9 c #6E4A54", +".0 c #E6DEE4", +".q c #664A4C", +".w c #EAE2D4", +".e c #EEDEC4", +".r c #B28E7C", +".t c #A68A84", +".y c #A68684", +".u c #E2D2CC", +".i c #D6CED4", +".p c #9E7A7C", +".a c #EACAAC", +".s c #DECAB4", +".d c #967674", +".f c #D2C2BC", +".g c #D2BEBC", +".h c #CABAB4", +".j c #8E666C", +".k c #CEB6A4", +".l c #E6B294", +".z c #866264", +".x c #C2AAAC", +".c c #B6AAB4", +".v c #DEAE8C", +".b c #F6F2EC", +".n c #725664", +".m c #725264", +".M c #6A465C", +".N c #AA9294", +".B c #624254", +".V c #BA927C", +".C c #664244", +".Z c #AE8E84", +".A c #968694", +".S c #5A364C", +".D c #E2D6C4", +".F c #D6CECC", +".G c #927A7C", +".H c #DAC6BC", +".J c #4A263C", +".K c #FACE8C", +".L c #4E222C", +".P c #D6C2A4", +".I c #BEAEB4", +/* pixels */ +".1.3.1.1.1.1.1.1.1.1.1.1.1.1 g g g g g @", +".3.1.3.3.3.1.1.q.j.d 7.C.-.3.3.3.3.3.3.3", +".3 % % %.3.: Z ; t.l 4.a Y ( R R @ @ @ @", +" %.3.3 @.Z - <.K l > E.j.& u.= @ R.3 @.3", +" % %.1 ` ' a | L.V.v ~ (.m.2.k c R.3 @ @", +".3.3.S r f Y.* / q J X [ :.h m K.L R.3 R", +" % % N :.#.u _ w = ].7.N.m.@.t 1.9 R.3 @", +".3 I.o S 6 x.P _ _ U.7 1.B.B.@.<.d T R.1", +".3.C.c.I b V a 4 Y.z., y X.S z.@.p.O.3 @", +" % v *.# 5 H.5 o e.9.S A n h ( z.m F R R", +" % ^ 0.G s.B.N '.r O M.J A.n.G ).4 F.3 R", +" % B } N...h.@.. #.w 9 $.= X P k & G R g", +" % I.0 !.# / $ i W.$.b. .< Y. b.6 +.3 @", +" g.1.A Z.x.f d , p.e.>.X 1.F.D r ) @ R.1", +".3.3 D.w {.g #.D j.s ..8.y & 3 O.+ R.3 @", +".1 R.3 P.# 2.f = Q.w =.H Y 8.<.M.3.3 @.3", +".3.1 R @ m.;.$.$.$.$.$ p.; C.% + @.3 @ @", +".1.3.3 @ @ $.i.$.$.$.$ p.u O @.3.3 @.3.3", +".3.1.1.1.1.3 @ ^ V b V.9 R @ @.3 @ @ @", +" %.3.3.3.3 R.1.1 %.3.3 % %.3.3.3 @.3.3 g" +}; diff --git a/konquest/pics/planet3.xpm b/konquest/pics/planet3.xpm new file mode 100644 index 00000000..6375bfd1 --- /dev/null +++ b/konquest/pics/planet3.xpm @@ -0,0 +1,133 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 106 2", +/* colors */ +" c #BA6A2C", +" . c #EAB27C", +" X c #8E623C", +" o c #76624C", +" O c #825644", +" + c #120604", +" @ c #D29664", +" # c #5E3A34", +" $ c #DA8A44", +" % c #CE8A4C", +" & c #B6865C", +" * c #9E866C", +" = c #D2823C", +" - c #BA824C", +" ; c #CA7A34", +" : c #BE7A3C", +" > c #CA7634", +" , c #BE763C", +" < c #B27644", +" 1 c #3A2A24", +" 2 c #C2722C", +" 3 c #926E4C", +" 4 c #AE6A2C", +" 5 c #BA6624", +" 6 c #7E664C", +" 7 c #2A1A14", +" 8 c #B2661C", +" 9 c #965A3C", +" 0 c #8E6234", +" q c #7E564C", +" w c #82623C", +" e c #EEA664", +" r c #E69A5C", +" t c #DA9A64", +" y c #CE9A6C", +" u c #060204", +" i c #DE9254", +" p c #C68E64", +" a c #CA8A54", +" s c #763E1C", +" d c #B28A64", +" f c #4A3E2C", +" g c #4A3A2C", +" h c #C67E3C", +" j c #423224", +" k c #BA7644", +" l c #9A6E4C", +" z c #3A221C", +" x c #B66E2C", +" c c #EAA66C", +" v c #965634", +" b c #765A3C", +" n c #6A5A44", +" m c #CAA274", +" M c #E29E64", +" N c #924E1C", +" B c #C29A6C", +" V c #CE9664", +" C c #DE8E4C", +" Z c #CE823C", +" A c #B67E4C", +" S c #9E765C", +" D c #8A725C", +" F c #BE722C", +" G c #9A6E44", +" H c #F2AE6C", +" J c #32120C", +" K c #1E160C", +" L c #1E120C", +" P c #1E0E0C", +" I c #DEA26C", +" U c #725644", +" Y c #C69E7C", +" T c #160A04", +" R c #E2965C", +" E c #BE9674", +" W c #6A463C", +" Q c #020204", +" ! c #C29264", +" ~ c #663E24", +" ^ c #7E3A14", +" / c #AE8664", +" ( c #D6863C", +" ) c #CA8244", +" _ c #6A3214", +" ` c #C27E3C", +" ' c #4A321C", +" ] c #C27A3C", +" [ c #92765C", +" { c #BA7634", +" } c #C6722C", +" | c #AE723C", +". c #BE6E24", +".. c #8E6A44", +".X c #EEB274", +".o c #E6A66C", +".O c #DAA674", +".+ c #120E0C", +".@ c #C69A74", +".# c #0A0204", +".$ c #62422C", +".% c #D28244", +".& c #C6824C", +".* c #CA7E3C", +".= c #AA7644", +".- c #86725C", +/* pixels */ +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q", +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q", +" Q Q Q Q Q Q Q Q Q 7 W O q # T Q Q Q Q Q", +" Q Q Q Q Q Q Q P X y @ @ @ t k s.# Q Q Q", +" Q Q Q Q Q Q L S p t $ ) ) F 8 N + Q Q", +" Q Q Q Q Q Q U Y.O ! % ` ]. . ) 5 ^ Q Q", +" Q Q Q Q Q L *.@ ! A : { , 2 > Z ; 5 J Q", +" Q Q Q Q Q 1 * d & - : ].* Z = } ; > _ Q", +" Q Q Q Q Q z [ l G A.& ` h R $ >.% R v Q", +" Q Q Q Q Q 7 6.. 0 | | 4 4 % ( = C H 9 Q", +" Q Q Q Q Q +.$ w X.= < x ,.* = $ r i ~ Q", +" Q Q Q Q Q Q z b 3 & & !.o c e M t.& + Q", +" Q Q Q Q Q Q u g D / V I ..X c I a ' Q Q", +" Q Q Q Q Q Q Q.# g.- / E Y m B d j Q Q Q", +" Q Q Q Q Q Q Q Q Q K g n o n f.+ Q Q Q Q", +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q", +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q", +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q", +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q", +" Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q Q" +}; diff --git a/konquest/pics/planet4.xpm b/konquest/pics/planet4.xpm new file mode 100644 index 00000000..5d34f2df --- /dev/null +++ b/konquest/pics/planet4.xpm @@ -0,0 +1,122 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 95 2", +/* colors */ +" c #2A221C", +" . c #7E5E54", +" X c #221A14", +" o c #765A4C", +" O c #1A120C", +" + c #6E5644", +" @ c #6E5244", +" # c #E2AA4C", +" $ c #D6A654", +" % c #664E3C", +" & c #D6A254", +" * c #CE9E4C", +" = c #BE9264", +" - c #CE9A4C", +" ; c #B68E5C", +" : c #4A3A34", +" > c #AA8264", +" , c #42362C", +" < c #A27A5C", +" 1 c #9A7654", +" 2 c #3A2A24", +" 3 c #32261C", +" 4 c #866A54", +" 5 c #866654", +" 6 c #2A2214", +" 7 c #8A6A44", +" 8 c #8A6644", +" 9 c #7E624C", +" 0 c #F2B654", +" q c #765A44", +" w c #0E0A0C", +" e c #624E44", +" r c #060604", +" t c #C69A64", +" y c #060204", +" u c #D6A24C", +" i c #5A463C", +" p c #CA9A54", +" a c #BA8E44", +" s c #A27E54", +" d c #8E6E54", +" f c #866A4C", +" g c #261E1C", +" h c #FABE54", +" j c #7E6244", +" k c #725A4C", +" l c #16120C", +" z c #6A5644", +" x c #DEA64C", +" c c #624E3C", +" v c #D2A254", +" b c #624A3C", +" n c #BE9254", +" m c #B2865C", +" M c #B68A4C", +" N c #AA8254", +" B c #A27A4C", +" V c #362A24", +" C c #8A6E5C", +" Z c #2E261C", +" A c #261E14", +" S c #866644", +" D c #7A624C", +" F c #7A5E4C", +" G c #725644", +" H c #E6AE4C", +" J c #D69E64", +" K c #DAAA54", +" L c #DAA654", +" P c #020204", +" I c #D29E4C", +" U c #C69654", +" Y c #4E3E34", +" T c #B28654", +" R c #463A2C", +" E c #A6825C", +" W c #9E7A54", +" Q c #3E2E24", +" ! c #8A6A54", +" ~ c #8E6A44", +" ^ c #F6BA54", +" / c #1A1614", +" ( c #120E0C", +" ) c #665244", +" _ c #D6A25C", +" ` c #0A0A04", +" ' c #0A0604", +" ] c #5E4A3C", +" [ c #564234", +" { c #B68A64", +" } c #C6924C", +" | c #BA8E54", +". c #BE8E44", +".. c #927254", +".X c #322624", +/* pixels */ +" P P y P P P P P P P P P P P P P P y ' P", +" P y P y y y y y y y y y y y y y 3 c k l", +" P r r r r P r r r r r P r r / b 4 . ] r", +" P P P P P r P P P w ( ` P / . F 5 9 3 y", +" P P P y P r r l R q 9 @ 3 l Q A 9 [ r P", +" P y y r y y l ) 1 N T B j 2 y , o ( P r", +" P r P r r r e < | U } M N S F X y P y", +" P P P P P V W n _ u * } - ~ G 3 r r y r", +" P P y y y ) ; $ K L I #. j b P P P P P", +" P r P r r.. p & x u 0 u 8 < i r y r y r", +" P r P P r 1 p v # h # 7 T m : r P r P y", +" P P P P O.. | L ^ u 7 { U > 3 P P P y r", +" P y r ( + 5 p H a f | J = ! ` y y r P P", +" P r r ] Y Z M f ! | J t E.X y r r P P r", +" P y , F / w [ d { t = s , r P P P y P y", +" P X D % : k c Q D C z g r P y P y r P r", +" r [ d ! 9 , r P P y r y y P r r P r P P", +" X z D ] X y r y y r y r r r r P P P P r", +" / : 6 r P P P r P P P P P P y y y P P P", +" P P P P y y r P P r y P y P r r P r P r" +}; diff --git a/konquest/pics/planet5.xpm b/konquest/pics/planet5.xpm new file mode 100644 index 00000000..339e086e --- /dev/null +++ b/konquest/pics/planet5.xpm @@ -0,0 +1,143 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 116 2", +/* colors */ +" c #321624", +" . c #D2AE8C", +" X c #72625C", +" o c #D2AA8C", +" O c #2A121C", +" + c #2A0E1C", +" @ c #6A5A54", +" # c #CAA284", +" $ c #220A14", +" % c #6A5654", +" & c #220614", +" * c #62524C", +" = c #1A020C", +" - c #120204", +" ; c #BA9274", +" : c #FAD2AC", +" > c #523A3C", +" , c #B2826C", +" < c #927E74", +" 1 c #F2C6A4", +" 2 c #DEC6A4", +" 3 c #EABE9C", +" 4 c #42222C", +" 5 c #E2BA94", +" 6 c #E2B694", +" 7 c #8E6A5C", +" 8 c #CEB694", +" 9 c #DAB28C", +" 0 c #32161C", +" q c #725E54", +" w c #C6A68C", +" e c #725A54", +" r c #725654", +" t c #22060C", +" y c #22020C", +" u c #BE9A84", +" i c #6A4E4C", +" p c #1A0204", +" a c #B6927C", +" s c #F6DAB4", +" d c #FACEA4", +" f c #523634", +" g c #FACAA4", +" h c #462E3C", +" j c #F2C69C", +" k c #9E7A64", +" l c #F2C29C", +" z c #4A262C", +" x c #966E5C", +" c c #DEBA9C", +" v c #8E6A54", +" b c #D6B294", +" n c #82665C", +" m c #CEAA8C", +" M c #6E5E5C", +" N c #C6A684", +" B c #C69E84", +" V c #16020C", +" C c #FEE2B4", +" Z c #B69274", +" A c #FEDEB4", +" S c #564644", +" D c #B68E74", +" F c #AE866C", +" G c #EAD2B4", +" H c #AE826C", +" J c #4E363C", +" K c #4E323C", +" L c #EECAA4", +" P c #927264", +" I c #765E5C", +" U c #2E0E1C", +" Y c #765A5C", +" T c #C2A68C", +" R c #260A14", +" E c #6E5654", +" W c #260614", +" Q c #C69E7C", +" ! c #1E020C", +" ~ c #160204", +" ^ c #A69284", +" / c #5E4244", +" ( c #FED6AC", +" ) c #F2D6B4", +" _ c #AE8264", +" ` c #968274", +" ' c #462E2C", +" ] c #9A7664", +" [ c #E2C2A4", +" { c #9A7264", +" } c #DABE9C", +" | c #867264", +". c #E6BA94", +".. c #361A1C", +".X c #CAAA8C", +".o c #765E54", +".O c #26060C", +".+ c #C29E84", +".@ c #26020C", +".# c #C29A84", +".$ c #1E0204", +".% c #12020C", +".& c #B28A74", +".* c #FAD6B4", +".= c #523E44", +".- c #4A363C", +".; c #AA7E6C", +".: c #F6C69C", +".> c #422A34", +"., c #8E7664", +".< c #9A725C", +".1 c #E2BE9C", +".2 c #8E7264", +".3 c #E2BA9C", +".4 c #DAB694", +".5 c #321A24", +/* pixels */ +".@ y y y.$.$ !.$.$.$ ! p.$ = p p p ! ! !", +" y y.$ p.$ !.$ ! !.O p p = p = = = p p p", +" y.$ ! ! p.$ f v.< r z y p ~ p p = = = =", +" y !.$.$ 0 a 9 Q , n / U V = V V ~ p p.$", +" ! ! =.. 8 l 6 # , n i...$ ~ ~ = = V V =", +" y.$ y N g l 9.# , x r 4 & V = ~ ~ p p p", +" !.$.o ( d l 9.# _ n e 4 t ~ V = = = V =", +" ! y 2 :.: 3 . Q F P X z U V p ~ ~ ~ ~ ~", +" y J C d.: 3 ..+ F P * f U V.% V V V V =", +" ! Y ( : j. N u H x e K W V - - - ~ ~ ~", +" ! ` A : l 5 o.+.; x E K R p - -.% - V V", +" ! < A : 1.3 m u F 7 r.- +.% - - - V ~ ~", +" ! % A.* L. b B ; { e K R V.% - -.% V ~", +" ! 0 s A : 1 9 m.& k I.= &.% -.%.% ~ - V", +" ! ! ^ C : 1.4 w D k q h & - - - - V ~ =", +" ! =.5 G.* L c w D ] M.> & V V ~ V ~ V ~", +" y.$.$ / ) L.1.X.&.2 @.> ~ -.% - - ~ V V", +" ! = V ~ > } [.X Z., * V V - V V V ~ =", +" ! ! = p V O | T D | S & ~ V ~ p ~ V ~ V", +" ! !.$ !.$ p = $ '.- O p V ~ V V = ~ ~ =" +}; diff --git a/konquest/pics/planet6.xpm b/konquest/pics/planet6.xpm new file mode 100644 index 00000000..196b5ed7 --- /dev/null +++ b/konquest/pics/planet6.xpm @@ -0,0 +1,110 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 83 1", +/* colors */ +" c #2E0E0C", +". c #CE5A04", +"X c #CE5604", +"o c #1A0E0C", +"O c #CE5204", +"+ c #1A0A0C", +"@ c #1A060C", +"# c #06020C", +"$ c #BA4604", +"% c #BA3E04", +"& c #A64A04", +"* c #BA3A04", +"= c #A63E04", +"- c #A63A04", +"; c #A63604", +": c #923A04", +"> c #923204", +", c #7E2604", +"< c #6A2E04", +"1 c #6A2A04", +"2 c #561A04", +"3 c #4A1A0C", +"4 c #36160C", +"5 c #D65E04", +"6 c #D65A04", +"7 c #220A0C", +"8 c #C24E04", +"9 c #0E060C", +"0 c #C24A04", +"q c #0E020C", +"w c #C24604", +"e c #C24204", +"r c #060204", +"t c #AE4604", +"y c #9A3E04", +"u c #722E04", +"i c #722204", +"p c #4A1604", +"a c #3E120C", +"s c #2A0E0C", +"d c #CA5604", +"f c #CA5204", +"g c #CA4E04", +"h c #16060C", +"j c #CA4A04", +"k c #B64E04", +"l c #B64604", +"z c #B64204", +"x c #B63A04", +"c c #A24604", +"v c #A24204", +"b c #A23604", +"n c #8E3204", +"m c #7A2A04", +"M c #7A2604", +"N c #662A04", +"B c #662204", +"V c #5A220C", +"C c #521A04", +"Z c #32160C", +"A c #D25A04", +"S c #D25604", +"D c #1E0A0C", +"F c #BE4A04", +"G c #0A020C", +"H c #BE4204", +"J c #AA3E04", +"K c #AA3604", +"L c #963A04", +"P c #963204", +"I c #6E2204", +"U c #3A1A0C", +"Y c #3A120C", +"T c #260A0C", +"R c #C65604", +"E c #12060C", +"W c #C64A04", +"Q c #C64604", +"! c #B24E04", +"~ c #8A3204", +"^ c #763204", +"/ c #762604", +"( c #621E04", +/* pixels */ +"#r#r#r#r#rr#r#r#r#r#", +"r#r#r#GhD+qr#r#r#r#r", +"r#r#GUum/(aTqr#r#r##", +"#rrqNLb-b>,CsGr#r#rr", +"##rN=z%%x-P,C7Grr###", +"rrZ=zwweHxbnIY9###rr", +"#r^lWgjQ%*;>m3Drr##r", +"r9y8fffWwxKP,CT##rr#", +"r+JROOOjw*KP,2TG##r#", +"ro&XAXOfw%;P,CTrrr#r", +"r9cd66Sf0%;>Mp@##r##", +"#r^R556Sgz;~ia@rr#rr", +"rrZ!XAA.f$-~B q#r##r", +"##rNkRd8FJ:mp+rr#rr#", +"r#r9<vttv:m3D##r##r#", +"#r#rr41^uVYhrrr##r#r", +"#r#rrrrEE9r###r##r##", +"r#r####rrrrrr##rr#rr", +"r#rrrrr#####rr##r###", +"#r##r##r##r####r#rrr" +}; diff --git a/konquest/pics/planet7.xpm b/konquest/pics/planet7.xpm new file mode 100644 index 00000000..7d7fda20 --- /dev/null +++ b/konquest/pics/planet7.xpm @@ -0,0 +1,122 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 95 2", +/* colors */ +" c #765674", +" . c #7A5264", +" X c #BE8EB4", +" o c #724A5C", +" O c #B686AC", +" + c #664664", +" @ c #6A3E54", +" # c #563E54", +" $ c #563A54", +" % c #4E3A4C", +" & c #4E364C", +" * c #9E7294", +" = c #9E6E94", +" - c #522E3C", +" ; c #3E2A3C", +" : c #D2A6D4", +" > c #362234", +" , c #CA9ECC", +" < c #925A74", +" 1 c #2E1E2C", +" 2 c #1E121C", +" 3 c #6E4A64", +" 4 c #B28AB4", +" 5 c #0E0A0C", +" 6 c #C27A9C", +" 7 c #0E060C", +" 8 c #A27AA4", +" 9 c #060604", +" 0 c #060204", +" q c #56364C", +" w c #F6AEDC", +" e c #E2AEDC", +" r c #4E2E44", +" t c #826284", +" y c #D29ECC", +" u c #7A5A7C", +" i c #D696BC", +" p c #865674", +" a c #2E1A24", +" s c #725A74", +" d c #725274", +" f c #26161C", +" g c #BA8AB4", +" h c #624A64", +" j c #160A0C", +" k c #5E3A4C", +" l c #A27A9C", +" z c #523A54", +" x c #F2B6E4", +" c c #5E364C", +" v c #AE7294", +" b c #E2AAD4", +" n c #926A8C", +" m c #462634", +" M c #CEA2D4", +" N c #322634", +" B c #322234", +" V c #825E7C", +" C c #8E5A74", +" Z c #2A222C", +" A c #2A1A2C", +" S c #CA92BC", +" D c #1A121C", +" F c #C682A4", +" G c #62465C", +" H c #0A0A0C", +" J c #0A060C", +" K c #EEBAEC", +" L c #9E7AA4", +" P c #020204", +" I c #E6B6E4", +" U c #F2B2DC", +" Y c #E6B2E4", +" T c #DEAEDC", +" R c #4A2E44", +" E c #EE9EC4", +" W c #8A5E7C", +" Q c #C696C4", +" ! c #7A526C", +" ~ c #BE92BC", +" ^ c #22121C", +" / c #7E4A5C", +" ( c #1A0E14", +" ) c #AE82AC", +" _ c #120A0C", +" ` c #56425C", +" ' c #B27A9C", +" ] c #0A0604", +" [ c #AA7694", +" { c #9E769C", +" } c #967294", +" | c #D6A2CC", +". c #3A1E2C", +".. c #DA96BC", +".X c #8A5674", +/* pixels */ +" P P P P P P P P P P P P ( a ( P P P P P", +" P P P P P P P P P P 1 o / - j P P P P P", +" P P P P P P P P 5 W v.X @ m 7 P P P P P", +" P P P P P P P _ O.. [ p k. 5 P P P P P", +" P P P P P P 9 l b X n 3 R ^ P P P P P P", +" P P P P P P % M y O n + ; D P P P P P P", +" P P P P P 9 4 : ~ 8 t G m _ P P P P P P", +" P P P P P N T Y Q L u # B 5 P P P P P P", +" P P P P P h K I y ) V $ 1 J P P P P P P", +" P P P P P K e Q { z 1 9 P P P P P P", +" P P P P P s T | g = d & f P P P P P P P", +" P P P P P ` , , X } d & A 0 P P P P P P", +" P P P P P Z M : X { # B J P P P P P P", +" P P P P P 0 4 Y | O n + > ] P P P P P P", +" P P P P P P % x U S = 3 ; _ P P P P P P", +" P P P P P P P * w i v ! r ^ P P P P P P", +" P P P P P P P H ' E F C q ^ P P P P P P", +" P P P P P P P P 0 . 6 < c f P P P P P P", +" P P P P P P P P P P 2 c @. 0 P P P P P", +" P P P P P P P P P P P P 0 ( ] P P P P P" +}; diff --git a/konquest/pics/planet8.xpm b/konquest/pics/planet8.xpm new file mode 100644 index 00000000..f1fbe368 --- /dev/null +++ b/konquest/pics/planet8.xpm @@ -0,0 +1,189 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 162 2", +/* colors */ +" c #362214", +" . c #A2623C", +" X c #8E5A3C", +" o c #8E563C", +" O c #825644", +" + c #76564C", +" @ c #1A120C", +" # c #865234", +" $ c #7A523C", +" % c #7A4E3C", +" & c #6E4E44", +" * c #6E4A44", +" = c #EA9E54", +" - c #7E522C", +" ; c #66463C", +" : c #5A4644", +" > c #5A4244", +" , c #E2964C", +" < c #523E3C", +" 1 c #523A3C", +" 2 c #DA8644", +" 3 c #CE824C", +" 4 c #3E363C", +" 5 c #D27E3C", +" 6 c #C67E44", +" 7 c #C67A44", +" 8 c #2A2A3C", +" 9 c #BE723C", +" 0 c #32221C", +" q c #321E1C", +" w c #AA663C", +" e c #9E6244", +" r c #92624C", +" t c #A26234", +" y c #965E3C", +" u c #8A5A44", +" i c #825A3C", +" p c #82563C", +" a c #82523C", +" s c #765244", +" d c #764E44", +" f c #6A4E4C", +" g c #6E4E3C", +" h c #6E4A3C", +" j c #624644", +" k c #724E2C", +" l c #D28E5C", +" z c #5A423C", +" x c #4E4244", +" c c #D68A4C", +" v c #D6864C", +" b c #CA8654", +" n c #523A34", +" m c #46363C", +" M c #CE8244", +" N c #CE7E44", +" B c #C27A4C", +" V c #322E3C", +" C c #C6763C", +" Z c #A27254", +" A c #A26E54", +" S c #3A2A1C", +" D c #BE7234", +" F c #B26E3C", +" G c #B26A3C", +" H c #A66A44", +" J c #321E14", +" K c #9E623C", +" L c #925E44", +" P c #1E1614", +" I c #8A5A3C", +" U c #8A563C", +" Y c #16120C", +" T c #825234", +" R c #764E3C", +" E c #764A3C", +" W c #5E4A4C", +" Q c #E69A54", +" ! c #6E4634", +" ~ c #62463C", +" ^ c #62423C", +" / c #564244", +" ( c #DE924C", +" ) c #DE8E4C", +" _ c #423A44", +" ` c #D68644", +" ' c #CA824C", +" ] c #52362C", +" [ c #3A323C", +" { c #C67634", +" } c #362A24", +" | c #BA723C", +". c #1E2634", +".. c #A26A4C", +".X c #966654", +".o c #3A2614", +".O c #9A6244", +".+ c #925E3C", +".@ c #865A44", +".# c #7A564C", +".$ c #1E120C", +".% c #120E14", +".& c #7E523C", +".* c #724E44", +".= c #6A4A3C", +".- c #6A463C", +".; c #5E4644", +".: c #E6964C", +".> c #020204", +"., c #DA9254", +".< c #563E3C", +".1 c #4A3E44", +".2 c #664224", +".3 c #DE8A44", +".4 c #D2864C", +".5 c #C68254", +".6 c #CA7E44", +".7 c #BE7A4C", +".8 c #2E2E3C", +".9 c #3E2E24", +".0 c #C2763C", +".q c #C2723C", +".w c #1A263C", +".e c #9E6E54", +".r c #BA6E34", +".t c #AE6E3C", +".y c #AE6A3C", +".u c #A26A44", +".i c #AE663C", +".p c #A26644", +".a c #A66634", +".s c #9A5E3C", +".d c #8E5E44", +".f c #925A34", +".g c #86563C", +".h c #7A5244", +".j c #6E524C", +".k c #6E4E4C", +".l c #7E4E34", +".z c #724A3C", +".x c #664A44", +".c c #664644", +".v c #5A464C", +".b c #E29654", +".n c #5E463C", +".m c #524244", +".M c #523E44", +".N c #6E4224", +".B c #DA8A4C", +".V c #4A3A3C", +".C c #5A3A24", +".Z c #D28244", +".A c #BA7E54", +".S c #423234", +".D c #36323C", +".F c #CA7A3C", +".G c #B2764C", +".H c #B2724C", +".J c #B66E3C", +".K c #AA6E44", +".L c #322224", +".P c #9E6A4C", +/* pixels */ +".>.>.>.>.>.>.o -.a F.a.f.N .>.>.>.>.>.>", +".>.>.>.> J.t ).3.Z G M.B.G.y K J.>.>.>.>", +".>.>.>.C.F.B ) , ).4., b f.n.# H.2.>.>.>", +".>.>.C 7 v.b Q = c.4 B.e.;.D.w.V.P k.>.>", +".> J '.4 2 (.b.b.:.Z c.A.V. .w.w & l.o.>", +".>.p c 3 M.: Q =.b.0 B b < V. 4.m.X.G.>", +" 0.7 3.F.4.B ) Q c ` ' g ^ 4 8 4 W W.5 S", +" ! 9 3 N 5.Z v ) ) c.p s / [ 8.D : + A i", +" X 6 ' 3 M.4 ) `.Z.K u z j.1.8.8 x.j...u", +" e | N C t 7 `.6 F.d ; O.M.;.V _.1 f.H.7", +" u.J.6.0.J.F 5 | ..&.< $.<.M >.;.v f.P.G", +" ] X 9 {.0 C C G e e.p.@.c ; <.x : f.k R", +".L 1 a.i {.F.q |.O p h.h.h d *.<.V / > }", +" P R ! E w.r D.r w e a p.@.* ~.= m.< /.%", +".> !.g T U.s.i.y.y.y L.d.@ z ~ < / ;.S.>", +".>.$ # #.g X.+ y . I n.- a % R n ; ; @.>", +".>.> .l T # o.f.s y I.+.+ a d R $ q.>.>", +".>.>.> q.N E h R O u o U O.& h h 0.>.>.>", +".>.>.>.> Y ] ;.- E $.z.h +.#.<.%.>.>.>.>", +".>.>.>.>.>.> @.9.n r Z.e h 0.>.>.>.>.>.>" +}; diff --git a/konquest/pics/planet9.xpm b/konquest/pics/planet9.xpm new file mode 100644 index 00000000..a8a96c17 --- /dev/null +++ b/konquest/pics/planet9.xpm @@ -0,0 +1,168 @@ +/* XPM */ +static char *noname[] = { +/* width height ncolors chars_per_pixel */ +"20 20 141 2", +/* colors */ +" c #760604", +" . c #620604", +" X c #4E0A04", +" o c #4E0604", +" O c #3A0604", +" + c #260604", +" @ c #E23204", +" # c #120604", +" $ c #E22E04", +" % c #E21E04", +" & c #CE2604", +" * c #CE1604", +" = c #CE1204", +" - c #F2AA0C", +" ; c #CE0A04", +" : c #F2A20C", +" > c #BA1204", +" , c #BA0E04", +" < c #F2960C", +" 1 c #BA0A04", +" 2 c #A60A04", +" 3 c #F2820C", +" 4 c #920E04", +" 5 c #920A04", +" 6 c #920604", +" 7 c #7E0A04", +" 8 c #6A0A04", +" 9 c #6A0604", +" 0 c #560604", +" q c #EA5204", +" w c #420604", +" e c #EA4604", +" r c #EA4204", +" t c #EA3A04", +" y c #EA3604", +" u c #D63E04", +" i c #1A0604", +" p c #060604", +" a c #D61A04", +" s c #C22604", +" d c #D60E04", +" f c #AE1E04", +" g c #C20E04", +" h c #AE1A04", +" j c #C20A04", +" k c #AE1604", +" l c #AE0E04", +" z c #AE0A04", +" x c #9A0E04", +" c c #9A0A04", +" v c #860A04", +" b c #860604", +" n c #F27204", +" m c #720A04", +" M c #720604", +" N c #5E0A04", +" B c #F25A04", +" V c #5E0604", +" C c #4A0604", +" Z c #F24604", +" A c #360604", +" S c #DE4604", +" D c #220604", +" F c #0E0604", +" G c #DE2604", +" H c #F6BA14", +" J c #DE1A04", +" K c #CA1204", +" L c #CA0E04", +" P c #B60E04", +" I c #8E2604", +" U c #B60A04", +" Y c #A20A04", +" T c #A20604", +" R c #8E0A04", +" E c #8E0604", +" W c #7A0E04", +" Q c #7A0A04", +" ! c #7A0604", +" ~ c #660A04", +" ^ c #660604", +" / c #520A04", +" ( c #520604", +" ) c #3E0604", +" _ c #2A0A04", +" ` c #2A0604", +" ' c #D24604", +" ] c #160604", +" [ c #E62A04", +" { c #F2C21C", +" } c #E62204", +" | c #020604", +". c #020204", +".. c #D21E04", +".X c #D21A04", +".o c #D21604", +".O c #BE1E04", +".+ c #D20E04", +".@ c #BE1604", +".# c #BE1204", +".$ c #BE0E04", +".% c #BE0A04", +".& c #AA0E04", +".* c #AA0A04", +".= c #AA0604", +".- c #960A04", +".; c #820A04", +".: c #6E0A04", +".> c #6E0604", +"., c #EE6604", +".< c #E2660C", +".1 c #EE6204", +".2 c #5A0A04", +".3 c #EE5A04", +".4 c #5A0604", +".5 c #EE5604", +".6 c #460A04", +".7 c #460604", +".8 c #EE3E04", +".9 c #320604", +".0 c #EE3604", +".q c #EE3204", +".w c #1E0604", +".e c #0A0604", +".r c #DA1E04", +".t c #DA1A04", +".y c #DA1204", +".u c #C61604", +".i c #F2A214", +".p c #C61204", +".a c #C60E04", +".s c #C60A04", +".d c #B21604", +".f c #B20E04", +".g c #B20A04", +".h c #9E0A04", +".j c #9E0604", +".k c #F27614", +".l c #8A0A04", +".z c #8A0604", +".x c #760E04", +/* pixels */ +" p p p | | p p p ] ` D F p p p | | | p p", +". . . . . _ m 5 c.-.; M o.w. . . . . . ", +" | | p p.2 l , 5.f l.- ! w . ( + p | | |", +". . . C v.l M R ,.p 1 v M.4 o 0 (. . . ", +" p p.9.> O ` (.d.t a , , 5 ~ E z X p |", +". # C ~ 0.4.2.p Y 7 / 9 2 l ..7 z i. ", +". (.:.9.2 9.7.9 O ) w.4 D.2 8 m.w v N |", +" i .l.4 C 0 D.7.x.; E.z V 2 x z b.; 6. ", +" O.2 m.- ( M.6 w h.l > 1.h 4 % * * =.+ D", +" X b c.l R.u.. f.d s.<.<.X a.q Z.q.a g O", +" ).> Y 2 K P.* G.1 - { : r a.8 <.k G.h O", +" `.g E.- J.r.r t 3.i - H n t 3 < H.3.@ D", +" # , 8.6 l W P.$ = = $ q ' u.5.i., n S p", +". Q.z.z.= N U L.s T ! & k } B.5 e [ I. ", +" p _.4.$.* x.g 1.s b V.& y.q.t.0 @.O i. ", +". . N g U L.% j U.* 5.$.a > J.t.#.7. p", +" p. .e.-.a L.s d.+ ; U U.= ,.o.g 0. . . ", +". |. .e Q.s d.y d.s 1.=.% j.j ). p. p", +". . . . . A 5 j ; ;.%.% U ^ #. . p. |", +" p p p p p | |.e.9 ) O +.e p. p p. p. " +}; diff --git a/konquest/pics/ruler.xpm b/konquest/pics/ruler.xpm new file mode 100644 index 00000000..6e60655c --- /dev/null +++ b/konquest/pics/ruler.xpm @@ -0,0 +1,21 @@ +/* XPM */ +static char * ruler_xpm[] = { +"16 16 2 1", +" c None", +". c #000000000000", +" ", +"................", +"................", +" . . . ", +" . . . ", +" . . . ", +" . . ", +" . . ", +" . ... ", +" . ..... ", +" . .. .. ", +" . ... ", +" ... ", +" .. ", +" ..... ", +" ..... "}; diff --git a/konquest/planet_info.cc b/konquest/planet_info.cc new file mode 100644 index 00000000..4c1d4be1 --- /dev/null +++ b/konquest/planet_info.cc @@ -0,0 +1,161 @@ +#include <qlabel.h> +#include <qlayout.h> +#include <qpalette.h> +#include <qcolor.h> +#include <kapplication.h> +#include <klocale.h> + +#include "planet_info.h" +#include <kglobal.h> +#include "planet_info.moc" + +PlanetInfo::PlanetInfo( QWidget *parent, QPalette palette ) + : QFrame( parent ) +{ + setPalette( palette ); + + name = new QLabel( this ); + name->setMinimumWidth( 100 ); + owner = new QLabel( this ); + owner->setMinimumWidth( 100 ); + ships = new QLabel( this ); + ships->setMinimumWidth( 100 ); + production = new QLabel( this ); + production->setMinimumWidth( 100 ); + kill_percent = new QLabel( this ); + kill_percent->setMinimumWidth( 100 ); + + clearDisplay(); + + QVBoxLayout *layout1 = new QVBoxLayout( this ); + + layout1->addWidget( name ); + layout1->addWidget( owner ); + layout1->addWidget( ships ); + layout1->addWidget( production ); + layout1->addWidget( kill_percent ); + layout1->addStretch(1); + + setMouseTracking( true ); + + setMinimumSize( sizeHint() ); + setMaximumHeight( sizeHint().height() ); +} + +PlanetInfo::~PlanetInfo() +{ + emptyPlanetInfoList(); +} + +QSize PlanetInfo::sizeHint() const +{ + int height; + + height = name->sizeHint().height() + + owner->sizeHint().height() + + ships->sizeHint().height() + + production->sizeHint().height()+ + kill_percent->sizeHint().height(); + + return QSize( 100, height ); +} + +void PlanetInfo::setPlanetList( PlanetList &newPlanets ) +{ + emptyPlanetInfoList(); + + PlanetListIterator itr( newPlanets ); + + Planet *p; + while( (p = itr()) ) { + planet_info_buffer *stats = new planet_info_buffer; + stats->planet = p; + planet_stats.append( stats ); + } + + rescanPlanets(); +} + +void PlanetInfo::rescanPlanets() +{ + PlanetInfoListIterator itr( planet_stats ); + planet_info_buffer *p; + + while( (p = itr()) ) { + p->production = p->planet->getProduction(); + p->ships = p->planet->getFleet().getShipCount(); + p->killRate = p->planet->getKillPercentage(); + } +} + +void PlanetInfo::clearDisplay() +{ + QString temp; + + temp = "<qt>" + i18n("Planet name: "); + name->setText( temp ); + + temp = "<qt>" + i18n("Owner: "); + owner->setText( temp ); + + temp = "<qt>" + i18n("Ships: "); + ships->setText( temp ); + + temp = "<qt>" + i18n("Production: "); + production->setText( temp ); + + temp = "<qt>" + i18n("Kill percent: "); + kill_percent->setText( temp ); +} + +void PlanetInfo::emptyPlanetInfoList() +{ + planet_stats.first(); + + planet_info_buffer *p; + while( (p = planet_stats.take()) ) { + delete p; + } + +} + +void PlanetInfo::showPlanet( Planet *planet ) +{ + if( planet->getPlayer()->isNeutral() ) { + clearDisplay(); + + QString temp; + + temp = "<qt>" + i18n("Planet name: %1").arg(planet->getName()); + name->setText( temp ); + return; + } + + QString nameToShow = planet->getName(); + + PlanetInfoListIterator itr( planet_stats ); + planet_info_buffer *p; + + while( (p = itr()) ) { + if( p->planet == planet ) { + + QString temp; + + temp = "<qt>" + i18n("Planet name: %1").arg(p->planet->getName()); + name->setText( temp ); + + temp = "<qt>" + i18n("Owner: %1").arg(p->planet->getPlayer()->getColoredName()); + owner->setText( temp ); + + temp = "<qt>" + i18n("Ships: %1").arg( KGlobal::locale()->formatNumber(p->ships, 0) ); + ships->setText( temp ); + + temp = "<qt>" + i18n("Production: %1").arg( KGlobal::locale()->formatNumber(p->production, 0) ); + production->setText( temp ); + + temp = "<qt>" + i18n("Kill percent: %1").arg( KGlobal::locale()->formatNumber(p->killRate, 3) ); + kill_percent->setText( temp ); + } + } +} + diff --git a/konquest/planet_info.h b/konquest/planet_info.h new file mode 100644 index 00000000..4080f6b9 --- /dev/null +++ b/konquest/planet_info.h @@ -0,0 +1,53 @@ +#ifndef _PLANET_INFO_H_ +#define _PLANET_INFO_H_ + +#include <qframe.h> +#include <qstring.h> +#include <qptrlist.h> +#include <qpalette.h> + +#include "gamecore.h" + +class QLabel; + +struct planet_info_buffer { + Planet *planet; + int production; + int ships; + float killRate; +}; + +typedef QPtrList<planet_info_buffer> PlanetInfoList; +typedef QPtrListIterator<planet_info_buffer> PlanetInfoListIterator; + +class PlanetInfo : public QFrame +{ + Q_OBJECT + +public: + PlanetInfo( QWidget *parent, QPalette palette ); + virtual ~PlanetInfo(); + + void setPlanetList( PlanetList &newPlanets ); + void rescanPlanets(); + QSize sizeHint() const; + +public slots: + void showPlanet( Planet * ); + +private: + void emptyPlanetInfoList(); + void clearDisplay(); + + PlanetList *planets; + PlanetInfoList planet_stats; + + QLabel *name; + QLabel *owner; + QLabel *ships; + QLabel *production; + QLabel *kill_percent; +}; + +#endif // _PLANET_INFO_H_ + diff --git a/konquest/scoredlg.cc b/konquest/scoredlg.cc new file mode 100644 index 00000000..685ba9c5 --- /dev/null +++ b/konquest/scoredlg.cc @@ -0,0 +1,80 @@ +#include <qlayout.h> +#include <kapplication.h> +#include <klocale.h> +#include <kpushbutton.h> +#include <kstdguiitem.h> + +#include "scoredlg.h" + +ScoreDlgListViewItem::ScoreDlgListViewItem(QListView *parent, QString s1, QString s2, QString s3, QString s4, QString s5, QString s6) : QListViewItem(parent, s1, s2, s3, s4, s5, s6) +{ +} + +int ScoreDlgListViewItem::compare(QListViewItem *i, int col, bool) const +{ + if (col == 0) + { + if (text(col) > i -> text(col)) return 1; + else if (text(col) < i -> text(col)) return -1; + else return 0; + } + else + { + if (text(col).toInt() > i -> text(col).toInt()) return 1; + else if (text(col).toInt() < i -> text(col).toInt()) return -1; + else return compare(i, 0, true); + } +} + + +ScoreDlg::ScoreDlg( QWidget *parent, const QString& title, PlayerList *players ) + : QDialog(parent, "ScoreDlg", true ), plrList(players) +{ + setCaption( kapp->makeStdCaption(title) ); + + scoreTable = new KListView( this, 0 ); + scoreTable->addColumn(i18n("Player")); + scoreTable->addColumn(i18n("Ships Built")); + scoreTable->addColumn(i18n("Planets Conquered")); + scoreTable->addColumn(i18n("Fleets Launched")); + scoreTable->addColumn(i18n("Fleets Destroyed")); + scoreTable->addColumn(i18n("Ships Destroyed")); + scoreTable->setMinimumSize( scoreTable->sizeHint() ); + + KPushButton *okButton = new KPushButton( KStdGuiItem::ok(), this ); + okButton->setMinimumSize( okButton->sizeHint() ); + okButton->setDefault(true); + + QVBoxLayout *layout1 = new QVBoxLayout( this ); + QHBoxLayout *layout2 = new QHBoxLayout; + + layout1->addWidget( scoreTable, 1 ); + layout1->addLayout( layout2 ); + + layout2->addStretch( 2 ); + layout2->addWidget( okButton ); + layout2->addStretch( 2 ); + + connect( okButton, SIGNAL(clicked()), this, SLOT(accept()) ); + + init(); + + resize( 580, 140 ); +} + +void +ScoreDlg::init() +{ + Player *curPlayer; + PlayerListIterator itr( *plrList ); + + for( ;(curPlayer = itr()); ) + new ScoreDlgListViewItem(scoreTable, + curPlayer->getName(), + QString("%1").arg(curPlayer->getShipsBuilt()), + QString("%1").arg(curPlayer->getPlanetsConquered()), + QString("%1").arg(curPlayer->getFleetsLaunched()), + QString("%1").arg(curPlayer->getEnemyFleetsDestroyed()), + QString("%1").arg(curPlayer->getEnemyShipsDestroyed())); +} + diff --git a/konquest/scoredlg.h b/konquest/scoredlg.h new file mode 100644 index 00000000..570a3b36 --- /dev/null +++ b/konquest/scoredlg.h @@ -0,0 +1,32 @@ +#ifndef _SCOREDLG_H_ +#define _SCOREDLG_H_ + +#include <klistview.h> + +#include <qdialog.h> + +#include "gamecore.h" + +class ScoreDlgListViewItem : public QListViewItem +{ + public: + ScoreDlgListViewItem(QListView *parent, QString s1, QString s2, QString s3, QString s4, QString s5, QString s6); + int compare(QListViewItem *i, int col, bool) const; +}; + +class ScoreDlg : public QDialog +{ + +public: + ScoreDlg( QWidget *parent, const QString& title, PlayerList *players ); + +private: + void init(); + + PlayerList *plrList; + QListView *scoreTable; + +}; + +#endif // _SCOREDLG_H_ + diff --git a/konquest/version.h b/konquest/version.h new file mode 100644 index 00000000..df59820a --- /dev/null +++ b/konquest/version.h @@ -0,0 +1,4 @@ +#ifndef KONQUEST_VERSION +#define KONQUEST_VERSION "1.1" +#endif + |