# HG changeset patch # User koda # Date 1318791810 -7200 # Node ID 4e8816cf94594a7b0ef19cbd1c3ccbc595c61a95 # Parent 026fd01a5e2c28209f520518743690adaab8aab1# Parent 74431bf4c632b6ad04be64b77013c406bc6d34a6 merge the changes applied to 0.9.16 diff -r 74431bf4c632 -r 4e8816cf9459 .hgtags --- a/.hgtags Sun Oct 16 19:02:48 2011 +0200 +++ b/.hgtags Sun Oct 16 21:03:30 2011 +0200 @@ -45,3 +45,4 @@ 718f98a9df122d73f3ba9add4d1654865199de31 Hedgewars-iOS-1.3 cba92708277b6d0aeabfff2b878845b7d848bdcd Hedgewars-iOS-1.3.1 74bc72746bec68806344f4ba7be0d1bc6e05d380 0.9.16-release +652a199d4f38f5becbec0839f5a1f63294dd89bf Hedgewars-iOS-1.3.2 diff -r 74431bf4c632 -r 4e8816cf9459 CMakeLists.txt --- a/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -12,7 +12,7 @@ #detect Mercurial revision (if present) -set(version_suffix "") #UNSET THIS VARIABLE AT RELEASE TIME +set(version_suffix "-dev") #UNSET THIS VARIABLE AT RELEASE TIME set(HGCHANGED "") IF(version_suffix MATCHES "-dev") set(HW_DEV true) @@ -41,8 +41,8 @@ #versioning set(CPACK_PACKAGE_VERSION_MAJOR 0) set(CPACK_PACKAGE_VERSION_MINOR 9) -set(CPACK_PACKAGE_VERSION_PATCH 16${version_suffix}) -set(HEDGEWARS_PROTO_VER 39) +set(CPACK_PACKAGE_VERSION_PATCH 17${version_suffix}) +set(HEDGEWARS_PROTO_VER 40) set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}") @@ -132,17 +132,17 @@ endif(APPLE) -#this snippet sets "Release" mode by default +#build Debug only when explicitally set if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE RELEASE CACHE STRING "Choose the type of build, options are: None Debug Release." FORCE) + set (CMAKE_BUILD_TYPE RELEASE CACHE STRING "Choose the type of build, options are: Debug Release." FORCE) endif (NOT CMAKE_BUILD_TYPE) -if(CMAKE_BUILD_TYPE MATCHES RELEASE OR CMAKE_BUILD_TYPE MATCHES "Release") +if(CMAKE_BUILD_TYPE MATCHES DEBUG OR CMAKE_BUILD_TYPE MATCHES "Debug" OR CMAKE_BUILD_TYPE MATCHES "debug") + message(STATUS "Building Debug") + set(Optz false) +else() message(STATUS "Building Release") set(Optz true) -else() - message(STATUS "Building Debug") - set(Optz false) endif() diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/AbstractPage.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/AbstractPage.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,101 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "AbstractPage.h" + +AbstractPage::AbstractPage(QWidget* parent) +{ + Q_UNUSED(parent); + + font14 = new QFont("MS Shell Dlg", 14); +} + +void AbstractPage::initPage() +{ + QGridLayout * pageLayout = new QGridLayout(this); + + // stretch grid space for body and footer + pageLayout->setColumnStretch(0,0); + pageLayout->setColumnStretch(1,1); + pageLayout->setRowStretch(0,1); + pageLayout->setRowStretch(1,0); + + // add back/exit button + btnBack = formattedButton(":/res/Exit.png", true); + pageLayout->addWidget(btnBack, 1, 0, 1, 1, Qt::AlignLeft | Qt::AlignBottom); + + // add body layout as defined by the subclass + pageLayout->addLayout(bodyLayoutDefinition(), 0, 0, 1, 2); + + // add footer layout + QLayout * fld = footerLayoutDefinition(); + if (fld != NULL) + pageLayout->addLayout(fld, 1, 1); + + // connect signals + connect(btnBack, SIGNAL(clicked()), this, SIGNAL(goBack())); + connectSignals(); +} + +QPushButton * AbstractPage::formattedButton(const QString & btname, bool hasIcon) +{ + QPushButton * btn = new QPushButton(this); + + if (hasIcon) + { + const QIcon& lp=QIcon(btname); + QSize sz = lp.actualSize(QSize(65535, 65535)); + btn->setIcon(lp); + btn->setFixedSize(sz); + btn->setIconSize(sz); + btn->setFlat(true); + btn->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + } + else + { + btn->setFont(*font14); + btn->setText(btname); + } + return btn; +} + +QPushButton * AbstractPage::addButton(const QString & btname, QGridLayout* grid, int wy, int wx, bool hasIcon) +{ + QPushButton * btn = formattedButton(btname, hasIcon); + grid->addWidget(btn, wy, wx); + return btn; +} + +QPushButton * AbstractPage::addButton(const QString & btname, QGridLayout* grid, int wy, int wx, int rowSpan, int columnSpan, bool hasIcon) +{ + QPushButton * btn = formattedButton(btname, hasIcon); + grid->addWidget(btn, wy, wx, rowSpan, columnSpan); + return btn; +} + +QPushButton * AbstractPage::addButton(const QString & btname, QBoxLayout* box, int where, bool hasIcon) +{ + QPushButton * btn = formattedButton(btname, hasIcon); + box->addWidget(btn, where); + return btn; +} + +void AbstractPage::setBackButtonVisible(bool visible) +{ + btnBack->setVisible(visible); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/AbstractPage.h --- a/QTfrontend/AbstractPage.h Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/AbstractPage.h Sun Oct 16 21:03:30 2011 +0200 @@ -45,78 +45,51 @@ class QAbstractItemModel; class QSettings; class QSlider; +class QGridlayout; class AbstractPage : public QWidget { Q_OBJECT - public: + signals: + void goBack(); - protected: - AbstractPage(QWidget* parent = 0) { - Q_UNUSED(parent); - - font14 = new QFont("MS Shell Dlg", 14); - //setFocusPolicy(Qt::StrongFocus); - } - virtual ~AbstractPage() {}; + protected: + // constructor and virtual destructor + AbstractPage(QWidget * parent = 0); - QPushButton* addButton(QString btname, QGridLayout* grid, int wy, int wx, bool iconed = false) { - QPushButton* butt = new QPushButton(this); - if (!iconed) { - butt->setFont(*font14); - butt->setText(btname); - //butt->setStyleSheet("background-color: #0d0544"); - } else { - const QIcon& lp=QIcon(btname); - QSize sz = lp.actualSize(QSize(65535, 65535)); - butt->setIcon(lp); - butt->setFixedSize(sz); - butt->setIconSize(sz); - butt->setFlat(true); - butt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - } - grid->addWidget(butt, wy, wx); - return butt; - }; + // call this in the constructor of your subclass + void initPage(); + + // the following methods are used during page construction + + // you MUST implement this method in your subclass + // only define layout, not behavior in here + virtual QLayout * bodyLayoutDefinition() = 0; + + // you CAN implement this method in your subclass + virtual QLayout * footerLayoutDefinition() { return NULL; }; - QPushButton* addButton(QString btname, QGridLayout* grid, int wy, int wx, int rowSpan, int columnSpan, bool iconed = false) { - QPushButton* butt = new QPushButton(this); - if (!iconed) { - butt->setFont(*font14); - butt->setText(btname); - } else { - const QIcon& lp=QIcon(btname); - QSize sz = lp.actualSize(QSize(65535, 65535)); - butt->setIcon(lp); - butt->setFixedSize(sz); - butt->setIconSize(sz); - butt->setFlat(true); - butt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - } - grid->addWidget(butt, wy, wx, rowSpan, columnSpan); - return butt; - }; + // you CAN but most likely want to implement this method in your subclass + // keep in mind not to expose twidgets as public! + // instead define a signal with a meaningful name and connect the widget + // signals to your page signals + virtual void connectSignals() {}; + + virtual ~AbstractPage() {}; - QPushButton* addButton(QString btname, QBoxLayout* box, int where, bool iconed = false) { - QPushButton* butt = new QPushButton(this); - if (!iconed) { - butt->setFont(*font14); - butt->setText(btname); - } else { - const QIcon& lp=QIcon(btname); - QSize sz = lp.actualSize(QSize(65535, 65535)); - butt->setIcon(lp); - butt->setFixedSize(sz); - butt->setIconSize(sz); - butt->setFlat(true); - butt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - } - box->addWidget(butt, where); - return butt; - }; + QPushButton * formattedButton(const QString & btname, bool hasIcon = false); + QPushButton * addButton(const QString & btname, QGridLayout * grid, int wy, int wx, bool hasIcon = false); + QPushButton * addButton(const QString & btname, QGridLayout * grid, int wy, int wx, int rowSpan, int columnSpan, bool hasIcon = false); + QPushButton * addButton(const QString & btname, QBoxLayout * box, int where, bool hasIcon = false); - QFont * font14; + void setBackButtonVisible(bool visible = true); + + QFont * font14; + + private: + + QPushButton * btnBack; }; #endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/CMakeLists.txt --- a/QTfrontend/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -28,6 +28,13 @@ find_package(SDL_mixer REQUIRED) include_directories(.) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/model) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/net) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/dialog) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/page) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/ui/widget) +include_directories(${CMAKE_CURRENT_SOURCE_DIR}/util) include_directories(${SDL_INCLUDE_DIR}) include_directories(${SDLMIXER_INCLUDE_DIR}) include_directories(${CMAKE_SOURCE_DIR}/misc/quazip) @@ -57,76 +64,30 @@ configure_file(${CMAKE_CURRENT_SOURCE_DIR}/hwconsts.cpp.in ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp) +file(GLOB NetCpp net/*.cpp) +file(GLOB ModelCpp model/*.cpp) +file(GLOB_RECURSE UIcpp ui/*.cpp) +file(GLOB UtilCpp util/*.cpp) + set(hwfr_src - HWApplication.cpp + ${ModelCpp} + ${NetCpp} + ${UIcpp} + ${UtilCpp} + AbstractPage.cpp + achievements.cpp + binds.cpp + drawmapscene.cpp game.cpp + gameuiconfig.cpp + HWApplication.cpp + hwform.cpp main.cpp - hwform.cpp + mapContainer.cpp + SDLs.cpp team.cpp - namegen.cpp - teamselect.cpp - teamselhelper.cpp - frameTeam.cpp - vertScrollArea.cpp - gameuiconfig.cpp ui_hwform.cpp - gamecfgwidget.cpp - pagemain.cpp - pageeditteam.cpp - pagemultiplayer.cpp - pageoptions.cpp - pagenet.cpp - pagenetserver.cpp - pagenetgame.cpp - pageinfo.cpp - pagedata.cpp - pagesingleplayer.cpp - pagetraining.cpp - pagecampaign.cpp - pageselectweapon.cpp - pageingame.cpp - pageroomslist.cpp - pageconnecting.cpp - pagescheme.cpp - pagegamestats.cpp - pageplayrecord.cpp - pageadmin.cpp - pagenettype.cpp - pagedrawmap.cpp - SquareLabel.cpp - hats.cpp - hedgehogerWidget.cpp - hwmap.cpp - mapContainer.cpp - tcpBase.cpp - about.cpp - proto.cpp - fpsedit.cpp - netserver.cpp - newnetclient.cpp - netudpserver.cpp - netudpwidget.cpp - netregister.cpp - netserverslist.cpp - chatwidget.cpp - binds.cpp - SDLs.cpp ${CMAKE_CURRENT_BINARY_DIR}/hwconsts.cpp - selectWeapon.cpp - itemNum.cpp - input_ip.cpp - igbox.cpp - weaponItem.cpp - misc.cpp - ammoSchemeModel.cpp - togglebutton.cpp - bgwidget.cpp - achievements.cpp - qaspectratiolayout.cpp - drawmapwidget.cpp - drawmapscene.cpp - themesmodel.cpp - databrowser.cpp ) #xfire integration @@ -145,77 +106,35 @@ set(hwfr_src ${hwfr_src} hedgewars.rc) endif(MINGW) +file(GLOB ModelHdr model/*.h) +file(GLOB NetHdr net/*.h) +file(GLOB_RECURSE UIhdr ui/*.h) +file(GLOB UtilHdr util/*.h) + + set(hwfr_moc_hdrs - HWApplication.h - game.h - hats.h - hwform.h - teamselect.h - teamselhelper.h - frameTeam.h - vertScrollArea.h - gameuiconfig.h - gamecfgwidget.h + ${ModelHdr} + ${NetHdr} + ${UIhdr} AbstractPage.h - pagenet.h - pagemultiplayer.h - pagenetserver.h - pageingame.h - pagetraining.h - pageeditteam.h - pageoptions.h - pagemain.h - pageinfo.h - pagedata.h - pagesingleplayer.h - pagenettype.h - pageconnecting.h - pagedrawmap.h - pagecampaign.h - pagenetgame.h - pageroomslist.h - pagegamestats.h - pageadmin.h - pagescheme.h - pageselectweapon.h - pageplayrecord.h - SquareLabel.h - hedgehogerWidget.h - hwmap.h + drawmapscene.h + game.h + gameuiconfig.h + HWApplication.h + hwform.h mapContainer.h - tcpBase.h - about.h - proto.h - fpsedit.h - netserver.h - newnetclient.h - netudpserver.h - netudpwidget.h - netregister.h - netserverslist.h - chatwidget.h SDLs.h - selectWeapon.h - itemNum.h - input_ip.h - igbox.h - weaponItem.h - misc.h - ammoSchemeModel.h - togglebutton.h - bgwidget.h - qaspectratiolayout.h - drawmapwidget.h - drawmapscene.h - themesmodel.h - databrowser.h ) set(hwfr_hdrs + ${UtilHdr} + team.h + achievements.h binds.h ui_hwform.h KB.h hwconsts.h + sdlkeys.h ) set(hwfr_rez hedgewars.qrc) diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/SquareLabel.cpp --- a/QTfrontend/SquareLabel.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include "SquareLabel.h" -#include "hwform.h" - -SquareLabel::SquareLabel(QWidget * parent) : - QWidget(parent) -{ - if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true); -} - -void SquareLabel::paintEvent(QPaintEvent * event) -{ - Q_UNUSED(event); - - QPainter painter(this); - int pixsize; - if (width() > height()) { - pixsize = height(); - painter.translate((width() - pixsize) / 2, 0); - } else { - pixsize = width(); - painter.translate(0, (height() - pixsize) / 2); - } - painter.drawPixmap(0, 0, pixsize, pixsize, pixmap.scaled(pixsize, pixsize, Qt::KeepAspectRatio)); -} - -void SquareLabel::setPixmap(const QPixmap & pixmap) -{ - this->pixmap = pixmap; - repaint(); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/SquareLabel.h --- a/QTfrontend/SquareLabel.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _SQUARELABEL_H -#define _SQUARELABEL_H - -#include -#include - -class SquareLabel : public QWidget -{ - Q_OBJECT - -public: - SquareLabel(QWidget * parent = 0); - - void setPixmap(const QPixmap & pixmap); -protected: - virtual void paintEvent(QPaintEvent * event); - -private: - QPixmap pixmap; - -}; - -#endif // _SQUARELABEL_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/about.cpp --- a/QTfrontend/about.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,146 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include "about.h" -#include "hwconsts.h" - -About::About(QWidget * parent) : - QWidget(parent) -{ - QGridLayout *mainLayout = new QGridLayout(this); - - QLabel *imageLabel = new QLabel; - QImage image(":/res/Hedgehog.png"); - imageLabel->setPixmap(QPixmap::fromImage(image)); - imageLabel->setScaledContents(true); - imageLabel->setMinimumWidth(2.8); - imageLabel->setMaximumWidth(280); - imageLabel->setMinimumHeight(30); - imageLabel->setMaximumHeight(300); - - mainLayout->addWidget(imageLabel, 0, 0, 2, 1); - - QLabel *lbl1 = new QLabel(this); - lbl1->setOpenExternalLinks(true); - lbl1->setText( - "" - "

Hedgewars

" - "

" + QLabel::tr("Version") + " " + *cVersionString + "

" - "

http://www.hedgewars.org/


" + - QLabel::tr("This program is distributed under the GNU General Public License") + - "
" - ); - lbl1->setWordWrap(true); - mainLayout->addWidget(lbl1, 0, 1); - - QTextBrowser *lbl2 = new QTextBrowser(this); - - lbl2->setOpenExternalLinks(true); - lbl2->setText( - "" + - QString("

") + - QLabel::tr("Developers:") + - "

" - "Engine, frontend, net server: Andrey Korotaev <unC0Rr@gmail.com>
" - "Many frontend improvements: Igor Ulyanov <disinbox@gmail.com>
" - "Many engine and frontend improvements: Derek Pomery <nemo@m8y.org>
" - "Drill rocket, Ballgun, RC Plane weapons: Martin Boze <afffect@gmail.com>
" - "Mine number and time game settings: David A. Cuadrado <krawek@gmail.com>
" - "Frontend improvements: Martin Minarik <ttsmj@pokec.sk>
" - "Frontend improvements: Kristian Lehmann <email@thexception.net>
" - "Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara <vittorio.giovara@gmail.com>
" - "Many engine and frontend improvements (and bugs): Richard Karolyi <sheepluva@" "ercatec.net>
" - "Gamepad and Lua integration: Mario Liebisch <mario.liebisch@gmail.com>
" - "Many engine improvements and graphics: Carlos Vives <mail@carlosvives.es>
" - "Maze maps: Henning Kühn <prg@cooco.de>
" - "Engine and frontend improvements: Henrik Rostedt <henrik.rostedt@gmail.com>
" - "Lua game modes and missions: John Lambert <redgrinner@gmail.com>
" - "Frontend improvements: Mayur Pawashe <zorgiepoo@gmail.com>
" - "Android port: Richard Deurwaarder <xeli@xelification.com>
" - "

" + - - QLabel::tr("Art:") + "

" - + QString::fromUtf8( - "

John Dum <fizzy@gmail.com>" - "
" - "Joshua Frese <joshfrese@gmail.com>" - "
" - "Stanko Tadić <stanko@mfhinc.net>" - "
" - "Julien Koesten <julienkoesten@aol.com>" - "
" - "Joshua O'Sullivan <coheedftw@hotmail.co.uk>" - "
" - "Nils Lück <nils.luck.design@gmail.com>" - "
" - "Guillaume Englert <genglert@hybird.org>" - "
" - "Hats: Trey Perry <tx.perry.j@gmail.com>" - "

") + - QLabel::tr("Sounds:") + "

" - "Hedgehogs voice: Stephen Alexander <ArmagonNo1@gmail.com>" - "
" - "John Dum <fizzy@gmail.com>" - "
" - "Jonatan Nilsson <jonatanfan@gmail.com>" - "
" - "Daniel Martin <elhombresinremedio@gmail.com>" - "

" + - - QLabel::tr("Translations:") + "

" - + QString::fromUtf8( - "Brazilian Portuguese: Romulo Fernandes Machado <abra185@gmail.com>
" - "Bulgarian: Svetoslav Stefanov
" - "Czech: Petr Řezáček <rezacek@gmail.com>
" - "Chinese: Jie Luo <lililjlj@gmail.com>
" - "English: Andrey Korotaev <unC0Rr@gmail.com>
" - "Finnish: Nina Kuisma <ninnnu@gmail.com>
" - "French: Antoine Turmel <geekshadow@gmail.com>
" - "German: Peter Hüwe <PeterHuewe@gmx.de>, Mario Liebisch <mario.liebisch@gmail.com>, Richard Karolyi <sheepluva@" "ercatec.net>
" - "Greek: <talos_kriti@yahoo.gr>
" - "Italian: Luca Bonora <bonora.luca@gmail.com>, Marco Bresciani
" - "Japanese: ADAM Etienne <etienne.adam@gmail.com>
" - "Korean: Anthony Bellew <webmaster@anthonybellew.com>
" - "Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
" - "Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny
" - "Portuguese: Fábio Canário <inufabie@gmail.com>
" - "Russian: Andrey Korotaev <unC0Rr@gmail.com>
" - "Slovak: Jose Riha
" - "Spanish: Carlos Vives <mail@carlosvives.es>
" - "Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
" - "Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <mansonigor@gmail.com>, Eugene Sakara <eresid@gmail.com>" - "

") + - - QLabel::tr("Special thanks:") + "

" - "Aleksey Andreev <blaknayabr@gmail.com>
" - "Aleksander Rudalev <alexv@pomorsu.ru>
" - "Natasha Korotaeva <layout@pisem.net>
" - "Adam Higerd (aka ahigerd at FreeNode)" - "

" - ); - mainLayout->addWidget(lbl2, 1, 1); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/about.h --- a/QTfrontend/about.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _ABOUT_H -#define _ABOUT_H - -#include - - -class About : public QWidget -{ - Q_OBJECT - -public: - About(QWidget * parent = 0); -}; - -#endif // _ABOUT_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ammoSchemeModel.cpp --- a/QTfrontend/ammoSchemeModel.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,786 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2005-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "ammoSchemeModel.h" -#include "hwconsts.h" - -QList defaultScheme = QList() - << QVariant("Default") // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(false) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(45) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(5) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(4) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(2) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - -AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) : - QAbstractTableModel(parent), - fileConfig(fileName, QSettings::IniFormat) -{ - predefSchemesNames = QStringList() - << "Default" - << "Pro Mode" - << "Shoppa" - << "Clean Slate" - << "Minefield" - << "Barrel Mayhem" - << "Tunnel Hogs" - << "Fort Mode" - << "Timeless" - << "Thinking with Portals" - << "King Mode" - ; - - numberOfDefaultSchemes = predefSchemesNames.size(); - - spNames = QStringList() - << "name" // 0 - << "fortsmode" // 1 - << "divteams" // 2 - << "solidland" // 3 - << "border" // 4 - << "lowgrav" // 5 - << "laser" // 6 - << "invulnerability" // 7 - << "resethealth" // 8 - << "vampiric" // 9 - << "karma" // 10 - << "artillery" // 11 - << "randomorder" // 12 - << "king" // 13 - << "placehog" // 14 - << "sharedammo" // 15 - << "disablegirders" // 16 - << "disablelandobjects" // 17 - << "aisurvival" // 18 - << "infattack" // 19 - << "resetweps" // 20 - << "perhogammo" // 21 - << "disablewind" // 22 - << "morewind" // 23 - << "tagteam" // 24 - << "bottomborder" // 25 - << "damagefactor" // 26 - << "turntime" // 27 - << "health" // 28 - << "suddendeath" // 29 - << "caseprobability" // 30 - << "minestime" // 31 - << "minesnum" // 32 - << "minedudpct" // 33 - << "explosives" // 34 - << "healthprobability" // 35 - << "healthcaseamount" // 36 - << "waterrise" // 37 - << "healthdecrease" // 38 - << "ropepct" // 39 - << "getawaytime" // 40 - ; - - QList proMode; - proMode - << predefSchemesNames[1] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(true) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(15) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(0) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(0) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(2) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList shoppa; - shoppa - << predefSchemesNames[2] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(true) // solid land 3 - << QVariant(true) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(true) // shared ammo 15 - << QVariant(true) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(true) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(30) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(50) // sudden death 29 - << QVariant(1) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(0) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(0) // explosives 34 - << QVariant(0) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList cleanslate; - cleanslate - << predefSchemesNames[3] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(true) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(false) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(true) // inf. attack 19 - << QVariant(true) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(45) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(5) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(4) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(2) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList minefield; - minefield - << predefSchemesNames[4] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(true) // shared ammo 15 - << QVariant(true) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(30) // turn time 27 - << QVariant(50) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(0) // case prob 30 - << QVariant(0) // mines time 31 - << QVariant(80) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(0) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList barrelmayhem; - barrelmayhem - << predefSchemesNames[5] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(true) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(30) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(0) // case prob 30 - << QVariant(0) // mines time 31 - << QVariant(0) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(80) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList tunnelhogs; - tunnelhogs - << predefSchemesNames[6] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(true) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(true) // shared ammo 15 - << QVariant(true) // disable girders 16 - << QVariant(true) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(30) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(5) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(10) // mines number 32 - << QVariant(10) // mine dud pct 33 - << QVariant(10) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList forts; - forts - << predefSchemesNames[7] // name 0 - << QVariant(true) // fortsmode 1 - << QVariant(true) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(true) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(false) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(45) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(5) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(0) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(0) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList timeless; - timeless - << predefSchemesNames[8] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(false) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(true) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(9999) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(5) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(5) // mines number 32 - << QVariant(10) // mine dud pct 33 - << QVariant(2) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(30) // health case amt 36 - << QVariant(0) // water rise amt 37 - << QVariant(0) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList thinkingportals; - thinkingportals - << predefSchemesNames[9] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(true) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(false) // king 13 - << QVariant(false) // place hog 14 - << QVariant(false) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(45) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(2) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(5) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(5) // explosives 34 - << QVariant(25) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - QList kingmode; - kingmode - << predefSchemesNames[10] // name 0 - << QVariant(false) // fortsmode 1 - << QVariant(false) // team divide 2 - << QVariant(false) // solid land 3 - << QVariant(false) // border 4 - << QVariant(false) // low gravity 5 - << QVariant(false) // laser sight 6 - << QVariant(false) // invulnerable 7 - << QVariant(false) // reset health 8 - << QVariant(false) // vampiric 9 - << QVariant(false) // karma 10 - << QVariant(false) // artillery 11 - << QVariant(true) // random order 12 - << QVariant(true) // king 13 - << QVariant(false) // place hog 14 - << QVariant(false) // shared ammo 15 - << QVariant(false) // disable girders 16 - << QVariant(false) // disable land objects 17 - << QVariant(false) // AI survival 18 - << QVariant(false) // inf. attack 19 - << QVariant(false) // reset weps 20 - << QVariant(false) // per hog ammo 21 - << QVariant(false) // no wind 22 - << QVariant(false) // more wind 23 - << QVariant(false) // tag team 24 - << QVariant(false) // bottom border 25 - << QVariant(100) // damage modfier 26 - << QVariant(45) // turn time 27 - << QVariant(100) // init health 28 - << QVariant(15) // sudden death 29 - << QVariant(5) // case prob 30 - << QVariant(3) // mines time 31 - << QVariant(4) // mines number 32 - << QVariant(0) // mine dud pct 33 - << QVariant(2) // explosives 34 - << QVariant(35) // health case pct 35 - << QVariant(25) // health case amt 36 - << QVariant(47) // water rise amt 37 - << QVariant(5) // health dec amt 38 - << QVariant(100) // rope modfier 39 - << QVariant(100) // get away time 40 - ; - - - schemes.append(defaultScheme); - schemes.append(proMode); - schemes.append(shoppa); - schemes.append(cleanslate); - schemes.append(minefield); - schemes.append(barrelmayhem); - schemes.append(tunnelhogs); - schemes.append(forts); - schemes.append(timeless); - schemes.append(thinkingportals); - schemes.append(kingmode); - - - int size = fileConfig.beginReadArray("schemes"); - for (int i = 0; i < size; ++i) { - fileConfig.setArrayIndex(i); - - if (!predefSchemesNames.contains(fileConfig.value(spNames[0]).toString())) - { - QList scheme; - - for (int k = 0; k < spNames.size(); ++k) - scheme << fileConfig.value(spNames[k], defaultScheme[k]); - - schemes.append(scheme); - } - } - fileConfig.endArray(); -} - -QVariant AmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - Q_UNUSED(section); - Q_UNUSED(orientation); - Q_UNUSED(role); - - return QVariant(); -} - -int AmmoSchemeModel::rowCount(const QModelIndex &parent) const -{ - if (parent.isValid()) - return 0; - else - return schemes.size(); -} - -int AmmoSchemeModel::columnCount(const QModelIndex & parent) const -{ - if (parent.isValid()) - return 0; - else - return defaultScheme.size(); -} - -Qt::ItemFlags AmmoSchemeModel::flags(const QModelIndex & index) const -{ - Q_UNUSED(index); - - return - Qt::ItemIsEnabled - | Qt::ItemIsSelectable - | Qt::ItemIsEditable; -} - -bool AmmoSchemeModel::setData(const QModelIndex & index, const QVariant & value, int role) -{ - if (!index.isValid() || index.row() < numberOfDefaultSchemes - || index.row() >= schemes.size() - || index.column() >= defaultScheme.size() - || role != Qt::EditRole) - return false; - - schemes[index.row()][index.column()] = value; - - emit dataChanged(index, index); - return true; -} - -bool AmmoSchemeModel::insertRows(int row, int count, const QModelIndex & parent) -{ - Q_UNUSED(count); - - beginInsertRows(parent, schemes.size(), schemes.size()); - - if (row == -1) - { - QList newScheme = defaultScheme; - newScheme[0] = QVariant(tr("new")); - schemes.insert(schemes.size(), newScheme); - } - else - { - QList newScheme = schemes[row]; - newScheme[0] = QVariant(tr("copy of") + " " + newScheme[0].toString()); - schemes.insert(schemes.size(), newScheme); - } - - endInsertRows(); - - return true; -} - -bool AmmoSchemeModel::removeRows(int row, int count, const QModelIndex & parent) -{ - if(count != 1 - || row < numberOfDefaultSchemes - || row >= schemes.size()) - return false; - - beginRemoveRows(parent, row, row); - - schemes.removeAt(row); - - endRemoveRows(); - - return true; -} - -QVariant AmmoSchemeModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || index.row() < 0 - || index.row() >= schemes.size() - || index.column() >= defaultScheme.size() - || (role != Qt::EditRole && role != Qt::DisplayRole) - ) - return QVariant(); - - return schemes[index.row()][index.column()]; -} - -void AmmoSchemeModel::Save() -{ - fileConfig.beginWriteArray("schemes", schemes.size() - numberOfDefaultSchemes); - - for (int i = 0; i < schemes.size() - numberOfDefaultSchemes; ++i) { - fileConfig.setArrayIndex(i); - - QList scheme = schemes[i + numberOfDefaultSchemes]; - - for (int k = 0; k < scheme.size(); ++k) - fileConfig.setValue(spNames[k], scheme[k]); - } - fileConfig.endArray(); -} - - -NetAmmoSchemeModel::NetAmmoSchemeModel(QObject * parent) : - QAbstractTableModel(parent) -{ - netScheme = defaultScheme; -} - -QVariant NetAmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const -{ - Q_UNUSED(section); - Q_UNUSED(orientation); - Q_UNUSED(role); - - return QVariant(); -} - -int NetAmmoSchemeModel::rowCount(const QModelIndex & parent) const -{ - if (parent.isValid()) - return 0; - else - return 1; -} - -int NetAmmoSchemeModel::columnCount(const QModelIndex & parent) const -{ - if (parent.isValid()) - return 0; - else - return defaultScheme.size(); -} - -QVariant NetAmmoSchemeModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid() || index.row() < 0 - || index.row() > 1 - || index.column() >= defaultScheme.size() - || (role != Qt::EditRole && role != Qt::DisplayRole) - ) - return QVariant(); - - return netScheme[index.column()]; -} - -void NetAmmoSchemeModel::setNetSchemeConfig(QStringList & cfg) -{ - if(cfg.size() != netScheme.size()) - { - qWarning("Incorrect scheme cfg size"); - return; - } - - for(int i = 0; i < cfg.size(); ++i) - netScheme[i] = QVariant(cfg[i]); - - reset(); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ammoSchemeModel.h --- a/QTfrontend/ammoSchemeModel.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2005-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _AMMO_SCHEME_MODEL_INCLUDED -#define _AMMO_SCHEME_MODEL_INCLUDED - -#include -#include -#include -#include - -class AmmoSchemeModel : public QAbstractTableModel -{ - Q_OBJECT - -public: - AmmoSchemeModel(QObject * parent, const QString & fileName); - - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - int rowCount(const QModelIndex & parent) const; - int columnCount(const QModelIndex & parent) const; - Qt::ItemFlags flags(const QModelIndex & index) const; - bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); - bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()); - bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); - QVariant data(const QModelIndex &index, int role) const; - - int numberOfDefaultSchemes; - QStringList predefSchemesNames; - QStringList spNames; - -public slots: - void Save(); - -signals: - void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight); - -protected: - QList< QList > schemes; - -private: - QSettings fileConfig; -}; - -class NetAmmoSchemeModel : public QAbstractTableModel -{ - Q_OBJECT - -public: - NetAmmoSchemeModel(QObject * parent); - - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - int rowCount(const QModelIndex & parent) const; - int columnCount(const QModelIndex & parent) const; - QVariant data(const QModelIndex &index, int role) const; - -public slots: - void setNetSchemeConfig(QStringList & cfg); - -private: - QList netScheme; -}; - -#endif // _AMMO_SCHEME_MODEL_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/bgwidget.cpp --- a/QTfrontend/bgwidget.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,143 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2009 Kristian Lehmann - * Copyright (c) 2009-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "bgwidget.h" - -SpritePosition::SpritePosition(QWidget * parent, int sh) -{ - wParent = parent; - iSpriteHeight = sh; - reset(); -} - -SpritePosition::~SpritePosition() -{ -} - -void SpritePosition::move() -{ - fX += fXMov; - fY += fYMov; - iAngle += 4; - if (iAngle >= 360) iAngle = 0; - if (fY > wParent->height()) reset(); -} - -void SpritePosition::reset() -{ - fY = -1 * iSpriteHeight; - fX = (qrand() % ((int)(wParent->width() * 1.5))) - wParent->width()/2; - fYMov = ((qrand() % 400)+300) / 100.0f; - fXMov = fYMov * 0.2f+((qrand()%100)/100.0f * 0.6f); //so between 0.2 and 0.6, or 0.5 +/- 0.3 - iAngle = qrand() % 360; -} - -QPoint SpritePosition::pos() -{ - return QPoint((int)fX,(int)fY); -} - -int SpritePosition::getAngle() -{ - return iAngle; -} - -void SpritePosition::init() -{ - fY = qrand() % (wParent->height() + 1); - fX = qrand() % (wParent->width() + 1); -} - -BGWidget::BGWidget(QWidget * parent) : QWidget(parent) -{ - setAttribute(Qt::WA_NoSystemBackground, true); - sprite.load(":/res/Star.png"); - - setAutoFillBackground(false); - - for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i] = new SpritePosition(this, sprite.height()); - - for (int i = 0; i < 360; i++) - { - rotatedSprites[i] = new QImage(sprite.width(), sprite.height(), QImage::Format_ARGB32); - rotatedSprites[i]->fill(0); - - QPoint translate(sprite.width()/2, sprite.height()/2); - - QPainter p; - p.begin(rotatedSprites[i]); - // p.setRenderHint(QPainter::Antialiasing); - p.setRenderHint(QPainter::SmoothPixmapTransform); - p.translate(translate.x(), translate.y()); - p.rotate(i); - p.translate(-1*translate.x(), -1*translate.y()); - p.drawImage(0, 0, sprite); - } - - timerAnimation = new QTimer(); - connect(timerAnimation, SIGNAL(timeout()), this, SLOT(animate())); - timerAnimation->setInterval(ANIMATION_INTERVAL); -} - -BGWidget::~BGWidget() -{ - for (int i = 0; i < SPRITE_MAX; i++) delete spritePositions[i]; - for (int i = 0; i < 360; i++) delete rotatedSprites[i]; - delete timerAnimation; -} - -void BGWidget::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - QPainter p; - p.begin(this); - //p.setRenderHint(QPainter::Antialiasing); - for (int i = 0; i < SPRITE_MAX; i++) - { - QPoint point = spritePositions[i]->pos(); - p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()]); - } - p.end(); -} - -void BGWidget::animate() -{ - for (int i = 0; i < SPRITE_MAX; i++) - { - // bottom edge of star *seems* clipped, but in fact, if I switch to just plain old repaint()/update() it is still clipped - artifact of transform? As for 5, is arbitrary number. 4 was noticeably clipping, 5 seemed same as update() - I assume extra room is due to rotation and value really should be calculated proportional to width/height - update(spritePositions[i]->pos().x(),spritePositions[i]->pos().y(), sprite.width()+5, sprite.height()+5); - spritePositions[i]->move(); - } -} - -void BGWidget::startAnimation() -{ - timerAnimation->start(); -} - -void BGWidget::stopAnimation() -{ - timerAnimation->stop(); -} - -void BGWidget::init() -{ - for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i]->init(); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/bgwidget.h --- a/QTfrontend/bgwidget.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2009 Kristian Lehmann - * Copyright (c) 2009-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef BGWIDGET_H -#define BGWIDGET_H - -#include -//#include -#include -#include -#include -#include -#include - -#define SPRITE_MAX 12 - -#define ANIMATION_INTERVAL 40 - -class SpritePosition -{ -public: - SpritePosition(QWidget * parent, int sh); - ~SpritePosition(); -private: - float fX; - float fY; - float fXMov; - float fYMov; - int iAngle; - QWidget * wParent; - int iSpriteHeight; -public: - void move(); - void reset(); - QPoint pos(); - int getAngle(); - void init(); -}; - -class BGWidget : public QWidget -{ - Q_OBJECT -public: - BGWidget(QWidget * parent); - ~BGWidget(); - void startAnimation(); - void stopAnimation(); - void init(); -private: - QImage sprite; - QTimer * timerAnimation; - SpritePosition * spritePositions[SPRITE_MAX]; - QImage * rotatedSprites[360]; -protected: - void paintEvent(QPaintEvent * event); -private slots: - void animate(); -}; - -#endif // BGWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/chatwidget.cpp --- a/QTfrontend/chatwidget.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,576 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hwconsts.h" -#include "SDLs.h" -#include "gameuiconfig.h" -#include "chatwidget.h" - -ListWidgetNickItem::ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored) : QListWidgetItem(nick) -{ - this->aFriend = isFriend; - this->isIgnored = isIgnored; -} - -void ListWidgetNickItem::setFriend(bool isFriend) -{ - this->aFriend = isFriend; -} - -void ListWidgetNickItem::setIgnored(bool isIgnored) -{ - this->isIgnored = isIgnored; -} - -bool ListWidgetNickItem::isFriend() -{ - return aFriend; -} - -bool ListWidgetNickItem::ignored() -{ - return isIgnored; -} - -bool ListWidgetNickItem::operator< (const QListWidgetItem & other) const -{ - // case in-sensitive comparison of the associated strings - // chars that are no letters are sorted at the end of the list - - ListWidgetNickItem otherNick = const_cast(dynamic_cast(other)); - - // ignored always down - if (isIgnored != otherNick.ignored()) - return !isIgnored; - - // friends always up - if (aFriend != otherNick.isFriend()) - return aFriend; - - QString txt1 = text().toLower(); - QString txt2 = other.text().toLower(); - - bool firstIsShorter = (txt1.size() < txt2.size()); - int len = firstIsShorter?txt1.size():txt2.size(); - - for (int i = 0; i < len; i++) - { - if (txt1[i] == txt2[i]) - continue; - if (txt1[i].isLetter() != txt2[i].isLetter()) - return txt1[i].isLetter(); - return (txt1[i] < txt2[i]); - } - - return firstIsShorter; -} - -const char* HWChatWidget::STYLE = -"\ -a { color:#c8c8ff; }\ -.nick { text-decoration: none; }\ -.UserChat .nick { color:#ffec20; }\ -.FriendChat { color: #08e008; }\ -.FriendChat .nick { color: #20ff20; }\ -.UserJoin { color: #c0c0c0; }\ -.UserJoin .nick { color: #d0d0d0; }\ -.FriendJoin { color: #c0e0c0; }\ -.FriendJoin .nick { color: #d0f0d0; }\ -.UserAction { color: #ff80ff; }\ -.UserAction .nick { color: #ffa0ff; }\ -.FriendAction { color: #ff00ff; }\ -.FriendAction .nick { color: #ff30ff; }\ -"; - -HWChatWidget::HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify) : - QWidget(parent), - mainLayout(this) -{ - this->gameSettings = gameSettings; - this->sdli = sdli; - this->notify = notify; - if(notify && gameSettings->value("frontend/sound", true).toBool()) { - QFile tmpfile; - sdli->SDLMusicInit(); - for(int i=0;i<4;i++) { - tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Sounds/voices/Classic/Hello.ogg"); - if (tmpfile.exists()) sound[i] = Mix_LoadWAV(QFileInfo(tmpfile).absoluteFilePath().toLocal8Bit().constData()); - else sound[i] = Mix_LoadWAV(QString(datadir->absolutePath() + - "/Sounds/voices/Classic/Hello.ogg").toLocal8Bit().constData()); - } - } - - mainLayout.setSpacing(1); - mainLayout.setMargin(1); - mainLayout.setSizeConstraint(QLayout::SetMinimumSize); - mainLayout.setColumnStretch(0, 76); - mainLayout.setColumnStretch(1, 24); - - chatEditLine = new QLineEdit(this); - chatEditLine->setMaxLength(300); - connect(chatEditLine, SIGNAL(returnPressed()), this, SLOT(returnPressed())); - - mainLayout.addWidget(chatEditLine, 2, 0); - - chatText = new QTextBrowser(this); - chatText->document()->setDefaultStyleSheet(STYLE); - chatText->setMinimumHeight(20); - chatText->setMinimumWidth(10); - chatText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - chatText->setOpenLinks(false); - connect(chatText, SIGNAL(anchorClicked(const QUrl&)), - this, SLOT(linkClicked(const QUrl&))); - mainLayout.addWidget(chatText, 0, 0, 2, 1); - - chatNicks = new QListWidget(this); - chatNicks->setMinimumHeight(10); - chatNicks->setMinimumWidth(10); - chatNicks->setSortingEnabled(true); - chatNicks->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - chatNicks->setContextMenuPolicy(Qt::ActionsContextMenu); - connect(chatNicks, SIGNAL(itemDoubleClicked(QListWidgetItem *)), - this, SLOT(chatNickDoubleClicked(QListWidgetItem *))); - connect(chatNicks, SIGNAL(currentRowChanged(int)), - this, SLOT(chatNickSelected(int))); - - mainLayout.addWidget(chatNicks, 0, 1, 3, 1); - - acInfo = new QAction(QAction::tr("Info"), chatNicks); - acInfo->setIcon(QIcon(":/res/info.png")); - connect(acInfo, SIGNAL(triggered(bool)), this, SLOT(onInfo())); - acKick = new QAction(QAction::tr("Kick"), chatNicks); - acKick->setIcon(QIcon(":/res/kick.png")); - connect(acKick, SIGNAL(triggered(bool)), this, SLOT(onKick())); - acBan = new QAction(QAction::tr("Ban"), chatNicks); - acBan->setIcon(QIcon(":/res/ban.png")); - connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan())); - acFollow = new QAction(QAction::tr("Follow"), chatNicks); - acFollow->setIcon(QIcon(":/res/follow.png")); - connect(acFollow, SIGNAL(triggered(bool)), this, SLOT(onFollow())); - acIgnore = new QAction(QAction::tr("Ignore"), chatNicks); - acIgnore->setIcon(QIcon(":/res/ignore.png")); - connect(acIgnore, SIGNAL(triggered(bool)), this, SLOT(onIgnore())); - acFriend = new QAction(QAction::tr("Add friend"), chatNicks); - acFriend->setIcon(QIcon(":/res/addfriend.png")); - connect(acFriend, SIGNAL(triggered(bool)), this, SLOT(onFriend())); - - chatNicks->insertAction(0, acFriend); - chatNicks->insertAction(0, acInfo); - chatNicks->insertAction(0, acIgnore); - - showReady = false; - setShowFollow(true); -} - -void HWChatWidget::linkClicked(const QUrl & link) -{ - if (link.scheme() == "http") - QDesktopServices::openUrl(link); - if (link.scheme() == "hwnick") - { - // decode nick - const QString& nick = QString::fromUtf8(QByteArray::fromBase64(link.encodedQuery())); - QList items = chatNicks->findItems(nick, Qt::MatchExactly); - if (items.size() < 1) - return; - QMenu * popup = new QMenu(this); - // selecting an item will automatically scroll there, so let's save old position - QScrollBar * scrollBar = chatNicks->verticalScrollBar(); - int oldScrollPos = scrollBar->sliderPosition(); - // select the nick which we want to see the actions for - chatNicks->setCurrentItem(items[0], QItemSelectionModel::Clear); - // selecting an item will automatically scroll there, so let's save old position - scrollBar->setSliderPosition(oldScrollPos); - // load actions - popup->addActions(chatNicks->actions()); - // display menu popup at mouse cursor position - popup->popup(QCursor::pos()); - } -} - -void HWChatWidget::setShowFollow(bool enabled) -{ - if (enabled) { - if (!(chatNicks->actions().contains(acFollow))) - chatNicks->insertAction(acFriend, acFollow); - } - else { - if (chatNicks->actions().contains(acFollow)) - chatNicks->removeAction(acFollow); - } -} - -void HWChatWidget::loadList(QStringList & list, const QString & file) -{ - list.clear(); - QFile txt(cfgdir->absolutePath() + "/" + file); - if(!txt.open(QIODevice::ReadOnly)) - return; - QTextStream stream(&txt); - stream.setCodec("UTF-8"); - - while(!stream.atEnd()) - { - QString str = stream.readLine(); - if(str.startsWith(";") || str.length() == 0) - continue; - list << str.trimmed(); - } - //readd once we require newer Qt than 4.4 - //list.removeDuplicates(); - txt.close(); -} - -void HWChatWidget::saveList(QStringList & list, const QString & file) -{ - QFile txt(cfgdir->absolutePath() + "/" + file); - if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate)) - return; - QTextStream stream(&txt); - stream.setCodec("UTF-8"); - - stream << "; this list is used by Hedgewars - do not edit it unless you know what you're doing!" << endl; - for(int i = 0; i < list.size(); i++) - stream << list[i] << endl; - txt.close(); -} - -void HWChatWidget::updateNickItem(QListWidgetItem *nickItem) -{ - QString nick = nickItem->text(); - ListWidgetNickItem * item = dynamic_cast(nickItem); - - item->setFriend(friendsList.contains(nick, Qt::CaseInsensitive)); - item->setIgnored(ignoreList.contains(nick, Qt::CaseInsensitive)); - - if(item->ignored()) - { - item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on.png" : ":/res/chat_ignore_off.png") : ":/res/chat_ignore.png")); - item->setForeground(Qt::gray); - } - else if(item->isFriend()) - { - item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on.png" : ":/res/chat_friend_off.png") : ":/res/chat_friend.png")); - item->setForeground(Qt::green); - } - else - { - item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on.png" : ":/res/chat_default_off.png") : ":/res/chat_default.png")); - item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00))); - } -} - -void HWChatWidget::updateNickItems() -{ - for(int i = 0; i < chatNicks->count(); i++) - updateNickItem(chatNicks->item(i)); - - chatNicks->sortItems(); -} - -void HWChatWidget::loadLists(const QString & nick) -{ - loadList(ignoreList, nick.toLower() + "_ignore.txt"); - loadList(friendsList, nick.toLower() + "_friends.txt"); - updateNickItems(); -} - -void HWChatWidget::saveLists(const QString & nick) -{ - saveList(ignoreList, nick.toLower() + "_ignore.txt"); - saveList(friendsList, nick.toLower() + "_friends.txt"); -} - -void HWChatWidget::returnPressed() -{ - QStringList lines = chatEditLine->text().split('\n'); - chatEditLine->clear(); - foreach (const QString &line, lines) - emit chatLine(line); -} - - -void HWChatWidget::onChatString(const QString& str) -{ - onChatString("", str); -} - -const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?(hedgewars\\.org(/[^ ]*)?)"); - -void HWChatWidget::onChatString(const QString& nick, const QString& str) -{ - bool isFriend = false; - - if (!nick.isEmpty()) { - // don't show chat lines that are from ignored nicks - if (ignoreList.contains(nick, Qt::CaseInsensitive)) - return; - // friends will get special treatment, of course - isFriend = friendsList.contains(nick, Qt::CaseInsensitive); - } - - if (chatStrings.size() > 250) - chatStrings.removeFirst(); - - QString formattedStr = Qt::escape(str.mid(1)); - // make hedgewars.org urls actual links - formattedStr = formattedStr.replace(URLREGEXP, "\\3"); - - // "link" nick, but before that encode it in base64 to make sure it can't intefere with html/url syntax - // the nick is put as querystring as putting it as host would convert it to it's lower case variant - if(!nick.isEmpty()) - formattedStr.replace("|nick|",QString("%2").arg(QString(nick.toUtf8().toBase64())).arg(nick)); - - QString cssClass("UserChat"); - - // check first character for color code and set color properly - switch (str[0].toAscii()) { - case 3: - cssClass = (isFriend ? "FriendJoin" : "UserJoin"); - break; - case 2: - cssClass = (isFriend ? "FriendAction" : "UserAction"); - break; - default: - if (isFriend) - cssClass = "FriendChat"; - } - - formattedStr = QString("%1").arg(formattedStr).arg(cssClass); - - chatStrings.append(formattedStr); - - chatText->setHtml(chatStrings.join("
")); - - chatText->moveCursor(QTextCursor::End); -} - -void HWChatWidget::onServerMessage(const QString& str) -{ - if (chatStrings.size() > 250) - chatStrings.removeFirst(); - - chatStrings.append("
" + str + "
"); - - chatText->setHtml(chatStrings.join("
")); - - chatText->moveCursor(QTextCursor::End); -} - -void HWChatWidget::nickAdded(const QString& nick, bool notifyNick) -{ - QListWidgetItem * item = new ListWidgetNickItem(nick, friendsList.contains(nick, Qt::CaseInsensitive), ignoreList.contains(nick, Qt::CaseInsensitive)); - updateNickItem(item); - chatNicks->addItem(item); - - emit nickCountUpdate(chatNicks->count()); - - if(notifyNick && notify && gameSettings->value("frontend/sound", true).toBool()) { - Mix_PlayChannel(-1, sound[rand()%4], 0); - } -} - -void HWChatWidget::nickRemoved(const QString& nick) -{ - foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly)) - chatNicks->takeItem(chatNicks->row(item)); - - emit nickCountUpdate(chatNicks->count()); -} - -void HWChatWidget::clear() -{ - chatText->clear(); - chatStrings.clear(); - chatNicks->clear(); -} - -void HWChatWidget::onKick() -{ - QListWidgetItem * curritem = chatNicks->currentItem(); - if (curritem) - emit kick(curritem->text()); -} - -void HWChatWidget::onBan() -{ - QListWidgetItem * curritem = chatNicks->currentItem(); - if (curritem) - emit ban(curritem->text()); -} - -void HWChatWidget::onInfo() -{ - QListWidgetItem * curritem = chatNicks->currentItem(); - if (curritem) - emit info(curritem->text()); -} - -void HWChatWidget::onFollow() -{ - QListWidgetItem * curritem = chatNicks->currentItem(); - if (curritem) - emit follow(curritem->text()); -} - -void HWChatWidget::onIgnore() -{ - QListWidgetItem * curritem = chatNicks->currentItem(); - if(!curritem) - return; - - if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him - { - ignoreList.removeAll(curritem->text().toLower()); - onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your ignore list").arg('\x03').arg(curritem->text())); - } - else // not on list - add - { - // don't consider ignored people friends - if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) - emit onFriend(); - - // scroll down on first ignore added so that people see where that nick went to - if (ignoreList.isEmpty()) - chatNicks->scrollToBottom(); - - ignoreList << curritem->text().toLower(); - onChatString(HWChatWidget::tr("%1 *** %2 has been added to your ignore list").arg('\x03').arg(curritem->text())); - } - updateNickItem(curritem); // update icon/sort order/etc - chatNicks->sortItems(); - chatNickSelected(0); // update context menu -} - -void HWChatWidget::onFriend() -{ - QListWidgetItem * curritem = chatNicks->currentItem(); - if(!curritem) - return; - - if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him - { - friendsList.removeAll(curritem->text().toLower()); - onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your friends list").arg('\x03').arg(curritem->text())); - } - else // not on list - add - { - // don't ignore the new friend - if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) - emit onIgnore(); - - // scroll up on first friend added so that people see where that nick went to - if (friendsList.isEmpty()) - chatNicks->scrollToTop(); - - friendsList << curritem->text().toLower(); - onChatString(HWChatWidget::tr("%1 *** %2 has been added to your friends list").arg('\x03').arg(curritem->text())); - } - updateNickItem(curritem); // update icon/sort order/etc - chatNicks->sortItems(); - chatNickSelected(0); // update context menu -} - -void HWChatWidget::chatNickDoubleClicked(QListWidgetItem * item) -{ - Q_UNUSED(item); - - QList actions = chatNicks->actions(); - actions.first()->activate(QAction::Trigger); -} - -void HWChatWidget::chatNickSelected(int index) -{ - Q_UNUSED(index); - - QListWidgetItem* item = chatNicks->currentItem(); - if (!item) - return; - - // update context menu labels according to possible action - if(ignoreList.contains(item->text(), Qt::CaseInsensitive)) - { - acIgnore->setText(QAction::tr("Unignore")); - acIgnore->setIcon(QIcon(":/res/unignore.png")); - } - else - { - acIgnore->setText(QAction::tr("Ignore")); - acIgnore->setIcon(QIcon(":/res/ignore.png")); - } - - if(friendsList.contains(item->text(), Qt::CaseInsensitive)) - { - acFriend->setText(QAction::tr("Remove friend")); - acFriend->setIcon(QIcon(":/res/remfriend.png")); - } - else - { - acFriend->setText(QAction::tr("Add friend")); - acFriend->setIcon(QIcon(":/res/addfriend.png")); - } -} - -void HWChatWidget::setShowReady(bool s) -{ - showReady = s; -} - -void HWChatWidget::setReadyStatus(const QString & nick, bool isReady) -{ - QList items = chatNicks->findItems(nick, Qt::MatchExactly); - if (items.size() != 1) - { - qWarning("Bug: cannot find user in chat"); - return; - } - - items[0]->setData(Qt::UserRole, isReady); // bulb status - updateNickItem(items[0]); - - // ensure we're still showing the status bulbs - showReady = true; -} - -void HWChatWidget::adminAccess(bool b) -{ - chatNicks->removeAction(acKick); - chatNicks->removeAction(acBan); - - if(b) - { - chatNicks->insertAction(0, acKick); -// chatNicks->insertAction(0, acBan); - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/chatwidget.h --- a/QTfrontend/chatwidget.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _CHAT_WIDGET_INCLUDED -#define _CHAT_WIDGET_INCLUDED - -#include -#include -#include -#include -#include - -#include "SDLs.h" - -class ListWidgetNickItem; -class QTextBrowser; -class QLineEdit; -class QListWidget; -class QSettings; -class SDLInteraction; - -// this class is for custom nick sorting -class ListWidgetNickItem : public QListWidgetItem -{ -public: - ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored); - bool operator<(const QListWidgetItem & other) const; - void setFriend(bool isFriend); - void setIgnored(bool isIgnored); - bool isFriend(); - bool ignored(); - -private: - bool aFriend; - bool isIgnored; -}; - -class HWChatWidget : public QWidget -{ - Q_OBJECT - - public: - HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify); - void loadLists(const QString & nick); - void saveLists(const QString & nick); - void setShowReady(bool s); - void setShowFollow(bool enabled); - static const char* STYLE; - QStringList ignoreList, friendsList; - -private: - void loadList(QStringList & list, const QString & file); - void saveList(QStringList & list, const QString & file); - void updateNickItem(QListWidgetItem *item); - void updateNickItems(); - static const QRegExp URLREGEXP; - - public slots: - void onChatString(const QString& str); - void onChatString(const QString& nick, const QString& str); - void onServerMessage(const QString& str); - void nickAdded(const QString& nick, bool notifyNick); - void nickRemoved(const QString& nick); - void clear(); - void setReadyStatus(const QString & nick, bool isReady); - void adminAccess(bool); - - signals: - void chatLine(const QString& str); - void kick(const QString & str); - void ban(const QString & str); - void info(const QString & str); - void follow(const QString &); - void nickCountUpdate(int cnt); - - private: - QGridLayout mainLayout; - QTextBrowser* chatText; - QStringList chatStrings; - QListWidget* chatNicks; - QLineEdit* chatEditLine; - QAction * acInfo; - QAction * acKick; - QAction * acBan; - QAction * acFollow; - QAction * acIgnore; - QAction * acFriend; - QSettings * gameSettings; - SDLInteraction * sdli; - Mix_Chunk *sound[4]; - bool notify; - bool showReady; - - private slots: - void returnPressed(); - void onBan(); - void onKick(); - void onInfo(); - void onFollow(); - void onIgnore(); - void onFriend(); - void chatNickDoubleClicked(QListWidgetItem * item); - void chatNickSelected(int index); - void linkClicked(const QUrl & link); -}; - -#endif // _CHAT_WIDGET_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/databrowser.cpp --- a/QTfrontend/databrowser.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -#include -#include -#include -#include -#include - -#include "databrowser.h" - -const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1); -const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2); - -DataBrowser::DataBrowser(QWidget *parent) : - QTextBrowser(parent) -{ - - manager = new QNetworkAccessManager(this); -} - -QVariant DataBrowser::loadResource(int type, const QUrl & name) -{ - if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource) - { - if(resources.contains(name.toString())) - { - return resources.take(name.toString()); - } - else - if(!requestedResources.contains(name.toString())) - { - qDebug() << "Requesting resource" << name.toString(); - requestedResources.insert(name.toString()); - - QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString())); - newRequest.setAttribute(typeAttribute, type); - newRequest.setAttribute(urlAttribute, name); - - QNetworkReply *reply = manager->get(newRequest); - connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded())); - } - } - - return QVariant(); -} - -void DataBrowser::resourceDownloaded() -{ - QNetworkReply * reply = qobject_cast(sender()); - - if(reply) - { - int type = reply->request().attribute(typeAttribute).toInt(); - QUrl url = reply->request().attribute(urlAttribute).toUrl(); - resources.insert(url.toString(), reply->readAll()); - document()->addResource(type, reply->request().url(), QVariant()); - update(); - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/databrowser.h --- a/QTfrontend/databrowser.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -#ifndef DATABROWSER_H -#define DATABROWSER_H - -#include -#include - -class QNetworkAccessManager; - -class DataBrowser : public QTextBrowser -{ - Q_OBJECT -public: - explicit DataBrowser(QWidget *parent = 0); - -signals: - -public slots: - -private: - QNetworkAccessManager *manager; - - // hash and set of QString instead of QUrl to support Qt versions - // older than 4.7 (those have no support for qHash(const QUrl &)) - QHash resources; - QSet requestedResources; - - QVariant loadResource(int type, const QUrl & name); - -private slots: - void resourceDownloaded(); -}; - -#endif // DATABROWSER_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/drawmapwidget.cpp --- a/QTfrontend/drawmapwidget.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "drawmapwidget.h" - -DrawMapWidget::DrawMapWidget(QWidget *parent) : - QWidget(parent), - ui(new Ui::DrawMapWidget) -{ - ui->setupUi(this); - - m_scene = 0; -} - -DrawMapWidget::~DrawMapWidget() -{ - delete ui; -} - -void DrawMapWidget::changeEvent(QEvent *e) -{ - QWidget::changeEvent(e); - switch (e->type()) { - case QEvent::LanguageChange: - ui->retranslateUi(this); - break; - default: - break; - } -} - -void DrawMapWidget::setScene(DrawMapScene * scene) -{ - ui->graphicsView->setScene(scene); - m_scene = scene; -} - -void DrawMapWidget::resizeEvent(QResizeEvent * event) -{ - Q_UNUSED(event); - - if(ui->graphicsView && ui->graphicsView->scene()) - ui->graphicsView->fitInView(ui->graphicsView->scene()->sceneRect(), Qt::KeepAspectRatio); -} - -void DrawMapWidget::showEvent(QShowEvent * event) -{ - Q_UNUSED(event); - - resizeEvent(0); -} - -void DrawMapWidget::undo() -{ - if(m_scene) m_scene->undo(); -} - -void DrawMapWidget::clear() -{ - if(m_scene) m_scene->clearMap(); -} - -void DrawMapWidget::save(const QString & fileName) -{ - if(m_scene) - { - QFile file(fileName); - - if(!file.open(QIODevice::WriteOnly)) - QMessageBox::warning(this, tr("File error"), tr("Cannot open file '%1' for writing").arg(fileName)); - else - file.write(qCompress(m_scene->encode()).toBase64()); - } -} - -void DrawMapWidget::load(const QString & fileName) -{ - if(m_scene) - { - QFile f(fileName); - - if(!f.open(QIODevice::ReadOnly)) - QMessageBox::warning(this, tr("File error"), tr("Cannot read file '%1'").arg(fileName)); - else - m_scene->decode(qUncompress(QByteArray::fromBase64(f.readAll()))); - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/drawmapwidget.h --- a/QTfrontend/drawmapwidget.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,86 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef DRAWMAPWIDGET_H -#define DRAWMAPWIDGET_H - -#include -#include -#include -#include - -#include "qaspectratiolayout.h" -#include "drawmapscene.h" - -namespace Ui { - class Ui_DrawMapWidget - { - public: - QGraphicsView *graphicsView; - - void setupUi(QWidget *drawMapWidget) - { - QAspectRatioLayout * arLayout = new QAspectRatioLayout(drawMapWidget); - arLayout->setMargin(0); - - graphicsView = new QGraphicsView(drawMapWidget); - arLayout->addWidget(graphicsView); - - retranslateUi(drawMapWidget); - - QMetaObject::connectSlotsByName(drawMapWidget); - } // setupUi - - void retranslateUi(QWidget *drawMapWidget) - { - Q_UNUSED(drawMapWidget); - } // retranslateUi - - }; - - class DrawMapWidget: public Ui_DrawMapWidget {}; -} - -class DrawMapWidget : public QWidget -{ - Q_OBJECT - -public: - explicit DrawMapWidget(QWidget *parent = 0); - ~DrawMapWidget(); - - void setScene(DrawMapScene * scene); - -public slots: - void undo(); - void clear(); - void save(const QString & fileName); - void load(const QString & fileName); - -protected: - void changeEvent(QEvent *e); - virtual void resizeEvent(QResizeEvent * event); - virtual void showEvent(QShowEvent * event); - -private: - Ui::DrawMapWidget *ui; - - DrawMapScene * m_scene; -}; - -#endif // DRAWMAPWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/fpsedit.cpp --- a/QTfrontend/fpsedit.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "fpsedit.h" - -FPSEdit::FPSEdit(QWidget * parent) : - QSpinBox(parent) -{ - setRange(1, 34); - setValue(27); -} - -QString FPSEdit::textFromValue(int value) const -{ - return QString::number(1000 / (35 - value)); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/fpsedit.h --- a/QTfrontend/fpsedit.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _FPSEDIT_H -#define _FPSEDIT_H - -#include - -class FPSEdit : public QSpinBox -{ - Q_OBJECT - -public: - FPSEdit(QWidget * parent = 0); - -protected: - QString textFromValue (int value) const; -}; - -#endif // _FPSEDIT_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/frameTeam.cpp --- a/QTfrontend/frameTeam.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "frameTeam.h" -#include "teamselhelper.h" -#include "hwconsts.h" - -FrameTeams::FrameTeams(QWidget* parent) : - QFrame(parent), maxHedgehogsPerGame(48), overallHedgehogs(0), mainLayout(this), nonInteractive(false) -{ - QPalette newPalette = palette(); - newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); - setPalette(newPalette); - setAutoFillBackground(true); - - mainLayout.setSpacing(1); - mainLayout.setContentsMargins(4, 4, 4, 4); - - int i = 0; - while(colors[i] != 0) - availableColors.push_back(QColor(colors[i++])); - - resetColors(); -} - -void FrameTeams::setInteractivity(bool interactive) -{ - nonInteractive = !interactive; - for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ++it) { - TeamShowWidget* pts = dynamic_cast(it.value()); - if(!pts) throw; - pts->setInteractivity(interactive); - } -} - -void FrameTeams::resetColors() -{ - currentColor=availableColors.end() - 1; // ensure next color is the first one -} - -QColor FrameTeams::getNextColor() const -{ - QList::ConstIterator nextColor=currentColor; - ++nextColor; - if (nextColor==availableColors.end()) nextColor=availableColors.begin(); - return *nextColor; -} - -void FrameTeams::addTeam(HWTeam team, bool willPlay) -{ - TeamShowWidget* pTeamShowWidget = new TeamShowWidget(team, willPlay, this); - if(nonInteractive) pTeamShowWidget->setInteractivity(false); -// int hght=teamToWidget.empty() ? 0 : teamToWidget.begin()->second->size().height(); - mainLayout.addWidget(pTeamShowWidget); - teamToWidget.insert(team, pTeamShowWidget); - QResizeEvent* pevent=new QResizeEvent(parentWidget()->size(), parentWidget()->size()); - QCoreApplication::postEvent(parentWidget(), pevent); -} - -void FrameTeams::removeTeam(HWTeam team) -{ - tmapTeamToWidget::iterator it=teamToWidget.find(team); - if(it==teamToWidget.end()) return; - mainLayout.removeWidget(it.value()); - it.value()->deleteLater(); - teamToWidget.erase(it); -} - -void FrameTeams::resetTeams() -{ - for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ) { - mainLayout.removeWidget(it.value()); - it.value()->deleteLater(); - teamToWidget.erase(it++); - } -} - -void FrameTeams::setHHNum(const HWTeam& team) -{ - TeamShowWidget* pTeamShowWidget = dynamic_cast(getTeamWidget(team)); - if(!pTeamShowWidget) return; - pTeamShowWidget->setHHNum(team.numHedgehogs); -} - -void FrameTeams::setTeamColor(const HWTeam& team) -{ - TeamShowWidget* pTeamShowWidget = dynamic_cast(getTeamWidget(team)); - if(!pTeamShowWidget) return; - pTeamShowWidget->changeTeamColor(team.teamColor); -} - -QWidget* FrameTeams::getTeamWidget(HWTeam team) -{ -//qDebug() << "FrameTeams::getTeamWidget getNetID() = " << team.getNetID(); - tmapTeamToWidget::iterator it=teamToWidget.find(team); - QWidget* ret = it!=teamToWidget.end() ? it.value() : 0; - return ret; -} - -bool FrameTeams::isFullTeams() const -{ - return overallHedgehogs==maxHedgehogsPerGame; -} - -void FrameTeams::emitTeamColorChanged(const HWTeam& team) -{ - emit teamColorChanged(team); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/frameTeam.h --- a/QTfrontend/frameTeam.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _FRAME_TEAM_INCLUDED -#define _FRAME_TEAM_INCLUDED - -#include -#include -#include - -#include "teamselect.h" - -class FrameTeams : public QFrame -{ - Q_OBJECT - - friend class CHedgehogerWidget; - friend class TeamShowWidget; - - public: - FrameTeams(QWidget* parent=0); - QWidget* getTeamWidget(HWTeam team); - bool isFullTeams() const; - void resetColors(); - void resetTeams(); - void setHHNum(const HWTeam& team); - void setTeamColor(const HWTeam& team); - void setInteractivity(bool interactive); - QColor getNextColor() const; - - signals: - void teamColorChanged(const HWTeam&); - - public slots: - void addTeam(HWTeam team, bool willPlay); - void removeTeam(HWTeam team); - - private: - const int maxHedgehogsPerGame; - int overallHedgehogs; - QList availableColors; - QList::Iterator currentColor; - - void emitTeamColorChanged(const HWTeam& team); - - QVBoxLayout mainLayout; - typedef QMap tmapTeamToWidget; - tmapTeamToWidget teamToWidget; - bool nonInteractive; -}; - -#endif // _FRAME_TAM_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/game.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -99,7 +99,7 @@ HWProto::addStringToBuffer(buf, QString("eammreinf %1").arg(ammostr.mid(3 * cAmmoNumber, cAmmoNumber))); if(!gamecfg->schemeData(21).toBool()) HWProto::addStringToBuffer(buf, QString("eammstore")); HWProto::addStringListToBuffer(buf, - team.TeamGameConfig(gamecfg->getInitHealth())); + team.teamGameConfig(gamecfg->getInitHealth())); ; } } @@ -120,27 +120,23 @@ .arg((themesModel->rowCount() > 0) ? themesModel->index(rand() % themesModel->rowCount()).data().toString() : "steel")); HWProto::addStringToBuffer(teamscfg, "eseed " + QUuid::createUuid().toString()); - HWNamegen namegen; - - HWTeam * team1; - team1 = new HWTeam; - team1->difficulty = 0; - team1->teamColor = QColor(colors[0]); - team1->numHedgehogs = 4; - namegen.TeamRandomNames(team1,TRUE); + HWTeam team1; + team1.setDifficulty(0); + team1.setColor(QColor(colors[0])); + team1.setNumHedgehogs(4); + HWNamegen::teamRandomNames(team1,true); HWProto::addStringListToBuffer(teamscfg, - team1->TeamGameConfig(100)); + team1.teamGameConfig(100)); - HWTeam * team2; - team2 = new HWTeam; - team2->difficulty = 4; - team2->teamColor = QColor(colors[1]); - team2->numHedgehogs = 4; - do - namegen.TeamRandomNames(team2,TRUE); - while(!team2->TeamName.compare(team1->TeamName) || !team2->Hedgehogs[0].Hat.compare(team1->Hedgehogs[0].Hat)); + HWTeam team2; + team2.setDifficulty(4); + team2.setColor(QColor(colors[1])); + team2.setNumHedgehogs(4); + do + HWNamegen::teamRandomNames(team2,true); + while(!team2.name().compare(team1.name()) || !team2.hedgehog(0).Hat.compare(team1.hedgehog(0).Hat)); HWProto::addStringListToBuffer(teamscfg, - team2->TeamGameConfig(100)); + team2.teamGameConfig(100)); HWProto::addStringToBuffer(teamscfg, QString("eammloadt %1").arg(cDefaultAmmoStore->mid(0, cAmmoNumber))); HWProto::addStringToBuffer(teamscfg, QString("eammprob %1").arg(cDefaultAmmoStore->mid(cAmmoNumber, cAmmoNumber))); @@ -400,7 +396,7 @@ { QByteArray buf; foreach(HWTeam team, m_pTeamSelWidget->getPlayingTeams()) - HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(team.TeamName)); + HWProto::addStringToBuffer(buf, QString("eteamgone %1").arg(team.name())); RawSendIPC(buf); } } diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/gamecfgwidget.cpp --- a/QTfrontend/gamecfgwidget.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,573 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "gamecfgwidget.h" -#include "igbox.h" -#include "hwconsts.h" -#include "ammoSchemeModel.h" -#include "proto.h" - -GameCFGWidget::GameCFGWidget(QWidget* parent) : - QGroupBox(parent) - , mainLayout(this) - , seedRegexp("\\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\}") -{ - mainLayout.setMargin(0); -// mainLayout.setSizeConstraint(QLayout::SetMinimumSize); - - pMapContainer = new HWMapContainer(this); - mainLayout.addWidget(pMapContainer, 0, 0); - - IconedGroupBox *GBoxOptions = new IconedGroupBox(this); - GBoxOptions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); - mainLayout.addWidget(GBoxOptions, 1, 0); - - QGridLayout *GBoxOptionsLayout = new QGridLayout(GBoxOptions); - - GBoxOptions->setTitle(tr("Game Options")); - GBoxOptionsLayout->addWidget(new QLabel(QLabel::tr("Style"), GBoxOptions), 1, 0); - - Scripts = new QComboBox(GBoxOptions); - GBoxOptionsLayout->addWidget(Scripts, 1, 1); - - Scripts->addItem("Normal"); - Scripts->insertSeparator(1); - - for (int i = 0; i < scriptList->size(); ++i) { - QString script = (*scriptList)[i].remove(".lua", Qt::CaseInsensitive); - QList scriptInfo; - scriptInfo.push_back(script); - QFile scriptCfgFile; - scriptCfgFile.setFileName(QString("%1/Data/Scripts/Multiplayer/%2.cfg").arg(cfgdir->absolutePath()).arg(script)); - if (!scriptCfgFile.exists()) scriptCfgFile.setFileName(QString("%1/Scripts/Multiplayer/%2.cfg").arg(datadir->absolutePath()).arg(script)); - if (scriptCfgFile.exists() && scriptCfgFile.open(QFile::ReadOnly)) { - QString scheme; - QString weapons; - QTextStream input(&scriptCfgFile); - input >> scheme; - input >> weapons; - if (scheme.isEmpty()) - scheme = "locked"; - scheme.replace("_", " "); - if (weapons.isEmpty()) - weapons = "locked"; - weapons.replace("_", " "); - scriptInfo.push_back(scheme); - scriptInfo.push_back(weapons); - scriptCfgFile.close(); - } - else - { - scriptInfo.push_back("locked"); - scriptInfo.push_back("locked"); - } - Scripts->addItem(script.replace("_", " "), scriptInfo); - } - - connect(Scripts, SIGNAL(currentIndexChanged(int)), this, SLOT(scriptChanged(int))); - - QWidget *SchemeWidget = new QWidget(GBoxOptions); - GBoxOptionsLayout->addWidget(SchemeWidget, 2, 0, 1, 2); - - QGridLayout *SchemeWidgetLayout = new QGridLayout(SchemeWidget); - SchemeWidgetLayout->setMargin(0); - - GameSchemes = new QComboBox(SchemeWidget); - SchemeWidgetLayout->addWidget(GameSchemes, 0, 2); - connect(GameSchemes, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeChanged(int))); - - SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Scheme"), SchemeWidget), 0, 0); - - QPixmap pmEdit(":/res/edit.png"); - - QPushButton * goToSchemePage = new QPushButton(SchemeWidget); - goToSchemePage->setToolTip(tr("Edit schemes")); - goToSchemePage->setIconSize(pmEdit.size()); - goToSchemePage->setIcon(pmEdit); - goToSchemePage->setMaximumWidth(pmEdit.width() + 6); - SchemeWidgetLayout->addWidget(goToSchemePage, 0, 3); - connect(goToSchemePage, SIGNAL(clicked()), this, SLOT(jumpToSchemes())); - - SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Weapons"), SchemeWidget), 1, 0); - - WeaponsName = new QComboBox(SchemeWidget); - SchemeWidgetLayout->addWidget(WeaponsName, 1, 2); - - connect(WeaponsName, SIGNAL(currentIndexChanged(int)), this, SLOT(ammoChanged(int))); - - QPushButton * goToWeaponPage = new QPushButton(SchemeWidget); - goToWeaponPage->setToolTip(tr("Edit weapons")); - goToWeaponPage->setIconSize(pmEdit.size()); - goToWeaponPage->setIcon(pmEdit); - goToWeaponPage->setMaximumWidth(pmEdit.width() + 6); - SchemeWidgetLayout->addWidget(goToWeaponPage, 1, 3); - connect(goToWeaponPage, SIGNAL(clicked()), this, SLOT(jumpToWeapons())); - - bindEntries = new QCheckBox(SchemeWidget); - bindEntries->setToolTip(tr("When this option is enabled selecting a game scheme will auto-select a weapon")); - bindEntries->setChecked(true); - bindEntries->setMaximumWidth(42); - bindEntries->setStyleSheet( "QCheckBox::indicator:checked { image: url(\":/res/lock.png\"); }" - "QCheckBox::indicator:unchecked { image: url(\":/res/unlock.png\"); }" ); - SchemeWidgetLayout->addWidget(bindEntries, 0, 1, 0, 1, Qt::AlignVCenter); - - connect(pMapContainer, SIGNAL(seedChanged(const QString &)), this, SLOT(seedChanged(const QString &))); - connect(pMapContainer, SIGNAL(mapChanged(const QString &)), this, SLOT(mapChanged(const QString &))); - connect(pMapContainer, SIGNAL(mapgenChanged(MapGenerator)), this, SLOT(mapgenChanged(MapGenerator))); - connect(pMapContainer, SIGNAL(mazeSizeChanged(int)), this, SLOT(maze_sizeChanged(int))); - connect(pMapContainer, SIGNAL(themeChanged(const QString &)), this, SLOT(themeChanged(const QString &))); - connect(pMapContainer, SIGNAL(newTemplateFilter(int)), this, SLOT(templateFilterChanged(int))); - connect(pMapContainer, SIGNAL(drawMapRequested()), this, SIGNAL(goToDrawMap())); - connect(pMapContainer, SIGNAL(drawnMapChanged(const QByteArray &)), this, SLOT(onDrawnMapChanged(const QByteArray &))); -} - -void GameCFGWidget::jumpToSchemes() -{ - emit goToSchemes(GameSchemes->currentIndex()); -} - -void GameCFGWidget::jumpToWeapons() -{ - emit goToWeapons(WeaponsName->currentIndex()); -} - -QVariant GameCFGWidget::schemeData(int column) const -{ - return GameSchemes->model()->data(GameSchemes->model()->index(GameSchemes->currentIndex(), column)); -} - -quint32 GameCFGWidget::getGameFlags() const -{ - quint32 result = 0; - - if (schemeData(1).toBool()) - result |= 0x00001000; // fort - if (schemeData(2).toBool()) - result |= 0x00000010; // divide teams - if (schemeData(3).toBool()) - result |= 0x00000004; // solid land - if (schemeData(4).toBool()) - result |= 0x00000008; // border - if (schemeData(5).toBool()) - result |= 0x00000020; // low gravity - if (schemeData(6).toBool()) - result |= 0x00000040; // laser sight - if (schemeData(7).toBool()) - result |= 0x00000080; // invulnerable - if (schemeData(8).toBool()) - result |= 0x00000100; // mines - if (schemeData(9).toBool()) - result |= 0x00000200; // vampirism - if (schemeData(10).toBool()) - result |= 0x00000400; // karma - if (schemeData(11).toBool()) - result |= 0x00000800; // artillery - if (schemeData(12).toBool()) - result |= 0x00002000; // random - if (schemeData(13).toBool()) - result |= 0x00004000; // king - if (schemeData(14).toBool()) - result |= 0x00008000; // place hogs - if (schemeData(15).toBool()) - result |= 0x00010000; // shared ammo - if (schemeData(16).toBool()) - result |= 0x00020000; // disable girders - if (schemeData(17).toBool()) - result |= 0x00040000; // disable land obj - if (schemeData(18).toBool()) - result |= 0x00080000; // ai survival - if (schemeData(19).toBool()) - result |= 0x00100000; // infinite attacks - if (schemeData(20).toBool()) - result |= 0x00200000; // reset weaps - if (schemeData(21).toBool()) - result |= 0x00400000; // per hog ammo - if (schemeData(22).toBool()) - result |= 0x00800000; // no wind - if (schemeData(23).toBool()) - result |= 0x01000000; // more wind - if (schemeData(24).toBool()) - result |= 0x02000000; // tag team - if (schemeData(25).toBool()) - result |= 0x04000000; // bottom border - - return result; -} - -quint32 GameCFGWidget::getInitHealth() const -{ - return schemeData(28).toInt(); -} - -QByteArray GameCFGWidget::getFullConfig() const -{ - QList bcfg; - int mapgen = pMapContainer->get_mapgen(); - - QString currentMap = pMapContainer->getCurrentMap(); - if (currentMap.size() > 0) - { - bcfg << QString("emap " + currentMap).toUtf8(); - if(pMapContainer->getCurrentIsMission()) - bcfg << QString("escript Maps/%1/map.lua").arg(currentMap).toUtf8(); - } - bcfg << QString("etheme " + pMapContainer->getCurrentTheme()).toUtf8(); - - if (Scripts->currentIndex() > 0) - { - bcfg << QString("escript Scripts/Multiplayer/%1.lua").arg(Scripts->itemData(Scripts->currentIndex()).toList()[0].toString()).toUtf8(); - } - - bcfg << QString("eseed " + pMapContainer->getCurrentSeed()).toUtf8(); - bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8(); - bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8(); - bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8(); - bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8(); - bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8(); - bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8(); - bcfg << QString("e$minesnum %1").arg(schemeData(32).toInt()).toUtf8(); - bcfg << QString("e$minedudpct %1").arg(schemeData(33).toInt()).toUtf8(); - bcfg << QString("e$explosives %1").arg(schemeData(34).toInt()).toUtf8(); - bcfg << QString("e$healthprob %1").arg(schemeData(35).toInt()).toUtf8(); - bcfg << QString("e$hcaseamount %1").arg(schemeData(36).toInt()).toUtf8(); - bcfg << QString("e$waterrise %1").arg(schemeData(37).toInt()).toUtf8(); - bcfg << QString("e$healthdec %1").arg(schemeData(38).toInt()).toUtf8(); - bcfg << QString("e$ropepct %1").arg(schemeData(39).toInt()).toUtf8(); - bcfg << QString("e$getawaytime %1").arg(schemeData(40).toInt()).toUtf8(); - bcfg << QString("e$template_filter %1").arg(pMapContainer->getTemplateFilter()).toUtf8(); - bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8(); - - switch (mapgen) - { - case MAPGEN_MAZE: - bcfg << QString("e$maze_size %1").arg(pMapContainer->getMazeSize()).toUtf8(); - break; - - case MAPGEN_DRAWN: - { - QByteArray data = pMapContainer->getDrawnMapData(); - while(data.size() > 0) - { - QByteArray tmp = data; - tmp.truncate(200); - tmp.prepend("edraw "); - bcfg << tmp; - data.remove(0, 200); - } - break; - } - default: ; - } - - QByteArray result; - - foreach(QByteArray ba, bcfg) - HWProto::addByteArrayToBuffer(result, ba); - - return result; -} - -void GameCFGWidget::setNetAmmo(const QString& name, const QString& ammo) -{ - bool illegal = ammo.size() != cDefaultAmmoStore->size(); - if (illegal) - QMessageBox::critical(this, tr("Error"), tr("Illegal ammo scheme")); - - int pos = WeaponsName->findText(name); - if ((pos == -1) || illegal) { // prevent from overriding schemes with bad ones - WeaponsName->addItem(name, ammo); - WeaponsName->setCurrentIndex(WeaponsName->count() - 1); - } else { - WeaponsName->setItemData(pos, ammo); - WeaponsName->setCurrentIndex(pos); - } -} - -void GameCFGWidget::fullNetConfig() -{ - ammoChanged(WeaponsName->currentIndex()); - - seedChanged(pMapContainer->getCurrentSeed()); - templateFilterChanged(pMapContainer->getTemplateFilter()); - themeChanged(pMapContainer->getCurrentTheme()); - - schemeChanged(GameSchemes->currentIndex()); - scriptChanged(Scripts->currentIndex()); - - mapgenChanged(pMapContainer->get_mapgen()); - maze_sizeChanged(pMapContainer->getMazeSize()); - - // map must be the last - QString map = pMapContainer->getCurrentMap(); - if (map.size()) - mapChanged(map); -} - -void GameCFGWidget::setParam(const QString & param, const QStringList & slValue) -{ - if (slValue.size() == 1) - { - QString value = slValue[0]; - if (param == "MAP") { - pMapContainer->setMap(value); - return; - } - if (param == "SEED") { - pMapContainer->setSeed(value); - if (!seedRegexp.exactMatch(value)) { - pMapContainer->seedEdit->setVisible(true); - } - return; - } - if (param == "THEME") { - pMapContainer->setTheme(value); - return; - } - if (param == "TEMPLATE") { - pMapContainer->setTemplateFilter(value.toUInt()); - return; - } - if (param == "MAPGEN") { - pMapContainer->setMapgen((MapGenerator)value.toUInt()); - return; - } - if (param == "MAZE_SIZE") { - pMapContainer->setMazeSize(value.toUInt()); - return; - } - if (param == "SCRIPT") { - Scripts->setCurrentIndex(Scripts->findText(value)); - return; - } - if (param == "DRAWNMAP") { - pMapContainer->setDrawnMapData(qUncompress(QByteArray::fromBase64(slValue[0].toLatin1()))); - return; - } - } - - if (slValue.size() == 2) - { - if (param == "AMMO") { - setNetAmmo(slValue[0], slValue[1]); - return; - } - } - - if (slValue.size() == 5) - { - if (param == "FULLMAPCONFIG") - { - QString seed = slValue[3]; - if (!seedRegexp.exactMatch(seed)) - pMapContainer->seedEdit->setVisible(true); - - pMapContainer->setAllMapParameters( - slValue[0], - (MapGenerator)slValue[1].toUInt(), - slValue[2].toUInt(), - seed, - slValue[4].toUInt() - ); - return; - } - } - - qWarning("Got bad config param from net"); -} - -void GameCFGWidget::ammoChanged(int index) -{ - if (index >= 0) { - emit paramChanged( - "AMMO", - QStringList() << WeaponsName->itemText(index) << WeaponsName->itemData(index).toString() - ); - } -} - -void GameCFGWidget::mapChanged(const QString & value) -{ - if(isEnabled() && pMapContainer->getCurrentIsMission()) - { - Scripts->setEnabled(false); - Scripts->setCurrentIndex(0); - - if (pMapContainer->getCurrentScheme() == "locked") - { - GameSchemes->setEnabled(false); - GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); - } - else - { - GameSchemes->setEnabled(true); - int num = GameSchemes->findText(pMapContainer->getCurrentScheme()); - if (num != -1) - GameSchemes->setCurrentIndex(num); - else - GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); - } - - if (pMapContainer->getCurrentWeapons() == "locked") - { - WeaponsName->setEnabled(false); - WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); - } - else - { - WeaponsName->setEnabled(true); - int num = WeaponsName->findText(pMapContainer->getCurrentWeapons()); - if (num != -1) - WeaponsName->setCurrentIndex(num); - else - WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); - } - - if (pMapContainer->getCurrentScheme() != "locked" && pMapContainer->getCurrentWeapons() != "locked") - bindEntries->setEnabled(true); - else - bindEntries->setEnabled(false); - } - else - { - Scripts->setEnabled(true); - GameSchemes->setEnabled(true); - WeaponsName->setEnabled(true); - bindEntries->setEnabled(true); - } - emit paramChanged("MAP", QStringList(value)); -} - -void GameCFGWidget::templateFilterChanged(int value) -{ - emit paramChanged("TEMPLATE", QStringList(QString::number(value))); -} - -void GameCFGWidget::seedChanged(const QString & value) -{ - emit paramChanged("SEED", QStringList(value)); -} - -void GameCFGWidget::themeChanged(const QString & value) -{ - emit paramChanged("THEME", QStringList(value)); -} - -void GameCFGWidget::schemeChanged(int index) -{ - QStringList sl; - - int size = GameSchemes->model()->columnCount(); - for(int i = 0; i < size; ++i) - sl << schemeData(i).toString(); - - emit paramChanged("SCHEME", sl); - - if (isEnabled() && bindEntries->isEnabled() && bindEntries->isChecked()) { - QString schemeName = GameSchemes->itemText(index); - for (int i = 0; i < WeaponsName->count(); i++) { - QString weapName = WeaponsName->itemText(i); - int res = QString::compare(weapName, schemeName, Qt::CaseSensitive); - if (0 == res) { - WeaponsName->setCurrentIndex(i); - emit ammoChanged(i); - break; - } - } - } -} - -void GameCFGWidget::scriptChanged(int index) -{ - if(isEnabled() && index > 0) - { - QString scheme = Scripts->itemData(Scripts->currentIndex()).toList()[1].toString(); - QString weapons = Scripts->itemData(Scripts->currentIndex()).toList()[2].toString(); - - if (scheme == "locked") - { - GameSchemes->setEnabled(false); - GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); - } - else - { - GameSchemes->setEnabled(true); - int num = GameSchemes->findText(scheme); - if (num != -1) - GameSchemes->setCurrentIndex(num); - else - GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); - } - - if (weapons == "locked") - { - WeaponsName->setEnabled(false); - WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); - } - else - { - WeaponsName->setEnabled(true); - int num = WeaponsName->findText(weapons); - if (num != -1) - WeaponsName->setCurrentIndex(num); - else - WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); - } - - if (scheme != "locked" && weapons != "locked") - bindEntries->setEnabled(true); - else - bindEntries->setEnabled(false); - } - else - { - GameSchemes->setEnabled(true); - WeaponsName->setEnabled(true); - bindEntries->setEnabled(true); - } - emit paramChanged("SCRIPT", QStringList(Scripts->itemText(index))); -} - -void GameCFGWidget::mapgenChanged(MapGenerator m) -{ - emit paramChanged("MAPGEN", QStringList(QString::number(m))); -} - -void GameCFGWidget::maze_sizeChanged(int s) -{ - emit paramChanged("MAZE_SIZE", QStringList(QString::number(s))); -} - -void GameCFGWidget::resendSchemeData() -{ - schemeChanged(GameSchemes->currentIndex()); -} - -void GameCFGWidget::onDrawnMapChanged(const QByteArray & data) -{ - emit paramChanged("DRAWNMAP", QStringList(qCompress(data, 9).toBase64())); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/gamecfgwidget.h --- a/QTfrontend/gamecfgwidget.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef GAMECONFIGWIDGET_H -#define GAMECONFIGWIDGET_H - -#include -#include -#include -#include -#include - -#include "mapContainer.h" - -class QCheckBox; -class QVBoxLayout; -class QLabel; -class QTableView; - -class GameCFGWidget : public QGroupBox -{ - Q_OBJECT - -public: - GameCFGWidget(QWidget* parent); - quint32 getGameFlags() const; - quint32 getInitHealth() const; - QByteArray getFullConfig() const; - QComboBox * Scripts; - QComboBox * GameSchemes; - QComboBox * WeaponsName; - HWMapContainer* pMapContainer; - QTableView * tv; - QVariant schemeData(int column) const; - -public slots: - void setParam(const QString & param, const QStringList & value); - void fullNetConfig(); - void resendSchemeData(); - -signals: - void paramChanged(const QString & param, const QStringList & value); - void goToSchemes(int); - void goToWeapons(int); - void goToDrawMap(); - -private slots: - void ammoChanged(int index); - void mapChanged(const QString &); - void templateFilterChanged(int); - void seedChanged(const QString &); - void themeChanged(const QString &); - void schemeChanged(int); - void scriptChanged(int); - void jumpToSchemes(); - void jumpToWeapons(); - void mapgenChanged(MapGenerator m); - void maze_sizeChanged(int s); - void onDrawnMapChanged(const QByteArray & data); - -private: - QGridLayout mainLayout; - QCheckBox * bindEntries; - QString curNetAmmoName; - QString curNetAmmo; - QRegExp seedRegexp; - - void setNetAmmo(const QString& name, const QString& ammo); - -}; - -#endif // GAMECONFIGWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hats.cpp --- a/QTfrontend/hats.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,142 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include "hwconsts.h" -#include "hwform.h" -#include "hats.h" - -HatsModel::HatsModel(QObject* parent) : - QAbstractListModel(parent) -{ - QFile hhfile; - hhfile.setFileName(cfgdir->absolutePath() + "/Data/Graphics/Hedgehog/Idle.png"); - if (!hhfile.exists()) hhfile.setFileName(datadir->absolutePath() + "/Graphics/Hedgehog/Idle.png"); - QPixmap hhpix = QPixmap(QFileInfo(hhfile).absoluteFilePath()).copy(0, 0, 32, 32); - - QDir tmpdir; - tmpdir.cd(cfgdir->absolutePath()); - tmpdir.cd("Data"); - tmpdir.cd("Graphics"); - tmpdir.cd("Hats"); - - tmpdir.setFilter(QDir::Files); - - QStringList userhatsList = tmpdir.entryList(QStringList("*.png")); - for (QStringList::Iterator it = userhatsList.begin(); it != userhatsList.end(); ++it ) - { - QString str = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Hats/" + str + ".png"); - - QPixmap tmppix(32, 37); - tmppix.fill(QColor(Qt::transparent)); - - QPainter painter(&tmppix); - painter.drawPixmap(QPoint(0, 5), hhpix); - painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32)); - if(pix.width() > 32) - painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32)); - painter.end(); - - hats.append(qMakePair(str, QIcon(tmppix))); - } - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Graphics"); - tmpdir.cd("Hats"); - - QStringList hatsList = tmpdir.entryList(QStringList("*.png")); - for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it ) - { - if (userhatsList.contains(*it,Qt::CaseInsensitive)) continue; - QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/" + str + ".png"); - - QPixmap tmppix(32, 37); - tmppix.fill(QColor(Qt::transparent)); - - QPainter painter(&tmppix); - painter.drawPixmap(QPoint(0, 5), hhpix); - painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32)); - if(pix.width() > 32) - painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32)); - painter.end(); - - hats.append(qMakePair(str, QIcon(tmppix))); - } - // Reserved hats - tmpdir.cd("Reserved"); - hatsList = tmpdir.entryList(QStringList(playerHash+"*.png")); - for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it ) - { - QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/Reserved/" + str + ".png"); - - QPixmap tmppix(32, 37); - tmppix.fill(QColor(Qt::transparent)); - - QPainter painter(&tmppix); - painter.drawPixmap(QPoint(0, 5), hhpix); - painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32)); - painter.end(); - - hats.append(qMakePair("Reserved "+str.remove(0,32), QIcon(tmppix))); - } -} - -QVariant HatsModel::headerData(int section, - Qt::Orientation orientation, int role) const -{ - Q_UNUSED(section); - Q_UNUSED(orientation); - Q_UNUSED(role); - - return QVariant(); -} - -int HatsModel::rowCount(const QModelIndex &parent) const -{ - if (parent.isValid()) - return 0; - else - return hats.size(); -} - -/*int HatsModel::columnCount(const QModelIndex & parent) const -{ - if (parent.isValid()) - return 0; - else - return 2; -} -*/ -QVariant HatsModel::data(const QModelIndex &index, - int role) const -{ - if (!index.isValid() || index.row() < 0 - || index.row() >= hats.size() - || (role != Qt::DisplayRole && role != Qt::DecorationRole)) - return QVariant(); - - if (role == Qt::DisplayRole) - return hats.at(index.row()).first; - else // role == Qt::DecorationRole - return hats.at(index.row()).second; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hats.h --- a/QTfrontend/hats.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _HATS_INCLUDED -#define _HATS_INCLUDED - -#include -#include -#include -#include -#include - -class HatsModel : public QAbstractListModel -{ - Q_OBJECT - -public: - HatsModel(QObject *parent = 0); - - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - int rowCount(const QModelIndex & parent) const; - //int columnCount(const QModelIndex & parent) const; - - QVariant data(const QModelIndex &index, int role) const; -protected: - QVector > hats; -}; - -#endif // _HATS_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hedgehogerWidget.cpp --- a/QTfrontend/hedgehogerWidget.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,76 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Ulyanov Igor - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "hedgehogerWidget.h" - -#include "frameTeam.h" - -CHedgehogerWidget::CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent) : - ItemNum(im, img, parent, 1) -{ - // TODO: maxHedgehogsPerGame doesn't reset properly and won't match map limits for now - /*if(parent) { - pOurFrameTeams = dynamic_cast(parent->parentWidget()); - } - if(pOurFrameTeams->overallHedgehogs + 4 > pOurFrameTeams->maxHedgehogsPerGame) { - numItems = pOurFrameTeams->maxHedgehogsPerGame - pOurFrameTeams->overallHedgehogs; - } else numItems = 4; - pOurFrameTeams->overallHedgehogs += numItems;*/ -} - -void CHedgehogerWidget::incItems() -{ - //if (pOurFrameTeams->overallHedgehogs < pOurFrameTeams->maxHedgehogsPerGame) { - numItems++; - //pOurFrameTeams->overallHedgehogs++; - emit hedgehogsNumChanged(); - //} -} - -void CHedgehogerWidget::decItems() -{ - numItems--; - //pOurFrameTeams->overallHedgehogs--; - emit hedgehogsNumChanged(); -} - -CHedgehogerWidget::~CHedgehogerWidget() -{ - // TODO: not called? - //pOurFrameTeams->overallHedgehogs-=numItems; -} - -void CHedgehogerWidget::setNonInteractive() -{ - nonInteractive=true; -} - -void CHedgehogerWidget::setHHNum(unsigned int num) -{ - /*unsigned int diff = num - numItems; - numItems += diff; - pOurFrameTeams->overallHedgehogs += diff;*/ - numItems = num; - repaint(); -} - -unsigned char CHedgehogerWidget::getHedgehogsNum() const -{ - return numItems; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hedgehogerWidget.h --- a/QTfrontend/hedgehogerWidget.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,50 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Ulyanov Igor - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _HEDGEHOGER_WIDGET -#define _HEDGEHOGER_WIDGET - -#include "itemNum.h" - -class FrameTeams; - -class CHedgehogerWidget : public ItemNum -{ - Q_OBJECT - - public: - CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent); - virtual ~CHedgehogerWidget(); - unsigned char getHedgehogsNum() const; - void setHHNum (unsigned int num); - void setNonInteractive(); - - signals: - void hedgehogsNumChanged(); - - protected: - virtual void incItems(); - virtual void decItems(); - - private: - CHedgehogerWidget(); - FrameTeams* pOurFrameTeams; -}; - -#endif // _HEDGEHOGER_WIDGET diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hedgewars.qrc --- a/QTfrontend/hedgewars.qrc Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/hedgewars.qrc Sun Oct 16 21:03:30 2011 +0200 @@ -45,6 +45,7 @@ res/unchecked.png res/graphicsicon.png res/miscicon.png + res/Load.png res/Save.png res/Record.png res/weaponsicon.png @@ -57,31 +58,31 @@ res/PlaySound.png res/hh_small.png res/btnDisabled.png - res/btnForts.png - res/btnBorder.png - res/btnInvulnerable.png - res/btnLaserSight.png - res/btnLowGravity.png - res/btnResetHealth.png - res/btnTeamsDivide.png - res/btnSolid.png - res/btnVampiric.png - res/btnKarma.png - res/btnArtillery.png - res/btnRandomOrder.png - res/btnKing.png - res/btnPlaceHog.png - res/btnSharedAmmo.png - res/btnDisableGirders.png - res/btnDisableLandObjects.png - res/btnAISurvival.png - res/btnInfAttack.png - res/btnResetWeps.png - res/btnPerHogAmmo.png - res/btnNoWind.png - res/btnMoreWind.png - res/btnTagTeam.png - res/btnBottomBorder.png + res/btnForts@2x.png + res/btnBorder@2x.png + res/btnInvulnerable@2x.png + res/btnLaserSight@2x.png + res/btnLowGravity@2x.png + res/btnResetHealth@2x.png + res/btnTeamsDivide@2x.png + res/btnSolid@2x.png + res/btnVampiric@2x.png + res/btnKarma@2x.png + res/btnArtillery@2x.png + res/btnRandomOrder@2x.png + res/btnKing@2x.png + res/btnPlaceHog@2x.png + res/btnSharedAmmo@2x.png + res/btnDisableGirders@2x.png + res/btnDisableLandObjects@2x.png + res/btnAISurvival@2x.png + res/btnInfAttack@2x.png + res/btnResetWeps@2x.png + res/btnPerHogAmmo@2x.png + res/btnNoWind@2x.png + res/btnMoreWind@2x.png + res/btnTagTeam@2x.png + res/btnBottomBorder@2x.png res/iconBox.png res/iconHealth.png res/iconSuddenDeath.png diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hwconsts.h --- a/QTfrontend/hwconsts.h Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/hwconsts.h Sun Oct 16 21:03:30 2011 +0200 @@ -58,6 +58,8 @@ extern bool isDevBuild; #endif +#define HEDGEHOGS_PER_TEAM 8 + #define AMMOLINE_DEFAULT_QT "939192942219912103223511100120100000021111010101111101" #define AMMOLINE_DEFAULT_PROB "040504054160065554655446477657666666615551010111541101" #define AMMOLINE_DEFAULT_DELAY "000000000000020550000004000700400000000022000000060000" diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/hwform.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -16,6 +16,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ +#include #include #include #include @@ -43,7 +44,6 @@ #include "hwform.h" #include "game.h" #include "team.h" -#include "namegen.h" #include "teamselect.h" #include "selectWeapon.h" #include "gameuiconfig.h" @@ -114,7 +114,6 @@ config = new GameUIConfig(this, cfgdir->absolutePath() + "/hedgewars.ini"); - namegen = new HWNamegen(); #ifdef __APPLE__ panel = new M3Panel; @@ -139,6 +138,12 @@ UpdateCampaignPage(0); UpdateWeapons(); + // connect all goBack signals + int nPages = ui.Pages->count(); + + for (int i = 0; i < nPages; i++) + connect(ui.Pages->widget(i), SIGNAL(goBack()), this, SLOT(GoBack())); + pageSwitchMapper = new QSignalMapper(this); connect(pageSwitchMapper, SIGNAL(mapped(int)), this, SLOT(GoToPage(int))); @@ -160,19 +165,11 @@ connect(ui.pageMain->BtnDataDownload, SIGNAL(clicked()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageMain->BtnDataDownload, ID_PAGE_DATADOWNLOAD); - connect(ui.pageMain->BtnExit, SIGNAL(pressed()), this, SLOT(btnExitPressed())); - connect(ui.pageMain->BtnExit, SIGNAL(clicked()), this, SLOT(btnExitClicked())); - - connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - connect(ui.pageDataDownload->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); + //connect(ui.pageMain->BtnExit, SIGNAL(pressed()), this, SLOT(btnExitPressed())); + //connect(ui.pageMain->BtnExit, SIGNAL(clicked()), this, SLOT(btnExitClicked())); - connect(ui.pageEditTeam->BtnTeamSave, SIGNAL(clicked()), this, SLOT(TeamSave())); - connect(ui.pageEditTeam->BtnTeamDiscard, SIGNAL(clicked()), this, SLOT(TeamDiscard())); + connect(ui.pageEditTeam, SIGNAL(teamEdited()), this, SLOT(AfterTeamEdit())); - connect(ui.pageEditTeam->signalMapper2, SIGNAL(mapped(const int &)), this, SLOT(RandomName(const int &))); - connect(ui.pageEditTeam->randTeamButton, SIGNAL(clicked()), this, SLOT(RandomNames())); - - connect(ui.pageMultiplayer->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageMultiplayer->BtnStartMPGame, SIGNAL(clicked()), this, SLOT(StartMPGame())); connect(ui.pageMultiplayer->teamsSelect, SIGNAL(setEnabledGameStart(bool)), ui.pageMultiplayer->BtnStartMPGame, SLOT(setEnabled(bool))); @@ -181,18 +178,16 @@ connect(ui.pageMultiplayer->gameCFG, SIGNAL(goToWeapons(int)), this, SLOT(GoToSelectWeaponSet(int))); connect(ui.pageMultiplayer->gameCFG, SIGNAL(goToDrawMap()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageMultiplayer->gameCFG, ID_PAGE_DRAWMAP); - - connect(ui.pagePlayDemo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); + connect(ui.pagePlayDemo->BtnPlayDemo, SIGNAL(clicked()), this, SLOT(PlayDemo())); connect(ui.pagePlayDemo->DemosList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(PlayDemo())); - connect(ui.pageOptions->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - connect(ui.pageOptions->BtnNewTeam, SIGNAL(clicked()), this, SLOT(NewTeam())); - connect(ui.pageOptions->BtnEditTeam, SIGNAL(clicked()), this, SLOT(EditTeam())); - connect(ui.pageOptions->BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(DeleteTeam())); - connect(ui.pageOptions->BtnSaveOptions, SIGNAL(clicked()), config, SLOT(SaveOptions())); - connect(ui.pageOptions->BtnSaveOptions, SIGNAL(clicked()), this, SLOT(GoBack())); + connect(ui.pageOptions, SIGNAL(newTeamRequested()), this, SLOT(NewTeam())); + connect(ui.pageOptions, SIGNAL(editTeamRequested(const QString&)), this, SLOT(EditTeam(const QString&))); + connect(ui.pageOptions, SIGNAL(deleteTeamRequested(const QString&)), this, SLOT(DeleteTeam(const QString&))); + connect(ui.pageOptions->btnSave, SIGNAL(clicked()), config, SLOT(SaveOptions())); + connect(ui.pageOptions->btnSave, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageOptions->BtnAssociateFiles, SIGNAL(clicked()), this, SLOT(AssociateFiles())); connect(ui.pageOptions->WeaponEdit, SIGNAL(clicked()), this, SLOT(GoToSelectWeapon())); @@ -203,17 +198,14 @@ connect(ui.pageOptions->SchemeDelete, SIGNAL(clicked()), this, SLOT(DeleteScheme())); connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsChanged()), this, SLOT(UpdateWeapons())); - connect(ui.pageNet->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageNet->BtnSpecifyServer, SIGNAL(clicked()), this, SLOT(NetConnect())); connect(ui.pageNet->BtnNetSvrStart, SIGNAL(clicked()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageNet->BtnNetSvrStart, ID_PAGE_NETSERVER); connect(ui.pageNet, SIGNAL(connectClicked(const QString &, quint16)), this, SLOT(NetConnectServer(const QString &, quint16))); - connect(ui.pageNetServer->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageNetServer->BtnStart, SIGNAL(clicked()), this, SLOT(NetStartServer())); - connect(ui.pageNetGame->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageNetGame->pNetTeamsWidget, SIGNAL(setEnabledGameStart(bool)), ui.pageNetGame->BtnStart, SLOT(setEnabled(bool))); connect(ui.pageNetGame, SIGNAL(SetupClicked()), this, SLOT(IntermediateSetup())); @@ -222,14 +214,11 @@ connect(ui.pageNetGame->pGameCFG, SIGNAL(goToDrawMap()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageNetGame->pGameCFG, ID_PAGE_DRAWMAP); - connect(ui.pageRoomsList->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageRoomsList->BtnAdmin, SIGNAL(clicked()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageRoomsList->BtnAdmin, ID_PAGE_ADMIN); connect(ui.pageInfo->BtnSnapshots, SIGNAL(clicked()), this, SLOT(OpenSnapshotFolder())); - connect(ui.pageInfo->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - connect(ui.pageGameStats->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageGameStats, SIGNAL(saveDemoRequested()), this, SLOT(saveDemoWithCustomName())); connect(ui.pageSinglePlayer->BtnSimpleGamePage, SIGNAL(clicked()), this, SLOT(SimpleGame())); @@ -244,16 +233,12 @@ connect(ui.pageSinglePlayer->BtnLoad, SIGNAL(clicked()), this, SLOT(GoToSaves())); connect(ui.pageSinglePlayer->BtnDemos, SIGNAL(clicked()), this, SLOT(GoToDemos())); - connect(ui.pageSinglePlayer->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - connect(ui.pageTraining->BtnStartTrain, SIGNAL(clicked()), this, SLOT(StartTraining())); - connect(ui.pageTraining->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); + connect(ui.pageTraining, SIGNAL(startMission(const QString&)), this, SLOT(startTraining(const QString&))); connect(ui.pageCampaign->BtnStartCampaign, SIGNAL(clicked()), this, SLOT(StartCampaign())); - connect(ui.pageCampaign->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(int))); - connect(ui.pageSelectWeapon->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageSelectWeapon->BtnDelete, SIGNAL(clicked()), ui.pageSelectWeapon->pWeapons, SLOT(deleteWeaponsName())); // executed first @@ -262,16 +247,10 @@ //connect(ui.pageSelectWeapon->pWeapons, SIGNAL(weaponsDeleted()), // this, SLOT(GoBack())); // executed third - connect(ui.pageScheme->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - connect(ui.pageAdmin->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - - connect(ui.pageNetType->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); connect(ui.pageNetType->BtnLAN, SIGNAL(clicked()), this, SLOT(GoToNet())); connect(ui.pageNetType->BtnOfficialServer, SIGNAL(clicked()), this, SLOT(NetConnectOfficialServer())); - connect(ui.pageDrawMap->BtnBack, SIGNAL(clicked()), this, SLOT(GoBack())); - connect(ui.pageConnecting, SIGNAL(cancelConnection()), this, SLOT(GoBack())); @@ -296,26 +275,27 @@ #ifdef USE_XFIRE void HWForm::updateXfire(void) { - if(hwnet) + if(hwnet && (hwnet->clientState() != HWNewNet::Disconnected)) { xfire_setvalue(XFIRE_SERVER, !hwnet->getHost().compare("netserver.hedgewars.org:46631") ? "Official server" : hwnet->getHost().toAscii()); - switch(hwnet->getClientState()) + switch(hwnet->clientState()) { - case 1: // Connecting + case HWNewNet::Connecting: // Connecting + case HWNewNet::Connected: xfire_setvalue(XFIRE_STATUS, "Connecting"); xfire_setvalue(XFIRE_NICKNAME, "-"); xfire_setvalue(XFIRE_ROOM, "-"); - case 2: // In lobby + case HWNewNet::InLobby: // In lobby xfire_setvalue(XFIRE_STATUS, "Online"); xfire_setvalue(XFIRE_NICKNAME, hwnet->getNick().toAscii()); xfire_setvalue(XFIRE_ROOM, "In game lobby"); break; - case 3: // In room + case HWNewNet::InRoom: // In room xfire_setvalue(XFIRE_STATUS, "Online"); xfire_setvalue(XFIRE_NICKNAME, hwnet->getNick().toAscii()); xfire_setvalue(XFIRE_ROOM, (hwnet->getRoom() + " (waiting for players)").toAscii()); break; - case 5: // In game + case HWNewNet::InGame: // In game xfire_setvalue(XFIRE_STATUS, "Online"); xfire_setvalue(XFIRE_NICKNAME, hwnet->getNick().toAscii()); xfire_setvalue(XFIRE_ROOM, (hwnet->getRoom() + " (playing or spectating)").toAscii()); @@ -399,7 +379,7 @@ if(teamslist.empty()) { HWTeam defaultTeam(tr("DefaultTeam")); - defaultTeam.SaveToFile(); + defaultTeam.saveToFile(); teamslist.push_back(tr("DefaultTeam")); } @@ -495,11 +475,7 @@ if (id == ID_PAGE_MULTIPLAYER || id == ID_PAGE_NETGAME) { QStringList tmNames = config->GetTeamsList(); TeamSelWidget* curTeamSelWidget; - ui.pageOptions->BtnNewTeam->setVisible(false); - ui.pageOptions->BtnEditTeam->setVisible(false); - ui.pageOptions->BtnDeleteTeam->setVisible(false); - ui.pageOptions->CBTeamName->setVisible(false); - ui.pageOptions->LblNoEditTeam->setVisible(true); + ui.pageOptions->setTeamOptionsEnabled(false); if (id == ID_PAGE_MULTIPLAYER) { curTeamSelWidget = ui.pageMultiplayer->teamsSelect; @@ -510,7 +486,7 @@ QList teamsList; for (QStringList::iterator it = tmNames.begin(); it != tmNames.end(); it++) { HWTeam team(*it); - team.LoadFromFile(); + team.loadFromFile(); teamsList.push_back(team); } @@ -530,11 +506,7 @@ } if (id == ID_PAGE_MAIN) { - ui.pageOptions->BtnNewTeam->setVisible(true); - ui.pageOptions->BtnEditTeam->setVisible(true); - ui.pageOptions->BtnDeleteTeam->setVisible(true); - ui.pageOptions->CBTeamName->setVisible(true); - ui.pageOptions->LblNoEditTeam->setVisible(false); + ui.pageOptions->setTeamOptionsEnabled(true); } // load and save ignore/friends lists @@ -565,8 +537,11 @@ void HWForm::GoBack() { + int curid = ui.Pages->currentIndex(); + if (curid == ID_PAGE_MAIN) + exit(); + int id = PagesStack.isEmpty() ? ID_PAGE_MAIN : PagesStack.pop(); - int curid = ui.Pages->currentIndex(); ui.Pages->setCurrentIndex(id); OnPageShown(id, curid); @@ -582,7 +557,7 @@ GoBack(); if (curid == ID_PAGE_ROOMSLIST || curid == ID_PAGE_CONNECTING) NetDisconnect(); - if (curid == ID_PAGE_NETGAME && hwnet) hwnet->partRoom(); + if (curid == ID_PAGE_NETGAME && hwnet && hwnet->isInRoom()) hwnet->partRoom(); // need to work on this, can cause invalid state for admin quit trying to prevent bad state message on kick //if (curid == ID_PAGE_NETGAME && (!game || game->gameState != gsStarted)) hwnet->partRoom(); @@ -601,14 +576,15 @@ eggTimer.start(); } -void HWForm::btnExitClicked() +void HWForm::exit() { - if (eggTimer.elapsed() < 3000){ +// if (eggTimer.elapsed() < 3000){ #ifdef __APPLE__ panel->showInstallController(); #endif close(); - } +// TODO reactivate egg +/* } else { QPushButton * btn = findChild("imageButt"); @@ -616,7 +592,7 @@ { btn->setIcon(QIcon(":/res/bonus.png")); } - } + } */ } void HWForm::IntermediateSetup() @@ -633,7 +609,7 @@ QStringList tmnames; foreach(HWTeam team, curTeamSelWidget->getNotPlayingTeams()) - tmnames += team.TeamName; + tmnames += team.name(); //UpdateTeamsLists(&tmnames); // FIXME: still need more work if teamname is updated while configuring UpdateTeamsLists(); @@ -643,61 +619,30 @@ void HWForm::NewTeam() { - editedTeam = new HWTeam(QLineEdit::tr("unnamed")); - editedTeam->SetToPage(this); - GoToPage(ID_PAGE_SETUP_TEAM); -} - -void HWForm::EditTeam() -{ - editedTeam = new HWTeam(ui.pageOptions->CBTeamName->currentText()); - editedTeam->LoadFromFile(); - editedTeam->SetToPage(this); + ui.pageEditTeam->createTeam(QLineEdit::tr("unnamed"), playerHash); + UpdateTeamsLists(); GoToPage(ID_PAGE_SETUP_TEAM); } -void HWForm::DeleteTeam() +void HWForm::EditTeam(const QString & teamName) { - QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Teams"), QMessageBox::tr("Really delete this team?"), QMessageBox::Ok | QMessageBox::Cancel); - - if (reallyDelete.exec() == QMessageBox::Ok) { - editedTeam = new HWTeam(ui.pageOptions->CBTeamName->currentText()); - editedTeam->DeleteFile(); - - // Remove from lists - ui.pageOptions->CBTeamName->removeItem(ui.pageOptions->CBTeamName->currentIndex()); - } + ui.pageEditTeam->editTeam(teamName, playerHash); + GoToPage(ID_PAGE_SETUP_TEAM); } -void HWForm::RandomNames() -{ - editedTeam->GetFromPage(this); - namegen->TeamRandomNames(editedTeam, true); - editedTeam->SetToPage(this); -} - -void HWForm::RandomName(const int &i) +void HWForm::AfterTeamEdit() { - editedTeam->GetFromPage(this); - namegen->TeamRandomName(editedTeam,i); - editedTeam->SetToPage(this); -} - -void HWForm::TeamSave() -{ - editedTeam->GetFromPage(this); - editedTeam->SaveToFile(); - delete editedTeam; - editedTeam=0; UpdateTeamsLists(); GoBack(); } -void HWForm::TeamDiscard() + +void HWForm::DeleteTeam(const QString & teamName) { - delete editedTeam; - editedTeam=0; - GoBack(); + ui.pageEditTeam->deleteTeam(teamName); + QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Teams"), QMessageBox::tr("Really delete this team?"), QMessageBox::Ok | QMessageBox::Cancel); + + UpdateTeamsLists(); } void HWForm::DeleteScheme() @@ -757,7 +702,82 @@ NetConnectServer("netserver.hedgewars.org", 46631); } -void HWForm::_NetConnect(const QString & hostName, quint16 port, const QString & nick) +void HWForm::NetPassword(const QString & nick) +{ + bool ok = false; + int passLength = config->value("net/passwordlength", 0).toInt(); + QString hash = config->value("net/passwordhash", "").toString(); + + // If the password is blank, ask the user to enter one in + if (passLength == 0) + { + QString password = QInputDialog::getText(this, tr("Password"), tr("Your nickname %1 is\nregistered on Hedgewars.org\nPlease provide your password below\nor pick another nickname in game config:").arg(nick), QLineEdit::Password, passLength==0?NULL:QString(passLength,'\0'), &ok); + + if (!ok) { + ForcedDisconnect(tr("No password supplied.")); + return; + } + + hash = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex(); + config->setValue("net/passwordhash", hash); + config->setValue("net/passwordlength", password.size()); + config->setNetPasswordLength(password.size()); + } + + hwnet->SendPasswordHash(hash); +} + +void HWForm::NetNickTaken(const QString & nick) +{ + bool ok = false; + QString newNick = QInputDialog::getText(this, tr("Nickname"), tr("Some one already uses\n your nickname %1\non the server.\nPlease pick another nickname:").arg(nick), QLineEdit::Normal, nick, &ok); + + if (!ok || newNick.isEmpty()) { + ForcedDisconnect(tr("No nickname supplied.")); + return; + } + + hwnet->NewNick(newNick); + config->setValue("net/nick", newNick); + config->updNetNick(); +} + +void HWForm::NetAuthFailed() +{ + // Set the password blank if case the user tries to join and enter his password again + config->setValue("net/passwordlength", 0); + config->setNetPasswordLength(0); +} + +void HWForm::NetTeamAccepted(const QString & team) +{ + ui.pageNetGame->pNetTeamsWidget->changeTeamStatus(team); +} + +void HWForm::NetError(const QString & errmsg) +{ + switch (ui.Pages->currentIndex()) + { + case ID_PAGE_INGAME: + ShowErrorMessage(errmsg); + // no break + case ID_PAGE_NETGAME: + ui.pageNetGame->pChatWidget->addLine("Error",errmsg); + break; + default: + ui.pageRoomsList->chatWidget->addLine("Error",errmsg); + } +} + +void HWForm::NetWarning(const QString & wrnmsg) +{ + if (ui.Pages->currentIndex() == ID_PAGE_NETGAME || ui.Pages->currentIndex() == ID_PAGE_INGAME) + ui.pageNetGame->pChatWidget->addLine("Warning",wrnmsg); + else + ui.pageRoomsList->chatWidget->addLine("Warning",wrnmsg); +} + +void HWForm::_NetConnect(const QString & hostName, quint16 port, QString nick) { if(hwnet) { hwnet->Disconnect(); @@ -767,17 +787,22 @@ ui.pageRoomsList->chatWidget->clear(); - hwnet = new HWNewNet(config, ui.pageNetGame->pGameCFG, ui.pageNetGame->pNetTeamsWidget); + hwnet = new HWNewNet(); GoToPage(ID_PAGE_CONNECTING); - connect(hwnet, SIGNAL(showMessage(const QString &)), this, SLOT(ShowErrorMessage(const QString &)), Qt::QueuedConnection); - connect(hwnet, SIGNAL(AskForRunGame()), this, SLOT(CreateNetGame())); - connect(hwnet, SIGNAL(Connected()), this, SLOT(NetConnected())); + connect(hwnet, SIGNAL(connected()), this, SLOT(NetConnected())); + connect(hwnet, SIGNAL(Error(const QString&)), this, SLOT(NetError(const QString&))); + connect(hwnet, SIGNAL(Warning(const QString&)), this, SLOT(NetWarning(const QString&))); connect(hwnet, SIGNAL(EnteredGame()), this, SLOT(NetGameEnter())); - connect(hwnet, SIGNAL(LeftRoom()), this, SLOT(NetLeftRoom())); + connect(hwnet, SIGNAL(LeftRoom(const QString&)), this, SLOT(NetLeftRoom(const QString&))); connect(hwnet, SIGNAL(AddNetTeam(const HWTeam&)), this, SLOT(AddNetTeam(const HWTeam&))); + connect(hwnet, SIGNAL(RemoveNetTeam(const HWTeam&)), this, SLOT(RemoveNetTeam(const HWTeam&))); + connect(hwnet, SIGNAL(TeamAccepted(const QString&)), this, SLOT(NetTeamAccepted(const QString&))); + connect(hwnet, SIGNAL(AskForPassword(const QString&)), this, SLOT(NetPassword(const QString&))); + connect(hwnet, SIGNAL(NickTaken(const QString&)), this, SLOT(NetNickTaken(const QString&))); + connect(hwnet, SIGNAL(AuthFailed()), this, SLOT(NetAuthFailed())); //connect(ui.pageNetGame->BtnBack, SIGNAL(clicked()), hwnet, SLOT(partRoom())); // rooms list page stuff @@ -880,11 +905,25 @@ connect(ui.pageAdmin, SIGNAL(setServerMessageOld(const QString&)), hwnet, SLOT(setServerMessageOld(const QString &))); connect(ui.pageAdmin, SIGNAL(setProtocol(int)), hwnet, SLOT(setLatestProtocolVar(int))); connect(ui.pageAdmin, SIGNAL(askServerVars()), hwnet, SLOT(askServerVars())); - connect(ui.pageAdmin->pbClearAccountsCache, SIGNAL(clicked()), hwnet, SLOT(clearAccountsCache())); + connect(ui.pageAdmin, SIGNAL(clearAccountsCache()), hwnet, SLOT(clearAccountsCache())); // disconnect - connect(hwnet, SIGNAL(Disconnected()), this, SLOT(ForcedDisconnect()), Qt::QueuedConnection); + connect(hwnet, SIGNAL(disconnected(const QString&)), this, SLOT(ForcedDisconnect(const QString&)), Qt::QueuedConnection); + +// config stuff + connect(hwnet, SIGNAL(paramChanged(const QString &, const QStringList &)), ui.pageNetGame->pGameCFG, SLOT(setParam(const QString &, const QStringList &))); + connect(ui.pageNetGame->pGameCFG, SIGNAL(paramChanged(const QString &, const QStringList &)), hwnet, SLOT(onParamChanged(const QString &, const QStringList &))); + connect(hwnet, SIGNAL(configAsked()), ui.pageNetGame->pGameCFG, SLOT(fullNetConfig())); + while (nick.isEmpty()) { + nick = QInputDialog::getText(this, + QObject::tr("Nickname"), + QObject::tr("Please enter your nickname"), + QLineEdit::Normal, + QDir::home().dirName()); + config->setValue("net/nick",nick); + config->updNetNick(); + } hwnet->Connect(hostName, port, nick); } @@ -932,11 +971,6 @@ void HWForm::NetDisconnect() { - if(hwnet) { - hwnet->Disconnect(); - delete hwnet; - hwnet = 0; - } if(pnetserver) { if (pRegisterServer) { @@ -950,15 +984,12 @@ } } -void HWForm::ForcedDisconnect() +void HWForm::ForcedDisconnect(const QString & reason) { if(pnetserver) return; // we have server - let it care of all things if (hwnet) { - HWNewNet * tmp = hwnet; - hwnet = 0; - tmp->deleteLater(); QMessageBox::warning(this, QMessageBox::tr("Network"), - QMessageBox::tr("Connection to server is lost")); + QMessageBox::tr("Connection to server is lost") + (reason.isEmpty()?"":("\n\n" + HWNewNet::tr("Quit reason: ") + '"' + reason +'"'))); } if (ui.Pages->currentIndex() != ID_PAGE_NET) GoBack(); @@ -980,6 +1011,11 @@ ui.pageNetGame->pNetTeamsWidget->addTeam(team); } +void HWForm::RemoveNetTeam(const HWTeam& team) +{ + ui.pageNetGame->pNetTeamsWidget->removeNetTeam(team); +} + void HWForm::StartMPGame() { QString ammo; @@ -1094,11 +1130,11 @@ demofile.close(); } -void HWForm::StartTraining() +void HWForm::startTraining(const QString & scriptName) { CreateGame(0, 0, 0); - game->StartTraining(ui.pageTraining->CBSelect->itemData(ui.pageTraining->CBSelect->currentIndex()).toString()); + game->StartTraining(scriptName); } void HWForm::StartCampaign() @@ -1145,6 +1181,9 @@ void HWForm::NetGameChangeStatus(bool isMaster) { + ui.pageNetGame->pGameCFG->setEnabled(isMaster); + ui.pageNetGame->pNetTeamsWidget->setInteractivity(isMaster); + if (isMaster) NetGameMaster(); else @@ -1205,10 +1244,14 @@ ui.pageNetGame->pGameCFG->GameSchemes->setCurrentIndex(0); } -void HWForm::NetLeftRoom() +void HWForm::NetLeftRoom(const QString & reason) { if (ui.Pages->currentIndex() == ID_PAGE_NETGAME || ui.Pages->currentIndex() == ID_PAGE_INGAME) + { GoBack(); + if (!reason.isEmpty()) + ui.pageRoomsList->chatWidget->addLine("Notice",reason); + } else qWarning("Left room while not in room"); } @@ -1236,7 +1279,8 @@ tmpdir.setFilter(QDir::Files); QStringList userentries = tmpdir.entryList(QStringList("*#*.lua")); //entries.sort(); - for(int i = 0; (i < userentries.count()) && (i <= team.CampaignProgress); i++) + unsigned int n = userentries.count(); + for(unsigned int i = 0; (i < n) && (i <= team.campaignProgress()); i++) ui.pageCampaign->CBSelect->addItem(QString(userentries[i]).replace(QRegExp("^(\\d+)#(.+)\\.lua"), QComboBox::tr("Mission") + " \\1: \\2").replace("_", " "), QString(userentries[i]).replace(QRegExp("^(.*)\\.lua"), "\\1")); tmpdir.cd(datadir->absolutePath()); @@ -1244,7 +1288,8 @@ tmpdir.setFilter(QDir::Files); QStringList entries = tmpdir.entryList(QStringList("*#*.lua")); //entries.sort(); - for(int i = 0; (i < entries.count()) && (i <= team.CampaignProgress); i++) { + n = entries.count(); + for(unsigned int i = 0; (i < n) && (i <= team.campaignProgress()); i++) { if (userentries.contains(entries[i])) continue; ui.pageCampaign->CBSelect->addItem(QString(entries[i]).replace(QRegExp("^(\\d+)#(.+)\\.lua"), QComboBox::tr("Mission") + " \\1: \\2").replace("_", " "), QString(entries[i]).replace(QRegExp("^(.*)\\.lua"), "\\1")); } diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hwform.h --- a/QTfrontend/hwform.h Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/hwform.h Sun Oct 16 21:03:30 2011 +0200 @@ -59,6 +59,7 @@ QSettings * gameSettings; // Same file GameUIConfig points to but without the baggage. Needs sync() calls if you want to get GameUIConfig changes though void updateXfire(); void PlayDemoQuick(const QString & demofilename); + void exit(); private slots: void GoToSaves(); @@ -76,20 +77,16 @@ QString getDemoArguments(); void AssociateFiles(); void btnExitPressed(); - void btnExitClicked(); void IntermediateSetup(); void NewTeam(); - void EditTeam(); - void DeleteTeam(); - void RandomNames(); - void RandomName(const int &i); - void TeamSave(); - void TeamDiscard(); + void EditTeam(const QString & teamName); + void AfterTeamEdit(); + void DeleteTeam(const QString & teamName); void DeleteScheme(); void DeleteWeaponSet(); void SimpleGame(); void PlayDemo(); - void StartTraining(); + void startTraining(const QString&); void StartCampaign(); void NetConnect(); void NetConnectServer(const QString & host, quint16 port); @@ -97,11 +94,18 @@ void NetStartServer(); void NetDisconnect(); void NetConnected(); + void NetError(const QString & errmsg); + void NetWarning(const QString & wrnmsg); void NetGameEnter(); + void NetPassword(const QString & nick); + void NetNickTaken(const QString & nick); + void NetAuthFailed(); + void NetTeamAccepted(const QString& team); void AddNetTeam(const HWTeam& team); + void RemoveNetTeam(const HWTeam& team); void StartMPGame(); void GameStateChanged(GameState gameState); - void ForcedDisconnect(); + void ForcedDisconnect(const QString & reason); void ShowErrorMessage(const QString &); void GetRecord(bool isDemo, const QByteArray & record); void CreateNetGame(); @@ -115,13 +119,13 @@ void NetGameSlave(); void AsyncNetServerStart(); - void NetLeftRoom(); + void NetLeftRoom(const QString & reason); void selectFirstNetScheme(); void saveDemoWithCustomName(); private: - void _NetConnect(const QString & hostName, quint16 port, const QString & nick); + void _NetConnect(const QString & hostName, quint16 port, QString nick); void UpdateTeamsLists(const QStringList* editable_teams=0); void CreateGame(GameCFGWidget * gamecfg, TeamSelWidget* pTeamSelWidget, QString ammo); void closeEvent(QCloseEvent *event); diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hwmap.cpp --- a/QTfrontend/hwmap.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,91 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Ulyanov Igor - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "hwconsts.h" -#include "hwmap.h" - -HWMap::HWMap() : - TCPBase(false) -{ -} - -HWMap::~HWMap() -{ -} - -void HWMap::getImage(const QString & seed, int filter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData) -{ - m_seed = seed; - templateFilter = filter; - m_mapgen = mapgen; - m_maze_size = maze_size; - if(mapgen == MAPGEN_DRAWN) m_drawMapData = drawMapData; - Start(); -} - -QStringList HWMap::getArguments() -{ - QStringList arguments; - arguments << cfgdir->absolutePath(); - arguments << QString("%1").arg(ipc_port); - arguments << "landpreview"; - return arguments; -} - -void HWMap::onClientDisconnect() -{ - if (readbuffer.size() == 128 * 32 + 1) - { - quint8 *buf = (quint8*) readbuffer.constData(); - QImage im(buf, 256, 128, QImage::Format_Mono); - im.setNumColors(2); - emit HHLimitReceived(buf[128 * 32]); - emit ImageReceived(im); - } -} - -void HWMap::SendToClientFirst() -{ - SendIPC(QString("eseed %1").arg(m_seed).toUtf8()); - SendIPC(QString("e$template_filter %1").arg(templateFilter).toUtf8()); - SendIPC(QString("e$mapgen %1").arg(m_mapgen).toUtf8()); - - switch (m_mapgen) - { - case MAPGEN_MAZE: - SendIPC(QString("e$maze_size %1").arg(m_maze_size).toUtf8()); - break; - - case MAPGEN_DRAWN: - { - QByteArray data = m_drawMapData; - while(data.size() > 0) - { - QByteArray tmp = data; - tmp.truncate(200); - SendIPC("edraw " + tmp); - data.remove(0, 200); - } - break; - } - default: ; - } - - SendIPC("!"); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/hwmap.h --- a/QTfrontend/hwmap.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,65 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006 Igor Ulyanov - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _HWMAP_INCLUDED -#define _HWMAP_INCLUDED - -#include -#include -#include - -#include "tcpBase.h" - -enum MapGenerator -{ - MAPGEN_REGULAR, - MAPGEN_MAZE, - MAPGEN_DRAWN, - MAPGEN_MAP -}; - -class HWMap : public TCPBase -{ - Q_OBJECT - - public: - HWMap(); - virtual ~HWMap(); - void getImage(const QString & seed, int templateFilter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData); - - protected: - virtual QStringList getArguments(); - virtual void onClientDisconnect(); - virtual void SendToClientFirst(); - - signals: - void ImageReceived(const QImage newImage); - void HHLimitReceived(int hhLimit); - - private: - QString m_seed; - int templateFilter; - MapGenerator m_mapgen; - int m_maze_size; - QByteArray m_drawMapData; - - private slots: -}; - -#endif // _HWMAP_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/igbox.cpp --- a/QTfrontend/igbox.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,79 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include - -#include "igbox.h" - -IconedGroupBox::IconedGroupBox(QWidget * parent) - : QGroupBox(parent) -{ -// Has issues with border-radius on children -// setAttribute(Qt::WA_PaintOnScreen, true); - titleLeftPadding = 49; - contentTopPadding = 15; -} - -void IconedGroupBox::setIcon(const QIcon & icon) -{ - if (this->icon.isNull()) - setStyleSheet(QString( - "IconedGroupBox{" - "margin-top: 46px;" - "margin-left: 12px;" - "padding: %1px 2px 5px 2px;" - "}" - "IconedGroupBox::title{" - "subcontrol-origin: margin;" - "subcontrol-position: top left;" - "padding-left: %2px;" - "padding-top: %1px;" - "text-align: left;" - "}" - ).arg(contentTopPadding).arg(titleLeftPadding) - ); - - this->icon = icon; - repaint(); -} - -void IconedGroupBox::paintEvent(QPaintEvent * event) -{ - Q_UNUSED(event); - - QStylePainter painter(this); - - QStyleOptionGroupBox option; - initStyleOption(&option); - painter.drawComplexControl(QStyle::CC_GroupBox, option); - - icon.paint(&painter, QRect(QPoint(0, 0), icon.actualSize(size()))); -} - -void IconedGroupBox::setTitleTextPadding(int px) -{ - titleLeftPadding = px; -} - -void IconedGroupBox::setContentTopPadding(int px) -{ - contentTopPadding = px; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/igbox.h --- a/QTfrontend/igbox.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _IGBOX_H -#define _IGBOX_H - -#include -#include - -class IconedGroupBox : public QGroupBox -{ - Q_OBJECT - -public: - IconedGroupBox(QWidget * parent = 0); - - void setIcon(const QIcon & icon); - void setTitleTextPadding(int px); - void setContentTopPadding(int px); -protected: - virtual void paintEvent(QPaintEvent * event); - -private: - QIcon icon; - int titleLeftPadding; - int contentTopPadding; -}; - -#endif // _IGBOX_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/input_ip.cpp --- a/QTfrontend/input_ip.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include - -#include "input_ip.h" - -HWHostPortDialog::HWHostPortDialog(QWidget* parent) : QDialog(parent) -{ - QGridLayout * layout = new QGridLayout(this); - - QLabel * lbHost = new QLabel(this); - lbHost->setText(QLabel::tr("Host:")); - layout->addWidget(lbHost, 0, 0); - - QLabel * lbPort = new QLabel(this); - lbPort->setText(QLabel::tr("Port:")); - layout->addWidget(lbPort, 1, 0); - - leHost = new QLineEdit(this); - layout->addWidget(leHost, 0, 1, 1, 2); - - sbPort = new QSpinBox(this); - sbPort->setMinimum(0); - sbPort->setMaximum(65535); - layout->addWidget(sbPort, 1, 1, 1, 2); - - pbDefault = new QPushButton(this); - pbDefault->setText(QPushButton::tr("default")); - layout->addWidget(pbDefault, 1, 3); - - pbOK = new QPushButton(this); - pbOK->setText(QPushButton::tr("OK")); - pbOK->setDefault(true); - layout->addWidget(pbOK, 3, 1); - - pbCancel = new QPushButton(this); - pbCancel->setText(QPushButton::tr("Cancel")); - layout->addWidget(pbCancel, 3, 2); - - connect(pbOK, SIGNAL(clicked()), this, SLOT(accept())); - connect(pbCancel, SIGNAL(clicked()), this, SLOT(reject())); - connect(pbDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort())); -} - -void HWHostPortDialog::setDefaultPort() -{ - sbPort->setValue(46631); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/input_ip.h --- a/QTfrontend/input_ip.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - - -#ifndef INPUT_IP_H -#define INPUT_IP_H - -#include -#include - -class QLineEdit; -class QSpinBox; -class QPushButton; - -class HWHostPortDialog : public QDialog -{ - Q_OBJECT -public: - HWHostPortDialog(QWidget* parent = 0); - - QLineEdit* leHost; - QSpinBox* sbPort; - -private: - QPushButton* pbOK; - QPushButton* pbCancel; - QPushButton * pbDefault; - -private slots: - void setDefaultPort(); -}; - - -#endif // INPUT_IP_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/itemNum.cpp --- a/QTfrontend/itemNum.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,114 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Igor Ulyanov - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "itemNum.h" -#include "hwform.h" - -#include -#include - -ItemNum::ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min, unsigned char max) : - QFrame(parent), m_im(im), m_img(img), infinityState(false), nonInteractive(false), minItems(min), maxItems(max), - numItems(min+2 >= max ? min : min+2) -{ - enabled = true; - if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true); -} - -ItemNum::~ItemNum() -{ -} - -void ItemNum::mousePressEvent ( QMouseEvent * event ) -{ - if(nonInteractive) return; - if(event->button()==Qt::LeftButton && enabled) { - event->accept(); - if((infinityState && numItems <= maxItems) || (!infinityState && numItems < maxItems)) { - incItems(); - } else { - numItems = minItems+1; - // appears there's an emit in there - decItems(); - } - } else if (event->button()==Qt::RightButton && enabled) { - event->accept(); - if(numItems > minItems) { - decItems(); - } else { - numItems = maxItems+(infinityState?0:-1); - incItems(); - } - } else { - event->ignore(); - return; - } - repaint(); -} - -QSize ItemNum::sizeHint () const -{ - return QSize((maxItems+1)*12, 32); -} - -void ItemNum::paintEvent(QPaintEvent* event) -{ - Q_UNUSED(event); - - QPainter painter(this); - - if (numItems==maxItems+1) { - QRect target(0, 0, 100, 32); - if (enabled) { - painter.drawImage(target, QImage(":/res/infinity.png")); - } else { - painter.drawImage(target, QImage(":/res/infinitygrey.png")); - } - } else { - for(int i=0; i - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#ifndef _ITEM_NUM_INCLUDED -#define _ITEM_NUM_INCLUDED - -class ItemNum : public QFrame -{ - Q_OBJECT - - public: - void setInfinityState(bool value); - void setEnabled(bool value); - unsigned char getItemsNum() const; - void setItemsNum(const unsigned char num); - - private: - QImage m_im; - QImage m_img; - bool infinityState; - bool enabled; - - protected: - ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min=2, unsigned char max=8); - virtual QSize sizeHint () const; - virtual ~ItemNum()=0; - - bool nonInteractive; - unsigned char minItems; - unsigned char maxItems; - unsigned char numItems; - - // from QWidget - virtual void mousePressEvent ( QMouseEvent * event ); - virtual void paintEvent(QPaintEvent* event); - - // to be implemented in child - virtual void incItems()=0; - virtual void decItems()=0; -}; - -#endif // _ITEM_NUM_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/main.cpp --- a/QTfrontend/main.cpp Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/main.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -180,6 +180,11 @@ "border-color: white;" "}" + "QPushButton:focus {" + "outline: none;" + "}" + + "QHeaderView {" "border-radius: 0;" "border-width: 0;" diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/mapContainer.cpp --- a/QTfrontend/mapContainer.cpp Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/mapContainer.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -114,6 +114,8 @@ QString scheme; QString weapons; QList mapInfo; + bool isMission = mapLuaFile.exists(); + QTextStream input(&mapCfgFile); input >> theme; input >> limit; @@ -125,16 +127,22 @@ mapInfo.push_back(limit); else mapInfo.push_back(18); - mapInfo.push_back(mapLuaFile.exists()); + + + mapInfo.push_back(isMission); + if (scheme.isEmpty()) scheme = "locked"; scheme.replace("_", " "); + if (weapons.isEmpty()) weapons = "locked"; weapons.replace("_", " "); + mapInfo.push_back(scheme); mapInfo.push_back(weapons); - if(mapLuaFile.exists()) + + if(isMission) { chooseMap->insertItem(missionindex++, // FIXME - need real icons. Disabling until then diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/misc.cpp --- a/QTfrontend/misc.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,19 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2005-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "misc.h" diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/misc.h --- a/QTfrontend/misc.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2005-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _MISC_H -#define _MISC_H - - -#include -#include - -class FreqSpinBox : public QSpinBox -{ - Q_OBJECT - -public: - FreqSpinBox(QWidget* parent) : QSpinBox(parent) - { - - } - - QString textFromValue(int value) const - { - if (!value) - return tr("Never"); - else - return tr("Every %1 turn", "", value).arg(value); - } -}; - - -#endif // _MISC_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/ammoSchemeModel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/ammoSchemeModel.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,786 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "ammoSchemeModel.h" +#include "hwconsts.h" + +QList defaultScheme = QList() + << QVariant("Default") // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(false) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(45) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(5) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(4) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(2) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + +AmmoSchemeModel::AmmoSchemeModel(QObject* parent, const QString & fileName) : + QAbstractTableModel(parent), + fileConfig(fileName, QSettings::IniFormat) +{ + predefSchemesNames = QStringList() + << "Default" + << "Pro Mode" + << "Shoppa" + << "Clean Slate" + << "Minefield" + << "Barrel Mayhem" + << "Tunnel Hogs" + << "Fort Mode" + << "Timeless" + << "Thinking with Portals" + << "King Mode" + ; + + numberOfDefaultSchemes = predefSchemesNames.size(); + + spNames = QStringList() + << "name" // 0 + << "fortsmode" // 1 + << "divteams" // 2 + << "solidland" // 3 + << "border" // 4 + << "lowgrav" // 5 + << "laser" // 6 + << "invulnerability" // 7 + << "resethealth" // 8 + << "vampiric" // 9 + << "karma" // 10 + << "artillery" // 11 + << "randomorder" // 12 + << "king" // 13 + << "placehog" // 14 + << "sharedammo" // 15 + << "disablegirders" // 16 + << "disablelandobjects" // 17 + << "aisurvival" // 18 + << "infattack" // 19 + << "resetweps" // 20 + << "perhogammo" // 21 + << "disablewind" // 22 + << "morewind" // 23 + << "tagteam" // 24 + << "bottomborder" // 25 + << "damagefactor" // 26 + << "turntime" // 27 + << "health" // 28 + << "suddendeath" // 29 + << "caseprobability" // 30 + << "minestime" // 31 + << "minesnum" // 32 + << "minedudpct" // 33 + << "explosives" // 34 + << "healthprobability" // 35 + << "healthcaseamount" // 36 + << "waterrise" // 37 + << "healthdecrease" // 38 + << "ropepct" // 39 + << "getawaytime" // 40 + ; + + QList proMode; + proMode + << predefSchemesNames[1] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(true) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(15) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(0) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(0) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(2) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList shoppa; + shoppa + << predefSchemesNames[2] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(true) // solid land 3 + << QVariant(true) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(true) // shared ammo 15 + << QVariant(true) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(true) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(30) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(50) // sudden death 29 + << QVariant(1) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(0) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(0) // explosives 34 + << QVariant(0) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList cleanslate; + cleanslate + << predefSchemesNames[3] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(true) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(false) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(true) // inf. attack 19 + << QVariant(true) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(45) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(5) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(4) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(2) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList minefield; + minefield + << predefSchemesNames[4] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(true) // shared ammo 15 + << QVariant(true) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(30) // turn time 27 + << QVariant(50) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(0) // case prob 30 + << QVariant(0) // mines time 31 + << QVariant(80) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(0) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList barrelmayhem; + barrelmayhem + << predefSchemesNames[5] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(true) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(30) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(0) // case prob 30 + << QVariant(0) // mines time 31 + << QVariant(0) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(80) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList tunnelhogs; + tunnelhogs + << predefSchemesNames[6] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(true) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(true) // shared ammo 15 + << QVariant(true) // disable girders 16 + << QVariant(true) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(30) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(5) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(10) // mines number 32 + << QVariant(10) // mine dud pct 33 + << QVariant(10) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList forts; + forts + << predefSchemesNames[7] // name 0 + << QVariant(true) // fortsmode 1 + << QVariant(true) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(true) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(false) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(45) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(5) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(0) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(0) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList timeless; + timeless + << predefSchemesNames[8] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(false) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(true) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(9999) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(5) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(5) // mines number 32 + << QVariant(10) // mine dud pct 33 + << QVariant(2) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(30) // health case amt 36 + << QVariant(0) // water rise amt 37 + << QVariant(0) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList thinkingportals; + thinkingportals + << predefSchemesNames[9] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(true) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(false) // king 13 + << QVariant(false) // place hog 14 + << QVariant(false) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(45) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(2) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(5) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(5) // explosives 34 + << QVariant(25) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + QList kingmode; + kingmode + << predefSchemesNames[10] // name 0 + << QVariant(false) // fortsmode 1 + << QVariant(false) // team divide 2 + << QVariant(false) // solid land 3 + << QVariant(false) // border 4 + << QVariant(false) // low gravity 5 + << QVariant(false) // laser sight 6 + << QVariant(false) // invulnerable 7 + << QVariant(false) // reset health 8 + << QVariant(false) // vampiric 9 + << QVariant(false) // karma 10 + << QVariant(false) // artillery 11 + << QVariant(true) // random order 12 + << QVariant(true) // king 13 + << QVariant(false) // place hog 14 + << QVariant(false) // shared ammo 15 + << QVariant(false) // disable girders 16 + << QVariant(false) // disable land objects 17 + << QVariant(false) // AI survival 18 + << QVariant(false) // inf. attack 19 + << QVariant(false) // reset weps 20 + << QVariant(false) // per hog ammo 21 + << QVariant(false) // no wind 22 + << QVariant(false) // more wind 23 + << QVariant(false) // tag team 24 + << QVariant(false) // bottom border 25 + << QVariant(100) // damage modfier 26 + << QVariant(45) // turn time 27 + << QVariant(100) // init health 28 + << QVariant(15) // sudden death 29 + << QVariant(5) // case prob 30 + << QVariant(3) // mines time 31 + << QVariant(4) // mines number 32 + << QVariant(0) // mine dud pct 33 + << QVariant(2) // explosives 34 + << QVariant(35) // health case pct 35 + << QVariant(25) // health case amt 36 + << QVariant(47) // water rise amt 37 + << QVariant(5) // health dec amt 38 + << QVariant(100) // rope modfier 39 + << QVariant(100) // get away time 40 + ; + + + schemes.append(defaultScheme); + schemes.append(proMode); + schemes.append(shoppa); + schemes.append(cleanslate); + schemes.append(minefield); + schemes.append(barrelmayhem); + schemes.append(tunnelhogs); + schemes.append(forts); + schemes.append(timeless); + schemes.append(thinkingportals); + schemes.append(kingmode); + + + int size = fileConfig.beginReadArray("schemes"); + for (int i = 0; i < size; ++i) { + fileConfig.setArrayIndex(i); + + if (!predefSchemesNames.contains(fileConfig.value(spNames[0]).toString())) + { + QList scheme; + + for (int k = 0; k < spNames.size(); ++k) + scheme << fileConfig.value(spNames[k], defaultScheme[k]); + + schemes.append(scheme); + } + } + fileConfig.endArray(); +} + +QVariant AmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + Q_UNUSED(section); + Q_UNUSED(orientation); + Q_UNUSED(role); + + return QVariant(); +} + +int AmmoSchemeModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + else + return schemes.size(); +} + +int AmmoSchemeModel::columnCount(const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + else + return defaultScheme.size(); +} + +Qt::ItemFlags AmmoSchemeModel::flags(const QModelIndex & index) const +{ + Q_UNUSED(index); + + return + Qt::ItemIsEnabled + | Qt::ItemIsSelectable + | Qt::ItemIsEditable; +} + +bool AmmoSchemeModel::setData(const QModelIndex & index, const QVariant & value, int role) +{ + if (!index.isValid() || index.row() < numberOfDefaultSchemes + || index.row() >= schemes.size() + || index.column() >= defaultScheme.size() + || role != Qt::EditRole) + return false; + + schemes[index.row()][index.column()] = value; + + emit dataChanged(index, index); + return true; +} + +bool AmmoSchemeModel::insertRows(int row, int count, const QModelIndex & parent) +{ + Q_UNUSED(count); + + beginInsertRows(parent, schemes.size(), schemes.size()); + + if (row == -1) + { + QList newScheme = defaultScheme; + newScheme[0] = QVariant(tr("new")); + schemes.insert(schemes.size(), newScheme); + } + else + { + QList newScheme = schemes[row]; + newScheme[0] = QVariant(tr("copy of") + " " + newScheme[0].toString()); + schemes.insert(schemes.size(), newScheme); + } + + endInsertRows(); + + return true; +} + +bool AmmoSchemeModel::removeRows(int row, int count, const QModelIndex & parent) +{ + if(count != 1 + || row < numberOfDefaultSchemes + || row >= schemes.size()) + return false; + + beginRemoveRows(parent, row, row); + + schemes.removeAt(row); + + endRemoveRows(); + + return true; +} + +QVariant AmmoSchemeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 + || index.row() >= schemes.size() + || index.column() >= defaultScheme.size() + || (role != Qt::EditRole && role != Qt::DisplayRole) + ) + return QVariant(); + + return schemes[index.row()][index.column()]; +} + +void AmmoSchemeModel::Save() +{ + fileConfig.beginWriteArray("schemes", schemes.size() - numberOfDefaultSchemes); + + for (int i = 0; i < schemes.size() - numberOfDefaultSchemes; ++i) { + fileConfig.setArrayIndex(i); + + QList scheme = schemes[i + numberOfDefaultSchemes]; + + for (int k = 0; k < scheme.size(); ++k) + fileConfig.setValue(spNames[k], scheme[k]); + } + fileConfig.endArray(); +} + + +NetAmmoSchemeModel::NetAmmoSchemeModel(QObject * parent) : + QAbstractTableModel(parent) +{ + netScheme = defaultScheme; +} + +QVariant NetAmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const +{ + Q_UNUSED(section); + Q_UNUSED(orientation); + Q_UNUSED(role); + + return QVariant(); +} + +int NetAmmoSchemeModel::rowCount(const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + else + return 1; +} + +int NetAmmoSchemeModel::columnCount(const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + else + return defaultScheme.size(); +} + +QVariant NetAmmoSchemeModel::data(const QModelIndex &index, int role) const +{ + if (!index.isValid() || index.row() < 0 + || index.row() > 1 + || index.column() >= defaultScheme.size() + || (role != Qt::EditRole && role != Qt::DisplayRole) + ) + return QVariant(); + + return netScheme[index.column()]; +} + +void NetAmmoSchemeModel::setNetSchemeConfig(QStringList & cfg) +{ + if(cfg.size() != netScheme.size()) + { + qWarning("Incorrect scheme cfg size"); + return; + } + + for(int i = 0; i < cfg.size(); ++i) + netScheme[i] = QVariant(cfg[i]); + + reset(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/ammoSchemeModel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/ammoSchemeModel.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,79 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _AMMO_SCHEME_MODEL_INCLUDED +#define _AMMO_SCHEME_MODEL_INCLUDED + +#include +#include +#include +#include + +class AmmoSchemeModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + AmmoSchemeModel(QObject * parent, const QString & fileName); + + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + int rowCount(const QModelIndex & parent) const; + int columnCount(const QModelIndex & parent) const; + Qt::ItemFlags flags(const QModelIndex & index) const; + bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole); + bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()); + bool removeRows(int row, int count, const QModelIndex & parent = QModelIndex()); + QVariant data(const QModelIndex &index, int role) const; + + int numberOfDefaultSchemes; + QStringList predefSchemesNames; + QStringList spNames; + +public slots: + void Save(); + +signals: + void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight); + +protected: + QList< QList > schemes; + +private: + QSettings fileConfig; +}; + +class NetAmmoSchemeModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + NetAmmoSchemeModel(QObject * parent); + + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + int rowCount(const QModelIndex & parent) const; + int columnCount(const QModelIndex & parent) const; + QVariant data(const QModelIndex &index, int role) const; + +public slots: + void setNetSchemeConfig(QStringList & cfg); + +private: + QList netScheme; +}; + +#endif // _AMMO_SCHEME_MODEL_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/hats.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/hats.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,142 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include "hwconsts.h" +#include "hwform.h" +#include "hats.h" + +HatsModel::HatsModel(QObject* parent) : + QAbstractListModel(parent) +{ + QFile hhfile; + hhfile.setFileName(cfgdir->absolutePath() + "/Data/Graphics/Hedgehog/Idle.png"); + if (!hhfile.exists()) hhfile.setFileName(datadir->absolutePath() + "/Graphics/Hedgehog/Idle.png"); + QPixmap hhpix = QPixmap(QFileInfo(hhfile).absoluteFilePath()).copy(0, 0, 32, 32); + + QDir tmpdir; + tmpdir.cd(cfgdir->absolutePath()); + tmpdir.cd("Data"); + tmpdir.cd("Graphics"); + tmpdir.cd("Hats"); + + tmpdir.setFilter(QDir::Files); + + QStringList userhatsList = tmpdir.entryList(QStringList("*.png")); + for (QStringList::Iterator it = userhatsList.begin(); it != userhatsList.end(); ++it ) + { + QString str = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); + QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Hats/" + str + ".png"); + + QPixmap tmppix(32, 37); + tmppix.fill(QColor(Qt::transparent)); + + QPainter painter(&tmppix); + painter.drawPixmap(QPoint(0, 5), hhpix); + painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32)); + if(pix.width() > 32) + painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32)); + painter.end(); + + hats.append(qMakePair(str, QIcon(tmppix))); + } + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Graphics"); + tmpdir.cd("Hats"); + + QStringList hatsList = tmpdir.entryList(QStringList("*.png")); + for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it ) + { + if (userhatsList.contains(*it,Qt::CaseInsensitive)) continue; + QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1"); + QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/" + str + ".png"); + + QPixmap tmppix(32, 37); + tmppix.fill(QColor(Qt::transparent)); + + QPainter painter(&tmppix); + painter.drawPixmap(QPoint(0, 5), hhpix); + painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32)); + if(pix.width() > 32) + painter.drawPixmap(QPoint(0, 0), pix.copy(32, 0, 32, 32)); + painter.end(); + + hats.append(qMakePair(str, QIcon(tmppix))); + } + // Reserved hats + tmpdir.cd("Reserved"); + hatsList = tmpdir.entryList(QStringList(playerHash+"*.png")); + for (QStringList::Iterator it = hatsList.begin(); it != hatsList.end(); ++it ) + { + QString str = (*it).replace(QRegExp("^(.*)\\.png"), "\\1"); + QPixmap pix(datadir->absolutePath() + "/Graphics/Hats/Reserved/" + str + ".png"); + + QPixmap tmppix(32, 37); + tmppix.fill(QColor(Qt::transparent)); + + QPainter painter(&tmppix); + painter.drawPixmap(QPoint(0, 5), hhpix); + painter.drawPixmap(QPoint(0, 0), pix.copy(0, 0, 32, 32)); + painter.end(); + + hats.append(qMakePair("Reserved "+str.remove(0,32), QIcon(tmppix))); + } +} + +QVariant HatsModel::headerData(int section, + Qt::Orientation orientation, int role) const +{ + Q_UNUSED(section); + Q_UNUSED(orientation); + Q_UNUSED(role); + + return QVariant(); +} + +int HatsModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + else + return hats.size(); +} + +/*int HatsModel::columnCount(const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + else + return 2; +} +*/ +QVariant HatsModel::data(const QModelIndex &index, + int role) const +{ + if (!index.isValid() || index.row() < 0 + || index.row() >= hats.size() + || (role != Qt::DisplayRole && role != Qt::DecorationRole)) + return QVariant(); + + if (role == Qt::DisplayRole) + return hats.at(index.row()).first; + else // role == Qt::DecorationRole + return hats.at(index.row()).second; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/hats.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/hats.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,44 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _HATS_INCLUDED +#define _HATS_INCLUDED + +#include +#include +#include +#include +#include + +class HatsModel : public QAbstractListModel +{ + Q_OBJECT + +public: + HatsModel(QObject *parent = 0); + + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + int rowCount(const QModelIndex & parent) const; + //int columnCount(const QModelIndex & parent) const; + + QVariant data(const QModelIndex &index, int role) const; +protected: + QVector > hats; +}; + +#endif // _HATS_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/netserverslist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/netserverslist.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,68 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "netserverslist.h" + +HWNetServersModel::HWNetServersModel(QObject* parent) : + QAbstractTableModel(parent) +{ + +} + +void HWNetServersModel::updateList() +{ + +} + +QVariant HWNetServersModel::headerData(int section, + Qt::Orientation orientation, int role) const +{ + if (role != Qt::DisplayRole) + return QVariant(); + + if (orientation == Qt::Horizontal) + { + switch (section) + { + case 0: return tr("Title"); + case 1: return tr("IP"); + case 2: return tr("Port"); + default: return QVariant(); + } + } else + return QString("%1").arg(section + 1); +} + +int HWNetServersModel::rowCount(const QModelIndex &parent) const +{ + if (parent.isValid()) + return 0; + else + return games.size(); +} + +int HWNetServersModel::columnCount(const QModelIndex & parent) const +{ + if (parent.isValid()) + return 0; + else + return 3; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/netserverslist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/netserverslist.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,43 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _NET_SERVERSLIST_INCLUDED +#define _NET_SERVERSLIST_INCLUDED + +#include +#include + +class HWNetServersModel : public QAbstractTableModel +{ + Q_OBJECT + +public: + HWNetServersModel(QObject *parent = 0); + + QVariant headerData(int section, Qt::Orientation orientation, int role) const; + int rowCount(const QModelIndex & parent) const; + int columnCount(const QModelIndex & parent) const; + +public slots: + virtual void updateList(); + +protected: + QList games; +}; + +#endif // _NET_SERVERSLIST_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/themesmodel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/themesmodel.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,49 @@ + +#include "themesmodel.h" + +ThemesModel::ThemesModel(QStringList themes, QObject *parent) : + QAbstractListModel(parent) +{ +#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) + m_data.reserve(themes.size()); +#endif + + foreach(QString theme, themes) + { + m_data.append(QHash()); + m_data.last().insert(Qt::DisplayRole, theme); + } +} + +int ThemesModel::rowCount(const QModelIndex &parent) const +{ + if(parent.isValid()) + return 0; + else + return m_data.size(); +} + +QVariant ThemesModel::data(const QModelIndex &index, int role) const +{ + if(index.column() > 0 || index.row() >= m_data.size()) + return QVariant(); + else + return m_data.at(index.row()).value(role); +} + +bool ThemesModel::setData(const QModelIndex &index, const QVariant &value, int role) +{ + if(index.column() > 0 || index.row() >= m_data.size()) + return false; + else + { + m_data[index.row()].insert(role, value); + + return true; + } + +} + + + + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/model/themesmodel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/model/themesmodel.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,28 @@ +#ifndef THEMESMODEL_H +#define THEMESMODEL_H + +#include +#include +#include + +class ThemesModel : public QAbstractListModel +{ + Q_OBJECT +public: + explicit ThemesModel(QStringList themes, QObject *parent = 0); + + int rowCount(const QModelIndex &parent = QModelIndex()) const; + QVariant data(const QModelIndex &index, int role) const; + bool setData(const QModelIndex &index, const QVariant &value, + int role = Qt::EditRole); + +signals: + +public slots: + +private: + + QList > m_data; +}; + +#endif // THEMESMODEL_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/namegen.cpp --- a/QTfrontend/namegen.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,221 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2009 Martin Minarik - * Copyright (c) 2009-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include "namegen.h" -#include "hwform.h" -#include "hwconsts.h" - - -HWNamegen::HWNamegen() : - TypesAvliable(false) -{ - - TypesLoad(); -} - -HWNamegen::~HWNamegen() -{ -} - - - -void HWNamegen::TeamRandomName(HWTeam*& team, const int HedgehogNumber) -{ - RandomNameByHat(team, HedgehogNumber); -} - -void HWNamegen::TeamRandomNames(HWTeam*& team, const bool changeteamname) -{ - if ((TypesHatnames.size() > 0) && TypesAvliable){ - - int kind = (rand()%(TypesHatnames.size())); - - if (changeteamname){ - if (TypesTeamnames[kind].size() > 0){ - team->TeamName = TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]; - } - team->Grave = GetRandomGrave(); - team->Fort = GetRandomFort(); - team->Voicepack = "Default"; - } - - //give each hedgehog a random name: - //TODO: load the dictionary only once! (right now it's loaded once for each hedgehog) - for(int i = 0; i < 8; i++) - { - if ((TypesHatnames[kind].size()) > 0){ - team->Hedgehogs[i].Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())]; - } - RandomNameByHat(team,i); - } - - } - -} - - -void HWNamegen::RandomNameByHat(HWTeam*& team, const int HedgehogNumber) -{ - QStringList Dictionaries; - HatCfgLoad(team->Hedgehogs[HedgehogNumber].Hat,Dictionaries); - - QStringList Dictionary; - DictLoad(Dictionaries[rand()%(Dictionaries.size())],Dictionary); - - team->Hedgehogs[HedgehogNumber].Name = Dictionary[rand()%(Dictionary.size())]; -} - -void HWNamegen::DictLoad(const QString filename, QStringList &list) -{ - list.clear(); - - QFile file; - file.setFileName(QString("%1/Data/Names/%2.txt").arg(cfgdir->absolutePath()).arg(filename)); - if (!file.exists()) file.setFileName(QString("%1/Names/%2.txt").arg(datadir->absolutePath()).arg(filename)); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine(); - if(line != QString("")) - {list.append(line);} - } - } - - if (list.size()==0) - list.append(filename); - -} - - -void HWNamegen::HatCfgLoad(const QString hatname, QStringList &list) -{ - list.clear(); - - QFile file; - file.setFileName(QString("%1/Data/Names/%2.cfg").arg(cfgdir->absolutePath()).arg(hatname)); - if (!file.exists()) file.setFileName(QString("%1/Names/%2.cfg").arg(datadir->absolutePath()).arg(hatname)); - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) - { - - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine(); - if(line != QString("")) - {list.append(line);} - } - } - - if (list.size()==0) - list.append(QString("generic")); - -} - - -void HWNamegen::TypesLoad() -{ - QFile file; - file.setFileName(QString("%1/Data/Names/types.ini").arg(cfgdir->absolutePath())); - if (!file.exists()) file.setFileName(QString("%1/Names/types.ini").arg(datadir->absolutePath())); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - {TypesAvliable = FALSE; return;} - - int counter = 0; //counter starts with 0 (teamnames mode) - TypesTeamnames.append(QStringList()); - TypesHatnames.append(QStringList()); - - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine(); - if (line == QString("#####")){ - counter++; //toggle mode (teamnames || hats) - if ((counter%2) == 0){ - TypesTeamnames.append(QStringList()); - TypesHatnames.append(QStringList()); - } - } else if ((line == QString("*****")) || (line == QString("*END*"))){ - TypesAvliable = TRUE; return; // bye bye - } else { - if ((counter%2) == 0){ // even => teamnames mode - TypesTeamnames[(counter/2)].append(line); - } else { // odd => hats mode - TypesHatnames[((counter-1)/2)].append(line); - } - } -// Types.append(line); - } - TypesAvliable = TRUE; - return; -} - - - -QString HWNamegen::GetRandomGrave() -{ - QStringList Graves; - - //list all available Graves - QDir tmpdir; - tmpdir.cd(cfgdir->absolutePath()); - tmpdir.cd("Data/Graphics/Graves"); - tmpdir.setFilter(QDir::Files); - Graves.append(tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1")); - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Graphics/Graves"); - tmpdir.setFilter(QDir::Files); - QStringList tmpList = tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1"); - for (QStringList::Iterator it = tmpList.begin(); it != tmpList.end(); ++it) - if (!Graves.contains(*it,Qt::CaseInsensitive)) Graves.append(*it); - - if(Graves.size()==0) - { - //do some serious error handling - return "Error"; - } - - //pick a random grave - return Graves[rand()%(Graves.size())]; -} - -QString HWNamegen::GetRandomFort() -{ - QStringList Forts; - - //list all available Forts - QDir tmpdir; - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Forts"); - tmpdir.setFilter(QDir::Files); - Forts.append(tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1")); - - if(Forts.size()==0) - { - //do some serious error handling - return "Error"; - } - - //pick a random fort - return Forts[rand()%(Forts.size())]; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/namegen.h --- a/QTfrontend/namegen.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2009 Martin Minarik - * Copyright (c) 2009-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef NAMEGEN_H -#define NAMEGEN_H - -#include - -class HWForm; -class HWTeam; - -class HWNamegen -{ -public: - HWNamegen(); - ~HWNamegen(); - - void TeamRandomName(HWTeam*& team, const int HedgehogNumber); - void TeamRandomNames(HWTeam*& team, const bool changeteamname); - void RandomNameByHat(HWTeam*& team, const int HedgehogNumber); - -private: - - QList TypesTeamnames; - QList TypesHatnames; - bool TypesAvliable; - void TypesLoad(); - void DictLoad(const QString filename, QStringList &list); - void HatCfgLoad(const QString hatname, QStringList &list); - - QString GetRandomGrave(); - QString GetRandomFort(); -}; - - - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/hwmap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/hwmap.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,91 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Ulyanov Igor + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "hwconsts.h" +#include "hwmap.h" + +HWMap::HWMap() : + TCPBase(false) +{ +} + +HWMap::~HWMap() +{ +} + +void HWMap::getImage(const QString & seed, int filter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData) +{ + m_seed = seed; + templateFilter = filter; + m_mapgen = mapgen; + m_maze_size = maze_size; + if(mapgen == MAPGEN_DRAWN) m_drawMapData = drawMapData; + Start(); +} + +QStringList HWMap::getArguments() +{ + QStringList arguments; + arguments << cfgdir->absolutePath(); + arguments << QString("%1").arg(ipc_port); + arguments << "landpreview"; + return arguments; +} + +void HWMap::onClientDisconnect() +{ + if (readbuffer.size() == 128 * 32 + 1) + { + quint8 *buf = (quint8*) readbuffer.constData(); + QImage im(buf, 256, 128, QImage::Format_Mono); + im.setNumColors(2); + emit HHLimitReceived(buf[128 * 32]); + emit ImageReceived(im); + } +} + +void HWMap::SendToClientFirst() +{ + SendIPC(QString("eseed %1").arg(m_seed).toUtf8()); + SendIPC(QString("e$template_filter %1").arg(templateFilter).toUtf8()); + SendIPC(QString("e$mapgen %1").arg(m_mapgen).toUtf8()); + + switch (m_mapgen) + { + case MAPGEN_MAZE: + SendIPC(QString("e$maze_size %1").arg(m_maze_size).toUtf8()); + break; + + case MAPGEN_DRAWN: + { + QByteArray data = m_drawMapData; + while(data.size() > 0) + { + QByteArray tmp = data; + tmp.truncate(200); + SendIPC("edraw " + tmp); + data.remove(0, 200); + } + break; + } + default: ; + } + + SendIPC("!"); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/hwmap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/hwmap.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,65 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006 Igor Ulyanov + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _HWMAP_INCLUDED +#define _HWMAP_INCLUDED + +#include +#include +#include + +#include "tcpBase.h" + +enum MapGenerator +{ + MAPGEN_REGULAR, + MAPGEN_MAZE, + MAPGEN_DRAWN, + MAPGEN_MAP +}; + +class HWMap : public TCPBase +{ + Q_OBJECT + + public: + HWMap(); + virtual ~HWMap(); + void getImage(const QString & seed, int templateFilter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData); + + protected: + virtual QStringList getArguments(); + virtual void onClientDisconnect(); + virtual void SendToClientFirst(); + + signals: + void ImageReceived(const QImage newImage); + void HHLimitReceived(int hhLimit); + + private: + QString m_seed; + int templateFilter; + MapGenerator m_mapgen; + int m_maze_size; + QByteArray m_drawMapData; + + private slots: +}; + +#endif // _HWMAP_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netregister.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netregister.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,31 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "netregister.h" + +HWNetRegisterServer::HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port) : + QObject(parent) +{ + Q_UNUSED(descr); + Q_UNUSED(port); +} + +void HWNetRegisterServer::unregister() +{ + +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netregister.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netregister.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,35 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _NET_REGISTER_INCLUDED +#define _NET_REGISTER_INCLUDED + +#include + +class HWNetRegisterServer : public QObject +{ + Q_OBJECT + +public: + HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port); + +public slots: + virtual void unregister(); +}; + +#endif // _NET_REGISTER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netserver.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,52 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include + +#include "hwconsts.h" +#include "netserver.h" + +HWNetServer::~HWNetServer() +{ + StopServer(); +} + +bool HWNetServer::StartServer(quint16 port) +{ + ds_port = port; + + QStringList params; + params << QString("--port=%1").arg(port); + params << "--dedicated=False"; + + process.start(bindir->absolutePath() + "/hedgewars-server", params); + + return process.waitForStarted(5000); +} + +void HWNetServer::StopServer() +{ + process.close(); +} + + +quint16 HWNetServer::getRunningPort() const +{ + return ds_port; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netserver.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,42 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _NETSERVER_INCLUDED +#define _NETSERVER_INCLUDED + +#include +#include + +class HWNetServer : public QObject +{ + Q_OBJECT + +public: + ~HWNetServer(); + bool StartServer(quint16 port); + void StopServer(); + QString getRunningHostName() const; + quint16 getRunningPort() const; + +private: + quint16 ds_port; + QProcess process; +}; + +#endif // _NETSERVER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netudpserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netudpserver.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,51 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include + +#include "netudpserver.h" + +HWNetUdpServer::HWNetUdpServer(QObject *parent, const QString & descr, quint16 port) : + HWNetRegisterServer(parent, descr, port), + m_descr(descr) +{ + pUdpSocket = new QUdpSocket(this); + pUdpSocket->bind(46631); + connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead())); +} + +void HWNetUdpServer::onClientRead() +{ + while (pUdpSocket->hasPendingDatagrams()) { + QByteArray datagram; + datagram.resize(pUdpSocket->pendingDatagramSize()); + QHostAddress clientAddr; + quint16 clientPort; + pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort); + if(datagram.startsWith("hedgewars client")) { + // send answer to client + pUdpSocket->writeDatagram(QString("hedgewars server\n%1").arg(m_descr).toUtf8(), clientAddr, clientPort); + } + } +} + +void HWNetUdpServer::unregister() +{ + deleteLater(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netudpserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netudpserver.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,46 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _NET_UDPSERVER_INCLUDED +#define _NET_UDPSERVER_INCLUDED + +#include +#include "netregister.h" + +class QUdpSocket; + +class HWNetUdpServer : public HWNetRegisterServer +{ + Q_OBJECT + + public: + HWNetUdpServer(QObject *parent, const QString & descr, quint16 port); + + public slots: + void unregister(); + + private slots: + void onClientRead(); + + private: + QUdpSocket* pUdpSocket; + QString m_descr; +}; + +#endif // _NET_UDPSERVER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netudpwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netudpwidget.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,72 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include + +#include "netudpwidget.h" + +HWNetUdpModel::HWNetUdpModel(QObject* parent) : + HWNetServersModel(parent) +{ + pUdpSocket = new QUdpSocket(this); + + pUdpSocket->bind(); + connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead())); +} + +void HWNetUdpModel::updateList() +{ + games.clear(); + + reset(); + + pUdpSocket->writeDatagram("hedgewars client", QHostAddress::Broadcast, 46631); +} + +void HWNetUdpModel::onClientRead() +{ + while (pUdpSocket->hasPendingDatagrams()) { + QByteArray datagram; + datagram.resize(pUdpSocket->pendingDatagramSize()); + QHostAddress clientAddr; + quint16 clientPort; + + pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort); + + QString packet = QString::fromUtf8(datagram.data()); + if(packet.startsWith("hedgewars server")) { + QStringList sl; + sl << packet.remove(0, 17) << clientAddr.toString() << "46631"; + games.append(sl); + } + } + + reset(); +} + +QVariant HWNetUdpModel::data(const QModelIndex &index, + int role) const +{ + if (!index.isValid() || index.row() < 0 + || index.row() >= games.size() + || role != Qt::DisplayRole) + return QVariant(); + + return games[index.row()][index.column()]; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/netudpwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/netudpwidget.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,46 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _NET_UDPWIDGET_INCLUDED +#define _NET_UDPWIDGET_INCLUDED + +#include "netserverslist.h" + +class QUdpSocket; + +class HWNetUdpModel : public HWNetServersModel +{ + Q_OBJECT + +public: + HWNetUdpModel(QObject *parent = 0); + + QVariant data(const QModelIndex &index, int role) const; + +public slots: + void updateList(); + +private slots: + void onClientRead(); + +private: + QUdpSocket* pUdpSocket; +}; + +#endif // _NET_UDPWIDGET_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/newnetclient.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/newnetclient.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,786 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include + +#include "hwconsts.h" +#include "newnetclient.h" +#include "proto.h" +#include "game.h" + +char delimeter='\n'; + +HWNewNet::HWNewNet() : + isChief(false), + m_game_connected(false), + loginStep(0), + netClientState(Disconnected) +{ +// socket stuff + connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); + connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect())); + connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect())); + connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, + SLOT(displayError(QAbstractSocket::SocketError))); +} + +HWNewNet::~HWNewNet() +{ + if (m_game_connected) + { + RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); + emit disconnected(tr("User quit")); + } + NetSocket.flush(); +} + +void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick) +{ + netClientState = Connecting; + mynick = nick; + myhost = hostName + QString(":%1").arg(port); + NetSocket.connectToHost(hostName, port); +} + +void HWNewNet::Disconnect() +{ + if (m_game_connected) + RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); + m_game_connected = false; + + NetSocket.disconnectFromHost(); +} + +void HWNewNet::CreateRoom(const QString & room) +{ + if(netClientState != InLobby) + { + qWarning("Illegal try to create room!"); + return; + } + + myroom = room; + + RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room)); + isChief = true; +} + +void HWNewNet::JoinRoom(const QString & room) +{ + if(netClientState != InLobby) + { + qWarning("Illegal try to join room!"); + return; + } + + myroom = room; + + RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room)); + isChief = false; +} + +void HWNewNet::AddTeam(const HWTeam & team) +{ + QString cmd = QString("ADD_TEAM") + delimeter + + team.name() + delimeter + + team.color().name() + delimeter + + team.grave() + delimeter + + team.fort() + delimeter + + team.voicepack() + delimeter + + team.flag() + delimeter + + QString::number(team.difficulty()); + + for(int i = 0; i < HEDGEHOGS_PER_TEAM; ++i) + { + cmd.append(delimeter); + cmd.append(team.hedgehog(i).Name); + cmd.append(delimeter); + cmd.append(team.hedgehog(i).Hat); + } + RawSendNet(cmd); +} + +void HWNewNet::RemoveTeam(const HWTeam & team) +{ + RawSendNet(QString("REMOVE_TEAM") + delimeter + team.name()); +} + +void HWNewNet::NewNick(const QString & nick) +{ + RawSendNet(QString("NICK%1%2").arg(delimeter).arg(nick)); +} + +void HWNewNet::ToggleReady() +{ + RawSendNet(QString("TOGGLE_READY")); +} + +void HWNewNet::SendNet(const QByteArray & buf) +{ + QString msg = QString(buf.toBase64()); + + RawSendNet(QString("EM%1%2").arg(delimeter).arg(msg)); +} + +void HWNewNet::RawSendNet(const QString & str) +{ + RawSendNet(str.toUtf8()); +} + +void HWNewNet::RawSendNet(const QByteArray & buf) +{ + qDebug() << "Client: " << QString(buf).split("\n"); + NetSocket.write(buf); + NetSocket.write("\n\n", 2); +} + +void HWNewNet::ClientRead() +{ + while (NetSocket.canReadLine()) { + QString s = QString::fromUtf8(NetSocket.readLine()); + if (s.endsWith('\n')) s.chop(1); + + if (s.size() == 0) { + ParseCmd(cmdbuf); + cmdbuf.clear(); + } else + cmdbuf << s; + } +} + +void HWNewNet::OnConnect() +{ + netClientState = Connected; +} + +void HWNewNet::OnDisconnect() +{ + netClientState = Disconnected; + if(m_game_connected) emit disconnected(""); + m_game_connected = false; +} + +void HWNewNet::displayError(QAbstractSocket::SocketError socketError) +{ + m_game_connected = false; + + switch (socketError) { + case QAbstractSocket::RemoteHostClosedError: + break; + case QAbstractSocket::HostNotFoundError: + emit disconnected(tr("The host was not found. Please check the host name and port settings.")); + break; + case QAbstractSocket::ConnectionRefusedError: + emit disconnected(tr("Connection refused")); + break; + default: + emit disconnected(NetSocket.errorString()); + } +} + +void HWNewNet::SendPasswordHash(const QString & hash) +{ + RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash)); +} + +void HWNewNet::ParseCmd(const QStringList & lst) +{ + qDebug() << "Server: " << lst; + + if(!lst.size()) + { + qWarning("Net client: Bad message"); + return; + } + + if (lst[0] == "NICK") + { + mynick = lst[1]; + return ; + } + + if (lst[0] == "PROTO") + return ; + + if (lst[0] == "ERROR") { + if (lst.size() == 2) + emit Error(lst[1]); + else + emit Error("Unknown error"); + return; + } + + if (lst[0] == "WARNING") { + if (lst.size() == 2) + emit Warning(lst[1]); + else + emit Warning("Unknown warning"); + return; + } + + if (lst[0] == "CONNECTED") { + if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion) + { + // TODO: Warn user, disconnect + qWarning() << "Server too old"; + } + + RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick)); + RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer)); + netClientState = Connected; + m_game_connected = true; + emit adminAccess(false); + return; + } + + if (lst[0] == "PING") { + if (lst.size() > 1) + RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1])); + else + RawSendNet(QString("PONG")); + return; + } + + if (lst[0] == "ROOMS") { + QStringList tmp = lst; + tmp.removeFirst(); + emit roomsList(tmp); + return; + } + + if (lst[0] == "SERVER_MESSAGE") { + if(lst.size() < 2) + { + qWarning("Net: Empty SERVERMESSAGE message"); + return; + } + emit serverMessage(lst[1]); + return; + } + + if (lst[0] == "CHAT") { + if(lst.size() < 3) + { + qWarning("Net: Empty CHAT message"); + return; + } + if (netClientState == InLobby) + emit chatStringLobby(lst[1], HWProto::formatChatMsgForFrontend(lst[2])); + else + emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2])); + return; + } + + if (lst[0] == "INFO") { + if(lst.size() < 5) + { + qWarning("Net: Malformed INFO message"); + return; + } + QStringList tmp = lst; + tmp.removeFirst(); + if (netClientState == InLobby) + emit chatStringLobby(tmp.join("\n").prepend('\x01')); + else + emit chatStringFromNet(tmp.join("\n").prepend('\x01')); + return; + } + + if (lst[0] == "SERVER_VARS") { + QStringList tmp = lst; + tmp.removeFirst(); + while (tmp.size() >= 2) + { + if(tmp[0] == "MOTD_NEW") emit serverMessageNew(tmp[1]); + else if(tmp[0] == "MOTD_OLD") emit serverMessageOld(tmp[1]); + else if(tmp[0] == "LATEST_PROTO") emit latestProtocolVar(tmp[1].toInt()); + + tmp.removeFirst(); + tmp.removeFirst(); + } + return; + } + + if (lst[0] == "CLIENT_FLAGS") + { + if(lst.size() < 3 || lst[1].size() < 2) + { + qWarning("Net: Malformed CLIENT_FLAGS message"); + return; + } + + QString flags = lst[1]; + bool setFlag = flags[0] == '+'; + + while(flags.size() > 1) + { + flags.remove(0, 1); + char c = flags[0].toAscii(); + + switch(c) + { + case 'r': + { + for(int i = 2; i < lst.size(); ++i) + { + if (lst[i] == mynick) + emit setMyReadyStatus(setFlag); + emit setReadyStatus(lst[i], setFlag); + } + } + } + } + + return; + } + + if (lst[0] == "ADD_TEAM") { + if(lst.size() != 24) + { + qWarning("Net: Bad ADDTEAM message"); + return; + } + QStringList tmp = lst; + tmp.removeFirst(); + emit AddNetTeam(tmp); + return; + } + + if (lst[0] == "REMOVE_TEAM") { + if(lst.size() != 2) + { + qWarning("Net: Bad REMOVETEAM message"); + return; + } + emit RemoveNetTeam(HWTeam(lst[1])); + return; + } + + if(lst[0] == "ROOMABANDONED") { + netClientState = InLobby; + emit LeftRoom(tr("Room destroyed")); + return; + } + + if(lst[0] == "KICKED") { + netClientState = InLobby; + emit LeftRoom(tr("You got kicked")); + return; + } + + if(lst[0] == "JOINED") { + if(lst.size() < 2) + { + qWarning("Net: Bad JOINED message"); + return; + } + + for(int i = 1; i < lst.size(); ++i) + { + if (lst[i] == mynick) + { + netClientState = InRoom; + emit EnteredGame(); + emit roomMaster(isChief); + if (isChief) + emit configAsked(); + } + + emit nickAdded(lst[i], isChief && (lst[i] != mynick)); + emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); + } + return; + } + + if(lst[0] == "LOBBY:JOINED") { + if(lst.size() < 2) + { + qWarning("Net: Bad JOINED message"); + return; + } + + for(int i = 1; i < lst.size(); ++i) + { + if (lst[i] == mynick) + { + netClientState = InLobby; + RawSendNet(QString("LIST")); + emit connected(); + } + + emit nickAddedLobby(lst[i], false); + emit chatStringLobby(lst[i], tr("%1 *** %2 has joined").arg('\x03').arg("|nick|")); + } + return; + } + + if(lst[0] == "LEFT") { + if(lst.size() < 2) + { + qWarning("Net: Bad LEFT message"); + return; + } + emit nickRemoved(lst[1]); + if (lst.size() < 3) + emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); + else + emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); + return; + } + + if(lst[0] == "ROOM") { + if(lst.size() < 2) + { + qWarning("Net: Bad ROOM message"); + return; + } + RawSendNet(QString("LIST")); + return; + } + + if(lst[0] == "LOBBY:LEFT") { + if(lst.size() < 2) + { + qWarning("Net: Bad LOBBY:LEFT message"); + return; + } + emit nickRemovedLobby(lst[1]); + if (lst.size() < 3) + emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); + else + emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); + return; + } + + if (lst[0] == "RUN_GAME") { + netClientState = InGame; + emit AskForRunGame(); + return; + } + + if (lst[0] == "ASKPASSWORD") { + emit AskForPassword(mynick); + return; + } + + if (lst[0] == "NOTICE") { + if(lst.size() < 2) + { + qWarning("Net: Bad NOTICE message"); + return; + } + + bool ok; + int n = lst[1].toInt(&ok); + if(!ok) + { + qWarning("Net: Bad NOTICE message"); + return; + } + + handleNotice(n); + + return; + } + + if (lst[0] == "TEAM_ACCEPTED") { + if (lst.size() != 2) + { + qWarning("Net: Bad TEAM_ACCEPTED message"); + return; + } + emit TeamAccepted(lst[1]); + return; + } + + + if (lst[0] == "CFG") { + if(lst.size() < 3) + { + qWarning("Net: Bad CFG message"); + return; + } + QStringList tmp = lst; + tmp.removeFirst(); + tmp.removeFirst(); + if (lst[1] == "SCHEME") + emit netSchemeConfig(tmp); + else + emit paramChanged(lst[1], tmp); + return; + } + + if (lst[0] == "HH_NUM") { + if (lst.size() != 3) + { + qWarning("Net: Bad TEAM_ACCEPTED message"); + return; + } + HWTeam tmptm(lst[1]); + tmptm.setNumHedgehogs(lst[2].toUInt()); + emit hhnumChanged(tmptm); + return; + } + + if (lst[0] == "TEAM_COLOR") { + if (lst.size() != 3) + { + qWarning("Net: Bad TEAM_COLOR message"); + return; + } + HWTeam tmptm(lst[1]); + tmptm.setColor(QColor(lst[2])); + emit teamColorChanged(tmptm); + return; + } + + if (lst[0] == "EM") { + if(lst.size() < 2) + { + qWarning("Net: Bad EM message"); + return; + } + for(int i = 1; i < lst.size(); ++i) + { + QByteArray em = QByteArray::fromBase64(lst[i].toAscii()); + emit FromNet(em); + } + return; + } + + if (lst[0] == "BYE") { + if (lst.size() < 2) + { + qWarning("Net: Bad BYE message"); + return; + } + if (lst[1] == "Authentication failed") + { + emit AuthFailed(); + } + m_game_connected = false; + Disconnect(); + emit disconnected(lst[1]); + return; + } + + + if (lst[0] == "ADMIN_ACCESS") { + emit adminAccess(true); + return; + } + + if (lst[0] == "ROOM_CONTROL_ACCESS") { + if (lst.size() < 2) + { + qWarning("Net: Bad ROOM_CONTROL_ACCESS message"); + return; + } + isChief = (lst[1] != "0"); + emit roomMaster(isChief); + return; + } + + qWarning() << "Net: Unknown message:" << lst; +} + +void HWNewNet::onHedgehogsNumChanged(const HWTeam& team) +{ + if (isChief) + RawSendNet(QString("HH_NUM%1%2%1%3") + .arg(delimeter) + .arg(team.name()) + .arg(team.numHedgehogs())); +} + +void HWNewNet::onTeamColorChanged(const HWTeam& team) +{ + if (isChief) + RawSendNet(QString("TEAM_COLOR%1%2%1%3") + .arg(delimeter) + .arg(team.name()) + .arg(team.color().name())); +} + +void HWNewNet::onParamChanged(const QString & param, const QStringList & value) +{ + if (isChief) + RawSendNet( + QString("CFG%1%2%1%3") + .arg(delimeter) + .arg(param) + .arg(value.join(QString(delimeter))) + ); +} + +void HWNewNet::chatLineToNet(const QString& str) +{ + if(str != "") { + RawSendNet(QString("CHAT") + delimeter + str); + emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str))); + } +} + +void HWNewNet::chatLineToLobby(const QString& str) +{ + if(str != "") { + RawSendNet(QString("CHAT") + delimeter + str); + emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str))); + } +} + +void HWNewNet::SendTeamMessage(const QString& str) +{ + RawSendNet(QString("TEAMCHAT") + delimeter + str); +} + +void HWNewNet::askRoomsList() +{ + if(netClientState != InLobby) + { + qWarning("Illegal try to get rooms list!"); + return; + } + RawSendNet(QString("LIST")); +} + +HWNewNet::ClientState HWNewNet::clientState() +{ + return netClientState; +} + +QString HWNewNet::getNick() +{ + return mynick; +} + +QString HWNewNet::getRoom() +{ + return myroom; +} + +QString HWNewNet::getHost() +{ + return myhost; +} + +bool HWNewNet::isRoomChief() +{ + return isChief; +} + +void HWNewNet::gameFinished(bool correctly) +{ + if (netClientState == InGame) netClientState = InRoom; + RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimeter).arg(correctly ? "1" : "0")); +} + +void HWNewNet::banPlayer(const QString & nick) +{ + RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick)); +} + +void HWNewNet::kickPlayer(const QString & nick) +{ + RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick)); +} + +void HWNewNet::infoPlayer(const QString & nick) +{ + RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick)); +} + +void HWNewNet::followPlayer(const QString & nick) +{ + if (!isInRoom()) { + RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick)); + isChief = false; + } +} + +void HWNewNet::startGame() +{ + RawSendNet(QString("START_GAME")); +} + +void HWNewNet::updateRoomName(const QString & name) +{ + RawSendNet(QString("ROOM_NAME%1%2").arg(delimeter).arg(name)); +} + + +void HWNewNet::toggleRestrictJoins() +{ + RawSendNet(QString("TOGGLE_RESTRICT_JOINS")); +} + +void HWNewNet::toggleRestrictTeamAdds() +{ + RawSendNet(QString("TOGGLE_RESTRICT_TEAMS")); +} + +void HWNewNet::clearAccountsCache() +{ + RawSendNet(QString("CLEAR_ACCOUNTS_CACHE")); +} + +void HWNewNet::partRoom() +{ + netClientState = InLobby; + RawSendNet(QString("PART")); +} + +bool HWNewNet::isInRoom() +{ + return netClientState >= InRoom; +} + +void HWNewNet::setServerMessageNew(const QString & msg) +{ + RawSendNet(QString("SET_SERVER_VAR%1MOTD_NEW%1%2").arg(delimeter).arg(msg)); +} + +void HWNewNet::setServerMessageOld(const QString & msg) +{ + RawSendNet(QString("SET_SERVER_VAR%1MOTD_OLD%1%2").arg(delimeter).arg(msg)); +} + +void HWNewNet::setLatestProtocolVar(int proto) +{ + RawSendNet(QString("SET_SERVER_VAR%1LATEST_PROTO%1%2").arg(delimeter).arg(proto)); +} + +void HWNewNet::askServerVars() +{ + RawSendNet(QString("GET_SERVER_VAR")); +} + +void HWNewNet::handleNotice(int n) +{ + switch(n) + { + case 0: + { + emit NickTaken(mynick); + break; + } + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/newnetclient.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/newnetclient.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,177 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _NEW_NETCLIENT_INCLUDED +#define _NEW_NETCLIENT_INCLUDED + +#include +#include +#include +#include + +#include "team.h" +#include "game.h" // for GameState + +class GameUIConfig; +class GameCFGWidget; +class TeamSelWidget; + +extern char delimeter; + +class HWNewNet : public QObject +{ + Q_OBJECT + + public: + enum ClientState { Disconnected, Connecting, Connected, InLobby, InRoom, InGame }; + + HWNewNet(); + ~HWNewNet(); + void Connect(const QString & hostName, quint16 port, const QString & nick); + void Disconnect(); + void SendPasswordHash(const QString & hash); + void NewNick(const QString & nick); + bool isRoomChief(); + bool isInRoom(); + ClientState clientState(); + QString getNick(); + QString getRoom(); + QString getHost(); + + private: + bool isChief; + QString mynick; + QString myroom; + QString myhost; + QTcpSocket NetSocket; + QString seed; + bool m_game_connected; + + template + void SendCfgStrNet(T a) { + QByteArray strmsg; + strmsg.append(a); + quint8 sz = strmsg.size(); + QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg; + QString _msg = delimeter + QString(enginemsg.toBase64()); + RawSendNet(_msg); + } + + template + void SendCfgStrLoc(T a) { + QByteArray strmsg; + strmsg.append(QString(a).toUtf8()); + quint8 sz = strmsg.size(); + QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg; + emit FromNet(enginemsg); + } + + QStringList cmdbuf; + + void RawSendNet(const QString & buf); + void RawSendNet(const QByteArray & buf); + void ParseCmd(const QStringList & lst); + void handleNotice(int n); + + int loginStep; + ClientState netClientState; + + signals: + void AskForRunGame(); + void connected(); + void disconnected(const QString & reason); + void Error(const QString & errmsg); + void Warning(const QString & wrnmsg); + void AskForPassword(const QString & nick); + void NickTaken(const QString & nick); + void AuthFailed(); + void EnteredGame(); + void LeftRoom(const QString & reason); + void nickAdded(const QString& nick, bool notifyNick); + void nickRemoved(const QString& nick); + void nickAddedLobby(const QString& nick, bool notifyNick); + void nickRemovedLobby(const QString& nick); + void FromNet(const QByteArray & buf); + void adminAccess(bool); + void roomMaster(bool); + + void netSchemeConfig(QStringList &); + void paramChanged(const QString & param, const QStringList & value); + void configAsked(); + + void TeamAccepted(const QString&); + void AddNetTeam(const HWTeam&); + void RemoveNetTeam(const HWTeam&); + void hhnumChanged(const HWTeam&); + void teamColorChanged(const HWTeam&); + void chatStringLobby(const QString&); + void chatStringLobby(const QString&, const QString&); + void chatStringFromNet(const QString&); + void chatStringFromMe(const QString&); + void chatStringFromMeLobby(const QString&); + + void roomsList(const QStringList&); + void serverMessage(const QString &); + void serverMessageNew(const QString &); + void serverMessageOld(const QString &); + void latestProtocolVar(int); + + void setReadyStatus(const QString & nick, bool isReady); + void setMyReadyStatus(bool isReady); + + public slots: + void ToggleReady(); + void chatLineToNet(const QString& str); + void chatLineToLobby(const QString& str); + void SendTeamMessage(const QString& str); + void SendNet(const QByteArray & buf); + void AddTeam(const HWTeam & team); + void RemoveTeam(const HWTeam& team); + void onHedgehogsNumChanged(const HWTeam& team); + void onTeamColorChanged(const HWTeam& team); + void onParamChanged(const QString & param, const QStringList & value); + + void setServerMessageNew(const QString &); + void setServerMessageOld(const QString &); + void setLatestProtocolVar(int proto); + void askServerVars(); + + void JoinRoom(const QString & room); + void CreateRoom(const QString & room); + void updateRoomName(const QString &); + void askRoomsList(); + void gameFinished(bool correcly); + void banPlayer(const QString &); + void kickPlayer(const QString &); + void infoPlayer(const QString &); + void followPlayer(const QString &); + void startGame(); + void toggleRestrictJoins(); + void toggleRestrictTeamAdds(); + void partRoom(); + void clearAccountsCache(); + + private slots: + void ClientRead(); + void OnConnect(); + void OnDisconnect(); + void displayError(QAbstractSocket::SocketError socketError); +}; + +#endif // _NEW_NETCLIENT_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/proto.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/proto.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,59 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "proto.h" + +HWProto::HWProto() +{ + +} + +QByteArray & HWProto::addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg) +{ + QByteArray bmsg = msg; + bmsg = bmsg.left(250); + quint8 sz = bmsg.size(); + buf.append(QByteArray((char *)&sz, 1)); + buf.append(bmsg); + return buf; +} + +QByteArray & HWProto::addStringToBuffer(QByteArray & buf, const QString & string) +{ + return addByteArrayToBuffer(buf, string.toUtf8()); +} + +QByteArray & HWProto::addStringListToBuffer(QByteArray & buf, const QStringList & strList) +{ + for (int i = 0; i < strList.size(); i++) + addStringToBuffer(buf, strList[i]); + return buf; +} + +QString HWProto::formatChatMsgForFrontend(const QString & msg) +{ + return formatChatMsg("|nick|", msg); +} + +QString HWProto::formatChatMsg(const QString & nick, const QString & msg) +{ + if(msg.left(4) == "/me ") + return QString("\x02* %1 %2").arg(nick).arg(msg.mid(4)); + else + return QString("\x01%1: %2").arg(nick).arg(msg); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/proto.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/proto.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,40 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _PROTO_H +#define _PROTO_H + +#include +#include +#include + + +class HWProto : public QObject +{ + Q_OBJECT + +public: + HWProto(); + static QByteArray & addStringToBuffer(QByteArray & buf, const QString & string); + static QByteArray & addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg); + static QByteArray & addStringListToBuffer(QByteArray & buf, const QStringList & strList); + static QString formatChatMsg(const QString & nick, const QString & msg); + static QString formatChatMsgForFrontend(const QString & msg); +}; + +#endif // _PROTO_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/tcpBase.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/tcpBase.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,166 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "tcpBase.h" + +#include +#include + +#include + +#include "hwconsts.h" + +QList srvsList; +QPointer TCPBase::IPCServer(0); + +TCPBase::~TCPBase() +{ +} + +TCPBase::TCPBase(bool demoMode) : + m_isDemoMode(demoMode), + IPCSocket(0) +{ + if(!IPCServer) { + IPCServer = new QTcpServer(0); + IPCServer->setMaxPendingConnections(1); + if (!IPCServer->listen(QHostAddress::LocalHost)) { + QMessageBox::critical(0, tr("Error"), + tr("Unable to start the server: %1.") + .arg(IPCServer->errorString())); + exit(0); // FIXME - should be graceful exit here + } + } + ipc_port=IPCServer->serverPort(); +} + +void TCPBase::NewConnection() +{ + if(IPCSocket) { + // connection should be already finished + return; + } + disconnect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); + IPCSocket = IPCServer->nextPendingConnection(); + if(!IPCSocket) return; + connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); + connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); + SendToClientFirst(); +} + +void TCPBase::RealStart() +{ + connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); + IPCSocket = 0; + + QProcess * process; + process = new QProcess; + connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError))); + QStringList arguments=getArguments(); + + // redirect everything written on stdout/stderr + if(isDevBuild) + process->setProcessChannelMode(QProcess::ForwardedChannels); + process->start(bindir->absolutePath() + "/hwengine", arguments); +} + +void TCPBase::ClientDisconnect() +{ + disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); + onClientDisconnect(); + + if(srvsList.size()==1) srvsList.pop_front(); + emit isReadyNow(); + IPCSocket->deleteLater(); + deleteLater(); +} + +void TCPBase::ClientRead() +{ + QByteArray readed=IPCSocket->readAll(); + if(readed.isEmpty()) return; + readbuffer.append(readed); + onClientRead(); +} + +void TCPBase::StartProcessError(QProcess::ProcessError error) +{ + QMessageBox::critical(0, tr("Error"), + tr("Unable to run engine: %1 (") + .arg(error) + bindir->absolutePath() + "/hwengine)"); +} + +void TCPBase::tcpServerReady() +{ + disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); + + RealStart(); +} + +void TCPBase::Start() +{ + if(srvsList.isEmpty()) { + srvsList.push_back(this); + } else { + connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); + srvsList.push_back(this); + return; + } + + RealStart(); +} + +void TCPBase::onClientRead() +{ +} + +void TCPBase::onClientDisconnect() +{ +} + +void TCPBase::SendToClientFirst() +{ +} + +void TCPBase::SendIPC(const QByteArray & buf) +{ + if (buf.size() > MAXMSGCHARS) return; + quint8 len = buf.size(); + RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf); +} + +void TCPBase::RawSendIPC(const QByteArray & buf) +{ + if (!IPCSocket) + { + toSendBuf += buf; + } else + { + if (toSendBuf.size() > 0) + { + IPCSocket->write(toSendBuf); + if(m_isDemoMode) demo.append(toSendBuf); + toSendBuf.clear(); + } + if(!buf.isEmpty()) { + IPCSocket->write(buf); + if(m_isDemoMode) demo.append(buf); + } + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/net/tcpBase.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/net/tcpBase.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,81 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _TCPBASE_INCLUDED +#define _TCPBASE_INCLUDED + +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#define MAXMSGCHARS 255 + +class TCPBase : public QObject +{ + Q_OBJECT + + public: + TCPBase(bool demoMode); + virtual ~TCPBase(); + + signals: + void isReadyNow(); + + protected: + quint16 ipc_port; + + void Start(); + + QByteArray readbuffer; + + QByteArray toSendBuf; + QByteArray demo; + + void SendIPC(const QByteArray & buf); + void RawSendIPC(const QByteArray & buf); + + virtual QStringList getArguments()=0; + virtual void onClientRead(); + virtual void onClientDisconnect(); + virtual void SendToClientFirst(); + + private: + static QPointer IPCServer; + + bool m_isDemoMode; + void RealStart(); + QPointer IPCSocket; + + private slots: + void NewConnection(); + void ClientDisconnect(); + void ClientRead(); + void StartProcessError(QProcess::ProcessError error); + + void tcpServerReady(); +}; + +#endif // _TCPBASE_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netregister.cpp --- a/QTfrontend/netregister.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,31 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "netregister.h" - -HWNetRegisterServer::HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port) : - QObject(parent) -{ - Q_UNUSED(descr); - Q_UNUSED(port); -} - -void HWNetRegisterServer::unregister() -{ - -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netregister.h --- a/QTfrontend/netregister.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _NET_REGISTER_INCLUDED -#define _NET_REGISTER_INCLUDED - -#include - -class HWNetRegisterServer : public QObject -{ - Q_OBJECT - -public: - HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port); - -public slots: - virtual void unregister(); -}; - -#endif // _NET_REGISTER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netserver.cpp --- a/QTfrontend/netserver.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include - -#include "hwconsts.h" -#include "netserver.h" - -HWNetServer::~HWNetServer() -{ - StopServer(); -} - -bool HWNetServer::StartServer(quint16 port) -{ - ds_port = port; - - QStringList params; - params << QString("--port=%1").arg(port); - params << "--dedicated=False"; - - process.start(bindir->absolutePath() + "/hedgewars-server", params); - - return process.waitForStarted(5000); -} - -void HWNetServer::StopServer() -{ - process.close(); -} - - -quint16 HWNetServer::getRunningPort() const -{ - return ds_port; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netserver.h --- a/QTfrontend/netserver.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _NETSERVER_INCLUDED -#define _NETSERVER_INCLUDED - -#include -#include - -class HWNetServer : public QObject -{ - Q_OBJECT - -public: - ~HWNetServer(); - bool StartServer(quint16 port); - void StopServer(); - QString getRunningHostName() const; - quint16 getRunningPort() const; - -private: - quint16 ds_port; - QProcess process; -}; - -#endif // _NETSERVER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netserverslist.cpp --- a/QTfrontend/netserverslist.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,68 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "netserverslist.h" - -HWNetServersModel::HWNetServersModel(QObject* parent) : - QAbstractTableModel(parent) -{ - -} - -void HWNetServersModel::updateList() -{ - -} - -QVariant HWNetServersModel::headerData(int section, - Qt::Orientation orientation, int role) const -{ - if (role != Qt::DisplayRole) - return QVariant(); - - if (orientation == Qt::Horizontal) - { - switch (section) - { - case 0: return tr("Title"); - case 1: return tr("IP"); - case 2: return tr("Port"); - default: return QVariant(); - } - } else - return QString("%1").arg(section + 1); -} - -int HWNetServersModel::rowCount(const QModelIndex &parent) const -{ - if (parent.isValid()) - return 0; - else - return games.size(); -} - -int HWNetServersModel::columnCount(const QModelIndex & parent) const -{ - if (parent.isValid()) - return 0; - else - return 3; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netserverslist.h --- a/QTfrontend/netserverslist.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _NET_SERVERSLIST_INCLUDED -#define _NET_SERVERSLIST_INCLUDED - -#include -#include - -class HWNetServersModel : public QAbstractTableModel -{ - Q_OBJECT - -public: - HWNetServersModel(QObject *parent = 0); - - QVariant headerData(int section, Qt::Orientation orientation, int role) const; - int rowCount(const QModelIndex & parent) const; - int columnCount(const QModelIndex & parent) const; - -public slots: - virtual void updateList(); - -protected: - QList games; -}; - -#endif // _NET_SERVERSLIST_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netudpserver.cpp --- a/QTfrontend/netudpserver.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include - -#include "netudpserver.h" - -HWNetUdpServer::HWNetUdpServer(QObject *parent, const QString & descr, quint16 port) : - HWNetRegisterServer(parent, descr, port), - m_descr(descr) -{ - pUdpSocket = new QUdpSocket(this); - pUdpSocket->bind(46631); - connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead())); -} - -void HWNetUdpServer::onClientRead() -{ - while (pUdpSocket->hasPendingDatagrams()) { - QByteArray datagram; - datagram.resize(pUdpSocket->pendingDatagramSize()); - QHostAddress clientAddr; - quint16 clientPort; - pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort); - if(datagram.startsWith("hedgewars client")) { - // send answer to client - pUdpSocket->writeDatagram(QString("hedgewars server\n%1").arg(m_descr).toUtf8(), clientAddr, clientPort); - } - } -} - -void HWNetUdpServer::unregister() -{ - deleteLater(); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netudpserver.h --- a/QTfrontend/netudpserver.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _NET_UDPSERVER_INCLUDED -#define _NET_UDPSERVER_INCLUDED - -#include -#include "netregister.h" - -class QUdpSocket; - -class HWNetUdpServer : public HWNetRegisterServer -{ - Q_OBJECT - - public: - HWNetUdpServer(QObject *parent, const QString & descr, quint16 port); - - public slots: - void unregister(); - - private slots: - void onClientRead(); - - private: - QUdpSocket* pUdpSocket; - QString m_descr; -}; - -#endif // _NET_UDPSERVER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netudpwidget.cpp --- a/QTfrontend/netudpwidget.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,72 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include - -#include "netudpwidget.h" - -HWNetUdpModel::HWNetUdpModel(QObject* parent) : - HWNetServersModel(parent) -{ - pUdpSocket = new QUdpSocket(this); - - pUdpSocket->bind(); - connect(pUdpSocket, SIGNAL(readyRead()), this, SLOT(onClientRead())); -} - -void HWNetUdpModel::updateList() -{ - games.clear(); - - reset(); - - pUdpSocket->writeDatagram("hedgewars client", QHostAddress::Broadcast, 46631); -} - -void HWNetUdpModel::onClientRead() -{ - while (pUdpSocket->hasPendingDatagrams()) { - QByteArray datagram; - datagram.resize(pUdpSocket->pendingDatagramSize()); - QHostAddress clientAddr; - quint16 clientPort; - - pUdpSocket->readDatagram(datagram.data(), datagram.size(), &clientAddr, &clientPort); - - QString packet = QString::fromUtf8(datagram.data()); - if(packet.startsWith("hedgewars server")) { - QStringList sl; - sl << packet.remove(0, 17) << clientAddr.toString() << "46631"; - games.append(sl); - } - } - - reset(); -} - -QVariant HWNetUdpModel::data(const QModelIndex &index, - int role) const -{ - if (!index.isValid() || index.row() < 0 - || index.row() >= games.size() - || role != Qt::DisplayRole) - return QVariant(); - - return games[index.row()][index.column()]; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/netudpwidget.h --- a/QTfrontend/netudpwidget.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _NET_UDPWIDGET_INCLUDED -#define _NET_UDPWIDGET_INCLUDED - -#include "netserverslist.h" - -class QUdpSocket; - -class HWNetUdpModel : public HWNetServersModel -{ - Q_OBJECT - -public: - HWNetUdpModel(QObject *parent = 0); - - QVariant data(const QModelIndex &index, int role) const; - -public slots: - void updateList(); - -private slots: - void onClientRead(); - -private: - QUdpSocket* pUdpSocket; -}; - -#endif // _NET_UDPWIDGET_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/newnetclient.cpp --- a/QTfrontend/newnetclient.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,846 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "hwconsts.h" -#include "newnetclient.h" -#include "proto.h" -#include "gameuiconfig.h" -#include "game.h" -#include "gamecfgwidget.h" -#include "teamselect.h" -#include "misc.h" -/* only to get the ignoreList from the chat widget */ -#include "hwform.h" -#include "pageroomslist.h" -#include "chatwidget.h" - -char delimeter='\n'; - -HWNewNet::HWNewNet(GameUIConfig * config, GameCFGWidget* pGameCFGWidget, TeamSelWidget* pTeamSelWidget) : - config(config), - m_pGameCFGWidget(pGameCFGWidget), - m_pTeamSelWidget(pTeamSelWidget), - isChief(false), - m_game_connected(false), - loginStep(0), - netClientState(0) -{ -// socket stuff - connect(&NetSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); - connect(&NetSocket, SIGNAL(connected()), this, SLOT(OnConnect())); - connect(&NetSocket, SIGNAL(disconnected()), this, SLOT(OnDisconnect())); - connect(&NetSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, - SLOT(displayError(QAbstractSocket::SocketError))); - -// config stuff - connect(this, SIGNAL(paramChanged(const QString &, const QStringList &)), pGameCFGWidget, SLOT(setParam(const QString &, const QStringList &))); - connect(pGameCFGWidget, SIGNAL(paramChanged(const QString &, const QStringList &)), this, SLOT(onParamChanged(const QString &, const QStringList &))); - connect(this, SIGNAL(configAsked()), pGameCFGWidget, SLOT(fullNetConfig())); -} - -HWNewNet::~HWNewNet() -{ - if (m_game_connected) - { - RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); - emit Disconnected(); - } - NetSocket.flush(); -} - -void HWNewNet::Connect(const QString & hostName, quint16 port, const QString & nick) -{ - mynick = nick; - while (mynick.isEmpty()) { - mynick = QInputDialog::getText(m_pGameCFGWidget, - QObject::tr("Nickname"), - QObject::tr("Please enter your nickname"), - QLineEdit::Normal, - QDir::home().dirName()); - config->setValue("net/nick",mynick); - config->updNetNick(); - } - myhost = hostName + QString(":%1").arg(port); - NetSocket.connectToHost(hostName, port); -} - -void HWNewNet::Disconnect() -{ - if (m_game_connected) - RawSendNet(QString("QUIT%1%2").arg(delimeter).arg("User quit")); - m_game_connected = false; - - NetSocket.disconnectFromHost(); -} - -void HWNewNet::CreateRoom(const QString & room) -{ - if(netClientState != 2) - { - qWarning("Illegal try to create room!"); - return; - } - - myroom = room; - - RawSendNet(QString("CREATE_ROOM%1%2").arg(delimeter).arg(room)); - isChief = true; -} - -void HWNewNet::JoinRoom(const QString & room) -{ - if(netClientState != 2) - { - qWarning("Illegal try to join room!"); - return; - } - - myroom = room; - - RawSendNet(QString("JOIN_ROOM%1%2").arg(delimeter).arg(room)); - isChief = false; -} - -void HWNewNet::AddTeam(const HWTeam & team) -{ - QString cmd = QString("ADD_TEAM") + delimeter + - team.TeamName + delimeter + - team.teamColor.name() + delimeter + - team.Grave + delimeter + - team.Fort + delimeter + - team.Voicepack + delimeter + - team.Flag + delimeter + - QString::number(team.difficulty); - - for(int i = 0; i < 8; ++i) - { - cmd.append(delimeter); - cmd.append(team.Hedgehogs[i].Name); - cmd.append(delimeter); - cmd.append(team.Hedgehogs[i].Hat); - } - RawSendNet(cmd); -} - -void HWNewNet::RemoveTeam(const HWTeam & team) -{ - RawSendNet(QString("REMOVE_TEAM") + delimeter + team.TeamName); -} - -void HWNewNet::ToggleReady() -{ - RawSendNet(QString("TOGGLE_READY")); -} - -void HWNewNet::SendNet(const QByteArray & buf) -{ - QString msg = QString(buf.toBase64()); - - RawSendNet(QString("EM%1%2").arg(delimeter).arg(msg)); -} - -void HWNewNet::RawSendNet(const QString & str) -{ - RawSendNet(str.toUtf8()); -} - -void HWNewNet::RawSendNet(const QByteArray & buf) -{ - qDebug() << "Client: " << QString(buf).split("\n"); - NetSocket.write(buf); - NetSocket.write("\n\n", 2); -} - -void HWNewNet::ClientRead() -{ - while (NetSocket.canReadLine()) { - QString s = QString::fromUtf8(NetSocket.readLine()); - if (s.endsWith('\n')) s.chop(1); - - if (s.size() == 0) { - ParseCmd(cmdbuf); - cmdbuf.clear(); - } else - cmdbuf << s; - } -} - -void HWNewNet::OnConnect() -{ -} - -void HWNewNet::OnDisconnect() -{ - if(m_game_connected) emit Disconnected(); - m_game_connected = false; -} - -void HWNewNet::displayError(QAbstractSocket::SocketError socketError) -{ - emit Disconnected(); - m_game_connected = false; - - switch (socketError) { - case QAbstractSocket::RemoteHostClosedError: - break; - case QAbstractSocket::HostNotFoundError: - emit showMessage(tr("The host was not found. Please check the host name and port settings.")); - break; - case QAbstractSocket::ConnectionRefusedError: - emit showMessage(tr("Connection refused")); - break; - default: - emit showMessage(NetSocket.errorString()); - } -} - -void HWNewNet::ParseCmd(const QStringList & lst) -{ - qDebug() << "Server: " << lst; - - if(!lst.size()) - { - qWarning("Net client: Bad message"); - return; - } - - if (lst[0] == "NICK") - { - mynick = lst[1]; - return ; - } - - if (lst[0] == "PROTO") - return ; - - if (lst[0] == "ERROR") { - if (lst.size() == 2) - emit showMessage("Error: " + lst[1]); - else - emit showMessage("Unknown error"); - return; - } - - if (lst[0] == "WARNING") { - if (lst.size() == 2) - emit showMessage("Warning: " + lst[1]); - else - emit showMessage("Unknown warning"); - return; - } - - if (lst[0] == "CONNECTED") { - if(lst.size() < 3 || lst[2].toInt() < cMinServerVersion) - { - // TODO: Warn user, disconnect - qWarning() << "Server too old"; - } - - RawSendNet(QString("NICK%1%2").arg(delimeter).arg(mynick)); - RawSendNet(QString("PROTO%1%2").arg(delimeter).arg(*cProtoVer)); - netClientState = 1; - m_game_connected = true; - emit adminAccess(false); - return; - } - - if (lst[0] == "PING") { - if (lst.size() > 1) - RawSendNet(QString("PONG%1%2").arg(delimeter).arg(lst[1])); - else - RawSendNet(QString("PONG")); - return; - } - - if (lst[0] == "ROOMS") { - QStringList tmp = lst; - tmp.removeFirst(); - emit roomsList(tmp); - return; - } - - if (lst[0] == "SERVER_MESSAGE") { - if(lst.size() < 2) - { - qWarning("Net: Empty SERVERMESSAGE message"); - return; - } - emit serverMessage(lst[1]); - return; - } - - if (lst[0] == "CHAT") { - if(lst.size() < 3) - { - qWarning("Net: Empty CHAT message"); - return; - } - if (netClientState == 2) - emit chatStringLobby(lst[1], HWProto::formatChatMsgForFrontend(lst[2])); - else - emit chatStringFromNet(HWProto::formatChatMsg(lst[1], lst[2])); - return; - } - - if (lst[0] == "INFO") { - if(lst.size() < 5) - { - qWarning("Net: Malformed INFO message"); - return; - } - QStringList tmp = lst; - tmp.removeFirst(); - if (netClientState == 2) - emit chatStringLobby(tmp.join("\n").prepend('\x01')); - else - emit chatStringFromNet(tmp.join("\n").prepend('\x01')); - return; - } - - if (lst[0] == "SERVER_VARS") { - QStringList tmp = lst; - tmp.removeFirst(); - while (tmp.size() >= 2) - { - if(tmp[0] == "MOTD_NEW") emit serverMessageNew(tmp[1]); - else if(tmp[0] == "MOTD_OLD") emit serverMessageOld(tmp[1]); - else if(tmp[0] == "LATEST_PROTO") emit latestProtocolVar(tmp[1].toInt()); - - tmp.removeFirst(); - tmp.removeFirst(); - } - return; - } - - if (lst[0] == "CLIENT_FLAGS") - { - if(lst.size() < 3 || lst[1].size() < 2) - { - qWarning("Net: Malformed CLIENT_FLAGS message"); - return; - } - - QString flags = lst[1]; - bool setFlag = flags[0] == '+'; - - while(flags.size() > 1) - { - flags.remove(0, 1); - char c = flags[0].toAscii(); - - switch(c) - { - case 'r': - { - for(int i = 2; i < lst.size(); ++i) - { - if (lst[i] == mynick) - emit setMyReadyStatus(setFlag); - emit setReadyStatus(lst[i], setFlag); - } - } - } - } - - return; - } - - if (lst[0] == "ADD_TEAM") { - if(lst.size() != 24) - { - qWarning("Net: Bad ADDTEAM message"); - return; - } - QStringList tmp = lst; - tmp.removeFirst(); - emit AddNetTeam(tmp); - return; - } - - if (lst[0] == "REMOVE_TEAM") { - if(lst.size() != 2) - { - qWarning("Net: Bad REMOVETEAM message"); - return; - } - m_pTeamSelWidget->removeNetTeam(HWTeam(lst[1])); - return; - } - - if(lst[0] == "ROOMABANDONED") { - netClientState = 2; - emit showMessage(HWNewNet::tr("Room destroyed")); - emit LeftRoom(); - return; - } - - if(lst[0] == "KICKED") { - netClientState = 2; - emit showMessage(HWNewNet::tr("You got kicked")); - emit LeftRoom(); - return; - } - - if(lst[0] == "JOINED") { - if(lst.size() < 2) - { - qWarning("Net: Bad JOINED message"); - return; - } - - for(int i = 1; i < lst.size(); ++i) - { - if (lst[i] == mynick) - { - netClientState = 3; - emit EnteredGame(); - emit roomMaster(isChief); - if (isChief) - emit configAsked(); - } - if (lst[i] != mynick && isChief && config->Form->ui.pageRoomsList->chatWidget->ignoreList.contains(lst[i], Qt::CaseInsensitive) && !config->Form->ui.pageRoomsList->chatWidget->friendsList.contains(lst[i], Qt::CaseInsensitive)) - { - kickPlayer(lst[i]); - } - else - { - emit nickAdded(lst[i], isChief && (lst[i] != mynick)); - emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i])); - } - } - return; - } - - if(lst[0] == "LOBBY:JOINED") { - if(lst.size() < 2) - { - qWarning("Net: Bad JOINED message"); - return; - } - - for(int i = 1; i < lst.size(); ++i) - { - if (lst[i] == mynick) - { - netClientState = 2; - RawSendNet(QString("LIST")); - emit Connected(); - } - - emit nickAddedLobby(lst[i], false); - emit chatStringLobby(lst[i], tr("%1 *** %2 has joined").arg('\x03').arg("|nick|")); - } - return; - } - - if(lst[0] == "LEFT") { - if(lst.size() < 2) - { - qWarning("Net: Bad LEFT message"); - return; - } - emit nickRemoved(lst[1]); - if (lst.size() < 3) - emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); - else - emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); - return; - } - - if(lst[0] == "ROOM") { - if(lst.size() < 2) - { - qWarning("Net: Bad ROOM message"); - return; - } - RawSendNet(QString("LIST")); - return; - } - - if(lst[0] == "LOBBY:LEFT") { - if(lst.size() < 2) - { - qWarning("Net: Bad LOBBY:LEFT message"); - return; - } - emit nickRemovedLobby(lst[1]); - if (lst.size() < 3) - emit chatStringLobby(tr("%1 *** %2 has left").arg('\x03').arg(lst[1])); - else - emit chatStringLobby(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2])); - return; - } - - if (lst[0] == "RUN_GAME") { - netClientState = 5; - emit AskForRunGame(); - return; - } - - if (lst[0] == "ASKPASSWORD") { - bool ok = false; - int passLength = config->value("net/passwordlength", 0).toInt(); - QString hash = config->value("net/passwordhash", "").toString(); - - // If the password is blank, ask the user to enter one in - if (passLength == 0) - { - QString password = QInputDialog::getText(m_pGameCFGWidget, tr("Password"), tr("Your nickname %1 is\nregistered on Hedgewars.org\nPlease provide your password below\nor pick another nickname in game config:").arg(mynick), QLineEdit::Password, passLength==0?NULL:QString(passLength,'\0'), &ok); - - if (!ok) { - Disconnect(); - emit Disconnected(); - return; - } - - hash = QCryptographicHash::hash(password.toLatin1(), QCryptographicHash::Md5).toHex(); - config->setValue("net/passwordhash", hash); - config->setValue("net/passwordlength", password.size()); - config->setNetPasswordLength(password.size()); - } - - RawSendNet(QString("PASSWORD%1%2").arg(delimeter).arg(hash)); - return; - } - - if (lst[0] == "NOTICE") { - if(lst.size() < 2) - { - qWarning("Net: Bad NOTICE message"); - return; - } - - bool ok; - int n = lst[1].toInt(&ok); - if(!ok) - { - qWarning("Net: Bad NOTICE message"); - return; - } - - handleNotice(n); - - return; - } - - if (lst[0] == "TEAM_ACCEPTED") { - if (lst.size() != 2) - { - qWarning("Net: Bad TEAM_ACCEPTED message"); - return; - } - m_pTeamSelWidget->changeTeamStatus(lst[1]); - return; - } - - - if (lst[0] == "CFG") { - if(lst.size() < 3) - { - qWarning("Net: Bad CFG message"); - return; - } - QStringList tmp = lst; - tmp.removeFirst(); - tmp.removeFirst(); - if (lst[1] == "SCHEME") - emit netSchemeConfig(tmp); - else - emit paramChanged(lst[1], tmp); - return; - } - - if (lst[0] == "HH_NUM") { - if (lst.size() != 3) - { - qWarning("Net: Bad TEAM_ACCEPTED message"); - return; - } - HWTeam tmptm(lst[1]); - tmptm.numHedgehogs = lst[2].toUInt(); - emit hhnumChanged(tmptm); - return; - } - - if (lst[0] == "TEAM_COLOR") { - if (lst.size() != 3) - { - qWarning("Net: Bad TEAM_COLOR message"); - return; - } - HWTeam tmptm(lst[1]); - tmptm.teamColor = QColor(lst[2]); - emit teamColorChanged(tmptm); - return; - } - - if (lst[0] == "EM") { - if(lst.size() < 2) - { - qWarning("Net: Bad EM message"); - return; - } - for(int i = 1; i < lst.size(); ++i) - { - QByteArray em = QByteArray::fromBase64(lst[i].toAscii()); - emit FromNet(em); - } - return; - } - - if (lst[0] == "BYE") { - if (lst.size() < 2) - { - qWarning("Net: Bad BYE message"); - return; - } - if (lst[1] == "Authentication failed") - { - // Set the password blank if case the user tries to join and enter his password again - config->setValue("net/passwordlength", 0); - config->setNetPasswordLength(0); - } - emit showMessage(HWNewNet::tr("Quit reason: ") + lst[1]); - return; - } - - - if (lst[0] == "ADMIN_ACCESS") { - emit adminAccess(true); - return; - } - - if (lst[0] == "ROOM_CONTROL_ACCESS") { - if (lst.size() < 2) - { - qWarning("Net: Bad BYE message"); - return; - } - bool b = lst[1] != "0"; - m_pGameCFGWidget->setEnabled(b); - m_pTeamSelWidget->setInteractivity(b); - isChief = b; - emit roomMaster(isChief); - - return; - } - - qWarning() << "Net: Unknown message:" << lst; -} - -void HWNewNet::onHedgehogsNumChanged(const HWTeam& team) -{ - if (isChief) - RawSendNet(QString("HH_NUM%1%2%1%3") - .arg(delimeter) - .arg(team.TeamName) - .arg(team.numHedgehogs)); -} - -void HWNewNet::onTeamColorChanged(const HWTeam& team) -{ - if (isChief) - RawSendNet(QString("TEAM_COLOR%1%2%1%3") - .arg(delimeter) - .arg(team.TeamName) - .arg(team.teamColor.name())); -} - -void HWNewNet::onParamChanged(const QString & param, const QStringList & value) -{ - if (isChief) - RawSendNet( - QString("CFG%1%2%1%3") - .arg(delimeter) - .arg(param) - .arg(value.join(QString(delimeter))) - ); -} - -void HWNewNet::chatLineToNet(const QString& str) -{ - if(str != "") { - RawSendNet(QString("CHAT") + delimeter + str); - emit(chatStringFromMe(HWProto::formatChatMsg(mynick, str))); - } -} - -void HWNewNet::chatLineToLobby(const QString& str) -{ - if(str != "") { - RawSendNet(QString("CHAT") + delimeter + str); - emit(chatStringFromMeLobby(HWProto::formatChatMsg(mynick, str))); - } -} - -void HWNewNet::SendTeamMessage(const QString& str) -{ - RawSendNet(QString("TEAMCHAT") + delimeter + str); -} - -void HWNewNet::askRoomsList() -{ - if(netClientState != 2) - { - qWarning("Illegal try to get rooms list!"); - return; - } - RawSendNet(QString("LIST")); -} - -int HWNewNet::getClientState() -{ - return netClientState; -} - -QString HWNewNet::getNick() -{ - return mynick; -} - -QString HWNewNet::getRoom() -{ - return myroom; -} - -QString HWNewNet::getHost() -{ - return myhost; -} - -bool HWNewNet::isRoomChief() -{ - return isChief; -} - -void HWNewNet::gameFinished(bool correctly) -{ - if (netClientState == 5) netClientState = 3; - RawSendNet(QString("ROUNDFINISHED%1%2").arg(delimeter).arg(correctly ? "1" : "0")); -} - -void HWNewNet::banPlayer(const QString & nick) -{ - RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick)); -} - -void HWNewNet::kickPlayer(const QString & nick) -{ - RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick)); -} - -void HWNewNet::infoPlayer(const QString & nick) -{ - RawSendNet(QString("INFO%1%2").arg(delimeter).arg(nick)); -} - -void HWNewNet::followPlayer(const QString & nick) -{ - if (!isInRoom()) { - RawSendNet(QString("FOLLOW%1%2").arg(delimeter).arg(nick)); - isChief = false; - } -} - -void HWNewNet::startGame() -{ - RawSendNet(QString("START_GAME")); -} - -void HWNewNet::updateRoomName(const QString & name) -{ - RawSendNet(QString("ROOM_NAME%1%2").arg(delimeter).arg(name)); -} - - -void HWNewNet::toggleRestrictJoins() -{ - RawSendNet(QString("TOGGLE_RESTRICT_JOINS")); -} - -void HWNewNet::toggleRestrictTeamAdds() -{ - RawSendNet(QString("TOGGLE_RESTRICT_TEAMS")); -} - -void HWNewNet::clearAccountsCache() -{ - RawSendNet(QString("CLEAR_ACCOUNTS_CACHE")); -} - -void HWNewNet::partRoom() -{ - netClientState = 2; - RawSendNet(QString("PART")); -} - -bool HWNewNet::isInRoom() -{ - return netClientState > 2; -} - -void HWNewNet::setServerMessageNew(const QString & msg) -{ - RawSendNet(QString("SET_SERVER_VAR%1MOTD_NEW%1%2").arg(delimeter).arg(msg)); -} - -void HWNewNet::setServerMessageOld(const QString & msg) -{ - RawSendNet(QString("SET_SERVER_VAR%1MOTD_OLD%1%2").arg(delimeter).arg(msg)); -} - -void HWNewNet::setLatestProtocolVar(int proto) -{ - RawSendNet(QString("SET_SERVER_VAR%1LATEST_PROTO%1%2").arg(delimeter).arg(proto)); -} - -void HWNewNet::askServerVars() -{ - RawSendNet(QString("GET_SERVER_VAR")); -} - -void HWNewNet::handleNotice(int n) -{ - switch(n) - { - case 0: - { - bool ok = false; - QString newNick = QInputDialog::getText(m_pGameCFGWidget, tr("Nickname"), tr("Some one already uses\n your nickname %1\non the server.\nPlease pick another nickname:").arg(mynick), QLineEdit::Normal, mynick, &ok); - - if (!ok || newNick.isEmpty()) { - Disconnect(); - emit Disconnected(); - return; - } - - config->setValue("net/nick", newNick); - config->updNetNick(); - mynick = newNick; - - RawSendNet(QString("NICK%1%2").arg(delimeter).arg(newNick)); - - break; - } - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/newnetclient.h --- a/QTfrontend/newnetclient.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,171 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _NEW_NETCLIENT_INCLUDED -#define _NEW_NETCLIENT_INCLUDED - -#include -#include -#include -#include - -#include "team.h" -#include "game.h" // for GameState - -class GameUIConfig; -class GameCFGWidget; -class TeamSelWidget; - -extern char delimeter; - -class HWNewNet : public QObject -{ - Q_OBJECT - - public: - HWNewNet(GameUIConfig * config, GameCFGWidget* pGameCFGWidget, TeamSelWidget* pTeamSelWidget); - ~HWNewNet(); - void Connect(const QString & hostName, quint16 port, const QString & nick); - void Disconnect(); - bool isRoomChief(); - bool isInRoom(); - int getClientState(); - QString getNick(); - QString getRoom(); - QString getHost(); - - private: - GameUIConfig* config; - GameCFGWidget* m_pGameCFGWidget; - TeamSelWidget* m_pTeamSelWidget; - - bool isChief; - QString mynick; - QString myroom; - QString myhost; - QTcpSocket NetSocket; - QString seed; - bool m_game_connected; - - template - void SendCfgStrNet(T a) { - QByteArray strmsg; - strmsg.append(a); - quint8 sz = strmsg.size(); - QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg; - QString _msg = delimeter + QString(enginemsg.toBase64()); - RawSendNet(_msg); - } - - template - void SendCfgStrLoc(T a) { - QByteArray strmsg; - strmsg.append(QString(a).toUtf8()); - quint8 sz = strmsg.size(); - QByteArray enginemsg = QByteArray((char *)&sz, 1) + strmsg; - emit FromNet(enginemsg); - } - - QStringList cmdbuf; - - void RawSendNet(const QString & buf); - void RawSendNet(const QByteArray & buf); - void ParseCmd(const QStringList & lst); - void handleNotice(int n); - - int loginStep; - int netClientState; - - signals: - void AskForRunGame(); - void Connected(); - void Disconnected(); - void EnteredGame(); - void LeftRoom(); - void nickAdded(const QString& nick, bool notifyNick); - void nickRemoved(const QString& nick); - void nickAddedLobby(const QString& nick, bool notifyNick); - void nickRemovedLobby(const QString& nick); - void FromNet(const QByteArray & buf); - void adminAccess(bool); - void roomMaster(bool); - - void netSchemeConfig(QStringList &); - void paramChanged(const QString & param, const QStringList & value); - void configAsked(); - - void AddNetTeam(const HWTeam&); - void hhnumChanged(const HWTeam&); - void teamColorChanged(const HWTeam&); - void chatStringLobby(const QString&); - void chatStringLobby(const QString&, const QString&); - void chatStringFromNet(const QString&); - void chatStringFromMe(const QString&); - void chatStringFromMeLobby(const QString&); - - void roomsList(const QStringList&); - void serverMessage(const QString &); - void serverMessageNew(const QString &); - void serverMessageOld(const QString &); - void latestProtocolVar(int); - - void setReadyStatus(const QString & nick, bool isReady); - void setMyReadyStatus(bool isReady); - void showMessage(const QString &); - - public slots: - void ToggleReady(); - void chatLineToNet(const QString& str); - void chatLineToLobby(const QString& str); - void SendTeamMessage(const QString& str); - void SendNet(const QByteArray & buf); - void AddTeam(const HWTeam & team); - void RemoveTeam(const HWTeam& team); - void onHedgehogsNumChanged(const HWTeam& team); - void onTeamColorChanged(const HWTeam& team); - void onParamChanged(const QString & param, const QStringList & value); - - void setServerMessageNew(const QString &); - void setServerMessageOld(const QString &); - void setLatestProtocolVar(int proto); - void askServerVars(); - - void JoinRoom(const QString & room); - void CreateRoom(const QString & room); - void updateRoomName(const QString &); - void askRoomsList(); - void gameFinished(bool correcly); - void banPlayer(const QString &); - void kickPlayer(const QString &); - void infoPlayer(const QString &); - void followPlayer(const QString &); - void startGame(); - void toggleRestrictJoins(); - void toggleRestrictTeamAdds(); - void partRoom(); - void clearAccountsCache(); - - private slots: - void ClientRead(); - void OnConnect(); - void OnDisconnect(); - void displayError(QAbstractSocket::SocketError socketError); -}; - -#endif // _NEW_NETCLIENT_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageadmin.cpp --- a/QTfrontend/pageadmin.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,105 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include - -#include "pageadmin.h" -#include "chatwidget.h" - -PageAdmin::PageAdmin(QWidget* parent) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - - // 0 - pbAsk = addButton(tr("Fetch data"), pageLayout, 0, 0, 1, 3); - connect(pbAsk, SIGNAL(clicked()), this, SIGNAL(askServerVars())); - - // 1 - QLabel * lblSMN = new QLabel(this); - lblSMN->setText(tr("Server message for latest version:")); - pageLayout->addWidget(lblSMN, 1, 0); - - leServerMessageNew = new QLineEdit(this); - pageLayout->addWidget(leServerMessageNew, 1, 1); - - // 2 - QLabel * lblSMO = new QLabel(this); - lblSMO->setText(tr("Server message for previous versions:")); - pageLayout->addWidget(lblSMO, 2, 0); - - leServerMessageOld = new QLineEdit(this); - pageLayout->addWidget(leServerMessageOld, 2, 1); - - // 3 - QLabel * lblP = new QLabel(this); - lblP->setText(tr("Latest version protocol number:")); - pageLayout->addWidget(lblP, 3, 0); - - sbProtocol = new QSpinBox(this); - pageLayout->addWidget(sbProtocol, 3, 1); - - // 4 - QLabel * lblPreview = new QLabel(this); - lblPreview->setText(tr("MOTD preview:")); - pageLayout->addWidget(lblPreview, 4, 0); - - tb = new QTextBrowser(this); - tb->setOpenExternalLinks(true); - tb->document()->setDefaultStyleSheet(HWChatWidget::STYLE); - pageLayout->addWidget(tb, 4, 1, 1, 2); - connect(leServerMessageNew, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &))); - connect(leServerMessageOld, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &))); - - // 5 - pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), pageLayout, 5, 0); - - // 6 - pbSetSM = addButton(tr("Set data"), pageLayout, 6, 0, 1, 3); - - // 7 - BtnBack = addButton(":/res/Exit.png", pageLayout, 7, 0, true); - - connect(pbSetSM, SIGNAL(clicked()), this, SLOT(smChanged())); -} - -void PageAdmin::smChanged() -{ - emit setServerMessageNew(leServerMessageNew->text()); - emit setServerMessageOld(leServerMessageOld->text()); - emit setProtocol(sbProtocol->value()); -} - -void PageAdmin::serverMessageNew(const QString & str) -{ - leServerMessageNew->setText(str); -} - -void PageAdmin::serverMessageOld(const QString & str) -{ - leServerMessageOld->setText(str); -} -void PageAdmin::protocol(int proto) -{ - sbProtocol->setValue(proto); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageadmin.h --- a/QTfrontend/pageadmin.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_ADMIN_H -#define PAGE_ADMIN_H - -#include "AbstractPage.h" - -class PageAdmin : public AbstractPage -{ - Q_OBJECT - -public: - PageAdmin(QWidget* parent = 0); - - QPushButton * BtnBack; - QPushButton * pbClearAccountsCache; - -private: - QLineEdit * leServerMessageNew; - QLineEdit * leServerMessageOld; - QPushButton * pbSetSM; - QPushButton * pbAsk; - QSpinBox * sbProtocol; - QTextBrowser * tb; - -private slots: - void smChanged(); - -public slots: - void serverMessageNew(const QString & str); - void serverMessageOld(const QString & str); - void protocol(int proto); - -signals: - void setServerMessageNew(const QString & str); - void setServerMessageOld(const QString & str); - void setProtocol(int proto); - void askServerVars(); -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagecampaign.cpp --- a/QTfrontend/pagecampaign.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,46 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "pagecampaign.h" - -PageCampaign::PageCampaign(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 2); - pageLayout->setColumnStretch(2, 1); - pageLayout->setRowStretch(0, 1); - pageLayout->setRowStretch(3, 1); - - CBSelect = new QComboBox(this); - CBTeam = new QComboBox(this); - - pageLayout->addWidget(CBTeam, 1, 1); - pageLayout->addWidget(CBSelect, 2, 1); - - BtnStartCampaign = new QPushButton(this); - BtnStartCampaign->setFont(*font14); - BtnStartCampaign->setText(QPushButton::tr("Go!")); - pageLayout->addWidget(BtnStartCampaign, 2, 2); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 4, 0, true); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagecampaign.h --- a/QTfrontend/pagecampaign.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_CAMPAIGN_H -#define PAGE_CAMPAIGN_H - -#include "AbstractPage.h" - -class PageCampaign : public AbstractPage -{ - Q_OBJECT - -public: - PageCampaign(QWidget* parent = 0); - - QPushButton *BtnStartCampaign; - QPushButton *BtnBack; - QComboBox *CBSelect; - QComboBox *CBTeam; -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageconnecting.cpp --- a/QTfrontend/pageconnecting.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "pageconnecting.h" - -PageConnecting::PageConnecting(QWidget* parent) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - - QLabel * lblConnecting = new QLabel(this); - lblConnecting->setText(tr("Connecting...")); - pageLayout->addWidget(lblConnecting); - - QPushButton * pbCancel = new QPushButton(this); - pbCancel->setText(tr("Cancel")); - pageLayout->addWidget(pbCancel); - connect(pbCancel, SIGNAL(clicked()), this, SIGNAL(cancelConnection())); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageconnecting.h --- a/QTfrontend/pageconnecting.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_CONNECTING_H -#define PAGE_CONNECTING_H - -#include "AbstractPage.h" - -class PageConnecting : public AbstractPage -{ - Q_OBJECT - -public: - PageConnecting(QWidget* parent = 0); - -signals: - void cancelConnection(); -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagedata.cpp --- a/QTfrontend/pagedata.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,225 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pagedata.h" -#include "databrowser.h" -#include "hwconsts.h" - -#include "quazip.h" -#include "quazipfile.h" - -PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 1); - pageLayout->setColumnStretch(2, 1); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true); - - web = new DataBrowser(this); - connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&))); - web->setOpenLinks(false); - pageLayout->addWidget(web, 0, 0, 1, 3); - - progressBarsLayout = new QVBoxLayout(); - pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3); - - web->setHtml("

Hedgewars Downloadable Content



Loading, please wait
"); -} - -void PageDataDownload::request(const QUrl &url) -{ - QUrl finalUrl; - if(url.host().isEmpty()) - finalUrl = QUrl("http://www.hedgewars.org" + url.path()); - else - finalUrl = url; - - if(url.path().endsWith(".zip")) - { - qWarning() << "Download Request" << url.toString(); - QString fileName = QFileInfo(url.toString()).fileName(); - - QNetworkRequest newRequest(finalUrl); - newRequest.setAttribute(QNetworkRequest::User, fileName); - - QNetworkAccessManager *manager = new QNetworkAccessManager(this); - QNetworkReply *reply = manager->get(newRequest); - connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded())); - connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); - - QProgressBar *progressBar = new QProgressBar(this); - progressBarsLayout->addWidget(progressBar); - progressBars.insert(reply, progressBar); - } else - { - qWarning() << "Page Request" << url.toString(); - - QNetworkRequest newRequest(finalUrl); - - QNetworkAccessManager *manager = new QNetworkAccessManager(this); - QNetworkReply *reply = manager->get(newRequest); - connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded())); - } -} - - -void PageDataDownload::pageDownloaded() -{ - QNetworkReply * reply = qobject_cast(sender()); - - if(reply && (reply->error() == QNetworkReply::NoError)) - { - QString html = QString::fromUtf8(reply->readAll()); - int begin = html.indexOf(""); - int end = html.indexOf(""); - if(begin != -1 && begin < end) - { - html.truncate(end); - html.remove(0, begin); - } - web->setHtml(html); - } - else - { - web->setHtml("

Hedgewars Downloadable Content



This page requires an internet connection.

"); - } -} - -void PageDataDownload::fileDownloaded() -{ - QNetworkReply * reply = qobject_cast(sender()); - - if(reply) - { - QByteArray fileContents = reply->readAll(); - QProgressBar *progressBar = progressBars.value(reply, 0); - - if(progressBar) - { - progressBars.remove(reply); - progressBar->deleteLater(); - } - - extractDataPack(&fileContents); - } -} - -void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal) -{ - QNetworkReply * reply = qobject_cast(sender()); - - if(reply) - { - QProgressBar *progressBar = progressBars.value(reply, 0); - - if(progressBar) - { - progressBar->setValue(bytesRecieved); - progressBar->setMaximum(bytesTotal); - } - } -} - -void PageDataDownload::fetchList() -{ - request(QUrl("http://www.hedgewars.org/content.html")); -} - -bool PageDataDownload::extractDataPack(QByteArray * buf) -{ - QBuffer buffer; - buffer.setBuffer(buf); - - QuaZip zip; - zip.setIoDevice(&buffer); - if(!zip.open(QuaZip::mdUnzip)) - { - qWarning("testRead(): zip.open(): %d", zip.getZipError()); - return false; - } - - QuaZipFile file(&zip); - - QDir extractDir(*cfgdir); - extractDir.cd("Data"); - - for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile()) - { - if(!file.open(QIODevice::ReadOnly)) - { - qWarning("file.open(): %d", file.getZipError()); - return false; - } - - - QString fileName = file.getActualFileName(); - QString filePath = extractDir.filePath(fileName); - if (fileName.endsWith("/")) - { - QFileInfo fi(filePath); - QDir().mkpath(fi.filePath()); - } else - { - qDebug() << "Extracting" << filePath; - QFile out(filePath); - if(!out.open(QFile::WriteOnly)) - { - qWarning() << "out.open():" << out.errorString(); - return false; - } - - out.write(file.readAll()); - - out.close(); - - if(file.getZipError() != UNZ_OK) { - qWarning("file.getFileName(): %d", file.getZipError()); - return false; - } - - if(!file.atEnd()) { - qWarning("read all but not EOF"); - return false; - } - } - - file.close(); - - if(file.getZipError()!=UNZ_OK) { - qWarning("file.close(): %d", file.getZipError()); - return false; - } - } - - zip.close(); - - return true; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagedata.h --- a/QTfrontend/pagedata.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,57 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_DATA_H -#define PAGE_DATA_H - -#include -#include "AbstractPage.h" - -class DataBrowser; -class QProgressBar; -class QNetworkReply; -class QVBoxLayout; - -class PageDataDownload : public AbstractPage -{ - Q_OBJECT - -public: - PageDataDownload(QWidget* parent = 0); - - QPushButton *BtnBack; - -public slots: - void fetchList(); - -private: - DataBrowser *web; - QHash progressBars; - QVBoxLayout *progressBarsLayout; - - bool extractDataPack(QByteArray * buf); - -private slots: - void request(const QUrl &url); - - void pageDownloaded(); - void fileDownloaded(); - void downloadProgress(qint64, qint64); -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagedrawmap.cpp --- a/QTfrontend/pagedrawmap.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,60 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "pagedrawmap.h" -#include "drawmapwidget.h" - -PageDrawMap::PageDrawMap(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - - QPushButton * pbUndo = addButton(tr("Undo"), pageLayout, 0, 0); - QPushButton * pbClear = addButton(tr("Clear"), pageLayout, 1, 0); - QPushButton * pbLoad = addButton(tr("Load"), pageLayout, 2, 0); - QPushButton * pbSave = addButton(tr("Save"), pageLayout, 3, 0); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 5, 0, true); - - drawMapWidget = new DrawMapWidget(this); - pageLayout->addWidget(drawMapWidget, 0, 1, 5, 1); - - connect(pbUndo, SIGNAL(clicked()), drawMapWidget, SLOT(undo())); - connect(pbClear, SIGNAL(clicked()), drawMapWidget, SLOT(clear())); - connect(pbLoad, SIGNAL(clicked()), this, SLOT(load())); - connect(pbSave, SIGNAL(clicked()), this, SLOT(save())); -} - -void PageDrawMap::load() -{ - QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)"); - - if(!fileName.isEmpty()) - drawMapWidget->load(fileName); -} - -void PageDrawMap::save() -{ - QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)"); - - if(!fileName.isEmpty()) - drawMapWidget->save(fileName); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagedrawmap.h --- a/QTfrontend/pagedrawmap.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_DRAWMAP_H -#define PAGE_DRAWMAP_H - -#include "AbstractPage.h" - -class DrawMapWidget; - -class PageDrawMap : public AbstractPage -{ - Q_OBJECT - -public: - PageDrawMap(QWidget* parent = 0); - - QPushButton * BtnBack; - - DrawMapWidget * drawMapWidget; - -private slots: - void load(); - void save(); -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageeditteam.cpp --- a/QTfrontend/pageeditteam.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,386 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pageeditteam.h" -#include "sdlkeys.h" -#include "hwconsts.h" -#include "SquareLabel.h" -#include "hats.h" -#include "HWApplication.h" - -PageEditTeam::PageEditTeam(QWidget* parent, SDLInteraction * sdli) : - AbstractPage(parent) -{ - mySdli = sdli; - QGridLayout * pageLayout = new QGridLayout(this); - QTabWidget * tbw = new QTabWidget(this); - QWidget * page1 = new QWidget(this); - QWidget * page2 = new QWidget(this); - tbw->addTab(page1, tr("General")); - tbw->addTab(page2, tr("Advanced")); - pageLayout->addWidget(tbw, 0, 0, 1, 3); - BtnTeamDiscard = addButton(":/res/Exit.png", pageLayout, 1, 0, true); - BtnTeamSave = addButton(":/res/Save.png", pageLayout, 1, 2, true);; - BtnTeamSave->setStyleSheet("QPushButton{margin: 12px 0px 12px 0px;}"); - BtnTeamDiscard->setFixedHeight(BtnTeamSave->height()); - BtnTeamDiscard->setStyleSheet("QPushButton{margin-top: 31px;}"); - - QHBoxLayout * page1Layout = new QHBoxLayout(page1); - page1Layout->setAlignment(Qt::AlignTop); - QGridLayout * page2Layout = new QGridLayout(page2); - -// ====== Page 1 ====== - QVBoxLayout * vbox1 = new QVBoxLayout(); - QVBoxLayout * vbox2 = new QVBoxLayout(); - page1Layout->addLayout(vbox1); - page1Layout->addLayout(vbox2); - - GBoxHedgehogs = new QGroupBox(this); - GBoxHedgehogs->setTitle(QGroupBox::tr("Team Members")); - GBoxHedgehogs->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - QGridLayout * GBHLayout = new QGridLayout(GBoxHedgehogs); - - signalMapper1 = new QSignalMapper(this); - signalMapper2 = new QSignalMapper(this); - - connect(signalMapper1, SIGNAL(mapped(int)), this, SLOT(fixHHname(int))); - - HatsModel * hatsModel = new HatsModel(GBoxHedgehogs); - for(int i = 0; i < 8; i++) - { - HHHats[i] = new QComboBox(GBoxHedgehogs); - HHHats[i]->setModel(hatsModel); - HHHats[i]->setIconSize(QSize(32, 37)); - //HHHats[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); - //HHHats[i]->setModelColumn(1); - //HHHats[i]->setMinimumWidth(132); - GBHLayout->addWidget(HHHats[i], i, 0); - - HHNameEdit[i] = new QLineEdit(GBoxHedgehogs); - HHNameEdit[i]->setMaxLength(64); - HHNameEdit[i]->setMinimumWidth(120); - GBHLayout->addWidget(HHNameEdit[i], i, 1); - - connect(HHNameEdit[i], SIGNAL(editingFinished()), signalMapper1, SLOT(map())); - signalMapper1->setMapping(HHNameEdit[i], i); - - randButton[i] = addButton(":/res/dice.png", GBHLayout, i, 3, true); - - connect(randButton[i], SIGNAL(clicked()), signalMapper2, SLOT(map())); - signalMapper2->setMapping(randButton[i], i); - } - - randTeamButton = addButton(QPushButton::tr("Random Team"), GBHLayout, 9, false); - - vbox1->addWidget(GBoxHedgehogs); - - - GBoxTeam = new QGroupBox(this); - GBoxTeam->setTitle(QGroupBox::tr("Team Settings")); - GBoxTeam->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - QGridLayout * GBTLayout = new QGridLayout(GBoxTeam); - QLabel * tmpLabel = new QLabel(GBoxTeam); - tmpLabel->setText(QLabel::tr("Name")); - GBTLayout->addWidget(tmpLabel, 0, 0); - tmpLabel = new QLabel(GBoxTeam); - tmpLabel->setText(QLabel::tr("Type")); - GBTLayout->addWidget(tmpLabel, 1, 0); - tmpLabel = new QLabel(GBoxTeam); - tmpLabel->setText(QLabel::tr("Grave")); - GBTLayout->addWidget(tmpLabel, 2, 0); - tmpLabel = new QLabel(GBoxTeam); - tmpLabel->setText(QLabel::tr("Flag")); - GBTLayout->addWidget(tmpLabel, 3, 0); - tmpLabel = new QLabel(GBoxTeam); - tmpLabel->setText(QLabel::tr("Voice")); - GBTLayout->addWidget(tmpLabel, 4, 0); - - - TeamNameEdit = new QLineEdit(GBoxTeam); - TeamNameEdit->setMaxLength(64); - GBTLayout->addWidget(TeamNameEdit, 0, 1); - vbox2->addWidget(GBoxTeam); - - CBTeamLvl = new QComboBox(GBoxTeam); - CBTeamLvl->setIconSize(QSize(48, 48)); - CBTeamLvl->addItem(QIcon(":/res/botlevels/0.png"), QComboBox::tr("Human")); - for(int i = 5; i > 0; i--) - CBTeamLvl->addItem( - QIcon(QString(":/res/botlevels/%1.png").arg(6 - i)), - QString("%1 %2").arg(QComboBox::tr("Level")).arg(i) - ); - GBTLayout->addWidget(CBTeamLvl, 1, 1); - - CBGrave = new QComboBox(GBoxTeam); - CBGrave->setMaxCount(65535); - CBGrave->setIconSize(QSize(32, 32)); - GBTLayout->addWidget(CBGrave, 2, 1); - - CBFlag = new QComboBox(GBoxTeam); - CBFlag->setMaxCount(65535); - CBFlag->setIconSize(QSize(22, 15)); - GBTLayout->addWidget(CBFlag, 3, 1); - - { - QHBoxLayout * hbox = new QHBoxLayout(); - CBVoicepack = new QComboBox(GBoxTeam); - { - QDir tmpdir; - QStringList list; - tmpdir.cd(cfgdir->absolutePath()); - if (tmpdir.cd("Data/Sounds/voices")) - { - list = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); - CBVoicepack->addItems(list); - } - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Sounds/voices"); - QStringList tmplist = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); - QStringList tmplist2; - for (QStringList::Iterator it = tmplist.begin(); it != tmplist.end(); ++it) - if (!list.contains(*it,Qt::CaseInsensitive)) tmplist2.append(*it); - - CBVoicepack->addItems(tmplist2); - } - hbox->addWidget(CBVoicepack, 100); - BtnTestSound = addButton(":/res/PlaySound.png", hbox, 1, true); - hbox->setStretchFactor(BtnTestSound, 1); - connect(BtnTestSound, SIGNAL(clicked()), this, SLOT(testSound())); - GBTLayout->addLayout(hbox, 4, 1); - } - - GBoxFort = new QGroupBox(this); - GBoxFort->setTitle(QGroupBox::tr("Fort")); - QGridLayout * GBFLayout = new QGridLayout(GBoxFort); - CBFort = new QComboBox(GBoxFort); - CBFort->setMaxCount(65535); - GBFLayout->addWidget(CBFort, 0, 0); - FortPreview = new SquareLabel(GBoxFort); - FortPreview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - FortPreview->setMinimumSize(128, 128); - FortPreview->setPixmap(QPixmap()); - // perhaps due to handling its own paintevents, SquareLabel doesn't play nice with the stars - //FortPreview->setAttribute(Qt::WA_PaintOnScreen, true); - GBFLayout->addWidget(FortPreview, 1, 0); - vbox2->addWidget(GBoxFort); - - QDir tmpdir; - QStringList userforts; - tmpdir.cd(cfgdir->absolutePath()); - if (tmpdir.cd("Data/Forts")) - { - tmpdir.setFilter(QDir::Files); - userforts = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1"); - CBFort->addItems(userforts); - } - - tmpdir.cd("../Graphics/Graves"); - QStringList userlist = tmpdir.entryList(QStringList("*.png")); - for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it ) - { - QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Graves/" + *it); - QIcon icon(pix.copy(0, 0, 32, 32)); - CBGrave->addItem(icon, QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1")); - } - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Forts"); - tmpdir.setFilter(QDir::Files); - - QStringList tmplist = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1"); - QStringList dataforts; - for (QStringList::Iterator it = tmplist.begin(); it != tmplist.end(); ++it) - if (!userforts.contains(*it,Qt::CaseInsensitive)) dataforts.append(*it); - - CBFort->addItems(dataforts); - connect(CBFort, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CBFort_activated(const QString &))); - - tmpdir.cd("../Graphics/Graves"); - QStringList datalist = tmpdir.entryList(QStringList("*.png")); - for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it ) - { - if (userlist.contains(*it,Qt::CaseInsensitive)) continue; - QPixmap pix(datadir->absolutePath() + "/Graphics/Graves/" + *it); - QIcon icon(pix.copy(0, 0, 32, 32)); - CBGrave->addItem(icon, (*it).replace(QRegExp("^(.*)\\.png"), "\\1")); - } - - // add the default flag - CBFlag->addItem(QIcon(QPixmap(datadir->absolutePath() + "/Graphics/Flags/hedgewars.png").copy(0, 0, 22, 15)), "Hedgewars", "hedgewars"); - CBFlag->insertSeparator(CBFlag->count()); - - tmpdir.cd(cfgdir->absolutePath()); - tmpdir.cd("Data/Graphics/Flags"); - userlist = tmpdir.entryList(QStringList("*.png")); - - // add all country flags - for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it ) - { - QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + *it); - QIcon icon(pix.copy(0, 0, 22, 15)); - if(it->compare("cpu.png") && it->compare("hedgewars.png") && (it->indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags - { - QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - CBFlag->addItem(icon, QString(flag).replace("_", " "), flag); - } - } - - CBFlag->insertSeparator(CBFlag->count()); - - // add all community flags - for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it ) - { - QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + *it); - QIcon icon(pix.copy(0, 0, 22, 15)); - if(it->indexOf("cm_") > -1) // skip non community flags this time - { - QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag); - } - } - - CBFlag->insertSeparator(CBFlag->count()); - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Graphics/Flags"); - datalist = tmpdir.entryList(QStringList("*.png")); - - // add all country flags - for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it ) - { - if (userlist.contains(*it,Qt::CaseInsensitive)) continue; - QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it); - QIcon icon(pix.copy(0, 0, 22, 15)); - if(it->compare("cpu.png") && it->compare("hedgewars.png") && (it->indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags - { - QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - CBFlag->addItem(icon, QString(flag).replace("_", " "), flag); - } - } - - CBFlag->insertSeparator(CBFlag->count()); - - // add all community flags - for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it ) - { - if (userlist.contains(*it,Qt::CaseInsensitive)) continue; - QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it); - QIcon icon(pix.copy(0, 0, 22, 15)); - if(it->indexOf("cm_") > -1) // skip non community flags this time - { - QString flag = (*it).replace(QRegExp("^(.*)\\.png"), "\\1"); - CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag); - } - } - - vbox1->addStretch(); - vbox2->addStretch(); - -// ====== Page 2 ====== - GBoxBinds = new QGroupBox(this); - GBoxBinds->setTitle(QGroupBox::tr("Key binds")); - QGridLayout * GBBLayout = new QGridLayout(GBoxBinds); - BindsBox = new QToolBox(GBoxBinds); - BindsBox->setLineWidth(0); - GBBLayout->addWidget(BindsBox); - page2Layout->addWidget(GBoxBinds, 0, 0); - - quint16 i = 0; - quint16 num = 0; - QWidget * curW = NULL; - QGridLayout * pagelayout = NULL; - QLabel* l = NULL; - while (i < BINDS_NUMBER) { - if(cbinds[i].category != NULL) - { - if(curW != NULL) - { - l = new QLabel(curW); - l->setText(""); - pagelayout->addWidget(l, num++, 0, 1, 2); - } - curW = new QWidget(this); - BindsBox->addItem(curW, HWApplication::translate("binds (categories)", cbinds[i].category)); - pagelayout = new QGridLayout(curW); - num = 0; - } - if(cbinds[i].description != NULL) - { - l = new QLabel(curW); - l->setText((num > 0 ? QString("\n") : QString("")) + HWApplication::translate("binds (descriptions)", cbinds[i].description)); - pagelayout->addWidget(l, num++, 0, 1, 2); - } - - l = new QLabel(curW); - l->setText(HWApplication::translate("binds", cbinds[i].name)); - l->setAlignment(Qt::AlignRight); - pagelayout->addWidget(l, num, 0); - CBBind[i] = new QComboBox(curW); - for(int j = 0; sdlkeys[j][1][0] != '\0'; j++) - CBBind[i]->addItem(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), sdlkeys[j][0]); - pagelayout->addWidget(CBBind[i++], num++, 1); - } -} - -void PageEditTeam::fixHHname(int idx) -{ - HHNameEdit[idx]->setText(HHNameEdit[idx]->text().trimmed()); - - if (HHNameEdit[idx]->text().isEmpty()) - HHNameEdit[idx]->setText(QLineEdit::tr("hedgehog %1").arg(idx+1)); -} - -void PageEditTeam::CBFort_activated(const QString & fortname) -{ - QFile tmp; - tmp.setFileName(cfgdir->absolutePath() + "/Data/Forts/" + fortname + "L.png"); - if (!tmp.exists()) tmp.setFileName(datadir->absolutePath() + "/Forts/" + fortname + "L.png"); - QPixmap pix(QFileInfo(tmp).absoluteFilePath()); - FortPreview->setPixmap(pix); -} - -void PageEditTeam::testSound() -{ - Mix_Chunk *sound; - QDir tmpdir; - mySdli->SDLMusicInit(); - - tmpdir.cd(cfgdir->absolutePath()); - if (!tmpdir.cd("Data/Sounds/voices/"+CBVoicepack->currentText())) - { - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Sounds/voices"); - tmpdir.cd(CBVoicepack->currentText()); - } - - QStringList list = tmpdir.entryList(QStringList() << "Illgetyou.ogg" << "Incoming.ogg" << "Stupid.ogg" << "Coward.ogg" << "Firstblood.ogg", QDir::Files); - if (list.size()) { - sound = Mix_LoadWAV(QString(tmpdir.absolutePath() + "/" + list[rand() % list.size()]).toLocal8Bit().constData()); - Mix_PlayChannel(-1, sound, 0); - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageeditteam.h --- a/QTfrontend/pageeditteam.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_EDITTEAM_H -#define PAGE_EDITTEAM_H - -#include "AbstractPage.h" -#include "binds.h" -#include "SDLs.h" - -class SquareLabel; - -class PageEditTeam : public AbstractPage -{ - Q_OBJECT - -public: - PageEditTeam(QWidget* parent, SDLInteraction * sdli); - QSignalMapper* signalMapper1; - QSignalMapper* signalMapper2; - QGroupBox *GBoxHedgehogs; - QGroupBox *GBoxTeam; - QGroupBox *GBoxFort; - QComboBox *CBFort; - SquareLabel *FortPreview; - QComboBox *CBGrave; - QComboBox *CBFlag; - QComboBox *CBTeamLvl; - QComboBox *CBVoicepack; - QGroupBox *GBoxBinds; - QToolBox *BindsBox; - QPushButton *BtnTeamDiscard; - QPushButton *BtnTeamSave; - QPushButton * BtnTestSound; - QLineEdit * TeamNameEdit; - QLineEdit * HHNameEdit[8]; - QComboBox * HHHats[8]; - QPushButton * randButton[8]; - QComboBox * CBBind[BINDS_NUMBER]; - QPushButton * randTeamButton; - -private: - SDLInteraction * mySdli; - -public slots: - void CBFort_activated(const QString & gravename); - -private slots: - void testSound(); - void fixHHname(int idx); -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagegamestats.cpp --- a/QTfrontend/pagegamestats.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,259 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2010-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include - -#include "pagegamestats.h" -#include "team.h" - -FitGraphicsView::FitGraphicsView(QWidget* parent) : QGraphicsView(parent) -{ - -} - -void FitGraphicsView::resizeEvent(QResizeEvent * event) -{ - Q_UNUSED(event); - - fitInView(sceneRect()); -} - -PageGameStats::PageGameStats(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setSpacing(20); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 1); - pageLayout->setContentsMargins(7, 7, 7, 0); - - BtnSave = addButton(":/res/Save.png", pageLayout, 3, 2, true); - BtnSave->setStyleSheet("QPushButton{margin: 12px 0px 12px 0px;}"); - connect(BtnSave, SIGNAL(clicked()), this, SIGNAL(saveDemoRequested())); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true); - BtnBack->setFixedHeight(BtnSave->height()); - BtnBack->setFixedWidth(BtnBack->width()+2); - BtnBack->setStyleSheet("QPushButton{margin: 22px 0 9px 2px;}"); - - QGroupBox * gb = new QGroupBox(this); - QVBoxLayout * gbl = new QVBoxLayout; - - // details - labelGameStats = new QLabel(this); - QLabel * l = new QLabel(this); - l->setTextFormat(Qt::RichText); - l->setText("

" + PageGameStats::tr("Details") + "

"); - l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - labelGameStats->setTextFormat(Qt::RichText); - labelGameStats->setAlignment(Qt::AlignTop); - labelGameStats->setWordWrap(true); - gbl->addWidget(l); - gbl->addWidget(labelGameStats); - gb->setLayout(gbl); - pageLayout->addWidget(gb, 1, 1, 1, 2); - - // graph - graphic = new FitGraphicsView(gb); - l = new QLabel(this); - l->setTextFormat(Qt::RichText); - l->setText("

" + PageGameStats::tr("Health graph") + "

"); - l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - gbl->addWidget(l); - gbl->addWidget(graphic); - graphic->scale(1.0, -1.0); - graphic->setBackgroundBrush(QBrush(Qt::black)); - - labelGameWin = new QLabel(this); - labelGameWin->setTextFormat(Qt::RichText); - pageLayout->addWidget(labelGameWin, 0, 0, 1, 2); - - // ranking box - gb = new QGroupBox(this); - gbl = new QVBoxLayout; - labelGameRank = new QLabel(gb); - l = new QLabel(this); - l->setTextFormat(Qt::RichText); - l->setText("

" + PageGameStats::tr("Ranking") + "

"); - l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - gbl->addWidget(l); - gbl->addWidget(labelGameRank); - gb->setLayout(gbl); - - labelGameRank->setTextFormat(Qt::RichText); - labelGameRank->setAlignment(Qt::AlignTop); - pageLayout->addWidget(gb, 1, 0); -} - -void PageGameStats::AddStatText(const QString & msg) -{ - labelGameStats->setText(labelGameStats->text() + msg); -} - -void PageGameStats::clear() -{ - labelGameStats->setText(""); - healthPoints.clear(); - labelGameRank->setText(""); - playerPosition = 0; - lastColor = 0; -} - -void PageGameStats::renderStats() -{ - QGraphicsScene * scene = new QGraphicsScene(); - - QMap >::const_iterator i = healthPoints.constBegin(); - while (i != healthPoints.constEnd()) - { - quint32 c = i.key(); - QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255)); - QVector hps = i.value(); - - QPainterPath path; - if (hps.size()) - path.moveTo(0, hps[0]); - - for(int t = 1; t < hps.size(); ++t) - path.lineTo(t, hps[t]); - - scene->addPath(path, QPen(c)); - ++i; - } - - graphic->setScene(scene); - graphic->fitInView(graphic->sceneRect()); -} - -void PageGameStats::GameStats(char type, const QString & info) -{ - switch(type) { - case 'r' : { - labelGameWin->setText(QString("

%1

").arg(info)); - break; - } - case 'D' : { - int i = info.indexOf(' '); - QString message = "

" + PageGameStats::tr("The best shot award was won by %1 with %2 pts.").arg(info.mid(i + 1), info.left(i)) + "

"; - AddStatText(message); - break; - } - case 'k' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("The best killer is %1 with %2 kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "

"; - AddStatText(message); - break; - } - case 'K' : { - int num = info.toInt(); - QString message = "

" + PageGameStats::tr("A total of %1 hedgehog(s) were killed during this round.", "", num).arg(num) + "

"; - AddStatText(message); - break; - } - case 'H' : { - int i = info.indexOf(' '); - quint32 clan = info.left(i).toInt(); - quint32 hp = info.mid(i + 1).toUInt(); - healthPoints[clan].append(hp); - break; - } - case 'T': { // local team stats - //AddStatText("

local team: " + info + "

"); - QStringList infol = info.split(":"); - HWTeam team(infol[0]); - if(team.FileExists()) // do some better test to avoid influence from scripted/predefined teams? - { - team.LoadFromFile(); - team.Rounds++; - if(infol[1].toInt() > 0) // might require some better test for winning condition (or changed flag) ... WIP! - team.Wins++; // should draws count as wins? - //team.SaveToFile(); // don't save yet - } - break; - } - - case 'P' : { - int i = info.indexOf(' '); - playerPosition++; - QString color = info.left(i); - quint32 c = color.toInt(); - QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255)); - - QString playerinfo = info.mid(i + 1); - - i = playerinfo.indexOf(' '); - - int kills = playerinfo.left(i).toInt(); - QString playername = playerinfo.mid(i + 1); - QString image; - - if (lastColor == c) playerPosition--; - lastColor = c; - - switch (playerPosition) - { - case 1: - image = ""; - break; - case 2: - image = ""; - break; - case 3: - image = ""; - break; - default: - image = ""; - break; - } - - QString message; - QString killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills); - - message = QString("

%1 %2. %3 ").arg(image, QString::number(playerPosition), playername, clanColor.name()) + killstring + "

"; - - labelGameRank->setText(labelGameRank->text() + message); - break; - } - case 's' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 thought it's good to shoot his own hedgehogs with %2 pts.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; - AddStatText(message); - break; - } - case 'S' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 killed %2 of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; - AddStatText(message); - break; - } - case 'B' : { - int i = info.indexOf(' '); - int num = info.left(i).toInt(); - QString message = "

" + PageGameStats::tr("%1 was scared and skipped turn %2 times.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; - AddStatText(message); - break; - } - - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagegamestats.h --- a/QTfrontend/pagegamestats.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,69 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2010-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef STATSPAGE_H -#define STATSPAGE_H - -#include -#include -#include - -#include "AbstractPage.h" - -class FitGraphicsView : public QGraphicsView -{ - Q_OBJECT - -public: - FitGraphicsView(QWidget* parent = 0); - -protected: - void resizeEvent(QResizeEvent * event); -}; - -class PageGameStats : public AbstractPage -{ - Q_OBJECT - -public: - PageGameStats(QWidget* parent = 0); - - QPushButton *BtnBack; - QPushButton *BtnSave; - QLabel *labelGameStats; - QLabel *labelGameWin; - QLabel *labelGameRank; - FitGraphicsView * graphic; - -public slots: - void GameStats(char type, const QString & info); - void clear(); - void renderStats(); - -signals: - void saveDemoRequested(); - -private: - void AddStatText(const QString & msg); - - QMap > healthPoints; - unsigned int playerPosition; - quint32 lastColor; -}; - -#endif // STATSPAGE_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageinfo.cpp --- a/QTfrontend/pageinfo.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "pageinfo.h" -#include "about.h" - -PageInfo::PageInfo(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 1); - pageLayout->setColumnStretch(2, 1); - - BtnSnapshots = addButton(":/res/Star.png", pageLayout, 1, 2, true); - BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true); - - about = new About(this); - pageLayout->addWidget(about, 0, 0, 1, 3); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageinfo.h --- a/QTfrontend/pageinfo.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,39 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_INFO_H -#define PAGE_INFO_H - -#include "AbstractPage.h" - -class About; - -class PageInfo : public AbstractPage -{ - Q_OBJECT - -public: - PageInfo(QWidget* parent = 0); - - QPushButton *BtnSnapshots; - QPushButton *BtnBack; - About *about; -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageingame.cpp --- a/QTfrontend/pageingame.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,29 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include - -#include "pageingame.h" - -PageInGame::PageInGame(QWidget* parent) : - AbstractPage(parent) -{ - QLabel * label = new QLabel(this); - label->setText("In game..."); -} - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageingame.h --- a/QTfrontend/pageingame.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,33 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_INGAME_H -#define PAGE_INGAME_H - -#include "AbstractPage.h" - -class PageInGame : public AbstractPage -{ - Q_OBJECT - -public: - PageInGame(QWidget* parent = 0); -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagemain.cpp --- a/QTfrontend/pagemain.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,139 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include - -#include "pagemain.h" -#include "hwconsts.h" -#include "hwform.h" - -PageMain::PageMain(QWidget* parent) : - AbstractPage(parent) -{ - if(frontendEffects) setAttribute(Qt::WA_NoSystemBackground, true); - QGridLayout * pageLayout = new QGridLayout(this); - //pageLayout->setColumnStretch(0, 1); - //pageLayout->setColumnStretch(1, 2); - //pageLayout->setColumnStretch(2, 1); - - //QPushButton* btnLogo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true); - //pageLayout->setAlignment(btnLogo, Qt::AlignHCenter); - pageLayout->setRowStretch(0, 1); - pageLayout->setRowStretch(1, 1); - pageLayout->setRowStretch(2, 0); - pageLayout->setRowStretch(3, 1); - pageLayout->setRowStretch(4, 1); - pageLayout->setRowStretch(5, 1); - - BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true); - BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)")); - pageLayout->setAlignment(BtnSinglePlayer, Qt::AlignHCenter); - - BtnNet = addButton(":/res/NetworkPlay.png", pageLayout, 2, 2, 1, 2, true); - BtnNet->setToolTip(tr("Network Game (Play a game across a network)")); - pageLayout->setAlignment(BtnNet, Qt::AlignHCenter); - - BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false); - pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter); - - mainNote = new QLabel(this); - mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); - mainNote->setWordWrap(true); - mainNote->setOpenExternalLinks(true); - - if(!isDevBuild) - { - QStringList Tips; - Tips << tr("Simply pick the same color as a friend to play together as a team. Each of you will still control his or her own hedgehogs but they'll win or lose together.", "Tips"); - Tips << tr("Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.", "Tips"); - Tips << tr("If you're unsure what to do and don't want to waste ammo, skip one round. But don't let too much time pass as there will be Sudden Death!", "Tips"); - Tips << tr("Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!", "Tips"); - Tips << tr("If you'd like to keep others from using your preferred nickname on the official server, register an account at http://www.hedgewars.org/.", "Tips"); - Tips << tr("You're bored of default gameplay? Try one of the missions - they'll offer different gameplay depending on the one you picked.", "Tips"); - Tips << tr("By default the game will always record the last game played as a demo. Select 'Local Game' and pick the 'Demos' button on the lower right corner to play or manage them.", "Tips"); - Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you've got problems, ask on our forums but please don't expect 24/7 support!", "Tips"); - Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you like it, help us with a small donation or contribute your own work!", "Tips"); - Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. Share it with your family and friends as you like!", "Tips"); - Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If someone sold you the game, you should try get a refund!", "Tips"); - Tips << tr("From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.", "Tips"); - Tips << tr("Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!", "Tips"); - Tips << tr("Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.", "Tips"); - Tips << tr("Always remember you're able to set up your own games in local and network/online play. You're not restricted to the 'Simple Game' option.", "Tips"); - Tips << tr("Connect one or more gamepads before starting the game to be able to assign their controls to your teams.", "Tips"); - Tips << tr("Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.", "Tips").arg("http://www.hedgewars.org/"); - Tips << tr("While playing you should give yourself a short break at least once an hour.", "Tips"); - Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.", "Tips"); - Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to update the associated drivers.", "Tips"); - Tips << tr("We're open to suggestions and constructive feedback. If you don't like something or got a great idea, let us know!", "Tips"); - Tips << tr("Especially while playing online be polite and always remember there might be some minors playing with or against you as well!", "Tips"); - Tips << tr("Special game modes such as 'Vampirism' or 'Karma' allow you to develop completely new tactics. Try them in a custom game!", "Tips"); - Tips << tr("The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.", "Tips"); - Tips << tr("You should never install Hedgewars on computers you don't own (school, university, work, etc.). Please ask the responsible person instead!", "Tips"); - Tips << tr("Hedgewars can be perfect for short games during breaks. Just ensure you don't add too many hedgehogs or use an huge map. Reducing time and health might help as well.", "Tips"); - Tips << tr("No hedgehogs were harmed in making this game.", "Tips"); - Tips << tr("There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump.", "Tips"); - Tips << tr("Afraid of falling off a cliff? Hold down [precise] to turn [left] or [right] without actually moving.", "Tips"); - Tips << tr("Some weapons require special strategies or just lots of training, so don't give up on a particular tool if you miss an enemy once.", "Tips"); - Tips << tr("Most weapons won't work once they touch the water. The Homing Bee as well as the Cake are exceptions to this.", "Tips"); - Tips << tr("The Old Limbuger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once.", "Tips"); - Tips << tr("The Piano Strike is the most damaging air strike. You'll lose the hedgehog performing it, so there's a huge downside as well.", "Tips"); - Tips << tr("The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.", "Tips"); - Tips << tr("Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water.", "Tips"); - Tips << tr("The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground.", "Tips"); - Tips << tr("If you're stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion.", "Tips"); - Tips << tr("The Cake's maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early.", "Tips"); - Tips << tr("The Flame Thrower is a weapon but it can be used for tunnel digging as well.", "Tips"); - Tips << tr("Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.", "Tips"); - Tips << tr("Want to know who's behind the game? Click on the Hedgewars logo in the main menu to see the credits.", "Tips"); - Tips << tr("Like Hedgewars? Become a fan on %1 or follow us on %2!", "Tips").arg("Facebook").arg("Twitter"); - Tips << tr("Feel free to draw your own graves, hats, flags or even maps and themes! But note that you'll have to share them somewhere to use them online.", "Tips"); - Tips << tr("Really want to wear a specific hat? Donate to us and receive an exclusive hat of your choice!", "Tips"); - // The following tip will require links to app store entries first. - //Tips << tr("Want to play Hedgewars any time? Grab the Mobile version for %1 and %2.", "Tips").arg("").arg(""); - // the ios version is located here: http://itunes.apple.com/us/app/hedgewars/id391234866 - Tips << tr("Keep your video card drivers up to date to avoid issues playing the game.", "Tips"); - Tips << tr("You're able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.", "Tips"); -#ifdef _WIN32 - Tips << tr("You can find your Hedgewars configuration files under \"My Documents\\Hedgewars\". Create backups or take the files with you, but don't edit them by hand.", "Tips"); -#elif defined __APPLE__ - Tips << tr("You can find your Hedgewars configuration files under \"Library/Application Support/Hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips"); -#else - Tips << tr("You can find your Hedgewars configuration files under \".hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips"); -#endif - mainNote->setText(QLabel::tr("Tip: ") + Tips[QTime(0, 0, 0).secsTo(QTime::currentTime()) % Tips.length()]); - } - else - mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!")); - - pageLayout->addWidget(mainNote, 5, 1, 1, 2); - - BtnSetup = addButton(":/res/Settings.png", pageLayout, 5, 3, true); - - //BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true); - BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true); - BtnInfo->setStyleSheet("border: transparent;background: transparent;"); - pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter); - //pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter); - - BtnExit = addButton(":/res/Exit.png", pageLayout, 5, 0, 1, 1, true); - BtnExit->setFixedHeight(BtnSetup->height()); - BtnExit->setStyleSheet("QPushButton{margin-top: 2px;}"); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagemain.h --- a/QTfrontend/pagemain.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_MAIN_H -#define PAGE_MAIN_H - -#include "AbstractPage.h" - -class PageMain : public AbstractPage -{ - Q_OBJECT - -public: - PageMain(QWidget* parent = 0); - - QPushButton *BtnSinglePlayer; - QPushButton *BtnNet; - QPushButton *BtnSetup; - QPushButton *BtnInfo; - QPushButton *BtnExit; - QPushButton *BtnDataDownload; - QLabel *mainNote; -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagemultiplayer.cpp --- a/QTfrontend/pagemultiplayer.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,47 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "pagemultiplayer.h" -#include "gamecfgwidget.h" -#include "teamselect.h" - -PageMultiplayer::PageMultiplayer(QWidget* parent) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true); - - gameCFG = new GameCFGWidget(this); - pageLayout->addWidget(gameCFG, 0, 0, 1, 2); - - QPushButton * btnSetup = new QPushButton(this); - btnSetup->setText(QPushButton::tr("Setup")); - connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked())); - pageLayout->addWidget(btnSetup, 1, 0, 1, 2); - - pageLayout->setRowStretch(2, 1); - - teamsSelect = new TeamSelWidget(this); - pageLayout->addWidget(teamsSelect, 0, 2, 3, 2); - - BtnStartMPGame = addButton(tr("Start"), pageLayout, 3, 3); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagemultiplayer.h --- a/QTfrontend/pagemultiplayer.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,45 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_MULTIPLAYER_H -#define PAGE_MULTIPLAYER_H - -#include "AbstractPage.h" - -class GameCFGWidget; -class TeamSelWidget; - -class PageMultiplayer : public AbstractPage -{ - Q_OBJECT - -public: - PageMultiplayer(QWidget* parent = 0); - - QPushButton *BtnBack; - GameCFGWidget *gameCFG; - TeamSelWidget *teamsSelect; - QPushButton *BtnStartMPGame; - -signals: - void SetupClicked(); -}; - -#endif - - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenet.cpp --- a/QTfrontend/pagenet.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include - -#include "pagenet.h" -#include "hwconsts.h" -#include "netudpwidget.h" - -PageNet::PageNet(QWidget* parent) : AbstractPage(parent) -{ - QFont * font14 = new QFont("MS Shell Dlg", 14); - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 1); - pageLayout->setColumnStretch(2, 1); - - BtnNetSvrStart = new QPushButton(this); - BtnNetSvrStart->setFont(*font14); - BtnNetSvrStart->setText(QPushButton::tr("Start server")); - BtnNetSvrStart->setVisible(haveServer); - pageLayout->addWidget(BtnNetSvrStart, 4, 2); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 4, 0, true); - - ConnGroupBox = new QGroupBox(this); - ConnGroupBox->setTitle(QGroupBox::tr("Net game")); - pageLayout->addWidget(ConnGroupBox, 2, 0, 1, 3); - GBClayout = new QGridLayout(ConnGroupBox); - GBClayout->setColumnStretch(0, 1); - GBClayout->setColumnStretch(1, 1); - GBClayout->setColumnStretch(2, 1); - - BtnNetConnect = new QPushButton(ConnGroupBox); - BtnNetConnect->setFont(*font14); - BtnNetConnect->setText(QPushButton::tr("Connect")); - GBClayout->addWidget(BtnNetConnect, 2, 2); - - tvServersList = new QTableView(ConnGroupBox); - tvServersList->setSelectionBehavior(QAbstractItemView::SelectRows); - GBClayout->addWidget(tvServersList, 1, 0, 1, 3); - - BtnUpdateSList = new QPushButton(ConnGroupBox); - BtnUpdateSList->setFont(*font14); - BtnUpdateSList->setText(QPushButton::tr("Update")); - GBClayout->addWidget(BtnUpdateSList, 2, 0); - - BtnSpecifyServer = new QPushButton(ConnGroupBox); - BtnSpecifyServer->setFont(*font14); - BtnSpecifyServer->setText(QPushButton::tr("Specify")); - GBClayout->addWidget(BtnSpecifyServer, 2, 1); - - connect(BtnNetConnect, SIGNAL(clicked()), this, SLOT(slotConnect())); -} - -void PageNet::updateServersList() -{ - tvServersList->setModel(new HWNetUdpModel(tvServersList)); - - tvServersList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); - - static_cast(tvServersList->model())->updateList(); - - connect(BtnUpdateSList, SIGNAL(clicked()), static_cast(tvServersList->model()), SLOT(updateList())); - connect(tvServersList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotConnect())); -} - -void PageNet::slotConnect() -{ - HWNetServersModel * model = static_cast(tvServersList->model()); - QModelIndex mi = tvServersList->currentIndex(); - if(!mi.isValid()) - { - QMessageBox::information(this, tr("Error"), tr("Please select server from the list above")); - return; - } - QString host = model->index(mi.row(), 1).data().toString(); - quint16 port = model->index(mi.row(), 2).data().toUInt(); - - emit connectClicked(host, port); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenet.h --- a/QTfrontend/pagenet.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_NET_H -#define PAGE_NET_H - -#include "AbstractPage.h" - -class PageNet : public AbstractPage -{ - Q_OBJECT - -public: - PageNet(QWidget* parent = 0); - - QPushButton* BtnUpdateSList; - QTableView * tvServersList; - QPushButton * BtnBack; - QPushButton * BtnNetConnect; - QPushButton * BtnNetSvrStart; - QPushButton * BtnSpecifyServer; - -private: - QGroupBox * ConnGroupBox; - QGridLayout * GBClayout; - -private slots: - void slotConnect(); - -public slots: - void updateServersList(); - -signals: - void connectClicked(const QString & host, quint16 port); -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenetgame.cpp --- a/QTfrontend/pagenetgame.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,124 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include - -#include "pagenetgame.h" -#include "gamecfgwidget.h" -#include "teamselect.h" -#include "chatwidget.h" - -PageNetGame::PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setSizeConstraint(QLayout::SetMinimumSize); - //pageLayout->setSpacing(1); - pageLayout->setColumnStretch(0, 50); - pageLayout->setColumnStretch(1, 50); - - // chatwidget - pChatWidget = new HWChatWidget(this, gameSettings, sdli, true); - pChatWidget->setShowReady(true); // show status bulbs by default - pChatWidget->setShowFollow(false); // don't show follow in nicks' context menus - pageLayout->addWidget(pChatWidget, 2, 0, 1, 2); - pageLayout->setRowStretch(1, 100); - pageLayout->setRowStretch(2, 100); - - pGameCFG = new GameCFGWidget(this); - pageLayout->addWidget(pGameCFG, 0, 0); - - QPushButton * btnSetup = new QPushButton(this); - btnSetup->setText(QPushButton::tr("Setup")); - connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked())); - pageLayout->addWidget(btnSetup, 1, 0); - - pNetTeamsWidget = new TeamSelWidget(this); - pNetTeamsWidget->setAcceptOuter(true); - pageLayout->addWidget(pNetTeamsWidget, 0, 1, 2, 1); - - - QHBoxLayout * bottomLayout = new QHBoxLayout; - pageLayout->addLayout(bottomLayout, 4, 0, 1, 2); - - BtnBack = addButton(":/res/Exit.png", bottomLayout, 0, true); - - leRoomName = new QLineEdit(this); - leRoomName->setMaxLength(60); - leRoomName->setMinimumWidth(200); - leRoomName->setMaximumWidth(400); - bottomLayout->addWidget(leRoomName, 8,0); - BtnUpdate = addButton(QAction::tr("Update"), bottomLayout, 1, false); - - BtnGo = new QPushButton(this); - BtnGo->setToolTip(QPushButton::tr("Ready")); - BtnGo->setIcon(QIcon(":/res/lightbulb_off.png")); - BtnGo->setIconSize(QSize(25, 34)); - BtnGo->setMinimumWidth(50); - BtnGo->setMinimumHeight(50); - bottomLayout->addWidget(BtnGo, 4); - - - BtnMaster = addButton(tr("Control"), bottomLayout, 2); - QMenu * menu = new QMenu(BtnMaster); - restrictJoins = new QAction(QAction::tr("Restrict Joins"), menu); - restrictJoins->setCheckable(true); - restrictTeamAdds = new QAction(QAction::tr("Restrict Team Additions"), menu); - restrictTeamAdds->setCheckable(true); - //menu->addAction(startGame); - menu->addAction(restrictJoins); - menu->addAction(restrictTeamAdds); - - BtnMaster->setMenu(menu); - - BtnStart = addButton(QAction::tr("Start"), bottomLayout, 3); - - bottomLayout->insertStretch(3, 100); - - connect(BtnUpdate, SIGNAL(clicked()), this, SLOT(onUpdateClick())); -} - -void PageNetGame::setReadyStatus(bool isReady) -{ - if(isReady) - BtnGo->setIcon(QIcon(":/res/lightbulb_on.png")); - else - BtnGo->setIcon(QIcon(":/res/lightbulb_off.png")); -} - -void PageNetGame::onUpdateClick() -{ - if (leRoomName->text().size()) - emit askForUpdateRoomName(leRoomName->text()); - else - QMessageBox::critical(this, - tr("Error"), - tr("Please enter room name"), - tr("OK")); -} - -void PageNetGame::setMasterMode(bool isMaster) -{ - BtnMaster->setVisible(isMaster); - BtnStart->setVisible(isMaster); - BtnUpdate->setVisible(isMaster); - leRoomName->setVisible(isMaster); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenetgame.h --- a/QTfrontend/pagenetgame.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,62 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_NETGAME_H -#define PAGE_NETGAME_H - -#include "AbstractPage.h" -#include "SDLs.h" - -class HWChatWidget; -class TeamSelWidget; -class GameCFGWidget; - -class PageNetGame : public AbstractPage -{ - Q_OBJECT - -public: - PageNetGame(QWidget* parent, QSettings * config, SDLInteraction * sdli); - - QPushButton *BtnBack; - QPushButton *BtnGo; - QPushButton *BtnMaster; - QPushButton *BtnStart; - QPushButton *BtnUpdate; - - QLineEdit * leRoomName; - - QAction * restrictJoins; - QAction * restrictTeamAdds; - - HWChatWidget* pChatWidget; - - TeamSelWidget* pNetTeamsWidget; - GameCFGWidget* pGameCFG; - -public slots: - void setReadyStatus(bool isReady); - void onUpdateClick(); - void setMasterMode(bool isMaster); - -signals: - void SetupClicked(); - void askForUpdateRoomName(const QString &); -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenetserver.cpp --- a/QTfrontend/pagenetserver.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,88 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include - -#include "pagenetserver.h" - -PageNetServer::PageNetServer(QWidget* parent) : AbstractPage(parent) -{ - QFont * font14 = new QFont("MS Shell Dlg", 14); - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 1); - pageLayout->setColumnStretch(2, 1); - - pageLayout->setRowStretch(0, 1); - pageLayout->setRowStretch(1, 0); - - BtnBack =addButton(":/res/Exit.png", pageLayout, 1, 0, true); - - BtnStart = new QPushButton(this); - BtnStart->setFont(*font14); - BtnStart->setText(QPushButton::tr("Start")); - pageLayout->addWidget(BtnStart, 1, 2); - - QWidget * wg = new QWidget(this); - pageLayout->addWidget(wg, 0, 0, 1, 3); - - QGridLayout * wgLayout = new QGridLayout(wg); - wgLayout->setColumnStretch(0, 1); - wgLayout->setColumnStretch(1, 3); - wgLayout->setColumnStretch(2, 1); - - wgLayout->setRowStretch(0, 0); - wgLayout->setRowStretch(1, 1); - - QGroupBox * gb = new QGroupBox(wg); - wgLayout->addWidget(gb, 0, 1); - - QGridLayout * gbLayout = new QGridLayout(gb); - - labelSD = new QLabel(gb); - labelSD->setText(QLabel::tr("Server name:")); - gbLayout->addWidget(labelSD, 0, 0); - - leServerDescr = new QLineEdit(gb); - gbLayout->addWidget(leServerDescr, 0, 1); - - labelPort = new QLabel(gb); - labelPort->setText(QLabel::tr("Server port:")); - gbLayout->addWidget(labelPort, 1, 0); - - sbPort = new QSpinBox(gb); - sbPort->setMinimum(0); - sbPort->setMaximum(65535); - gbLayout->addWidget(sbPort, 1, 1); - - BtnDefault = new QPushButton(gb); - BtnDefault->setText(QPushButton::tr("default")); - gbLayout->addWidget(BtnDefault, 1, 2); - - connect(BtnDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort())); -} - -void PageNetServer::setDefaultPort() -{ - sbPort->setValue(46631); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenetserver.h --- a/QTfrontend/pagenetserver.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_NETSERVER_H -#define PAGE_NETSERVER_H - -#include "AbstractPage.h" - -class PageNetServer : public AbstractPage -{ - Q_OBJECT - -public: - PageNetServer(QWidget* parent = 0); - - QPushButton *BtnBack; - QPushButton *BtnStart; - QPushButton *BtnDefault; - QLabel *labelSD; - QLineEdit *leServerDescr; - QLabel *labelPort; - QSpinBox *sbPort; - -private slots: - void setDefaultPort(); -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenettype.cpp --- a/QTfrontend/pagenettype.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,41 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "pagenettype.h" - -PageNetType::PageNetType(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setRowStretch(0, 10); - pageLayout->setRowStretch(3, 10); - - pageLayout->setColumnStretch(1, 10); - pageLayout->setColumnStretch(2, 20); - pageLayout->setColumnStretch(3, 10); - - BtnLAN = addButton(tr("LAN game"), pageLayout, 1, 2); - BtnOfficialServer = addButton(tr("Official server"), pageLayout, 2, 2); - - // hack: temporary deactivated - requires server modifications that aren't backward compatible (yet) - //BtnOfficialServer->setEnabled(false); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 4, 0, true); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagenettype.h --- a/QTfrontend/pagenettype.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_NETTYPE_H -#define PAGE_NETTYPE_H - -#include "AbstractPage.h" - -class PageNetType : public AbstractPage -{ - Q_OBJECT - -public: - PageNetType(QWidget* parent = 0); - - QPushButton * BtnBack; - QPushButton * BtnLAN; - QPushButton * BtnOfficialServer; -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageoptions.cpp --- a/QTfrontend/pageoptions.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,457 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "pageoptions.h" -#include "hwconsts.h" -#include "fpsedit.h" -#include "igbox.h" - -PageOptions::PageOptions(QWidget* parent) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 100); - pageLayout->setColumnStretch(1, 100); - pageLayout->setColumnStretch(2, 100); - pageLayout->setRowStretch(0, 0); - //pageLayout->setRowStretch(1, 100); - pageLayout->setRowStretch(2, 0); - pageLayout->setContentsMargins(7, 7, 7, 0); - pageLayout->setSpacing(0); - - - QGroupBox * gbTwoBoxes = new QGroupBox(this); - pageLayout->addWidget(gbTwoBoxes, 0, 0, 1, 3); - QGridLayout * gbTBLayout = new QGridLayout(gbTwoBoxes); - gbTBLayout->setMargin(0); - gbTBLayout->setSpacing(0); - gbTBLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); - - QPixmap pmNew(":/res/new.png"); - QPixmap pmEdit(":/res/edit.png"); - QPixmap pmDelete(":/res/delete.png"); - - { - teamsBox = new IconedGroupBox(this); - //teamsBox->setContentTopPadding(0); - //teamsBox->setAttribute(Qt::WA_PaintOnScreen, true); - teamsBox->setIcon(QIcon(":/res/teamicon.png")); - teamsBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - teamsBox->setTitle(QGroupBox::tr("Teams")); - - QGridLayout * GBTlayout = new QGridLayout(teamsBox); - - CBTeamName = new QComboBox(teamsBox); - GBTlayout->addWidget(CBTeamName, 0, 0); - - BtnNewTeam = new QPushButton(teamsBox); - BtnNewTeam->setToolTip(tr("New team")); - BtnNewTeam->setIconSize(pmNew.size()); - BtnNewTeam->setIcon(pmNew); - BtnNewTeam->setMaximumWidth(pmNew.width() + 6); - GBTlayout->addWidget(BtnNewTeam, 0, 1); - - BtnEditTeam = new QPushButton(teamsBox); - BtnEditTeam->setToolTip(tr("Edit team")); - BtnEditTeam->setIconSize(pmEdit.size()); - BtnEditTeam->setIcon(pmEdit); - BtnEditTeam->setMaximumWidth(pmEdit.width() + 6); - GBTlayout->addWidget(BtnEditTeam, 0, 2); - - BtnDeleteTeam = new QPushButton(teamsBox); - BtnDeleteTeam->setToolTip(tr("Delete team")); - BtnDeleteTeam->setIconSize(pmDelete.size()); - BtnDeleteTeam->setIcon(pmDelete); - BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6); - GBTlayout->addWidget(BtnDeleteTeam, 0, 3); - - LblNoEditTeam = new QLabel(teamsBox); - LblNoEditTeam->setText(tr("You can't edit teams from team selection. Go back to main menu to add, edit or delete teams.")); - LblNoEditTeam->setWordWrap(true); - LblNoEditTeam->setVisible(false); - GBTlayout->addWidget(LblNoEditTeam, 0, 0); - - gbTBLayout->addWidget(teamsBox, 0, 0); - } - - { - IconedGroupBox* groupWeapons = new IconedGroupBox(this); - - //groupWeapons->setContentTopPadding(0); - //groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - groupWeapons->setIcon(QIcon(":/res/weaponsicon.png")); - groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - groupWeapons->setTitle(QGroupBox::tr("Schemes and Weapons")); - QGridLayout * WeaponsLayout = new QGridLayout(groupWeapons); - - QLabel* SchemeLabel = new QLabel(groupWeapons); - SchemeLabel->setText(QLabel::tr("Game scheme")); - WeaponsLayout->addWidget(SchemeLabel, 1, 0); - - SchemesName = new QComboBox(groupWeapons); - WeaponsLayout->addWidget(SchemesName, 1, 1); - - SchemeNew = new QPushButton(groupWeapons); - SchemeNew->setToolTip(tr("New scheme")); - SchemeNew->setIconSize(pmNew.size()); - SchemeNew->setIcon(pmNew); - SchemeNew->setMaximumWidth(pmNew.width() + 6); - WeaponsLayout->addWidget(SchemeNew, 1, 2); - - SchemeEdit = new QPushButton(groupWeapons); - SchemeEdit->setToolTip(tr("Edit scheme")); - SchemeEdit->setIconSize(pmEdit.size()); - SchemeEdit->setIcon(pmEdit); - SchemeEdit->setMaximumWidth(pmEdit.width() + 6); - WeaponsLayout->addWidget(SchemeEdit, 1, 3); - - SchemeDelete = new QPushButton(groupWeapons); - SchemeDelete->setToolTip(tr("Delete scheme")); - SchemeDelete->setIconSize(pmDelete.size()); - SchemeDelete->setIcon(pmDelete); - SchemeDelete->setMaximumWidth(pmDelete.width() + 6); - WeaponsLayout->addWidget(SchemeDelete, 1, 4); - - QLabel* WeaponLabel = new QLabel(groupWeapons); - WeaponLabel->setText(QLabel::tr("Weapons")); - WeaponsLayout->addWidget(WeaponLabel, 2, 0); - - WeaponsName = new QComboBox(groupWeapons); - WeaponsLayout->addWidget(WeaponsName, 2, 1); - - WeaponNew = new QPushButton(groupWeapons); - WeaponNew->setToolTip(tr("New weapon set")); - WeaponNew->setIconSize(pmNew.size()); - WeaponNew->setIcon(pmNew); - WeaponNew->setMaximumWidth(pmNew.width() + 6); - WeaponsLayout->addWidget(WeaponNew, 2, 2); - - WeaponEdit = new QPushButton(groupWeapons); - WeaponEdit->setToolTip(tr("Edit weapon set")); - WeaponEdit->setIconSize(pmEdit.size()); - WeaponEdit->setIcon(pmEdit); - WeaponEdit->setMaximumWidth(pmEdit.width() + 6); - WeaponsLayout->addWidget(WeaponEdit, 2, 3); - - WeaponDelete = new QPushButton(groupWeapons); - WeaponDelete->setToolTip(tr("Delete weapon set")); - WeaponDelete->setIconSize(pmDelete.size()); - WeaponDelete->setIcon(pmDelete); - WeaponDelete->setMaximumWidth(pmDelete.width() + 6); - WeaponsLayout->addWidget(WeaponDelete, 2, 4); - - WeaponTooltip = new QCheckBox(this); - WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips")); - WeaponsLayout->addWidget(WeaponTooltip, 3, 0, 1, 4); - - gbTBLayout->addWidget(groupWeapons, 1, 0); - } - - { - IconedGroupBox* groupMisc = new IconedGroupBox(this); - //groupMisc->setContentTopPadding(0); - groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - groupMisc->setIcon(QIcon(":/res/miscicon.png")); - //groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - groupMisc->setTitle(QGroupBox::tr("Misc")); - QGridLayout * MiscLayout = new QGridLayout(groupMisc); - - labelNN = new QLabel(groupMisc); - labelNN->setText(QLabel::tr("Net nick")); - MiscLayout->addWidget(labelNN, 0, 0); - - editNetNick = new QLineEdit(groupMisc); - editNetNick->setMaxLength(20); - editNetNick->setText(QLineEdit::tr("unnamed")); - connect(editNetNick, SIGNAL(editingFinished()), this, SLOT(trimNetNick())); - MiscLayout->addWidget(editNetNick, 0, 1); - - labelNetPassword = new QLabel(groupMisc); - labelNetPassword->setText(QLabel::tr("Password")); - MiscLayout->addWidget(labelNetPassword, 1, 0); - - editNetPassword = new QLineEdit(groupMisc); - editNetPassword->setEchoMode(QLineEdit::Password); - MiscLayout->addWidget(editNetPassword, 1, 1); - - QLabel *labelLanguage = new QLabel(groupMisc); - labelLanguage->setText(QLabel::tr("Locale") + " *"); - MiscLayout->addWidget(labelLanguage, 2, 0); - - CBLanguage = new QComboBox(groupMisc); - QDir tmpdir; - tmpdir.cd(cfgdir->absolutePath()); - tmpdir.cd("Data/Locale"); - tmpdir.setFilter(QDir::Files); - QStringList locs = tmpdir.entryList(QStringList("hedgewars_*.qm")); - CBLanguage->addItem(QComboBox::tr("(System default)"), QString("")); - for(int i = 0; i < locs.count(); i++) - { - QLocale loc(locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1")); - CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name()); - } - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Locale"); - tmpdir.setFilter(QDir::Files); - QStringList tmplist = tmpdir.entryList(QStringList("hedgewars_*.qm")); - for(int i = 0; i < tmplist.count(); i++) - { - if (locs.contains(tmplist[i])) continue; - QLocale loc(tmplist[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1")); - CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name()); - } - - MiscLayout->addWidget(CBLanguage, 2, 1); - - CBAltDamage = new QCheckBox(groupMisc); - CBAltDamage->setText(QCheckBox::tr("Alternative damage show")); - MiscLayout->addWidget(CBAltDamage, 3, 0, 1, 2); - - CBNameWithDate = new QCheckBox(groupMisc); - CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name")); - MiscLayout->addWidget(CBNameWithDate, 4, 0, 1, 2); - - BtnAssociateFiles = new QPushButton(groupMisc); - BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions")); - BtnAssociateFiles->setEnabled(!custom_data && !custom_config); - MiscLayout->addWidget(BtnAssociateFiles, 5, 0, 1, 2); - -#ifdef __APPLE__ -#ifdef SPARKLE_ENABLED - CBAutoUpdate = new QCheckBox(groupMisc); - CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup")); - MiscLayout->addWidget(CBAutoUpdate, 6, 0, 1, 3); -#endif -#endif - gbTBLayout->addWidget(groupMisc, 2, 0); - } - - { - AGGroupBox = new IconedGroupBox(this); - //AGGroupBox->setContentTopPadding(0); - AGGroupBox->setIcon(QIcon(":/res/graphicsicon.png")); - //AGGroupBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - AGGroupBox->setTitle(QGroupBox::tr("Audio/Graphic options")); - - QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox); - QHBoxLayout * GBAreslayout = new QHBoxLayout(0); - QHBoxLayout * GBAstereolayout = new QHBoxLayout(0); - QHBoxLayout * GBAqualayout = new QHBoxLayout(0); - - CBFrontendFullscreen = new QCheckBox(AGGroupBox); - CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen")); - GBAlayout->addWidget(CBFrontendFullscreen); - - CBFrontendEffects = new QCheckBox(AGGroupBox); - CBFrontendEffects->setText(QCheckBox::tr("Frontend effects") + " *"); - GBAlayout->addWidget(CBFrontendEffects); - - CBEnableFrontendSound = new QCheckBox(AGGroupBox); - CBEnableFrontendSound->setText(QCheckBox::tr("Enable frontend sounds")); - GBAlayout->addWidget(CBEnableFrontendSound); - - CBEnableFrontendMusic = new QCheckBox(AGGroupBox); - CBEnableFrontendMusic->setText(QCheckBox::tr("Enable frontend music")); - GBAlayout->addWidget(CBEnableFrontendMusic); - - QFrame * hr = new QFrame(AGGroupBox); - hr->setFrameStyle(QFrame::HLine); - hr->setLineWidth(3); - hr->setFixedHeight(10); - GBAlayout->addWidget(hr); - - QLabel * resolution = new QLabel(AGGroupBox); - resolution->setText(QLabel::tr("Resolution")); - GBAreslayout->addWidget(resolution); - - CBResolution = new QComboBox(AGGroupBox); - GBAreslayout->addWidget(CBResolution); - GBAlayout->addLayout(GBAreslayout); - connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int))); - - CBFullscreen = new QCheckBox(AGGroupBox); - CBFullscreen->setText(QCheckBox::tr("Fullscreen")); - GBAlayout->addWidget(CBFullscreen); - connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int))); - - QLabel * quality = new QLabel(AGGroupBox); - quality->setText(QLabel::tr("Quality")); - quality->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - GBAqualayout->addWidget(quality); - - SLQuality = new QSlider(Qt::Horizontal, AGGroupBox); - SLQuality->setTickPosition(QSlider::TicksBelow); - SLQuality->setMaximum(5); - SLQuality->setMinimum(0); - SLQuality->setFixedWidth(150); - GBAqualayout->addWidget(SLQuality); - GBAlayout->addLayout(GBAqualayout); - connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int))); - - QLabel * stereo = new QLabel(AGGroupBox); - stereo->setText(QLabel::tr("Stereo rendering")); - GBAstereolayout->addWidget(stereo); - - CBStereoMode = new QComboBox(AGGroupBox); - CBStereoMode->addItem(QComboBox::tr("Disabled")); - CBStereoMode->addItem(QComboBox::tr("Red/Cyan")); - CBStereoMode->addItem(QComboBox::tr("Cyan/Red")); - CBStereoMode->addItem(QComboBox::tr("Red/Blue")); - CBStereoMode->addItem(QComboBox::tr("Blue/Red")); - CBStereoMode->addItem(QComboBox::tr("Red/Green")); - CBStereoMode->addItem(QComboBox::tr("Green/Red")); - CBStereoMode->addItem(QComboBox::tr("Side-by-side")); - CBStereoMode->addItem(QComboBox::tr("Top-Bottom")); - CBStereoMode->addItem(QComboBox::tr("Wiggle")); - CBStereoMode->addItem(QComboBox::tr("Red/Cyan grayscale")); - CBStereoMode->addItem(QComboBox::tr("Cyan/Red grayscale")); - CBStereoMode->addItem(QComboBox::tr("Red/Blue grayscale")); - CBStereoMode->addItem(QComboBox::tr("Blue/Red grayscale")); - CBStereoMode->addItem(QComboBox::tr("Red/Green grayscale")); - CBStereoMode->addItem(QComboBox::tr("Green/Red grayscale")); - connect(CBStereoMode, SIGNAL(currentIndexChanged(int)), this, SLOT(forceFullscreen(int))); - - GBAstereolayout->addWidget(CBStereoMode); - GBAlayout->addLayout(GBAstereolayout); - - hr = new QFrame(AGGroupBox); - hr->setFrameStyle(QFrame::HLine); - hr->setLineWidth(3); - hr->setFixedHeight(10); - GBAlayout->addWidget(hr); - - QHBoxLayout * GBAvollayout = new QHBoxLayout(0); - QLabel * vol = new QLabel(AGGroupBox); - vol->setText(QLabel::tr("Initial sound volume")); - GBAvollayout->addWidget(vol); - GBAlayout->addLayout(GBAvollayout); - volumeBox = new QSpinBox(AGGroupBox); - volumeBox->setRange(0, 100); - volumeBox->setSingleStep(5); - GBAvollayout->addWidget(volumeBox); - - CBEnableSound = new QCheckBox(AGGroupBox); - CBEnableSound->setText(QCheckBox::tr("Enable sound")); - GBAlayout->addWidget(CBEnableSound); - - CBEnableMusic = new QCheckBox(AGGroupBox); - CBEnableMusic->setText(QCheckBox::tr("Enable music")); - GBAlayout->addWidget(CBEnableMusic); - - hr = new QFrame(AGGroupBox); - hr->setFrameStyle(QFrame::HLine); - hr->setLineWidth(3); - hr->setFixedHeight(10); - GBAlayout->addWidget(hr); - - QHBoxLayout * GBAfpslayout = new QHBoxLayout(0); - QLabel * maxfps = new QLabel(AGGroupBox); - maxfps->setText(QLabel::tr("FPS limit")); - GBAfpslayout->addWidget(maxfps); - GBAlayout->addLayout(GBAfpslayout); - fpsedit = new FPSEdit(AGGroupBox); - GBAfpslayout->addWidget(fpsedit); - - CBShowFPS = new QCheckBox(AGGroupBox); - CBShowFPS->setText(QCheckBox::tr("Show FPS")); - GBAlayout->addWidget(CBShowFPS); - - hr = new QFrame(AGGroupBox); - hr->setFrameStyle(QFrame::HLine); - hr->setLineWidth(3); - hr->setFixedHeight(10); - GBAlayout->addWidget(hr); - - QLabel *restartNote = new QLabel(this); - restartNote->setText(QString("* ") + QLabel::tr("Restart game to apply")); - restartNote->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); - GBAlayout->addWidget(restartNote); - - gbTBLayout->addWidget(AGGroupBox, 0, 1, 3, 1); - } - - BtnSaveOptions = addButton(":/res/Save.png", pageLayout, 2, 2, true); - BtnSaveOptions->setStyleSheet("QPushButton{margin: 12px 0px 12px 0px;}"); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 2, 0, true); - BtnBack->setFixedHeight(BtnSaveOptions->height()); - BtnBack->setFixedWidth(BtnBack->width()+2); - BtnBack->setStyleSheet("QPushButton{margin: 22px 0 9px 2px;}"); - - previousQuality = this->SLQuality->value(); - previousResolutionIndex = this->CBResolution->currentIndex(); - previousFullscreenValue = this->CBFullscreen->isChecked(); -} - -void PageOptions::forceFullscreen(int index) -{ - bool forced = (index == 7 || index == 8 || index == 9); - - if (index != 0) { - this->SLQuality->setValue(this->SLQuality->maximum()); - this->SLQuality->setEnabled(false); - this->CBFullscreen->setEnabled(!forced); - this->CBFullscreen->setChecked(forced ? true : previousFullscreenValue); - this->CBResolution->setCurrentIndex(forced ? 0 : previousResolutionIndex); - } else { - this->SLQuality->setEnabled(true); - this->CBFullscreen->setEnabled(true); - this->SLQuality->setValue(previousQuality); - this->CBFullscreen->setChecked(previousFullscreenValue); - this->CBResolution->setCurrentIndex(previousResolutionIndex); - } -} - -void PageOptions::setQuality(int value) -{ - int index = this->CBStereoMode->currentIndex(); - if (index == 0) - previousQuality = this->SLQuality->value(); -} - -void PageOptions::setFullscreen(int state) -{ - int index = this->CBStereoMode->currentIndex(); - if (index != 7 && index != 8 && index != 9) - previousFullscreenValue = this->CBFullscreen->isChecked(); -} - -void PageOptions::setResolution(int state) -{ - int index = this->CBStereoMode->currentIndex(); - if (index != 7 && index != 8 && index != 9) - previousResolutionIndex = this->CBResolution->currentIndex(); -} - -void PageOptions::trimNetNick() -{ - editNetNick->setText(editNetNick->text().trimmed()); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageoptions.h --- a/QTfrontend/pageoptions.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,94 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_OPTIONS_H -#define PAGE_OPTIONS_H - -#include "AbstractPage.h" - -class FPSEdit; -class IconedGroupBox; - -class PageOptions : public AbstractPage -{ - Q_OBJECT - -public: - PageOptions(QWidget* parent = 0); - - QCheckBox *WeaponTooltip; - QPushButton *WeaponNew; - QPushButton *WeaponEdit; - QPushButton *WeaponDelete; - QComboBox *WeaponsName; - QPushButton *SchemeNew; - QPushButton *SchemeEdit; - QPushButton *SchemeDelete; - QComboBox *SchemesName; - - QComboBox *CBLanguage; - - QPushButton *BtnBack; - IconedGroupBox *teamsBox; - QPushButton *BtnNewTeam; - QPushButton *BtnEditTeam; - QPushButton *BtnDeleteTeam; - QPushButton *BtnAssociateFiles; - QLabel *LblNoEditTeam; - QComboBox *CBTeamName; - IconedGroupBox *AGGroupBox; - QComboBox *CBResolution; - QComboBox *CBStereoMode; - QCheckBox *CBEnableSound; - QCheckBox *CBEnableFrontendSound; - QCheckBox *CBEnableMusic; - QCheckBox *CBEnableFrontendMusic; - QCheckBox *CBFullscreen; - QCheckBox *CBFrontendFullscreen; - QCheckBox *CBShowFPS; - QCheckBox *CBAltDamage; - QCheckBox *CBNameWithDate; -#ifdef __APPLE__ - QCheckBox *CBAutoUpdate; -#endif - - FPSEdit *fpsedit; - QPushButton *BtnSaveOptions; - QLabel *labelNN; - QLabel *labelNetPassword; - QSpinBox * volumeBox; - QLineEdit *editNetNick; - QLineEdit *editNetPassword; - QSlider *SLQuality; - QCheckBox *CBFrontendEffects; - -private: - bool previousFullscreenValue; - int previousResolutionIndex; - int previousQuality; - -private slots: - void forceFullscreen(int index); - void setFullscreen(int state); - void setResolution(int state); - void setQuality(int value); - void trimNetNick(); -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageplayrecord.cpp --- a/QTfrontend/pageplayrecord.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,157 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "hwconsts.h" -#include "pageplayrecord.h" - -PagePlayDemo::PagePlayDemo(QWidget* parent) : AbstractPage(parent) -{ - QFont * font14 = new QFont("MS Shell Dlg", 14); - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 2); - pageLayout->setColumnStretch(2, 1); - pageLayout->setRowStretch(2, 100); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true); - - BtnPlayDemo = new QPushButton(this); - BtnPlayDemo->setFont(*font14); - BtnPlayDemo->setText(QPushButton::tr("Play demo")); - pageLayout->addWidget(BtnPlayDemo, 3, 2); - - BtnRenameRecord = new QPushButton(this); - BtnRenameRecord->setText(QPushButton::tr("Rename")); - pageLayout->addWidget(BtnRenameRecord, 0, 2); - - BtnRemoveRecord = new QPushButton(this); - BtnRemoveRecord->setText(QPushButton::tr("Delete")); - pageLayout->addWidget(BtnRemoveRecord, 1, 2); - - DemosList = new QListWidget(this); - DemosList->setGeometry(QRect(170, 10, 311, 311)); - pageLayout->addWidget(DemosList, 0, 1, 3, 1); - - connect(BtnRenameRecord, SIGNAL(clicked()), this, SLOT(renameRecord())); - connect(BtnRemoveRecord, SIGNAL(clicked()), this, SLOT(removeRecord())); -} - -void PagePlayDemo::FillFromDir(RecordType rectype) -{ - QDir dir; - QString extension; - - recType = rectype; - - dir.cd(cfgdir->absolutePath()); - if (rectype == RT_Demo) - { - dir.cd("Demos"); - extension = "hwd"; - BtnPlayDemo->setText(QPushButton::tr("Play demo")); - } else - { - dir.cd("Saves"); - extension = "hws"; - BtnPlayDemo->setText(QPushButton::tr("Load")); - } - dir.setFilter(QDir::Files); - - QStringList sl = dir.entryList(QStringList(QString("*.%2.%1").arg(extension, *cProtoVer))); - sl.replaceInStrings(QRegExp(QString("^(.*)\\.%2\\.%1$").arg(extension, *cProtoVer)), "\\1"); - - DemosList->clear(); - DemosList->addItems(sl); - - for (int i = 0; i < DemosList->count(); ++i) - { - DemosList->item(i)->setData(Qt::UserRole, dir.absoluteFilePath(QString("%1.%3.%2").arg(sl[i], extension, *cProtoVer))); - DemosList->item(i)->setIcon(recType == RT_Demo ? QIcon(":/res/file_demo.png") : QIcon(":/res/file_save.png")); - } -} - -void PagePlayDemo::renameRecord() -{ - QListWidgetItem * curritem = DemosList->currentItem(); - if (!curritem) - { - QMessageBox::critical(this, - tr("Error"), - tr("Please select record from the list"), - tr("OK")); - return ; - } - QFile rfile(curritem->data(Qt::UserRole).toString()); - - QFileInfo finfo(rfile); - - bool ok; - - QString newname = QInputDialog::getText(this, tr("Rename dialog"), tr("Enter new file name:"), QLineEdit::Normal, finfo.completeBaseName().replace("." + *cProtoVer, ""), &ok); - - if(ok && newname.size()) - { - QString newfullname = QString("%1/%2.%3.%4") - .arg(finfo.absolutePath()) - .arg(newname) - .arg(*cProtoVer) - .arg(finfo.suffix()); - - ok = rfile.rename(newfullname); - if(!ok) - QMessageBox::critical(this, tr("Error"), tr("Cannot rename to") + newfullname); - else - FillFromDir(recType); - } -} - -void PagePlayDemo::removeRecord() -{ - QListWidgetItem * curritem = DemosList->currentItem(); - if (!curritem) - { - QMessageBox::critical(this, - tr("Error"), - tr("Please select record from the list"), - tr("OK")); - return ; - } - QFile rfile(curritem->data(Qt::UserRole).toString()); - - bool ok; - - ok = rfile.remove(); - if(!ok) - QMessageBox::critical(this, tr("Error"), tr("Cannot delete file")); - else - FillFromDir(recType); -} - -bool PagePlayDemo::isSave() -{ - return recType == RT_Save; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageplayrecord.h --- a/QTfrontend/pageplayrecord.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PLAYRECORDPAGE_H -#define PLAYRECORDPAGE_H - -#include - -#include "AbstractPage.h" - -class QPushButton; -class QListWidget; - -class PagePlayDemo : public AbstractPage -{ - Q_OBJECT - -public: - enum RecordType { - RT_Demo, - RT_Save - }; - - PagePlayDemo(QWidget* parent = 0); - - void FillFromDir(RecordType rectype); - bool isSave(); - - QPushButton *BtnBack; - QPushButton *BtnPlayDemo; - QPushButton *BtnRenameRecord; - QPushButton *BtnRemoveRecord; - QListWidget *DemosList; - -private: - RecordType recType; - -private slots: - void renameRecord(); - void removeRecord(); -}; - - -#endif // PLAYRECORDPAGE_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageroomslist.cpp --- a/QTfrontend/pageroomslist.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,396 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ammoSchemeModel.h" -#include "pageroomslist.h" -#include "hwconsts.h" -#include "chatwidget.h" - -PageRoomsList::PageRoomsList(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - - QHBoxLayout * newRoomLayout = new QHBoxLayout(); - QLabel * roomNameLabel = new QLabel(this); - roomNameLabel->setText(tr("Room Name:")); - roomName = new QLineEdit(this); - roomName->setMaxLength(60); - newRoomLayout->addWidget(roomNameLabel); - newRoomLayout->addWidget(roomName); - pageLayout->addLayout(newRoomLayout, 0, 0, 1, 2); - - roomsList = new QTableWidget(this); - roomsList->setSelectionBehavior(QAbstractItemView::SelectRows); - roomsList->verticalHeader()->setVisible(false); - roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive); - roomsList->setAlternatingRowColors(true); - roomsList->setShowGrid(false); - roomsList->setSelectionMode(QAbstractItemView::SingleSelection); - pageLayout->addWidget(roomsList, 1, 0, 3, 2); - pageLayout->setRowStretch(2, 100); - - QHBoxLayout * filterLayout = new QHBoxLayout(); - - QLabel * stateLabel = new QLabel(this); - stateLabel->setText(tr("State:")); - CBState = new QComboBox(this); - CBState->addItem(QComboBox::tr("Any")); - CBState->addItem(QComboBox::tr("In lobby")); - CBState->addItem(QComboBox::tr("In progress")); - filterLayout->addWidget(stateLabel); - filterLayout->addWidget(CBState); - filterLayout->addSpacing(30); - - QLabel * ruleLabel = new QLabel(this); - ruleLabel->setText(tr("Rules:")); - CBRules = new QComboBox(this); - CBRules->addItem(QComboBox::tr("Any")); - // not the most elegant solution but it works - ammoSchemeModel = new AmmoSchemeModel(this, NULL); - for (int i = 0; i < ammoSchemeModel->predefSchemesNames.count(); i++) - CBRules->addItem(ammoSchemeModel->predefSchemesNames.at(i).toAscii().constData()); - filterLayout->addWidget(ruleLabel); - filterLayout->addWidget(CBRules); - filterLayout->addSpacing(30); - - QLabel * weaponLabel = new QLabel(this); - weaponLabel->setText(tr("Weapons:")); - CBWeapons = new QComboBox(this); - CBWeapons->addItem(QComboBox::tr("Any")); - for (int i = 0; i < cDefaultAmmos.count(); i++) { - QPair ammo = cDefaultAmmos.at(i); - CBWeapons->addItem(ammo.first.toAscii().constData()); - } - filterLayout->addWidget(weaponLabel); - filterLayout->addWidget(CBWeapons); - filterLayout->addSpacing(30); - - QLabel * searchLabel = new QLabel(this); - searchLabel->setText(tr("Search:")); - searchText = new QLineEdit(this); - searchText->setMaxLength(60); - filterLayout->addWidget(searchLabel); - filterLayout->addWidget(searchText); - - pageLayout->addLayout(filterLayout, 4, 0, 1, 2); - - chatWidget = new HWChatWidget(this, gameSettings, sdli, false); - pageLayout->addWidget(chatWidget, 5, 0, 1, 3); - pageLayout->setRowStretch(5, 350); - - BtnCreate = addButton(tr("Create"), pageLayout, 0, 2); - BtnJoin = addButton(tr("Join"), pageLayout, 1, 2); - BtnRefresh = addButton(tr("Refresh"), pageLayout, 3, 2); - BtnClear = addButton(tr("Clear"), pageLayout, 4, 2); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 6, 0, true); - - lblCount = new QLabel(this); - pageLayout->addWidget(lblCount, 6, 1, Qt::AlignHCenter); - lblCount->setText("?"); - lblCount->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); - - connect(chatWidget, SIGNAL(nickCountUpdate(const int)), this, SLOT(updateNickCounter(const int))); - - BtnAdmin = addButton(tr("Admin features"), pageLayout, 6, 2); - - connect(BtnCreate, SIGNAL(clicked()), this, SLOT(onCreateClick())); - connect(BtnJoin, SIGNAL(clicked()), this, SLOT(onJoinClick())); - connect(BtnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClick())); - connect(BtnClear, SIGNAL(clicked()), this, SLOT(onClearClick())); - connect(roomsList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(onJoinClick())); - connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); - connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); - connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); - connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onRefreshClick())); - connect(this, SIGNAL(askJoinConfirmation (const QString &)), this, SLOT(onJoinConfirmation(const QString &)), Qt::QueuedConnection); - - gameInLobby = false; -} - -void PageRoomsList::setAdmin(bool flag) -{ - BtnAdmin->setVisible(flag); -} - -void PageRoomsList::setRoomsList(const QStringList & list) -{ - QBrush red(QColor(255, 0, 0)); - QBrush orange(QColor(127, 127, 0)); - QBrush yellow(QColor(255, 255, 0)); - QBrush green(QColor(0, 255, 0)); - - listFromServer = list; - - QString selection = ""; - - if(QTableWidgetItem *item = roomsList->item(roomsList->currentRow(), 0)) - selection = item->text(); - - roomsList->clear(); - roomsList->setColumnCount(7); - roomsList->setHorizontalHeaderLabels( - QStringList() << - QTableWidget::tr("Room Name") << - QTableWidget::tr("C") << - QTableWidget::tr("T") << - QTableWidget::tr("Owner") << - QTableWidget::tr("Map") << - QTableWidget::tr("Rules") << - QTableWidget::tr("Weapons") - ); - - // set minimum sizes -// roomsList->horizontalHeader()->resizeSection(0, 200); -// roomsList->horizontalHeader()->resizeSection(1, 50); -// roomsList->horizontalHeader()->resizeSection(2, 50); -// roomsList->horizontalHeader()->resizeSection(3, 100); -// roomsList->horizontalHeader()->resizeSection(4, 100); -// roomsList->horizontalHeader()->resizeSection(5, 100); -// roomsList->horizontalHeader()->resizeSection(6, 100); - - // set resize modes -// roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive); - - bool gameCanBeJoined = true; - - if (list.size() % 8) - return; - - roomsList->setRowCount(list.size() / 8); - for(int i = 0, r = 0; i < list.size(); i += 8, r++) - { - // if we are joining a game - // TODO: Should NOT be done here - if (gameInLobby) { - if (gameInLobbyName == list[i + 1]) { - gameCanBeJoined = list[i].compare("True"); - } - } - - // check filter settings - #define NO_FILTER_MATCH roomsList->setRowCount(roomsList->rowCount() - 1); --r; continue - - if (list[i].compare("True") && CBState->currentIndex() == 2) { NO_FILTER_MATCH; } - if (list[i].compare("False") && CBState->currentIndex() == 1) { NO_FILTER_MATCH; } - if (CBRules->currentIndex() != 0 && list[i + 6].compare(CBRules->currentText())) { NO_FILTER_MATCH; } - if (CBWeapons->currentIndex() != 0 && list[i + 7].compare(CBWeapons->currentText())) { NO_FILTER_MATCH; } - bool found = list[i + 1].contains(searchText->text(), Qt::CaseInsensitive); - if (!found) { - for (int a = 4; a <= 7; ++a) { - QString compString = list[i + a]; - if (a == 5 && compString == "+rnd+") { - compString = "Random Map"; - } else if (a == 5 && compString == "+maze+") { - compString = "Random Maze"; - } else if (a == 5 && compString == "+drawn+") { - compString = "Drawn Map"; - } - if (compString.contains(searchText->text(), Qt::CaseInsensitive)) { - found = true; - break; - } - } - } - if (!searchText->text().isEmpty() && !found) { NO_FILTER_MATCH; } - - QTableWidgetItem * item; - item = new QTableWidgetItem(list[i + 1]); // room name - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - - // pick appropriate room icon and tooltip (game in progress yes/no; later maybe locked rooms etc.) - if(list[i].compare("True")) - { - item->setIcon(QIcon(":/res/iconTime.png"));// game is in lobby - item->setToolTip(tr("This game is in lobby.\nYou may join and start playing once the game starts.")); - } - else - { - item->setIcon(QIcon(":/res/iconDamage.png"));// game has started - item->setToolTip(tr("This game is in progress.\nYou may join and spectate now but you'll have to wait for the game to end to start playing.")); - } - - roomsList->setItem(r, 0, item); - - item = new QTableWidgetItem(list[i + 2]); // number of clients - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - item->setTextAlignment(Qt::AlignCenter); - item->setToolTip(tr("There are %1 clients connected to this room.", "", list[i + 2].toInt()).arg(list[i + 2])); - roomsList->setItem(r, 1, item); - - item = new QTableWidgetItem(list[i + 3]); // number of teams - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - item->setTextAlignment(Qt::AlignCenter); - item->setToolTip(tr("There are %1 teams participating in this room.", "", list[i + 3].toInt()).arg(list[i + 3])); - //Should we highlight "full" games? Might get misinterpreted - //if(list[i + 3].toInt() >= cMaxTeams) - // item->setForeground(red); - roomsList->setItem(r, 2, item); - - item = new QTableWidgetItem(list[i + 4].left(15)); // name of host - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - item->setToolTip(tr("%1 is the host. He may adjust settings and start the game.").arg(list[i + 4])); - roomsList->setItem(r, 3, item); - - if(list[i + 5] == "+rnd+") - { - item = new QTableWidgetItem(tr("Random Map")); // selected map (is randomized) -// FIXME - need real icons. Disabling until then -// item->setIcon(QIcon(":/res/mapRandom.png")); - } - else if (list[i+5] == "+maze+") - { - item = new QTableWidgetItem(tr("Random Maze")); -// FIXME - need real icons. Disabling until then -// item->setIcon(QIcon(":/res/mapMaze.png")); - } - else - { - item = new QTableWidgetItem(list[i + 5]); // selected map - - // check to see if we've got this map - // not perfect but a start - if(!mapList->contains(list[i + 5])) - { - item->setForeground(red); - item->setIcon(QIcon(":/res/mapMissing.png")); - } - else - { - // todo: mission icon? -// FIXME - need real icons. Disabling until then -// item->setIcon(QIcon(":/res/mapCustom.png")); - } - } - - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - item->setToolTip(tr("Games may be played on precreated or randomized maps.")); - roomsList->setItem(r, 4, item); - - item = new QTableWidgetItem(list[i + 6].left(24)); // selected game scheme - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - item->setToolTip(tr("The Game Scheme defines general options and preferences like Round Time, Sudden Death or Vampirism.")); - roomsList->setItem(r, 5, item); - - item = new QTableWidgetItem(list[i + 7].left(24)); // selected weapon scheme - item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); - item->setToolTip(tr("The Weapon Scheme defines available weapons and their ammunition count.")); - roomsList->setItem(r, 6, item); - - if(!list[i + 1].compare(selection) && !selection.isEmpty()) - roomsList->selectionModel()->setCurrentIndex(roomsList->model()->index(r, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); - } - - roomsList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); - roomsList->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents); - roomsList->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents); - roomsList->horizontalHeader()->setResizeMode(3, QHeaderView::ResizeToContents); - roomsList->horizontalHeader()->setResizeMode(4, QHeaderView::ResizeToContents); - roomsList->horizontalHeader()->setResizeMode(5, QHeaderView::ResizeToContents); - roomsList->horizontalHeader()->setResizeMode(6, QHeaderView::ResizeToContents); - - // TODO: Should NOT be done here - if (gameInLobby) { - gameInLobby = false; - if (gameCanBeJoined) { - emit askForJoinRoom(gameInLobbyName); - } else { - emit askJoinConfirmation(gameInLobbyName); - } - } - -// roomsList->resizeColumnsToContents(); -} - -void PageRoomsList::onCreateClick() -{ - if (roomName->text().size()) - emit askForCreateRoom(roomName->text()); - else - QMessageBox::critical(this, - tr("Error"), - tr("Please enter room name"), - tr("OK")); -} - -void PageRoomsList::onJoinClick() -{ - QTableWidgetItem * curritem = roomsList->item(roomsList->currentRow(), 0); - if (!curritem) - { - QMessageBox::critical(this, - tr("Error"), - tr("Please select room from the list"), - tr("OK")); - return; - } - - for (int i = 0; i < listFromServer.size(); i += 8) { - if (listFromServer[i + 1] == curritem->data(Qt::DisplayRole).toString()) { - gameInLobby = listFromServer[i].compare("True"); - break; - } - } - - if (gameInLobby) { - gameInLobbyName = curritem->data(Qt::DisplayRole).toString(); - emit askForRoomList(); - } else { - emit askForJoinRoom(curritem->data(Qt::DisplayRole).toString()); - } -} - -void PageRoomsList::onRefreshClick() -{ - emit askForRoomList(); -} - -void PageRoomsList::onClearClick() -{ - CBState->setCurrentIndex(0); - CBRules->setCurrentIndex(0); - CBWeapons->setCurrentIndex(0); - searchText->clear(); -} - -void PageRoomsList::onJoinConfirmation(const QString & room) -{ - if (QMessageBox::warning(this, - tr("Warning"), - tr("The game you are trying to join has started.\nDo you still want to join the room?"), - QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) - { - emit askForJoinRoom(room); - } -} - -void PageRoomsList::updateNickCounter(int cnt) -{ - lblCount->setText(tr("%1 players online", 0, cnt).arg(cnt)); -} - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageroomslist.h --- a/QTfrontend/pageroomslist.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,75 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_ROOMLIST_H -#define PAGE_ROOMLIST_H - -#include "AbstractPage.h" -#include "SDLs.h" - -class HWChatWidget; -class AmmoSchemeModel; - -class PageRoomsList : public AbstractPage -{ - Q_OBJECT - -public: - PageRoomsList(QWidget* parent, QSettings * config, SDLInteraction * sdli); - - QLineEdit * roomName; - QLineEdit * searchText; - QTableWidget * roomsList; - QPushButton * BtnBack; - QPushButton * BtnCreate; - QPushButton * BtnJoin; - QPushButton * BtnRefresh; - QPushButton * BtnAdmin; - QPushButton * BtnClear; - QComboBox * CBState; - QComboBox * CBRules; - QComboBox * CBWeapons; - HWChatWidget * chatWidget; - QLabel * lblCount; - -private: - bool gameInLobby; - QString gameInLobbyName; - QStringList listFromServer; - AmmoSchemeModel * ammoSchemeModel; - -public slots: - void setRoomsList(const QStringList & list); - void setAdmin(bool); - void updateNickCounter(int cnt); - -private slots: - void onCreateClick(); - void onJoinClick(); - void onRefreshClick(); - void onClearClick(); - void onJoinConfirmation(const QString &); - -signals: - void askForCreateRoom(const QString &); - void askForJoinRoom(const QString &); - void askForRoomList(); - void askJoinConfirmation(const QString &); -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagescheme.cpp --- a/QTfrontend/pagescheme.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,488 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include "ammoSchemeModel.h" -#include "pagescheme.h" -#include "misc.h" - -PageScheme::PageScheme(QWidget* parent) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - QGroupBox * gb = new QGroupBox(this); - - QGridLayout * gl = new QGridLayout(); - gb->setLayout(gl); - QSizePolicy sp; - sp.setVerticalPolicy(QSizePolicy::MinimumExpanding); - sp.setHorizontalPolicy(QSizePolicy::Expanding); - - pageLayout->addWidget(gb, 1,0,13,5); - - gbGameModes = new QGroupBox(QGroupBox::tr("Game Modifiers"), gb); - gbBasicSettings = new QGroupBox(QGroupBox::tr("Basic Settings"), gb); - - gbGameModes->setStyleSheet(".QGroupBox {" - "background-color: #130f2c; background-image:url();" - "}"); - gbBasicSettings->setStyleSheet(".QGroupBox {" - "background-color: #130f2c; background-image:url();" - "}"); - - gbGameModes->setSizePolicy(sp); - gbBasicSettings->setSizePolicy(sp); - gl->addWidget(gbGameModes,0,0,1,3,Qt::AlignTop); - gl->addWidget(gbBasicSettings,0,3,1,3,Qt::AlignTop); - - QGridLayout * glGMLayout = new QGridLayout(gbGameModes); - QGridLayout * glBSLayout = new QGridLayout(gbBasicSettings); - gbGameModes->setLayout(glGMLayout); - gbBasicSettings->setLayout(glBSLayout); - // Left - - TBW_mode_Forts = new ToggleButtonWidget(gbGameModes, ":/res/btnForts.png"); - TBW_mode_Forts->setToolTip("" + ToggleButtonWidget::tr("Fort Mode") + ":
" + tr("Defend your fort and destroy the opponents, two team colours max!")); - glGMLayout->addWidget(TBW_mode_Forts,0,0,1,1); - - TBW_teamsDivide = new ToggleButtonWidget(gbGameModes, ":/res/btnTeamsDivide.png"); - TBW_teamsDivide->setToolTip("" + ToggleButtonWidget::tr("Divide Teams") + ":
" + tr("Teams will start on opposite sides of the terrain, two team colours max!")); - glGMLayout->addWidget(TBW_teamsDivide,0,1,1,1); - - TBW_solid = new ToggleButtonWidget(gbGameModes, ":/res/btnSolid.png"); - TBW_solid->setToolTip("" + ToggleButtonWidget::tr("Solid Land") + ":
" + tr("Land can not be destroyed!")); - glGMLayout->addWidget(TBW_solid,0,2,1,1); - - TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder.png"); - TBW_border->setToolTip("" + ToggleButtonWidget::tr("Add Border") + ":
" + tr("Add an indestructible border around the terrain")); - glGMLayout->addWidget(TBW_border,0,3,1,1); - - TBW_lowGravity = new ToggleButtonWidget(gbGameModes, ":/res/btnLowGravity.png"); - TBW_lowGravity->setToolTip("" + ToggleButtonWidget::tr("Low Gravity") + ":
" + tr("Lower gravity")); - glGMLayout->addWidget(TBW_lowGravity,0,4,1,1); - - TBW_laserSight = new ToggleButtonWidget(gbGameModes, ":/res/btnLaserSight.png"); - TBW_laserSight->setToolTip("" + ToggleButtonWidget::tr("Laser Sight") + ":
" + tr("Assisted aiming with laser sight")); - glGMLayout->addWidget(TBW_laserSight,1,0,1,1); - - TBW_invulnerable = new ToggleButtonWidget(gbGameModes, ":/res/btnInvulnerable.png"); - TBW_invulnerable->setToolTip("" + ToggleButtonWidget::tr("Invulnerable") + ":
" + tr("All hogs have a personal forcefield")); - glGMLayout->addWidget(TBW_invulnerable,1,1,1,1); - - TBW_resethealth = new ToggleButtonWidget(gbGameModes, ":/res/btnResetHealth.png"); - TBW_resethealth->setToolTip("" + ToggleButtonWidget::tr("Reset Health") + ":
" + tr("All (living) hedgehogs are fully restored at the end of turn")); - glGMLayout->addWidget(TBW_resethealth,1,2,1,1); - - TBW_vampiric = new ToggleButtonWidget(gbGameModes, ":/res/btnVampiric.png"); - TBW_vampiric->setToolTip("" + ToggleButtonWidget::tr("Vampirism") + ":
" + tr("Gain 80% of the damage you do back in health")); - glGMLayout->addWidget(TBW_vampiric,1,3,1,1); - - TBW_karma = new ToggleButtonWidget(gbGameModes, ":/res/btnKarma.png"); - TBW_karma->setToolTip("" + ToggleButtonWidget::tr("Karma") + ":
" + tr("Share your opponents pain, share their damage")); - glGMLayout->addWidget(TBW_karma,1,4,1,1); - - TBW_artillery = new ToggleButtonWidget(gbGameModes, ":/res/btnArtillery.png"); - TBW_artillery->setToolTip("" + ToggleButtonWidget::tr("Artillery") + ":
" + tr("Your hogs are unable to move, put your artillery skills to the test")); - glGMLayout->addWidget(TBW_artillery,2,0,1,1); - - TBW_randomorder = new ToggleButtonWidget(gbGameModes, ":/res/btnRandomOrder.png"); - TBW_randomorder->setToolTip("" + ToggleButtonWidget::tr("Random Order") + ":
" + tr("Order of play is random instead of in room order.")); - glGMLayout->addWidget(TBW_randomorder,2,1,1,1); - - TBW_king = new ToggleButtonWidget(gbGameModes, ":/res/btnKing.png"); - TBW_king->setToolTip("" + ToggleButtonWidget::tr("King") + ":
" + tr("Play with a King. If he dies, your side dies.")); - glGMLayout->addWidget(TBW_king,2,2,1,1); - - TBW_placehog = new ToggleButtonWidget(gbGameModes, ":/res/btnPlaceHog.png"); - TBW_placehog->setToolTip("" + ToggleButtonWidget::tr("Place Hedgehogs") + ":
" + tr("Take turns placing your hedgehogs before the start of play.")); - glGMLayout->addWidget(TBW_placehog,2,3,1,1); - - TBW_sharedammo = new ToggleButtonWidget(gbGameModes, ":/res/btnSharedAmmo.png"); - TBW_sharedammo->setToolTip("" + ToggleButtonWidget::tr("Clan Shares Ammo") + ":
" + tr("Ammo is shared between all teams that share a colour.")); - glGMLayout->addWidget(TBW_sharedammo,2,4,1,1); - - TBW_disablegirders = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableGirders.png"); - TBW_disablegirders->setToolTip("" + ToggleButtonWidget::tr("Disable Girders") + ":
" + tr("Disable girders when generating random maps.")); - glGMLayout->addWidget(TBW_disablegirders,3,0,1,1); - - TBW_disablelandobjects = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableLandObjects.png"); - TBW_disablelandobjects->setToolTip("" + ToggleButtonWidget::tr("Disable Land Objects") + ":
" + tr("Disable land objects when generating random maps.")); - glGMLayout->addWidget(TBW_disablelandobjects,3,1,1,1); - - TBW_aisurvival = new ToggleButtonWidget(gbGameModes, ":/res/btnAISurvival.png"); - TBW_aisurvival->setToolTip("" + ToggleButtonWidget::tr("AI Survival Mode") + ":
" + tr("AI respawns on death.")); - glGMLayout->addWidget(TBW_aisurvival,3,2,1,1); - - TBW_infattack = new ToggleButtonWidget(gbGameModes, ":/res/btnInfAttack.png"); - TBW_infattack->setToolTip("" + ToggleButtonWidget::tr("Unlimited Attacks") + ":
" + tr("Attacking does not end your turn.")); - glGMLayout->addWidget(TBW_infattack,3,3,1,1); - - TBW_resetweps = new ToggleButtonWidget(gbGameModes, ":/res/btnResetWeps.png"); - TBW_resetweps->setToolTip("" + ToggleButtonWidget::tr("Reset Weapons") + ":
" + tr("Weapons are reset to starting values each turn.")); - glGMLayout->addWidget(TBW_resetweps,3,4,1,1); - - TBW_perhogammo = new ToggleButtonWidget(gbGameModes, ":/res/btnPerHogAmmo.png"); - TBW_perhogammo->setToolTip("" + ToggleButtonWidget::tr("Per Hedgehog Ammo") + ":
" + tr("Each hedgehog has its own ammo. It does not share with the team.")); - glGMLayout->addWidget(TBW_perhogammo,4,0,1,1); - - TBW_nowind = new ToggleButtonWidget(gbGameModes, ":/res/btnNoWind.png"); - TBW_nowind->setToolTip("" + ToggleButtonWidget::tr("Disable Wind") + ":
" + tr("You will not have to worry about wind anymore.")); - glGMLayout->addWidget(TBW_nowind,4,1,1,1); - - TBW_morewind = new ToggleButtonWidget(gbGameModes, ":/res/btnMoreWind.png"); - TBW_morewind->setToolTip("" + ToggleButtonWidget::tr("More Wind") + ":
" + tr("Wind will affect almost everything.")); - glGMLayout->addWidget(TBW_morewind,4,2,1,1); - - TBW_tagteam = new ToggleButtonWidget(gbGameModes, ":/res/btnTagTeam.png"); - TBW_tagteam->setToolTip("" + ToggleButtonWidget::tr("Tag Team") + ":
" + tr("Teams in each clan take successive turns sharing their turn time.")); - glGMLayout->addWidget(TBW_tagteam,4,3,1,1); - - TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder.png"); - TBW_bottomborder->setToolTip("" + ToggleButtonWidget::tr("Add Bottom Border") + ":
" + tr("Add an indestructible border along the bottom")); - glGMLayout->addWidget(TBW_bottomborder,4,4,1,1); - - - // Right - QLabel * l; - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Damage Modifier")); - l->setWordWrap(true); - glBSLayout->addWidget(l,0,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconDamage.png")); - glBSLayout->addWidget(l,0,1,1,1); - SB_DamageModifier = new QSpinBox(gbBasicSettings); - SB_DamageModifier->setRange(10, 300); - SB_DamageModifier->setValue(100); - SB_DamageModifier->setSingleStep(25); - glBSLayout->addWidget(SB_DamageModifier,0,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Turn Time")); - l->setWordWrap(true); - glBSLayout->addWidget(l,1,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconTime.png")); - glBSLayout->addWidget(l,1,1,1,1); - SB_TurnTime = new QSpinBox(gbBasicSettings); - SB_TurnTime->setRange(1, 9999); - SB_TurnTime->setValue(45); - SB_TurnTime->setSingleStep(15); - glBSLayout->addWidget(SB_TurnTime,1,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Initial Health")); - l->setWordWrap(true); - glBSLayout->addWidget(l,2,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconHealth.png")); - glBSLayout->addWidget(l,2,1,1,1); - SB_InitHealth = new QSpinBox(gbBasicSettings); - SB_InitHealth->setRange(50, 200); - SB_InitHealth->setValue(100); - SB_InitHealth->setSingleStep(25); - glBSLayout->addWidget(SB_InitHealth,2,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Sudden Death Timeout")); - l->setWordWrap(true); - glBSLayout->addWidget(l,3,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); - glBSLayout->addWidget(l,3,1,1,1); - SB_SuddenDeath = new QSpinBox(gbBasicSettings); - SB_SuddenDeath->setRange(0, 50); - SB_SuddenDeath->setValue(15); - SB_SuddenDeath->setSingleStep(3); - glBSLayout->addWidget(SB_SuddenDeath,3,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Sudden Death Water Rise")); - l->setWordWrap(true); - glBSLayout->addWidget(l,4,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon - glBSLayout->addWidget(l,4,1,1,1); - SB_WaterRise = new QSpinBox(gbBasicSettings); - SB_WaterRise->setRange(0, 100); - SB_WaterRise->setValue(47); - SB_WaterRise->setSingleStep(5); - glBSLayout->addWidget(SB_WaterRise,4,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Sudden Death Health Decrease")); - l->setWordWrap(true); - glBSLayout->addWidget(l,5,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon - glBSLayout->addWidget(l,5,1,1,1); - SB_HealthDecrease = new QSpinBox(gbBasicSettings); - SB_HealthDecrease->setRange(0, 100); - SB_HealthDecrease->setValue(5); - SB_HealthDecrease->setSingleStep(1); - glBSLayout->addWidget(SB_HealthDecrease,5,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("% Rope Length")); - l->setWordWrap(true); - glBSLayout->addWidget(l,6,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconRope.png")); - glBSLayout->addWidget(l,6,1,1,1); - SB_RopeModifier = new QSpinBox(gbBasicSettings); - SB_RopeModifier->setRange(25, 999); - SB_RopeModifier->setValue(100); - SB_RopeModifier->setSingleStep(25); - glBSLayout->addWidget(SB_RopeModifier,6,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Crate Drops")); - l->setWordWrap(true); - glBSLayout->addWidget(l,7,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconBox.png")); - glBSLayout->addWidget(l,7,1,1,1); - SB_CaseProb = new FreqSpinBox(gbBasicSettings); - SB_CaseProb->setRange(0, 9); - SB_CaseProb->setValue(5); - glBSLayout->addWidget(SB_CaseProb,7,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("% Health Crates")); - l->setWordWrap(true); - glBSLayout->addWidget(l,8,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon - glBSLayout->addWidget(l,8,1,1,1); - SB_HealthCrates = new QSpinBox(gbBasicSettings); - SB_HealthCrates->setRange(0, 100); - SB_HealthCrates->setValue(35); - SB_HealthCrates->setSingleStep(5); - glBSLayout->addWidget(SB_HealthCrates,8,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Health in Crates")); - l->setWordWrap(true); - glBSLayout->addWidget(l,9,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon - glBSLayout->addWidget(l,9,1,1,1); - SB_CrateHealth = new QSpinBox(gbBasicSettings); - SB_CrateHealth->setRange(0, 200); - SB_CrateHealth->setValue(25); - SB_CrateHealth->setSingleStep(5); - glBSLayout->addWidget(SB_CrateHealth,9,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Mines Time")); - l->setWordWrap(true); - glBSLayout->addWidget(l,10,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconTime.png")); // TODO: icon - glBSLayout->addWidget(l,10,1,1,1); - SB_MinesTime = new QSpinBox(gbBasicSettings); - SB_MinesTime->setRange(-1, 5); - SB_MinesTime->setValue(3); - SB_MinesTime->setSingleStep(1); - SB_MinesTime->setSpecialValueText(tr("Random")); - SB_MinesTime->setSuffix(" "+ tr("Seconds")); - glBSLayout->addWidget(SB_MinesTime,10,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Mines")); - l->setWordWrap(true); - glBSLayout->addWidget(l,11,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconMine.png")); // TODO: icon - glBSLayout->addWidget(l,11,1,1,1); - SB_Mines = new QSpinBox(gbBasicSettings); - SB_Mines->setRange(0, 80); - SB_Mines->setValue(0); - SB_Mines->setSingleStep(5); - glBSLayout->addWidget(SB_Mines,11,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("% Dud Mines")); - l->setWordWrap(true); - glBSLayout->addWidget(l,12,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconDud.png")); - glBSLayout->addWidget(l,12,1,1,1); - SB_MineDuds = new QSpinBox(gbBasicSettings); - SB_MineDuds->setRange(0, 100); - SB_MineDuds->setValue(0); - SB_MineDuds->setSingleStep(5); - glBSLayout->addWidget(SB_MineDuds,12,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Explosives")); - l->setWordWrap(true); - glBSLayout->addWidget(l,13,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconDamage.png")); - glBSLayout->addWidget(l,13,1,1,1); - SB_Explosives = new QSpinBox(gbBasicSettings); - SB_Explosives->setRange(0, 40); - SB_Explosives->setValue(0); - SB_Explosives->setSingleStep(1); - glBSLayout->addWidget(SB_Explosives,13,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("% Get Away Time")); - l->setWordWrap(true); - glBSLayout->addWidget(l,14,0,1,1); - l = new QLabel(gbBasicSettings); - l->setFixedSize(32,32); - l->setPixmap(QPixmap(":/res/iconTime.png")); - glBSLayout->addWidget(l,14,1,1,1); - SB_GetAwayTime = new QSpinBox(gbBasicSettings); - SB_GetAwayTime->setRange(0, 999); - SB_GetAwayTime->setValue(100); - SB_GetAwayTime->setSingleStep(25); - glBSLayout->addWidget(SB_GetAwayTime,14,2,1,1); - - l = new QLabel(gbBasicSettings); - l->setText(QLabel::tr("Scheme Name:")); - - LE_name = new QLineEdit(this); - - gl->addWidget(LE_name,15,1,1,5); - gl->addWidget(l,15,0,1,1); - - mapper = new QDataWidgetMapper(this); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 16, 0, true); - BtnCopy = addButton(tr("Copy"), pageLayout, 16, 2); - BtnNew = addButton(tr("New"), pageLayout, 16, 3); - BtnDelete = addButton(tr("Delete"), pageLayout, 16, 4); - - selectScheme = new QComboBox(this); - pageLayout->addWidget(selectScheme, 16, 1); - - connect(BtnCopy, SIGNAL(clicked()), this, SLOT(copyRow())); - connect(BtnNew, SIGNAL(clicked()), this, SLOT(newRow())); - connect(BtnDelete, SIGNAL(clicked()), this, SLOT(deleteRow())); - connect(selectScheme, SIGNAL(currentIndexChanged(int)), mapper, SLOT(setCurrentIndex(int))); - connect(selectScheme, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeSelected(int))); -} - -void PageScheme::setModel(QAbstractItemModel * model) -{ - mapper->setModel(model); - selectScheme->setModel(model); - - mapper->addMapping(LE_name, 0); - mapper->addMapping(TBW_mode_Forts, 1); - mapper->addMapping(TBW_teamsDivide, 2); - mapper->addMapping(TBW_solid, 3); - mapper->addMapping(TBW_border, 4); - mapper->addMapping(TBW_lowGravity, 5); - mapper->addMapping(TBW_laserSight, 6); - mapper->addMapping(TBW_invulnerable, 7); - mapper->addMapping(TBW_resethealth, 8); - mapper->addMapping(TBW_vampiric, 9); - mapper->addMapping(TBW_karma, 10); - mapper->addMapping(TBW_artillery, 11); - mapper->addMapping(TBW_randomorder, 12); - mapper->addMapping(TBW_king, 13); - mapper->addMapping(TBW_placehog, 14); - mapper->addMapping(TBW_sharedammo, 15); - mapper->addMapping(TBW_disablegirders, 16); - mapper->addMapping(TBW_disablelandobjects, 17); - mapper->addMapping(TBW_aisurvival, 18); - mapper->addMapping(TBW_infattack, 19); - mapper->addMapping(TBW_resetweps, 20); - mapper->addMapping(TBW_perhogammo, 21); - mapper->addMapping(TBW_nowind, 22); - mapper->addMapping(TBW_morewind, 23); - mapper->addMapping(TBW_tagteam, 24); - mapper->addMapping(TBW_bottomborder, 25); - mapper->addMapping(SB_DamageModifier, 26); - mapper->addMapping(SB_TurnTime, 27); - mapper->addMapping(SB_InitHealth, 28); - mapper->addMapping(SB_SuddenDeath, 29); - mapper->addMapping(SB_CaseProb, 30); - mapper->addMapping(SB_MinesTime, 31); - mapper->addMapping(SB_Mines, 32); - mapper->addMapping(SB_MineDuds, 33); - mapper->addMapping(SB_Explosives, 34); - mapper->addMapping(SB_HealthCrates, 35); - mapper->addMapping(SB_CrateHealth, 36); - mapper->addMapping(SB_WaterRise, 37); - mapper->addMapping(SB_HealthDecrease, 38); - mapper->addMapping(SB_RopeModifier, 39); - mapper->addMapping(SB_GetAwayTime, 40); - - mapper->toFirst(); -} - -void PageScheme::newRow() -{ - QAbstractItemModel * model = mapper->model(); - model->insertRow(-1); - selectScheme->setCurrentIndex(model->rowCount() - 1); -} - -void PageScheme::copyRow() -{ - QAbstractItemModel * model = mapper->model(); - model->insertRow(selectScheme->currentIndex()); - selectScheme->setCurrentIndex(model->rowCount() - 1); -} - -void PageScheme::deleteRow() -{ - QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Schemes"), QMessageBox::tr("Really delete this game scheme?"), QMessageBox::Ok | QMessageBox::Cancel); - - if (reallyDelete.exec() == QMessageBox::Ok) { - QAbstractItemModel * model = mapper->model(); - model->removeRow(selectScheme->currentIndex()); - } -} - -void PageScheme::schemeSelected(int n) -{ - int c = ((AmmoSchemeModel*)mapper->model())->numberOfDefaultSchemes; - gbGameModes->setEnabled(n >= c); - gbBasicSettings->setEnabled(n >= c); - LE_name->setEnabled(n >= c); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagescheme.h --- a/QTfrontend/pagescheme.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,101 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_SCHEME_H -#define PAGE_SCHEME_H - -#include "AbstractPage.h" -#include "togglebutton.h" - -class FreqSpinBox; - -class PageScheme : public AbstractPage -{ - Q_OBJECT - -public: - PageScheme(QWidget* parent = 0); - - QPushButton * BtnBack; - QPushButton * BtnCopy; - QPushButton * BtnNew; - QPushButton * BtnDelete; - QPushButton * BtnSave; - QComboBox * selectScheme; - - void setModel(QAbstractItemModel * model); - -public slots: - void newRow(); - void copyRow(); - void deleteRow(); - -private: - QDataWidgetMapper * mapper; - ToggleButtonWidget * TBW_mode_Forts; - ToggleButtonWidget * TBW_teamsDivide; - ToggleButtonWidget * TBW_solid; - ToggleButtonWidget * TBW_border; - ToggleButtonWidget * TBW_lowGravity; - ToggleButtonWidget * TBW_laserSight; - ToggleButtonWidget * TBW_invulnerable; - ToggleButtonWidget * TBW_resethealth; - ToggleButtonWidget * TBW_vampiric; - ToggleButtonWidget * TBW_karma; - ToggleButtonWidget * TBW_artillery; - ToggleButtonWidget * TBW_randomorder; - ToggleButtonWidget * TBW_king; - ToggleButtonWidget * TBW_placehog; - ToggleButtonWidget * TBW_sharedammo; - ToggleButtonWidget * TBW_disablegirders; - ToggleButtonWidget * TBW_disablelandobjects; - ToggleButtonWidget * TBW_aisurvival; - ToggleButtonWidget * TBW_infattack; - ToggleButtonWidget * TBW_resetweps; - ToggleButtonWidget * TBW_perhogammo; - ToggleButtonWidget * TBW_nowind; - ToggleButtonWidget * TBW_morewind; - ToggleButtonWidget * TBW_tagteam; - ToggleButtonWidget * TBW_bottomborder; - - QSpinBox * SB_DamageModifier; - QSpinBox * SB_TurnTime; - QSpinBox * SB_InitHealth; - QSpinBox * SB_SuddenDeath; - QSpinBox * SB_WaterRise; - QSpinBox * SB_HealthDecrease; - FreqSpinBox * SB_CaseProb; - QSpinBox * SB_HealthCrates; - QSpinBox * SB_CrateHealth; - QSpinBox * SB_MinesTime; - QSpinBox * SB_Mines; - QSpinBox * SB_MineDuds; - QSpinBox * SB_Explosives; - QSpinBox * SB_RopeModifier; - QSpinBox * SB_GetAwayTime; - QLineEdit * LE_name; - - QGroupBox * gbGameModes; - QGroupBox * gbBasicSettings; - -private slots: - void schemeSelected(int); - -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageselectweapon.cpp --- a/QTfrontend/pageselectweapon.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,53 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "pageselectweapon.h" -#include "hwconsts.h" -#include "selectWeapon.h" - -PageSelectWeapon::PageSelectWeapon(QWidget* parent) : - AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - - pWeapons = new SelWeaponWidget(cAmmoNumber, this); - pageLayout->addWidget(pWeapons, 0, 0, 1, 5); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, 2, 1, true); - BtnDefault = addButton(tr("Default"), pageLayout, 1, 3); - BtnNew = addButton(tr("New"), pageLayout, 1, 2); - BtnCopy = addButton(tr("Copy"), pageLayout, 2, 2); - BtnDelete = addButton(tr("Delete"), pageLayout, 2, 3); - BtnSave = addButton(":/res/Save.png", pageLayout, 1, 4, 2, 1, true); - BtnSave->setStyleSheet("QPushButton{margin: 24px 0px 0px 0px;}"); - BtnBack->setFixedHeight(BtnSave->height()); - BtnBack->setStyleSheet("QPushButton{margin-top: 31px;}"); - - selectWeaponSet = new QComboBox(this); - pageLayout->addWidget(selectWeaponSet, 1, 1, 2, 1); - - connect(BtnDefault, SIGNAL(clicked()), pWeapons, SLOT(setDefault())); - connect(BtnSave, SIGNAL(clicked()), pWeapons, SLOT(save())); - connect(BtnNew, SIGNAL(clicked()), pWeapons, SLOT(newWeaponsName())); - connect(BtnCopy, SIGNAL(clicked()), pWeapons, SLOT(copy())); - connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(setWeaponsName(const QString&))); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pageselectweapon.h --- a/QTfrontend/pageselectweapon.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,43 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_SELECTWEAPON_H -#define PAGE_SELECTWEAPON_H - -#include "AbstractPage.h" - -class SelWeaponWidget; - -class PageSelectWeapon : public AbstractPage -{ - Q_OBJECT - -public: - PageSelectWeapon(QWidget* parent = 0); - - QPushButton *BtnSave; - QPushButton *BtnDefault; - QPushButton *BtnDelete; - QPushButton *BtnNew; - QPushButton *BtnCopy; - QPushButton *BtnBack; - SelWeaponWidget* pWeapons; - QComboBox* selectWeaponSet; -}; - -#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagesingleplayer.cpp --- a/QTfrontend/pagesingleplayer.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,64 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include - -#include "pagesingleplayer.h" -#include "gamecfgwidget.h" - -PageSinglePlayer::PageSinglePlayer(QWidget* parent) : AbstractPage(parent) -{ - QVBoxLayout * vLayout = new QVBoxLayout(this); - QHBoxLayout * topLine = new QHBoxLayout(); - QHBoxLayout * middleLine = new QHBoxLayout(); - QHBoxLayout * bottomLine = new QHBoxLayout(); - vLayout->addStretch(); - vLayout->addLayout(topLine); - vLayout->addSpacing(30); - vLayout->addLayout(middleLine); - vLayout->addStretch(); - vLayout->addLayout(bottomLine); - - topLine->addStretch(); - BtnSimpleGamePage = addButton(":/res/SimpleGame.png", topLine, 0, true); - BtnSimpleGamePage->setToolTip(tr("Simple Game (a quick game against the computer, settings are chosen for you)")); - topLine->addSpacing(60); - BtnMultiplayer = addButton(":/res/Multiplayer.png", topLine, 1, true); - BtnMultiplayer->setToolTip(tr("Multiplayer (play a hotseat game against your friends, or AI teams)")); - topLine->addStretch(); - - - BtnCampaignPage = addButton(":/res/Campaign.png", middleLine, 0, true); - BtnCampaignPage->setToolTip(tr("Campaign Mode (...)")); - BtnCampaignPage->setVisible(false); - - BtnTrainPage = addButton(":/res/Trainings.png", middleLine, 1, true); - BtnTrainPage->setToolTip(tr("Training Mode (Practice your skills in a range of training missions)")); - - BtnBack = addButton(":/res/Exit.png", bottomLine, 0, true); - bottomLine->addStretch(); - - BtnDemos = addButton(":/res/Record.png", bottomLine, 1, true); - BtnDemos->setToolTip(tr("Demos (Watch recorded demos)")); - BtnLoad = addButton(":/res/Save.png", bottomLine, 2, true); - BtnLoad->setStyleSheet("QPushButton{margin: 12px 0px 12px 0px;}"); - BtnLoad->setToolTip(tr("Load (Load a previously saved game)")); - BtnBack->setFixedHeight(BtnLoad->height()); - BtnBack->setStyleSheet("QPushButton{margin-top: 31px;}"); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagesingleplayer.h --- a/QTfrontend/pagesingleplayer.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_SINGLE_PLAYER_H -#define PAGE_SINGLE_PLAYER_H - -#include "AbstractPage.h" - -class GameCFGWidget; - -class PageSinglePlayer : public AbstractPage -{ - Q_OBJECT - -public: - PageSinglePlayer(QWidget* parent = 0); - - QPushButton *BtnSimpleGamePage; - QPushButton *BtnTrainPage; - QPushButton *BtnCampaignPage; - QPushButton *BtnMultiplayer; - QPushButton *BtnLoad; - QPushButton *BtnDemos; - QPushButton *BtnBack; - GameCFGWidget *gameCFG; -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagetraining.cpp --- a/QTfrontend/pagetraining.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,67 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include "pagetraining.h" -#include "hwconsts.h" - -PageTraining::PageTraining(QWidget* parent) : AbstractPage(parent) -{ - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->setColumnStretch(0, 1); - pageLayout->setColumnStretch(1, 2); - pageLayout->setColumnStretch(2, 1); - pageLayout->setRowStretch(0, 1); - pageLayout->setRowStretch(2, 1); - - CBSelect = new QComboBox(this); - - QDir tmpdir; - tmpdir.cd(cfgdir->absolutePath()); - tmpdir.cd("Data/Missions/Training"); - tmpdir.setFilter(QDir::Files); - QStringList userlist = tmpdir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1"); - CBSelect->addItems(userlist); - - tmpdir.cd(datadir->absolutePath()); - tmpdir.cd("Missions/Training"); - tmpdir.setFilter(QDir::Files); - QStringList tmplist = tmpdir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1"); - QStringList datalist; - for (QStringList::Iterator it = tmplist.begin(); it != tmplist.end(); ++it) - if (!userlist.contains(*it,Qt::CaseInsensitive)) datalist.append(*it); - CBSelect->addItems(datalist); - - for(int i = 0; i < CBSelect->count(); i++) - { - CBSelect->setItemData(i, CBSelect->itemText(i)); - CBSelect->setItemText(i, CBSelect->itemText(i).replace("_", " ")); - } - - pageLayout->addWidget(CBSelect, 1, 1); - - BtnStartTrain = new QPushButton(this); - BtnStartTrain->setFont(*font14); - BtnStartTrain->setText(QPushButton::tr("Go!")); - pageLayout->addWidget(BtnStartTrain, 1, 2); - - BtnBack = addButton(":/res/Exit.png", pageLayout, 3, 0, true); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/pagetraining.h --- a/QTfrontend/pagetraining.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,37 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef PAGE_TRAINING_H -#define PAGE_TRAINING_H - -#include "AbstractPage.h" - -class PageTraining : public AbstractPage -{ - Q_OBJECT - -public: - PageTraining(QWidget* parent = 0); - - QPushButton *BtnStartTrain; - QPushButton *BtnBack; - QComboBox *CBSelect; -}; - -#endif - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/proto.cpp --- a/QTfrontend/proto.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,59 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "proto.h" - -HWProto::HWProto() -{ - -} - -QByteArray & HWProto::addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg) -{ - QByteArray bmsg = msg; - bmsg = bmsg.left(250); - quint8 sz = bmsg.size(); - buf.append(QByteArray((char *)&sz, 1)); - buf.append(bmsg); - return buf; -} - -QByteArray & HWProto::addStringToBuffer(QByteArray & buf, const QString & string) -{ - return addByteArrayToBuffer(buf, string.toUtf8()); -} - -QByteArray & HWProto::addStringListToBuffer(QByteArray & buf, const QStringList & strList) -{ - for (int i = 0; i < strList.size(); i++) - addStringToBuffer(buf, strList[i]); - return buf; -} - -QString HWProto::formatChatMsgForFrontend(const QString & msg) -{ - return formatChatMsg("|nick|", msg); -} - -QString HWProto::formatChatMsg(const QString & nick, const QString & msg) -{ - if(msg.left(4) == "/me ") - return QString("\x02* %1 %2").arg(nick).arg(msg.mid(4)); - else - return QString("\x01%1: %2").arg(nick).arg(msg); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/proto.h --- a/QTfrontend/proto.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _PROTO_H -#define _PROTO_H - -#include -#include -#include - - -class HWProto : public QObject -{ - Q_OBJECT - -public: - HWProto(); - static QByteArray & addStringToBuffer(QByteArray & buf, const QString & string); - static QByteArray & addByteArrayToBuffer(QByteArray & buf, const QByteArray & msg); - static QByteArray & addStringListToBuffer(QByteArray & buf, const QStringList & strList); - static QString formatChatMsg(const QString & nick, const QString & msg); - static QString formatChatMsgForFrontend(const QString & msg); -}; - -#endif // _PROTO_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/qaspectratiolayout.cpp --- a/QTfrontend/qaspectratiolayout.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation. - */ - -#include "qaspectratiolayout.h" - -QAspectRatioLayout::QAspectRatioLayout(QWidget* parent, int spacing) : QLayout(parent) { - init(spacing); -} - -QAspectRatioLayout::QAspectRatioLayout(int spacing) { - init(spacing); -} - -QAspectRatioLayout::~QAspectRatioLayout() { - delete item; - delete lastReceivedRect; - delete _geometry; -} - -void QAspectRatioLayout::init(int spacing) { - item = 0; - lastReceivedRect = new QRect(0, 0, 0, 0); - _geometry = new QRect(0, 0, 0, 0); - setSpacing(spacing); -} - - -/* Adds item if place isn't already taken. */ -void QAspectRatioLayout::add(QLayoutItem* item) { - if(!hasItem()) { - replaceItem(item); - } -} - -/* Adds item if place isn't already taken. */ -void QAspectRatioLayout::addItem(QLayoutItem* item) { - if(!hasItem()) { - replaceItem(item); - } -} - -/* Adds widget if place isn't already taken. */ -void QAspectRatioLayout::addWidget(QWidget* widget) { - if(!hasItem()) { - replaceItem(new QWidgetItem(widget)); - } -} - -/* Returns the item pointer and dereferences it here. */ -QLayoutItem* QAspectRatioLayout::take() { - QLayoutItem* item = 0; - if(this->hasItem()) { - item = this->item; - this->item = 0; - } - return item; -} - -/* Returns the item pointer and dereferences it here. */ -QLayoutItem* QAspectRatioLayout::takeAt(int index) { - if(index != 0) { - return 0; - } - return this->take(); -} - -/* Returns the item pointer. */ -QLayoutItem* QAspectRatioLayout::itemAt(int index) const { - if(index != 0) { - return 0; - } - if(hasItem()) { - return this->item; - } - return 0; -} - -/* Checks if we have an item. */ -bool QAspectRatioLayout::hasItem() const { - return this->item != 0; -} - -/* Returns the count of items which can be either 0 or 1. */ -int QAspectRatioLayout::count() const { - int returnValue = 0; - if(hasItem()) { - returnValue = 1; - } - return returnValue; -} - -/* Replaces the item with the new and returns the old. */ -QLayoutItem* QAspectRatioLayout::replaceItem(QLayoutItem* item) { - QLayoutItem* old = 0; - if(this->hasItem()) { - old = this->item; - } - this->item = item; - setGeometry(*this->_geometry); - return old; -} - -/* Tells which way layout expands. */ -Qt::Orientations QAspectRatioLayout::expandingDirections() const { - return Qt::Horizontal | Qt::Vertical; -} - -/* Tells which size is preferred. */ -QSize QAspectRatioLayout::sizeHint() const { - return this->item->minimumSize(); -} - -/* Tells minimum size. */ -QSize QAspectRatioLayout::minimumSize() const { - return this->item->minimumSize(); -} - -/* - * Tells if heightForWidth calculations is handled. - * It isn't since width isn't enough to calculate - * proper size. - */ -bool QAspectRatioLayout::hasHeightForWidth() const { - return false; -} - -/* Replaces lastReceivedRect. */ -void QAspectRatioLayout::setLastReceivedRect(const QRect& rect) { - QRect* oldRect = this->lastReceivedRect; - this->lastReceivedRect = new QRect(rect.topLeft(), rect.size()); - delete oldRect; -} - -/* Returns geometry */ -QRect QAspectRatioLayout::geometry() { - return QRect(*this->_geometry); -} - -/* Sets geometry to given size. */ -void QAspectRatioLayout::setGeometry(const QRect& rect) { - /* - * We check if the item is set and - * if size is the same previously received. - * If either is false nothing is done. - */ - if(!this->hasItem() || - areRectsEqual(*this->lastReceivedRect, rect)) { - return; - } - /* Replace the last received rectangle. */ - setLastReceivedRect(rect); - /* Calculate proper size for the item relative to the received size. */ - QSize properSize = calculateProperSize(rect.size()); - /* Calculate center location in the rect and with item size. */ - QPoint properLocation = calculateCenterLocation(rect.size(), properSize); - /* Set items geometry */ - this->item->setGeometry(QRect(properLocation, properSize)); - QRect* oldRect = this->_geometry; - /* Cache the calculated geometry. */ - this->_geometry = new QRect(properLocation, properSize); - delete oldRect; - /* Super classes setGeometry */ - QLayout::setGeometry(*this->_geometry); -} - -/* Takes the shortest side and creates QSize - * with the shortest side as width and height. */ -QSize QAspectRatioLayout::calculateProperSize(QSize from) const { - QSize properSize; - if(from.height() * 2 < from.width()) { - properSize.setHeight(from.height() - this->margin()); - properSize.setWidth(from.height() * 2 - this->margin()); - } - else { - properSize.setWidth(from.width() - this->margin()); - properSize.setHeight(from.width() / 2 - this->margin()); - } - return properSize; -} - -/* Calculates center location from the given height and width for item size. */ -QPoint QAspectRatioLayout::calculateCenterLocation(QSize from, - QSize itemSize) const { - QPoint centerLocation; - if((from.width() - itemSize.width()) > 0) { - centerLocation.setX((from.width() - itemSize.width())/2); - } - if((from.height() - itemSize.height()) > 0) { - centerLocation.setY((from.height() - itemSize.height())/2); - } - return centerLocation; -} - -/* Compares if two QRects are equal. */ -bool QAspectRatioLayout::areRectsEqual(const QRect& a, - const QRect& b) const { - bool result = false; - if(a.x() == b.x() && - a.y() == b.y() && - a.height() == b.height() && - a.width() == b.width()) { - result = true; - } - return result; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/qaspectratiolayout.h --- a/QTfrontend/qaspectratiolayout.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,87 +0,0 @@ -/* - * Copyright (c) 2009 Nokia Corporation. - */ - -#ifndef QASPECTRATIOLAYOUT_H_ -#define QASPECTRATIOLAYOUT_H_ - -#include -#include -#include -#include -#include - - -class QAspectRatioLayout : public QLayout -{ - Q_OBJECT - -public: - QAspectRatioLayout(QWidget* parent, int spacing =-1); - QAspectRatioLayout(int spacing = -1); - ~QAspectRatioLayout(); - - /* Convenience method */ - virtual void add(QLayoutItem* item); - -/* http://doc.trolltech.com/qlayout.html#addItem */ - virtual void addItem(QLayoutItem* item); - /* http://doc.trolltech.com/qlayout.html#addWidget */ - virtual void addWidget(QWidget* widget); - /* http://doc.trolltech.com/qlayout.html#takeAt */ - virtual QLayoutItem* takeAt(int index); - /* http://doc.trolltech.com/qlayout.html#itemAt */ - virtual QLayoutItem* itemAt(int index) const; - /* http://doc.trolltech.com/qlayout.html#count */ - virtual int count() const; - - /* - * These are ours since we do have only one item. - */ - virtual QLayoutItem* replaceItem(QLayoutItem* item); - virtual QLayoutItem* take(); - virtual bool hasItem() const; - -/* http://doc.trolltech.com/qlayout.html#expandingDirections */ - virtual Qt::Orientations expandingDirections() const; - - /* - * This method contains most of the juice of this article. - * http://doc.trolltech.com/qlayoutitem.html#setGeometry - */ - virtual void setGeometry(const QRect& rect); - /* http://doc.trolltech.com/qlayoutitem.html#geometry */ - virtual QRect geometry(); - - /* http://doc.trolltech.com/qlayoutitem.html#sizeHint */ - virtual QSize sizeHint() const; - /* http://doc.trolltech.com/qlayout.html#minimumSize */ - virtual QSize minimumSize() const; - /* http://doc.trolltech.com/qlayoutitem.html#hasHeightForWidth */ - virtual bool hasHeightForWidth() const; - -private: - /* Saves the last received rect. */ - void setLastReceivedRect(const QRect& rect); - /* Used to initialize the object. */ - void init(int spacing); - /* Calculates the maximum size for the item from the assigned size. */ - QSize calculateProperSize(QSize from) const; - /* Calculates the center location from the assigned size and - * the items size. */ - QPoint calculateCenterLocation(QSize from, QSize itemSize) const; - /* Check if two QRects are equal */ - bool areRectsEqual(const QRect& a, const QRect& b) const; - /* Contains item reference */ - QLayoutItem* item; - /* - * Used for caching so we won't do calculations every time - * setGeometry is called. - */ - QRect* lastReceivedRect; - /* Contains geometry */ - QRect* _geometry; - -}; - -#endif /* QASPECTRATIOLAYOUT_H_ */ diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/Load.png Binary file QTfrontend/res/Load.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnAISurvival.png Binary file QTfrontend/res/btnAISurvival.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnAISurvival@2x.png Binary file QTfrontend/res/btnAISurvival@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnArtillery.png Binary file QTfrontend/res/btnArtillery.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnArtillery@2x.png Binary file QTfrontend/res/btnArtillery@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnBorder.png Binary file QTfrontend/res/btnBorder.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnBorder@2x.png Binary file QTfrontend/res/btnBorder@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnBottomBorder.png Binary file QTfrontend/res/btnBottomBorder.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnBottomBorder@2x.png Binary file QTfrontend/res/btnBottomBorder@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnDisableGirders.png Binary file QTfrontend/res/btnDisableGirders.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnDisableGirders@2x.png Binary file QTfrontend/res/btnDisableGirders@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnDisableLandObjects.png Binary file QTfrontend/res/btnDisableLandObjects.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnDisableLandObjects@2x.png Binary file QTfrontend/res/btnDisableLandObjects@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnDisabled.png diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnForts.png Binary file QTfrontend/res/btnForts.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnForts@2x.png Binary file QTfrontend/res/btnForts@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnInfAttack.png Binary file QTfrontend/res/btnInfAttack.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnInfAttack@2x.png Binary file QTfrontend/res/btnInfAttack@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnInvulnerable.png Binary file QTfrontend/res/btnInvulnerable.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnInvulnerable@2x.png Binary file QTfrontend/res/btnInvulnerable@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnKarma.png Binary file QTfrontend/res/btnKarma.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnKarma@2x.png Binary file QTfrontend/res/btnKarma@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnKing.png Binary file QTfrontend/res/btnKing.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnKing@2x.png Binary file QTfrontend/res/btnKing@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnLaserSight.png Binary file QTfrontend/res/btnLaserSight.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnLaserSight@2x.png Binary file QTfrontend/res/btnLaserSight@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnLowGravity.png Binary file QTfrontend/res/btnLowGravity.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnLowGravity@2x.png Binary file QTfrontend/res/btnLowGravity@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnMoreWind.png Binary file QTfrontend/res/btnMoreWind.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnMoreWind@2x.png Binary file QTfrontend/res/btnMoreWind@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnNoWind.png Binary file QTfrontend/res/btnNoWind.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnNoWind@2x.png Binary file QTfrontend/res/btnNoWind@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnOverlay.png Binary file QTfrontend/res/btnOverlay.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnOverlay@2x.png Binary file QTfrontend/res/btnOverlay@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnPerHogAmmo.png Binary file QTfrontend/res/btnPerHogAmmo.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnPerHogAmmo@2x.png Binary file QTfrontend/res/btnPerHogAmmo@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnPlaceHog.png Binary file QTfrontend/res/btnPlaceHog.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnPlaceHog@2x.png Binary file QTfrontend/res/btnPlaceHog@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnRandomOrder.png Binary file QTfrontend/res/btnRandomOrder.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnRandomOrder@2x.png Binary file QTfrontend/res/btnRandomOrder@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnResetHealth.png Binary file QTfrontend/res/btnResetHealth.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnResetHealth@2x.png Binary file QTfrontend/res/btnResetHealth@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnResetWeps.png Binary file QTfrontend/res/btnResetWeps.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnResetWeps@2x.png Binary file QTfrontend/res/btnResetWeps@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnSharedAmmo.png Binary file QTfrontend/res/btnSharedAmmo.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnSharedAmmo@2x.png Binary file QTfrontend/res/btnSharedAmmo@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnSolid.png Binary file QTfrontend/res/btnSolid.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnSolid@2x.png Binary file QTfrontend/res/btnSolid@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnTagTeam.png Binary file QTfrontend/res/btnTagTeam.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnTagTeam@2x.png Binary file QTfrontend/res/btnTagTeam@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnTeamsDivide.png Binary file QTfrontend/res/btnTeamsDivide.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnTeamsDivide@2x.png Binary file QTfrontend/res/btnTeamsDivide@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnVampiric.png Binary file QTfrontend/res/btnVampiric.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/res/btnVampiric@2x.png Binary file QTfrontend/res/btnVampiric@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/selectWeapon.cpp --- a/QTfrontend/selectWeapon.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,294 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "selectWeapon.h" -#include "weaponItem.h" -#include "hwconsts.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QImage getAmmoImage(int num) -{ - static QImage ammo(":Ammos.png"); - int x = num/(ammo.height()/32); - int y = (num-((ammo.height()/32)*x))*32; - x*=32; - return ammo.copy(x, y, 32, 32); -} - -SelWeaponItem::SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent) : - QWidget(parent) -{ - QHBoxLayout* hbLayout = new QHBoxLayout(this); - hbLayout->setSpacing(1); - hbLayout->setMargin(1); - - QLabel* lbl = new QLabel(this); - lbl->setPixmap(QPixmap::fromImage(getAmmoImage(iconNum))); - lbl->setMaximumWidth(30); - lbl->setGeometry(0, 0, 30, 30); - hbLayout->addWidget(lbl); - - item = new WeaponItem(image, imagegrey, this); - item->setItemsNum(wNum); - item->setInfinityState(allowInfinite); - hbLayout->addWidget(item); - - hbLayout->setStretchFactor(lbl, 1); - hbLayout->setStretchFactor(item, 99); - hbLayout->setAlignment(lbl, Qt::AlignLeft | Qt::AlignVCenter); - hbLayout->setAlignment(item, Qt::AlignLeft | Qt::AlignVCenter); -} - -void SelWeaponItem::setItemsNum(const unsigned char num) -{ - item->setItemsNum(num); -} - -unsigned char SelWeaponItem::getItemsNum() const -{ - return item->getItemsNum(); -} - -void SelWeaponItem::setEnabled(bool value) -{ - item->setEnabled(value); -} - -SelWeaponWidget::SelWeaponWidget(int numItems, QWidget* parent) : - QFrame(parent), - m_numItems(numItems) -{ - wconf = new QSettings(cfgdir->absolutePath() + "/weapons.ini", QSettings::IniFormat, this); - - for(int i = 0; i < cDefaultAmmos.size(); ++i) - wconf->setValue(cDefaultAmmos[i].first, cDefaultAmmos[i].second); - - QStringList keys = wconf->allKeys(); - for(int i = 0; i < keys.size(); i++) - { - if (wconf->value(keys[i]).toString().size() != cDefaultAmmoStore->size()) - wconf->remove(keys[i]); - } - - QString currentState = *cDefaultAmmoStore; - - QTabWidget * tbw = new QTabWidget(this); - QWidget * page1 = new QWidget(this); - p1Layout = new QGridLayout(page1); - p1Layout->setSpacing(1); - p1Layout->setMargin(1); - QWidget * page2 = new QWidget(this); - p2Layout = new QGridLayout(page2); - p2Layout->setSpacing(1); - p2Layout->setMargin(1); - QWidget * page3 = new QWidget(this); - p3Layout = new QGridLayout(page3); - p3Layout->setSpacing(1); - p3Layout->setMargin(1); - QWidget * page4 = new QWidget(this); - p4Layout = new QGridLayout(page4); - p4Layout->setSpacing(1); - p4Layout->setMargin(1); - - tbw->addTab(page1, tr("Weapon set")); - tbw->addTab(page2, tr("Probabilities")); - tbw->addTab(page4, tr("Ammo in boxes")); - tbw->addTab(page3, tr("Delays")); - - QGridLayout * pageLayout = new QGridLayout(this); - pageLayout->addWidget(tbw); - - - int j = -1; - int i = 0, k = 0; - for(; i < m_numItems; ++i) { - if (i == 6) continue; - if (i == 52) continue; // Disable structures for now - if (k % 4 == 0) ++j; - SelWeaponItem * swi = new SelWeaponItem(true, i, currentState[i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this); - weaponItems[i].append(swi); - p1Layout->addWidget(swi, j, k % 4); - - SelWeaponItem * pwi = new SelWeaponItem(false, i, currentState[numItems + i].digitValue(), QImage(":/res/ammopicbox.png"), QImage(":/res/ammopicboxgrey.png"), this); - weaponItems[i].append(pwi); - p2Layout->addWidget(pwi, j, k % 4); - - SelWeaponItem * dwi = new SelWeaponItem(false, i, currentState[numItems*2 + i].digitValue(), QImage(":/res/ammopicdelay.png"), QImage(":/res/ammopicdelaygrey.png"), this); - weaponItems[i].append(dwi); - p3Layout->addWidget(dwi, j, k % 4); - - SelWeaponItem * awi = new SelWeaponItem(false, i, currentState[numItems*3 + i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this); - weaponItems[i].append(awi); - p4Layout->addWidget(awi, j, k % 4); - - ++k; - } - - //pLayout->setRowStretch(5, 100); - m_name = new QLineEdit(this); - pageLayout->addWidget(m_name, i, 0, 1, 5); -} - -void SelWeaponWidget::setWeapons(const QString& ammo) -{ - bool enable = true; - for(int i = 0; i < cDefaultAmmos.size(); i++) - if (!cDefaultAmmos[i].first.compare(m_name->text())) { - enable = false; - } - for(int i = 0; i < m_numItems; ++i) { - twi::iterator it = weaponItems.find(i); - if (it == weaponItems.end()) continue; - it.value()[0]->setItemsNum(ammo[i].digitValue()); - it.value()[1]->setItemsNum(ammo[m_numItems + i].digitValue()); - it.value()[2]->setItemsNum(ammo[m_numItems*2 + i].digitValue()); - it.value()[3]->setItemsNum(ammo[m_numItems*3 + i].digitValue()); - it.value()[0]->setEnabled(enable); - it.value()[1]->setEnabled(enable); - it.value()[2]->setEnabled(enable); - it.value()[3]->setEnabled(enable); - } - m_name->setEnabled(enable); -} - -void SelWeaponWidget::setDefault() -{ - for(int i = 0; i < cDefaultAmmos.size(); i++) - if (!cDefaultAmmos[i].first.compare(m_name->text())) { - return; - } - setWeapons(*cDefaultAmmoStore); -} - -void SelWeaponWidget::save() -{ - for(int i = 0; i < cDefaultAmmos.size(); i++) - if (!cDefaultAmmos[i].first.compare(m_name->text())) { - QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not overwrite default weapon set '%1'!").arg(cDefaultAmmos[i].first)); - return; - } - - if (m_name->text() == "") return; - - QString state1; - QString state2; - QString state3; - QString state4; - - for(int i = 0; i < m_numItems; ++i) { - twi::const_iterator it = weaponItems.find(i); - int num = it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum(); // 9 is for 'skip turn' - state1.append(QString::number(num)); - int prob = it == weaponItems.end() ? 0 : it.value()[1]->getItemsNum(); - state2.append(QString::number(prob)); - int del = it == weaponItems.end() ? 0 : it.value()[2]->getItemsNum(); - state3.append(QString::number(del)); - int am = it == weaponItems.end() ? 0 : it.value()[3]->getItemsNum(); - state4.append(QString::number(am)); - } - if (curWeaponsName != "") { - // remove old entry - wconf->remove(curWeaponsName); - } - wconf->setValue(m_name->text(), state1 + state2 + state3 + state4); - emit weaponsChanged(); -} - -int SelWeaponWidget::operator [] (unsigned int weaponIndex) const -{ - twi::const_iterator it = weaponItems.find(weaponIndex); - return it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum(); -} - -QString SelWeaponWidget::getWeaponsString(const QString& name) const -{ - return wconf->value(name).toString(); -} - -void SelWeaponWidget::deleteWeaponsName() -{ - if (curWeaponsName == "") return; - - for(int i = 0; i < cDefaultAmmos.size(); i++) - if (!cDefaultAmmos[i].first.compare(m_name->text())) { - QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not delete default weapon set '%1'!").arg(cDefaultAmmos[i].first)); - return; - } - - QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Weapons"), QMessageBox::tr("Really delete this weapon set?"), QMessageBox::Ok | QMessageBox::Cancel); - - if (reallyDelete.exec() == QMessageBox::Ok) { - wconf->remove(curWeaponsName); - emit weaponsDeleted(); - } -} - -void SelWeaponWidget::newWeaponsName() -{ - QString newName = tr("new"); - if(wconf->contains(newName)) { - //name already used -> look for an appropriate name: - int i=2; - while(wconf->contains(newName = tr("new")+QString::number(i++))); - } - setWeaponsName(newName); -} - -void SelWeaponWidget::setWeaponsName(const QString& name) -{ - m_name->setText(name); - - curWeaponsName = name; - - if(name != "" && wconf->contains(name)) { - setWeapons(wconf->value(name).toString()); - } else { - setWeapons(*cDefaultAmmoStore); - } -} - -QStringList SelWeaponWidget::getWeaponNames() const -{ - return wconf->allKeys(); -} - -void SelWeaponWidget::copy() -{ - if(wconf->contains(curWeaponsName)) { - QString ammo = getWeaponsString(curWeaponsName); - QString newName = tr("copy of") + " " + curWeaponsName; - if(wconf->contains(newName)) { - //name already used -> look for an appropriate name: - int i=2; - while(wconf->contains(newName = tr("copy of") + " " + curWeaponsName+QString::number(i++))); - } - setWeaponsName(newName); - setWeapons(ammo); - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/selectWeapon.h --- a/QTfrontend/selectWeapon.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,92 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _SELECT_WEAPON_INCLUDED -#define _SELECT_WEAPON_INCLUDED - -#include -#include -#include - -class QGridLayout; -class WeaponItem; -class QLineEdit; -class QSettings; - -class SelWeaponItem : public QWidget -{ - Q_OBJECT - -public: - SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent=0); - - unsigned char getItemsNum() const; - void setItemsNum(const unsigned char num); - void setEnabled(bool value); - - private: - WeaponItem* item; -}; - -class SelWeaponWidget : public QFrame -{ - Q_OBJECT - - public: - SelWeaponWidget(int numItems, QWidget* parent=0); - QString getWeaponsString(const QString& name) const; - QStringList getWeaponNames() const; - - public slots: - void setDefault(); - void setWeapons(const QString& ammo); - //sets the name of the current set - void setWeaponsName(const QString& name); - void deleteWeaponsName(); - void newWeaponsName(); - void save(); - void copy(); - - signals: - void weaponsChanged(); - void weaponsDeleted(); - - private: - //the name of the current weapon set - QString curWeaponsName; - - QLineEdit* m_name; - - //storage for all the weapons sets - QSettings* wconf; - - const int m_numItems; - int operator [] (unsigned int weaponIndex) const; - - typedef QList ItemsList; - typedef QMap twi; - twi weaponItems; - //layout element for each tab: - QGridLayout* p1Layout; - QGridLayout* p2Layout; - QGridLayout* p3Layout; - QGridLayout* p4Layout; -}; - -#endif // _SELECT_WEAPON_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/tcpBase.cpp --- a/QTfrontend/tcpBase.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,166 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "tcpBase.h" - -#include -#include - -#include - -#include "hwconsts.h" - -QList srvsList; -QPointer TCPBase::IPCServer(0); - -TCPBase::~TCPBase() -{ -} - -TCPBase::TCPBase(bool demoMode) : - m_isDemoMode(demoMode), - IPCSocket(0) -{ - if(!IPCServer) { - IPCServer = new QTcpServer(0); - IPCServer->setMaxPendingConnections(1); - if (!IPCServer->listen(QHostAddress::LocalHost)) { - QMessageBox::critical(0, tr("Error"), - tr("Unable to start the server: %1.") - .arg(IPCServer->errorString())); - exit(0); // FIXME - should be graceful exit here - } - } - ipc_port=IPCServer->serverPort(); -} - -void TCPBase::NewConnection() -{ - if(IPCSocket) { - // connection should be already finished - return; - } - disconnect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); - IPCSocket = IPCServer->nextPendingConnection(); - if(!IPCSocket) return; - connect(IPCSocket, SIGNAL(disconnected()), this, SLOT(ClientDisconnect())); - connect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); - SendToClientFirst(); -} - -void TCPBase::RealStart() -{ - connect(IPCServer, SIGNAL(newConnection()), this, SLOT(NewConnection())); - IPCSocket = 0; - - QProcess * process; - process = new QProcess; - connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(StartProcessError(QProcess::ProcessError))); - QStringList arguments=getArguments(); - - // redirect everything written on stdout/stderr - if(isDevBuild) - process->setProcessChannelMode(QProcess::ForwardedChannels); - process->start(bindir->absolutePath() + "/hwengine", arguments); -} - -void TCPBase::ClientDisconnect() -{ - disconnect(IPCSocket, SIGNAL(readyRead()), this, SLOT(ClientRead())); - onClientDisconnect(); - - if(srvsList.size()==1) srvsList.pop_front(); - emit isReadyNow(); - IPCSocket->deleteLater(); - deleteLater(); -} - -void TCPBase::ClientRead() -{ - QByteArray readed=IPCSocket->readAll(); - if(readed.isEmpty()) return; - readbuffer.append(readed); - onClientRead(); -} - -void TCPBase::StartProcessError(QProcess::ProcessError error) -{ - QMessageBox::critical(0, tr("Error"), - tr("Unable to run engine: %1 (") - .arg(error) + bindir->absolutePath() + "/hwengine)"); -} - -void TCPBase::tcpServerReady() -{ - disconnect(srvsList.takeFirst(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); - - RealStart(); -} - -void TCPBase::Start() -{ - if(srvsList.isEmpty()) { - srvsList.push_back(this); - } else { - connect(srvsList.back(), SIGNAL(isReadyNow()), this, SLOT(tcpServerReady())); - srvsList.push_back(this); - return; - } - - RealStart(); -} - -void TCPBase::onClientRead() -{ -} - -void TCPBase::onClientDisconnect() -{ -} - -void TCPBase::SendToClientFirst() -{ -} - -void TCPBase::SendIPC(const QByteArray & buf) -{ - if (buf.size() > MAXMSGCHARS) return; - quint8 len = buf.size(); - RawSendIPC(QByteArray::fromRawData((char *)&len, 1) + buf); -} - -void TCPBase::RawSendIPC(const QByteArray & buf) -{ - if (!IPCSocket) - { - toSendBuf += buf; - } else - { - if (toSendBuf.size() > 0) - { - IPCSocket->write(toSendBuf); - if(m_isDemoMode) demo.append(toSendBuf); - toSendBuf.clear(); - } - if(!buf.isEmpty()) { - IPCSocket->write(buf); - if(m_isDemoMode) demo.append(buf); - } - } -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/tcpBase.h --- a/QTfrontend/tcpBase.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,81 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _TCPBASE_INCLUDED -#define _TCPBASE_INCLUDED - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#define MAXMSGCHARS 255 - -class TCPBase : public QObject -{ - Q_OBJECT - - public: - TCPBase(bool demoMode); - virtual ~TCPBase(); - - signals: - void isReadyNow(); - - protected: - quint16 ipc_port; - - void Start(); - - QByteArray readbuffer; - - QByteArray toSendBuf; - QByteArray demo; - - void SendIPC(const QByteArray & buf); - void RawSendIPC(const QByteArray & buf); - - virtual QStringList getArguments()=0; - virtual void onClientRead(); - virtual void onClientDisconnect(); - virtual void SendToClientFirst(); - - private: - static QPointer IPCServer; - - bool m_isDemoMode; - void RealStart(); - QPointer IPCSocket; - - private slots: - void NewConnection(); - void ClientDisconnect(); - void ClientRead(); - void StartProcessError(QProcess::ProcessError error); - - void tcpServerReady(); -}; - -#endif // _TCPBASE_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/team.cpp --- a/QTfrontend/team.cpp Sun Oct 16 19:02:48 2011 +0200 +++ b/QTfrontend/team.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -25,115 +25,113 @@ #include "team.h" #include "hwform.h" -#include "pageeditteam.h" -#include "hwconsts.h" #include "hats.h" HWTeam::HWTeam(const QString & teamname) : - difficulty(0), - numHedgehogs(4), + m_difficulty(0), + m_numHedgehogs(4), m_isNetTeam(false) { - TeamName = teamname; - OldTeamName = TeamName; - for (int i = 0; i < 8; i++) + m_name = teamname; + OldTeamName = m_name; + for (int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { - Hedgehogs[i].Name = (QLineEdit::tr("hedgehog %1").arg(i+1)); - Hedgehogs[i].Hat = "NoHat"; + m_hedgehogs[i].Name = (QLineEdit::tr("hedgehog %1").arg(i+1)); + m_hedgehogs[i].Hat = "NoHat"; } - Grave = "Statue"; - Fort = "Plane"; - Voicepack = "Default"; - Flag = "hedgewars"; + m_grave = "Statue"; + m_fort = "Plane"; + m_voicepack = "Default"; + m_flag = "hedgewars"; for(int i = 0; i < BINDS_NUMBER; i++) { - binds[i].action = cbinds[i].action; - binds[i].strbind = cbinds[i].strbind; + m_binds[i].action = cbinds[i].action; + m_binds[i].strbind = cbinds[i].strbind; } - Rounds = 0; - Wins = 0; - CampaignProgress = 0; + m_rounds = 0; + m_wins = 0; + m_campaignProgress = 0; } HWTeam::HWTeam(const QStringList& strLst) : - numHedgehogs(4), + m_numHedgehogs(4), m_isNetTeam(true) { // net teams are configured from QStringList if(strLst.size() != 23) throw HWTeamConstructException(); - TeamName = strLst[0]; - Grave = strLst[1]; - Fort = strLst[2]; - Voicepack = strLst[3]; - Flag = strLst[4]; - Owner = strLst[5]; - difficulty = strLst[6].toUInt(); - for(int i = 0; i < 8; i++) + m_name = strLst[0]; + m_grave = strLst[1]; + m_fort = strLst[2]; + m_voicepack = strLst[3]; + m_flag = strLst[4]; + m_owner = strLst[5]; + m_difficulty = strLst[6].toUInt(); + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { - Hedgehogs[i].Name=strLst[i * 2 + 7]; - Hedgehogs[i].Hat=strLst[i * 2 + 8]; + m_hedgehogs[i].Name=strLst[i * 2 + 7]; + m_hedgehogs[i].Hat=strLst[i * 2 + 8]; // Somehow claymore managed an empty hat. Until we figure out how, this should avoid a repeat // Checking net teams is probably pointless, but can't hurt. - if (Hedgehogs[i].Hat.isEmpty()) Hedgehogs[i].Hat = "NoHat"; + if (m_hedgehogs[i].Hat.isEmpty()) m_hedgehogs[i].Hat = "NoHat"; } - Rounds = 0; - Wins = 0; - CampaignProgress = 0; + m_rounds = 0; + m_wins = 0; + m_campaignProgress = 0; } HWTeam::HWTeam() : - difficulty(0), - numHedgehogs(4), + m_difficulty(0), + m_numHedgehogs(4), m_isNetTeam(false) { - TeamName = QString("Team"); - for (int i = 0; i < 8; i++) + m_name = QString("Team"); + for (int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { - Hedgehogs[i].Name.sprintf("hedgehog %d", i); - Hedgehogs[i].Hat = "NoHat"; + m_hedgehogs[i].Name.sprintf("hedgehog %d", i); + m_hedgehogs[i].Hat = "NoHat"; } - Grave = QString("Simple"); // default - Fort = QString("Island"); // default - Voicepack = "Default"; - Flag = "hedgewars"; + m_grave = QString("Simple"); // default + m_fort = QString("Island"); // default + m_voicepack = "Default"; + m_flag = "hedgewars"; for(int i = 0; i < BINDS_NUMBER; i++) { - binds[i].action = cbinds[i].action; - binds[i].strbind = cbinds[i].strbind; + m_binds[i].action = cbinds[i].action; + m_binds[i].strbind = cbinds[i].strbind; } - Rounds = 0; - Wins = 0; - CampaignProgress = 0; + m_rounds = 0; + m_wins = 0; + m_campaignProgress = 0; } -bool HWTeam::LoadFromFile() +bool HWTeam::loadFromFile() { - QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + TeamName + ".hwt", QSettings::IniFormat, 0); + QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + m_name + ".hwt", QSettings::IniFormat, 0); teamfile.setIniCodec("UTF-8"); - TeamName = teamfile.value("Team/Name", TeamName).toString(); - Grave = teamfile.value("Team/Grave", "Statue").toString(); - Fort = teamfile.value("Team/Fort", "Plane").toString(); - Voicepack = teamfile.value("Team/Voicepack", "Default").toString(); - Flag = teamfile.value("Team/Flag", "hedgewars").toString(); - difficulty = teamfile.value("Team/Difficulty", 0).toInt(); - Rounds = teamfile.value("Team/Rounds", 0).toInt(); - Wins = teamfile.value("Team/Wins", 0).toInt(); - CampaignProgress = teamfile.value("Team/CampaignProgress", 0).toInt(); - for(int i = 0; i < 8; i++) + m_name = teamfile.value("Team/Name", m_name).toString(); + m_grave = teamfile.value("Team/Grave", "Statue").toString(); + m_fort = teamfile.value("Team/Fort", "Plane").toString(); + m_voicepack = teamfile.value("Team/Voicepack", "Default").toString(); + m_flag = teamfile.value("Team/Flag", "hedgewars").toString(); + m_difficulty = teamfile.value("Team/Difficulty", 0).toInt(); + m_rounds = teamfile.value("Team/Rounds", 0).toInt(); + m_wins = teamfile.value("Team/Wins", 0).toInt(); + m_campaignProgress = teamfile.value("Team/CampaignProgress", 0).toInt(); + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { QString hh = QString("Hedgehog%1/").arg(i); - Hedgehogs[i].Name = teamfile.value(hh + "Name", QString("hedgehog %1").arg(i+1)).toString(); - Hedgehogs[i].Hat = teamfile.value(hh + "Hat", "NoHat").toString(); - Hedgehogs[i].Rounds = teamfile.value(hh + "Rounds", 0).toInt(); - Hedgehogs[i].Kills = teamfile.value(hh + "Kills", 0).toInt(); - Hedgehogs[i].Deaths = teamfile.value(hh + "Deaths", 0).toInt(); - Hedgehogs[i].Suicides = teamfile.value(hh + "Suicides", 0).toInt(); + m_hedgehogs[i].Name = teamfile.value(hh + "Name", QString("hedgehog %1").arg(i+1)).toString(); + m_hedgehogs[i].Hat = teamfile.value(hh + "Hat", "NoHat").toString(); + m_hedgehogs[i].Rounds = teamfile.value(hh + "Rounds", 0).toInt(); + m_hedgehogs[i].Kills = teamfile.value(hh + "Kills", 0).toInt(); + m_hedgehogs[i].Deaths = teamfile.value(hh + "Deaths", 0).toInt(); + m_hedgehogs[i].Suicides = teamfile.value(hh + "Suicides", 0).toInt(); } for(int i = 0; i < BINDS_NUMBER; i++) - binds[i].strbind = teamfile.value(QString("Binds/%1").arg(binds[i].action), cbinds[i].strbind).toString(); + m_binds[i].strbind = teamfile.value(QString("Binds/%1").arg(m_binds[i].action), cbinds[i].strbind).toString(); for(int i = 0; i < MAX_ACHIEVEMENTS; i++) if(achievements[i][0][0]) AchievementProgress[i] = teamfile.value(QString("Achievements/%1").arg(achievements[i][0]), 0).toUInt(); @@ -142,52 +140,52 @@ return true; } -bool HWTeam::FileExists() +bool HWTeam::fileExists() { - QFile f(cfgdir->absolutePath() + "/Teams/" + TeamName + ".hwt"); + QFile f(cfgdir->absolutePath() + "/Teams/" + m_name + ".hwt"); return f.exists(); } -bool HWTeam::DeleteFile() +bool HWTeam::deleteFile() { if(m_isNetTeam) return false; - QFile cfgfile(cfgdir->absolutePath() + "/Teams/" + TeamName + ".hwt"); + QFile cfgfile(cfgdir->absolutePath() + "/Teams/" + m_name + ".hwt"); cfgfile.remove(); return true; } -bool HWTeam::SaveToFile() +bool HWTeam::saveToFile() { - if (OldTeamName != TeamName) + if (OldTeamName != m_name) { QFile cfgfile(cfgdir->absolutePath() + "/Teams/" + OldTeamName + ".hwt"); cfgfile.remove(); - OldTeamName = TeamName; + OldTeamName = m_name; } - QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + TeamName + ".hwt", QSettings::IniFormat, 0); + QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + m_name + ".hwt", QSettings::IniFormat, 0); teamfile.setIniCodec("UTF-8"); - teamfile.setValue("Team/Name", TeamName); - teamfile.setValue("Team/Grave", Grave); - teamfile.setValue("Team/Fort", Fort); - teamfile.setValue("Team/Voicepack", Voicepack); - teamfile.setValue("Team/Flag", Flag); - teamfile.setValue("Team/Difficulty", difficulty); - teamfile.setValue("Team/Rounds", Rounds); - teamfile.setValue("Team/Wins", Wins); - teamfile.setValue("Team/CampaignProgress", CampaignProgress); - for(int i = 0; i < 8; i++) + teamfile.setValue("Team/Name", m_name); + teamfile.setValue("Team/Grave", m_grave); + teamfile.setValue("Team/Fort", m_fort); + teamfile.setValue("Team/Voicepack", m_voicepack); + teamfile.setValue("Team/Flag", m_flag); + teamfile.setValue("Team/Difficulty", m_difficulty); + teamfile.setValue("Team/Rounds", m_rounds); + teamfile.setValue("Team/Wins", m_wins); + teamfile.setValue("Team/CampaignProgress", m_campaignProgress); + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { QString hh = QString("Hedgehog%1/").arg(i); - teamfile.setValue(hh + "Name", Hedgehogs[i].Name); - teamfile.setValue(hh + "Hat", Hedgehogs[i].Hat); - teamfile.setValue(hh + "Rounds", Hedgehogs[i].Rounds); - teamfile.setValue(hh + "Kills", Hedgehogs[i].Kills); - teamfile.setValue(hh + "Deaths", Hedgehogs[i].Deaths); - teamfile.setValue(hh + "Suicides", Hedgehogs[i].Suicides); + teamfile.setValue(hh + "Name", m_hedgehogs[i].Name); + teamfile.setValue(hh + "Hat", m_hedgehogs[i].Hat); + teamfile.setValue(hh + "Rounds", m_hedgehogs[i].Rounds); + teamfile.setValue(hh + "Kills", m_hedgehogs[i].Kills); + teamfile.setValue(hh + "Deaths", m_hedgehogs[i].Deaths); + teamfile.setValue(hh + "Suicides", m_hedgehogs[i].Suicides); } for(int i = 0; i < BINDS_NUMBER; i++) - teamfile.setValue(QString("Binds/%1").arg(binds[i].action), binds[i].strbind); + teamfile.setValue(QString("Binds/%1").arg(m_binds[i].action), m_binds[i].strbind); for(int i = 0; i < MAX_ACHIEVEMENTS; i++) if(achievements[i][0][0]) teamfile.setValue(QString("Achievements/%1").arg(achievements[i][0]), AchievementProgress[i]); @@ -196,82 +194,34 @@ return true; } -void HWTeam::SetToPage(HWForm * hwform) -{ - hwform->ui.pageEditTeam->TeamNameEdit->setText(TeamName); - hwform->ui.pageEditTeam->CBTeamLvl->setCurrentIndex(difficulty); - for(int i = 0; i < 8; i++) - { - hwform->ui.pageEditTeam->HHNameEdit[i]->setText(Hedgehogs[i].Name); - if (Hedgehogs[i].Hat.startsWith("Reserved")) - hwform->ui.pageEditTeam->HHHats[i]->setCurrentIndex(hwform->ui.pageEditTeam->HHHats[i]->findData("Reserved "+Hedgehogs[i].Hat.remove(0,40), Qt::DisplayRole)); - else - hwform->ui.pageEditTeam->HHHats[i]->setCurrentIndex(hwform->ui.pageEditTeam->HHHats[i]->findData(Hedgehogs[i].Hat, Qt::DisplayRole)); - } - hwform->ui.pageEditTeam->CBGrave->setCurrentIndex(hwform->ui.pageEditTeam->CBGrave->findText(Grave)); - hwform->ui.pageEditTeam->CBFlag->setCurrentIndex(hwform->ui.pageEditTeam->CBFlag->findData(Flag)); - - hwform->ui.pageEditTeam->CBFort->setCurrentIndex(hwform->ui.pageEditTeam->CBFort->findText(Fort)); - hwform->ui.pageEditTeam->CBVoicepack->setCurrentIndex(hwform->ui.pageEditTeam->CBVoicepack->findText(Voicepack)); - //hwform->ui.pageEditTeam->CBFort_activated(Fort); - - for(int i = 0; i < BINDS_NUMBER; i++) - { - hwform->ui.pageEditTeam->CBBind[i]->setCurrentIndex(hwform->ui.pageEditTeam->CBBind[i]->findData(binds[i].strbind)); - } -} - -void HWTeam::GetFromPage(HWForm * hwform) -{ - TeamName = hwform->ui.pageEditTeam->TeamNameEdit->text(); - difficulty = hwform->ui.pageEditTeam->CBTeamLvl->currentIndex(); - for(int i = 0; i < 8; i++) - { - Hedgehogs[i].Name = hwform->ui.pageEditTeam->HHNameEdit[i]->text(); - if (hwform->ui.pageEditTeam->HHHats[i]->currentText().startsWith("Reserved")) - Hedgehogs[i].Hat = "Reserved"+playerHash+hwform->ui.pageEditTeam->HHHats[i]->currentText().remove(0,9); - else - Hedgehogs[i].Hat = hwform->ui.pageEditTeam->HHHats[i]->currentText(); - } - - Grave = hwform->ui.pageEditTeam->CBGrave->currentText(); - Fort = hwform->ui.pageEditTeam->CBFort->currentText(); - Voicepack = hwform->ui.pageEditTeam->CBVoicepack->currentText(); - Flag = hwform->ui.pageEditTeam->CBFlag->itemData(hwform->ui.pageEditTeam->CBFlag->currentIndex()).toString(); - for(int i = 0; i < BINDS_NUMBER; i++) - { - binds[i].strbind = hwform->ui.pageEditTeam->CBBind[i]->itemData(hwform->ui.pageEditTeam->CBBind[i]->currentIndex()).toString(); - } -} - -QStringList HWTeam::TeamGameConfig(quint32 InitHealth) const +QStringList HWTeam::teamGameConfig(quint32 InitHealth) const { QStringList sl; if (m_isNetTeam) { - sl.push_back(QString("eaddteam %3 %1 %2").arg(teamColor.rgb() & 0xffffff).arg(TeamName).arg(QString(QCryptographicHash::hash(Owner.toLatin1(), QCryptographicHash::Md5).toHex()))); + sl.push_back(QString("eaddteam %3 %1 %2").arg(m_color.rgb() & 0xffffff).arg(m_name).arg(QString(QCryptographicHash::hash(m_owner.toLatin1(), QCryptographicHash::Md5).toHex()))); sl.push_back("erdriven"); } - else sl.push_back(QString("eaddteam %3 %1 %2").arg(teamColor.rgb() & 0xffffff).arg(TeamName).arg(playerHash)); + else sl.push_back(QString("eaddteam %3 %1 %2").arg(m_color.rgb() & 0xffffff).arg(m_name).arg(playerHash)); - sl.push_back(QString("egrave " + Grave)); - sl.push_back(QString("efort " + Fort)); - sl.push_back(QString("evoicepack " + Voicepack)); - sl.push_back(QString("eflag " + Flag)); + sl.push_back(QString("egrave " + m_grave)); + sl.push_back(QString("efort " + m_fort)); + sl.push_back(QString("evoicepack " + m_voicepack)); + sl.push_back(QString("eflag " + m_flag)); if (!m_isNetTeam) for(int i = 0; i < BINDS_NUMBER; i++) - if(!binds[i].strbind.isEmpty()) - sl.push_back(QString("ebind " + binds[i].strbind + " " + binds[i].action)); + if(!m_binds[i].strbind.isEmpty()) + sl.push_back(QString("ebind " + m_binds[i].strbind + " " + m_binds[i].action)); - for (int t = 0; t < numHedgehogs; t++) + for (int t = 0; t < m_numHedgehogs; t++) { sl.push_back(QString("eaddhh %1 %2 %3") - .arg(QString::number(difficulty), + .arg(QString::number(m_difficulty), QString::number(InitHealth), - Hedgehogs[t].Name)); + m_hedgehogs[t].Name)); sl.push_back(QString("ehat %1") - .arg(Hedgehogs[t].Hat)); + .arg(m_hedgehogs[t].Hat)); } return sl; } @@ -283,11 +233,70 @@ bool HWTeam::operator==(const HWTeam& t1) const { - return TeamName==t1.TeamName; + return m_name==t1.m_name; } bool HWTeam::operator<(const HWTeam& t1) const { - return TeamName #include "binds.h" #include "achievements.h" +#include "hwconsts.h" class HWForm; class GameUIConfig; @@ -32,6 +33,7 @@ { }; +// structure for customization and statistics of a single hedgehog struct HWHog { QString Name; @@ -39,45 +41,89 @@ int Rounds, Kills, Deaths, Suicides; }; +// class representing a team class HWTeam { public: + + // constructors HWTeam(const QString & teamname); HWTeam(const QStringList& strLst); HWTeam(); - bool isNetTeam() const; + // file operations + static HWTeam loadFromFile(const QString & teamName); + bool loadFromFile(); + bool deleteFile(); + bool saveToFile(); + bool fileExists(); - QString TeamName; - QString Grave; - QString Fort; - QString Flag; - QString Voicepack; - QString Owner; - int Rounds; - int Wins; - int CampaignProgress; - HWHog Hedgehogs[8]; - unsigned int AchievementProgress[MAX_ACHIEVEMENTS]; - unsigned int difficulty; - BindAction binds[BINDS_NUMBER]; + // attribute getters + unsigned int campaignProgress() const; + QColor color() const; + unsigned int difficulty() const; + QString flag() const; + QString fort() const; + QString grave() const; + const HWHog & hedgehog(unsigned int idx) const; + bool isNetTeam() const; + QString keyBind(unsigned int idx) const; + QString name() const; + unsigned char numHedgehogs() const; + QString owner() const; + QString voicepack() const; - unsigned char numHedgehogs; - QColor teamColor; + // attribute setters + void bindKey(unsigned int idx, const QString & key); + void setColor(const QColor & color); + void setDifficulty(unsigned int level); + void setFlag(const QString & flag); + void setFort(const QString & fort); + void setGrave(const QString & grave); + void setHedgehog(unsigned int idx, HWHog hh); + void setName(const QString & name); + void setNumHedgehogs(unsigned char num); + void setVoicepack(const QString & voicepack); - bool LoadFromFile(); - bool DeleteFile(); - bool SaveToFile(); - bool FileExists(); - void SetToPage(HWForm * hwform); - void GetFromPage(HWForm * hwform); - QStringList TeamGameConfig(quint32 InitHealth) const; + // increments for statistical info + void incRounds(); + void incWins(); + // convert team info into strings for further computation + QStringList teamGameConfig(quint32 InitHealth) const; + + // comparison operators bool operator==(const HWTeam& t1) const; bool operator<(const HWTeam& t1) const; + + + private: + + QString OldTeamName; + + // class members that contain the general team info and settings + QString m_name; + QString m_grave; + QString m_fort; + QString m_flag; + QString m_voicepack; + HWHog m_hedgehogs[HEDGEHOGS_PER_TEAM]; + unsigned int m_difficulty; + BindAction m_binds[BINDS_NUMBER]; + + // class members that contain info for the current game setup + unsigned char m_numHedgehogs; + QColor m_color; bool m_isNetTeam; - QString OldTeamName; + QString m_owner; + + // class members that contain statistics, etc. + unsigned int m_campaignProgress; + unsigned int m_rounds; + unsigned int m_wins; + unsigned int AchievementProgress[MAX_ACHIEVEMENTS]; + }; diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/teamselect.cpp --- a/QTfrontend/teamselect.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,281 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include - -#include -#include -#include -#include -#include - -#include "vertScrollArea.h" -#include "teamselect.h" -#include "teamselhelper.h" -#include "frameTeam.h" - -void TeamSelWidget::addTeam(HWTeam team) -{ - if(team.isNetTeam()) { - framePlaying->addTeam(team, true); - curPlayingTeams.push_back(team); - connect(framePlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), - this, SLOT(netTeamStatusChanged(const HWTeam&))); - connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)), - this, SLOT(hhNumChanged(const HWTeam&))); - dynamic_cast(framePlaying->getTeamWidget(team))->hhNumChanged(); - connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)), - this, SLOT(proxyTeamColorChanged(const HWTeam&))); - } else { - frameDontPlaying->addTeam(team, false); - m_curNotPlayingTeams.push_back(team); - if(m_acceptOuter) { - connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), - this, SLOT(pre_changeTeamStatus(HWTeam))); - } else { - connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), - this, SLOT(changeTeamStatus(HWTeam))); - } - } - emit setEnabledGameStart(curPlayingTeams.size()>1); -} - -void TeamSelWidget::setInteractivity(bool interactive) -{ - framePlaying->setInteractivity(interactive); -} - -void TeamSelWidget::hhNumChanged(const HWTeam& team) -{ - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - if(itPlay==curPlayingTeams.end()) - { - qWarning() << QString("hhNumChanged: team '%1' not found").arg(team.TeamName); - return; - } - itPlay->numHedgehogs=team.numHedgehogs; - emit hhogsNumChanged(team); -} - -void TeamSelWidget::proxyTeamColorChanged(const HWTeam& team) -{ - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - if(itPlay==curPlayingTeams.end()) - { - qWarning() << QString("proxyTeamColorChanged: team '%1' not found").arg(team.TeamName); - return; - } - itPlay->teamColor=team.teamColor; - emit teamColorChanged(team); -} - -void TeamSelWidget::changeHHNum(const HWTeam& team) -{ - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - if(itPlay==curPlayingTeams.end()) - { - qWarning() << QString("changeHHNum: team '%1' not found").arg(team.TeamName); - return; - } - itPlay->numHedgehogs=team.numHedgehogs; - - framePlaying->setHHNum(team); -} - -void TeamSelWidget::changeTeamColor(const HWTeam& team) -{ - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - if(itPlay==curPlayingTeams.end()) - { - qWarning() << QString("changeTeamColor: team '%1' not found").arg(team.TeamName); - return; - } - itPlay->teamColor=team.teamColor; - - framePlaying->setTeamColor(team); -} - -void TeamSelWidget::removeNetTeam(const HWTeam& team) -{ - //qDebug() << QString("removeNetTeam: removing team '%1'").arg(team.TeamName); - for(;;) { - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - if(itPlay==curPlayingTeams.end()) - { - qWarning() << QString("removeNetTeam: team '%1' not found").arg(team.TeamName); - break; - } - if(itPlay->isNetTeam()) { - QObject::disconnect(framePlaying->getTeamWidget(*itPlay), SIGNAL(teamStatusChanged(HWTeam))); - framePlaying->removeTeam(team); - curPlayingTeams.erase(itPlay); - break; - } - } - emit setEnabledGameStart(curPlayingTeams.size()>1); -} - -void TeamSelWidget::netTeamStatusChanged(const HWTeam& team) -{ - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - -} - -//void TeamSelWidget::removeTeam(__attribute__ ((unused)) HWTeam team) -//{ - //curDontPlayingTeams.erase(std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team)); -//} - -void TeamSelWidget::changeTeamStatus(HWTeam team) -{ - QList::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team); - QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); - - bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end(); - - if(!willBePlaying) { - // playing team => dont playing - m_curNotPlayingTeams.push_back(*itPlay); - emit teamNotPlaying(*itPlay); - curPlayingTeams.erase(itPlay); - } else { - // return if max playing teams reached - if(framePlaying->isFullTeams()) return; - // dont playing team => playing - team=*itDontPlay; // for net team info saving in framePlaying (we have only name with netID from network) - itDontPlay->teamColor=framePlaying->getNextColor(); - curPlayingTeams.push_back(*itDontPlay); - if(!m_acceptOuter) emit teamWillPlay(*itDontPlay); - m_curNotPlayingTeams.erase(itDontPlay); - } - - FrameTeams* pRemoveTeams; - FrameTeams* pAddTeams; - if(!willBePlaying) { - pRemoveTeams=framePlaying; - pAddTeams=frameDontPlaying; - } else { - pRemoveTeams=frameDontPlaying; - pAddTeams=framePlaying; - } - - pAddTeams->addTeam(team, willBePlaying); - pRemoveTeams->removeTeam(team); - if(!team.isNetTeam() && m_acceptOuter && !willBePlaying) { - connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), - this, SLOT(pre_changeTeamStatus(HWTeam))); - } else { - connect(pAddTeams->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), - this, SLOT(changeTeamStatus(HWTeam))); - } - if(willBePlaying) { - connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)), - this, SLOT(hhNumChanged(const HWTeam&))); - dynamic_cast(framePlaying->getTeamWidget(team))->hhNumChanged(); - connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)), - this, SLOT(proxyTeamColorChanged(const HWTeam&))); - emit teamColorChanged(((TeamShowWidget*)framePlaying->getTeamWidget(team))->getTeam()); - } - - QSize szh=pAddTeams->sizeHint(); - QSize szh1=pRemoveTeams->sizeHint(); - if(szh.isValid() && szh1.isValid()) { - pAddTeams->resize(pAddTeams->size().width(), szh.height()); - pRemoveTeams->resize(pRemoveTeams->size().width(), szh1.height()); - } - - emit setEnabledGameStart(curPlayingTeams.size()>1); -} - -void TeamSelWidget::addScrArea(FrameTeams* pfteams, QColor color, int fixedHeight) -{ - VertScrArea* area = new VertScrArea(color); - area->setWidget(pfteams); - mainLayout.addWidget(area, 30); - if (fixedHeight > 0) - { - area->setMinimumHeight(fixedHeight); - area->setMaximumHeight(fixedHeight); - area->setStyleSheet( - "FrameTeams{" - "border: solid;" - "border-width: 1px;" - "border-radius: 16px;" - "border-color: #ffcc00;" - "}" - ); - } -} - -TeamSelWidget::TeamSelWidget(QWidget* parent) : - QGroupBox(parent), mainLayout(this), m_acceptOuter(false) -{ - setTitle(QGroupBox::tr("Playing teams")); - framePlaying = new FrameTeams(); - frameDontPlaying = new FrameTeams(); - - QPalette p; - p.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); - addScrArea(framePlaying, p.color(QPalette::Window).light(105), 250); - addScrArea(frameDontPlaying, p.color(QPalette::Window).dark(105), 0); -} - -void TeamSelWidget::setAcceptOuter(bool acceptOuter) -{ - m_acceptOuter=acceptOuter; -} - -void TeamSelWidget::resetPlayingTeams(const QList& teamslist) -{ - //for(it=curPlayingTeams.begin(); it!=curPlayingTeams.end(); it++) { - //framePlaying->removeTeam(*it); - //} - framePlaying->resetTeams(); - framePlaying->resetColors(); - curPlayingTeams.clear(); - //for(it=curDontPlayingTeams.begin(); it!=curDontPlayingTeams.end(); it++) { - //frameDontPlaying->removeTeam(*it); - //} - frameDontPlaying->resetTeams(); - m_curNotPlayingTeams.clear(); - - foreach(HWTeam team, teamslist) - addTeam(team); -} - -bool TeamSelWidget::isPlaying(HWTeam team) const -{ - return std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team)!=curPlayingTeams.end(); -} - -QList TeamSelWidget::getPlayingTeams() const -{ - return curPlayingTeams; -} - -QList TeamSelWidget::getNotPlayingTeams() const -{ - return m_curNotPlayingTeams; -} - -void TeamSelWidget::pre_changeTeamStatus(HWTeam team) -{ - team.teamColor=framePlaying->getNextColor(); - emit acceptRequested(team); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/teamselect.h --- a/QTfrontend/teamselect.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _TEAM_SELECT_INCLUDED -#define _TEAM_SELECT_INCLUDED - -#include -#include -#include -#include - -#include "team.h" - -class TeamSelWidget; -class FrameTeams; -class QFrame; -class QPushButton; - -using namespace std; - -class TeamSelWidget : public QGroupBox -{ - Q_OBJECT - - public: - TeamSelWidget(QWidget* parent); - void setAcceptOuter(bool acceptOuter); - void removeNetTeam(const HWTeam& team); - void resetPlayingTeams(const QList& teamslist); - bool isPlaying(HWTeam team) const; - QList getPlayingTeams() const; - QList getNotPlayingTeams() const; - void setInteractivity(bool interactive); - - public slots: - void addTeam(HWTeam team); - void netTeamStatusChanged(const HWTeam& team); - void changeHHNum(const HWTeam&); - void changeTeamColor(const HWTeam&); - void changeTeamStatus(HWTeam team); - - signals: - void setEnabledGameStart(bool); - void teamWillPlay(HWTeam team); - void teamNotPlaying(const HWTeam& team); - void hhogsNumChanged(const HWTeam&); - void teamColorChanged(const HWTeam&); - void acceptRequested(HWTeam team); - - private slots: - void pre_changeTeamStatus(HWTeam); - void hhNumChanged(const HWTeam& team); - void proxyTeamColorChanged(const HWTeam& team); - - private: - void addScrArea(FrameTeams* pfteams, QColor color, int maxHeight); - FrameTeams* frameDontPlaying; - FrameTeams* framePlaying; - - QVBoxLayout mainLayout; - bool m_acceptOuter; - - QList curPlayingTeams; - QList m_curNotPlayingTeams; -}; - -#endif // _TEAM_SELECT_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/teamselhelper.cpp --- a/QTfrontend/teamselhelper.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,154 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include -#include -#include - -#include - -#include "teamselhelper.h" -#include "hwconsts.h" -#include "frameTeam.h" - -void TeamLabel::teamButtonClicked() -{ - emit teamActivated(text()); -} - -TeamShowWidget::TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent) : - QWidget(parent), mainLayout(this), m_team(team), m_isPlaying(isPlaying), phhoger(0), - colorButt(0) -{ - QPalette newPalette = palette(); - newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); - setPalette(newPalette); - setAutoFillBackground(true); - - mainLayout.setSpacing(3); - mainLayout.setMargin(0); - this->setMaximumHeight(38); - this->setMinimumHeight(38); - QIcon difficultyIcon=team.isNetTeam() ? - QIcon(QString(":/res/botlevels/net%1.png").arg(m_team.difficulty)) - : QIcon(QString(":/res/botlevels/%1.png").arg(m_team.difficulty)); - - butt = new QPushButton(difficultyIcon, team.TeamName.replace("&","&&"), this); - butt->setFlat(true); - butt->setToolTip(team.Owner); - mainLayout.addWidget(butt); - butt->setStyleSheet("QPushButton{" - "icon-size: 48px;" - "text-align: left;" - "background-color: #0d0544;" - "color: orange;" - "font: bold;" - "border-width: 2px;" - "margin: 6px 0px 6px 0px;" - "}"); - - if(m_isPlaying) { - // team color - colorButt = new QPushButton(this); - colorButt->setMaximumWidth(26); - colorButt->setMinimumHeight(26); - colorButt->setGeometry(0, 0, 26, 26); - - changeTeamColor(); - connect(colorButt, SIGNAL(clicked()), this, SLOT(changeTeamColor())); - mainLayout.addWidget(colorButt); - - phhoger = new CHedgehogerWidget(QImage(":/res/hh25x25.png"), QImage(":/res/hh25x25grey.png"), this); - connect(phhoger, SIGNAL(hedgehogsNumChanged()), this, SLOT(hhNumChanged())); - phhoger->setHHNum(team.numHedgehogs); - mainLayout.addWidget(phhoger); - } else { - } - - QObject::connect(butt, SIGNAL(clicked()), this, SLOT(activateTeam())); - //QObject::connect(bText, SIGNAL(clicked()), this, SLOT(activateTeam())); -} - -void TeamShowWidget::setInteractivity(bool interactive) -{ - if(m_team.isNetTeam()) { - butt->setEnabled(interactive); - } - - colorButt->setEnabled(interactive); - phhoger->setEnabled(interactive); -} - -void TeamShowWidget::setHHNum(unsigned int num) -{ - phhoger->setHHNum(num); -} - -void TeamShowWidget::hhNumChanged() -{ - m_team.numHedgehogs=phhoger->getHedgehogsNum(); - emit hhNmChanged(m_team); -} - -void TeamShowWidget::activateTeam() -{ - emit teamStatusChanged(m_team); -} - -/*HWTeamTempParams TeamShowWidget::getTeamParams() const -{ - if(!phhoger) throw; - HWTeamTempParams params; - params.numHedgehogs=phhoger->getHedgehogsNum(); - params.teamColor=colorButt->palette().color(QPalette::Button); - return params; -}*/ - -void TeamShowWidget::changeTeamColor(QColor color) -{ - FrameTeams* pOurFrameTeams=dynamic_cast(parentWidget()); - if(!color.isValid()) { - if(++pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) { - pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin(); - } - color=*pOurFrameTeams->currentColor; - } else { - // set according color iterator - pOurFrameTeams->currentColor=std::find(pOurFrameTeams->availableColors.begin(), - pOurFrameTeams->availableColors.end(), color); - if(pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) { - // error condition - pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin(); - } - } - - colorButt->setStyleSheet(QString("QPushButton{" - "background-color: %1;" - "border-width: 1px;" - "border-radius: 2px;" - "}").arg(pOurFrameTeams->currentColor->name())); - - m_team.teamColor=color; - emit teamColorChanged(m_team); -} - -HWTeam TeamShowWidget::getTeam() const -{ - return m_team; -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/teamselhelper.h --- a/QTfrontend/teamselhelper.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,80 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2007 Igor Ulyanov - * Copyright (c) 2007-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _TEAMSEL_HELPER_INCLUDED -#define _TEAMSEL_HELPER_INCLUDED - -#include -#include -#include -#include - -#include "teamselect.h" -#include "hedgehogerWidget.h" - -class TeamLabel : public QLabel -{ - Q_OBJECT - - public: - TeamLabel(const QString& inp_str) : QLabel(inp_str) {}; - - signals: - void teamActivated(QString team_name); - - public slots: - void teamButtonClicked(); - -}; - -class TeamShowWidget : public QWidget -{ - Q_OBJECT - - public slots: - void changeTeamColor(QColor color=QColor()); - void hhNumChanged(); - - private slots: - void activateTeam(); - - public: - TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent); - void setPlaying(bool isPlaying); - void setHHNum(unsigned int num); - void setInteractivity(bool interactive); - HWTeam getTeam() const; - - private: - TeamShowWidget(); - QHBoxLayout mainLayout; - HWTeam m_team; - bool m_isPlaying; - CHedgehogerWidget* phhoger; - QPushButton* colorButt; - QPushButton* butt; -// QPushButton* bText; - - signals: - void teamStatusChanged(HWTeam team); - void hhNmChanged(const HWTeam&); - void teamColorChanged(const HWTeam&); -}; - -#endif // _TEAMSEL_HELPER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/themesmodel.cpp --- a/QTfrontend/themesmodel.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,49 +0,0 @@ - -#include "themesmodel.h" - -ThemesModel::ThemesModel(QStringList themes, QObject *parent) : - QAbstractListModel(parent) -{ -#if QT_VERSION >= QT_VERSION_CHECK(4, 7, 0) - m_data.reserve(themes.size()); -#endif - - foreach(QString theme, themes) - { - m_data.append(QHash()); - m_data.last().insert(Qt::DisplayRole, theme); - } -} - -int ThemesModel::rowCount(const QModelIndex &parent) const -{ - if(parent.isValid()) - return 0; - else - return m_data.size(); -} - -QVariant ThemesModel::data(const QModelIndex &index, int role) const -{ - if(index.column() > 0 || index.row() >= m_data.size()) - return QVariant(); - else - return m_data.at(index.row()).value(role); -} - -bool ThemesModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - if(index.column() > 0 || index.row() >= m_data.size()) - return false; - else - { - m_data[index.row()].insert(role, value); - - return true; - } - -} - - - - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/themesmodel.h --- a/QTfrontend/themesmodel.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,28 +0,0 @@ -#ifndef THEMESMODEL_H -#define THEMESMODEL_H - -#include -#include -#include - -class ThemesModel : public QAbstractListModel -{ - Q_OBJECT -public: - explicit ThemesModel(QStringList themes, QObject *parent = 0); - - int rowCount(const QModelIndex &parent = QModelIndex()) const; - QVariant data(const QModelIndex &index, int role) const; - bool setData(const QModelIndex &index, const QVariant &value, - int role = Qt::EditRole); - -signals: - -public slots: - -private: - - QList > m_data; -}; - -#endif // THEMESMODEL_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/togglebutton.cpp --- a/QTfrontend/togglebutton.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,52 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2009 Kristian Lehmann - * Copyright (c) 2009-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "togglebutton.h" - -ToggleButtonWidget::ToggleButtonWidget(QWidget * parent, QString img) - : QPushButton(parent) -{ - setCheckable(true); - - QPixmap pm(":/res/btnDisabled.png"); - QPainter * painter = new QPainter(); - - pmChecked.load(img); - pmDisabled.load(img); - - setMaximumWidth(pmChecked.width() + 6); - - painter->begin(&pmDisabled); - painter->drawPixmap(pmDisabled.rect(), pm); - painter->end(); - - setIconSize(pmDisabled.size()); - setIcon(pmDisabled); - - connect(this, SIGNAL(toggled(bool)), this, SLOT(eventToggled(bool))); -} - -ToggleButtonWidget::~ToggleButtonWidget() -{ -} - -void ToggleButtonWidget::eventToggled(bool checked) -{ - setIcon(checked ? pmChecked : pmDisabled); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/togglebutton.h --- a/QTfrontend/togglebutton.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,42 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2009 Kristian Lehmann - * Copyright (c) 2009-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef TOGGLEBUTTONWIDGET_H -#define TOGGLEBUTTONWIDGET_H - -#include -#include -#include -#include -#include - -class ToggleButtonWidget : public QPushButton -{ - Q_OBJECT -public: - ToggleButtonWidget(QWidget * parent, QString img); - ~ToggleButtonWidget(); -private: - QPixmap pmChecked; - QPixmap pmDisabled; -private slots: - void eventToggled(bool checked); -}; - -#endif // TOGGLEBUTTONWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/dialog/input_ip.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/dialog/input_ip.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,68 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include + +#include "input_ip.h" + +HWHostPortDialog::HWHostPortDialog(QWidget* parent) : QDialog(parent) +{ + QGridLayout * layout = new QGridLayout(this); + + QLabel * lbHost = new QLabel(this); + lbHost->setText(QLabel::tr("Host:")); + layout->addWidget(lbHost, 0, 0); + + QLabel * lbPort = new QLabel(this); + lbPort->setText(QLabel::tr("Port:")); + layout->addWidget(lbPort, 1, 0); + + leHost = new QLineEdit(this); + layout->addWidget(leHost, 0, 1, 1, 2); + + sbPort = new QSpinBox(this); + sbPort->setMinimum(0); + sbPort->setMaximum(65535); + layout->addWidget(sbPort, 1, 1, 1, 2); + + pbDefault = new QPushButton(this); + pbDefault->setText(QPushButton::tr("default")); + layout->addWidget(pbDefault, 1, 3); + + pbOK = new QPushButton(this); + pbOK->setText(QPushButton::tr("OK")); + pbOK->setDefault(true); + layout->addWidget(pbOK, 3, 1); + + pbCancel = new QPushButton(this); + pbCancel->setText(QPushButton::tr("Cancel")); + layout->addWidget(pbCancel, 3, 2); + + connect(pbOK, SIGNAL(clicked()), this, SLOT(accept())); + connect(pbCancel, SIGNAL(clicked()), this, SLOT(reject())); + connect(pbDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort())); +} + +void HWHostPortDialog::setDefaultPort() +{ + sbPort->setValue(46631); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/dialog/input_ip.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/dialog/input_ip.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,49 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + + +#ifndef INPUT_IP_H +#define INPUT_IP_H + +#include +#include + +class QLineEdit; +class QSpinBox; +class QPushButton; + +class HWHostPortDialog : public QDialog +{ + Q_OBJECT +public: + HWHostPortDialog(QWidget* parent = 0); + + QLineEdit* leHost; + QSpinBox* sbPort; + +private: + QPushButton* pbOK; + QPushButton* pbCancel; + QPushButton * pbDefault; + +private slots: + void setDefaultPort(); +}; + + +#endif // INPUT_IP_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageadmin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageadmin.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,112 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include + +#include "pageadmin.h" +#include "chatwidget.h" + +QLayout * PageAdmin::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + // 0 + pbAsk = addButton(tr("Fetch data"), pageLayout, 0, 0, 1, 3); + + // 1 + QLabel * lblSMN = new QLabel(this); + lblSMN->setText(tr("Server message for latest version:")); + pageLayout->addWidget(lblSMN, 1, 0); + + leServerMessageNew = new QLineEdit(this); + pageLayout->addWidget(leServerMessageNew, 1, 1); + + // 2 + QLabel * lblSMO = new QLabel(this); + lblSMO->setText(tr("Server message for previous versions:")); + pageLayout->addWidget(lblSMO, 2, 0); + + leServerMessageOld = new QLineEdit(this); + pageLayout->addWidget(leServerMessageOld, 2, 1); + + // 3 + QLabel * lblP = new QLabel(this); + lblP->setText(tr("Latest version protocol number:")); + pageLayout->addWidget(lblP, 3, 0); + + sbProtocol = new QSpinBox(this); + pageLayout->addWidget(sbProtocol, 3, 1); + + // 4 + QLabel * lblPreview = new QLabel(this); + lblPreview->setText(tr("MOTD preview:")); + pageLayout->addWidget(lblPreview, 4, 0); + + tb = new QTextBrowser(this); + tb->setOpenExternalLinks(true); + tb->document()->setDefaultStyleSheet(HWChatWidget::STYLE); + pageLayout->addWidget(tb, 4, 1, 1, 2); + + // 5 + pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), pageLayout, 5, 0); + + // 6 + pbSetSM = addButton(tr("Set data"), pageLayout, 6, 0, 1, 3); + + return pageLayout; +} + +void PageAdmin::connectSignals() +{ + connect(pbAsk, SIGNAL(clicked()), this, SIGNAL(askServerVars())); + connect(leServerMessageNew, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &))); + connect(leServerMessageOld, SIGNAL(textEdited(const QString &)), tb, SLOT(setHtml(const QString &))); + connect(pbClearAccountsCache, SIGNAL(clicked()), this, SIGNAL(clearAccountsCache())); + connect(pbSetSM, SIGNAL(clicked()), this, SLOT(smChanged())); +} + +PageAdmin::PageAdmin(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageAdmin::smChanged() +{ + emit setServerMessageNew(leServerMessageNew->text()); + emit setServerMessageOld(leServerMessageOld->text()); + emit setProtocol(sbProtocol->value()); +} + +void PageAdmin::serverMessageNew(const QString & str) +{ + leServerMessageNew->setText(str); +} + +void PageAdmin::serverMessageOld(const QString & str) +{ + leServerMessageOld->setText(str); +} +void PageAdmin::protocol(int proto) +{ + sbProtocol->setValue(proto); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageadmin.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageadmin.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,60 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_ADMIN_H +#define PAGE_ADMIN_H + +#include "AbstractPage.h" + +class PageAdmin : public AbstractPage +{ + Q_OBJECT + +public: + PageAdmin(QWidget* parent = 0); + +public slots: + void serverMessageNew(const QString & str); + void serverMessageOld(const QString & str); + void protocol(int proto); + +signals: + void setServerMessageNew(const QString & str); + void setServerMessageOld(const QString & str); + void setProtocol(int proto); + void askServerVars(); + void clearAccountsCache(); + +protected: + QLayout * bodyLayoutDefinition(); + void connectSignals(); + +private: + QLineEdit * leServerMessageNew; + QLineEdit * leServerMessageOld; + QPushButton * pbSetSM; + QPushButton * pbAsk; + QSpinBox * sbProtocol; + QTextBrowser * tb; + QPushButton * pbClearAccountsCache; + +private slots: + void smChanged(); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagecampaign.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagecampaign.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,53 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include + +#include "pagecampaign.h" + +QLayout * PageCampaign::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + pageLayout->setColumnStretch(0, 1); + pageLayout->setColumnStretch(1, 2); + pageLayout->setColumnStretch(2, 1); + pageLayout->setRowStretch(0, 1); + pageLayout->setRowStretch(3, 1); + + CBSelect = new QComboBox(this); + CBTeam = new QComboBox(this); + + pageLayout->addWidget(CBTeam, 1, 1); + pageLayout->addWidget(CBSelect, 2, 1); + + BtnStartCampaign = new QPushButton(this); + BtnStartCampaign->setFont(*font14); + BtnStartCampaign->setText(QPushButton::tr("Go!")); + pageLayout->addWidget(BtnStartCampaign, 2, 2); + + return pageLayout; +} + +PageCampaign::PageCampaign(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagecampaign.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagecampaign.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,39 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_CAMPAIGN_H +#define PAGE_CAMPAIGN_H + +#include "AbstractPage.h" + +class PageCampaign : public AbstractPage +{ + Q_OBJECT + +public: + PageCampaign(QWidget* parent = 0); + + QPushButton *BtnStartCampaign; + QComboBox *CBSelect; + QComboBox *CBTeam; + +protected: + QLayout * bodyLayoutDefinition(); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageconnecting.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageconnecting.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,43 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pageconnecting.h" + +QLayout * PageConnecting::bodyLayoutDefinition() +{ + QVBoxLayout * pageLayout = new QVBoxLayout(); + + QLabel * lblConnecting = new QLabel(this); + lblConnecting->setText(tr("Connecting...")); + pageLayout->addWidget(lblConnecting); + + return pageLayout; +} + +void PageConnecting::connectSignals() +{ + connect(this, SIGNAL(goBack()), this, SIGNAL(cancelConnection())); +} + +PageConnecting::PageConnecting(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageconnecting.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageconnecting.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,39 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_CONNECTING_H +#define PAGE_CONNECTING_H + +#include "AbstractPage.h" + +class PageConnecting : public AbstractPage +{ + Q_OBJECT + +public: + PageConnecting(QWidget* parent = 0); + +signals: + void cancelConnection(); + +protected: + QLayout * bodyLayoutDefinition(); + void connectSignals(); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagedata.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagedata.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,229 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pagedata.h" +#include "databrowser.h" +#include "hwconsts.h" + +#include "quazip.h" +#include "quazipfile.h" + +QLayout * PageDataDownload::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + pageLayout->setColumnStretch(0, 1); + pageLayout->setColumnStretch(1, 1); + pageLayout->setColumnStretch(2, 1); + + web = new DataBrowser(this); + pageLayout->addWidget(web, 0, 0, 1, 3); + + progressBarsLayout = new QVBoxLayout(); + pageLayout->addLayout(progressBarsLayout, 1, 0, 1, 3); + return pageLayout; +} + +void PageDataDownload::connectSignals() +{ + connect(web, SIGNAL(anchorClicked(QUrl)), this, SLOT(request(const QUrl&))); +} + +PageDataDownload::PageDataDownload(QWidget* parent) : AbstractPage(parent) +{ + initPage(); + + web->setOpenLinks(false); + fetchList(); +} + +void PageDataDownload::request(const QUrl &url) +{ + QUrl finalUrl; + if(url.host().isEmpty()) + finalUrl = QUrl("http://www.hedgewars.org" + url.path()); + else + finalUrl = url; + + if(url.path().endsWith(".zip")) + { + qWarning() << "Download Request" << url.toString(); + QString fileName = QFileInfo(url.toString()).fileName(); + + QNetworkRequest newRequest(finalUrl); + newRequest.setAttribute(QNetworkRequest::User, fileName); + + QNetworkAccessManager *manager = new QNetworkAccessManager(this); + QNetworkReply *reply = manager->get(newRequest); + connect(reply, SIGNAL(finished()), this, SLOT(fileDownloaded())); + connect(reply, SIGNAL(downloadProgress(qint64, qint64)), this, SLOT(downloadProgress(qint64, qint64))); + + QProgressBar *progressBar = new QProgressBar(this); + progressBarsLayout->addWidget(progressBar); + progressBars.insert(reply, progressBar); + } else + { + qWarning() << "Page Request" << url.toString(); + + QNetworkRequest newRequest(finalUrl); + + QNetworkAccessManager *manager = new QNetworkAccessManager(this); + QNetworkReply *reply = manager->get(newRequest); + connect(reply, SIGNAL(finished()), this, SLOT(pageDownloaded())); + } +} + + +void PageDataDownload::pageDownloaded() +{ + QNetworkReply * reply = qobject_cast(sender()); + + if(reply) + { + QString html = QString::fromUtf8(reply->readAll()); + int begin = html.indexOf(""); + int end = html.indexOf(""); + if(begin != -1 && begin < end) + { + html.truncate(end); + html.remove(0, begin); + } + web->setHtml(html); + } +} + +void PageDataDownload::fileDownloaded() +{ + QNetworkReply * reply = qobject_cast(sender()); + + if(reply) + { + QByteArray fileContents = reply->readAll(); + QProgressBar *progressBar = progressBars.value(reply, 0); + + if(progressBar) + { + progressBars.remove(reply); + progressBar->deleteLater(); + } + + extractDataPack(&fileContents); + } +} + +void PageDataDownload::downloadProgress(qint64 bytesRecieved, qint64 bytesTotal) +{ + QNetworkReply * reply = qobject_cast(sender()); + + if(reply) + { + QProgressBar *progressBar = progressBars.value(reply, 0); + + if(progressBar) + { + progressBar->setValue(bytesRecieved); + progressBar->setMaximum(bytesTotal); + } + } +} + +void PageDataDownload::fetchList() +{ + request(QUrl("http://hedgewars.org/content.html")); +} + +bool PageDataDownload::extractDataPack(QByteArray * buf) +{ + QBuffer buffer; + buffer.setBuffer(buf); + + QuaZip zip; + zip.setIoDevice(&buffer); + if(!zip.open(QuaZip::mdUnzip)) + { + qWarning("testRead(): zip.open(): %d", zip.getZipError()); + return false; + } + + QuaZipFile file(&zip); + + QDir extractDir(*cfgdir); + extractDir.cd("Data"); + + for(bool more = zip.goToFirstFile(); more; more = zip.goToNextFile()) + { + if(!file.open(QIODevice::ReadOnly)) + { + qWarning("file.open(): %d", file.getZipError()); + return false; + } + + + QString fileName = file.getActualFileName(); + QString filePath = extractDir.filePath(fileName); + if (fileName.endsWith("/")) + { + QFileInfo fi(filePath); + QDir().mkpath(fi.filePath()); + } else + { + qDebug() << "Extracting" << filePath; + QFile out(filePath); + if(!out.open(QFile::WriteOnly)) + { + qWarning() << "out.open():" << out.errorString(); + return false; + } + + out.write(file.readAll()); + + out.close(); + + if(file.getZipError() != UNZ_OK) { + qWarning("file.getFileName(): %d", file.getZipError()); + return false; + } + + if(!file.atEnd()) { + qWarning("read all but not EOF"); + return false; + } + } + + file.close(); + + if(file.getZipError()!=UNZ_OK) { + qWarning("file.close(): %d", file.getZipError()); + return false; + } + } + + zip.close(); + + return true; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagedata.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagedata.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,59 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_DATA_H +#define PAGE_DATA_H + +#include +#include "AbstractPage.h" + +class DataBrowser; +class QProgressBar; +class QNetworkReply; +class QVBoxLayout; + +class PageDataDownload : public AbstractPage +{ + Q_OBJECT + +public: + PageDataDownload(QWidget* parent = 0); + +public slots: + void fetchList(); + +protected: + QLayout * bodyLayoutDefinition(); + void connectSignals(); + +private: + DataBrowser *web; + QHash progressBars; + QVBoxLayout *progressBarsLayout; + + bool extractDataPack(QByteArray * buf); + +private slots: + void request(const QUrl &url); + + void pageDownloaded(); + void fileDownloaded(); + void downloadProgress(qint64, qint64); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagedrawmap.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagedrawmap.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,69 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include + +#include "pagedrawmap.h" +#include "drawmapwidget.h" + + +QLayout * PageDrawMap::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + pbUndo = addButton(tr("Undo"), pageLayout, 0, 0); + pbClear = addButton(tr("Clear"), pageLayout, 1, 0); + pbLoad = addButton(tr("Load"), pageLayout, 2, 0); + pbSave = addButton(tr("Save"), pageLayout, 3, 0); + + drawMapWidget = new DrawMapWidget(this); + pageLayout->addWidget(drawMapWidget, 0, 1, 5, 1); + + return pageLayout; +} + +void PageDrawMap::connectSignals() +{ + connect(pbUndo, SIGNAL(clicked()), drawMapWidget, SLOT(undo())); + connect(pbClear, SIGNAL(clicked()), drawMapWidget, SLOT(clear())); + connect(pbLoad, SIGNAL(clicked()), this, SLOT(load())); + connect(pbSave, SIGNAL(clicked()), this, SLOT(save())); +} + +PageDrawMap::PageDrawMap(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageDrawMap::load() +{ + QString fileName = QFileDialog::getOpenFileName(NULL, tr("Load drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)"); + + if(!fileName.isEmpty()) + drawMapWidget->load(fileName); +} + +void PageDrawMap::save() +{ + QString fileName = QFileDialog::getSaveFileName(NULL, tr("Save drawn map"), ".", tr("Drawn Maps") + " (*.hwmap);;" + tr("All files") + " (*)"); + + if(!fileName.isEmpty()) + drawMapWidget->save(fileName); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagedrawmap.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagedrawmap.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,51 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_DRAWMAP_H +#define PAGE_DRAWMAP_H + +#include "AbstractPage.h" + +class DrawMapWidget; + +class PageDrawMap : public AbstractPage +{ + Q_OBJECT + +public: + PageDrawMap(QWidget* parent = 0); + + DrawMapWidget * drawMapWidget; + +protected: + QLayout * bodyLayoutDefinition(); + void connectSignals(); + +private: + QPushButton * pbUndo; + QPushButton * pbClear; + QPushButton * pbLoad; + QPushButton * pbSave; + +private slots: + void load(); + void save(); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageeditteam.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageeditteam.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,523 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pageeditteam.h" +#include "sdlkeys.h" +#include "SquareLabel.h" +#include "hats.h" +#include "HWApplication.h" + +QLayout * PageEditTeam::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + QTabWidget * tbw = new QTabWidget(); + QWidget * page1 = new QWidget(this); + QWidget * page2 = new QWidget(this); + tbw->addTab(page1, tr("General")); + tbw->addTab(page2, tr("Advanced")); + pageLayout->addWidget(tbw, 0, 0, 1, 3); + + QHBoxLayout * page1Layout = new QHBoxLayout(page1); + page1Layout->setAlignment(Qt::AlignTop); + QGridLayout * page2Layout = new QGridLayout(page2); + +// ====== Page 1 ====== + QVBoxLayout * vbox1 = new QVBoxLayout(); + QVBoxLayout * vbox2 = new QVBoxLayout(); + page1Layout->addLayout(vbox1); + page1Layout->addLayout(vbox2); + + GBoxHedgehogs = new QGroupBox(this); + GBoxHedgehogs->setTitle(QGroupBox::tr("Team Members")); + GBoxHedgehogs->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + QGridLayout * GBHLayout = new QGridLayout(GBoxHedgehogs); + + HatsModel * hatsModel = new HatsModel(GBoxHedgehogs); + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + HHHats[i] = new QComboBox(GBoxHedgehogs); + HHHats[i]->setModel(hatsModel); + HHHats[i]->setIconSize(QSize(32, 37)); + //HHHats[i]->setSizeAdjustPolicy(QComboBox::AdjustToContents); + //HHHats[i]->setModelColumn(1); + //HHHats[i]->setMinimumWidth(132); + GBHLayout->addWidget(HHHats[i], i, 0); + + HHNameEdit[i] = new QLineEdit(GBoxHedgehogs); + HHNameEdit[i]->setMaxLength(64); + HHNameEdit[i]->setMinimumWidth(120); + GBHLayout->addWidget(HHNameEdit[i], i, 1); + + btnRandomHogName[i] = addButton(":/res/dice.png", GBHLayout, i, 3, true); + } + + btnRandomTeam = addButton(QPushButton::tr("Random Team"), GBHLayout, 9, false); + + vbox1->addWidget(GBoxHedgehogs); + + GBoxTeam = new QGroupBox(this); + GBoxTeam->setTitle(QGroupBox::tr("Team Settings")); + GBoxTeam->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + QGridLayout * GBTLayout = new QGridLayout(GBoxTeam); + QLabel * tmpLabel = new QLabel(GBoxTeam); + tmpLabel->setText(QLabel::tr("Name")); + GBTLayout->addWidget(tmpLabel, 0, 0); + tmpLabel = new QLabel(GBoxTeam); + tmpLabel->setText(QLabel::tr("Type")); + GBTLayout->addWidget(tmpLabel, 1, 0); + tmpLabel = new QLabel(GBoxTeam); + tmpLabel->setText(QLabel::tr("Grave")); + GBTLayout->addWidget(tmpLabel, 2, 0); + tmpLabel = new QLabel(GBoxTeam); + tmpLabel->setText(QLabel::tr("Flag")); + GBTLayout->addWidget(tmpLabel, 3, 0); + tmpLabel = new QLabel(GBoxTeam); + tmpLabel->setText(QLabel::tr("Voice")); + GBTLayout->addWidget(tmpLabel, 4, 0); + + TeamNameEdit = new QLineEdit(GBoxTeam); + TeamNameEdit->setMaxLength(64); + GBTLayout->addWidget(TeamNameEdit, 0, 1); + vbox2->addWidget(GBoxTeam); + + CBTeamLvl = new QComboBox(GBoxTeam); + CBTeamLvl->setIconSize(QSize(48, 48)); + CBTeamLvl->addItem(QIcon(":/res/botlevels/0.png"), QComboBox::tr("Human")); + for(int i = 5; i > 0; i--) + CBTeamLvl->addItem( + QIcon(QString(":/res/botlevels/%1.png").arg(6 - i)), + QString("%1 %2").arg(QComboBox::tr("Level")).arg(i) + ); + GBTLayout->addWidget(CBTeamLvl, 1, 1); + + CBGrave = new QComboBox(GBoxTeam); + CBGrave->setMaxCount(65535); + CBGrave->setIconSize(QSize(32, 32)); + GBTLayout->addWidget(CBGrave, 2, 1); + + CBFlag = new QComboBox(GBoxTeam); + CBFlag->setMaxCount(65535); + CBFlag->setIconSize(QSize(22, 15)); + GBTLayout->addWidget(CBFlag, 3, 1); + + QHBoxLayout * hbox = new QHBoxLayout(); + CBVoicepack = new QComboBox(GBoxTeam); + + hbox->addWidget(CBVoicepack, 100); + btnTestSound = addButton(":/res/PlaySound.png", hbox, 1, true); + hbox->setStretchFactor(btnTestSound, 1); + + GBTLayout->addLayout(hbox, 4, 1); + + GBoxFort = new QGroupBox(this); + GBoxFort->setTitle(QGroupBox::tr("Fort")); + QGridLayout * GBFLayout = new QGridLayout(GBoxFort); + CBFort = new QComboBox(GBoxFort); + CBFort->setMaxCount(65535); + GBFLayout->addWidget(CBFort, 0, 0); + FortPreview = new SquareLabel(GBoxFort); + FortPreview->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + FortPreview->setMinimumSize(128, 128); + FortPreview->setPixmap(QPixmap()); + // perhaps due to handling its own paintevents, SquareLabel doesn't play nice with the stars + //FortPreview->setAttribute(Qt::WA_PaintOnScreen, true); + GBFLayout->addWidget(FortPreview, 1, 0); + vbox2->addWidget(GBoxFort); + + vbox1->addStretch(); + vbox2->addStretch(); + +// ====== Page 2 ====== + GBoxBinds = new QGroupBox(this); + GBoxBinds->setTitle(QGroupBox::tr("Key binds")); + QGridLayout * GBBLayout = new QGridLayout(GBoxBinds); + BindsBox = new QToolBox(GBoxBinds); + BindsBox->setLineWidth(0); + GBBLayout->addWidget(BindsBox); + page2Layout->addWidget(GBoxBinds, 0, 0); + + quint16 i = 0; + quint16 num = 0; + QWidget * curW = NULL; + QGridLayout * pagelayout = NULL; + QLabel* l = NULL; + while (i < BINDS_NUMBER) { + if(cbinds[i].category != NULL) + { + if(curW != NULL) + { + l = new QLabel(curW); + l->setText(""); + pagelayout->addWidget(l, num++, 0, 1, 2); + } + curW = new QWidget(this); + BindsBox->addItem(curW, HWApplication::translate("binds (categories)", cbinds[i].category)); + pagelayout = new QGridLayout(curW); + num = 0; + } + if(cbinds[i].description != NULL) + { + l = new QLabel(curW); + l->setText((num > 0 ? QString("\n") : QString("")) + HWApplication::translate("binds (descriptions)", cbinds[i].description)); + pagelayout->addWidget(l, num++, 0, 1, 2); + } + + l = new QLabel(curW); + l->setText(HWApplication::translate("binds", cbinds[i].name)); + l->setAlignment(Qt::AlignRight); + pagelayout->addWidget(l, num, 0); + CBBind[i] = new QComboBox(curW); + for(int j = 0; sdlkeys[j][1][0] != '\0'; j++) + CBBind[i]->addItem(HWApplication::translate("binds (keys)", sdlkeys[j][1]).contains(": ") ? HWApplication::translate("binds (keys)", sdlkeys[j][1]) : HWApplication::translate("binds (keys)", "Keyboard") + QString(": ") + HWApplication::translate("binds (keys)", sdlkeys[j][1]), sdlkeys[j][0]); + pagelayout->addWidget(CBBind[i++], num++, 1); + } + + return pageLayout; +} + +QLayout * PageEditTeam::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout(); + + btnSave = addButton(":/res/Save.png", bottomLayout, 0, true);; + btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}"); + bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom); + + return bottomLayout; +} + +void PageEditTeam::connectSignals() +{ + connect(btnSave, SIGNAL(clicked()), this, SLOT(saveTeam())); + + signalMapper1 = new QSignalMapper(this); + signalMapper2 = new QSignalMapper(this); + + connect(signalMapper1, SIGNAL(mapped(int)), this, SLOT(fixHHname(int))); + connect(signalMapper2, SIGNAL(mapped(int)), this, SLOT(setRandomName(int))); + + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + connect(HHNameEdit[i], SIGNAL(editingFinished()), signalMapper1, SLOT(map())); + signalMapper1->setMapping(HHNameEdit[i], i); + + connect(btnRandomHogName[i], SIGNAL(clicked()), signalMapper2, SLOT(map())); + signalMapper2->setMapping(btnRandomHogName[i], i); + } + + connect(btnRandomTeam, SIGNAL(clicked()), this, SLOT(setRandomNames())); + + connect(btnTestSound, SIGNAL(clicked()), this, SLOT(testSound())); + + connect(CBFort, SIGNAL(currentIndexChanged(const QString &)), this, SLOT(CBFort_activated(const QString &))); +} + +PageEditTeam::PageEditTeam(QWidget* parent, SDLInteraction * sdli) : + AbstractPage(parent) +{ + initPage(); + + m_playerHash = "0000000000000000000000000000000000000000"; + mySdli = sdli; + + QDir tmpdir; + QStringList list; + tmpdir.cd(cfgdir->absolutePath()); + if (tmpdir.cd("Data/Sounds/voices")) + { + list = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); + CBVoicepack->addItems(list); + } + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Sounds/voices"); + QStringList tmplist = tmpdir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name); + QStringList tmplist2; + foreach (const QString & line, tmplist) + { + if (!list.contains(line,Qt::CaseInsensitive)) + tmplist2.append(line); + } + + CBVoicepack->addItems(tmplist2); + + QStringList userforts; + tmpdir.cd(cfgdir->absolutePath()); + if (tmpdir.cd("Data/Forts")) + { + tmpdir.setFilter(QDir::Files); + userforts = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1"); + CBFort->addItems(userforts); + } + + tmpdir.cd("../Graphics/Graves"); + QStringList userlist = tmpdir.entryList(QStringList("*.png")); + for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it ) + { + QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Graves/" + *it); + QIcon icon(pix.copy(0, 0, 32, 32)); + CBGrave->addItem(icon, QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1")); + } + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Forts"); + tmpdir.setFilter(QDir::Files); + + tmplist = tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1"); + QStringList dataforts; + foreach (const QString & line, tmplist) + { + if (!userforts.contains(line,Qt::CaseInsensitive)) + dataforts.append(line); + } + + CBFort->addItems(dataforts); + + tmpdir.cd("../Graphics/Graves"); + QStringList datalist = tmpdir.entryList(QStringList("*.png")); + foreach (const QString & line, datalist) + { + if (userlist.contains(line,Qt::CaseInsensitive)) continue; + QPixmap pix(datadir->absolutePath() + "/Graphics/Graves/" + line); + QIcon icon(pix.copy(0, 0, 32, 32)); + QString grave = line; + grave = grave.replace(QRegExp("^(.*)\\.png"), "\\1"); + CBGrave->addItem(icon, grave); + } + + // add the default flag + CBFlag->addItem(QIcon(QPixmap(datadir->absolutePath() + "/Graphics/Flags/hedgewars.png").copy(0, 0, 22, 15)), "Hedgewars", "hedgewars"); + CBFlag->insertSeparator(CBFlag->count()); + + tmpdir.cd(cfgdir->absolutePath()); + tmpdir.cd("Data/Graphics/Flags"); + userlist = tmpdir.entryList(QStringList("*.png")); + + // add all country flags + foreach (const QString & line, userlist) + { + QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + line); + QIcon icon(pix.copy(0, 0, 22, 15)); + // TODO improve readablility + if(line.compare("cpu.png") && line.compare("hedgewars.png") && (line.indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags + { + QString flag = line; + flag = flag.replace(QRegExp("^(.*)\\.png"), "\\1"); + CBFlag->addItem(icon, flag.replace("_", " "), flag); + } + } + + CBFlag->insertSeparator(CBFlag->count()); + + // add all community flags + for (QStringList::Iterator it = userlist.begin(); it != userlist.end(); ++it ) + { + QPixmap pix(cfgdir->absolutePath() + "/Data/Graphics/Flags/" + *it); + QIcon icon(pix.copy(0, 0, 22, 15)); + if(it->indexOf("cm_") > -1) // skip non community flags this time + { + QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); + CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag); + } + } + + CBFlag->insertSeparator(CBFlag->count()); + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Graphics/Flags"); + datalist = tmpdir.entryList(QStringList("*.png")); + + // add all country flags + for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it ) + { + if (userlist.contains(*it,Qt::CaseInsensitive)) continue; + QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it); + QIcon icon(pix.copy(0, 0, 22, 15)); + if(it->compare("cpu.png") && it->compare("hedgewars.png") && (it->indexOf("cm_") == -1)) // skip cpu and hedgewars flags as well as all community flags + { + QString flag = QString(*it).replace(QRegExp("^(.*)\\.png"), "\\1"); + CBFlag->addItem(icon, QString(flag).replace("_", " "), flag); + } + } + + CBFlag->insertSeparator(CBFlag->count()); + + // add all community flags + for (QStringList::Iterator it = datalist.begin(); it != datalist.end(); ++it ) + { + if (userlist.contains(*it,Qt::CaseInsensitive)) continue; + QPixmap pix(datadir->absolutePath() + "/Graphics/Flags/" + *it); + QIcon icon(pix.copy(0, 0, 22, 15)); + if(it->indexOf("cm_") > -1) // skip non community flags this time + { + QString flag = (*it).replace(QRegExp("^(.*)\\.png"), "\\1"); + CBFlag->addItem(icon, QString(flag).replace("cm_", QComboBox::tr("Community") + ": "), flag); + } + } +} + +void PageEditTeam::fixHHname(int idx) +{ + HHNameEdit[idx]->setText(HHNameEdit[idx]->text().trimmed()); + + if (HHNameEdit[idx]->text().isEmpty()) + HHNameEdit[idx]->setText(QLineEdit::tr("hedgehog %1").arg(idx+1)); +} + +void PageEditTeam::CBFort_activated(const QString & fortname) +{ + QFile tmp; + tmp.setFileName(cfgdir->absolutePath() + "/Data/Forts/" + fortname + "L.png"); + if (!tmp.exists()) tmp.setFileName(datadir->absolutePath() + "/Forts/" + fortname + "L.png"); + QPixmap pix(QFileInfo(tmp).absoluteFilePath()); + FortPreview->setPixmap(pix); +} + +void PageEditTeam::testSound() +{ + Mix_Chunk *sound; + QDir tmpdir; + mySdli->SDLMusicInit(); + + tmpdir.cd(cfgdir->absolutePath()); + if (!tmpdir.cd("Data/Sounds/voices/"+CBVoicepack->currentText())) + { + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Sounds/voices"); + tmpdir.cd(CBVoicepack->currentText()); + } + + QStringList list = tmpdir.entryList(QStringList() << "Illgetyou.ogg" << "Incoming.ogg" << "Stupid.ogg" << "Coward.ogg" << "Firstblood.ogg", QDir::Files); + if (list.size()) { + sound = Mix_LoadWAV(QString(tmpdir.absolutePath() + "/" + list[rand() % list.size()]).toLocal8Bit().constData()); + Mix_PlayChannel(-1, sound, 0); + } +} + +void PageEditTeam::createTeam(const QString & name, const QString & playerHash) +{ + m_playerHash = playerHash; + HWTeam newTeam(name); + loadTeam(newTeam); +} + +void PageEditTeam::editTeam(const QString & name, const QString & playerHash) +{ + m_playerHash = playerHash; + HWTeam team(name); + team.loadFromFile(); + loadTeam(team); +} + +void PageEditTeam::deleteTeam(const QString & name) +{ + QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Teams"), QMessageBox::tr("Really delete this team?"), QMessageBox::Ok | QMessageBox::Cancel, this); + + if (reallyDelete.exec() == QMessageBox::Ok) + HWTeam(name).deleteFile(); +} + +void PageEditTeam::setRandomNames() +{ + HWTeam team = data(); + HWNamegen::teamRandomNames(team, true); + loadTeam(team); +} + +void PageEditTeam::setRandomName(int hh_index) +{ + HWTeam team = data(); + HWNamegen::teamRandomName(team,hh_index); + loadTeam(team); +} + +void PageEditTeam::loadTeam(const HWTeam & team) +{ + TeamNameEdit->setText(team.name()); + CBTeamLvl->setCurrentIndex(team.difficulty()); + + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + HWHog hh = team.hedgehog(i); + + HHNameEdit[i]->setText(hh.Name); + + if (hh.Hat.startsWith("Reserved")) + hh.Hat = hh.Hat.remove(0,40); + + HHHats[i]->setCurrentIndex(HHHats[i]->findData(hh.Hat, Qt::DisplayRole)); + } + + CBGrave->setCurrentIndex(CBGrave->findText(team.grave())); + CBFlag->setCurrentIndex(CBFlag->findData(team.flag())); + + CBFort->setCurrentIndex(CBFort->findText(team.fort())); + CBVoicepack->setCurrentIndex(CBVoicepack->findText(team.voicepack())); + + for(int i = 0; i < BINDS_NUMBER; i++) + { + CBBind[i]->setCurrentIndex(CBBind[i]->findData(team.keyBind(i))); + } +} + +HWTeam PageEditTeam::data() +{ + HWTeam team(TeamNameEdit->text()); + team.setDifficulty(CBTeamLvl->currentIndex()); + + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + HWHog hh; + hh.Name = HHNameEdit[i]->text(); + hh.Hat = HHHats[i]->currentText(); + + if (hh.Hat.startsWith("Reserved")) + hh.Hat = "Reserved"+m_playerHash+hh.Hat.remove(0,9); + + team.setHedgehog(i,hh); + } + + team.setGrave(CBGrave->currentText()); + team.setFort(CBFort->currentText()); + team.setVoicepack(CBVoicepack->currentText()); + team.setFlag(CBFlag->itemData(CBFlag->currentIndex()).toString()); + + for(int i = 0; i < BINDS_NUMBER; i++) + { + team.bindKey(i,CBBind[i]->itemData(CBBind[i]->currentIndex()).toString()); + } + + return team; +} + +void PageEditTeam::saveTeam() +{ + data().saveToFile(); + emit teamEdited(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageeditteam.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageeditteam.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,94 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_EDITTEAM_H +#define PAGE_EDITTEAM_H + +#include "AbstractPage.h" +#include "binds.h" +#include "hwconsts.h" +#include "namegen.h" +#include "SDLs.h" + +#include "team.h" + +class SquareLabel; + +class PageEditTeam : public AbstractPage +{ + Q_OBJECT + +public: + PageEditTeam(QWidget* parent, SDLInteraction * sdli); + + void createTeam(const QString & name, const QString & playerHash); + void editTeam(const QString & name, const QString & playerHash); + void deleteTeam(const QString & name); + +signals: + void teamEdited(); + +public slots: + void CBFort_activated(const QString & gravename); + +private: + QSignalMapper* signalMapper1; + QSignalMapper* signalMapper2; + QGroupBox *GBoxHedgehogs; + QGroupBox *GBoxTeam; + QGroupBox *GBoxFort; + QComboBox *CBFort; + SquareLabel *FortPreview; + QComboBox *CBGrave; + QComboBox *CBFlag; + QComboBox *CBTeamLvl; + QComboBox *CBVoicepack; + QGroupBox *GBoxBinds; + QToolBox *BindsBox; + QLineEdit * TeamNameEdit; + QLineEdit * HHNameEdit[HEDGEHOGS_PER_TEAM]; + QComboBox * HHHats[HEDGEHOGS_PER_TEAM]; + QComboBox * CBBind[BINDS_NUMBER]; + SDLInteraction * mySdli; + HWTeam data(); + QString m_playerHash; + + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + + void loadTeam(const HWTeam & team); + + // page 1 + QPushButton * btnRandomHogName[HEDGEHOGS_PER_TEAM]; + QPushButton * btnRandomTeam; + QPushButton * btnTestSound; + + // footer + QPushButton * btnSave; + +private slots: + void saveTeam(); + void setRandomNames(); + void setRandomName(int hh_index); + void testSound(); + void fixHHname(int idx); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagegamestats.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagegamestats.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,274 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2010-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include + +#include "pagegamestats.h" +#include "team.h" + +FitGraphicsView::FitGraphicsView(QWidget* parent) : QGraphicsView(parent) +{ + +} + +void FitGraphicsView::resizeEvent(QResizeEvent * event) +{ + Q_UNUSED(event); + + fitInView(sceneRect()); +} + +QLayout * PageGameStats::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + pageLayout->setSpacing(20); + pageLayout->setColumnStretch(0, 1); + pageLayout->setColumnStretch(1, 1); + pageLayout->setContentsMargins(7, 7, 7, 0); + + QGroupBox * gb = new QGroupBox(this); + QVBoxLayout * gbl = new QVBoxLayout; + + // details + labelGameStats = new QLabel(this); + QLabel * l = new QLabel(this); + l->setTextFormat(Qt::RichText); + l->setText("

" + PageGameStats::tr("Details") + "

"); + l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + labelGameStats->setTextFormat(Qt::RichText); + labelGameStats->setAlignment(Qt::AlignTop); + labelGameStats->setWordWrap(true); + gbl->addWidget(l); + gbl->addWidget(labelGameStats); + gb->setLayout(gbl); + pageLayout->addWidget(gb, 1, 1, 1, 2); + + // graph + graphic = new FitGraphicsView(gb); + l = new QLabel(this); + l->setTextFormat(Qt::RichText); + l->setText("

" + PageGameStats::tr("Health graph") + "

"); + l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + gbl->addWidget(l); + gbl->addWidget(graphic); + graphic->scale(1.0, -1.0); + graphic->setBackgroundBrush(QBrush(Qt::black)); + + labelGameWin = new QLabel(this); + labelGameWin->setTextFormat(Qt::RichText); + pageLayout->addWidget(labelGameWin, 0, 0, 1, 2); + + // ranking box + gb = new QGroupBox(this); + gbl = new QVBoxLayout; + labelGameRank = new QLabel(gb); + l = new QLabel(this); + l->setTextFormat(Qt::RichText); + l->setText("

" + PageGameStats::tr("Ranking") + "

"); + l->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + gbl->addWidget(l); + gbl->addWidget(labelGameRank); + gb->setLayout(gbl); + + labelGameRank->setTextFormat(Qt::RichText); + labelGameRank->setAlignment(Qt::AlignTop); + pageLayout->addWidget(gb, 1, 0); + + return pageLayout; +} + +QLayout * PageGameStats::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout(); + + btnSave = addButton(":/res/Save.png", bottomLayout, 0, true); + btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}"); + bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom); + + return bottomLayout; +} + +void PageGameStats::connectSignals() +{ + connect(btnSave, SIGNAL(clicked()), this, SIGNAL(saveDemoRequested())); +} + +PageGameStats::PageGameStats(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageGameStats::AddStatText(const QString & msg) +{ + labelGameStats->setText(labelGameStats->text() + msg); +} + +void PageGameStats::clear() +{ + labelGameStats->setText(""); + healthPoints.clear(); + labelGameRank->setText(""); + playerPosition = 0; + lastColor = 0; +} + +void PageGameStats::renderStats() +{ + QGraphicsScene * scene = new QGraphicsScene(); + + QMap >::const_iterator i = healthPoints.constBegin(); + while (i != healthPoints.constEnd()) + { + quint32 c = i.key(); + QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255)); + QVector hps = i.value(); + + QPainterPath path; + if (hps.size()) + path.moveTo(0, hps[0]); + + for(int t = 1; t < hps.size(); ++t) + path.lineTo(t, hps[t]); + + scene->addPath(path, QPen(c)); + ++i; + } + + graphic->setScene(scene); + graphic->fitInView(graphic->sceneRect()); +} + +void PageGameStats::GameStats(char type, const QString & info) +{ + switch(type) { + case 'r' : { + labelGameWin->setText(QString("

%1

").arg(info)); + break; + } + case 'D' : { + int i = info.indexOf(' '); + QString message = "

" + PageGameStats::tr("The best shot award was won by %1 with %2 pts.").arg(info.mid(i + 1), info.left(i)) + "

"; + AddStatText(message); + break; + } + case 'k' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("The best killer is %1 with %2 kills in a turn.", "", num).arg(info.mid(i + 1), info.left(i)) + "

"; + AddStatText(message); + break; + } + case 'K' : { + int num = info.toInt(); + QString message = "

" + PageGameStats::tr("A total of %1 hedgehog(s) were killed during this round.", "", num).arg(num) + "

"; + AddStatText(message); + break; + } + case 'H' : { + int i = info.indexOf(' '); + quint32 clan = info.left(i).toInt(); + quint32 hp = info.mid(i + 1).toUInt(); + healthPoints[clan].append(hp); + break; + } + case 'T': { // local team stats + //AddStatText("

local team: " + info + "

"); + QStringList infol = info.split(":"); + HWTeam team(infol[0]); + if(team.fileExists()) // do some better test to avoid influence from scripted/predefined teams? + { + team.loadFromFile(); + team.incRounds(); + if(infol[1].toInt() > 0) // might require some better test for winning condition (or changed flag) ... WIP! + team.incWins(); // should draws count as wins? + //team.SaveToFile(); // don't save yet + } + break; + } + + case 'P' : { + int i = info.indexOf(' '); + playerPosition++; + QString color = info.left(i); + quint32 c = color.toInt(); + QColor clanColor = QColor(qRgb((c >> 16) & 255, (c >> 8) & 255, c & 255)); + + QString playerinfo = info.mid(i + 1); + + i = playerinfo.indexOf(' '); + + int kills = playerinfo.left(i).toInt(); + QString playername = playerinfo.mid(i + 1); + QString image; + + if (lastColor == c) playerPosition--; + lastColor = c; + + switch (playerPosition) + { + case 1: + image = ""; + break; + case 2: + image = ""; + break; + case 3: + image = ""; + break; + default: + image = ""; + break; + } + + QString message; + QString killstring = PageGameStats::tr("(%1 kill)", "", kills).arg(kills); + + message = QString("

%1 %2. %3 ").arg(image, QString::number(playerPosition), playername, clanColor.name()) + killstring + "

"; + + labelGameRank->setText(labelGameRank->text() + message); + break; + } + case 's' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("%1 thought it's good to shoot his own hedgehogs with %2 pts.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + AddStatText(message); + break; + } + case 'S' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("%1 killed %2 of his own hedgehogs.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + AddStatText(message); + break; + } + case 'B' : { + int i = info.indexOf(' '); + int num = info.left(i).toInt(); + QString message = "

" + PageGameStats::tr("%1 was scared and skipped turn %2 times.", "", num).arg(info.mid(i + 1)).arg(num) + "

"; + AddStatText(message); + break; + } + + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagegamestats.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagegamestats.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,73 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2010-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef STATSPAGE_H +#define STATSPAGE_H + +#include +#include +#include + +#include "AbstractPage.h" + +class FitGraphicsView : public QGraphicsView +{ + Q_OBJECT + +public: + FitGraphicsView(QWidget* parent = 0); + +protected: + void resizeEvent(QResizeEvent * event); +}; + +class PageGameStats : public AbstractPage +{ + Q_OBJECT + +public: + PageGameStats(QWidget* parent = 0); + + QPushButton *btnSave; + QLabel *labelGameStats; + QLabel *labelGameWin; + QLabel *labelGameRank; + FitGraphicsView * graphic; + +public slots: + void GameStats(char type, const QString & info); + void clear(); + void renderStats(); + +signals: + void saveDemoRequested(); + +private: + void AddStatText(const QString & msg); + + QMap > healthPoints; + unsigned int playerPosition; + quint32 lastColor; + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); +}; + +#endif // STATSPAGE_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageinfo.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageinfo.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,56 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pageinfo.h" +#include "about.h" + +QLayout * PageInfo::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + pageLayout->setColumnStretch(0, 1); + pageLayout->setColumnStretch(1, 1); + pageLayout->setColumnStretch(2, 1); + + about = new About(); + pageLayout->addWidget(about, 0, 0, 1, 3); + + return pageLayout; +} + +QLayout * PageInfo::footerLayoutDefinition() +{ + QGridLayout * bottomLayout = new QGridLayout(); + BtnSnapshots = addButton(":/res/Star.png", bottomLayout, 1, 1, true); + bottomLayout->setAlignment(BtnSnapshots, Qt::AlignRight | Qt::AlignVCenter); + return bottomLayout; +} + +void PageInfo::connectSignals() +{ + //TODO +} + +PageInfo::PageInfo(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageinfo.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageinfo.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,43 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_INFO_H +#define PAGE_INFO_H + +#include "AbstractPage.h" + +class About; + +class PageInfo : public AbstractPage +{ + Q_OBJECT + +public: + PageInfo(QWidget* parent = 0); + + QPushButton *BtnSnapshots; + About *about; + +private: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageingame.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageingame.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,40 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pageingame.h" + +QLayout * PageInGame::bodyLayoutDefinition() +{ + QHBoxLayout * pageLayout = new QHBoxLayout(); + + QLabel * label = new QLabel(this); + label->setText(tr("In game...")); + pageLayout->addWidget(label); + + setBackButtonVisible(false); + + return pageLayout; +} + +PageInGame::PageInGame(QWidget * parent) : AbstractPage(parent) +{ + initPage(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageingame.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageingame.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,35 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_INGAME_H +#define PAGE_INGAME_H + +#include "AbstractPage.h" + +class PageInGame : public AbstractPage +{ + Q_OBJECT + + public: + PageInGame(QWidget * parent = 0); + + QLayout * bodyLayoutDefinition(); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagemain.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagemain.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,162 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include + +#include "pagemain.h" +#include "hwconsts.h" +#include "hwform.h" + +QLayout * PageMain::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + //pageLayout->setColumnStretch(0, 1); + //pageLayout->setColumnStretch(1, 2); + //pageLayout->setColumnStretch(2, 1); + + //QPushButton* btnLogo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true); + //pageLayout->setAlignment(btnLogo, Qt::AlignHCenter); + pageLayout->setRowStretch(0, 1); + pageLayout->setRowStretch(1, 1); + pageLayout->setRowStretch(2, 0); + pageLayout->setRowStretch(3, 1); + pageLayout->setRowStretch(4, 1); + + //BtnInfo = addButton(":/res/About.png", pageLayout, 3, 1, 1, 2, true); + BtnInfo = addButton(":/res/HedgewarsTitle.png", pageLayout, 0, 0, 1, 4, true); + BtnInfo->setStyleSheet("border: transparent;background: transparent;"); + pageLayout->setAlignment(BtnInfo, Qt::AlignHCenter); + + BtnSinglePlayer = addButton(":/res/LocalPlay.png", pageLayout, 2, 0, 1, 2, true); + BtnSinglePlayer->setToolTip(tr("Local Game (Play a game on a single computer)")); + pageLayout->setAlignment(BtnSinglePlayer, Qt::AlignHCenter); + + BtnNet = addButton(":/res/NetworkPlay.png", pageLayout, 2, 2, 1, 2, true); + BtnNet->setToolTip(tr("Network Game (Play a game across a network)")); + pageLayout->setAlignment(BtnNet, Qt::AlignHCenter); + + BtnDataDownload = addButton(tr("Downloadable Content"), pageLayout, 4, 0, 1, 4, false); + pageLayout->setAlignment(BtnDataDownload, Qt::AlignHCenter); + + return pageLayout; +} + +QLayout * PageMain::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout(); + + mainNote = new QLabel(this); + mainNote->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); + mainNote->setWordWrap(true); + + bottomLayout->addWidget(mainNote, 0); + bottomLayout->setStretch(0,1); + + BtnSetup = addButton(":/res/Settings.png", bottomLayout, 1, true); + bottomLayout->setStretch(1,0); + + return bottomLayout; +} + +void PageMain::connectSignals() +{ + //TODO +} + +PageMain::PageMain(QWidget* parent) : AbstractPage(parent) +{ + initPage(); + + if(frontendEffects) setAttribute(Qt::WA_NoSystemBackground, true); + mainNote->setOpenExternalLinks(true); + + if(!isDevBuild) + { + mainNote->setText(QLabel::tr("Tip: ") + randomTip()); + } + else + mainNote->setText(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!")); + +} + +QString PageMain::randomTip() const +{ + QStringList Tips; + Tips << tr("Simply pick the same color as a friend to play together as a team. Each of you will still control his or her own hedgehogs but they'll win or lose together.", "Tips"); + Tips << tr("Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.", "Tips"); + Tips << tr("If you're unsure what to do and don't want to waste ammo, skip one round. But don't let too much time pass as there will be Sudden Death!", "Tips"); + Tips << tr("Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!", "Tips"); + Tips << tr("If you'd like to keep others from using your preferred nickname on the official server, register an account at http://www.hedgewars.org/.", "Tips"); + Tips << tr("You're bored of default gameplay? Try one of the missions - they'll offer different gameplay depending on the one you picked.", "Tips"); + Tips << tr("By default the game will always record the last game played as a demo. Select 'Local Game' and pick the 'Demos' button on the lower right corner to play or manage them.", "Tips"); + Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you've got problems, ask on our forums but please don't expect 24/7 support!", "Tips"); + Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If you like it, help us with a small donation or contribute your own work!", "Tips"); + Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. Share it with your family and friends as you like!", "Tips"); + Tips << tr("Hedgewars is Open Source and Freeware we create in our spare time. If someone sold you the game, you should try get a refund!", "Tips"); + Tips << tr("From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.", "Tips"); + Tips << tr("Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!", "Tips"); + Tips << tr("Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.", "Tips"); + Tips << tr("Always remember you're able to set up your own games in local and network/online play. You're not restricted to the 'Simple Game' option.", "Tips"); + Tips << tr("Connect one or more gamepads before starting the game to be able to assign their controls to your teams.", "Tips"); + Tips << tr("Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.", "Tips").arg("http://www.hedgewars.org/"); + Tips << tr("While playing you should give yourself a short break at least once an hour.", "Tips"); + Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.", "Tips"); + Tips << tr("If your graphics card isn't able to provide hardware accelerated OpenGL, try to update the associated drivers.", "Tips"); + Tips << tr("We're open to suggestions and constructive feedback. If you don't like something or got a great idea, let us know!", "Tips"); + Tips << tr("Especially while playing online be polite and always remember there might be some minors playing with or against you as well!", "Tips"); + Tips << tr("Special game modes such as 'Vampirism' or 'Karma' allow you to develop completely new tactics. Try them in a custom game!", "Tips"); + Tips << tr("The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.", "Tips"); + Tips << tr("You should never install Hedgewars on computers you don't own (school, university, work, etc.). Please ask the responsible person instead!", "Tips"); + Tips << tr("Hedgewars can be perfect for short games during breaks. Just ensure you don't add too many hedgehogs or use an huge map. Reducing time and health might help as well.", "Tips"); + Tips << tr("No hedgehogs were harmed in making this game.", "Tips"); + Tips << tr("There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump.", "Tips"); + Tips << tr("Afraid of falling off a cliff? Hold down [precise] to turn [left] or [right] without actually moving.", "Tips"); + Tips << tr("Some weapons require special strategies or just lots of training, so don't give up on a particular tool if you miss an enemy once.", "Tips"); + Tips << tr("Most weapons won't work once they touch the water. The Homing Bee as well as the Cake are exceptions to this.", "Tips"); + Tips << tr("The Old Limbuger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once.", "Tips"); + Tips << tr("The Piano Strike is the most damaging air strike. You'll lose the hedgehog performing it, so there's a huge downside as well.", "Tips"); + Tips << tr("The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.", "Tips"); + Tips << tr("Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water.", "Tips"); + Tips << tr("The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground.", "Tips"); + Tips << tr("If you're stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion.", "Tips"); + Tips << tr("The Cake's maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early.", "Tips"); + Tips << tr("The Flame Thrower is a weapon but it can be used for tunnel digging as well.", "Tips"); + Tips << tr("Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.", "Tips"); + Tips << tr("Want to know who's behind the game? Click on the Hedgewars logo in the main menu to see the credits.", "Tips"); + Tips << tr("Like Hedgewars? Become a fan on %1 or follow us on %2!", "Tips").arg("Facebook").arg("Twitter"); + Tips << tr("Feel free to draw your own graves, hats, flags or even maps and themes! But note that you'll have to share them somewhere to use them online.", "Tips"); + Tips << tr("Really want to wear a specific hat? Donate to us and receive an exclusive hat of your choice!", "Tips"); + // The following tip will require links to app store entries first. + //Tips << tr("Want to play Hedgewars any time? Grab the Mobile version for %1 and %2.", "Tips").arg("").arg(""); + // the ios version is located here: http://itunes.apple.com/us/app/hedgewars/id391234866 + Tips << tr("Keep your video card drivers up to date to avoid issues playing the game.", "Tips"); + Tips << tr("You're able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.", "Tips"); +#ifdef _WIN32 + Tips << tr("You can find your Hedgewars configuration files under \"My Documents\\Hedgewars\". Create backups or take the files with you, but don't edit them by hand.", "Tips"); +#elif defined __APPLE__ + Tips << tr("You can find your Hedgewars configuration files under \"Library/Application Support/Hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips"); +#else + Tips << tr("You can find your Hedgewars configuration files under \".hedgewars\" in your home directory. Create backups or take the files with you, but don't edit them by hand.", "Tips"); +#endif + + return Tips[QTime(0, 0, 0).secsTo(QTime::currentTime()) % Tips.length()]; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagemain.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagemain.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,47 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_MAIN_H +#define PAGE_MAIN_H + +#include "AbstractPage.h" + +class PageMain : public AbstractPage +{ + Q_OBJECT + +public: + PageMain(QWidget * parent = 0); + + QPushButton * BtnSinglePlayer; + QPushButton * BtnNet; + QPushButton * BtnSetup; + QPushButton * BtnInfo; + QPushButton * BtnDataDownload; + QLabel * mainNote; + +private: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + + QString randomTip() const; +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagemultiplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagemultiplayer.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,55 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pagemultiplayer.h" +#include "gamecfgwidget.h" +#include "teamselect.h" + +QLayout * PageMultiplayer::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + gameCFG = new GameCFGWidget(this); + pageLayout->addWidget(gameCFG, 0, 0, 1, 2); + + btnSetup = new QPushButton(this); + btnSetup->setText(QPushButton::tr("Setup")); + pageLayout->addWidget(btnSetup, 1, 0, 1, 2); + + pageLayout->setRowStretch(2, 1); + + teamsSelect = new TeamSelWidget(this); + pageLayout->addWidget(teamsSelect, 0, 2, 3, 2); + + BtnStartMPGame = addButton(tr("Start"), pageLayout, 3, 3); + + return pageLayout; +} + +void PageMultiplayer::connectSignals() +{ + PageMultiplayer::connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked())); +} + +PageMultiplayer::PageMultiplayer(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagemultiplayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagemultiplayer.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,50 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_MULTIPLAYER_H +#define PAGE_MULTIPLAYER_H + +#include "AbstractPage.h" + +class GameCFGWidget; +class TeamSelWidget; + +class PageMultiplayer : public AbstractPage +{ + Q_OBJECT + +public: + PageMultiplayer(QWidget* parent = 0); + + GameCFGWidget *gameCFG; + TeamSelWidget *teamsSelect; + QPushButton *BtnStartMPGame; + +signals: + void SetupClicked(); + +private: + QLayout * bodyLayoutDefinition(); + void connectSignals(); + + QPushButton * btnSetup; +}; + +#endif + + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenet.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenet.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,109 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include + +#include "pagenet.h" +#include "hwconsts.h" +#include "netudpwidget.h" + +QLayout * PageNet::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + pageLayout->setColumnStretch(0, 1); + pageLayout->setColumnStretch(1, 1); + pageLayout->setColumnStretch(2, 1); + + BtnNetSvrStart = new QPushButton(this); + BtnNetSvrStart->setFont(*font14); + BtnNetSvrStart->setText(QPushButton::tr("Start server")); + BtnNetSvrStart->setVisible(haveServer); + pageLayout->addWidget(BtnNetSvrStart, 4, 2); + + ConnGroupBox = new QGroupBox(this); + ConnGroupBox->setTitle(QGroupBox::tr("Net game")); + pageLayout->addWidget(ConnGroupBox, 2, 0, 1, 3); + GBClayout = new QGridLayout(ConnGroupBox); + GBClayout->setColumnStretch(0, 1); + GBClayout->setColumnStretch(1, 1); + GBClayout->setColumnStretch(2, 1); + + BtnNetConnect = new QPushButton(ConnGroupBox); + BtnNetConnect->setFont(*font14); + BtnNetConnect->setText(QPushButton::tr("Connect")); + GBClayout->addWidget(BtnNetConnect, 2, 2); + + tvServersList = new QTableView(ConnGroupBox); + tvServersList->setSelectionBehavior(QAbstractItemView::SelectRows); + GBClayout->addWidget(tvServersList, 1, 0, 1, 3); + + BtnUpdateSList = new QPushButton(ConnGroupBox); + BtnUpdateSList->setFont(*font14); + BtnUpdateSList->setText(QPushButton::tr("Update")); + GBClayout->addWidget(BtnUpdateSList, 2, 0); + + BtnSpecifyServer = new QPushButton(ConnGroupBox); + BtnSpecifyServer->setFont(*font14); + BtnSpecifyServer->setText(QPushButton::tr("Specify")); + GBClayout->addWidget(BtnSpecifyServer, 2, 1); + + return pageLayout; +} + +void PageNet::connectSignals() +{ + connect(BtnNetConnect, SIGNAL(clicked()), this, SLOT(slotConnect())); +} + +PageNet::PageNet(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageNet::updateServersList() +{ + tvServersList->setModel(new HWNetUdpModel(tvServersList)); + + tvServersList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); + + static_cast(tvServersList->model())->updateList(); + + connect(BtnUpdateSList, SIGNAL(clicked()), static_cast(tvServersList->model()), SLOT(updateList())); + connect(tvServersList, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(slotConnect())); +} + +void PageNet::slotConnect() +{ + HWNetServersModel * model = static_cast(tvServersList->model()); + QModelIndex mi = tvServersList->currentIndex(); + if(!mi.isValid()) + { + QMessageBox::information(this, tr("Error"), tr("Please select server from the list above")); + return; + } + QString host = model->index(mi.row(), 1).data().toString(); + quint16 port = model->index(mi.row(), 2).data().toUInt(); + + emit connectClicked(host, port); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenet.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenet.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,55 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_NET_H +#define PAGE_NET_H + +#include "AbstractPage.h" + +class PageNet : public AbstractPage +{ + Q_OBJECT + +public: + PageNet(QWidget* parent = 0); + + QPushButton* BtnUpdateSList; + QTableView * tvServersList; + QPushButton * BtnNetConnect; + QPushButton * BtnNetSvrStart; + QPushButton * BtnSpecifyServer; + +public slots: + void updateServersList(); + +signals: + void connectClicked(const QString & host, quint16 port); + +private: + QLayout * bodyLayoutDefinition(); + void connectSignals(); + + QGroupBox * ConnGroupBox; + QGridLayout * GBClayout; + +private slots: + void slotConnect(); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenetgame.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenetgame.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,142 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include + +#include "pagenetgame.h" +#include "gamecfgwidget.h" +#include "teamselect.h" +#include "chatwidget.h" + +QLayout * PageNetGame::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + pageLayout->setSizeConstraint(QLayout::SetMinimumSize); + //pageLayout->setSpacing(1); + pageLayout->setColumnStretch(0, 50); + pageLayout->setColumnStretch(1, 50); + + // chatwidget + pChatWidget = new HWChatWidget(this, m_gameSettings, m_sdli, true); + pChatWidget->setShowReady(true); // show status bulbs by default + pChatWidget->setShowFollow(false); // don't show follow in nicks' context menus + pageLayout->addWidget(pChatWidget, 2, 0, 1, 2); + pageLayout->setRowStretch(1, 100); + pageLayout->setRowStretch(2, 100); + + pGameCFG = new GameCFGWidget(this); + pageLayout->addWidget(pGameCFG, 0, 0); + + btnSetup = new QPushButton(this); + btnSetup->setText(QPushButton::tr("Setup")); + pageLayout->addWidget(btnSetup, 1, 0); + + pNetTeamsWidget = new TeamSelWidget(this); + pNetTeamsWidget->setAcceptOuter(true); + pageLayout->addWidget(pNetTeamsWidget, 0, 1, 2, 1); + + return pageLayout; +} + +QLayout * PageNetGame::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout; + + leRoomName = new QLineEdit(this); + leRoomName->setMaxLength(60); + leRoomName->setMinimumWidth(200); + leRoomName->setMaximumWidth(400); + + BtnGo = new QPushButton(this); + BtnGo->setToolTip(QPushButton::tr("Ready")); + BtnGo->setIcon(QIcon(":/res/lightbulb_off.png")); + BtnGo->setIconSize(QSize(25, 34)); + BtnGo->setMinimumWidth(50); + BtnGo->setMinimumHeight(50); + + + bottomLayout->addWidget(leRoomName); + BtnUpdate = addButton(QAction::tr("Update"), bottomLayout, 1, false); + bottomLayout->addWidget(BtnGo); + + BtnMaster = addButton(tr("Control"), bottomLayout, 3); + bottomLayout->insertStretch(3, 100); + + BtnStart = addButton(QAction::tr("Start"), bottomLayout, 3); + + return bottomLayout; +} + +void PageNetGame::connectSignals() +{ + connect(btnSetup, SIGNAL(clicked()), this, SIGNAL(SetupClicked())); + + connect(BtnUpdate, SIGNAL(clicked()), this, SLOT(onUpdateClick())); +} + +PageNetGame::PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) : AbstractPage(parent) +{ + m_gameSettings = gameSettings; + m_sdli = sdli; + + initPage(); + + QMenu * menu = new QMenu(BtnMaster); + + restrictJoins = new QAction(QAction::tr("Restrict Joins"), menu); + restrictJoins->setCheckable(true); + restrictTeamAdds = new QAction(QAction::tr("Restrict Team Additions"), menu); + restrictTeamAdds->setCheckable(true); + //menu->addAction(startGame); + menu->addAction(restrictJoins); + menu->addAction(restrictTeamAdds); + + BtnMaster->setMenu(menu); + +} + +void PageNetGame::setReadyStatus(bool isReady) +{ + if(isReady) + BtnGo->setIcon(QIcon(":/res/lightbulb_on.png")); + else + BtnGo->setIcon(QIcon(":/res/lightbulb_off.png")); +} + +void PageNetGame::onUpdateClick() +{ + if (leRoomName->text().size()) + emit askForUpdateRoomName(leRoomName->text()); + else + QMessageBox::critical(this, + tr("Error"), + tr("Please enter room name"), + tr("OK")); +} + +void PageNetGame::setMasterMode(bool isMaster) +{ + BtnMaster->setVisible(isMaster); + BtnStart->setVisible(isMaster); + BtnUpdate->setVisible(isMaster); + leRoomName->setVisible(isMaster); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenetgame.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenetgame.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,71 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_NETGAME_H +#define PAGE_NETGAME_H + +#include "AbstractPage.h" +#include "SDLs.h" + +class HWChatWidget; +class TeamSelWidget; +class GameCFGWidget; + +class PageNetGame : public AbstractPage +{ + Q_OBJECT + +public: + PageNetGame(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli); + + QPushButton *BtnGo; + QPushButton *BtnMaster; + QPushButton *BtnStart; + QPushButton *BtnUpdate; + + QLineEdit * leRoomName; + + QAction * restrictJoins; + QAction * restrictTeamAdds; + + HWChatWidget* pChatWidget; + + TeamSelWidget* pNetTeamsWidget; + GameCFGWidget* pGameCFG; + +public slots: + void setReadyStatus(bool isReady); + void onUpdateClick(); + void setMasterMode(bool isMaster); + +signals: + void SetupClicked(); + void askForUpdateRoomName(const QString &); + +private: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + + QSettings * m_gameSettings; + SDLInteraction * m_sdli; + + QPushButton * btnSetup; +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenetserver.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenetserver.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,100 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pagenetserver.h" + +QLayout * PageNetServer::bodyLayoutDefinition() +{ + QVBoxLayout * pageLayout = new QVBoxLayout(); + + QWidget * wg = new QWidget(this); + pageLayout->addWidget(wg); + + QGridLayout * wgLayout = new QGridLayout(wg); + wgLayout->setColumnStretch(0, 1); + wgLayout->setColumnStretch(1, 3); + wgLayout->setColumnStretch(2, 1); + + wgLayout->setRowStretch(0, 0); + wgLayout->setRowStretch(1, 1); + + QGroupBox * gb = new QGroupBox(wg); + wgLayout->addWidget(gb, 0, 1); + + QGridLayout * gbLayout = new QGridLayout(gb); + + labelSD = new QLabel(gb); + labelSD->setText(QLabel::tr("Server name:")); + gbLayout->addWidget(labelSD, 0, 0); + + leServerDescr = new QLineEdit(gb); + gbLayout->addWidget(leServerDescr, 0, 1); + + labelPort = new QLabel(gb); + labelPort->setText(QLabel::tr("Server port:")); + gbLayout->addWidget(labelPort, 1, 0); + + sbPort = new QSpinBox(gb); + sbPort->setMinimum(0); + sbPort->setMaximum(65535); + gbLayout->addWidget(sbPort, 1, 1); + + BtnDefault = new QPushButton(gb); + BtnDefault->setText(QPushButton::tr("default")); + gbLayout->addWidget(BtnDefault, 1, 2); + + return pageLayout; +} + +QLayout * PageNetServer::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout(); + + BtnStart = new QPushButton(this); + BtnStart->setFont(*font14); + BtnStart->setText(QPushButton::tr("Start")); + + bottomLayout->addStretch(); + bottomLayout->addWidget(BtnStart); + + return bottomLayout; +} + +void PageNetServer::connectSignals() +{ + connect(BtnDefault, SIGNAL(clicked()), this, SLOT(setDefaultPort())); +} + +PageNetServer::PageNetServer(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageNetServer::setDefaultPort() +{ + sbPort->setValue(46631); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenetserver.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenetserver.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,47 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_NETSERVER_H +#define PAGE_NETSERVER_H + +#include "AbstractPage.h" + +class PageNetServer : public AbstractPage +{ + Q_OBJECT + +public: + PageNetServer(QWidget* parent = 0); + + QPushButton *BtnStart; + QPushButton *BtnDefault; + QLabel *labelSD; + QLineEdit *leServerDescr; + QLabel *labelPort; + QSpinBox *sbPort; + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + +private slots: + void setDefaultPort(); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenettype.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenettype.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,47 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pagenettype.h" + + +QLayout * PageNetType::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + pageLayout->setRowStretch(0, 10); + pageLayout->setRowStretch(3, 10); + + pageLayout->setColumnStretch(1, 10); + pageLayout->setColumnStretch(2, 20); + pageLayout->setColumnStretch(3, 10); + + BtnLAN = addButton(tr("LAN game"), pageLayout, 1, 2); + BtnOfficialServer = addButton(tr("Official server"), pageLayout, 2, 2); + + // hack: temporary deactivated - requires server modifications that aren't backward compatible (yet) + //BtnOfficialServer->setEnabled(false); + + return pageLayout; +} + +PageNetType::PageNetType(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagenettype.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagenettype.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,38 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_NETTYPE_H +#define PAGE_NETTYPE_H + +#include "AbstractPage.h" + +class PageNetType : public AbstractPage +{ + Q_OBJECT + +public: + PageNetType(QWidget* parent = 0); + + QPushButton * BtnLAN; + QPushButton * BtnOfficialServer; + +protected: + QLayout * bodyLayoutDefinition(); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageoptions.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageoptions.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,492 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "pageoptions.h" +#include "hwconsts.h" +#include "fpsedit.h" +#include "igbox.h" + +// TODO cleanup +QLayout * PageOptions::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + pageLayout->setColumnStretch(0, 100); + pageLayout->setColumnStretch(1, 100); + pageLayout->setColumnStretch(2, 100); + pageLayout->setRowStretch(0, 0); + //pageLayout->setRowStretch(1, 100); + pageLayout->setRowStretch(2, 0); + pageLayout->setContentsMargins(7, 7, 7, 0); + pageLayout->setSpacing(0); + + + QGroupBox * gbTwoBoxes = new QGroupBox(this); + pageLayout->addWidget(gbTwoBoxes, 0, 0, 1, 3); + QGridLayout * gbTBLayout = new QGridLayout(gbTwoBoxes); + gbTBLayout->setMargin(0); + gbTBLayout->setSpacing(0); + gbTBLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft); + + QPixmap pmNew(":/res/new.png"); + QPixmap pmEdit(":/res/edit.png"); + QPixmap pmDelete(":/res/delete.png"); + + { + teamsBox = new IconedGroupBox(this); + //teamsBox->setContentTopPadding(0); + //teamsBox->setAttribute(Qt::WA_PaintOnScreen, true); + teamsBox->setIcon(QIcon(":/res/teamicon.png")); + teamsBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + teamsBox->setTitle(QGroupBox::tr("Teams")); + + QGridLayout * GBTlayout = new QGridLayout(teamsBox); + + CBTeamName = new QComboBox(teamsBox); + GBTlayout->addWidget(CBTeamName, 0, 0); + + BtnNewTeam = new QPushButton(teamsBox); + BtnNewTeam->setToolTip(tr("New team")); + BtnNewTeam->setIconSize(pmNew.size()); + BtnNewTeam->setIcon(pmNew); + BtnNewTeam->setMaximumWidth(pmNew.width() + 6); + connect(BtnNewTeam, SIGNAL(clicked()), this, SIGNAL(newTeamRequested())); + GBTlayout->addWidget(BtnNewTeam, 0, 1); + + BtnEditTeam = new QPushButton(teamsBox); + BtnEditTeam->setToolTip(tr("Edit team")); + BtnEditTeam->setIconSize(pmEdit.size()); + BtnEditTeam->setIcon(pmEdit); + BtnEditTeam->setMaximumWidth(pmEdit.width() + 6); + connect(BtnEditTeam, SIGNAL(clicked()), this, SLOT(requestEditSelectedTeam())); + GBTlayout->addWidget(BtnEditTeam, 0, 2); + + BtnDeleteTeam = new QPushButton(teamsBox); + BtnDeleteTeam->setToolTip(tr("Delete team")); + BtnDeleteTeam->setIconSize(pmDelete.size()); + BtnDeleteTeam->setIcon(pmDelete); + BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6); + connect(BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(requestDeleteSelectedTeam())); + GBTlayout->addWidget(BtnDeleteTeam, 0, 3); + + LblNoEditTeam = new QLabel(teamsBox); + LblNoEditTeam->setText(tr("You can't edit teams from team selection. Go back to main menu to add, edit or delete teams.")); + LblNoEditTeam->setWordWrap(true); + LblNoEditTeam->setVisible(false); + GBTlayout->addWidget(LblNoEditTeam, 0, 0); + + gbTBLayout->addWidget(teamsBox, 0, 0); + } + + { + IconedGroupBox* groupWeapons = new IconedGroupBox(this); + + //groupWeapons->setContentTopPadding(0); + //groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + groupWeapons->setIcon(QIcon(":/res/weaponsicon.png")); + groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + groupWeapons->setTitle(QGroupBox::tr("Schemes and Weapons")); + QGridLayout * WeaponsLayout = new QGridLayout(groupWeapons); + + QLabel* SchemeLabel = new QLabel(groupWeapons); + SchemeLabel->setText(QLabel::tr("Game scheme")); + WeaponsLayout->addWidget(SchemeLabel, 1, 0); + + SchemesName = new QComboBox(groupWeapons); + WeaponsLayout->addWidget(SchemesName, 1, 1); + + SchemeNew = new QPushButton(groupWeapons); + SchemeNew->setToolTip(tr("New scheme")); + SchemeNew->setIconSize(pmNew.size()); + SchemeNew->setIcon(pmNew); + SchemeNew->setMaximumWidth(pmNew.width() + 6); + WeaponsLayout->addWidget(SchemeNew, 1, 2); + + SchemeEdit = new QPushButton(groupWeapons); + SchemeEdit->setToolTip(tr("Edit scheme")); + SchemeEdit->setIconSize(pmEdit.size()); + SchemeEdit->setIcon(pmEdit); + SchemeEdit->setMaximumWidth(pmEdit.width() + 6); + WeaponsLayout->addWidget(SchemeEdit, 1, 3); + + SchemeDelete = new QPushButton(groupWeapons); + SchemeDelete->setToolTip(tr("Delete scheme")); + SchemeDelete->setIconSize(pmDelete.size()); + SchemeDelete->setIcon(pmDelete); + SchemeDelete->setMaximumWidth(pmDelete.width() + 6); + WeaponsLayout->addWidget(SchemeDelete, 1, 4); + + QLabel* WeaponLabel = new QLabel(groupWeapons); + WeaponLabel->setText(QLabel::tr("Weapons")); + WeaponsLayout->addWidget(WeaponLabel, 2, 0); + + WeaponsName = new QComboBox(groupWeapons); + WeaponsLayout->addWidget(WeaponsName, 2, 1); + + WeaponNew = new QPushButton(groupWeapons); + WeaponNew->setToolTip(tr("New weapon set")); + WeaponNew->setIconSize(pmNew.size()); + WeaponNew->setIcon(pmNew); + WeaponNew->setMaximumWidth(pmNew.width() + 6); + WeaponsLayout->addWidget(WeaponNew, 2, 2); + + WeaponEdit = new QPushButton(groupWeapons); + WeaponEdit->setToolTip(tr("Edit weapon set")); + WeaponEdit->setIconSize(pmEdit.size()); + WeaponEdit->setIcon(pmEdit); + WeaponEdit->setMaximumWidth(pmEdit.width() + 6); + WeaponsLayout->addWidget(WeaponEdit, 2, 3); + + WeaponDelete = new QPushButton(groupWeapons); + WeaponDelete->setToolTip(tr("Delete weapon set")); + WeaponDelete->setIconSize(pmDelete.size()); + WeaponDelete->setIcon(pmDelete); + WeaponDelete->setMaximumWidth(pmDelete.width() + 6); + WeaponsLayout->addWidget(WeaponDelete, 2, 4); + + WeaponTooltip = new QCheckBox(this); + WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips")); + WeaponsLayout->addWidget(WeaponTooltip, 3, 0, 1, 4); + + gbTBLayout->addWidget(groupWeapons, 1, 0); + } + + { + IconedGroupBox* groupMisc = new IconedGroupBox(this); + //groupMisc->setContentTopPadding(0); + groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + groupMisc->setIcon(QIcon(":/res/miscicon.png")); + //groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + groupMisc->setTitle(QGroupBox::tr("Misc")); + QGridLayout * MiscLayout = new QGridLayout(groupMisc); + + labelNN = new QLabel(groupMisc); + labelNN->setText(QLabel::tr("Net nick")); + MiscLayout->addWidget(labelNN, 0, 0); + + editNetNick = new QLineEdit(groupMisc); + editNetNick->setMaxLength(20); + editNetNick->setText(QLineEdit::tr("unnamed")); + connect(editNetNick, SIGNAL(editingFinished()), this, SLOT(trimNetNick())); + MiscLayout->addWidget(editNetNick, 0, 1); + + labelNetPassword = new QLabel(groupMisc); + labelNetPassword->setText(QLabel::tr("Password")); + MiscLayout->addWidget(labelNetPassword, 1, 0); + + editNetPassword = new QLineEdit(groupMisc); + editNetPassword->setEchoMode(QLineEdit::Password); + MiscLayout->addWidget(editNetPassword, 1, 1); + + QLabel *labelLanguage = new QLabel(groupMisc); + labelLanguage->setText(QLabel::tr("Locale") + " *"); + MiscLayout->addWidget(labelLanguage, 2, 0); + + CBLanguage = new QComboBox(groupMisc); + QDir tmpdir; + tmpdir.cd(cfgdir->absolutePath()); + tmpdir.cd("Data/Locale"); + tmpdir.setFilter(QDir::Files); + QStringList locs = tmpdir.entryList(QStringList("hedgewars_*.qm")); + CBLanguage->addItem(QComboBox::tr("(System default)"), QString("")); + for(int i = 0; i < locs.count(); i++) + { + QLocale loc(locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1")); + CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name()); + } + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Locale"); + tmpdir.setFilter(QDir::Files); + QStringList tmplist = tmpdir.entryList(QStringList("hedgewars_*.qm")); + for(int i = 0; i < tmplist.count(); i++) + { + if (locs.contains(tmplist[i])) continue; + QLocale loc(tmplist[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1")); + CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name()); + } + + MiscLayout->addWidget(CBLanguage, 2, 1); + + CBAltDamage = new QCheckBox(groupMisc); + CBAltDamage->setText(QCheckBox::tr("Alternative damage show")); + MiscLayout->addWidget(CBAltDamage, 3, 0, 1, 2); + + CBNameWithDate = new QCheckBox(groupMisc); + CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name")); + MiscLayout->addWidget(CBNameWithDate, 4, 0, 1, 2); + + BtnAssociateFiles = new QPushButton(groupMisc); + BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions")); + BtnAssociateFiles->setEnabled(!custom_data && !custom_config); + MiscLayout->addWidget(BtnAssociateFiles, 5, 0, 1, 2); + +#ifdef __APPLE__ +#ifdef SPARKLE_ENABLED + CBAutoUpdate = new QCheckBox(groupMisc); + CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup")); + MiscLayout->addWidget(CBAutoUpdate, 6, 0, 1, 3); +#endif +#endif + gbTBLayout->addWidget(groupMisc, 2, 0); + } + + { + AGGroupBox = new IconedGroupBox(this); + //AGGroupBox->setContentTopPadding(0); + AGGroupBox->setIcon(QIcon(":/res/graphicsicon.png")); + //AGGroupBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + AGGroupBox->setTitle(QGroupBox::tr("Audio/Graphic options")); + + QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox); + QHBoxLayout * GBAreslayout = new QHBoxLayout(0); + QHBoxLayout * GBAstereolayout = new QHBoxLayout(0); + QHBoxLayout * GBAqualayout = new QHBoxLayout(0); + + CBFrontendFullscreen = new QCheckBox(AGGroupBox); + CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen")); + GBAlayout->addWidget(CBFrontendFullscreen); + + CBFrontendEffects = new QCheckBox(AGGroupBox); + CBFrontendEffects->setText(QCheckBox::tr("Frontend effects") + " *"); + GBAlayout->addWidget(CBFrontendEffects); + + CBEnableFrontendSound = new QCheckBox(AGGroupBox); + CBEnableFrontendSound->setText(QCheckBox::tr("Enable frontend sounds")); + GBAlayout->addWidget(CBEnableFrontendSound); + + CBEnableFrontendMusic = new QCheckBox(AGGroupBox); + CBEnableFrontendMusic->setText(QCheckBox::tr("Enable frontend music")); + GBAlayout->addWidget(CBEnableFrontendMusic); + + QFrame * hr = new QFrame(AGGroupBox); + hr->setFrameStyle(QFrame::HLine); + hr->setLineWidth(3); + hr->setFixedHeight(10); + GBAlayout->addWidget(hr); + + QLabel * resolution = new QLabel(AGGroupBox); + resolution->setText(QLabel::tr("Resolution")); + GBAreslayout->addWidget(resolution); + + CBResolution = new QComboBox(AGGroupBox); + GBAreslayout->addWidget(CBResolution); + GBAlayout->addLayout(GBAreslayout); + + CBFullscreen = new QCheckBox(AGGroupBox); + CBFullscreen->setText(QCheckBox::tr("Fullscreen")); + GBAlayout->addWidget(CBFullscreen); + + QLabel * quality = new QLabel(AGGroupBox); + quality->setText(QLabel::tr("Quality")); + quality->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + GBAqualayout->addWidget(quality); + + SLQuality = new QSlider(Qt::Horizontal, AGGroupBox); + SLQuality->setTickPosition(QSlider::TicksBelow); + SLQuality->setMaximum(5); + SLQuality->setMinimum(0); + SLQuality->setFixedWidth(150); + GBAqualayout->addWidget(SLQuality); + GBAlayout->addLayout(GBAqualayout); + + QLabel * stereo = new QLabel(AGGroupBox); + stereo->setText(QLabel::tr("Stereo rendering")); + GBAstereolayout->addWidget(stereo); + + CBStereoMode = new QComboBox(AGGroupBox); + CBStereoMode->addItem(QComboBox::tr("Disabled")); + CBStereoMode->addItem(QComboBox::tr("Red/Cyan")); + CBStereoMode->addItem(QComboBox::tr("Cyan/Red")); + CBStereoMode->addItem(QComboBox::tr("Red/Blue")); + CBStereoMode->addItem(QComboBox::tr("Blue/Red")); + CBStereoMode->addItem(QComboBox::tr("Red/Green")); + CBStereoMode->addItem(QComboBox::tr("Green/Red")); + CBStereoMode->addItem(QComboBox::tr("Side-by-side")); + CBStereoMode->addItem(QComboBox::tr("Top-Bottom")); + CBStereoMode->addItem(QComboBox::tr("Wiggle")); + CBStereoMode->addItem(QComboBox::tr("Red/Cyan grayscale")); + CBStereoMode->addItem(QComboBox::tr("Cyan/Red grayscale")); + CBStereoMode->addItem(QComboBox::tr("Red/Blue grayscale")); + CBStereoMode->addItem(QComboBox::tr("Blue/Red grayscale")); + CBStereoMode->addItem(QComboBox::tr("Red/Green grayscale")); + CBStereoMode->addItem(QComboBox::tr("Green/Red grayscale")); + connect(CBStereoMode, SIGNAL(currentIndexChanged(int)), this, SLOT(forceFullscreen(int))); + + GBAstereolayout->addWidget(CBStereoMode); + GBAlayout->addLayout(GBAstereolayout); + + hr = new QFrame(AGGroupBox); + hr->setFrameStyle(QFrame::HLine); + hr->setLineWidth(3); + hr->setFixedHeight(10); + GBAlayout->addWidget(hr); + + QHBoxLayout * GBAvollayout = new QHBoxLayout(0); + QLabel * vol = new QLabel(AGGroupBox); + vol->setText(QLabel::tr("Initial sound volume")); + GBAvollayout->addWidget(vol); + GBAlayout->addLayout(GBAvollayout); + volumeBox = new QSpinBox(AGGroupBox); + volumeBox->setRange(0, 100); + volumeBox->setSingleStep(5); + GBAvollayout->addWidget(volumeBox); + + CBEnableSound = new QCheckBox(AGGroupBox); + CBEnableSound->setText(QCheckBox::tr("Enable sound")); + GBAlayout->addWidget(CBEnableSound); + + CBEnableMusic = new QCheckBox(AGGroupBox); + CBEnableMusic->setText(QCheckBox::tr("Enable music")); + GBAlayout->addWidget(CBEnableMusic); + + hr = new QFrame(AGGroupBox); + hr->setFrameStyle(QFrame::HLine); + hr->setLineWidth(3); + hr->setFixedHeight(10); + GBAlayout->addWidget(hr); + + QHBoxLayout * GBAfpslayout = new QHBoxLayout(0); + QLabel * maxfps = new QLabel(AGGroupBox); + maxfps->setText(QLabel::tr("FPS limit")); + GBAfpslayout->addWidget(maxfps); + GBAlayout->addLayout(GBAfpslayout); + fpsedit = new FPSEdit(AGGroupBox); + GBAfpslayout->addWidget(fpsedit); + + CBShowFPS = new QCheckBox(AGGroupBox); + CBShowFPS->setText(QCheckBox::tr("Show FPS")); + GBAlayout->addWidget(CBShowFPS); + + hr = new QFrame(AGGroupBox); + hr->setFrameStyle(QFrame::HLine); + hr->setLineWidth(3); + hr->setFixedHeight(10); + GBAlayout->addWidget(hr); + + QLabel *restartNote = new QLabel(this); + restartNote->setText(QString("* ") + QLabel::tr("Restart game to apply")); + restartNote->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed); + GBAlayout->addWidget(restartNote); + + gbTBLayout->addWidget(AGGroupBox, 0, 1, 3, 1); + } + + previousQuality = this->SLQuality->value(); + previousResolutionIndex = this->CBResolution->currentIndex(); + previousFullscreenValue = this->CBFullscreen->isChecked(); + + return pageLayout; +} + +QLayout * PageOptions::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout(); + btnSave = addButton(":/res/Save.png", bottomLayout, 0, true); + btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}"); + bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom); + return bottomLayout; +} + +void PageOptions::connectSignals() +{ + connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int))); + connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int))); + connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int))); +} + +PageOptions::PageOptions(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageOptions::forceFullscreen(int index) +{ + bool forced = (index == 7 || index == 8 || index == 9); + + if (index != 0) { + this->SLQuality->setValue(this->SLQuality->maximum()); + this->SLQuality->setEnabled(false); + this->CBFullscreen->setEnabled(!forced); + this->CBFullscreen->setChecked(forced ? true : previousFullscreenValue); + this->CBResolution->setCurrentIndex(forced ? 0 : previousResolutionIndex); + } else { + this->SLQuality->setEnabled(true); + this->CBFullscreen->setEnabled(true); + this->SLQuality->setValue(previousQuality); + this->CBFullscreen->setChecked(previousFullscreenValue); + this->CBResolution->setCurrentIndex(previousResolutionIndex); + } +} + +void PageOptions::setQuality(int value) +{ + int index = this->CBStereoMode->currentIndex(); + if (index == 0) + previousQuality = this->SLQuality->value(); +} + +void PageOptions::setFullscreen(int state) +{ + int index = this->CBStereoMode->currentIndex(); + if (index != 7 && index != 8 && index != 9) + previousFullscreenValue = this->CBFullscreen->isChecked(); +} + +void PageOptions::setResolution(int state) +{ + int index = this->CBStereoMode->currentIndex(); + if (index != 7 && index != 8 && index != 9) + previousResolutionIndex = this->CBResolution->currentIndex(); +} + +void PageOptions::trimNetNick() +{ + editNetNick->setText(editNetNick->text().trimmed()); +} + +void PageOptions::requestEditSelectedTeam() +{ + emit editTeamRequested(CBTeamName->currentText()); +} + +void PageOptions::requestDeleteSelectedTeam() +{ + emit deleteTeamRequested(CBTeamName->currentText()); +} + +void PageOptions::setTeamOptionsEnabled(bool enabled) +{ + BtnNewTeam->setVisible(enabled); + BtnEditTeam->setVisible(enabled); + BtnDeleteTeam->setVisible(enabled); + CBTeamName->setVisible(enabled); + LblNoEditTeam->setVisible(!enabled); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageoptions.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageoptions.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,107 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_OPTIONS_H +#define PAGE_OPTIONS_H + +#include "AbstractPage.h" + +class FPSEdit; +class IconedGroupBox; + +class PageOptions : public AbstractPage +{ + Q_OBJECT + +public: + PageOptions(QWidget* parent = 0); + + QCheckBox *WeaponTooltip; + QPushButton *WeaponNew; + QPushButton *WeaponEdit; + QPushButton *WeaponDelete; + QComboBox *WeaponsName; + QPushButton *SchemeNew; + QPushButton *SchemeEdit; + QPushButton *SchemeDelete; + QComboBox *SchemesName; + + QComboBox *CBLanguage; + + IconedGroupBox *teamsBox;; + QPushButton *BtnAssociateFiles; + QComboBox *CBTeamName; + IconedGroupBox *AGGroupBox; + QComboBox *CBResolution; + QComboBox *CBStereoMode; + QCheckBox *CBEnableSound; + QCheckBox *CBEnableFrontendSound; + QCheckBox *CBEnableMusic; + QCheckBox *CBEnableFrontendMusic; + QCheckBox *CBFullscreen; + QCheckBox *CBFrontendFullscreen; + QCheckBox *CBShowFPS; + QCheckBox *CBAltDamage; + QCheckBox *CBNameWithDate; +#ifdef __APPLE__ + QCheckBox *CBAutoUpdate; +#endif + + FPSEdit *fpsedit; + QPushButton *btnSave; + QLabel *labelNN; + QLabel *labelNetPassword; + QSpinBox * volumeBox; + QLineEdit *editNetNick; + QLineEdit *editNetPassword; + QSlider *SLQuality; + QCheckBox *CBFrontendEffects; + + void setTeamOptionsEnabled(bool enabled); + +signals: + void newTeamRequested(); + void editTeamRequested(const QString & teamName); + void deleteTeamRequested(const QString & teamName); + + +private: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + + bool previousFullscreenValue; + int previousResolutionIndex; + int previousQuality; + QLabel *LblNoEditTeam; + QPushButton *BtnNewTeam; + QPushButton *BtnEditTeam; + QPushButton *BtnDeleteTeam; + +private slots: + void forceFullscreen(int index); + void setFullscreen(int state); + void setResolution(int state); + void setQuality(int value); + void trimNetNick(); + void requestEditSelectedTeam(); + void requestDeleteSelectedTeam(); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageplayrecord.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageplayrecord.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,165 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hwconsts.h" +#include "pageplayrecord.h" + +QLayout * PagePlayDemo::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + pageLayout->setColumnStretch(0, 1); + pageLayout->setColumnStretch(1, 2); + pageLayout->setColumnStretch(2, 1); + pageLayout->setRowStretch(2, 100); + + BtnPlayDemo = new QPushButton(this); + BtnPlayDemo->setFont(*font14); + BtnPlayDemo->setText(QPushButton::tr("Play demo")); + pageLayout->addWidget(BtnPlayDemo, 3, 2); + + BtnRenameRecord = new QPushButton(this); + BtnRenameRecord->setText(QPushButton::tr("Rename")); + pageLayout->addWidget(BtnRenameRecord, 0, 2); + + BtnRemoveRecord = new QPushButton(this); + BtnRemoveRecord->setText(QPushButton::tr("Delete")); + pageLayout->addWidget(BtnRemoveRecord, 1, 2); + + DemosList = new QListWidget(this); + DemosList->setGeometry(QRect(170, 10, 311, 311)); + pageLayout->addWidget(DemosList, 0, 1, 3, 1); + + return pageLayout; +} + +void PagePlayDemo::connectSignals() +{ + connect(BtnRenameRecord, SIGNAL(clicked()), this, SLOT(renameRecord())); + connect(BtnRemoveRecord, SIGNAL(clicked()), this, SLOT(removeRecord())); +} + +PagePlayDemo::PagePlayDemo(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PagePlayDemo::FillFromDir(RecordType rectype) +{ + QDir dir; + QString extension; + + recType = rectype; + + dir.cd(cfgdir->absolutePath()); + if (rectype == RT_Demo) + { + dir.cd("Demos"); + extension = "hwd"; + BtnPlayDemo->setText(QPushButton::tr("Play demo")); + } else + { + dir.cd("Saves"); + extension = "hws"; + BtnPlayDemo->setText(QPushButton::tr("Load")); + } + dir.setFilter(QDir::Files); + + QStringList sl = dir.entryList(QStringList(QString("*.%2.%1").arg(extension, *cProtoVer))); + sl.replaceInStrings(QRegExp(QString("^(.*)\\.%2\\.%1$").arg(extension, *cProtoVer)), "\\1"); + + DemosList->clear(); + DemosList->addItems(sl); + + for (int i = 0; i < DemosList->count(); ++i) + { + DemosList->item(i)->setData(Qt::UserRole, dir.absoluteFilePath(QString("%1.%3.%2").arg(sl[i], extension, *cProtoVer))); + DemosList->item(i)->setIcon(recType == RT_Demo ? QIcon(":/res/file_demo.png") : QIcon(":/res/file_save.png")); + } +} + +void PagePlayDemo::renameRecord() +{ + QListWidgetItem * curritem = DemosList->currentItem(); + if (!curritem) + { + QMessageBox::critical(this, + tr("Error"), + tr("Please select record from the list"), + tr("OK")); + return ; + } + QFile rfile(curritem->data(Qt::UserRole).toString()); + + QFileInfo finfo(rfile); + + bool ok; + + QString newname = QInputDialog::getText(this, tr("Rename dialog"), tr("Enter new file name:"), QLineEdit::Normal, finfo.completeBaseName().replace("." + *cProtoVer, ""), &ok); + + if(ok && newname.size()) + { + QString newfullname = QString("%1/%2.%3.%4") + .arg(finfo.absolutePath()) + .arg(newname) + .arg(*cProtoVer) + .arg(finfo.suffix()); + + ok = rfile.rename(newfullname); + if(!ok) + QMessageBox::critical(this, tr("Error"), tr("Cannot rename to") + newfullname); + else + FillFromDir(recType); + } +} + +void PagePlayDemo::removeRecord() +{ + QListWidgetItem * curritem = DemosList->currentItem(); + if (!curritem) + { + QMessageBox::critical(this, + tr("Error"), + tr("Please select record from the list"), + tr("OK")); + return ; + } + QFile rfile(curritem->data(Qt::UserRole).toString()); + + bool ok; + + ok = rfile.remove(); + if(!ok) + QMessageBox::critical(this, tr("Error"), tr("Cannot delete file")); + else + FillFromDir(recType); +} + +bool PagePlayDemo::isSave() +{ + return recType == RT_Save; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageplayrecord.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageplayrecord.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,61 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PLAYRECORDPAGE_H +#define PLAYRECORDPAGE_H + +#include + +#include "AbstractPage.h" + +class QPushButton; +class QListWidget; + +class PagePlayDemo : public AbstractPage +{ + Q_OBJECT + +public: + enum RecordType { + RT_Demo, + RT_Save + }; + + PagePlayDemo(QWidget* parent = 0); + + void FillFromDir(RecordType rectype); + bool isSave(); + + QPushButton *BtnPlayDemo; + QPushButton *BtnRenameRecord; + QPushButton *BtnRemoveRecord; + QListWidget *DemosList; + +private: + QLayout * bodyLayoutDefinition(); + void connectSignals(); + + RecordType recType; + +private slots: + void renameRecord(); + void removeRecord(); +}; + + +#endif // PLAYRECORDPAGE_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageroomslist.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageroomslist.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,419 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ammoSchemeModel.h" +#include "pageroomslist.h" +#include "hwconsts.h" +#include "chatwidget.h" + +QLayout * PageRoomsList::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + QHBoxLayout * newRoomLayout = new QHBoxLayout(); + QLabel * roomNameLabel = new QLabel(this); + roomNameLabel->setText(tr("Room Name:")); + roomName = new QLineEdit(this); + roomName->setMaxLength(60); + newRoomLayout->addWidget(roomNameLabel); + newRoomLayout->addWidget(roomName); + pageLayout->addLayout(newRoomLayout, 0, 0, 1, 2); + + roomsList = new QTableWidget(this); + roomsList->setSelectionBehavior(QAbstractItemView::SelectRows); + roomsList->verticalHeader()->setVisible(false); + roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive); + roomsList->setAlternatingRowColors(true); + roomsList->setShowGrid(false); + roomsList->setSelectionMode(QAbstractItemView::SingleSelection); + pageLayout->addWidget(roomsList, 1, 0, 3, 2); + pageLayout->setRowStretch(2, 100); + + QHBoxLayout * filterLayout = new QHBoxLayout(); + + QLabel * stateLabel = new QLabel(this); + CBState = new QComboBox(this); + + filterLayout->addWidget(stateLabel); + filterLayout->addWidget(CBState); + filterLayout->addSpacing(30); + + QLabel * ruleLabel = new QLabel(this); + ruleLabel->setText(tr("Rules:")); + CBRules = new QComboBox(this); + + filterLayout->addWidget(ruleLabel); + filterLayout->addWidget(CBRules); + filterLayout->addSpacing(30); + + QLabel * weaponLabel = new QLabel(this); + weaponLabel->setText(tr("Weapons:")); + CBWeapons = new QComboBox(this); + + filterLayout->addWidget(weaponLabel); + filterLayout->addWidget(CBWeapons); + filterLayout->addSpacing(30); + + QLabel * searchLabel = new QLabel(this); + searchLabel->setText(tr("Search:")); + searchText = new QLineEdit(this); + searchText->setMaxLength(60); + filterLayout->addWidget(searchLabel); + filterLayout->addWidget(searchText); + + pageLayout->addLayout(filterLayout, 4, 0, 1, 2); + + chatWidget = new HWChatWidget(this, m_gameSettings, m_sdli, false); + pageLayout->addWidget(chatWidget, 5, 0, 1, 3); + pageLayout->setRowStretch(5, 350); + + BtnCreate = addButton(tr("Create"), pageLayout, 0, 2); + BtnJoin = addButton(tr("Join"), pageLayout, 1, 2); + BtnRefresh = addButton(tr("Refresh"), pageLayout, 3, 2); + BtnClear = addButton(tr("Clear"), pageLayout, 4, 2); + + CBRules->addItem(QComboBox::tr("Any")); + CBState->addItem(QComboBox::tr("Any")); + CBState->addItem(QComboBox::tr("In lobby")); + CBState->addItem(QComboBox::tr("In progress")); + + return pageLayout; +} + +QLayout * PageRoomsList::footerLayoutDefinition() +{ + QGridLayout * bottomLayout = new QGridLayout(); + + lblCount = new QLabel(this); + bottomLayout->addWidget(lblCount, 0, 0, Qt::AlignHCenter); + lblCount->setText("?"); + lblCount->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum); + + BtnAdmin = addButton(tr("Admin features"), bottomLayout, 6, 2); + + return bottomLayout; +} + +void PageRoomsList::connectSignals() +{ + connect(chatWidget, SIGNAL(nickCountUpdate(const int)), this, SLOT(updateNickCounter(const int))); + + connect(BtnCreate, SIGNAL(clicked()), this, SLOT(onCreateClick())); + connect(BtnJoin, SIGNAL(clicked()), this, SLOT(onJoinClick())); + connect(BtnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClick())); + connect(BtnClear, SIGNAL(clicked()), this, SLOT(onClearClick())); + connect(roomsList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(onJoinClick())); + connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); + connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); + connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick())); + connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onRefreshClick())); + connect(this, SIGNAL(askJoinConfirmation (const QString &)), this, SLOT(onJoinConfirmation(const QString &)), Qt::QueuedConnection); +} + + +PageRoomsList::PageRoomsList(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli) : + AbstractPage(parent) +{ + m_gameSettings = gameSettings; + m_sdli = sdli; + + initPage(); + + // not the most elegant solution but it works + ammoSchemeModel = new AmmoSchemeModel(this, NULL); + for (int i = 0; i < ammoSchemeModel->predefSchemesNames.count(); i++) + CBRules->addItem(ammoSchemeModel->predefSchemesNames.at(i).toAscii().constData()); + + CBWeapons->addItem(QComboBox::tr("Any")); + for (int i = 0; i < cDefaultAmmos.count(); i++) { + QPair ammo = cDefaultAmmos.at(i); + CBWeapons->addItem(ammo.first.toAscii().constData()); + } + + gameInLobby = false; +} + +void PageRoomsList::setAdmin(bool flag) +{ + BtnAdmin->setVisible(flag); +} + +void PageRoomsList::setRoomsList(const QStringList & list) +{ + QBrush red(QColor(255, 0, 0)); + QBrush orange(QColor(127, 127, 0)); + QBrush yellow(QColor(255, 255, 0)); + QBrush green(QColor(0, 255, 0)); + + listFromServer = list; + + QString selection = ""; + + if(QTableWidgetItem *item = roomsList->item(roomsList->currentRow(), 0)) + selection = item->text(); + + roomsList->clear(); + roomsList->setColumnCount(7); + roomsList->setHorizontalHeaderLabels( + QStringList() << + QTableWidget::tr("Room Name") << + QTableWidget::tr("C") << + QTableWidget::tr("T") << + QTableWidget::tr("Owner") << + QTableWidget::tr("Map") << + QTableWidget::tr("Rules") << + QTableWidget::tr("Weapons") + ); + + // set minimum sizes +// roomsList->horizontalHeader()->resizeSection(0, 200); +// roomsList->horizontalHeader()->resizeSection(1, 50); +// roomsList->horizontalHeader()->resizeSection(2, 50); +// roomsList->horizontalHeader()->resizeSection(3, 100); +// roomsList->horizontalHeader()->resizeSection(4, 100); +// roomsList->horizontalHeader()->resizeSection(5, 100); +// roomsList->horizontalHeader()->resizeSection(6, 100); + + // set resize modes +// roomsList->horizontalHeader()->setResizeMode(QHeaderView::Interactive); + + bool gameCanBeJoined = true; + + if (list.size() % 8) + return; + + roomsList->setRowCount(list.size() / 8); + for(int i = 0, r = 0; i < list.size(); i += 8, r++) + { + // if we are joining a game + // TODO: Should NOT be done here + if (gameInLobby) { + if (gameInLobbyName == list[i + 1]) { + gameCanBeJoined = list[i].compare("True"); + } + } + + // check filter settings + #define NO_FILTER_MATCH roomsList->setRowCount(roomsList->rowCount() - 1); --r; continue + + if (list[i].compare("True") && CBState->currentIndex() == 2) { NO_FILTER_MATCH; } + if (list[i].compare("False") && CBState->currentIndex() == 1) { NO_FILTER_MATCH; } + if (CBRules->currentIndex() != 0 && list[i + 6].compare(CBRules->currentText())) { NO_FILTER_MATCH; } + if (CBWeapons->currentIndex() != 0 && list[i + 7].compare(CBWeapons->currentText())) { NO_FILTER_MATCH; } + bool found = list[i + 1].contains(searchText->text(), Qt::CaseInsensitive); + if (!found) { + for (int a = 4; a <= 7; ++a) { + QString compString = list[i + a]; + if (a == 5 && compString == "+rnd+") { + compString = "Random Map"; + } else if (a == 5 && compString == "+maze+") { + compString = "Random Maze"; + } else if (a == 5 && compString == "+drawn+") { + compString = "Drawn Map"; + } + if (compString.contains(searchText->text(), Qt::CaseInsensitive)) { + found = true; + break; + } + } + } + if (!searchText->text().isEmpty() && !found) { NO_FILTER_MATCH; } + + QTableWidgetItem * item; + item = new QTableWidgetItem(list[i + 1]); // room name + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + + // pick appropriate room icon and tooltip (game in progress yes/no; later maybe locked rooms etc.) + if(list[i].compare("True")) + { + item->setIcon(QIcon(":/res/iconTime.png"));// game is in lobby + item->setToolTip(tr("This game is in lobby.\nYou may join and start playing once the game starts.")); + } + else + { + item->setIcon(QIcon(":/res/iconDamage.png"));// game has started + item->setToolTip(tr("This game is in progress.\nYou may join and spectate now but you'll have to wait for the game to end to start playing.")); + } + + roomsList->setItem(r, 0, item); + + item = new QTableWidgetItem(list[i + 2]); // number of clients + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setTextAlignment(Qt::AlignCenter); + item->setToolTip(tr("There are %1 clients connected to this room.", "", list[i + 2].toInt()).arg(list[i + 2])); + roomsList->setItem(r, 1, item); + + item = new QTableWidgetItem(list[i + 3]); // number of teams + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setTextAlignment(Qt::AlignCenter); + item->setToolTip(tr("There are %1 teams participating in this room.", "", list[i + 3].toInt()).arg(list[i + 3])); + //Should we highlight "full" games? Might get misinterpreted + //if(list[i + 3].toInt() >= cMaxTeams) + // item->setForeground(red); + roomsList->setItem(r, 2, item); + + item = new QTableWidgetItem(list[i + 4].left(15)); // name of host + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setToolTip(tr("%1 is the host. He may adjust settings and start the game.").arg(list[i + 4])); + roomsList->setItem(r, 3, item); + + if(list[i + 5] == "+rnd+") + { + item = new QTableWidgetItem(tr("Random Map")); // selected map (is randomized) +// FIXME - need real icons. Disabling until then +// item->setIcon(QIcon(":/res/mapRandom.png")); + } + else if (list[i+5] == "+maze+") + { + item = new QTableWidgetItem(tr("Random Maze")); +// FIXME - need real icons. Disabling until then +// item->setIcon(QIcon(":/res/mapMaze.png")); + } + else + { + item = new QTableWidgetItem(list[i + 5]); // selected map + + // check to see if we've got this map + // not perfect but a start + if(!mapList->contains(list[i + 5])) + { + item->setForeground(red); + item->setIcon(QIcon(":/res/mapMissing.png")); + } + else + { + // todo: mission icon? +// FIXME - need real icons. Disabling until then +// item->setIcon(QIcon(":/res/mapCustom.png")); + } + } + + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setToolTip(tr("Games may be played on precreated or randomized maps.")); + roomsList->setItem(r, 4, item); + + item = new QTableWidgetItem(list[i + 6].left(24)); // selected game scheme + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setToolTip(tr("The Game Scheme defines general options and preferences like Round Time, Sudden Death or Vampirism.")); + roomsList->setItem(r, 5, item); + + item = new QTableWidgetItem(list[i + 7].left(24)); // selected weapon scheme + item->setFlags(Qt::ItemIsEnabled | Qt::ItemIsSelectable); + item->setToolTip(tr("The Weapon Scheme defines available weapons and their ammunition count.")); + roomsList->setItem(r, 6, item); + + if(!list[i + 1].compare(selection) && !selection.isEmpty()) + roomsList->selectionModel()->setCurrentIndex(roomsList->model()->index(r, 0), QItemSelectionModel::SelectCurrent | QItemSelectionModel::Rows); + } + + roomsList->horizontalHeader()->setResizeMode(0, QHeaderView::Stretch); + roomsList->horizontalHeader()->setResizeMode(1, QHeaderView::ResizeToContents); + roomsList->horizontalHeader()->setResizeMode(2, QHeaderView::ResizeToContents); + roomsList->horizontalHeader()->setResizeMode(3, QHeaderView::ResizeToContents); + roomsList->horizontalHeader()->setResizeMode(4, QHeaderView::ResizeToContents); + roomsList->horizontalHeader()->setResizeMode(5, QHeaderView::ResizeToContents); + roomsList->horizontalHeader()->setResizeMode(6, QHeaderView::ResizeToContents); + + // TODO: Should NOT be done here + if (gameInLobby) { + gameInLobby = false; + if (gameCanBeJoined) { + emit askForJoinRoom(gameInLobbyName); + } else { + emit askJoinConfirmation(gameInLobbyName); + } + } + +// roomsList->resizeColumnsToContents(); +} + +void PageRoomsList::onCreateClick() +{ + if (roomName->text().size()) + emit askForCreateRoom(roomName->text()); + else + QMessageBox::critical(this, + tr("Error"), + tr("Please enter room name"), + tr("OK")); +} + +void PageRoomsList::onJoinClick() +{ + QTableWidgetItem * curritem = roomsList->item(roomsList->currentRow(), 0); + if (!curritem) + { + QMessageBox::critical(this, + tr("Error"), + tr("Please select room from the list"), + tr("OK")); + return; + } + + for (int i = 0; i < listFromServer.size(); i += 8) { + if (listFromServer[i + 1] == curritem->data(Qt::DisplayRole).toString()) { + gameInLobby = listFromServer[i].compare("True"); + break; + } + } + + if (gameInLobby) { + gameInLobbyName = curritem->data(Qt::DisplayRole).toString(); + emit askForRoomList(); + } else { + emit askForJoinRoom(curritem->data(Qt::DisplayRole).toString()); + } +} + +void PageRoomsList::onRefreshClick() +{ + emit askForRoomList(); +} + +void PageRoomsList::onClearClick() +{ + CBState->setCurrentIndex(0); + CBRules->setCurrentIndex(0); + CBWeapons->setCurrentIndex(0); + searchText->clear(); +} + +void PageRoomsList::onJoinConfirmation(const QString & room) +{ + if (QMessageBox::warning(this, + tr("Warning"), + tr("The game you are trying to join has started.\nDo you still want to join the room?"), + QMessageBox::Yes | QMessageBox::No) == QMessageBox::Yes) + { + emit askForJoinRoom(room); + } +} + +void PageRoomsList::updateNickCounter(int cnt) +{ + lblCount->setText(tr("%1 players online", 0, cnt).arg(cnt)); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageroomslist.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageroomslist.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,83 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_ROOMLIST_H +#define PAGE_ROOMLIST_H + +#include "AbstractPage.h" +#include "SDLs.h" + +class HWChatWidget; +class AmmoSchemeModel; + +class PageRoomsList : public AbstractPage +{ + Q_OBJECT + +public: + PageRoomsList(QWidget* parent, QSettings * config, SDLInteraction * sdli); + + QLineEdit * roomName; + QLineEdit * searchText; + QTableWidget * roomsList; + QPushButton * BtnCreate; + QPushButton * BtnJoin; + QPushButton * BtnRefresh; + QPushButton * BtnAdmin; + QPushButton * BtnClear; + QComboBox * CBState; + QComboBox * CBRules; + QComboBox * CBWeapons; + HWChatWidget * chatWidget; + QLabel * lblCount; + +public slots: + void setRoomsList(const QStringList & list); + void setAdmin(bool); + void updateNickCounter(int cnt); + +signals: + void askForCreateRoom(const QString &); + void askForJoinRoom(const QString &); + void askForRoomList(); + void askJoinConfirmation(const QString &); + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + +private slots: + void onCreateClick(); + void onJoinClick(); + void onRefreshClick(); + void onClearClick(); + void onJoinConfirmation(const QString &); + +private: + QSettings * m_gameSettings; + SDLInteraction * m_sdli; + + bool gameInLobby; + QString gameInLobbyName; + QStringList listFromServer; + AmmoSchemeModel * ammoSchemeModel; + +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagescheme.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagescheme.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,510 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "ammoSchemeModel.h" +#include "pagescheme.h" +#include "FreqSpinBox.h" + + +QLayout * PageScheme::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + QGroupBox * gb = new QGroupBox(this); + + QGridLayout * gl = new QGridLayout(); + gb->setLayout(gl); + QSizePolicy sp; + sp.setVerticalPolicy(QSizePolicy::MinimumExpanding); + sp.setHorizontalPolicy(QSizePolicy::Expanding); + + pageLayout->addWidget(gb, 1,0,13,5); + + gbGameModes = new QGroupBox(QGroupBox::tr("Game Modifiers"), gb); + gbBasicSettings = new QGroupBox(QGroupBox::tr("Basic Settings"), gb); + + // TODO name stuff and put CSS into main style sheet + gbGameModes->setStyleSheet(".QGroupBox {" + "background-color: #130f2c; background-image:url();" + "}"); + gbBasicSettings->setStyleSheet(".QGroupBox {" + "background-color: #130f2c; background-image:url();" + "}"); + + gbGameModes->setSizePolicy(sp); + gbBasicSettings->setSizePolicy(sp); + gl->addWidget(gbGameModes,0,0,1,3,Qt::AlignTop); + gl->addWidget(gbBasicSettings,0,3,1,3,Qt::AlignTop); + + QGridLayout * glGMLayout = new QGridLayout(gbGameModes); + QGridLayout * glBSLayout = new QGridLayout(gbBasicSettings); + gbGameModes->setLayout(glGMLayout); + gbBasicSettings->setLayout(glBSLayout); + // Left + + TBW_mode_Forts = new ToggleButtonWidget(gbGameModes, ":/res/btnForts@2x.png"); + TBW_mode_Forts->setToolTip("" + ToggleButtonWidget::tr("Fort Mode") + ":
" + tr("Defend your fort and destroy the opponents, two team colours max!")); + glGMLayout->addWidget(TBW_mode_Forts,0,0,1,1); + + TBW_teamsDivide = new ToggleButtonWidget(gbGameModes, ":/res/btnTeamsDivide@2x.png"); + TBW_teamsDivide->setToolTip("" + ToggleButtonWidget::tr("Divide Teams") + ":
" + tr("Teams will start on opposite sides of the terrain, two team colours max!")); + glGMLayout->addWidget(TBW_teamsDivide,0,1,1,1); + + TBW_solid = new ToggleButtonWidget(gbGameModes, ":/res/btnSolid@2x.png"); + TBW_solid->setToolTip("" + ToggleButtonWidget::tr("Solid Land") + ":
" + tr("Land can not be destroyed!")); + glGMLayout->addWidget(TBW_solid,0,2,1,1); + + TBW_border = new ToggleButtonWidget(gbGameModes, ":/res/btnBorder@2x.png"); + TBW_border->setToolTip("" + ToggleButtonWidget::tr("Add Border") + ":
" + tr("Add an indestructible border around the terrain")); + glGMLayout->addWidget(TBW_border,0,3,1,1); + + TBW_lowGravity = new ToggleButtonWidget(gbGameModes, ":/res/btnLowGravity@2x.png"); + TBW_lowGravity->setToolTip("" + ToggleButtonWidget::tr("Low Gravity") + ":
" + tr("Lower gravity")); + glGMLayout->addWidget(TBW_lowGravity,0,4,1,1); + + TBW_laserSight = new ToggleButtonWidget(gbGameModes, ":/res/btnLaserSight@2x.png"); + TBW_laserSight->setToolTip("" + ToggleButtonWidget::tr("Laser Sight") + ":
" + tr("Assisted aiming with laser sight")); + glGMLayout->addWidget(TBW_laserSight,1,0,1,1); + + TBW_invulnerable = new ToggleButtonWidget(gbGameModes, ":/res/btnInvulnerable@2x.png"); + TBW_invulnerable->setToolTip("" + ToggleButtonWidget::tr("Invulnerable") + ":
" + tr("All hogs have a personal forcefield")); + glGMLayout->addWidget(TBW_invulnerable,1,1,1,1); + + TBW_resethealth = new ToggleButtonWidget(gbGameModes, ":/res/btnResetHealth@2x.png"); + TBW_resethealth->setToolTip("" + ToggleButtonWidget::tr("Reset Health") + ":
" + tr("All (living) hedgehogs are fully restored at the end of turn")); + glGMLayout->addWidget(TBW_resethealth,1,2,1,1); + + TBW_vampiric = new ToggleButtonWidget(gbGameModes, ":/res/btnVampiric@2x.png"); + TBW_vampiric->setToolTip("" + ToggleButtonWidget::tr("Vampirism") + ":
" + tr("Gain 80% of the damage you do back in health")); + glGMLayout->addWidget(TBW_vampiric,1,3,1,1); + + TBW_karma = new ToggleButtonWidget(gbGameModes, ":/res/btnKarma@2x.png"); + TBW_karma->setToolTip("" + ToggleButtonWidget::tr("Karma") + ":
" + tr("Share your opponents pain, share their damage")); + glGMLayout->addWidget(TBW_karma,1,4,1,1); + + TBW_artillery = new ToggleButtonWidget(gbGameModes, ":/res/btnArtillery@2x.png"); + TBW_artillery->setToolTip("" + ToggleButtonWidget::tr("Artillery") + ":
" + tr("Your hogs are unable to move, put your artillery skills to the test")); + glGMLayout->addWidget(TBW_artillery,2,0,1,1); + + TBW_randomorder = new ToggleButtonWidget(gbGameModes, ":/res/btnRandomOrder@2x.png"); + TBW_randomorder->setToolTip("" + ToggleButtonWidget::tr("Random Order") + ":
" + tr("Order of play is random instead of in room order.")); + glGMLayout->addWidget(TBW_randomorder,2,1,1,1); + + TBW_king = new ToggleButtonWidget(gbGameModes, ":/res/btnKing@2x.png"); + TBW_king->setToolTip("" + ToggleButtonWidget::tr("King") + ":
" + tr("Play with a King. If he dies, your side dies.")); + glGMLayout->addWidget(TBW_king,2,2,1,1); + + TBW_placehog = new ToggleButtonWidget(gbGameModes, ":/res/btnPlaceHog@2x.png"); + TBW_placehog->setToolTip("" + ToggleButtonWidget::tr("Place Hedgehogs") + ":
" + tr("Take turns placing your hedgehogs before the start of play.")); + glGMLayout->addWidget(TBW_placehog,2,3,1,1); + + TBW_sharedammo = new ToggleButtonWidget(gbGameModes, ":/res/btnSharedAmmo@2x.png"); + TBW_sharedammo->setToolTip("" + ToggleButtonWidget::tr("Clan Shares Ammo") + ":
" + tr("Ammo is shared between all teams that share a colour.")); + glGMLayout->addWidget(TBW_sharedammo,2,4,1,1); + + TBW_disablegirders = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableGirders@2x.png"); + TBW_disablegirders->setToolTip("" + ToggleButtonWidget::tr("Disable Girders") + ":
" + tr("Disable girders when generating random maps.")); + glGMLayout->addWidget(TBW_disablegirders,3,0,1,1); + + TBW_disablelandobjects = new ToggleButtonWidget(gbGameModes, ":/res/btnDisableLandObjects@2x.png"); + TBW_disablelandobjects->setToolTip("" + ToggleButtonWidget::tr("Disable Land Objects") + ":
" + tr("Disable land objects when generating random maps.")); + glGMLayout->addWidget(TBW_disablelandobjects,3,1,1,1); + + TBW_aisurvival = new ToggleButtonWidget(gbGameModes, ":/res/btnAISurvival@2x.png"); + TBW_aisurvival->setToolTip("" + ToggleButtonWidget::tr("AI Survival Mode") + ":
" + tr("AI respawns on death.")); + glGMLayout->addWidget(TBW_aisurvival,3,2,1,1); + + TBW_infattack = new ToggleButtonWidget(gbGameModes, ":/res/btnInfAttack@2x.png"); + TBW_infattack->setToolTip("" + ToggleButtonWidget::tr("Unlimited Attacks") + ":
" + tr("Attacking does not end your turn.")); + glGMLayout->addWidget(TBW_infattack,3,3,1,1); + + TBW_resetweps = new ToggleButtonWidget(gbGameModes, ":/res/btnResetWeps@2x.png"); + TBW_resetweps->setToolTip("" + ToggleButtonWidget::tr("Reset Weapons") + ":
" + tr("Weapons are reset to starting values each turn.")); + glGMLayout->addWidget(TBW_resetweps,3,4,1,1); + + TBW_perhogammo = new ToggleButtonWidget(gbGameModes, ":/res/btnPerHogAmmo@2x.png"); + TBW_perhogammo->setToolTip("" + ToggleButtonWidget::tr("Per Hedgehog Ammo") + ":
" + tr("Each hedgehog has its own ammo. It does not share with the team.")); + glGMLayout->addWidget(TBW_perhogammo,4,0,1,1); + + TBW_nowind = new ToggleButtonWidget(gbGameModes, ":/res/btnNoWind@2x.png"); + TBW_nowind->setToolTip("" + ToggleButtonWidget::tr("Disable Wind") + ":
" + tr("You will not have to worry about wind anymore.")); + glGMLayout->addWidget(TBW_nowind,4,1,1,1); + + TBW_morewind = new ToggleButtonWidget(gbGameModes, ":/res/btnMoreWind@2x.png"); + TBW_morewind->setToolTip("" + ToggleButtonWidget::tr("More Wind") + ":
" + tr("Wind will affect almost everything.")); + glGMLayout->addWidget(TBW_morewind,4,2,1,1); + + TBW_tagteam = new ToggleButtonWidget(gbGameModes, ":/res/btnTagTeam@2x.png"); + TBW_tagteam->setToolTip("" + ToggleButtonWidget::tr("Tag Team") + ":
" + tr("Teams in each clan take successive turns sharing their turn time.")); + glGMLayout->addWidget(TBW_tagteam,4,3,1,1); + + TBW_bottomborder = new ToggleButtonWidget(gbGameModes, ":/res/btnBottomBorder@2x.png"); + TBW_bottomborder->setToolTip("" + ToggleButtonWidget::tr("Add Bottom Border") + ":
" + tr("Add an indestructible border along the bottom")); + glGMLayout->addWidget(TBW_bottomborder,4,4,1,1); + + + // Right + QLabel * l; + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Damage Modifier")); + l->setWordWrap(true); + glBSLayout->addWidget(l,0,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconDamage.png")); + glBSLayout->addWidget(l,0,1,1,1); + SB_DamageModifier = new QSpinBox(gbBasicSettings); + SB_DamageModifier->setRange(10, 300); + SB_DamageModifier->setValue(100); + SB_DamageModifier->setSingleStep(25); + glBSLayout->addWidget(SB_DamageModifier,0,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Turn Time")); + l->setWordWrap(true); + glBSLayout->addWidget(l,1,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconTime.png")); + glBSLayout->addWidget(l,1,1,1,1); + SB_TurnTime = new QSpinBox(gbBasicSettings); + SB_TurnTime->setRange(1, 9999); + SB_TurnTime->setValue(45); + SB_TurnTime->setSingleStep(15); + glBSLayout->addWidget(SB_TurnTime,1,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Initial Health")); + l->setWordWrap(true); + glBSLayout->addWidget(l,2,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconHealth.png")); + glBSLayout->addWidget(l,2,1,1,1); + SB_InitHealth = new QSpinBox(gbBasicSettings); + SB_InitHealth->setRange(50, 200); + SB_InitHealth->setValue(100); + SB_InitHealth->setSingleStep(25); + glBSLayout->addWidget(SB_InitHealth,2,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Sudden Death Timeout")); + l->setWordWrap(true); + glBSLayout->addWidget(l,3,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); + glBSLayout->addWidget(l,3,1,1,1); + SB_SuddenDeath = new QSpinBox(gbBasicSettings); + SB_SuddenDeath->setRange(0, 50); + SB_SuddenDeath->setValue(15); + SB_SuddenDeath->setSingleStep(3); + glBSLayout->addWidget(SB_SuddenDeath,3,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Sudden Death Water Rise")); + l->setWordWrap(true); + glBSLayout->addWidget(l,4,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon + glBSLayout->addWidget(l,4,1,1,1); + SB_WaterRise = new QSpinBox(gbBasicSettings); + SB_WaterRise->setRange(0, 100); + SB_WaterRise->setValue(47); + SB_WaterRise->setSingleStep(5); + glBSLayout->addWidget(SB_WaterRise,4,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Sudden Death Health Decrease")); + l->setWordWrap(true); + glBSLayout->addWidget(l,5,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconSuddenDeath.png")); // TODO: icon + glBSLayout->addWidget(l,5,1,1,1); + SB_HealthDecrease = new QSpinBox(gbBasicSettings); + SB_HealthDecrease->setRange(0, 100); + SB_HealthDecrease->setValue(5); + SB_HealthDecrease->setSingleStep(1); + glBSLayout->addWidget(SB_HealthDecrease,5,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("% Rope Length")); + l->setWordWrap(true); + glBSLayout->addWidget(l,6,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconRope.png")); + glBSLayout->addWidget(l,6,1,1,1); + SB_RopeModifier = new QSpinBox(gbBasicSettings); + SB_RopeModifier->setRange(25, 999); + SB_RopeModifier->setValue(100); + SB_RopeModifier->setSingleStep(25); + glBSLayout->addWidget(SB_RopeModifier,6,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Crate Drops")); + l->setWordWrap(true); + glBSLayout->addWidget(l,7,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconBox.png")); + glBSLayout->addWidget(l,7,1,1,1); + SB_CaseProb = new FreqSpinBox(gbBasicSettings); + SB_CaseProb->setRange(0, 9); + SB_CaseProb->setValue(5); + glBSLayout->addWidget(SB_CaseProb,7,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("% Health Crates")); + l->setWordWrap(true); + glBSLayout->addWidget(l,8,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon + glBSLayout->addWidget(l,8,1,1,1); + SB_HealthCrates = new QSpinBox(gbBasicSettings); + SB_HealthCrates->setRange(0, 100); + SB_HealthCrates->setValue(35); + SB_HealthCrates->setSingleStep(5); + glBSLayout->addWidget(SB_HealthCrates,8,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Health in Crates")); + l->setWordWrap(true); + glBSLayout->addWidget(l,9,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconHealth.png")); // TODO: icon + glBSLayout->addWidget(l,9,1,1,1); + SB_CrateHealth = new QSpinBox(gbBasicSettings); + SB_CrateHealth->setRange(0, 200); + SB_CrateHealth->setValue(25); + SB_CrateHealth->setSingleStep(5); + glBSLayout->addWidget(SB_CrateHealth,9,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Mines Time")); + l->setWordWrap(true); + glBSLayout->addWidget(l,10,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconTime.png")); // TODO: icon + glBSLayout->addWidget(l,10,1,1,1); + SB_MinesTime = new QSpinBox(gbBasicSettings); + SB_MinesTime->setRange(-1, 5); + SB_MinesTime->setValue(3); + SB_MinesTime->setSingleStep(1); + SB_MinesTime->setSpecialValueText(tr("Random")); + SB_MinesTime->setSuffix(" "+ tr("Seconds")); + glBSLayout->addWidget(SB_MinesTime,10,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Mines")); + l->setWordWrap(true); + glBSLayout->addWidget(l,11,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconMine.png")); // TODO: icon + glBSLayout->addWidget(l,11,1,1,1); + SB_Mines = new QSpinBox(gbBasicSettings); + SB_Mines->setRange(0, 80); + SB_Mines->setValue(0); + SB_Mines->setSingleStep(5); + glBSLayout->addWidget(SB_Mines,11,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("% Dud Mines")); + l->setWordWrap(true); + glBSLayout->addWidget(l,12,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconDud.png")); + glBSLayout->addWidget(l,12,1,1,1); + SB_MineDuds = new QSpinBox(gbBasicSettings); + SB_MineDuds->setRange(0, 100); + SB_MineDuds->setValue(0); + SB_MineDuds->setSingleStep(5); + glBSLayout->addWidget(SB_MineDuds,12,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Explosives")); + l->setWordWrap(true); + glBSLayout->addWidget(l,13,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconDamage.png")); + glBSLayout->addWidget(l,13,1,1,1); + SB_Explosives = new QSpinBox(gbBasicSettings); + SB_Explosives->setRange(0, 40); + SB_Explosives->setValue(0); + SB_Explosives->setSingleStep(1); + glBSLayout->addWidget(SB_Explosives,13,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("% Get Away Time")); + l->setWordWrap(true); + glBSLayout->addWidget(l,14,0,1,1); + l = new QLabel(gbBasicSettings); + l->setFixedSize(32,32); + l->setPixmap(QPixmap(":/res/iconTime.png")); + glBSLayout->addWidget(l,14,1,1,1); + SB_GetAwayTime = new QSpinBox(gbBasicSettings); + SB_GetAwayTime->setRange(0, 999); + SB_GetAwayTime->setValue(100); + SB_GetAwayTime->setSingleStep(25); + glBSLayout->addWidget(SB_GetAwayTime,14,2,1,1); + + l = new QLabel(gbBasicSettings); + l->setText(QLabel::tr("Scheme Name:")); + + LE_name = new QLineEdit(this); + + gl->addWidget(LE_name,15,1,1,5); + gl->addWidget(l,15,0,1,1); + + return pageLayout; +} + +QLayout * PageScheme::footerLayoutDefinition() +{ + QHBoxLayout * bottomLayout = new QHBoxLayout(); + selectScheme = new QComboBox(this); + + bottomLayout->addWidget(selectScheme, 0); + BtnCopy = addButton(tr("Copy"), bottomLayout, 1); + BtnNew = addButton(tr("New"), bottomLayout, 2); + BtnDelete = addButton(tr("Delete"), bottomLayout, 3); + + bottomLayout->setStretch(1,1); + bottomLayout->setStretch(2,1); + bottomLayout->setStretch(3,1); + + return bottomLayout; +} + +void PageScheme::connectSignals() +{ + connect(BtnCopy, SIGNAL(clicked()), this, SLOT(copyRow())); + connect(BtnNew, SIGNAL(clicked()), this, SLOT(newRow())); + connect(BtnDelete, SIGNAL(clicked()), this, SLOT(deleteRow())); + mapper = new QDataWidgetMapper(this); + connect(selectScheme, SIGNAL(currentIndexChanged(int)), mapper, SLOT(setCurrentIndex(int))); + connect(selectScheme, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeSelected(int))); +} + +PageScheme::PageScheme(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} + +void PageScheme::setModel(QAbstractItemModel * model) +{ + mapper->setModel(model); + selectScheme->setModel(model); + + mapper->addMapping(LE_name, 0); + mapper->addMapping(TBW_mode_Forts, 1); + mapper->addMapping(TBW_teamsDivide, 2); + mapper->addMapping(TBW_solid, 3); + mapper->addMapping(TBW_border, 4); + mapper->addMapping(TBW_lowGravity, 5); + mapper->addMapping(TBW_laserSight, 6); + mapper->addMapping(TBW_invulnerable, 7); + mapper->addMapping(TBW_resethealth, 8); + mapper->addMapping(TBW_vampiric, 9); + mapper->addMapping(TBW_karma, 10); + mapper->addMapping(TBW_artillery, 11); + mapper->addMapping(TBW_randomorder, 12); + mapper->addMapping(TBW_king, 13); + mapper->addMapping(TBW_placehog, 14); + mapper->addMapping(TBW_sharedammo, 15); + mapper->addMapping(TBW_disablegirders, 16); + mapper->addMapping(TBW_disablelandobjects, 17); + mapper->addMapping(TBW_aisurvival, 18); + mapper->addMapping(TBW_infattack, 19); + mapper->addMapping(TBW_resetweps, 20); + mapper->addMapping(TBW_perhogammo, 21); + mapper->addMapping(TBW_nowind, 22); + mapper->addMapping(TBW_morewind, 23); + mapper->addMapping(TBW_tagteam, 24); + mapper->addMapping(TBW_bottomborder, 25); + mapper->addMapping(SB_DamageModifier, 26); + mapper->addMapping(SB_TurnTime, 27); + mapper->addMapping(SB_InitHealth, 28); + mapper->addMapping(SB_SuddenDeath, 29); + mapper->addMapping(SB_CaseProb, 30); + mapper->addMapping(SB_MinesTime, 31); + mapper->addMapping(SB_Mines, 32); + mapper->addMapping(SB_MineDuds, 33); + mapper->addMapping(SB_Explosives, 34); + mapper->addMapping(SB_HealthCrates, 35); + mapper->addMapping(SB_CrateHealth, 36); + mapper->addMapping(SB_WaterRise, 37); + mapper->addMapping(SB_HealthDecrease, 38); + mapper->addMapping(SB_RopeModifier, 39); + mapper->addMapping(SB_GetAwayTime, 40); + + mapper->toFirst(); +} + +void PageScheme::newRow() +{ + QAbstractItemModel * model = mapper->model(); + model->insertRow(-1); + selectScheme->setCurrentIndex(model->rowCount() - 1); +} + +void PageScheme::copyRow() +{ + QAbstractItemModel * model = mapper->model(); + model->insertRow(selectScheme->currentIndex()); + selectScheme->setCurrentIndex(model->rowCount() - 1); +} + +void PageScheme::deleteRow() +{ + QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Schemes"), QMessageBox::tr("Really delete this game scheme?"), QMessageBox::Ok | QMessageBox::Cancel); + + if (reallyDelete.exec() == QMessageBox::Ok) { + QAbstractItemModel * model = mapper->model(); + model->removeRow(selectScheme->currentIndex()); + } +} + +void PageScheme::schemeSelected(int n) +{ + int c = ((AmmoSchemeModel*)mapper->model())->numberOfDefaultSchemes; + gbGameModes->setEnabled(n >= c); + gbBasicSettings->setEnabled(n >= c); + LE_name->setEnabled(n >= c); +} + + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagescheme.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagescheme.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,104 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_SCHEME_H +#define PAGE_SCHEME_H + +#include "AbstractPage.h" +#include "togglebutton.h" + +class FreqSpinBox; + +class PageScheme : public AbstractPage +{ + Q_OBJECT + +public: + PageScheme(QWidget* parent = 0); + + QPushButton * BtnCopy; + QPushButton * BtnNew; + QPushButton * BtnDelete; + QPushButton * btnSave; + QComboBox * selectScheme; + + void setModel(QAbstractItemModel * model); + +public slots: + void newRow(); + void copyRow(); + void deleteRow(); + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + +private: + QDataWidgetMapper * mapper; + ToggleButtonWidget * TBW_mode_Forts; + ToggleButtonWidget * TBW_teamsDivide; + ToggleButtonWidget * TBW_solid; + ToggleButtonWidget * TBW_border; + ToggleButtonWidget * TBW_lowGravity; + ToggleButtonWidget * TBW_laserSight; + ToggleButtonWidget * TBW_invulnerable; + ToggleButtonWidget * TBW_resethealth; + ToggleButtonWidget * TBW_vampiric; + ToggleButtonWidget * TBW_karma; + ToggleButtonWidget * TBW_artillery; + ToggleButtonWidget * TBW_randomorder; + ToggleButtonWidget * TBW_king; + ToggleButtonWidget * TBW_placehog; + ToggleButtonWidget * TBW_sharedammo; + ToggleButtonWidget * TBW_disablegirders; + ToggleButtonWidget * TBW_disablelandobjects; + ToggleButtonWidget * TBW_aisurvival; + ToggleButtonWidget * TBW_infattack; + ToggleButtonWidget * TBW_resetweps; + ToggleButtonWidget * TBW_perhogammo; + ToggleButtonWidget * TBW_nowind; + ToggleButtonWidget * TBW_morewind; + ToggleButtonWidget * TBW_tagteam; + ToggleButtonWidget * TBW_bottomborder; + + QSpinBox * SB_DamageModifier; + QSpinBox * SB_TurnTime; + QSpinBox * SB_InitHealth; + QSpinBox * SB_SuddenDeath; + QSpinBox * SB_WaterRise; + QSpinBox * SB_HealthDecrease; + FreqSpinBox * SB_CaseProb; + QSpinBox * SB_HealthCrates; + QSpinBox * SB_CrateHealth; + QSpinBox * SB_MinesTime; + QSpinBox * SB_Mines; + QSpinBox * SB_MineDuds; + QSpinBox * SB_Explosives; + QSpinBox * SB_RopeModifier; + QSpinBox * SB_GetAwayTime; + QLineEdit * LE_name; + + QGroupBox * gbGameModes; + QGroupBox * gbBasicSettings; + +private slots: + void schemeSelected(int); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageselectweapon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageselectweapon.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,75 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include + +#include "pageselectweapon.h" +#include "hwconsts.h" +#include "selectWeapon.h" + +QLayout * PageSelectWeapon::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + + pWeapons = new SelWeaponWidget(cAmmoNumber, this); + pageLayout->addWidget(pWeapons); + + return pageLayout; +} + +QLayout * PageSelectWeapon::footerLayoutDefinition() +{ + QGridLayout * bottomLayout = new QGridLayout(); + + selectWeaponSet = new QComboBox(this); + bottomLayout->addWidget(selectWeaponSet, 0, 0, 2, 1); + + // first row + BtnNew = addButton(tr("New"), bottomLayout, 0, 1); + BtnDefault = addButton(tr("Default"), bottomLayout, 0, 2); + + // second row + BtnCopy = addButton(tr("Copy"), bottomLayout, 1, 1); + BtnDelete = addButton(tr("Delete"), bottomLayout, 1, 2); + + bottomLayout->setColumnStretch(1,1); + bottomLayout->setColumnStretch(2,1); + + btnSave = addButton(":/res/Save.png", bottomLayout, 0, 3, 2, 1, true); + btnSave->setStyleSheet("QPushButton{margin: 24px 0 0 0;}"); + bottomLayout->setAlignment(btnSave, Qt::AlignRight | Qt::AlignBottom); + + return bottomLayout; +} + +void PageSelectWeapon::connectSignals() +{ + connect(BtnDefault, SIGNAL(clicked()), pWeapons, SLOT(setDefault())); + connect(btnSave, SIGNAL(clicked()), pWeapons, SLOT(save())); + connect(BtnNew, SIGNAL(clicked()), pWeapons, SLOT(newWeaponsName())); + connect(BtnCopy, SIGNAL(clicked()), pWeapons, SLOT(copy())); + connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(setWeaponsName(const QString&))); +} + +PageSelectWeapon::PageSelectWeapon(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pageselectweapon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pageselectweapon.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,47 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_SELECTWEAPON_H +#define PAGE_SELECTWEAPON_H + +#include "AbstractPage.h" + +class SelWeaponWidget; + +class PageSelectWeapon : public AbstractPage +{ + Q_OBJECT + +public: + PageSelectWeapon(QWidget* parent = 0); + + QPushButton *btnSave; + QPushButton *BtnDefault; + QPushButton *BtnDelete; + QPushButton *BtnNew; + QPushButton *BtnCopy; + SelWeaponWidget* pWeapons; + QComboBox* selectWeaponSet; + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); +}; + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagesingleplayer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagesingleplayer.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,83 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#include "pagesingleplayer.h" +#include "gamecfgwidget.h" + +QLayout * PageSinglePlayer::bodyLayoutDefinition() +{ + QVBoxLayout * vLayout = new QVBoxLayout(); + + QHBoxLayout * topLine = new QHBoxLayout(); + QHBoxLayout * middleLine = new QHBoxLayout(); + vLayout->addStretch(); + vLayout->addLayout(topLine); + vLayout->addSpacing(30); + vLayout->addLayout(middleLine); + vLayout->addStretch(); + + topLine->addStretch(); + BtnSimpleGamePage = addButton(":/res/SimpleGame.png", topLine, 0, true); + BtnSimpleGamePage->setToolTip(tr("Simple Game (a quick game against the computer, settings are chosen for you)")); + topLine->addSpacing(60); + BtnMultiplayer = addButton(":/res/Multiplayer.png", topLine, 1, true); + BtnMultiplayer->setToolTip(tr("Multiplayer (play a hotseat game against your friends, or AI teams)")); + topLine->addStretch(); + + + BtnCampaignPage = addButton(":/res/Campaign.png", middleLine, 0, true); + BtnCampaignPage->setToolTip(tr("Campaign Mode (...)")); + BtnCampaignPage->setVisible(false); + + BtnTrainPage = addButton(":/res/Trainings.png", middleLine, 1, true); + BtnTrainPage->setToolTip(tr("Training Mode (Practice your skills in a range of training missions)")); + + return vLayout; +} + +QLayout * PageSinglePlayer::footerLayoutDefinition() +{ + QHBoxLayout * bottomLine = new QHBoxLayout(); + bottomLine->addStretch(); + + BtnDemos = addButton(":/res/Record.png", bottomLine, 1, true); + BtnDemos->setToolTip(tr("Demos (Watch recorded demos)")); + BtnLoad = addButton(":/res/Load.png", bottomLine, 2, true); + BtnLoad->setStyleSheet("QPushButton{margin: 24px 0 0 0;}"); + BtnLoad->setToolTip(tr("Load (Load a previously saved game)")); + + bottomLine->setStretch(1,0); + bottomLine->setStretch(2,0); + bottomLine->setAlignment(BtnDemos, Qt::AlignRight | Qt::AlignBottom); + bottomLine->setAlignment(BtnLoad, Qt::AlignRight | Qt::AlignBottom); + + return bottomLine; +} + +void PageSinglePlayer::connectSignals() +{ + //TODO +} + +PageSinglePlayer::PageSinglePlayer(QWidget* parent) : AbstractPage(parent) +{ + initPage(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagesingleplayer.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagesingleplayer.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,48 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_SINGLE_PLAYER_H +#define PAGE_SINGLE_PLAYER_H + +#include "AbstractPage.h" + +class GameCFGWidget; + +class PageSinglePlayer : public AbstractPage +{ + Q_OBJECT + +public: + PageSinglePlayer(QWidget* parent = 0); + + QPushButton *BtnSimpleGamePage; + QPushButton *BtnTrainPage; + QPushButton *BtnCampaignPage; + QPushButton *BtnMultiplayer; + QPushButton *BtnLoad; + QPushButton *BtnDemos; + GameCFGWidget *gameCFG; + +private: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagetraining.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagetraining.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,234 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include + +#include +#include +#include + +#include "pagetraining.h" +#include "hwconsts.h" + +QLayout * PageTraining::bodyLayoutDefinition() +{ + QGridLayout * pageLayout = new QGridLayout(); + +// left column + + // declare start button, caption and description + btnPreview = formattedButton(":/res/Trainings.png", true); + btnPreview->setToolTip(QPushButton::tr("Go!")); + + // make both rows equal height + pageLayout->setRowStretch(0, 1); + pageLayout->setRowStretch(1, 1); + + // add start button, caption and description to 3 different rows + pageLayout->addWidget(btnPreview, 0, 0); + + // center preview + pageLayout->setAlignment(btnPreview, Qt::AlignRight | Qt::AlignVCenter); + + +// right column + + // info area (caption on top, description below) + QVBoxLayout * infoLayout = new QVBoxLayout(); + + lblCaption = new QLabel(); + lblCaption->setMinimumWidth(360); + lblCaption->setAlignment(Qt::AlignHCenter | Qt::AlignBottom); + lblCaption->setWordWrap(true); + lblDescription = new QLabel(); + lblDescription->setMinimumWidth(360); + lblDescription->setAlignment(Qt::AlignHCenter | Qt::AlignTop); + lblDescription->setWordWrap(true); + + infoLayout->addWidget(lblCaption); + infoLayout->addWidget(lblDescription); + + pageLayout->addLayout(infoLayout, 0, 1); + pageLayout->setAlignment(infoLayout, Qt::AlignLeft); + + + // mission list + lstMissions = new QListWidget(this); + pageLayout->addWidget(lstMissions, 1, 0, 1, 2); // span 2 columns + + // let's not make the list use more space than needed + lstMissions->setFixedWidth(360); + pageLayout->setAlignment(lstMissions, Qt::AlignHCenter); + + return pageLayout; +} + +QLayout * PageTraining::footerLayoutDefinition() +{ + QBoxLayout * bottomLayout = new QVBoxLayout(); + + btnStart = formattedButton(QPushButton::tr("Go!")); + btnStart->setFixedWidth(140); + + bottomLayout->addWidget(btnStart); + + bottomLayout->setAlignment(btnStart, Qt::AlignRight | Qt::AlignVCenter); + + return bottomLayout; +} + + +void PageTraining::connectSignals() +{ + connect(lstMissions, SIGNAL(currentItemChanged(QListWidgetItem*, QListWidgetItem*)), this, SLOT(updateInfo())); + connect(lstMissions, SIGNAL(clicked()), this, SLOT(updateInfo())); + connect(lstMissions, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(startSelected())); + connect(btnPreview, SIGNAL(clicked()), this, SLOT(startSelected())); + connect(btnStart, SIGNAL(clicked()), this, SLOT(startSelected())); +} + + +PageTraining::PageTraining(QWidget* parent) : AbstractPage(parent) +{ + initPage(); + + // get locale + QSettings settings(cfgdir->absolutePath() + "/hedgewars.ini", + QSettings::IniFormat); + + QString loc = settings.value("misc/locale", "").toString(); + if (loc.isEmpty()) + loc = QLocale::system().name(); + + QString infoFile = + datadir->absolutePath() + "/Locale/missions_" + loc + ".txt"; + + // if file is non-existant try with language only + if (!QFile::exists(infoFile)) + infoFile = datadir->absolutePath() + "/Locale/missions_" + + loc.replace(QRegExp("_.*$"),"") + ".txt"; + + // fallback if file for current locale is non-existant + if (!QFile::exists(infoFile)) + infoFile = datadir->absolutePath() + "/Locale/missions_en.txt"; + + // preload mission info for current locale + m_info = new QSettings(infoFile, QSettings::IniFormat, this); + +// TODO -> this should be done in a tool "DataDir" class + QDir tmpdir; + tmpdir.cd(cfgdir->absolutePath()); + tmpdir.cd("Data/Missions/Training"); + QStringList missionList = scriptList(tmpdir); + missionList.sort(); + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Missions/Training"); + QStringList defaultList = scriptList(tmpdir); + defaultList.sort(); + + // add non-duplicate default scripts to the list + foreach (const QString & mission, defaultList) + { + if (!missionList.contains(mission)) + missionList.append(mission); + } + + // add default scripts that have names different from detected user scripts + foreach (const QString & mission, missionList) + { + QListWidgetItem * item = new QListWidgetItem(mission); + + // fallback name: replace underscores in mission name with spaces + QString name = item->text().replace("_", " "); + + // see if we can get a prettier/translated name + name = m_info->value(mission + ".name", name).toString(); + + item->setText(name); + + // store original name in data + item->setData(Qt::UserRole, mission); + + lstMissions->addItem(item); + } + + updateInfo(); + + // pre-select first mission + if (lstMissions->count() > 0) + lstMissions->setCurrentRow(0); +} + +QStringList PageTraining::scriptList(const QDir & scriptDir) const +{ + QDir dir = scriptDir; + dir.setFilter(QDir::Files); + return dir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1"); +} + + +void PageTraining::startSelected() +{ + QListWidgetItem * curItem = lstMissions->currentItem(); + + if (curItem != NULL) + emit startMission(curItem->data(Qt::UserRole).toString()); +} + + +void PageTraining::updateInfo() +{ + if (lstMissions->currentItem()) + { + // TODO also use .pngs in userdata folder + QString thumbFile = datadir->absolutePath() + + "/Graphics/Missions/Training/" + + lstMissions->currentItem()->data(Qt::UserRole).toString() + + "@2x.png"; + + if (QFile::exists(thumbFile)) + btnPreview->setIcon(QIcon(thumbFile)); + else + btnPreview->setIcon(QIcon(":/res/Trainings.png")); + + QString realName = lstMissions->currentItem()->data( + Qt::UserRole).toString(); + + QString caption = m_info->value(realName + ".name", + lstMissions->currentItem()->text()).toString(); + + QString description = m_info->value(realName + ".desc", + tr("No description available")).toString(); + + lblCaption->setText("

" + caption +"

"); + lblDescription->setText(description); + } + else + { + btnPreview->setIcon(QIcon(":/res/Trainings.png")); + lblCaption->setText(tr("Select a mission!")); + // TODO better text and tr() + lblDescription->setText(""); + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/page/pagetraining.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/page/pagetraining.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,62 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef PAGE_TRAINING_H +#define PAGE_TRAINING_H + +#include + +#include "AbstractPage.h" + +class PageTraining : public AbstractPage +{ + Q_OBJECT + +public: + PageTraining(QWidget* parent = 0); + + +signals: + void startMission(const QString & scriptName); + + +protected: + QLayout * bodyLayoutDefinition(); + QLayout * footerLayoutDefinition(); + void connectSignals(); + + +private: + QPushButton * btnPreview; + QPushButton * btnStart; + QLabel * lblCaption; + QLabel * lblDescription; + QListWidget * lstMissions; + QSettings * m_info; + + QStringList scriptList(const QDir & scriptDir) const; + + +private slots: + void startSelected(); + void updateInfo(); + +}; + +#endif + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/qaspectratiolayout.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/qaspectratiolayout.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,206 @@ +/* + * Copyright (c) 2009 Nokia Corporation. + */ + +#include "qaspectratiolayout.h" + +QAspectRatioLayout::QAspectRatioLayout(QWidget* parent, int spacing) : QLayout(parent) { + init(spacing); +} + +QAspectRatioLayout::QAspectRatioLayout(int spacing) { + init(spacing); +} + +QAspectRatioLayout::~QAspectRatioLayout() { + delete item; + delete lastReceivedRect; + delete _geometry; +} + +void QAspectRatioLayout::init(int spacing) { + item = 0; + lastReceivedRect = new QRect(0, 0, 0, 0); + _geometry = new QRect(0, 0, 0, 0); + setSpacing(spacing); +} + + +/* Adds item if place isn't already taken. */ +void QAspectRatioLayout::add(QLayoutItem* item) { + if(!hasItem()) { + replaceItem(item); + } +} + +/* Adds item if place isn't already taken. */ +void QAspectRatioLayout::addItem(QLayoutItem* item) { + if(!hasItem()) { + replaceItem(item); + } +} + +/* Adds widget if place isn't already taken. */ +void QAspectRatioLayout::addWidget(QWidget* widget) { + if(!hasItem()) { + replaceItem(new QWidgetItem(widget)); + } +} + +/* Returns the item pointer and dereferences it here. */ +QLayoutItem* QAspectRatioLayout::take() { + QLayoutItem* item = 0; + if(this->hasItem()) { + item = this->item; + this->item = 0; + } + return item; +} + +/* Returns the item pointer and dereferences it here. */ +QLayoutItem* QAspectRatioLayout::takeAt(int index) { + if(index != 0) { + return 0; + } + return this->take(); +} + +/* Returns the item pointer. */ +QLayoutItem* QAspectRatioLayout::itemAt(int index) const { + if(index != 0) { + return 0; + } + if(hasItem()) { + return this->item; + } + return 0; +} + +/* Checks if we have an item. */ +bool QAspectRatioLayout::hasItem() const { + return this->item != 0; +} + +/* Returns the count of items which can be either 0 or 1. */ +int QAspectRatioLayout::count() const { + int returnValue = 0; + if(hasItem()) { + returnValue = 1; + } + return returnValue; +} + +/* Replaces the item with the new and returns the old. */ +QLayoutItem* QAspectRatioLayout::replaceItem(QLayoutItem* item) { + QLayoutItem* old = 0; + if(this->hasItem()) { + old = this->item; + } + this->item = item; + setGeometry(*this->_geometry); + return old; +} + +/* Tells which way layout expands. */ +Qt::Orientations QAspectRatioLayout::expandingDirections() const { + return Qt::Horizontal | Qt::Vertical; +} + +/* Tells which size is preferred. */ +QSize QAspectRatioLayout::sizeHint() const { + return this->item->minimumSize(); +} + +/* Tells minimum size. */ +QSize QAspectRatioLayout::minimumSize() const { + return this->item->minimumSize(); +} + +/* + * Tells if heightForWidth calculations is handled. + * It isn't since width isn't enough to calculate + * proper size. + */ +bool QAspectRatioLayout::hasHeightForWidth() const { + return false; +} + +/* Replaces lastReceivedRect. */ +void QAspectRatioLayout::setLastReceivedRect(const QRect& rect) { + QRect* oldRect = this->lastReceivedRect; + this->lastReceivedRect = new QRect(rect.topLeft(), rect.size()); + delete oldRect; +} + +/* Returns geometry */ +QRect QAspectRatioLayout::geometry() { + return QRect(*this->_geometry); +} + +/* Sets geometry to given size. */ +void QAspectRatioLayout::setGeometry(const QRect& rect) { + /* + * We check if the item is set and + * if size is the same previously received. + * If either is false nothing is done. + */ + if(!this->hasItem() || + areRectsEqual(*this->lastReceivedRect, rect)) { + return; + } + /* Replace the last received rectangle. */ + setLastReceivedRect(rect); + /* Calculate proper size for the item relative to the received size. */ + QSize properSize = calculateProperSize(rect.size()); + /* Calculate center location in the rect and with item size. */ + QPoint properLocation = calculateCenterLocation(rect.size(), properSize); + /* Set items geometry */ + this->item->setGeometry(QRect(properLocation, properSize)); + QRect* oldRect = this->_geometry; + /* Cache the calculated geometry. */ + this->_geometry = new QRect(properLocation, properSize); + delete oldRect; + /* Super classes setGeometry */ + QLayout::setGeometry(*this->_geometry); +} + +/* Takes the shortest side and creates QSize + * with the shortest side as width and height. */ +QSize QAspectRatioLayout::calculateProperSize(QSize from) const { + QSize properSize; + if(from.height() * 2 < from.width()) { + properSize.setHeight(from.height() - this->margin()); + properSize.setWidth(from.height() * 2 - this->margin()); + } + else { + properSize.setWidth(from.width() - this->margin()); + properSize.setHeight(from.width() / 2 - this->margin()); + } + return properSize; +} + +/* Calculates center location from the given height and width for item size. */ +QPoint QAspectRatioLayout::calculateCenterLocation(QSize from, + QSize itemSize) const { + QPoint centerLocation; + if((from.width() - itemSize.width()) > 0) { + centerLocation.setX((from.width() - itemSize.width())/2); + } + if((from.height() - itemSize.height()) > 0) { + centerLocation.setY((from.height() - itemSize.height())/2); + } + return centerLocation; +} + +/* Compares if two QRects are equal. */ +bool QAspectRatioLayout::areRectsEqual(const QRect& a, + const QRect& b) const { + bool result = false; + if(a.x() == b.x() && + a.y() == b.y() && + a.height() == b.height() && + a.width() == b.width()) { + result = true; + } + return result; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/qaspectratiolayout.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/qaspectratiolayout.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,87 @@ +/* + * Copyright (c) 2009 Nokia Corporation. + */ + +#ifndef QASPECTRATIOLAYOUT_H_ +#define QASPECTRATIOLAYOUT_H_ + +#include +#include +#include +#include +#include + + +class QAspectRatioLayout : public QLayout +{ + Q_OBJECT + +public: + QAspectRatioLayout(QWidget* parent, int spacing =-1); + QAspectRatioLayout(int spacing = -1); + ~QAspectRatioLayout(); + + /* Convenience method */ + virtual void add(QLayoutItem* item); + +/* http://doc.trolltech.com/qlayout.html#addItem */ + virtual void addItem(QLayoutItem* item); + /* http://doc.trolltech.com/qlayout.html#addWidget */ + virtual void addWidget(QWidget* widget); + /* http://doc.trolltech.com/qlayout.html#takeAt */ + virtual QLayoutItem* takeAt(int index); + /* http://doc.trolltech.com/qlayout.html#itemAt */ + virtual QLayoutItem* itemAt(int index) const; + /* http://doc.trolltech.com/qlayout.html#count */ + virtual int count() const; + + /* + * These are ours since we do have only one item. + */ + virtual QLayoutItem* replaceItem(QLayoutItem* item); + virtual QLayoutItem* take(); + virtual bool hasItem() const; + +/* http://doc.trolltech.com/qlayout.html#expandingDirections */ + virtual Qt::Orientations expandingDirections() const; + + /* + * This method contains most of the juice of this article. + * http://doc.trolltech.com/qlayoutitem.html#setGeometry + */ + virtual void setGeometry(const QRect& rect); + /* http://doc.trolltech.com/qlayoutitem.html#geometry */ + virtual QRect geometry(); + + /* http://doc.trolltech.com/qlayoutitem.html#sizeHint */ + virtual QSize sizeHint() const; + /* http://doc.trolltech.com/qlayout.html#minimumSize */ + virtual QSize minimumSize() const; + /* http://doc.trolltech.com/qlayoutitem.html#hasHeightForWidth */ + virtual bool hasHeightForWidth() const; + +private: + /* Saves the last received rect. */ + void setLastReceivedRect(const QRect& rect); + /* Used to initialize the object. */ + void init(int spacing); + /* Calculates the maximum size for the item from the assigned size. */ + QSize calculateProperSize(QSize from) const; + /* Calculates the center location from the assigned size and + * the items size. */ + QPoint calculateCenterLocation(QSize from, QSize itemSize) const; + /* Check if two QRects are equal */ + bool areRectsEqual(const QRect& a, const QRect& b) const; + /* Contains item reference */ + QLayoutItem* item; + /* + * Used for caching so we won't do calculations every time + * setGeometry is called. + */ + QRect* lastReceivedRect; + /* Contains geometry */ + QRect* _geometry; + +}; + +#endif /* QASPECTRATIOLAYOUT_H_ */ diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/FreqSpinBox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/FreqSpinBox.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,33 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "FreqSpinBox.h" + +/** + * Returns it's value as localized frequency. + * 'Never', 'Every Turn', 'Every 2 Turns', etc. + * @param value integer value to be representing as string + * @return the turn frequence-like string representation + */ +QString FreqSpinBox::textFromValue(int value) const +{ + if (value == 0) + return tr("Never"); + else + return tr("Every %1 turn", "", value).arg(value); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/FreqSpinBox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/FreqSpinBox.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,44 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef FREQSPINBOX_H +#define FREQSPINBOX_H + + +#include +#include + +/** + * A SpinBox that returns it's value as localized turn frequency. + * 'Never', 'Every Turn', 'Every 2 Turns', etc. + * @author unc0rr + * @since 0.9.12 + */ +class FreqSpinBox : public QSpinBox +{ + Q_OBJECT + +public: + FreqSpinBox(QWidget* parent) : QSpinBox(parent) {}; + +protected: + QString textFromValue(int value) const; +}; + + +#endif // FREQSPINBOX_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/SquareLabel.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/SquareLabel.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,50 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include "SquareLabel.h" +#include "hwform.h" + +SquareLabel::SquareLabel(QWidget * parent) : + QWidget(parent) +{ + if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true); +} + +void SquareLabel::paintEvent(QPaintEvent * event) +{ + Q_UNUSED(event); + + QPainter painter(this); + int pixsize; + if (width() > height()) { + pixsize = height(); + painter.translate((width() - pixsize) / 2, 0); + } else { + pixsize = width(); + painter.translate(0, (height() - pixsize) / 2); + } + painter.drawPixmap(0, 0, pixsize, pixsize, pixmap.scaled(pixsize, pixsize, Qt::KeepAspectRatio)); +} + +void SquareLabel::setPixmap(const QPixmap & pixmap) +{ + this->pixmap = pixmap; + repaint(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/SquareLabel.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/SquareLabel.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,41 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _SQUARELABEL_H +#define _SQUARELABEL_H + +#include +#include + +class SquareLabel : public QWidget +{ + Q_OBJECT + +public: + SquareLabel(QWidget * parent = 0); + + void setPixmap(const QPixmap & pixmap); +protected: + virtual void paintEvent(QPaintEvent * event); + +private: + QPixmap pixmap; + +}; + +#endif // _SQUARELABEL_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/about.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/about.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,146 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include "about.h" +#include "hwconsts.h" + +About::About(QWidget * parent) : + QWidget(parent) +{ + QGridLayout *mainLayout = new QGridLayout(this); + + QLabel *imageLabel = new QLabel; + QImage image(":/res/Hedgehog.png"); + imageLabel->setPixmap(QPixmap::fromImage(image)); + imageLabel->setScaledContents(true); + imageLabel->setMinimumWidth(2.8); + imageLabel->setMaximumWidth(280); + imageLabel->setMinimumHeight(30); + imageLabel->setMaximumHeight(300); + + mainLayout->addWidget(imageLabel, 0, 0, 2, 1); + + QLabel *lbl1 = new QLabel(this); + lbl1->setOpenExternalLinks(true); + lbl1->setText( + "" + "

Hedgewars

" + "

" + QLabel::tr("Version") + " " + *cVersionString + "

" + "

http://www.hedgewars.org/


" + + QLabel::tr("This program is distributed under the GNU General Public License v2") + + "
" + ); + lbl1->setWordWrap(true); + mainLayout->addWidget(lbl1, 0, 1); + + QTextBrowser *lbl2 = new QTextBrowser(this); + + lbl2->setOpenExternalLinks(true); + lbl2->setText( + "" + + QString("

") + + QLabel::tr("Developers:") + + "

" + "Engine, frontend, net server: Andrey Korotaev <unC0Rr@gmail.com>
" + "Many frontend improvements: Igor Ulyanov <disinbox@gmail.com>
" + "Many engine and frontend improvements: Derek Pomery <nemo@m8y.org>
" + "Drill rocket, Ballgun, RC Plane weapons: Martin Boze <afffect@gmail.com>
" + "Mine number and time game settings: David A. Cuadrado <krawek@gmail.com>
" + "Frontend improvements: Martin Minarik <ttsmj@pokec.sk>
" + "Frontend improvements: Kristian Lehmann <email@thexception.net>
" + "Mac OS X/iPhone port, OpenGL-ES conversion: Vittorio Giovara <vittorio.giovara@gmail.com>
" + "Many engine and frontend improvements (and bugs): Richard Karolyi <sheepluva@" "ercatec.net>
" + "Gamepad and Lua integration: Mario Liebisch <mario.liebisch@gmail.com>
" + "Many engine improvements and graphics: Carlos Vives <mail@carlosvives.es>
" + "Maze maps: Henning Kühn <prg@cooco.de>
" + "Engine and frontend improvements: Henrik Rostedt <henrik.rostedt@gmail.com>
" + "Lua game modes and missions: John Lambert <redgrinner@gmail.com>
" + "Frontend improvements: Mayur Pawashe <zorgiepoo@gmail.com>
" + "Android port: Richard Deurwaarder <xeli@xelification.com>
" + "

" + + + QLabel::tr("Art:") + "

" + + QString::fromUtf8( + "

John Dum <fizzy@gmail.com>" + "
" + "Joshua Frese <joshfrese@gmail.com>" + "
" + "Stanko Tadić <stanko@mfhinc.net>" + "
" + "Julien Koesten <julienkoesten@aol.com>" + "
" + "Joshua O'Sullivan <coheedftw@hotmail.co.uk>" + "
" + "Nils Lück <nils.luck.design@gmail.com>" + "
" + "Guillaume Englert <genglert@hybird.org>" + "
" + "Hats: Trey Perry <tx.perry.j@gmail.com>" + "

") + + QLabel::tr("Sounds:") + "

" + "Hedgehogs voice: Stephen Alexander <ArmagonNo1@gmail.com>" + "
" + "John Dum <fizzy@gmail.com>" + "
" + "Jonatan Nilsson <jonatanfan@gmail.com>" + "
" + "Daniel Martin <elhombresinremedio@gmail.com>" + "

" + + + QLabel::tr("Translations:") + "

" + + QString::fromUtf8( + "Brazilian Portuguese: Romulo Fernandes Machado <abra185@gmail.com>
" + "Bulgarian: Svetoslav Stefanov
" + "Czech: Petr Řezáček <rezacek@gmail.com>
" + "Chinese: Jie Luo <lililjlj@gmail.com>
" + "English: Andrey Korotaev <unC0Rr@gmail.com>
" + "Finnish: Nina Kuisma <ninnnu@gmail.com>
" + "French: Antoine Turmel <geekshadow@gmail.com>
" + "German: Peter Hüwe <PeterHuewe@gmx.de>, Mario Liebisch <mario.liebisch@gmail.com>, Richard Karolyi <sheepluva@" "ercatec.net>
" + "Greek: <talos_kriti@yahoo.gr>
" + "Italian: Luca Bonora <bonora.luca@gmail.com>, Marco Bresciani
" + "Japanese: ADAM Etienne <etienne.adam@gmail.com>
" + "Korean: Anthony Bellew <webmaster@anthonybellew.com>
" + "Lithuanian: Lukas Urbonas <lukasu08@gmail.com>
" + "Polish: Maciej Mroziński <mynick2@o2.pl>, Wojciech Latkowski <magik17l@gmail.com>, Piotr Mitana, Maciej Górny
" + "Portuguese: Fábio Canário <inufabie@gmail.com>
" + "Russian: Andrey Korotaev <unC0Rr@gmail.com>
" + "Slovak: Jose Riha
" + "Spanish: Carlos Vives <mail@carlosvives.es>
" + "Swedish: Niklas Grahn <raewolusjoon@yaoo.com>, Henrik Rostedt <henrik.rostedt@gmail.com>
" + "Ukrainian: Eugene V. Lyubimkin <jackyf.devel@gmail.com>, Igor Paliychuk <mansonigor@gmail.com>, Eugene Sakara <eresid@gmail.com>" + "

") + + + QLabel::tr("Special thanks:") + "

" + "Aleksey Andreev <blaknayabr@gmail.com>
" + "Aleksander Rudalev <alexv@pomorsu.ru>
" + "Natasha Korotaeva <layout@pisem.net>
" + "Adam Higerd (aka ahigerd at FreeNode)" + "

" + ); + mainLayout->addWidget(lbl2, 1, 1); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/about.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/about.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,33 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _ABOUT_H +#define _ABOUT_H + +#include + + +class About : public QWidget +{ + Q_OBJECT + +public: + About(QWidget * parent = 0); +}; + +#endif // _ABOUT_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/bgwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/bgwidget.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,143 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2009 Kristian Lehmann + * Copyright (c) 2009-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "bgwidget.h" + +SpritePosition::SpritePosition(QWidget * parent, int sh) +{ + wParent = parent; + iSpriteHeight = sh; + reset(); +} + +SpritePosition::~SpritePosition() +{ +} + +void SpritePosition::move() +{ + fX += fXMov; + fY += fYMov; + iAngle += 4; + if (iAngle >= 360) iAngle = 0; + if (fY > wParent->height()) reset(); +} + +void SpritePosition::reset() +{ + fY = -1 * iSpriteHeight; + fX = (qrand() % ((int)(wParent->width() * 1.5))) - wParent->width()/2; + fYMov = ((qrand() % 400)+300) / 100.0f; + fXMov = fYMov * 0.2f+((qrand()%100)/100.0f * 0.6f); //so between 0.2 and 0.6, or 0.5 +/- 0.3 + iAngle = qrand() % 360; +} + +QPoint SpritePosition::pos() +{ + return QPoint((int)fX,(int)fY); +} + +int SpritePosition::getAngle() +{ + return iAngle; +} + +void SpritePosition::init() +{ + fY = qrand() % (wParent->height() + 1); + fX = qrand() % (wParent->width() + 1); +} + +BGWidget::BGWidget(QWidget * parent) : QWidget(parent) +{ + setAttribute(Qt::WA_NoSystemBackground, true); + sprite.load(":/res/Star.png"); + + setAutoFillBackground(false); + + for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i] = new SpritePosition(this, sprite.height()); + + for (int i = 0; i < 360; i++) + { + rotatedSprites[i] = new QImage(sprite.width(), sprite.height(), QImage::Format_ARGB32); + rotatedSprites[i]->fill(0); + + QPoint translate(sprite.width()/2, sprite.height()/2); + + QPainter p; + p.begin(rotatedSprites[i]); + // p.setRenderHint(QPainter::Antialiasing); + p.setRenderHint(QPainter::SmoothPixmapTransform); + p.translate(translate.x(), translate.y()); + p.rotate(i); + p.translate(-1*translate.x(), -1*translate.y()); + p.drawImage(0, 0, sprite); + } + + timerAnimation = new QTimer(); + connect(timerAnimation, SIGNAL(timeout()), this, SLOT(animate())); + timerAnimation->setInterval(ANIMATION_INTERVAL); +} + +BGWidget::~BGWidget() +{ + for (int i = 0; i < SPRITE_MAX; i++) delete spritePositions[i]; + for (int i = 0; i < 360; i++) delete rotatedSprites[i]; + delete timerAnimation; +} + +void BGWidget::paintEvent(QPaintEvent *event) +{ + Q_UNUSED(event); + + QPainter p; + p.begin(this); + //p.setRenderHint(QPainter::Antialiasing); + for (int i = 0; i < SPRITE_MAX; i++) + { + QPoint point = spritePositions[i]->pos(); + p.drawImage(point.x(), point.y(), *rotatedSprites[spritePositions[i]->getAngle()]); + } + p.end(); +} + +void BGWidget::animate() +{ + for (int i = 0; i < SPRITE_MAX; i++) + { + // bottom edge of star *seems* clipped, but in fact, if I switch to just plain old repaint()/update() it is still clipped - artifact of transform? As for 5, is arbitrary number. 4 was noticeably clipping, 5 seemed same as update() - I assume extra room is due to rotation and value really should be calculated proportional to width/height + update(spritePositions[i]->pos().x(),spritePositions[i]->pos().y(), sprite.width()+5, sprite.height()+5); + spritePositions[i]->move(); + } +} + +void BGWidget::startAnimation() +{ + timerAnimation->start(); +} + +void BGWidget::stopAnimation() +{ + timerAnimation->stop(); +} + +void BGWidget::init() +{ + for (int i = 0; i < SPRITE_MAX; i++) spritePositions[i]->init(); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/bgwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/bgwidget.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,76 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2009 Kristian Lehmann + * Copyright (c) 2009-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef BGWIDGET_H +#define BGWIDGET_H + +#include +//#include +#include +#include +#include +#include +#include + +#define SPRITE_MAX 12 + +#define ANIMATION_INTERVAL 40 + +class SpritePosition +{ +public: + SpritePosition(QWidget * parent, int sh); + ~SpritePosition(); +private: + float fX; + float fY; + float fXMov; + float fYMov; + int iAngle; + QWidget * wParent; + int iSpriteHeight; +public: + void move(); + void reset(); + QPoint pos(); + int getAngle(); + void init(); +}; + +class BGWidget : public QWidget +{ + Q_OBJECT +public: + BGWidget(QWidget * parent); + ~BGWidget(); + void startAnimation(); + void stopAnimation(); + void init(); +private: + QImage sprite; + QTimer * timerAnimation; + SpritePosition * spritePositions[SPRITE_MAX]; + QImage * rotatedSprites[360]; +protected: + void paintEvent(QPaintEvent * event); +private slots: + void animate(); +}; + +#endif // BGWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/chatwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/chatwidget.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,584 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "hwconsts.h" +#include "SDLs.h" +#include "gameuiconfig.h" +#include "chatwidget.h" + +ListWidgetNickItem::ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored) : QListWidgetItem(nick) +{ + this->aFriend = isFriend; + this->isIgnored = isIgnored; +} + +void ListWidgetNickItem::setFriend(bool isFriend) +{ + this->aFriend = isFriend; +} + +void ListWidgetNickItem::setIgnored(bool isIgnored) +{ + this->isIgnored = isIgnored; +} + +bool ListWidgetNickItem::isFriend() +{ + return aFriend; +} + +bool ListWidgetNickItem::ignored() +{ + return isIgnored; +} + +bool ListWidgetNickItem::operator< (const QListWidgetItem & other) const +{ + // case in-sensitive comparison of the associated strings + // chars that are no letters are sorted at the end of the list + + ListWidgetNickItem otherNick = const_cast(dynamic_cast(other)); + + // ignored always down + if (isIgnored != otherNick.ignored()) + return !isIgnored; + + // friends always up + if (aFriend != otherNick.isFriend()) + return aFriend; + + QString txt1 = text().toLower(); + QString txt2 = other.text().toLower(); + + bool firstIsShorter = (txt1.size() < txt2.size()); + int len = firstIsShorter?txt1.size():txt2.size(); + + for (int i = 0; i < len; i++) + { + if (txt1[i] == txt2[i]) + continue; + if (txt1[i].isLetter() != txt2[i].isLetter()) + return txt1[i].isLetter(); + return (txt1[i] < txt2[i]); + } + + return firstIsShorter; +} + +const char* HWChatWidget::STYLE = +"\ +a { color:#c8c8ff; }\ +.nick { text-decoration: none; }\ +.UserChat .nick { color:#ffec20; }\ +.FriendChat { color: #08e008; }\ +.FriendChat .nick { color: #20ff20; }\ +.UserJoin { color: #c0c0c0; }\ +.UserJoin .nick { color: #d0d0d0; }\ +.FriendJoin { color: #c0e0c0; }\ +.FriendJoin .nick { color: #d0f0d0; }\ +.UserAction { color: #ff80ff; }\ +.UserAction .nick { color: #ffa0ff; }\ +.FriendAction { color: #ff00ff; }\ +.FriendAction .nick { color: #ff30ff; }\ +.Error { color: #ff0000 }\ +.Warning { color: #ff8000 }\ +.Notice { color: #fefefe }\ +"; + +HWChatWidget::HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify) : + QWidget(parent), + mainLayout(this) +{ + this->gameSettings = gameSettings; + this->sdli = sdli; + this->notify = notify; + if(notify && gameSettings->value("frontend/sound", true).toBool()) { + QFile tmpfile; + sdli->SDLMusicInit(); + for(int i=0;i<4;i++) { + tmpfile.setFileName(cfgdir->absolutePath() + "/Data/Sounds/voices/Classic/Hello.ogg"); + if (tmpfile.exists()) sound[i] = Mix_LoadWAV(QFileInfo(tmpfile).absoluteFilePath().toLocal8Bit().constData()); + else sound[i] = Mix_LoadWAV(QString(datadir->absolutePath() + + "/Sounds/voices/Classic/Hello.ogg").toLocal8Bit().constData()); + } + } + + mainLayout.setSpacing(1); + mainLayout.setMargin(1); + mainLayout.setSizeConstraint(QLayout::SetMinimumSize); + mainLayout.setColumnStretch(0, 76); + mainLayout.setColumnStretch(1, 24); + + chatEditLine = new QLineEdit(this); + chatEditLine->setMaxLength(300); + connect(chatEditLine, SIGNAL(returnPressed()), this, SLOT(returnPressed())); + + mainLayout.addWidget(chatEditLine, 2, 0); + + chatText = new QTextBrowser(this); + chatText->document()->setDefaultStyleSheet(STYLE); + chatText->setMinimumHeight(20); + chatText->setMinimumWidth(10); + chatText->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + chatText->setOpenLinks(false); + connect(chatText, SIGNAL(anchorClicked(const QUrl&)), + this, SLOT(linkClicked(const QUrl&))); + mainLayout.addWidget(chatText, 0, 0, 2, 1); + + chatNicks = new QListWidget(this); + chatNicks->setMinimumHeight(10); + chatNicks->setMinimumWidth(10); + chatNicks->setSortingEnabled(true); + chatNicks->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + chatNicks->setContextMenuPolicy(Qt::ActionsContextMenu); + connect(chatNicks, SIGNAL(itemDoubleClicked(QListWidgetItem *)), + this, SLOT(chatNickDoubleClicked(QListWidgetItem *))); + connect(chatNicks, SIGNAL(currentRowChanged(int)), + this, SLOT(chatNickSelected(int))); + + mainLayout.addWidget(chatNicks, 0, 1, 3, 1); + + acInfo = new QAction(QAction::tr("Info"), chatNicks); + acInfo->setIcon(QIcon(":/res/info.png")); + connect(acInfo, SIGNAL(triggered(bool)), this, SLOT(onInfo())); + acKick = new QAction(QAction::tr("Kick"), chatNicks); + acKick->setIcon(QIcon(":/res/kick.png")); + connect(acKick, SIGNAL(triggered(bool)), this, SLOT(onKick())); + acBan = new QAction(QAction::tr("Ban"), chatNicks); + acBan->setIcon(QIcon(":/res/ban.png")); + connect(acBan, SIGNAL(triggered(bool)), this, SLOT(onBan())); + acFollow = new QAction(QAction::tr("Follow"), chatNicks); + acFollow->setIcon(QIcon(":/res/follow.png")); + connect(acFollow, SIGNAL(triggered(bool)), this, SLOT(onFollow())); + acIgnore = new QAction(QAction::tr("Ignore"), chatNicks); + acIgnore->setIcon(QIcon(":/res/ignore.png")); + connect(acIgnore, SIGNAL(triggered(bool)), this, SLOT(onIgnore())); + acFriend = new QAction(QAction::tr("Add friend"), chatNicks); + acFriend->setIcon(QIcon(":/res/addfriend.png")); + connect(acFriend, SIGNAL(triggered(bool)), this, SLOT(onFriend())); + + chatNicks->insertAction(0, acFriend); + chatNicks->insertAction(0, acInfo); + chatNicks->insertAction(0, acIgnore); + + showReady = false; + setShowFollow(true); +} + +void HWChatWidget::linkClicked(const QUrl & link) +{ + if (link.scheme() == "http") + QDesktopServices::openUrl(link); + if (link.scheme() == "hwnick") + { + // decode nick + const QString& nick = QString::fromUtf8(QByteArray::fromBase64(link.encodedQuery())); + QList items = chatNicks->findItems(nick, Qt::MatchExactly); + if (items.size() < 1) + return; + QMenu * popup = new QMenu(this); + // selecting an item will automatically scroll there, so let's save old position + QScrollBar * scrollBar = chatNicks->verticalScrollBar(); + int oldScrollPos = scrollBar->sliderPosition(); + // select the nick which we want to see the actions for + chatNicks->setCurrentItem(items[0], QItemSelectionModel::Clear); + // selecting an item will automatically scroll there, so let's save old position + scrollBar->setSliderPosition(oldScrollPos); + // load actions + popup->addActions(chatNicks->actions()); + // display menu popup at mouse cursor position + popup->popup(QCursor::pos()); + } +} + +void HWChatWidget::setShowFollow(bool enabled) +{ + if (enabled) { + if (!(chatNicks->actions().contains(acFollow))) + chatNicks->insertAction(acFriend, acFollow); + } + else { + if (chatNicks->actions().contains(acFollow)) + chatNicks->removeAction(acFollow); + } +} + +void HWChatWidget::loadList(QStringList & list, const QString & file) +{ + list.clear(); + QFile txt(cfgdir->absolutePath() + "/" + file); + if(!txt.open(QIODevice::ReadOnly)) + return; + QTextStream stream(&txt); + stream.setCodec("UTF-8"); + + while(!stream.atEnd()) + { + QString str = stream.readLine(); + if(str.startsWith(";") || str.length() == 0) + continue; + list << str.trimmed(); + } + //readd once we require newer Qt than 4.4 + //list.removeDuplicates(); + txt.close(); +} + +void HWChatWidget::saveList(QStringList & list, const QString & file) +{ + QFile txt(cfgdir->absolutePath() + "/" + file); + if(!txt.open(QIODevice::WriteOnly | QIODevice::Truncate)) + return; + QTextStream stream(&txt); + stream.setCodec("UTF-8"); + + stream << "; this list is used by Hedgewars - do not edit it unless you know what you're doing!" << endl; + for(int i = 0; i < list.size(); i++) + stream << list[i] << endl; + txt.close(); +} + +void HWChatWidget::updateNickItem(QListWidgetItem *nickItem) +{ + QString nick = nickItem->text(); + ListWidgetNickItem * item = dynamic_cast(nickItem); + + item->setFriend(friendsList.contains(nick, Qt::CaseInsensitive)); + item->setIgnored(ignoreList.contains(nick, Qt::CaseInsensitive)); + + if(item->ignored()) + { + item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_ignore_on.png" : ":/res/chat_ignore_off.png") : ":/res/chat_ignore.png")); + item->setForeground(Qt::gray); + } + else if(item->isFriend()) + { + item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_friend_on.png" : ":/res/chat_friend_off.png") : ":/res/chat_friend.png")); + item->setForeground(Qt::green); + } + else + { + item->setIcon(QIcon(showReady ? (item->data(Qt::UserRole).toBool() ? ":/res/chat_default_on.png" : ":/res/chat_default_off.png") : ":/res/chat_default.png")); + item->setForeground(QBrush(QColor(0xff, 0xcc, 0x00))); + } +} + +void HWChatWidget::updateNickItems() +{ + for(int i = 0; i < chatNicks->count(); i++) + updateNickItem(chatNicks->item(i)); + + chatNicks->sortItems(); +} + +void HWChatWidget::loadLists(const QString & nick) +{ + loadList(ignoreList, nick.toLower() + "_ignore.txt"); + loadList(friendsList, nick.toLower() + "_friends.txt"); + updateNickItems(); +} + +void HWChatWidget::saveLists(const QString & nick) +{ + saveList(ignoreList, nick.toLower() + "_ignore.txt"); + saveList(friendsList, nick.toLower() + "_friends.txt"); +} + +void HWChatWidget::returnPressed() +{ + QStringList lines = chatEditLine->text().split('\n'); + chatEditLine->clear(); + foreach (const QString &line, lines) + emit chatLine(line); +} + + +void HWChatWidget::onChatString(const QString& str) +{ + onChatString("", str); +} + +const QRegExp HWChatWidget::URLREGEXP = QRegExp("(http://)?(www\\.)?(hedgewars\\.org(/[^ ]*)?)"); + +void HWChatWidget::onChatString(const QString& nick, const QString& str) +{ + bool isFriend = false; + + if (!nick.isEmpty()) { + // don't show chat lines that are from ignored nicks + if (ignoreList.contains(nick, Qt::CaseInsensitive)) + return; + // friends will get special treatment, of course + isFriend = friendsList.contains(nick, Qt::CaseInsensitive); + } + + QString formattedStr = Qt::escape(str.mid(1)); + // make hedgewars.org urls actual links + formattedStr = formattedStr.replace(URLREGEXP, "\\3"); + + // "link" nick, but before that encode it in base64 to make sure it can't intefere with html/url syntax + // the nick is put as querystring as putting it as host would convert it to it's lower case variant + if(!nick.isEmpty()) + formattedStr.replace("|nick|",QString("%2").arg(QString(nick.toUtf8().toBase64())).arg(nick)); + + QString cssClass("UserChat"); + + // check first character for color code and set color properly + switch (str[0].toAscii()) { + case 3: + cssClass = (isFriend ? "FriendJoin" : "UserJoin"); + break; + case 2: + cssClass = (isFriend ? "FriendAction" : "UserAction"); + break; + default: + if (isFriend) + cssClass = "FriendChat"; + } + + addLine(cssClass,formattedStr); +} + +void HWChatWidget::addLine(const QString& cssClass, QString line) +{ + if (chatStrings.size() > 250) + chatStrings.removeFirst(); + + line = QString("%1").arg(line).arg(cssClass); + + chatStrings.append(line); + + chatText->setHtml(chatStrings.join("
")); + + chatText->moveCursor(QTextCursor::End); +} + +void HWChatWidget::onServerMessage(const QString& str) +{ + if (chatStrings.size() > 250) + chatStrings.removeFirst(); + + chatStrings.append("
" + str + "
"); + + chatText->setHtml(chatStrings.join("
")); + + chatText->moveCursor(QTextCursor::End); +} + +void HWChatWidget::nickAdded(const QString& nick, bool notifyNick) +{ + QListWidgetItem * item = new ListWidgetNickItem(nick, friendsList.contains(nick, Qt::CaseInsensitive), ignoreList.contains(nick, Qt::CaseInsensitive)); + updateNickItem(item); + chatNicks->addItem(item); + + emit nickCountUpdate(chatNicks->count()); + + if(notifyNick && notify && gameSettings->value("frontend/sound", true).toBool()) { + Mix_PlayChannel(-1, sound[rand()%4], 0); + } +} + +void HWChatWidget::nickRemoved(const QString& nick) +{ + foreach(QListWidgetItem * item, chatNicks->findItems(nick, Qt::MatchExactly)) + chatNicks->takeItem(chatNicks->row(item)); + + emit nickCountUpdate(chatNicks->count()); +} + +void HWChatWidget::clear() +{ + chatText->clear(); + chatStrings.clear(); + chatNicks->clear(); +} + +void HWChatWidget::onKick() +{ + QListWidgetItem * curritem = chatNicks->currentItem(); + if (curritem) + emit kick(curritem->text()); +} + +void HWChatWidget::onBan() +{ + QListWidgetItem * curritem = chatNicks->currentItem(); + if (curritem) + emit ban(curritem->text()); +} + +void HWChatWidget::onInfo() +{ + QListWidgetItem * curritem = chatNicks->currentItem(); + if (curritem) + emit info(curritem->text()); +} + +void HWChatWidget::onFollow() +{ + QListWidgetItem * curritem = chatNicks->currentItem(); + if (curritem) + emit follow(curritem->text()); +} + +void HWChatWidget::onIgnore() +{ + QListWidgetItem * curritem = chatNicks->currentItem(); + if(!curritem) + return; + + if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him + { + ignoreList.removeAll(curritem->text().toLower()); + onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your ignore list").arg('\x03').arg(curritem->text())); + } + else // not on list - add + { + // don't consider ignored people friends + if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) + emit onFriend(); + + // scroll down on first ignore added so that people see where that nick went to + if (ignoreList.isEmpty()) + chatNicks->scrollToBottom(); + + ignoreList << curritem->text().toLower(); + onChatString(HWChatWidget::tr("%1 *** %2 has been added to your ignore list").arg('\x03').arg(curritem->text())); + } + updateNickItem(curritem); // update icon/sort order/etc + chatNicks->sortItems(); + chatNickSelected(0); // update context menu +} + +void HWChatWidget::onFriend() +{ + QListWidgetItem * curritem = chatNicks->currentItem(); + if(!curritem) + return; + + if(friendsList.contains(curritem->text(), Qt::CaseInsensitive)) // already on list - remove him + { + friendsList.removeAll(curritem->text().toLower()); + onChatString(HWChatWidget::tr("%1 *** %2 has been removed from your friends list").arg('\x03').arg(curritem->text())); + } + else // not on list - add + { + // don't ignore the new friend + if(ignoreList.contains(curritem->text(), Qt::CaseInsensitive)) + emit onIgnore(); + + // scroll up on first friend added so that people see where that nick went to + if (friendsList.isEmpty()) + chatNicks->scrollToTop(); + + friendsList << curritem->text().toLower(); + onChatString(HWChatWidget::tr("%1 *** %2 has been added to your friends list").arg('\x03').arg(curritem->text())); + } + updateNickItem(curritem); // update icon/sort order/etc + chatNicks->sortItems(); + chatNickSelected(0); // update context menu +} + +void HWChatWidget::chatNickDoubleClicked(QListWidgetItem * item) +{ + Q_UNUSED(item); + + QList actions = chatNicks->actions(); + actions.first()->activate(QAction::Trigger); +} + +void HWChatWidget::chatNickSelected(int index) +{ + Q_UNUSED(index); + + QListWidgetItem* item = chatNicks->currentItem(); + if (!item) + return; + + // update context menu labels according to possible action + if(ignoreList.contains(item->text(), Qt::CaseInsensitive)) + { + acIgnore->setText(QAction::tr("Unignore")); + acIgnore->setIcon(QIcon(":/res/unignore.png")); + } + else + { + acIgnore->setText(QAction::tr("Ignore")); + acIgnore->setIcon(QIcon(":/res/ignore.png")); + } + + if(friendsList.contains(item->text(), Qt::CaseInsensitive)) + { + acFriend->setText(QAction::tr("Remove friend")); + acFriend->setIcon(QIcon(":/res/remfriend.png")); + } + else + { + acFriend->setText(QAction::tr("Add friend")); + acFriend->setIcon(QIcon(":/res/addfriend.png")); + } +} + +void HWChatWidget::setShowReady(bool s) +{ + showReady = s; +} + +void HWChatWidget::setReadyStatus(const QString & nick, bool isReady) +{ + QList items = chatNicks->findItems(nick, Qt::MatchExactly); + if (items.size() != 1) + { + qWarning("Bug: cannot find user in chat"); + return; + } + + items[0]->setData(Qt::UserRole, isReady); // bulb status + updateNickItem(items[0]); + + // ensure we're still showing the status bulbs + showReady = true; +} + +void HWChatWidget::adminAccess(bool b) +{ + chatNicks->removeAction(acKick); + chatNicks->removeAction(acBan); + + if(b) + { + chatNicks->insertAction(0, acKick); +// chatNicks->insertAction(0, acBan); + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/chatwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/chatwidget.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,124 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _CHAT_WIDGET_INCLUDED +#define _CHAT_WIDGET_INCLUDED + +#include +#include +#include +#include +#include + +#include "SDLs.h" + +class ListWidgetNickItem; +class QTextBrowser; +class QLineEdit; +class QListWidget; +class QSettings; +class SDLInteraction; + +// this class is for custom nick sorting +class ListWidgetNickItem : public QListWidgetItem +{ +public: + ListWidgetNickItem(const QString& nick, bool isFriend, bool isIgnored); + bool operator<(const QListWidgetItem & other) const; + void setFriend(bool isFriend); + void setIgnored(bool isIgnored); + bool isFriend(); + bool ignored(); + +private: + bool aFriend; + bool isIgnored; +}; + +class HWChatWidget : public QWidget +{ + Q_OBJECT + + public: + HWChatWidget(QWidget* parent, QSettings * gameSettings, SDLInteraction * sdli, bool notify); + void loadLists(const QString & nick); + void saveLists(const QString & nick); + void setShowReady(bool s); + void setShowFollow(bool enabled); + void addLine(const QString & cssClass, QString line); + static const char* STYLE; + QStringList ignoreList, friendsList; + +private: + void loadList(QStringList & list, const QString & file); + void saveList(QStringList & list, const QString & file); + void updateNickItem(QListWidgetItem *item); + void updateNickItems(); + static const QRegExp URLREGEXP; + + public slots: + void onChatString(const QString& str); + void onChatString(const QString& nick, const QString& str); + void onServerMessage(const QString& str); + void nickAdded(const QString& nick, bool notifyNick); + void nickRemoved(const QString& nick); + void clear(); + void setReadyStatus(const QString & nick, bool isReady); + void adminAccess(bool); + + signals: + void chatLine(const QString& str); + void kick(const QString & str); + void ban(const QString & str); + void info(const QString & str); + void follow(const QString &); + void nickCountUpdate(int cnt); + + private: + QGridLayout mainLayout; + QTextBrowser* chatText; + QStringList chatStrings; + QListWidget* chatNicks; + QLineEdit* chatEditLine; + QAction * acInfo; + QAction * acKick; + QAction * acBan; + QAction * acFollow; + QAction * acIgnore; + QAction * acFriend; + QSettings * gameSettings; + SDLInteraction * sdli; + Mix_Chunk *sound[4]; + bool notify; + bool showReady; + + private slots: + void returnPressed(); + void onBan(); + void onKick(); + void onInfo(); + void onFollow(); + void onIgnore(); + void onFriend(); + void chatNickDoubleClicked(QListWidgetItem * item); + void chatNickSelected(int index); + void linkClicked(const QUrl & link); +}; + +#endif // _CHAT_WIDGET_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/databrowser.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/databrowser.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,57 @@ +#include +#include +#include +#include +#include + +#include "databrowser.h" + +const QNetworkRequest::Attribute typeAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 1); +const QNetworkRequest::Attribute urlAttribute = (QNetworkRequest::Attribute)(QNetworkRequest::User + 2); + +DataBrowser::DataBrowser(QWidget *parent) : + QTextBrowser(parent) +{ + + manager = new QNetworkAccessManager(this); +} + +QVariant DataBrowser::loadResource(int type, const QUrl & name) +{ + if(type == QTextDocument::ImageResource || type == QTextDocument::StyleSheetResource) + { + if(resources.contains(name.toString())) + { + return resources.take(name.toString()); + } + else + if(!requestedResources.contains(name.toString())) + { + qDebug() << "Requesting resource" << name.toString(); + requestedResources.insert(name.toString()); + + QNetworkRequest newRequest(QUrl("http://www.hedgewars.org" + name.toString())); + newRequest.setAttribute(typeAttribute, type); + newRequest.setAttribute(urlAttribute, name); + + QNetworkReply *reply = manager->get(newRequest); + connect(reply, SIGNAL(finished()), this, SLOT(resourceDownloaded())); + } + } + + return QVariant(); +} + +void DataBrowser::resourceDownloaded() +{ + QNetworkReply * reply = qobject_cast(sender()); + + if(reply) + { + int type = reply->request().attribute(typeAttribute).toInt(); + QUrl url = reply->request().attribute(urlAttribute).toUrl(); + resources.insert(url.toString(), reply->readAll()); + document()->addResource(type, reply->request().url(), QVariant()); + update(); + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/databrowser.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/databrowser.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,33 @@ +#ifndef DATABROWSER_H +#define DATABROWSER_H + +#include +#include + +class QNetworkAccessManager; + +class DataBrowser : public QTextBrowser +{ + Q_OBJECT +public: + explicit DataBrowser(QWidget *parent = 0); + +signals: + +public slots: + +private: + QNetworkAccessManager *manager; + + // hash and set of QString instead of QUrl to support Qt versions + // older than 4.7 (those have no support for qHash(const QUrl &)) + QHash resources; + QSet requestedResources; + + QVariant loadResource(int type, const QUrl & name); + +private slots: + void resourceDownloaded(); +}; + +#endif // DATABROWSER_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/drawmapwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/drawmapwidget.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,106 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include + +#include "drawmapwidget.h" + +DrawMapWidget::DrawMapWidget(QWidget *parent) : + QWidget(parent), + ui(new Ui::DrawMapWidget) +{ + ui->setupUi(this); + + m_scene = 0; +} + +DrawMapWidget::~DrawMapWidget() +{ + delete ui; +} + +void DrawMapWidget::changeEvent(QEvent *e) +{ + QWidget::changeEvent(e); + switch (e->type()) { + case QEvent::LanguageChange: + ui->retranslateUi(this); + break; + default: + break; + } +} + +void DrawMapWidget::setScene(DrawMapScene * scene) +{ + ui->graphicsView->setScene(scene); + m_scene = scene; +} + +void DrawMapWidget::resizeEvent(QResizeEvent * event) +{ + Q_UNUSED(event); + + if(ui->graphicsView && ui->graphicsView->scene()) + ui->graphicsView->fitInView(ui->graphicsView->scene()->sceneRect(), Qt::KeepAspectRatio); +} + +void DrawMapWidget::showEvent(QShowEvent * event) +{ + Q_UNUSED(event); + + resizeEvent(0); +} + +void DrawMapWidget::undo() +{ + if(m_scene) m_scene->undo(); +} + +void DrawMapWidget::clear() +{ + if(m_scene) m_scene->clearMap(); +} + +void DrawMapWidget::save(const QString & fileName) +{ + if(m_scene) + { + QFile file(fileName); + + if(!file.open(QIODevice::WriteOnly)) + QMessageBox::warning(this, tr("File error"), tr("Cannot open file '%1' for writing").arg(fileName)); + else + file.write(qCompress(m_scene->encode()).toBase64()); + } +} + +void DrawMapWidget::load(const QString & fileName) +{ + if(m_scene) + { + QFile f(fileName); + + if(!f.open(QIODevice::ReadOnly)) + QMessageBox::warning(this, tr("File error"), tr("Cannot read file '%1'").arg(fileName)); + else + m_scene->decode(qUncompress(QByteArray::fromBase64(f.readAll()))); + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/drawmapwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/drawmapwidget.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,86 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef DRAWMAPWIDGET_H +#define DRAWMAPWIDGET_H + +#include +#include +#include +#include + +#include "qaspectratiolayout.h" +#include "drawmapscene.h" + +namespace Ui { + class Ui_DrawMapWidget + { + public: + QGraphicsView *graphicsView; + + void setupUi(QWidget *drawMapWidget) + { + QAspectRatioLayout * arLayout = new QAspectRatioLayout(drawMapWidget); + arLayout->setMargin(0); + + graphicsView = new QGraphicsView(drawMapWidget); + arLayout->addWidget(graphicsView); + + retranslateUi(drawMapWidget); + + QMetaObject::connectSlotsByName(drawMapWidget); + } // setupUi + + void retranslateUi(QWidget *drawMapWidget) + { + Q_UNUSED(drawMapWidget); + } // retranslateUi + + }; + + class DrawMapWidget: public Ui_DrawMapWidget {}; +} + +class DrawMapWidget : public QWidget +{ + Q_OBJECT + +public: + explicit DrawMapWidget(QWidget *parent = 0); + ~DrawMapWidget(); + + void setScene(DrawMapScene * scene); + +public slots: + void undo(); + void clear(); + void save(const QString & fileName); + void load(const QString & fileName); + +protected: + void changeEvent(QEvent *e); + virtual void resizeEvent(QResizeEvent * event); + virtual void showEvent(QShowEvent * event); + +private: + Ui::DrawMapWidget *ui; + + DrawMapScene * m_scene; +}; + +#endif // DRAWMAPWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/fpsedit.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/fpsedit.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,31 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "fpsedit.h" + +FPSEdit::FPSEdit(QWidget * parent) : + QSpinBox(parent) +{ + setRange(1, 34); + setValue(27); +} + +QString FPSEdit::textFromValue(int value) const +{ + return QString::number(1000 / (35 - value)); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/fpsedit.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/fpsedit.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,35 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _FPSEDIT_H +#define _FPSEDIT_H + +#include + +class FPSEdit : public QSpinBox +{ + Q_OBJECT + +public: + FPSEdit(QWidget * parent = 0); + +protected: + QString textFromValue (int value) const; +}; + +#endif // _FPSEDIT_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/frameTeam.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/frameTeam.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,128 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include + +#include "frameTeam.h" +#include "teamselhelper.h" +#include "hwconsts.h" + +FrameTeams::FrameTeams(QWidget* parent) : + QFrame(parent), maxHedgehogsPerGame(48), overallHedgehogs(0), mainLayout(this), nonInteractive(false) +{ + QPalette newPalette = palette(); + newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); + setPalette(newPalette); + setAutoFillBackground(true); + + mainLayout.setSpacing(1); + mainLayout.setContentsMargins(4, 4, 4, 4); + + int i = 0; + while(colors[i] != 0) + availableColors.push_back(QColor(colors[i++])); + + resetColors(); +} + +void FrameTeams::setInteractivity(bool interactive) +{ + nonInteractive = !interactive; + for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ++it) { + TeamShowWidget* pts = dynamic_cast(it.value()); + if(!pts) throw; + pts->setInteractivity(interactive); + } +} + +void FrameTeams::resetColors() +{ + currentColor=availableColors.end() - 1; // ensure next color is the first one +} + +QColor FrameTeams::getNextColor() const +{ + QList::ConstIterator nextColor=currentColor; + ++nextColor; + if (nextColor==availableColors.end()) nextColor=availableColors.begin(); + return *nextColor; +} + +void FrameTeams::addTeam(HWTeam team, bool willPlay) +{ + TeamShowWidget* pTeamShowWidget = new TeamShowWidget(team, willPlay, this); + if(nonInteractive) pTeamShowWidget->setInteractivity(false); +// int hght=teamToWidget.empty() ? 0 : teamToWidget.begin()->second->size().height(); + mainLayout.addWidget(pTeamShowWidget); + teamToWidget.insert(team, pTeamShowWidget); + QResizeEvent* pevent=new QResizeEvent(parentWidget()->size(), parentWidget()->size()); + QCoreApplication::postEvent(parentWidget(), pevent); +} + +void FrameTeams::removeTeam(HWTeam team) +{ + tmapTeamToWidget::iterator it=teamToWidget.find(team); + if(it==teamToWidget.end()) return; + mainLayout.removeWidget(it.value()); + it.value()->deleteLater(); + teamToWidget.erase(it); +} + +void FrameTeams::resetTeams() +{ + for(tmapTeamToWidget::iterator it=teamToWidget.begin(); it!=teamToWidget.end(); ) { + mainLayout.removeWidget(it.value()); + it.value()->deleteLater(); + teamToWidget.erase(it++); + } +} + +void FrameTeams::setHHNum(const HWTeam& team) +{ + TeamShowWidget* pTeamShowWidget = dynamic_cast(getTeamWidget(team)); + if(!pTeamShowWidget) return; + pTeamShowWidget->setHHNum(team.numHedgehogs()); +} + +void FrameTeams::setTeamColor(const HWTeam& team) +{ + TeamShowWidget* pTeamShowWidget = dynamic_cast(getTeamWidget(team)); + if(!pTeamShowWidget) return; + pTeamShowWidget->changeTeamColor(team.color()); +} + +QWidget* FrameTeams::getTeamWidget(HWTeam team) +{ +//qDebug() << "FrameTeams::getTeamWidget getNetID() = " << team.getNetID(); + tmapTeamToWidget::iterator it=teamToWidget.find(team); + QWidget* ret = it!=teamToWidget.end() ? it.value() : 0; + return ret; +} + +bool FrameTeams::isFullTeams() const +{ + return overallHedgehogs==maxHedgehogsPerGame; +} + +void FrameTeams::emitTeamColorChanged(const HWTeam& team) +{ + emit teamColorChanged(team); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/frameTeam.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/frameTeam.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,68 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _FRAME_TEAM_INCLUDED +#define _FRAME_TEAM_INCLUDED + +#include +#include +#include + +#include "teamselect.h" + +class FrameTeams : public QFrame +{ + Q_OBJECT + + friend class CHedgehogerWidget; + friend class TeamShowWidget; + + public: + FrameTeams(QWidget* parent=0); + QWidget* getTeamWidget(HWTeam team); + bool isFullTeams() const; + void resetColors(); + void resetTeams(); + void setHHNum(const HWTeam& team); + void setTeamColor(const HWTeam& team); + void setInteractivity(bool interactive); + QColor getNextColor() const; + + signals: + void teamColorChanged(const HWTeam&); + + public slots: + void addTeam(HWTeam team, bool willPlay); + void removeTeam(HWTeam team); + + private: + const int maxHedgehogsPerGame; + int overallHedgehogs; + QList availableColors; + QList::Iterator currentColor; + + void emitTeamColorChanged(const HWTeam& team); + + QVBoxLayout mainLayout; + typedef QMap tmapTeamToWidget; + tmapTeamToWidget teamToWidget; + bool nonInteractive; +}; + +#endif // _FRAME_TAM_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/gamecfgwidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/gamecfgwidget.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,575 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "gamecfgwidget.h" +#include "igbox.h" +#include "hwconsts.h" +#include "ammoSchemeModel.h" +#include "proto.h" + +GameCFGWidget::GameCFGWidget(QWidget* parent) : + QGroupBox(parent) + , mainLayout(this) + , seedRegexp("\\{[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}\\}") +{ + mainLayout.setMargin(0); +// mainLayout.setSizeConstraint(QLayout::SetMinimumSize); + + pMapContainer = new HWMapContainer(this); + mainLayout.addWidget(pMapContainer, 0, 0); + + IconedGroupBox *GBoxOptions = new IconedGroupBox(this); + GBoxOptions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); + mainLayout.addWidget(GBoxOptions, 1, 0); + + QGridLayout *GBoxOptionsLayout = new QGridLayout(GBoxOptions); + + GBoxOptions->setTitle(tr("Game Options")); + GBoxOptionsLayout->addWidget(new QLabel(QLabel::tr("Style"), GBoxOptions), 1, 0); + + Scripts = new QComboBox(GBoxOptions); + GBoxOptionsLayout->addWidget(Scripts, 1, 1); + + Scripts->addItem("Normal"); + Scripts->insertSeparator(1); + + for (int i = 0; i < scriptList->size(); ++i) { + QString script = (*scriptList)[i].remove(".lua", Qt::CaseInsensitive); + QList scriptInfo; + scriptInfo.push_back(script); + QFile scriptCfgFile; + scriptCfgFile.setFileName(QString("%1/Data/Scripts/Multiplayer/%2.cfg").arg(cfgdir->absolutePath()).arg(script)); + if (!scriptCfgFile.exists()) scriptCfgFile.setFileName(QString("%1/Scripts/Multiplayer/%2.cfg").arg(datadir->absolutePath()).arg(script)); + if (scriptCfgFile.exists() && scriptCfgFile.open(QFile::ReadOnly)) { + QString scheme; + QString weapons; + QTextStream input(&scriptCfgFile); + input >> scheme; + input >> weapons; + if (scheme.isEmpty()) + scheme = "locked"; + scheme.replace("_", " "); + if (weapons.isEmpty()) + weapons = "locked"; + weapons.replace("_", " "); + scriptInfo.push_back(scheme); + scriptInfo.push_back(weapons); + scriptCfgFile.close(); + } + else + { + scriptInfo.push_back("locked"); + scriptInfo.push_back("locked"); + } + Scripts->addItem(script.replace("_", " "), scriptInfo); + } + + connect(Scripts, SIGNAL(currentIndexChanged(int)), this, SLOT(scriptChanged(int))); + + QWidget *SchemeWidget = new QWidget(GBoxOptions); + GBoxOptionsLayout->addWidget(SchemeWidget, 2, 0, 1, 2); + + QGridLayout *SchemeWidgetLayout = new QGridLayout(SchemeWidget); + SchemeWidgetLayout->setMargin(0); + + GameSchemes = new QComboBox(SchemeWidget); + SchemeWidgetLayout->addWidget(GameSchemes, 0, 2); + connect(GameSchemes, SIGNAL(currentIndexChanged(int)), this, SLOT(schemeChanged(int))); + + SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Scheme"), SchemeWidget), 0, 0); + + QPixmap pmEdit(":/res/edit.png"); + + QPushButton * goToSchemePage = new QPushButton(SchemeWidget); + goToSchemePage->setToolTip(tr("Edit schemes")); + goToSchemePage->setIconSize(pmEdit.size()); + goToSchemePage->setIcon(pmEdit); + goToSchemePage->setMaximumWidth(pmEdit.width() + 6); + SchemeWidgetLayout->addWidget(goToSchemePage, 0, 3); + connect(goToSchemePage, SIGNAL(clicked()), this, SLOT(jumpToSchemes())); + + SchemeWidgetLayout->addWidget(new QLabel(QLabel::tr("Weapons"), SchemeWidget), 1, 0); + + WeaponsName = new QComboBox(SchemeWidget); + SchemeWidgetLayout->addWidget(WeaponsName, 1, 2); + + connect(WeaponsName, SIGNAL(currentIndexChanged(int)), this, SLOT(ammoChanged(int))); + + QPushButton * goToWeaponPage = new QPushButton(SchemeWidget); + goToWeaponPage->setToolTip(tr("Edit weapons")); + goToWeaponPage->setIconSize(pmEdit.size()); + goToWeaponPage->setIcon(pmEdit); + goToWeaponPage->setMaximumWidth(pmEdit.width() + 6); + SchemeWidgetLayout->addWidget(goToWeaponPage, 1, 3); + connect(goToWeaponPage, SIGNAL(clicked()), this, SLOT(jumpToWeapons())); + + bindEntries = new QCheckBox(SchemeWidget); + bindEntries->setToolTip(tr("When this option is enabled selecting a game scheme will auto-select a weapon")); + bindEntries->setChecked(true); + bindEntries->setMaximumWidth(42); + bindEntries->setStyleSheet( "QCheckBox::indicator:checked { image: url(\":/res/lock.png\"); }" + "QCheckBox::indicator:unchecked { image: url(\":/res/unlock.png\"); }" ); + SchemeWidgetLayout->addWidget(bindEntries, 0, 1, 0, 1, Qt::AlignVCenter); + + connect(pMapContainer, SIGNAL(seedChanged(const QString &)), this, SLOT(seedChanged(const QString &))); + connect(pMapContainer, SIGNAL(mapChanged(const QString &)), this, SLOT(mapChanged(const QString &))); + connect(pMapContainer, SIGNAL(mapgenChanged(MapGenerator)), this, SLOT(mapgenChanged(MapGenerator))); + connect(pMapContainer, SIGNAL(mazeSizeChanged(int)), this, SLOT(maze_sizeChanged(int))); + connect(pMapContainer, SIGNAL(themeChanged(const QString &)), this, SLOT(themeChanged(const QString &))); + connect(pMapContainer, SIGNAL(newTemplateFilter(int)), this, SLOT(templateFilterChanged(int))); + connect(pMapContainer, SIGNAL(drawMapRequested()), this, SIGNAL(goToDrawMap())); + connect(pMapContainer, SIGNAL(drawnMapChanged(const QByteArray &)), this, SLOT(onDrawnMapChanged(const QByteArray &))); +} + +void GameCFGWidget::jumpToSchemes() +{ + emit goToSchemes(GameSchemes->currentIndex()); +} + +void GameCFGWidget::jumpToWeapons() +{ + emit goToWeapons(WeaponsName->currentIndex()); +} + +QVariant GameCFGWidget::schemeData(int column) const +{ + return GameSchemes->model()->data(GameSchemes->model()->index(GameSchemes->currentIndex(), column)); +} + +quint32 GameCFGWidget::getGameFlags() const +{ + quint32 result = 0; + + if (schemeData(1).toBool()) + result |= 0x00001000; // fort + if (schemeData(2).toBool()) + result |= 0x00000010; // divide teams + if (schemeData(3).toBool()) + result |= 0x00000004; // solid land + if (schemeData(4).toBool()) + result |= 0x00000008; // border + if (schemeData(5).toBool()) + result |= 0x00000020; // low gravity + if (schemeData(6).toBool()) + result |= 0x00000040; // laser sight + if (schemeData(7).toBool()) + result |= 0x00000080; // invulnerable + if (schemeData(8).toBool()) + result |= 0x00000100; // mines + if (schemeData(9).toBool()) + result |= 0x00000200; // vampirism + if (schemeData(10).toBool()) + result |= 0x00000400; // karma + if (schemeData(11).toBool()) + result |= 0x00000800; // artillery + if (schemeData(12).toBool()) + result |= 0x00002000; // random + if (schemeData(13).toBool()) + result |= 0x00004000; // king + if (schemeData(14).toBool()) + result |= 0x00008000; // place hogs + if (schemeData(15).toBool()) + result |= 0x00010000; // shared ammo + if (schemeData(16).toBool()) + result |= 0x00020000; // disable girders + if (schemeData(17).toBool()) + result |= 0x00040000; // disable land obj + if (schemeData(18).toBool()) + result |= 0x00080000; // ai survival + if (schemeData(19).toBool()) + result |= 0x00100000; // infinite attacks + if (schemeData(20).toBool()) + result |= 0x00200000; // reset weaps + if (schemeData(21).toBool()) + result |= 0x00400000; // per hog ammo + if (schemeData(22).toBool()) + result |= 0x00800000; // no wind + if (schemeData(23).toBool()) + result |= 0x01000000; // more wind + if (schemeData(24).toBool()) + result |= 0x02000000; // tag team + if (schemeData(25).toBool()) + result |= 0x04000000; // bottom border + + return result; +} + +quint32 GameCFGWidget::getInitHealth() const +{ + return schemeData(28).toInt(); +} + +QByteArray GameCFGWidget::getFullConfig() const +{ + QList bcfg; + int mapgen = pMapContainer->get_mapgen(); + + QString currentMap = pMapContainer->getCurrentMap(); + if (currentMap.size() > 0) + { + bcfg << QString("emap " + currentMap).toUtf8(); + +// engine should figure it out on its own +// if(pMapContainer->getCurrentIsMission()) +// bcfg << QString("escript Maps/%1/map.lua").arg(currentMap).toUtf8(); + } + bcfg << QString("etheme " + pMapContainer->getCurrentTheme()).toUtf8(); + + if (Scripts->currentIndex() > 0) + { + bcfg << QString("escript Scripts/Multiplayer/%1.lua").arg(Scripts->itemData(Scripts->currentIndex()).toList()[0].toString()).toUtf8(); + } + + bcfg << QString("eseed " + pMapContainer->getCurrentSeed()).toUtf8(); + bcfg << QString("e$gmflags %1").arg(getGameFlags()).toUtf8(); + bcfg << QString("e$damagepct %1").arg(schemeData(26).toInt()).toUtf8(); + bcfg << QString("e$turntime %1").arg(schemeData(27).toInt() * 1000).toUtf8(); + bcfg << QString("e$sd_turns %1").arg(schemeData(29).toInt()).toUtf8(); + bcfg << QString("e$casefreq %1").arg(schemeData(30).toInt()).toUtf8(); + bcfg << QString("e$minestime %1").arg(schemeData(31).toInt() * 1000).toUtf8(); + bcfg << QString("e$minesnum %1").arg(schemeData(32).toInt()).toUtf8(); + bcfg << QString("e$minedudpct %1").arg(schemeData(33).toInt()).toUtf8(); + bcfg << QString("e$explosives %1").arg(schemeData(34).toInt()).toUtf8(); + bcfg << QString("e$healthprob %1").arg(schemeData(35).toInt()).toUtf8(); + bcfg << QString("e$hcaseamount %1").arg(schemeData(36).toInt()).toUtf8(); + bcfg << QString("e$waterrise %1").arg(schemeData(37).toInt()).toUtf8(); + bcfg << QString("e$healthdec %1").arg(schemeData(38).toInt()).toUtf8(); + bcfg << QString("e$ropepct %1").arg(schemeData(39).toInt()).toUtf8(); + bcfg << QString("e$getawaytime %1").arg(schemeData(40).toInt()).toUtf8(); + bcfg << QString("e$template_filter %1").arg(pMapContainer->getTemplateFilter()).toUtf8(); + bcfg << QString("e$mapgen %1").arg(mapgen).toUtf8(); + + switch (mapgen) + { + case MAPGEN_MAZE: + bcfg << QString("e$maze_size %1").arg(pMapContainer->getMazeSize()).toUtf8(); + break; + + case MAPGEN_DRAWN: + { + QByteArray data = pMapContainer->getDrawnMapData(); + while(data.size() > 0) + { + QByteArray tmp = data; + tmp.truncate(200); + tmp.prepend("edraw "); + bcfg << tmp; + data.remove(0, 200); + } + break; + } + default: ; + } + + QByteArray result; + + foreach(QByteArray ba, bcfg) + HWProto::addByteArrayToBuffer(result, ba); + + return result; +} + +void GameCFGWidget::setNetAmmo(const QString& name, const QString& ammo) +{ + bool illegal = ammo.size() != cDefaultAmmoStore->size(); + if (illegal) + QMessageBox::critical(this, tr("Error"), tr("Illegal ammo scheme")); + + int pos = WeaponsName->findText(name); + if ((pos == -1) || illegal) { // prevent from overriding schemes with bad ones + WeaponsName->addItem(name, ammo); + WeaponsName->setCurrentIndex(WeaponsName->count() - 1); + } else { + WeaponsName->setItemData(pos, ammo); + WeaponsName->setCurrentIndex(pos); + } +} + +void GameCFGWidget::fullNetConfig() +{ + ammoChanged(WeaponsName->currentIndex()); + + seedChanged(pMapContainer->getCurrentSeed()); + templateFilterChanged(pMapContainer->getTemplateFilter()); + themeChanged(pMapContainer->getCurrentTheme()); + + schemeChanged(GameSchemes->currentIndex()); + scriptChanged(Scripts->currentIndex()); + + mapgenChanged(pMapContainer->get_mapgen()); + maze_sizeChanged(pMapContainer->getMazeSize()); + + // map must be the last + QString map = pMapContainer->getCurrentMap(); + if (map.size()) + mapChanged(map); +} + +void GameCFGWidget::setParam(const QString & param, const QStringList & slValue) +{ + if (slValue.size() == 1) + { + QString value = slValue[0]; + if (param == "MAP") { + pMapContainer->setMap(value); + return; + } + if (param == "SEED") { + pMapContainer->setSeed(value); + if (!seedRegexp.exactMatch(value)) { + pMapContainer->seedEdit->setVisible(true); + } + return; + } + if (param == "THEME") { + pMapContainer->setTheme(value); + return; + } + if (param == "TEMPLATE") { + pMapContainer->setTemplateFilter(value.toUInt()); + return; + } + if (param == "MAPGEN") { + pMapContainer->setMapgen((MapGenerator)value.toUInt()); + return; + } + if (param == "MAZE_SIZE") { + pMapContainer->setMazeSize(value.toUInt()); + return; + } + if (param == "SCRIPT") { + Scripts->setCurrentIndex(Scripts->findText(value)); + return; + } + if (param == "DRAWNMAP") { + pMapContainer->setDrawnMapData(qUncompress(QByteArray::fromBase64(slValue[0].toLatin1()))); + return; + } + } + + if (slValue.size() == 2) + { + if (param == "AMMO") { + setNetAmmo(slValue[0], slValue[1]); + return; + } + } + + if (slValue.size() == 5) + { + if (param == "FULLMAPCONFIG") + { + QString seed = slValue[3]; + if (!seedRegexp.exactMatch(seed)) + pMapContainer->seedEdit->setVisible(true); + + pMapContainer->setAllMapParameters( + slValue[0], + (MapGenerator)slValue[1].toUInt(), + slValue[2].toUInt(), + seed, + slValue[4].toUInt() + ); + return; + } + } + + qWarning("Got bad config param from net"); +} + +void GameCFGWidget::ammoChanged(int index) +{ + if (index >= 0) { + emit paramChanged( + "AMMO", + QStringList() << WeaponsName->itemText(index) << WeaponsName->itemData(index).toString() + ); + } +} + +void GameCFGWidget::mapChanged(const QString & value) +{ + if(isEnabled() && pMapContainer->getCurrentIsMission()) + { + Scripts->setEnabled(false); + Scripts->setCurrentIndex(0); + + if (pMapContainer->getCurrentScheme() == "locked") + { + GameSchemes->setEnabled(false); + GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); + } + else + { + GameSchemes->setEnabled(true); + int num = GameSchemes->findText(pMapContainer->getCurrentScheme()); + if (num != -1) + GameSchemes->setCurrentIndex(num); + else + GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); + } + + if (pMapContainer->getCurrentWeapons() == "locked") + { + WeaponsName->setEnabled(false); + WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); + } + else + { + WeaponsName->setEnabled(true); + int num = WeaponsName->findText(pMapContainer->getCurrentWeapons()); + if (num != -1) + WeaponsName->setCurrentIndex(num); + else + WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); + } + + if (pMapContainer->getCurrentScheme() != "locked" && pMapContainer->getCurrentWeapons() != "locked") + bindEntries->setEnabled(true); + else + bindEntries->setEnabled(false); + } + else + { + Scripts->setEnabled(true); + GameSchemes->setEnabled(true); + WeaponsName->setEnabled(true); + bindEntries->setEnabled(true); + } + emit paramChanged("MAP", QStringList(value)); +} + +void GameCFGWidget::templateFilterChanged(int value) +{ + emit paramChanged("TEMPLATE", QStringList(QString::number(value))); +} + +void GameCFGWidget::seedChanged(const QString & value) +{ + emit paramChanged("SEED", QStringList(value)); +} + +void GameCFGWidget::themeChanged(const QString & value) +{ + emit paramChanged("THEME", QStringList(value)); +} + +void GameCFGWidget::schemeChanged(int index) +{ + QStringList sl; + + int size = GameSchemes->model()->columnCount(); + for(int i = 0; i < size; ++i) + sl << schemeData(i).toString(); + + emit paramChanged("SCHEME", sl); + + if (isEnabled() && bindEntries->isEnabled() && bindEntries->isChecked()) { + QString schemeName = GameSchemes->itemText(index); + for (int i = 0; i < WeaponsName->count(); i++) { + QString weapName = WeaponsName->itemText(i); + int res = QString::compare(weapName, schemeName, Qt::CaseSensitive); + if (0 == res) { + WeaponsName->setCurrentIndex(i); + emit ammoChanged(i); + break; + } + } + } +} + +void GameCFGWidget::scriptChanged(int index) +{ + if(isEnabled() && index > 0) + { + QString scheme = Scripts->itemData(Scripts->currentIndex()).toList()[1].toString(); + QString weapons = Scripts->itemData(Scripts->currentIndex()).toList()[2].toString(); + + if (scheme == "locked") + { + GameSchemes->setEnabled(false); + GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); + } + else + { + GameSchemes->setEnabled(true); + int num = GameSchemes->findText(scheme); + if (num != -1) + GameSchemes->setCurrentIndex(num); + else + GameSchemes->setCurrentIndex(GameSchemes->findText("Default")); + } + + if (weapons == "locked") + { + WeaponsName->setEnabled(false); + WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); + } + else + { + WeaponsName->setEnabled(true); + int num = WeaponsName->findText(weapons); + if (num != -1) + WeaponsName->setCurrentIndex(num); + else + WeaponsName->setCurrentIndex(WeaponsName->findText("Default")); + } + + if (scheme != "locked" && weapons != "locked") + bindEntries->setEnabled(true); + else + bindEntries->setEnabled(false); + } + else + { + GameSchemes->setEnabled(true); + WeaponsName->setEnabled(true); + bindEntries->setEnabled(true); + } + emit paramChanged("SCRIPT", QStringList(Scripts->itemText(index))); +} + +void GameCFGWidget::mapgenChanged(MapGenerator m) +{ + emit paramChanged("MAPGEN", QStringList(QString::number(m))); +} + +void GameCFGWidget::maze_sizeChanged(int s) +{ + emit paramChanged("MAZE_SIZE", QStringList(QString::number(s))); +} + +void GameCFGWidget::resendSchemeData() +{ + schemeChanged(GameSchemes->currentIndex()); +} + +void GameCFGWidget::onDrawnMapChanged(const QByteArray & data) +{ + emit paramChanged("DRAWNMAP", QStringList(qCompress(data, 9).toBase64())); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/gamecfgwidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/gamecfgwidget.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,87 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef GAMECONFIGWIDGET_H +#define GAMECONFIGWIDGET_H + +#include +#include +#include +#include +#include + +#include "mapContainer.h" + +class QCheckBox; +class QVBoxLayout; +class QLabel; +class QTableView; + +class GameCFGWidget : public QGroupBox +{ + Q_OBJECT + +public: + GameCFGWidget(QWidget* parent); + quint32 getGameFlags() const; + quint32 getInitHealth() const; + QByteArray getFullConfig() const; + QComboBox * Scripts; + QComboBox * GameSchemes; + QComboBox * WeaponsName; + HWMapContainer* pMapContainer; + QTableView * tv; + QVariant schemeData(int column) const; + +public slots: + void setParam(const QString & param, const QStringList & value); + void fullNetConfig(); + void resendSchemeData(); + +signals: + void paramChanged(const QString & param, const QStringList & value); + void goToSchemes(int); + void goToWeapons(int); + void goToDrawMap(); + +private slots: + void ammoChanged(int index); + void mapChanged(const QString &); + void templateFilterChanged(int); + void seedChanged(const QString &); + void themeChanged(const QString &); + void schemeChanged(int); + void scriptChanged(int); + void jumpToSchemes(); + void jumpToWeapons(); + void mapgenChanged(MapGenerator m); + void maze_sizeChanged(int s); + void onDrawnMapChanged(const QByteArray & data); + +private: + QGridLayout mainLayout; + QCheckBox * bindEntries; + QString curNetAmmoName; + QString curNetAmmo; + QRegExp seedRegexp; + + void setNetAmmo(const QString& name, const QString& ammo); + +}; + +#endif // GAMECONFIGWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/hedgehogerWidget.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/hedgehogerWidget.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,76 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Ulyanov Igor + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "hedgehogerWidget.h" + +#include "frameTeam.h" + +CHedgehogerWidget::CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent) : + ItemNum(im, img, parent, 1) +{ + // TODO: maxHedgehogsPerGame doesn't reset properly and won't match map limits for now + /*if(parent) { + pOurFrameTeams = dynamic_cast(parent->parentWidget()); + } + if(pOurFrameTeams->overallHedgehogs + 4 > pOurFrameTeams->maxHedgehogsPerGame) { + numItems = pOurFrameTeams->maxHedgehogsPerGame - pOurFrameTeams->overallHedgehogs; + } else numItems = 4; + pOurFrameTeams->overallHedgehogs += numItems;*/ +} + +void CHedgehogerWidget::incItems() +{ + //if (pOurFrameTeams->overallHedgehogs < pOurFrameTeams->maxHedgehogsPerGame) { + numItems++; + //pOurFrameTeams->overallHedgehogs++; + emit hedgehogsNumChanged(); + //} +} + +void CHedgehogerWidget::decItems() +{ + numItems--; + //pOurFrameTeams->overallHedgehogs--; + emit hedgehogsNumChanged(); +} + +CHedgehogerWidget::~CHedgehogerWidget() +{ + // TODO: not called? + //pOurFrameTeams->overallHedgehogs-=numItems; +} + +void CHedgehogerWidget::setNonInteractive() +{ + nonInteractive=true; +} + +void CHedgehogerWidget::setHHNum(unsigned int num) +{ + /*unsigned int diff = num - numItems; + numItems += diff; + pOurFrameTeams->overallHedgehogs += diff;*/ + numItems = num; + repaint(); +} + +unsigned char CHedgehogerWidget::getHedgehogsNum() const +{ + return numItems; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/hedgehogerWidget.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/hedgehogerWidget.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,50 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Ulyanov Igor + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _HEDGEHOGER_WIDGET +#define _HEDGEHOGER_WIDGET + +#include "itemNum.h" + +class FrameTeams; + +class CHedgehogerWidget : public ItemNum +{ + Q_OBJECT + + public: + CHedgehogerWidget(const QImage& im, const QImage& img, QWidget * parent); + virtual ~CHedgehogerWidget(); + unsigned char getHedgehogsNum() const; + void setHHNum (unsigned int num); + void setNonInteractive(); + + signals: + void hedgehogsNumChanged(); + + protected: + virtual void incItems(); + virtual void decItems(); + + private: + CHedgehogerWidget(); + FrameTeams* pOurFrameTeams; +}; + +#endif // _HEDGEHOGER_WIDGET diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/igbox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/igbox.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,79 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include + +#include "igbox.h" + +IconedGroupBox::IconedGroupBox(QWidget * parent) + : QGroupBox(parent) +{ +// Has issues with border-radius on children +// setAttribute(Qt::WA_PaintOnScreen, true); + titleLeftPadding = 49; + contentTopPadding = 15; +} + +void IconedGroupBox::setIcon(const QIcon & icon) +{ + if (this->icon.isNull()) + setStyleSheet(QString( + "IconedGroupBox{" + "margin-top: 46px;" + "margin-left: 12px;" + "padding: %1px 2px 5px 2px;" + "}" + "IconedGroupBox::title{" + "subcontrol-origin: margin;" + "subcontrol-position: top left;" + "padding-left: %2px;" + "padding-top: %1px;" + "text-align: left;" + "}" + ).arg(contentTopPadding).arg(titleLeftPadding) + ); + + this->icon = icon; + repaint(); +} + +void IconedGroupBox::paintEvent(QPaintEvent * event) +{ + Q_UNUSED(event); + + QStylePainter painter(this); + + QStyleOptionGroupBox option; + initStyleOption(&option); + painter.drawComplexControl(QStyle::CC_GroupBox, option); + + icon.paint(&painter, QRect(QPoint(0, 0), icon.actualSize(size()))); +} + +void IconedGroupBox::setTitleTextPadding(int px) +{ + titleLeftPadding = px; +} + +void IconedGroupBox::setContentTopPadding(int px) +{ + contentTopPadding = px; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/igbox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/igbox.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,44 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _IGBOX_H +#define _IGBOX_H + +#include +#include + +class IconedGroupBox : public QGroupBox +{ + Q_OBJECT + +public: + IconedGroupBox(QWidget * parent = 0); + + void setIcon(const QIcon & icon); + void setTitleTextPadding(int px); + void setContentTopPadding(int px); +protected: + virtual void paintEvent(QPaintEvent * event); + +private: + QIcon icon; + int titleLeftPadding; + int contentTopPadding; +}; + +#endif // _IGBOX_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/itemNum.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/itemNum.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,114 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2011 Igor Ulyanov + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "itemNum.h" +#include "hwform.h" + +#include +#include + +ItemNum::ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min, unsigned char max) : + QFrame(parent), m_im(im), m_img(img), infinityState(false), nonInteractive(false), minItems(min), maxItems(max), + numItems(min+2 >= max ? min : min+2) +{ + enabled = true; + if(frontendEffects) setAttribute(Qt::WA_PaintOnScreen, true); +} + +ItemNum::~ItemNum() +{ +} + +void ItemNum::mousePressEvent ( QMouseEvent * event ) +{ + if(nonInteractive) return; + if(event->button()==Qt::LeftButton && enabled) { + event->accept(); + if((infinityState && numItems <= maxItems) || (!infinityState && numItems < maxItems)) { + incItems(); + } else { + numItems = minItems+1; + // appears there's an emit in there + decItems(); + } + } else if (event->button()==Qt::RightButton && enabled) { + event->accept(); + if(numItems > minItems) { + decItems(); + } else { + numItems = maxItems+(infinityState?0:-1); + incItems(); + } + } else { + event->ignore(); + return; + } + repaint(); +} + +QSize ItemNum::sizeHint () const +{ + return QSize((maxItems+1)*12, 32); +} + +void ItemNum::paintEvent(QPaintEvent* event) +{ + Q_UNUSED(event); + + QPainter painter(this); + + if (numItems==maxItems+1) { + QRect target(0, 0, 100, 32); + if (enabled) { + painter.drawImage(target, QImage(":/res/infinity.png")); + } else { + painter.drawImage(target, QImage(":/res/infinitygrey.png")); + } + } else { + for(int i=0; i + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include + +#ifndef _ITEM_NUM_INCLUDED +#define _ITEM_NUM_INCLUDED + +class ItemNum : public QFrame +{ + Q_OBJECT + + public: + void setInfinityState(bool value); + void setEnabled(bool value); + unsigned char getItemsNum() const; + void setItemsNum(const unsigned char num); + + private: + QImage m_im; + QImage m_img; + bool infinityState; + bool enabled; + + protected: + ItemNum(const QImage& im, const QImage& img, QWidget * parent, unsigned char min=2, unsigned char max=8); + virtual QSize sizeHint () const; + virtual ~ItemNum()=0; + + bool nonInteractive; + unsigned char minItems; + unsigned char maxItems; + unsigned char numItems; + + // from QWidget + virtual void mousePressEvent ( QMouseEvent * event ); + virtual void paintEvent(QPaintEvent* event); + + // to be implemented in child + virtual void incItems()=0; + virtual void decItems()=0; +}; + +#endif // _ITEM_NUM_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/selectWeapon.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/selectWeapon.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,294 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "selectWeapon.h" +#include "weaponItem.h" +#include "hwconsts.h" + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +QImage getAmmoImage(int num) +{ + static QImage ammo(":Ammos.png"); + int x = num/(ammo.height()/32); + int y = (num-((ammo.height()/32)*x))*32; + x*=32; + return ammo.copy(x, y, 32, 32); +} + +SelWeaponItem::SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent) : + QWidget(parent) +{ + QHBoxLayout* hbLayout = new QHBoxLayout(this); + hbLayout->setSpacing(1); + hbLayout->setMargin(1); + + QLabel* lbl = new QLabel(this); + lbl->setPixmap(QPixmap::fromImage(getAmmoImage(iconNum))); + lbl->setMaximumWidth(30); + lbl->setGeometry(0, 0, 30, 30); + hbLayout->addWidget(lbl); + + item = new WeaponItem(image, imagegrey, this); + item->setItemsNum(wNum); + item->setInfinityState(allowInfinite); + hbLayout->addWidget(item); + + hbLayout->setStretchFactor(lbl, 1); + hbLayout->setStretchFactor(item, 99); + hbLayout->setAlignment(lbl, Qt::AlignLeft | Qt::AlignVCenter); + hbLayout->setAlignment(item, Qt::AlignLeft | Qt::AlignVCenter); +} + +void SelWeaponItem::setItemsNum(const unsigned char num) +{ + item->setItemsNum(num); +} + +unsigned char SelWeaponItem::getItemsNum() const +{ + return item->getItemsNum(); +} + +void SelWeaponItem::setEnabled(bool value) +{ + item->setEnabled(value); +} + +SelWeaponWidget::SelWeaponWidget(int numItems, QWidget* parent) : + QFrame(parent), + m_numItems(numItems) +{ + wconf = new QSettings(cfgdir->absolutePath() + "/weapons.ini", QSettings::IniFormat, this); + + for(int i = 0; i < cDefaultAmmos.size(); ++i) + wconf->setValue(cDefaultAmmos[i].first, cDefaultAmmos[i].second); + + QStringList keys = wconf->allKeys(); + for(int i = 0; i < keys.size(); i++) + { + if (wconf->value(keys[i]).toString().size() != cDefaultAmmoStore->size()) + wconf->remove(keys[i]); + } + + QString currentState = *cDefaultAmmoStore; + + QTabWidget * tbw = new QTabWidget(this); + QWidget * page1 = new QWidget(this); + p1Layout = new QGridLayout(page1); + p1Layout->setSpacing(1); + p1Layout->setMargin(1); + QWidget * page2 = new QWidget(this); + p2Layout = new QGridLayout(page2); + p2Layout->setSpacing(1); + p2Layout->setMargin(1); + QWidget * page3 = new QWidget(this); + p3Layout = new QGridLayout(page3); + p3Layout->setSpacing(1); + p3Layout->setMargin(1); + QWidget * page4 = new QWidget(this); + p4Layout = new QGridLayout(page4); + p4Layout->setSpacing(1); + p4Layout->setMargin(1); + + tbw->addTab(page1, tr("Weapon set")); + tbw->addTab(page2, tr("Probabilities")); + tbw->addTab(page4, tr("Ammo in boxes")); + tbw->addTab(page3, tr("Delays")); + + QGridLayout * pageLayout = new QGridLayout(this); + pageLayout->addWidget(tbw); + + + int j = -1; + int i = 0, k = 0; + for(; i < m_numItems; ++i) { + if (i == 6) continue; + if (i == 52) continue; // Disable structures for now + if (k % 4 == 0) ++j; + SelWeaponItem * swi = new SelWeaponItem(true, i, currentState[i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this); + weaponItems[i].append(swi); + p1Layout->addWidget(swi, j, k % 4); + + SelWeaponItem * pwi = new SelWeaponItem(false, i, currentState[numItems + i].digitValue(), QImage(":/res/ammopicbox.png"), QImage(":/res/ammopicboxgrey.png"), this); + weaponItems[i].append(pwi); + p2Layout->addWidget(pwi, j, k % 4); + + SelWeaponItem * dwi = new SelWeaponItem(false, i, currentState[numItems*2 + i].digitValue(), QImage(":/res/ammopicdelay.png"), QImage(":/res/ammopicdelaygrey.png"), this); + weaponItems[i].append(dwi); + p3Layout->addWidget(dwi, j, k % 4); + + SelWeaponItem * awi = new SelWeaponItem(false, i, currentState[numItems*3 + i].digitValue(), QImage(":/res/ammopic.png"), QImage(":/res/ammopicgrey.png"), this); + weaponItems[i].append(awi); + p4Layout->addWidget(awi, j, k % 4); + + ++k; + } + + //pLayout->setRowStretch(5, 100); + m_name = new QLineEdit(this); + pageLayout->addWidget(m_name, i, 0, 1, 5); +} + +void SelWeaponWidget::setWeapons(const QString& ammo) +{ + bool enable = true; + for(int i = 0; i < cDefaultAmmos.size(); i++) + if (!cDefaultAmmos[i].first.compare(m_name->text())) { + enable = false; + } + for(int i = 0; i < m_numItems; ++i) { + twi::iterator it = weaponItems.find(i); + if (it == weaponItems.end()) continue; + it.value()[0]->setItemsNum(ammo[i].digitValue()); + it.value()[1]->setItemsNum(ammo[m_numItems + i].digitValue()); + it.value()[2]->setItemsNum(ammo[m_numItems*2 + i].digitValue()); + it.value()[3]->setItemsNum(ammo[m_numItems*3 + i].digitValue()); + it.value()[0]->setEnabled(enable); + it.value()[1]->setEnabled(enable); + it.value()[2]->setEnabled(enable); + it.value()[3]->setEnabled(enable); + } + m_name->setEnabled(enable); +} + +void SelWeaponWidget::setDefault() +{ + for(int i = 0; i < cDefaultAmmos.size(); i++) + if (!cDefaultAmmos[i].first.compare(m_name->text())) { + return; + } + setWeapons(*cDefaultAmmoStore); +} + +void SelWeaponWidget::save() +{ + for(int i = 0; i < cDefaultAmmos.size(); i++) + if (!cDefaultAmmos[i].first.compare(m_name->text())) { + QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not overwrite default weapon set '%1'!").arg(cDefaultAmmos[i].first)); + return; + } + + if (m_name->text() == "") return; + + QString state1; + QString state2; + QString state3; + QString state4; + + for(int i = 0; i < m_numItems; ++i) { + twi::const_iterator it = weaponItems.find(i); + int num = it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum(); // 9 is for 'skip turn' + state1.append(QString::number(num)); + int prob = it == weaponItems.end() ? 0 : it.value()[1]->getItemsNum(); + state2.append(QString::number(prob)); + int del = it == weaponItems.end() ? 0 : it.value()[2]->getItemsNum(); + state3.append(QString::number(del)); + int am = it == weaponItems.end() ? 0 : it.value()[3]->getItemsNum(); + state4.append(QString::number(am)); + } + if (curWeaponsName != "") { + // remove old entry + wconf->remove(curWeaponsName); + } + wconf->setValue(m_name->text(), state1 + state2 + state3 + state4); + emit weaponsChanged(); +} + +int SelWeaponWidget::operator [] (unsigned int weaponIndex) const +{ + twi::const_iterator it = weaponItems.find(weaponIndex); + return it == weaponItems.end() ? 9 : it.value()[0]->getItemsNum(); +} + +QString SelWeaponWidget::getWeaponsString(const QString& name) const +{ + return wconf->value(name).toString(); +} + +void SelWeaponWidget::deleteWeaponsName() +{ + if (curWeaponsName == "") return; + + for(int i = 0; i < cDefaultAmmos.size(); i++) + if (!cDefaultAmmos[i].first.compare(m_name->text())) { + QMessageBox::warning(0, QMessageBox::tr("Weapons"), QMessageBox::tr("Can not delete default weapon set '%1'!").arg(cDefaultAmmos[i].first)); + return; + } + + QMessageBox reallyDelete(QMessageBox::Question, QMessageBox::tr("Weapons"), QMessageBox::tr("Really delete this weapon set?"), QMessageBox::Ok | QMessageBox::Cancel); + + if (reallyDelete.exec() == QMessageBox::Ok) { + wconf->remove(curWeaponsName); + emit weaponsDeleted(); + } +} + +void SelWeaponWidget::newWeaponsName() +{ + QString newName = tr("new"); + if(wconf->contains(newName)) { + //name already used -> look for an appropriate name: + int i=2; + while(wconf->contains(newName = tr("new")+QString::number(i++))); + } + setWeaponsName(newName); +} + +void SelWeaponWidget::setWeaponsName(const QString& name) +{ + m_name->setText(name); + + curWeaponsName = name; + + if(name != "" && wconf->contains(name)) { + setWeapons(wconf->value(name).toString()); + } else { + setWeapons(*cDefaultAmmoStore); + } +} + +QStringList SelWeaponWidget::getWeaponNames() const +{ + return wconf->allKeys(); +} + +void SelWeaponWidget::copy() +{ + if(wconf->contains(curWeaponsName)) { + QString ammo = getWeaponsString(curWeaponsName); + QString newName = tr("copy of") + " " + curWeaponsName; + if(wconf->contains(newName)) { + //name already used -> look for an appropriate name: + int i=2; + while(wconf->contains(newName = tr("copy of") + " " + curWeaponsName+QString::number(i++))); + } + setWeaponsName(newName); + setWeapons(ammo); + } +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/selectWeapon.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/selectWeapon.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,92 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _SELECT_WEAPON_INCLUDED +#define _SELECT_WEAPON_INCLUDED + +#include +#include +#include + +class QGridLayout; +class WeaponItem; +class QLineEdit; +class QSettings; + +class SelWeaponItem : public QWidget +{ + Q_OBJECT + +public: + SelWeaponItem(bool allowInfinite, int iconNum, int wNum, QImage image, QImage imagegrey, QWidget* parent=0); + + unsigned char getItemsNum() const; + void setItemsNum(const unsigned char num); + void setEnabled(bool value); + + private: + WeaponItem* item; +}; + +class SelWeaponWidget : public QFrame +{ + Q_OBJECT + + public: + SelWeaponWidget(int numItems, QWidget* parent=0); + QString getWeaponsString(const QString& name) const; + QStringList getWeaponNames() const; + + public slots: + void setDefault(); + void setWeapons(const QString& ammo); + //sets the name of the current set + void setWeaponsName(const QString& name); + void deleteWeaponsName(); + void newWeaponsName(); + void save(); + void copy(); + + signals: + void weaponsChanged(); + void weaponsDeleted(); + + private: + //the name of the current weapon set + QString curWeaponsName; + + QLineEdit* m_name; + + //storage for all the weapons sets + QSettings* wconf; + + const int m_numItems; + int operator [] (unsigned int weaponIndex) const; + + typedef QList ItemsList; + typedef QMap twi; + twi weaponItems; + //layout element for each tab: + QGridLayout* p1Layout; + QGridLayout* p2Layout; + QGridLayout* p3Layout; + QGridLayout* p4Layout; +}; + +#endif // _SELECT_WEAPON_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/teamselect.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/teamselect.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,281 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include + +#include +#include +#include +#include +#include + +#include "vertScrollArea.h" +#include "teamselect.h" +#include "teamselhelper.h" +#include "frameTeam.h" + +void TeamSelWidget::addTeam(HWTeam team) +{ + if(team.isNetTeam()) { + framePlaying->addTeam(team, true); + curPlayingTeams.push_back(team); + connect(framePlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), + this, SLOT(netTeamStatusChanged(const HWTeam&))); + connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)), + this, SLOT(hhNumChanged(const HWTeam&))); + dynamic_cast(framePlaying->getTeamWidget(team))->hhNumChanged(); + connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)), + this, SLOT(proxyTeamColorChanged(const HWTeam&))); + } else { + frameDontPlaying->addTeam(team, false); + m_curNotPlayingTeams.push_back(team); + if(m_acceptOuter) { + connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), + this, SLOT(pre_changeTeamStatus(HWTeam))); + } else { + connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), + this, SLOT(changeTeamStatus(HWTeam))); + } + } + emit setEnabledGameStart(curPlayingTeams.size()>1); +} + +void TeamSelWidget::setInteractivity(bool interactive) +{ + framePlaying->setInteractivity(interactive); +} + +void TeamSelWidget::hhNumChanged(const HWTeam& team) +{ + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + if(itPlay==curPlayingTeams.end()) + { + qWarning() << QString("hhNumChanged: team '%1' not found").arg(team.name()); + return; + } + itPlay->setNumHedgehogs(team.numHedgehogs()); + emit hhogsNumChanged(team); +} + +void TeamSelWidget::proxyTeamColorChanged(const HWTeam& team) +{ + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + if(itPlay==curPlayingTeams.end()) + { + qWarning() << QString("proxyTeamColorChanged: team '%1' not found").arg(team.name()); + return; + } + itPlay->setColor(team.color()); + emit teamColorChanged(team); +} + +void TeamSelWidget::changeHHNum(const HWTeam& team) +{ + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + if(itPlay==curPlayingTeams.end()) + { + qWarning() << QString("changeHHNum: team '%1' not found").arg(team.name()); + return; + } + itPlay->setNumHedgehogs(team.numHedgehogs()); + + framePlaying->setHHNum(team); +} + +void TeamSelWidget::changeTeamColor(const HWTeam& team) +{ + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + if(itPlay==curPlayingTeams.end()) + { + qWarning() << QString("changeTeamColor: team '%1' not found").arg(team.name()); + return; + } + itPlay->setColor(team.color()); + + framePlaying->setTeamColor(team); +} + +void TeamSelWidget::removeNetTeam(const HWTeam& team) +{ + //qDebug() << QString("removeNetTeam: removing team '%1'").arg(team.TeamName); + for(;;) { + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + if(itPlay==curPlayingTeams.end()) + { + qWarning() << QString("removeNetTeam: team '%1' not found").arg(team.name()); + break; + } + if(itPlay->isNetTeam()) { + QObject::disconnect(framePlaying->getTeamWidget(*itPlay), SIGNAL(teamStatusChanged(HWTeam))); + framePlaying->removeTeam(team); + curPlayingTeams.erase(itPlay); + break; + } + } + emit setEnabledGameStart(curPlayingTeams.size()>1); +} + +void TeamSelWidget::netTeamStatusChanged(const HWTeam& team) +{ + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + +} + +//void TeamSelWidget::removeTeam(__attribute__ ((unused)) HWTeam team) +//{ + //curDontPlayingTeams.erase(std::find(curDontPlayingTeams.begin(), curDontPlayingTeams.end(), team)); +//} + +void TeamSelWidget::changeTeamStatus(HWTeam team) +{ + QList::iterator itDontPlay=std::find(m_curNotPlayingTeams.begin(), m_curNotPlayingTeams.end(), team); + QList::iterator itPlay=std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team); + + bool willBePlaying=itDontPlay!=m_curNotPlayingTeams.end(); + + if(!willBePlaying) { + // playing team => dont playing + m_curNotPlayingTeams.push_back(*itPlay); + emit teamNotPlaying(*itPlay); + curPlayingTeams.erase(itPlay); + } else { + // return if max playing teams reached + if(framePlaying->isFullTeams()) return; + // dont playing team => playing + team=*itDontPlay; // for net team info saving in framePlaying (we have only name with netID from network) + itDontPlay->setColor(framePlaying->getNextColor()); + curPlayingTeams.push_back(*itDontPlay); + if(!m_acceptOuter) emit teamWillPlay(*itDontPlay); + m_curNotPlayingTeams.erase(itDontPlay); + } + + FrameTeams* pRemoveTeams; + FrameTeams* pAddTeams; + if(!willBePlaying) { + pRemoveTeams=framePlaying; + pAddTeams=frameDontPlaying; + } else { + pRemoveTeams=frameDontPlaying; + pAddTeams=framePlaying; + } + + pAddTeams->addTeam(team, willBePlaying); + pRemoveTeams->removeTeam(team); + if(!team.isNetTeam() && m_acceptOuter && !willBePlaying) { + connect(frameDontPlaying->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), + this, SLOT(pre_changeTeamStatus(HWTeam))); + } else { + connect(pAddTeams->getTeamWidget(team), SIGNAL(teamStatusChanged(HWTeam)), + this, SLOT(changeTeamStatus(HWTeam))); + } + if(willBePlaying) { + connect(framePlaying->getTeamWidget(team), SIGNAL(hhNmChanged(const HWTeam&)), + this, SLOT(hhNumChanged(const HWTeam&))); + dynamic_cast(framePlaying->getTeamWidget(team))->hhNumChanged(); + connect(framePlaying->getTeamWidget(team), SIGNAL(teamColorChanged(const HWTeam&)), + this, SLOT(proxyTeamColorChanged(const HWTeam&))); + emit teamColorChanged(((TeamShowWidget*)framePlaying->getTeamWidget(team))->getTeam()); + } + + QSize szh=pAddTeams->sizeHint(); + QSize szh1=pRemoveTeams->sizeHint(); + if(szh.isValid() && szh1.isValid()) { + pAddTeams->resize(pAddTeams->size().width(), szh.height()); + pRemoveTeams->resize(pRemoveTeams->size().width(), szh1.height()); + } + + emit setEnabledGameStart(curPlayingTeams.size()>1); +} + +void TeamSelWidget::addScrArea(FrameTeams* pfteams, QColor color, int fixedHeight) +{ + VertScrArea* area = new VertScrArea(color); + area->setWidget(pfteams); + mainLayout.addWidget(area, 30); + if (fixedHeight > 0) + { + area->setMinimumHeight(fixedHeight); + area->setMaximumHeight(fixedHeight); + area->setStyleSheet( + "FrameTeams{" + "border: solid;" + "border-width: 1px;" + "border-radius: 16px;" + "border-color: #ffcc00;" + "}" + ); + } +} + +TeamSelWidget::TeamSelWidget(QWidget* parent) : + QGroupBox(parent), mainLayout(this), m_acceptOuter(false) +{ + setTitle(QGroupBox::tr("Playing teams")); + framePlaying = new FrameTeams(); + frameDontPlaying = new FrameTeams(); + + QPalette p; + p.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); + addScrArea(framePlaying, p.color(QPalette::Window).light(105), 250); + addScrArea(frameDontPlaying, p.color(QPalette::Window).dark(105), 0); +} + +void TeamSelWidget::setAcceptOuter(bool acceptOuter) +{ + m_acceptOuter=acceptOuter; +} + +void TeamSelWidget::resetPlayingTeams(const QList& teamslist) +{ + //for(it=curPlayingTeams.begin(); it!=curPlayingTeams.end(); it++) { + //framePlaying->removeTeam(*it); + //} + framePlaying->resetTeams(); + framePlaying->resetColors(); + curPlayingTeams.clear(); + //for(it=curDontPlayingTeams.begin(); it!=curDontPlayingTeams.end(); it++) { + //frameDontPlaying->removeTeam(*it); + //} + frameDontPlaying->resetTeams(); + m_curNotPlayingTeams.clear(); + + foreach(HWTeam team, teamslist) + addTeam(team); +} + +bool TeamSelWidget::isPlaying(HWTeam team) const +{ + return std::find(curPlayingTeams.begin(), curPlayingTeams.end(), team)!=curPlayingTeams.end(); +} + +QList TeamSelWidget::getPlayingTeams() const +{ + return curPlayingTeams; +} + +QList TeamSelWidget::getNotPlayingTeams() const +{ + return m_curNotPlayingTeams; +} + +void TeamSelWidget::pre_changeTeamStatus(HWTeam team) +{ + team.setColor(framePlaying->getNextColor()); + emit acceptRequested(team); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/teamselect.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/teamselect.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,83 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _TEAM_SELECT_INCLUDED +#define _TEAM_SELECT_INCLUDED + +#include +#include +#include +#include + +#include "team.h" + +class TeamSelWidget; +class FrameTeams; +class QFrame; +class QPushButton; + +using namespace std; + +class TeamSelWidget : public QGroupBox +{ + Q_OBJECT + + public: + TeamSelWidget(QWidget* parent); + void setAcceptOuter(bool acceptOuter); + void removeNetTeam(const HWTeam& team); + void resetPlayingTeams(const QList& teamslist); + bool isPlaying(HWTeam team) const; + QList getPlayingTeams() const; + QList getNotPlayingTeams() const; + void setInteractivity(bool interactive); + + public slots: + void addTeam(HWTeam team); + void netTeamStatusChanged(const HWTeam& team); + void changeHHNum(const HWTeam&); + void changeTeamColor(const HWTeam&); + void changeTeamStatus(HWTeam team); + + signals: + void setEnabledGameStart(bool); + void teamWillPlay(HWTeam team); + void teamNotPlaying(const HWTeam& team); + void hhogsNumChanged(const HWTeam&); + void teamColorChanged(const HWTeam&); + void acceptRequested(HWTeam team); + + private slots: + void pre_changeTeamStatus(HWTeam); + void hhNumChanged(const HWTeam& team); + void proxyTeamColorChanged(const HWTeam& team); + + private: + void addScrArea(FrameTeams* pfteams, QColor color, int maxHeight); + FrameTeams* frameDontPlaying; + FrameTeams* framePlaying; + + QVBoxLayout mainLayout; + bool m_acceptOuter; + + QList curPlayingTeams; + QList m_curNotPlayingTeams; +}; + +#endif // _TEAM_SELECT_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/teamselhelper.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/teamselhelper.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,154 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include + +#include + +#include "teamselhelper.h" +#include "hwconsts.h" +#include "frameTeam.h" + +void TeamLabel::teamButtonClicked() +{ + emit teamActivated(text()); +} + +TeamShowWidget::TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent) : + QWidget(parent), mainLayout(this), m_team(team), m_isPlaying(isPlaying), phhoger(0), + colorButt(0) +{ + QPalette newPalette = palette(); + newPalette.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); + setPalette(newPalette); + setAutoFillBackground(true); + + mainLayout.setSpacing(3); + mainLayout.setMargin(0); + this->setMaximumHeight(38); + this->setMinimumHeight(38); + QIcon difficultyIcon=team.isNetTeam() ? + QIcon(QString(":/res/botlevels/net%1.png").arg(m_team.difficulty())) + : QIcon(QString(":/res/botlevels/%1.png").arg(m_team.difficulty())); + + butt = new QPushButton(difficultyIcon, team.name().replace("&","&&"), this); + butt->setFlat(true); + butt->setToolTip(team.owner()); + mainLayout.addWidget(butt); + butt->setStyleSheet("QPushButton{" + "icon-size: 48px;" + "text-align: left;" + "background-color: #0d0544;" + "color: orange;" + "font: bold;" + "border-width: 2px;" + "margin: 6px 0px 6px 0px;" + "}"); + + if(m_isPlaying) { + // team color + colorButt = new QPushButton(this); + colorButt->setMaximumWidth(26); + colorButt->setMinimumHeight(26); + colorButt->setGeometry(0, 0, 26, 26); + + changeTeamColor(); + connect(colorButt, SIGNAL(clicked()), this, SLOT(changeTeamColor())); + mainLayout.addWidget(colorButt); + + phhoger = new CHedgehogerWidget(QImage(":/res/hh25x25.png"), QImage(":/res/hh25x25grey.png"), this); + connect(phhoger, SIGNAL(hedgehogsNumChanged()), this, SLOT(hhNumChanged())); + phhoger->setHHNum(team.numHedgehogs()); + mainLayout.addWidget(phhoger); + } else { + } + + QObject::connect(butt, SIGNAL(clicked()), this, SLOT(activateTeam())); + //QObject::connect(bText, SIGNAL(clicked()), this, SLOT(activateTeam())); +} + +void TeamShowWidget::setInteractivity(bool interactive) +{ + if(m_team.isNetTeam()) { + butt->setEnabled(interactive); + } + + colorButt->setEnabled(interactive); + phhoger->setEnabled(interactive); +} + +void TeamShowWidget::setHHNum(unsigned int num) +{ + phhoger->setHHNum(num); +} + +void TeamShowWidget::hhNumChanged() +{ + m_team.setNumHedgehogs(phhoger->getHedgehogsNum()); + emit hhNmChanged(m_team); +} + +void TeamShowWidget::activateTeam() +{ + emit teamStatusChanged(m_team); +} + +/*HWTeamTempParams TeamShowWidget::getTeamParams() const +{ + if(!phhoger) throw; + HWTeamTempParams params; + params.numHedgehogs=phhoger->getHedgehogsNum(); + params.teamColor=colorButt->palette().color(QPalette::Button); + return params; +}*/ + +void TeamShowWidget::changeTeamColor(QColor color) +{ + FrameTeams* pOurFrameTeams=dynamic_cast(parentWidget()); + if(!color.isValid()) { + if(++pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) { + pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin(); + } + color=*pOurFrameTeams->currentColor; + } else { + // set according color iterator + pOurFrameTeams->currentColor=std::find(pOurFrameTeams->availableColors.begin(), + pOurFrameTeams->availableColors.end(), color); + if(pOurFrameTeams->currentColor==pOurFrameTeams->availableColors.end()) { + // error condition + pOurFrameTeams->currentColor=pOurFrameTeams->availableColors.begin(); + } + } + + colorButt->setStyleSheet(QString("QPushButton{" + "background-color: %1;" + "border-width: 1px;" + "border-radius: 2px;" + "}").arg(pOurFrameTeams->currentColor->name())); + + m_team.setColor(color); + emit teamColorChanged(m_team); +} + +HWTeam TeamShowWidget::getTeam() const +{ + return m_team; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/teamselhelper.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/teamselhelper.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,80 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2007 Igor Ulyanov + * Copyright (c) 2007-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _TEAMSEL_HELPER_INCLUDED +#define _TEAMSEL_HELPER_INCLUDED + +#include +#include +#include +#include + +#include "teamselect.h" +#include "hedgehogerWidget.h" + +class TeamLabel : public QLabel +{ + Q_OBJECT + + public: + TeamLabel(const QString& inp_str) : QLabel(inp_str) {}; + + signals: + void teamActivated(QString team_name); + + public slots: + void teamButtonClicked(); + +}; + +class TeamShowWidget : public QWidget +{ + Q_OBJECT + + public slots: + void changeTeamColor(QColor color=QColor()); + void hhNumChanged(); + + private slots: + void activateTeam(); + + public: + TeamShowWidget(HWTeam team, bool isPlaying, QWidget * parent); + void setPlaying(bool isPlaying); + void setHHNum(unsigned int num); + void setInteractivity(bool interactive); + HWTeam getTeam() const; + + private: + TeamShowWidget(); + QHBoxLayout mainLayout; + HWTeam m_team; + bool m_isPlaying; + CHedgehogerWidget* phhoger; + QPushButton* colorButt; + QPushButton* butt; +// QPushButton* bText; + + signals: + void teamStatusChanged(HWTeam team); + void hhNmChanged(const HWTeam&); + void teamColorChanged(const HWTeam&); +}; + +#endif // _TEAMSEL_HELPER_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/togglebutton.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/togglebutton.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,52 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2009 Kristian Lehmann + * Copyright (c) 2009-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "togglebutton.h" + +ToggleButtonWidget::ToggleButtonWidget(QWidget * parent, QString img) + : QPushButton(parent) +{ + setCheckable(true); + + QPixmap pm(":/res/btnDisabled.png"); + QPainter * painter = new QPainter(); + + pmChecked.load(img); + pmDisabled.load(img); + + setMaximumWidth(pmChecked.width() + 6); + + painter->begin(&pmDisabled); + painter->drawPixmap(pmDisabled.rect(), pm); + painter->end(); + + setIconSize(pmDisabled.size()); + setIcon(pmDisabled); + + connect(this, SIGNAL(toggled(bool)), this, SLOT(eventToggled(bool))); +} + +ToggleButtonWidget::~ToggleButtonWidget() +{ +} + +void ToggleButtonWidget::eventToggled(bool checked) +{ + setIcon(checked ? pmChecked : pmDisabled); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/togglebutton.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/togglebutton.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,42 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2009 Kristian Lehmann + * Copyright (c) 2009-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef TOGGLEBUTTONWIDGET_H +#define TOGGLEBUTTONWIDGET_H + +#include +#include +#include +#include +#include + +class ToggleButtonWidget : public QPushButton +{ + Q_OBJECT +public: + ToggleButtonWidget(QWidget * parent, QString img); + ~ToggleButtonWidget(); +private: + QPixmap pmChecked; + QPixmap pmDisabled; +private slots: + void eventToggled(bool checked); +}; + +#endif // TOGGLEBUTTONWIDGET_H diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/vertScrollArea.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/vertScrollArea.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,35 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006 Igor Ulyanov + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "vertScrollArea.h" + +#include + +VertScrArea::VertScrArea(QColor frameColor, QWidget * parent) : + QScrollArea(parent) +{ + QPalette newPalette = palette(); + newPalette.setColor(QPalette::Background, frameColor); + setPalette(newPalette); +} + +void VertScrArea::resizeEvent(QResizeEvent * event) +{ + widget()->resize(event->size().width(), widget()->sizeHint().height()); +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/vertScrollArea.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/vertScrollArea.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,36 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006 Igor Ulyanov + * Copyright (c) 2006-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _VERT_SCROLL_AREA_INCLUDED +#define _VERT_SCROLL_AREA_INCLUDED + +#include + +class VertScrArea : public QScrollArea +{ + Q_OBJECT + +public: + VertScrArea(QColor frameColor, QWidget * parent = 0); + +protected: + virtual void resizeEvent(QResizeEvent * event); +}; + +#endif // _VERT_SCROLL_AREA_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/weaponItem.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/weaponItem.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,40 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include "weaponItem.h" + +WeaponItem::WeaponItem(const QImage& im, const QImage& img, QWidget * parent) : + ItemNum(im, img, parent, 0) +{ +} + +WeaponItem::~WeaponItem() +{ +} + +void WeaponItem::incItems() +{ + ++numItems; +} + +void WeaponItem::decItems() +{ + --numItems; +} + diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/ui/widget/weaponItem.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/weaponItem.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,44 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2006-2008 Igor Ulyanov + * Copyright (c) 2008-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef _WEAPON_ITEM +#define _WEAPON_ITEM + +#include "itemNum.h" + +class WeaponItem : public ItemNum +{ + Q_OBJECT + + public: + WeaponItem(const QImage& im, const QImage& img, QWidget * parent); + virtual ~WeaponItem(); + + signals: + void hedgehogsNumChanged(); + + protected: + virtual void incItems(); + virtual void decItems(); + + private: + WeaponItem(); +}; + +#endif // _WEAPON_ITEM diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/util/namegen.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/util/namegen.cpp Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,285 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2009 Martin Minarik + * Copyright (c) 2009-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include +#include +#include +#include +#include "namegen.h" +#include "hwform.h" +#include "hwconsts.h" + + +HWNamegen::HWNamegen() {} + +QList HWNamegen::TypesTeamnames; +QList HWNamegen::TypesHatnames; +bool HWNamegen::typesAvailable = false; + + +void HWNamegen::teamRandomNames(HWTeam & team, const bool changeteamname) +{ + // load types if not already loaded + if (!typesAvailable) + if (!loadTypes()) + return; // abort if loading failed + + // abort if there are no hat types + if (TypesHatnames.size() <= 0) + return; + + // the hat will influence which names the hogs get + int kind = (rand()%(TypesHatnames.size())); + + // pick team name based on hat + if (changeteamname) + { + if (TypesTeamnames[kind].size() > 0) + team.setName(TypesTeamnames[kind][rand()%(TypesTeamnames[kind].size())]); + + team.setGrave(getRandomGrave()); + team.setFort(getRandomFort()); + team.setVoicepack("Default"); + } + + QStringList dicts; + QStringList dict; + + if ((TypesHatnames[kind].size()) <= 0) + { + dicts = dictsForHat(team.hedgehog(0).Hat); + dict = dictContents(dicts[rand()%(dicts.size())]); + } + + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + if ((TypesHatnames[kind].size()) > 0) + { + HWHog hh = team.hedgehog(i); + hh.Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())]; + team.setHedgehog(i,hh); + } + + // there is a chance that this hog has the same hat as the previous one + // let's reuse the hat-specific dict in this case + if ((i == 0) or (team.hedgehog(i).Hat != team.hedgehog(i-1).Hat)) + { + dicts = dictsForHat(team.hedgehog(i).Hat); + dict = dictContents(dicts[rand()%(dicts.size())]); + } + + // give each hedgehog a random name + HWNamegen::teamRandomName(team,i,dict); + } + +} + +void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber) +{ + QStringList dicts = dictsForHat(team.hedgehog(HedgehogNumber).Hat); + + QStringList dict = dictContents(dicts[rand()%(dicts.size())]); + + teamRandomName(team, HedgehogNumber, dict); +} + +void HWNamegen::teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict) +{ + QStringList namesDict = dict; + + for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) + { + namesDict.removeOne(team.hedgehog(i).Name); + } + + // if our dict doesn't have any new names we'll have to use duplicates + if (namesDict.size() < 1) + namesDict = dict; + + HWHog hh = team.hedgehog(HedgehogNumber); + + hh.Name = namesDict[rand()%(namesDict.size())]; + + team.setHedgehog(HedgehogNumber, hh); +} + +QStringList HWNamegen::dictContents(const QString filename) +{ + QStringList list; + + QFile file; + + // find .cfg to load the names from + file.setFileName(QString("%1/Data/Names/%2.txt").arg(cfgdir->absolutePath()).arg(filename)); + if (!file.exists()) + file.setFileName(QString("%1/Names/%2.txt").arg(datadir->absolutePath()).arg(filename)); + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + + QTextStream in(&file); + while (!in.atEnd()) + { + QString line = in.readLine(); + if(!line.isEmpty()) + list.append(line); + } + } + + if (list.size() == 0) + list.append(filename); + + return list; +} + + +QStringList HWNamegen::dictsForHat(const QString hatname) +{ + QStringList list; + + QFile file; + + // find .cfg to load the names from + file.setFileName(QString("%1/Data/Names/%2.cfg").arg(cfgdir->absolutePath()).arg(hatname)); + if (!file.exists()) + file.setFileName(QString("%1/Names/%2.cfg").arg(datadir->absolutePath()).arg(hatname)); + + + if (file.open(QIODevice::ReadOnly | QIODevice::Text)) + { + QTextStream in(&file); + while (!in.atEnd()) + { + QString line = in.readLine(); + if(!line.isEmpty()) + list.append(line); + } + } + + if (list.size() == 0) + list.append(QString("generic")); + + return list; +} + +// loades types from ini files. returns true on success. +bool HWNamegen::loadTypes() +{ + QFile file; + + // find .cfg to load the names from + file.setFileName(QString("%1/Data/Names/types.ini").arg(cfgdir->absolutePath())); + if (!file.exists()) + file.setFileName(QString("%1/Names/types.ini").arg(datadir->absolutePath())); + + + if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) + return false; + + int counter = 0; //counter starts with 0 (teamnames mode) + TypesTeamnames.append(QStringList()); + TypesHatnames.append(QStringList()); + + QTextStream in(&file); + while (!in.atEnd()) + { + QString line = in.readLine(); + if (line == QString("#####")) + { + counter++; //toggle mode (teamnames || hats) + if ((counter%2) == 0) + { + TypesTeamnames.append(QStringList()); + TypesHatnames.append(QStringList()); + } + } + else if ((line == QString("*****")) || (line == QString("*END*"))) + { + typesAvailable = true; + return true; // bye bye + } + else + { + if ((counter%2) == 0) + { + // even => teamnames mode + TypesTeamnames[(counter/2)].append(line); + } + else + { + // odd => hats mode + TypesHatnames[((counter-1)/2)].append(line); + } + } + } + + typesAvailable = true; + return true; +} + + + +QString HWNamegen::getRandomGrave() +{ + QStringList Graves; + + //list all available Graves + QDir tmpdir; + tmpdir.cd(cfgdir->absolutePath()); + tmpdir.cd("Data/Graphics/Graves"); + tmpdir.setFilter(QDir::Files); + Graves.append(tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1")); + + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Graphics/Graves"); + tmpdir.setFilter(QDir::Files); + QStringList tmpList = tmpdir.entryList(QStringList("*.png")).replaceInStrings(QRegExp("^(.*)\\.png"), "\\1"); + for (QStringList::Iterator it = tmpList.begin(); it != tmpList.end(); ++it) + if (!Graves.contains(*it,Qt::CaseInsensitive)) Graves.append(*it); + + if(Graves.size()==0) + { + //do some serious error handling + return "Error"; + } + + //pick a random grave + return Graves[rand()%(Graves.size())]; +} + +QString HWNamegen::getRandomFort() +{ + QStringList Forts; + + //list all available Forts + QDir tmpdir; + tmpdir.cd(datadir->absolutePath()); + tmpdir.cd("Forts"); + tmpdir.setFilter(QDir::Files); + Forts.append(tmpdir.entryList(QStringList("*L.png")).replaceInStrings(QRegExp("^(.*)L\\.png"), "\\1")); + + if(Forts.size()==0) + { + //do some serious error handling + return "Error"; + } + + //pick a random fort + return Forts[rand()%(Forts.size())]; +} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/util/namegen.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/util/namegen.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,53 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2009 Martin Minarik + * Copyright (c) 2009-2011 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef NAMEGEN_H +#define NAMEGEN_H + +#include + +class HWForm; +class HWTeam; + +class HWNamegen +{ +public: + + static void teamRandomName(HWTeam & team, const int HedgehogNumber); + static void teamRandomNames(HWTeam & team, const bool changeteamname); + +private: + HWNamegen(); + + static QList TypesTeamnames; + static QList TypesHatnames; + static bool typesAvailable; + + static bool loadTypes(); + static QStringList dictContents(const QString filename); + static QStringList dictsForHat(const QString hatname); + + static QString getRandomGrave(); + static QString getRandomFort(); + static void teamRandomName(HWTeam & team, const int HedgehogNumber, const QStringList & dict); +}; + + + +#endif diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/vertScrollArea.cpp --- a/QTfrontend/vertScrollArea.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,35 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006 Igor Ulyanov - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "vertScrollArea.h" - -#include - -VertScrArea::VertScrArea(QColor frameColor, QWidget * parent) : - QScrollArea(parent) -{ - QPalette newPalette = palette(); - newPalette.setColor(QPalette::Background, frameColor); - setPalette(newPalette); -} - -void VertScrArea::resizeEvent(QResizeEvent * event) -{ - widget()->resize(event->size().width(), widget()->sizeHint().height()); -} diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/vertScrollArea.h --- a/QTfrontend/vertScrollArea.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006 Igor Ulyanov - * Copyright (c) 2006-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _VERT_SCROLL_AREA_INCLUDED -#define _VERT_SCROLL_AREA_INCLUDED - -#include - -class VertScrArea : public QScrollArea -{ - Q_OBJECT - -public: - VertScrArea(QColor frameColor, QWidget * parent = 0); - -protected: - virtual void resizeEvent(QResizeEvent * event); -}; - -#endif // _VERT_SCROLL_AREA_INCLUDED diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/weaponItem.cpp --- a/QTfrontend/weaponItem.cpp Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,40 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#include "weaponItem.h" - -WeaponItem::WeaponItem(const QImage& im, const QImage& img, QWidget * parent) : - ItemNum(im, img, parent, 0) -{ -} - -WeaponItem::~WeaponItem() -{ -} - -void WeaponItem::incItems() -{ - ++numItems; -} - -void WeaponItem::decItems() -{ - --numItems; -} - diff -r 74431bf4c632 -r 4e8816cf9459 QTfrontend/weaponItem.h --- a/QTfrontend/weaponItem.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,44 +0,0 @@ -/* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2006-2008 Igor Ulyanov - * Copyright (c) 2008-2011 Andrey Korotaev - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA - */ - -#ifndef _WEAPON_ITEM -#define _WEAPON_ITEM - -#include "itemNum.h" - -class WeaponItem : public ItemNum -{ - Q_OBJECT - - public: - WeaponItem(const QImage& im, const QImage& img, QWidget * parent); - virtual ~WeaponItem(); - - signals: - void hedgehogsNumChanged(); - - protected: - virtual void incItems(); - virtual void decItems(); - - private: - WeaponItem(); -}; - -#endif // _WEAPON_ITEM diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/Actions.hs --- a/gameServer/Actions.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/Actions.hs Sun Oct 16 21:03:30 2011 +0200 @@ -1,4 +1,4 @@ -{-# LANGUAGE OverloadedStrings #-} +{-# LANGUAGE CPP, OverloadedStrings #-} module Actions where import Control.Concurrent @@ -17,16 +17,17 @@ import Data.Unique import Control.Arrow import Control.Exception -import OfficialServer.GameReplayStore import System.Process import Network.Socket ----------------------------- +import OfficialServer.GameReplayStore import CoreTypes import Utils import ClientIO import ServerState import Consts import ConfigFile +import EngineInteraction data Action = AnswerClients ![ClientChan] ![B.ByteString] @@ -206,7 +207,7 @@ (Just ci) <- gets clientIndex ri <- clientRoomA rnc <- gets roomsClients - (gameProgress, playersNum) <- io $ room'sM rnc (gameinprogress &&& playersIn) ri + (gameProgress, playersNum) <- io $ room'sM rnc ((isJust . gameInfo) &&& playersIn) ri ready <- client's isReady master <- client's isMaster -- client <- client's id @@ -298,7 +299,7 @@ processAction (RemoveTeam teamName) = do rnc <- gets roomsClients ri <- clientRoomA - inGame <- io $ room'sM rnc gameinprogress ri + inGame <- io $ room'sM rnc (isJust . gameInfo) ri chans <- othersChans if not $ inGame then mapM_ processAction [ @@ -310,8 +311,10 @@ AnswerClients chans ["EM", rmTeamMsg], ModifyRoom (\r -> r{ teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r, - leftTeams = teamName : leftTeams r, - roundMsgs = roundMsgs r Seq.|> rmTeamMsg + gameInfo = liftM (\g -> g{ + leftTeams = teamName : leftTeams g, + roundMsgs = roundMsgs g Seq.|> rmTeamMsg + }) $ gameInfo r }) ] where @@ -505,9 +508,13 @@ return () processAction $ ModifyServerInfo (\s -> s{shutdownPending = True}) +#if defined(OFFICIAL_SERVER) processAction SaveReplay = do ri <- clientRoomA rnc <- gets roomsClients io $ do r <- room'sM rnc id ri saveReplay r +#else +processAction SaveReplay = return () +#endif diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/CoreTypes.hs --- a/gameServer/CoreTypes.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/CoreTypes.hs Sun Oct 16 21:03:30 2011 +0200 @@ -62,6 +62,24 @@ hedgehogs :: [HedgehogInfo] } deriving (Show, Read) + +data GameInfo = + GameInfo + { + roundMsgs :: Seq B.ByteString, + leftTeams :: [B.ByteString], + teamsAtStart :: [TeamInfo], + allPlayersHaveRegisteredAccounts :: Bool, + giMapParams :: Map.Map B.ByteString B.ByteString, + giParams :: Map.Map B.ByteString [B.ByteString] + } deriving (Show, Read) + +--newGameInfo :: -> GameInfo +newGameInfo = + GameInfo + Data.Sequence.empty + [] + [] data RoomInfo = RoomInfo @@ -71,14 +89,11 @@ password :: B.ByteString, roomProto :: Word16, teams :: [TeamInfo], - gameinprogress :: Bool, + gameInfo :: Maybe GameInfo, playersIn :: !Int, readyPlayers :: !Int, isRestrictedJoins :: Bool, isRestrictedTeams :: Bool, - roundMsgs :: Seq B.ByteString, - leftTeams :: [B.ByteString], - teamsAtStart :: [TeamInfo], mapParams :: Map.Map B.ByteString B.ByteString, params :: Map.Map B.ByteString [B.ByteString] } @@ -91,14 +106,11 @@ "" 0 [] - False + Nothing 0 0 False False - Data.Sequence.empty - [] - [] ( Map.fromList $ Prelude.zipWith (,) ["MAP", "MAPGEN", "MAZE_SIZE", "SEED", "TEMPLATE"] diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/EngineInteraction.hs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer/EngineInteraction.hs Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,38 @@ +module EngineInteraction where + +import qualified Data.Set as Set +import qualified Data.List as List +import Control.Monad +import qualified Codec.Binary.Base64 as Base64 +import qualified Data.ByteString.Char8 as B +import qualified Data.ByteString as BW +------------- +import CoreTypes + + +toEngineMsg :: B.ByteString -> B.ByteString +toEngineMsg msg = B.pack $ Base64.encode (fromIntegral (BW.length msg) : BW.unpack msg) + + +fromEngineMsg :: B.ByteString -> Maybe B.ByteString +fromEngineMsg msg = liftM BW.pack (Base64.decode (B.unpack msg) >>= removeLength) + where + removeLength (x:xs) = if length xs == fromIntegral x then Just xs else Nothing + removeLength _ = Nothing + + +checkNetCmd :: B.ByteString -> (Bool, Bool) +checkNetCmd msg = check decoded + where + decoded = fromEngineMsg msg + check Nothing = (False, False) + check (Just ms) | B.length ms > 0 = let m = B.head ms in (m `Set.member` legalMessages, m == '+') + | otherwise = (False, False) + legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sFNpPwtghbc12345" ++ slotMessages + slotMessages = "\128\129\130\131\132\133\134\135\136\137\138" + +gameInfo2Replay :: GameInfo -> B.ByteString +gameInfo2Replay GameInfo{roundMsgs = rm, + teamsAtStart = teams, + giMapParams = params1, + giParams = params2} = undefined diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/HWProtoCore.hs --- a/gameServer/HWProtoCore.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/HWProtoCore.hs Sun Oct 16 21:03:30 2011 +0200 @@ -52,7 +52,7 @@ let roomMasterSign = if isMaster cl then "@" else "" let adminSign = if isAdministrator cl then "@" else "" let roomInfo = if roomId /= lobbyId then B.concat [roomMasterSign, "room ", name clRoom] else adminSign `B.append` "lobby" - let roomStatus = if gameinprogress clRoom then + let roomStatus = if isJust $ gameInfo clRoom then if teamsInGame cl > 0 then "(playing)" else "(spectating)" else "" diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/HWProtoInRoomState.hs Sun Oct 16 21:03:30 2011 +0200 @@ -14,6 +14,7 @@ import Utils import HandlerUtils import RoomsAndClients +import EngineInteraction handleCmd_inRoom :: CmdHandler @@ -58,7 +59,7 @@ [Warning "too many hedgehogs"] else if isJust $ findTeam rm then [Warning "There's already a team with same name in the list"] - else if gameinprogress rm then + else if isJust $ gameInfo rm then [Warning "round in progress"] else if isRestrictedTeams rm then [Warning "restricted"] @@ -166,19 +167,20 @@ ] handleCmd_inRoom ["START_GAME"] = do + (ci, rnc) <- ask cl <- thisClient rm <- thisRoom chans <- roomClientsChans + + let allPlayersRegistered = all ((<) 0 . B.length . webPassword . client rnc . teamownerId) $ teams rm - if isMaster cl && playersIn rm == readyPlayers rm && not (gameinprogress rm) then + if isMaster cl && playersIn rm == readyPlayers rm && not (isJust $ gameInfo rm) then if enoughClans rm then return [ ModifyRoom (\r -> r{ - gameinprogress = True, - roundMsgs = empty, - leftTeams = [], - teamsAtStart = teams r} + gameInfo = Just $ newGameInfo allPlayersRegistered (mapParams rm) (params rm) + } ), AnswerClients chans ["RUN_GAME"] ] @@ -195,35 +197,35 @@ rm <- thisRoom chans <- roomOthersChans - if teamsInGame cl > 0 && gameinprogress rm && isLegal then - return $ AnswerClients chans ["EM", msg] : [ModifyRoom (\r -> r{roundMsgs = roundMsgs r |> msg}) | not isKeepAlive] + if teamsInGame cl > 0 && (isJust $ gameInfo rm) && isLegal then + return $ AnswerClients chans ["EM", msg] : [ModifyRoom (\r -> r{gameInfo = liftM (\g -> g{roundMsgs = roundMsgs g |> msg}) $ gameInfo r}) | not isKeepAlive] else return [] where (isLegal, isKeepAlive) = checkNetCmd msg -handleCmd_inRoom ["ROUNDFINISHED", _] = do +handleCmd_inRoom ["ROUNDFINISHED", correctly] = do cl <- thisClient rm <- thisRoom chans <- roomClientsChans - if isMaster cl && gameinprogress rm then - return $ - ModifyRoom + if isMaster cl && (isJust $ gameInfo rm) then + return $ + SaveReplay + : ModifyRoom (\r -> r{ - gameinprogress = False, - readyPlayers = 0, - roundMsgs = empty, - leftTeams = [], - teamsAtStart = []} + gameInfo = Nothing, + readyPlayers = 0 + } ) : UnreadyRoomClients : answerRemovedTeams chans rm else return [] where - answerRemovedTeams chans = map (\t -> AnswerClients chans ["REMOVE_TEAM", t]) . leftTeams + answerRemovedTeams chans = map (\t -> AnswerClients chans ["REMOVE_TEAM", t]) . leftTeams . fromJust . gameInfo + isCorrect = correctly == "1" -- compatibility with clients with protocol < 38 handleCmd_inRoom ["ROUNDFINISHED"] = diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/HWProtoLobbyState.hs --- a/gameServer/HWProtoLobbyState.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/HWProtoLobbyState.hs Sun Oct 16 21:03:30 2011 +0200 @@ -12,6 +12,7 @@ import Utils import HandlerUtils import RoomsAndClients +import EngineInteraction answerAllTeams :: ClientInfo -> [TeamInfo] -> [Action] @@ -34,7 +35,7 @@ return [AnswerClients [sendChan cl] ("ROOMS" : roomsInfoList rooms)] where roomInfo irnc r = [ - showB $ gameinprogress r, + showB $ isJust $ gameInfo r, name r, showB $ playersIn r, showB $ length $ teams r, @@ -117,13 +118,13 @@ : ("SCHEME", pr Map.! "SCHEME") : (filter (\(p, _) -> p /= "SCHEME") $ Map.toList pr) - answerTeams cl jRoom = let f = if gameinprogress jRoom then teamsAtStart else teams in answerAllTeams cl $ f jRoom + answerTeams cl jRoom = let f = if isJust $ gameInfo jRoom then teamsAtStart . fromJust . gameInfo else teams in answerAllTeams cl $ f jRoom - watchRound cl jRoom = if not $ gameinprogress jRoom then + watchRound cl jRoom = if isNothing $ gameInfo jRoom then [] else [AnswerClients [sendChan cl] ["RUN_GAME"], - AnswerClients [sendChan cl] $ "EM" : toEngineMsg "e$spectate 1" : Foldable.toList (roundMsgs jRoom)] + AnswerClients [sendChan cl] $ "EM" : toEngineMsg "e$spectate 1" : Foldable.toList (roundMsgs . fromJust . gameInfo $ jRoom)] handleCmd_lobby ["JOIN_ROOM", roomName] = diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/OfficialServer/GameReplayStore.hs --- a/gameServer/OfficialServer/GameReplayStore.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/OfficialServer/GameReplayStore.hs Sun Oct 16 21:03:30 2011 +0200 @@ -1,18 +1,25 @@ {-# LANGUAGE ScopedTypeVariables #-} module OfficialServer.GameReplayStore where -import CoreTypes import Data.Time import Control.Exception as E import qualified Data.Map as Map import Data.Sequence() import System.Log.Logger +import Data.Maybe +import Data.Unique +import Control.Monad +--------------- +import CoreTypes + saveReplay :: RoomInfo -> IO () saveReplay r = do time <- getCurrentTime - let fileName = "replays/" ++ show time - let replayInfo = (teamsAtStart r, Map.toList $ mapParams r, Map.toList $ params r, roundMsgs r) + u <- liftM hashUnique newUnique + let fileName = "replays/" ++ show time ++ "-" ++ show u + let gi = fromJust $ gameInfo r + let replayInfo = (teamsAtStart gi, Map.toList $ mapParams r, Map.toList $ params r, roundMsgs gi) E.catch (writeFile fileName (show replayInfo)) (\(e :: IOException) -> warningM "REPLAYS" $ "Couldn't write to " ++ fileName ++ ": " ++ show e) diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/OfficialServer/extdbinterface.hs --- a/gameServer/OfficialServer/extdbinterface.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/OfficialServer/extdbinterface.hs Sun Oct 16 21:03:30 2011 +0200 @@ -17,7 +17,7 @@ "SELECT users.pass, users_roles.rid FROM users LEFT JOIN users_roles ON users.uid = users_roles.uid WHERE users.name = ?" dbQueryStats = - "UPDATE gameserver_stats SET players = ?, rooms = ?, last_update = UNIX_TIMESTAMP()" + "INSERT INTO gameserver_stats (players, rooms, last_update) VALUES (?, ?, UNIX_TIMESTAMP())" dbInteractionLoop dbConn = forever $ do q <- liftM read getLine diff -r 74431bf4c632 -r 4e8816cf9459 gameServer/Utils.hs --- a/gameServer/Utils.hs Sun Oct 16 19:02:48 2011 +0200 +++ b/gameServer/Utils.hs Sun Oct 16 21:03:30 2011 +0200 @@ -26,25 +26,6 @@ $ List.intersperse (':':) $ concatMap (\n -> (\(a0, a1) -> [showHex a0, showHex a1]) $ divMod n 65536) [a, b, c, d]) [] -toEngineMsg :: B.ByteString -> B.ByteString -toEngineMsg msg = B.pack $ Base64.encode (fromIntegral (BW.length msg) : BW.unpack msg) - -fromEngineMsg :: B.ByteString -> Maybe B.ByteString -fromEngineMsg msg = liftM BW.pack (Base64.decode (B.unpack msg) >>= removeLength) - where - removeLength (x:xs) = if length xs == fromIntegral x then Just xs else Nothing - removeLength _ = Nothing - -checkNetCmd :: B.ByteString -> (Bool, Bool) -checkNetCmd msg = check decoded - where - decoded = fromEngineMsg msg - check Nothing = (False, False) - check (Just ms) | B.length ms > 0 = let m = B.head ms in (m `Set.member` legalMessages, m == '+') - | otherwise = (False, False) - legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sFNpPwtghbc12345" ++ slotMessages - slotMessages = "\128\129\130\131\132\133\134\135\136\137\138" - maybeRead :: Read a => String -> Maybe a maybeRead s = case reads s of [(x, rest)] | all isSpace rest -> Just x diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -184,8 +184,8 @@ add_custom_target(${engine_output_name} ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}") IF(NOT APPLE) - add_custom_target(ENGINECLEAN COMMAND ${CMAKE_BUILD_TOOL} "clean" "${PROJECT_BINARY_DIR}" "${hedgewars_SOURCE_DIR}/hedgewars") - add_dependencies(${engine_output_name} ENGINECLEAN) +add_custom_target(ENGINECLEAN COMMAND ${CMAKE_BUILD_TOOL} "clean" "${PROJECT_BINARY_DIR}" "${hedgewars_SOURCE_DIR}/hedgewars") +add_dependencies(${engine_output_name} ENGINECLEAN) ENDIF() install(PROGRAMS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}" DESTINATION ${target_dir}) diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/GSHandlers.inc Sun Oct 16 21:03:30 2011 +0200 @@ -118,7 +118,7 @@ Message := Message and not gmAttack; end; HH^.GearHidden:= HH^.Gear; -HH^.Gear:= nil; +HH^.Gear:= nil end; procedure RestoreHog(HH: PHedgehog); @@ -174,7 +174,7 @@ Gear^.RenderTimer := false; if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then - if Gear^.Kind = gtHedgehog then + if Gear^.Kind = gtHedgehog then begin if Gear^.Hedgehog^.Effects[heResurrectable] then ResurrectHedgehog(Gear) @@ -219,9 +219,8 @@ procedure CheckCollision(Gear: PGear); inline; begin - if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) or TestCollisionYwithGear(Gear, hwSign(Gear^.dY) - ) - then Gear^.State := Gear^.State or gstCollision + if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) or (TestCollisionYwithGear(Gear, hwSign(Gear^.dY)) <> 0) then + Gear^.State := Gear^.State or gstCollision else Gear^.State := Gear^.State and not gstCollision end; @@ -303,6 +302,7 @@ //tmp: QWord; tdX, tdY: hwFloat; collV, collH: LongInt; + land: word; begin // clip velocity at 1.9 - over 1 per pixel, but really shouldn't cause many actual problems. if Gear^.dX.QWordValue > 8160437862 then Gear^.dX.QWordValue:= 8160437862; @@ -320,28 +320,37 @@ if Gear^.dY.isNegative then begin isFalling := true; - if TestCollisionYwithGear(Gear, -1) then + land:= TestCollisionYwithGear(Gear, -1); + if land <> 0 then begin collV := -1; - Gear^.dX := Gear^.dX * Gear^.Friction; + if land and lfIce <> 0 then Gear^.dX := Gear^.dX * (_1 - (_1 - Gear^.Friction) / _10) + else Gear^.dX := Gear^.dX * Gear^.Friction; + Gear^.dY := - Gear^.dY * Gear^.Elasticity; Gear^.State := Gear^.State or gstCollision end - else if (Gear^.AdvBounce=1) and TestCollisionYwithGear(Gear, 1) then collV := 1; + else if (Gear^.AdvBounce=1) and (TestCollisionYwithGear(Gear, 1) <> 0) then collV := 1; end - else if TestCollisionYwithGear(Gear, 1) then + else begin - collV := 1; - isFalling := false; - Gear^.dX := Gear^.dX * Gear^.Friction; - Gear^.dY := - Gear^.dY * Gear^.Elasticity; - Gear^.State := Gear^.State or gstCollision - end - else - begin - isFalling := true; - if (Gear^.AdvBounce=1) and not Gear^.dY.isNegative and TestCollisionYwithGear(Gear, -1) then - collV := -1; + land:= TestCollisionYwithGear(Gear, 1); + if land <> 0 then + begin + collV := 1; + isFalling := false; + if land and lfIce <> 0 then Gear^.dX := Gear^.dX * (_1 - (_1 - Gear^.Friction) / _10) + else Gear^.dX := Gear^.dX * Gear^.Friction; + + Gear^.dY := - Gear^.dY * Gear^.Elasticity; + Gear^.State := Gear^.State or gstCollision + end + else + begin + isFalling := true; + if (Gear^.AdvBounce=1) and not Gear^.dY.isNegative and (TestCollisionYwithGear(Gear, -1) <> 0) then + collV := -1 + end end; @@ -352,7 +361,7 @@ Gear^.dY := Gear^.dY * Gear^.Elasticity; Gear^.State := Gear^.State or gstCollision end - else if (Gear^.AdvBounce=1) and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then + else if (Gear^.AdvBounce=1) and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then collH := -hwSign(Gear^.dX); //if Gear^.AdvBounce and (collV <>0) and (collH <> 0) and (hwSqr(tdX) + hwSqr(tdY) > _0_08) then if (Gear^.AdvBounce=1) and (collV <>0) and (collH <> 0) and ((collV=-1) or ((tdX.QWordValue + @@ -368,7 +377,7 @@ if Gear^.AdvBounce > 1 then dec(Gear^.AdvBounce); - if isFalling then + if isFalling then begin Gear^.dY := Gear^.dY + cGravity; if (GameFlags and gfMoreWind) <> 0 then Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density @@ -398,7 +407,6 @@ var i, x, y: LongInt; dX, dY: hwFloat; - Fire: PGear; vg: PVisualGear; begin AllInactive := false; @@ -443,7 +451,7 @@ begin dX := rndSign(GetRandom * _0_1) + Gear^.dX / 5; dY := (GetRandom - _3) * _0_08; - AddGear(x, y, gtCluster, 0, dX, dY, 25); + FollowGear := AddGear(x, y, gtCluster, 0, dX, dY, 25) end end; gtWatermelon: @@ -455,7 +463,8 @@ begin dX := rndSign(GetRandom * _0_1) + Gear^.dX / 5; dY := (GetRandom - _1_5) * _0_3; - AddGear(x, y, gtMelonPiece, 0, dX, dY, 75)^.DirAngle := i * 60; + FollowGear:= AddGear(x, y, gtMelonPiece, 0, dX, dY, 75); + FollowGear^.DirAngle := i * 60 end end; gtHellishBomb: @@ -468,10 +477,16 @@ begin dX := AngleCos(i * 16) * _0_5 * (GetRandom + _1); dY := AngleSin(i * 16) * _0_5 * (GetRandom + _1); - Fire := AddGear(x, y, gtFlame, 0, dX, dY, 0); - if i mod 2 = 0 then Fire^.State := Fire^.State or gsttmpFlag; - Fire := AddGear(x, y, gtFlame, 0, dX, -dY, 0); - if i mod 2 <> 0 then Fire^.State := Fire^.State or gsttmpFlag; + if i mod 2 = 0 then + begin + AddGear(x, y, gtFlame, gstTmpFlag, dX, dY, 0); + AddGear(x, y, gtFlame, 0, dX, -dY, 0) + end + else + begin + AddGear(x, y, gtFlame, 0, dX, dY, 0); + AddGear(x, y, gtFlame, gstTmpFlag, dX, -dY, 0) + end; end end; gtGasBomb: @@ -481,7 +496,7 @@ begin x:= GetRandom(60); y:= GetRandom(40); - AddGear(hwRound(Gear^.X) - 30 + x, hwRound(Gear^.Y) - 20 + y, gtPoisonCloud, 0, _0, _0, 0); + FollowGear:= AddGear(hwRound(Gear^.X) - 30 + x, hwRound(Gear^.Y) - 20 + y, gtPoisonCloud, 0, _0, _0, 0); end end; end; @@ -509,9 +524,9 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepMolotov(Gear: PGear); var + s: Longword; i, gX, gY: LongInt; dX, dY: hwFloat; - Fire: PGear; smoke, glass: PVisualGear; begin AllInactive := false; @@ -520,8 +535,8 @@ CalcRotationDirAngle(Gear); // let's add some smoke depending on speed - i:= max(32,152 - hwRound(Distance(Gear^.dX,Gear^.dY)*120))+random(10); - if (GameTicks mod i) = 0 then + s:= max(32,152 - hwRound(Distance(Gear^.dX,Gear^.dY)*120))+random(10); + if (GameTicks mod s) = 0 then begin // adjust angle to match the texture if Gear^.dX.isNegative then i:= 130 else i:= 50; @@ -545,7 +560,7 @@ glass^.dY:= -1/(random(4)+5); end;*) glass:= AddVisualGear(gx+random(7)-3, gy+random(7)-3, vgtStraightShot); - if glass <> nil then + if glass <> nil then with glass^ do begin Frame:= 2; @@ -559,18 +574,14 @@ end; end; for i:= 0 to 24 do - begin + begin dX := AngleCos(i * 2) * ((_0_15*(i div 5))) * (GetRandom + _1); dY := AngleSin(i * 8) * _0_5 * (GetRandom + _1); - Fire := AddGear(gX, gY, gtFlame, 0, dX, dY, 0); - Fire^.State := Fire^.State or gsttmpFlag; - Fire := AddGear(gX, gY, gtFlame, 0, dX, -dY, 0); - Fire^.State := Fire^.State or gsttmpFlag; - Fire := AddGear(gX, gY, gtFlame, 0, -dX, dY, 0); - Fire^.State := Fire^.State or gsttmpFlag; - Fire := AddGear(gX, gY, gtFlame, 0, -dX, -dY, 0); - Fire^.State := Fire^.State or gsttmpFlag; - end; + AddGear(gX, gY, gtFlame, gstTmpFlag, dX, dY, 0); + AddGear(gX, gY, gtFlame, gstTmpFlag, dX,-dY, 0); + AddGear(gX, gY, gtFlame, gstTmpFlag,-dX, dY, 0); + AddGear(gX, gY, gtFlame, gstTmpFlag,-dX,-dY, 0); + end; DeleteGear(Gear); exit end; @@ -725,7 +736,7 @@ end end end; -if draw then +if draw then with Gear^ do begin // we've collided with land. draw some stuff and get back into the clouds @@ -883,7 +894,7 @@ for i:= 0 to 31 do begin flower:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); - if flower <> nil then + if flower <> nil then with flower^ do begin Scale:= 0.75; @@ -1239,7 +1250,7 @@ if (Gear^.Timer mod 47) = 0 then begin // ok. this was an attempt to turn off dust if not actually drilling land. I have no idea why it isn't working as expected - if (( (y + 12) and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y + 12, x] > 255) then + if (( (y + 12) and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y + 12, x] > 255) then for i:= 0 to 1 do AddVisualGear(x - 5 + Random(10), y + 12, vgtDust); @@ -1259,7 +1270,7 @@ end; SetAllHHToActive; end; - if TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) <> 0 then begin Gear^.dY := _0; SetLittle(HHGear^.dX); @@ -1428,7 +1439,7 @@ HHGear := Gear^.Hedgehog^.Gear; if ((HHGear^.State and gstHHDriven) = 0) or (CheckGearDrowning(HHGear)) - or TestCollisionYwithGear(HHGear, 1) then + or (TestCollisionYwithGear(HHGear, 1) <> 0) then begin DeleteGear(Gear); isCursorVisible := false; @@ -1440,7 +1451,7 @@ if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); - if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY := _0; + if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then HHGear^.dY := _0; HHGear^.X := HHGear^.X + HHGear^.dX; HHGear^.Y := HHGear^.Y + HHGear^.dY; HHGear^.dY := HHGear^.dY + cGravity; @@ -1503,15 +1514,17 @@ exit end; - if (Gear^.Message and gmLeft <> 0) then HHGear^.dX := HHGear^.dX - _0_0002 - else - if (Gear^.Message and gmRight <> 0) then HHGear^.dX := HHGear^.dX + _0_0002; + if (Gear^.Message and gmLeft <> 0) and not TestCollisionXwithGear(HHGear, -1) then + HHGear^.dX := HHGear^.dX - _0_0002; + + if (Gear^.Message and gmRight <> 0) and not TestCollisionXwithGear(HHGear, 1) then + HHGear^.dX := HHGear^.dX + _0_0002; // vector between hedgehog and rope attaching point ropeDx := HHGear^.X - Gear^.X; ropeDy := HHGear^.Y - Gear^.Y; - if not TestCollisionYwithGear(HHGear, 1) then + if TestCollisionYwithGear(HHGear, 1) = 0 then begin // depending on the rope vector we know which X-side to check for collision @@ -1548,12 +1561,12 @@ if ((Gear^.Message and gmDown) <> 0) and (Gear^.Elasticity < Gear^.Friction) then if not (TestCollisionXwithGear(HHGear, hwSign(ropeDx)) - or TestCollisionYwithGear(HHGear, hwSign(ropeDy))) then + or (TestCollisionYwithGear(HHGear, hwSign(ropeDy)) <> 0)) then Gear^.Elasticity := Gear^.Elasticity + _0_3; if ((Gear^.Message and gmUp) <> 0) and (Gear^.Elasticity > _30) then if not (TestCollisionXwithGear(HHGear, -hwSign(ropeDx)) - or TestCollisionYwithGear(HHGear, -hwSign(ropeDy))) then + or (TestCollisionYwithGear(HHGear, -hwSign(ropeDy)) <> 0)) then Gear^.Elasticity := Gear^.Elasticity - _0_3; HHGear^.X := Gear^.X + mdX * Gear^.Elasticity; @@ -1645,7 +1658,7 @@ HHGear^.dX := -_0_6 * HHGear^.dX; haveCollision := true end; - if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) then + if TestCollisionYwithGear(HHGear, hwSign(HHGear^.dY)) <> 0 then begin HHGear^.dY := -_0_6 * HHGear^.dY; haveCollision := true @@ -1747,12 +1760,12 @@ if (HHGear^.State and gstMoving) <> 0 then begin if TestCollisionXwithGear(HHGear, hwSign(HHGear^.dX)) then SetLittle(HHGear^.dX); - if HHGear^.dY.isNegative and TestCollisionYwithGear(HHGear, -1) then HHGear^.dY := _0; + if HHGear^.dY.isNegative and (TestCollisionYwithGear(HHGear, -1) <> 0) then HHGear^.dY := _0; HHGear^.X := HHGear^.X + HHGear^.dX; Gear^.X := Gear^.X + HHGear^.dX; - if TestCollisionYwithGear(HHGear, 1) then + if TestCollisionYwithGear(HHGear, 1) <> 0 then begin CheckHHDamage(HHGear); HHGear^.dY := _0 @@ -1860,11 +1873,11 @@ doStepFallingGear(Gear); if (Gear^.Health = 0) then begin - if not Gear^.dY.isNegative and (Gear^.dY > _0_2) and TestCollisionYwithGear(Gear, 1) then + if not Gear^.dY.isNegative and (Gear^.dY > _0_2) and (TestCollisionYwithGear(Gear, 1) <> 0) then inc(Gear^.Damage, hwRound(Gear^.dY * _70)) else if not Gear^.dX.isNegative and (Gear^.dX > _0_2) and TestCollisionXwithGear(Gear, 1) then inc(Gear^.Damage, hwRound(Gear^.dX * _70)) - else if Gear^.dY.isNegative and (Gear^.dY < -_0_2) and TestCollisionYwithGear(Gear, -1) then + else if Gear^.dY.isNegative and (Gear^.dY < -_0_2) and (TestCollisionYwithGear(Gear, -1) <> 0) then inc(Gear^.Damage, hwRound(Gear^.dY * -_70)) else if Gear^.dX.isNegative and (Gear^.dX < -_0_2) and TestCollisionXwithGear(Gear, -1) then inc(Gear^.Damage, hwRound(Gear^.dX * -_70)); @@ -1917,14 +1930,14 @@ dec(Gear^.Timer); end else // gsttmpFlag = 0 - if (TurnTimeLeft = 0) or ((GameFlags and gfInfAttack) <> 0) then Gear^.State := Gear^.State or gsttmpFlag; + if (TurnTimeLeft = 0) or ((GameFlags and gfInfAttack <> 0) and (GameTicks > Gear^.FlightTime)) then Gear^.State := Gear^.State or gsttmpFlag; end; //////////////////////////////////////////////////////////////////////////////// procedure doStepSMine(Gear: PGear); begin // TODO: do real calculation? - if TestCollisionXwithGear(Gear, 2) or TestCollisionYwithGear(Gear, -2) or TestCollisionXwithGear(Gear, -2) or TestCollisionYwithGear(Gear, 2) then + if TestCollisionXwithGear(Gear, 2) or (TestCollisionYwithGear(Gear, -2) <> 0) or TestCollisionXwithGear(Gear, -2) or (TestCollisionYwithGear(Gear, 2) <> 0) then begin if (hwAbs(Gear^.dX) > _0) or (hwAbs(Gear^.dY) > _0) then begin @@ -1964,7 +1977,8 @@ end end else // gsttmpFlag = 0 - if TurnTimeLeft = 0 then Gear^.State := Gear^.State or gsttmpFlag; + if (TurnTimeLeft = 0) or ((GameFlags and gfInfAttack <> 0) and (GameTicks > Gear^.FlightTime)) then + Gear^.State := Gear^.State or gsttmpFlag; end; //////////////////////////////////////////////////////////////////////////////// @@ -1996,13 +2010,13 @@ i: LongInt; particle: PVisualGear; begin - if (Gear^.dY.QWordValue = 0) and (Gear^.dY.QWordValue = 0) and not TestCollisionYwithGear(Gear, 1) then SetLittle(Gear^.dY); + if (Gear^.dY.QWordValue = 0) and (Gear^.dY.QWordValue = 0) and (TestCollisionYwithGear(Gear, 1) = 0) then SetLittle(Gear^.dY); Gear^.State := Gear^.State or gstAnimation; if ((Gear^.dX.QWordValue <> 0) or (Gear^.dY.QWordValue <> 0)) then begin DeleteCI(Gear); AllInactive := false; - if not Gear^.dY.isNegative and (Gear^.dY > _0_2) and TestCollisionYwithGear(Gear, 1) then + if not Gear^.dY.isNegative and (Gear^.dY > _0_2) and (TestCollisionYwithGear(Gear, 1) <> 0) then begin Gear^.State := Gear^.State or gsttmpFlag; inc(Gear^.Damage, hwRound(Gear^.dY * _70)); @@ -2016,7 +2030,7 @@ else if not Gear^.dX.isNegative and (Gear^.dX > _0_2) and TestCollisionXwithGear(Gear, 1) then inc(Gear^.Damage, hwRound(Gear^.dX * _70)) - else if Gear^.dY.isNegative and (Gear^.dY < -_0_2) and TestCollisionYwithGear(Gear, -1) + else if Gear^.dY.isNegative and (Gear^.dY < -_0_2) and (TestCollisionYwithGear(Gear, -1) <> 0) then inc(Gear^.Damage, hwRound(Gear^.dY * -_70)) else if Gear^.dX.isNegative and (Gear^.dX < -_0_2) and TestCollisionXwithGear(Gear, -1) @@ -2049,7 +2063,7 @@ if Gear^.dX.QWordValue = 0 then AddGearCI(Gear) end; *) - if not Gear^.dY.isNegative and (Gear^.dY < _0_001) and TestCollisionYwithGear(Gear, 1) then Gear + if not Gear^.dY.isNegative and (Gear^.dY < _0_001) and (TestCollisionYwithGear(Gear, 1) <> 0) then Gear ^.dY := _0; if hwAbs(Gear^.dX) < _0_001 then Gear^.dX := _0; @@ -2127,20 +2141,20 @@ dX := AngleCos(i * 64) * _0_5 * (getrandom + _1); dY := AngleSin(i * 64) * _0_5 * (getrandom + _1); AddGear(x, y, gtFlame, 0, dX, dY, 0); - AddGear(x, y, gtFlame, 0, -dX, -dY, 0)^.State := gsttmpFlag; + AddGear(x, y, gtFlame, gstTmpFlag, -dX, -dY, 0); end end; exit end; - if (Gear^.dY.QWordValue <> 0) or (not TestCollisionYwithGear(Gear, 1)) then + if (Gear^.dY.QWordValue <> 0) or (TestCollisionYwithGear(Gear, 1) = 0) then begin AllInactive := false; Gear^.dY := Gear^.dY + cGravity; Gear^.Y := Gear^.Y + Gear^.dY; if (not Gear^.dY.isNegative) and (Gear^.dY > _0_001) then SetAllHHToActive; - if (Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, -1) then Gear^.dY := _0; - if (not Gear^.dY.isNegative) and TestCollisionYwithGear(Gear, 1) then + if (Gear^.dY.isNegative) and (TestCollisionYwithGear(Gear, -1) <> 0) then Gear^.dY := _0; + if (not Gear^.dY.isNegative) and (TestCollisionYwithGear(Gear, 1) <> 0) then begin if (Gear^.dY > _0_2) and (k = gtExplosives) then inc(Gear^.Damage, hwRound(Gear^.dY * _70)); @@ -2246,7 +2260,7 @@ sticky:= (Gear^.State and gsttmpFlag) <> 0; if not sticky then AllInactive := false; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin AllInactive := false; @@ -2444,7 +2458,7 @@ inc(Gear^.Timer); - if TestCollisionYwithGear(HHGear, 1) + if (TestCollisionYwithGear(HHGear, 1) <> 0) or ((HHGear^.State and gstHHDriven) = 0) or CheckGearDrowning(HHGear) or ((Gear^.Message and gmAttack) <> 0) then @@ -2630,7 +2644,7 @@ HHGear^.X := HHGear^.X + HHGear^.dX; // hedgehog falling to collect cases HHGear^.dY := HHGear^.dY + cGravity; - if TestCollisionYwithGear(HHGear, 1) + if (TestCollisionYwithGear(HHGear, 1) <> 0) or CheckGearDrowning(HHGear) then begin DeleteGear(Gear); @@ -2813,7 +2827,7 @@ if (GameTicks mod 2 = 0) and hasWishes then begin sparkles:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust, 1); - if sparkles <> nil then + if sparkles <> nil then begin sparkles^.Tint:= ((random(210)+45) shl 24) or ((random(210)+45) shl 16) or ((random(210)+45) shl 8) or $FF; sparkles^.Angle:= random * 360; @@ -2854,7 +2868,7 @@ HHGear^.dX, HHGear^.dY, 20 + cHHRadius * 2, - cHHRadius * 2 + 6); + cHHRadius * 2 + 7); upd := 0 end; @@ -2862,21 +2876,22 @@ if Gear^.Health < Gear^.Damage then begin doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound); - for i:= 0 to 31 do - begin - sparkles:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); - if sparkles <> nil then - with sparkles^ do - begin - Tint:= ((random(210)+45) shl 24) or ((random(210)+45) shl 16) or ((random(210)+45) shl 8) or $FF; - Angle:= random * 360; - dx:= 0.001 * (random(200)); - dy:= 0.001 * (random(200)); - if random(2) = 0 then dx := -dx; - if random(2) = 0 then dy := -dy; - FrameTicks:= random(400) + 250 - end; - end; + if hasWishes then + for i:= 0 to 31 do + begin + sparkles:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); + if sparkles <> nil then + with sparkles^ do + begin + Tint:= ((random(210)+45) shl 24) or ((random(210)+45) shl 16) or ((random(210)+45) shl 8) or $FF; + Angle:= random * 360; + dx:= 0.001 * (random(200)); + dy:= 0.001 * (random(200)); + if random(2) = 0 then dx := -dx; + if random(2) = 0 then dy := -dy; + FrameTicks:= random(400) + 250 + end + end; AfterAttack; DeleteGear(Gear); DeleteGear(HHGear); @@ -3003,7 +3018,7 @@ yyn := dirs[(LongInt(Gear^.Angle) + 4 + dA) mod 4].y; if (xx = 0) then - if TestCollisionYwithGear(Gear, yy) then + if TestCollisionYwithGear(Gear, yy) <> 0 then PrevAngle else begin @@ -3080,13 +3095,12 @@ AllInactive := false; Gear^.dY := Gear^.dY + cGravity; - if TestCollisionYwithGear(Gear, 1) then - Gear^.doStep := @doStepCakeUp + if TestCollisionYwithGear(Gear, 1) <> 0 then Gear^.doStep := @doStepCakeUp else - begin + begin Gear^.Y := Gear^.Y + Gear^.dY; if CheckGearDrowning(Gear) then AfterAttack - end + end end; procedure doStepCake(Gear: PGear); @@ -3166,10 +3180,10 @@ PlaySound(sndYoohoo, Gear^.Hedgehog^.Team^.voicepack) end; - if (Gear^.Pos = 14) and (RealTicks and $3 = 0) then + if (Gear^.Pos = 14) and (RealTicks and $3 = 0) then begin heart:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtStraightShot); - if heart <> nil then + if heart <> nil then with heart^ do begin dx:= 0.001 * (random(200)); @@ -3251,11 +3265,10 @@ t := CheckGearsCollision(Gear); //fixes drill not exploding when touching HH bug - if (Gear^.Timer = 0) - or (t^.Count <> 0) - or (not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) - and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX)) - and ((Gear^.State and gsttmpFlag) = 0)) + if (Gear^.Timer = 0) or (t^.Count <> 0) or + ( ((Gear^.State and gsttmpFlag) = 0) and + (TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) = 0) + and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX))) // CheckLandValue returns true if the type isn't matched or not CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y), lfIndestructible) then begin @@ -3268,7 +3281,7 @@ DeleteGear(Gear); exit end - else if not TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX)) then + else if (TestCollisionYWithGear(Gear, hwSign(Gear^.dY)) = 0) and not TestCollisionXWithGear(Gear, hwSign(Gear^.dX)) then begin StopSound(Gear^.SoundChannel); Gear^.Tag := 1; @@ -3567,7 +3580,7 @@ for i:= random(5)+5 downto 0 do begin bubble := AddVisualGear(hwRound(HHGear^.X)+random(8), hwRound(HHGear^.Y) - 8 + random(16), vgtBubble); - if bubble <> nil then + if bubble <> nil then begin bubble^.dX:= (random(10)/10 + 0.02) * -1; if (move.isNegative) then @@ -3622,8 +3635,7 @@ or (cWaterLine + 512 < hwRound(HHGear^.Y)) or (TurnTimeLeft = 0) // allow brief ground touches - to be fair on this, might need another counter - or (((GameTicks and $1FF) = 0) and (not HHGear^.dY.isNegative) and TestCollisionYwithGear( - HHGear, 1)) + or (((GameTicks and $1FF) = 0) and (not HHGear^.dY.isNegative) and (TestCollisionYwithGear(HHGear, 1) <> 0)) or ((Gear^.Message and gmAttack) <> 0) then begin with HHGear^ do @@ -3730,7 +3742,7 @@ end; end; - if HHGear^.Message and (gmUp or gmPrecise or gmLeft or gmRight) <> 0 then + if HHGear^.Message and (gmUp or gmPrecise or gmLeft or gmRight) <> 0 then Gear^.State := Gear^.State and not gsttmpFlag; HHGear^.Message := HHGear^.Message and not (gmUp or gmPrecise or gmLeft or gmRight); HHGear^.State := HHGear^.State or gstMoving; @@ -3747,8 +3759,7 @@ or CheckGearDrowning(HHGear) or (TurnTimeLeft = 0) // allow brief ground touches - to be fair on this, might need another counter - or (((GameTicks and $1FF) = 0) and (not HHGear^.dY.isNegative) and TestCollisionYwithGear( - HHGear, 1)) + or (((GameTicks and $1FF) = 0) and (not HHGear^.dY.isNegative) and (TestCollisionYwithGear(HHGear, 1) <> 0)) or ((Gear^.Message and gmAttack) <> 0) then begin with HHGear^ do @@ -4197,7 +4208,8 @@ iterator:= GearsList; while iterator <> nil do begin - if iterator^.Kind <> gtPortal then + if (iterator^.Kind <> gtPortal) and + ((iterator^.Hedgehog <> CurrentHedgehog) or ((iterator^.Message and gmAllStoppable) = 0)) then begin iterator^.Active:= true; if iterator^.dY.QWordValue = _0.QWordValue then iterator^.dY.isNegative:= false; @@ -4581,7 +4593,6 @@ HHGear: PGear; rx, ry, speed: hwFloat; i, gX, gY: LongInt; - Fire: PGear; begin AllInactive := false; HHGear := Gear^.Hedgehog^.Gear; @@ -4613,15 +4624,14 @@ ry := rndSign(getRandom * _0_1); speed := _0_5 * (_10 / Gear^.Tag); - Fire := AddGear(gx, gy, gtFlame, 0, - SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, - AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); - Fire^.State := Fire^.State or gsttmpFlag; + AddGear(gx, gy, gtFlame, gstTmpFlag, + SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, + AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); - if (Gear^.Health mod 30) = 0 then - Fire := AddGear(gx, gy, gtFlame, 0, - SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, - AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); + if (Gear^.Health mod 30) = 0 then + AddGear(gx, gy, gtFlame, 0, + SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, + AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); end; Gear^.Timer:= Gear^.Tag end; @@ -4660,7 +4670,6 @@ HHGear: PGear; rx, ry, speed: hwFloat; i, gX, gY: LongInt; - Flake: PGear; begin AllInactive := false; HHGear := Gear^.Hedgehog^.Gear; @@ -4691,10 +4700,9 @@ ry := rndSign(getRandom * _0_1); speed := (_3 / Gear^.Tag); - Flake := AddGear(gx, gy, gtFlake, 0, _0, _0, 0); - Flake^.dX:= SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx; - Flake^.dY:= AngleCos(HHGear^.Angle) * ( - speed) + ry; - Flake^.State := Flake^.State or gsttmpFlag; + AddGear(gx, gy, gtFlake, gstTmpFlag, + SignAs(AngleSin(HHGear^.Angle) * speed, HHGear^.dX) + rx, + AngleCos(HHGear^.Angle) * ( - speed) + ry, 0); Gear^.Timer:= Gear^.Tag end; @@ -4807,7 +4815,7 @@ i := hwRound(Gear^.X) - HitGear^.Radius + 2; ei := hwRound(Gear^.X) + HitGear^.Radius - 2; for j := 1 to 4 do DrawExplosion(i - GetRandom(5), hwRound(Gear^.Y) + 6*j, 3); - for j := 1 to 4 do DrawExplosion(ei + GetRandom(5), hwRound(Gear^.Y) + 6*j, 3); + for j := 1 to 4 do DrawExplosion(ei + LongInt(GetRandom(5)), hwRound(Gear^.Y) + 6*j, 3); while i <= ei do begin for j := 1 to 11 do DrawExplosion(i, hwRound(Gear^.Y) + 3*j, 3); @@ -4821,7 +4829,7 @@ Gear^.Y := Gear^.Y + _1_9; end; end; - if TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) <> 0 then begin Gear^.dY := _0; SetLittle(HitGear^.dX); @@ -4887,21 +4895,21 @@ (*DrawCircle(hwRound(Gear^.X), hwRound(Gear^.Y), Gear^.Radius, 1.5, 0, 0, $FF, $FF);*) - if ((Gear^.Message and gmUp) <> 0) then + if ((Gear^.Message and gmUp) <> 0) then begin if (GameTicks and $F) <> 0 then exit; end else if (GameTicks and $1FF) <> 0 then exit; - if Gear^.Power < 45 then + if Gear^.Power < 45 then begin inc(Gear^.Power); - if not TestCollisionYwithGear(hh^.Gear, -1) then hh^.Gear^.Y := hh^.Gear^.Y - _1; + if TestCollisionYwithGear(hh^.Gear, -1) = 0 then hh^.Gear^.Y := hh^.Gear^.Y - _1; end; graves := GearsNear(Gear^.X, Gear^.Y, gtGrave, Gear^.Radius); - if Length(graves) = 0 then + if Length(graves) = 0 then begin StopSound(Gear^.SoundChannel); Gear^.Timer := 250; @@ -4909,7 +4917,7 @@ exit; end; - if ((Gear^.Message and gmAttack) <> 0) and (hh^.Gear^.Health > 0) and (TurnTimeLeft > 0) then + if ((Gear^.Message and gmAttack) <> 0) and (hh^.Gear^.Health > 0) and (TurnTimeLeft > 0) then begin if Length(graves) <= Gear^.Tag then Gear^.Tag:= 0; dec(hh^.Gear^.Health); @@ -5033,7 +5041,7 @@ if CurAmmoGear = Gear then begin - if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then + if (CurrentHedgehog = nil) or (CurrentHedgehog^.Gear = nil) then begin DeleteGear(Gear); exit @@ -5097,7 +5105,6 @@ var HH: PHedgehog; i,j,cnt: LongWord; begin - HH:= Gear^.Hedgehog; if Gear^.Pos = 2 then begin @@ -5108,7 +5115,9 @@ begin AfterAttack; if Gear = CurAmmoGear then CurAmmoGear := nil; - HideHog(HH) + if (HH^.Gear^.Damage = 0) and (HH^.Gear^.Health > 0) and + ((Gear^.State and (gstMoving or gstHHDeath or gstHHGone)) = 0) then + HideHog(HH) end //else if (HH^.Gear <> nil) and (HH^.Gear^.State and gstInvisible <> 0) then else if (HH^.GearHidden <> nil) then// and (HH^.Gear^.State and gstInvisible <> 0) then @@ -5123,19 +5132,19 @@ end end; -if (Gear^.Pos = 1) and (GameTicks and $1F = 0) and (Gear^.Power < 255) then +if (Gear^.Pos = 1) and (GameTicks and $1F = 0) and (Gear^.Power < 255) then begin inc(Gear^.Power); - if (Gear^.Power = 172) and (Gear^.Hedgehog^.Gear <> nil) then - begin - with Gear^.Hedgehog^.Gear^ do + if (Gear^.Power = 172) and (HH^.Gear <> nil) and + (HH^.Gear^.Damage = 0) and (HH^.Gear^.Health > 0) and + ((HH^.Gear^.State and (gstMoving or gstHHDeath or gstHHGone)) = 0) then + with HH^.Gear^ do begin - State:= State or gstAnimation; - Tag:= 2; - Timer:= 0; - Pos:= 0 + State:= State or gstAnimation; + Tag:= 2; + Timer:= 0; + Pos:= 0 end - end end; if (Gear^.Pos = 3) and (GameTicks and $1F = 0) and (Gear^.Power > 0) then dec(Gear^.Power); if (Gear^.Pos = 1) and (Gear^.Power = 255) and ((GameTicks mod 2000) = 1000) then Gear^.Pos:= 2; @@ -5168,7 +5177,7 @@ Gear^.Power:= 0; Gear^.Timer:= 0; if HH^.GearHidden <> nil then FindPlace(HH^.GearHidden, false, 0, LAND_WIDTH,true); - if HH^.GearHidden <> nil then + if HH^.GearHidden <> nil then begin Gear^.X:= HH^.GearHidden^.X; Gear^.Y:= HH^.GearHidden^.Y; @@ -5193,13 +5202,14 @@ 3. Hog is a king *) HH:= Gear^.Hedgehog; + if HH^.Gear <> nil then if (HH^.Gear = nil) or (HH^.King) or (SuddenDeathDmg) then begin - if HH^.Gear <> nil then - begin - HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack; - HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking; - end; + if HH^.Gear <> nil then + begin + HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack; + HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking; + end; PlaySound(sndDenied); DeleteGear(gear); exit @@ -5213,14 +5223,14 @@ HH^.Team^.Clan^.Teams[j]^.Hedgehogs[i].Gear^.Damage) then inc(cnt); if cnt < 2 then begin - if HH^.Gear <> nil then - begin - HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack; - HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking; - end; - PlaySound(sndDenied); - DeleteGear(gear); - exit + if HH^.Gear <> nil then + begin + HH^.Gear^.Message := HH^.Gear^.Message and not gmAttack; + HH^.Gear^.State:= HH^.Gear^.State and not gstAttacking; + end; + PlaySound(sndDenied); + DeleteGear(gear); + exit end; Gear^.SoundChannel := LoopSound(sndTardis); Gear^.doStep:= @doStepTardisWarp diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/HHHandlers.inc --- a/hedgewars/HHHandlers.inc Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/HHHandlers.inc Sun Oct 16 21:03:30 2011 +0200 @@ -373,6 +373,7 @@ amResurrector, amStructure, amTardis: CurAmmoGear:= newGear; end; + if (CurAmmoType = amMine) or (CurAmmoType = amSMine) and (GameFlags and gfInfAttack <> 0) then newGear^.FlightTime:= GameTicks + 1000; if Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0 then begin newGear^.Target.X:= TargetPoint.X; @@ -482,15 +483,16 @@ AllInactive:= false; dec(Gear^.Timer); if (Gear^.Timer mod frametime) = 0 then inc(Gear^.Pos) - end else -if Gear^.Timer = 1 then + end +else if Gear^.Timer = 1 then begin Gear^.State:= Gear^.State or gstNoDamage; doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, CurrentHedgehog, EXPLAutoSound); AddGear(hwRound(Gear^.X), hwRound(Gear^.Y), gtGrave, 0, _0, _0, 0)^.Hedgehog:= Gear^.Hedgehog; DeleteGear(Gear); SetAllToActive - end else // Gear^.Timer = 0 + end +else // Gear^.Timer = 0 begin AllInactive:= false; Gear^.Z:= cCurrHHZ; @@ -637,11 +639,11 @@ begin Gear^.Message:= Gear^.Message and not gmLJump; DeleteCI(Gear); - if not TestCollisionYwithGear(Gear, -1) then + if TestCollisionYwithGear(Gear, -1) = 0 then if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _2 else if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then + or (TestCollisionYwithGear(Gear, -1) <> 0)) then begin Gear^.dY:= -_0_15; if not cArtillery then Gear^.dX:= SignAs(_0_15, Gear^.dX); @@ -684,17 +686,17 @@ if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then begin if not (TestCollisionXwithXYShift(Gear, _0, -6, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -5, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -4, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; end; if (not cArtillery) and ((Gear^.Message and gmPrecise) = 0) and (not TestCollisionXwithGear(Gear, hwSign(Gear^.dX))) then @@ -702,25 +704,25 @@ SetAllHHToActive; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y - _6; Gear^.dY:= _0; @@ -757,7 +759,9 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehogMoving(Gear: PGear); var isFalling, isUnderwater: boolean; + land: Word; begin +land:= 0; isUnderwater:= cWaterLine < hwRound(Gear^.Y) + Gear^.Radius; if Gear^.dX.QWordValue > 8160437862 then Gear^.dX.QWordValue:= 8160437862; if Gear^.dY.QWordValue > 8160437862 then Gear^.dY.QWordValue:= 8160437862; @@ -795,7 +799,8 @@ end else begin - if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_55.QWordValue) + land:= TestCollisionYwithGear(Gear, 1); + if ((Gear^.dX.QWordValue + Gear^.dY.QWordValue) < _0_55.QWordValue) and ((land and lfIce) = 0) and ((Gear^.State and gstHHJumping) <> 0) then SetLittle(Gear^.dX); if not Gear^.dY.isNegative then @@ -809,7 +814,11 @@ Gear^.dY:= _0; end else Gear^.dY:= Gear^.dY + cGravity; - if ((Gear^.State and gstMoving) <> 0) then Gear^.dX:= Gear^.dX * Gear^.Friction + if ((Gear^.State and gstMoving) <> 0) then + begin + if land and lfIce <> 0 then Gear^.dX:= Gear^.dX * (_1 - (_1 - Gear^.Friction) / _2) + else Gear^.dX:= Gear^.dX * Gear^.Friction; + end end; if (Gear^.State <> 0) then DeleteCI(Gear); @@ -872,7 +881,7 @@ if (hwAbs(Gear^.dY) > _0) and (Gear^.FlightTime > 0) and ((GameFlags and gfLowGravity) = 0) then begin - inc(Gear^.FlightTime, 1); + inc(Gear^.FlightTime); if Gear^.FlightTime = 3000 then begin AddCaption(GetEventString(eidHomerun), cWhiteColor, capgrpMessage); @@ -881,6 +890,7 @@ end else begin + uStats.hedgehogFlight(Gear, Gear^.FlightTime); Gear^.FlightTime:= 0; end; @@ -892,11 +902,13 @@ Hedgehog: PHedgehog; begin Hedgehog:= HHGear^.Hedgehog; -if not isInMultiShoot then - AllInactive:= false -else +if isInMultiShoot then HHGear^.Message:= 0; +if ((Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_Utility) <> 0) and isInMultiShoot then + AllInactive:= true +else if not isInMultiShoot then AllInactive:= false; + if (TurnTimeLeft = 0) or (HHGear^.Damage > 0) then begin if TagTurnTimeLeft = 0 then TagTurnTimeLeft:= TurnTimeLeft; @@ -1016,7 +1028,7 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehogFree(Gear: PGear); -var prevState, i: Longword; +var prevState: Longword; begin prevState:= Gear^.State; @@ -1038,35 +1050,24 @@ PrvInactive:= false; AllInactive:= false; - if not Gear^.Hedgehog^.Team^.hasGone then + if (Gear^.State and gstHHGone) = 0 then begin Gear^.Hedgehog^.Effects[hePoisoned] := false; if Gear^.Hedgehog^.Effects[heResurrectable] then begin ResurrectHedgehog(Gear); - end else begin - Gear^.State:= Gear^.State or gstHHDeath; + end else + begin + Gear^.State:= (Gear^.State or gstHHDeath) and not gstAnimation; Gear^.doStep:= @doStepHedgehogDead; // Death message AddCaption(Format(GetEventString(eidDied), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage); - end; + end; end else begin - Gear^.State:= Gear^.State or gstHHGone; + Gear^.State:= Gear^.State and not gstAnimation; Gear^.doStep:= @doStepHedgehogGone; - with Gear^.Hedgehog^.Team^ do - for i:= 0 to cMaxHHIndex do - if Hedgehogs[i].GearHidden <> nil then - begin - RestoreHog(@Hedgehogs[i]); - if Hedgehogs[i].Gear <> nil then - begin - Hedgehogs[i].Gear^.State:= Gear^.State or gstHHGone; - Hedgehogs[i].Gear^.doStep:= @doStepHedgehogGone - end - end; - // Gone message AddCaption(Format(GetEventString(eidGone), Gear^.Hedgehog^.Name), cWhiteColor, capgrpMessage); end @@ -1077,13 +1078,13 @@ if ((Gear^.State and gstWait) = 0) and (prevState <> Gear^.State) then begin - Gear^.State:= gstWait; + Gear^.State:= Gear^.State or gstWait; Gear^.Timer:= 150 end else begin if Gear^.Timer = 0 then begin - Gear^.State:= 0; + Gear^.State:= Gear^.State and not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable); Gear^.Active:= false; AddGearCI(Gear); exit @@ -1095,6 +1096,9 @@ //////////////////////////////////////////////////////////////////////////////// procedure doStepHedgehog(Gear: PGear); +(* +var x,y,tx,ty: LongInt; + tdX, tdY, slope: hwFloat; *) begin if (Gear^.Message and gmDestroy) <> 0 then begin @@ -1107,7 +1111,37 @@ else begin with Gear^.Hedgehog^ do - if Team^.hasGone then TeamGoneEffect(Team^); - doStepHedgehogDriven(Gear) + if Team^.hasGone then + TeamGoneEffect(Team^) + else + doStepHedgehogDriven(Gear) + end; + +if ((GameTicks mod 50) = 0) and (Gear^.State and (gstMoving or gstHHJumping or gstHHHJump) = 0) and ((Gear^.Message and gmAllStoppable) = 0) and + (TestCollisionYwithGear(Gear, 1) and lfIce <> 0) then + begin + if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y)+cHHRadius, lfIce) then + begin + Gear^.dX.QWordValue:= Gear^.dX.QWordValue + cGravity.QWordValue * 75; + Gear^.State:= Gear^.State or gstMoving; + end +(* + // check land slope, and impart a dX based on it + tdX:= Gear^.dX; + tdY:= Gear^.dY; + Gear^.dX:= _0; + Gear^.dY:= _1; + x := hwRound(Gear^.X); + y := hwRound(Gear^.Y); + tx := 0; + ty := 0; + if not CalcSlopeTangent(Gear, x, y+cHHRadius, tx, ty, 255) then + begin + slope:= _1/DistanceI(tx,ty); + AddFileLog(FloatToStr(tdX)+ ' == '+FloatToStr(slope)); + tdX:= tdX + (cGravity * slope / _10) // this will need tuning + end; + Gear^.dX:= tdX; + Gear^.dY:= tdY *) end; end; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/SDLh.pas --- a/hedgewars/SDLh.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/SDLh.pas Sun Oct 16 21:03:30 2011 +0200 @@ -228,6 +228,8 @@ SDL_HWPALETTE = $20000000; SDL_DOUBLEBUF = $40000000; SDL_FULLSCREEN = $80000000; + + SDL_ALLEVENTS = $FFFFFFFF; {$ENDIF} {$IFDEF ENDIAN_LITTLE} @@ -279,9 +281,6 @@ IMG_INIT_TIF = $00000004; {* SDL_EventMask type definition *} -{$IFNDEF SDL13} - SDL_ALLEVENTS = $FFFFFFFF; -{$ENDIF} ///////////////////////////////////////////////////////////////// /////////////////////// TYPE DEFINITIONS /////////////////////// @@ -776,6 +775,7 @@ function SDL_CreateRenderer(window: PSDL_Window; index, flags: LongInt): PSDL_Renderer; cdecl; external SDLLibName; function SDL_DestroyWindow(window: PSDL_Window): LongInt; cdecl; external SDLLibName; function SDL_DestroyRenderer(renderer: PSDL_Renderer): LongInt; cdecl; external SDLLibName; +procedure SDL_SetWindowSize(window: PSDL_Window; w, h: LongInt); cdecl; external SDLLibName; function SDL_GL_CreateContext(window: PSDL_Window): PSDL_GLContext; cdecl; external SDLLibName; procedure SDL_GL_DeleteContext(context: PSDL_GLContext); cdecl; external SDLLibName; @@ -804,7 +804,7 @@ function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; minType, maxType: LongInt): LongInt; cdecl; external SDLLibName; {$ELSE} -function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; mask: LongInt): LongInt; cdecl; external SDLLibName; +function SDL_PeepEvents(event: PSDL_Event; numevents: LongInt; action: SDL_eventaction; mask: Longword): LongInt; cdecl; external SDLLibName; {$ENDIF} function SDL_GetMouseState(x, y: PLongInt): Byte; cdecl; external SDLLibName; @@ -871,8 +871,8 @@ procedure TTF_SetFontStyle(font: PTTF_Font; style: LongInt); cdecl; external SDL_TTFLibName; (* SDL_mixer *) -function Mix_Init(flags: LongInt): LongInt; cdecl; external SDL_MixerLibName; -procedure Mix_Quit; cdecl; external SDL_MixerLibName; +function Mix_Init(flags: LongInt): LongInt; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName;{$ENDIF} +procedure Mix_Quit; {$IFDEF SDL_MIXER_NEWER}cdecl; external SDL_MixerLibName;{$ENDIF} function Mix_OpenAudio(frequency: LongInt; format: Word; channels: LongInt; chunksize: LongInt): LongInt; cdecl; external SDL_MixerLibName; procedure Mix_CloseAudio; cdecl; external SDL_MixerLibName; @@ -903,8 +903,8 @@ function Mix_FadeOutChannel(channel: LongInt; fadems: LongInt): LongInt; cdecl; external SDL_MixerLibName; (* SDL_image *) -function IMG_Init(flags: LongInt): LongInt; cdecl; external SDL_ImageLibName; -procedure IMG_Quit; cdecl; external SDL_ImageLibName; +function IMG_Init(flags: LongInt): LongInt; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName;{$ENDIF} +procedure IMG_Quit; {$IFDEF SDL_IMAGE_NEWER}cdecl; external SDL_ImageLibName;{$ENDIF} function IMG_Load(const _file: PChar): PSDL_Surface; cdecl; external SDL_ImageLibName; function IMG_Load_RW(rwop: PSDL_RWops; freesrc: LongInt): PSDL_Surface; cdecl; external SDL_ImageLibName; @@ -963,13 +963,36 @@ function SDL_MustLock(Surface: PSDL_Surface): Boolean; begin + SDL_MustLock:= {$IFDEF SDL13} - SDL_MustLock:= ((surface^.flags and SDL_RLEACCEL) <> 0) + ((surface^.flags and SDL_RLEACCEL) <> 0) {$ELSE} - SDL_MustLock:= ( surface^.offset <> 0 ) or (( surface^.flags and (SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL)) <> 0) + ( surface^.offset <> 0 ) or (( surface^.flags and (SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL)) <> 0) {$ENDIF} end; +{$IFNDEF SDL_MIXER_NEWER} +function Mix_Init(flags: LongInt): LongInt; +begin + exit(flags); +end; + +procedure Mix_Quit; +begin +end; +{$ENDIF} + +{$IFNDEF SDL_IMAGE_NEWER} +function IMG_Init(flags: LongInt): LongInt; +begin + exit(flags); +end; + +procedure IMG_Quit; +begin +end; +{$ENDIF} + procedure SDLNet_Write16(value: Word; buf: pointer); begin PByteArray(buf)^[1]:= value; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/VGSHandlers.inc --- a/hedgewars/VGSHandlers.inc Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/VGSHandlers.inc Sun Oct 16 21:03:30 2011 +0200 @@ -172,7 +172,10 @@ Gear^.Angle:= round(Gear^.Angle + Steps) mod cMaxAngle; if Gear^.FrameTicks <= Steps then - DeleteVisualGear(Gear) + begin + DeleteVisualGear(Gear); + exit + end else dec(Gear^.FrameTicks, Steps); diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/hwengine.pas Sun Oct 16 21:03:30 2011 +0200 @@ -100,6 +100,7 @@ gsExit: begin isTerminated:= true; end; + gsSuspend: exit; end; {$IFDEF SDL13} @@ -111,18 +112,18 @@ if flagMakeCapture then begin flagMakeCapture:= false; - {$IFNDEF IPHONEOS} s:= 'hw_' + FormatDateTime('YYYY-MM-DD_HH-mm-ss', Now()) + inttostr(GameTicks); playSound(sndShutter); +{$IFNDEF IPHONEOS} if not MakeScreenshot(s) then begin WriteLnToConsole('Screenshot failed.'); AddChatString(#5 + 'screen capture failed (lack of memory or write permissions)'); end else +{$ENDIF} WriteLnToConsole('Screenshot saved: ' + s); - {$ENDIF} end; end; @@ -152,21 +153,21 @@ const event: TSDL_Event = (); {$WARNINGS ON} var PrevTime, CurrTime: Longword; +{$IFDEF SDL13} + previousGameState: TGameState; +{$ELSE} prevFocusState: boolean; +{$ENDIF} begin PrevTime:= SDL_GetTicks; while isTerminated = false do begin SDL_PumpEvents(); - {$IFDEF SDL13} - while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_FIRSTEVENT, SDL_LASTEVENT) > 0 do - {$ELSE} - while SDL_PeepEvents(@event, 1, SDL_GETEVENT, SDL_ALLEVENTS) > 0 do - {$ENDIF} + while SDL_PeepEvents(@event, 1, SDL_GETEVENT, {$IFDEF SDL13}SDL_FIRSTEVENT, SDL_LASTEVENT{$ELSE}SDL_ALLEVENTS{$ENDIF}) > 0 do begin case event.type_ of +{$IFDEF SDL13} SDL_KEYDOWN: if GameState = gsChat then -{$IFDEF SDL13} // sdl on iphone supports only ashii keyboards and the unicode field is deprecated in sdl 1.3 KeyPressChat(event.key.keysym.sym); SDL_WINDOWEVENT: @@ -174,8 +175,24 @@ begin cHasFocus:= true; onFocusStateChanged() + end + else if event.window.event = SDL_WINDOWEVENT_MINIMIZED then + begin + previousGameState:= GameState; + GameState:= gsSuspend; + end + else if event.window.event = SDL_WINDOWEVENT_RESTORED then + begin + GameState:= previousGameState; + end + else if event.window.event = SDL_WINDOWEVENT_RESIZED then + begin + cNewScreenWidth:= max(2 * (event.window.data1 div 2), cMinScreenWidth); + cNewScreenHeight:= max(2 * (event.window.data2 div 2), cMinScreenHeight); + cScreenResizeDelay:= RealTicks+500; end; {$ELSE} + SDL_KEYDOWN: if GameState = gsChat then KeyPressChat(event.key.keysym.unicode); SDL_MOUSEBUTTONDOWN: if event.button.button = SDL_BUTTON_WHEELDOWN then wheelDown:= true; SDL_MOUSEBUTTONUP: if event.button.button = SDL_BUTTON_WHEELUP then wheelUp:= true; @@ -204,6 +221,7 @@ SDL_QUITEV: isTerminated:= true end; //end case event.type_ of end; //end while SDL_PollEvent(@event) <> 0 do + if (cScreenResizeDelay <> 0) and (cScreenResizeDelay < RealTicks) and ((cNewScreenWidth <> cScreenWidth) or (cNewScreenHeight <> cScreenHeight)) then begin cScreenResizeDelay:= 0; @@ -217,25 +235,21 @@ end; if isTerminated = false then - begin + begin CurrTime:= SDL_GetTicks; if PrevTime + longword(cTimerInterval) <= CurrTime then - begin + begin DoTimer(CurrTime - PrevTime); PrevTime:= CurrTime - end + end else SDL_Delay(1); IPCCheckSock(); - end; + end; end; end; /////////////// -{$IFDEF HWLIBRARY} -procedure Game(gameArgs: PPChar); cdecl; export; -{$ELSE} -procedure Game; -{$ENDIF} +procedure Game{$IFDEF HWLIBRARY}(gameArgs: PPChar); cdecl; export{$ENDIF}; var p: TPathType; s: shortstring; i: LongInt; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uAIMisc.pas --- a/hedgewars/uAIMisc.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uAIMisc.pas Sun Oct 16 21:03:30 2011 +0200 @@ -80,7 +80,7 @@ procedure FillTargets; var i, t: Longword; - f, e: Longword; + f, e: LongInt; begin Targets.Count:= 0; f:= 0; @@ -233,7 +233,7 @@ with Targets.ar[i] do begin dmg:= hwRound(_0_01 * cDamageModifier - * min((r + cHHRadius div 2 - DistanceI(Point.x - x, Point.y - y).Round) div 2, r) * cDamagePercent); + * min((r + cHHRadius div 2 - LongInt(DistanceI(Point.x - x, Point.y - y).Round)) div 2, r) * cDamagePercent); if dmg > 0 then begin @@ -332,18 +332,18 @@ bY:= hwRound(Gear^.Y); case JumpType of jmpNone: exit(bRes); - jmpHJump: if not TestCollisionYwithGear(Gear, -1) then + jmpHJump: if TestCollisionYwithGear(Gear, -1) = 0 then begin Gear^.dY:= -_0_2; SetLittle(Gear^.dX); Gear^.State:= Gear^.State or gstMoving or gstHHJumping; end else exit(bRes); jmpLJump: begin - if not TestCollisionYwithGear(Gear, -1) then + if TestCollisionYwithGear(Gear, -1) <> 0 then if not TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - int2hwFloat(2) else if not TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then + or (TestCollisionYwithGear(Gear, -1) <> 0)) then begin Gear^.dY:= -_0_15; Gear^.dX:= SignAs(_0_15, Gear^.dX); @@ -367,9 +367,9 @@ inc(GoInfo.Ticks); Gear^.dY:= Gear^.dY + cGravity; if Gear^.dY > _0_4 then exit(bRes); - if (Gear^.dY.isNegative)and TestCollisionYwithGear(Gear, -1) then Gear^.dY:= _0; + if (Gear^.dY.isNegative)and (TestCollisionYwithGear(Gear, -1) <> 0) then Gear^.dY:= _0; Gear^.Y:= Gear^.Y + Gear^.dY; - if (not Gear^.dY.isNegative)and TestCollisionYwithGear(Gear, 1) then + if (not Gear^.dY.isNegative)and (TestCollisionYwithGear(Gear, 1) <> 0) then begin Gear^.State:= Gear^.State and not (gstMoving or gstHHJumping); Gear^.dY:= _0; @@ -417,7 +417,7 @@ end; Gear^.Y:= Gear^.Y + Gear^.dY; if hwRound(Gear^.Y) > pY then inc(GoInfo.FallPix); - if TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) <> 0 then begin inc(GoInfo.Ticks, 410); Gear^.State:= Gear^.State and not (gstMoving or gstHHJumping); @@ -432,17 +432,17 @@ if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then begin if not (TestCollisionXwithXYShift(Gear, _0, -6, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -5, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -4, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; end; if not TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then @@ -450,25 +450,25 @@ Gear^.X:= Gear^.X + int2hwFloat(hwSign(Gear^.dX)); inc(GoInfo.Ticks, cHHStepTicks) end; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y + _1; - if not TestCollisionYwithGear(Gear, 1) then + if TestCollisionYwithGear(Gear, 1) = 0 then begin Gear^.Y:= Gear^.Y - _6; Gear^.dY:= _0; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uAmmos.pas --- a/hedgewars/uAmmos.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uAmmos.pas Sun Oct 16 21:03:30 2011 +0200 @@ -339,7 +339,8 @@ CurWeapon:= GetAmmoEntry(Hedgehog); if (CurWeapon^.Count = 0) then - SwitchToFirstLegalAmmo(Hedgehog); + SwitchToFirstLegalAmmo(Hedgehog) + else if CurWeapon^.AmmoType = amNothing then Hedgehog.CurAmmoType:= amNothing; CurWeapon:= GetAmmoEntry(Hedgehog); diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uCollisions.pas --- a/hedgewars/uCollisions.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uCollisions.pas Sun Oct 16 21:03:30 2011 +0200 @@ -39,7 +39,7 @@ function CheckGearsCollision(Gear: PGear): PGearArray; function TestCollisionXwithGear(Gear: PGear; Dir: LongInt): boolean; -function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): boolean; +function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): Word; function TestCollisionXKick(Gear: PGear; Dir: LongInt): boolean; function TestCollisionYKick(Gear: PGear; Dir: LongInt): boolean; @@ -51,6 +51,8 @@ function TestCollisionYwithXYShift(Gear: PGear; ShiftX, ShiftY: LongInt; Dir: LongInt; withGear: boolean = true): boolean; function TestRectancleForObstacle(x1, y1, x2, y2: LongInt; landOnly: boolean): boolean; + +function CalcSlopeTangentBelowGear(Gear: PGear; var outDeltaX, outDeltaY: LongInt): boolean; function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): Boolean; implementation @@ -157,7 +159,7 @@ TestCollisionXwithGear:= false end; -function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): boolean; +function TestCollisionYwithGear(Gear: PGear; Dir: LongInt): Word; var x, y, i: LongInt; TestWord: LongWord; begin @@ -181,11 +183,11 @@ i:= x + Gear^.Radius * 2 - 2; repeat if (x and LAND_WIDTH_MASK) = 0 then - if Land[y, x] > TestWord then exit(true); + if Land[y, x] > TestWord then exit(Land[y, x]); inc(x) until (x > i); end; -TestCollisionYwithGear:= false +TestCollisionYwithGear:= 0 end; function TestCollisionXKick(Gear: PGear; Dir: LongInt): boolean; @@ -344,7 +346,7 @@ begin Gear^.X:= Gear^.X + int2hwFloat(ShiftX); Gear^.Y:= Gear^.Y + int2hwFloat(ShiftY); -if withGear then TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir) +if withGear then TestCollisionYwithXYShift:= TestCollisionYwithGear(Gear, Dir) <> 0 else TestCollisionYwithXYShift:= TestCollisionY(Gear, Dir); Gear^.X:= Gear^.X - int2hwFloat(ShiftX); Gear^.Y:= Gear^.Y - int2hwFloat(ShiftY) @@ -387,10 +389,11 @@ function CalcSlopeTangent(Gear: PGear; collisionX, collisionY: LongInt; var outDeltaX, outDeltaY: LongInt; TestWord: LongWord): boolean; var ldx, ldy, rdx, rdy: LongInt; - i, j, mx, my, li, ri, jfr, jto, tmpo : ShortInt; + i, j, k, mx, my, li, ri, jfr, jto, tmpo : ShortInt; tmpx, tmpy: LongWord; dx, dy, s: hwFloat; offset: Array[0..7,0..1] of ShortInt; + isColl: Boolean; begin dx:= Gear^.dX; @@ -418,21 +421,25 @@ offset[i,0]:= mx; offset[i,1]:= my; - tmpx:= collisionX + mx; - tmpy:= collisionY + my; + // multiplicator k tries to skip small pixels/gaps when possible + for k:= 4 downto 1 do + begin + tmpx:= collisionX + k * mx; + tmpy:= collisionY + k * my; - if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) then - if (Land[tmpy,tmpx] > TestWord) then - begin - // remember the index belonging to the first and last collision (if in 1st half) - if (i <> 0) then + if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) then + if (Land[tmpy,tmpx] > TestWord) then begin - if (ri = -1) then - ri:= i - else - li:= i; + // remember the index belonging to the first and last collision (if in 1st half) + if (i <> 0) then + begin + if (ri = -1) then + ri:= i + else + li:= i; + end; end; - end; + end; if i = 7 then break; @@ -457,35 +464,48 @@ jfr:= 8+li+1; jto:= 8+li-1; + isColl:= false; for j:= jfr downto jto do begin tmpo:= j mod 8; - tmpx:= ldx + offset[tmpo,0]; - tmpy:= ldy + offset[tmpo,1]; - if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) - and (Land[tmpy,tmpx] > TestWord) then - begin - ldx:= tmpx; - ldy:= tmpy; - break; - end; + // multiplicator k tries to skip small pixels/gaps when possible + for k:= 3 downto 1 do + begin + tmpx:= ldx + k * offset[tmpo,0]; + tmpy:= ldy + k * offset[tmpo,1]; + if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) + and (Land[tmpy,tmpx] > TestWord) then + begin + ldx:= tmpx; + ldy:= tmpy; + isColl:= true; + break; + end; + end; + if isColl then break; end; jfr:= 8+ri-1; jto:= 8+ri+1; + isColl:= false; for j:= jfr to jto do begin tmpo:= j mod 8; - tmpx:= rdx + offset[tmpo,0]; - tmpy:= rdy + offset[tmpo,1]; - if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) - and (Land[tmpy,tmpx] > TestWord) then - begin - rdx:= tmpx; - rdy:= tmpy; - break; - end; + for k:= 3 downto 1 do + begin + tmpx:= rdx + k * offset[tmpo,0]; + tmpy:= rdy + k * offset[tmpo,1]; + if (((tmpy) and LAND_HEIGHT_MASK) = 0) and (((tmpx) and LAND_WIDTH_MASK) = 0) + and (Land[tmpy,tmpx] > TestWord) then + begin + rdx:= tmpx; + rdy:= tmpy; + isColl:= true; + break; + end; + end; + if isColl then break; end; end; @@ -499,6 +519,51 @@ exit(true); end; +function CalcSlopeTangentBelowGear(Gear: PGear; var outDeltaX, outDeltaY: LongInt): boolean; +var dx, dy: hwFloat; + collX, i, y, x, gx: LongInt; + isColl, succ: Boolean; +begin +// save original dx/dy +dx:= Gear^.dX; +dy:= Gear^.dY; + +Gear^.dX.QWordValue:= 0; +Gear^.dY:= _1; + +y:= hwRound(Gear^.Y) + Gear^.Radius; +gx:= hwRound(Gear^.X); +collX := gx; +isColl:= false; + +if (y and LAND_HEIGHT_MASK) = 0 then + begin + x:= hwRound(Gear^.X) - Gear^.Radius + 1; + i:= x + Gear^.Radius * 2 - 2; + repeat + if (x and LAND_WIDTH_MASK) = 0 then + if Land[y, x] > 255 then + if not isColl or (abs(x-gx) < abs(collX-gx)) then + begin + isColl:= true; + collX := x; + end; + inc(x) + until (x > i); + end; + +if isColl then + succ := CalcSlopeTangent(Gear, collX, y, outDeltaX, outDeltaY, 255) +else + succ := false; + +// restore original dx/dy +Gear^.dX:= dx; +Gear^.dY:= dy; + +CalcSlopeTangentBelowGear := succ; +end; + procedure initModule; begin Count:= 0; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uCommandHandlers.pas --- a/hedgewars/uCommandHandlers.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uCommandHandlers.pas Sun Oct 16 21:03:30 2011 +0200 @@ -451,11 +451,13 @@ procedure chSetMap(var s: shortstring); begin if isDeveloperMode then -begin -UserPathz[ptMapCurrent]:= UserPathz[ptMaps] + '/' + s; -Pathz[ptMapCurrent]:= Pathz[ptMaps] + '/' + s; -InitStepsFlags:= InitStepsFlags or cifMap -end + begin + UserPathz[ptMapCurrent]:= UserPathz[ptMaps] + '/' + s; + Pathz[ptMapCurrent]:= Pathz[ptMaps] + '/' + s; + InitStepsFlags:= InitStepsFlags or cifMap + end; + +ScriptLoad(s) end; procedure chSetTheme(var s: shortstring); diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uConsts.pas Sun Oct 16 21:03:30 2011 +0200 @@ -89,10 +89,12 @@ // To allow these to layer, going to treat them as masks. The bottom byte is reserved for objects // TODO - set lfBasic for all solid land, ensure all uses of the flags can handle multiple flag bits +// lfObject and lfBasic are only to be different *graphically* in all other ways they should be treated the same lfBasic = $8000; // white lfIndestructible = $4000; // red - lfObject = $2000; // no idea - lfDamaged = $1000; // no idea + lfObject = $2000; + lfDamaged = $1000; // + lfIce = $0800; // blue cMaxPower = 1500; cMaxAngle = 2048; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uGears.pas --- a/hedgewars/uGears.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uGears.pas Sun Oct 16 21:03:30 2011 +0200 @@ -602,14 +602,16 @@ Gear^.IntersectGear^.IntersectGear:= nil; end else if Gear^.Kind = gtHedgehog then - if (CurAmmoGear <> nil) and (CurrentHedgehog^.Gear = Gear) then + (* + This behaviour dates back to revision 4, and I accidentally encountered it with TARDIS. I don't think it must apply to any modern weapon, since if it was actually hit, the best the gear could do would be to destroy itself immediately, and you'd still end up with two graves. I believe it should be removed + if (CurAmmoGear <> nil) and (CurrentHedgehog^.Gear = Gear) then begin AttackBar:= 0; Gear^.Message:= gmDestroy; CurAmmoGear^.Message:= gmDestroy; exit end - else + else*) begin if (hwRound(Gear^.Y) >= cWaterLine) then begin @@ -1239,11 +1241,8 @@ cArtillery:= true; if not hasBorder and ((Theme = 'Snow') or (Theme = 'Christmas')) then - begin for i:= 0 to Pred(vobCount*2) do AddGear(GetRandom(LAND_WIDTH+1024)-512, LAND_HEIGHT - GetRandom(LAND_HEIGHT div 2), gtFlake, 0, _0, _0, 0); - //disableLandBack:= true - end end; procedure doMakeExplosion(X, Y, Radius: LongInt; AttackingHog: PHedgehog; Mask: Longword; const Tint: LongWord); @@ -1284,6 +1283,11 @@ case Gear^.Kind of gtHedgehog, gtMine, + gtBall, + gtMelonPiece, + gtGrenade, + gtClusterBomb, + gtCluster, gtSMine, gtCase, gtTarget, @@ -1488,11 +1492,11 @@ if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then begin if not (TestCollisionXwithXYShift(Gear, _0, -3, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -2, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; if not (TestCollisionXwithXYShift(Gear, _0, -1, hwSign(Gear^.dX)) - or TestCollisionYwithGear(Gear, -1)) then Gear^.Y:= Gear^.Y - _1; + or (TestCollisionYwithGear(Gear, -1) <> 0)) then Gear^.Y:= Gear^.Y - _1; end; if (Ammo^.Kind <> gtFlame) or ((Ammo^.State and gsttmpFlag) = 0) then FollowGear:= Gear diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uLand.pas --- a/hedgewars/uLand.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uLand.pas Sun Oct 16 21:03:30 2011 +0200 @@ -1142,34 +1142,50 @@ if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/mask', ifAlpha or ifTransparent or ifIgnoreCaps); end; - if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then - begin - cpX:= (LAND_WIDTH - tmpsurf^.w) div 2; - cpY:= LAND_HEIGHT - tmpsurf^.h; - if SDL_MustLock(tmpsurf) then - SDLTry(SDL_LockSurface(tmpsurf) >= 0, true); + +if (tmpsurf <> nil) and (tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT) and (tmpsurf^.format^.BytesPerPixel = 4) then +begin + disableLandBack:= true; - p:= tmpsurf^.pixels; - for y:= 0 to Pred(tmpsurf^.h) do + cpX:= (LAND_WIDTH - tmpsurf^.w) div 2; + cpY:= LAND_HEIGHT - tmpsurf^.h; + if SDL_MustLock(tmpsurf) then + SDLTry(SDL_LockSurface(tmpsurf) >= 0, true); + + p:= tmpsurf^.pixels; + for y:= 0 to Pred(tmpsurf^.h) do + begin + for x:= 0 to Pred(tmpsurf^.w) do begin - for x:= 0 to Pred(tmpsurf^.w) do - begin - if ((AMask and p^[x]) = 0) then // Tiy was having trouble generating transparent black - Land[cpY + y, cpX + x]:= 0 - else if p^[x] = (AMask or RMask) then - Land[cpY + y, cpX + x]:= lfIndestructible - else if p^[x] = $FFFFFFFF then - Land[cpY + y, cpX + x]:= lfBasic; - end; - p:= @(p^[tmpsurf^.pitch div 4]); + if ((AMask and p^[x]) = 0) then + Land[cpY + y, cpX + x]:= 0 + else if p^[x] = $FFFFFFFF then + Land[cpY + y, cpX + x]:= lfObject + else if p^[x] = (AMask or RMask) then + Land[cpY + y, cpX + x]:= lfIndestructible + else if p^[x] = AMask then + begin + Land[cpY + y, cpX + x]:= lfBasic; + disableLandBack:= false + end + else if p^[x] = (AMask or BMask) then + Land[cpY + y, cpX + x]:= lfObject or lfIce end; + p:= @(p^[tmpsurf^.pitch div 4]); + end; - if SDL_MustLock(tmpsurf) then - SDL_UnlockSurface(tmpsurf); - end; - if (tmpsurf <> nil) then - SDL_FreeSurface(tmpsurf); - tmpsurf:= nil; + if SDL_MustLock(tmpsurf) then + SDL_UnlockSurface(tmpsurf); + if not disableLandBack then + begin + // freed in freeModule() below + LandBackSurface:= LoadImage(UserPathz[ptCurrTheme] + '/LandBackTex', ifIgnoreCaps or ifTransparent); + if LandBackSurface = nil then LandBackSurface:= LoadImage(Pathz[ptCurrTheme] + '/LandBackTex', ifIgnoreCaps or ifTransparent) + end; +end; +if (tmpsurf <> nil) then + SDL_FreeSurface(tmpsurf); +tmpsurf:= nil; end; procedure LoadMap; @@ -1234,16 +1250,16 @@ for w:= 0 to 23 do for x:= leftX to rightX do begin - Land[cWaterLine-1 - w, x]:= lfIndestructible; + Land[Longword(cWaterLine) - 1 - w, x]:= lfIndestructible; if (x + w) mod 32 < 16 then c:= AMask else c:= AMask or RMask or GMask; // FF00FFFF if (cReducedQuality and rqBlurryLand) = 0 then - LandPixels[cWaterLine-1 - w, x]:= c + LandPixels[Longword(cWaterLine) - 1 - w, x]:= c else - LandPixels[(cWaterLine-1 - w) div 2, x div 2]:= c + LandPixels[(Longword(cWaterLine) - 1 - w) div 2, x div 2]:= c end end; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uLandGraphics.pas --- a/hedgewars/uLandGraphics.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uLandGraphics.pas Sun Oct 16 21:03:30 2011 +0200 @@ -47,10 +47,10 @@ function addBgColor(OldColor, NewColor: LongWord): LongWord; // Factor ranges from 0 to 100% NewColor var - oRed, oBlue, oGreen, oAlpha, nRed, nBlue, nGreen, nAlpha: LongWord; + oRed, oBlue, oGreen, oAlpha, nRed, nBlue, nGreen, nAlpha: byte; begin - oAlpha := (OldColor shr AShift) and $FF; - nAlpha := (NewColor shr AShift) and $FF; + oAlpha := (OldColor shr AShift); + nAlpha := (NewColor shr AShift); // shortcircuit if (oAlpha = 0) or (nAlpha = $FF) then begin @@ -58,18 +58,18 @@ exit end; // Get colors - oRed := (OldColor shr RShift) and $FF; - oGreen := (OldColor shr GShift) and $FF; - oBlue := (OldColor shr BShift) and $FF; + oRed := (OldColor shr RShift); + oGreen := (OldColor shr GShift); + oBlue := (OldColor shr BShift); - nRed := (NewColor shr RShift) and $FF; - nGreen := (NewColor shr GShift) and $FF; - nBlue := (NewColor shr BShift) and $FF; + nRed := (NewColor shr RShift); + nGreen := (NewColor shr GShift); + nBlue := (NewColor shr BShift); // Mix colors - nRed := min(255,((nRed*nAlpha) div 255) + ((oRed*oAlpha*(255-nAlpha)) div 65025)); - nGreen := min(255,((nGreen*nAlpha) div 255) + ((oGreen*oAlpha*(255-nAlpha)) div 65025)); - nBlue := min(255,((nBlue*nAlpha) div 255) + ((oBlue*oAlpha*(255-nAlpha)) div 65025)); + nRed := min(255,((nRed*nAlpha) div 255) + ((oRed*oAlpha*byte(255-nAlpha)) div 65025)); + nGreen := min(255,((nGreen*nAlpha) div 255) + ((oGreen*oAlpha*byte(255-nAlpha)) div 65025)); + nBlue := min(255,((nBlue*nAlpha) div 255) + ((oBlue*oAlpha*byte(255-nAlpha)) div 65025)); nAlpha := min(255, oAlpha + nAlpha); addBgColor := (nAlpha shl AShift) or (nRed shl RShift) or (nGreen shl GShift) or (nBlue shl BShift); @@ -180,7 +180,7 @@ t:= y + dy; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do - if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then + if ((Land[t, i] and lfIndestructible) = 0) and (not disableLandBack or (Land[t, i] > 255)) then if (cReducedQuality and rqBlurryLand) = 0 then LandPixels[t, i]:= 0 else @@ -189,7 +189,7 @@ t:= y - dy; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do - if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then + if ((Land[t, i] and lfIndestructible) = 0) and (not disableLandBack or (Land[t, i] > 255)) then if (cReducedQuality and rqBlurryLand) = 0 then LandPixels[t, i]:= 0 else @@ -198,7 +198,7 @@ t:= y + dx; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do - if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then + if ((Land[t, i] and lfIndestructible) = 0) and (not disableLandBack or (Land[t, i] > 255)) then if (cReducedQuality and rqBlurryLand) = 0 then LandPixels[t, i]:= 0 else @@ -207,7 +207,7 @@ t:= y - dx; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do - if (not isMap and ((Land[t, i] and lfIndestructible) = 0)) or ((Land[t, i] and lfBasic) <> 0) then + if ((Land[t, i] and lfIndestructible) = 0) and (not disableLandBack or (Land[t, i] > 255)) then if (cReducedQuality and rqBlurryLand) = 0 then LandPixels[t, i]:= 0 else @@ -223,86 +223,89 @@ t:= y + dy; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do - begin - if (cReducedQuality and rqBlurryLand) = 0 then + if (Land[t, i] and lfIndestructible) = 0 then begin - by:= t; bx:= i; - end - else - begin - by:= t div 2; bx:= i div 2; + if (cReducedQuality and rqBlurryLand) = 0 then + begin + by:= t; bx:= i; + end + else + begin + by:= t div 2; bx:= i div 2; + end; + if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then + begin + inc(cnt); + LandPixels[by, bx]:= LandBackPixel(i, t) + end + else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + LandPixels[by, bx]:= 0 end; - if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then - begin - inc(cnt); - LandPixels[by, bx]:= LandBackPixel(i, t) - end - else - if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then - LandPixels[by, bx]:= 0 - end; t:= y - dy; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do - begin - if (cReducedQuality and rqBlurryLand) = 0 then + if (Land[t, i] and lfIndestructible) = 0 then begin - by:= t; bx:= i; - end - else - begin - by:= t div 2; bx:= i div 2; + if (cReducedQuality and rqBlurryLand) = 0 then + begin + by:= t; bx:= i; + end + else + begin + by:= t div 2; bx:= i div 2; + end; + if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then + begin + inc(cnt); + LandPixels[by, bx]:= LandBackPixel(i, t) + end + else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + LandPixels[by, bx]:= 0 end; - if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then - begin - inc(cnt); - LandPixels[by, bx]:= LandBackPixel(i, t) - end - else if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then - LandPixels[by, bx]:= 0 - end; t:= y + dx; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do - begin - if (cReducedQuality and rqBlurryLand) = 0 then + if (Land[t, i] and lfIndestructible) = 0 then begin - by:= t; bx:= i; - end - else - begin - by:= t div 2; bx:= i div 2; + if (cReducedQuality and rqBlurryLand) = 0 then + begin + by:= t; bx:= i; + end + else + begin + by:= t div 2; bx:= i div 2; + end; + if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then + begin + inc(cnt); + LandPixels[by, bx]:= LandBackPixel(i, t) + end + else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + LandPixels[by, bx]:= 0 end; - if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then - begin - inc(cnt); - LandPixels[by, bx]:= LandBackPixel(i, t) - end - else if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then - LandPixels[by, bx]:= 0 - end; t:= y - dx; if (t and LAND_HEIGHT_MASK) = 0 then for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do - begin - if (cReducedQuality and rqBlurryLand) = 0 then + if (Land[t, i] and lfIndestructible) = 0 then begin - by:= t; bx:= i; - end - else - begin - by:= t div 2; bx:= i div 2; + if (cReducedQuality and rqBlurryLand) = 0 then + begin + by:= t; bx:= i; + end + else + begin + by:= t div 2; bx:= i div 2; + end; + if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then + begin + inc(cnt); + LandPixels[by, bx]:= LandBackPixel(i, t) + end + else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + LandPixels[by, bx]:= 0 end; - if ((Land[t, i] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then - begin - inc(cnt); - LandPixels[by, bx]:= LandBackPixel(i, t) - end - else if ((Land[t, i] and lfObject) <> 0) or (disableLandBack and ((Land[t, i] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then - LandPixels[by, bx]:= 0 - end; FillLandCircleLinesBG:= cnt; end; @@ -455,18 +458,21 @@ for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do for tx:= Max(0, ar^[i].Left - Radius) to Min(LAND_WIDTH, ar^[i].Right + Radius) do begin - if (cReducedQuality and rqBlurryLand) = 0 then - begin - by:= ty; bx:= tx; - end - else + if (Land[ty, tx] and lfIndestructible) = 0 then begin - by:= ty div 2; bx:= tx div 2; - end; - if ((Land[ty, tx] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then - LandPixels[by, bx]:= LandBackPixel(tx, ty) - else if ((Land[ty, tx] and lfObject) <> 0) or (disableLandBack and ((Land[ty, tx] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then - LandPixels[by, bx]:= 0 + if (cReducedQuality and rqBlurryLand) = 0 then + begin + by:= ty; bx:= tx; + end + else + begin + by:= ty div 2; bx:= tx div 2; + end; + if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then + LandPixels[by, bx]:= LandBackPixel(tx, ty) + else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then + LandPixels[by, bx]:= 0 + end end; inc(y, dY) end; @@ -582,11 +588,10 @@ begin by:= ty div 2; bx:= tx div 2; end; - if ((Land[ty, tx] and lfBasic) <> 0) and ((LandPixels[by,bx] and AMask) shr AShift = 255) and not disableLandBack then - LandPixels[by, bx]:= LandBackPixel(tx, ty) - else if ((Land[ty, tx] and lfObject) <> 0) or (disableLandBack and ((Land[ty, tx] and lfIndestructible) = 0)) or ((LandPixels[by,bx] and AMask) shr AShift < 255) then + if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then + LandPixels[by, bx]:= LandBackPixel(tx, ty) + else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then LandPixels[by, bx]:= 0; - Land[ty, tx]:= 0; end end; @@ -647,7 +652,7 @@ end; function TryPlaceOnLand(cpX, cpY: LongInt; Obj: TSprite; Frame: LongInt; doPlace: boolean; indestructible: boolean): boolean; -var X, Y, bpp, h, w, row, col, numFramesFirstCol: LongInt; +var X, Y, bpp, h, w, row, col, gx, gy, numFramesFirstCol: LongInt; p: PByteArray; Image: PSDL_Surface; begin @@ -702,14 +707,25 @@ for x:= 0 to Pred(w) do if PLongword(@(p^[x * 4]))^ <> 0 then begin + if (cReducedQuality and rqBlurryLand) = 0 then + begin + gX:= cpX + x; + gY:= cpY + y; + end + else + begin + gX:= (cpX + x) div 2; + gY:= (cpY + y) div 2; + end; if indestructible then Land[cpY + y, cpX + x]:= lfIndestructible + else if (LandPixels[gY, gX] and AMask) shr AShift = 255 then // This test assumes lfBasic and lfObject differ only graphically + Land[cpY + y, cpX + x]:= lfBasic else Land[cpY + y, cpX + x]:= lfObject; - if (cReducedQuality and rqBlurryLand) = 0 then - LandPixels[cpY + y, cpX + x]:= PLongword(@(p^[x * 4]))^ - else - LandPixels[(cpY + y) div 2, (cpX + x) div 2]:= PLongword(@(p^[x * 4]))^ + // For testing only. Intent is to flag this on objects with masks, or use it for an ice ray gun + if (Theme = 'Snow') or (Theme = 'Christmas') then Land[cpY + y, cpX + x]:= Land[cpY + y, cpX + x] or lfIce; + LandPixels[gY, gX]:= PLongword(@(p^[x * 4]))^ end; p:= @(p^[Image^.pitch]); end; @@ -780,8 +796,8 @@ procedure Smooth(X, Y: LongInt); begin // a bit of AA for explosions -if (Land[Y, X] = 0) and (Y > topY+1) and - (Y < LAND_HEIGHT-2) and (X>leftX+1) and (X LongInt(topY) + 1) and + (Y < LAND_HEIGHT-2) and (X > LongInt(leftX) + 1) and (X < LongInt(rightX) - 1) then begin if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) or (((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then @@ -824,6 +840,33 @@ else Land[y,x]:= lfBasic end end +else if ((cReducedQuality and rqBlurryLand) = 0) and + ((Land[Y, X] and (lfDamaged or lfBasic) = lfBasic) or (Land[Y, X] and (lfDamaged or lfBasic) = lfBasic)) and + (Y > LongInt(topY) + 1) and (Y < LAND_HEIGHT-2) and (X > LongInt(leftX) + 1) and (X < LongInt(rightX) - 1) then + begin + if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0)) or + (((Land[y, x+1] and lfDamaged) <> 0) and (((Land[y-1,x] and lfDamaged) <> 0) or ((Land[y+1,x] and lfDamaged) <> 0)))) then + begin + LandPixels[y,x]:= + (((((LandPixels[y,x] and RMask shr RShift) div 2)+((cExplosionBorderColor and RMask) shr RShift) div 2) and $FF) shl RShift) or + (((((LandPixels[y,x] and GMask shr GShift) div 2)+((cExplosionBorderColor and GMask) shr GShift) div 2) and $FF) shl GShift) or + (((((LandPixels[y,x] and BMask shr BShift) div 2)+((cExplosionBorderColor and BMask) shr BShift) div 2) and $FF) shl BShift) or ($FF shl AShift) + end + else if ((((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) or + (((Land[y, x-1] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) or + (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y+2,x] and lfDamaged) <> 0)) or + (((Land[y, x+1] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y-2,x] and lfDamaged) <> 0)) or + (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) or + (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x+1] and lfDamaged) <> 0) and ((Land[y,x+2] and lfDamaged) <> 0)) or + (((Land[y+1, x] and lfDamaged) <> 0) and ((Land[y+1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0)) or + (((Land[y-1, x] and lfDamaged) <> 0) and ((Land[y-1,x-1] and lfDamaged) <> 0) and ((Land[y,x-2] and lfDamaged) <> 0))) then + begin + LandPixels[y,x]:= + (((((LandPixels[y,x] and RMask shr RShift) * 3 div 4)+((cExplosionBorderColor and RMask) shr RShift) div 4) and $FF) shl RShift) or + (((((LandPixels[y,x] and GMask shr GShift) * 3 div 4)+((cExplosionBorderColor and GMask) shr GShift) div 4) and $FF) shl GShift) or + (((((LandPixels[y,x] and BMask shr BShift) * 3 div 4)+((cExplosionBorderColor and BMask) shr BShift) div 4) and $FF) shl BShift) or ($FF shl AShift) + end + end end; function SweepDirty: boolean; @@ -902,12 +945,12 @@ // Return true if outside of land or not the value tested, used right now for some X/Y movement that does not use normal hedgehog movement in GSHandlers.inc -function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; +function CheckLandValue(X, Y: LongInt; LandFlag: Word): boolean; inline; begin CheckLandValue:= ((X and LAND_WIDTH_MASK <> 0) or (Y and LAND_HEIGHT_MASK <> 0)) or ((Land[Y, X] and LandFlag) = 0) end; -function LandBackPixel(x, y: LongInt): LongWord; +function LandBackPixel(x, y: LongInt): LongWord; inline; var p: PLongWordArray; begin if LandBackSurface = nil then LandBackPixel:= 0 diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uLandObjects.pas Sun Oct 16 21:03:30 2011 +0200 @@ -25,7 +25,7 @@ procedure AddObjects(); procedure FreeLandObjects(); procedure LoadThemeConfig; -procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); +procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; extraFlags: Word = 0); procedure AddOnLandObjects(Surface: PSDL_Surface); implementation @@ -66,7 +66,7 @@ SprayObjects: TSprayObjects; -procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface); +procedure BlitImageAndGenerateCollisionInfo(cpX, cpY, Width: Longword; Image: PSDL_Surface; extraFlags: Word = 0); var p: PLongwordArray; x, y: Longword; bpp: LongInt; @@ -96,8 +96,12 @@ if LandPixels[(cpY + y) div 2, (cpX + x) div 2] = 0 then LandPixels[(cpY + y) div 2, (cpX + x) div 2]:= p^[x]; + if ((Land[cpY + y, cpX + x] and $FF00) = 0) and ((p^[x] and AMask) <> 0) then - Land[cpY + y, cpX + x]:= lfObject + begin + Land[cpY + y, cpX + x]:= lfObject; + Land[cpY + y, cpX + x]:= Land[cpY + y, cpX + x] or extraFlags + end; end; p:= @(p^[Image^.pitch shr 2]) end; @@ -204,7 +208,11 @@ rr.x:= x1; while rr.x < x2 do begin - BlitImageAndGenerateCollisionInfo(rr.x, y, min(x2 - rr.x, tmpsurf^.w), tmpsurf); + // For testing only. Intent is to flag this on objects with masks, or use it for an ice ray gun + if (Theme = 'Snow') or (Theme = 'Christmas') then + BlitImageAndGenerateCollisionInfo(rr.x, y, min(x2 - rr.x, tmpsurf^.w), tmpsurf, lfIce) + else + BlitImageAndGenerateCollisionInfo(rr.x, y, min(x2 - rr.x, tmpsurf^.w), tmpsurf); inc(rr.x, tmpsurf^.w); end; SDL_FreeSurface(tmpsurf); diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uScript.pas --- a/hedgewars/uScript.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uScript.pas Sun Oct 16 21:03:30 2011 +0200 @@ -957,8 +957,12 @@ end else lua_pushinteger(L, 0) end - else LuaError('Lua: Wrong number of parameters passed to GetAmmoCount!'); - lc_getammocount:= 0 + else + begin + LuaError('Lua: Wrong number of parameters passed to GetAmmoCount!'); + lua_pushnil(L) + end; + lc_getammocount:= 1 end; function lc_sethealth(L : Plua_State) : LongInt; Cdecl; @@ -1207,6 +1211,11 @@ lua_pushinteger(L, hwRound(gear^.X)); lua_pushinteger(L, hwRound(gear^.Y)) end + else + begin + lua_pushnil(L); + lua_pushnil(L) + end; end; lc_getgearposition:= 2; end; @@ -1586,6 +1595,7 @@ exit; // push game variables so they may be modified by the script +ScriptSetInteger('BorderColor', cExplosionBorderColor); ScriptSetInteger('GameFlags', GameFlags); ScriptSetString('Seed', cSeed); ScriptSetInteger('TemplateFilter', cTemplateFilter); @@ -1664,6 +1674,8 @@ begin s:= UserPathz[ptData] + '/' + name; if not FileExists(s) then s:= Pathz[ptData] + '/' + name; +if not FileExists(s) then exit; + ret:= luaL_loadfile(luaState, Str2PChar(s)); if ret <> 0 then begin @@ -1783,7 +1795,8 @@ procedure ScriptSetAmmo(ammo : TAmmoType; count, propability, delay, reinforcement: Byte); begin -if (ord(ammo) < 1) or (count > 9) or (count < 0) or (propability < 0) or (propability > 8) or (delay < 0) or (delay > 9) or (reinforcement < 0) or (reinforcement > 8) then +//if (ord(ammo) < 1) or (count > 9) or (count < 0) or (propability < 0) or (propability > 8) or (delay < 0) or (delay > 9) or (reinforcement < 0) or (reinforcement > 8) then +if (ord(ammo) < 1) or (count > 9) or (propability > 8) or (delay > 9) or (reinforcement > 8) then exit; ScriptAmmoLoadout[ord(ammo)]:= inttostr(count)[1]; ScriptAmmoProbability[ord(ammo)]:= inttostr(propability)[1]; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uSound.pas --- a/hedgewars/uSound.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uSound.pas Sun Oct 16 21:03:30 2011 +0200 @@ -157,11 +157,9 @@ if isSoundEnabled then isSoundEnabled:= Mix_OpenAudio(44100, $8010, channels, 1024) = 0; -{$IFDEF SDL_MIXER_NEWER} WriteToConsole('Init SDL_mixer... '); SDLTry(Mix_Init(MIX_INIT_OGG) <> 0, true); WriteLnToConsole(msgOK); -{$ENDIF} if isSoundEnabled then WriteLnToConsole(msgOK) @@ -191,11 +189,9 @@ if Mus <> nil then Mix_FreeMusic(Mus); -{$IFDEF SDL_MIXER_NEWER} // make sure all instances of sdl_mixer are unloaded before continuing while Mix_Init(0) <> 0 do Mix_Quit(); -{$ENDIF} Mix_CloseAudio(); end; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uStats.pas --- a/hedgewars/uStats.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uStats.pas Sun Oct 16 21:03:30 2011 +0200 @@ -33,6 +33,7 @@ procedure Skipped; procedure TurnReaction; procedure SendStats; +procedure hedgehogFlight(Gear: PGear; time: Longword); implementation uses uSound, uLocale, uVariables, uUtils, uIO, uCaptions, uDebug, uMisc; @@ -175,6 +176,17 @@ AmmoDamagingUsed:= AmmoDamagingUsed or Ammoz[am].isDamaging end; +procedure hedgehogFlight(Gear: PGear; time: Longword); +begin +if time > 4000 then + begin + writeln('FLIGHT'); + writeln(Gear^.Hedgehog^.Team^.TeamName); + writeln(time); + writeln; + end +end; + procedure SendStats; var i, t: LongInt; msd, msk: Longword; msdhh, mskhh: PHedgehog; @@ -270,9 +282,10 @@ writeln('WINNERS'); for t:= 0 to winnersClan^.TeamsNumber - 1 do writeln(winnersClan^.Teams[t]^.TeamName); - writeln; end else writeln('DRAW'); + +writeln; end; procedure initModule; diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uStore.pas --- a/hedgewars/uStore.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uStore.pas Sun Oct 16 21:03:30 2011 +0200 @@ -399,10 +399,7 @@ end; AddProgress; - -{$IFDEF SDL_IMAGE_NEWER} IMG_Quit(); -{$ENDIF} end; procedure StoreRelease(reload: boolean); @@ -587,7 +584,11 @@ procedure SetupOpenGL; //var vendor: shortstring = ''; +var buf: array[byte] of char; begin + buf[0]:= char(0); // avoid compiler hint + AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf))) + ')'); + {$IFDEF SDL13} // this function creates an opengles1.1 context by default on mobile devices // use SDL_GL_SetAttribute to change this behaviour @@ -945,40 +946,32 @@ procedure chFullScr(var s: shortstring); var flags: Longword = 0; - ico: PSDL_Surface; - buf: array[byte] of char; - reinit: boolean; + reinit: boolean = false; + {$IFNDEF DARWIN}ico: PSDL_Surface;{$ENDIF} {$IFDEF SDL13}x, y: LongInt;{$ENDIF} begin if Length(s) = 0 then cFullScreen:= not cFullScreen else cFullScreen:= s = '1'; - buf[0]:= char(0); // avoid compiler hint AddFileLog('Preparing to change video parameters...'); - - reinit:= false; +{$IFNDEF IPHONEOS} if SDLPrimSurface = nil then begin // set window title SDL_WM_SetCaption('Hedgewars', nil); -{$IFDEF SDL_IMAGE_NEWER} WriteToConsole('Init SDL_image... '); SDLTry(IMG_Init(IMG_INIT_PNG) <> 0, true); WriteLnToConsole(msgOK); -{$ENDIF} // load engine icon -{$IFDEF DARWIN} - ico:= LoadImage(UserPathz[ptGraphics] + '/hwengine_mac', ifIgnoreCaps); - if ico = nil then ico:= LoadImage(Pathz[ptGraphics] + '/hwengine_mac', ifIgnoreCaps); -{$ELSE} +{$IFNDEF DARWIN} ico:= LoadImage(UserPathz[ptGraphics] + '/hwengine', ifIgnoreCaps); if ico = nil then ico:= LoadImage(Pathz[ptGraphics] + '/hwengine', ifIgnoreCaps); -{$ENDIF} if ico <> nil then begin SDL_WM_SetIcon(ico, 0); SDL_FreeSurface(ico) end; +{$ENDIF} end else begin @@ -990,6 +983,7 @@ SDL_FreeSurface(SDLPrimSurface); SDLPrimSurface:= nil; end; +{$ENDIF} // these attributes must be set up before creating the sdl window {$IFNDEF WIN32} @@ -1014,8 +1008,9 @@ flags:= flags or SDL_WINDOW_BORDERLESS or SDL_WINDOW_RESIZABLE; {$ENDIF} - if cFullScreen then SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cOrigScreenWidth, cOrigScreenHeight, flags or SDL_WINDOW_FULLSCREEN) - else SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cScreenWidth, cScreenHeight, flags); + if SDLwindow = nil then + if cFullScreen then SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cOrigScreenWidth, cOrigScreenHeight, flags or SDL_WINDOW_FULLSCREEN) + else SDLwindow:= SDL_CreateWindow('Hedgewars', x, y, cScreenWidth, cScreenHeight, flags); SDLTry(SDLwindow <> nil, true); {$ELSE} flags:= SDL_OPENGL or SDL_RESIZABLE; @@ -1034,7 +1029,6 @@ end; {$ENDIF} - AddFileLog('Setting up OpenGL (using driver: ' + shortstring(SDL_VideoDriverName(buf, sizeof(buf))) + ')'); SetupOpenGL(); if reinit then begin diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uTeams.pas Sun Oct 16 21:03:30 2011 +0200 @@ -427,11 +427,17 @@ with Team do for i:= 0 to cMaxHHIndex do with Hedgehogs[i] do + begin + if Hedgehogs[i].GearHidden <> nil then + RestoreHog(@Hedgehogs[i]); + if Gear <> nil then begin Gear^.Invulnerable:= false; - Gear^.Damage:= Gear^.Health + Gear^.Damage:= Gear^.Health; + Gear^.State:= (Gear^.State or gstHHGone) and not gstHHDriven end + end end; procedure chAddHH(var id: shortstring); diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uVariables.pas Sun Oct 16 21:03:30 2011 +0200 @@ -345,7 +345,7 @@ Width: 254; Height: 101; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAirplane (FileName: 'amAirplane'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 64; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmAirplane - (FileName: 'amGirder'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; + (FileName: 'amGirder'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil; Width: 160; Height:160; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprAmGirder (FileName: 'hhMask'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil; Width: 32; Height: 32; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHHTelepMask diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uVisualGears.pas Sun Oct 16 21:03:30 2011 +0200 @@ -768,7 +768,7 @@ begin if (cReducedQuality and rqKillFlakes) <> 0 then exit; -if ((GameFlags and gfBorder) <> 0) or ((Theme <> 'Snow') and (Theme <> 'Christmas')) then +if hasBorder or ((Theme <> 'Snow') and (Theme <> 'Christmas')) then for i:= 0 to Pred(vobCount * cScreenSpace div LAND_WIDTH) do AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake) else diff -r 74431bf4c632 -r 4e8816cf9459 hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Sun Oct 16 19:02:48 2011 +0200 +++ b/hedgewars/uWorld.pas Sun Oct 16 21:03:30 2011 +0200 @@ -1197,7 +1197,7 @@ else begin CursorPoint.X:= (prevPoint.X * 7 + hwRound(FollowGear^.X) + hwSign(FollowGear^.dX) * z + WorldDx) div 8; - if isPhone() then + if isPhone() or (cScreenHeight < 600) or ((hwSign(FollowGear^.dY) * z) < 10) then CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + WorldDy)) div 8 else CursorPoint.Y:= (prevPoint.Y * 7 + cScreenHeight - (hwRound(FollowGear^.Y) + hwSign(FollowGear^.dY) * z + WorldDy)) div 8; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/AboutViewController.m --- a/project_files/HedgewarsMobile/Classes/AboutViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/AboutViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "AboutViewController.h" -#import "CommodityFunctions.h" + @implementation AboutViewController @synthesize tableView, segmentedControl, people; @@ -50,12 +50,12 @@ } -(IBAction) buttonPressed:(id) sender { - playSound(@"backSound"); + [AudioManagerController playBackSound]; [[self parentViewController] dismissModalViewControllerAnimated:YES]; } -(IBAction) segmentedControlChanged:(id) sender { - playSound(@"clickSound"); + [AudioManagerController playClickSound]; [self.tableView setContentOffset:CGPointMake(0, 0) animated:NO]; [self.tableView reloadData]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/AboutViewController.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/AboutViewController.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,658 @@ + + + + 1024 + 10F569 + 804 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 123 + + + YES + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 290 + + YES + + + 292 + {{127, 7}, {289, 30}} + + NO + IBIPadFramework + 2 + 5 + 0 + + YES + Code + Art + Sound + Locale + Special + + + YES + + + + + + + + YES + + + + + + + + YES + {0, 0} + {0, 0} + {0, 0} + {0, 0} + {0, 0} + + + YES + + + + + + + + + {543, 44} + + IBIPadFramework + + YES + + + + IBIPadFramework + 1 + + 0 + + + IBIPadFramework + + + + + + 274 + {{0, 44}, {543, 577}} + + + 1 + MCAwIDAgMAA + + YES + IBIPadFramework + YES + 1 + 2 + 0 + YES + 44 + 10 + 10 + + + {543, 621} + + 3 + MQA + + NO + NO + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + buttonPressed: + + + + 8 + + + + dataSource + + + + 12 + + + + delegate + + + + 13 + + + + tableView + + + + 14 + + + + segmentedControlChanged: + + + 13 + + 15 + + + + segmentedControl + + + + 16 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + 5 + + + YES + + + + + + 6 + + + YES + + + + + + + 7 + + + + + 10 + + + + + 11 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 10.IBPluginDependency + 11.IBPluginDependency + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 5.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + + + YES + AboutViewController + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{376, 170}, {543, 621}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 16 + + + + YES + + AboutViewController + UIViewController + + YES + + YES + buttonPressed: + segmentedControlChanged: + + + YES + id + id + + + + YES + + YES + buttonPressed: + segmentedControlChanged: + + + YES + + buttonPressed: + id + + + segmentedControlChanged: + id + + + + + YES + + YES + segmentedControl + tableView + + + YES + UISegmentedControl + UITableView + + + + YES + + YES + segmentedControl + tableView + + + YES + + segmentedControl + UISegmentedControl + + + tableView + UITableView + + + + + IBProjectSource + Classes/AboutViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UINavigationBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UINavigationBar.h + + + + UINavigationItem + NSObject + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISegmentedControl + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISegmentedControl.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + 123 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/AmmoMenuViewController.m --- a/project_files/HedgewarsMobile/Classes/AmmoMenuViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/AmmoMenuViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -21,9 +21,7 @@ #import "AmmoMenuViewController.h" #import -#import "CommodityFunctions.h" -#import "UIImageExtra.h" -#import "PascalImports.h" + #define BTNS_PER_ROW 9 #define DEFAULT_DESCRIPTION IS_IPAD() ? \ @@ -92,7 +90,7 @@ int y = (HW_getNumberOfWeapons()/BTNS_PER_ROW)*44 + 18; UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(x, y, 200, 20)]; name.backgroundColor = [UIColor clearColor]; - name.textColor = UICOLOR_HW_YELLOW_BODER; + name.textColor = [UIColor darkYellowColor]; name.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]]; self.nameLabel = name; [self.view addSubview:self.nameLabel]; @@ -152,14 +150,14 @@ UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; button.frame = CGRectMake(x, y, 40, 40); button.tag = i; - button.layer.borderColor = [UICOLOR_HW_YELLOW_TEXT CGColor]; + button.layer.borderColor = [[UIColor lightYellowColor] CGColor]; button.layer.borderWidth = w; [button.layer setCornerRadius:radius]; [button.layer setMasksToBounds:YES]; [button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventTouchDown]; [button addTarget:self action:@selector(buttonReleased:) forControlEvents:UIControlEventTouchUpInside]; [button addTarget:self action:@selector(buttonCancelled:) forControlEvents:UIControlEventTouchUpOutside|UIControlEventTouchCancel]; - [button setTitleColor:UICOLOR_HW_YELLOW_TEXT forState:UIControlStateNormal]; + [button setTitleColor:[UIColor lightYellowColor] forState:UIControlStateNormal]; button.titleLabel.backgroundColor = [UIColor blackColor]; button.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont smallSystemFontSize]]; [button.titleLabel.layer setCornerRadius:3]; @@ -169,9 +167,9 @@ [self.view addSubview:button]; [array addObject:button]; - int size = 32*getScreenScale(); - int x_src = ((i*size)/(int)(ammoStoreImage.size.height*getScreenScale()))*size; - int y_src = (i*size)%(int)(ammoStoreImage.size.height*getScreenScale()); + int size = 32 * [[UIScreen mainScreen] scale]; + int x_src = ((i*size)/(int)(ammoStoreImage.size.height * [[UIScreen mainScreen] scale]))*size; + int y_src = (i*size)%(int)(ammoStoreImage.size.height * [[UIScreen mainScreen] scale]); UIImage *img = [ammoStoreImage cutAt:CGRectMake(x_src, y_src, size, size)]; [imgs addObject:img]; } @@ -221,7 +219,7 @@ shouldUpdateImage[i] = YES; } } else { - button.layer.borderColor = [UICOLOR_HW_YELLOW_TEXT CGColor]; + button.layer.borderColor = [[UIColor lightYellowColor] CGColor]; [button setTitle:nil forState:UIControlStateNormal]; if (button.currentBackgroundImage == nil || shouldUpdateImage[i] == YES) { UIImage *img = [self.imagesArray objectAtIndex:i]; @@ -297,7 +295,7 @@ if (theButton.currentTitle == nil) { HW_setWeapon(theButton.tag); - playSound(@"clickSound"); + [AudioManagerController playClickSound]; if (IS_DUALHEAD() == NO) [self disappear]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/Appirater.m --- a/project_files/HedgewarsMobile/Classes/Appirater.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/Appirater.m Sun Oct 16 21:03:30 2011 +0200 @@ -37,7 +37,7 @@ #import "Appirater.h" #import #import -#import "CommodityFunctions.h" +#import "ServerSetup.h" NSString *const kAppiraterLaunchDate = @"kAppiraterLaunchDate"; NSString *const kAppiraterLaunchCount = @"kAppiraterLaunchCount"; @@ -106,7 +106,7 @@ launchCount > LAUNCHES_UNTIL_PROMPT && !declinedToRate && !ratedApp) { - if (isNetworkReachable()) { // check if they can reach the app store + if ([ServerSetup isNetworkReachable]) { // check if they can reach the app store willShowPrompt = YES; [self performSelectorOnMainThread:@selector(showPrompt) withObject:nil waitUntilDone:NO]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/AudioManagerController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/AudioManagerController.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,39 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 23/09/2011. + */ + + +#import + + +@interface AudioManagerController : NSObject { + +} + ++(void) playBackgroundMusic; ++(void) pauseBackgroundMusic; ++(void) stopBackgroundMusic; + ++(void) playClickSound; ++(void) playBackSound; ++(void) playSelectSound; + ++(void) cleanupMemory; + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/AudioManagerController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/AudioManagerController.m Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,120 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 23/09/2011. + */ + + +#import "AudioManagerController.h" +#import "AVFoundation/AVAudioPlayer.h" +#import + + +static AVAudioPlayer *backgroundMusic = nil; +static SystemSoundID clickSound = -1; +static SystemSoundID backSound = -1; +static SystemSoundID selSound = -1; + +@implementation AudioManagerController + +#pragma mark - +#pragma mark background music control ++(void) loadBackgroundMusic { + NSString *musicString = [[NSBundle mainBundle] pathForResource:@"hwclassic" ofType:@"mp3"]; + backgroundMusic = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:musicString] error:nil]; + + backgroundMusic.delegate = nil; + backgroundMusic.volume = 0.4f; + backgroundMusic.numberOfLoops = -1; + [backgroundMusic prepareToPlay]; +} + ++(void) playBackgroundMusic { + if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"music"] boolValue] == NO) + return; + + if (backgroundMusic == nil) + [AudioManagerController loadBackgroundMusic]; + + [backgroundMusic play]; +} + ++(void) pauseBackgroundMusic { + [backgroundMusic pause]; +} + ++(void) stopBackgroundMusic { + [backgroundMusic stop]; +} + +#pragma mark - +#pragma mark sound effects control ++(SystemSoundID) loadSound:(NSString *)snd { + // get the filename of the sound file: + NSString *path = [NSString stringWithFormat:@"%@/%@",[[NSBundle mainBundle] resourcePath],snd]; + + // declare a system sound id and get a URL for the sound file + SystemSoundID soundID; + NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; + + // use audio sevices to create and play the sound + AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); + return soundID; +} + ++(void) playClickSound { + if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"sound"] boolValue] == NO) + return; + + if (clickSound == -1) + clickSound = [AudioManagerController loadSound:@"clickSound.wav"]; + + AudioServicesPlaySystemSound(clickSound); +} + ++(void) playBackSound { + if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"sound"] boolValue] == NO) + return; + + if (backSound == -1) + backSound = [AudioManagerController loadSound:@"backSound.wav"]; + + AudioServicesPlaySystemSound(backSound); +} + ++(void) playSelectSound { + if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"sound"] boolValue] == NO) + return; + + if (selSound == -1) + selSound = [AudioManagerController loadSound:@"selSound.wav"]; + + AudioServicesPlaySystemSound(selSound); +} + +#pragma mark - +#pragma mark memory management ++(void) cleanupMemory { + [backgroundMusic stop]; + [backgroundMusic release], backgroundMusic = nil; + AudioServicesDisposeSystemSoundID(clickSound), clickSound = -1; + AudioServicesDisposeSystemSoundID(backSound), backSound = -1; + AudioServicesDisposeSystemSoundID(selSound), selSound = -1; + MSG_MEMCLEAN(); +} + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/CommodityFunctions.h --- a/project_files/HedgewarsMobile/Classes/CommodityFunctions.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,84 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2010 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 08/04/2010. - */ - - -#import - -#define DOCUMENTS_FOLDER() [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] - -#define DEBUG_FILE() [DOCUMENTS_FOLDER() stringByAppendingString:@"/hw-game.log"] -#define BASICFLAGS_FILE() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Settings/basicFlags.plist"] -#define GAMEMODS_FILE() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Settings/gameMods.plist"] -#define CREDITS_FILE() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Settings/credits.plist"] - -#define TEAMS_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Teams/"] -#define WEAPONS_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Weapons/"] -#define SCHEMES_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Schemes/"] -#define SAVES_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Saves/"] - -#define GRAPHICS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/"] -#define ICONS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Icons/"] -#define HATS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Hats/"] -#define GRAVES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Graves/"] -#define FLAGS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Flags/"] -#define FORTS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Forts/"] -#define VOICES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Sounds/voices/"] -#define THEMES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Themes/"] -#define MAPS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Maps/"] -#define MISSIONS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Missions/Maps/"] -#define LOCALE_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Locale/"] -#define SCRIPTS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Scripts/plist/"] - -#define MSG_MEMCLEAN() DLog(@"has cleaned up some memory"); -#define MSG_DIDUNLOAD() DLog(@"unloaded"); - -#define UICOLOR_HW_YELLOW_BODER [UIColor colorWithRed:(CGFloat)0xFE/255 green:(CGFloat)0xC0/255 blue:0 alpha:1] -#define UICOLOR_HW_YELLOW_TEXT [UIColor colorWithRed:(CGFloat)0xF0/255 green:(CGFloat)0xD0/255 blue:0 alpha:1] -#define UICOLOR_HW_DARKBLUE [UIColor colorWithRed:(CGFloat)0x0F/255 green:0 blue:(CGFloat)0x42/255 alpha:1] -#define UICOLOR_HW_ALPHABLUE [UIColor colorWithRed:(CGFloat)0x0F/255 green:0 blue:(CGFloat)0x42/255 alpha:0.58f] -#define UICOLOR_HW_ALMOSTBLACK (IS_NOT_POWERFUL(getModelType())) ? [UIColor blackColor] : [UIColor colorWithRed:0 green:0 blue:0 alpha:0.6] - -#define IS_DUALHEAD() ([[UIScreen class] respondsToSelector:@selector(screens)] && [[UIScreen screens] count] > 1) -#define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) -#define IS_NOT_POWERFUL(x) ([x hasPrefix:@"iPhone1"] || [x hasPrefix:@"iPod1,1"] || [x hasPrefix:@"iPod2,1"]) -#define IS_NOT_VERY_POWERFUL(x) ([x hasPrefix:@"iPad1"] || [x hasPrefix:@"iPhone2"] || [x hasPrefix:@"iPod3"] || [x hasPrefix:@"iPod4"]) -#define IS_VERY_POWERFUL(x) (IS_NOT_POWERFUL(x) == NO && IS_NOT_VERY_POWERFUL(x) == NO) - -#define UIVIEW_HW_SDLVIEW [[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] - -void print_free_memory (void); -void playSound (NSString *snd); -NSInteger randomPort (void); - -NSString *getModelType (void); -NSArray *getAvailableColors (void); - -UILabel *createBlueLabel (NSString *title, CGRect frame); -UILabel *createLabelWithParams (NSString *title, CGRect frame, CGFloat borderWidth, UIColor *borderColor, UIColor *backgroundColor); - -CGSize PSPNGSizeFromMetaData (NSString *aFileName); -BOOL isNetworkReachable (void); - -@interface NSString (extra) - --(NSString *) MD5hash; - -@end - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/CommodityFunctions.m --- a/project_files/HedgewarsMobile/Classes/CommodityFunctions.m Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,223 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2010 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 08/04/2010. - */ - - -#import "CommodityFunctions.h" -#import -#import -#import -#import -#import -#import -#import -#import -#import -#import "PascalImports.h" -#import "hwconsts.h" - - -NSInteger inline randomPort () { - srandom(time(NULL)); - NSInteger res = (random() % 64511) + 1024; - return (res == NETGAME_DEFAULT_PORT) ? randomPort() : res; -} - -// by http://landonf.bikemonkey.org/code/iphone/Determining_Available_Memory.20081203.html -void print_free_memory () { -#ifdef DEBUG - mach_port_t host_port; - mach_msg_type_number_t host_size; - vm_size_t pagesize; - - host_port = mach_host_self(); - host_size = sizeof(vm_statistics_data_t) / sizeof(integer_t); - host_page_size(host_port, &pagesize); - - vm_statistics_data_t vm_stat; - - if (host_statistics(host_port, HOST_VM_INFO, (host_info_t)&vm_stat, &host_size) != KERN_SUCCESS) - DLog(@"Failed to fetch vm statistics"); - - /* Stats in bytes */ - natural_t mem_used = (vm_stat.active_count + vm_stat.inactive_count + vm_stat.wire_count) * pagesize; - natural_t mem_free = vm_stat.free_count * pagesize; - natural_t mem_total = mem_used + mem_free; - DLog(@"used: %u free: %u total: %u", mem_used, mem_free, mem_total); -#endif -} - -NSString *getModelType () { - size_t size; - // set 'oldp' parameter to NULL to get the size of the data returned so we can allocate appropriate amount of space - sysctlbyname("hw.machine", NULL, &size, NULL, 0); - char *name = (char *)malloc(sizeof(char) * size); - // get the platform name - sysctlbyname("hw.machine", name, &size, NULL, 0); - NSString *modelId = [NSString stringWithUTF8String:name]; - free(name); - - return modelId; -} - -void playSound (NSString *snd) { - if ([[[NSUserDefaults standardUserDefaults] objectForKey:@"sound"] boolValue] == YES) { - // get the filename of the sound file: - NSString *path = [NSString stringWithFormat:@"%@/%@.wav",[[NSBundle mainBundle] resourcePath],snd]; - - // declare a system sound id and get a URL for the sound file - SystemSoundID soundID; - NSURL *filePath = [NSURL fileURLWithPath:path isDirectory:NO]; - - // use audio sevices to create and play the sound - AudioServicesCreateSystemSoundID((CFURLRef)filePath, &soundID); - AudioServicesPlaySystemSound(soundID); - } -} - -NSArray *getAvailableColors (void) { - // by default colors are ARGB but we do computation over RGB, hence we have to "& 0x00FFFFFF" before processing - unsigned int colors[] = HW_TEAMCOLOR_ARRAY; - NSMutableArray *array = [[NSMutableArray alloc] init]; - - int i = 0; - while(colors[i] != 0) - [array addObject:[NSNumber numberWithUnsignedInt:(colors[i++] & 0x00FFFFFF)]]; - - NSArray *final = [NSArray arrayWithArray:array]; - [array release]; - return final; -} - -UILabel *createBlueLabel (NSString *title, CGRect frame) { - return createLabelWithParams(title, frame, 1.5f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_DARKBLUE); -} - -UILabel *createLabelWithParams (NSString *title, CGRect frame, CGFloat borderWidth, UIColor *borderColor, UIColor *backgroundColor) { - UILabel *theLabel = [[UILabel alloc] initWithFrame:frame]; - theLabel.backgroundColor = backgroundColor; - - if (title != nil) { - theLabel.text = title; - theLabel.textColor = UICOLOR_HW_YELLOW_TEXT; - theLabel.textAlignment = UITextAlignmentCenter; - theLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]*80/100]; - } - - [theLabel.layer setBorderWidth:borderWidth]; - [theLabel.layer setBorderColor:borderColor.CGColor]; - [theLabel.layer setCornerRadius:8.0f]; - [theLabel.layer setMasksToBounds:YES]; - - return theLabel; -} - -BOOL isNetworkReachable (void) { - // Create zero addy - struct sockaddr_in zeroAddress; - bzero(&zeroAddress, sizeof(zeroAddress)); - zeroAddress.sin_len = sizeof(zeroAddress); - zeroAddress.sin_family = AF_INET; - - // Recover reachability flags - SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); - SCNetworkReachabilityFlags flags; - - BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); - CFRelease(defaultRouteReachability); - - if (!didRetrieveFlags) { - NSLog(@"Error. Could not recover network reachability flags"); - return NO; - } - - BOOL isReachable = flags & kSCNetworkFlagsReachable; - BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; - BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; - - NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"]; - NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL - cachePolicy:NSURLRequestReloadIgnoringLocalCacheData - timeoutInterval:20.0]; - NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:nil]; - BOOL testResult = testConnection ? YES : NO; - [testConnection release]; - - return ((isReachable && !needsConnection) || nonWiFi) ? testResult : NO; -} - -// this routine checks for the PNG size without loading it in memory -// https://github.com/steipete/PSFramework/blob/master/PSFramework%20Version%200.3/PhotoshopFramework/PSMetaDataFunctions.m -CGSize PSPNGSizeFromMetaData (NSString *aFileName) { - // File Name to C String. - const char *fileName = [aFileName UTF8String]; - // source file - FILE *infile = fopen(fileName, "rb"); - if (infile == NULL) { - DLog(@"Can't open the file: %@", aFileName); - return CGSizeZero; - } - - // Bytes Buffer. - unsigned char buffer[30]; - // Grab Only First Bytes. - fread(buffer, 1, 30, infile); - // Close File. - fclose(infile); - - // PNG Signature. - unsigned char png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; - - // Compare File signature. - if ((int)(memcmp(&buffer[0], &png_signature[0], 8))) { - DLog(@"The file (%@) is not a PNG file", aFileName); - return CGSizeZero; - } - - // Calc Sizes. Isolate only four bytes of each size (width, height). - int width[4]; - int height[4]; - for (int d = 16; d < (16 + 4); d++) { - width[d-16] = buffer[d]; - height[d-16] = buffer[d+4]; - } - - // Convert bytes to Long (Integer) - long resultWidth = (width[0] << (int)24) | (width[1] << (int)16) | (width[2] << (int)8) | width[3]; - long resultHeight = (height[0] << (int)24) | (height[1] << (int)16) | (height[2] << (int)8) | height[3]; - - // Return Size. - return CGSizeMake(resultWidth,resultHeight); -} - -@implementation NSString (extra) - --(NSString *)MD5hash { - const char *cStr = [self UTF8String]; - unsigned char result[16]; - CC_MD5( cStr, strlen(cStr), result ); - return [NSString stringWithFormat: - @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", - result[0], result[1], result[2], result[3], result[4], result[5], - result[6], result[7], result[8], result[9], result[10], result[11], - result[12], result[13], result[14], result[15]]; -} - - -@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/CreationChamber.h --- a/project_files/HedgewarsMobile/Classes/CreationChamber.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/CreationChamber.h Sun Oct 16 21:03:30 2011 +0200 @@ -21,7 +21,21 @@ #import -void createSettings (void); -void createTeamNamed (NSString *nameWithoutExt); -void createWeaponNamed (NSString *nameWithoutExt, int type); -void createSchemeNamed (NSString *nameWithoutExt, int type); +@interface CreationChamber : NSObject { + +} + ++(void) createSettings; + ++(void) createTeamNamed:(NSString *)nameWithoutExt; ++(void) createTeamNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type; ++(void) createTeamNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type controlledByAI:(BOOL) shouldAITakeOver; + ++(void) createWeaponNamed:(NSString *)nameWithoutExt; ++(void) createWeaponNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type; + ++(void) createSchemeNamed:(NSString *)nameWithoutExt; ++(void) createSchemeNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type; + +@end + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/CreationChamber.m --- a/project_files/HedgewarsMobile/Classes/CreationChamber.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/CreationChamber.m Sun Oct 16 21:03:30 2011 +0200 @@ -22,7 +22,11 @@ #import "CreationChamber.h" #import "hwconsts.h" -void createSettings () { + +@implementation CreationChamber + +#pragma mark Settings ++(void) createSettings { NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; [settings setObject:[NSNumber numberWithBool:NO] forKey:@"alternate"]; [settings setObject:[NSNumber numberWithBool:YES] forKey:@"music"]; @@ -39,7 +43,16 @@ [settings synchronize]; } -void createTeamNamed (NSString *nameWithoutExt) { +#pragma mark Teams ++(void) createTeamNamed:(NSString *)nameWithoutExt { + [CreationChamber createTeamNamed:nameWithoutExt ofType:0 controlledByAI:NO]; +} + ++(void) createTeamNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type { + [CreationChamber createTeamNamed:nameWithoutExt ofType:type controlledByAI:NO]; +} + ++(void) createTeamNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type controlledByAI:(BOOL) shouldAITakeOver { NSString *teamsDirectory = TEAMS_DIRECTORY(); if (![[NSFileManager defaultManager] fileExistsAtPath: teamsDirectory]) { @@ -49,26 +62,68 @@ error:NULL]; } - NSMutableArray *hedgehogs = [[NSMutableArray alloc] initWithCapacity: HW_getMaxNumberOfHogs()]; + NSArray *customNames; + NSArray *customHats; + NSString *flag, *grave, *voicepack, *fort; + switch (type) { + default: // default + customNames = [[NSArray alloc] initWithObjects:@"No Name",@"Unnamed",@"Anonymous",@"Nameless",@"Incognito",@"Unidentified", + @"Uknown",@"Secret",nil]; + customHats = [[NSArray alloc] initWithObjects:@"NoHat",@"NoHat",@"NoHat",@"NoHat",@"NoHat",@"NoHat",@"NoHat",@"NoHat",nil]; + flag = @"hedgewars"; + grave = @"Statue"; + voicepack = @"Default"; + fort = @"Plane"; + break; + case 1: // ninjas + customNames = [[NSArray alloc] initWithObjects:@"Shinobi",@"Ukemi",@"Godai",@"Ninpo",@"Tatsujin",@"Arashi",@"Bushi",@"Itami",nil]; + customHats = [[NSArray alloc] initWithObjects:@"NinjaFull",@"NinjaStraight",@"NinjaTriangle",@"NinjaFull",@"NinjaStraight", + @"NinjaTriangle",@"NinjaFull",@"NinjaTriangle",nil]; + flag = @"japan"; + grave = @"bp2"; + voicepack = @"Singer"; + fort = @"Wood"; + break; + case 2: // pirates + customNames = [[NSArray alloc] initWithObjects:@"Toothless Wayne",@"Long-nose Kidd",@"Eye-patch Jim",@"Rackham Blood",@"One-eyed Ayee", + @"Dirty Ben",@"Morris",@"Cruise Seymour",nil]; + customHats = [[NSArray alloc] initWithObjects:@"pirate_jack_bandana",@"pirate_jack",@"dwarf",@"pirate_jack_bandana",@"pirate_jack", + @"dwarf",@"pirate_jack_bandana",@"pirate_jack",nil]; + flag = @"cm_pirate"; + grave = @"chest"; + voicepack = @"Pirate"; + fort = @"Hydrant"; + break; + case 3: // robots + customNames = [[NSArray alloc] initWithObjects:@"HAL",@"R2-D2",@"Wall-E",@"Robocop",@"Optimus Prime",@"Terminator",@"C-3PO",@"KITT",nil]; + customHats = [[NSArray alloc] initWithObjects:@"cyborg1",@"cyborg2",@"cyborg1",@"cyborg2",@"cyborg1",@"cyborg2",@"cyborg1", + @"cyborg2",nil]; + flag = @"cm_binary"; + grave = @"Rip"; + voicepack = @"Robot"; + fort = @"UFO"; + break; + } + NSMutableArray *hedgehogs = [[NSMutableArray alloc] initWithCapacity:HW_getMaxNumberOfHogs()]; for (int i = 0; i < HW_getMaxNumberOfHogs(); i++) { - NSString *hogName = [[NSString alloc] initWithFormat:@"hedgehog %d",i]; NSDictionary *hog = [[NSDictionary alloc] initWithObjectsAndKeys: - [NSNumber numberWithInt:0],@"level", - hogName,@"hogname", - @"NoHat",@"hat", + [NSNumber numberWithInt:(shouldAITakeOver ? 4 : 0)],@"level", + [customNames objectAtIndex:i],@"hogname", + [customHats objectAtIndex:i],@"hat", nil]; - [hogName release]; [hedgehogs addObject:hog]; [hog release]; } + [customHats release]; + [customNames release]; NSDictionary *theTeam = [[NSDictionary alloc] initWithObjectsAndKeys: @"0",@"hash", - @"Statue",@"grave", - @"Plane",@"fort", - @"Default",@"voicepack", - @"hedgewars",@"flag", + grave,@"grave", + fort,@"fort", + voicepack,@"voicepack", + flag,@"flag", hedgehogs,@"hedgehogs", nil]; [hedgehogs release]; @@ -80,7 +135,12 @@ [theTeam release]; } -void createWeaponNamed (NSString *nameWithoutExt, int type) { +#pragma mark Weapons ++(void) createWeaponNamed:(NSString *)nameWithoutExt { + [CreationChamber createWeaponNamed:nameWithoutExt ofType:0]; +} + ++(void) createWeaponNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type { NSString *weaponsDirectory = WEAPONS_DIRECTORY(); if (![[NSFileManager defaultManager] fileExistsAtPath: weaponsDirectory]) { @@ -99,37 +159,37 @@ delay = [[NSString alloc] initWithBytes:AMMOLINE_DEFAULT_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_DEFAULT_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; - case 1: //crazy + case 1: //crazy qt = [[NSString alloc] initWithBytes:AMMOLINE_CRAZY_QT length:ammolineSize encoding:NSUTF8StringEncoding]; prob = [[NSString alloc] initWithBytes:AMMOLINE_CRAZY_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; delay = [[NSString alloc] initWithBytes:AMMOLINE_CRAZY_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_CRAZY_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; - case 2: //pro mode + case 2: //pro mode qt = [[NSString alloc] initWithBytes:AMMOLINE_PROMODE_QT length:ammolineSize encoding:NSUTF8StringEncoding]; prob = [[NSString alloc] initWithBytes:AMMOLINE_PROMODE_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; delay = [[NSString alloc] initWithBytes:AMMOLINE_PROMODE_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_PROMODE_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; - case 3: //shoppa + case 3: //shoppa qt = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPA_QT length:ammolineSize encoding:NSUTF8StringEncoding]; prob = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPA_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; delay = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPA_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_SHOPPA_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; - case 4: //clean slate + case 4: //clean slate qt = [[NSString alloc] initWithBytes:AMMOLINE_CLEAN_QT length:ammolineSize encoding:NSUTF8StringEncoding]; prob = [[NSString alloc] initWithBytes:AMMOLINE_CLEAN_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; delay = [[NSString alloc] initWithBytes:AMMOLINE_CLEAN_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_CLEAN_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; - case 5: //minefield + case 5: //minefield qt = [[NSString alloc] initWithBytes:AMMOLINE_MINES_QT length:ammolineSize encoding:NSUTF8StringEncoding]; prob = [[NSString alloc] initWithBytes:AMMOLINE_MINES_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; delay = [[NSString alloc] initWithBytes:AMMOLINE_MINES_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; crate = [[NSString alloc] initWithBytes:AMMOLINE_MINES_CRATE length:ammolineSize encoding:NSUTF8StringEncoding]; break; - case 6: //thinking with portals + case 6: //thinking with portals qt = [[NSString alloc] initWithBytes:AMMOLINE_PORTALS_QT length:ammolineSize encoding:NSUTF8StringEncoding]; prob = [[NSString alloc] initWithBytes:AMMOLINE_PORTALS_PROB length:ammolineSize encoding:NSUTF8StringEncoding]; delay = [[NSString alloc] initWithBytes:AMMOLINE_PORTALS_DELAY length:ammolineSize encoding:NSUTF8StringEncoding]; @@ -150,7 +210,12 @@ [theWeapon release]; } -void createSchemeNamed (NSString *nameWithoutExt, int type) { +#pragma mark Schemes ++(void) createSchemeNamed:(NSString *)nameWithoutExt { + [CreationChamber createSchemeNamed:nameWithoutExt ofType:0]; +} + ++(void) createSchemeNamed:(NSString *)nameWithoutExt ofType:(NSInteger) type { NSString *schemesDirectory = SCHEMES_DIRECTORY(); if (![[NSFileManager defaultManager] fileExistsAtPath: schemesDirectory]) { @@ -174,17 +239,17 @@ [mods release]; switch (type) { - case 0: // default + default: // default [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; break; - case 1: // pro mode + case 1: // pro mode [basicArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:15]]; [basicArray replaceObjectAtIndex:7 withObject:[NSNumber numberWithInt:0]]; [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:0]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:14 withObject:[NSNumber numberWithBool:YES]]; break; - case 2: // shoppa + case 2: // shoppa [basicArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:30]]; [basicArray replaceObjectAtIndex:3 withObject:[NSNumber numberWithInt:50]]; [basicArray replaceObjectAtIndex:7 withObject:[NSNumber numberWithInt:1]]; @@ -199,13 +264,13 @@ [gamemodArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:19 withObject:[NSNumber numberWithBool:YES]]; break; - case 3: // clean slate + case 3: // clean slate [gamemodArray replaceObjectAtIndex:6 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:18 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:19 withObject:[NSNumber numberWithBool:YES]]; break; - case 4: // minefield + case 4: // minefield [basicArray replaceObjectAtIndex:0 withObject:[NSNumber numberWithInt:50]]; [basicArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:30]]; [basicArray replaceObjectAtIndex:7 withObject:[NSNumber numberWithInt:0]]; @@ -216,7 +281,7 @@ [gamemodArray replaceObjectAtIndex:14 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithBool:YES]]; break; - case 5: // barrel mayhem + case 5: // barrel mayhem [basicArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:30]]; [basicArray replaceObjectAtIndex:7 withObject:[NSNumber numberWithInt:0]]; [basicArray replaceObjectAtIndex:10 withObject:[NSNumber numberWithInt:0]]; @@ -225,7 +290,7 @@ [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:14 withObject:[NSNumber numberWithBool:YES]]; break; - case 6: // tunnel hogs + case 6: // tunnel hogs [basicArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:30]]; [basicArray replaceObjectAtIndex:9 withObject:[NSNumber numberWithInt:3]]; [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:10]]; @@ -237,7 +302,7 @@ [gamemodArray replaceObjectAtIndex:15 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:16 withObject:[NSNumber numberWithBool:YES]]; break; - case 7: // fort mode + case 7: // fort mode [basicArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithInt:0]]; [basicArray replaceObjectAtIndex:13 withObject:[NSNumber numberWithInt:0]]; [gamemodArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithBool:YES]]; @@ -245,7 +310,7 @@ [gamemodArray replaceObjectAtIndex:10 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; break; - case 8: // timeless + case 8: // timeless [basicArray replaceObjectAtIndex:2 withObject:[NSNumber numberWithInt:100]]; [basicArray replaceObjectAtIndex:4 withObject:[NSNumber numberWithInt:0]]; [basicArray replaceObjectAtIndex:5 withObject:[NSNumber numberWithInt:0]]; @@ -256,7 +321,7 @@ [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:20 withObject:[NSNumber numberWithBool:YES]]; break; - case 9: // thinking with portals + case 9: // thinking with portals [basicArray replaceObjectAtIndex:7 withObject:[NSNumber numberWithInt:2]]; [basicArray replaceObjectAtIndex:8 withObject:[NSNumber numberWithInt:25]]; [basicArray replaceObjectAtIndex:10 withObject:[NSNumber numberWithInt:4]]; @@ -265,13 +330,10 @@ [gamemodArray replaceObjectAtIndex:9 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; break; - case 10:// king mode + case 10: // king mode [gamemodArray replaceObjectAtIndex:11 withObject:[NSNumber numberWithBool:YES]]; [gamemodArray replaceObjectAtIndex:12 withObject:[NSNumber numberWithBool:YES]]; break; - default: - DLog(@"Impossible"); - break; } NSMutableDictionary *theScheme = [[NSMutableDictionary alloc] initWithObjectsAndKeys: @@ -287,3 +349,5 @@ [schemeFile release]; [theScheme release]; } + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/DefinesAndMacros.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/DefinesAndMacros.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,83 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2010 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 01/10/2011. + */ + + +// some macros by http://www.cimgf.com/2010/05/02/my-current-prefix-pch-file/ +// and http://blog.coriolis.ch/2009/01/05/macros-for-xcode/ + + +#ifdef DEBUG + #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) + #define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__] + #define releaseAndNil(x) [x release] +#else + #define DLog(...) do { } while (0) + #ifndef NS_BLOCK_ASSERTIONS + #define NS_BLOCK_ASSERTIONS + #endif + #define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) + #define releaseAndNil(x) [x release], x = nil +#endif + + +#define ZAssert(condition, ...) do { if (!(condition)) { ALog(__VA_ARGS__); }} while(0) +#define rotationManager(x) (x == UIInterfaceOrientationLandscapeRight) || (x == UIInterfaceOrientationLandscapeLeft) + +#define START_TIMER NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; +#define END_TIMER(msg) NSTimeInterval stop = [NSDate timeIntervalSinceReferenceDate]; CMLog([NSString stringWithFormat:@"%@ Time = %f", msg, stop-start]); + + +#define DOCUMENTS_FOLDER() [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] + +#define DEBUG_FILE() [DOCUMENTS_FOLDER() stringByAppendingString:@"/hw-game.log"] +#define BASICFLAGS_FILE() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/basicFlags.plist"] +#define GAMEMODS_FILE() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/gameMods.plist"] +#define CREDITS_FILE() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/credits.plist"] + +#define TEAMS_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Teams/"] +#define WEAPONS_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Weapons/"] +#define SCHEMES_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Schemes/"] +#define SAVES_DIRECTORY() [DOCUMENTS_FOLDER() stringByAppendingString:@"/Saves/"] + +#define GRAPHICS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/"] +#define ICONS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Icons/"] +#define HATS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Hats/"] +#define GRAVES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Graves/"] +#define FLAGS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Graphics/Flags/"] +#define FORTS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Forts/"] +#define VOICES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Sounds/voices/"] +#define THEMES_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Themes/"] +#define MAPS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Maps/"] +#define MISSIONS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Missions/Maps/"] +#define TRAININGS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Missions/Training/"] +#define LOCALE_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Locale/"] +#define SCRIPTS_DIRECTORY() [[[NSBundle mainBundle] resourcePath] stringByAppendingString:@"/Data/Scripts/plist/"] + +#define MSG_MEMCLEAN() DLog(@"has cleaned up some memory"); +#define MSG_DIDUNLOAD() DLog(@"unloaded"); + +#define IS_DUALHEAD() ([[UIScreen class] respondsToSelector:@selector(screens)] && [[UIScreen screens] count] > 1) +#define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) +#define IS_NOT_POWERFUL(x) ([x hasPrefix:@"iPhone1"] || [x hasPrefix:@"iPod1,1"] || [x hasPrefix:@"iPod2,1"]) +#define IS_NOT_VERY_POWERFUL(x) ([x hasPrefix:@"iPad1"] || [x hasPrefix:@"iPhone2"] || [x hasPrefix:@"iPod3"] || [x hasPrefix:@"iPod4"]) +#define IS_VERY_POWERFUL(x) (IS_NOT_POWERFUL(x) == NO && IS_NOT_VERY_POWERFUL(x) == NO) + +#define UIVIEW_HW_SDLVIEW [[[[UIApplication sharedApplication] keyWindow] subviews] objectAtIndex:0] + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/EditableCellView.m --- a/project_files/HedgewarsMobile/Classes/EditableCellView.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/EditableCellView.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "EditableCellView.h" -#import "CommodityFunctions.h" + @implementation EditableCellView @synthesize delegate, textField, titleLabel, minimumCharacters, maximumCharacters, respectEditing, oldValue; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m --- a/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,10 +20,9 @@ #import "EngineProtocolNetwork.h" -#import "PascalImports.h" -#import "CommodityFunctions.h" #import "OverlayViewController.h" + #define BUFFER_SIZE 255 // like in original frontend @implementation EngineProtocolNetwork @@ -62,7 +61,7 @@ #pragma mark - #pragma mark Spawner functions -(void) spawnThread:(NSString *)onSaveFile withOptions:(NSDictionary *)dictionary { - self.stream = [[NSOutputStream alloc] initToFileAtPath:onSaveFile append:YES]; + self.stream = (onSaveFile) ? [[NSOutputStream alloc] initToFileAtPath:onSaveFile append:YES] : nil; [self.stream open]; [NSThread detachNewThreadSelector:@selector(engineProtocol:) @@ -289,6 +288,9 @@ NSString *script = [gameConfig objectForKey:@"mission_command"]; if ([script length] != 0) [self sendToEngine:script]; + // missions/tranings only need the script configuration set + if ([gameConfig count] == 1) + break; // seed info [self sendToEngine:[gameConfig objectForKey:@"seed_command"]]; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/FlagsViewController.m --- a/project_files/HedgewarsMobile/Classes/FlagsViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/FlagsViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -21,7 +21,7 @@ #import "FlagsViewController.h" #import -#import "CommodityFunctions.h" + @implementation FlagsViewController @synthesize teamDictionary, flagArray, communityArray, lastIndexPath; @@ -100,8 +100,9 @@ UIImage *flagSprite = [[UIImage alloc] initWithContentsOfFile:flagFile]; [flagFile release]; cell.imageView.image = flagSprite; - cell.imageView.layer.borderWidth = 0.3; [flagSprite release]; + cell.imageView.layer.borderWidth = 1; + cell.imageView.layer.borderColor = [[UIColor blackColor] CGColor]; cell.textLabel.text = [[source objectAtIndex:row] stringByDeletingPathExtension]; if ([[flagName stringByDeletingPathExtension] isEqualToString:[self.teamDictionary objectForKey:@"flag"]]) { diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/FortsViewController.m --- a/project_files/HedgewarsMobile/Classes/FortsViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/FortsViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,8 +20,7 @@ #import "FortsViewController.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" + #define IMGNUM_PER_FORT 6 diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GameConfigViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1105 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 292 + {1024, 768} + + NO + YES + NO + IBIPadFramework + + NSImage + background.png + + + + + 292 + {{357, 17}, {309, 165}} + + NO + NO + IBIPadFramework + + NSImage + title~iphone.png + + + + + 292 + {{441, 702}, {142, 64}} + + NO + 1 + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + startGameButton.png + + + + + 292 + {{20, 693}, {64, 64}} + + NO + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + backButton.png + + + + + 292 + {{940, 693}, {64, 64}} + + NO + 2 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + helpButton.png + + + + + 278 + {{0, 60}, {320, 620}} + + + 3 + MCAwAA + + NO + YES + IBIPadFramework + + + + 277 + {{337, 187}, {350, 505}} + + + NO + YES + IBIPadFramework + + + + 292 + {{269, 724}, {150, 23}} + + NO + IBIPadFramework + 0 + 0 + 0.05000000074505806 + 0.05000000074505806 + + + + 292 + {{121, 720}, {148, 30}} + + NO + YES + 7 + NO + IBIPadFramework + Label + + Helvetica-Oblique + 18 + 16 + + + 3 + MQA + + 2 + + + + 1 + 10 + 1 + + + {1024, 768} + + + YES + + 3 + + IBIPadFramework + + + NO + + 3 + + IBIPadFramework + YES + + + NO + + IBIPadFramework + YES + + + NO + MapConfigViewController-iPad + + IBIPadFramework + YES + + + + + YES + + + view + + + + 3 + + + + buttonPressed: + + + 7 + + 35 + + + + buttonPressed: + + + 7 + + 36 + + + + buttonPressed: + + + 7 + + 37 + + + + teamConfigViewController + + + + 45 + + + + view + + + + 47 + + + + view + + + + 50 + + + + schemeWeaponConfigViewController + + + + 51 + + + + mapConfigViewController + + + + 57 + + + + slider + + + + 61 + + + + sizeLabel + + + + 65 + + + + sliderChanged: + + + 13 + + 66 + + + + sliderEndedChanging: + + + 7 + + 67 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + + + + + + + 30 + + + Background + + + 31 + + + Title + + + 32 + + + Start Button + + + 33 + + + Back Button + + + 34 + + + Help Button + + + 44 + + + YES + + + + + 46 + + + YES + + + TeamConfigViewController View + + + 48 + + + + + 49 + + + SchemeWeaponConfigViewController View + + + 55 + + + + + 60 + + + Filter Slider + + + 64 + + + Filter Label + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 30.IBPluginDependency + 30.IBViewBoundsToFrameTransform + 31.IBPluginDependency + 31.IBViewBoundsToFrameTransform + 32.IBPluginDependency + 32.IBViewBoundsToFrameTransform + 33.IBPluginDependency + 33.IBViewBoundsToFrameTransform + 34.IBPluginDependency + 34.IBViewBoundsToFrameTransform + 44.CustomClassName + 44.IBEditorWindowLastContentRect + 44.IBPluginDependency + 46.IBPluginDependency + 46.IBViewBoundsToFrameTransform + 48.CustomClassName + 48.IBEditorWindowLastContentRect + 48.IBPluginDependency + 49.IBPluginDependency + 49.IBViewBoundsToFrameTransform + 55.CustomClassName + 55.IBEditorWindowLastContentRect + 55.IBPluginDependency + 60.IBPluginDependency + 60.IBViewBoundsToFrameTransform + 64.IBPluginDependency + 64.IBViewBoundsToFrameTransform + + + YES + GameConfigViewController + UIResponder + {{444, 287}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABAoAAAxLrgAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDtQAAxGNAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD3wAAxLqgAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABByAAAxLmAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEbEAAxLmAAA + + TeamConfigViewController + {{63, 355}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUOogABDOwAAA + + SchemeWeaponConfigViewController + {{84, 388}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAxHqAAA + + MapConfigViewController + {{126, 377}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUNRAABEMoAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAADCtgAAxDoAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 67 + + + + YES + + GameConfigViewController + UIViewController + + YES + + YES + buttonPressed: + segmentPressed: + + + YES + id + id + + + + YES + + YES + buttonPressed: + segmentPressed: + + + YES + + buttonPressed: + id + + + segmentPressed: + id + + + + + YES + + YES + mapConfigViewController + schemeWeaponConfigViewController + teamConfigViewController + + + YES + MapConfigViewController + SchemeWeaponConfigViewController + TeamConfigViewController + + + + YES + + YES + mapConfigViewController + schemeWeaponConfigViewController + teamConfigViewController + + + YES + + mapConfigViewController + MapConfigViewController + + + schemeWeaponConfigViewController + SchemeWeaponConfigViewController + + + teamConfigViewController + TeamConfigViewController + + + + + IBProjectSource + Classes/GameConfigViewController.h + + + + MapConfigViewController + UIViewController + + YES + + YES + mapButtonPressed: + segmentedControlChanged: + sliderChanged: + sliderEndedChanging: + + + YES + id + id + id + id + + + + YES + + YES + mapButtonPressed: + segmentedControlChanged: + sliderChanged: + sliderEndedChanging: + + + YES + + mapButtonPressed: + id + + + segmentedControlChanged: + id + + + sliderChanged: + id + + + sliderEndedChanging: + id + + + + + YES + + YES + maxLabel + previewButton + segmentedControl + sizeLabel + slider + tableView + + + YES + UILabel + MapPreviewButtonView + UISegmentedControl + UILabel + UISlider + UITableView + + + + YES + + YES + maxLabel + previewButton + segmentedControl + sizeLabel + slider + tableView + + + YES + + maxLabel + UILabel + + + previewButton + MapPreviewButtonView + + + segmentedControl + UISegmentedControl + + + sizeLabel + UILabel + + + slider + UISlider + + + tableView + UITableView + + + + + IBProjectSource + Classes/MapConfigViewController.h + + + + MapPreviewButtonView + UIButton + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + Classes/MapPreviewButtonView.h + + + + SchemeWeaponConfigViewController + UIViewController + + IBProjectSource + Classes/SchemeWeaponConfigViewController.h + + + + TeamConfigViewController + UIViewController + + IBProjectSource + Classes/TeamConfigViewController.h + + + + UILabel + + IBProjectSource + Classes/HWUtils.h + + + + UITableView + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISegmentedControl + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISegmentedControl.h + + + + UISlider + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISlider.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + backButton.png + background.png + helpButton.png + startGameButton.png + title~iphone.png + + + YES + {64, 64} + {1024, 768} + {64, 64} + {142, 64} + {270, 150} + + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,608 @@ + + + + 1056 + 10K540 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + 266 + + YES + + + 292 + {{96, 8}, {270, 30}} + + NO + 12345 + IBCocoaTouchFramework + 2 + 4 + 0 + + YES + Map + Teams + Details + Help + + + YES + + + + + + + YES + + + + + + + YES + {0, 0} + {0, 0} + {0, 0} + {0, 0} + + + YES + + + + + + + 1 + MC42IDAuNiAwLjYAA + + + + {{0, 276}, {480, 44}} + + NO + NO + IBCocoaTouchFramework + 1 + + YES + + Back + IBCocoaTouchFramework + 1 + + + + IBCocoaTouchFramework + + 5 + + + IBCocoaTouchFramework + + + + + IBCocoaTouchFramework + + 5 + + + 1 + Start + IBCocoaTouchFramework + 68 + 2 + + + + + + {480, 320} + + + 3 + MQA + + NO + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + buttonPressed: + + + + 17 + + + + buttonPressed: + + + + 23 + + + + segmentPressed: + + + 13 + + 29 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + 15 + + + YES + + + + + + + + + + 16 + + + + + 18 + + + + + 19 + + + + + 21 + + + YES + + + + + + 20 + + + + + 22 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 16.IBPluginDependency + 18.IBPluginDependency + 19.IBPluginDependency + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 20.IBPluginDependency + 22.IBPluginDependency + + + YES + GameConfigViewController + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw58AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{131, 321}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 29 + + + + YES + + GameConfigViewController + UIViewController + + YES + + YES + buttonPressed: + segmentPressed: + + + YES + id + id + + + + YES + + YES + buttonPressed: + segmentPressed: + + + YES + + buttonPressed: + id + + + segmentPressed: + id + + + + + IBProjectSource + Classes/GameConfigViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISegmentedControl + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISegmentedControl.h + + + + UIToolbar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIToolbar.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GameConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -21,31 +21,29 @@ #import -@class HelpPageViewController; -@class MapConfigViewController; +@class SchemeWeaponConfigViewController; @class TeamConfigViewController; -@class SchemeWeaponConfigViewController; -@class GameInterfaceBridge; +@class MapConfigViewController; +@class HelpPageViewController; @interface GameConfigViewController : UIViewController { UIView *imgContainer; - HelpPageViewController *helpPage; - + + SchemeWeaponConfigViewController *schemeWeaponConfigViewController; + TeamConfigViewController *teamConfigViewController; MapConfigViewController *mapConfigViewController; - TeamConfigViewController *teamConfigViewController; - SchemeWeaponConfigViewController *schemeWeaponConfigViewController; - GameInterfaceBridge *interfaceBridge; + HelpPageViewController *helpPage; } @property (retain) UIView *imgContainer; +@property (nonatomic,retain) IBOutlet SchemeWeaponConfigViewController *schemeWeaponConfigViewController; +@property (nonatomic,retain) IBOutlet TeamConfigViewController *teamConfigViewController; +@property (nonatomic,retain) IBOutlet MapConfigViewController *mapConfigViewController; @property (nonatomic,retain) HelpPageViewController *helpPage; -@property (nonatomic,retain) MapConfigViewController *mapConfigViewController; -@property (nonatomic,retain) TeamConfigViewController *teamConfigViewController; -@property (nonatomic,retain) SchemeWeaponConfigViewController *schemeWeaponConfigViewController; -@property (nonatomic,retain) GameInterfaceBridge *interfaceBridge; -(IBAction) buttonPressed:(id) sender; -(IBAction) segmentPressed:(id) sender; -(void) startGame:(UIButton *)button; +-(BOOL) isEverythingSet; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GameConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -25,18 +25,29 @@ #import "SchemeWeaponConfigViewController.h" #import "HelpPageViewController.h" #import "GameInterfaceBridge.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" -#import "PascalImports.h" + @implementation GameConfigViewController -@synthesize imgContainer, helpPage, mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController, interfaceBridge; +@synthesize imgContainer, helpPage, mapConfigViewController, teamConfigViewController, schemeWeaponConfigViewController; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return rotationManager(interfaceOrientation); } +/* +-(MapConfigViewController *)mapConfigViewController { + if (mapConfigViewController == nil) { + NSString *xib = IS_IPAD() ? @"MapConfigViewController-iPad" : @"MapConfigViewController-iPhone"; + MapConfigViewController *mcvc = [[MapConfigViewController alloc] initWithNibName:xib bundle:nil]; + [self.view addSubview:mcvc.view]; + self.mapConfigViewController = mcvc; + [mcvc release]; + } + return mapConfigViewController; +} +*/ + -(IBAction) buttonPressed:(id) sender { UIButton *theButton = (UIButton *)sender; @@ -51,21 +62,30 @@ [alert show]; [alert release]; } else { - playSound(@"backSound"); + [AudioManagerController playBackSound]; [[self parentViewController] dismissModalViewControllerAnimated:YES]; } break; case 1: - playSound(@"clickSound"); + [AudioManagerController playClickSound]; + if ([self isEverythingSet] == NO) + return; theButton.enabled = NO; + for (UIView *oneView in self.imgContainer.subviews) { + if ([oneView isMemberOfClass:[UIImageView class]]) { + UIImageView *anImageView = (UIImageView *)oneView; + [anImageView removeFromSuperview]; + } + } [self startGame:theButton]; + break; case 2: - playSound(@"clickSound"); + [AudioManagerController playClickSound]; if (self.helpPage == nil) self.helpPage = [[HelpPageViewController alloc] initWithNibName:@"HelpPageLobbyViewController-iPad" bundle:nil]; self.helpPage.view.alpha = 0; - [self.view addSubview:helpPage.view]; + [self.view addSubview:self.helpPage.view]; [UIView beginAnimations:@"helplobby" context:NULL]; self.helpPage.view.alpha = 1; [UIView commitAnimations]; @@ -77,28 +97,20 @@ } -(IBAction) segmentPressed:(id) sender { +/* UISegmentedControl *theSegment = (UISegmentedControl *)sender; - playSound(@"selSound"); + [AudioManagerController playSelectSound]; switch (theSegment.selectedSegmentIndex) { case 0: - // this init here is just aestetic as this controller was already set up in viewDidLoad - if (mapConfigViewController == nil) { - mapConfigViewController = [[MapConfigViewController alloc] initWithNibName:@"MapConfigViewController-iPhone" bundle:nil]; - [self.view addSubview:mapConfigViewController.view]; - } // this message is compulsory otherwise the table won't be loaded at all - [mapConfigViewController viewWillAppear:NO]; - [self.view bringSubviewToFront:mapConfigViewController.view]; + [self.mapConfigViewController viewWillAppear:NO]; + [self.view bringSubviewToFront:self.mapConfigViewController.view]; break; case 1: - if (teamConfigViewController == nil) { - teamConfigViewController = [[TeamConfigViewController alloc] initWithStyle:UITableViewStyleGrouped]; - [self.view addSubview:teamConfigViewController.view]; - } // this message is compulsory otherwise the table won't be loaded at all - [teamConfigViewController viewWillAppear:NO]; - [self.view bringSubviewToFront:teamConfigViewController.view]; + [self.teamConfigViewController viewWillAppear:NO]; + [self.view bringSubviewToFront:self.teamConfigViewController.view]; break; case 2: if (schemeWeaponConfigViewController == nil) { @@ -122,6 +134,7 @@ DLog(@"Nope"); break; } +*/ } -(BOOL) isEverythingSet { @@ -208,9 +221,6 @@ -(void) startGame:(UIButton *)button { button.enabled = YES; - - if ([self isEverythingSet] == NO) - return; NSString *script = self.mapConfigViewController.missionCommand; if ([script isEqualToString:@""]) @@ -230,45 +240,59 @@ script,@"mission_command", nil]; - if (self.interfaceBridge == nil) { - GameInterfaceBridge *bridge = [[GameInterfaceBridge alloc] initWithController:self]; - self.interfaceBridge = bridge; - [bridge release]; - } - [self.interfaceBridge startLocalGame:gameDictionary]; + GameInterfaceBridge *bridge = [[GameInterfaceBridge alloc] initWithController:self]; + [bridge startLocalGame:gameDictionary]; + [bridge release]; } -(void) loadNiceHogs { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; - NSString *filePath = [NSString stringWithFormat:@"%@/Hedgehog.png",GRAPHICS_DIRECTORY()]; - UIImage *sprite = [[UIImage alloc] initWithContentsOfFile:filePath andCutAt:CGRectMake(96, 0, 32, 32)]; - + srand(time(NULL)); + NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Hedgehog/Idle.png",GRAPHICS_DIRECTORY()]; + UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:filePath]; + [filePath release]; + NSArray *hatArray = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:HATS_DIRECTORY() error:NULL]; int numberOfHats = [hatArray count]; + int animationFrames = IS_VERY_POWERFUL([HWUtils modelType]) ? 18 : 1; if (self.imgContainer != nil) [self.imgContainer removeFromSuperview]; - + self.imgContainer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 300, 40)]; for (int i = 0; i < 1 + random()%20; i++) { NSString *hat = [hatArray objectAtIndex:random()%numberOfHats]; - + NSString *hatFile = [[NSString alloc] initWithFormat:@"%@/%@", HATS_DIRECTORY(), hat]; - UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile: hatFile andCutAt:CGRectMake(0, 0, 32, 32)]; - [hatFile release]; - UIImage *hogWithHat = [sprite mergeWith:hatSprite atPoint:CGPointMake(0, 5)]; + UIImage *hatSprite = [[UIImage alloc] initWithContentsOfFile:hatFile]; + NSMutableArray *animation = [[NSMutableArray alloc] initWithCapacity:animationFrames]; + for (int j = 0; j < animationFrames; j++) { + int x = ((j*32)/(int)hatSprite.size.height)*32; + int y = (j*32)%(int)hatSprite.size.height; + UIImage *hatSpriteFrame = [hatSprite cutAt:CGRectMake(x, y, 32, 32)]; + UIImage *hogSpriteFrame = [hogSprite cutAt:CGRectMake(x, y, 32, 32)]; + UIImage *hogWithHat = [hogSpriteFrame mergeWith:hatSpriteFrame atPoint:CGPointMake(0, 5)]; + [animation addObject:hogWithHat]; + } [hatSprite release]; - - UIImageView *hog = [[UIImageView alloc] initWithImage:hogWithHat]; - int x = 15*(i+1)+random()%40; - if (x + 32 > 300) - x = i*10; - hog.frame = CGRectMake(x, 30, 32, 32); + [hatFile release]; + + UIImageView *hog = [[UIImageView alloc] initWithImage:[animation objectAtIndex:0]]; + hog.animationImages = animation; + hog.animationDuration = 3; + [animation release]; + + int x = 20*i+random()%128; + if (x > 320 - 32) + x = i*random()%32; + hog.frame = CGRectMake(x, 25, hog.frame.size.width, hog.frame.size.height); [self.imgContainer addSubview:hog]; + [hog startAnimating]; [hog release]; } + [self.view addSubview:self.imgContainer]; - [sprite release]; + [hogSprite release]; [pool drain]; } @@ -279,47 +303,26 @@ self.view.frame = CGRectMake(0, 0, screen.size.height, screen.size.width); if (IS_IPAD()) { - // load other controllers - if (self.mapConfigViewController == nil) - self.mapConfigViewController = [[MapConfigViewController alloc] initWithNibName:@"MapConfigViewController-iPad" bundle:nil]; + // the label for the filter slider + UILabel *filterLabel = [[UILabel alloc] initWithFrame:CGRectMake(116, 714, 310, 40) + andTitle:nil + withBorderWidth:2.0f]; + [self.view insertSubview:filterLabel belowSubview:self.mapConfigViewController.slider]; + [filterLabel release]; - UILabel *leftBackground = createLabelWithParams(nil, CGRectMake(0, 60, 320, 620), 2.7f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_ALPHABLUE); - [self.mapConfigViewController.view addSubview:leftBackground]; - [leftBackground release]; - UILabel *middleBackground = createLabelWithParams(nil, CGRectMake(337, 187, 350, 505), 2.7f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_ALPHABLUE); - [self.mapConfigViewController.view addSubview:middleBackground]; - [middleBackground release]; - UILabel *rightBackground = createLabelWithParams(nil, CGRectMake(704, 214, 320, 464), 2.7f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_ALPHABLUE); - [self.mapConfigViewController.view addSubview:rightBackground]; - [rightBackground release]; - UILabel *topBackground = createLabelWithParams(nil, CGRectMake(714, 14, 300, 190), 2.3f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_ALPHABLUE); - [self.mapConfigViewController.view addSubview:topBackground]; - [topBackground release]; - UILabel *bottomLeftBackground = createLabelWithParams(nil, CGRectMake(106, 714, 320, 40), 2.0f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_ALPHABLUE); - [self.mapConfigViewController.view addSubview:bottomLeftBackground]; - [bottomLeftBackground release]; - UILabel *bottomRightBackground = createLabelWithParams(NSLocalizedString(@"Max Hogs: ",@""), CGRectMake(594, 714, 320, 40), 2.0f, UICOLOR_HW_YELLOW_BODER, UICOLOR_HW_ALPHABLUE); - bottomRightBackground.font = [UIFont italicSystemFontOfSize:[UIFont labelFontSize]]; - [self.mapConfigViewController.view addSubview:bottomRightBackground]; - [bottomRightBackground release]; - [self.mapConfigViewController.view bringSubviewToFront:self.mapConfigViewController.maxLabel]; - [self.mapConfigViewController.view bringSubviewToFront:self.mapConfigViewController.sizeLabel]; - [self.mapConfigViewController.view bringSubviewToFront:self.mapConfigViewController.segmentedControl]; - [self.mapConfigViewController.view bringSubviewToFront:self.mapConfigViewController.previewButton]; - [self.mapConfigViewController.view bringSubviewToFront:self.mapConfigViewController.slider]; - [self.mapConfigViewController.view bringSubviewToFront:self.mapConfigViewController.tableView]; + // the label for max hogs + UILabel *maxLabel = [[UILabel alloc] initWithFrame:CGRectMake(598, 714, 310, 40) + andTitle:NSLocalizedString(@"Loading...",@"") + withBorderWidth:2.0f]; + maxLabel.font = [UIFont italicSystemFontOfSize:[UIFont labelFontSize]]; + maxLabel.textColor = [UIColor whiteColor]; + maxLabel.textAlignment = UITextAlignmentCenter; + [self.view addSubview:maxLabel]; + self.mapConfigViewController.maxLabel = maxLabel; + [maxLabel release]; - if (self.teamConfigViewController == nil) - self.teamConfigViewController = [[TeamConfigViewController alloc] initWithStyle:UITableViewStyleGrouped]; - [self.mapConfigViewController.view addSubview:self.teamConfigViewController.view]; - if (self.schemeWeaponConfigViewController == nil) - self.schemeWeaponConfigViewController = [[SchemeWeaponConfigViewController alloc] initWithStyle:UITableViewStyleGrouped]; - [self.mapConfigViewController.view addSubview:schemeWeaponConfigViewController.view]; - self.mapConfigViewController.view.frame = CGRectMake(0, 0, screen.size.height, screen.size.width); - self.teamConfigViewController.view.frame = CGRectMake(348, 200, 328, 480); - self.schemeWeaponConfigViewController.view.frame = CGRectMake(10, 70, 300, 600); - - self.mapConfigViewController.parentController = self; + // as this is loaded from a NIB we need to set its size and position + self.mapConfigViewController.view.frame = CGRectMake(704, 0, 320, 680); } else { // this is the visible controller if (self.mapConfigViewController == nil) @@ -329,7 +332,6 @@ [self.view addSubview:self.schemeWeaponConfigViewController.view]; } [self.view addSubview:self.mapConfigViewController.view]; - self.mapConfigViewController.externalController = schemeWeaponConfigViewController; [super viewDidLoad]; } @@ -368,28 +370,25 @@ } -(void) didReceiveMemoryWarning { + self.imgContainer = nil; + + if (self.mapConfigViewController.view.superview == nil) + self.mapConfigViewController = nil; if (self.teamConfigViewController.view.superview == nil) self.teamConfigViewController = nil; if (self.schemeWeaponConfigViewController.view.superview == nil) self.schemeWeaponConfigViewController = nil; if (self.helpPage.view.superview == nil) self.helpPage = nil; - if (self.mapConfigViewController.view.superview == nil) - self.mapConfigViewController = nil; - - self.imgContainer = nil; - // don't nil this one or it won't be able to send messages - //self.interfaceBridge = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } -(void) viewDidUnload { self.imgContainer = nil; - self.interfaceBridge = nil; + self.schemeWeaponConfigViewController = nil; + self.teamConfigViewController = nil; self.mapConfigViewController = nil; - self.teamConfigViewController = nil; - self.schemeWeaponConfigViewController = nil; self.helpPage = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; @@ -397,10 +396,9 @@ -(void) dealloc { releaseAndNil(imgContainer); - releaseAndNil(interfaceBridge); + releaseAndNil(schemeWeaponConfigViewController); + releaseAndNil(teamConfigViewController); releaseAndNil(mapConfigViewController); - releaseAndNil(teamConfigViewController); - releaseAndNil(schemeWeaponConfigViewController); releaseAndNil(helpPage); [super dealloc]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h --- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h Sun Oct 16 21:03:30 2011 +0200 @@ -22,7 +22,7 @@ #import #import "EngineProtocolNetwork.h" -typedef enum {gtNone, gtLocal, gtSave, gtNet} TGameType; +typedef enum {gtNone, gtLocal, gtSave, gtMission, gtNet} TGameType; typedef enum {gsNone, gsInGame, gsEnded, gsInterrupted} TGameStatus; @class OverlayViewController; @@ -49,10 +49,12 @@ -(id) initWithController:(id) viewController; --(void) startLocalGame:(NSDictionary *)withDictionary; +-(void) startLocalGame:(NSDictionary *)withOptions; -(void) startSaveGame:(NSString *)atPath; +-(void) startMissionGame:(NSString *)withScript; + -(void) prepareEngineLaunch; --(void) startGameEngine; +-(void) engineLaunch; -(void) gameHasEndedWithStats:(NSArray *)stats; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m --- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,10 +20,11 @@ #import "GameInterfaceBridge.h" -#import "PascalImports.h" +#import "ServerSetup.h" #import "EngineProtocolNetwork.h" #import "OverlayViewController.h" #import "StatsPageViewController.h" +#import "AudioManagerController.h" #import "ObjcExports.h" @implementation GameInterfaceBridge @@ -31,7 +32,7 @@ -(id) initWithController:(id) viewController { if (self = [super init]) { - self.ipcPort = randomPort(); + self.ipcPort = [ServerSetup randomPort]; self.gameType = gtNone; self.savePath = nil; @@ -61,7 +62,7 @@ } // main routine for calling the actual game engine --(void) startGameEngine { +-(void) engineLaunch { const char *gameArgs[11]; NSInteger width, height; NSString *ipcString = [[NSString alloc] initWithFormat:@"%d", self.ipcPort]; @@ -78,11 +79,11 @@ height = (int) screenBounds.size.width; } - NSString *horizontalSize = [[NSString alloc] initWithFormat:@"%d", width * (int)getScreenScale()]; - NSString *verticalSize = [[NSString alloc] initWithFormat:@"%d", height * (int)getScreenScale()]; + NSString *horizontalSize = [[NSString alloc] initWithFormat:@"%d", width * (int)[[UIScreen mainScreen] scale]]; + NSString *verticalSize = [[NSString alloc] initWithFormat:@"%d", height * (int)[[UIScreen mainScreen] scale]]; NSString *rotation = [[NSString alloc] initWithString:@"0"]; - NSString *modelId = getModelType(); + NSString *modelId = [HWUtils modelType]; NSInteger tmpQuality; if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) // = iPhone and iPhone 3G or iPod Touch or iPod Touch 2G tmpQuality = 0x00000001 | 0x00000002 | 0x00000008 | 0x00000040; // rqLowRes | rqBlurryLand | rqSimpleRope | rqKillFlakes @@ -120,7 +121,7 @@ [localeString release]; [ipcString release]; - objcExportsInit(self.overlayController); + [ObjcExports initialize]; // this is the pascal fuction that starts the game, wrapped around isInGame [HedgewarsAppDelegate sharedAppDelegate].isInGame = YES; @@ -154,16 +155,18 @@ [userDefaults setObject:self.savePath forKey:@"savedGamePath"]; [userDefaults synchronize]; - [HedgewarsAppDelegate pauseBackgroundMusic]; + [AudioManagerController pauseBackgroundMusic]; // SYSTEMS ARE GO!! - [self startGameEngine]; + [self engineLaunch]; // remove completed games notification [userDefaults setObject:@"" forKey:@"savedGamePath"]; [userDefaults synchronize]; // now we can remove the cover with a transition + blackView.frame = theFrame; + blackView.alpha = 1; [UIView beginAnimations:@"fade in" context:NULL]; [UIView setAnimationDuration:1]; blackView.alpha = 0; @@ -177,12 +180,11 @@ // warn our host that it's going to be visible again [self.parentController viewWillAppear:YES]; - if ([[userDefaults objectForKey:@"music"] boolValue]) - [HedgewarsAppDelegate playBackgroundMusic]; + [AudioManagerController playBackgroundMusic]; } // set up variables for a local game --(void) startLocalGame:(NSDictionary *)withDictionary { +-(void) startLocalGame:(NSDictionary *)withOptions { self.gameType = gtLocal; NSDateFormatter *outputFormatter = [[NSDateFormatter alloc] init]; @@ -196,7 +198,7 @@ if ([[NSFileManager defaultManager] fileExistsAtPath:self.savePath]) [[NSFileManager defaultManager] removeItemAtPath:self.savePath error:nil]; - [self.engineProtocol spawnThread:self.savePath withOptions:withDictionary]; + [self.engineProtocol spawnThread:self.savePath withOptions:withOptions]; [self prepareEngineLaunch]; } @@ -209,8 +211,21 @@ [self prepareEngineLaunch]; } +-(void) startMissionGame:(NSString *)withScript { + self.gameType = gtMission; + self.savePath = nil; + + NSString *missionPath = [[NSString alloc] initWithFormat:@"escript Missions/Training/%@.lua",withScript]; + NSDictionary *config = [NSDictionary dictionaryWithObject:missionPath forKey:@"mission_command"]; + [missionPath release]; + [self.engineProtocol spawnThread:nil withOptions:config]; + [self prepareEngineLaunch]; +} + -(void) gameHasEndedWithStats:(NSArray *)stats { - // display stats page + // wrap this around a retain/realse to prevent being deallocated too soon + [self retain]; + // display stats page if there is something to display if (stats != nil) { StatsPageViewController *statsPage = [[StatsPageViewController alloc] initWithStyle:UITableViewStyleGrouped]; statsPage.statsArray = stats; @@ -225,6 +240,7 @@ // can remove the savefile if the replay has ended if (self.gameType == gtSave) [[NSFileManager defaultManager] removeItemAtPath:self.savePath error:nil]; + [self release]; } @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "GeneralSettingsViewController.h" -#import "CommodityFunctions.h" + @implementation GeneralSettingsViewController @@ -32,6 +32,7 @@ #pragma mark - #pragma mark View Lifecycle -(void) viewDidLoad { + self.navigationItem.title = @"Edit game options"; [super viewDidLoad]; } @@ -44,7 +45,7 @@ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults synchronize]; if ([[userDefaults objectForKey:@"music"] boolValue] == NO) - [HedgewarsAppDelegate stopBackgroundMusic]; + [AudioManagerController stopBackgroundMusic]; [super viewWillDisappear:animated]; } @@ -64,7 +65,7 @@ [theOtherSwitch setOn:NO animated:YES]; if (theOtherSwitch.on) - [HedgewarsAppDelegate pauseBackgroundMusic]; + [AudioManagerController pauseBackgroundMusic]; break; case 20: //musicSwitch // if switch above (sound) is off, never turn on @@ -76,9 +77,9 @@ [settings setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"music"]; if (theSwitch.on) - [HedgewarsAppDelegate playBackgroundMusic]; + [AudioManagerController playBackgroundMusic]; else - [HedgewarsAppDelegate pauseBackgroundMusic]; + [AudioManagerController pauseBackgroundMusic]; break; case 30: //alternateSwitch diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/GravesViewController.m --- a/project_files/HedgewarsMobile/Classes/GravesViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/GravesViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,8 +20,7 @@ #import "GravesViewController.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" + @implementation GravesViewController @synthesize teamDictionary, graveArray, lastIndexPath; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HWUtils.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/HWUtils.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,67 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2010 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 01/10/2011. + */ + + +#import + +@interface HWUtils : NSObject { + +} + ++(NSString *)modelType; ++(NSArray *)teamColors; + +@end + + +@interface UITableView (extra) + +-(void) setBackgroundColorForAnyTable:(UIColor *)color; + +@end + + +@interface UIColor (extra) + ++(UIColor *)darkYellowColor; ++(UIColor *)lightYellowColor; ++(UIColor *)darkBlueColor; ++(UIColor *)darkBlueColorTransparent; ++(UIColor *)blackColorTransparent; + +@end + + +@interface UILabel (extra) + +-(UILabel *)initWithFrame:(CGRect)frame andTitle:(NSString *)title; +-(UILabel *)initWithFrame:(CGRect)frame andTitle:(NSString *)title withBorderWidth:(CGFloat) borderWidth; +-(UILabel *)initWithFrame:(CGRect)frame andTitle:(NSString *)title withBorderWidth:(CGFloat) borderWidth + withBorderColor:(UIColor *)borderColor withBackgroundColor:(UIColor *)backColor; + +@end + + +@interface NSString (extra) + +-(NSString *)MD5hash; + +@end + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HWUtils.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/HWUtils.m Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,155 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2010 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 01/10/2011. + */ + + +#import "HWUtils.h" +#import +#import +#import +#import +#import "PascalImports.h" +#import "hwconsts.h" + +@implementation HWUtils + ++(NSString *)modelType { + size_t size; + // set 'oldp' parameter to NULL to get the size of the data returned so we can allocate appropriate amount of space + sysctlbyname("hw.machine", NULL, &size, NULL, 0); + char *name = (char *)malloc(sizeof(char) * size); + // get the platform name + sysctlbyname("hw.machine", name, &size, NULL, 0); + NSString *modelId = [NSString stringWithUTF8String:name]; + free(name); + + return modelId; +} + ++(NSArray *)teamColors { + // by default colors are ARGB but we do computation over RGB, hence we have to "& 0x00FFFFFF" before processing + unsigned int colors[] = HW_TEAMCOLOR_ARRAY; + NSMutableArray *array = [[NSMutableArray alloc] init]; + + int i = 0; + while(colors[i] != 0) + [array addObject:[NSNumber numberWithUnsignedInt:(colors[i++] & 0x00FFFFFF)]]; + + NSArray *final = [NSArray arrayWithArray:array]; + [array release]; + return final; +} + +@end + + +@implementation UITableView (extra) + +-(void) setBackgroundColorForAnyTable:(UIColor *) color { + UIView *backView = [[UIView alloc] initWithFrame:self.frame]; + backView.backgroundColor = color; + self.backgroundView = backView; + [backView release]; + self.backgroundColor = [UIColor clearColor]; +} + +@end + + + +@implementation UIColor (extra) + ++(UIColor *)darkYellowColor { + return [UIColor colorWithRed:(CGFloat)0xFE/255 green:(CGFloat)0xC0/255 blue:0 alpha:1]; +} + ++(UIColor *)lightYellowColor { + return [UIColor colorWithRed:(CGFloat)0xF0/255 green:(CGFloat)0xD0/255 blue:0 alpha:1]; +} + ++(UIColor *)darkBlueColor { + return [UIColor colorWithRed:(CGFloat)0x0F/255 green:0 blue:(CGFloat)0x42/255 alpha:1]; +} + ++(UIColor *)darkBlueColorTransparent { + return [UIColor colorWithRed:(CGFloat)0x0F/255 green:0 blue:(CGFloat)0x55/255 alpha:0.6f]; +} + ++(UIColor *)blackColorTransparent { + return [UIColor colorWithRed:0 green:0 blue:0 alpha:0.65f]; +} + +@end + + +@implementation UILabel (extra) + +-(UILabel *)initWithFrame:(CGRect)frame andTitle:(NSString *)title { + return [self initWithFrame:frame + andTitle:title + withBorderWidth:1.5f + withBorderColor:[UIColor darkYellowColor] + withBackgroundColor:[UIColor darkBlueColor]]; +} + +-(UILabel *)initWithFrame:(CGRect)frame andTitle:(NSString *)title withBorderWidth:(CGFloat) borderWidth { + return [self initWithFrame:frame + andTitle:title + withBorderWidth:borderWidth + withBorderColor:[UIColor darkYellowColor] + withBackgroundColor:[UIColor darkBlueColorTransparent]]; +} + +-(UILabel *)initWithFrame:(CGRect)frame andTitle:(NSString *)title withBorderWidth:(CGFloat) borderWidth + withBorderColor:(UIColor *)borderColor withBackgroundColor:(UIColor *)backColor{ + UILabel *theLabel = [self initWithFrame:frame]; + theLabel.backgroundColor = backColor; + + if (title != nil) { + theLabel.text = title; + theLabel.textColor = [UIColor lightYellowColor]; + theLabel.textAlignment = UITextAlignmentCenter; + theLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]*80/100]; + } + + [theLabel.layer setBorderWidth:borderWidth]; + [theLabel.layer setBorderColor:borderColor.CGColor]; + [theLabel.layer setCornerRadius:8.0f]; + [theLabel.layer setMasksToBounds:YES]; + + return theLabel; +} + +@end + + +@implementation NSString (extra) + +-(NSString *)MD5hash { + const char *cStr = [self UTF8String]; + unsigned char result[16]; + CC_MD5( cStr, strlen(cStr), result ); + return [NSString stringWithFormat: + @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", + result[0], result[1], result[2], result[3], result[4], result[5], + result[6], result[7], result[8], result[9], result[10], result[11], + result[12], result[13], result[14], result[15]]; +} + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.h --- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.h Sun Oct 16 21:03:30 2011 +0200 @@ -23,27 +23,20 @@ #import "SDL_uikitappdelegate.h" @class MainMenuViewController; -@class AVAudioPlayer; @interface HedgewarsAppDelegate : SDLUIKitDelegate { MainMenuViewController *mainViewController; UIWindow *uiwindow; UIWindow *secondWindow; BOOL isInGame; - AVAudioPlayer *backgroundMusic; } @property (nonatomic,retain) MainMenuViewController *mainViewController; @property (nonatomic,retain) UIWindow *uiwindow; @property (nonatomic,retain) UIWindow *secondWindow; @property (assign) BOOL isInGame; -@property (nonatomic,retain) AVAudioPlayer *backgroundMusic; +(HedgewarsAppDelegate *)sharedAppDelegate; -+(void) playBackgroundMusic; -+(void) pauseBackgroundMusic; -+(void) stopBackgroundMusic; -+(void) loadBackgroundMusic; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m --- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,11 +20,8 @@ #import "HedgewarsAppDelegate.h" -#import "PascalImports.h" +#import "MainMenuViewController.h" #import "ObjcExports.h" -#import "CommodityFunctions.h" -#import "MainMenuViewController.h" -#import "AVFoundation/AVAudioPlayer.h" #include @@ -37,7 +34,7 @@ @end @implementation HedgewarsAppDelegate -@synthesize mainViewController, uiwindow, secondWindow, isInGame, backgroundMusic; +@synthesize mainViewController, uiwindow, secondWindow, isInGame; // convenience method +(HedgewarsAppDelegate *)sharedAppDelegate { @@ -45,34 +42,6 @@ } #pragma mark - -#pragma mark Music control -+(void) playBackgroundMusic { - if ([HedgewarsAppDelegate sharedAppDelegate].backgroundMusic == nil) - [HedgewarsAppDelegate loadBackgroundMusic]; - [[HedgewarsAppDelegate sharedAppDelegate].backgroundMusic play]; -} - -+(void) pauseBackgroundMusic { - [[HedgewarsAppDelegate sharedAppDelegate].backgroundMusic pause]; -} - -+(void) stopBackgroundMusic { - [[HedgewarsAppDelegate sharedAppDelegate].backgroundMusic stop]; -} - -+(void) loadBackgroundMusic { - NSString *musicString = [[NSBundle mainBundle] pathForResource:@"hwclassic" ofType:@"mp3"]; - AVAudioPlayer *background = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:musicString] error:nil]; - - background.delegate = nil; - background.volume = 0.4f; - background.numberOfLoops = -1; - [background prepareToPlay]; - [HedgewarsAppDelegate sharedAppDelegate].backgroundMusic = background; - [background release]; -} - -#pragma mark - #pragma mark AppDelegate methods -(id) init { if (self = [super init]){ @@ -80,7 +49,6 @@ uiwindow = nil; secondWindow = nil; isInGame = NO; - backgroundMusic = nil; } return self; } @@ -89,7 +57,6 @@ [mainViewController release]; [uiwindow release]; [secondWindow release]; - [backgroundMusic release]; [super dealloc]; } @@ -125,18 +92,16 @@ -(void) applicationDidReceiveMemoryWarning:(UIApplication *)application { // don't stop music when it is playing if (self.isInGame) { - [self.backgroundMusic stop]; - self.backgroundMusic = nil; + [AudioManagerController cleanupMemory]; MSG_MEMCLEAN(); } - print_free_memory(); // don't clean mainMenuViewController here!!! } // true multitasking with sdl works only on 4.2 and above; we close the game to avoid a black screen at return -(void) applicationWillResignActive:(UIApplication *)application { if (self.isInGame && [[[UIDevice currentDevice] systemVersion] floatValue] < 4.2f) - HW_terminate(NO); + HW_terminate(NO); [super applicationWillResignActive:application]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HelpPageInGameViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/HelpPageInGameViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,889 @@ + + + + 1024 + 10F569 + 788 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 117 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 292 + {{0, -1}, {1024, 768}} + + NO + NO + IBIPadFramework + + NSImage + helpingame.png + + + + + 292 + {{79, 473}, {150, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Direction buttons + + Helvetica-Bold + 18 + 16 + + + 1 + MCAwIDAAA + + + 1 + 10 + + + + 292 + {{79, 491}, {203, 85}} + + NO + YES + 7 + NO + IBIPadFramework + With these buttons you can move your hog, aim and control certain weapons. + + Helvetica + 16 + 16 + + + + 1 + 10 + 0 + + + + 292 + {{53, 97}, {186, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Timer + + + + 1 + 10 + + + + 292 + {{53, 118}, {187, 43}} + + NO + YES + 7 + NO + IBIPadFramework + Don't let your turn time run out! + + + + 1 + 10 + 0 + + + + 292 + {{780, 248}, {240, 128}} + + NO + NO + IBIPadFramework + + NSImage + helpright.png + + + + + 292 + {{790, 256}, {109, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Ammo Menu + + + + 1 + 10 + + + + 292 + {{790, 282}, {214, 84}} + + NO + YES + 7 + NO + IBIPadFramework + This menu contains all the weapons you can use. Drag your finger on a weapon for more details on what it does! + + + + 1 + 10 + 0 + + + + 292 + {{780, 97}, {186, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Pause / Open ammos + + + + 1 + 10 + + + + 292 + {{782, 118}, {187, 43}} + + NO + YES + 7 + NO + IBIPadFramework + Tap to pause or open the ammo menu. + + + + 1 + 10 + 0 + + + + 292 + {{418, 73}, {186, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Wind bar + + + + 1 + 10 + + + + 292 + {{418, 89}, {191, 63}} + + NO + YES + 7 + NO + IBIPadFramework + Some weapons are affected by the wind and their direction may shift. + + + + 1 + 10 + 0 + + + + 292 + {{447, 573}, {203, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Teams flags and health + + + + 1 + 10 + + + + 292 + {{447, 592}, {203, 85}} + + NO + YES + 7 + NO + IBIPadFramework + These bars report the team name, the team flags and the global health status of every hog. + + + + 1 + 10 + 4 + + + + 292 + {{741, 501}, {135, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Joypad buttons + + + + 1 + 10 + + + + 292 + {{741, 520}, {211, 85}} + + NO + YES + 7 + NO + IBIPadFramework + Press X to jump forward, Y to jump backwards (double tap to jump twice) and Missile to attack or use items. + + + + 1 + 10 + 0 + + + + 292 + {{67, 238}, {240, 128}} + + NO + NO + IBIPadFramework + + NSImage + helpplain.png + + + + + 292 + {{72, 246}, {229, 22}} + + NO + YES + 7 + NO + IBIPadFramework + Tap to return to game + + + + 1 + 10 + 1 + + + + 292 + {{72, 268}, {229, 87}} + + NO + YES + 7 + NO + IBIPadFramework + Pan to move camera, pinch to zoom, double tap to center hog, and a single touch to interact with weapons and much more! + + + + 1 + 10 + 0 + + + {1024, 768} + + + 3 + MCAwLjQAA + + NO + NO + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + dismiss + + + 7 + + 16 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 10 + + + + + 11 + + + + + 12 + + + + + 13 + + + + + 14 + + + + + 17 + + + + + 18 + + + + + 21 + + + + + 22 + + + + + 23 + + + + + 24 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 10.IBPluginDependency + 11.IBPluginDependency + 12.IBPluginDependency + 13.IBPluginDependency + 14.IBPluginDependency + 17.IBPluginDependency + 18.IBPluginDependency + 2.CustomClassName + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 21.IBPluginDependency + 22.IBPluginDependency + 23.IBPluginDependency + 24.IBPluginDependency + 25.IBPluginDependency + 26.IBPluginDependency + 27.IBPluginDependency + 5.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + 8.IBPluginDependency + 9.IBPluginDependency + + + YES + HelpPageViewController + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + UIControl + {{288, 355}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 27 + + + + YES + + HelpPageViewController + UIViewController + + dismiss + id + + + dismiss + + dismiss + id + + + + IBProjectSource + Classes/HelpPageViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + helpingame.png + helpplain.png + helpright.png + + + YES + {1024, 768} + {296, 138} + {308, 144} + + + 117 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HelpPageInGameViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/HelpPageInGameViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1014 @@ + + + + 1056 + 10H574 + 823 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + 274 + + YES + + + 292 + {{20, 283}, {150, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Direction buttons + + Helvetica-Bold + 18 + 16 + + + 1 + MCAwIDAAA + + + 1 + 10 + + + + 292 + {{20, 292}, {203, 85}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + With these buttons you can move your hog, aim and control certain weapons. + + Helvetica + 16 + 16 + + + + 1 + 10 + 0 + + + + 292 + {{20, 13}, {186, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Timer + + + + 1 + 10 + + + + 292 + {{20, 34}, {187, 43}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Don't let your turn time run out! + + + + 1 + 10 + 0 + + + + 292 + {{217, 308}, {243, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Touch interface + + + + 1 + 10 + 2 + + + + 292 + {{231, 328}, {229, 87}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Pan to move camera, pinch to zoom, double tap to center hog, and a single touch to interact with weapons and much more! + + + + 1 + 10 + 0 + 2 + + + + 292 + {{20, 85}, {186, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Wind bar + + + + 1 + 10 + + + + 292 + {{20, 101}, {191, 63}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Some weapons are affected by the wind and their direction may shift. + + + + 1 + 10 + 0 + + + + 292 + {{20, 172}, {203, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Teams flags and health + + + + 1 + 10 + + + + 292 + {{20, 191}, {203, 85}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + These bars report the team name, the team flags and the global health status of every hog. + + + + 1 + 10 + 4 + + + + 292 + {{274, 13}, {186, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Pause / Open ammos + + + + 1 + 10 + 2 + + + + 292 + {{273, 35}, {187, 43}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Tap to pause or open the ammo menu. + + + + 1 + 10 + 0 + 2 + + + + 292 + {{351, 82}, {109, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Ammo Menu + + + + 1 + 10 + 2 + + + + 292 + {{246, 105}, {214, 84}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + This menu contains all the weapons you can use. Drag your finger on a weapon for more details on what it does! + + + + 1 + 10 + 0 + 2 + + + + 292 + {{325, 197}, {135, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Joypad buttons + + + + 1 + 10 + 2 + + + + 292 + {{249, 217}, {211, 85}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Press X to jump forward, Y to jump backwards (double tap to jump twice) and Missile to attack or use items. + + + + 1 + 10 + 0 + 2 + + + {{-5, 44}, {489, 332}} + + YES + YES + 1 + IBCocoaTouchFramework + + + + 290 + {{-1, 0}, {481, 44}} + + IBCocoaTouchFramework + + YES + + + Help page + + Back + IBCocoaTouchFramework + 1 + + + IBCocoaTouchFramework + + + + + {480, 320} + + + 2 + MC45OTYwNzg0OTEyIDAuOTg4MjM1MzU0NCAxAA + + NO + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + dismiss + + + + 141 + + + + scrollView + + + + 142 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + 118 + + + YES + + + + + + 121 + + + YES + + + + + + + + + + + + + + + + + + + + + 122 + + + + + 124 + + + + + 125 + + + + + 126 + + + + + 127 + + + + + 128 + + + + + 129 + + + + + 130 + + + + + 131 + + + + + 132 + + + + + 133 + + + + + 134 + + + + + 135 + + + + + 136 + + + + + 137 + + + + + 138 + + + + + 119 + + + YES + + + + + + 140 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 118.IBPluginDependency + 118.IBViewBoundsToFrameTransform + 119.IBPluginDependency + 121.IBEditorWindowLastContentRect + 121.IBPluginDependency + 121.IBViewBoundsToFrameTransform + 122.IBPluginDependency + 122.IBViewBoundsToFrameTransform + 124.IBPluginDependency + 124.IBViewBoundsToFrameTransform + 125.IBPluginDependency + 125.IBViewBoundsToFrameTransform + 126.IBPluginDependency + 126.IBViewBoundsToFrameTransform + 127.IBPluginDependency + 127.IBViewBoundsToFrameTransform + 128.IBPluginDependency + 128.IBViewBoundsToFrameTransform + 129.IBPluginDependency + 129.IBViewBoundsToFrameTransform + 130.IBPluginDependency + 130.IBViewBoundsToFrameTransform + 131.IBPluginDependency + 131.IBViewBoundsToFrameTransform + 132.IBPluginDependency + 132.IBViewBoundsToFrameTransform + 133.IBPluginDependency + 133.IBViewBoundsToFrameTransform + 134.IBPluginDependency + 134.IBViewBoundsToFrameTransform + 135.IBPluginDependency + 135.IBViewBoundsToFrameTransform + 136.IBPluginDependency + 136.IBViewBoundsToFrameTransform + 137.IBPluginDependency + 137.IBViewBoundsToFrameTransform + 138.IBPluginDependency + 138.IBViewBoundsToFrameTransform + 140.IBPluginDependency + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 2.IBViewBoundsToFrameTransform + + + YES + HelpPageViewController + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AQAAAADAQAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{589, 578}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AcCgAABCMAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDZwAAw7aAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCVAAAwx8AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAwnQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCxgAAwtYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCxgAAwyQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw+SAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAxARAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw6aAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw8+AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDZwAAw+EAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDiQAAwmwAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDiIAAwswAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDr4AAwwUAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDdgAAw1oAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDooAAw3gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDeQAAw6aAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{165, 514}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw4kAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 142 + + + + YES + + HelpPageViewController + UIViewController + + dismiss + id + + + dismiss + + dismiss + id + + + + scrollView + UIScrollView + + + scrollView + + scrollView + UIScrollView + + + + IBProjectSource + Classes/HelpPageViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UINavigationBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UINavigationBar.h + + + + UINavigationItem + NSObject + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1135 @@ + + + + 1024 + 10F569 + 804 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 123 + + + YES + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 292 + {{742, 389}, {240, 102}} + + + NO + NO + IBIPadFramework + + NSImage + helpabove.png + + + + + 292 + {{753, 408}, {109, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Map theme + + Helvetica-Bold + 18 + 16 + + + 1 + MCAwIDAAA + + + 1 + 10 + + + + 292 + {{753, 425}, {218, 66}} + + + NO + YES + 7 + NO + IBIPadFramework + Here you can choose how your map will appear in game. + + Helvetica + 16 + 16 + + + + 1 + 10 + 0 + + + + 292 + {{653, 202}, {240, 146}} + + + NO + NO + IBIPadFramework + + + + + 292 + {{664, 223}, {109, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Map type + + + + 1 + 10 + + + + 292 + {{664, 244}, {218, 99}} + + + NO + YES + 7 + NO + IBIPadFramework + Choose between a static map or a randomly generated one (might require more time). In a mission you need to perfom some action to win. + + + + 1 + 10 + 0 + + + + 292 + {{494, 20}, {240, 101}} + + + NO + NO + IBIPadFramework + + NSImage + helpright.png + + + + + 292 + {{502, 25}, {109, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Map preview + + + + 1 + 10 + + + + 292 + {{502, 46}, {218, 65}} + + + NO + YES + 7 + NO + IBIPadFramework + This is a small preview of your next map. Tap to select / generate a new map. + + + + 1 + 10 + 0 + + + + 292 + {{391, 389}, {242, 171}} + + + NO + NO + IBIPadFramework + + + + + 292 + {{401, 413}, {109, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Teams + + + + 1 + 10 + + + + 292 + {{400, 434}, {232, 120}} + + + NO + YES + 7 + NO + IBIPadFramework + Select which teams are playing! Add hogs by tapping on them and set their color to figure friend and foe teams out. AI teams will appear with a small robot badge next their name. + + + + 1 + 10 + 0 + + + + 292 + {{142, 125}, {240, 104}} + + + NO + NO + IBIPadFramework + + NSImage + helpleft.png + + + + + 292 + {{162, 133}, {204, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Schemes and Weapons + + + + 1 + 10 + + + + 292 + {{162, 152}, {210, 71}} + + + NO + YES + 7 + NO + IBIPadFramework + Here you can choose which rules and which weapon set will be applied in game. + + + + 1 + 10 + 0 + + + + 292 + {{155, 8}, {278, 50}} + + + NO + NO + IBIPadFramework + + + + + 292 + {{177, 6}, {248, 54}} + + + NO + YES + 7 + NO + IBIPadFramework + Did you know you can customize almost everything in the settings page? + + Helvetica-Oblique + 14 + 16 + + + + 1 + 10 + 0 + + + + 292 + {{686, 583}, {240, 117}} + + + NO + NO + IBIPadFramework + + NSImage + helpbottom.png + + + + + 292 + {{697, 592}, {138, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Max hedgehogs + + + + 1 + 10 + + + + 292 + {{697, 609}, {218, 73}} + + + NO + YES + 7 + NO + IBIPadFramework + This number is the maximum size for all the hogs playing (in every team). + + + + 1 + 10 + 0 + + + + 292 + {{20, 587}, {240, 109}} + + + NO + NO + IBIPadFramework + + + + + 292 + {{30, 592}, {138, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Size slider + + + + 1 + 10 + + + + 292 + {{30, 608}, {218, 73}} + + + NO + YES + 7 + NO + IBIPadFramework + For Random and Maze maps you can decide to generate only maps of a certain size. + + + + 1 + 10 + 0 + + + + 292 + {{45, 318}, {240, 128}} + + + NO + NO + IBIPadFramework + + NSImage + helpplain.png + + + + + 292 + {{50, 326}, {229, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Tap anywhere to dismiss + + + + 1 + 10 + 1 + + + + 292 + {{52, 348}, {224, 87}} + + + NO + YES + 7 + NO + IBIPadFramework + Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you. + + + + 1 + 10 + 0 + + + + 292 + {{344, 635}, {240, 61}} + + + NO + NO + IBIPadFramework + + + + + 292 + {{353, 637}, {138, 22}} + + + NO + YES + 7 + NO + IBIPadFramework + Start button + + + + 1 + 10 + + + + 292 + {{354, 650}, {218, 46}} + + + NO + YES + 7 + NO + IBIPadFramework + This button starts the game. + + + + 1 + 10 + 0 + + + {1024, 768} + + + + 3 + MCAwLjQAA + + NO + NO + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + dismiss + + + 7 + + 16 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 25 + + + + + 26 + + + + + 27 + + + + + 28 + + + + + 29 + + + + + 30 + + + + + 34 + + + + + 35 + + + + + 36 + + + + + 37 + + + + + 38 + + + + + 39 + + + + + 40 + + + + + 41 + + + + + 42 + + + + + 43 + + + + + 44 + + + + + 45 + + + + + 49 + + + + + 50 + + + + + 51 + + + + + 52 + + + + + 53 + + + + + 54 + + + + + 58 + + + + + 59 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.CustomClassName + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 25.IBPluginDependency + 26.IBPluginDependency + 27.IBPluginDependency + 28.IBPluginDependency + 29.IBPluginDependency + 30.IBPluginDependency + 34.IBPluginDependency + 35.IBPluginDependency + 36.IBPluginDependency + 37.IBPluginDependency + 38.IBPluginDependency + 39.IBPluginDependency + 40.IBPluginDependency + 41.IBPluginDependency + 42.IBPluginDependency + 43.IBPluginDependency + 44.IBPluginDependency + 45.IBPluginDependency + 49.IBPluginDependency + 50.IBPluginDependency + 51.IBPluginDependency + 52.IBPluginDependency + 53.IBPluginDependency + 54.IBPluginDependency + 58.IBPluginDependency + 59.IBPluginDependency + 6.IBPluginDependency + 7.IBPluginDependency + 8.IBPluginDependency + + + YES + HelpPageViewController + UIResponder + UIControl + {{273, 125}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 59 + + + + YES + + HelpPageViewController + UIViewController + + dismiss + id + + + dismiss + + dismiss + id + + + + IBProjectSource + Classes/HelpPageViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + helpabove.png + helpbottom.png + helpleft.png + helpplain.png + helpright.png + + + YES + {295, 156} + {295, 156} + {308, 144} + {296, 138} + {308, 144} + + + 123 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/HelpPageLobbyViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,907 @@ + + + + 1024 + 10F569 + 804 + 1038.29 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 123 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 292 + + YES + + + 268 + + YES + + + 292 + {{20, 587}, {440, 52}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you. + + Helvetica + 16 + 16 + + + 1 + MCAwIDAAA + + + 1 + 10 + 0 + 1 + + + + 292 + {{20, 279}, {138, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Size slider + + Helvetica-Bold + 18 + 16 + + + + 1 + 10 + + + + 292 + {{20, 298}, {440, 44}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + For Random and Maze maps you can decide to generate only maps of a certain size. + + + + 1 + 10 + 0 + + + + 292 + {{20, 511}, {204, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Schemes and Weapons + + + + 1 + 10 + + + + 292 + {{20, 530}, {433, 45}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Here you can choose which rules and which weapon set will be applied in game. + + + + 1 + 10 + 0 + + + + 292 + {{20, 68}, {109, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Map preview + + + + 1 + 10 + + + + 292 + {{20, 88}, {440, 44}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + This is a small preview of your next map. Tap to select / generate a new map. + + + + 1 + 10 + 0 + + + + 292 + {{20, 140}, {109, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Map type + + + + 1 + 10 + + + + 292 + {{20, 164}, {440, 58}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Choose between a static map or a randomly generated one (might require more time). In a mission you need to perfom some action to win. + + + + 1 + 10 + 0 + + + + 292 + {{20, 229}, {109, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Map theme + + + + 1 + 10 + + + + 292 + {{20, 244}, {440, 33}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Here you can choose how your map will appear in game. + + + + 1 + 10 + 0 + + + + 292 + {{20, 347}, {138, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Max hedgehogs + + + + 1 + 10 + + + + 292 + {{20, 367}, {440, 41}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + This number is the maximum size for all the hogs playing (in every team). + + + + 1 + 10 + 0 + + + + 292 + {{20, 418}, {109, 22}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Teams + + + + 1 + 10 + + + + 292 + {{20, 436}, {433, 66}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Select which teams are playing! Add hogs by tapping on them and set their color to figure friend and foe teams out. AI teams will appear with a small robot badge next their name. + + + + 1 + 10 + 0 + + + + 292 + {{13, 3}, {440, 60}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Here you can find help for the game configuration options. You can customize almost everything in the settings page. + + Helvetica-Oblique + 16 + 16 + + + + 1 + 10 + 0 + 1 + + + {480, 276} + + YES + YES + IBCocoaTouchFramework + + + {480, 276} + + + 2 + MC45OTYwNzg0OTEyIDAuOTg4MjM1MzU0NCAxAA + + NO + NO + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + scrollView + + + + 95 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + 60 + + + YES + + + + + + + + + + + + + + + + + + + + + 61 + + + + + 62 + + + + + 63 + + + + + 64 + + + + + 65 + + + + + 66 + + + + + 67 + + + + + 68 + + + + + 69 + + + + + 70 + + + + + 71 + + + + + 72 + + + + + 73 + + + + + 74 + + + + + 75 + + + + + 76 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 60.IBPluginDependency + 60.IBViewBoundsToFrameTransform + 61.IBPluginDependency + 61.IBViewBoundsToFrameTransform + 62.IBPluginDependency + 62.IBViewBoundsToFrameTransform + 63.IBPluginDependency + 63.IBViewBoundsToFrameTransform + 64.IBPluginDependency + 64.IBViewBoundsToFrameTransform + 65.IBPluginDependency + 65.IBViewBoundsToFrameTransform + 66.IBPluginDependency + 66.IBViewBoundsToFrameTransform + 67.IBPluginDependency + 67.IBViewBoundsToFrameTransform + 68.IBPluginDependency + 68.IBViewBoundsToFrameTransform + 69.IBPluginDependency + 69.IBViewBoundsToFrameTransform + 70.IBPluginDependency + 70.IBViewBoundsToFrameTransform + 71.IBPluginDependency + 71.IBViewBoundsToFrameTransform + 72.IBPluginDependency + 72.IBViewBoundsToFrameTransform + 73.IBPluginDependency + 73.IBViewBoundsToFrameTransform + 74.IBPluginDependency + 74.IBViewBoundsToFrameTransform + 75.IBPluginDependency + 75.IBViewBoundsToFrameTransform + 76.IBPluginDependency + 76.IBViewBoundsToFrameTransform + + + YES + HelpPageViewController + UIResponder + {{16, 775}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGgAABEDIAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABC+AAAw0kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw14AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw9mAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw+6AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABByAAAwqYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAwxMAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAADCQAAAwqYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAADCQAAAwzcAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDAAAAw3AAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDAAAAw5aAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDOwAAw6OAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDOwAAw8WAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDDgAAw7UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDDQAAw/CAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAADBAAAAwlQAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 95 + + + + YES + + HelpPageViewController + UIViewController + + dismiss + id + + + dismiss + + dismiss + id + + + + scrollView + UIScrollView + + + scrollView + + scrollView + UIScrollView + + + + IBProjectSource + Classes/HelpPageViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + 123 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HelpPageViewController.m --- a/project_files/HedgewarsMobile/Classes/HelpPageViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HelpPageViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "HelpPageViewController.h" -#import "CommodityFunctions.h" + @implementation HelpPageViewController @synthesize scrollView; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HogHatViewController.m --- a/project_files/HedgewarsMobile/Classes/HogHatViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HogHatViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,8 +20,7 @@ #import "HogHatViewController.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" + @implementation HogHatViewController @synthesize teamDictionary, hatArray, normalHogSprite, lastIndexPath, selectedHog; @@ -48,7 +47,7 @@ self.normalHogSprite = hogSprite; [hogSprite release]; - self.title = NSLocalizedString(@"Change hedgehog's hat",@""); + self.title = NSLocalizedString(@"Change hedgehogs' hat",@""); } -(void) viewWillAppear:(BOOL)animated { diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HoldTableViewCell.h --- a/project_files/HedgewarsMobile/Classes/HoldTableViewCell.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HoldTableViewCell.h Sun Oct 16 21:03:30 2011 +0200 @@ -23,7 +23,7 @@ @protocol HoldTableViewCellDelegate --(void) holdAction:(NSString *)content; +-(void) holdAction:(NSString *)content onTable:(UITableView *)aTableView; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/HoldTableViewCell.m --- a/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/HoldTableViewCell.m Sun Oct 16 21:03:30 2011 +0200 @@ -58,8 +58,8 @@ } -(void) holdAction { - if (self.delegate != nil && [self.delegate respondsToSelector:@selector(holdAction:)]) - [self.delegate holdAction:self.textLabel.text]; + if (self.delegate != nil && [self.delegate respondsToSelector:@selector(holdAction:onTable:)]) + [self.delegate holdAction:self.textLabel.text onTable:(UITableView *)self.superview]; } -(void) dealloc { diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/InGameMenuViewController.h --- a/project_files/HedgewarsMobile/Classes/InGameMenuViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/InGameMenuViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -31,6 +31,6 @@ -(void) present; -(void) dismiss; --(void) saveCurrentScreenToPhotoAlbum:(UIAlertView *)alert; +//-(void) saveCurrentScreenToPhotoAlbum:(UIAlertView *)alert; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/InGameMenuViewController.m --- a/project_files/HedgewarsMobile/Classes/InGameMenuViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/InGameMenuViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,11 +20,9 @@ #import "InGameMenuViewController.h" -#import "PascalImports.h" -#import "CommodityFunctions.h" #import "SDL_sysvideo.h" #import "SDL_uikitkeyboard.h" -#import "OpenGLES/ES1/gl.h" + #define VIEW_HEIGHT 200 @@ -90,6 +88,7 @@ SDL_iPhoneKeyboardHide((SDL_Window *)HW_getSDLWindow()); + /* if (shouldTakeScreenshot) { UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Please wait" message:nil @@ -107,6 +106,7 @@ // all these hacks because of the PAUSE caption on top of everything... [self performSelector:@selector(saveCurrentScreenToPhotoAlbum:) withObject:alert afterDelay:0.3]; } + */ shouldTakeScreenshot = NO; } @@ -139,7 +139,7 @@ -(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { UIActionSheet *actionSheet; - UIAlertView *alert; +// UIAlertView *alert; switch ([indexPath row]) { case 0: @@ -192,6 +192,7 @@ } //TODO: check this is still needed since we switched to SDL_GL_CreateContext() +/* #pragma mark - #pragma mark save screenshot //by http://www.bit-101.com/blog/?p=1861 @@ -247,6 +248,6 @@ // add callback for cleaning memory and removing alert UIImageWriteToSavedPhotosAlbum(image, self, @selector(image:didFinishSavingWithError:contextInfo:), (void *)alert); } - +*/ @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/LevelViewController.m --- a/project_files/HedgewarsMobile/Classes/LevelViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/LevelViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,6 @@ #import "LevelViewController.h" -#import "CommodityFunctions.h" @implementation LevelViewController diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,670 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 274 + {1024, 768} + + NO + IBIPadFramework + + NSImage + background.png + + + + + 292 + {{383, 389}, {263, 244}} + + NO + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + 215 + 0.0 + 0.0 + 0.0 + + 3 + MQA + + + 2 + MC45OTYwNzg0OTEyIDAuODAwMDAwMDcxNSAwLjAzOTIxNTY4NzY2AA + + + 3 + MC41AA + + + NSImage + localplayButton~ipad.png + + + + + 292 + {{795, 317}, {18, 19}} + + NO + 0.31690141558647156 + 3 + IBIPadFramework + 0 + 0 + + 3 + YES + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + 292 + {{940, 686}, {64, 64}} + + NO + 2 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + settingsButton.png + + + + + 292 + {{20, 686}, {64, 64}} + + NO + 4 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + savesButton.png + + + + + 292 + {{242, 43}, {540, 300}} + + NO + IBIPadFramework + + NSImage + title~ipad.png + + + + + 292 + {{468, 686}, {89, 37}} + + NO + 5 + IBIPadFramework + 0 + 0 + + 1 + Missions + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + {1024, 768} + + + 1 + MCAwIDAAA + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + switchViews: + + + 7 + + 47 + + + + switchViews: + + + 7 + + 48 + + + + switchViews: + + + 7 + + 54 + + + + switchViews: + + + 7 + + 89 + + + + switchViews: + + + 7 + + 92 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 39 + + + local + + + 45 + + + + + 52 + + + + + 37 + + + + + 88 + + + + + 90 + + + + + 91 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 37.IBPluginDependency + 39.IBPluginDependency + 45.IBPluginDependency + 45.IBViewBoundsToFrameTransform + 52.IBPluginDependency + 52.IBViewBoundsToFrameTransform + 88.IBPluginDependency + 88.IBViewBoundsToFrameTransform + 90.IBPluginDependency + 90.IBViewBoundsToFrameTransform + 91.IBPluginDependency + 91.IBViewBoundsToFrameTransform + + + YES + MainMenuViewController + UIResponder + {{267, 388}, {1024, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABERQAAw56AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEaQAAxDsAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAxDsAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDbQAAw6qAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUPqAABEK4AAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 92 + + + + YES + + MainMenuViewController + UIViewController + + switchViews: + id + + + switchViews: + + switchViews: + id + + + + IBProjectSource + Classes/MainMenuViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + background.png + localplayButton~ipad.png + savesButton.png + settingsButton.png + title~ipad.png + + + YES + {1024, 768} + {263, 244} + {64, 64} + {64, 64} + {540, 300} + + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,687 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 293 + + YES + + + 274 + {480, 320} + + + 3 + MCAwAA + + 4 + NO + IBCocoaTouchFramework + + NSImage + background~iphone.png + + + + + 293 + {{105, 20}, {270, 150}} + + NO + NO + 4 + NO + IBCocoaTouchFramework + + NSImage + title~iphone.png + + + + + 289 + {{190, 200}, {100, 100}} + + + 1 + MCAwIDAgMAA + + NO + NO + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + 3 + MQA + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + 3 + MC41AA + + + NSImage + localplayButton~iphone.png + + + + + 269 + {{396, 236}, {64, 64}} + + NO + NO + 2 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + settingsButton.png + + + + + 269 + {{20, 236}, {64, 64}} + + NO + NO + 4 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + savesButton.png + + + + + 292 + {{20, 19}, {18, 19}} + + NO + 0.5 + 3 + IBCocoaTouchFramework + 0 + 0 + + 3 + YES + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + + 292 + {{439, 13}, {29, 31}} + + NO + 5 + IBCocoaTouchFramework + 0 + 0 + + 2 + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + + {480, 320} + + + 1 + MCAwIDAAA + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + switchViews: + + + 7 + + 30 + + + + switchViews: + + + 7 + + 40 + + + + switchViews: + + + 7 + + 42 + + + + switchViews: + + + 7 + + 44 + + + + switchViews: + + + 7 + + 47 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 23 + + + + + 22 + + + + + 41 + + + + + 43 + + + + + 24 + + + + + 28 + + + + + 46 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 22.IBPluginDependency + 22.IBViewBoundsToFrameTransform + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + 24.IBPluginDependency + 24.IBViewBoundsToFrameTransform + 28.IBPluginDependency + 28.IBViewBoundsToFrameTransform + 41.IBPluginDependency + 41.IBViewBoundsToFrameTransform + 43.IBPluginDependency + 43.IBViewBoundsToFrameTransform + 46.IBPluginDependency + 46.IBViewBoundsToFrameTransform + + + YES + MainMenuViewController + UIResponder + {{517, 519}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw5UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCygAAwzcAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDPgAAw5UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDxgAAw5iAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBcAAAwhAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw5iAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABD0YAAwmgAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 47 + + + + YES + + MainMenuViewController + UIViewController + + switchViews: + id + + + switchViews: + + switchViews: + id + + + + IBProjectSource + Classes/MainMenuViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + background~iphone.png + localplayButton~iphone.png + savesButton.png + settingsButton.png + title~iphone.png + + + YES + {480, 320} + {100, 100} + {64, 64} + {64, 64} + {270, 150} + + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MainMenuViewController.h --- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -22,24 +22,27 @@ #import @class GameConfigViewController; -@class SplitViewRootController; +@class SettingsContainerViewController; @class AboutViewController; @class SavedGamesViewController; @class RestoreViewController; +@class MissionTrainingViewController; @interface MainMenuViewController : UIViewController { GameConfigViewController *gameConfigViewController; - SplitViewRootController *settingsViewController; + SettingsContainerViewController *settingsViewController; AboutViewController *aboutViewController; SavedGamesViewController *savedGamesViewController; - RestoreViewController *restoreViewCOntroller; + RestoreViewController *restoreViewController; + MissionTrainingViewController *missionsViewController; } @property (nonatomic,retain) GameConfigViewController *gameConfigViewController; -@property (nonatomic,retain) SplitViewRootController *settingsViewController; +@property (nonatomic,retain) SettingsContainerViewController *settingsViewController; @property (nonatomic,retain) AboutViewController *aboutViewController; @property (nonatomic,retain) SavedGamesViewController *savedGamesViewController; @property (nonatomic,retain) RestoreViewController *restoreViewController; +@property (nonatomic,retain) MissionTrainingViewController *missionsViewController; -(IBAction) switchViews:(id)sender; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MainMenuViewController.m --- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -21,17 +21,20 @@ #import "MainMenuViewController.h" #import "CreationChamber.h" -#import "PascalImports.h" #import "GameConfigViewController.h" -#import "SplitViewRootController.h" +#import "SettingsContainerViewController.h" #import "AboutViewController.h" #import "SavedGamesViewController.h" #import "RestoreViewController.h" +#import "MissionTrainingViewController.h" +#import "GameInterfaceBridge.h" #import "Appirater.h" #import "ServerSetup.h" + @implementation MainMenuViewController -@synthesize gameConfigViewController, settingsViewController, aboutViewController, savedGamesViewController, restoreViewController; +@synthesize gameConfigViewController, settingsViewController, aboutViewController, savedGamesViewController, + restoreViewController, missionsViewController; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { return rotationManager(interfaceOrientation); @@ -39,59 +42,45 @@ // check if some configuration files are already set; if they are present it means that the current copy must be updated -(void) createNecessaryFiles { - NSString *resourcesDir = [[NSBundle mainBundle] resourcePath]; DLog(@"Creating necessary files"); + NSInteger index; // SAVES - just delete and overwrite if ([[NSFileManager defaultManager] fileExistsAtPath:SAVES_DIRECTORY()]) [[NSFileManager defaultManager] removeItemAtPath:SAVES_DIRECTORY() error:NULL]; - [[NSFileManager defaultManager] createDirectoryAtPath:SAVES_DIRECTORY() withIntermediateDirectories:NO attributes:nil error:NULL]; + [[NSFileManager defaultManager] createDirectoryAtPath:SAVES_DIRECTORY() + withIntermediateDirectories:NO + attributes:nil + error:NULL]; // SETTINGS - nsuserdefaults ftw - createSettings(); + [CreationChamber createSettings]; // TEAMS - update exisiting teams with new format - if ([[NSFileManager defaultManager] fileExistsAtPath:TEAMS_DIRECTORY()] == NO) { - [[NSFileManager defaultManager] createDirectoryAtPath:TEAMS_DIRECTORY() - withIntermediateDirectories:YES - attributes:nil - error:NULL]; - // we copy teams only the first time because it's unlikely that newer ones are going to be added - NSString *baseTeamsDir = [[NSString alloc] initWithFormat:@"%@/Settings/Teams/",resourcesDir]; - for (NSString *str in [[NSFileManager defaultManager] contentsOfDirectoryAtPath:baseTeamsDir error:NULL]) { - NSString *sourceFile = [baseTeamsDir stringByAppendingString:str]; - NSString *destinationFile = [TEAMS_DIRECTORY() stringByAppendingString:str]; - [[NSFileManager defaultManager] removeItemAtPath:destinationFile error:NULL]; - [[NSFileManager defaultManager] copyItemAtPath:sourceFile toPath:destinationFile error:NULL]; - } - [baseTeamsDir release]; - } - // merge not needed as format rarely changes + NSArray *teamNames = [[NSArray alloc] initWithObjects:@"Edit Me!",@"Ninjas",@"Pirates",@"Robots",nil]; + index = 0; + for (NSString *name in teamNames) + [CreationChamber createTeamNamed:name ofType:index++ controlledByAI:[name isEqualToString:@"Robots"]]; + [teamNames release]; // SCHEMES - always overwrite and delete custom ones if ([[NSFileManager defaultManager] fileExistsAtPath:SCHEMES_DIRECTORY()] == YES) [[NSFileManager defaultManager] removeItemAtPath:SCHEMES_DIRECTORY() error:NULL]; - createSchemeNamed(@"Default", 0); - createSchemeNamed(@"Pro Mode", 1); - createSchemeNamed(@"Shoppa", 2); - createSchemeNamed(@"Clean Slate", 3); - createSchemeNamed(@"Minefield", 4); - createSchemeNamed(@"Barrel Mayhem", 5); - createSchemeNamed(@"Tunnel Hogs", 6); - createSchemeNamed(@"Fort Mode", 7); - createSchemeNamed(@"Timeless", 8); - createSchemeNamed(@"Thinking with Portals", 9); - createSchemeNamed(@"King Mode", 10); + NSArray *schemeNames = [[NSArray alloc] initWithObjects:@"Default",@"Pro Mode",@"Shoppa",@"Clean Slate", + @"Minefield",@"Barrel Mayhem",@"Tunnel Hogs",@"Fort Mode",@"Timeless", + @"Thinking with Portals",@"King Mode",nil]; + index = 0; + for (NSString *name in schemeNames) + [CreationChamber createSchemeNamed:name ofType:index++]; + [schemeNames release]; - // WEAPONS - always overwrite - createWeaponNamed(@"Default", 0); - createWeaponNamed(@"Crazy", 1); - createWeaponNamed(@"Pro Mode", 2); - createWeaponNamed(@"Shoppa", 3); - createWeaponNamed(@"Clean Slate", 4); - createWeaponNamed(@"Minefield", 5); - createWeaponNamed(@"Thinking with Portals", 6); - // merge not needed because weapons not present in the set are 0ed by GameSetup + // WEAPONS - always overwrite as merge is not needed (missing weaps are 0ed automatically) + NSArray *weaponNames = [[NSArray alloc] initWithObjects:@"Default",@"Crazy",@"Pro Mode",@"Shoppa",@"Clean Slate", + @"Minefield",@"Thinking with Portals",nil]; + index = 0; + for (NSString *name in weaponNames) + [CreationChamber createWeaponNamed:name ofType:index++]; + [weaponNames release]; } #pragma mark - @@ -105,9 +94,6 @@ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; NSString *trackingVersion = [userDefaults stringForKey:@"HedgeVersion"]; - if ([[userDefaults objectForKey:@"music"] boolValue]) - [HedgewarsAppDelegate playBackgroundMusic]; - if (trackingVersion == nil || [trackingVersion isEqualToString:version] == NO) { // remove any reminder of previous games as saves are going to be wiped out [userDefaults setObject:@"" forKey:@"savedGamePath"]; @@ -121,6 +107,7 @@ // prompt for restoring any previous game NSString *saveString = [userDefaults objectForKey:@"savedGamePath"]; if (saveString != nil && [saveString isEqualToString:@""] == NO) { + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(launchRestoredGame) name:@"launchRestoredGame" object:nil]; if (self.restoreViewController == nil) { NSString *xibName = [@"RestoreViewController-" stringByAppendingString:(IS_IPAD() ? @"iPad" : @"iPhone")]; RestoreViewController *restored = [[RestoreViewController alloc] initWithNibName:xibName bundle:nil]; @@ -129,7 +116,7 @@ self.restoreViewController = restored; [restored release]; } - [self performSelector:@selector(presentModalViewController:animated:) withObject:self.restoreViewController afterDelay:0.3]; + [self performSelector:@selector(presentModalViewController:animated:) withObject:self.restoreViewController afterDelay:0.25]; } else { // let's not prompt for rating when app crashed >_> [Appirater appLaunched]; @@ -148,6 +135,10 @@ */ } +-(void) viewWillAppear:(BOOL)animated { + [AudioManagerController playBackgroundMusic]; + [super viewWillAppear:animated]; +} #pragma mark - -(IBAction) switchViews:(id) sender { @@ -156,28 +147,26 @@ NSString *xib = nil; NSString *debugStr = nil; - playSound(@"clickSound"); + [AudioManagerController playClickSound]; switch (button.tag) { case 0: if (nil == self.gameConfigViewController) { - xib = IS_IPAD() ? nil : @"GameConfigViewController"; + xib = IS_IPAD() ? @"GameConfigViewController-iPad" : @"GameConfigViewController-iPhone"; GameConfigViewController *gcvc = [[GameConfigViewController alloc] initWithNibName:xib bundle:nil]; gcvc.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; self.gameConfigViewController = gcvc; [gcvc release]; } - [self presentModalViewController:self.gameConfigViewController animated:YES]; break; case 2: if (nil == self.settingsViewController) { - SplitViewRootController *svrc = [[SplitViewRootController alloc] initWithNibName:nil bundle:nil]; + SettingsContainerViewController *svrc = [[SettingsContainerViewController alloc] initWithNibName:nil bundle:nil]; svrc.modalTransitionStyle = UIModalTransitionStyleCoverVertical; self.settingsViewController = svrc; [svrc release]; } - [self presentModalViewController:self.settingsViewController animated:YES]; break; case 3: @@ -220,9 +209,20 @@ self.savedGamesViewController = savedgames; [savedgames release]; } - [self presentModalViewController:self.savedGamesViewController animated:YES]; break; + case 5: + if (nil == self.missionsViewController) { + xib = IS_IPAD() ? @"MissionTrainingViewController-iPad" : @"MissionTrainingViewController-iPhone"; + MissionTrainingViewController *missions = [[MissionTrainingViewController alloc] initWithNibName:xib bundle:nil]; + missions.modalTransitionStyle = IS_IPAD() ? UIModalTransitionStyleCoverVertical : UIModalTransitionStyleCrossDissolve; + if ([missions respondsToSelector:@selector(setModalPresentationStyle:)]) + missions.modalPresentationStyle = UIModalPresentationPageSheet; + self.missionsViewController = missions; + [missions release]; + } + [self presentModalViewController:self.missionsViewController animated:YES]; + break; default: alert = [[UIAlertView alloc] initWithTitle:@"Not Yet Implemented" message:@"Sorry, this feature is not yet implemented" @@ -235,12 +235,22 @@ } } +#pragma mark - +-(void) launchRestoredGame { + [[NSNotificationCenter defaultCenter] removeObserver:self]; + GameInterfaceBridge *bridge = [[GameInterfaceBridge alloc] initWithController:self]; + [bridge startSaveGame:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedGamePath"]]; + [bridge release]; +} + +#pragma mark - -(void) viewDidUnload { self.gameConfigViewController = nil; self.settingsViewController = nil; self.aboutViewController = nil; self.savedGamesViewController = nil; self.restoreViewController = nil; + self.missionsViewController = nil; MSG_DIDUNLOAD(); [super viewDidUnload]; } @@ -256,6 +266,8 @@ self.savedGamesViewController = nil; if (self.restoreViewController.view.superview == nil) self.restoreViewController = nil; + if (self.missionsViewController.view.superview == nil) + self.missionsViewController = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } @@ -266,6 +278,7 @@ releaseAndNil(aboutViewController); releaseAndNil(savedGamesViewController); releaseAndNil(restoreViewController); + releaseAndNil(missionsViewController); [super dealloc]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MapConfigViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,677 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 289 + {{20, 166}, {280, 30}} + + NO + IBIPadFramework + 2 + 4 + 1 + + YES + Random + Map + Maze + Mission + + + YES + + + + + + + YES + + + + + + + YES + {0, 0} + {0, 0} + {0, 0} + {0, 0} + + + YES + + + + + + + 3 + MC42NjY2NjY2NjY3AA + + + + + 274 + {{0, 214}, {320, 554}} + + + 3 + MCAwAA + + YES + YES + IBIPadFramework + YES + NO + 2 + 1 + 2 + 0 + YES + 44 + + + {320, 768} + + + NO + YES + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + segmentedControl + + + + 21 + + + + segmentedControlChanged: + + + 13 + + 22 + + + + dataSource + + + + 67 + + + + delegate + + + + 68 + + + + tableView + + + + 69 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 1 + + + YES + + + + + + + 66 + + + + + 7 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 66.IBPluginDependency + 66.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + + + YES + MapConfigViewController + UIResponder + {{289, 181}, {320, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEMAAAxCmAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAw0IAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 126 + + + + YES + + MapConfigViewController + UIViewController + + YES + + YES + mapButtonPressed: + segmentedControlChanged: + sliderChanged: + sliderEndedChanging: + + + YES + id + id + id + id + + + + YES + + YES + mapButtonPressed: + segmentedControlChanged: + sliderChanged: + sliderEndedChanging: + + + YES + + mapButtonPressed: + id + + + segmentedControlChanged: + id + + + sliderChanged: + id + + + sliderEndedChanging: + id + + + + + YES + + YES + maxLabel + previewButton + segmentedControl + sizeLabel + slider + tableView + + + YES + UILabel + MapPreviewButtonView + UISegmentedControl + UILabel + UISlider + UITableView + + + + YES + + YES + maxLabel + previewButton + segmentedControl + sizeLabel + slider + tableView + + + YES + + maxLabel + UILabel + + + previewButton + MapPreviewButtonView + + + segmentedControl + UISegmentedControl + + + sizeLabel + UILabel + + + slider + UISlider + + + tableView + UITableView + + + + + IBProjectSource + Classes/MapConfigViewController.h + + + + MapPreviewButtonView + UIButton + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + Classes/MapPreviewButtonView.h + + + + UILabel + + IBProjectSource + Classes/HWUtils.h + + + + UITableView + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISegmentedControl + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISegmentedControl.h + + + + UISlider + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISlider.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MapConfigViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,957 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 292 + {480, 276} + + NO + IBCocoaTouchFramework + + NSImage + background~iphone.png + + + + + 292 + {{9, 14}, {270, 30}} + + NO + IBCocoaTouchFramework + 2 + 4 + 1 + + YES + Random + Map + Maze + Mission + + + YES + + + + + + + YES + + + + + + + YES + {0, 0} + {0, 0} + {0, 0} + {0, 0} + + + YES + + + + + + + 3 + MC42NjY2NjY2NjY3AA + + + + + 292 + {{119, 207}, {149, 23}} + + NO + IBCocoaTouchFramework + 0 + 0 + 0.05000000074505806 + 0.05000000074505806 + + + + 292 + {{16, 58}, {256, 128}} + + NO + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + + + 292 + {{58, 221}, {48, 35}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + ... + + Helvetica-Bold + 17 + 16 + + + 2 + MC45NDExNzY1MzM3IDAuODE1Njg2MzQ1MSAwAA + + + 1 + 10 + 1 + + + + 292 + {{109, 237}, {169, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Label + + Helvetica-Oblique + 22 + 16 + + + 2 + MC45NDExNzY1MzM3IDAuODE1Njg2MzQ1MSAwAA + + + 1 + 10 + 1 + + + + 274 + {{284, 0}, {196, 276}} + + + 3 + MCAwAA + + NO + YES + NO + IBCocoaTouchFramework + NO + 1 + 2 + 0 + YES + 44 + 10 + 10 + + + + 292 + {{-9, 225}, {92, 27}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Max + + Helvetica-BoldOblique + 18 + 16 + + + + 1 + 10 + 1 + + + {480, 276} + + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + previewButton + + + + 13 + + + + maxLabel + + + + 16 + + + + sizeLabel + + + + 18 + + + + sliderChanged: + + + 13 + + 19 + + + + sliderEndedChanging: + + + 7 + + 20 + + + + segmentedControl + + + + 21 + + + + segmentedControlChanged: + + + 13 + + 22 + + + + slider + + + + 23 + + + + dataSource + + + + 26 + + + + delegate + + + + 27 + + + + tableView + + + + 32 + + + + delegate + + + + 34 + + + + mapButtonPressed: + + + 7 + + 37 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 7 + + + + + 8 + + + + + 9 + + + + + 11 + + + + + 17 + + + + + 25 + + + Table View (Themes) + + + 35 + + + + + 36 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 11.IBPluginDependency + 11.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 25.IBPluginDependency + 25.IBViewBoundsToFrameTransform + 35.IBPluginDependency + 35.IBViewBoundsToFrameTransform + 36.IBPluginDependency + 36.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 8.IBPluginDependency + 9.CustomClassName + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + MapConfigViewController + UIResponder + {{790, 298}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB+AAAw4QAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCyAAAw2YAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDjgAAw4kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAAAAAAAAw4kAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBMAAAw2gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBUAAAwigAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + MapPreviewButtonView + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBUAAAwxIAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 37 + + + + YES + + MapConfigViewController + UIViewController + + YES + + YES + buttonPressed: + mapButtonPressed: + segmentedControlChanged: + sliderChanged: + sliderEndedChanging: + + + YES + id + id + id + id + id + + + + YES + + YES + buttonPressed: + mapButtonPressed: + segmentedControlChanged: + sliderChanged: + sliderEndedChanging: + + + YES + + buttonPressed: + id + + + mapButtonPressed: + id + + + segmentedControlChanged: + id + + + sliderChanged: + id + + + sliderEndedChanging: + id + + + + + YES + + YES + maxLabel + previewButton + segmentedControl + sizeLabel + slider + tableView + + + YES + UILabel + MapPreviewButtonView + UISegmentedControl + UILabel + UISlider + UITableView + + + + YES + + YES + maxLabel + previewButton + segmentedControl + sizeLabel + slider + tableView + + + YES + + maxLabel + UILabel + + + previewButton + MapPreviewButtonView + + + segmentedControl + UISegmentedControl + + + sizeLabel + UILabel + + + slider + UISlider + + + tableView + UITableView + + + + + IBProjectSource + Classes/MapConfigViewController.h + + + + MapPreviewButtonView + UIButton + + delegate + id + + + delegate + + delegate + id + + + + IBProjectSource + Classes/MapPreviewButtonView.h + + + + UILabel + + IBProjectSource + Classes/HWUtils.h + + + + UITableView + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UISegmentedControl + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISegmentedControl.h + + + + UISlider + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UISlider.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + background~iphone.png + {480, 320} + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MapConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -22,8 +22,6 @@ #import #import "MapPreviewButtonView.h" -@class SchemeWeaponConfigViewController; -@class GameConfigViewController; @interface MapConfigViewController : UIViewController { NSInteger oldValue; // for the slider @@ -51,15 +49,13 @@ // internal objects NSIndexPath *lastIndexPath; NSArray *dataSourceArray; - - // controller for mission state - SchemeWeaponConfigViewController *externalController; - GameConfigViewController *parentController; } +@property (nonatomic,assign) NSInteger oldValue; +@property (nonatomic,assign) NSInteger oldPage; +@property (nonatomic,assign) BOOL busy; @property (nonatomic,assign) NSInteger maxHogs; -@property (nonatomic,assign) BOOL busy; @property (nonatomic,retain) NSString *seedCommand; @property (nonatomic,retain) NSString *templateFilterCommand; @property (nonatomic,retain) NSString *mapGenCommand; @@ -78,21 +74,15 @@ @property (nonatomic,retain) NSIndexPath *lastIndexPath; @property (nonatomic,retain) NSArray *dataSourceArray; -@property (nonatomic,assign) SchemeWeaponConfigViewController *externalController; -@property (nonatomic,assign) GameConfigViewController *parentController; - --(IBAction) buttonPressed:(id) sender; - --(IBAction) mapButtonPressed; +-(IBAction) mapButtonPressed:(id) sender; -(IBAction) sliderChanged:(id) sender; -(IBAction) sliderEndedChanging:(id) sender; -(IBAction) segmentedControlChanged:(id) sender; -(void) turnOnWidgets; -(void) turnOffWidgets; --(void) setLabelText:(NSString *)str; +-(void) setMaxLabelText:(NSString *)str; -(void) updatePreview; --(void) loadDataSourceArray; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MapConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/MapConfigViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,33 +20,32 @@ #import "MapConfigViewController.h" -#import "PascalImports.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" +#import #import "SchemeWeaponConfigViewController.h" #import "GameConfigViewController.h" + #define scIndex self.segmentedControl.selectedSegmentIndex #define isRandomness() (segmentedControl.selectedSegmentIndex == 0 || segmentedControl.selectedSegmentIndex == 2) @implementation MapConfigViewController @synthesize previewButton, maxHogs, seedCommand, templateFilterCommand, mapGenCommand, mazeSizeCommand, themeCommand, staticMapCommand, missionCommand, tableView, maxLabel, sizeLabel, segmentedControl, slider, lastIndexPath, dataSourceArray, busy, - externalController, parentController; + oldPage, oldValue; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return rotationManager(interfaceOrientation); } --(IBAction) mapButtonPressed { - playSound(@"clickSound"); +-(IBAction) mapButtonPressed:(id) sender { + [AudioManagerController playClickSound]; [self updatePreview]; } -(void) updatePreview { // don't generate a new preview while it's already generating one - if (busy) + if (self.busy) return; // generate a seed @@ -57,24 +56,19 @@ self.seedCommand = seedCmd; [seedCmd release]; - if (self.dataSourceArray == nil) - [self loadDataSourceArray]; NSArray *source = [self.dataSourceArray objectAtIndex:scIndex]; - NSIndexPath *theIndex; if (isRandomness()) { // prevent other events and add an activity while the preview is beign generated [self turnOffWidgets]; [self.previewButton updatePreviewWithSeed:seed]; - theIndex = [NSIndexPath indexPathForRow:(random()%[source count]) inSection:0]; - } else { - theIndex = [NSIndexPath indexPathForRow:(random()%[source count]) inSection:0]; // the preview for static maps is loaded in didSelectRowAtIndexPath } [seed release]; // perform as if user clicked on an entry + NSIndexPath *theIndex = [NSIndexPath indexPathForRow:(random()%[source count]) inSection:0]; [self tableView:self.tableView didSelectRowAtIndexPath:theIndex]; - if (IS_NOT_POWERFUL(getModelType()) == NO) + if (IS_NOT_POWERFUL([HWUtils modelType]) == NO) [self.tableView scrollToRowAtIndexPath:theIndex atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; } @@ -82,22 +76,24 @@ busy = YES; self.previewButton.alpha = 0.5f; self.previewButton.enabled = NO; - self.maxLabel.text = @"..."; + self.maxLabel.text = NSLocalizedString(@"Loading...",@"");; self.segmentedControl.enabled = NO; self.slider.enabled = NO; } +#pragma mark - +#pragma mark MapPreviewButtonView delegate methods -(void) turnOnWidgets { self.previewButton.alpha = 1.0f; self.previewButton.enabled = YES; self.segmentedControl.enabled = YES; self.slider.enabled = YES; - busy = NO; + self.busy = NO; } --(void) setLabelText:(NSString *)str { +-(void) setMaxLabelText:(NSString *)str { self.maxHogs = [str intValue]; - self.maxLabel.text = str; + self.maxLabel.text = [NSString stringWithFormat:@"%@ %@",NSLocalizedString(@"Max Hogs:",@""),str]; } -(NSDictionary *)getDataForEngine { @@ -117,8 +113,6 @@ } -(NSInteger) tableView:(UITableView *)aTableView numberOfRowsInSection:(NSInteger) section { - if (self.dataSourceArray == nil) - [self loadDataSourceArray]; return [[self.dataSourceArray objectAtIndex:scIndex] count]; } @@ -130,15 +124,13 @@ if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; - if (self.dataSourceArray == nil) - [self loadDataSourceArray]; NSArray *source = [self.dataSourceArray objectAtIndex:scIndex]; NSString *labelString = [source objectAtIndex:row]; cell.textLabel.text = labelString; cell.textLabel.adjustsFontSizeToFitWidth = YES; cell.textLabel.minimumFontSize = 7; - cell.textLabel.textColor = UICOLOR_HW_YELLOW_TEXT; + cell.textLabel.textColor = [UIColor lightYellowColor]; cell.textLabel.backgroundColor = [UIColor clearColor]; if (isRandomness()) { @@ -155,14 +147,12 @@ } else cell.accessoryView = nil; - cell.backgroundColor = UICOLOR_HW_ALMOSTBLACK; + cell.backgroundColor = [UIColor blackColorTransparent]; return cell; } // this set details for a static map (called by didSelectRowAtIndexPath) -(void) setDetailsForStaticMap:(NSInteger) index { - if (self.dataSourceArray == nil) - [self loadDataSourceArray]; NSArray *source = [self.dataSourceArray objectAtIndex:scIndex]; NSString *fileCfg = [[NSString alloc] initWithFormat:@"%@/%@/map.cfg", @@ -174,13 +164,12 @@ // if the number is not set we keep 18 standard; // sometimes it's not set but there are trailing characters, we get around them with the second equation + NSString *max; if ([split count] > 1 && [[split objectAtIndex:1] intValue] > 0) - maxHogs = [[split objectAtIndex:1] intValue]; + max = [split objectAtIndex:1]; else - maxHogs = 18; - NSString *max = [[NSString alloc] initWithFormat:@"%d",maxHogs]; - self.maxLabel.text = max; - [max release]; + max = @"18"; + [self setMaxLabelText:max]; self.themeCommand = [NSString stringWithFormat:@"etheme %@", [split objectAtIndex:0]]; self.staticMapCommand = [NSString stringWithFormat:@"emap %@", [source objectAtIndex:index]]; @@ -198,8 +187,6 @@ int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1; if (newRow != oldRow) { - if (self.dataSourceArray == nil) - [self loadDataSourceArray]; NSArray *source = [self.dataSourceArray objectAtIndex:scIndex]; if (isRandomness()) { // just change the theme, don't update preview @@ -307,7 +294,7 @@ [self updatePreview]; oldValue = num; } - playSound(@"clickSound"); + [AudioManagerController playClickSound]; } // perform actions based on the activated section, then call updatePreview to visually update the selection @@ -316,7 +303,7 @@ NSString *mapgen, *staticmap, *mission; NSInteger newPage = self.segmentedControl.selectedSegmentIndex; - playSound(@"selSound"); + [AudioManagerController playSelectSound]; switch (newPage) { case 0: // Random mapgen = @"e$mapgen 0"; @@ -324,7 +311,7 @@ mission = @""; [self sliderChanged:nil]; self.slider.enabled = YES; - [externalController fillSections]; + [SchemeWeaponConfigViewController fillInstanceSections]; break; case 1: // Map @@ -334,7 +321,7 @@ mission = @""; self.slider.enabled = NO; self.sizeLabel.text = NSLocalizedString(@"No filter",@""); - [externalController fillSections]; + [SchemeWeaponConfigViewController fillInstanceSections]; break; case 2: // Maze @@ -343,7 +330,7 @@ mission = @""; [self sliderChanged:nil]; self.slider.enabled = YES; - [externalController fillSections]; + [SchemeWeaponConfigViewController fillInstanceSections]; break; case 3: // Mission @@ -353,7 +340,7 @@ mission = @""; self.slider.enabled = NO; self.sizeLabel.text = NSLocalizedString(@"No filter",@""); - [externalController emptySections]; + [SchemeWeaponConfigViewController emptyInstanceSections]; break; default: @@ -371,54 +358,65 @@ oldPage = newPage; } --(IBAction) buttonPressed:(id) sender { - [self.parentController buttonPressed:sender]; -} - #pragma mark - #pragma mark view management --(void) loadDataSourceArray { - NSString *model = getModelType(); - - // only folders containing icon.png are a valid theme - NSArray *themeArrayFull = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:THEMES_DIRECTORY() error:NULL]; - NSMutableArray *themeArray = [[NSMutableArray alloc] init]; - for (NSString *themeName in themeArrayFull) { - NSString *checkPath = [[NSString alloc] initWithFormat:@"%@/%@/icon.png",THEMES_DIRECTORY(),themeName]; - if ([[NSFileManager defaultManager] fileExistsAtPath:checkPath]) - [themeArray addObject:themeName]; - [checkPath release]; +-(NSArray *) dataSourceArray { + if (dataSourceArray == nil) { + NSString *model = [HWUtils modelType]; + + // only folders containing icon.png are a valid theme + NSArray *themeArrayFull = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:THEMES_DIRECTORY() error:NULL]; + NSMutableArray *themeArray = [[NSMutableArray alloc] init]; + for (NSString *themeName in themeArrayFull) { + NSString *checkPath = [[NSString alloc] initWithFormat:@"%@/%@/icon.png",THEMES_DIRECTORY(),themeName]; + if ([[NSFileManager defaultManager] fileExistsAtPath:checkPath]) + [themeArray addObject:themeName]; + [checkPath release]; + } + + // remove images that are too big for certain devices without loading the whole image + NSArray *mapArrayFull = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MAPS_DIRECTORY() error:NULL]; + NSMutableArray *mapArray = [[NSMutableArray alloc] init]; + for (NSString *str in mapArrayFull) { + CGSize imgSize = [UIImage imageSizeFromMetadataOf:[MAPS_DIRECTORY() stringByAppendingFormat:@"%@/map.png",str]]; + if (IS_NOT_POWERFUL(model) && imgSize.height > 1024.0f) + continue; + if (IS_NOT_VERY_POWERFUL(model) && imgSize.height > 1280.0f) + continue; + [mapArray addObject:str]; + } + + NSArray *missionArrayFull = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MISSIONS_DIRECTORY() error:NULL]; + NSMutableArray *missionArray = [[NSMutableArray alloc] init]; + for (NSString *str in missionArrayFull) { + CGSize imgSize = [UIImage imageSizeFromMetadataOf:[MISSIONS_DIRECTORY() stringByAppendingFormat:@"%@/map.png",str]]; + if (IS_NOT_POWERFUL(model) && imgSize.height > 1024.0f) + continue; + if (IS_NOT_VERY_POWERFUL(model) && imgSize.height > 1280.0f) + continue; + [missionArray addObject:str]; + } + NSArray *array = [[NSArray alloc] initWithObjects:themeArray,mapArray,themeArray,missionArray,nil]; + [missionArray release]; + [themeArray release]; + [mapArray release]; + + self.dataSourceArray = array; + [array release]; } + return dataSourceArray; +} - // remove images that are too big for certain devices without loading the whole image - NSArray *mapArrayFull = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MAPS_DIRECTORY() error:NULL]; - NSMutableArray *mapArray = [[NSMutableArray alloc] init]; - for (NSString *str in mapArrayFull) { - CGSize imgSize = PSPNGSizeFromMetaData([MAPS_DIRECTORY() stringByAppendingFormat:@"%@/map.png",str]); - if (IS_NOT_POWERFUL(model) && imgSize.height > 1024.0f) - continue; - if (IS_NOT_VERY_POWERFUL(model) && imgSize.height > 1280.0f) - continue; - [mapArray addObject:str]; +-(MapPreviewButtonView *)previewButton { + if (previewButton == nil) { + MapPreviewButtonView *preview = [[MapPreviewButtonView alloc] initWithFrame:CGRectMake(32, 26, 256, 128)]; + preview.delegate = self; + [preview addTarget:self action:@selector(mapButtonPressed:) forControlEvents:UIControlEventTouchUpInside]; + [self.view addSubview:preview]; + self.previewButton = preview; + [preview release]; } - - NSArray *missionArrayFull = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:MISSIONS_DIRECTORY() error:NULL]; - NSMutableArray *missionArray = [[NSMutableArray alloc] init]; - for (NSString *str in missionArrayFull) { - CGSize imgSize = PSPNGSizeFromMetaData([MISSIONS_DIRECTORY() stringByAppendingFormat:@"%@/map.png",str]); - if (IS_NOT_POWERFUL(model) && imgSize.height > 1024.0f) - continue; - if (IS_NOT_VERY_POWERFUL(model) && imgSize.height > 1280.0f) - continue; - [missionArray addObject:str]; - } - NSArray *array = [[NSArray alloc] initWithObjects:themeArray,mapArray,themeArray,missionArray,nil]; - [missionArray release]; - [themeArray release]; - [mapArray release]; - - self.dataSourceArray = array; - [array release]; + return previewButton; } -(void) viewDidLoad { @@ -426,24 +424,18 @@ srandom(time(NULL)); + /* CGSize screenSize = [[UIScreen mainScreen] bounds].size; self.view.frame = CGRectMake(0, 0, screenSize.height, screenSize.width - 44); + */ // initialize some "default" values - self.sizeLabel.text = NSLocalizedString(@"All",@""); self.slider.value = 0.05f; - oldValue = 5; - - busy = NO; - [self loadDataSourceArray]; - self.lastIndexPath = [NSIndexPath indexPathForRow:-1 inSection:0]; - - // select a map at first because it's faster - done in IB - oldPage = 1; - if (self.segmentedControl.selectedSegmentIndex == 1) { - self.slider.enabled = NO; - self.sizeLabel.text = NSLocalizedString(@"No filter",@""); - } + self.slider.enabled = NO; + self.sizeLabel.text = NSLocalizedString(@"No filter",@""); + self.oldValue = 5; + self.busy = NO; + self.oldPage = self.segmentedControl.selectedSegmentIndex; self.templateFilterCommand = @"e$template_filter 0"; self.mazeSizeCommand = @"e$maze_size 0"; @@ -451,16 +443,22 @@ self.staticMapCommand = @""; self.missionCommand = @""; - if ([self.tableView respondsToSelector:@selector(setBackgroundView:)]) - [self.tableView setBackgroundView:nil]; - self.tableView.backgroundColor = [UIColor clearColor]; - self.tableView.separatorColor = UICOLOR_HW_YELLOW_BODER; + if (IS_IPAD()) { + [self.tableView setBackgroundColorForAnyTable:[UIColor darkBlueColorTransparent]]; + self.tableView.layer.borderColor = [[UIColor darkYellowColor] CGColor]; + self.tableView.layer.borderWidth = 2.7f; + self.tableView.layer.cornerRadius = 8; + self.tableView.contentInset = UIEdgeInsetsMake(10, 0, 10, 0); + + UILabel *backLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 14, 300, 190) andTitle:nil withBorderWidth:2.3f]; + [self.view insertSubview:backLabel belowSubview:self.segmentedControl]; + [backLabel release]; + } + self.tableView.separatorColor = [UIColor whiteColor]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; } -(void) viewWillAppear:(BOOL)animated { - if (self.dataSourceArray == nil) - [self loadDataSourceArray]; [super viewWillAppear:animated]; } @@ -495,6 +493,7 @@ -(void) didReceiveMemoryWarning { self.dataSourceArray = nil; + self.previewButton = nil; [super didReceiveMemoryWarning]; if (self.view.superview == nil) { diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MapPreviewButtonView.h --- a/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.h Sun Oct 16 21:03:30 2011 +0200 @@ -25,7 +25,7 @@ @protocol MapPreviewViewDelegate -(void) turnOnWidgets; --(void) setLabelText:(NSString *)string; +-(void) setMaxLabelText:(NSString *)string; -(NSDictionary *)getDataForEngine; @end @@ -38,9 +38,8 @@ @property (nonatomic,assign) id delegate; --(void) setBackgroundImageRounded:(UIImage *)image forState:(UIControlState)state; --(void) setImageRounded:(UIImage *)image forState:(UIControlState)state; --(void) setImageRoundedForNormalState:(UIImage *)image; +-(void) setImageRounded:(UIImage *)image forState:(UIControlState) controlState; +-(void) setImageRounded:(UIImage *)image; -(void) updatePreviewWithSeed:(NSString *)seed; -(void) updatePreviewWithFile:(NSString *)filePath; -(void) turnOnWidgets; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m --- a/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/MapPreviewButtonView.m Sun Oct 16 21:03:30 2011 +0200 @@ -22,7 +22,10 @@ #import "MapPreviewButtonView.h" #import "MapConfigViewController.h" #import "UIImageExtra.h" +#import "ServerSetup.h" #import +#import + #define INDICATOR_TAG 7654 @@ -32,15 +35,8 @@ -(id) initWithFrame:(CGRect)frame { if ((self = [super initWithFrame:frame])) { delegate = nil; - [self setBackgroundImageRounded:[UIImage whiteImage:frame.size] forState:UIControlStateNormal]; - } - return self; -} - --(id) initWithCoder:(NSCoder *)aDecoder { - if ((self = [super initWithCoder:aDecoder])) { - delegate = nil; - [self setBackgroundImageRounded:[UIImage whiteImage:self.frame.size] forState:UIControlStateNormal]; + self.backgroundColor = [UIColor whiteColor]; + self.layer.cornerRadius = 12; } return self; } @@ -52,16 +48,11 @@ #pragma mark - #pragma mark image wrappers --(void) setBackgroundImageRounded:(UIImage *)image forState:(UIControlState)state { - // TODO:http://stackoverflow.com/questions/4272476/setbackgroundimage-behaviour-changed-on-ipad-4-2 - [self setBackgroundImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:state]; +-(void) setImageRounded:(UIImage *)image forState:(UIControlState)controlState { + [self setImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:controlState]; } --(void) setImageRounded:(UIImage *)image forState:(UIControlState)state { - [self setImage:[image makeRoundCornersOfSize:CGSizeMake(12, 12)] forState:state]; -} - --(void) setImageRoundedForNormalState:(UIImage *)image { +-(void) setImageRounded:(UIImage *)image { [self setImageRounded:image forState:UIControlStateNormal]; } @@ -78,7 +69,7 @@ IPaddress ip; BOOL serverQuit = NO; static uint8_t map[128*32]; - int port = randomPort(); + int port = [ServerSetup randomPort]; if (SDLNet_Init() < 0) { DLog(@"SDLNet_Init: %s", SDLNet_GetError()); @@ -162,7 +153,7 @@ previewCGImage = nil; // all these are performed on the main thread to prevent a leak - [self performSelectorOnMainThread:@selector(setImageRoundedForNormalState:) + [self performSelectorOnMainThread:@selector(setImageRounded:) withObject:previewImage waitUntilDone:NO]; [previewImage release]; @@ -197,7 +188,7 @@ [self setTitle:nil forState:UIControlStateNormal]; // don't display preview on slower device, too slow and memory hog - if (IS_NOT_POWERFUL(getModelType())) { + if (IS_NOT_POWERFUL([HWUtils modelType])) { [self setTitle:NSLocalizedString(@"Preview not available",@"") forState:UIControlStateNormal]; [self turnOnWidgets]; } else { @@ -232,15 +223,19 @@ #pragma mark - #pragma mark delegate -(void) turnOnWidgets { - [self.delegate turnOnWidgets]; + if ([self.delegate respondsToSelector:@selector(turnOnWidgets)]) + [self.delegate turnOnWidgets]; } -(void) setLabelText:(NSString *)string { - [self.delegate setLabelText:string]; + if ([self.delegate respondsToSelector:@selector(setMaxLabelText:)]) + [self.delegate setMaxLabelText:string]; } -(NSDictionary *)getDataForEngine { - return [self.delegate getDataForEngine]; + if ([self.delegate respondsToSelector:@selector(getDataForEngine)]) + return [self.delegate getDataForEngine]; + return nil; } @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MasterViewController.h --- a/project_files/HedgewarsMobile/Classes/MasterViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,51 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2011 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 27/03/2010. - */ - - -#import - - -@class SplitViewRootController; -@class GeneralSettingsViewController; -@class TeamSettingsViewController; -@class WeaponSettingsViewController; -@class SchemeSettingsViewController; -@class SupportViewController; - -@interface MasterViewController : UITableViewController { - SplitViewRootController *rootController; - MasterViewController *targetController; - NSArray *controllerNames; - NSIndexPath *lastIndexPath; - GeneralSettingsViewController *generalSettingsViewController; - TeamSettingsViewController *teamSettingsViewController; - WeaponSettingsViewController *weaponSettingsViewController; - SchemeSettingsViewController *schemeSettingsViewController; - SupportViewController *supportViewController; -} - -@property (nonatomic, retain) MasterViewController *targetController; -@property (nonatomic, retain) SplitViewRootController *rootController; -@property (nonatomic, retain) NSArray *controllerNames; -@property (nonatomic, retain) NSIndexPath *lastIndexPath; - --(IBAction) dismissSplitView; - -@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MasterViewController.m --- a/project_files/HedgewarsMobile/Classes/MasterViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,226 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2011 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 27/03/2010. - */ - - -#import "MasterViewController.h" -#import "CommodityFunctions.h" -#import "GeneralSettingsViewController.h" -#import "TeamSettingsViewController.h" -#import "WeaponSettingsViewController.h" -#import "SchemeSettingsViewController.h" -#import "SupportViewController.h" - -@implementation MasterViewController -@synthesize rootController, targetController, controllerNames, lastIndexPath; - - --(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { - return rotationManager(interfaceOrientation); -} - - -#pragma mark - -#pragma mark View lifecycle --(void) viewDidLoad { - [super viewDidLoad]; - - // the list of selectable controllers - NSArray *array = [[NSArray alloc] initWithObjects:NSLocalizedString(@"General",@""), - NSLocalizedString(@"Teams",@""), - NSLocalizedString(@"Weapons",@""), - NSLocalizedString(@"Schemes",@""), - NSLocalizedString(@"Support",@""), - nil]; - self.controllerNames = array; - [array release]; - - // targetControllers tells whether we're on the right or left side of the splitview -- on iphone we only use the right side - if (targetController == nil && IS_IPAD()) { - if (nil == generalSettingsViewController) - generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - generalSettingsViewController.navigationItem.hidesBackButton = YES; - [generalSettingsViewController viewWillAppear:YES]; - [self.navigationController pushViewController:generalSettingsViewController animated:NO]; - } else { - self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self - action:@selector(dismissSplitView)]; - } -} - -#pragma mark - -#pragma mark Table view data source --(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - --(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [controllerNames count]; -} - -// Customize the appearance of table view cells. --(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - static NSString *CellIdentifier = @"Cell"; - - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; - if (cell == nil) - cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; - - NSString *iconStr = nil; - switch ([indexPath row]) { - case 0: - iconStr = [NSString stringWithFormat:@"%@/TargetBee.png",GRAPHICS_DIRECTORY()]; - break; - case 1: - iconStr = [NSString stringWithFormat:@"%@/Egg.png",GRAPHICS_DIRECTORY()]; - break; - case 2: - iconStr = [NSString stringWithFormat:@"%@/cheese.png",GRAPHICS_DIRECTORY()]; - break; - case 3: - iconStr = [NSString stringWithFormat:@"%@/Target.png",GRAPHICS_DIRECTORY()]; - break; - case 4: - iconStr = [NSString stringWithFormat:@"%@/Seduction.png",GRAPHICS_DIRECTORY()]; - break; - default: - //seduction.png for support page - DLog(@"Nope"); - break; - } - - if (nil == targetController) - cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; - else - cell.accessoryType = UITableViewCellAccessoryNone; - - cell.textLabel.text = [controllerNames objectAtIndex:[indexPath row]]; - UIImage *icon = [[UIImage alloc] initWithContentsOfFile:iconStr]; - cell.imageView.image = icon; - [icon release]; - - return cell; -} - -#pragma mark - -#pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - int newRow = [indexPath row]; - int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1; - UIViewController *nextController = nil; - - if (newRow != oldRow) { - [self.tableView deselectRowAtIndexPath:lastIndexPath animated:YES]; - [targetController.navigationController popToRootViewControllerAnimated:NO]; - - switch (newRow) { - case 0: - if (nil == generalSettingsViewController) - generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = generalSettingsViewController; - break; - case 1: - if (nil == teamSettingsViewController) - teamSettingsViewController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = teamSettingsViewController; - break; - case 2: - if (nil == weaponSettingsViewController) - weaponSettingsViewController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = weaponSettingsViewController; - break; - case 3: - if (nil == schemeSettingsViewController) - schemeSettingsViewController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = schemeSettingsViewController; - break; - case 4: - if (nil == supportViewController) - supportViewController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; - nextController = supportViewController; - break; - } - - nextController.title = [controllerNames objectAtIndex:newRow]; - self.lastIndexPath = indexPath; - [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; - - if (nil == targetController) { - nextController.navigationItem.hidesBackButton = NO; - [self.navigationController pushViewController:nextController animated:YES]; - } else { - playSound(@"clickSound"); - nextController.navigationItem.hidesBackButton = YES; - [targetController.navigationController pushViewController:nextController animated:NO]; - } - } -} - - -#pragma mark - -#pragma mark Memory management --(void) didReceiveMemoryWarning { - if (generalSettingsViewController.view.superview == nil) - generalSettingsViewController = nil; - if (teamSettingsViewController.view.superview == nil) - teamSettingsViewController = nil; - if (weaponSettingsViewController.view.superview == nil) - weaponSettingsViewController = nil; - if (schemeSettingsViewController.view.superview == nil) - schemeSettingsViewController = nil; - if (supportViewController.view.superview == nil) - supportViewController = nil; - MSG_MEMCLEAN(); - [super didReceiveMemoryWarning]; -} - --(void) viewDidUnload { - //self.rootController = nil; - //self.targetController = nil; - self.controllerNames = nil; - self.lastIndexPath = nil; - generalSettingsViewController = nil; - teamSettingsViewController = nil; - weaponSettingsViewController = nil; - schemeSettingsViewController = nil; - supportViewController = nil; - MSG_DIDUNLOAD(); - [super viewDidUnload]; -} - --(void) dealloc { - releaseAndNil(rootController); - releaseAndNil(targetController); - releaseAndNil(controllerNames); - releaseAndNil(lastIndexPath); - releaseAndNil(generalSettingsViewController); - releaseAndNil(teamSettingsViewController); - releaseAndNil(weaponSettingsViewController); - releaseAndNil(schemeSettingsViewController); - releaseAndNil(supportViewController); - [super dealloc]; -} - --(IBAction) dismissSplitView { - [self.rootController dismissModalViewControllerAnimated:YES]; -} - -@end - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MissionTrainingViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,702 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 274 + {{91, 86}, {585, 391}} + + + 1 + MCAwIDAgMAA + + NO + YES + IBIPadFramework + YES + 2 + 1 + 2 + 0 + YES + 44 + 10 + 10 + + + + 292 + {{227, 496}, {314, 260}} + + YES + NO + IBIPadFramework + + + + 292 + {{20, 684}, {64, 64}} + + NO + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + 3 + MQA + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + backButton.png + + + + + 292 + {{606, 684}, {142, 64}} + + NO + 1 + IBIPadFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + startGameButton.png + + + + + 292 + {{5, 6}, {757, 72}} + + NO + YES + 7 + NO + IBIPadFramework + Description here + + Helvetica-BoldOblique + 21 + 16 + + + 1 + MCAwIDAAA + + + 1 + 10 + 2 + 1 + + + {768, 768} + + + 3 + MQA + + 2 + + + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + dataSource + + + + 11 + + + + delegate + + + + 12 + + + + previewImage + + + + 13 + + + + tableView + + + + 14 + + + + buttonPressed: + + + 7 + + 19 + + + + buttonPressed: + + + 7 + + 20 + + + + descriptionLabel + + + + 22 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + 10 + + + + + 17 + + + + + 18 + + + + + 21 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 18.IBPluginDependency + 18.IBViewBoundsToFrameTransform + 21.IBPluginDependency + 21.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + MissionTrainingViewController + UIResponder + {{139, 166}, {768, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDYwAAxD2AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABBoAAAxC1AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEF4AAxC1AAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCDAAAwowAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCtgAAw+2AAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 22 + + + + YES + + MissionTrainingViewController + UIViewController + + buttonPressed: + id + + + buttonPressed: + + buttonPressed: + id + + + + YES + + YES + descriptionLabel + previewImage + tableView + + + YES + UILabel + UIImageView + UITableView + + + + YES + + YES + descriptionLabel + previewImage + tableView + + + YES + + descriptionLabel + UILabel + + + previewImage + UIImageView + + + tableView + UITableView + + + + + IBProjectSource + Classes/MissionTrainingViewController.h + + + + UILabel + + IBProjectSource + Classes/HWUtils.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + backButton.png + startGameButton.png + + + YES + {64, 64} + {142, 64} + + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MissionTrainingViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,652 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 274 + {{180, 0}, {300, 320}} + + + 3 + MQA + + NO + YES + IBCocoaTouchFramework + YES + 2 + 1 + 0 + YES + 44 + 22 + 22 + + + + 292 + {{11, 19}, {157, 130}} + + YES + NO + IBCocoaTouchFramework + + + + 292 + {{57, 245}, {64, 64}} + + NO + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + 3 + MC41AA + + + NSImage + backButton.png + + + + + 292 + {{18, 164}, {142, 64}} + + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + startGameButton.png + + + + {480, 320} + + + 3 + MQA + + 2 + + + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + dataSource + + + + 11 + + + + delegate + + + + 12 + + + + previewImage + + + + 13 + + + + tableView + + + + 14 + + + + buttonPressed: + + + 7 + + 19 + + + + buttonPressed: + + + 7 + + 20 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 9 + + + YES + + + + + 10 + + + + + 17 + + + + + 18 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 17.IBViewBoundsToFrameTransform + 18.IBPluginDependency + 18.IBViewBoundsToFrameTransform + 9.IBPluginDependency + 9.IBViewBoundsToFrameTransform + + + YES + MissionTrainingViewController + UIResponder + {{492, 751}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABAoAAAwwYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABChAAAw5eAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABB2AAAw2cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDUAAAw5UAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 22 + + + + YES + + MissionTrainingViewController + UIViewController + + buttonPressed: + id + + + buttonPressed: + + buttonPressed: + id + + + + YES + + YES + descriptionLabel + previewImage + tableView + + + YES + UILabel + UIImageView + UITableView + + + + YES + + YES + descriptionLabel + previewImage + tableView + + + YES + + descriptionLabel + UILabel + + + previewImage + UIImageView + + + tableView + UITableView + + + + + IBProjectSource + Classes/MissionTrainingViewController.h + + + + UILabel + + IBProjectSource + Classes/HWUtils.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + backButton.png + startGameButton.png + + + YES + {64, 64} + {142, 64} + + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,42 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 03/10/2011. + */ + +#import + + +@interface MissionTrainingViewController : UIViewController { + NSArray *listOfMissions; + NSArray *listOfDescriptions; + NSString *missionName; + UIImageView *previewImage; + UITableView *tableView; + UILabel *descriptionLabel; +} + +@property (nonatomic, retain) NSArray *listOfMissions; +@property (nonatomic, retain) NSArray *listOfDescriptions; +@property (nonatomic, retain) NSString *missionName; +@property (nonatomic, retain) IBOutlet UIImageView *previewImage; +@property (nonatomic, retain) IBOutlet UITableView *tableView; +@property (nonatomic, retain) IBOutlet UILabel *descriptionLabel; + +-(IBAction) buttonPressed:(id) sender; + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,205 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 03/10/2011. + */ + + +#import "MissionTrainingViewController.h" +#import +#import "GameInterfaceBridge.h" + + +@implementation MissionTrainingViewController +@synthesize listOfMissions, listOfDescriptions, previewImage, tableView, descriptionLabel, missionName; + +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { + return rotationManager(interfaceOrientation); +} + +#pragma mark - +#pragma mark View management +-(void) viewDidLoad { + NSString *imgName = (IS_IPAD()) ? @"mediumBackground~ipad.png" : @"smallerBackground~iphone.png"; + UIImage *img = [[UIImage alloc] initWithContentsOfFile:imgName]; + self.view.backgroundColor = [UIColor colorWithPatternImage:img]; + [img release]; + + self.previewImage.layer.borderColor = [[UIColor darkYellowColor] CGColor]; + self.previewImage.layer.borderWidth = 3.8f; + self.previewImage.layer.cornerRadius = 14; + + UIView *backView = [[UIView alloc] initWithFrame:self.tableView.frame]; + backView.backgroundColor = IS_IPAD() ? [UIColor darkBlueColorTransparent] : [UIColor blackColorTransparent]; + [self.tableView setBackgroundView:backView]; + [backView release]; + self.tableView.backgroundColor = [UIColor clearColor]; + self.tableView.layer.borderColor = IS_IPAD() ? [[UIColor darkYellowColor] CGColor] : [[UIColor whiteColor] CGColor]; + self.tableView.layer.borderWidth = 2.4f; + self.tableView.layer.cornerRadius = 8; + self.tableView.separatorColor = [UIColor whiteColor]; + self.tableView.separatorStyle = IS_IPAD() ? UITableViewCellSeparatorStyleNone : UITableViewCellSeparatorStyleSingleLine; + + self.descriptionLabel.textColor = [UIColor lightYellowColor]; + [super viewDidLoad]; +} + +-(void) viewWillAppear:(BOOL)animated { + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:random()%[self.listOfMissions count] inSection:0]; + [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; + [self tableView:self.tableView didSelectRowAtIndexPath:indexPath]; + [super viewWillAppear:animated]; +} + +-(IBAction) buttonPressed:(id) sender { + UIButton *button = (UIButton *)sender; + + if (button.tag == 0) { + [AudioManagerController playBackSound]; + [[self parentViewController] dismissModalViewControllerAnimated:YES]; + } else { + GameInterfaceBridge *bridge = [[GameInterfaceBridge alloc] initWithController:self]; + [bridge startMissionGame:self.missionName]; + [bridge release]; + } +} + +#pragma mark - +#pragma mark override setters/getters for better memory handling +-(NSArray *)listOfMissions { + if (listOfMissions == nil) + self.listOfMissions = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TRAININGS_DIRECTORY() error:NULL]; + return listOfMissions; +} + +-(NSArray *)listOfDescriptions { + if (listOfDescriptions == nil) { + NSString *descLocation = [[NSString alloc] initWithFormat:@"%@/missions_en.txt",LOCALE_DIRECTORY()]; + NSString *descComplete = [[NSString alloc] initWithContentsOfFile:descLocation encoding:NSUTF8StringEncoding error:NULL]; + [descLocation release]; + NSArray *descArray = [descComplete componentsSeparatedByString:@"\n"]; + NSMutableArray *filteredArray = [[NSMutableArray alloc] initWithCapacity:[descArray count]]; + [descComplete release]; + // sanity check to avoid having missions and descriptions conflicts + for (int i = 0; i < [self.listOfMissions count]; i++) { + NSString *desc = [[self.listOfMissions objectAtIndex:i] stringByDeletingPathExtension]; + for (NSString *str in descArray) + if ([str hasPrefix:desc]) { + NSArray *descriptionText = [str componentsSeparatedByString:@"\""]; + [filteredArray insertObject:[descriptionText objectAtIndex:1] atIndex:i]; + break; + } + } + self.listOfDescriptions = filteredArray; + [filteredArray release]; + } + return listOfDescriptions; +} + +#pragma mark - +#pragma mark Table view data source +-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [self.listOfMissions count]; +} + +-(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { + return (IS_IPAD()) ? self.tableView.rowHeight : 80; +} + +-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *CellIdentifier = @"CellTr"; + NSInteger row = [indexPath row]; + + UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) + cell = [[[UITableViewCell alloc] initWithStyle:(IS_IPAD()) ? UITableViewCellStyleDefault : UITableViewCellStyleSubtitle + reuseIdentifier:CellIdentifier] autorelease]; + + cell.textLabel.text = [[[self.listOfMissions objectAtIndex:row] stringByDeletingPathExtension] + stringByReplacingOccurrencesOfString:@"_" withString:@" "]; + cell.textLabel.textColor = [UIColor lightYellowColor]; + //cell.textLabel.font = [UIFont fontWithName:@"Bradley Hand Bold" size:[UIFont labelFontSize]]; + cell.textLabel.textAlignment = (IS_IPAD()) ? UITextAlignmentCenter : UITextAlignmentLeft; + cell.textLabel.backgroundColor = [UIColor clearColor]; + cell.textLabel.adjustsFontSizeToFitWidth = YES; + cell.detailTextLabel.text = (IS_IPAD()) ? nil : [self.listOfDescriptions objectAtIndex:row]; + cell.detailTextLabel.textColor = [UIColor whiteColor]; + cell.detailTextLabel.backgroundColor = [UIColor clearColor]; + cell.detailTextLabel.adjustsFontSizeToFitWidth = YES; + cell.detailTextLabel.numberOfLines = ([cell.detailTextLabel.text length] % 40); + cell.detailTextLabel.baselineAdjustment = UIBaselineAdjustmentAlignCenters; + + cell.backgroundColor = [UIColor blackColorTransparent]; + return cell; +} + +#pragma mark - +#pragma mark Table view delegate +-(void) tableView:(UITableView *)aTableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + NSInteger row = [indexPath row]; + + self.missionName = [[self.listOfMissions objectAtIndex:row] stringByDeletingPathExtension]; + NSString *size = IS_IPAD() ? @"@2x" : @""; + NSString *filePath = [[NSString alloc] initWithFormat:@"%@/Missions/Training/%@%@.png",GRAPHICS_DIRECTORY(),self.missionName,size]; + UIImage *img = [[UIImage alloc] initWithContentsOfFile:filePath]; + [filePath release]; + [self.previewImage setImage:img]; + [img release]; + + self.descriptionLabel.text = [self.listOfDescriptions objectAtIndex:row]; +} + +#pragma mark - +#pragma mark Memory management +-(void) didReceiveMemoryWarning { + self.previewImage = nil; + self.missionName = nil; + self.listOfMissions = nil; + self.listOfDescriptions = nil; + // if you nil this one it won't get updated anymore + //self.previewImage = nil; + [super didReceiveMemoryWarning]; +} + +-(void) viewDidUnload { + self.listOfMissions = nil; + self.listOfDescriptions = nil; + self.previewImage = nil; + self.tableView = nil; + self.descriptionLabel = nil; + self.missionName = nil; + MSG_DIDUNLOAD(); + [super viewDidUnload]; +} + + +-(void) dealloc { + releaseAndNil(listOfMissions); + releaseAndNil(listOfDescriptions); + releaseAndNil(previewImage); + releaseAndNil(tableView); + releaseAndNil(descriptionLabel); + releaseAndNil(missionName); + [super dealloc]; +} + + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/ObjcExports.h --- a/project_files/HedgewarsMobile/Classes/ObjcExports.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/ObjcExports.h Sun Oct 16 21:03:30 2011 +0200 @@ -19,17 +19,23 @@ */ -@class OverlayViewController; +@interface ObjcExports : NSObject { + +} + ++(void) initialize; -void objcExportsInit(OverlayViewController *instance); -BOOL isGameRunning(); +@end + + +BOOL isGameRunning(void); void setGameRunning(BOOL value); -NSInteger cachedGrenadeTime(); -void clearView(); +NSInteger cachedGrenadeTime(void); +void clearView(void); void setGrenadeTime(NSInteger value); BOOL isApplePhone(void); -void startSpinningProgress(); -void stopSpinningProgress(); -void saveBeganSynching(); -void saveFinishedSynching(); +void startSpinningProgress(void); +void stopSpinningProgress(void); +void saveBeganSynching(void); +void saveFinishedSynching(void); diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/ObjcExports.m --- a/project_files/HedgewarsMobile/Classes/ObjcExports.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/ObjcExports.m Sun Oct 16 21:03:30 2011 +0200 @@ -23,27 +23,29 @@ #import "OverlayViewController.h" #import "AmmoMenuViewController.h" -#pragma mark - -#pragma mark internal variables + // actual game started (controls should be enabled) -BOOL gameRunning; +static BOOL gameRunning; // black screen present -BOOL savedGame; +static BOOL savedGame; // cache the grenade time -NSInteger grenadeTime; +static NSInteger grenadeTime; // the reference to the newMenu instance -OverlayViewController *overlay_instance; - +static OverlayViewController *overlay_instance; -#pragma mark - -#pragma mark functions called like oop -void objcExportsInit(OverlayViewController* instance) { - overlay_instance = instance; +@implementation ObjcExports + ++(void) initialize { + overlay_instance = [OverlayViewController mainOverlay]; gameRunning = NO; savedGame = NO; grenadeTime = 2; } +@end + +#pragma mark - +#pragma mark functions called by objc code BOOL inline isGameRunning() { return gameRunning; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/OverlayViewController.h --- a/project_files/HedgewarsMobile/Classes/OverlayViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -67,6 +67,8 @@ @property (assign) NSInteger initialScreenCount; ++(OverlayViewController *)mainOverlay; + -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event; -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/OverlayViewController.m --- a/project_files/HedgewarsMobile/Classes/OverlayViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -23,17 +23,18 @@ #import "InGameMenuViewController.h" #import "HelpPageViewController.h" #import "AmmoMenuViewController.h" -#import "PascalImports.h" -#import "CommodityFunctions.h" #import "CGPointUtils.h" #import "ObjcExports.h" + #define HIDING_TIME_DEFAULT [NSDate dateWithTimeIntervalSinceNow:2.7] #define HIDING_TIME_NEVER [NSDate dateWithTimeIntervalSinceNow:10000] #define doDim() [dimTimer setFireDate: (IS_DUALHEAD()) ? HIDING_TIME_NEVER : HIDING_TIME_DEFAULT] #define doNotDim() [dimTimer setFireDate:HIDING_TIME_NEVER] +static OverlayViewController *mainOverlay; + @implementation OverlayViewController @synthesize popoverController, popupMenu, helpPage, amvc, initialScreenCount, lowerIndicator, savesIndicator, confirmButton, grenadeTimeSegment; @@ -47,17 +48,22 @@ #pragma mark - #pragma mark View Management --(id) initWithCoder:(NSCoder *)aDecoder { - if ((self = [super initWithCoder:aDecoder])) { +-(id) initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { + if ((self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil])) { isAttacking = NO; isPopoverVisible = NO; initialScreenCount = (IS_DUALHEAD() ? 2 : 1); lowerIndicator = nil; savesIndicator = nil; + mainOverlay = self; } return self; } ++(OverlayViewController *)mainOverlay { + return mainOverlay; +} + -(void) viewDidLoad { // fill all the screen available as sdlview disables autoresizing CGRect rect = [[UIScreen mainScreen] bounds]; @@ -108,6 +114,7 @@ // only objects initialized in viewDidLoad should be here dimTimer = nil; + mainOverlay = nil; self.helpPage = nil; [self dismissPopover]; self.popoverController = nil; @@ -278,7 +285,7 @@ HW_backjump(); break; case 10: - playSound(@"clickSound"); + [AudioManagerController playClickSound]; clearView(); HW_pause(); if (self.amvc.isVisible && IS_DUALHEAD() == NO) { @@ -289,7 +296,7 @@ [self showPopover]; break; case 11: - playSound(@"clickSound"); + [AudioManagerController playClickSound]; clearView(); if (IS_DUALHEAD() || [[[NSUserDefaults standardUserDefaults] objectForKey:@"classic_menu"] boolValue] == NO) { diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/OverlayViewController.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1014 @@ + + + + 1056 + 10H574 + 823 + 1038.35 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 268 + {{0, 229}, {50, 50}} + + NO + NO + YES + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + + 3 + MQA + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + 3 + MC41AA + + + NSImage + arrowLeft.png + + + + + 268 + {{87, 229}, {50, 50}} + + NO + NO + YES + 1 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + arrowRight.png + + + + + 265 + {{412, 236}, {64, 64}} + + NO + NO + YES + 5 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + joyButtonBackJump.png + + + + + 265 + {{365, 203}, {64, 64}} + + NO + NO + YES + 6 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + joyButtonForwardJump.png + + + + + 265 + {{354, 256}, {64, 64}} + + NO + NO + YES + 4 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + joyButtonAttack.png + + + + + 268 + {{44, 187}, {50, 50}} + + NO + NO + YES + 2 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + arrowUp.png + + + + + 268 + {{44, 270}, {50, 50}} + + NO + NO + YES + 3 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA + + + + NSImage + arrowDown.png + + + + + 289 + {{341, 0}, {64, 50}} + + NO + YES + 10 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + cornerButton.png + + + + + 289 + {{402, 0}, {78, 50}} + + NO + YES + 11 + IBCocoaTouchFramework + 0 + 0 + + + + 1 + MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA + + + + NSImage + ammoButton.png + + + + {480, 320} + + + 3 + MSAwAA + + NO + YES + NO + YES + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + buttonPressed: + + + 1 + + 8 + + + + buttonReleased: + + + 9 + + 9 + + + + buttonReleased: + + + 7 + + 10 + + + + buttonReleased: + + + 8 + + 11 + + + + buttonReleased: + + + 8 + + 13 + + + + buttonReleased: + + + 9 + + 14 + + + + buttonPressed: + + + 1 + + 15 + + + + buttonReleased: + + + 7 + + 16 + + + + buttonReleased: + + + 9 + + 18 + + + + buttonPressed: + + + 1 + + 19 + + + + buttonReleased: + + + 8 + + 20 + + + + buttonReleased: + + + 7 + + 21 + + + + buttonReleased: + + + 8 + + 23 + + + + buttonReleased: + + + 9 + + 24 + + + + buttonPressed: + + + 1 + + 25 + + + + buttonReleased: + + + 7 + + 26 + + + + buttonReleased: + + + 9 + + 44 + + + + buttonPressed: + + + 1 + + 45 + + + + buttonReleased: + + + 8 + + 46 + + + + buttonReleased: + + + 7 + + 47 + + + + buttonReleased: + + + 8 + + 49 + + + + buttonReleased: + + + 7 + + 50 + + + + buttonReleased: + + + 9 + + 51 + + + + buttonPressed: + + + 1 + + 52 + + + + buttonReleased: + + + 9 + + 54 + + + + buttonReleased: + + + 7 + + 55 + + + + buttonPressed: + + + 1 + + 56 + + + + buttonReleased: + + + 8 + + 57 + + + + buttonPressed: + + + 7 + + 60 + + + + buttonPressed: + + + 7 + + 68 + + + + buttonReleased: + + + 9 + + 69 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 4 + + + left + + + 12 + + + right + + + 17 + + + up + + + 22 + + + down + + + 43 + + + push2 + + + 48 + + + push1 + + + 53 + + + push3 + + + 58 + + + + + 67 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 12.IBPluginDependency + 12.IBViewBoundsToFrameTransform + 17.IBPluginDependency + 22.IBPluginDependency + 4.IBPluginDependency + 43.IBPluginDependency + 48.IBPluginDependency + 53.IBPluginDependency + 58.IBPluginDependency + 67.IBPluginDependency + + + YES + OverlayViewController + UIResponder + {{690, 375}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCkAAAw5SAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 72 + + + + YES + + OverlayViewController + UIViewController + + YES + + YES + buttonPressed: + buttonReleased: + + + YES + id + id + + + + YES + + YES + buttonPressed: + buttonReleased: + + + YES + + buttonPressed: + id + + + buttonReleased: + id + + + + + IBProjectSource + Classes/OverlayViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + YES + + YES + ammoButton.png + arrowDown.png + arrowLeft.png + arrowRight.png + arrowUp.png + cornerButton.png + joyButtonAttack.png + joyButtonBackJump.png + joyButtonForwardJump.png + + + YES + {78, 50} + {50, 50} + {50, 50} + {50, 50} + {50, 50} + {60, 50} + {64, 64} + {64, 64} + {64, 64} + + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPad.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,616 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 274 + + YES + + + 302 + {{84, 517}, {151, 37}} + + NO + IBIPadFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + 1 + Dismiss + + 3 + MQA + + + 1 + MCAwIDAuNTAxOTYwODE0AA + + + 3 + MC41AA + + + + + 299 + {{308, 517}, {151, 37}} + + NO + 1 + IBIPadFramework + 0 + 0 + + 1 + Restore + + + + + + + 315 + {{216, 35}, {108, 29}} + + NO + YES + 7 + NO + IBIPadFramework + Hmm... + + Helvetica-Bold + 24 + 16 + + + 2 + MSAwLjc4MDM5MjIyOTYgMAA + + + 1 + 10 + 1 + + + + 307 + {{80, 375}, {380, 96}} + + NO + YES + 7 + NO + IBIPadFramework + Would you like to restore it? + + Helvetica + 18 + 16 + + + 1 + MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA + + + 1 + 10 + 4 + 1 + + + + 307 + {{80, 87}, {380, 96}} + + NO + YES + 7 + NO + IBIPadFramework + It appears you didn't complete your last game! + + + 1 + MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA + + + 1 + 10 + 4 + 1 + + + + 300 + {{150, 191}, {240, 160}} + + NO + IBIPadFramework + + NSImage + denied.png + + + + {540, 640} + + + 4 + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + buttonReleased: + + + 7 + + 21 + + + + buttonReleased: + + + 7 + + 22 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 15 + + + + + 16 + + + + + 18 + + + + + 19 + + + + + 20 + + + + + 23 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 15.IBPluginDependency + 15.IBViewBoundsToFrameTransform + 16.IBPluginDependency + 16.IBViewBoundsToFrameTransform + 18.IBPluginDependency + 18.IBViewBoundsToFrameTransform + 19.IBPluginDependency + 19.IBViewBoundsToFrameTransform + 20.IBPluginDependency + 20.IBViewBoundsToFrameTransform + 23.IBPluginDependency + 23.IBViewBoundsToFrameTransform + + + YES + RestoreViewController + UIResponder + {{566, 244}, {540, 640}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDlIAAw2gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABEAkAAw2gAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDXAAAw3UAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUKgAABDmYAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABDFgAAw8cAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + P4AAAL+AAABCoAAAw9uAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 23 + + + + YES + + RestoreViewController + UIViewController + + buttonReleased: + id + + + buttonReleased: + + buttonReleased: + id + + + + IBProjectSource + Classes/RestoreViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + denied.png + {240, 160} + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController-iPhone.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,582 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBCocoaTouchFramework + + + IBFirstResponder + IBCocoaTouchFramework + + + + 274 + + YES + + + 300 + {{20, 20}, {240, 160}} + + NO + IBCocoaTouchFramework + + NSImage + denied.png + + + + + 315 + {{310, 32}, {108, 29}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + Hmm... + + Helvetica-Bold + 24 + 16 + + + 2 + MSAwLjgyNzQ1MTA1MDMgMAA + + + 3 + MQA + + 1 + 10 + 1 + + + + 307 + {{268, 74}, {192, 96}} + + NO + YES + 7 + NO + IBCocoaTouchFramework + It appears you didn't complete your last game! Would you like to restore it? + + Helvetica + 18 + 16 + + + 1 + MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA + + + 1 + 10 + 4 + 1 + + + + 302 + {{53, 229}, {151, 37}} + + NO + IBCocoaTouchFramework + 0 + 0 + + Helvetica-Bold + 15 + 16 + + 1 + Dismiss + + + 1 + MCAwIDAuNTAxOTYwODE0AA + + + 3 + MC41AA + + + + + 299 + {{277, 229}, {151, 37}} + + NO + 1 + IBCocoaTouchFramework + 0 + 0 + + 1 + Restore + + + + + + {480, 320} + + + 4 + + 3 + + IBCocoaTouchFramework + + + + + YES + + + view + + + + 3 + + + + buttonReleased: + + + 7 + + 11 + + + + buttonReleased: + + + 7 + + 12 + + + + + YES + + 0 + + + + + + 1 + + + YES + + + + + + + + + + -1 + + + File's Owner + + + -2 + + + + + 5 + + + + + 6 + + + + + 7 + + + + + 8 + + + + + 10 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 1.IBEditorWindowLastContentRect + 1.IBPluginDependency + 10.IBPluginDependency + 10.IBViewBoundsToFrameTransform + 5.IBPluginDependency + 5.IBViewBoundsToFrameTransform + 6.IBPluginDependency + 6.IBViewBoundsToFrameTransform + 7.IBPluginDependency + 7.IBViewBoundsToFrameTransform + 8.IBPluginDependency + 8.IBViewBoundsToFrameTransform + + + YES + RestoreViewController + UIResponder + {{206, 423}, {480, 320}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUOKgABDZQAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUGgAABBoAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUObAABCAAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUOGAABClAAAA + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + AUJUAABDZQAAA + + + + + YES + + + YES + + + + + YES + + + YES + + + + 14 + + + + YES + + RestoreViewController + UIViewController + + buttonReleased: + id + + + buttonReleased: + + buttonReleased: + id + + + + IBProjectSource + Classes/RestoreViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIButton + UIControl + + IBFrameworkSource + UIKit.framework/Headers/UIButton.h + + + + UIControl + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIControl.h + + + + UIImageView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIImageView.h + + + + UILabel + UIView + + IBFrameworkSource + UIKit.framework/Headers/UILabel.h + + + + UIResponder + NSObject + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBCocoaTouchFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + + denied.png + {240, 160} + + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/RestoreViewController.h --- a/project_files/HedgewarsMobile/Classes/RestoreViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -21,14 +21,11 @@ #import -@class GameInterfaceBridge; @interface RestoreViewController : UIViewController { - GameInterfaceBridge *interfaceBridge; + } -@property (nonatomic,retain) GameInterfaceBridge *interfaceBridge; - -(IBAction) buttonReleased:(id) sender; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/RestoreViewController.m --- a/project_files/HedgewarsMobile/Classes/RestoreViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/RestoreViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -23,7 +23,6 @@ #import "GameInterfaceBridge.h" @implementation RestoreViewController -@synthesize interfaceBridge; // Override to allow orientations other than the default portrait orientation. -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { @@ -36,16 +35,11 @@ NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (theButton.tag != 0) { - playSound(@"clickSound"); - if (self.interfaceBridge == nil) { - GameInterfaceBridge *bridge = [[GameInterfaceBridge alloc] initWithController:self.parentViewController]; - self.interfaceBridge = bridge; - [bridge release]; - } + [AudioManagerController playClickSound]; [self.parentViewController dismissModalViewControllerAnimated:NO]; - [self.interfaceBridge startSaveGame:[defaults objectForKey:@"savedGamePath"]]; + [[NSNotificationCenter defaultCenter] postNotificationName:@"launchRestoredGame" object:nil]; } else { - playSound(@"backSound"); + [AudioManagerController playBackSound]; [defaults setObject:@"" forKey:@"savedGamePath"]; [defaults synchronize]; [self.parentViewController dismissModalViewControllerAnimated:YES]; @@ -65,18 +59,14 @@ } -(void) didReceiveMemoryWarning { - // don't nil this one or it won't be able to send messages - //self.interfaceBridge = nil; [super didReceiveMemoryWarning]; } -(void) viewDidUnload { - self.interfaceBridge = nil; [super viewDidUnload]; } -(void) dealloc { - releaseAndNil(interfaceBridge); [super dealloc]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SavedGamesViewController.m --- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -21,7 +21,7 @@ #import "SavedGamesViewController.h" #import "GameInterfaceBridge.h" -#import "CommodityFunctions.h" + @implementation SavedGamesViewController @synthesize tableView, listOfSavegames, interfaceBridge, numberOfItems; @@ -44,11 +44,7 @@ if ([self.tableView respondsToSelector:@selector(setBackgroundView:)]) self.tableView.backgroundView = nil; - NSString *imgName; - if (IS_IPAD()) - imgName = @"mediumBackground~ipad.png"; - else - imgName = @"smallerBackground~iphone.png"; + NSString *imgName = (IS_IPAD()) ? @"mediumBackground~ipad.png" : @"smallerBackground~iphone.png"; UIImage *img = [[UIImage alloc] initWithContentsOfFile:imgName]; self.view.backgroundColor = [UIColor colorWithPatternImage:img]; [img release]; @@ -69,7 +65,7 @@ UIButton *button = (UIButton *)sender; if (button.tag == 0) { - playSound(@"backSound"); + [AudioManagerController playBackSound]; [self.tableView setEditing:NO animated:YES]; [[self parentViewController] dismissModalViewControllerAnimated:YES]; } else { diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.xib Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,574 @@ + + + + 1056 + 10K549 + 823 + 1038.36 + 461.00 + + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + 132 + + + YES + + + + YES + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + YES + + YES + + + YES + + + + YES + + IBFilesOwner + IBIPadFramework + + + IBFirstResponder + IBIPadFramework + + + + 292 + + YES + + + 290 + {768, 44} + + NO + 458912 + IBIPadFramework + + YES + + IBIPadFramework + 1 + + 0 + + + IBIPadFramework + + 5 + + + 1 + Clear All + IBIPadFramework + 1 + + + + + + + 274 + {{0, 44}, {768, 724}} + + + 1 + MCAwIDAgMAA + + YES + IBIPadFramework + YES + 1 + 2 + 0 + YES + 44 + 10 + 10 + + + {768, 768} + + + 3 + MQA + + NO + + 3 + + IBIPadFramework + + + + + YES + + + view + + + + 3 + + + + buttonPressed: + + + + 6 + + + + dataSource + + + + 8 + + + + delegate + + + + 9 + + + + tableView + + + + 10 + + + + buttonPressed: + + + + 17 + + + + + YES + + 0 + + + + + + -1 + + + File's Owner + + + -2 + + + + + 2 + + + YES + + + + + + + 4 + + + YES + + + + + + + + 5 + + + + + 7 + + + + + 13 + + + + + 15 + + + + + + + YES + + YES + -1.CustomClassName + -2.CustomClassName + 13.IBPluginDependency + 15.IBPluginDependency + 2.IBEditorWindowLastContentRect + 2.IBPluginDependency + 4.IBPluginDependency + 5.IBPluginDependency + 7.IBPluginDependency + + + YES + SavedGamesViewController + UIResponder + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + {{467, 276}, {768, 768}} + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + com.apple.InterfaceBuilder.IBCocoaTouchPlugin + + + + YES + + + YES + + + + + YES + + + YES + + + + 17 + + + + YES + + SavedGamesViewController + UIViewController + + YES + + YES + buttonPressed: + clearAll: + toggleEdit: + + + YES + id + id + id + + + + YES + + YES + buttonPressed: + clearAll: + toggleEdit: + + + YES + + buttonPressed: + id + + + clearAll: + id + + + toggleEdit: + id + + + + + tableView + UITableView + + + tableView + + tableView + UITableView + + + + IBProjectSource + Classes/SavedGamesViewController.h + + + + + YES + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSError.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSFileManager.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueCoding.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyValueObserving.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSKeyedArchiver.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSObject.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSRunLoop.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSThread.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURL.h + + + + NSObject + + IBFrameworkSource + Foundation.framework/Headers/NSURLConnection.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CAAnimation.h + + + + NSObject + + IBFrameworkSource + QuartzCore.framework/Headers/CALayer.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIAccessibility.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UINibLoading.h + + + + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIResponder.h + + + + UIBarButtonItem + UIBarItem + + IBFrameworkSource + UIKit.framework/Headers/UIBarButtonItem.h + + + + UIBarItem + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UIBarItem.h + + + + UIResponder + NSObject + + + + UIScrollView + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIScrollView.h + + + + UISearchBar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UISearchBar.h + + + + UISearchDisplayController + NSObject + + IBFrameworkSource + UIKit.framework/Headers/UISearchDisplayController.h + + + + UITableView + UIScrollView + + IBFrameworkSource + UIKit.framework/Headers/UITableView.h + + + + UIToolbar + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIToolbar.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UIPrintFormatter.h + + + + UIView + + IBFrameworkSource + UIKit.framework/Headers/UITextField.h + + + + UIView + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIView.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UINavigationController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UIPopoverController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UISplitViewController.h + + + + UIViewController + + IBFrameworkSource + UIKit.framework/Headers/UITabBarController.h + + + + UIViewController + UIResponder + + IBFrameworkSource + UIKit.framework/Headers/UIViewController.h + + + + + 0 + IBIPadFramework + + com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS + + + + com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 + + + YES + ../Hedgewars.xcodeproj + 3 + 132 + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SchemeSettingsViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -41,6 +41,8 @@ action:@selector(toggleEdit:)]; self.navigationItem.rightBarButtonItem = editButton; [editButton release]; + + self.navigationItem.title = @"List of schemes"; } -(void) viewWillAppear:(BOOL) animated { @@ -78,7 +80,7 @@ -(void) addScheme:(id) sender { NSString *fileName = [[NSString alloc] initWithFormat:@"Scheme %u.plist", [self.listOfSchemes count]]; - createSchemeNamed([fileName stringByDeletingPathExtension], 0); + [CreationChamber createSchemeNamed:[fileName stringByDeletingPathExtension]]; [self.listOfSchemes addObject:fileName]; @@ -126,7 +128,7 @@ [schemeFile release]; [self.listOfSchemes removeObjectAtIndex:row]; - [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } #pragma mark - @@ -144,6 +146,7 @@ [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; [self.navigationController pushViewController:childController animated:YES]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -22,7 +22,9 @@ #import -@interface SchemeWeaponConfigViewController : UITableViewController { +@interface SchemeWeaponConfigViewController : UIViewController { + UITableView *tableView; + NSArray *listOfSchemes; NSArray *listOfWeapons; NSArray *listOfScripts; @@ -37,9 +39,10 @@ NSString *scriptCommand; UISegmentedControl *topControl; - BOOL hideSections; + BOOL sectionsHidden; } +@property (nonatomic,retain) UITableView *tableView; @property (nonatomic,retain) NSArray *listOfSchemes; @property (nonatomic,retain) NSArray *listOfWeapons; @property (nonatomic,retain) NSArray *listOfScripts; @@ -51,9 +54,9 @@ @property (nonatomic,retain) NSString *selectedScript; @property (nonatomic,retain) NSString *scriptCommand; @property (nonatomic,retain) UISegmentedControl *topControl; -@property (assign) BOOL hideSections; +@property (nonatomic,assign) BOOL sectionsHidden; --(void) fillSections; --(void) emptySections; ++(void) fillInstanceSections; ++(void) emptyInstanceSections; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SchemeWeaponConfigViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,80 +20,121 @@ #import "SchemeWeaponConfigViewController.h" -#import "CommodityFunctions.h" +#import + #define LABEL_TAG 57423 +static SchemeWeaponConfigViewController *controllerInstance; + @implementation SchemeWeaponConfigViewController -@synthesize listOfSchemes, listOfWeapons, listOfScripts, lastIndexPath_sc, lastIndexPath_we, lastIndexPath_lu, - selectedScheme, selectedWeapon, selectedScript, scriptCommand, topControl, hideSections; +@synthesize tableView, listOfSchemes, listOfWeapons, listOfScripts, lastIndexPath_sc, lastIndexPath_we, lastIndexPath_lu, + selectedScheme, selectedWeapon, selectedScript, scriptCommand, topControl, sectionsHidden; -(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return rotationManager(interfaceOrientation); } #pragma mark - +#pragma mark custom setters/getters +-(NSString *)selectedScheme { + if (selectedScheme == nil) + self.selectedScheme = @"Default.plist"; + return selectedScheme; +} + +-(NSString *)selectedWeapon { + if (selectedWeapon == nil) + self.selectedWeapon = @"Default.plist"; + return selectedWeapon; +} + +-(NSString *)selectedScript { + if (selectedScript == nil) + self.selectedScript = @"Normal.plist"; + return selectedScript; +} + +-(NSString *)scriptCommand { + if (scriptCommand == nil) + self.scriptCommand = @""; + return scriptCommand; +} + +-(NSArray *)listOfSchemes { + if (listOfSchemes == nil) + self.listOfSchemes = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:SCHEMES_DIRECTORY() error:NULL]; + return listOfSchemes; +} + +-(NSArray *)listOfWeapons { + if (listOfWeapons == nil) + self.listOfWeapons = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:WEAPONS_DIRECTORY() error:NULL]; + return listOfWeapons; +} + +-(NSArray *)listOfScripts { + if (listOfScripts == nil) + self.listOfScripts = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:SCRIPTS_DIRECTORY() error:NULL]; + return listOfScripts; +} + +-(UISegmentedControl *)topControl { + if (topControl == nil) { + NSArray *array = [[NSArray alloc] initWithObjects: + NSLocalizedString(@"Scheme",@""), + NSLocalizedString(@"Weapon",@""), + NSLocalizedString(@"Style",@""),nil]; + UISegmentedControl *controller = [[UISegmentedControl alloc] initWithItems:array]; + [array release]; + [controller addTarget:self.tableView action:@selector(reloadData) forControlEvents:UIControlEventValueChanged]; + controller.segmentedControlStyle = UISegmentedControlStyleBar; + controller.tintColor = [UIColor lightGrayColor]; + controller.selectedSegmentIndex = 0; + self.topControl = controller; + [controller release]; + } + return topControl; +} + +#pragma mark - #pragma mark View lifecycle -(void) viewDidLoad { - [super viewDidLoad]; - - CGSize screenSize = [[UIScreen mainScreen] bounds].size; - self.view.frame = CGRectMake(0, 0, screenSize.height, screenSize.width - 44); - - self.selectedScheme = nil; - self.selectedWeapon = nil; - self.selectedScript = nil; - self.scriptCommand = nil; + self.sectionsHidden = NO; - if ([self.tableView respondsToSelector:@selector(setBackgroundView:)]) { - if (IS_IPAD()) - [self.tableView setBackgroundView:nil]; - else { - UIImage *backgroundImage = [[UIImage alloc] initWithContentsOfFile:@"background~iphone.png"]; - UIImageView *background = [[UIImageView alloc] initWithImage:backgroundImage]; - [backgroundImage release]; - [self.tableView setBackgroundView:background]; - [background release]; - } + UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) + style:UITableViewStyleGrouped]; + aTableView.delegate = self; + aTableView.dataSource = self; + if (IS_IPAD()) { + [aTableView setBackgroundColorForAnyTable:[UIColor darkBlueColorTransparent]]; + aTableView.layer.borderColor = [[UIColor darkYellowColor] CGColor]; + aTableView.layer.borderWidth = 2.7f; + aTableView.layer.cornerRadius = 8; + aTableView.contentInset = UIEdgeInsetsMake(5, 0, 5, 0); } else { - self.view.backgroundColor = [UIColor blackColor]; + UIImage *backgroundImage = [[UIImage alloc] initWithContentsOfFile:@"background~iphone.png"]; + UIImageView *background = [[UIImageView alloc] initWithImage:backgroundImage]; + [backgroundImage release]; + [aTableView setBackgroundView:background]; + [background release]; } - self.tableView.separatorColor = UICOLOR_HW_YELLOW_BODER; - self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; -} - --(void) viewWillAppear:(BOOL) animated { - [super viewWillAppear:animated]; - - NSArray *contentsOfDir = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:SCHEMES_DIRECTORY() error:NULL]; - self.listOfSchemes = contentsOfDir; + aTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite; + aTableView.separatorColor = [UIColor whiteColor]; + aTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + self.tableView = aTableView; + [aTableView release]; + [self.view addSubview:self.tableView]; - if (self.selectedScheme == nil && [listOfSchemes containsObject:@"Default.plist"]) - self.selectedScheme = @"Default.plist"; - - contentsOfDir = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:WEAPONS_DIRECTORY() error:NULL]; - self.listOfWeapons = contentsOfDir; - - if (self.selectedWeapon == nil && [listOfWeapons containsObject:@"Default.plist"]) - self.selectedWeapon = @"Default.plist"; - - contentsOfDir = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:SCRIPTS_DIRECTORY() error:NULL]; - self.listOfScripts = contentsOfDir; - self.selectedScript = @"Normal.plist"; - self.scriptCommand = @""; - - [self.tableView reloadData]; + [super viewDidLoad]; + controllerInstance = self; } - #pragma mark - #pragma mark Table view data source -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { - if (hideSections) - return 0; - else - return 1; + return (self.sectionsHidden ? 0 : 1); } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { @@ -106,12 +147,12 @@ } // Customize the appearance of table view cells. --(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { +-(UITableViewCell *)tableView:(UITableView *)aTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellIdentifier = @"Cell"; NSInteger index = self.topControl.selectedSegmentIndex; NSInteger row = [indexPath row]; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + UITableViewCell *cell = [aTableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; @@ -154,8 +195,8 @@ } } - cell.backgroundColor = UICOLOR_HW_ALMOSTBLACK; - cell.textLabel.textColor = UICOLOR_HW_YELLOW_TEXT; + cell.backgroundColor = [UIColor blackColorTransparent]; + cell.textLabel.textColor = [UIColor lightYellowColor]; cell.detailTextLabel.textColor = [UIColor whiteColor]; cell.textLabel.adjustsFontSizeToFitWidth = YES; cell.detailTextLabel.adjustsFontSizeToFitWidth = YES; @@ -167,20 +208,9 @@ } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { - if (self.topControl == nil) { - NSArray *array = [[NSArray alloc] initWithObjects:NSLocalizedString(@"Scheme",@""),NSLocalizedString(@"Weapon",@""), - NSLocalizedString(@"Style",@""),nil]; - self.topControl = [[UISegmentedControl alloc] initWithItems:array]; - [array release]; - [self.topControl addTarget:self.tableView action:@selector(reloadData) forControlEvents:UIControlEventValueChanged]; - self.topControl.segmentedControlStyle = UISegmentedControlStyleBar; - self.topControl.frame = CGRectMake(0, 0, self.view.frame.size.width * 80/100, 30); - self.topControl.center = CGPointMake(self.view.frame.size.width/2, 24); - self.topControl.tintColor = [UIColor lightGrayColor]; - self.topControl.selectedSegmentIndex = 0; - } - UIView *theView = [[[UIView alloc] init] autorelease]; + self.topControl.frame = CGRectMake(0, 0, self.view.frame.size.width * 80/100, 30); + self.topControl.center = CGPointMake(self.view.frame.size.width/2, 24); [theView addSubview:self.topControl]; return theView; } @@ -213,6 +243,7 @@ self.lastIndexPath_sc = indexPath; self.selectedScheme = [self.listOfSchemes objectAtIndex:newRow]; + // also set weaponset when selecting scheme, if set NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; if ([[settings objectForKey:@"sync_ws"] boolValue]) { for (NSString *str in self.listOfWeapons) { @@ -220,7 +251,6 @@ int index = [self.listOfSchemes indexOfObject:str]; self.selectedWeapon = str; self.lastIndexPath_we = [NSIndexPath indexPathForRow:index inSection:1]; - [self.tableView reloadData]; break; } } @@ -232,7 +262,8 @@ self.lastIndexPath_lu = indexPath; self.selectedScript = [self.listOfScripts objectAtIndex:newRow]; - NSString *path = [[NSString alloc] initWithFormat:@"%@/%@",SCRIPTS_DIRECTORY(),selectedScript]; + // some styles disable or force the choice of a particular scheme/weaponset + NSString *path = [[NSString alloc] initWithFormat:@"%@/%@",SCRIPTS_DIRECTORY(),self.selectedScript]; NSDictionary *scriptDict = [[NSDictionary alloc] initWithContentsOfFile:path]; [path release]; self.scriptCommand = [scriptDict objectForKey:@"command"]; @@ -262,64 +293,61 @@ [aTableView deselectRowAtIndexPath:indexPath animated:YES]; } --(void) fillSections { - if (hideSections == YES) { - hideSections = NO; - NSRange range; - range.location = 0; - range.length = 1; - NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range]; - [self.tableView insertSections:sections withRowAnimation:UITableViewRowAnimationFade]; - self.selectedScheme = @"Default.plist"; - self.selectedWeapon = @"Default.plist"; - self.selectedScript = @"Normal.plist"; +#pragma mark - +#pragma mark called externally to empty or fill the sections completely ++(void) fillInstanceSections { + if (controllerInstance.sectionsHidden == YES) { + controllerInstance.sectionsHidden = NO; + NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)]; + [controllerInstance.tableView insertSections:sections withRowAnimation:UITableViewRowAnimationFade]; + controllerInstance.tableView.scrollEnabled = YES; - self.tableView.scrollEnabled = YES; - - [[self.view viewWithTag:LABEL_TAG] removeFromSuperview]; + [[controllerInstance.view viewWithTag:LABEL_TAG] removeFromSuperview]; } } --(void) emptySections { - hideSections = YES; - NSRange range; - range.location = 0; - range.length = 1; - NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:range]; - [self.tableView deleteSections:sections withRowAnimation:UITableViewRowAnimationFade]; - self.selectedScheme = @"Default.plist"; - self.selectedWeapon = @"Default.plist"; - self.selectedScript = @"Normal.plist"; ++(void) emptyInstanceSections { + if (controllerInstance.sectionsHidden == NO) { + controllerInstance.sectionsHidden = YES; + NSIndexSet *sections = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, 1)]; + [controllerInstance.tableView deleteSections:sections withRowAnimation:UITableViewRowAnimationFade]; + controllerInstance.tableView.scrollEnabled = NO; - self.tableView.scrollEnabled = NO; + CGRect frame = CGRectMake(0, 0, controllerInstance.view.frame.size.width * 80/100, 60); + UILabel *theLabel = [[UILabel alloc] initWithFrame:frame + andTitle:NSLocalizedString(@"Missions don't need further configuration",@"")]; + theLabel.center = CGPointMake(controllerInstance.view.frame.size.width/2, controllerInstance.view.frame.size.height/2); + theLabel.numberOfLines = 2; + theLabel.tag = LABEL_TAG; - CGRect frame = CGRectMake(0, 0, self.view.frame.size.width * 80/100, 60); - UILabel *theLabel = createBlueLabel(NSLocalizedString(@"Missions don't need further configuration",@""), frame); - theLabel.center = CGPointMake(self.view.frame.size.width/2, self.view.frame.size.height/2); - theLabel.numberOfLines = 2; - theLabel.tag = LABEL_TAG; - - [self.view addSubview:theLabel]; - [theLabel release]; + [controllerInstance.view addSubview:theLabel]; + [theLabel release]; + } } #pragma mark - #pragma mark Memory management -(void) didReceiveMemoryWarning { if ([[HedgewarsAppDelegate sharedAppDelegate] isInGame]) { + self.tableView = nil; self.lastIndexPath_sc = nil; self.lastIndexPath_we = nil; self.lastIndexPath_lu = nil; - self.listOfSchemes = nil; - self.listOfWeapons = nil; - self.listOfScripts = nil; + self.selectedScheme = nil; + self.selectedWeapon = nil; + self.selectedScript = nil; + self.scriptCommand = nil; self.topControl = nil; - MSG_MEMCLEAN(); } + self.listOfSchemes = nil; + self.listOfWeapons = nil; + self.listOfScripts = nil; + MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } -(void) viewDidUnload { + self.tableView = nil; self.listOfSchemes = nil; self.listOfWeapons = nil; self.listOfScripts = nil; @@ -335,8 +363,8 @@ [super viewDidUnload]; } - -(void) dealloc { + releaseAndNil(tableView); releaseAndNil(listOfSchemes); releaseAndNil(listOfWeapons); releaseAndNil(listOfScripts); diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/ServerSetup.h --- a/project_files/HedgewarsMobile/Classes/ServerSetup.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/ServerSetup.h Sun Oct 16 21:03:30 2011 +0200 @@ -28,6 +28,9 @@ TCPsocket sd; // External socket descriptor } ++(NSInteger) randomPort; ++(BOOL) isNetworkReachable; + @property (nonatomic, retain) NSDictionary *systemSettings; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/ServerSetup.m --- a/project_files/HedgewarsMobile/Classes/ServerSetup.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/ServerSetup.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,8 +20,9 @@ #import "ServerSetup.h" -#import "PascalImports.h" -#import "CommodityFunctions.h" +#import +#import + #import "hwconsts.h" #define BUFFER_SIZE 256 @@ -29,6 +30,47 @@ @implementation ServerSetup @synthesize systemSettings; + ++(NSInteger) randomPort { + srandom(time(NULL)); + NSInteger res = (random() % 64511) + 1024; + return (res == NETGAME_DEFAULT_PORT) ? [ServerSetup randomPort] : res; +} + ++(BOOL) isNetworkReachable { + // Create zero addy + struct sockaddr_in zeroAddress; + bzero(&zeroAddress, sizeof(zeroAddress)); + zeroAddress.sin_len = sizeof(zeroAddress); + zeroAddress.sin_family = AF_INET; + + // Recover reachability flags + SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); + SCNetworkReachabilityFlags flags; + + BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags); + CFRelease(defaultRouteReachability); + + if (!didRetrieveFlags) { + NSLog(@"Error. Could not recover network reachability flags"); + return NO; + } + + BOOL isReachable = flags & kSCNetworkFlagsReachable; + BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired; + BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection; + + NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"]; + NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL + cachePolicy:NSURLRequestReloadIgnoringLocalCacheData + timeoutInterval:20.0]; + NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:nil]; + BOOL testResult = testConnection ? YES : NO; + [testConnection release]; + + return ((isReachable && !needsConnection) || nonWiFi) ? testResult : NO; +} + -(id) init { if (self = [super init]) { self.systemSettings = nil; //nsuserdefault diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,50 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 27/03/2010. + */ + + +#import + + +@class GeneralSettingsViewController; +@class TeamSettingsViewController; +@class WeaponSettingsViewController; +@class SchemeSettingsViewController; +@class SupportViewController; + +@interface SettingsBaseViewController : UIViewController { + UIViewController *targetController; + NSArray *controllerNames; + NSIndexPath *lastIndexPath; + UITabBarController *tabController; + GeneralSettingsViewController *generalSettingsViewController; + TeamSettingsViewController *teamSettingsViewController; + WeaponSettingsViewController *weaponSettingsViewController; + SchemeSettingsViewController *schemeSettingsViewController; + SupportViewController *supportViewController; +} + +@property (nonatomic, retain) UIViewController *targetController; +@property (nonatomic, retain) NSArray *controllerNames; +@property (nonatomic, retain) NSIndexPath *lastIndexPath; +@property (nonatomic, retain) UITabBarController *tabController; + +-(void) dismissSplitView; + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/SettingsBaseViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,288 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 27/03/2010. + */ + + +#import "SettingsBaseViewController.h" +#import "GeneralSettingsViewController.h" +#import "TeamSettingsViewController.h" +#import "WeaponSettingsViewController.h" +#import "SchemeSettingsViewController.h" +#import "SupportViewController.h" + +@implementation SettingsBaseViewController +@synthesize tabController, targetController, controllerNames, lastIndexPath; + + +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { + return rotationManager(interfaceOrientation); +} + + +#pragma mark - +#pragma mark View lifecycle +-(void) viewDidLoad { + // the list of available controllers + NSArray *array = [[NSArray alloc] initWithObjects:NSLocalizedString(@"General",@""), + NSLocalizedString(@"Teams",@""), + NSLocalizedString(@"Weapons",@""), + NSLocalizedString(@"Schemes",@""), + NSLocalizedString(@"Support",@""), + nil]; + self.controllerNames = array; + [array release]; + + UIBarButtonItem *doneButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(dismissSplitView)]; + if (IS_IPAD()) { + // this class gets loaded twice, we tell the difference by looking at targetController + if (self.targetController != nil) { + UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain]; + tableView.delegate = self; + tableView.dataSource = self; + [tableView reloadData]; + [self.view addSubview:tableView]; + [self tableView:tableView didSelectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; + [tableView release]; + self.navigationItem.leftBarButtonItem = doneButton; + } + } else { + // this class just loads all controllers and set up tabbar and navigation controllers + NSMutableArray *tabBarNavigationControllers = [[NSMutableArray alloc] initWithCapacity:5]; + UINavigationController *navController = nil; + + if (nil == generalSettingsViewController) { + generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + generalSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:0]; + generalSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/TargetBee.png",GRAPHICS_DIRECTORY()]]; + navController = [[UINavigationController alloc] initWithRootViewController:generalSettingsViewController]; + generalSettingsViewController.navigationItem.backBarButtonItem = doneButton; + generalSettingsViewController.navigationItem.leftBarButtonItem = doneButton; + [generalSettingsViewController release]; + [tabBarNavigationControllers addObject:navController]; + releaseAndNil(navController); + } + if (nil == teamSettingsViewController) { + teamSettingsViewController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + teamSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:1]; + teamSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Egg.png",GRAPHICS_DIRECTORY()]]; + navController = [[UINavigationController alloc] initWithRootViewController:teamSettingsViewController]; + teamSettingsViewController.navigationItem.backBarButtonItem = doneButton; + teamSettingsViewController.navigationItem.leftBarButtonItem = doneButton; + [tabBarNavigationControllers addObject:navController]; + releaseAndNil(navController); + } + if (nil == weaponSettingsViewController) { + weaponSettingsViewController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + weaponSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:2]; + weaponSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/cheese.png",GRAPHICS_DIRECTORY()]]; + navController = [[UINavigationController alloc] initWithRootViewController:weaponSettingsViewController]; + weaponSettingsViewController.navigationItem.backBarButtonItem = doneButton; + weaponSettingsViewController.navigationItem.leftBarButtonItem = doneButton; + [tabBarNavigationControllers addObject:navController]; + releaseAndNil(navController); + } + if (nil == schemeSettingsViewController) { + schemeSettingsViewController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + schemeSettingsViewController.tabBarItem.title = [self.controllerNames objectAtIndex:3]; + schemeSettingsViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Targetp.png",GRAPHICS_DIRECTORY()]]; + navController = [[UINavigationController alloc] initWithRootViewController:schemeSettingsViewController]; + schemeSettingsViewController.navigationItem.backBarButtonItem = doneButton; + schemeSettingsViewController.navigationItem.leftBarButtonItem = doneButton; + [tabBarNavigationControllers addObject:navController]; + releaseAndNil(navController); + } + if (nil == supportViewController) { + supportViewController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; + supportViewController.tabBarItem.title = [self.controllerNames objectAtIndex:4]; + supportViewController.tabBarItem.image = [UIImage imageWithContentsOfFile:[NSString stringWithFormat:@"%@/Seduction.png",GRAPHICS_DIRECTORY()]]; + navController = [[UINavigationController alloc] initWithRootViewController:supportViewController]; + supportViewController.navigationItem.backBarButtonItem = doneButton; + supportViewController.navigationItem.leftBarButtonItem = doneButton; + [tabBarNavigationControllers addObject:navController]; + releaseAndNil(navController); + } + + self.tabController = [[UITabBarController alloc] init]; + self.tabController.viewControllers = tabBarNavigationControllers; + self.tabController.delegate = self; + + [self.view addSubview:self.tabController.view]; + } + [doneButton release]; + [super viewDidLoad]; +} + +-(void) tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController { + [viewController viewWillAppear:NO]; +} + +-(void) dismissSplitView { + [AudioManagerController playBackSound]; + [[[HedgewarsAppDelegate sharedAppDelegate] mainViewController] dismissModalViewControllerAnimated:YES]; +} + +#pragma mark - +#pragma mark Table view data source +-(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { + return 1; +} + +-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { + return [self.controllerNames count]; +} + +// Customize the appearance of table view cells. +-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { + static NSString *CellIdentifier = @"Cell"; + + UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; + if (cell == nil) + cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; + + NSString *iconStr = nil; + switch ([indexPath row]) { + case 0: + iconStr = [NSString stringWithFormat:@"%@/TargetBee.png",GRAPHICS_DIRECTORY()]; + break; + case 1: + iconStr = [NSString stringWithFormat:@"%@/Egg.png",GRAPHICS_DIRECTORY()]; + break; + case 2: + iconStr = [NSString stringWithFormat:@"%@/cheese.png",GRAPHICS_DIRECTORY()]; + break; + case 3: + iconStr = [NSString stringWithFormat:@"%@/Target.png",GRAPHICS_DIRECTORY()]; + break; + case 4: + iconStr = [NSString stringWithFormat:@"%@/Seduction.png",GRAPHICS_DIRECTORY()]; + break; + default: + DLog(@"Nope"); + break; + } + + cell.accessoryType = UITableViewCellAccessoryNone; + cell.textLabel.text = [controllerNames objectAtIndex:[indexPath row]]; + UIImage *icon = [[UIImage alloc] initWithContentsOfFile:iconStr]; + cell.imageView.image = icon; + [icon release]; + + return cell; +} + +#pragma mark - +#pragma mark Table view delegate +-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { + int newRow = [indexPath row]; + int oldRow = (lastIndexPath != nil) ? [lastIndexPath row] : -1; + UIViewController *nextController = nil; + + if (newRow != oldRow) { + [tableView deselectRowAtIndexPath:lastIndexPath animated:YES]; + [targetController.navigationController popToRootViewControllerAnimated:NO]; + + switch (newRow) { + case 0: + if (nil == generalSettingsViewController) + generalSettingsViewController = [[GeneralSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + nextController = generalSettingsViewController; + break; + case 1: + if (nil == teamSettingsViewController) + teamSettingsViewController = [[TeamSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + nextController = teamSettingsViewController; + break; + case 2: + if (nil == weaponSettingsViewController) + weaponSettingsViewController = [[WeaponSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + nextController = weaponSettingsViewController; + break; + case 3: + if (nil == schemeSettingsViewController) + schemeSettingsViewController = [[SchemeSettingsViewController alloc] initWithStyle:UITableViewStyleGrouped]; + nextController = schemeSettingsViewController; + break; + case 4: + if (nil == supportViewController) + supportViewController = [[SupportViewController alloc] initWithStyle:UITableViewStyleGrouped]; + nextController = supportViewController; + break; + } + + self.lastIndexPath = indexPath; + [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; + + nextController.navigationItem.hidesBackButton = YES; + [nextController viewWillAppear:NO]; + [targetController.navigationController pushViewController:nextController animated:NO]; + [AudioManagerController playClickSound]; + } +} + + +#pragma mark - +#pragma mark Memory management +-(void) didReceiveMemoryWarning { + if (generalSettingsViewController.view.superview == nil) + generalSettingsViewController = nil; + if (teamSettingsViewController.view.superview == nil) + teamSettingsViewController = nil; + if (weaponSettingsViewController.view.superview == nil) + weaponSettingsViewController = nil; + if (schemeSettingsViewController.view.superview == nil) + schemeSettingsViewController = nil; + if (supportViewController.view.superview == nil) + supportViewController = nil; + if (tabController.view.superview == nil) + tabController = nil; + MSG_MEMCLEAN(); + [super didReceiveMemoryWarning]; +} + +-(void) viewDidUnload { + self.controllerNames = nil; + self.lastIndexPath = nil; + self.targetController = nil; + self.tabController = nil; + generalSettingsViewController = nil; + teamSettingsViewController = nil; + weaponSettingsViewController = nil; + schemeSettingsViewController = nil; + supportViewController = nil; + MSG_DIDUNLOAD(); + [super viewDidUnload]; +} + +-(void) dealloc { + releaseAndNil(targetController); + releaseAndNil(controllerNames); + releaseAndNil(lastIndexPath); + releaseAndNil(tabController); + releaseAndNil(generalSettingsViewController); + releaseAndNil(teamSettingsViewController); + releaseAndNil(weaponSettingsViewController); + releaseAndNil(schemeSettingsViewController); + releaseAndNil(supportViewController); + [super dealloc]; +} + +@end + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,36 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 27/03/2010. + */ + + +#import + +@class SettingsBaseViewController; + +@interface SettingsContainerViewController : UIViewController { + SettingsBaseViewController *baseController; + UINavigationController *activeController; + UISplitViewController *splitViewRootController; +} + +@property (nonatomic,retain) SettingsBaseViewController *baseController; +@property (nonatomic,retain) UINavigationController *activeController; +@property (nonatomic,retain) UISplitViewController *splitViewRootController; + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Classes/SettingsContainerViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,130 @@ +/* + * Hedgewars-iOS, a Hedgewars port for iOS devices + * Copyright (c) 2009-2011 Vittorio Giovara + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 27/03/2010. + */ + + +#import "SettingsContainerViewController.h" +#import "SettingsBaseViewController.h" + + +@implementation SettingsContainerViewController +@synthesize baseController, activeController, splitViewRootController; + +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return rotationManager(interfaceOrientation); +} + + +-(void) viewDidLoad { + CGRect rect = [[UIScreen mainScreen] bounds]; + self.view.frame = CGRectMake(0, 0, rect.size.height, rect.size.width); + + if (IS_IPAD()) { + // the contents on the right of the splitview, setting targetController to nil to avoid creating the table + SettingsBaseViewController *rightController = [[SettingsBaseViewController alloc] init]; + rightController.targetController = nil; + UINavigationController *rightNavController = [[UINavigationController alloc] initWithRootViewController:rightController]; + [rightController release]; + + // the contens on the left of the splitview, setting targetController that will receive push/pop actions + SettingsBaseViewController *leftController = [[SettingsBaseViewController alloc] init]; + leftController.targetController = rightNavController.topViewController; + UINavigationController *leftNavController = [[UINavigationController alloc] initWithRootViewController:leftController]; + [leftController release]; + + self.activeController = rightNavController; + self.splitViewRootController = [[UISplitViewController alloc] init]; + self.splitViewRootController.delegate = nil; + self.splitViewRootController.view.frame = CGRectMake(0, 0, rect.size.height, rect.size.width); + self.splitViewRootController.viewControllers = [NSArray arrayWithObjects: leftNavController, rightNavController, nil]; + [leftNavController release]; + [rightNavController release]; + + // add view to main controller + [self.view addSubview:self.splitViewRootController.view]; + } else { + if (nil == self.baseController) { + SettingsBaseViewController *sbvc = [[SettingsBaseViewController alloc] init]; + self.baseController = sbvc; + [sbvc release]; + } + self.baseController.targetController = nil; + self.baseController.view.frame = CGRectMake(0, 0, rect.size.height, rect.size.width); + + [self.view addSubview:self.baseController.view]; + // here setting activeController is not needed as the event is kept active by the uitabbarcontroller + } + + [super viewDidLoad]; +} + +#pragma mark - +#pragma mark Memory management +-(void) didReceiveMemoryWarning { + if (self.baseController.view.superview == nil) + self.baseController = nil; + if (self.activeController.view.superview == nil) + self.activeController = nil; + if (self.splitViewRootController.view.superview == nil) + self.splitViewRootController = nil; + MSG_MEMCLEAN(); + [super didReceiveMemoryWarning]; +} + +-(void) viewDidUnload { + self.baseController = nil; + self.activeController = nil; + self.splitViewRootController = nil; + MSG_DIDUNLOAD(); + [super viewDidUnload]; +} + +-(void) dealloc { + releaseAndNil(baseController); + releaseAndNil(activeController); + releaseAndNil(splitViewRootController); + [super dealloc]; +} + + +#pragma mark - +#pragma mark additional methods as we're using a UINavigationController programmatically +// see http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/ +-(void) viewWillAppear:(BOOL)animated { + [super viewWillAppear:animated]; + [self.activeController viewWillAppear:animated]; +} + +-(void) viewWillDisappear:(BOOL)animated { + [super viewWillDisappear:animated]; + [self.activeController viewWillDisappear:animated]; +} + +-(void) viewDidAppear:(BOOL)animated { + [super viewDidLoad]; + [self.activeController viewDidAppear:animated]; +} + +-(void) viewDidDisappear:(BOOL)animated { + [super viewDidUnload]; + [self.activeController viewDidDisappear:animated]; +} + + +@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleSchemeViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -21,8 +21,7 @@ #import "SingleSchemeViewController.h" #import -#import "CommodityFunctions.h" -#import "UIImageExtra.h" + #define LABEL_TAG 12345 #define SLIDER_TAG 54321 @@ -235,8 +234,8 @@ [[self.gameModifierArray objectAtIndex:row] objectForKey:@"image"]]]; cell.imageView.image = image; [image release]; - [cell.imageView.layer setCornerRadius:7.0f]; - [cell.imageView.layer setMasksToBounds:YES]; + cell.imageView.layer.cornerRadius = 6.0f; + cell.imageView.layer.masksToBounds = YES; cell.textLabel.text = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"title"]; cell.detailTextLabel.text = [[self.gameModifierArray objectAtIndex:row] objectForKey:@"description"]; cell.detailTextLabel.adjustsFontSizeToFitWidth = YES; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SingleTeamViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleTeamViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -27,9 +27,7 @@ #import "FortsViewController.h" #import "FlagsViewController.h" #import "LevelViewController.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" -#import "PascalImports.h" + #define TEAMNAME_TAG 78789 @@ -264,8 +262,9 @@ accessoryImage = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/%@.png", FLAGS_DIRECTORY(),[teamDictionary objectForKey:@"flag"]]]; cell.imageView.image = [accessoryImage scaleToSize:CGSizeMake(26, 18)]; - cell.imageView.layer.borderWidth = 0.3; [accessoryImage release]; + cell.imageView.layer.borderWidth = 1; + cell.imageView.layer.borderColor = [[UIColor blackColor] CGColor]; break; case 4: // level accessoryImage = [[UIImage alloc] initWithContentsOfFile:[NSString stringWithFormat:@"%@/bot%d.png", diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m --- a/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SingleWeaponViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,9 +20,7 @@ #import "SingleWeaponViewController.h" -#import "CommodityFunctions.h" -#import "UIImageExtra.h" -#import "PascalImports.h" + @implementation SingleWeaponViewController @synthesize weaponName, description, ammoStoreImage; @@ -165,10 +163,10 @@ weaponCell.delegate = self; } - int size = 32 * getScreenScale(); - int corners = 8 * getScreenScale(); - int x = ((row*size)/(int)(self.ammoStoreImage.size.height*getScreenScale()))*size; - int y = (row*size)%(int)(self.ammoStoreImage.size.height*getScreenScale()); + int size = 32 * [[UIScreen mainScreen] scale]; + int corners = 8 * [[UIScreen mainScreen] scale]; + int x = ((row*size)/(int)(self.ammoStoreImage.size.height * [[UIScreen mainScreen] scale]))*size; + int y = (row*size)%(int)(self.ammoStoreImage.size.height * [[UIScreen mainScreen] scale]); UIImage *img = [[self.ammoStoreImage cutAt:CGRectMake(x, y, size, size)] makeRoundCornersOfSize:CGSizeMake(corners, corners)]; weaponCell.weaponIcon.image = img; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SplitViewRootController.h --- a/project_files/HedgewarsMobile/Classes/SplitViewRootController.h Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,36 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2011 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 27/03/2010. - */ - - -#import - -@class MasterViewController; - -@interface SplitViewRootController: UIViewController { - MasterViewController *activeController; - UINavigationController *rightNavController; - UISplitViewController *splitViewRootController; -} - -@property (nonatomic,retain) MasterViewController *activeController; -@property (nonatomic,retain) UINavigationController *rightNavController; -@property (nonatomic,retain) UISplitViewController *splitViewRootController; - -@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SplitViewRootController.m --- a/project_files/HedgewarsMobile/Classes/SplitViewRootController.m Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,123 +0,0 @@ -/* - * Hedgewars-iOS, a Hedgewars port for iOS devices - * Copyright (c) 2009-2011 Vittorio Giovara - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - * - * File created on 27/03/2010. - */ - - -#import "SplitViewRootController.h" -#import "MasterViewController.h" -#import "CommodityFunctions.h" - -@implementation SplitViewRootController -@synthesize activeController, rightNavController, splitViewRootController; - --(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return rotationManager(interfaceOrientation); -} - --(void) didReceiveMemoryWarning { - if (self.activeController.view.superview == nil) - self.activeController = nil; - MSG_MEMCLEAN(); - [super didReceiveMemoryWarning]; -} - -// load the view programmatically; we need a splitViewController that handles a MasterViewController -// (which is just a UITableViewController) and a DetailViewController where we present options --(void) viewDidLoad { - CGRect rect = [[UIScreen mainScreen] bounds]; - self.view.frame = CGRectMake(0, 0, rect.size.height, rect.size.width); - - if (self.activeController == nil) { - MasterViewController *rightController = [[MasterViewController alloc] initWithStyle:UITableViewStyleGrouped]; - rightController.rootController = self; - rightController.targetController = nil; - self.activeController = rightController; - [rightController release]; - } - self.rightNavController = [[UINavigationController alloc] initWithRootViewController:self.activeController]; - - if (IS_IPAD()) { - MasterViewController *leftController = [[MasterViewController alloc] initWithStyle:UITableViewStylePlain]; - leftController.rootController = self; - leftController.targetController = self.activeController; - UINavigationController *leftNavController = [[UINavigationController alloc] initWithRootViewController:leftController]; - [leftController release]; - - self.splitViewRootController = [[UISplitViewController alloc] init]; - self.splitViewRootController.delegate = nil; - self.splitViewRootController.view.frame = CGRectMake(0, 0, rect.size.height, rect.size.width); - self.splitViewRootController.viewControllers = [NSArray arrayWithObjects: leftNavController, self.rightNavController, nil]; - [leftNavController release]; - [self.rightNavController release]; - - // add view to main controller - [self.view addSubview:self.splitViewRootController.view]; - } else { - self.rightNavController.view.frame = CGRectMake(0, 0, rect.size.height, rect.size.width); - [self.view addSubview:self.rightNavController.view]; - } - - [super viewDidLoad]; -} - --(void) dismissModalViewControllerAnimated:(BOOL)animated { - playSound(@"backSound"); - [self.parentViewController dismissModalViewControllerAnimated:YES]; -} - --(void) viewDidUnload { - self.activeController = nil; - self.rightNavController = nil; - self.splitViewRootController = nil; - MSG_DIDUNLOAD(); - [super viewDidUnload]; -} - --(void) dealloc { - releaseAndNil(activeController); - releaseAndNil(rightNavController); - releaseAndNil(splitViewRootController); - [super dealloc]; -} - -#pragma mark - -#pragma mark additional methods as we're using a UINavigationController programmatically -// see http://davidebenini.it/2009/01/03/viewwillappear-not-being-called-inside-a-uinavigationcontroller/ --(void) viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - [self.activeController.navigationController viewWillAppear:animated]; -} - --(void) viewWillDisappear:(BOOL)animated { - [super viewWillDisappear:animated]; - [self.activeController.navigationController viewWillDisappear:animated]; -} - --(void) viewDidAppear:(BOOL)animated { - [super viewDidLoad]; - [self.activeController.navigationController viewDidAppear:animated]; -} - --(void) viewDidDisappear:(BOOL)animated { - [super viewDidUnload]; - [self.activeController.navigationController viewDidDisappear:animated]; -} - - -@end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SquareButtonView.m --- a/project_files/HedgewarsMobile/Classes/SquareButtonView.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SquareButtonView.m Sun Oct 16 21:03:30 2011 +0200 @@ -21,8 +21,7 @@ #import "SquareButtonView.h" #import -#import "CommodityFunctions.h" -#import "UIImageExtra.h" + @implementation SquareButtonView @synthesize colorArray, selectedColor, ownerDictionary; @@ -32,7 +31,7 @@ colorIndex = -1; selectedColor = 0; - self.colorArray = getAvailableColors(); + self.colorArray = [HWUtils teamColors]; // set the color to the first available one [self nextColor]; @@ -41,7 +40,7 @@ [self.layer setCornerRadius:7.0f]; [self.layer setMasksToBounds:YES]; [self.layer setBorderWidth:2]; - [self.layer setBorderColor:[UICOLOR_HW_YELLOW_BODER CGColor]]; + [self.layer setBorderColor:[[UIColor darkYellowColor] CGColor]]; // this changes the color at button press [self addTarget:self action:@selector(nextColor) forControlEvents:UIControlEventTouchUpInside]; @@ -67,7 +66,7 @@ -(void) selectColor:(NSUInteger) color { if (color != selectedColor) { selectedColor = color; - colorIndex = [colorArray indexOfObject:[NSNumber numberWithUnsignedInt:color]]; + colorIndex = [self.colorArray indexOfObject:[NSNumber numberWithUnsignedInt:color]]; self.backgroundColor = [UIColor colorWithRed:((color & 0x00FF0000) >> 16)/255.0f green:((color & 0x0000FF00) >> 8)/255.0f diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/StatsPageViewController.m --- a/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/StatsPageViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "StatsPageViewController.h" -#import "CommodityFunctions.h" +#import @implementation StatsPageViewController @synthesize statsArray; @@ -48,7 +48,7 @@ } else self.view.backgroundColor = [UIColor blackColor]; - self.tableView.separatorColor = UICOLOR_HW_YELLOW_BODER; + self.tableView.separatorColor = [UIColor darkYellowColor]; self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; [super viewDidLoad]; @@ -57,11 +57,11 @@ #pragma mark - #pragma mark Table view data source -(NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { - return 4; + return 3; } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == 0 || section == 3) + if (section == 0) return 1; else if (section == 1) return [[self.statsArray objectAtIndex:0] count]; @@ -84,7 +84,7 @@ imgName = @"star"; imgPath = [[NSBundle mainBundle] resourcePath]; cell.textLabel.text = [self.statsArray objectAtIndex:1]; - cell.textLabel.textColor = UICOLOR_HW_YELLOW_TEXT; + cell.textLabel.textColor = [UIColor lightYellowColor]; } else if (section == 1) { // teams ranking // color, # kills, teamname NSArray *info = [[[self.statsArray objectAtIndex:0] objectAtIndex:row] componentsSeparatedByString:@" "]; @@ -98,12 +98,7 @@ } else if (section == 2) { // general info imgName = @"iconDamage"; cell.textLabel.text = [self.statsArray objectAtIndex:row + 2]; - cell.textLabel.textColor = UICOLOR_HW_YELLOW_TEXT; - } else { // exit button - cell.textLabel.text = NSLocalizedString(@"Done",@""); - cell.textLabel.textColor = [UIColor whiteColor]; - cell.accessoryView = nil; - cell.imageView.image = nil; + cell.textLabel.textColor = [UIColor lightYellowColor]; } NSString *imgString = [[NSString alloc] initWithFormat:@"%@/%@.png",imgPath,imgName]; @@ -142,13 +137,42 @@ return nil; } +-(CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section { + return self.tableView.rowHeight + 30; +} + +-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger)section { + if (section == 2) { + + UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.height * 70 / 100, self.tableView.rowHeight)]; + footer.autoresizingMask = UIViewAutoresizingFlexibleWidth; + + UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 17, self.view.frame.size.height * 70 / 100, self.tableView.rowHeight)]; + button.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin; + [button setTitle:NSLocalizedString(@"Done",@"") forState:UIControlStateNormal]; + [button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal]; + [button setTitleColor:[UIColor grayColor] forState:UIControlStateHighlighted]; + + button.titleLabel.font = [UIFont boldSystemFontOfSize:[UIFont labelFontSize]]; + button.backgroundColor = [UIColor blackColorTransparent]; + [button.layer setBorderWidth:1]; + [button.layer setBorderColor:[[UIColor darkYellowColor] CGColor]]; + [button.layer setCornerRadius:9.0f]; + [button.layer setMasksToBounds:YES]; + [button addTarget:self action:@selector(dismissView) forControlEvents:UIControlEventTouchUpInside]; + [footer addSubview:button]; + [button release]; + + return [footer autorelease]; + } else + return nil; +} + #pragma mark - -#pragma mark Table view delegate --(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - if ([indexPath section] == 3) { - playSound(@"backSound"); - [self dismissModalViewControllerAnimated:YES]; - } +#pragma mark button delegate +-(void) dismissView { + [AudioManagerController playClickSound]; + [self dismissModalViewControllerAnimated:YES]; } #pragma mark - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/SupportViewController.m --- a/project_files/HedgewarsMobile/Classes/SupportViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/SupportViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "SupportViewController.h" -#import "CommodityFunctions.h" + @implementation SupportViewController @synthesize waysToSupport; @@ -44,6 +44,7 @@ self.waysToSupport = array; [array release]; + self.navigationItem.title = @"♥"; self.tableView.rowHeight = 50; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/TeamConfigViewController.h --- a/project_files/HedgewarsMobile/Classes/TeamConfigViewController.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/TeamConfigViewController.h Sun Oct 16 21:03:30 2011 +0200 @@ -22,17 +22,23 @@ #import #import "HoldTableViewCell.h" -@interface TeamConfigViewController : UITableViewController { + +@interface TeamConfigViewController : UIViewController { + UITableView *tableView; + NSInteger selectedTeamsCount; NSInteger allTeamsCount; NSMutableArray *listOfSelectedTeams; - NSMutableArray *listOfTeams; + NSMutableArray *listOfAllTeams; NSArray *cachedContentsOfDir; } -@property (nonatomic, retain) NSMutableArray *listOfTeams; -@property (nonatomic, retain) NSMutableArray *listOfSelectedTeams; -@property (nonatomic, retain) NSArray *cachedContentsOfDir; +@property (nonatomic,retain) UITableView *tableView; +@property (nonatomic,assign) NSInteger selectedTeamsCount; +@property (nonatomic,assign) NSInteger allTeamsCount; +@property (nonatomic,retain) NSMutableArray *listOfAllTeams; +@property (nonatomic,retain) NSMutableArray *listOfSelectedTeams; +@property (nonatomic,retain) NSArray *cachedContentsOfDir; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/TeamConfigViewController.m --- a/project_files/HedgewarsMobile/Classes/TeamConfigViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/TeamConfigViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,44 +20,57 @@ #import "TeamConfigViewController.h" -#import "CommodityFunctions.h" +#import #import "SquareButtonView.h" + @implementation TeamConfigViewController -@synthesize listOfTeams, listOfSelectedTeams, cachedContentsOfDir; +@synthesize tableView, selectedTeamsCount, allTeamsCount, listOfAllTeams, listOfSelectedTeams, cachedContentsOfDir; + +-(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { + return rotationManager(interfaceOrientation); +} #pragma mark - #pragma mark View lifecycle -(void) viewDidLoad { - [super viewDidLoad]; - +/* CGSize screenSize = [[UIScreen mainScreen] bounds].size; self.view.frame = CGRectMake(0, 0, screenSize.height, screenSize.width - 44); +*/ + UITableView *aTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height) + style:UITableViewStyleGrouped]; + aTableView.delegate = self; + aTableView.dataSource = self; + if (IS_IPAD()) { + [aTableView setBackgroundColorForAnyTable:[UIColor darkBlueColorTransparent]]; + aTableView.layer.borderColor = [[UIColor darkYellowColor] CGColor]; + aTableView.layer.borderWidth = 2.7f; + aTableView.layer.cornerRadius = 8; + aTableView.contentInset = UIEdgeInsetsMake(10, 0, 10, 0); + } else { + UIImage *backgroundImage = [[UIImage alloc] initWithContentsOfFile:@"background~iphone.png"]; + UIImageView *background = [[UIImageView alloc] initWithImage:backgroundImage]; + [backgroundImage release]; + [aTableView setBackgroundView:background]; + [background release]; + } - if ([self.tableView respondsToSelector:@selector(setBackgroundView:)]) { - if (IS_IPAD()) - [self.tableView setBackgroundView:nil]; - else { - UIImage *backgroundImage = [[UIImage alloc] initWithContentsOfFile:@"background~iphone.png"]; - UIImageView *background = [[UIImageView alloc] initWithImage:backgroundImage]; - [backgroundImage release]; - [self.tableView setBackgroundView:background]; - [background release]; - } - } else - self.view.backgroundColor = [UIColor blackColor]; + aTableView.indicatorStyle = UIScrollViewIndicatorStyleWhite; + aTableView.separatorColor = [UIColor whiteColor]; + aTableView.separatorStyle = UITableViewCellSeparatorStyleNone; + self.tableView = aTableView; + [aTableView release]; - self.tableView.separatorColor = UICOLOR_HW_YELLOW_BODER; - self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone; + [self.view addSubview:self.tableView]; + [super viewDidLoad]; } -(void) viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - NSArray *contentsOfDir = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:TEAMS_DIRECTORY() error:NULL]; - // avoid overwriting selected teams when returning on this view if ([self.cachedContentsOfDir isEqualToArray:contentsOfDir] == NO) { - NSArray *colors = getAvailableColors(); + self.cachedContentsOfDir = contentsOfDir; + NSArray *colors = [HWUtils teamColors]; NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:[contentsOfDir count]]; for (int i = 0; i < [contentsOfDir count]; i++) { NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithObjectsAndKeys: @@ -67,25 +80,19 @@ [array addObject:dict]; [dict release]; } - self.listOfTeams = array; + self.listOfAllTeams = array; [array release]; NSMutableArray *emptyArray = [[NSMutableArray alloc] initWithObjects:nil]; self.listOfSelectedTeams = emptyArray; [emptyArray release]; - selectedTeamsCount = [self.listOfSelectedTeams count]; - allTeamsCount = [self.listOfTeams count]; + self.selectedTeamsCount = [self.listOfSelectedTeams count]; + self.allTeamsCount = [self.listOfAllTeams count]; + [self.tableView reloadData]; + } - NSArray *contents = [[NSArray alloc] initWithArray:contentsOfDir copyItems:YES]; - self.cachedContentsOfDir = contents; - [contents release]; - } - [self.tableView reloadData]; -} - --(BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { - return rotationManager(interfaceOrientation); + [super viewWillAppear:animated]; } -(NSInteger) filterNumberOfHogs:(NSInteger) hogs { @@ -105,7 +112,7 @@ NSString *imgString = [[NSString alloc] initWithFormat:@"%@/hedgehog.png",[[NSBundle mainBundle] resourcePath]]; UIImage *hogSprite = [[UIImage alloc] initWithContentsOfFile:imgString]; [imgString release]; - CGFloat screenScale = getScreenScale(); + CGFloat screenScale = [[UIScreen mainScreen] scale]; int w = hogSprite.size.width * screenScale; int h = hogSprite.size.height * screenScale; CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); @@ -120,11 +127,7 @@ CGImageRef imageRef = CGBitmapContextCreateImage(context); // Create a new UIImage object - UIImage *resultImage; - if ([self respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) - resultImage = [UIImage imageWithCGImage:imageRef scale:screenScale orientation:UIImageOrientationUp]; - else - resultImage = [UIImage imageWithCGImage:imageRef]; + UIImage *resultImage = [UIImage imageWithCGImage:imageRef scale:screenScale orientation:UIImageOrientationUp]; // Release colorspace, context and bitmap information CGColorSpaceRelease(colorSpace); @@ -141,10 +144,7 @@ } -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - if (section == 0) - return selectedTeamsCount; - else - return allTeamsCount; + return (section == 0 ? self.selectedTeamsCount : self.allTeamsCount); } // Customize the appearance of table view cells. @@ -181,7 +181,7 @@ if (cell == nil) cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier1] autorelease]; - cell.textLabel.text = [[[listOfTeams objectAtIndex:[indexPath row]] objectForKey:@"team"] stringByDeletingPathExtension]; + cell.textLabel.text = [[[self.listOfAllTeams objectAtIndex:[indexPath row]] objectForKey:@"team"] stringByDeletingPathExtension]; cell.textLabel.backgroundColor = [UIColor clearColor]; NSString *teamPath = [NSString stringWithFormat:@"%@/%@.plist",TEAMS_DIRECTORY(),cell.textLabel.text]; @@ -199,25 +199,21 @@ cell.accessoryView = nil; } - cell.textLabel.textColor = UICOLOR_HW_YELLOW_TEXT; - cell.backgroundColor = UICOLOR_HW_ALMOSTBLACK; + cell.textLabel.textColor = [UIColor lightYellowColor]; + cell.backgroundColor = [UIColor blackColorTransparent]; cell.selectionStyle = UITableViewCellSelectionStyleNone; return cell; } -(CGFloat) tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section { - return 40.0; + return 45.0; } -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section { CGRect frame = CGRectMake(0, 0, self.view.frame.size.width * 80/100, 30); - NSString *text; - if (section == 0) - text = NSLocalizedString(@"Playing Teams",@""); - else - text = NSLocalizedString(@"Available Teams",@""); - UILabel *theLabel = createBlueLabel(text, frame); + NSString *text = (section == 0) ? NSLocalizedString(@"Playing Teams",@"") : NSLocalizedString(@"Available Teams",@""); + UILabel *theLabel = [[UILabel alloc] initWithFrame:frame andTitle:text]; theLabel.center = CGPointMake(self.view.frame.size.width/2, 20); UIView *theView = [[[UIView alloc] init] autorelease]; @@ -230,13 +226,13 @@ return IS_IPAD() ? 40 : 20; } --(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger) section { +-(UIView *)tableView:(UITableView *)aTableView viewForFooterInSection:(NSInteger) section { NSInteger height = IS_IPAD() ? 40 : 20; - UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, height)]; + UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width, height)]; footer.backgroundColor = [UIColor clearColor]; - UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width*80/100, height)]; - label.center = CGPointMake(self.tableView.frame.size.width/2, height/2); + UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, aTableView.frame.size.width*80/100, height)]; + label.center = CGPointMake(aTableView.frame.size.width/2, height/2); label.textAlignment = UITextAlignmentCenter; label.font = [UIFont italicSystemFontOfSize:12]; label.textColor = [UIColor whiteColor]; @@ -259,9 +255,9 @@ NSInteger row = [indexPath row]; NSInteger section = [indexPath section]; - if (section == 1 && [self.listOfTeams count] > row) { - [self.listOfSelectedTeams addObject:[self.listOfTeams objectAtIndex:row]]; - [self.listOfTeams removeObjectAtIndex:row]; + if (section == 1 && [self.listOfAllTeams count] > row) { + [self.listOfSelectedTeams addObject:[self.listOfAllTeams objectAtIndex:row]]; + [self.listOfAllTeams removeObjectAtIndex:row]; NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:selectedTeamsCount inSection:0]; allTeamsCount--; @@ -285,7 +281,7 @@ } } --(void) holdAction:(NSString *)content { +-(void) holdAction:(NSString *)content onTable:(UITableView *)aTableView { NSInteger row; for (row = 0; row < [self.listOfSelectedTeams count]; row++) { NSDictionary *dict = [self.listOfSelectedTeams objectAtIndex:row]; @@ -293,28 +289,33 @@ break; } - [self.listOfTeams addObject:[self.listOfSelectedTeams objectAtIndex:row]]; + [self.listOfAllTeams addObject:[self.listOfSelectedTeams objectAtIndex:row]]; [self.listOfSelectedTeams removeObjectAtIndex:row]; - [self.tableView beginUpdates]; - [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:row inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; - [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:allTeamsCount inSection:1]] withRowAnimation:UITableViewRowAnimationLeft]; - allTeamsCount++; - selectedTeamsCount--; - [self.tableView endUpdates]; + [aTableView beginUpdates]; + [aTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:row inSection:0]] withRowAnimation:UITableViewRowAnimationLeft]; + [aTableView insertRowsAtIndexPaths:[NSArray arrayWithObject:[NSIndexPath indexPathForRow:allTeamsCount inSection:1]] withRowAnimation:UITableViewRowAnimationLeft]; + self.allTeamsCount++; + self.selectedTeamsCount--; + [aTableView endUpdates]; } #pragma mark - #pragma mark Memory management -(void) didReceiveMemoryWarning { - // Relinquish ownership any cached data, images, etc that aren't in use. + if ([[HedgewarsAppDelegate sharedAppDelegate] isInGame]) { + self.listOfSelectedTeams = nil; + self.listOfAllTeams = nil; + self.tableView = nil; + } self.cachedContentsOfDir = nil; MSG_MEMCLEAN(); [super didReceiveMemoryWarning]; } -(void) viewDidUnload { - self.listOfTeams = nil; + self.tableView = nil; + self.listOfAllTeams = nil; self.listOfSelectedTeams = nil; self.cachedContentsOfDir = nil; MSG_DIDUNLOAD(); @@ -323,7 +324,8 @@ -(void) dealloc { - releaseAndNil(listOfTeams); + releaseAndNil(tableView); + releaseAndNil(listOfAllTeams); releaseAndNil(listOfSelectedTeams); releaseAndNil(cachedContentsOfDir); [super dealloc]; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/TeamSettingsViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -43,6 +43,8 @@ action:@selector(toggleEdit:)]; self.navigationItem.rightBarButtonItem = editButton; [editButton release]; + + self.navigationItem.title = @"List of teams"; } // load the list of teams in the teams directory @@ -82,7 +84,7 @@ -(void) addTeam:(id) sender { NSString *fileName = [[NSString alloc] initWithFormat:@"Default Team %u.plist", [self.listOfTeams count]]; - createTeamNamed([fileName stringByDeletingPathExtension]); + [CreationChamber createTeamNamed:[fileName stringByDeletingPathExtension]]; [self.listOfTeams addObject:fileName]; @@ -131,7 +133,7 @@ [teamFile release]; [self.listOfTeams removeObjectAtIndex:row]; - [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } @@ -150,6 +152,7 @@ [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; [self.navigationController pushViewController:childController animated:YES]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/UIImageExtra.h --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.h Sun Oct 16 21:03:30 2011 +0200 @@ -24,7 +24,8 @@ @interface UIImage (extra) -CGFloat getScreenScale(void); ++(UIImage *)whiteImage:(CGSize) ofSize; ++(CGSize) imageSizeFromMetadataOf:(NSString *)aFileName; -(UIImage *)scaleToSize:(CGSize) size; -(UIImage *)mergeWith:(UIImage *)secondImage atPoint:(CGPoint) secondImagePoint; @@ -34,6 +35,5 @@ -(UIImage *)convertToNegative; -(UIImage *)maskImageWith:(UIImage *)maskImage; -(UIImage *)makeRoundCornersOfSize:(CGSize) sizewh; -+(UIImage *)whiteImage:(CGSize) ofSize; @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/UIImageExtra.m --- a/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/UIImageExtra.m Sun Oct 16 21:03:30 2011 +0200 @@ -24,21 +24,11 @@ @implementation UIImage (extra) -CGFloat getScreenScale(void) { - float scale = 1.0f; - if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) - scale = [[UIScreen mainScreen] scale]; - return scale; -} - -(UIImage *)scaleToSize:(CGSize) size { DLog(@"warning - this is a very expensive operation, you should avoid using it"); // Create a bitmap graphics context; this will also set it as the current context - if (UIGraphicsBeginImageContextWithOptions != NULL) - UIGraphicsBeginImageContextWithOptions(size, NO, getScreenScale()); - else - UIGraphicsBeginImageContext(size); + UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]); // Draw the scaled image in the current context [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; @@ -58,18 +48,19 @@ DLog(@"Warning, secondImage == nil"); return self; } - CGFloat screenScale = getScreenScale(); + CGFloat screenScale = [[UIScreen mainScreen] scale]; int w = self.size.width * screenScale; int h = self.size.height * screenScale; - + int yOffset = self.size.height - secondImage.size.height + secondImagePoint.y; + if (w == 0 || h == 0) { - DLog(@"Can have 0 dimesions"); + DLog(@"Cannot have 0 dimesions"); return self; } // Create a bitmap graphics context; this will also set it as the current context CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); - CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); + CGContextRef context = CGBitmapContextCreate(NULL, w, h+yOffset, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst); // draw the two images in the current context CGContextDrawImage(context, CGRectMake(0, 0, self.size.width*screenScale, self.size.height*screenScale), [self CGImage]); @@ -79,11 +70,7 @@ CGImageRef imageRef = CGBitmapContextCreateImage(context); // Create a new UIImage object - UIImage *resultImage; - if ([self respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) - resultImage = [UIImage imageWithCGImage:imageRef scale:screenScale orientation:UIImageOrientationUp]; - else - resultImage = [UIImage imageWithCGImage:imageRef]; + UIImage *resultImage = [UIImage imageWithCGImage:imageRef scale:screenScale orientation:UIImageOrientationUp]; // Release colorspace, context and bitmap information CGColorSpaceRelease(colorSpace); @@ -203,7 +190,7 @@ -(UIImage *)makeRoundCornersOfSize:(CGSize) sizewh { CGFloat cornerWidth = sizewh.width; CGFloat cornerHeight = sizewh.height; - CGFloat screenScale = getScreenScale(); + CGFloat screenScale = [[UIScreen mainScreen] scale]; CGFloat w = self.size.width * screenScale; CGFloat h = self.size.height * screenScale; @@ -222,11 +209,7 @@ CGContextRelease(context); CGColorSpaceRelease(colorSpace); - UIImage *newImage; - if ([self respondsToSelector:@selector(imageWithCGImage:scale:orientation:)]) - newImage = [UIImage imageWithCGImage:imageMasked scale:screenScale orientation:UIImageOrientationUp]; - else - newImage = [UIImage imageWithCGImage:imageMasked]; + UIImage *newImage = [UIImage imageWithCGImage:imageMasked scale:screenScale orientation:UIImageOrientationUp]; CGImageRelease(imageMasked); @@ -268,4 +251,48 @@ return bkgImg; } +// this routine checks for the PNG size without loading it in memory +// https://github.com/steipete/PSFramework/blob/master/PSFramework%20Version%200.3/PhotoshopFramework/PSMetaDataFunctions.m ++(CGSize) imageSizeFromMetadataOf:(NSString *)aFileName { + // File Name to C String. + const char *fileName = [aFileName UTF8String]; + // source file + FILE *infile = fopen(fileName, "rb"); + if (infile == NULL) { + DLog(@"Can't open the file: %@", aFileName); + return CGSizeZero; + } + + // Bytes Buffer. + unsigned char buffer[30]; + // Grab Only First Bytes. + fread(buffer, 1, 30, infile); + // Close File. + fclose(infile); + + // PNG Signature. + unsigned char png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10}; + + // Compare File signature. + if ((int)(memcmp(&buffer[0], &png_signature[0], 8))) { + DLog(@"The file (%@) is not a PNG file", aFileName); + return CGSizeZero; + } + + // Calc Sizes. Isolate only four bytes of each size (width, height). + int width[4]; + int height[4]; + for (int d = 16; d < (16 + 4); d++) { + width[d-16] = buffer[d]; + height[d-16] = buffer[d+4]; + } + + // Convert bytes to Long (Integer) + long resultWidth = (width[0] << (int)24) | (width[1] << (int)16) | (width[2] << (int)8) | width[3]; + long resultHeight = (height[0] << (int)24) | (height[1] << (int)16) | (height[2] << (int)8) | height[3]; + + // Return Size. + return CGSizeMake(resultWidth,resultHeight); +} + @end diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/VoicesViewController.m --- a/project_files/HedgewarsMobile/Classes/VoicesViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/VoicesViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "VoicesViewController.h" -#import "CommodityFunctions.h" + @implementation VoicesViewController @synthesize teamDictionary, voiceArray, lastIndexPath; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/WeaponCellView.m --- a/project_files/HedgewarsMobile/Classes/WeaponCellView.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/WeaponCellView.m Sun Oct 16 21:03:30 2011 +0200 @@ -20,7 +20,7 @@ #import "WeaponCellView.h" -#import "CommodityFunctions.h" + @implementation WeaponCellView @synthesize delegate, weaponName, weaponIcon, initialSli, probabilitySli, delaySli, crateSli, helpLabel, @@ -102,9 +102,9 @@ helpLabel = [[UILabel alloc] init]; helpLabel.backgroundColor = [UIColor clearColor]; - helpLabel.textColor = [UIColor grayColor]; + helpLabel.textColor = [UIColor darkGrayColor]; helpLabel.textAlignment = UITextAlignmentRight; - helpLabel.font = [UIFont italicSystemFontOfSize:[UIFont smallSystemFontSize]]; + helpLabel.font = [UIFont italicSystemFontOfSize:[UIFont systemFontSize]]; [self.contentView addSubview:weaponName]; [self.contentView addSubview:weaponIcon]; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m --- a/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Classes/WeaponSettingsViewController.m Sun Oct 16 21:03:30 2011 +0200 @@ -42,6 +42,7 @@ self.navigationItem.rightBarButtonItem = editButton; [editButton release]; + self.navigationItem.title = @"List of weapons"; } -(void) viewWillAppear:(BOOL) animated { @@ -79,7 +80,7 @@ -(void) addWeapon:(id) sender { NSString *fileName = [[NSString alloc] initWithFormat:@"Weapon %u.plist", [self.listOfWeapons count]]; - createWeaponNamed([fileName stringByDeletingPathExtension], 0); + [CreationChamber createWeaponNamed:[fileName stringByDeletingPathExtension]]; [self.listOfWeapons addObject:fileName]; @@ -127,7 +128,7 @@ [schemeFile release]; [self.listOfWeapons removeObjectAtIndex:row]; - [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; + [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; } #pragma mark - @@ -145,6 +146,7 @@ [childController.tableView setContentOffset:CGPointMake(0,0) animated:NO]; [self.navigationController pushViewController:childController animated:YES]; + [tableView deselectRowAtIndexPath:indexPath animated:YES]; } diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj --- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Sun Oct 16 21:03:30 2011 +0200 @@ -26,6 +26,11 @@ 28FD15000DC6FC520079059D /* OpenGLES.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD14FF0DC6FC520079059D /* OpenGLES.framework */; }; 28FD15080DC6FC5B0079059D /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 28FD15070DC6FC5B0079059D /* QuartzCore.framework */; settings = {ATTRIBUTES = (Required, ); }; }; 61006F95128DE31F00EBA7F7 /* CreationChamber.m in Sources */ = {isa = PBXBuildFile; fileRef = 61006F94128DE31F00EBA7F7 /* CreationChamber.m */; }; + 61077E87143FB09800645B29 /* MissionTrainingViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61077E86143FB09800645B29 /* MissionTrainingViewController-iPad.xib */; }; + 6107802A143FCCC800645B29 /* startGameButton@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61078029143FCCC800645B29 /* startGameButton@2x.png */; }; + 610782961440EE5C00645B29 /* basicFlags.plist in Resources */ = {isa = PBXBuildFile; fileRef = 610782931440EE5C00645B29 /* basicFlags.plist */; }; + 610782971440EE5C00645B29 /* credits.plist in Resources */ = {isa = PBXBuildFile; fileRef = 610782941440EE5C00645B29 /* credits.plist */; }; + 610782981440EE5C00645B29 /* gameMods.plist in Resources */ = {isa = PBXBuildFile; fileRef = 610782951440EE5C00645B29 /* gameMods.plist */; }; 610D5FB21270E2660033333A /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61F7A43411E290650040BA66 /* Icon-Small@2x.png */; }; 610D5FB31270E26C0033333A /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61F7A43611E290650040BA66 /* Icon@2x.png */; }; 61188BF212A6FE530026C5DA /* ammoButton@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 6103D399129B350700911D8D /* ammoButton@2x.png */; }; @@ -73,7 +78,7 @@ 61370653117B1D50004EE44A /* Entitlements-Distribution.plist in Resources */ = {isa = PBXBuildFile; fileRef = 61370652117B1D50004EE44A /* Entitlements-Distribution.plist */; }; 61399013125D19C0003C2DC0 /* uMobile.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61399012125D19C0003C2DC0 /* uMobile.pas */; }; 6147DAD31253DCDE0010357E /* savesButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 6147DAD21253DCDE0010357E /* savesButton.png */; }; - 61536DF411CEAE7100D87A7E /* GameConfigViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6165924A11CA9CB400D6E256 /* GameConfigViewController.xib */; }; + 61536DF411CEAE7100D87A7E /* GameConfigViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6165924A11CA9CB400D6E256 /* GameConfigViewController-iPhone.xib */; }; 615AD96212073B4D00F2FF04 /* startGameButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 615AD96112073B4D00F2FF04 /* startGameButton.png */; }; 615AD9E9120764CA00F2FF04 /* backButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 615AD9E8120764CA00F2FF04 /* backButton.png */; }; 615AD9EB1207654E00F2FF04 /* helpButton.png in Resources */ = {isa = PBXBuildFile; fileRef = 615AD9EA1207654E00F2FF04 /* helpButton.png */; }; @@ -90,20 +95,20 @@ 6165921411CA9BA200D6E256 /* LevelViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591EF11CA9BA200D6E256 /* LevelViewController.m */; }; 6165921511CA9BA200D6E256 /* MainMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591F111CA9BA200D6E256 /* MainMenuViewController.m */; }; 6165921611CA9BA200D6E256 /* MapConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591F311CA9BA200D6E256 /* MapConfigViewController.m */; }; - 6165921711CA9BA200D6E256 /* MasterViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591F511CA9BA200D6E256 /* MasterViewController.m */; }; + 6165921711CA9BA200D6E256 /* SettingsBaseViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591F511CA9BA200D6E256 /* SettingsBaseViewController.m */; }; 6165921811CA9BA200D6E256 /* OverlayViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591F711CA9BA200D6E256 /* OverlayViewController.m */; }; 6165921911CA9BA200D6E256 /* InGameMenuViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591F911CA9BA200D6E256 /* InGameMenuViewController.m */; }; 6165921A11CA9BA200D6E256 /* SchemeSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591FB11CA9BA200D6E256 /* SchemeSettingsViewController.m */; }; 6165921B11CA9BA200D6E256 /* SchemeWeaponConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591FD11CA9BA200D6E256 /* SchemeWeaponConfigViewController.m */; }; 6165921C11CA9BA200D6E256 /* SingleSchemeViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 616591FF11CA9BA200D6E256 /* SingleSchemeViewController.m */; }; 6165921D11CA9BA200D6E256 /* SingleTeamViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920111CA9BA200D6E256 /* SingleTeamViewController.m */; }; - 6165921E11CA9BA200D6E256 /* SplitViewRootController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920311CA9BA200D6E256 /* SplitViewRootController.m */; }; + 6165921E11CA9BA200D6E256 /* SettingsContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */; }; 6165921F11CA9BA200D6E256 /* TeamConfigViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920511CA9BA200D6E256 /* TeamConfigViewController.m */; }; 6165922011CA9BA200D6E256 /* TeamSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920711CA9BA200D6E256 /* TeamSettingsViewController.m */; }; 6165922111CA9BA200D6E256 /* VoicesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920911CA9BA200D6E256 /* VoicesViewController.m */; }; 6165922211CA9BA200D6E256 /* WeaponSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165920B11CA9BA200D6E256 /* WeaponSettingsViewController.m */; }; 6165922E11CA9BD500D6E256 /* CGPointUtils.c in Sources */ = {isa = PBXBuildFile; fileRef = 6165922311CA9BD500D6E256 /* CGPointUtils.c */; }; - 6165922F11CA9BD500D6E256 /* CommodityFunctions.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165922611CA9BD500D6E256 /* CommodityFunctions.m */; }; + 6165922F11CA9BD500D6E256 /* HWUtils.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165922611CA9BD500D6E256 /* HWUtils.m */; }; 6165923111CA9BD500D6E256 /* SquareButtonView.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165922B11CA9BD500D6E256 /* SquareButtonView.m */; }; 6165923211CA9BD500D6E256 /* UIImageExtra.m in Sources */ = {isa = PBXBuildFile; fileRef = 6165922D11CA9BD500D6E256 /* UIImageExtra.m */; }; 6165925311CA9CB400D6E256 /* MainMenuViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 6165924B11CA9CB400D6E256 /* MainMenuViewController-iPad.xib */; }; @@ -177,8 +182,9 @@ 61842B24122B619D0096E335 /* HelpPageInGameViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61842B23122B619D0096E335 /* HelpPageInGameViewController-iPad.xib */; }; 61842B3E122B65BD0096E335 /* helpabove.png in Resources */ = {isa = PBXBuildFile; fileRef = 61842B3D122B65BD0096E335 /* helpabove.png */; }; 61842B40122B66280096E335 /* helpleft.png in Resources */ = {isa = PBXBuildFile; fileRef = 61842B3F122B66280096E335 /* helpleft.png */; }; - 6187AEBD120781B900B31A27 /* Settings in Resources */ = {isa = PBXBuildFile; fileRef = 6187AEA5120781B900B31A27 /* Settings */; }; 61889985129995B500D55FD6 /* title~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = 61889984129995B500D55FD6 /* title~ipad.png */; }; + 61915D5B143A4E2C00299991 /* MissionTrainingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61915D59143A4E2C00299991 /* MissionTrainingViewController.m */; }; + 61915D5C143A4E2C00299991 /* MissionTrainingViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61915D5A143A4E2C00299991 /* MissionTrainingViewController-iPhone.xib */; }; 6195981F1364BCEF00B429B6 /* libTremor.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6195981D1364BCD200B429B6 /* libTremor.a */; }; 619599451364C83D00B429B6 /* libLua.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 619599441364C82B00B429B6 /* libLua.a */; }; 619599C01364E66B00B429B6 /* libFreetype.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 619599BF1364E65900B429B6 /* libFreetype.a */; }; @@ -213,7 +219,9 @@ 61B7A61712FA13B00051E14E /* libSDL_mixer.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7A56012FA12BF0051E14E /* libSDL_mixer.a */; }; 61B7A61812FA13B00051E14E /* libSDL_net.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7A56812FA12D00051E14E /* libSDL_net.a */; }; 61B7A61912FA13B00051E14E /* libSDL_ttf.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 61B7A59012FA13330051E14E /* libSDL_ttf.a */; }; + 61B9A86814423A9D001541C1 /* GameConfigViewController-iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61B9A86714423A9D001541C1 /* GameConfigViewController-iPad.xib */; }; 61C079E411F35A300072BF46 /* EditableCellView.m in Sources */ = {isa = PBXBuildFile; fileRef = 61C079E311F35A300072BF46 /* EditableCellView.m */; }; + 61C28D3F142D380400DA16C2 /* AudioManagerController.m in Sources */ = {isa = PBXBuildFile; fileRef = 61C28D3E142D380400DA16C2 /* AudioManagerController.m */; }; 61CADE331402EE290030C3EB /* ImageIO.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 61CADE321402EE290030C3EB /* ImageIO.framework */; }; 61D205A1127CDD1100ABD83E /* ObjcExports.m in Sources */ = {isa = PBXBuildFile; fileRef = 61D205A0127CDD1100ABD83E /* ObjcExports.m */; }; 61D3D2A51290E03A003CE7C3 /* irc.png in Resources */ = {isa = PBXBuildFile; fileRef = 61D3D2A41290E03A003CE7C3 /* irc.png */; }; @@ -356,9 +364,14 @@ 6103D39C129B350700911D8D /* arrowRight@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "arrowRight@2x.png"; path = "Resources/Overlay/arrowRight@2x.png"; sourceTree = ""; }; 6103D39D129B350700911D8D /* arrowUp@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "arrowUp@2x.png"; path = "Resources/Overlay/arrowUp@2x.png"; sourceTree = ""; }; 6103D39E129B350700911D8D /* cornerButton@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "cornerButton@2x.png"; path = "Resources/Overlay/cornerButton@2x.png"; sourceTree = ""; }; + 61077E86143FB09800645B29 /* MissionTrainingViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MissionTrainingViewController-iPad.xib"; sourceTree = ""; }; + 61078029143FCCC800645B29 /* startGameButton@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "startGameButton@2x.png"; path = "Resources/Frontend/startGameButton@2x.png"; sourceTree = ""; }; + 610782931440EE5C00645B29 /* basicFlags.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = basicFlags.plist; path = Resources/basicFlags.plist; sourceTree = ""; }; + 610782941440EE5C00645B29 /* credits.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = credits.plist; path = Resources/credits.plist; sourceTree = ""; }; + 610782951440EE5C00645B29 /* gameMods.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = gameMods.plist; path = Resources/gameMods.plist; sourceTree = ""; }; 611D9BF812497E9800008271 /* SavedGamesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SavedGamesViewController.h; sourceTree = ""; }; 611D9BF912497E9800008271 /* SavedGamesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SavedGamesViewController.m; sourceTree = ""; }; - 611D9BFA12497E9800008271 /* SavedGamesViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = SavedGamesViewController.xib; path = ../Resources/SavedGamesViewController.xib; sourceTree = ""; }; + 611D9BFA12497E9800008271 /* SavedGamesViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SavedGamesViewController.xib; sourceTree = ""; }; 611E0EE511FB20610077A41E /* ammoButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = ammoButton.png; path = Resources/Overlay/ammoButton.png; sourceTree = ""; }; 611E0EE611FB20610077A41E /* cornerButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = cornerButton.png; path = Resources/Overlay/cornerButton.png; sourceTree = ""; }; 611E12FE117BBBDA0044B62F /* Entitlements-Development.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "Entitlements-Development.plist"; sourceTree = ""; }; @@ -367,7 +380,7 @@ 611EE9D8122AA10A00DF6938 /* selSound.wav */ = {isa = PBXFileReference; lastKnownFileType = audio.wav; name = selSound.wav; path = Resources/selSound.wav; sourceTree = ""; }; 611EEAEB122B2A4D00DF6938 /* HelpPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpPageViewController.h; sourceTree = ""; }; 611EEAEC122B2A4D00DF6938 /* HelpPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = HelpPageViewController.m; sourceTree = ""; }; - 611EEAED122B2A4D00DF6938 /* HelpPageLobbyViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "HelpPageLobbyViewController-iPad.xib"; path = "../Resources/HelpPageLobbyViewController-iPad.xib"; sourceTree = ""; }; + 611EEAED122B2A4D00DF6938 /* HelpPageLobbyViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "HelpPageLobbyViewController-iPad.xib"; sourceTree = ""; }; 611EEBC0122B34A800DF6938 /* helpingame.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = helpingame.png; path = Resources/Overlay/helpingame.png; sourceTree = ""; }; 611EEBC2122B355700DF6938 /* helpbottom.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = helpbottom.png; path = Resources/Overlay/helpbottom.png; sourceTree = ""; }; 611EEBC3122B355700DF6938 /* helpright.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = helpright.png; path = Resources/Overlay/helpright.png; sourceTree = ""; }; @@ -382,7 +395,6 @@ 61399012125D19C0003C2DC0 /* uMobile.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uMobile.pas; path = ../../hedgewars/uMobile.pas; sourceTree = SOURCE_ROOT; }; 6147DAD21253DCDE0010357E /* savesButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = savesButton.png; path = Resources/Frontend/savesButton.png; sourceTree = ""; }; 614E333D11DE9A93009DBA4E /* VGSHandlers.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = VGSHandlers.inc; path = ../../hedgewars/VGSHandlers.inc; sourceTree = SOURCE_ROOT; }; - 61589C5A144B4322007BFAA4 /* config.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = config.inc; sourceTree = ""; }; 615AD96112073B4D00F2FF04 /* startGameButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = startGameButton.png; path = Resources/Frontend/startGameButton.png; sourceTree = ""; }; 615AD9E8120764CA00F2FF04 /* backButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = backButton.png; path = Resources/Frontend/backButton.png; sourceTree = ""; }; 615AD9EA1207654E00F2FF04 /* helpButton.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = helpButton.png; path = Resources/Frontend/helpButton.png; sourceTree = ""; }; @@ -392,6 +404,7 @@ 615FEAE012A2A6640098EE92 /* localplayButton~iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "localplayButton~iphone.png"; path = "Resources/Frontend/localplayButton~iphone.png"; sourceTree = ""; }; 6163EE7C11CC2600001C0453 /* SingleWeaponViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SingleWeaponViewController.h; sourceTree = ""; }; 6163EE7D11CC2600001C0453 /* SingleWeaponViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleWeaponViewController.m; sourceTree = ""; }; + 61641FE31437CDAA006E049C /* DefinesAndMacros.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DefinesAndMacros.h; path = Classes/DefinesAndMacros.h; sourceTree = ""; }; 616591E011CA9BA200D6E256 /* FlagsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FlagsViewController.h; sourceTree = ""; }; 616591E111CA9BA200D6E256 /* FlagsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FlagsViewController.m; sourceTree = ""; }; 616591E211CA9BA200D6E256 /* FortsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FortsViewController.h; sourceTree = ""; }; @@ -412,8 +425,8 @@ 616591F111CA9BA200D6E256 /* MainMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MainMenuViewController.m; sourceTree = ""; }; 616591F211CA9BA200D6E256 /* MapConfigViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MapConfigViewController.h; sourceTree = ""; }; 616591F311CA9BA200D6E256 /* MapConfigViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MapConfigViewController.m; sourceTree = ""; }; - 616591F411CA9BA200D6E256 /* MasterViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MasterViewController.h; sourceTree = ""; }; - 616591F511CA9BA200D6E256 /* MasterViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MasterViewController.m; sourceTree = ""; }; + 616591F411CA9BA200D6E256 /* SettingsBaseViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsBaseViewController.h; sourceTree = ""; }; + 616591F511CA9BA200D6E256 /* SettingsBaseViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsBaseViewController.m; sourceTree = ""; }; 616591F611CA9BA200D6E256 /* OverlayViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OverlayViewController.h; sourceTree = ""; }; 616591F711CA9BA200D6E256 /* OverlayViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = OverlayViewController.m; sourceTree = ""; }; 616591F811CA9BA200D6E256 /* InGameMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = InGameMenuViewController.h; sourceTree = ""; }; @@ -426,8 +439,8 @@ 616591FF11CA9BA200D6E256 /* SingleSchemeViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleSchemeViewController.m; sourceTree = ""; }; 6165920011CA9BA200D6E256 /* SingleTeamViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SingleTeamViewController.h; sourceTree = ""; }; 6165920111CA9BA200D6E256 /* SingleTeamViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SingleTeamViewController.m; sourceTree = ""; }; - 6165920211CA9BA200D6E256 /* SplitViewRootController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplitViewRootController.h; sourceTree = ""; }; - 6165920311CA9BA200D6E256 /* SplitViewRootController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SplitViewRootController.m; sourceTree = ""; }; + 6165920211CA9BA200D6E256 /* SettingsContainerViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SettingsContainerViewController.h; sourceTree = ""; }; + 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SettingsContainerViewController.m; sourceTree = ""; }; 6165920411CA9BA200D6E256 /* TeamConfigViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamConfigViewController.h; sourceTree = ""; }; 6165920511CA9BA200D6E256 /* TeamConfigViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TeamConfigViewController.m; sourceTree = ""; }; 6165920611CA9BA200D6E256 /* TeamSettingsViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TeamSettingsViewController.h; sourceTree = ""; }; @@ -438,25 +451,25 @@ 6165920B11CA9BA200D6E256 /* WeaponSettingsViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = WeaponSettingsViewController.m; sourceTree = ""; }; 6165922311CA9BD500D6E256 /* CGPointUtils.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = CGPointUtils.c; path = Classes/CGPointUtils.c; sourceTree = ""; }; 6165922411CA9BD500D6E256 /* CGPointUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CGPointUtils.h; path = Classes/CGPointUtils.h; sourceTree = ""; }; - 6165922511CA9BD500D6E256 /* CommodityFunctions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = CommodityFunctions.h; path = Classes/CommodityFunctions.h; sourceTree = ""; }; - 6165922611CA9BD500D6E256 /* CommodityFunctions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = CommodityFunctions.m; path = Classes/CommodityFunctions.m; sourceTree = ""; }; + 6165922511CA9BD500D6E256 /* HWUtils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HWUtils.h; path = Classes/HWUtils.h; sourceTree = ""; }; + 6165922611CA9BD500D6E256 /* HWUtils.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HWUtils.m; path = Classes/HWUtils.m; sourceTree = ""; }; 6165922911CA9BD500D6E256 /* PascalImports.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PascalImports.h; path = Classes/PascalImports.h; sourceTree = ""; }; 6165922A11CA9BD500D6E256 /* SquareButtonView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = SquareButtonView.h; path = Classes/SquareButtonView.h; sourceTree = ""; }; 6165922B11CA9BD500D6E256 /* SquareButtonView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = SquareButtonView.m; path = Classes/SquareButtonView.m; sourceTree = ""; }; 6165922C11CA9BD500D6E256 /* UIImageExtra.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = UIImageExtra.h; path = Classes/UIImageExtra.h; sourceTree = ""; }; 6165922D11CA9BD500D6E256 /* UIImageExtra.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = UIImageExtra.m; path = Classes/UIImageExtra.m; sourceTree = ""; }; - 6165924A11CA9CB400D6E256 /* GameConfigViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = GameConfigViewController.xib; path = Resources/GameConfigViewController.xib; sourceTree = SOURCE_ROOT; }; - 6165924B11CA9CB400D6E256 /* MainMenuViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainMenuViewController-iPad.xib"; path = "Resources/MainMenuViewController-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 6165924C11CA9CB400D6E256 /* MainMenuViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MainMenuViewController-iPhone.xib"; path = "Resources/MainMenuViewController-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 6165924D11CA9CB400D6E256 /* MapConfigViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MapConfigViewController-iPad.xib"; path = "Resources/MapConfigViewController-iPad.xib"; sourceTree = SOURCE_ROOT; }; - 6165924E11CA9CB400D6E256 /* MapConfigViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "MapConfigViewController-iPhone.xib"; path = "Resources/MapConfigViewController-iPhone.xib"; sourceTree = SOURCE_ROOT; }; - 6165925011CA9CB400D6E256 /* OverlayViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = OverlayViewController.xib; path = Resources/OverlayViewController.xib; sourceTree = SOURCE_ROOT; }; + 6165924A11CA9CB400D6E256 /* GameConfigViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "GameConfigViewController-iPhone.xib"; sourceTree = ""; }; + 6165924B11CA9CB400D6E256 /* MainMenuViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MainMenuViewController-iPad.xib"; sourceTree = ""; }; + 6165924C11CA9CB400D6E256 /* MainMenuViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MainMenuViewController-iPhone.xib"; sourceTree = ""; }; + 6165924D11CA9CB400D6E256 /* MapConfigViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MapConfigViewController-iPad.xib"; sourceTree = ""; }; + 6165924E11CA9CB400D6E256 /* MapConfigViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MapConfigViewController-iPhone.xib"; sourceTree = ""; }; + 6165925011CA9CB400D6E256 /* OverlayViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = OverlayViewController.xib; sourceTree = ""; }; 6165929C11CA9E2F00D6E256 /* HedgewarsAppDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HedgewarsAppDelegate.h; path = Classes/HedgewarsAppDelegate.h; sourceTree = ""; }; 6165929D11CA9E2F00D6E256 /* HedgewarsAppDelegate.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HedgewarsAppDelegate.m; path = Classes/HedgewarsAppDelegate.m; sourceTree = ""; }; 6167A6731391514600AA6D07 /* RestoreViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RestoreViewController.h; sourceTree = ""; }; 6167A6741391514600AA6D07 /* RestoreViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RestoreViewController.m; sourceTree = ""; }; - 6167A6751391514600AA6D07 /* RestoreViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "RestoreViewController-iPhone.xib"; path = "../Resources/RestoreViewController-iPhone.xib"; sourceTree = ""; }; - 6167A72C13919E6800AA6D07 /* RestoreViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "RestoreViewController-iPad.xib"; path = "../Resources/RestoreViewController-iPad.xib"; sourceTree = ""; }; + 6167A6751391514600AA6D07 /* RestoreViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "RestoreViewController-iPhone.xib"; sourceTree = ""; }; + 6167A72C13919E6800AA6D07 /* RestoreViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "RestoreViewController-iPad.xib"; sourceTree = ""; }; 6167C87314294727003DD50F /* surprise@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "surprise@2x.png"; path = "Resources/surprise@2x.png"; sourceTree = ""; }; 6167C88B14294738003DD50F /* denied@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "denied@2x.png"; path = "Resources/denied@2x.png"; sourceTree = ""; }; 6167C8EF1429502C003DD50F /* hedgehog.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = hedgehog.png; path = Resources/Icons/hedgehog.png; sourceTree = ""; }; @@ -526,6 +539,7 @@ 6179880C114AA34C00BA94A9 /* uTeams.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uTeams.pas; path = ../../hedgewars/uTeams.pas; sourceTree = SOURCE_ROOT; }; 6179880E114AA34C00BA94A9 /* uVisualGears.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uVisualGears.pas; path = ../../hedgewars/uVisualGears.pas; sourceTree = SOURCE_ROOT; }; 6179880F114AA34C00BA94A9 /* uWorld.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uWorld.pas; path = ../../hedgewars/uWorld.pas; sourceTree = SOURCE_ROOT; }; + 61589C5A144B4322007BFAA4 /* config.inc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; path = config.inc; sourceTree = ""; }; 617988D3114AAA3900BA94A9 /* SDLiPhoneOS.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SDLiPhoneOS.xcodeproj; path = "../../../Library/SDL/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj"; sourceTree = SOURCE_ROOT; }; 61798934114AB25F00BA94A9 /* AudioToolbox.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; 6179898B114AB3FA00BA94A9 /* SDL_mixer.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SDL_mixer.xcodeproj; path = "../../../Library/SDL_mixer/Xcode-iPhoneOS/SDL_mixer.xcodeproj"; sourceTree = SOURCE_ROOT; }; @@ -533,13 +547,15 @@ 61798A5E114AE08600BA94A9 /* Data */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Data; path = ../../../trunk/project_files/HedgewarsMobile/Data; sourceTree = ""; }; 6183D83C11E2BCE200A88903 /* Default-ipad-Landscape.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "Default-ipad-Landscape.png"; path = "Resources/Icons/Default-ipad-Landscape.png"; sourceTree = ""; }; 6183D83D11E2BCE200A88903 /* Default.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = Default.png; path = Resources/Icons/Default.png; sourceTree = ""; }; - 61842B23122B619D0096E335 /* HelpPageInGameViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "HelpPageInGameViewController-iPad.xib"; path = "../Resources/HelpPageInGameViewController-iPad.xib"; sourceTree = ""; }; + 61842B23122B619D0096E335 /* HelpPageInGameViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "HelpPageInGameViewController-iPad.xib"; sourceTree = ""; }; 61842B3D122B65BD0096E335 /* helpabove.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = helpabove.png; path = Resources/Overlay/helpabove.png; sourceTree = ""; }; 61842B3F122B66280096E335 /* helpleft.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = helpleft.png; path = Resources/Overlay/helpleft.png; sourceTree = ""; }; - 6187AEA5120781B900B31A27 /* Settings */ = {isa = PBXFileReference; lastKnownFileType = folder; name = Settings; path = Resources/Settings; sourceTree = ""; }; 618899811299516000D55FD6 /* title@2x~iphone.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "title@2x~iphone.png"; path = "Resources/Frontend/title@2x~iphone.png"; sourceTree = ""; }; 61889984129995B500D55FD6 /* title~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "title~ipad.png"; path = "Resources/Frontend/title~ipad.png"; sourceTree = ""; }; 618E27B612A2C30700C20EF0 /* SDL_net.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = SDL_net.xcodeproj; path = "../../../Library/SDL_net/Xcode-iPhoneOS/SDL_net.xcodeproj"; sourceTree = SOURCE_ROOT; }; + 61915D58143A4E2C00299991 /* MissionTrainingViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MissionTrainingViewController.h; sourceTree = ""; }; + 61915D59143A4E2C00299991 /* MissionTrainingViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MissionTrainingViewController.m; sourceTree = ""; }; + 61915D5A143A4E2C00299991 /* MissionTrainingViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "MissionTrainingViewController-iPhone.xib"; sourceTree = ""; }; 619598181364BCD200B429B6 /* Tremor.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Tremor.xcodeproj; path = ../../misc/libtremor/Xcode/Tremor.xcodeproj; sourceTree = SOURCE_ROOT; }; 6195993F1364C82B00B429B6 /* Lua.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Lua.xcodeproj; path = ../../misc/liblua/Xcode/Lua.xcodeproj; sourceTree = SOURCE_ROOT; }; 619599BA1364E65900B429B6 /* Freetype.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Freetype.xcodeproj; path = "../../misc/libfreetype/Xcode-iPhoneOS/Freetype.xcodeproj"; sourceTree = SOURCE_ROOT; }; @@ -570,16 +586,19 @@ 61AC067312B2E32D000B52A2 /* Appirater.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Appirater.m; path = Classes/Appirater.m; sourceTree = ""; }; 61B7A33612CC21080086B604 /* StatsPageViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StatsPageViewController.h; sourceTree = ""; }; 61B7A33712CC21080086B604 /* StatsPageViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = StatsPageViewController.m; sourceTree = ""; }; + 61B9A86714423A9D001541C1 /* GameConfigViewController-iPad.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "GameConfigViewController-iPad.xib"; path = "Classes/GameConfigViewController-iPad.xib"; sourceTree = ""; }; 61C079E211F35A300072BF46 /* EditableCellView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = EditableCellView.h; path = Classes/EditableCellView.h; sourceTree = ""; }; 61C079E311F35A300072BF46 /* EditableCellView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = EditableCellView.m; path = Classes/EditableCellView.m; sourceTree = ""; }; + 61C28D3D142D380400DA16C2 /* AudioManagerController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = AudioManagerController.h; path = Classes/AudioManagerController.h; sourceTree = ""; }; + 61C28D3E142D380400DA16C2 /* AudioManagerController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = AudioManagerController.m; path = Classes/AudioManagerController.m; sourceTree = ""; }; 61CADE321402EE290030C3EB /* ImageIO.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ImageIO.framework; path = System/Library/Frameworks/ImageIO.framework; sourceTree = SDKROOT; }; 61D2059F127CDD1100ABD83E /* ObjcExports.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = ObjcExports.h; path = Classes/ObjcExports.h; sourceTree = ""; }; 61D205A0127CDD1100ABD83E /* ObjcExports.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = ObjcExports.m; path = Classes/ObjcExports.m; sourceTree = ""; }; 61D3D2A41290E03A003CE7C3 /* irc.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = irc.png; path = Resources/Icons/irc.png; sourceTree = ""; }; 61DE8F201257EB1100B80214 /* AmmoMenuViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AmmoMenuViewController.h; sourceTree = ""; }; 61DE8F211257EB1100B80214 /* AmmoMenuViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AmmoMenuViewController.m; sourceTree = ""; }; - 61DF0EDB1284DF2300F3F10B /* HelpPageLobbyViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "HelpPageLobbyViewController-iPhone.xib"; path = "../Resources/HelpPageLobbyViewController-iPhone.xib"; sourceTree = ""; }; - 61DF0F201284F72A00F3F10B /* HelpPageInGameViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "HelpPageInGameViewController-iPhone.xib"; path = "Resources/HelpPageInGameViewController-iPhone.xib"; sourceTree = SOURCE_ROOT; }; + 61DF0EDB1284DF2300F3F10B /* HelpPageLobbyViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "HelpPageLobbyViewController-iPhone.xib"; sourceTree = ""; }; + 61DF0F201284F72A00F3F10B /* HelpPageInGameViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = "HelpPageInGameViewController-iPhone.xib"; sourceTree = ""; }; 61E1F4F711D004240016A5AA /* adler32.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = adler32.pas; path = ../../hedgewars/adler32.pas; sourceTree = SOURCE_ROOT; }; 61E2E12C12BAAEE30051B659 /* ServerSetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerSetup.h; sourceTree = ""; }; 61E2E12D12BAAEE30051B659 /* ServerSetup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ServerSetup.m; sourceTree = ""; }; @@ -598,7 +617,7 @@ 61EF920B11DF57AC003441C4 /* joyButtonForwardJump.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = joyButtonForwardJump.png; path = Resources/Overlay/joyButtonForwardJump.png; sourceTree = ""; }; 61F2E7CB1205EDE0005734F7 /* AboutViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AboutViewController.h; sourceTree = ""; }; 61F2E7CC1205EDE0005734F7 /* AboutViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AboutViewController.m; sourceTree = ""; }; - 61F2E7CD1205EDE0005734F7 /* AboutViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = AboutViewController.xib; path = ../Resources/AboutViewController.xib; sourceTree = ""; }; + 61F2E7CD1205EDE0005734F7 /* AboutViewController.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = AboutViewController.xib; sourceTree = ""; }; 61F2E7EB12060E31005734F7 /* checkbox.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = checkbox.png; path = Resources/Icons/checkbox.png; sourceTree = ""; }; 61F544C512AF1748007FD913 /* HoldTableViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = HoldTableViewCell.h; path = Classes/HoldTableViewCell.h; sourceTree = ""; }; 61F544C612AF1748007FD913 /* HoldTableViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = HoldTableViewCell.m; path = Classes/HoldTableViewCell.m; sourceTree = ""; }; @@ -658,8 +677,8 @@ 6163EE6C11CC253F001C0453 /* Overlay */, 616591F011CA9BA200D6E256 /* MainMenuViewController.h */, 616591F111CA9BA200D6E256 /* MainMenuViewController.m */, + 6165924C11CA9CB400D6E256 /* MainMenuViewController-iPhone.xib */, 6165924B11CA9CB400D6E256 /* MainMenuViewController-iPad.xib */, - 6165924C11CA9CB400D6E256 /* MainMenuViewController-iPhone.xib */, 61EDB5AE135B3F97009B29A6 /* GameInterfaceBridge.h */, 61EDB5AF135B3F97009B29A6 /* GameInterfaceBridge.m */, 616591E611CA9BA200D6E256 /* EngineProtocolNetwork.h */, @@ -690,6 +709,7 @@ 19C28FACFE9D520D11CA2CBB /* Products */, 61370652117B1D50004EE44A /* Entitlements-Distribution.plist */, 611E12FE117BBBDA0044B62F /* Entitlements-Development.plist */, + 61B9A86714423A9D001541C1 /* GameConfigViewController-iPad.xib */, ); name = CustomTemplate; sourceTree = ""; @@ -697,18 +717,18 @@ 29B97315FDCFA39411CA2CEA /* Other Sources */ = { isa = PBXGroup; children = ( + 61641FE21437CD8F006E049C /* Headers */, 61DE91561258B76800B80214 /* Custom UIs */, 61AC067212B2E32D000B52A2 /* Appirater.h */, 61AC067312B2E32D000B52A2 /* Appirater.m */, + 61C28D3D142D380400DA16C2 /* AudioManagerController.h */, + 61C28D3E142D380400DA16C2 /* AudioManagerController.m */, 6165929C11CA9E2F00D6E256 /* HedgewarsAppDelegate.h */, 6165929D11CA9E2F00D6E256 /* HedgewarsAppDelegate.m */, - 32CA4F630368D1EE00C91783 /* Hedgewars_Prefix.pch */, - 61A97F0E136F675A00DD9878 /* hwconsts.h */, - 6165922911CA9BD500D6E256 /* PascalImports.h */, 61D2059F127CDD1100ABD83E /* ObjcExports.h */, 61D205A0127CDD1100ABD83E /* ObjcExports.m */, - 6165922511CA9BD500D6E256 /* CommodityFunctions.h */, - 6165922611CA9BD500D6E256 /* CommodityFunctions.m */, + 6165922511CA9BD500D6E256 /* HWUtils.h */, + 6165922611CA9BD500D6E256 /* HWUtils.m */, 61006F93128DE31F00EBA7F7 /* CreationChamber.h */, 61006F94128DE31F00EBA7F7 /* CreationChamber.m */, 6165922411CA9BD500D6E256 /* CGPointUtils.h */, @@ -737,8 +757,10 @@ 61F903FA11DF58680068B24D /* Frontend */, 6179936611501D1E00BA94A9 /* Overlay */, 61798A5E114AE08600BA94A9 /* Data */, - 6187AEA5120781B900B31A27 /* Settings */, 8D1107310486CEB800E47090 /* Info.plist */, + 610782931440EE5C00645B29 /* basicFlags.plist */, + 610782941440EE5C00645B29 /* credits.plist */, + 610782951440EE5C00645B29 /* gameMods.plist */, ); name = Resources; sourceTree = ""; @@ -784,6 +806,10 @@ 611D9BFA12497E9800008271 /* SavedGamesViewController.xib */, 61B7A33612CC21080086B604 /* StatsPageViewController.h */, 61B7A33712CC21080086B604 /* StatsPageViewController.m */, + 61915D58143A4E2C00299991 /* MissionTrainingViewController.h */, + 61915D59143A4E2C00299991 /* MissionTrainingViewController.m */, + 61915D5A143A4E2C00299991 /* MissionTrainingViewController-iPhone.xib */, + 61077E86143FB09800645B29 /* MissionTrainingViewController-iPad.xib */, ); name = "Other Controllers"; sourceTree = ""; @@ -802,10 +828,10 @@ 6163EE4C11CC2478001C0453 /* Settings Pages */ = { isa = PBXGroup; children = ( - 6165920211CA9BA200D6E256 /* SplitViewRootController.h */, - 6165920311CA9BA200D6E256 /* SplitViewRootController.m */, - 616591F411CA9BA200D6E256 /* MasterViewController.h */, - 616591F511CA9BA200D6E256 /* MasterViewController.m */, + 6165920211CA9BA200D6E256 /* SettingsContainerViewController.h */, + 6165920311CA9BA200D6E256 /* SettingsContainerViewController.m */, + 616591F411CA9BA200D6E256 /* SettingsBaseViewController.h */, + 616591F511CA9BA200D6E256 /* SettingsBaseViewController.m */, 6163EE4E11CC248D001C0453 /* First Level */, 6163EE4F11CC2497001C0453 /* Second Level */, 6163EE5011CC24A1001C0453 /* Third Level */, @@ -818,7 +844,7 @@ children = ( 616591E411CA9BA200D6E256 /* GameConfigViewController.h */, 616591E511CA9BA200D6E256 /* GameConfigViewController.m */, - 6165924A11CA9CB400D6E256 /* GameConfigViewController.xib */, + 6165924A11CA9CB400D6E256 /* GameConfigViewController-iPhone.xib */, 6165920411CA9BA200D6E256 /* TeamConfigViewController.h */, 6165920511CA9BA200D6E256 /* TeamConfigViewController.m */, 616591FC11CA9BA200D6E256 /* SchemeWeaponConfigViewController.h */, @@ -900,6 +926,17 @@ name = Overlay; sourceTree = ""; }; + 61641FE21437CD8F006E049C /* Headers */ = { + isa = PBXGroup; + children = ( + 61641FE31437CDAA006E049C /* DefinesAndMacros.h */, + 32CA4F630368D1EE00C91783 /* Hedgewars_Prefix.pch */, + 61A97F0E136F675A00DD9878 /* hwconsts.h */, + 6165922911CA9BD500D6E256 /* PascalImports.h */, + ); + name = Headers; + sourceTree = ""; + }; 61798892114AA56300BA94A9 /* inc */ = { isa = PBXGroup; children = ( @@ -1075,6 +1112,7 @@ 615AD9E8120764CA00F2FF04 /* backButton.png */, 6172FED31298CE6600D73365 /* backButton@2x.png */, 615AD96112073B4D00F2FF04 /* startGameButton.png */, + 61078029143FCCC800645B29 /* startGameButton@2x.png */, 615FEADE12A2A6640098EE92 /* localplayButton@2x~iphone.png */, 615FEAE012A2A6640098EE92 /* localplayButton~iphone.png */, 615FEADF12A2A6640098EE92 /* localplayButton~ipad.png */, @@ -1325,7 +1363,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - 61536DF411CEAE7100D87A7E /* GameConfigViewController.xib in Resources */, + 61536DF411CEAE7100D87A7E /* GameConfigViewController-iPhone.xib in Resources */, 61370653117B1D50004EE44A /* Entitlements-Distribution.plist in Resources */, 611E12FF117BBBDA0044B62F /* Entitlements-Development.plist in Resources */, 6165925311CA9CB400D6E256 /* MainMenuViewController-iPad.xib in Resources */, @@ -1354,7 +1392,6 @@ 615AD96212073B4D00F2FF04 /* startGameButton.png in Resources */, 615AD9E9120764CA00F2FF04 /* backButton.png in Resources */, 615AD9EB1207654E00F2FF04 /* helpButton.png in Resources */, - 6187AEBD120781B900B31A27 /* Settings in Resources */, 611EE974122A9C4100DF6938 /* clickSound.wav in Resources */, 611EE9DA122AA10A00DF6938 /* selSound.wav in Resources */, 611EEAEF122B2A4D00DF6938 /* HelpPageLobbyViewController-iPad.xib in Resources */, @@ -1437,6 +1474,13 @@ 6167CA42142A6ED7003DD50F /* bot5@2x.png in Resources */, 6167CB48142A8769003DD50F /* basehat-hedgehog.png in Resources */, 6167CB49142A8769003DD50F /* basehat-hedgehog@2x.png in Resources */, + 61915D5C143A4E2C00299991 /* MissionTrainingViewController-iPhone.xib in Resources */, + 61077E87143FB09800645B29 /* MissionTrainingViewController-iPad.xib in Resources */, + 6107802A143FCCC800645B29 /* startGameButton@2x.png in Resources */, + 610782961440EE5C00645B29 /* basicFlags.plist in Resources */, + 610782971440EE5C00645B29 /* credits.plist in Resources */, + 610782981440EE5C00645B29 /* gameMods.plist in Resources */, + 61B9A86814423A9D001541C1 /* GameConfigViewController-iPad.xib in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1454,7 +1498,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\n\n#create config.inc\necho \"Updating config file...\"\nPROTO=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep HEDGEWARS_PROTO_VER | cut -d ' ' -f 2 | cut -d ')' -f 1`\nMAJN=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep CPACK_PACKAGE_VERSION_MAJOR | xargs | cut -d ' ' -f 2 |cut -d ')' -f 1`\nMINN=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep CPACK_PACKAGE_VERSION_MINOR | xargs | cut -d ' ' -f 2 |cut -d ')' -f 1`\nPATN=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep CPACK_PACKAGE_VERSION_PATCH | xargs | cut -d ' ' -f 2 |cut -d '$' -f 1`\nREVN=-`/usr/local/bin/hg id -n ${PROJECT_DIR}/../../`\necho \"const cNetProtoVersion = $PROTO; const cVersionString = '${MAJN}.${MINN}.${PATN}${REVN}'; const cLuaLibrary = '';\" > ${PROJECT_DIR}/config.inc\n\necho \"Copying Data...\"\ncp -R ${PROJECT_DIR}/../../share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some files from QTfrontend/res\necho \"Fetching additional graphics from QTfrontend...\"\nmkdir ${PROJECT_DIR}/Data/Graphics/Icons\ncp ${PROJECT_DIR}/../../QTfrontend/res/{btn*,icon*,StatsMedal*,ammopic*}.png ${PROJECT_DIR}/Data/Graphics/Icons/\n\necho \"Removing text and dummy files...\"\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg* -delete\nfind ${PROJECT_DIR}/Data -name *.psd -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\nfind ${PROJECT_DIR}/Data -name *.orig -delete\nfind ${PROJECT_DIR}/Data -name *.ts -delete\n\n#delete dummy maps and hats, misc stuff\nrm -rf ${PROJECT_DIR}/Data/Maps/test*\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/{TeamCap,TeamHeadband,TeamHair}\nrm -rf ${PROJECT_DIR}/Data/misc/\n\n#delete forbidden maps and WIP themes (remember to check that no Map uses them)\nrm -rf ${PROJECT_DIR}/Data/Maps/{Cheese,FlightJoust}\nrm -rf ${PROJECT_DIR}/Data/Themes/{Beach,Digital}\n\n#delete all names, reserved hats and unused fonts\nrm -rf ${PROJECT_DIR}/Data/Names/\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/\nrm -rf ${PROJECT_DIR}/Data/Fonts/{wqy-zenhei.ttc,DroidSansFallback.ttf}\n\necho \"Handling audio files...\"\n#delete the Classic voice\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/Classic\n#delete the main theme file\nrm -rf ${PROJECT_DIR}/Data/Music/main_theme.ogg\n#copy mono audio\ncp -R ${PROJECT_DIR}/Audio/* ${PROJECT_DIR}/Data/\n#remove unused voices\nfor i in {Amazing,Brilliant,Bugger,Bungee,Cutitout,Drat,Excellent,Fire,FlawlessPossibility,Gonnagetyou,Grenade,Hmm,Justyouwait,Leavemealone,Ohdear,Ouch,Perfect,Revenge,Runaway,Solong,Thisoneismine,VictoryPossibility,Watchthis,Whatthe,Whoopsee}; do find Data/Sounds/voices/ -name $i.ogg -delete; done\n\necho \"Tweaking Data contents...\"\n#move Lua maps in Missions\nmkdir ${PROJECT_DIR}/Data/Missions/Maps/\nfor i in `ls ${PROJECT_DIR}/Data/Maps/`; do if [[ `ls -f ${PROJECT_DIR}/Data/Maps/$i/map.lua 2> /dev/null` != '' ]]; then mv ${PROJECT_DIR}/Data/Maps/$i ${PROJECT_DIR}/Data/Missions/Maps/; fi; done;\n#workaround for missing map in CTF_Blizzard\nln -s ../../../Maps/Blizzard/map.png ${PROJECT_DIR}/Data/Missions/Maps/CTF_Blizzard/map.png\n#remove cfg files since we have plists\nfind ${PROJECT_DIR}/Data/Scripts -name *.cfg -delete\nif ((`ls ${PROJECT_DIR}/Data/Scripts/Multiplayer/*.lua|wc -l` >= `ls ${PROJECT_DIR}/Data/Scripts/plist/*.plist|wc -l` ))\nthen\necho \"${PROJECT_DIR}/Data/Scripts/Multiplayer/Normal.plist:0: warning, missing plist implementation of a Multiplayer script file\"\nfi\n\n#reduce the number of flakes for City\nsed -ie 's/1500/50/' ${PROJECT_DIR}/Data/Themes/City/theme.cfg\n\necho \"Done\""; + shellScript = "#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\n\n#create config.inc\necho \"Updating config file...\"\nPROTO=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep HEDGEWARS_PROTO_VER | cut -d ' ' -f 2 | cut -d ')' -f 1`\nMAJN=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep CPACK_PACKAGE_VERSION_MAJOR | xargs | cut -d ' ' -f 2 |cut -d ')' -f 1`\nMINN=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep CPACK_PACKAGE_VERSION_MINOR | xargs | cut -d ' ' -f 2 |cut -d ')' -f 1`\nPATN=`cat ${PROJECT_DIR}/../../CMakeLists.txt | grep CPACK_PACKAGE_VERSION_PATCH | xargs | cut -d ' ' -f 2 |cut -d '$' -f 1`\nREVN=-`/usr/local/bin/hg id -n ${PROJECT_DIR}/../../`\necho \"const cNetProtoVersion = $PROTO; const cVersionString = '${MAJN}.${MINN}.${PATN}${REVN}'; const cLuaLibrary = '';\" > ${PROJECT_DIR}/config.inc\n\necho \"Copying Data...\"\ncp -R ${PROJECT_DIR}/../../share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some files from QTfrontend/res\necho \"Fetching additional graphics from QTfrontend...\"\nmkdir ${PROJECT_DIR}/Data/Graphics/Icons\ncp ${PROJECT_DIR}/../../QTfrontend/res/{btn*,icon*,StatsMedal*,ammopic*}.png ${PROJECT_DIR}/Data/Graphics/Icons/\n\necho \"Removing text and dummy files...\"\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg* -delete\nfind ${PROJECT_DIR}/Data -name *.psd -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\nfind ${PROJECT_DIR}/Data -name *.orig -delete\nfind ${PROJECT_DIR}/Data -name *.ts -delete\n\n#delete dummy maps and hats, misc stuff\nrm -rf ${PROJECT_DIR}/Data/Maps/test*\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/{TeamCap,TeamHeadband,TeamHair}\nrm -rf ${PROJECT_DIR}/Data/misc/\n\n#delete forbidden maps and WIP themes (remember to check that no Map uses them)\nrm -rf ${PROJECT_DIR}/Data/Maps/{Cheese,FlightJoust}\nrm -rf ${PROJECT_DIR}/Data/Themes/{Beach,Digital}\n\n#delete all names, reserved hats and unused fonts\nrm -rf ${PROJECT_DIR}/Data/Names/\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/\nrm -rf ${PROJECT_DIR}/Data/Fonts/{wqy-zenhei.ttc,DroidSansFallback.ttf}\n\necho \"Handling audio files...\"\n#delete the Classic voice\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/Classic\n#delete the main theme file\nrm -rf ${PROJECT_DIR}/Data/Music/main_theme.ogg\n#copy mono audio\ncp -R ${PROJECT_DIR}/Audio/* ${PROJECT_DIR}/Data/\n#remove unused voices\nfor i in {Amazing,Brilliant,Bugger,Bungee,Cutitout,Drat,Excellent,Fire,FlawlessPossibility,Gonnagetyou,Grenade,Hmm,Justyouwait,Leavemealone,Ohdear,Ouch,Perfect,Revenge,Runaway,Solong,Thisoneismine,VictoryPossibility,Watchthis,Whatthe,Whoopsee}; do find Data/Sounds/voices/ -name $i.ogg -delete; done\n\necho \"Tweaking Data contents...\"\n#move Lua maps in Missions\nmkdir ${PROJECT_DIR}/Data/Missions/Maps/\nfor i in `ls ${PROJECT_DIR}/Data/Maps/`; do if [[ `ls -f ${PROJECT_DIR}/Data/Maps/$i/map.lua 2> /dev/null` != '' ]]; then mv ${PROJECT_DIR}/Data/Maps/$i ${PROJECT_DIR}/Data/Missions/Maps/; fi; done;\n#workaround for missing map in CTF_Blizzard\nln -s ../../../Maps/Blizzard/map.png ${PROJECT_DIR}/Data/Missions/Maps/CTF_Blizzard/map.png\n#remove cfg files since we have plists\nfind ${PROJECT_DIR}/Data/Scripts -name *.cfg -delete\nif ((`ls ${PROJECT_DIR}/Data/Scripts/Multiplayer/*.lua|wc -l` >= `ls ${PROJECT_DIR}/Data/Scripts/plist/*.plist|wc -l` ))\nthen\necho \"${PROJECT_DIR}/Data/Scripts/Multiplayer/Normal.plist:0: warning, missing plist implementation of a Multiplayer script file\"\nfi\n\n#reduce the number of flakes for City\nsed -i -e 's/1500/50/' ${PROJECT_DIR}/Data/Themes/City/theme.cfg\n#cleanup missions/trainings info\nsed -i -e -n '/\"/p' ${PROJECT_DIR}/Data/Locale/missions_en.txt\n\necho \"Done\""; showEnvVarsInLog = 0; }; 9283011B0F10CB2D00CC5A3C /* Build libfpc.a */ = { @@ -1537,20 +1581,20 @@ 6165921411CA9BA200D6E256 /* LevelViewController.m in Sources */, 6165921511CA9BA200D6E256 /* MainMenuViewController.m in Sources */, 6165921611CA9BA200D6E256 /* MapConfigViewController.m in Sources */, - 6165921711CA9BA200D6E256 /* MasterViewController.m in Sources */, + 6165921711CA9BA200D6E256 /* SettingsBaseViewController.m in Sources */, 6165921811CA9BA200D6E256 /* OverlayViewController.m in Sources */, 6165921911CA9BA200D6E256 /* InGameMenuViewController.m in Sources */, 6165921A11CA9BA200D6E256 /* SchemeSettingsViewController.m in Sources */, 6165921B11CA9BA200D6E256 /* SchemeWeaponConfigViewController.m in Sources */, 6165921C11CA9BA200D6E256 /* SingleSchemeViewController.m in Sources */, 6165921D11CA9BA200D6E256 /* SingleTeamViewController.m in Sources */, - 6165921E11CA9BA200D6E256 /* SplitViewRootController.m in Sources */, + 6165921E11CA9BA200D6E256 /* SettingsContainerViewController.m in Sources */, 6165921F11CA9BA200D6E256 /* TeamConfigViewController.m in Sources */, 6165922011CA9BA200D6E256 /* TeamSettingsViewController.m in Sources */, 6165922111CA9BA200D6E256 /* VoicesViewController.m in Sources */, 6165922211CA9BA200D6E256 /* WeaponSettingsViewController.m in Sources */, 6165922E11CA9BD500D6E256 /* CGPointUtils.c in Sources */, - 6165922F11CA9BD500D6E256 /* CommodityFunctions.m in Sources */, + 6165922F11CA9BD500D6E256 /* HWUtils.m in Sources */, 6165923111CA9BD500D6E256 /* SquareButtonView.m in Sources */, 6165923211CA9BD500D6E256 /* UIImageExtra.m in Sources */, 6165929E11CA9E2F00D6E256 /* HedgewarsAppDelegate.m in Sources */, @@ -1589,6 +1633,8 @@ 61EDB5B0135B3F97009B29A6 /* GameInterfaceBridge.m in Sources */, 61A976B3136F668500DD9878 /* uCursor.pas in Sources */, 6167A6761391514600AA6D07 /* RestoreViewController.m in Sources */, + 61C28D3F142D380400DA16C2 /* AudioManagerController.m in Sources */, + 61915D5B143A4E2C00299991 /* MissionTrainingViewController.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1634,7 +1680,7 @@ ARCHS = "$(ARCHS_STANDARD_32_BIT)"; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix -Fi${PROJECT_DIR}"; + FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/2.7.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; @@ -1717,7 +1763,7 @@ CODE_SIGN_ENTITLEMENTS = "Entitlements-Distribution.plist"; CODE_SIGN_IDENTITY = "iPhone Distribution"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; - FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix -Fi${PROJECT_DIR}"; + FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/2.7.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; @@ -1842,7 +1888,7 @@ CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix -Fi${PROJECT_DIR}"; + FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/2.5.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; @@ -1889,7 +1935,7 @@ CODE_SIGN_ENTITLEMENTS = "Entitlements-Development.plist"; CODE_SIGN_IDENTITY = "iPhone Developer"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix -Fi${PROJECT_DIR}"; + FPC_COMMON_OPTIONS = "-dIPHONEOS -Cs2000000 -vwi -B -Sgix"; FPC_COMPILER_BINARY_DIR = /usr/local/lib/fpc/2.7.1; FPC_MAIN_FILE = "$(PROJECT_DIR)/../../hedgewars/hwLibrary.pas"; FPC_RTL_UNITS_BASE = /usr/local/lib/fpc; diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Hedgewars_Prefix.pch --- a/project_files/HedgewarsMobile/Hedgewars_Prefix.pch Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/HedgewarsMobile/Hedgewars_Prefix.pch Sun Oct 16 21:03:30 2011 +0200 @@ -14,53 +14,20 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * File created on 25/04/2010. */ -// some macros by http://www.cimgf.com/2010/05/02/my-current-prefix-pch-file/ -// and http://blog.coriolis.ch/2009/01/05/macros-for-xcode/ - #ifdef __OBJC__ #import #import #import #import "PascalImports.h" #import "UIImageExtra.h" -#import "CommodityFunctions.h" +#import "DefinesAndMacros.h" #import "HedgewarsAppDelegate.h" -#import "SDL.h" -#import "SDL_video.h" -#import "SDL_net.h" -#import "SDL_mixer.h" +#import "AudioManagerController.h" +#import "HWUtils.h" #endif - -#ifdef DEBUG - #define DLog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) - #define ALog(...) [[NSAssertionHandler currentHandler] handleFailureInFunction:[NSString stringWithCString:__PRETTY_FUNCTION__ encoding:NSUTF8StringEncoding] file:[NSString stringWithCString:__FILE__ encoding:NSUTF8StringEncoding] lineNumber:__LINE__ description:__VA_ARGS__] - #define releaseAndNil(x) [x release] -#else - #define DLog(...) do { } while (0) - #ifndef NS_BLOCK_ASSERTIONS - #define NS_BLOCK_ASSERTIONS - #endif - #define ALog(...) NSLog(@"%s %@", __PRETTY_FUNCTION__, [NSString stringWithFormat:__VA_ARGS__]) - #define releaseAndNil(x) [x release], x = nil -#endif - - -#define ZAssert(condition, ...) do { if (!(condition)) { ALog(__VA_ARGS__); }} while(0) -#define rotationManager(x) (x == UIInterfaceOrientationLandscapeRight) || (x == UIInterfaceOrientationLandscapeLeft) - -#define START_TIMER NSTimeInterval start = [NSDate timeIntervalSinceReferenceDate]; -#define END_TIMER(msg) NSTimeInterval stop = [NSDate timeIntervalSinceReferenceDate]; CMLog([NSString stringWithFormat:@"%@ Time = %f", msg, stop-start]); - - -#if !__IPHONE_3_2 -typedef enum { - UIUserInterfaceIdiomPhone, // iPhone and iPod touch style UI - UIUserInterfaceIdiomPad, // iPad style UI -} UIUserInterfaceIdiom; -#define UI_USER_INTERFACE_IDIOM() UIUserInterfaceIdiomPhone -#define UIPopoverController id -#endif // ifndef __IPHONE_3_2 diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/AboutViewController.xib --- a/project_files/HedgewarsMobile/Resources/AboutViewController.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,658 +0,0 @@ - - - - 1024 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 292 - - YES - - - 290 - - YES - - - 292 - {{127, 7}, {289, 30}} - - NO - IBIPadFramework - 2 - 5 - 0 - - YES - Code - Art - Sound - Locale - Special - - - YES - - - - - - - - YES - - - - - - - - YES - {0, 0} - {0, 0} - {0, 0} - {0, 0} - {0, 0} - - - YES - - - - - - - - - {543, 44} - - IBIPadFramework - - YES - - - - IBIPadFramework - 1 - - 0 - - - IBIPadFramework - - - - - - 274 - {{0, 44}, {543, 577}} - - - 1 - MCAwIDAgMAA - - YES - IBIPadFramework - YES - 1 - 2 - 0 - YES - 44 - 10 - 10 - - - {543, 621} - - 3 - MQA - - NO - NO - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - buttonPressed: - - - - 8 - - - - dataSource - - - - 12 - - - - delegate - - - - 13 - - - - tableView - - - - 14 - - - - segmentedControlChanged: - - - 13 - - 15 - - - - segmentedControl - - - - 16 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - 5 - - - YES - - - - - - 6 - - - YES - - - - - - - 7 - - - - - 10 - - - - - 11 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 10.IBPluginDependency - 11.IBPluginDependency - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 5.IBPluginDependency - 6.IBPluginDependency - 7.IBPluginDependency - - - YES - AboutViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{376, 170}, {543, 621}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 16 - - - - YES - - AboutViewController - UIViewController - - YES - - YES - buttonPressed: - segmentedControlChanged: - - - YES - id - id - - - - YES - - YES - buttonPressed: - segmentedControlChanged: - - - YES - - buttonPressed: - id - - - segmentedControlChanged: - id - - - - - YES - - YES - segmentedControl - tableView - - - YES - UISegmentedControl - UITableView - - - - YES - - YES - segmentedControl - tableView - - - YES - - segmentedControl - UISegmentedControl - - - tableView - UITableView - - - - - IBProjectSource - Classes/AboutViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISegmentedControl - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISegmentedControl.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - 123 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Frontend/helpButton.png Binary file project_files/HedgewarsMobile/Resources/Frontend/helpButton.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Frontend/startGameButton@2x.png Binary file project_files/HedgewarsMobile/Resources/Frontend/startGameButton@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/GameConfigViewController.xib --- a/project_files/HedgewarsMobile/Resources/GameConfigViewController.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,608 +0,0 @@ - - - - 1056 - 10K540 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 266 - - YES - - - 292 - {{96, 8}, {270, 30}} - - NO - 12345 - IBCocoaTouchFramework - 2 - 4 - 0 - - YES - Map - Teams - Details - Help - - - YES - - - - - - - YES - - - - - - - YES - {0, 0} - {0, 0} - {0, 0} - {0, 0} - - - YES - - - - - - - 1 - MC42IDAuNiAwLjYAA - - - - {{0, 276}, {480, 44}} - - NO - NO - IBCocoaTouchFramework - 1 - - YES - - Back - IBCocoaTouchFramework - 1 - - - - IBCocoaTouchFramework - - 5 - - - IBCocoaTouchFramework - - - - - IBCocoaTouchFramework - - 5 - - - 1 - Start - IBCocoaTouchFramework - 68 - 2 - - - - - - {480, 320} - - - 3 - MQA - - NO - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - buttonPressed: - - - - 17 - - - - buttonPressed: - - - - 23 - - - - segmentPressed: - - - 13 - - 29 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - 15 - - - YES - - - - - - - - - - 16 - - - - - 18 - - - - - 19 - - - - - 21 - - - YES - - - - - - 20 - - - - - 22 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.IBPluginDependency - 18.IBPluginDependency - 19.IBPluginDependency - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 20.IBPluginDependency - 22.IBPluginDependency - - - YES - GameConfigViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw58AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{131, 321}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 29 - - - - YES - - GameConfigViewController - UIViewController - - YES - - YES - buttonPressed: - segmentPressed: - - - YES - id - id - - - - YES - - YES - buttonPressed: - segmentPressed: - - - YES - - buttonPressed: - id - - - segmentPressed: - id - - - - - IBProjectSource - Classes/GameConfigViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISegmentedControl - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISegmentedControl.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/HelpPageInGameViewController-iPad.xib --- a/project_files/HedgewarsMobile/Resources/HelpPageInGameViewController-iPad.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,889 +0,0 @@ - - - - 1024 - 10F569 - 788 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 117 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 292 - - YES - - - 292 - {{0, -1}, {1024, 768}} - - NO - NO - IBIPadFramework - - NSImage - helpingame.png - - - - - 292 - {{79, 473}, {150, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Direction buttons - - Helvetica-Bold - 18 - 16 - - - 1 - MCAwIDAAA - - - 1 - 10 - - - - 292 - {{79, 491}, {203, 85}} - - NO - YES - 7 - NO - IBIPadFramework - With these buttons you can move your hog, aim and control certain weapons. - - Helvetica - 16 - 16 - - - - 1 - 10 - 0 - - - - 292 - {{53, 97}, {186, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Timer - - - - 1 - 10 - - - - 292 - {{53, 118}, {187, 43}} - - NO - YES - 7 - NO - IBIPadFramework - Don't let your turn time run out! - - - - 1 - 10 - 0 - - - - 292 - {{780, 248}, {240, 128}} - - NO - NO - IBIPadFramework - - NSImage - helpright.png - - - - - 292 - {{790, 256}, {109, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Ammo Menu - - - - 1 - 10 - - - - 292 - {{790, 282}, {214, 84}} - - NO - YES - 7 - NO - IBIPadFramework - This menu contains all the weapons you can use. Drag your finger on a weapon for more details on what it does! - - - - 1 - 10 - 0 - - - - 292 - {{780, 97}, {186, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Pause / Open ammos - - - - 1 - 10 - - - - 292 - {{782, 118}, {187, 43}} - - NO - YES - 7 - NO - IBIPadFramework - Tap to pause or open the ammo menu. - - - - 1 - 10 - 0 - - - - 292 - {{418, 73}, {186, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Wind bar - - - - 1 - 10 - - - - 292 - {{418, 89}, {191, 63}} - - NO - YES - 7 - NO - IBIPadFramework - Some weapons are affected by the wind and their direction may shift. - - - - 1 - 10 - 0 - - - - 292 - {{447, 573}, {203, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Teams flags and health - - - - 1 - 10 - - - - 292 - {{447, 592}, {203, 85}} - - NO - YES - 7 - NO - IBIPadFramework - These bars report the team name, the team flags and the global health status of every hog. - - - - 1 - 10 - 4 - - - - 292 - {{741, 501}, {135, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Joypad buttons - - - - 1 - 10 - - - - 292 - {{741, 520}, {211, 85}} - - NO - YES - 7 - NO - IBIPadFramework - Press X to jump forward, Y to jump backwards (double tap to jump twice) and Missile to attack or use items. - - - - 1 - 10 - 0 - - - - 292 - {{67, 238}, {240, 128}} - - NO - NO - IBIPadFramework - - NSImage - helpplain.png - - - - - 292 - {{72, 246}, {229, 22}} - - NO - YES - 7 - NO - IBIPadFramework - Tap to return to game - - - - 1 - 10 - 1 - - - - 292 - {{72, 268}, {229, 87}} - - NO - YES - 7 - NO - IBIPadFramework - Pan to move camera, pinch to zoom, double tap to center hog, and a single touch to interact with weapons and much more! - - - - 1 - 10 - 0 - - - {1024, 768} - - - 3 - MCAwLjQAA - - NO - NO - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - dismiss - - - 7 - - 16 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 10 - - - - - 11 - - - - - 12 - - - - - 13 - - - - - 14 - - - - - 17 - - - - - 18 - - - - - 21 - - - - - 22 - - - - - 23 - - - - - 24 - - - - - 25 - - - - - 26 - - - - - 27 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 10.IBPluginDependency - 11.IBPluginDependency - 12.IBPluginDependency - 13.IBPluginDependency - 14.IBPluginDependency - 17.IBPluginDependency - 18.IBPluginDependency - 2.CustomClassName - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 21.IBPluginDependency - 22.IBPluginDependency - 23.IBPluginDependency - 24.IBPluginDependency - 25.IBPluginDependency - 26.IBPluginDependency - 27.IBPluginDependency - 5.IBPluginDependency - 6.IBPluginDependency - 7.IBPluginDependency - 8.IBPluginDependency - 9.IBPluginDependency - - - YES - HelpPageViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - UIControl - {{288, 355}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 27 - - - - YES - - HelpPageViewController - UIViewController - - dismiss - id - - - dismiss - - dismiss - id - - - - IBProjectSource - Classes/HelpPageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - helpingame.png - helpplain.png - helpright.png - - - YES - {1024, 768} - {296, 138} - {308, 144} - - - 117 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/HelpPageInGameViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Resources/HelpPageInGameViewController-iPhone.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1014 +0,0 @@ - - - - 1056 - 10H574 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 274 - - YES - - - 292 - {{20, 283}, {150, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Direction buttons - - Helvetica-Bold - 18 - 16 - - - 1 - MCAwIDAAA - - - 1 - 10 - - - - 292 - {{20, 292}, {203, 85}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - With these buttons you can move your hog, aim and control certain weapons. - - Helvetica - 16 - 16 - - - - 1 - 10 - 0 - - - - 292 - {{20, 13}, {186, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Timer - - - - 1 - 10 - - - - 292 - {{20, 34}, {187, 43}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Don't let your turn time run out! - - - - 1 - 10 - 0 - - - - 292 - {{217, 308}, {243, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Touch interface - - - - 1 - 10 - 2 - - - - 292 - {{231, 328}, {229, 87}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Pan to move camera, pinch to zoom, double tap to center hog, and a single touch to interact with weapons and much more! - - - - 1 - 10 - 0 - 2 - - - - 292 - {{20, 85}, {186, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Wind bar - - - - 1 - 10 - - - - 292 - {{20, 101}, {191, 63}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Some weapons are affected by the wind and their direction may shift. - - - - 1 - 10 - 0 - - - - 292 - {{20, 172}, {203, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Teams flags and health - - - - 1 - 10 - - - - 292 - {{20, 191}, {203, 85}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - These bars report the team name, the team flags and the global health status of every hog. - - - - 1 - 10 - 4 - - - - 292 - {{274, 13}, {186, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Pause / Open ammos - - - - 1 - 10 - 2 - - - - 292 - {{273, 35}, {187, 43}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Tap to pause or open the ammo menu. - - - - 1 - 10 - 0 - 2 - - - - 292 - {{351, 82}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Ammo Menu - - - - 1 - 10 - 2 - - - - 292 - {{246, 105}, {214, 84}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - This menu contains all the weapons you can use. Drag your finger on a weapon for more details on what it does! - - - - 1 - 10 - 0 - 2 - - - - 292 - {{325, 197}, {135, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Joypad buttons - - - - 1 - 10 - 2 - - - - 292 - {{249, 217}, {211, 85}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Press X to jump forward, Y to jump backwards (double tap to jump twice) and Missile to attack or use items. - - - - 1 - 10 - 0 - 2 - - - {{-5, 44}, {489, 332}} - - YES - YES - 1 - IBCocoaTouchFramework - - - - 290 - {{-1, 0}, {481, 44}} - - IBCocoaTouchFramework - - YES - - - Help page - - Back - IBCocoaTouchFramework - 1 - - - IBCocoaTouchFramework - - - - - {480, 320} - - - 2 - MC45OTYwNzg0OTEyIDAuOTg4MjM1MzU0NCAxAA - - NO - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - dismiss - - - - 141 - - - - scrollView - - - - 142 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - 118 - - - YES - - - - - - 121 - - - YES - - - - - - - - - - - - - - - - - - - - - 122 - - - - - 124 - - - - - 125 - - - - - 126 - - - - - 127 - - - - - 128 - - - - - 129 - - - - - 130 - - - - - 131 - - - - - 132 - - - - - 133 - - - - - 134 - - - - - 135 - - - - - 136 - - - - - 137 - - - - - 138 - - - - - 119 - - - YES - - - - - - 140 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 118.IBPluginDependency - 118.IBViewBoundsToFrameTransform - 119.IBPluginDependency - 121.IBEditorWindowLastContentRect - 121.IBPluginDependency - 121.IBViewBoundsToFrameTransform - 122.IBPluginDependency - 122.IBViewBoundsToFrameTransform - 124.IBPluginDependency - 124.IBViewBoundsToFrameTransform - 125.IBPluginDependency - 125.IBViewBoundsToFrameTransform - 126.IBPluginDependency - 126.IBViewBoundsToFrameTransform - 127.IBPluginDependency - 127.IBViewBoundsToFrameTransform - 128.IBPluginDependency - 128.IBViewBoundsToFrameTransform - 129.IBPluginDependency - 129.IBViewBoundsToFrameTransform - 130.IBPluginDependency - 130.IBViewBoundsToFrameTransform - 131.IBPluginDependency - 131.IBViewBoundsToFrameTransform - 132.IBPluginDependency - 132.IBViewBoundsToFrameTransform - 133.IBPluginDependency - 133.IBViewBoundsToFrameTransform - 134.IBPluginDependency - 134.IBViewBoundsToFrameTransform - 135.IBPluginDependency - 135.IBViewBoundsToFrameTransform - 136.IBPluginDependency - 136.IBViewBoundsToFrameTransform - 137.IBPluginDependency - 137.IBViewBoundsToFrameTransform - 138.IBPluginDependency - 138.IBViewBoundsToFrameTransform - 140.IBPluginDependency - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 2.IBViewBoundsToFrameTransform - - - YES - HelpPageViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AQAAAADAQAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{589, 578}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AcCgAABCMAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDZwAAw7aAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCVAAAwx8AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAwnQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCxgAAwtYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCxgAAwyQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw+SAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAxARAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw6aAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw8+AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDZwAAw+EAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDiQAAwmwAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDiIAAwswAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDr4AAwwUAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDdgAAw1oAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDooAAw3gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDeQAAw6aAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{165, 514}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw4kAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 142 - - - - YES - - HelpPageViewController - UIViewController - - dismiss - id - - - dismiss - - dismiss - id - - - - scrollView - UIScrollView - - - scrollView - - scrollView - UIScrollView - - - - IBProjectSource - Classes/HelpPageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UINavigationBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UINavigationBar.h - - - - UINavigationItem - NSObject - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/HelpPageLobbyViewController-iPad.xib --- a/project_files/HedgewarsMobile/Resources/HelpPageLobbyViewController-iPad.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1135 +0,0 @@ - - - - 1024 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 292 - - YES - - - 292 - {{742, 389}, {240, 102}} - - - NO - NO - IBIPadFramework - - NSImage - helpabove.png - - - - - 292 - {{753, 408}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Map theme - - Helvetica-Bold - 18 - 16 - - - 1 - MCAwIDAAA - - - 1 - 10 - - - - 292 - {{753, 425}, {218, 66}} - - - NO - YES - 7 - NO - IBIPadFramework - Here you can choose how your map will appear in game. - - Helvetica - 16 - 16 - - - - 1 - 10 - 0 - - - - 292 - {{653, 202}, {240, 146}} - - - NO - NO - IBIPadFramework - - - - - 292 - {{664, 223}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Map type - - - - 1 - 10 - - - - 292 - {{664, 244}, {218, 99}} - - - NO - YES - 7 - NO - IBIPadFramework - Choose between a static map or a randomly generated one (might require more time). In a mission you need to perfom some action to win. - - - - 1 - 10 - 0 - - - - 292 - {{494, 20}, {240, 101}} - - - NO - NO - IBIPadFramework - - NSImage - helpright.png - - - - - 292 - {{502, 25}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Map preview - - - - 1 - 10 - - - - 292 - {{502, 46}, {218, 65}} - - - NO - YES - 7 - NO - IBIPadFramework - This is a small preview of your next map. Tap to select / generate a new map. - - - - 1 - 10 - 0 - - - - 292 - {{391, 389}, {242, 171}} - - - NO - NO - IBIPadFramework - - - - - 292 - {{401, 413}, {109, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Teams - - - - 1 - 10 - - - - 292 - {{400, 434}, {232, 120}} - - - NO - YES - 7 - NO - IBIPadFramework - Select which teams are playing! Add hogs by tapping on them and set their color to figure friend and foe teams out. AI teams will appear with a small robot badge next their name. - - - - 1 - 10 - 0 - - - - 292 - {{142, 125}, {240, 104}} - - - NO - NO - IBIPadFramework - - NSImage - helpleft.png - - - - - 292 - {{162, 133}, {204, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Schemes and Weapons - - - - 1 - 10 - - - - 292 - {{162, 152}, {210, 71}} - - - NO - YES - 7 - NO - IBIPadFramework - Here you can choose which rules and which weapon set will be applied in game. - - - - 1 - 10 - 0 - - - - 292 - {{155, 8}, {278, 50}} - - - NO - NO - IBIPadFramework - - - - - 292 - {{177, 6}, {248, 54}} - - - NO - YES - 7 - NO - IBIPadFramework - Did you know you can customize almost everything in the settings page? - - Helvetica-Oblique - 14 - 16 - - - - 1 - 10 - 0 - - - - 292 - {{686, 583}, {240, 117}} - - - NO - NO - IBIPadFramework - - NSImage - helpbottom.png - - - - - 292 - {{697, 592}, {138, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Max hedgehogs - - - - 1 - 10 - - - - 292 - {{697, 609}, {218, 73}} - - - NO - YES - 7 - NO - IBIPadFramework - This number is the maximum size for all the hogs playing (in every team). - - - - 1 - 10 - 0 - - - - 292 - {{20, 587}, {240, 109}} - - - NO - NO - IBIPadFramework - - - - - 292 - {{30, 592}, {138, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Size slider - - - - 1 - 10 - - - - 292 - {{30, 608}, {218, 73}} - - - NO - YES - 7 - NO - IBIPadFramework - For Random and Maze maps you can decide to generate only maps of a certain size. - - - - 1 - 10 - 0 - - - - 292 - {{45, 318}, {240, 128}} - - - NO - NO - IBIPadFramework - - NSImage - helpplain.png - - - - - 292 - {{50, 326}, {229, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Tap anywhere to dismiss - - - - 1 - 10 - 1 - - - - 292 - {{52, 348}, {224, 87}} - - - NO - YES - 7 - NO - IBIPadFramework - Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you. - - - - 1 - 10 - 0 - - - - 292 - {{344, 635}, {240, 61}} - - - NO - NO - IBIPadFramework - - - - - 292 - {{353, 637}, {138, 22}} - - - NO - YES - 7 - NO - IBIPadFramework - Start button - - - - 1 - 10 - - - - 292 - {{354, 650}, {218, 46}} - - - NO - YES - 7 - NO - IBIPadFramework - This button starts the game. - - - - 1 - 10 - 0 - - - {1024, 768} - - - - 3 - MCAwLjQAA - - NO - NO - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - dismiss - - - 7 - - 16 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 25 - - - - - 26 - - - - - 27 - - - - - 28 - - - - - 29 - - - - - 30 - - - - - 34 - - - - - 35 - - - - - 36 - - - - - 37 - - - - - 38 - - - - - 39 - - - - - 40 - - - - - 41 - - - - - 42 - - - - - 43 - - - - - 44 - - - - - 45 - - - - - 49 - - - - - 50 - - - - - 51 - - - - - 52 - - - - - 53 - - - - - 54 - - - - - 58 - - - - - 59 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.CustomClassName - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 25.IBPluginDependency - 26.IBPluginDependency - 27.IBPluginDependency - 28.IBPluginDependency - 29.IBPluginDependency - 30.IBPluginDependency - 34.IBPluginDependency - 35.IBPluginDependency - 36.IBPluginDependency - 37.IBPluginDependency - 38.IBPluginDependency - 39.IBPluginDependency - 40.IBPluginDependency - 41.IBPluginDependency - 42.IBPluginDependency - 43.IBPluginDependency - 44.IBPluginDependency - 45.IBPluginDependency - 49.IBPluginDependency - 50.IBPluginDependency - 51.IBPluginDependency - 52.IBPluginDependency - 53.IBPluginDependency - 54.IBPluginDependency - 58.IBPluginDependency - 59.IBPluginDependency - 6.IBPluginDependency - 7.IBPluginDependency - 8.IBPluginDependency - - - YES - HelpPageViewController - UIResponder - UIControl - {{273, 125}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 59 - - - - YES - - HelpPageViewController - UIViewController - - dismiss - id - - - dismiss - - dismiss - id - - - - IBProjectSource - Classes/HelpPageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - helpabove.png - helpbottom.png - helpleft.png - helpplain.png - helpright.png - - - YES - {295, 156} - {295, 156} - {308, 144} - {296, 138} - {308, 144} - - - 123 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/HelpPageLobbyViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Resources/HelpPageLobbyViewController-iPhone.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,907 +0,0 @@ - - - - 1024 - 10F569 - 804 - 1038.29 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 123 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 292 - - YES - - - 268 - - YES - - - 292 - {{20, 587}, {440, 52}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Still confused? Don't worry, it's really simple! Try a couple of games and everything will become clear to you. - - Helvetica - 16 - 16 - - - 1 - MCAwIDAAA - - - 1 - 10 - 0 - 1 - - - - 292 - {{20, 279}, {138, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Size slider - - Helvetica-Bold - 18 - 16 - - - - 1 - 10 - - - - 292 - {{20, 298}, {440, 44}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - For Random and Maze maps you can decide to generate only maps of a certain size. - - - - 1 - 10 - 0 - - - - 292 - {{20, 511}, {204, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Schemes and Weapons - - - - 1 - 10 - - - - 292 - {{20, 530}, {433, 45}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Here you can choose which rules and which weapon set will be applied in game. - - - - 1 - 10 - 0 - - - - 292 - {{20, 68}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Map preview - - - - 1 - 10 - - - - 292 - {{20, 88}, {440, 44}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - This is a small preview of your next map. Tap to select / generate a new map. - - - - 1 - 10 - 0 - - - - 292 - {{20, 140}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Map type - - - - 1 - 10 - - - - 292 - {{20, 164}, {440, 58}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Choose between a static map or a randomly generated one (might require more time). In a mission you need to perfom some action to win. - - - - 1 - 10 - 0 - - - - 292 - {{20, 229}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Map theme - - - - 1 - 10 - - - - 292 - {{20, 244}, {440, 33}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Here you can choose how your map will appear in game. - - - - 1 - 10 - 0 - - - - 292 - {{20, 347}, {138, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Max hedgehogs - - - - 1 - 10 - - - - 292 - {{20, 367}, {440, 41}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - This number is the maximum size for all the hogs playing (in every team). - - - - 1 - 10 - 0 - - - - 292 - {{20, 418}, {109, 22}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Teams - - - - 1 - 10 - - - - 292 - {{20, 436}, {433, 66}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Select which teams are playing! Add hogs by tapping on them and set their color to figure friend and foe teams out. AI teams will appear with a small robot badge next their name. - - - - 1 - 10 - 0 - - - - 292 - {{13, 3}, {440, 60}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Here you can find help for the game configuration options. You can customize almost everything in the settings page. - - Helvetica-Oblique - 16 - 16 - - - - 1 - 10 - 0 - 1 - - - {480, 276} - - YES - YES - IBCocoaTouchFramework - - - {480, 276} - - - 2 - MC45OTYwNzg0OTEyIDAuOTg4MjM1MzU0NCAxAA - - NO - NO - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - scrollView - - - - 95 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - 60 - - - YES - - - - - - - - - - - - - - - - - - - - - 61 - - - - - 62 - - - - - 63 - - - - - 64 - - - - - 65 - - - - - 66 - - - - - 67 - - - - - 68 - - - - - 69 - - - - - 70 - - - - - 71 - - - - - 72 - - - - - 73 - - - - - 74 - - - - - 75 - - - - - 76 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 60.IBPluginDependency - 60.IBViewBoundsToFrameTransform - 61.IBPluginDependency - 61.IBViewBoundsToFrameTransform - 62.IBPluginDependency - 62.IBViewBoundsToFrameTransform - 63.IBPluginDependency - 63.IBViewBoundsToFrameTransform - 64.IBPluginDependency - 64.IBViewBoundsToFrameTransform - 65.IBPluginDependency - 65.IBViewBoundsToFrameTransform - 66.IBPluginDependency - 66.IBViewBoundsToFrameTransform - 67.IBPluginDependency - 67.IBViewBoundsToFrameTransform - 68.IBPluginDependency - 68.IBViewBoundsToFrameTransform - 69.IBPluginDependency - 69.IBViewBoundsToFrameTransform - 70.IBPluginDependency - 70.IBViewBoundsToFrameTransform - 71.IBPluginDependency - 71.IBViewBoundsToFrameTransform - 72.IBPluginDependency - 72.IBViewBoundsToFrameTransform - 73.IBPluginDependency - 73.IBViewBoundsToFrameTransform - 74.IBPluginDependency - 74.IBViewBoundsToFrameTransform - 75.IBPluginDependency - 75.IBViewBoundsToFrameTransform - 76.IBPluginDependency - 76.IBViewBoundsToFrameTransform - - - YES - HelpPageViewController - UIResponder - {{16, 775}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABEDIAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABC+AAAw0kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw14AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw9mAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw+6AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABByAAAwqYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAwxMAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAADCQAAAwqYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAADCQAAAwzcAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDAAAAw3AAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDAAAAw5aAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDOwAAw6OAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDOwAAw8WAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDDgAAw7UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDDQAAw/CAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAADBAAAAwlQAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 95 - - - - YES - - HelpPageViewController - UIViewController - - dismiss - id - - - dismiss - - dismiss - id - - - - scrollView - UIScrollView - - - scrollView - - scrollView - UIScrollView - - - - IBProjectSource - Classes/HelpPageViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - 123 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/MainMenuViewController-iPad.xib --- a/project_files/HedgewarsMobile/Resources/MainMenuViewController-iPad.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,629 +0,0 @@ - - - - 1056 - 10H574 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 292 - - YES - - - 274 - {1024, 768} - - NO - IBIPadFramework - - NSImage - background.png - - - - - 292 - {{383, 427}, {263, 244}} - - NO - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 215 - 0.0 - 0.0 - 0.0 - - 3 - MQA - - - 2 - MC45OTYwNzg0OTEyIDAuODAwMDAwMDcxNSAwLjAzOTIxNTY4NzY2AA - - - 3 - MC41AA - - - NSImage - localplayButton~ipad.png - - - - - 292 - {{795, 317}, {18, 19}} - - NO - 0.31690141558647156 - 3 - IBIPadFramework - 0 - 0 - - 3 - YES - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - - 292 - {{940, 686}, {64, 64}} - - NO - 2 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - settingsButton.png - - - - - 292 - {{20, 686}, {64, 64}} - - NO - 4 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - savesButton.png - - - - - 292 - {{242, 43}, {540, 300}} - - NO - IBIPadFramework - - NSImage - title~ipad.png - - - - {1024, 768} - - - 1 - MCAwIDAAA - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - switchViews: - - - 7 - - 47 - - - - switchViews: - - - 7 - - 48 - - - - switchViews: - - - 7 - - 54 - - - - switchViews: - - - 7 - - 89 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 39 - - - local - - - 45 - - - - - 52 - - - - - 37 - - - - - 88 - - - - - 90 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 37.IBPluginDependency - 39.IBPluginDependency - 45.IBPluginDependency - 45.IBViewBoundsToFrameTransform - 52.IBPluginDependency - 52.IBViewBoundsToFrameTransform - 88.IBPluginDependency - 88.IBViewBoundsToFrameTransform - 90.IBPluginDependency - 90.IBViewBoundsToFrameTransform - - - YES - MainMenuViewController - UIResponder - {{267, 388}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABERQAAw56AAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEaQAAxDsAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAxDsAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDbQAAw6qAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 90 - - - - YES - - MainMenuViewController - UIViewController - - switchViews: - id - - - switchViews: - - switchViews: - id - - - - IBProjectSource - Classes/MainMenuViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - background.png - localplayButton~ipad.png - savesButton.png - settingsButton.png - title~ipad.png - - - YES - {1024, 768} - {263, 244} - {64, 64} - {64, 64} - {540, 300} - - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/MainMenuViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Resources/MainMenuViewController-iPhone.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,647 +0,0 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 293 - - YES - - - 274 - {480, 320} - - - 3 - MCAwAA - - 4 - NO - IBCocoaTouchFramework - - NSImage - background~iphone.png - - - - - 293 - {{105, 20}, {270, 150}} - - NO - NO - 4 - NO - IBCocoaTouchFramework - - NSImage - title~iphone.png - - - - - 289 - {{190, 200}, {100, 100}} - - - 1 - MCAwIDAgMAA - - NO - NO - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - 3 - MQA - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - 3 - MC41AA - - - NSImage - localplayButton~iphone.png - - - - - 269 - {{396, 236}, {64, 64}} - - NO - NO - 2 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - settingsButton.png - - - - - 269 - {{20, 236}, {64, 64}} - - NO - NO - 4 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - savesButton.png - - - - - 292 - {{20, 19}, {18, 19}} - - NO - 0.5 - 3 - IBCocoaTouchFramework - 0 - 0 - - 3 - YES - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - - {480, 320} - - - 1 - MCAwIDAAA - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - switchViews: - - - 7 - - 30 - - - - switchViews: - - - 7 - - 40 - - - - switchViews: - - - 7 - - 42 - - - - switchViews: - - - 7 - - 44 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 23 - - - - - 22 - - - - - 41 - - - - - 43 - - - - - 24 - - - - - 28 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 22.IBPluginDependency - 22.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - 24.IBPluginDependency - 24.IBViewBoundsToFrameTransform - 28.IBPluginDependency - 28.IBViewBoundsToFrameTransform - 41.IBPluginDependency - 41.IBViewBoundsToFrameTransform - 43.IBPluginDependency - 43.IBViewBoundsToFrameTransform - - - YES - MainMenuViewController - UIResponder - {{517, 519}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw5UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCygAAwzcAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDPgAAw5UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDxgAAw5iAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBcAAAwhAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBoAAAw5iAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 45 - - - - YES - - MainMenuViewController - UIViewController - - switchViews: - id - - - switchViews: - - switchViews: - id - - - - IBProjectSource - Classes/MainMenuViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - background~iphone.png - localplayButton~iphone.png - savesButton.png - settingsButton.png - title~iphone.png - - - YES - {480, 320} - {100, 100} - {64, 64} - {64, 64} - {270, 150} - - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib --- a/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPad.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1048 +0,0 @@ - - - - 1056 - 10K540 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 292 - {1024, 768} - - NO - NO - IBIPadFramework - - NSImage - background.png - - - - - 289 - {{724, 166}, {280, 30}} - - NO - IBIPadFramework - 2 - 4 - 1 - - YES - Random - Map - Maze - Mission - - - YES - - - - - - - YES - - - - - - - YES - {0, 0} - {0, 0} - {0, 0} - {0, 0} - - - YES - - - - - - - 3 - MC42NjY2NjY2NjY3AA - - - - - 292 - {{263, 723}, {149, 23}} - - NO - IBIPadFramework - 0 - 0 - 0.05000000074505806 - 0.05000000074505806 - - - - 289 - {{736, 26}, {256, 128}} - - NO - YES - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 4 - 4 - 4 - 4 - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - - - 292 - {{778, 724}, {42, 21}} - - NO - YES - 7 - NO - IBIPadFramework - ... - - Helvetica-Bold - 17 - 16 - - - 2 - MC45MTc2NDcxMjMzIDAuNjc0NTA5ODIzMyAwAA - - - 1 - 10 - 1 - - - - 292 - {{112, 720}, {145, 29}} - - NO - YES - 7 - NO - IBIPadFramework - Label - - Helvetica-Oblique - 18 - 16 - - - 2 - MC45MTM3MjU1NTQ5IDAuNzMzMzMzMzQ5MiAwLjAxMTc2NDcwNzA0AA - - - 1 - 10 - 1 - - - - 292 - {{357, 28}, {309, 165}} - - NO - NO - IBIPadFramework - - NSImage - title.png - - - - - 274 - {{714, 225}, {300, 445}} - - - 3 - MCAwAA - - YES - YES - IBIPadFramework - YES - 1 - 2 - 0 - YES - 45 - - - - 292 - {{441, 702}, {142, 64}} - - NO - 1 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - startGameButton.png - - - - - 292 - {{10, 693}, {64, 64}} - - NO - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - backButton.png - - - - - 292 - {{950, 693}, {64, 64}} - - NO - 2 - IBIPadFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - helpButton.png - - - - {1024, 768} - - - 2 - MC44MzkyMTU3NTU1IDAuODQ3MDU4ODkyMyAwLjg3MDU4ODMwMjYAA - - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - previewButton - - - - 13 - - - - maxLabel - - - - 16 - - - - sizeLabel - - - - 18 - - - - sliderChanged: - - - 13 - - 19 - - - - sliderEndedChanging: - - - 7 - - 20 - - - - segmentedControl - - - - 21 - - - - segmentedControlChanged: - - - 13 - - 22 - - - - slider - - - - 23 - - - - dataSource - - - - 67 - - - - delegate - - - - 68 - - - - tableView - - - - 69 - - - - buttonPressed: - - - 7 - - 73 - - - - buttonPressed: - - - 7 - - 74 - - - - buttonPressed: - - - 7 - - 77 - - - - mapButtonPressed - - - 7 - - 113 - - - - delegate - - - - 114 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 1 - - - YES - - - - - - - - - - - - - - - - 75 - - - - - 72 - - - - - 70 - - - - - 66 - - - - - 57 - - - - - 17 - - - - - 11 - - - - - 9 - - - - - 8 - - - - - 7 - - - - - 50 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 11.IBPluginDependency - 17.IBPluginDependency - 50.IBPluginDependency - 57.IBPluginDependency - 66.IBPluginDependency - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 70.IBPluginDependency - 72.IBPluginDependency - 75.IBPluginDependency - 8.IBPluginDependency - 9.CustomClassName - 9.IBPluginDependency - - - YES - MapConfigViewController - UIResponder - {{288, 236}, {1024, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABENUAAw0IAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - MapPreviewButtonView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 119 - - - - YES - - MapConfigViewController - UIViewController - - YES - - YES - buttonPressed: - mapButtonPressed - segmentedControlChanged: - sliderChanged: - sliderEndedChanging: - - - YES - id - id - id - id - id - - - - YES - - YES - buttonPressed: - mapButtonPressed - segmentedControlChanged: - sliderChanged: - sliderEndedChanging: - - - YES - - buttonPressed: - id - - - mapButtonPressed - id - - - segmentedControlChanged: - id - - - sliderChanged: - id - - - sliderEndedChanging: - id - - - - - YES - - YES - maxLabel - previewButton - segmentedControl - sizeLabel - slider - tableView - - - YES - UILabel - MapPreviewButtonView - UISegmentedControl - UILabel - UISlider - UITableView - - - - YES - - YES - maxLabel - previewButton - segmentedControl - sizeLabel - slider - tableView - - - YES - - maxLabel - UILabel - - - previewButton - MapPreviewButtonView - - - segmentedControl - UISegmentedControl - - - sizeLabel - UILabel - - - slider - UISlider - - - tableView - UITableView - - - - - IBProjectSource - Classes/MapConfigViewController.h - - - - MapPreviewButtonView - UIButton - - delegate - id - - - delegate - - delegate - id - - - - IBProjectSource - Classes/MapPreviewButtonView.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISegmentedControl - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISegmentedControl.h - - - - UISlider - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISlider.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - backButton.png - background.png - helpButton.png - startGameButton.png - title.png - - - YES - {64, 64} - {1024, 768} - {64, 64} - {142, 64} - {270, 150} - - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Resources/MapConfigViewController-iPhone.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,949 +0,0 @@ - - - - 1056 - 10K540 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 292 - {480, 276} - - NO - IBCocoaTouchFramework - - NSImage - background~iphone.png - - - - - 292 - {{9, 14}, {270, 30}} - - NO - IBCocoaTouchFramework - 2 - 4 - 1 - - YES - Random - Map - Maze - Mission - - - YES - - - - - - - YES - - - - - - - YES - {0, 0} - {0, 0} - {0, 0} - {0, 0} - - - YES - - - - - - - 3 - MC42NjY2NjY2NjY3AA - - - - - 292 - {{119, 207}, {149, 23}} - - NO - IBCocoaTouchFramework - 0 - 0 - 0.05000000074505806 - 0.05000000074505806 - - - - 292 - {{16, 58}, {256, 128}} - - NO - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - 3 - MQA - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - 3 - MC41AA - - - - - 292 - {{58, 221}, {48, 35}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - ... - - Helvetica-Bold - 17 - 16 - - - 2 - MC45NDkwMTk2NzA1IDAuNzY4NjI3NTI0NCAwAA - - - 1 - 10 - 1 - - - - 292 - {{109, 237}, {169, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Label - - Helvetica-Oblique - 22 - 16 - - - 2 - MC45NDExNzY1MzM3IDAuODE1Njg2MzQ1MSAwAA - - - 1 - 10 - 1 - - - - 274 - {{284, 0}, {196, 276}} - - - 3 - MCAwAA - - NO - YES - NO - IBCocoaTouchFramework - NO - 1 - 2 - 0 - YES - 44 - 10 - 10 - - - - 292 - {{-9, 225}, {92, 27}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Max - - Helvetica-BoldOblique - 18 - 16 - - - 2 - MC45NDkwMTk2NzA1IDAuNzY4NjI3NTI0NCAwAA - - - 1 - 10 - 1 - - - {480, 276} - - - - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - previewButton - - - - 13 - - - - maxLabel - - - - 16 - - - - sizeLabel - - - - 18 - - - - sliderChanged: - - - 13 - - 19 - - - - sliderEndedChanging: - - - 7 - - 20 - - - - segmentedControl - - - - 21 - - - - segmentedControlChanged: - - - 13 - - 22 - - - - slider - - - - 23 - - - - dataSource - - - - 26 - - - - delegate - - - - 27 - - - - tableView - - - - 32 - - - - mapButtonPressed - - - 7 - - 33 - - - - delegate - - - - 34 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 7 - - - - - 8 - - - - - 9 - - - - - 11 - - - - - 17 - - - - - 25 - - - Table View (Themes) - - - 35 - - - - - 36 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 11.IBPluginDependency - 11.IBViewBoundsToFrameTransform - 17.IBPluginDependency - 17.IBViewBoundsToFrameTransform - 25.IBPluginDependency - 25.IBViewBoundsToFrameTransform - 35.IBPluginDependency - 35.IBViewBoundsToFrameTransform - 36.IBPluginDependency - 36.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 8.IBPluginDependency - 9.CustomClassName - 9.IBPluginDependency - 9.IBViewBoundsToFrameTransform - - - YES - MapConfigViewController - UIResponder - {{790, 298}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABB+AAAw4QAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCyAAAw2YAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDjgAAw4kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAAAAAAAAw4kAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBMAAAw2gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBUAAAwigAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - MapPreviewButtonView - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABBUAAAwxIAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 36 - - - - YES - - MapConfigViewController - UIViewController - - YES - - YES - buttonPressed: - mapButtonPressed - segmentedControlChanged: - sliderChanged: - sliderEndedChanging: - - - YES - id - id - id - id - id - - - - YES - - YES - buttonPressed: - mapButtonPressed - segmentedControlChanged: - sliderChanged: - sliderEndedChanging: - - - YES - - buttonPressed: - id - - - mapButtonPressed - id - - - segmentedControlChanged: - id - - - sliderChanged: - id - - - sliderEndedChanging: - id - - - - - YES - - YES - maxLabel - previewButton - segmentedControl - sizeLabel - slider - tableView - - - YES - UILabel - MapPreviewButtonView - UISegmentedControl - UILabel - UISlider - UITableView - - - - YES - - YES - maxLabel - previewButton - segmentedControl - sizeLabel - slider - tableView - - - YES - - maxLabel - UILabel - - - previewButton - MapPreviewButtonView - - - segmentedControl - UISegmentedControl - - - sizeLabel - UILabel - - - slider - UISlider - - - tableView - UITableView - - - - - IBProjectSource - Classes/MapConfigViewController.h - - - - MapPreviewButtonView - UIButton - - delegate - id - - - delegate - - delegate - id - - - - IBProjectSource - Classes/MapPreviewButtonView.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UISegmentedControl - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISegmentedControl.h - - - - UISlider - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UISlider.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - background~iphone.png - {480, 320} - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/OverlayViewController.xib --- a/project_files/HedgewarsMobile/Resources/OverlayViewController.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1014 +0,0 @@ - - - - 1056 - 10H574 - 823 - 1038.35 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 268 - {{0, 229}, {50, 50}} - - NO - NO - YES - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - - 3 - MQA - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - 3 - MC41AA - - - NSImage - arrowLeft.png - - - - - 268 - {{87, 229}, {50, 50}} - - NO - NO - YES - 1 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - arrowRight.png - - - - - 265 - {{412, 236}, {64, 64}} - - NO - NO - YES - 5 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - joyButtonBackJump.png - - - - - 265 - {{365, 203}, {64, 64}} - - NO - NO - YES - 6 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - joyButtonForwardJump.png - - - - - 265 - {{354, 256}, {64, 64}} - - NO - NO - YES - 4 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - joyButtonAttack.png - - - - - 268 - {{44, 187}, {50, 50}} - - NO - NO - YES - 2 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - arrowUp.png - - - - - 268 - {{44, 270}, {50, 50}} - - NO - NO - YES - 3 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MyAwLjMwOTgwMzkzIDAuNTIxNTY4NjYAA - - - - NSImage - arrowDown.png - - - - - 289 - {{341, 0}, {64, 50}} - - NO - YES - 10 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - cornerButton.png - - - - - 289 - {{402, 0}, {78, 50}} - - NO - YES - 11 - IBCocoaTouchFramework - 0 - 0 - - - - 1 - MC4xOTYwNzg0MzQ2IDAuMzA5ODAzOTMyOSAwLjUyMTU2ODY1NgA - - - - NSImage - ammoButton.png - - - - {480, 320} - - - 3 - MSAwAA - - NO - YES - NO - YES - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - buttonPressed: - - - 1 - - 8 - - - - buttonReleased: - - - 9 - - 9 - - - - buttonReleased: - - - 7 - - 10 - - - - buttonReleased: - - - 8 - - 11 - - - - buttonReleased: - - - 8 - - 13 - - - - buttonReleased: - - - 9 - - 14 - - - - buttonPressed: - - - 1 - - 15 - - - - buttonReleased: - - - 7 - - 16 - - - - buttonReleased: - - - 9 - - 18 - - - - buttonPressed: - - - 1 - - 19 - - - - buttonReleased: - - - 8 - - 20 - - - - buttonReleased: - - - 7 - - 21 - - - - buttonReleased: - - - 8 - - 23 - - - - buttonReleased: - - - 9 - - 24 - - - - buttonPressed: - - - 1 - - 25 - - - - buttonReleased: - - - 7 - - 26 - - - - buttonReleased: - - - 9 - - 44 - - - - buttonPressed: - - - 1 - - 45 - - - - buttonReleased: - - - 8 - - 46 - - - - buttonReleased: - - - 7 - - 47 - - - - buttonReleased: - - - 8 - - 49 - - - - buttonReleased: - - - 7 - - 50 - - - - buttonReleased: - - - 9 - - 51 - - - - buttonPressed: - - - 1 - - 52 - - - - buttonReleased: - - - 9 - - 54 - - - - buttonReleased: - - - 7 - - 55 - - - - buttonPressed: - - - 1 - - 56 - - - - buttonReleased: - - - 8 - - 57 - - - - buttonPressed: - - - 7 - - 60 - - - - buttonPressed: - - - 7 - - 68 - - - - buttonReleased: - - - 9 - - 69 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 4 - - - left - - - 12 - - - right - - - 17 - - - up - - - 22 - - - down - - - 43 - - - push2 - - - 48 - - - push1 - - - 53 - - - push3 - - - 58 - - - - - 67 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 12.IBPluginDependency - 12.IBViewBoundsToFrameTransform - 17.IBPluginDependency - 22.IBPluginDependency - 4.IBPluginDependency - 43.IBPluginDependency - 48.IBPluginDependency - 53.IBPluginDependency - 58.IBPluginDependency - 67.IBPluginDependency - - - YES - OverlayViewController - UIResponder - {{690, 375}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCkAAAw5SAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 72 - - - - YES - - OverlayViewController - UIViewController - - YES - - YES - buttonPressed: - buttonReleased: - - - YES - id - id - - - - YES - - YES - buttonPressed: - buttonReleased: - - - YES - - buttonPressed: - id - - - buttonReleased: - id - - - - - IBProjectSource - Classes/OverlayViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - YES - - YES - ammoButton.png - arrowDown.png - arrowLeft.png - arrowRight.png - arrowUp.png - cornerButton.png - joyButtonAttack.png - joyButtonBackJump.png - joyButtonForwardJump.png - - - YES - {78, 50} - {50, 50} - {50, 50} - {50, 50} - {50, 50} - {60, 50} - {64, 64} - {64, 64} - {64, 64} - - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/RestoreViewController-iPad.xib --- a/project_files/HedgewarsMobile/Resources/RestoreViewController-iPad.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,616 +0,0 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 274 - - YES - - - 302 - {{84, 517}, {151, 37}} - - NO - IBIPadFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 1 - Dismiss - - 3 - MQA - - - 1 - MCAwIDAuNTAxOTYwODE0AA - - - 3 - MC41AA - - - - - 299 - {{308, 517}, {151, 37}} - - NO - 1 - IBIPadFramework - 0 - 0 - - 1 - Restore - - - - - - - 315 - {{216, 35}, {108, 29}} - - NO - YES - 7 - NO - IBIPadFramework - Hmm... - - Helvetica-Bold - 24 - 16 - - - 2 - MSAwLjc4MDM5MjIyOTYgMAA - - - 1 - 10 - 1 - - - - 307 - {{80, 375}, {380, 96}} - - NO - YES - 7 - NO - IBIPadFramework - Would you like to restore it? - - Helvetica - 18 - 16 - - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - 1 - 10 - 4 - 1 - - - - 307 - {{80, 87}, {380, 96}} - - NO - YES - 7 - NO - IBIPadFramework - It appears you didn't complete your last game! - - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - 1 - 10 - 4 - 1 - - - - 300 - {{150, 191}, {240, 160}} - - NO - IBIPadFramework - - NSImage - denied.png - - - - {540, 640} - - - 4 - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - buttonReleased: - - - 7 - - 21 - - - - buttonReleased: - - - 7 - - 22 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 15 - - - - - 16 - - - - - 18 - - - - - 19 - - - - - 20 - - - - - 23 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 15.IBPluginDependency - 15.IBViewBoundsToFrameTransform - 16.IBPluginDependency - 16.IBViewBoundsToFrameTransform - 18.IBPluginDependency - 18.IBViewBoundsToFrameTransform - 19.IBPluginDependency - 19.IBViewBoundsToFrameTransform - 20.IBPluginDependency - 20.IBViewBoundsToFrameTransform - 23.IBPluginDependency - 23.IBViewBoundsToFrameTransform - - - YES - RestoreViewController - UIResponder - {{566, 244}, {540, 640}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDlIAAw2gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABEAkAAw2gAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDXAAAw3UAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUKgAABDmYAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABDFgAAw8cAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - P4AAAL+AAABCoAAAw9uAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 23 - - - - YES - - RestoreViewController - UIViewController - - buttonReleased: - id - - - buttonReleased: - - buttonReleased: - id - - - - IBProjectSource - Classes/RestoreViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - denied.png - {240, 160} - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/RestoreViewController-iPhone.xib --- a/project_files/HedgewarsMobile/Resources/RestoreViewController-iPhone.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,582 +0,0 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBCocoaTouchFramework - - - IBFirstResponder - IBCocoaTouchFramework - - - - 274 - - YES - - - 300 - {{20, 20}, {240, 160}} - - NO - IBCocoaTouchFramework - - NSImage - denied.png - - - - - 315 - {{310, 32}, {108, 29}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - Hmm... - - Helvetica-Bold - 24 - 16 - - - 2 - MSAwLjgyNzQ1MTA1MDMgMAA - - - 3 - MQA - - 1 - 10 - 1 - - - - 307 - {{268, 74}, {192, 96}} - - NO - YES - 7 - NO - IBCocoaTouchFramework - It appears you didn't complete your last game! Would you like to restore it? - - Helvetica - 18 - 16 - - - 1 - MC45MDE5NjA3OTAyIDAuOTAxOTYwNzkwMiAwLjkwMTk2MDc5MDIAA - - - 1 - 10 - 4 - 1 - - - - 302 - {{53, 229}, {151, 37}} - - NO - IBCocoaTouchFramework - 0 - 0 - - Helvetica-Bold - 15 - 16 - - 1 - Dismiss - - - 1 - MCAwIDAuNTAxOTYwODE0AA - - - 3 - MC41AA - - - - - 299 - {{277, 229}, {151, 37}} - - NO - 1 - IBCocoaTouchFramework - 0 - 0 - - 1 - Restore - - - - - - {480, 320} - - - 4 - - 3 - - IBCocoaTouchFramework - - - - - YES - - - view - - - - 3 - - - - buttonReleased: - - - 7 - - 11 - - - - buttonReleased: - - - 7 - - 12 - - - - - YES - - 0 - - - - - - 1 - - - YES - - - - - - - - - - -1 - - - File's Owner - - - -2 - - - - - 5 - - - - - 6 - - - - - 7 - - - - - 8 - - - - - 10 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 1.IBEditorWindowLastContentRect - 1.IBPluginDependency - 10.IBPluginDependency - 10.IBViewBoundsToFrameTransform - 5.IBPluginDependency - 5.IBViewBoundsToFrameTransform - 6.IBPluginDependency - 6.IBViewBoundsToFrameTransform - 7.IBPluginDependency - 7.IBViewBoundsToFrameTransform - 8.IBPluginDependency - 8.IBViewBoundsToFrameTransform - - - YES - RestoreViewController - UIResponder - {{206, 423}, {480, 320}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUOKgABDZQAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUGgAABBoAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUObAABCAAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUOGAABClAAAA - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - AUJUAABDZQAAA - - - - - YES - - - YES - - - - - YES - - - YES - - - - 14 - - - - YES - - RestoreViewController - UIViewController - - buttonReleased: - id - - - buttonReleased: - - buttonReleased: - id - - - - IBProjectSource - Classes/RestoreViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIButton - UIControl - - IBFrameworkSource - UIKit.framework/Headers/UIButton.h - - - - UIControl - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIControl.h - - - - UIImageView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIImageView.h - - - - UILabel - UIView - - IBFrameworkSource - UIKit.framework/Headers/UILabel.h - - - - UIResponder - NSObject - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBCocoaTouchFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - - denied.png - {240, 160} - - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/SavedGamesViewController.xib --- a/project_files/HedgewarsMobile/Resources/SavedGamesViewController.xib Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,574 +0,0 @@ - - - - 1056 - 10K549 - 823 - 1038.36 - 461.00 - - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - 132 - - - YES - - - - YES - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - YES - - YES - - - YES - - - - YES - - IBFilesOwner - IBIPadFramework - - - IBFirstResponder - IBIPadFramework - - - - 292 - - YES - - - 290 - {768, 44} - - NO - 458912 - IBIPadFramework - - YES - - IBIPadFramework - 1 - - 0 - - - IBIPadFramework - - 5 - - - 1 - Clear All - IBIPadFramework - 1 - - - - - - - 274 - {{0, 44}, {768, 724}} - - - 1 - MCAwIDAgMAA - - YES - IBIPadFramework - YES - 1 - 2 - 0 - YES - 44 - 10 - 10 - - - {768, 768} - - - 3 - MQA - - NO - - 3 - - IBIPadFramework - - - - - YES - - - view - - - - 3 - - - - buttonPressed: - - - - 6 - - - - dataSource - - - - 8 - - - - delegate - - - - 9 - - - - tableView - - - - 10 - - - - buttonPressed: - - - - 17 - - - - - YES - - 0 - - - - - - -1 - - - File's Owner - - - -2 - - - - - 2 - - - YES - - - - - - - 4 - - - YES - - - - - - - - 5 - - - - - 7 - - - - - 13 - - - - - 15 - - - - - - - YES - - YES - -1.CustomClassName - -2.CustomClassName - 13.IBPluginDependency - 15.IBPluginDependency - 2.IBEditorWindowLastContentRect - 2.IBPluginDependency - 4.IBPluginDependency - 5.IBPluginDependency - 7.IBPluginDependency - - - YES - SavedGamesViewController - UIResponder - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - {{467, 276}, {768, 768}} - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - com.apple.InterfaceBuilder.IBCocoaTouchPlugin - - - - YES - - - YES - - - - - YES - - - YES - - - - 17 - - - - YES - - SavedGamesViewController - UIViewController - - YES - - YES - buttonPressed: - clearAll: - toggleEdit: - - - YES - id - id - id - - - - YES - - YES - buttonPressed: - clearAll: - toggleEdit: - - - YES - - buttonPressed: - id - - - clearAll: - id - - - toggleEdit: - id - - - - - tableView - UITableView - - - tableView - - tableView - UITableView - - - - IBProjectSource - Classes/SavedGamesViewController.h - - - - - YES - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSError.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSFileManager.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueCoding.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyValueObserving.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSKeyedArchiver.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSObject.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSRunLoop.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSThread.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURL.h - - - - NSObject - - IBFrameworkSource - Foundation.framework/Headers/NSURLConnection.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CAAnimation.h - - - - NSObject - - IBFrameworkSource - QuartzCore.framework/Headers/CALayer.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIAccessibility.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UINibLoading.h - - - - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIResponder.h - - - - UIBarButtonItem - UIBarItem - - IBFrameworkSource - UIKit.framework/Headers/UIBarButtonItem.h - - - - UIBarItem - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UIBarItem.h - - - - UIResponder - NSObject - - - - UIScrollView - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIScrollView.h - - - - UISearchBar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UISearchBar.h - - - - UISearchDisplayController - NSObject - - IBFrameworkSource - UIKit.framework/Headers/UISearchDisplayController.h - - - - UITableView - UIScrollView - - IBFrameworkSource - UIKit.framework/Headers/UITableView.h - - - - UIToolbar - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIToolbar.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UIPrintFormatter.h - - - - UIView - - IBFrameworkSource - UIKit.framework/Headers/UITextField.h - - - - UIView - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIView.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UINavigationController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UIPopoverController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UISplitViewController.h - - - - UIViewController - - IBFrameworkSource - UIKit.framework/Headers/UITabBarController.h - - - - UIViewController - UIResponder - - IBFrameworkSource - UIKit.framework/Headers/UIViewController.h - - - - - 0 - IBIPadFramework - - com.apple.InterfaceBuilder.CocoaTouchPlugin.iPhoneOS - - - - com.apple.InterfaceBuilder.CocoaTouchPlugin.InterfaceBuilder3 - - - YES - ../Hedgewars.xcodeproj - 3 - 132 - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Settings/Teams/Ninjas.plist --- a/project_files/HedgewarsMobile/Resources/Settings/Teams/Ninjas.plist Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ - - - - - flag - japan - fort - Plane - grave - bp2 - hash - 0 - hedgehogs - - - hat - NinjaFull - hogname - Ukemi - level - 0 - - - hat - NinjaStraight - hogname - Godai - level - 0 - - - hat - NinjaTriangle - hogname - Ninpo - level - 0 - - - hat - NinjaStraight - hogname - Shinobi - level - 0 - - - hat - NinjaFull - hogname - Tatsujin - level - 0 - - - hat - NinjaTriangle - hogname - Arashi - level - 0 - - - hat - NinjaStraight - hogname - Bushi - level - 0 - - - hat - NinjaFull - hogname - Itami - level - 0 - - - voicepack - Default - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Settings/Teams/Pirates.plist --- a/project_files/HedgewarsMobile/Resources/Settings/Teams/Pirates.plist Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ - - - - - flag - cm_pirate - fort - Plane - grave - chest - hash - 0 - hedgehogs - - - hat - pirate_jack_bandana - hogname - Toothless Wayne - level - 0 - - - hat - pirate_jack - hogname - Long-nose Kidd - level - 0 - - - hat - dwarf - hogname - Eye-patch Jim - level - 0 - - - hat - pirate_jack - hogname - Rackham Blood - level - 0 - - - hat - dwarf - hogname - One-eyed Ayee - level - 0 - - - hat - pirate_jack_bandana - hogname - Dirty Ben - level - 0 - - - hat - pirate_jack - hogname - Morris - level - 0 - - - hat - dwarf - hogname - Cruise Seymour - level - 0 - - - voicepack - Pirate - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Settings/Teams/Robots.plist --- a/project_files/HedgewarsMobile/Resources/Settings/Teams/Robots.plist Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,83 +0,0 @@ - - - - - flag - cm_binary - fort - UFO - grave - Rip - hash - 0 - hedgehogs - - - hat - cyborg - hogname - HAL - level - 4 - - - hat - cyborg - hogname - R2-D2 - level - 4 - - - hat - cyborg - hogname - Wall-E - level - 4 - - - hat - cyborg - hogname - Robocob - level - 4 - - - hat - cyborg - hogname - Optimus Prime - level - 4 - - - hat - cyborg - hogname - C-3PO - level - 4 - - - hat - cyborg - hogname - Terminator - level - 4 - - - hat - cyborg - hogname - KITT - level - 4 - - - voicepack - Robot - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Settings/basicFlags.plist --- a/project_files/HedgewarsMobile/Resources/Settings/basicFlags.plist Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,270 +0,0 @@ - - - - - - default - 100 - image - Health - max - 200 - min - 50 - title - Initial Health - - - checkOverMax - - times1000 - - command - e$damagepct - default - 100 - image - Damage - max - 300 - min - 10 - title - Damage Modifier - - - checkOverMax - - times1000 - - command - e$turntime - default - 45 - image - Time - max - 100 - min - 1 - title - Turn Time - - - checkOverMax - - times1000 - - command - e$sd_turns - default - 15 - image - SuddenDeath - max - 50 - min - 0 - title - Sudden Death Timeout - - - checkOverMax - - times1000 - - command - e$waterrise - default - 47 - image - SuddenDeath - max - 100 - min - 0 - title - Water Rise Amount - - - checkOverMax - - times1000 - - command - e$healthdec - default - 5 - image - SuddenDeath - max - 100 - min - 0 - title - Health Decrease - - - checkOverMax - - times1000 - - command - e$ropepct - default - 100 - image - Rope - max - 999 - min - 25 - title - Rope Length (%) - - - checkOverMax - - times1000 - - command - e$casefreq - default - 5 - image - Box - max - 9 - min - 0 - title - Crate Drop Turns - - - checkOverMax - - times1000 - - command - e$healthprob - default - 35 - image - Health - max - 100 - min - 0 - title - Health Kit Probability (%) - - - checkOverMax - - times1000 - - command - e$hcaseamount - default - 25 - image - Health - max - 200 - min - 0 - title - Health Amount in Kit - - - checkOverMax - - times1000 - - command - e$minestime - default - 3 - image - Time - max - 5 - min - -1 - title - Mines Time - - - checkOverMax - - times1000 - - command - e$minesnum - default - 4 - image - Mine - max - 80 - min - 0 - title - Mines Number - - - checkOverMax - - times1000 - - command - e$minedudpct - default - 0 - image - Dud - max - 100 - min - 0 - title - Dud Mines Probability (%) - - - checkOverMax - - times1000 - - command - e$explosives - default - 2 - image - Damage - max - 40 - min - 0 - title - Explosives - - - checkOverMax - - times1000 - - command - e$getawaytime - default - 100 - image - Time - max - 999 - min - 0 - title - Get Away Time (%) - - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Settings/credits.plist --- a/project_files/HedgewarsMobile/Resources/Settings/credits.plist Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,128 +0,0 @@ - - - - - - Andrey "UnC0Rr" Korotaev - Igor "Displacer" Ulyanov - Derek "Nemo" Pomery - Martin "Affect" Boze - David "Krawek" Cuadrado - Martin "Ttsmj" Minarik - Kristian "TheXception" Lehmann - Vittorio "Koda" Giovara - Mario "Smaxx" Liebisch - Carlos "Palewolf" Vives - Richard "Sheepluva" Korlyi - Henning "Prg" Kühn - Henrik "Henek" Rostedt - John "Mikade" Lambert - Mayur "Zorg" Pawashe - Richard "Xeli" Deurwaarder - - - John "Fizzy" Dum - Joshua Frese - Stanko Tadić - Julien Koesten - Joshua O'Sullivan - Nils Luck - Trey Perry - - - Stephen "Armagon" Alexander - John "Fizzy" Dum - Jonatan Nilsson - Daniel Martin - - - Romulo Fernandes Machado - Svetoslav Stefanov - Petr Řezáček - Jie Luo - Andrey Korotaev - Nina Kuisma - Antoine Turmel - Peter Hüwe, Mario Liebisch, Richard Karolyi - Talos Kriti - Luca Bonora, Marco Bresciani - Adam Etienne - Anthony Bellew - Lukas Urbonas - Maciej Mroziński, Wojciech Latkowski, Piotr Mitana, Maciej Górny - Fábio Canário - Andrey Korotaev - Jose Riha - Carlos Vives - Niklas Grahn, Henrik Rostedt - Eugene V. Lyubimkin, Igor Paliychuk, Eugene Sakara - - - Aleksey Andreev - Aleksander Rudalev - Natasha Korotaeva - Adam Higerd - - - Engine, frontend, net server - Many desktop frontend improvements - Many engine and desktop frontend improvements - Drillrocket, Ballgun, RC Plane weapons - Mine number and time game settings - Desktop frontend improvements - Desktop frontend improvements - Mac OS X and iPhone version - Many engine and desktop frontend improvements - Gamepad and Lua integration - Many engine improvements and graphics - Maze maps - Engine and desktop frontend improvements - Lua game modes and missions - Desktop frontend improvements - Android port - - - Main graphics - - - - - - Some hats - - - Hedgehogs voice - - - - - - Brazilian Portuguese - Bulgarian - Czech - Chinese - English - Finnish - French - German - Greek - Italian - Japanese - Korean - Lithuanian - Polish - Portuguese - Russian - Slovak - Spanish - Swedish - Ukrainian - - - - - - - - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/Settings/gameMods.plist --- a/project_files/HedgewarsMobile/Resources/Settings/gameMods.plist Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,206 +0,0 @@ - - - - - - description - Land can not be destroyed - image - Solid - title - Solid Land - - - description - Add an indestructable border around the terrain - image - Border - title - Add Border - - - description - Teams will start on opposite sides of the terrain - image - TeamsDivide - title - Divide Team (max 2 teams) - - - description - Lower gravity - image - LowGravity - title - Low Gravity - - - description - Assisted aiming with laser sight - image - LaserSight - title - Laser Sight - - - description - All hogs have a personal forcefield - image - Invulnerable - title - Invulnerable - - - description - All (living) hedgehogs are fully restored at the end of turn - image - ResetHealth - title - Reset Health - - - description - Gain 80% of the damage you do back in health - image - Vampiric - title - Vampirism Mode - - - description - Share your opponents pain, share their damage - image - Karma - title - Karma Mode - - - description - Your hogs are unable to move, test your aim - image - Artillery - title - Artillery Mode - - - description - Defend your fort and destroy the opponents - image - Forts - title - Fort Mode - - - description - Order of play is random instead of in room order - image - RandomOrder - title - Random Order - - - description - Play with a King; when he dies, your side loses - image - King - title - King Mode - - - description - Take turns placing your hedgehogs pre-game - image - PlaceHog - title - Place Hedgehogs - - - description - Ammo is shared between all clan teams - image - SharedAmmo - title - Clan Shares Ammo - - - description - Disable girders when generating random maps - image - DisableGirders - title - Disable Girders - - - description - Disable land objects when generating maps - image - DisableLandObjects - title - Disable Land Objects - - - description - AI-controlled hogs respawn on death - image - AISurvival - title - AI Survival Mode - - - description - Attacking does not end your turn - image - InfAttack - title - Unlimited Attacks - - - description - Weapons are reset to starting values each turn - image - ResetWeps - title - Reset Weapons - - - description - Each hedgehog has its own ammo - image - PerHogAmmo - title - Per Hedgehog Ammo - - - description - You will not have to worry about wind any more - image - NoWind - title - Disable Wind - - - description - Wind will affect almost everything - image - MoreWind - title - More Wind - - - description - Clan teams take turns sharing their time - image - TagTeam - title - Tag Team - - - description - Add an indestructible border along the bottom - image - BottomBorder - title - Bottom Border - - - diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/basicFlags.plist --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Resources/basicFlags.plist Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,270 @@ + + + + + + default + 100 + image + Health + max + 200 + min + 50 + title + Initial Health + + + checkOverMax + + times1000 + + command + e$damagepct + default + 100 + image + Damage + max + 300 + min + 10 + title + Damage Modifier + + + checkOverMax + + times1000 + + command + e$turntime + default + 45 + image + Time + max + 100 + min + 1 + title + Turn Time + + + checkOverMax + + times1000 + + command + e$sd_turns + default + 15 + image + SuddenDeath + max + 50 + min + 0 + title + Sudden Death Timeout + + + checkOverMax + + times1000 + + command + e$waterrise + default + 47 + image + SuddenDeath + max + 100 + min + 0 + title + Water Rise Amount + + + checkOverMax + + times1000 + + command + e$healthdec + default + 5 + image + SuddenDeath + max + 100 + min + 0 + title + Health Decrease + + + checkOverMax + + times1000 + + command + e$ropepct + default + 100 + image + Rope + max + 999 + min + 25 + title + Rope Length (%) + + + checkOverMax + + times1000 + + command + e$casefreq + default + 5 + image + Box + max + 9 + min + 0 + title + Crate Drop Turns + + + checkOverMax + + times1000 + + command + e$healthprob + default + 35 + image + Health + max + 100 + min + 0 + title + Health Kit Probability (%) + + + checkOverMax + + times1000 + + command + e$hcaseamount + default + 25 + image + Health + max + 200 + min + 0 + title + Health Amount in Kit + + + checkOverMax + + times1000 + + command + e$minestime + default + 3 + image + Time + max + 5 + min + -1 + title + Mines Time + + + checkOverMax + + times1000 + + command + e$minesnum + default + 4 + image + Mine + max + 80 + min + 0 + title + Mines Number + + + checkOverMax + + times1000 + + command + e$minedudpct + default + 0 + image + Dud + max + 100 + min + 0 + title + Dud Mines Probability (%) + + + checkOverMax + + times1000 + + command + e$explosives + default + 2 + image + Damage + max + 40 + min + 0 + title + Explosives + + + checkOverMax + + times1000 + + command + e$getawaytime + default + 100 + image + Time + max + 999 + min + 0 + title + Get Away Time (%) + + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/credits.plist --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Resources/credits.plist Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,128 @@ + + + + + + Andrey "UnC0Rr" Korotaev + Igor "Displacer" Ulyanov + Derek "Nemo" Pomery + Martin "Affect" Boze + David "Krawek" Cuadrado + Martin "Ttsmj" Minarik + Kristian "TheXception" Lehmann + Vittorio "Koda" Giovara + Mario "Smaxx" Liebisch + Carlos "Palewolf" Vives + Richard "Sheepluva" Korlyi + Henning "Prg" Kühn + Henrik "Henek" Rostedt + John "Mikade" Lambert + Mayur "Zorg" Pawashe + Richard "Xeli" Deurwaarder + + + John "Fizzy" Dum + Joshua Frese + Stanko Tadić + Julien Koesten + Joshua O'Sullivan + Nils Luck + Trey Perry + + + Stephen "Armagon" Alexander + John "Fizzy" Dum + Jonatan Nilsson + Daniel Martin + + + Romulo Fernandes Machado + Svetoslav Stefanov + Petr Řezáček + Jie Luo + Andrey Korotaev + Nina Kuisma + Antoine Turmel + Peter Hüwe, Mario Liebisch, Richard Karolyi + Talos Kriti + Luca Bonora, Marco Bresciani + Adam Etienne + Anthony Bellew + Lukas Urbonas + Maciej Mroziński, Wojciech Latkowski, Piotr Mitana, Maciej Górny + Fábio Canário + Andrey Korotaev + Jose Riha + Carlos Vives + Niklas Grahn, Henrik Rostedt + Eugene V. Lyubimkin, Igor Paliychuk, Eugene Sakara + + + Aleksey Andreev + Aleksander Rudalev + Natasha Korotaeva + Adam Higerd + + + Engine, frontend, net server + Many desktop frontend improvements + Many engine and desktop frontend improvements + Drillrocket, Ballgun, RC Plane weapons + Mine number and time game settings + Desktop frontend improvements + Desktop frontend improvements + Mac OS X and iPhone version + Many engine and desktop frontend improvements + Gamepad and Lua integration + Many engine improvements and graphics + Maze maps + Engine and desktop frontend improvements + Lua game modes and missions + Desktop frontend improvements + Android port + + + Main graphics + + + + + + Some hats + + + Hedgehogs voice + + + + + + Brazilian Portuguese + Bulgarian + Czech + Chinese + English + Finnish + French + German + Greek + Italian + Japanese + Korean + Lithuanian + Polish + Portuguese + Russian + Slovak + Spanish + Swedish + Ukrainian + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/HedgewarsMobile/Resources/gameMods.plist --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/project_files/HedgewarsMobile/Resources/gameMods.plist Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,206 @@ + + + + + + description + Land can not be destroyed + image + Solid + title + Solid Land + + + description + Add an indestructable border around the terrain + image + Border + title + Add Border + + + description + Teams will start on opposite sides of the terrain + image + TeamsDivide + title + Divide Team (max 2 teams) + + + description + Lower gravity + image + LowGravity + title + Low Gravity + + + description + Assisted aiming with laser sight + image + LaserSight + title + Laser Sight + + + description + All hogs have a personal forcefield + image + Invulnerable + title + Invulnerable + + + description + All (living) hedgehogs are fully restored at the end of turn + image + ResetHealth + title + Reset Health + + + description + Gain 80% of the damage you do back in health + image + Vampiric + title + Vampirism Mode + + + description + Share your opponents pain, share their damage + image + Karma + title + Karma Mode + + + description + Your hogs are unable to move, test your aim + image + Artillery + title + Artillery Mode + + + description + Defend your fort and destroy the opponents + image + Forts + title + Fort Mode + + + description + Order of play is random instead of in room order + image + RandomOrder + title + Random Order + + + description + Play with a King; when he dies, your side loses + image + King + title + King Mode + + + description + Take turns placing your hedgehogs pre-game + image + PlaceHog + title + Place Hedgehogs + + + description + Ammo is shared between all clan teams + image + SharedAmmo + title + Clan Shares Ammo + + + description + Disable girders when generating random maps + image + DisableGirders + title + Disable Girders + + + description + Disable land objects when generating maps + image + DisableLandObjects + title + Disable Land Objects + + + description + AI-controlled hogs respawn on death + image + AISurvival + title + AI Survival Mode + + + description + Attacking does not end your turn + image + InfAttack + title + Unlimited Attacks + + + description + Weapons are reset to starting values each turn + image + ResetWeps + title + Reset Weapons + + + description + Each hedgehog has its own ammo + image + PerHogAmmo + title + Per Hedgehog Ammo + + + description + You will not have to worry about wind any more + image + NoWind + title + Disable Wind + + + description + Wind will affect almost everything + image + MoreWind + title + More Wind + + + description + Clan teams take turns sharing their time + image + TagTeam + title + Tag Team + + + description + Add an indestructible border along the bottom + image + BottomBorder + title + Bottom Border + + + diff -r 74431bf4c632 -r 4e8816cf9459 project_files/hedgewars.pro --- a/project_files/hedgewars.pro Sun Oct 16 19:02:48 2011 +0200 +++ b/project_files/hedgewars.pro Sun Oct 16 21:03:30 2011 +0200 @@ -2,6 +2,13 @@ TARGET = hedgewars DEPENDPATH += ../QTfrontend/ INCLUDEPATH += ../QTfrontend/ +INCLUDEPATH += ../QTfrontend/model +INCLUDEPATH += ../QTfrontend/ui +INCLUDEPATH += ../QTfrontend/ui/widget +INCLUDEPATH += ../QTfrontend/ui/page +INCLUDEPATH += ../QTfrontend/ui/dialog +INCLUDEPATH += ../QTfrontend/net +INCLUDEPATH += ../QTfrontend/util INCLUDEPATH += /usr/local/include/SDL INCLUDEPATH += /usr/include/SDL INCLUDEPATH += ../misc/quazip/ @@ -15,110 +22,148 @@ QT += network QT += webkit -HEADERS += ../QTfrontend/KB.h ../QTfrontend/SDLs.h \ - ../QTfrontend/SquareLabel.h ../QTfrontend/about.h \ - ../QTfrontend/ammoSchemeModel.h ../QTfrontend/bgwidget.h \ - ../QTfrontend/binds.h ../QTfrontend/chatwidget.h \ - ../QTfrontend/fpsedit.h ../QTfrontend/frameTeam.h \ - ../QTfrontend/game.h ../QTfrontend/gamecfgwidget.h \ - ../QTfrontend/gameuiconfig.h ../QTfrontend/hats.h \ - ../QTfrontend/hedgehogerWidget.h ../QTfrontend/hwconsts.h \ - ../QTfrontend/hwform.h ../QTfrontend/hwmap.h \ - ../QTfrontend/igbox.h ../QTfrontend/input_ip.h \ - ../QTfrontend/itemNum.h ../QTfrontend/mapContainer.h \ - ../QTfrontend/misc.h ../QTfrontend/namegen.h \ - ../QTfrontend/netregister.h ../QTfrontend/netserver.h \ - ../QTfrontend/netserverslist.h ../QTfrontend/netudpserver.h \ - ../QTfrontend/netudpwidget.h ../QTfrontend/newnetclient.h \ - ../QTfrontend/proto.h \ - ../QTfrontend/sdlkeys.h ../QTfrontend/selectWeapon.h \ - ../QTfrontend/tcpBase.h \ - ../QTfrontend/team.h ../QTfrontend/teamselect.h \ - ../QTfrontend/teamselhelper.h ../QTfrontend/togglebutton.h \ - ../QTfrontend/ui_hwform.h ../QTfrontend/vertScrollArea.h \ - ../QTfrontend/weaponItem.h ../QTfrontend/xfire.h \ - ../QTfrontend/achievements.h \ - ../QTfrontend/drawmapwidget.h \ - ../QTfrontend/drawmapscene.h \ - ../QTfrontend/qaspectratiolayout.h \ - ../QTfrontend/pagetraining.h \ - ../QTfrontend/pagesingleplayer.h \ - ../QTfrontend/pageselectweapon.h \ - ../QTfrontend/pagescheme.h \ - ../QTfrontend/pageroomslist.h \ - ../QTfrontend/pageoptions.h \ - ../QTfrontend/pagenettype.h \ - ../QTfrontend/pagenetserver.h \ - ../QTfrontend/pagenetgame.h \ - ../QTfrontend/pagenet.h \ - ../QTfrontend/pagemultiplayer.h \ - ../QTfrontend/pagemain.h \ - ../QTfrontend/pageingame.h \ - ../QTfrontend/pageinfo.h \ - ../QTfrontend/pagedata.h \ - ../QTfrontend/pageeditteam.h \ - ../QTfrontend/pagedrawmap.h \ - ../QTfrontend/pageconnecting.h \ - ../QTfrontend/pagecampaign.h \ - ../QTfrontend/pageadmin.h \ - ../QTfrontend/pageplayrecord.h \ - ../QTfrontend/pagegamestats.h \ - ../QTfrontend/HWApplication.h \ +HEADERS += ../QTfrontend/model/themesmodel.h \ + ../QTfrontend/model/ammoSchemeModel.h \ + ../QTfrontend/model/netserverslist.h \ + ../QTfrontend/model/hats.h \ + ../QTfrontend/ui/page/pagedrawmap.h \ + ../QTfrontend/ui/page/pagedata.h \ + ../QTfrontend/ui/page/pagetraining.h \ + ../QTfrontend/ui/page/pageselectweapon.h \ + ../QTfrontend/ui/page/pagesingleplayer.h \ + ../QTfrontend/ui/page/pagenettype.h \ + ../QTfrontend/ui/page/pageingame.h \ + ../QTfrontend/ui/page/pageadmin.h \ + ../QTfrontend/ui/page/pagescheme.h \ + ../QTfrontend/ui/page/pagemultiplayer.h \ + ../QTfrontend/ui/page/pageplayrecord.h \ + ../QTfrontend/ui/page/pagemain.h \ + ../QTfrontend/ui/page/pageoptions.h \ + ../QTfrontend/ui/page/pagenetgame.h \ + ../QTfrontend/ui/page/pageeditteam.h \ + ../QTfrontend/ui/page/pageconnecting.h \ + ../QTfrontend/ui/page/pageroomslist.h \ + ../QTfrontend/ui/page/pagenet.h \ + ../QTfrontend/ui/page/pagecampaign.h \ + ../QTfrontend/ui/page/pageinfo.h \ + ../QTfrontend/ui/page/pagenetserver.h \ + ../QTfrontend/ui/page/pagegamestats.h \ + ../QTfrontend/ui/dialog/input_ip.h \ + ../QTfrontend/ui/qaspectratiolayout.h \ + ../QTfrontend/ui/widget/bgwidget.h \ + ../QTfrontend/ui/widget/fpsedit.h \ + ../QTfrontend/ui/widget/FreqSpinBox.h \ + ../QTfrontend/ui/widget/igbox.h \ + ../QTfrontend/ui/widget/chatwidget.h \ + ../QTfrontend/ui/widget/togglebutton.h \ + ../QTfrontend/ui/widget/SquareLabel.h \ + ../QTfrontend/ui/widget/itemNum.h \ + ../QTfrontend/ui/widget/frameTeam.h \ + ../QTfrontend/ui/widget/teamselect.h \ + ../QTfrontend/ui/widget/vertScrollArea.h \ + ../QTfrontend/ui/widget/about.h \ + ../QTfrontend/ui/widget/teamselhelper.h \ + ../QTfrontend/ui/widget/drawmapwidget.h \ + ../QTfrontend/ui/widget/databrowser.h \ + ../QTfrontend/ui/widget/hedgehogerWidget.h \ + ../QTfrontend/ui/widget/selectWeapon.h \ + ../QTfrontend/ui/widget/weaponItem.h \ + ../QTfrontend/ui/widget/gamecfgwidget.h \ + ../QTfrontend/net/netregister.h \ + ../QTfrontend/net/netserver.h \ + ../QTfrontend/net/netudpwidget.h \ + ../QTfrontend/net/tcpBase.h \ + ../QTfrontend/net/proto.h \ + ../QTfrontend/net/newnetclient.h \ + ../QTfrontend/net/netudpserver.h \ + ../QTfrontend/net/hwmap.h \ + ../QTfrontend/util/namegen.h \ ../QTfrontend/AbstractPage.h \ - ../QTfrontend/themesmodel.h \ - ../QTfrontend/databrowser.h + ../QTfrontend/drawmapscene.h \ + ../QTfrontend/game.h \ + ../QTfrontend/gameuiconfig.h \ + ../QTfrontend/HWApplication.h \ + ../QTfrontend/hwform.h \ + ../QTfrontend/mapContainer.h \ + ../QTfrontend/SDLs.h \ + ../QTfrontend/team.h \ + ../QTfrontend/achievements.h \ + ../QTfrontend/binds.h \ + ../QTfrontend/ui_hwform.h \ + ../QTfrontend/KB.h \ + ../QTfrontend/hwconsts.h \ + ../QTfrontend/sdlkeys.h -SOURCES += ../QTfrontend/SDLs.cpp ../QTfrontend/SquareLabel.cpp \ - ../QTfrontend/about.cpp ../QTfrontend/ammoSchemeModel.cpp \ - ../QTfrontend/bgwidget.cpp ../QTfrontend/binds.cpp \ - ../QTfrontend/chatwidget.cpp ../QTfrontend/fpsedit.cpp \ - ../QTfrontend/frameTeam.cpp ../QTfrontend/game.cpp \ - ../QTfrontend/gamecfgwidget.cpp ../QTfrontend/gameuiconfig.cpp \ - ../QTfrontend/hats.cpp ../QTfrontend/hedgehogerWidget.cpp \ - ../QTfrontend/hwform.cpp ../QTfrontend/hwmap.cpp \ - ../QTfrontend/igbox.cpp ../QTfrontend/input_ip.cpp \ - ../QTfrontend/itemNum.cpp ../QTfrontend/main.cpp \ - ../QTfrontend/mapContainer.cpp ../QTfrontend/misc.cpp \ - ../QTfrontend/namegen.cpp ../QTfrontend/netregister.cpp \ - ../QTfrontend/netserver.cpp ../QTfrontend/netserverslist.cpp \ - ../QTfrontend/netudpserver.cpp ../QTfrontend/netudpwidget.cpp \ - ../QTfrontend/newnetclient.cpp \ - ../QTfrontend/proto.cpp \ - ../QTfrontend/selectWeapon.cpp \ - ../QTfrontend/tcpBase.cpp ../QTfrontend/team.cpp \ - ../QTfrontend/teamselect.cpp ../QTfrontend/teamselhelper.cpp \ - ../QTfrontend/togglebutton.cpp ../QTfrontend/ui_hwform.cpp \ - ../QTfrontend/vertScrollArea.cpp ../QTfrontend/weaponItem.cpp \ - ../QTfrontend/achievements.cpp \ - ../QTfrontend/hwconsts.cpp \ - ../QTfrontend/drawmapwidget.cpp \ +SOURCES += ../QTfrontend/model/ammoSchemeModel.cpp \ + ../QTfrontend/model/themesmodel.cpp \ + ../QTfrontend/model/hats.cpp \ + ../QTfrontend/model/netserverslist.cpp \ + ../QTfrontend/ui/qaspectratiolayout.cpp \ + ../QTfrontend/ui/page/pagemain.cpp \ + ../QTfrontend/ui/page/pagetraining.cpp \ + ../QTfrontend/ui/page/pageroomslist.cpp \ + ../QTfrontend/ui/page/pagemultiplayer.cpp \ + ../QTfrontend/ui/page/pagegamestats.cpp \ + ../QTfrontend/ui/page/pagenettype.cpp \ + ../QTfrontend/ui/page/pageeditteam.cpp \ + ../QTfrontend/ui/page/pagenetgame.cpp \ + ../QTfrontend/ui/page/pagedata.cpp \ + ../QTfrontend/ui/page/pagedrawmap.cpp \ + ../QTfrontend/ui/page/pageplayrecord.cpp \ + ../QTfrontend/ui/page/pageselectweapon.cpp \ + ../QTfrontend/ui/page/pageingame.cpp \ + ../QTfrontend/ui/page/pagenetserver.cpp \ + ../QTfrontend/ui/page/pagecampaign.cpp \ + ../QTfrontend/ui/page/pageadmin.cpp \ + ../QTfrontend/ui/page/pageinfo.cpp \ + ../QTfrontend/ui/page/pageconnecting.cpp \ + ../QTfrontend/ui/page/pagesingleplayer.cpp \ + ../QTfrontend/ui/page/pagenet.cpp \ + ../QTfrontend/ui/page/pagescheme.cpp \ + ../QTfrontend/ui/page/pageoptions.cpp \ + ../QTfrontend/ui/dialog/input_ip.cpp \ + ../QTfrontend/ui/widget/igbox.cpp \ + ../QTfrontend/ui/widget/selectWeapon.cpp \ + ../QTfrontend/ui/widget/FreqSpinBox.cpp \ + ../QTfrontend/ui/widget/SquareLabel.cpp \ + ../QTfrontend/ui/widget/frameTeam.cpp \ + ../QTfrontend/ui/widget/fpsedit.cpp \ + ../QTfrontend/ui/widget/databrowser.cpp \ + ../QTfrontend/ui/widget/teamselect.cpp \ + ../QTfrontend/ui/widget/gamecfgwidget.cpp \ + ../QTfrontend/ui/widget/chatwidget.cpp \ + ../QTfrontend/ui/widget/itemNum.cpp \ + ../QTfrontend/ui/widget/bgwidget.cpp \ + ../QTfrontend/ui/widget/about.cpp \ + ../QTfrontend/ui/widget/togglebutton.cpp \ + ../QTfrontend/ui/widget/vertScrollArea.cpp \ + ../QTfrontend/ui/widget/hedgehogerWidget.cpp \ + ../QTfrontend/ui/widget/teamselhelper.cpp \ + ../QTfrontend/ui/widget/drawmapwidget.cpp \ + ../QTfrontend/ui/widget/weaponItem.cpp \ + ../QTfrontend/net/tcpBase.cpp \ + ../QTfrontend/net/netregister.cpp \ + ../QTfrontend/net/proto.cpp \ + ../QTfrontend/net/hwmap.cpp \ + ../QTfrontend/net/netudpserver.cpp \ + ../QTfrontend/net/newnetclient.cpp \ + ../QTfrontend/net/netudpwidget.cpp \ + ../QTfrontend/net/netserver.cpp \ + ../QTfrontend/util/namegen.cpp \ + ../QTfrontend/AbstractPage.cpp \ + ../QTfrontend/achievements.cpp \ + ../QTfrontend/binds.cpp \ ../QTfrontend/drawmapscene.cpp \ - ../QTfrontend/qaspectratiolayout.cpp \ - ../QTfrontend/pagetraining.cpp \ - ../QTfrontend/pagesingleplayer.cpp \ - ../QTfrontend/pageselectweapon.cpp \ - ../QTfrontend/pagescheme.cpp \ - ../QTfrontend/pageroomslist.cpp \ - ../QTfrontend/pageoptions.cpp \ - ../QTfrontend/pagenettype.cpp \ - ../QTfrontend/pagenetserver.cpp \ - ../QTfrontend/pagenetgame.cpp \ - ../QTfrontend/pagenet.cpp \ - ../QTfrontend/pagemultiplayer.cpp \ - ../QTfrontend/pagemain.cpp \ - ../QTfrontend/pageingame.cpp \ - ../QTfrontend/pageinfo.cpp \ - ../QTfrontend/pagedata.cpp \ - ../QTfrontend/pageeditteam.cpp \ - ../QTfrontend/pagedrawmap.cpp \ - ../QTfrontend/pageconnecting.cpp \ - ../QTfrontend/pagecampaign.cpp \ - ../QTfrontend/pageadmin.cpp \ - ../QTfrontend/pagegamestats.cpp \ - ../QTfrontend/pageplayrecord.cpp \ + ../QTfrontend/game.cpp \ + ../QTfrontend/gameuiconfig.cpp \ ../QTfrontend/HWApplication.cpp \ - ../QTfrontend/themesmodel.cpp \ - ../QTfrontend/databrowser.cpp + ../QTfrontend/hwform.cpp \ + ../QTfrontend/main.cpp \ + ../QTfrontend/mapContainer.cpp \ + ../QTfrontend/SDLs.cpp \ + ../QTfrontend/team.cpp \ + ../QTfrontend/ui_hwform.cpp \ + ../QTfrontend/hwconsts.cpp win32 { SOURCES += ../QTfrontend/xfire.cpp diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/CMakeLists.txt --- a/share/hedgewars/Data/Graphics/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Graphics/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -4,6 +4,7 @@ add_subdirectory(Hats) add_subdirectory(Hedgehog) add_subdirectory(SuddenDeath) +add_subdirectory(Missions) file(GLOB BaseSprites *.png) list(REMOVE_ITEM BaseSprites *@2x.png) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +add_subdirectory(Training) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Bazooka.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Bazooka.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Bazooka@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Bazooka@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Shotgun.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Shotgun.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Shotgun@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Shotgun@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/Basic_Training_-_Sniper_Rifle@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/Training/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,5 @@ +file(GLOB MissionPics *@2x.png) + +install(FILES + ${MissionPics} + DESTINATION ${SHAREPATH}Data/Graphics/Missions/Training) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Bamboo_Thicket@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Dangerous_Ducklings@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Diver@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Newton_and_the_Hammock@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Spooky_Tree@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_Teamwork@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Training/User_Mission_-_That_Sinking_Feeling@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Target@2x.png Binary file share/hedgewars/Data/Graphics/Target@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Graphics/Targetp@2x.png Binary file share/hedgewars/Data/Graphics/Targetp@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Locale/CMakeLists.txt --- a/share/hedgewars/Data/Locale/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Locale/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -2,6 +2,7 @@ file(GLOB txttrans5 ?????.txt) file(GLOB tsfiles *.ts) file(GLOB luafiles *.lua) +file(GLOB missionfiles missions_*.txt) QT4_ADD_TRANSLATION(QM ${tsfiles}) @@ -15,6 +16,7 @@ ${txttrans5} ${QM} ${luafiles} + ${missionfiles} DESTINATION ${SHAREPATH}Data/Locale ) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Locale/hedgewars_sk.ts --- a/share/hedgewars/Data/Locale/hedgewars_sk.ts Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts Sun Oct 16 21:03:30 2011 +0200 @@ -2136,11 +2136,11 @@ Tag Team - Označit tím + Tag Team Add Bottom Border - + Pridať spodný okraj diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Locale/missions_de.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Locale/missions_de.txt Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,32 @@ +Basic_Training_-_Bazooka.name=Training: Bazooka - Grundlagen +Basic_Training_-_Bazooka.desc="Nutze den Wind zu deinem Vorteil aus!" + +Basic_Training_-_Grenade.name=Training: Granate - Grundlagen +Basic_Training_-_Grenade.desc="Vergiss nicht: Stift ziehen UND werfen!" + +Basic_Training_-_Shotgun.name=Training: Schrotflinte - Grundlagen +Basic_Training_-_Shotgun.desc="Zuerst schieen, dann fragen!" + +Basic_Training_-_Sniper_Rifle.name=Training: Scharfschtzengewehr - Grundlagen +Basic_Training_-_Sniper_Rifle.desc="Boom, headshot!" + +User_Mission_-_Dangerous_Ducklings.name=Mission: Dangerous Ducklings +User_Mission_-_Dangerous_Ducklings.desc="Nun gut, Rekrut! Es ist Zeit, dass du das im Grundlagentraining gelernte in die Tag umsetzt!" + +User_Mission_-_Diver.name=Mission: Taucher +User_Mission_-_Diver.desc="Diese amphibische Angriffstrategie ist schwieriger als sie aussieht." + +User_Mission_-_Teamwork.name=Mission: Teamwork +User_Mission_-_Teamwork.desc="Ab und zu... tut Liebe weh." + +User_Mission_-_Spooky_Tree.name=Mission: Spukiger Baum +User_Mission_-_Spooky_Tree.desc="Viele Kisten hier drauen. Ich hoffe jedenfalls, dass dieser Vogel hier nicht hungrig wird." + +User_Mission_-_Bamboo_Thicket.name=Mission: Bambusdickicht +User_Mission_-_Bamboo_Thicket.desc="Tod von oben." + +User_Mission_-_That_Sinking_Feeling.name=Mission: That Sinking Feeling +User_Mission_-_That_Sinking_Feeling.desc="Hier steht einen das Wasser ganz schn schnell bis zu Hals. Viele sind hieran gescheitert. Kannst du alle Igel retten?" + +User_Mission_-_Newton_and_the_Hammock.name=Mission: Newton und die Hngematte +User_Mission_-_Newton_and_the_Hammock.desc="Nicht vergessen Igelinge: Die Geschwindigkeit eines Krpers bleibt konstant, es sei denn es wirkt eine uere Kraft wird auf ihn ein! diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Locale/missions_en.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Locale/missions_en.txt Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,32 @@ +Basic_Training_-_Bazooka.name=Basic Bazooka Training +Basic_Training_-_Bazooka.desc="Using the wind to your advantage is key!" + +Basic_Training_-_Grenade.name=Basic Grenade Training +Basic_Training_-_Grenade.desc="Remember, you pull the pin out AND throw!" + +Basic_Training_-_Shotgun.name=Basic Shotgun Training +Basic_Training_-_Shotgun.desc="Shoot first, ask questions later!" + +Basic_Training_-_Sniper_Rifle.name=Basic Sniper Rifle Training +Basic_Training_-_Sniper_Rifle.desc="Boom, headshot!" + +User_Mission_-_Dangerous_Ducklings.name=Mission: Dangerous Ducklings +User_Mission_-_Dangerous_Ducklings.desc="Alright, rookie! Time to put what we learned in Basic Training into practice!" + +User_Mission_-_Diver.name=Mission: Diver +User_Mission_-_Diver.desc="This 'amphibious assault' thing is harder than it looks..." + +User_Mission_-_Teamwork.name=Mission: Teamwork +User_Mission_-_Teamwork.desc="Sometimes, love hurts." + +User_Mission_-_Spooky_Tree.name=Mission: Spooky Tree +User_Mission_-_Spooky_Tree.desc="Lots of crates out here. I sure hope that bird ain't feeling hungry." + +User_Mission_-_Bamboo_Thicket.name=Mission: Bamboo Thicket +User_Mission_-_Bamboo_Thicket.desc="Death comes from above." + +User_Mission_-_That_Sinking_Feeling.name=Mission: That Sinking Feeling +User_Mission_-_That_Sinking_Feeling.desc="The water is rising rapidly and time is limited. Many have tried and failed. Can you save them all?" + +User_Mission_-_Newton_and_the_Hammock.name=Mission: Newton and the Hammock +User_Mission_-_Newton_and_the_Hammock.desc="Remember hoglets: The velocity of a body remains constant unless the body is acted upon by an external force!" diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Locale/sk.lua --- a/share/hedgewars/Data/Locale/sk.lua Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Locale/sk.lua Sun Oct 16 21:03:30 2011 +0200 @@ -5,54 +5,54 @@ ["Accuracy Bonus!"] = "Bonus za presnosť!", ["a Hedgewars mini-game"] = "minihra Hedgewars", -- Space_Invasion, The_Specialists ["Aiming Practice"] = "Tréning presnosti", --Bazooka, Shotgun, SniperRifle - ["Ammo"] = "Munícia", - ["Ammo Depleted!"] = "Munícia vyčerpaná!", - ["Ammo Maniac!"] = "Muničný maniak!", + ["Ammo"] = "Výzbroj", + ["Ammo Depleted!"] = "Výzbroj vyčerpaná!", +-- ["Ammo Maniac!"] = "", ["Available points remaining: "] = "Zostávajúci počet bodov: ", ["Bat balls at your enemies and|push them into the sea!"] = "Loptami triafajte vašich nepriateľov|a zhoďte ich tak do mora!", - ["Bat your opponents through the|baskets and out of the map!"] = "Odpálkujte vašich súperov cez kôš|von z mapy!", + ["Bat your opponents through the|baskets and out of the map!"] = "Odpálkujte vašich súperov do koša|a von z mapy!", ["Bazooka Training"] = "Tréning s bazukou", ["Best laps per team: "] = "Najrýchlejšie kolá podľa tímov: ", - ["Best Team Times: "] = "Najlepšie tímové časy: ", + ["Best Team Times: "] = "Najrýchlejšie tímové časy: ", ["Bloody Rookies"] = "Mizerní zelenáči", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree ["BOOM!"] = "BUM!", ["Boom!"] = "Bum!", ["Boss defeated!"] = "Vodca bol porazený!", - ["Boss Slayer!"] = "Vodca zabitý!", +-- ["Boss Slayer!"] = "", ["CAPTURE THE FLAG"] = "ZMOCNITE SA VLAJKY", - ["Careless"] = "Neopatrný", + ["Careless"] = "Bezstarostný", ["Clumsy"] = "Nešikovný", - ["Codename: Teamwork"] = "Krycie meno: Tímová práca", - ["Complete the track as fast as you can!"] = "Dokončite trasu tak rýchlo, ako len viete! ", + ["Codename: Teamwork"] = "Kódové meno: Tímová práca", +-- ["Complete the track as fast as you can!"] = "", ["Congratulations!"] = "Gratulujem!", ["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Gratulujem! Zneškodnili ste všetky ciele|v stanovenom čase.", --Bazooka, Shotgun, SniperRifle - ["Control pillars to score points."] = "Obsaďte piliere, aby ste skórovali", + ["Control pillars to score points."] = "Ovládnite piliere, aby ste skórovali", ["Cybernetic Empire"] = "Kybertnetické impérium", ["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "Do kelu s tebou, zelenáč! Okamžite mi zlez z hlavy!", ["DAMMIT, ROOKIE!"] = "Prekliaty zelenáč!", ["Dangerous Ducklings"] = "Nebezpečné kačiatka", - ["Deadweight"] = "Mŕtva váha", - ["Depleted Kamikaze!"] = "Vyčerpaný samovrah!", - ["Destroy invaders to score points."] = "Zničte votrelcov a získajte tak body.", - ["Drone Hunter!"] = "Lovec včeliakov!", - ["Drowner"] = "Utopenec", - ["Each turn you get 1-3 random weapons"] = "Každé kolo získate 1-3 náhodných zbraní", - ["Each turn you get one random weapon"] = "Každé kolo získate jednu náhodnú zbraň", +-- ["Deadweight"] = "", +-- ["Depleted Kamikaze!"] = "", +-- ["Destroy invaders to score points."] = "", +-- ["Drone Hunter!"] = "", +-- ["Drowner"] = "", +-- ["Each turn you get 1-3 random weapons"] = "", + ["Each turn you get one random weapon"] = "Každé koho dostanete jednu náhodnú zbraň", ["Eliminate all enemies"] = "Zneškodnite všetkých nepriateľov", ["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Zneškodnite všetky ciele pred vypršaním času.|Na túto misiu máte neobmedzené množstvo streliva.", --Bazooka, Shotgun, SniperRifle ["Eliminate Poison before the time runs out"] = "Zneškodnite Poisona pred tým, ako vyprší čas", ["Eliminate the Blue Team"] = "Zneškodnite modrý tím", - ["Eliminate the enemy specialists."] = "Zneškodnite nepriateľských špecialistov.", +-- ["Eliminate the enemy specialists."] = "", ["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Zneškodnite Jednotku 3378|- Slabý odpor musí prežiť", ["Enjoy the swim..."] = "Užite si plávanie...", - ["[Enter]"] = "[Enter]", +-- ["[Enter]"] = "", ["Fastest lap: "] = "Najrýchlejšie kolo: ", ["Feeble Resistance"] = "Slabý odpor", - ["Fire"] = "Oheň", +-- ["Fire"] = "", ["Flag captured!"] = "Získaná vlajka!", ["Flag respawned!"] = "Vlajka obnovená!", ["Flag returned!"] = "Vlajka vrátená!", - ["Flags, and their home base will be placed where each team ends their first turn."] = "Vlajky a domovské základne budú umiestnené tam, kde každý tím skončí svoj prvý ťah.", +-- ["Flags, and their home base will be placed where each team ends their first turn."] = "", ["GAME BEGUN!!!"] = "HRA ZAČALA!!!", ["Game Modifiers: "] = "Modifikátory hry: ", ["GAME OVER!"] = "KONIEC HRY!", @@ -64,41 +64,41 @@ ["Good luck out there!"] = "Veľa šťastia!", ["GOTCHA!"] = "A MÁM ŤA!", ["Hahahaha!"] = "Hehehehe!", - ["Haha, now THAT would be something!"] = "Haha, tak TOTO bude niečo!", - ["Hapless Hogs"] = "Nešťastný ježko", - [" Hapless Hogs left!"] = " Nešťastný ježko odišiel!", + ["Haha, now THAT would be something!"] = "Haha, tak TO by bolo niečo!", +-- ["Hapless Hogs"] = "", +-- [" Hapless Hogs left!"] = "", ["Heavy"] = "Ťažký", ["Hedgewars-Basketball"] = "Hedgewars-Basketbal", - ["Hedgewars-Knockball"] = "Hedgewars-Vybíjaná", + ["Hedgewars-Knockball"] = "Hedgewars-Knockball", ["Heh, it's not that bad."] = "Heh, to nie je také zlé.", - ["Hit Combo!"] = "Opakovaný zásah!", +-- ["Hit Combo!"] = "", ["Hmmm..."] = "Hmm..", ["Hooray!"] = "Hurá!", ["Hunter"] = "Lovec", --Bazooka, Shotgun, SniperRifle ["Instructor"] = "Inštruktor", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings - ["invaders destroyed"] = "votrelci zničení", - ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Je dobré, že NÁHLA SMRŤ je tu až za 99 ťahov...", - ["Jumping is disabled"] = "Skákanie je vypnuté", - ["Kamikaze Expert!"] = "Expert na samovraždy!", +-- ["invaders destroyed"] = "", +-- ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "", +-- ["Jumping is disabled"] = "", +-- ["Kamikaze Expert!"] = "", ["KILLS"] = "ZABITÍ:", ["[Left Shift]"] = "[Ľavý Shift]", ["Listen up, maggot!!"] = "Počúvaj, ty biedny červ!", ["|- Mines Time:"] = "|- Časovač pre míny:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork ["MISSION FAILED"] = "MISIA NEÚSPEŠNÁ", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["MISSION SUCCESS"] = "MISIA ÚSPEŠNÁ", +-- ["MISSION SUCCESS"] = "", ["MISSION SUCCESSFUL"] = "MISIA ÚSPEŠNÁ", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork ["Movement: [Up], [Down], [Left], [Right]"] = "Pohyb: [Hore], [Dole], [Vľavo], [Vpravo]", - ["Multi-shot!"] = "Opakovaná rana!", +-- ["Multi-shot!"] = "", ["Nameless Heroes"] = "Hrdinovia bez mena", ["NEW CLAN RECORD: "] = "NOVÝ KLANOVÝ REKORD: ", ["NEW fastest lap: "] = "NOVÉ najrýchlejšie kolo: ", - ["NEW RACE RECORD: "] = "NOVÝ TRAŤOVÝ REKORD: ", - ["NOT ENOUGH WAYPOINTS"] = "NEDOSTATOK NAVIGAČNÝCH BODOV", +-- ["NEW RACE RECORD: "] = "", +-- ["NOT ENOUGH WAYPOINTS"] = "", ["Not So Friendly Match"] = "Nie tak celkom priateľský zápas", -- Basketball, Knockball ["Oh no! Just try again!"] = "Áále nie! Tak to skúste znovu!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork ["Oh no! Time's up! Just try again."] = "Áále nie! Čas vypršal! Tak to skúste znovu.", --Bazooka, Shotgun, SniperRifle ["Operation Diver"] = "Operácia Potápač", - ["Opposing Team: "] = "Nepriateľský tím: ", + ["Opposing Team: "] = "Nepriateľský tím", ["Pathetic Hog #%d"] = "Žalostný ježko #%d", ["Per-Hog Ammo"] = "Samostatná munícia pre ježkov", ["Place more waypoints using [ENTER]"] = "Umiesnite viac bodov pomocou [ENTER]u", @@ -106,13 +106,13 @@ ["Poison"] = "Poison", ["Power Remaining"] = "Zostáva energie", ["Press [Precise] to skip intro"] = "Stlačte [Presnejšie mierenie] pre preskočenie intra", - ["Race complexity limit reached."] = "Dosiahnutý limit zložitosti pretekov.", - [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Skórujete prinesením nepriateľskej vlajky do vašej základne | - Prvý tím, ktorý dosiahne 3 body, vyhráva | - Skórujete len vtedy, keď je máte svoju vlajku v základni | - Spadnuté vlajky môžu byť vrátené na základňu alebo sa ich môže zmocniť súper | - Ježkovia po smrti ožijú", - ["Round Limit"] = "Limit kôl", +-- ["Race complexity limit reached."] = "", + [" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Skórujete prinesením nepriateľskej vlajky do vašej základne | - Prvý tím, ktorý dosiahne 3 body, vyhráva | - Skórujete len vtedy, keď je máte svoju vlajku v základni | - Spadnuté vlajky môžu byť vrátené na základňu alebo sa ich môže zmocniť súpere | - Ježkovia po smrti ožiujú", + ["Round Limit"] = "Limit na kolo", ["Rounds Complete"] = "Dokončených kôl", ["RULES OF THE GAME [Press ESC to view]"] = "PRAVIDLÁ HRY [Stlačte Esc pre ich zobrazenie]", - ["s|"] = "s|", - ["Save as many hapless hogs as possible!"] = "Zachráňte toľko nešťastných ježkov, koľko len môžete!", +-- ["s|"] = "", +-- ["Save as many hapless hogs as possible!"] = "", ["SCORE"] = "SKÓRE", ["sec"] = "sek", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag ["See ya!"] = "Tak zatiaľ!", @@ -120,56 +120,56 @@ ["Shield boosted! +30 power"] = "Štít posilnený! Energia +30", ["Shield Depleted"] = "Štít vyčerpaný", ["Shield is fully recharged!"] = "Štít je plne nabitý!", - ["Shield Master!"] = "Štítový odborník", - ["Shield Miser!"] = "Štítový žgrloš", +-- ["Shield Master!"] = "", +-- ["Shield Miser!"] = "", ["Shield OFF:"] = "Štít VYPNUTÝ:", ["Shield ON:"] = "Štít ZAPNUTÝ:", ["Shield Seeker!"] = "Hľadač štítov!", - ["Shotgun Team"] = "Tím s brokovnicou", + ["Shotgun Team"] = "Shotgun tím", ["Shotgun Training"] = "Tréning s brokovnicou", ["Shots Left: "] = "Zostáva striel: ", -- GaudyRacer, Tumbler - ["Silly"] = "Hlúpy", - ["Sinky"] = "Prepadnutý", +-- ["Silly"] = "", +-- ["Sinky"] = "", ["%s is out and Team %d|scored a penalty!| |Score:"] = "%s je mimo hru a tím %d|dostal trestný bod!| |Skóre:", -- Basketball, Knockball ["%s is out and Team %d|scored a point!| |Score:"] = "%s je mimo hru a tím %d|získal bod!| |Skóre:", -- Basketball, Knockball ["Sniper Training"] = "Tréning pre ostreľovačov", ["Sniperz"] = "Ostreľovači", - ["Sponge"] = "Špongia", +-- ["Sponge"] = "", ["Spooky Tree"] = "Strašidelný strom", - ["STATUS UPDATE"] = "AKTUALIZÁCIA STAVU", -- GaudyRacer, Space_Invasion - ["Switched to "] = "Prepnutý na ", +-- ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion + ["Switched to "] = "Prepnuté na ", ["Team %d: "] = "Tím %d: ", - ["Team Scores"] = "Tímové skóre", -- Control, Space_Invasion - ["That Sinking Feeling"] = "Potopené pocity", +-- ["Team Scores"] = "", -- Control, Space_Invasion +-- ["That Sinking Feeling"] = "", ["That was pointless."] = "To bolo zbytočné.", ["The enemy is hiding out on yonder ducky!"] = "Nepriateľ sa schováva na tamtej kačičke!", ["The flag will respawn next round."] = "V ďalšom kole sa obnoví vlajka.", - ["The Nameless One"] = "Bez mena", +-- ["The Nameless One"] = "", ["THE SPECIALISTS"] = "ŠPECIALISTI", ["This rain is really something..."] = "Ten dážď naozaj stojí za to...", ["TIME: "] = "ČAS: ", - ["Timed Kamikaze!"] = "Časovaná samovražda!", +-- ["Timed Kamikaze!"] = "", ["Time Extended!"] = "Predĺžený čas!", ["Time Left: "] = "Zostávajúci čas: ", ["Toggle Shield"] = "Prepnúť štít", - ["Toxic Team"] = "Jedovatý tím", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork - ["TRACK COMPLETED"] = "TRASA KOMPLETNÁ", - ["Track Time: "] = "Čas na trati: ", + ["Toxic Team"] = "Toxic tím", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork +-- ["TRACK COMPLETED"] = "", + ["Track Time: "] = "Čas: ", ["TrophyRace"] = "Preteky o trofej", ["T_T"] = "T_T", ["Turn Time"] = "Čas na ťah", ["Unit 3378"] = "Jednotka 3378", ["Unlimited Attacks"] = "Neobmedzené útoky", - ["User Challenge"] = "Výzva", +-- ["User Challenge"] = "", ["Use your rope to get from start to finish as fast as you can!"] = "Použite lano na presun zo štartovnej pozície do cieľa tak rýchlo, ako to len viete!", ["v.06"] = "v.06", ["Victory for the "] = "Víťazstvo pre", -- CTF_Blizzard, Capture_the_Flag - ["Waypoint placed."] = "Navigačný bod umiestnený.", - ["Weapons Reset"] = "Zbrane obnovené", - ["WINNING TIME: "] = "VÍŤAZNÝ ČAS: ", - ["You'd almost swear the water was rising!"] = "Prisahali by ste, že voda stúpala!", +-- ["Waypoint placed."] = "", +-- ["Weapons Reset"] = "", + ["WINNING TIME: "] = "ČAS PRE VÍŤAZSTVO: ", +-- ["You'd almost swear the water was rising!"] = "", ["You have SCORED!!"] = "SKÓROVALI ste!!", - ["You saved"] = "Uložili ste", + ["You saved"] = "Zachránili ste", ["You've failed. Try again."] = "Neuspeli ste. Skúste to znova.", ["You've reached the goal!| |Time: "] = "Dosiahli ste cieľ!| |Čas: ", ["'Zooka Team"] = "Bazuka tím", diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Basketball/mask.png Binary file share/hedgewars/Data/Maps/Basketball/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Battlefield/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Battlefield/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Battlefield/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Battlefield) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Battlefield/mask.png Binary file share/hedgewars/Data/Maps/Battlefield/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Blizzard/mask.png Binary file share/hedgewars/Data/Maps/Blizzard/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Blox/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Blox/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Blox/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Blox) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Blox/mask.png Binary file share/hedgewars/Data/Maps/Blox/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Cake/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Cake/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Cake/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Cake) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Cake/mask.png Binary file share/hedgewars/Data/Maps/Cake/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Castle/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Castle/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Castle/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Castle) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Castle/mask.png Binary file share/hedgewars/Data/Maps/Castle/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Cave/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Cave/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Cave/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Cave) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Cave/mask.png Binary file share/hedgewars/Data/Maps/Cave/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Cheese/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Cheese/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Cheese/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Cheese) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Cheese/mask.png Binary file share/hedgewars/Data/Maps/Cheese/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/EarthRise/CMakeLists.txt --- a/share/hedgewars/Data/Maps/EarthRise/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/EarthRise/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/EarthRise) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/EarthRise/mask.png Binary file share/hedgewars/Data/Maps/EarthRise/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/HedgeFortress/CMakeLists.txt --- a/share/hedgewars/Data/Maps/HedgeFortress/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/HedgeFortress/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/HedgeFortress) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/HedgeFortress/mask.png Binary file share/hedgewars/Data/Maps/HedgeFortress/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Lonely_Island/CMakeLists.txt --- a/share/hedgewars/Data/Maps/Lonely_Island/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Maps/Lonely_Island/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -1,5 +1,6 @@ install(FILES map.png + mask.png map.cfg preview.png DESTINATION ${SHAREPATH}Data/Maps/Lonely_Island) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/Lonely_Island/mask.png Binary file share/hedgewars/Data/Maps/Lonely_Island/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Maps/TrophyRace/mask.png Binary file share/hedgewars/Data/Maps/TrophyRace/mask.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/BlueCap.cfg --- a/share/hedgewars/Data/Names/BlueCap.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/BlueHair.cfg --- a/share/hedgewars/Data/Names/BlueHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/BrainSlug.cfg --- a/share/hedgewars/Data/Names/BrainSlug.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -brainslug diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/BrainSlugMouth.cfg --- a/share/hedgewars/Data/Names/BrainSlugMouth.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -brainslug diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/Bunny.cfg --- a/share/hedgewars/Data/Names/Bunny.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/GreenCap.cfg --- a/share/hedgewars/Data/Names/GreenCap.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/GreenHair.cfg --- a/share/hedgewars/Data/Names/GreenHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/GreyHair.cfg --- a/share/hedgewars/Data/Names/GreyHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/KirbyMask.cfg --- a/share/hedgewars/Data/Names/KirbyMask.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/OrangeHair.cfg --- a/share/hedgewars/Data/Names/OrangeHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/PinkHair.cfg --- a/share/hedgewars/Data/Names/PinkHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/PurpleHair.cfg --- a/share/hedgewars/Data/Names/PurpleHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/RedCap.cfg --- a/share/hedgewars/Data/Names/RedCap.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/RedHair.cfg --- a/share/hedgewars/Data/Names/RedHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/Ryu.cfg --- a/share/hedgewars/Data/Names/Ryu.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/Sonic.cfg --- a/share/hedgewars/Data/Names/Sonic.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/YellowCap.cfg --- a/share/hedgewars/Data/Names/YellowCap.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/YellowHair.cfg --- a/share/hedgewars/Data/Names/YellowHair.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/apple.cfg --- a/share/hedgewars/Data/Names/apple.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -apple -fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/banana.cfg --- a/share/hedgewars/Data/Names/banana.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -banana -fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cap_blue.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/cap_blue.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cap_green.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/cap_green.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cap_red.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/cap_red.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cap_yellow.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/cap_yellow.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cowboy.txt --- a/share/hedgewars/Data/Names/cowboy.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Names/cowboy.txt Sun Oct 16 21:03:30 2011 +0200 @@ -7,7 +7,7 @@ Tom Ernesto Douglas -sm_mario +Mario Jose Francisco Brian diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cyborg.cfg --- a/share/hedgewars/Data/Names/cyborg.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/cyborg1.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/cyborg1.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/darthvader.cfg --- a/share/hedgewars/Data/Names/darthvader.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/fr_apple.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/fr_apple.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,2 @@ +apple +fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/fr_banana.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/fr_banana.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,2 @@ +banana +fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/fr_lemon.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/fr_lemon.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,2 @@ +lemon +fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/fr_orange.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/fr_orange.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,2 @@ +orange +fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_blue.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_blue.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_green.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_green.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_grey.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_grey.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_orange.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_orange.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_pink.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_pink.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_purple.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_purple.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_red.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_red.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/hair_yellow.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/hair_yellow.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/lemon.cfg --- a/share/hedgewars/Data/Names/lemon.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -lemon -fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/mv_Venom.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/mv_Venom.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/ninja.txt --- a/share/hedgewars/Data/Names/ninja.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Names/ninja.txt Sun Oct 16 21:03:30 2011 +0200 @@ -6,4 +6,4 @@ Arashi Bushi Itami -sf_kenshi +Kenshi diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/ntd_Kirby.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/ntd_Kirby.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/orange.cfg --- a/share/hedgewars/Data/Names/orange.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,2 +0,0 @@ -orange -fruit diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/poke_slowpoke.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/poke_slowpoke.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/scif_BrainSlug.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/scif_BrainSlug.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +brainslug diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/scif_BrainSlug2.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/scif_BrainSlug2.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +brainslug diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/scif_swDarthvader.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/scif_swDarthvader.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/scif_swStormtrooper.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/scif_swStormtrooper.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/sf_ryu.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/sf_ryu.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/slowpoke.cfg --- a/share/hedgewars/Data/Names/slowpoke.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/sth_Sonic.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/sth_Sonic.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/stormtrooper.cfg --- a/share/hedgewars/Data/Names/stormtrooper.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/venom.cfg --- a/share/hedgewars/Data/Names/venom.cfg Sun Oct 16 19:02:48 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,1 +0,0 @@ -generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Names/zoo_Bunny.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Names/zoo_Bunny.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1 @@ +generic diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Blox/LandBackTex.png Binary file share/hedgewars/Data/Themes/Blox/LandBackTex.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/CMakeLists.txt --- a/share/hedgewars/Data/Themes/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/share/hedgewars/Data/Themes/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -5,6 +5,7 @@ Blox Brick Cake + Cave Castle Cheese Christmas diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cake/LandBackTex.png Binary file share/hedgewars/Data/Themes/Cake/LandBackTex.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Border.png Binary file share/hedgewars/Data/Themes/Cave/Border.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Border.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Border.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,89 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,6 @@ +file(GLOB images *.png) + +install(FILES + theme.cfg + ${images} + DESTINATION ${SHAREPATH}Data/Themes/Cave) diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Chunk.png Binary file share/hedgewars/Data/Themes/Cave/Chunk.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Chunk.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Chunk.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,202 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Crystal01.png Binary file share/hedgewars/Data/Themes/Cave/Crystal01.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Crystal01.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Crystal01.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,461 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Crystal02.png Binary file share/hedgewars/Data/Themes/Cave/Crystal02.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Crystal02.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Crystal02.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,411 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CrystalSpray01.png Binary file share/hedgewars/Data/Themes/Cave/CrystalSpray01.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CrystalSpray01.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/CrystalSpray01.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,453 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CrystalSpray02.png Binary file share/hedgewars/Data/Themes/Cave/CrystalSpray02.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CrystalSpray02.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/CrystalSpray02.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,406 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CrystalSpray03.png Binary file share/hedgewars/Data/Themes/Cave/CrystalSpray03.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/CrystalSpray03.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/CrystalSpray03.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,358 @@ + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Flake.png Binary file share/hedgewars/Data/Themes/Cave/Flake.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Flake.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Flake.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,89 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Girder.png Binary file share/hedgewars/Data/Themes/Cave/Girder.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Girder.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Girder.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,83 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/LandBackTex.png Binary file share/hedgewars/Data/Themes/Cave/LandBackTex.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/LandTex.png Binary file share/hedgewars/Data/Themes/Cave/LandTex.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/LandTex.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/LandTex.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,3146 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/README --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/README Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,4 @@ +Theme "Cave" +Copyright 2011 Guillaume Englert +Distributed under the terms of the GNU FDL licence. + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Sky.png Binary file share/hedgewars/Data/Themes/Cave/Sky.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Sky.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Sky.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,1179 @@ + + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/SkyL.png Binary file share/hedgewars/Data/Themes/Cave/SkyL.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/SkyR.png Binary file share/hedgewars/Data/Themes/Cave/SkyR.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Stalactite.png Binary file share/hedgewars/Data/Themes/Cave/Stalactite.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Stalactite.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Stalactite.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,273 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Stalagmite01.png Binary file share/hedgewars/Data/Themes/Cave/Stalagmite01.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Stalagmite01.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Stalagmite01.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,355 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Stalagmite02.png Binary file share/hedgewars/Data/Themes/Cave/Stalagmite02.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/Stalagmite02.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/Stalagmite02.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,269 @@ + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/horizont.png Binary file share/hedgewars/Data/Themes/Cave/horizont.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/horizont.svg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/horizont.svg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,368 @@ + + + + + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/icon.png Binary file share/hedgewars/Data/Themes/Cave/icon.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/icon.xcf Binary file share/hedgewars/Data/Themes/Cave/icon.xcf has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/icon@2x.png Binary file share/hedgewars/Data/Themes/Cave/icon@2x.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Cave/theme.cfg --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Themes/Cave/theme.cfg Sun Oct 16 21:03:30 2011 +0200 @@ -0,0 +1,16 @@ +sky = 17, 18, 24 +border = 129, 135, 173 +water-top = $54, $5C, $9D +water-bottom = $34, $3C, $7D +water-opacity = $60 +music = snow.ogg +clouds = 0 +object = Stalagmite01, 3, 5, 258, 100, 2, 1, 19, 0, 67, 173 +object = Stalagmite02, 3, 1, 159, 62, 3, 1, 11, 0, 45, 119 +object = Stalactite, 3, 0, 0, 55, 2, 1, 12, 61, 32, 79 +object = Crystal01, 3, 21, 258, 113, 2, 1, 0, 0, 165, 245 +object = Crystal02, 3, 16, 129, 57, 3, 1, 0, 0, 84, 124 +spray = CrystalSpray01, 2 +spray = CrystalSpray02, 3 +spray = CrystalSpray03, 4 +flakes = 8, 2, 99999999, 0, 1700 diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Christmas/amGirder.png Binary file share/hedgewars/Data/Themes/Christmas/amGirder.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 share/hedgewars/Data/Themes/Snow/amGirder.png Binary file share/hedgewars/Data/Themes/Snow/amGirder.png has changed diff -r 74431bf4c632 -r 4e8816cf9459 tools/CMakeLists.txt --- a/tools/CMakeLists.txt Sun Oct 16 19:02:48 2011 +0200 +++ b/tools/CMakeLists.txt Sun Oct 16 21:03:30 2011 +0200 @@ -32,9 +32,11 @@ string(REGEX REPLACE "(.*);-.*" "\\1" sdl_dir "${SDL_LIBRARY}") #this tool is present in qt 4.5 but only if you compile from sources; from qt 4.6 is present also in the binary version - find_program(macdeployqt_EXE NAMES macdeployqt macdeployqt-mac PATHS ${qt_base_dir}/bin NO_DEFAULT_PATH) + find_program(macdeployqt_EXE NAMES macdeployqt macdeployqt-mac PATHS ${qt_base_dir}/bin) if(NOT macdeployqt_EXE) - message(FATAL_ERROR "The utility macdeployqt is required to create the bundle!") + message(FATAL_ERROR "The utility macdeployqt is required to create the bundle (seached: ${qt_base_dir})") + else() + message(STATUS "macdeployqt found in ${macdeployqt_EXE}") endif() #dummy target, we're interested in the postscript file