# HG changeset patch # User unc0rr # Date 1354598155 -14400 # Node ID 171da01bd04d68d916035765f11f590e8eceb7e3 # Parent 6482875b0d970759e2d035fd86f67a2869bccf92# Parent 1633a651083475269dcaee65648467ae38ef3452 merge from default diff -r 6482875b0d97 -r 171da01bd04d CMakeLists.txt --- a/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -2,11 +2,11 @@ #initialise cmake environment cmake_minimum_required(VERSION 2.6.0) -FOREACH(hwpolicy CMP0003 CMP0012 CMP0017) - IF(POLICY ${hwpolicy}) - CMAKE_POLICY(SET ${hwpolicy} NEW) - ENDIF() -ENDFOREACH() +foreach(hwpolicy CMP0003 CMP0012 CMP0017) + if(POLICY ${hwpolicy}) + cmake_policy(SET ${hwpolicy} NEW) + endif() +endforeach() #use available modules, fallback to ours if not present (CMP0017 helps) set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules") @@ -27,34 +27,34 @@ #detect Mercurial revision (if present) -IF(NOT NOREVISION) +if(NOT NOREVISION) set(default_build_type "DEBUG") set(version_suffix "-development_version") set(HW_DEV true) - FIND_PROGRAM(HGCOMMAND hg) - IF(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg)) + find_program(HGCOMMAND hg) + if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg)) execute_process(COMMAND ${HGCOMMAND} identify -in WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} OUTPUT_VARIABLE internal_version ERROR_QUIET ) #check local repo status - STRING(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version}) + string(REGEX REPLACE "[^+]" "" HGCHANGED ${internal_version}) - STRING(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" revision_number ${internal_version}) - STRING(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" revision_hash ${internal_version}) + string(REGEX REPLACE "[0-9a-zA-Z]+(.*) ([0-9]+)(.*)" "\\2" revision_number ${internal_version}) + string(REGEX REPLACE "([0-9a-zA-Z]+)(.*) [0-9]+(.*)" "\\1" revision_hash ${internal_version}) - MESSAGE(STATUS "Building revision ${revision_number} from hash ${revision_hash} ${HGCHANGED}") - IF(HGCHANGED) + message(STATUS "Building revision ${revision_number} from hash ${revision_hash} ${HGCHANGED}") + if(HGCHANGED) MESSAGE(WARNING "Notice: you have uncommitted changes in your repository") - ENDIF() + endif() set(version_suffix "-${revision_number}${HGCHANGED}") - ENDIF() -ELSE(NOT NOREVISION) + endif() +else(NOT NOREVISION) set(default_build_type "RELEASE") set(HWDEV false) - MESSAGE(STATUS "Building distributable version") -ENDIF(NOT NOREVISION) + message(STATUS "Building distributable version") +endif(NOT NOREVISION) #versioning diff -r 6482875b0d97 -r 171da01bd04d INSTALL --- a/INSTALL Fri Nov 30 18:19:52 2012 +0400 +++ b/INSTALL Tue Dec 04 09:15:55 2012 +0400 @@ -8,7 +8,7 @@ - SDL_image >= 1.2 - SDL_ttf >= 2.0 - Lua >= 5.1.0 - - Physfs >= 2.0 + - Physfs >= 2.1 For server: - Glasgow Haskell Compiler >= 6.10 - bytestring-show package @@ -20,7 +20,7 @@ For compressed screenshots: - libpng -Lua and Physfs will be automatically built if not found. +Lua will be automatically built if not found. 1. Configure: diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/CMakeLists.txt --- a/QTfrontend/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -20,6 +20,9 @@ find_package(SDL_net REQUIRED) #network frontlib if(NOT NOVIDEOREC) find_package(FFMPEG) + if(${FFMPEG_FOUND}) + add_definitions(-DVIDEOREC -D__STDC_CONSTANT_MACROS) + endif() endif() include_directories(.) @@ -66,10 +69,6 @@ file(GLOB_RECURSE UIcpp ui/*.cpp) file(GLOB UtilCpp util/*.cpp) -if(${FFMPEG_FOUND}) - add_definitions(-DVIDEOREC -D__STDC_CONSTANT_MACROS) -endif() - set(hwfr_src ${ModelCpp} ${NetCpp} diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/binds.cpp --- a/QTfrontend/binds.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/binds.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -66,5 +66,7 @@ {"fullscr", "f12", QT_TRANSLATE_NOOP("binds", "change mode"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle fullscreen mode:")}, {"capture", "c", QT_TRANSLATE_NOOP("binds", "capture"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Take a screenshot:")}, {"rotmask", "delete", QT_TRANSLATE_NOOP("binds", "hedgehogs\ninfo"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Toggle labels above hedgehogs:")}, +#ifdef VIDEOREC {"record", "r", QT_TRANSLATE_NOOP("binds", "record"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Record video:")} +#endif }; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/binds.h --- a/QTfrontend/binds.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/binds.h Tue Dec 04 09:15:55 2012 +0400 @@ -21,7 +21,11 @@ #include +#ifdef VIDEOREC #define BINDS_NUMBER 46 +#else +#define BINDS_NUMBER 45 +#endif struct BindAction { diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/gameuiconfig.cpp --- a/QTfrontend/gameuiconfig.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/gameuiconfig.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -94,11 +94,13 @@ Form->ui.pageOptions->editNetPassword->installEventFilter(this); int passLength = value("net/passwordlength", 0).toInt(); - setNetPasswordLength(passLength); - if (savePwd == false) { - Form->ui.pageOptions->editNetPassword->setEnabled(savePwd); + if (!savePwd) { + Form->ui.pageOptions->editNetPassword->setEnabled(false); Form->ui.pageOptions->editNetPassword->setText(""); setNetPasswordLength(0); + } else + { + setNetPasswordLength(passLength); } delete netHost; @@ -139,26 +141,34 @@ void GameUIConfig::reloadVideosValues(void) { - Form->ui.pageVideos->framerateBox->setValue(value("videorec/fps",25).toUInt()); - Form->ui.pageVideos->bitrateBox->setValue(value("videorec/bitrate",400).toUInt()); - bool useGameRes = value("videorec/usegameres",true).toBool(); + // one pass with default values + Form->ui.pageOptions->setDefaultOptions(); + + // then load user configuration + Form->ui.pageOptions->framerateBox->setCurrentIndex( + Form->ui.pageOptions->framerateBox->findData( + value("videorec/framerate", rec_Framerate()).toString() + " fps", + Qt::MatchExactly) ); + Form->ui.pageOptions->bitrateBox->setValue(value("videorec/bitrate", rec_Bitrate()).toUInt()); + bool useGameRes = value("videorec/usegameres",Form->ui.pageOptions->checkUseGameRes->isChecked()).toBool(); if (useGameRes) { QRect res = vid_Resolution(); - Form->ui.pageVideos->widthEdit->setText(QString::number(res.width())); - Form->ui.pageVideos->heightEdit->setText(QString::number(res.height())); + Form->ui.pageOptions->widthEdit->setText(QString::number(res.width())); + Form->ui.pageOptions->heightEdit->setText(QString::number(res.height())); } else { - Form->ui.pageVideos->widthEdit->setText(value("videorec/width","800").toString()); - Form->ui.pageVideos->heightEdit->setText(value("videorec/height","600").toString()); + Form->ui.pageOptions->widthEdit->setText(value("videorec/width","800").toString()); + Form->ui.pageOptions->heightEdit->setText(value("videorec/height","600").toString()); } - Form->ui.pageVideos->checkUseGameRes->setChecked(useGameRes); - Form->ui.pageVideos->checkRecordAudio->setChecked(value("videorec/audio",true).toBool()); - if (!Form->ui.pageVideos->tryCodecs(value("videorec/format","no").toString(), + Form->ui.pageOptions->checkUseGameRes->setChecked(useGameRes); + Form->ui.pageOptions->checkRecordAudio->setChecked( + value("videorec/audio",Form->ui.pageOptions->checkRecordAudio->isChecked()).toBool() ); + if (!Form->ui.pageOptions->tryCodecs(value("videorec/format","no").toString(), value("videorec/videocodec","no").toString(), value("videorec/audiocodec","no").toString())) - Form->ui.pageVideos->setDefaultCodecs(); + Form->ui.pageOptions->setDefaultCodecs(); } QStringList GameUIConfig::GetTeamsList() @@ -177,7 +187,16 @@ void GameUIConfig::resizeToConfigValues() { - Form->resize(value("frontend/width", 800).toUInt(), value("frontend/height", 600).toUInt()); + // fill 2/3 of the screen desktop + const QRect deskSize = QApplication::desktop()->screenGeometry(-1); + Form->resize(value("frontend/width", deskSize.width()*2/3).toUInt(), + value("frontend/height", deskSize.height()*2/3).toUInt()); + + // move the window to the center of the screen + QPoint center = QApplication::desktop()->availableGeometry(-1).center(); + center.setX(center.x() - (Form->width()/2)); + center.setY(center.y() - (Form->height()/2)); + Form->move(center); } void GameUIConfig::SaveOptions() @@ -270,7 +289,7 @@ setValue(QString("colors/color%1").arg(i), model->item(i)->data()); } - Form->gameSettings->sync(); + sync(); } void GameUIConfig::SaveVideosOptions() @@ -279,14 +298,19 @@ setValue("videorec/format", AVFormat()); setValue("videorec/videocodec", videoCodec()); setValue("videorec/audiocodec", audioCodec()); - setValue("videorec/fps", rec_Framerate()); + setValue("videorec/framerate", rec_Framerate()); setValue("videorec/bitrate", rec_Bitrate()); setValue("videorec/width", res.width()); setValue("videorec/height", res.height()); - setValue("videorec/usegameres", Form->ui.pageVideos->checkUseGameRes->isChecked()); + setValue("videorec/usegameres", Form->ui.pageOptions->checkUseGameRes->isChecked()); setValue("videorec/audio", recordAudio()); - Form->gameSettings->sync(); + sync(); +} + +void GameUIConfig::setValue(const QString &key, const QVariant &value) +{ + QSettings::setValue(key, value); } QString GameUIConfig::language() @@ -447,7 +471,7 @@ bool GameUIConfig::netPasswordIsValid() { - return (netPasswordLength() == 0 || Form->ui.pageOptions->editNetPassword->text() != QString(netPasswordLength(), '\0')); + return (netPasswordLength() == 0 || Form->ui.pageOptions->editNetPassword->text() != QString(netPasswordLength(), '*')); } // When hedgewars launches, the password field is set with null characters. If the user tries to edit the field and there are such characters, then clear the field @@ -472,7 +496,7 @@ { if (passwordLength > 0) { - Form->ui.pageOptions->editNetPassword->setText(QString(passwordLength, '\0')); + Form->ui.pageOptions->editNetPassword->setText(QString(passwordLength, '*')); } else { @@ -487,40 +511,43 @@ QString GameUIConfig::AVFormat() { - return Form->ui.pageVideos->format(); + return Form->ui.pageOptions->format(); } QString GameUIConfig::videoCodec() { - return Form->ui.pageVideos->videoCodec(); + return Form->ui.pageOptions->videoCodec(); } QString GameUIConfig::audioCodec() { - return Form->ui.pageVideos->audioCodec(); + return Form->ui.pageOptions->audioCodec(); } QRect GameUIConfig::rec_Resolution() { - if (Form->ui.pageVideos->checkUseGameRes->isChecked()) + if (Form->ui.pageOptions->checkUseGameRes->isChecked()) return vid_Resolution(); QRect res(0,0,0,0); - res.setWidth(Form->ui.pageVideos->widthEdit->text().toUInt()); - res.setHeight(Form->ui.pageVideos->heightEdit->text().toUInt()); + res.setWidth(Form->ui.pageOptions->widthEdit->text().toUInt()); + res.setHeight(Form->ui.pageOptions->heightEdit->text().toUInt()); return res; } int GameUIConfig::rec_Framerate() { - return Form->ui.pageVideos->framerateBox->value(); + // remove the "fps" label + QString fpsText = Form->ui.pageOptions->framerateBox->currentText(); + QStringList fpsList = fpsText.split(" "); + return fpsList.first().toInt(); } int GameUIConfig::rec_Bitrate() { - return Form->ui.pageVideos->bitrateBox->value(); + return Form->ui.pageOptions->bitrateBox->value(); } bool GameUIConfig::recordAudio() { - return Form->ui.pageVideos->checkRecordAudio->isChecked(); + return Form->ui.pageOptions->checkRecordAudio->isChecked(); } diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/gameuiconfig.h --- a/QTfrontend/gameuiconfig.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/gameuiconfig.h Tue Dec 04 09:15:55 2012 +0400 @@ -58,6 +58,7 @@ bool isFrontendFullscreen() const; void resizeToConfigValues(); quint32 stereoMode() const; + void setValue(const QString & key, const QVariant & value); QString AVFormat(); QString videoCodec(); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/hwconsts.h --- a/QTfrontend/hwconsts.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/hwconsts.h Tue Dec 04 09:15:55 2012 +0400 @@ -63,40 +63,40 @@ #define HEDGEHOGS_PER_TEAM 8 -#define AMMOLINE_DEFAULT_QT "93919294221991210322351110012010000002111101010111110101" -#define AMMOLINE_DEFAULT_PROB "04050405416006555465544647765766666661555101011154110101" -#define AMMOLINE_DEFAULT_DELAY "00000000000002055000000400070040000000002200000006000000" -#define AMMOLINE_DEFAULT_CRATE "13111103121111111231141111111111111112111111011111110101" +#define AMMOLINE_DEFAULT_QT "9391929422199121032235111001201000000211110101011111101" +#define AMMOLINE_DEFAULT_PROB "0405040541600655546554464776576666666155510101115411101" +#define AMMOLINE_DEFAULT_DELAY "0000000000000205500000040007004000000000220000000600000" +#define AMMOLINE_DEFAULT_CRATE "1311110312111111123114111111111111111211111101111111101" -#define AMMOLINE_CRAZY_QT "99999999999999999929999999999999992999999999099999920909" -#define AMMOLINE_CRAZY_PROB "11111101111111111111111111111111111111111111011111110101" -#define AMMOLINE_CRAZY_DELAY "00000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_CRAZY_CRATE "13111103121111111231141111111111111112111101011111110101" +#define AMMOLINE_CRAZY_QT "9999999999999999992999999999999999299999999909999992909" +#define AMMOLINE_CRAZY_PROB "1111110111111111111111111111111111111111111101111111101" +#define AMMOLINE_CRAZY_DELAY "0000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_CRAZY_CRATE "1311110312111111123114111111111111111211110101111111101" -#define AMMOLINE_PROMODE_QT "90900090000000000000090000000000000000000000000000000000" -#define AMMOLINE_PROMODE_PROB "00000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_PROMODE_DELAY "00000000000002055000000400070040000000002000000000000002" -#define AMMOLINE_PROMODE_CRATE "11111111111111111111111111111111111111111001011111110101" +#define AMMOLINE_PROMODE_QT "9090009000000000000009000000000000000000000000000000000" +#define AMMOLINE_PROMODE_PROB "0000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_PROMODE_DELAY "0000000000000205500000040007004000000000200000000000002" +#define AMMOLINE_PROMODE_CRATE "1111111111111111111111111111111111111111100101111111101" -#define AMMOLINE_SHOPPA_QT "00000099000000000000000000000000000000000000000000000000" -#define AMMOLINE_SHOPPA_PROB "44444100442444022101121212224220000000020004000100110001" -#define AMMOLINE_SHOPPA_DELAY "00000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_SHOPPA_CRATE "11111111111111111111111111111111111111111011011111110001" +#define AMMOLINE_SHOPPA_QT "0000009900000000000000000000000000000000000000000000000" +#define AMMOLINE_SHOPPA_PROB "4444410044244402210112121222422000000002000400010011001" +#define AMMOLINE_SHOPPA_DELAY "0000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_SHOPPA_CRATE "1111111111111111111111111111111111111111101101111111001" -#define AMMOLINE_CLEAN_QT "10100090000100000110000000000000000000000000000010000000" -#define AMMOLINE_CLEAN_PROB "04050405416006555465544647765766666661555101011154110101" -#define AMMOLINE_CLEAN_DELAY "00000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_CLEAN_CRATE "13111103121111111231141111111111111112111111011111110101" +#define AMMOLINE_CLEAN_QT "1010009000010000011000000000000000000000000000001000000" +#define AMMOLINE_CLEAN_PROB "0405040541600655546554464776576666666155510101115411101" +#define AMMOLINE_CLEAN_DELAY "0000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_CLEAN_CRATE "1311110312111111123114111111111111111211111101111111101" -#define AMMOLINE_MINES_QT "00000099000900000003000000000000000000000000000000000000" -#define AMMOLINE_MINES_PROB "00000000000000000000000000000000000000000000000000000000" -#define AMMOLINE_MINES_DELAY "00000000000002055000000400070040000000002000000006000000" -#define AMMOLINE_MINES_CRATE "11111111111111111111111111111111111111111111011111110101" +#define AMMOLINE_MINES_QT "0000009900090000000300000000000000000000000000000000000" +#define AMMOLINE_MINES_PROB "0000000000000000000000000000000000000000000000000000000" +#define AMMOLINE_MINES_DELAY "0000000000000205500000040007004000000000200000000600000" +#define AMMOLINE_MINES_CRATE "1111111111111111111111111111111111111111111101111111101" -#define AMMOLINE_PORTALS_QT "90000090020000000021000000000000001100000900000000000000" -#define AMMOLINE_PORTALS_PROB "04050405416006555465544647765766666661555101011154110101" -#define AMMOLINE_PORTALS_DELAY "00000000000002055000000400070040000000002000000006000000" -#define AMMOLINE_PORTALS_CRATE "13111103121111111231141111111111111112111111011111110101" +#define AMMOLINE_PORTALS_QT "9000009002000000002100000000000000110000090000000000000" +#define AMMOLINE_PORTALS_PROB "0405040541600655546554464776576666666155510101115411101" +#define AMMOLINE_PORTALS_DELAY "0000000000000205500000040007004000000000200000000600000" +#define AMMOLINE_PORTALS_CRATE "1311110312111111123114111111111111111211111101111111101" //Different seasons; assigned to season (int) #define SEASON_NONE 0 diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/hwform.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -111,7 +111,6 @@ QString playerHash; GameUIConfig* HWForm::config = NULL; -QSettings* HWForm::gameSettings = NULL; HWForm::HWForm(QWidget *parent, QString styleSheet) : QMainWindow(parent) @@ -127,10 +126,6 @@ #ifdef USE_XFIRE xfire_init(); #endif - gameSettings = new QSettings("physfs://hedgewars.ini", QSettings::IniFormat); - frontendEffects = gameSettings->value("frontend/effects", true).toBool(); - playerHash = QString(QCryptographicHash::hash(gameSettings->value("net/nick","").toString().toUtf8(), QCryptographicHash::Md5).toHex()); - this->setStyleSheet(styleSheet); ui.setupUi(this); setMinimumSize(760, 580); @@ -140,8 +135,16 @@ ui.pageOptions->CBResolution->addItems(SDLInteraction::instance().getResolutions()); config = new GameUIConfig(this, "physfs://hedgewars.ini"); + frontendEffects = config->value("frontend/effects", true).toBool(); + playerHash = QString(QCryptographicHash::hash(config->value("net/nick","").toString().toUtf8(), QCryptographicHash::Md5).toHex()); + ui.pageRoomsList->setSettings(config); + ui.pageNetGame->chatWidget->setSettings(config); + ui.pageRoomsList->chatWidget->setSettings(config); +#ifdef VIDEOREC ui.pageVideos->init(config); + ui.pageOptions->setConfig(config); +#endif #ifdef __APPLE__ panel = new M3Panel; @@ -439,23 +442,27 @@ } } -void HWForm::UpdateTeamsLists(const QStringList* editable_teams) +void HWForm::UpdateTeamsLists() { - QStringList teamslist; - if(editable_teams) - { - teamslist =* editable_teams; - } - else - { - teamslist = config->GetTeamsList(); - } + QStringList teamslist = config->GetTeamsList(); if(teamslist.empty()) { - HWTeam defaultTeam(tr("DefaultTeam")); + QString currentNickName = config->value("net/nick","").toString().toUtf8(); + QString teamName; + + if (currentNickName.isEmpty()) + { + teamName = tr("DefaultTeam"); + } + else + { + teamName = tr("%1's Team").arg(currentNickName); + } + + HWTeam defaultTeam(teamName); defaultTeam.saveToFile(); - teamslist.push_back(tr("DefaultTeam")); + teamslist.push_back(teamName); } ui.pageOptions->CBTeamName->clear(); @@ -531,6 +538,69 @@ #ifdef USE_XFIRE updateXfire(); #endif + + QString openPrefix = "Debug: (PAGE_OPENED: "; + QString openSuffix = ")"; + QString closePrefix = "Debug: (PAGE_LEFT: "; + QString closeSuffix = ")"; + + switch (lastid) { //Print the id of the page we're leaving + case ID_PAGE_SETUP_TEAM : qDebug("%sPAGE_SETUP_TEAM%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_SETUP : qDebug("%sPAGE_SETUP%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_MULTIPLAYER : qDebug("%sPAGE_MULTIPLAYER%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_DEMOS : qDebug("%sPAGE_DEMOS%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_NET : qDebug("%sPAGE_NET%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_NETGAME : qDebug("%sPAGE_NETGAME%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_INFO : qDebug("%sPAGE_INFO%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_MAIN : qDebug("%sPAGE_MAIN%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_GAMESTATS : qDebug("%sPAGE_GAMESTATS%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_SINGLEPLAYER : qDebug("%sPAGE_SINGLEPLAYER%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_TRAINING : qDebug("%sPAGE_TRAINING%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_SELECTWEAPON : qDebug("%sPAGE_SELECTWEAPON%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_NETSERVER : qDebug("%sPAGE_NETSERVER%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_INGAME : qDebug("%sPAGE_INGAME%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_ROOMSLIST : qDebug("%sPAGE_ROOMSLIST%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_CONNECTING : qDebug("%sPAGE_CONNECTING%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_SCHEME : qDebug("%sPAGE_SCHEME%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_ADMIN : qDebug("%sPAGE_ADMIN%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_NETTYPE : qDebug("%sPAGE_NETTYPE%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_CAMPAIGN : qDebug("%sPAGE_CAMPAIGN%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_DRAWMAP : qDebug("%sPAGE_DRAWMAP%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_DATADOWNLOAD : qDebug("%sPAGE_DATADOWNLOAD%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_FEEDBACK : qDebug("%sPAGE_FEEDBACK%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case ID_PAGE_VIDEOS : qDebug("%sPAGE_VIDEOS%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + case MAX_PAGE : qDebug("%sMAX_PAGE%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + default : qDebug("%sUNKNOWN PAGE%s", qPrintable(closePrefix), qPrintable(closeSuffix)); break; + } //end switch(lastid) + switch (id) { //Print the id of the opened page + case ID_PAGE_SETUP_TEAM : qDebug("%sPAGE_SETUP_TEAM%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_SETUP : qDebug("%sPAGE_SETUP%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_MULTIPLAYER : qDebug("%sPAGE_MULTIPLAYER%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_DEMOS : qDebug("%sPAGE_DEMOS%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_NET : qDebug("%sPAGE_NET%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_NETGAME : qDebug("%sPAGE_NETGAME%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_INFO : qDebug("%sPAGE_INFO%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_MAIN : qDebug("%sPAGE_MAIN%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_GAMESTATS : qDebug("%sPAGE_GAMESTATS%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_SINGLEPLAYER : qDebug("%sPAGE_SINGLEPLAYER%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_TRAINING : qDebug("%sPAGE_TRAINING%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_SELECTWEAPON : qDebug("%sPAGE_SELECTWEAPON%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_NETSERVER : qDebug("%sPAGE_NETSERVER%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_INGAME : qDebug("%sPAGE_INGAME%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_ROOMSLIST : qDebug("%sPAGE_ROOMSLIST%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_CONNECTING : qDebug("%sPAGE_CONNECTING%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_SCHEME : qDebug("%sPAGE_SCHEME%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_ADMIN : qDebug("%sPAGE_ADMIN%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_NETTYPE : qDebug("%sPAGE_NETTYPE%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_CAMPAIGN : qDebug("%sPAGE_CAMPAIGN%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_DRAWMAP : qDebug("%sPAGE_DRAWMAP%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_DATADOWNLOAD : qDebug("%sPAGE_DATADOWNLOAD%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_FEEDBACK : qDebug("%sPAGE_FEEDBACK%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case ID_PAGE_VIDEOS : qDebug("%sPAGE_VIDEOS%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + case MAX_PAGE : qDebug("%sMAX_PAGE%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + default : qDebug("%sUNKNOWN PAGE%s", qPrintable(openPrefix), qPrintable(openSuffix)); break; + } //end switch(id) + if (id == ID_PAGE_DATADOWNLOAD) { ui.pageDataDownload->fetchList(); @@ -611,16 +681,6 @@ { ui.pageOptions->setTeamOptionsEnabled(true); } - - if (id == ID_PAGE_SETUP) - { - config->reloadValues(); - } - - if (id == ID_PAGE_VIDEOS ) - { - config->reloadVideosValues(); - } } void HWForm::GoToPage(int id) @@ -965,37 +1025,26 @@ void HWForm::NetPassword(const QString & nick) { - int passLength = config->value("net/passwordlength", 0).toInt(); - QString hash = config->value("net/passwordhash", "").toString(); + //Get hashes + QString hash = config->value("net/passwordhash", "").toString(); + QString temphash = config->value("net/temppasswordhash", "").toString(); + + //Check them - // If the password is blank, ask the user to enter one in - if (passLength == 0) - { - HWPasswordDialog * hpd = new HWPasswordDialog(this, tr("Your nickname %1 is\nregistered on Hedgewars.org\nPlease provide your password below\nor pick another nickname in game config:").arg(nick)); - hpd->cbSave->setChecked(config->value("net/savepassword", true).toBool()); - if (hpd->exec() != QDialog::Accepted) - { - ForcedDisconnect(tr("No password supplied.")); - delete hpd; - return; - } - - QString password = hpd->lePassword->text(); - hash = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Md5).toHex(); - - bool save = hpd->cbSave->isChecked(); - config->setValue("net/savepassword", save); - if (save) // user wants to save password - { - config->setValue("net/passwordhash", hash); - config->setValue("net/passwordlength", password.size()); - config->setNetPasswordLength(password.size()); - } - - delete hpd; + if (temphash.isEmpty() && hash.isEmpty()) { //If the user enters a registered nick with no password, sends a bogus hash + hwnet->SendPasswordHash("THISISNOHASH"); + } + else if (temphash.isEmpty()) { //Send saved hash as default + hwnet->SendPasswordHash(hash); + } + else { //Send the hash + hwnet->SendPasswordHash(temphash); } - hwnet->SendPasswordHash(hash); + //Remove temporary hash from config + QString key = "net/temppasswordhash"; + config->setValue(key, ""); + config->remove(key); } void HWForm::NetNickTaken(const QString & nick) @@ -1080,7 +1129,7 @@ //connect(ui.pageNetGame->BtnBack, SIGNAL(clicked()), hwnet, SLOT(partRoom())); ui.pageRoomsList->chatWidget->setUsersModel(hwnet->lobbyPlayersModel()); - ui.pageNetGame->pChatWidget->setUsersModel(hwnet->roomPlayersModel()); + ui.pageNetGame->chatWidget->setUsersModel(hwnet->roomPlayersModel()); // rooms list page stuff ui.pageRoomsList->setModel(hwnet->roomsListModel()); @@ -1109,26 +1158,26 @@ // net page stuff connect(hwnet, SIGNAL(chatStringFromNet(const QString&)), - ui.pageNetGame->pChatWidget, SLOT(onChatString(const QString&)), Qt::QueuedConnection); + ui.pageNetGame->chatWidget, SLOT(onChatString(const QString&)), Qt::QueuedConnection); connect(hwnet, SIGNAL(chatStringFromMe(const QString&)), - ui.pageNetGame->pChatWidget, SLOT(onChatString(const QString&)), Qt::QueuedConnection); + ui.pageNetGame->chatWidget, SLOT(onChatString(const QString&)), Qt::QueuedConnection); connect(hwnet, SIGNAL(roomMaster(bool)), - ui.pageNetGame->pChatWidget, SLOT(adminAccess(bool)), Qt::QueuedConnection); - connect(ui.pageNetGame->pChatWidget, SIGNAL(chatLine(const QString&)), + ui.pageNetGame->chatWidget, SLOT(adminAccess(bool)), Qt::QueuedConnection); + connect(ui.pageNetGame->chatWidget, SIGNAL(chatLine(const QString&)), hwnet, SLOT(chatLineToNet(const QString&))); connect(ui.pageNetGame->BtnGo, SIGNAL(clicked()), hwnet, SLOT(ToggleReady())); connect(hwnet, SIGNAL(setMyReadyStatus(bool)), ui.pageNetGame, SLOT(setReadyStatus(bool)), Qt::QueuedConnection); // chat widget actions - connect(ui.pageNetGame->pChatWidget, SIGNAL(kick(const QString&)), + connect(ui.pageNetGame->chatWidget, SIGNAL(kick(const QString&)), hwnet, SLOT(kickPlayer(const QString&))); - connect(ui.pageNetGame->pChatWidget, SIGNAL(ban(const QString&)), + connect(ui.pageNetGame->chatWidget, SIGNAL(ban(const QString&)), hwnet, SLOT(banPlayer(const QString&))); - connect(ui.pageNetGame->pChatWidget, SIGNAL(info(const QString&)), + connect(ui.pageNetGame->chatWidget, SIGNAL(info(const QString&)), hwnet, SLOT(infoPlayer(const QString&))); - connect(ui.pageNetGame->pChatWidget, SIGNAL(follow(const QString&)), + connect(ui.pageNetGame->chatWidget, SIGNAL(follow(const QString&)), hwnet, SLOT(followPlayer(const QString&))); connect(ui.pageRoomsList->chatWidget, SIGNAL(kick(const QString&)), hwnet, SLOT(kickPlayer(const QString&))); @@ -1151,9 +1200,9 @@ // nick list stuff connect(hwnet, SIGNAL(nickAdded(const QString&, bool)), - ui.pageNetGame->pChatWidget, SLOT(nickAdded(const QString&, bool)), Qt::QueuedConnection); + ui.pageNetGame->chatWidget, SLOT(nickAdded(const QString&, bool)), Qt::QueuedConnection); connect(hwnet, SIGNAL(nickRemoved(const QString&)), - ui.pageNetGame->pChatWidget, SLOT(nickRemoved(const QString&)), Qt::QueuedConnection); + ui.pageNetGame->chatWidget, SLOT(nickRemoved(const QString&)), Qt::QueuedConnection); connect(hwnet, SIGNAL(nickAddedLobby(const QString&, bool)), ui.pageRoomsList->chatWidget, SLOT(nickAdded(const QString&, bool)), Qt::QueuedConnection); connect(hwnet, SIGNAL(nickRemovedLobby(const QString&)), @@ -1176,11 +1225,16 @@ connect(hwnet, SIGNAL(serverMessageNew(const QString&)), ui.pageAdmin, SLOT(serverMessageNew(const QString &))); connect(hwnet, SIGNAL(serverMessageOld(const QString&)), ui.pageAdmin, SLOT(serverMessageOld(const QString &))); connect(hwnet, SIGNAL(latestProtocolVar(int)), ui.pageAdmin, SLOT(protocol(int))); + connect(hwnet, SIGNAL(bansList(const QStringList &)), ui.pageAdmin, SLOT(setBansList(const QStringList &))); connect(ui.pageAdmin, SIGNAL(setServerMessageNew(const QString&)), hwnet, SLOT(setServerMessageNew(const QString &))); 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, SIGNAL(clearAccountsCache()), hwnet, SLOT(clearAccountsCache())); + connect(ui.pageAdmin, SIGNAL(bansListRequest()), hwnet, SLOT(getBanList())); + connect(ui.pageAdmin, SIGNAL(removeBan(QString)), hwnet, SLOT(removeBan(QString))); + connect(ui.pageAdmin, SIGNAL(banIP(QString,QString,int)), hwnet, SLOT(banIP(QString,QString,int))); + connect(ui.pageAdmin, SIGNAL(banNick(QString,QString,int)), hwnet, SLOT(banNick(QString,QString,int))); // disconnect connect(hwnet, SIGNAL(disconnected(const QString&)), this, SLOT(ForcedDisconnect(const QString&)), Qt::QueuedConnection); @@ -1189,24 +1243,88 @@ 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 and pass stuff + + //remove temppasswordhash just in case + config->value("net/temppasswordhash", ""); + config->remove("net/temppasswordhash"); + + //initialize + QString hash = config->value("net/passwordhash", "").toString(); + QString temphash = config->value("net/temppasswordhash", "").toString(); + QString nickname = config->value("net/nick", "").toString(); + QString password; + + if (nickname.isEmpty() || hash.isEmpty()) { //if something from login is missing, start dialog loop + + while (nickname.isEmpty() || (hash.isEmpty() && temphash.isEmpty())) //while a nickname, or both hashes are missing { - nick = QInputDialog::getText(this, - QObject::tr("Nickname"), - QObject::tr("Please enter your nickname"), - QLineEdit::Normal, - QDir::home().dirName()); - config->setValue("net/nick",nick); + //open dialog + HWPasswordDialog * hpd = new HWPasswordDialog(this); + hpd->cbSave->setChecked(config->value("net/savepassword", true).toBool()); + + //if nickname is present, put it into the field + if (!nickname.isEmpty()) { + hpd->leNickname->setText(nickname); + hpd->lePassword->setFocus(); + } + + //if dialog close, create an error message + if (hpd->exec() != QDialog::Accepted) + { + ForcedDisconnect(tr("Login info not supplied.")); + delete hpd; + return; + } + + //set nick and pass from the dialog + nickname = hpd->leNickname->text(); + password = hpd->lePassword->text(); + + //calculate temphash and set it into config + temphash = QCryptographicHash::hash(password.toUtf8(), QCryptographicHash::Md5).toHex(); + config->setValue("net/temppasswordhash", temphash); + + //if user wants to save password + bool save = hpd->cbSave->isChecked(); + config->setValue("net/savepassword", save); + if (save) // user wants to save password + { + config->setValue("net/passwordhash", temphash); + config->setValue("net/passwordlength", password.size()); + config->setNetPasswordLength(password.size()); + } + + delete hpd; + + + //update nickname + config->setValue("net/nick", nickname); config->updNetNick(); + + //and all the variables + hash = config->value("net/passwordhash", "").toString(); + temphash = config->value("net/temppasswordhash", "").toString(); + nickname = config->value("net/nick", "").toString(); + } + + + //if pass is none (hash is generated anyway), remove the hash + if (password.size() <= 0) { + config->setValue("net/temppasswordhash", ""); + config->remove("net/temppasswordhash"); + } } - ui.pageRoomsList->setUser(nick); - ui.pageNetGame->setUser(nick); + ui.pageRoomsList->setUser(nickname); + ui.pageNetGame->setUser(nickname); - hwnet->Connect(hostName, port, nick); + hwnet->Connect(hostName, port, nickname); } + + void HWForm::NetConnect() { HWHostPortDialog * hpd = new HWHostPortDialog(this); @@ -1294,7 +1412,7 @@ void HWForm::NetGameEnter() { - ui.pageNetGame->pChatWidget->clear(); + ui.pageNetGame->chatWidget->clear(); GoToPage(ID_PAGE_NETGAME); } diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/hwform.h --- a/QTfrontend/hwform.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/hwform.h Tue Dec 04 09:15:55 2012 +0400 @@ -61,7 +61,6 @@ HWForm(QWidget *parent = 0, QString styleSheet = ""); Ui_HWForm ui; static GameUIConfig * config; - static 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(); @@ -146,7 +145,7 @@ private: void _NetConnect(const QString & hostName, quint16 port, QString nick); - void UpdateTeamsLists(const QStringList* editable_teams=0); + void UpdateTeamsLists(); void CreateGame(GameCFGWidget * gamecfg, TeamSelWidget* pTeamSelWidget, QString ammo); void closeEvent(QCloseEvent *event); void CustomizePalettes(); @@ -178,8 +177,8 @@ ID_PAGE_DRAWMAP , ID_PAGE_DATADOWNLOAD , ID_PAGE_FEEDBACK , - ID_PAGE_VIDEOS, - MAX_PAGE + ID_PAGE_VIDEOS , + MAX_PAGE }; QPointer game; QPointer pnetserver; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/main.cpp --- a/QTfrontend/main.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/main.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -90,9 +90,9 @@ bool checkForDir(const QString & dir) { - QDir tmpdir; - if (!tmpdir.exists(dir)) - if (!tmpdir.mkdir(dir)) + QDir tmpdir(dir); + if (!tmpdir.exists()) + if (!tmpdir.mkpath(dir)) { QMessageBox directoryMsg(QApplication::activeWindow()); directoryMsg.setIcon(QMessageBox::Warning); @@ -105,8 +105,37 @@ return true; } +bool checkForFile(const QString & file) +{ + QFile tmpfile(file); + if (!tmpfile.exists()) + return tmpfile.open(QFile::WriteOnly); + else + return true; +} + +#ifdef __APPLE__ +static CocoaInitializer *cocoaInit = NULL; +// Function to be called at end of program's termination on OS X to release +// the NSAutoReleasePool contained within the CocoaInitializer. +void releaseCocoaPool(void) +{ + if (cocoaInit != NULL) + { + delete cocoaInit; + cocoaInit = NULL; + } +} +#endif + int main(int argc, char *argv[]) { +#ifdef __APPLE__ + // This creates the autoreleasepool that prevents leaking, and destroys it only on exit + cocoaInit = new CocoaInitializer(); + atexit(releaseCocoaPool); +#endif + HWApplication app(argc, argv); FileEngineHandler engine(argv[0]); @@ -232,6 +261,8 @@ engine.setWriteDir(cfgdir->absolutePath()); engine.mountPacks(); + checkForFile("physfs://hedgewars.ini"); + QTranslator Translator; { QSettings settings("physfs://hedgewars.ini", QSettings::IniFormat); @@ -254,10 +285,6 @@ registry_hklm.setValue("Software/Hedgewars/Path", bindir->absolutePath().replace("/", "\\")); } #endif -#ifdef __APPLE__ - // this creates the autoreleasepool that prevents leaking - CocoaInitializer initializer; -#endif QString style = ""; QString fname; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/net/newnetclient.cpp --- a/QTfrontend/net/newnetclient.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/net/newnetclient.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -364,6 +364,14 @@ return; } + if (lst[0] == "BANLIST") + { + QStringList tmp = lst; + tmp.removeFirst(); + emit bansList(tmp); + return; + } + if (lst[0] == "CLIENT_FLAGS") { if(lst.size() < 3 || lst[1].size() < 2) @@ -863,6 +871,26 @@ RawSendNet(QString("BAN%1%2").arg(delimeter).arg(nick)); } +void HWNewNet::banIP(const QString & ip, const QString & reason, int seconds) +{ + RawSendNet(QString("BANIP%1%2%1%3%1%4").arg(delimeter).arg(ip).arg(reason).arg(seconds)); +} + +void HWNewNet::banNick(const QString & nick, const QString & reason, int seconds) +{ + RawSendNet(QString("BANNICK%1%2%1%3%1%4").arg(delimeter).arg(nick).arg(reason).arg(seconds)); +} + +void HWNewNet::getBanList() +{ + RawSendNet(QByteArray("BANLIST")); +} + +void HWNewNet::removeBan(const QString & b) +{ + RawSendNet(QString("UNBAN%1%2").arg(delimeter).arg(b)); +} + void HWNewNet::kickPlayer(const QString & nick) { RawSendNet(QString("KICK%1%2").arg(delimeter).arg(nick)); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/net/newnetclient.h --- a/QTfrontend/net/newnetclient.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/net/newnetclient.h Tue Dec 04 09:15:55 2012 +0400 @@ -123,6 +123,7 @@ void serverMessageNew(const QString &); void serverMessageOld(const QString &); void latestProtocolVar(int); + void bansList(const QStringList &); void setMyReadyStatus(bool isReady); @@ -156,7 +157,11 @@ void toggleRestrictJoins(); void toggleRestrictTeamAdds(); void partRoom(); - void clearAccountsCache(); + void clearAccountsCache(); + void getBanList(); + void removeBan(const QString &); + void banIP(const QString & ip, const QString & reason, int seconds); + void banNick(const QString & nick, const QString & reason, int seconds); private slots: void ClientRead(); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/dialog/bandialog.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/dialog/bandialog.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -0,0 +1,87 @@ +#include +#include +#include +#include +#include +#include +#include +#include + +#include "bandialog.h" + +BanDialog::BanDialog(QWidget *parent) : + QDialog(parent) +{ + QFormLayout * formLayout = new QFormLayout(this); + + rbIP = new QRadioButton(this); + rbIP->setChecked(true); + rbNick = new QRadioButton(this); + leId = new QLineEdit(this); + leReason = new QLineEdit(this); + cbTime = new QComboBox(this); + + cbTime->addItem(tr("10 minutes"), 5 * 60); + cbTime->addItem(tr("30 minutes"), 10 * 60); + cbTime->addItem(tr("1 hour"), 60 * 60); + cbTime->addItem(tr("3 hours"), 3 * 60 * 60); + cbTime->addItem(tr("5 hours"), 5 * 60 * 60); + cbTime->addItem(tr("24 hours"), 24 * 60 * 60); + cbTime->addItem(tr("3 days"), 72 * 60 * 60); + cbTime->addItem(tr("7 days"), 168 * 60 * 60); + cbTime->addItem(tr("14 days"), 336 * 60 * 60); + cbTime->addItem(tr("permanent"), 3650 * 24 * 60 * 60); + cbTime->setCurrentIndex(0); + + formLayout->addRow(tr("IP"), rbIP); + formLayout->addRow(tr("Nick"), rbNick); + formLayout->addRow(tr("IP/Nick"), leId); + formLayout->addRow(tr("Reason"), leReason); + formLayout->addRow(tr("Duration"), cbTime); + + formLayout->setLabelAlignment(Qt::AlignRight); + + QHBoxLayout * hbox = new QHBoxLayout(); + formLayout->addRow(hbox); + QPushButton * btnOk = new QPushButton(tr("Ok"), this); + QPushButton * btnCancel = new QPushButton(tr("Cancel"), this); + hbox->addStretch(); + hbox->addWidget(btnOk); + hbox->addWidget(btnCancel); + + connect(btnOk, SIGNAL(clicked()), this, SLOT(okClicked())); + connect(btnCancel, SIGNAL(clicked()), this, SLOT(reject())); + + this->setWindowModality(Qt::WindowModal); +} + +bool BanDialog::byIP() +{ + return rbIP->isChecked(); +} + +int BanDialog::duration() +{ + return cbTime->itemData(cbTime->currentIndex()).toInt(); +} + +QString BanDialog::banId() +{ + return leId->text(); +} + +QString BanDialog::reason() +{ + return leReason->text().isEmpty() ? tr("you know why") : leReason->text(); +} + +void BanDialog::okClicked() +{ + if(leId->text().isEmpty()) + { + QMessageBox::warning(this, tr("Warning"), tr("Please, specify %1").arg(byIP() ? tr("IP") : tr("nickname"))); + return; + } + + accept(); +} diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/dialog/bandialog.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/dialog/bandialog.h Tue Dec 04 09:15:55 2012 +0400 @@ -0,0 +1,32 @@ +#ifndef BANDIALOG_H +#define BANDIALOG_H + +#include + +class QComboBox; +class QRadioButton; +class QLineEdit; + +class BanDialog : public QDialog +{ + Q_OBJECT +public: + explicit BanDialog(QWidget *parent = 0); + + bool byIP(); + int duration(); + QString banId(); + QString reason(); + +private: + QRadioButton * rbIP; + QRadioButton * rbNick; + QLineEdit * leId; + QLineEdit * leReason; + QComboBox * cbTime; + +private slots: + void okClicked(); +}; + +#endif // BANDIALOG_H diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/dialog/input_password.cpp --- a/QTfrontend/ui/dialog/input_password.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/dialog/input_password.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -25,28 +25,44 @@ #include "input_password.h" -HWPasswordDialog::HWPasswordDialog(QWidget* parent, const QString & label) : QDialog(parent) +HWPasswordDialog::HWPasswordDialog(QWidget* parent) : QDialog(parent) { - setWindowTitle(tr("Password")); + setWindowTitle(tr("Login")); + + QString titleLabelText = "To connect to the server, please log in.\n\nIf you don't have an account on www.hedgewars.org,\njust enter your nickname."; + QString nickLabelText = "Nickname:"; + QString passLabelText = "Password:"; QGridLayout * layout = new QGridLayout(this); - QLabel * lbLabel = new QLabel(this); - lbLabel->setText(label); - layout->addWidget(lbLabel, 0, 0); + QLabel * titleLabel = new QLabel(this); + titleLabel->setText(titleLabelText); + layout->addWidget(titleLabel, 0, 0); + + QLabel * nickLabel = new QLabel(this); + nickLabel->setText(nickLabelText); + layout->addWidget(nickLabel, 1, 0); + + leNickname = new QLineEdit(this); + leNickname->setEchoMode(QLineEdit::Normal); + layout->addWidget(leNickname, 2, 0); + + QLabel * passLabel = new QLabel(this); + passLabel->setText(passLabelText); + layout->addWidget(passLabel, 3, 0); lePassword = new QLineEdit(this); lePassword->setEchoMode(QLineEdit::Password); - layout->addWidget(lePassword, 1, 0); + layout->addWidget(lePassword, 4, 0); cbSave = new QCheckBox(this); cbSave->setText(QCheckBox::tr("Save password")); - layout->addWidget(cbSave, 2, 0); + layout->addWidget(cbSave, 5, 0); QDialogButtonBox* dbbButtons = new QDialogButtonBox(this); QPushButton * pbOK = dbbButtons->addButton(QDialogButtonBox::Ok); QPushButton * pbCancel = dbbButtons->addButton(QDialogButtonBox::Cancel); - layout->addWidget(dbbButtons, 3, 0); + layout->addWidget(dbbButtons, 6, 0); connect(pbOK, SIGNAL(clicked()), this, SLOT(accept())); connect(pbCancel, SIGNAL(clicked()), this, SLOT(reject())); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/dialog/input_password.h --- a/QTfrontend/ui/dialog/input_password.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/dialog/input_password.h Tue Dec 04 09:15:55 2012 +0400 @@ -28,9 +28,10 @@ { Q_OBJECT public: - HWPasswordDialog(QWidget* parent, const QString & label); + HWPasswordDialog(QWidget* parent); QLineEdit* lePassword; + QLineEdit* leNickname; QCheckBox* cbSave; }; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/AbstractPage.cpp --- a/QTfrontend/ui/page/AbstractPage.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/AbstractPage.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -41,8 +41,9 @@ QGridLayout * pageLayout = new QGridLayout(this); // stretch grid space for body and footer - pageLayout->setColumnStretch(0,0); - pageLayout->setColumnStretch(1,1); + pageLayout->setColumnStretch(0,1); + pageLayout->setColumnStretch(1,2); + pageLayout->setColumnStretch(2,1); pageLayout->setRowStretch(0,1); pageLayout->setRowStretch(1,0); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pageadmin.cpp --- a/QTfrontend/ui/page/pageadmin.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pageadmin.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -22,56 +22,98 @@ #include #include #include +#include +#include #include "pageadmin.h" #include "chatwidget.h" +#include "bandialog.h" QLayout * PageAdmin::bodyLayoutDefinition() { - QGridLayout * pageLayout = new QGridLayout(); - - // 0 - pbAsk = addButton(tr("Fetch data"), pageLayout, 0, 0, 1, 3); + QVBoxLayout * pageLayout = new QVBoxLayout(); - // 1 - QLabel * lblSMN = new QLabel(this); - lblSMN->setText(tr("Server message for latest version:")); - pageLayout->addWidget(lblSMN, 1, 0); + QTabWidget * tabs = new QTabWidget(this); + pageLayout->addWidget(tabs); + QWidget * page1 = new QWidget(this); + QWidget * page2 = new QWidget(this); + tabs->addTab(page1, tr("General")); + tabs->addTab(page2, tr("Bans")); + + // page 1 + { + QGridLayout * tab1Layout = new QGridLayout(page1); + + // 0 + pbAsk = addButton(tr("Fetch data"), tab1Layout, 0, 0, 1, 3); - leServerMessageNew = new QLineEdit(this); - pageLayout->addWidget(leServerMessageNew, 1, 1); + // 1 + QLabel * lblSMN = new QLabel(this); + lblSMN->setText(tr("Server message for latest version:")); + tab1Layout->addWidget(lblSMN, 1, 0); + + leServerMessageNew = new QLineEdit(this); + tab1Layout->addWidget(leServerMessageNew, 1, 1); - // 2 - QLabel * lblSMO = new QLabel(this); - lblSMO->setText(tr("Server message for previous versions:")); - pageLayout->addWidget(lblSMO, 2, 0); + // 2 + QLabel * lblSMO = new QLabel(this); + lblSMO->setText(tr("Server message for previous versions:")); + tab1Layout->addWidget(lblSMO, 2, 0); + + leServerMessageOld = new QLineEdit(this); + tab1Layout->addWidget(leServerMessageOld, 2, 1); - leServerMessageOld = new QLineEdit(this); - pageLayout->addWidget(leServerMessageOld, 2, 1); + // 3 + QLabel * lblP = new QLabel(this); + lblP->setText(tr("Latest version protocol number:")); + tab1Layout->addWidget(lblP, 3, 0); + + sbProtocol = new QSpinBox(this); + tab1Layout->addWidget(sbProtocol, 3, 1); - // 3 - QLabel * lblP = new QLabel(this); - lblP->setText(tr("Latest version protocol number:")); - pageLayout->addWidget(lblP, 3, 0); + // 4 + QLabel * lblPreview = new QLabel(this); + lblPreview->setText(tr("MOTD preview:")); + tab1Layout->addWidget(lblPreview, 4, 0); - sbProtocol = new QSpinBox(this); - pageLayout->addWidget(sbProtocol, 3, 1); + tb = new QTextBrowser(this); + tb->setOpenExternalLinks(true); + tb->document()->setDefaultStyleSheet(HWChatWidget::styleSheet()); + tab1Layout->addWidget(tb, 4, 1, 1, 2); + + // 5 + pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), tab1Layout, 5, 0); + + // 6 + pbSetSM = addButton(tr("Set data"), tab1Layout, 6, 0, 1, 3); + } - // 4 - QLabel * lblPreview = new QLabel(this); - lblPreview->setText(tr("MOTD preview:")); - pageLayout->addWidget(lblPreview, 4, 0); + // page 2 + { + QGridLayout * tab2Layout = new QGridLayout(page2); + twBans = new QTableWidget(this); + twBans->setColumnCount(3); + twBans->setHorizontalHeaderLabels(QStringList() + << tr("IP/Nick") + << tr("Expiration") + << tr("Reason") + ); + twBans->horizontalHeader()->setResizeMode(2, QHeaderView::Stretch); + twBans->setEditTriggers(QAbstractItemView::NoEditTriggers); + twBans->setSelectionBehavior(QAbstractItemView::SelectRows); + twBans->setSelectionMode(QAbstractItemView::SingleSelection); + twBans->setAlternatingRowColors(true); + tab2Layout->addWidget(twBans, 0, 1, 4, 1); - tb = new QTextBrowser(this); - tb->setOpenExternalLinks(true); - tb->document()->setDefaultStyleSheet(HWChatWidget::styleSheet()); - pageLayout->addWidget(tb, 4, 1, 1, 2); + QPushButton * btnRefresh = addButton(tr("Refresh"), tab2Layout, 0, 0); + QPushButton * btnAdd = addButton(tr("Add"), tab2Layout, 1, 0); + QPushButton * btnRemove = addButton(tr("Remove"), tab2Layout, 2, 0); - // 5 - pbClearAccountsCache = addButton(tr("Clear Accounts Cache"), pageLayout, 5, 0); - - // 6 - pbSetSM = addButton(tr("Set data"), pageLayout, 6, 0, 1, 3); + connect(btnRefresh, SIGNAL(clicked()), this, SIGNAL(bansListRequest())); + connect(btnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClicked())); + connect(btnAdd, SIGNAL(clicked()), this, SLOT(onAddClicked())); + connect(btnRemove, SIGNAL(clicked()), this, SLOT(onRemoveClicked())); + } return pageLayout; } @@ -106,7 +148,64 @@ { leServerMessageOld->setText(str); } + void PageAdmin::protocol(int proto) { sbProtocol->setValue(proto); } + +void PageAdmin::onAddClicked() +{ + BanDialog dialog(this); + + if(dialog.exec()) + { + if(dialog.byIP()) + { + emit banIP(dialog.banId(), dialog.reason(), dialog.duration()); + } else + { + emit banNick(dialog.banId(), dialog.reason(), dialog.duration()); + } + + emit bansListRequest(); + } +} + +void PageAdmin::onRemoveClicked() +{ + QList sel = twBans->selectedItems(); + + if(sel.size()) + { + emit removeBan(twBans->item(sel[0]->row(), 0)->data(Qt::DisplayRole).toString()); + emit bansListRequest(); + } +} + +void PageAdmin::setBansList(const QStringList & bans) +{ + if(bans.size() % 4) + return; + + twBans->setRowCount(bans.size() / 4); + + for(int i = 0; i < bans.size(); i += 4) + { + if(!twBans->item(i / 4, 0)) + { + twBans->setItem(i / 4, 0, new QTableWidgetItem()); + twBans->setItem(i / 4, 1, new QTableWidgetItem()); + twBans->setItem(i / 4, 2, new QTableWidgetItem()); + } + + twBans->item(i / 4, 0)->setData(Qt::DisplayRole, bans[i + 1]); + twBans->item(i / 4, 1)->setData(Qt::DisplayRole, bans[i + 3]); + twBans->item(i / 4, 2)->setData(Qt::DisplayRole, bans[i + 2]); + } +} + +void PageAdmin::onRefreshClicked() +{ + twBans->setRowCount(0); +} diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pageadmin.h --- a/QTfrontend/ui/page/pageadmin.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pageadmin.h Tue Dec 04 09:15:55 2012 +0400 @@ -21,6 +21,8 @@ #include "AbstractPage.h" +class QTableWidget; + class PageAdmin : public AbstractPage { Q_OBJECT @@ -32,6 +34,7 @@ void serverMessageNew(const QString & str); void serverMessageOld(const QString & str); void protocol(int proto); + void setBansList(const QStringList & bans); signals: void setServerMessageNew(const QString & str); @@ -39,6 +42,10 @@ void setProtocol(int proto); void askServerVars(); void clearAccountsCache(); + void bansListRequest(); + void removeBan(const QString &); + void banIP(const QString & ip, const QString & reason, int seconds); + void banNick(const QString & nick, const QString & reason, int seconds); protected: QLayout * bodyLayoutDefinition(); @@ -52,9 +59,13 @@ QSpinBox * sbProtocol; QTextBrowser * tb; QPushButton * pbClearAccountsCache; + QTableWidget * twBans; private slots: void smChanged(); + void onAddClicked(); + void onRemoveClicked(); + void onRefreshClicked(); }; #endif diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pagemain.cpp --- a/QTfrontend/ui/page/pagemain.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pagemain.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -115,7 +115,7 @@ } else { - setDefautDescription(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!")); + setDefautDescription(QLabel::tr("This development build is 'work in progress' and may not be compatible with other versions of the game, while some features might be broken or incomplete!")); } } diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pagenetgame.cpp --- a/QTfrontend/ui/page/pagenetgame.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pagenetgame.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -37,10 +37,10 @@ pageLayout->setColumnStretch(1, 50); // chatwidget - pChatWidget = new HWChatWidget(this, m_gameSettings, true); - pChatWidget->setShowFollow(false); // don't show follow in nicks' context menus - pChatWidget->setIgnoreListKick(true); // kick ignored players automatically - pageLayout->addWidget(pChatWidget, 2, 0, 1, 2); + chatWidget = new HWChatWidget(this, true); + chatWidget->setShowFollow(false); // don't show follow in nicks' context menus + chatWidget->setIgnoreListKick(true); // kick ignored players automatically + pageLayout->addWidget(chatWidget, 2, 0, 1, 2); pageLayout->setRowStretch(1, 100); pageLayout->setRowStretch(2, 100); @@ -96,10 +96,8 @@ connect(BtnUpdate, SIGNAL(clicked()), this, SLOT(onUpdateClick())); } -PageNetGame::PageNetGame(QWidget* parent, QSettings * gameSettings) : AbstractPage(parent) +PageNetGame::PageNetGame(QWidget* parent) : AbstractPage(parent) { - m_gameSettings = gameSettings; - initPage(); QMenu * menu = new QMenu(BtnMaster); @@ -113,24 +111,23 @@ menu->addAction(restrictTeamAdds); BtnMaster->setMenu(menu); - } void PageNetGame::displayError(const QString & message) { - pChatWidget->displayError(message); + chatWidget->displayError(message); } void PageNetGame::displayNotice(const QString & message) { - pChatWidget->displayNotice(message); + chatWidget->displayNotice(message); } void PageNetGame::displayWarning(const QString & message) { - pChatWidget->displayWarning(message); + chatWidget->displayWarning(message); } @@ -178,5 +175,5 @@ void PageNetGame::setUser(const QString & nickname) { - pChatWidget->setUser(nickname); + chatWidget->setUser(nickname); } diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pagenetgame.h --- a/QTfrontend/ui/page/pagenetgame.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pagenetgame.h Tue Dec 04 09:15:55 2012 +0400 @@ -32,7 +32,7 @@ Q_OBJECT public: - PageNetGame(QWidget* parent, QSettings * gameSettings); + PageNetGame(QWidget* parent); /** * Sets the room name to display. @@ -52,7 +52,7 @@ QAction * restrictJoins; QAction * restrictTeamAdds; - HWChatWidget* pChatWidget; + HWChatWidget* chatWidget; TeamSelWidget* pNetTeamsWidget; GameCFGWidget* pGameCFG; @@ -72,8 +72,6 @@ QLayout * footerLayoutDefinition(); void connectSignals(); - QSettings * m_gameSettings; - HistoryLineEdit * leRoomName; QPushButton * btnSetup; }; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pageoptions.cpp --- a/QTfrontend/ui/page/pageoptions.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pageoptions.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -33,10 +33,12 @@ #include #include "pageoptions.h" +#include "gameuiconfig.h" #include "hwconsts.h" #include "fpsedit.h" #include "igbox.h" #include "DataManager.h" +#include "LibavInteraction.h" // TODO cleanup QLayout * PageOptions::bodyLayoutDefinition() @@ -50,6 +52,11 @@ tabs->addTab(page1, tr("General")); tabs->addTab(page2, tr("Advanced")); +#ifdef VIDEOREC + QWidget * page3 = new QWidget(this); + tabs->addTab(page3, tr("Video Recording")); +#endif + { // page 1 QGridLayout * page1Layout = new QGridLayout(page1); //gbTBLayout->setMargin(0); @@ -477,6 +484,121 @@ page2Layout->addWidget(new QWidget(this), 2, 0); } +#ifdef VIDEOREC + { // page 3 + QGridLayout * page3Layout = new QGridLayout(page3); + + IconedGroupBox* pOptionsGroup = new IconedGroupBox(this); + pOptionsGroup->setIcon(QIcon(":/res/Settings.png")); // FIXME + pOptionsGroup->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + pOptionsGroup->setTitle(QGroupBox::tr("Video recording options")); + QGridLayout * pOptLayout = new QGridLayout(pOptionsGroup); + + // label for format + QLabel *labelFormat = new QLabel(pOptionsGroup); + labelFormat->setText(QLabel::tr("Format")); + pOptLayout->addWidget(labelFormat, 0, 0); + + // list of supported formats + comboAVFormats = new QComboBox(pOptionsGroup); + pOptLayout->addWidget(comboAVFormats, 0, 1, 1, 4); + LibavInteraction::instance().fillFormats(comboAVFormats); + + // separator + QFrame * hr = new QFrame(pOptionsGroup); + hr->setFrameStyle(QFrame::HLine); + hr->setLineWidth(3); + hr->setFixedHeight(10); + pOptLayout->addWidget(hr, 1, 0, 1, 5); + + // label for audio codec + QLabel *labelACodec = new QLabel(pOptionsGroup); + labelACodec->setText(QLabel::tr("Audio codec")); + pOptLayout->addWidget(labelACodec, 2, 0); + + // list of supported audio codecs + comboAudioCodecs = new QComboBox(pOptionsGroup); + pOptLayout->addWidget(comboAudioCodecs, 2, 1, 1, 3); + + // checkbox 'record audio' + checkRecordAudio = new QCheckBox(pOptionsGroup); + checkRecordAudio->setText(QCheckBox::tr("Record audio")); + pOptLayout->addWidget(checkRecordAudio, 2, 4); + + // separator + hr = new QFrame(pOptionsGroup); + hr->setFrameStyle(QFrame::HLine); + hr->setLineWidth(3); + hr->setFixedHeight(10); + pOptLayout->addWidget(hr, 3, 0, 1, 5); + + // label for video codec + QLabel *labelVCodec = new QLabel(pOptionsGroup); + labelVCodec->setText(QLabel::tr("Video codec")); + pOptLayout->addWidget(labelVCodec, 4, 0); + + // list of supported video codecs + comboVideoCodecs = new QComboBox(pOptionsGroup); + pOptLayout->addWidget(comboVideoCodecs, 4, 1, 1, 4); + + // label for resolution + QLabel *labelRes = new QLabel(pOptionsGroup); + labelRes->setText(QLabel::tr("Resolution")); + pOptLayout->addWidget(labelRes, 5, 0); + + // width + widthEdit = new QLineEdit(pOptionsGroup); + widthEdit->setValidator(new QIntValidator(this)); + pOptLayout->addWidget(widthEdit, 5, 1); + + // x + QLabel *labelX = new QLabel(pOptionsGroup); + labelX->setText("X"); + pOptLayout->addWidget(labelX, 5, 2); + + // height + heightEdit = new QLineEdit(pOptionsGroup); + heightEdit->setValidator(new QIntValidator(pOptionsGroup)); + pOptLayout->addWidget(heightEdit, 5, 3); + + // checkbox 'use game resolution' + checkUseGameRes = new QCheckBox(pOptionsGroup); + checkUseGameRes->setText(QCheckBox::tr("Use game resolution")); + pOptLayout->addWidget(checkUseGameRes, 5, 4); + + // label for framerate + QLabel *labelFramerate = new QLabel(pOptionsGroup); + labelFramerate->setText(QLabel::tr("Framerate")); + pOptLayout->addWidget(labelFramerate, 6, 0); + + framerateBox = new QComboBox(pOptionsGroup); + framerateBox->addItem("24 fps", 24); + framerateBox->addItem("25 fps", 25); + framerateBox->addItem("30 fps", 30); + framerateBox->addItem("50 fps", 50); + framerateBox->addItem("60 fps", 60); + pOptLayout->addWidget(framerateBox, 6, 1); + + // label for Bitrate + QLabel *labelBitrate = new QLabel(pOptionsGroup); + labelBitrate->setText(QLabel::tr("Bitrate (Kbps)")); + pOptLayout->addWidget(labelBitrate, 6, 2); + + // bitrate + bitrateBox = new QSpinBox(pOptionsGroup); + bitrateBox->setRange(100, 5000); + bitrateBox->setSingleStep(100); + pOptLayout->addWidget(bitrateBox, 6, 3); + + // button 'set default options' + btnDefaults = new QPushButton(pOptionsGroup); + btnDefaults->setText(QPushButton::tr("Set default options")); + btnDefaults->setWhatsThis(QPushButton::tr("Restore default coding parameters")); + pOptLayout->addWidget(btnDefaults, 7, 0, 1, 5); + + page3Layout->addWidget(pOptionsGroup, 1, 0); + } +#endif previousQuality = this->SLQuality->value(); previousResolutionIndex = this->CBResolution->currentIndex(); @@ -492,6 +614,13 @@ void PageOptions::connectSignals() { +#ifdef VIDEOREC + connect(checkUseGameRes, SIGNAL(stateChanged(int)), this, SLOT(changeUseGameRes(int))); + connect(checkRecordAudio, SIGNAL(stateChanged(int)), this, SLOT(changeRecordAudio(int))); + connect(comboAVFormats, SIGNAL(currentIndexChanged(int)), this, SLOT(changeAVFormat(int))); + connect(btnDefaults, SIGNAL(clicked()), this, SLOT(setDefaultOptions())); +#endif + connect(SLQuality, SIGNAL(valueChanged(int)), this, SLOT(setQuality(int))); connect(CBResolution, SIGNAL(currentIndexChanged(int)), this, SLOT(setResolution(int))); connect(CBFullscreen, SIGNAL(stateChanged(int)), this, SLOT(setFullscreen(int))); @@ -500,7 +629,7 @@ connect(CBSavePassword, SIGNAL(stateChanged(int)), this, SLOT(savePwdChanged(int))); } -PageOptions::PageOptions(QWidget* parent) : AbstractPage(parent) +PageOptions::PageOptions(QWidget* parent) : AbstractPage(parent), config(0) { initPage(); } @@ -619,3 +748,128 @@ leProxyLogin->setEnabled(b); leProxyPassword->setEnabled(b); } + +// Video Recording + +void PageOptions::setConfig(GameUIConfig * config) +{ + this->config = config; +} + +// user changed file format, we need to update list of codecs +void PageOptions::changeAVFormat(int index) +{ + // remember selected codecs + QString prevVCodec = videoCodec(); + QString prevACodec = audioCodec(); + + // clear lists of codecs + comboVideoCodecs->clear(); + comboAudioCodecs->clear(); + + // get list of codecs for specified format + LibavInteraction::instance().fillCodecs(comboAVFormats->itemData(index).toString(), comboVideoCodecs, comboAudioCodecs); + + // disable audio if there is no audio codec + if (comboAudioCodecs->count() == 0) + { + checkRecordAudio->setChecked(false); + checkRecordAudio->setEnabled(false); + } + else + checkRecordAudio->setEnabled(true); + + // restore selected codecs if possible + int iVCodec = comboVideoCodecs->findData(prevVCodec); + if (iVCodec != -1) + comboVideoCodecs->setCurrentIndex(iVCodec); + int iACodec = comboAudioCodecs->findData(prevACodec); + if (iACodec != -1) + comboAudioCodecs->setCurrentIndex(iACodec); +} + +// user switched checkbox 'use game resolution' +void PageOptions::changeUseGameRes(int state) +{ + if (state && config) + { + // set resolution to game resolution + QRect resolution = config->vid_Resolution(); + widthEdit->setText(QString::number(resolution.width())); + heightEdit->setText(QString::number(resolution.height())); + } + widthEdit->setEnabled(!state); + heightEdit->setEnabled(!state); +} + +// user switched checkbox 'record audio' +void PageOptions::changeRecordAudio(int state) +{ + comboAudioCodecs->setEnabled(!!state); +} + +void PageOptions::setDefaultCodecs() +{ + // VLC should be able to handle any of these configurations + // Quicktime X only opens the first one + // Windows Media Player TODO + if (tryCodecs("mp4", "libx264", "aac")) + return; + if (tryCodecs("mp4", "libx264", "libfaac")) + return; + if (tryCodecs("mp4", "libx264", "libmp3lame")) + return; + if (tryCodecs("mp4", "libx264", "mp2")) + return; + if (tryCodecs("avi", "libxvid", "libmp3lame")) + return; + if (tryCodecs("avi", "libxvid", "ac3_fixed")) + return; + if (tryCodecs("avi", "libxvid", "mp2")) + return; + if (tryCodecs("avi", "mpeg4", "libmp3lame")) + return; + if (tryCodecs("avi", "mpeg4", "ac3_fixed")) + return; + if (tryCodecs("avi", "mpeg4", "mp2")) + return; + + // this shouldn't happen, just in case + if (tryCodecs("ogg", "libtheora", "libvorbis")) + return; + tryCodecs("ogg", "libtheora", "flac"); +} + +void PageOptions::setDefaultOptions() +{ + framerateBox->setCurrentIndex(2); + bitrateBox->setValue(1000); + checkRecordAudio->setChecked(true); + checkUseGameRes->setChecked(true); + setDefaultCodecs(); +} + +bool PageOptions::tryCodecs(const QString & format, const QString & vcodec, const QString & acodec) +{ + // first we should change format + int iFormat = comboAVFormats->findData(format); + if (iFormat == -1) + return false; + comboAVFormats->setCurrentIndex(iFormat); + // format was changed, so lists of codecs were automatically updated to codecs supported by this format + + // try to find video codec + int iVCodec = comboVideoCodecs->findData(vcodec); + if (iVCodec == -1) + return false; + comboVideoCodecs->setCurrentIndex(iVCodec); + + // try to find audio codec + int iACodec = comboAudioCodecs->findData(acodec); + if (iACodec == -1 && checkRecordAudio->isChecked()) + return false; + if (iACodec != -1) + comboAudioCodecs->setCurrentIndex(iACodec); + + return true; +} diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pageoptions.h --- a/QTfrontend/ui/page/pageoptions.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pageoptions.h Tue Dec 04 09:15:55 2012 +0400 @@ -21,6 +21,7 @@ #include "AbstractPage.h" +class GameUIConfig; class FPSEdit; class IconedGroupBox; class QSignalMapper; @@ -84,6 +85,28 @@ QLineEdit * leProxyLogin; QLineEdit * leProxyPassword; +#ifdef VIDEOREC + QComboBox *framerateBox; + QSpinBox *bitrateBox; + QLineEdit *widthEdit; + QLineEdit *heightEdit; + QCheckBox *checkUseGameRes; + QCheckBox *checkRecordAudio; + + QString format() + { return comboAVFormats->itemData(comboAVFormats->currentIndex()).toString(); } + + QString videoCodec() + { return comboVideoCodecs->itemData(comboVideoCodecs->currentIndex()).toString(); } + + QString audioCodec() + { return comboAudioCodecs->itemData(comboAudioCodecs->currentIndex()).toString(); } + + void setDefaultCodecs(); + bool tryCodecs(const QString & format, const QString & vcodec, const QString & acodec); + void setConfig(GameUIConfig * config); +#endif + void setTeamOptionsEnabled(bool enabled); signals: @@ -106,6 +129,14 @@ QPushButton *BtnDeleteTeam; QList m_colorButtons; +#ifdef VIDEOREC + QComboBox *comboAVFormats; + QComboBox *comboVideoCodecs; + QComboBox *comboAudioCodecs; + QPushButton *btnDefaults; + GameUIConfig * config; +#endif + private slots: void forceFullscreen(int index); void setFullscreen(int state); @@ -118,6 +149,14 @@ void colorButtonClicked(int i); void onColorModelDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight); void onProxyTypeChanged(); +#ifdef VIDEOREC + void changeAVFormat(int index); + void changeUseGameRes(int state); + void changeRecordAudio(int state); + + public slots: + void setDefaultOptions(); +#endif }; #endif diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pageroomslist.cpp --- a/QTfrontend/ui/page/pageroomslist.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pageroomslist.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -95,7 +95,7 @@ pageLayout->addLayout(filterLayout, 4, 0, 1, 2); - chatWidget = new HWChatWidget(this, m_gameSettings, false); + chatWidget = new HWChatWidget(this, false); pageLayout->addWidget(chatWidget, 5, 0, 1, 3); pageLayout->setRowStretch(5, 350); @@ -156,11 +156,9 @@ } -PageRoomsList::PageRoomsList(QWidget* parent, QSettings * gameSettings) : +PageRoomsList::PageRoomsList(QWidget* parent) : AbstractPage(parent) { - m_gameSettings = gameSettings; - roomsModel = NULL; stateFilteredModel = NULL; schemeFilteredModel = NULL; @@ -612,13 +610,17 @@ QString("*%1*").arg(CBWeapons->currentText())); } +void PageRoomsList::setSettings(QSettings *settings) +{ + m_gameSettings = settings; +} bool PageRoomsList::restoreHeaderState() { if (!m_gameSettings->contains("frontend/roomslist_header")) return false; return roomsList->horizontalHeader()->restoreState(QByteArray::fromBase64( - (m_gameSettings->value("frontend/roomslist_header").toString().toAscii()))); + (m_gameSettings->value("frontend/roomslist_header").toByteArray()))); } void PageRoomsList::saveHeaderState() diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pageroomslist.h --- a/QTfrontend/ui/page/pageroomslist.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pageroomslist.h Tue Dec 04 09:15:55 2012 +0400 @@ -32,10 +32,11 @@ Q_OBJECT public: - PageRoomsList(QWidget* parent, QSettings * config); + PageRoomsList(QWidget* parent); void displayError(const QString & message); void displayNotice(const QString & message); void displayWarning(const QString & message); + void setSettings(QSettings * settings); QLineEdit * roomName; QLineEdit * searchText; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pagevideos.cpp --- a/QTfrontend/ui/page/pagevideos.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pagevideos.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -109,119 +109,6 @@ QGridLayout * pPageLayout = new QGridLayout(); pPageLayout->setColumnStretch(0, 1); pPageLayout->setColumnStretch(1, 2); - pPageLayout->setRowStretch(0, 1); - pPageLayout->setRowStretch(1, 1); - - // options - { - IconedGroupBox* pOptionsGroup = new IconedGroupBox(this); - pOptionsGroup->setIcon(QIcon(":/res/Settings.png")); // FIXME - pOptionsGroup->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - pOptionsGroup->setTitle(QGroupBox::tr("Video recording options")); - QGridLayout * pOptLayout = new QGridLayout(pOptionsGroup); - - // label for format - QLabel *labelFormat = new QLabel(pOptionsGroup); - labelFormat->setText(QLabel::tr("Format")); - pOptLayout->addWidget(labelFormat, 0, 0); - - // list of supported formats - comboAVFormats = new QComboBox(pOptionsGroup); - pOptLayout->addWidget(comboAVFormats, 0, 1, 1, 4); - LibavInteraction::instance().fillFormats(comboAVFormats); - - // separator - QFrame * hr = new QFrame(pOptionsGroup); - hr->setFrameStyle(QFrame::HLine); - hr->setLineWidth(3); - hr->setFixedHeight(10); - pOptLayout->addWidget(hr, 1, 0, 1, 5); - - // label for audio codec - QLabel *labelACodec = new QLabel(pOptionsGroup); - labelACodec->setText(QLabel::tr("Audio codec")); - pOptLayout->addWidget(labelACodec, 2, 0); - - // list of supported audio codecs - comboAudioCodecs = new QComboBox(pOptionsGroup); - pOptLayout->addWidget(comboAudioCodecs, 2, 1, 1, 3); - - // checkbox 'record audio' - checkRecordAudio = new QCheckBox(pOptionsGroup); - checkRecordAudio->setText(QCheckBox::tr("Record audio")); - pOptLayout->addWidget(checkRecordAudio, 2, 4); - - // separator - hr = new QFrame(pOptionsGroup); - hr->setFrameStyle(QFrame::HLine); - hr->setLineWidth(3); - hr->setFixedHeight(10); - pOptLayout->addWidget(hr, 3, 0, 1, 5); - - // label for video codec - QLabel *labelVCodec = new QLabel(pOptionsGroup); - labelVCodec->setText(QLabel::tr("Video codec")); - pOptLayout->addWidget(labelVCodec, 4, 0); - - // list of supported video codecs - comboVideoCodecs = new QComboBox(pOptionsGroup); - pOptLayout->addWidget(comboVideoCodecs, 4, 1, 1, 4); - - // label for resolution - QLabel *labelRes = new QLabel(pOptionsGroup); - labelRes->setText(QLabel::tr("Resolution")); - pOptLayout->addWidget(labelRes, 5, 0); - - // width - widthEdit = new QLineEdit(pOptionsGroup); - widthEdit->setValidator(new QIntValidator(this)); - pOptLayout->addWidget(widthEdit, 5, 1); - - // x - QLabel *labelX = new QLabel(pOptionsGroup); - labelX->setText("X"); - pOptLayout->addWidget(labelX, 5, 2); - - // height - heightEdit = new QLineEdit(pOptionsGroup); - heightEdit->setValidator(new QIntValidator(pOptionsGroup)); - pOptLayout->addWidget(heightEdit, 5, 3); - - // checkbox 'use game resolution' - checkUseGameRes = new QCheckBox(pOptionsGroup); - checkUseGameRes->setText(QCheckBox::tr("Use game resolution")); - pOptLayout->addWidget(checkUseGameRes, 5, 4); - - // label for framerate - QLabel *labelFramerate = new QLabel(pOptionsGroup); - labelFramerate->setText(QLabel::tr("Framerate")); - pOptLayout->addWidget(labelFramerate, 6, 0); - - // framerate - framerateBox = new QSpinBox(pOptionsGroup); - framerateBox->setRange(1, 200); - framerateBox->setSingleStep(1); - pOptLayout->addWidget(framerateBox, 6, 1); - - // label for Bitrate - QLabel *labelBitrate = new QLabel(pOptionsGroup); - labelBitrate->setText(QLabel::tr("Bitrate (Kbps)")); - pOptLayout->addWidget(labelBitrate, 6, 2); - - // bitrate - bitrateBox = new QSpinBox(pOptionsGroup); - bitrateBox->setRange(100, 5000); - bitrateBox->setSingleStep(100); - pOptLayout->addWidget(bitrateBox, 6, 3); - - // button 'set default options' - btnDefaults = new QPushButton(pOptionsGroup); - btnDefaults->setText(QPushButton::tr("Set default options")); - btnDefaults->setWhatsThis(QPushButton::tr("Restore default coding parameters")); - pOptLayout->addWidget(btnDefaults, 7, 0, 1, 5); - - pPageLayout->addWidget(pOptionsGroup, 1, 0); - } // list of videos { @@ -257,7 +144,7 @@ box->addWidget(filesTable); box->addWidget(btnOpenDir); - pPageLayout->addWidget(pTableGroup, 0, 1, 2, 1); + pPageLayout->addWidget(pTableGroup, 0, 1); } // description @@ -267,7 +154,6 @@ pDescGroup->setTitle(QGroupBox::tr("Description")); QVBoxLayout* pDescLayout = new QVBoxLayout(pDescGroup); - QHBoxLayout* pTopDescLayout = new QHBoxLayout(0); // picture and text QHBoxLayout* pBottomDescLayout = new QHBoxLayout(0); // buttons // label with thumbnail picture @@ -282,7 +168,6 @@ "border-radius: 4px;" "}" ); clearThumbnail(); - pTopDescLayout->addWidget(labelThumbnail, 2); // label with file description labelDesc = new QLabel(pDescGroup); @@ -293,7 +178,8 @@ Qt::LinksAccessibleByKeyboard); labelDesc->setTextFormat(Qt::RichText); labelDesc->setOpenExternalLinks(true); - pTopDescLayout->addWidget(labelDesc, 1); + labelDesc->setMinimumSize(ThumbnailSize); + //pTopDescLayout->addWidget(labelDesc, 1); // buttons: play and delete btnPlay = new QPushButton(QPushButton::tr("Play"), pDescGroup); @@ -310,7 +196,9 @@ pBottomDescLayout->addWidget(btnToYouTube); pDescLayout->addStretch(1); - pDescLayout->addLayout(pTopDescLayout, 0); + pDescLayout->addWidget(labelThumbnail, 0); + pDescLayout->addStretch(1); + pDescLayout->addWidget(labelDesc, 0); pDescLayout->addStretch(1); pDescLayout->addLayout(pBottomDescLayout, 0); @@ -327,10 +215,6 @@ void PageVideos::connectSignals() { - connect(checkUseGameRes, SIGNAL(stateChanged(int)), this, SLOT(changeUseGameRes(int))); - connect(checkRecordAudio, SIGNAL(stateChanged(int)), this, SLOT(changeRecordAudio(int))); - connect(comboAVFormats, SIGNAL(currentIndexChanged(int)), this, SLOT(changeAVFormat(int))); - connect(btnDefaults, SIGNAL(clicked()), this, SLOT(setDefaultOptions())); connect(filesTable, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(cellDoubleClicked(int, int))); connect(filesTable, SIGNAL(cellChanged(int,int)), this, SLOT(cellChanged(int, int))); connect(filesTable, SIGNAL(currentCellChanged(int,int,int,int)), this, SLOT(currentCellChanged())); @@ -362,124 +246,6 @@ startEncoding(); // this is for videos recorded from demos which were executed directly (without frontend) } -// user changed file format, we need to update list of codecs -void PageVideos::changeAVFormat(int index) -{ - // remember selected codecs - QString prevVCodec = videoCodec(); - QString prevACodec = audioCodec(); - - // clear lists of codecs - comboVideoCodecs->clear(); - comboAudioCodecs->clear(); - - // get list of codecs for specified format - LibavInteraction::instance().fillCodecs(comboAVFormats->itemData(index).toString(), comboVideoCodecs, comboAudioCodecs); - - // disable audio if there is no audio codec - if (comboAudioCodecs->count() == 0) - { - checkRecordAudio->setChecked(false); - checkRecordAudio->setEnabled(false); - } - else - checkRecordAudio->setEnabled(true); - - // restore selected codecs if possible - int iVCodec = comboVideoCodecs->findData(prevVCodec); - if (iVCodec != -1) - comboVideoCodecs->setCurrentIndex(iVCodec); - int iACodec = comboAudioCodecs->findData(prevACodec); - if (iACodec != -1) - comboAudioCodecs->setCurrentIndex(iACodec); -} - -// user switched checkbox 'use game resolution' -void PageVideos::changeUseGameRes(int state) -{ - if (state && config) - { - // set resolution to game resolution - QRect resolution = config->vid_Resolution(); - widthEdit->setText(QString::number(resolution.width())); - heightEdit->setText(QString::number(resolution.height())); - } - widthEdit->setEnabled(!state); - heightEdit->setEnabled(!state); -} - -// user switched checkbox 'record audio' -void PageVideos::changeRecordAudio(int state) -{ - comboAudioCodecs->setEnabled(!!state); -} - -void PageVideos::setDefaultCodecs() -{ - // VLC should be able to handle any of these configurations - // Quicktime X only opens the first one - // Windows Media Player TODO - if (tryCodecs("mp4", "libx264", "aac")) - return; - if (tryCodecs("mp4", "libx264", "libfaac")) - return; - if (tryCodecs("mp4", "libx264", "libmp3lame")) - return; - if (tryCodecs("mp4", "libx264", "mp2")) - return; - if (tryCodecs("avi", "libxvid", "libmp3lame")) - return; - if (tryCodecs("avi", "libxvid", "ac3_fixed")) - return; - if (tryCodecs("avi", "libxvid", "mp2")) - return; - if (tryCodecs("avi", "mpeg4", "libmp3lame")) - return; - if (tryCodecs("avi", "mpeg4", "ac3_fixed")) - return; - if (tryCodecs("avi", "mpeg4", "mp2")) - return; - - // this shouldn't happen, just in case - if (tryCodecs("ogg", "libtheora", "libvorbis")) - return; - tryCodecs("ogg", "libtheora", "flac"); -} - -void PageVideos::setDefaultOptions() -{ - framerateBox->setValue(30); - bitrateBox->setValue(1000); - checkRecordAudio->setChecked(true); - checkUseGameRes->setChecked(true); - setDefaultCodecs(); -} - -bool PageVideos::tryCodecs(const QString & format, const QString & vcodec, const QString & acodec) -{ - // first we should change format - int iFormat = comboAVFormats->findData(format); - if (iFormat == -1) - return false; - comboAVFormats->setCurrentIndex(iFormat); - // format was changed, so lists of codecs were automatically updated to codecs supported by this format - - // try to find video codec - int iVCodec = comboVideoCodecs->findData(vcodec); - if (iVCodec == -1) - return false; - comboVideoCodecs->setCurrentIndex(iVCodec); - - // try to find audio codec - int iACodec = comboAudioCodecs->findData(acodec); - if (iACodec == -1 && checkRecordAudio->isChecked()) - return false; - if (iACodec != -1) - comboAudioCodecs->setCurrentIndex(iACodec); - - return true; -} - // get file size as string static QString FileSizeStr(const QString & path) { diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/page/pagevideos.h --- a/QTfrontend/ui/page/pagevideos.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/page/pagevideos.h Tue Dec 04 09:15:55 2012 +0400 @@ -36,24 +36,6 @@ public: PageVideos(QWidget* parent = 0); - QSpinBox *framerateBox; - QSpinBox *bitrateBox; - QLineEdit *widthEdit; - QLineEdit *heightEdit; - QCheckBox *checkUseGameRes; - QCheckBox *checkRecordAudio; - - QString format() - { return comboAVFormats->itemData(comboAVFormats->currentIndex()).toString(); } - - QString videoCodec() - { return comboVideoCodecs->itemData(comboVideoCodecs->currentIndex()).toString(); } - - QString audioCodec() - { return comboAudioCodecs->itemData(comboAudioCodecs->currentIndex()).toString(); } - - void setDefaultCodecs(); - bool tryCodecs(const QString & format, const QString & vcodec, const QString & acodec); void addRecorder(HWRecorder* pRecorder); bool tryQuit(HWForm *form); QString getVideosInProgress(); // get multi-line string with list of videos in progress @@ -83,12 +65,6 @@ GameUIConfig * config; QNetworkAccessManager* netManager; - // options group - QComboBox *comboAVFormats; - QComboBox *comboVideoCodecs; - QComboBox *comboAudioCodecs; - QPushButton *btnDefaults; - // file list group QTableWidget *filesTable; QPushButton *btnOpenDir; @@ -105,10 +81,6 @@ int numRecorders, numUploads; private slots: - void changeAVFormat(int index); - void changeUseGameRes(int state); - void changeRecordAudio(int state); - void setDefaultOptions(); void encodingFinished(bool success); void updateProgress(float value); void cellDoubleClicked(int row, int column); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/widget/chatwidget.cpp --- a/QTfrontend/ui/widget/chatwidget.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/widget/chatwidget.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -177,7 +177,7 @@ } -HWChatWidget::HWChatWidget(QWidget* parent, QSettings * gameSettings, bool notify) : +HWChatWidget::HWChatWidget(QWidget* parent, bool notify) : QWidget(parent), mainLayout(this) { @@ -187,7 +187,6 @@ m_isAdmin = false; m_autoKickEnabled = false; - if(gameSettings->value("frontend/sound", true).toBool()) { QStringList vpList = QStringList() << "Classic" << "Default" << "Mobster" << "Russian"; @@ -281,6 +280,10 @@ clear(); } +void HWChatWidget::setSettings(QSettings * settings) +{ + gameSettings = settings; +} void HWChatWidget::linkClicked(const QUrl & link) { diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/widget/chatwidget.h --- a/QTfrontend/ui/widget/chatwidget.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/widget/chatwidget.h Tue Dec 04 09:15:55 2012 +0400 @@ -54,7 +54,7 @@ Q_OBJECT public: - HWChatWidget(QWidget* parent, QSettings * gameSettings, bool notify); + HWChatWidget(QWidget* parent, bool notify); void setIgnoreListKick(bool enabled); ///< automatically kick people on ignore list (if possible) void setShowFollow(bool enabled); static const QString & styleSheet(); @@ -63,6 +63,7 @@ void displayWarning(const QString & message); void setUser(const QString & nickname); void setUsersModel(QAbstractItemModel * model); + void setSettings(QSettings * settings); protected: virtual void dragEnterEvent(QDragEnterEvent * event); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/widget/teamselect.cpp --- a/QTfrontend/ui/widget/teamselect.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/widget/teamselect.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -59,6 +59,7 @@ this, SLOT(changeTeamStatus(HWTeam))); } } + emit setEnabledGameStart(curPlayingTeams.size()>1); } @@ -168,6 +169,12 @@ m_curNotPlayingTeams.push_back(*itPlay); emit teamNotPlaying(*itPlay); curPlayingTeams.erase(itPlay); + + // Show team notice if less than two teams. + if (curPlayingTeams.size() < 2) + { + numTeamNotice->show(); + } } else { @@ -179,6 +186,12 @@ curPlayingTeams.push_back(*itDontPlay); if(!m_acceptOuter) emit teamWillPlay(*itDontPlay); m_curNotPlayingTeams.erase(itDontPlay); + + // Hide team notice if at least two teams. + if (curPlayingTeams.size() >= 2) + { + numTeamNotice->hide(); + } } FrameTeams* pRemoveTeams; @@ -254,6 +267,10 @@ framePlaying = new FrameTeams(); frameDontPlaying = new FrameTeams(); + // Add notice about number of required teams. + numTeamNotice = new QLabel("Two teams are required to play!"); + mainLayout.addWidget(numTeamNotice); + QPalette p; p.setColor(QPalette::Window, QColor(0x00, 0x00, 0x00)); addScrArea(framePlaying, p.color(QPalette::Window).light(105), 250); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui/widget/teamselect.h --- a/QTfrontend/ui/widget/teamselect.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui/widget/teamselect.h Tue Dec 04 09:15:55 2012 +0400 @@ -20,6 +20,7 @@ #ifndef _TEAM_SELECT_INCLUDED #define _TEAM_SELECT_INCLUDED +#include #include #include #include @@ -74,6 +75,7 @@ FrameTeams* framePlaying; QVBoxLayout mainLayout; + QLabel *numTeamNotice; bool m_acceptOuter; QList curPlayingTeams; diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui_hwform.cpp --- a/QTfrontend/ui_hwform.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui_hwform.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -60,7 +60,7 @@ centralWidget = new QWidget(HWForm); centralWidget->setObjectName(QString::fromUtf8("centralWidget")); - SetupPages(centralWidget, HWForm); + SetupPages(centralWidget); HWForm->setCentralWidget(centralWidget); @@ -74,7 +74,7 @@ font14 = new QFont("MS Shell Dlg", 14); } -void Ui_HWForm::SetupPages(QWidget *Parent, HWForm *HWForm) +void Ui_HWForm::SetupPages(QWidget *Parent) { Pages = new QStackedLayout(Parent); @@ -93,7 +93,7 @@ pageNet = new PageNet(); Pages->addWidget(pageNet); - pageNetGame = new PageNetGame(Parent, HWForm->gameSettings); + pageNetGame = new PageNetGame(Parent); Pages->addWidget(pageNetGame); pageInfo = new PageInfo(); @@ -120,7 +120,7 @@ pageInGame = new PageInGame(); Pages->addWidget(pageInGame); - pageRoomsList = new PageRoomsList(Parent, HWForm->gameSettings); + pageRoomsList = new PageRoomsList(Parent); Pages->addWidget(pageRoomsList); pageConnecting = new PageConnecting(); diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/ui_hwform.h --- a/QTfrontend/ui_hwform.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/ui_hwform.h Tue Dec 04 09:15:55 2012 +0400 @@ -86,7 +86,7 @@ void setupUi(HWForm *HWForm); void SetupFonts(); - void SetupPages(QWidget *Parent, HWForm *HWForm); + void SetupPages(QWidget *Parent); }; #endif // UI_HWFORM_H diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/util/FileEngine.cpp --- a/QTfrontend/util/FileEngine.cpp Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/util/FileEngine.cpp Tue Dec 04 09:15:55 2012 +0400 @@ -10,8 +10,10 @@ FileEngine::FileEngine(const QString& filename) : m_handle(NULL) + , m_size(0) , m_flags(0) , m_bufferSet(false) + , m_readWrite(false) { setFileName(filename); } @@ -25,7 +27,16 @@ { close(); - if (openMode & QIODevice::WriteOnly) { + if ((openMode & QIODevice::ReadWrite) == QIODevice::ReadWrite) { + m_handle = PHYSFS_openAppend(m_fileName.toUtf8().constData()); + if(m_handle) + { + m_readWrite = true; + seek(0); + } + } + + else if (openMode & QIODevice::WriteOnly) { m_handle = PHYSFS_openWrite(m_fileName.toUtf8().constData()); m_flags = QAbstractFileEngine::WriteOwnerPerm | QAbstractFileEngine::WriteUserPerm | QAbstractFileEngine::FileType; } @@ -76,9 +87,22 @@ return PHYSFS_tell(m_handle); } +bool FileEngine::setSize(qint64 size) +{ + if(size == 0) + { + m_size = 0; + return open(QIODevice::WriteOnly); + } + else + return false; +} + bool FileEngine::seek(qint64 pos) { - return PHYSFS_seek(m_handle, pos) != 0; + bool ok = PHYSFS_seek(m_handle, pos) != 0; + + return ok; } bool FileEngine::isSequential() const @@ -94,12 +118,14 @@ bool FileEngine::mkdir(const QString &dirName, bool createParentDirectories) const { Q_UNUSED(createParentDirectories); + return PHYSFS_mkdir(dirName.toUtf8().constData()) != 0; } bool FileEngine::rmdir(const QString &dirName, bool recurseParentDirectories) const { Q_UNUSED(recurseParentDirectories); + return PHYSFS_delete(dirName.toUtf8().constData()) != 0; } @@ -110,7 +136,7 @@ bool FileEngine::isRelativePath() const { - return true; + return false; } QAbstractFileEngineIterator * FileEngine::beginEntryList(QDir::Filters filters, const QStringList &filterNames) @@ -171,7 +197,6 @@ QDateTime FileEngine::fileTime(FileTime time) const { - switch (time) { case QAbstractFileEngine::ModificationTime: @@ -187,21 +212,21 @@ m_fileName = file.mid(FileEngineHandler::scheme.size()); else m_fileName = file; - PHYSFS_Stat stat; - if (PHYSFS_stat(m_fileName.toUtf8().constData(), &stat) != 0) { + if (PHYSFS_stat(m_fileName.toUtf8().constData(), &stat) != 0) { m_size = stat.filesize; m_date = QDateTime::fromTime_t(stat.modtime); -// _flags |= QAbstractFileEngine::WriteUserPerm; +// m_flags |= QAbstractFileEngine::WriteOwnerPerm; + m_flags |= QAbstractFileEngine::ReadOwnerPerm; m_flags |= QAbstractFileEngine::ReadUserPerm; m_flags |= QAbstractFileEngine::ExistsFlag; + m_flags |= QAbstractFileEngine::LocalDiskFlag; switch (stat.filetype) { case PHYSFS_FILETYPE_REGULAR: m_flags |= QAbstractFileEngine::FileType; break; - case PHYSFS_FILETYPE_DIRECTORY: m_flags |= QAbstractFileEngine::DirectoryType; break; @@ -220,7 +245,16 @@ qint64 FileEngine::read(char *data, qint64 maxlen) { - return PHYSFS_readBytes(m_handle, data, maxlen); + if(m_readWrite) + { + if(pos() == 0) + open(QIODevice::ReadOnly); + else + return -1; + } + + qint64 len = PHYSFS_readBytes(m_handle, data, maxlen); + return len; } qint64 FileEngine::readLine(char *data, qint64 maxlen) @@ -286,7 +320,7 @@ QAbstractFileEngine* FileEngineHandler::create(const QString &filename) const { if (filename.startsWith(scheme)) - return new FileEngine(filename.mid(scheme.size())); + return new FileEngine(filename); else return NULL; } diff -r 6482875b0d97 -r 171da01bd04d QTfrontend/util/FileEngine.h --- a/QTfrontend/util/FileEngine.h Fri Nov 30 18:19:52 2012 +0400 +++ b/QTfrontend/util/FileEngine.h Tue Dec 04 09:15:55 2012 +0400 @@ -22,6 +22,7 @@ virtual bool flush(); virtual qint64 size() const; virtual qint64 pos() const; + virtual bool setSize(qint64 size); virtual bool seek(qint64 pos); virtual bool isSequential() const; virtual bool remove(); @@ -55,6 +56,7 @@ QString m_fileName; QDateTime m_date; bool m_bufferSet; + bool m_readWrite; }; class FileEngineHandler : public QAbstractFileEngineHandler diff -r 6482875b0d97 -r 171da01bd04d cmake_modules/FindFreepascal.cmake --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/cmake_modules/FindFreepascal.cmake Tue Dec 04 09:15:55 2012 +0400 @@ -0,0 +1,36 @@ +# Load Freepascal +if (FPC) + set(FPC_EXECUTABLE ${FPC}) +else() + find_program(FPC_EXECUTABLE + NAMES fpc + PATHS /opt/local/bin /usr/local/bin /usr/bin) +endif() + +# Check Freepascal version +if (FPC_EXECUTABLE) + exec_program(${FPC_EXECUTABLE} ARGS "-v" OUTPUT_VARIABLE FPC_VERSION_FULL) + + string(REGEX MATCH "[0-9]+\\.[0-9]+" FPC_VERSION_LONG "${FPC_VERSION_FULL}") + string(REGEX REPLACE "([0-9]+\\.[0-9]+)" "\\1" FPC_VERSION "${FPC_VERSION_LONG}") + message(STATUS "Found Freepascal: ${FPC_EXECUTABLE} (version ${FPC_VERSION}") +else() + message(FATAL_ERROR "Could NOT find Freepascal") +endif() + +# Check for noexecstack flag support +set(NOEXECSTACK_FLAGS "-k-z" "-knoexecstack") +file(WRITE ${EXECUTABLE_OUTPUT_PATH}/checkstack.pas "begin end.") + +execute_process(COMMAND ${FPC_EXECUTABLE} ${NOEXECSTACK_FLAGS} checkstack.pas + WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} + RESULT_VARIABLE TEST_NOEXECSTACK + OUTPUT_QUIET ERROR_QUIET) + +if (TEST_NOEXECSTACK) + set(NOEXECSTACK_FLAGS "") + message(STATUS "Checking whether linker needs explicit noexecstack -- no") +else(TEST_NOEXECSTACK) + message(STATUS "Checking whether linker needs explicit noexecstack -- yes") +endif(TEST_NOEXECSTACK) + diff -r 6482875b0d97 -r 171da01bd04d gameServer/Actions.hs --- a/gameServer/Actions.hs Fri Nov 30 18:19:52 2012 +0400 +++ b/gameServer/Actions.hs Tue Dec 04 09:15:55 2012 +0400 @@ -52,6 +52,7 @@ | KickRoomClient ClientIndex | BanClient NominalDiffTime B.ByteString ClientIndex | BanIP B.ByteString NominalDiffTime B.ByteString + | BanNick B.ByteString NominalDiffTime B.ByteString | BanList | Unban B.ByteString | ChangeMaster @@ -154,7 +155,7 @@ when loggedIn $ processAction $ AnswerClients clientsChans ["LOBBY:LEFT", clNick, msg] - mapM processAction + mapM_ processAction [ AnswerClients [chan] ["BYE", msg] , ModifyClient (\c -> c{nick = "", logonPassed = False}) -- this will effectively hide client from others while he isn't deleted from list @@ -440,17 +441,25 @@ return () -processAction (ProcessAccountInfo info) = +processAction (ProcessAccountInfo info) = do case info of HasAccount passwd isAdmin -> do - chan <- client's sendChan - mapM_ processAction [AnswerClients [chan] ["ASKPASSWORD"], ModifyClient (\c -> c{webPassword = passwd, isAdministrator = isAdmin})] - Guest -> - processAction JoinLobby + b <- isBanned + when (not b) $ do + chan <- client's sendChan + mapM_ processAction [AnswerClients [chan] ["ASKPASSWORD"], ModifyClient (\c -> c{webPassword = passwd, isAdministrator = isAdmin})] + Guest -> do + b <- isBanned + when (not b) $ + processAction JoinLobby Admin -> do mapM_ processAction [ModifyClient (\cl -> cl{isAdministrator = True}), JoinLobby] chan <- client's sendChan processAction $ AnswerClients [chan] ["ADMIN_ACCESS"] + where + isBanned = do + processAction CheckBanned + liftM B.null $ client's nick processAction JoinLobby = do @@ -500,14 +509,28 @@ processAction $ AddIP2Bans ip msg (addUTCTime seconds currentTime) +processAction (BanNick n seconds reason) = do + currentTime <- io getCurrentTime + let msg = + if seconds > 60 * 60 * 24 * 365 then + B.concat ["Permanent ban (", reason, ")"] + else + B.concat ["Ban for ", B.pack . show $ seconds, " (", reason, ")"] + processAction $ + AddNick2Bans n msg (addUTCTime seconds currentTime) + processAction BanList = do + time <- io $ getCurrentTime ch <- client's sendChan - b <- gets (B.pack . unlines . map show . bans . serverInfo) + b <- gets (B.intercalate "\n" . concatMap (ban2Str time) . bans . serverInfo) processAction $ AnswerClients [ch] ["BANLIST", b] + where + ban2Str time (BanByIP b r t) = ["I", b, r, B.pack . show $ t `diffUTCTime` time] + ban2Str time (BanByNick b r t) = ["N", b, r, B.pack . show $ t `diffUTCTime` time] processAction (Unban entry) = do - processAction $ ModifyServerInfo (\s -> s{bans = filter f $ bans s}) + processAction $ ModifyServerInfo (\s -> s{bans = filter (not . f) $ bans s}) where f (BanByIP bip _ _) = bip == entry f (BanByNick bn _ _) = bn == entry @@ -561,7 +584,7 @@ checkNotExpired testTime (BanByIP _ _ time) = testTime `diffUTCTime` time <= 0 checkNotExpired testTime (BanByNick _ _ time) = testTime `diffUTCTime` time <= 0 checkBan ip _ (BanByIP bip _ _) = bip `B.isPrefixOf` ip - checkBan _ n (BanByNick bn _ _) = bn == n + checkBan _ n (BanByNick bn _ _) = caseInsensitiveCompare bn n getBanReason (BanByIP _ msg _) = msg getBanReason (BanByNick _ msg _) = msg diff -r 6482875b0d97 -r 171da01bd04d gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Fri Nov 30 18:19:52 2012 +0400 +++ b/gameServer/HWProtoInRoomState.hs Tue Dec 04 09:15:55 2012 +0400 @@ -308,8 +308,8 @@ let sameRoom = clientRoom rnc thisClientId == clientRoom rnc banId if master && isJust maybeClientId && (banId /= thisClientId) && sameRoom then return [ - ModifyRoom (\r -> r{roomBansList = let h = host $ rnc `client` banId in h `deepseq` h : roomBansList r}) - , KickRoomClient banId +-- ModifyRoom (\r -> r{roomBansList = let h = host $ rnc `client` banId in h `deepseq` h : roomBansList r}) + KickRoomClient banId ] else return [] diff -r 6482875b0d97 -r 171da01bd04d gameServer/HWProtoLobbyState.hs --- a/gameServer/HWProtoLobbyState.hs Fri Nov 30 18:19:52 2012 +0400 +++ b/gameServer/HWProtoLobbyState.hs Tue Dec 04 09:15:55 2012 +0400 @@ -150,16 +150,20 @@ return [KickClient $ fromJust kickId | isAdministrator cl && isJust kickId && fromJust kickId /= ci] -handleCmd_lobby ["BAN", banNick, reason] = do +handleCmd_lobby ["BAN", banNick, reason, duration] = do (ci, _) <- ask cl <- thisClient banId <- clientByNick banNick - return [BanClient 60 reason (fromJust banId) | isAdministrator cl && isJust banId && fromJust banId /= ci] + return [BanClient (readInt_ duration) reason (fromJust banId) | isAdministrator cl && isJust banId && fromJust banId /= ci] handleCmd_lobby ["BANIP", ip, reason, duration] = do cl <- thisClient return [BanIP ip (readInt_ duration) reason | isAdministrator cl] +handleCmd_lobby ["BANNICK", n, reason, duration] = do + cl <- thisClient + return [BanNick n (readInt_ duration) reason | isAdministrator cl] + handleCmd_lobby ["BANLIST"] = do cl <- thisClient return [BanList | isAdministrator cl] diff -r 6482875b0d97 -r 171da01bd04d hedgewars/ArgParsers.inc --- a/hedgewars/ArgParsers.inc Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/ArgParsers.inc Tue Dec 04 09:15:55 2012 +0400 @@ -64,97 +64,150 @@ end; {$ENDIF} -procedure setVideo(screenWidth: LongInt; screenHeight: LongInt; bitsStr: LongInt); +procedure DisplayUsage; begin - cScreenWidth:= screenWidth; - cScreenHeight:= screenHeight; - cBits:= bitsStr -end; - -procedure setVideoWithParameters(screenWidthParam: string; screenHeightParam: string; bitsParam: string); -var screenWidthAsInt, screenHeightAsInt, bitsStrAsInt, c: LongInt; -begin - val(screenWidthParam, screenWidthAsInt, c); - val(screenHeightParam, screenHeightAsInt, c); - val(bitsParam, bitsStrAsInt, c); - setVideo(screenWidthAsInt,screenHeightAsInt,bitsStrAsInt) + WriteLn(stdout, 'Usage:'); + WriteLn(stdout, ''); + WriteLn(stdout, ' hwengine [options]'); + WriteLn(stdout, ''); + WriteLn(stdout, 'where [options] are any of the following:'); + WriteLn(stdout, ' --locale [path to language file]'); + WriteLn(stdout, ' --width [screen width in pixels]'); + WriteLn(stdout, ' --height [screen height in pixels]'); + WriteLn(stdout, ' --depth [color depth]'); + WriteLn(stdout, ' --volume [sound level]'); + WriteLn(stdout, ' --time [number of seconds]'); + WriteLn(stdout, ' --nomusic'); + WriteLn(stdout, ' --nosound'); + WriteLn(stdout, ' --fullscreen'); + WriteLn(stdout, ' --showfps'); + WriteLn(stdout, ' --altdmg'); + WriteLn(stdout, ' --lowquality'); + WriteLn(stdout, ' --stats-only'); + WriteLn(stdout, ' --help'); + WriteLn(stdout, ''); + WriteLn(stdout, 'Deprecated options:'); + WriteLn(stdout, ' --set-video [screen width] [screen height] [color dept]'); + WriteLn(stdout, ' --set-audio [volume] [enable music] [enable sounds]'); + WriteLn(stdout, ' --set-other [language file] [full screen] [show FPS]'); + WriteLn(stdout, ' --set-multimedia [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen]'); + WriteLn(stdout, ' --set-everything [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]'); + WriteLn(stdout, ''); + WriteLn(stdout, 'For a more detailed help and examples go to:'); + WriteLn(stdout, 'http://code.google.com/p/hedgewars/wiki/CommandLineOptions'); end; -procedure setOtherOptions(languageFile: string; fullScreen: boolean); +function getLongIntParameter(str:String; var paramIndex:LongInt; var wrongParameter:Boolean): LongInt; +var tmpInt, c: LongInt; begin - cLocaleFName:= languageFile; - cFullScreen:= fullScreen -end; - -procedure setShowFPS(showFPS: boolean); -begin - cShowFPS:= showFPS + paramIndex:= paramIndex + 1; + val(str, tmpInt, c); + wrongParameter:= c <> 0; + if wrongParameter then + WriteLn(stderr, 'ERROR: '+ParamStr(paramIndex-1)+' expects a number, you passed "'+str+'"'); + getLongIntParameter:= tmpInt; end; -procedure setOtherOptionsWithParameters(languageFileParam: string; fullScreenParam: string; showFPSParam: string); -var fullScreen, showFPS: boolean; +function getStringParameter(str:String; var paramIndex:LongInt): String; begin - fullScreen:= fullScreenParam = '1'; - showFPS:= showFPSParam = '1'; - setOtherOptions(languageFileParam,fullScreen); - setShowFPS(showFPS) -end; - -procedure setAudio(initialVolume: LongInt; musicEnabled: boolean; soundEnabled: boolean); -begin - SetVolume(initialVolume); - SetMusic(musicEnabled); - SetSound(soundEnabled); + paramIndex:= paramIndex + 1; + getStringParameter:= str; end; -procedure setAudioWithParameters(initialVolumeParam: string; musicEnabledParam: string; soundEnabledParam: string); -var initialVolumeAsInt, c: LongInt; - musicEnabled, soundEnabled: boolean; +procedure parseClassicParameter(cmdArray: Array of String; size:LongInt; var paramIndex:LongInt); Forward; + +function parseParameter(cmd:String; arg:String; var paramIndex:LongInt): Boolean; +const videoArray: Array [1..3] of String = ('--width','--height','--depth'); +const audioArray: Array [1..3] of String = ('--volume','--nomusic','--nosound'); +const otherArray: Array [1..3] of String = ('--locale','--fullscreen','--showfps'); +const mediaArray: Array [1..8] of String = ('--width','--height','--depth','--volume','--nomusic','--nosound','--locale','--fullscreen'); +const allArray: Array [1..12] of String = ('--width','--height','--depth','--volume','--nomusic','--nosound','--locale','--fullscreen','--showfps','--altdmg','--time','--lowquality'); +const reallyAll: array[0..19] of shortstring = ( + '--locale', '--width', '--height', '--depth', '--time' + , '--volume', '--nomusic', '--nosound', '--fullscreen', '--showfps' + , '--altdmg', '--lowquality', '--set-video', '--set-audio', '--set-other' + , '--set-multimedia', '--set-everything', '--stats-only', '--gci', '--help'); +var cmdIndex: byte; begin - val(initialVolumeParam, initialVolumeAsInt, c); - musicEnabled:= musicEnabledParam = '1'; - soundEnabled:= soundEnabledParam = '1'; - setAudio(initialVolumeAsInt,musicEnabled, soundEnabled) -end; - -procedure setMultimediaOptionsWithParameters(screenWidthParam, screenHeightParam, bitsParam: string; - initialVolumeParam, musicEnabledParam, soundEnabledParam: string; - languageFileParam, fullScreenParam: string); -begin - setVideoWithParameters(screenWidthParam,screenHeightParam, bitsParam); - setAudioWithParameters(initialVolumeParam,musicEnabledParam,soundEnabledParam); - setOtherOptions(languageFileParam,fullScreenParam = '1') + parseParameter:= false; + cmdIndex:= 0; + while (cmdIndex <= High(reallyAll)) and (cmd <> reallyAll[cmdIndex]) do inc(cmdIndex); + case cmdIndex of + {--locale} 0 : cLocaleFName := getStringParameter (arg, paramIndex); + {--width} 1 : cScreenWidth := getLongIntParameter(arg, paramIndex, parseParameter); + {--height} 2 : cScreenHeight := getLongIntParameter(arg, paramIndex, parseParameter); + {--depth} 3 : cBits := getLongIntParameter(arg, paramIndex, parseParameter); + {--time} 4 : cTimerInterval := getLongIntParameter(arg, paramIndex, parseParameter); + {--volume} 5 : SetVolume ( getLongIntParameter(arg, paramIndex, parseParameter) ); + {--nomusic} 6 : SetMusic ( false ); + {--nosound} 7 : SetSound ( false ); + {--fullscreen} 8 : cFullScreen := true; + {--showfps} 9 : cShowFPS := true; + {--altdmg} 10 : cAltDamage := true; + {--lowquality} 11 : cReducedQuality:= ($FFFFFFFF * getLongIntParameter(arg, paramIndex, parseParameter)) xor rqLowRes; //HACK! + {--set-video} 12 : parseClassicParameter(videoArray,3,paramIndex); + {--set-audio} 13 : parseClassicParameter(audioArray,3,paramIndex); + {--set-other} 14 : parseClassicParameter(otherArray,3,paramIndex); + {--set-multimedia} 15 : parseClassicParameter(mediaArray,8,paramIndex); + {--set-everything} 16 : parseClassicParameter(allArray,12,paramIndex); + {--stats-only} 17 : begin + cOnlyStats:= true; + SetSound(false); + SetMusic(false); + cReducedQuality:= $FFFFFFFF xor rqLowRes; + end; + {--gci} 18 : begin // We had to make up all this saved space some how... \\ + WriteLn(stdout, ' '); + WriteLn(stdout, ' /\\\\\\\\\\\\ /\\\\\\\\\ /\\\\\\\\\\\ '); + WriteLn(stdout, ' /\\\////////// /\\\//////// \/////\\\/// '); + WriteLn(stdout, ' /\\\ /\\\/ \/\\\ '); + WriteLn(stdout, ' \/\\\ /\\\\\\\ /\\\ \/\\\ '); + WriteLn(stdout, ' \/\\\ \/////\\\ \/\\\ \/\\\ '); + WriteLn(stdout, ' \/\\\ \/\\\ \//\\\ \/\\\ '); + WriteLn(stdout, ' \/\\\ \/\\\ \///\\\ \/\\\ '); + WriteLn(stdout, ' \//\\\\\\\\\\\\/ \////\\\\\\\\\ /\\\\\\\\\\\ '); + WriteLn(stdout, ' \//////////// \///////// \/////////// '); + WriteLn(stdout, ' '); + WriteLn(stdout, ' Command Line Parser Implementation by a Google Code-In Student '); + WriteLn(stdout, ' ASCII Art easter egg idea by @sheepluva '); + WriteLn(stdout, ' '); + end; + {--help} 19 : begin + DisplayUsage(); + GameType:= gmtSyntax; + end; + else + begin + WriteLn(stderr, 'ERROR: '+cmd+' is not a valid argument'); + parseParameter:= true; + end + end; end; -procedure setAltDamageTimerValueAndQuality(altDamage: boolean; timeIterval: LongInt; reducedQuality: boolean); +procedure parseClassicParameter(cmdArray: Array of String; size:LongInt; var paramIndex:LongInt); +var index, tmpInt: LongInt; + isBool: Boolean; begin - cAltDamage:= altDamage; - cTimerInterval:= timeIterval; - if (reducedQuality) then //HACK - cReducedQuality:= $FFFFFFFF xor rqLowRes -end; - -procedure setAllOptionsWithParameters(screenWidthParam:string; screenHeightParam:string; bitsParam:string; - initialVolumeParam:string; musicEnabledParam:string; soundEnabledParam:string; - languageFileParam:string; fullScreenParam:string; showFPSParam:string; - altDamageParam:string; timeItervalParam:string; reducedQualityParam: string); -var showFPS, altDamage, reducedQuality: boolean; - timeIterval, c: LongInt; -begin - setMultimediaOptionsWithParameters(screenWidthParam,screenHeightParam, bitsParam, - initialVolumeParam,musicEnabledParam,soundEnabledParam, - languageFileParam,fullScreenParam); - showFPS := showFPSParam = '1'; - setShowFPS(showFPS); - - altDamage:= altDamageParam = '1'; - val(timeItervalParam, timeIterval, c); - reducedQuality:= reducedQualityParam = '1'; - setAltDamageTimerValueAndQuality(altDamage,timeIterval,reducedQuality); + index:= 0; + tmpInt:= 1; + while (index < size) do + begin + paramIndex:= paramIndex+1; + // check if the parameter is a boolean one + isBool:= (cmdArray[index] = '--nomusic') + or (cmdArray[index] = '--nosound') + or (cmdArray[index] = '--fullscreen') + or (cmdArray[index] = '--showfps') + or (cmdArray[index] = '--altdmg') + or (cmdArray[index] = '--lowquality'); + if (not isBool) or ((ParamStr(paramIndex)='1') and (cmdArray[index]<>'--nomusic') and (cmdArray[index]<>'--nosound')) then + parseParameter(cmdArray[index], ParamStr(paramIndex), tmpInt); + index:= index+1; + end; end; procedure playReplayFileWithParameters(); -var paramIndex: LongInt; +var paramIndex, tmpInt: LongInt; wrongParameter: boolean; begin UserPathPrefix:= ParamStr(1); @@ -162,86 +215,15 @@ recordFileName:= ParamStr(3); paramIndex:= 4; wrongParameter:= false; - while (paramIndex <= ParamCount) and (not wrongParameter) do + while (paramIndex <= ParamCount) do begin - if ParamStr(paramIndex) = '--set-video' then -//--set-video [screen width] [screen height] [color dept] - begin - if(ParamCount-paramIndex < 3) then - begin - wrongParameter:= true; - GameType:= gmtSyntax - end; - setVideoWithParameters(ParamStr(paramIndex+1), ParamStr(paramIndex+2), ParamStr(paramIndex+3)); - paramIndex:= paramIndex + 4 - end - else -//--set-audio [volume] [enable music] [enable sounds] - if ParamStr(paramIndex) = '--set-audio' then - begin - if(ParamCount-paramIndex < 3) then - begin - wrongParameter := true; - GameType:= gmtSyntax - end; - setAudioWithParameters(ParamStr(paramIndex+1),ParamStr(paramIndex+2), ParamStr(paramIndex+3)); - paramIndex:= paramIndex + 4 - end - else -// --set-other [language file] [full screen] [show FPS] - if ParamStr(paramIndex) = '--set-other' then - begin - if(ParamCount-paramIndex < 3) then - begin - wrongParameter:= true; - GameType:= gmtSyntax - end; - setOtherOptionsWithParameters(ParamStr(paramIndex+1),ParamStr(paramIndex+2), ParamStr(paramIndex+3)); - paramIndex:= paramIndex + 4 - end - else -//--set-multimedia [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] - if ParamStr(paramIndex) = '--set-multimedia' then - begin - if ParamCount-paramIndex < 8 then - begin - wrongParameter:= true; - GameType:= gmtSyntax - end; - setMultimediaOptionsWithParameters(ParamStr(paramIndex+1),ParamStr(paramIndex+2),ParamStr(paramIndex+3), - ParamStr(paramIndex+4),ParamStr(paramIndex+5),ParamStr(paramIndex+6), - ParamStr(paramIndex+7),ParamStr(paramIndex+8)); - paramIndex:= paramIndex + 9 - end - else -//--set-everything [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality] - if ParamStr(paramIndex) = '--set-everything' then - begin - if ParamCount-paramIndex < 12 then - begin - wrongParameter:= true; - GameType:= gmtSyntax - end; - setAllOptionsWithParameters(ParamStr(paramIndex+1),ParamStr(paramIndex+2),ParamStr(paramIndex+3), - ParamStr(paramIndex+4),ParamStr(paramIndex+5),ParamStr(paramIndex+6), - ParamStr(paramIndex+7),ParamStr(paramIndex+8),ParamStr(paramIndex+9), - ParamStr(paramIndex+10),ParamStr(paramIndex+11),ParamStr(paramIndex+12)); - paramIndex:= paramIndex + 13 - end - else - if ParamStr(paramIndex) = '--stats-only' then - begin - cOnlyStats:= true; - SetSound(false); - SetMusic(false); - cReducedQuality:= $FFFFFFFF xor rqLowRes; // HACK - paramIndex:= paramIndex + 1 - end - else - begin - wrongParameter:= true; - GameType:= gmtSyntax - end - end + if parseParameter( ParamStr(paramIndex), ParamStr(paramIndex+1), paramIndex) then + wrongParameter:= true; + paramIndex:= paramIndex+1; + end; + if wrongParameter = true then + begin + WriteLn(stderr, 'Please use --help to see possible arguments and their usage'); + GameType:= gmtSyntax; + end end; - diff -r 6482875b0d97 -r 171da01bd04d hedgewars/CMakeLists.txt --- a/hedgewars/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -12,6 +12,12 @@ set(hwengine_project ${hedgewars_SOURCE_DIR}/hedgewars/hwengine.pas) set(engine_output_name "hwengine") +if (APPLE) + set(required_fpc_version 2.6) +else() + set(required_fpc_version 2.2) +endif() + set(engine_sources ${hwengine_project} LuaPas.pas @@ -53,7 +59,6 @@ uLandTexture.pas uLocale.pas uMisc.pas - uMobile.pas uPhysFSLayer.pas uRandom.pas uRender.pas @@ -101,54 +106,13 @@ endif(BUILD_ENGINE_LIBRARY) -#PASCAL DETECTION SECTION -IF(FPC) - set(fpc_executable ${FPC}) -ELSE() - find_program(fpc_executable fpc) -ENDIF() - -message(STATUS "Check for working FPC compiler: ${fpc_executable}") -execute_process(COMMAND ${fpc_executable} -iV OUTPUT_VARIABLE fpc_output ERROR_VARIABLE fpc_error) -if(fpc_error) - message(STATUS "Check for working FPC compiler: ${fpc_executable} -- broken") -else(fpc_error) - message(STATUS "Check for working FPC compiler: ${fpc_executable} -- works") -endif(fpc_error) +# Check Freepascal version +find_package(Freepascal) -string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" fpc_version "${fpc_output}") -if(fpc_version) - string(REGEX REPLACE "([0-9]+)\\.[0-9]+\\.[0-9]+" "\\1" fpc_vers_major "${fpc_version}") - string(REGEX REPLACE "[0-9]+\\.([0-9]+)\\.[0-9]+" "\\1" fpc_vers_minor "${fpc_version}") - string(REGEX REPLACE "[0-9]+\\.[0-9]+\\.([0-9]+)" "\\1" fpc_vers_patch "${fpc_version}") - message(STATUS "Found Freepascal: ${fpc_executable} (version ${fpc_vers_major}.${fpc_vers_minor})") - math(EXPR fpc_version "${fpc_vers_major}*10000 + ${fpc_vers_minor}*100 + ${fpc_vers_patch}") - - if(fpc_version LESS "020200") - message(FATAL_ERROR "Minimum required version of FreePascal is 2.2.0") - elseif(APPLE AND (fpc_version LESS "020600")) - message(FATAL_ERROR "Minimum required version of FreePascal is 2.6.0 on Mac OS X") - endif() -else() - message(FATAL_ERROR "No FreePascal compiler found!") +if (FPC_VERSION VERSION_LESS required_fpc_version) + message(FATAL_ERROR "Freepascal is too old, minimum version required is ${required_fpc_version}") endif() -message(STATUS "Checking whether linker supports noexecstack flag") -set(noexecstack_flags "-k-z" "-knoexecstack") -file(WRITE ${EXECUTABLE_OUTPUT_PATH}/checkstack.pas "begin end.") - -execute_process(COMMAND ${fpc_executable} ${noexecstack_flags} checkstack.pas - WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH} - RESULT_VARIABLE testnoexecstack - OUTPUT_QUIET ERROR_QUIET - ) - -if(${testnoexecstack}) - set (noexecstack_flags "") - message(STATUS "Checking whether linker supports noexecstack flag -- no") -else(${testnoexecstack}) - message(STATUS "Checking whether linker supports noexecstack flag -- yes") -endif(${testnoexecstack}) #DEPENDECIES AND EXECUTABLES SECTION if(APPLE) @@ -198,9 +162,8 @@ #this command is a workaround to some inlining issues present in older FreePascal versions and fixed in 2.6 -if(fpc_version LESS "020600") +if(FPC_VERSION VERSION_LESS "2.6") #under some configurations CMAKE_BUILD_TOOL fails to pass on the jobserver, breaking parallel compilation - #TODO: check if this is needed on windows too if(UNIX) set(SAFE_BUILD_TOOL $(MAKE)) else() @@ -239,22 +202,22 @@ set(pascal_flags "-Fl${LIBRARY_OUTPUT_PATH}" ${pascal_flags}) -set(fpc_flags ${noexecstack_flags} ${pascal_flags} ${hwengine_project}) +set(fpc_flags ${NOEXECSTACK_FLAGS} ${pascal_flags} ${hwengine_project}) -IF(NOT APPLE) +if(NOT APPLE) #here is the command for standard executables or for shared library add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}" - COMMAND "${fpc_executable}" + COMMAND "${FPC_EXECUTABLE}" ARGS ${fpc_flags} MAIN_DEPENDENCY ${hwengine_project} DEPENDS ${engine_sources} ) -ELSE() +else() #these are the dependencies for building a universal binary on Mac OS X foreach (build_arch ${powerpc_build} ${i386_build} ${x86_64_build}) set(lipo_args_list "${EXECUTABLE_OUTPUT_PATH}/hwengine.${build_arch}" ${lipo_args_list}) add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/hwengine.${build_arch}" - COMMAND "${fpc_executable}" + COMMAND "${FPC_EXECUTABLE}" ARGS ${fpc_flags} -ohwengine.${build_arch} -P${build_arch} MAIN_DEPENDENCY ${hwengine_project} DEPENDS ${engine_sources} @@ -267,7 +230,7 @@ ARGS ${lipo_args_list} -create -output ${EXECUTABLE_OUTPUT_PATH}/${engine_output_name} DEPENDS ${lipo_args_list} ) -ENDIF() +endif() add_custom_target(${engine_output_name} ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/${engine_output_name}${CMAKE_EXECUTABLE_SUFFIX}") @@ -287,7 +250,7 @@ endif() #this command is a workaround to some inlining issues present in older FreePascal versions and fixed in 2.6 -if((fpc_version LESS "020600") AND (NOVIDEOREC OR NOT ${FFMPEG_FOUND})) +if((FPC_VERSION VERSION_LESS "2.6") AND (NOVIDEOREC OR NOT ${FFMPEG_FOUND})) add_dependencies(${engine_output_name} ENGINECLEAN) endif() diff -r 6482875b0d97 -r 171da01bd04d hedgewars/GSHandlers.inc --- a/hedgewars/GSHandlers.inc Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/GSHandlers.inc Tue Dec 04 09:15:55 2012 +0400 @@ -2223,7 +2223,9 @@ begin doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 30, Gear^.Hedgehog, EXPLAutoSound); DeleteGear(Gear); - performRumble(); + with mobileRecord do + if (performRumble <> nil) and (not fastUntilLag) then + performRumble(kSystemSoundID_Vibrate); exit end; if (GameTicks and $3F) = 0 then @@ -4308,7 +4310,9 @@ Gear^.dY.isNegative := not Gear^.dY.isNegative; Gear^.doStep := @doStepSineGunShotWork; - performRumble(); + with mobileRecord do + if (performRumble <> nil) and (not fastUntilLag) then + performRumble(kSystemSoundID_Vibrate); end; //////////////////////////////////////////////////////////////////////////////// diff -r 6482875b0d97 -r 171da01bd04d hedgewars/VGSHandlers.inc --- a/hedgewars/VGSHandlers.inc Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/VGSHandlers.inc Tue Dec 04 09:15:55 2012 +0400 @@ -697,7 +697,9 @@ Gear^.doStep:= @doStepBigExplosionWork; if Steps > 1 then Gear^.doStep(Gear, Steps-1); -performRumble(); +with mobileRecord do + if (performRumble <> nil) and (not fastUntilLag) then + performRumble(kSystemSoundID_Vibrate); end; procedure doStepChunk(Gear: PVisualGear; Steps: Longword); diff -r 6482875b0d97 -r 171da01bd04d hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/hwengine.pas Tue Dec 04 09:15:55 2012 +0400 @@ -536,39 +536,18 @@ end; {$IFNDEF HWLIBRARY} -/////////////////////////////////////////////////////////////////////////////// -procedure DisplayUsage; -var i: LongInt; -begin - WriteLn(stdout, 'Wrong argument format: correct configurations is'); - WriteLn(stdout, ''); - WriteLn(stdout, ' hwengine [options]'); - WriteLn(stdout, ''); - WriteLn(stdout, 'where [options] must be specified either as:'); - WriteLn(stdout, ' --set-video [screen width] [screen height] [color dept]'); - WriteLn(stdout, ' --set-audio [volume] [enable music] [enable sounds]'); - WriteLn(stdout, ' --set-other [language file] [full screen] [show FPS]'); - WriteLn(stdout, ' --set-multimedia [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen]'); - WriteLn(stdout, ' --set-everything [screen width] [screen height] [color dept] [volume] [enable music] [enable sounds] [language file] [full screen] [show FPS] [alternate damage] [timer value] [reduced quality]'); - WriteLn(stdout, ' --stats-only'); - WriteLn(stdout, ''); - WriteLn(stdout, 'Read documentation online at http://code.google.com/p/hedgewars/wiki/CommandLineOptions for more information'); - WriteLn(stdout, ''); - Write(stdout, 'PARSED COMMAND: '); - - for i:=0 to ParamCount do - Write(stdout, ParamStr(i) + ' '); - - WriteLn(stdout, ''); -end; /////////////////////////////////////////////////////////////////////////////// {$INCLUDE "ArgParsers.inc"} procedure GetParams; +var tmpInt: LongInt; begin if (ParamCount < 3) then - GameType:= gmtSyntax + begin + DisplayUsage(); + GameType:= gmtSyntax; + end else if (ParamCount = 3) and (ParamStr(3) = 'landpreview') then begin @@ -601,7 +580,7 @@ if GameType = gmtLandPreview then GenLandPreview() else if GameType = gmtSyntax then - DisplayUsage() + //Exit cleanly else Game(); // return 1 when engine is not called correctly diff -r 6482875b0d97 -r 171da01bd04d hedgewars/options.inc --- a/hedgewars/options.inc Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/options.inc Tue Dec 04 09:15:55 2012 +0400 @@ -43,12 +43,12 @@ {$IFDEF MOBILE} {$DEFINE HWLIBRARY} - {$DEFINE S3D_DISABLED} {$DEFINE GLunit:=gles11} {$DEFINE USE_LANDSCAPE_AMMOMENU} {$DEFINE USE_TOUCH_INTERFACE} {$ELSE} {$DEFINE USE_AM_NUMCOLUMN} + {$DEFINE USE_S3D_RENDERING} {$ENDIF} diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uAIAmmoTests.pas --- a/hedgewars/uAIAmmoTests.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uAIAmmoTests.pas Tue Dec 04 09:15:55 2012 +0400 @@ -116,7 +116,7 @@ (proc: nil; flags: 0), // amDrillStrike (proc: nil; flags: 0), // amSnowball (proc: nil; flags: 0), // amTardis - (proc: nil; flags: 0), // amStructure + //(proc: nil; flags: 0), // amStructure (proc: nil; flags: 0), // amLandGun (proc: nil; flags: 0), // amIceGun (proc: nil; flags: 0) // amKnife diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uChat.pas --- a/hedgewars/uChat.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uChat.pas Tue Dec 04 09:15:55 2012 +0400 @@ -41,6 +41,7 @@ Width: LongInt; s: shortstring; end; + TChatCmd = (quit, pause, finish, fullscreen); var Strs: array[0 .. MaxStrIndex] of TChatLine; MStrs: array[0 .. MaxStrIndex] of shortstring; @@ -52,15 +53,25 @@ ChatReady: boolean; showAll: boolean; -const colors: array[#0..#6] of TSDL_Color = ( - (r:$FF; g:$FF; b:$FF; unused:$FF), // unused, feel free to take it for anything - (r:$FF; g:$FF; b:$FF; unused:$FF), // chat message [White] - (r:$FF; g:$00; b:$FF; unused:$FF), // action message [Purple] - (r:$90; g:$FF; b:$90; unused:$FF), // join/leave message [Lime] - (r:$FF; g:$FF; b:$A0; unused:$FF), // team message [Light Yellow] - (r:$FF; g:$00; b:$00; unused:$FF), // error messages [Red] - (r:$00; g:$FF; b:$FF; unused:$FF) // input line [Light Blue] - ); +const + colors: array[#0..#6] of TSDL_Color = ( + (r:$FF; g:$FF; b:$FF; unused:$FF), // unused, feel free to take it for anything + (r:$FF; g:$FF; b:$FF; unused:$FF), // chat message [White] + (r:$FF; g:$00; b:$FF; unused:$FF), // action message [Purple] + (r:$90; g:$FF; b:$90; unused:$FF), // join/leave message [Lime] + (r:$FF; g:$FF; b:$A0; unused:$FF), // team message [Light Yellow] + (r:$FF; g:$00; b:$00; unused:$FF), // error messages [Red] + (r:$00; g:$FF; b:$FF; unused:$FF) // input line [Light Blue] + ); + ChatCommandz: array [TChatCmd] of record + ChatCmd: string[31]; + ProcedureCallChatCmd: string[31]; + end = ( + (ChatCmd: '/quit'; ProcedureCallChatCmd: 'halt'), + (ChatCmd: '/pause'; ProcedureCallChatCmd: 'pause'), + (ChatCmd: '/finish'; ProcedureCallChatCmd: 'finish'), + (ChatCmd: '/fullscreen'; ProcedureCallChatCmd: 'fullscr') + ); procedure SetLine(var cl: TChatLine; str: shortstring; isInput: boolean); var strSurface, resSurface: PSDL_Surface; @@ -197,6 +208,7 @@ procedure AcceptChatString(s: shortstring); var i: TWave; + j: TChatCmd; c, t: LongInt; x: byte; begin @@ -267,6 +279,13 @@ ParseCommand('/taunt ' + char(i), true); exit end; + + for j:= Low(TChatCmd) to High(TChatCmd) do + if (s = ChatCommandz[j].ChatCmd) then + begin + ParseCommand(ChatCommandz[j].ProcedureCallChatCmd, true); + exit + end; end else ParseCommand('/say ' + s, true); diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uCommandHandlers.pas --- a/hedgewars/uCommandHandlers.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uCommandHandlers.pas Tue Dec 04 09:15:55 2012 +0400 @@ -30,6 +30,8 @@ {$IFDEF USE_VIDEO_RECORDING}, uVideoRec {$ENDIF}; var prevGState: TGameState = gsConfirm; + cTagsMasks : array[0..15] of byte = (7, 0, 0, 0, 15, 6, 4, 5, 0, 0, 0, 0, 0, 14, 12, 13); + cTagsMasksNoHealth: array[0..15] of byte = (3, 2, 11, 1, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0); procedure chGenCmd(var s: shortstring); begin diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uConsts.pas --- a/hedgewars/uConsts.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uConsts.pas Tue Dec 04 09:15:55 2012 +0400 @@ -112,9 +112,7 @@ GL_TEXTURE_PRIORITY = $8066; {$ENDIF} - cSendCursorPosTime : LongWord = 50; cVisibleWater : LongInt = 128; - cCursorEdgesDist : LongInt = 100; cTeamHealthWidth : LongInt = 128; cifRandomize = $00000001; @@ -122,8 +120,6 @@ cifMap = $00000002; // either theme or map (or map+theme) cifAllInited = cifRandomize or cifTheme or cifMap; - cTransparentColor: Longword = $00000000; - RGB_LUMINANCE_RED = 0.212671; RGB_LUMINANCE_GREEN = 0.715160; RGB_LUMINANCE_BLUE = 0.072169; @@ -131,18 +127,14 @@ cMaxTeams = 8; cMaxHHIndex = 7; cMaxHHs = 48; - cMaxSpawnPoints = 1024; cMaxEdgePoints = 16384; cHHRadius = 9; cHHStepTicks = 29; - cUsualZ = 500; - cSmokeZ = 499; cHHZ = 1000; cCurrHHZ = Succ(cHHZ); - cOnHHZ = 2000; cBarrelHealth = 60; cShotgunRadius = 22; @@ -152,18 +144,11 @@ cKeyMaxIndex = 1023; cKbdMaxIndex = 65536;//need more room for the modifier keys - cHHFileName = 'Hedgehog'; - cCHFileName = 'Crosshair'; - cThemeCFGFilename = 'theme.cfg'; - cFontBorder = 2; // do not change this value cDefaultZoomLevel = 2.0; - cSendEmptyPacketTime = 1000; - trigTurns = $80000001; - // game flags gfAny = $FFFFFFFF; gfOneClanMode = $00000001; // used in trainings @@ -290,40 +275,8 @@ NoPointX = Low(LongInt); cTargetPointRef : TPoint = (X: NoPointX; Y: 0); - // hog tag mask - htNone = $00; - htTeamName = $01; - htName = $02; - htHealth = $04; - htTransparent = $08; - - AMAnimDuration = 200; - AMHidden = 0;//AMState values - AMShowingUp = 1; - AMShowing = 2; - AMHiding = 3; + kSystemSoundID_Vibrate = $00000FFF; - AMTypeMaskX = $00000001; - AMTypeMaskY = $00000002; - AMTypeMaskAlpha = $00000004; - AMTypeMaskSlide = $00000008; - -{$IFDEF MOBILE} - AMSlotSize = 48; - AMTITLE = 30; -{$ELSE} - AMSlotSize = 32; -{$ENDIF} - AMSlotPadding = (AMSlotSize - 32) shr 1; - -{$IFDEF USE_TOUCH_INTERFACE} - FADE_ANIM_TIME = 500; - MOVE_ANIM_TIME = 500; -{$ENDIF} - - cTagsMasks : array[0..15] of byte = (7, 0, 0, 0, 15, 6, 4, 5, 0, 0, 0, 0, 0, 14, 12, 13); - cTagsMasksNoHealth: array[0..15] of byte = (3, 2, 11, 1, 0, 0, 0, 0, 0, 10, 0, 9, 0, 0, 0, 0); - implementation end. diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uGame.pas --- a/hedgewars/uGame.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uGame.pas Tue Dec 04 09:15:55 2012 +0400 @@ -26,7 +26,7 @@ //////////////////// implementation //////////////////// -uses uInputHandler, uTeams, uIO, uAI, uGears, uSound, uMobile, +uses uInputHandler, uTeams, uIO, uAI, uGears, uSound, uVisualGears, uTypes, uVariables, uCommands, uConsts {$IFDEF USE_TOUCH_INTERFACE}, uTouch{$ENDIF}; @@ -96,7 +96,9 @@ AddVisualGear(0, 0, vgtTeamHealthSorter); AddVisualGear(0, 0, vgtSmoothWindBar); {$IFDEF IPHONEOS}InitIPC;{$ENDIF} - uMobile.SaveLoadingEnded(); + with mobileRecord do + if SaveLoadingEnded <> nil then + SaveLoadingEnded(); end; end else ProcessGears diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uGears.pas --- a/hedgewars/uGears.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uGears.pas Tue Dec 04 09:15:55 2012 +0400 @@ -57,7 +57,7 @@ implementation uses uStore, uSound, uTeams, uRandom, uCollisions, uIO, uLandGraphics, - uLocale, uAI, uAmmos, uStats, uVisualGears, uScript, GLunit, uMobile, uVariables, + uLocale, uAI, uAmmos, uStats, uVisualGears, uScript, GLunit, uVariables, uCommands, uUtils, uTextures, uRenderUtils, uGearsRender, uCaptions, uDebug, uLandTexture, uGearsHedgehog, uGearsUtils, uGearsList, uGearsHandlers, uGearsHandlersRope; @@ -677,8 +677,8 @@ gtKnife, gtCase, gtTarget, - gtExplosives, - gtStructure: begin + gtExplosives: begin//, +// gtStructure: begin //addFileLog('ShotgunShot radius: ' + inttostr(Gear^.Radius) + ', t^.Radius = ' + inttostr(t^.Radius) + ', distance = ' + inttostr(dist) + ', dmg = ' + inttostr(dmg)); dmg:= 0; r:= Gear^.Radius + t^.Radius; @@ -777,8 +777,8 @@ gtKnife, gtTarget, gtCase, - gtExplosives, - gtStructure: + gtExplosives: //, + //gtStructure: begin if (Ammo^.Kind = gtDrill) then begin @@ -906,10 +906,6 @@ inc(Count) end; end; - // unC0Rr, while it is true user can watch value on map screen, IMO this (and check above) should be enforced in UI - // - is there a good place to put values for the different widgets to check? Right now they are kind of disconnected. - //it would be nice if divide teams, forts mode and hh per map could all be checked by the team widget, or maybe disable start button - TryDo(Count <= MaxHedgehogs, 'Too many hedgehogs for this map! (max # is ' + inttostr(MaxHedgehogs) + ')', true); while (Count > 0) do begin i:= GetRandom(Count); @@ -1367,7 +1363,7 @@ @doStepNapalmBomb, @doStepSnowball, @doStepSnowflake, - @doStepStructure, + //@doStepStructure, @doStepLandGun, @doStepTardis, @doStepIceGun, diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uGearsHedgehog.pas Tue Dec 04 09:15:55 2012 +0400 @@ -374,7 +374,7 @@ newGear:= AddGear(hwRound(lx), hwRound(ly), gtResurrector, 0, _0, _0, 0); newGear^.SoundChannel := LoopSound(sndResurrector); end; - amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); + //amStructure: newGear:= AddGear(hwRound(lx) + hwSign(dX) * 7, hwRound(ly), gtStructure, gstWait, SignAs(_0_02, dX), _0, 3000); amTardis: newGear:= AddGear(hwRound(X), hwRound(Y), gtTardis, 0, _0, _0, 5000); amIceGun: newGear:= AddGear(hwRound(X), hwRound(Y), gtIceGun, 0, _0, _0, 0); end; @@ -404,7 +404,7 @@ amSeduction, amBallgun, amJetpack, amBirdy, amFlamethrower, amLandGun, - amResurrector, amStructure, + amResurrector, //amStructure, amTardis, amPiano, amIceGun: CurAmmoGear:= newGear; end; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uGearsList.pas --- a/hedgewars/uGearsList.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uGearsList.pas Tue Dec 04 09:15:55 2012 +0400 @@ -35,8 +35,83 @@ uTextures, uScript, uRenderUtils, uAI, uCollisions, uGearsRender, uGearsUtils, uDebug; +const + GearKindAmmoTypeMap : array [TGearType] of TAmmoType = ( +(* gtFlame *) amNothing +(* gtHedgehog *) , amNothing +(* gtMine *) , amMine +(* gtCase *) , amNothing +(* gtExplosives *) , amNothing +(* gtGrenade *) , amGrenade +(* gtShell *) , amBazooka +(* gtGrave *) , amNothing +(* gtBee *) , amBee +(* gtShotgunShot *) , amShotgun +(* gtPickHammer *) , amPickHammer +(* gtRope *) , amRope +(* gtDEagleShot *) , amDEagle +(* gtDynamite *) , amDynamite +(* gtClusterBomb *) , amClusterBomb +(* gtCluster *) , amClusterBomb +(* gtShover *) , amBaseballBat // Shover is only used for baseball bat right now +(* gtFirePunch *) , amFirePunch +(* gtATStartGame *) , amNothing +(* gtATFinishGame *) , amNothing +(* gtParachute *) , amParachute +(* gtAirAttack *) , amAirAttack +(* gtAirBomb *) , amAirAttack +(* gtBlowTorch *) , amBlowTorch +(* gtGirder *) , amGirder +(* gtTeleport *) , amTeleport +(* gtSwitcher *) , amSwitch +(* gtTarget *) , amNothing +(* gtMortar *) , amMortar +(* gtWhip *) , amWhip +(* gtKamikaze *) , amKamikaze +(* gtCake *) , amCake +(* gtSeduction *) , amSeduction +(* gtWatermelon *) , amWatermelon +(* gtMelonPiece *) , amWatermelon +(* gtHellishBomb *) , amHellishBomb +(* gtWaterUp *) , amNothing +(* gtDrill *) , amDrill +(* gtBallGun *) , amBallgun +(* gtBall *) , amBallgun +(* gtRCPlane *) , amRCPlane +(*gtSniperRifleShot *) , amSniperRifle +(* gtJetpack *) , amJetpack +(* gtMolotov *) , amMolotov +(* gtBirdy *) , amBirdy +(* gtEgg *) , amBirdy +(* gtPortal *) , amPortalGun +(* gtPiano *) , amPiano +(* gtGasBomb *) , amGasBomb +(* gtSineGunShot *) , amSineGun +(* gtFlamethrower *) , amFlamethrower +(* gtSMine *) , amSMine +(* gtPoisonCloud *) , amNothing +(* gtHammer *) , amHammer +(* gtHammerHit *) , amHammer +(* gtResurrector *) , amResurrector +(* gtPoisonCloud *) , amNothing +(* gtSnowball *) , amSnowball +(* gtFlake *) , amNothing +//(* gtStructure *) , amStructure // TODO - This will undoubtedly change once there is more than one structure +(* gtLandGun *) , amLandGun +(* gtTardis *) , amTardis +(* gtIceGun *) , amIceGun +(* gtAddAmmo *) , amNothing +(* gtGenericFaller *) , amNothing +(* gtKnife *) , amKnife + ); + + var GCounter: LongWord = 0; // this does not get re-initialized, but should be harmless +const + cUsualZ = 500; + cOnHHZ = 2000; + procedure InsertGearToList(Gear: PGear); var tmp, ptmp: PGear; begin @@ -461,6 +536,7 @@ gear^.Radius:= 5; gear^.Density:= _1_5; end; +{ gtStructure: begin gear^.Elasticity:= _0_55; gear^.Friction:= _0_995; @@ -471,6 +547,7 @@ gear^.Tag:= TotalRounds + 3; gear^.Pos:= 1; end; +} gtIceGun: gear^.Health:= 1000; gtGenericFaller:begin gear^.AdvBounce:= 1; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uGearsRender.pas Tue Dec 04 09:15:55 2012 +0400 @@ -39,6 +39,14 @@ implementation uses uRender, uUtils, uVariables, uAmmos, Math, uVisualGears; +const + // hog tag mask + htNone = $00; + htTeamName = $01; + htName = $02; + htHealth = $04; + htTransparent = $08; + procedure DrawRopeLinesRQ(Gear: PGear); begin with RopePoints do @@ -1178,7 +1186,7 @@ if Gear^.FlightTime > 0 then Tint($FF, $FF, $FF, $FF); end; - gtStructure: DrawSprite(sprTarget, x - 16, y - 16, 0); + //gtStructure: DrawSprite(sprTarget, x - 16, y - 16, 0); gtTardis: if Gear^.Pos <> 4 then begin if Gear^.Pos = 2 then diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uGearsUtils.pas Tue Dec 04 09:15:55 2012 +0400 @@ -106,8 +106,8 @@ gtTarget, gtFlame, gtKnife, - gtExplosives, - gtStructure: begin + gtExplosives: begin //, + //gtStructure: begin // Run the calcs only once we know we have a type that will need damage tdX:= Gear^.X-fX; tdY:= Gear^.Y-fY; @@ -243,8 +243,8 @@ end; uStats.HedgehogDamaged(Gear, AttackerHog, Damage, false); end; - end - else if Gear^.Kind <> gtStructure then // not gtHedgehog nor gtStructure + end else + //else if Gear^.Kind <> gtStructure then // not gtHedgehog nor gtStructure Gear^.Hedgehog:= AttackerHog; inc(Gear^.Damage, Damage); diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uIO.pas --- a/hedgewars/uIO.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uIO.pas Tue Dec 04 09:15:55 2012 +0400 @@ -41,6 +41,9 @@ implementation uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug; +const + cSendEmptyPacketTime = 1000; + type PCmd = ^TCmd; TCmd = packed record Next: PCmd; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uInputHandler.pas --- a/hedgewars/uInputHandler.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uInputHandler.pas Tue Dec 04 09:15:55 2012 +0400 @@ -60,6 +60,16 @@ quitKeyCode, closeKeyCode: Byte; KeyNames: array [0..cKeyMaxIndex] of string[15]; CurrentBinds: TBinds; + ControllerNumControllers: Integer; + ControllerEnabled: Integer; + ControllerNumAxes: array[0..5] of Integer; + //ControllerNumBalls: array[0..5] of Integer; + ControllerNumHats: array[0..5] of Integer; + ControllerNumButtons: array[0..5] of Integer; + ControllerAxes: array[0..5] of array[0..19] of Integer; + //ControllerBalls: array[0..5] of array[0..19] of array[0..1] of Integer; + ControllerHats: array[0..5] of array[0..19] of Byte; + ControllerButtons: array[0..5] of array[0..19] of Byte; function KeyNameToCode(name: shortstring): LongInt; inline; begin diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uLand.pas --- a/hedgewars/uLand.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uLand.pas Tue Dec 04 09:15:55 2012 +0400 @@ -596,7 +596,7 @@ begin map:= cPathz[ptMapCurrent] + '/map.png'; mask:= cPathz[ptMapCurrent] + '/mask.png'; - if (not(FileExists(map)) and FileExists(mask)) then + if (not(pfsExists(map)) and pfsExists(mask)) then begin maskOnly:= true; LoadMask; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uLandObjects.pas Tue Dec 04 09:15:55 2012 +0400 @@ -37,6 +37,7 @@ const MaxRects = 512; MAXOBJECTRECTS = 16; MAXTHEMEOBJECTS = 32; + cThemeCFGFilename = 'theme.cfg'; type TRectsArray = array[0..MaxRects] of TSDL_Rect; PRectArray = ^TRectsArray; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uLandOutline.pas --- a/hedgewars/uLandOutline.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uLandOutline.pas Tue Dec 04 09:15:55 2012 +0400 @@ -27,6 +27,9 @@ end end; +const + cMaxEdgePoints = 16384; + procedure Push(_xl, _xr, _y, _dir: LongInt); begin TryDo(Stack.Count <= 8192, 'FillLand: stack overflow', true); diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uMobile.pas --- a/hedgewars/uMobile.pas Fri Nov 30 18:19:52 2012 +0400 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,110 +0,0 @@ -(* - * Hedgewars, a free turn based strategy game - * Copyright (c) 2004-2012 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 "options.inc"} - -(* - * This unit contains a lot of useful functions when hw is running on mobile - * Unlike HwLibrary when you declare functions that you will call from your code, - * here you need to provide functions that Pascall code will call. - *) - -unit uMobile; -interface - -function isPhone: Boolean; inline; -function getScreenDPI: Double; inline; -procedure performRumble; inline; - -procedure GameLoading; inline; -procedure GameLoaded; inline; -procedure SaveLoadingEnded; inline; - -implementation -uses uVariables, uConsole, SDLh; - -// add here any external call that you need -{$IFDEF IPHONEOS} -(* iOS calls written in ObjcExports.m *) -procedure startLoadingIndicator; cdecl; external; -procedure stopLoadingIndicator; cdecl; external; -procedure saveFinishedSynching; cdecl; external; -function isApplePhone: Boolean; cdecl; external; -procedure AudioServicesPlaySystemSound(num: LongInt); cdecl; external; -{$ENDIF} - -// this function is just to determine whether we are running on a limited screen device -function isPhone: Boolean; inline; -begin - isPhone:= false; -{$IFDEF IPHONEOS} - isPhone:= isApplePhone(); -{$ENDIF} -{$IFDEF ANDROID} - //nasty nasty hack. TODO: implement callback to java to have a unified way of determining if it is a tablet - if (cScreenWidth < 1000) and (cScreenHeight < 500) then - isPhone:= true; -{$ENDIF} -end; - -function getScreenDPI: Double; inline; -begin -{$IFDEF ANDROID} -// getScreenDPI:= Android_JNI_getDensity(); - getScreenDPI:= 1; -{$ELSE} - getScreenDPI:= 1; -{$ENDIF} -end; - -// this function should make the device vibrate in some way -procedure PerformRumble; inline; -{$IFDEF IPHONEOS}const kSystemSoundID_Vibrate = $00000FFF;{$ENDIF} -begin - // do not vibrate while synchronising a demo/save - if not fastUntilLag then - begin -{$IFDEF IPHONEOS} - AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); -{$ENDIF} - end; -end; - -procedure GameLoading; inline; -begin -{$IFDEF IPHONEOS} - startLoadingIndicator(); -{$ENDIF} -end; - -procedure GameLoaded; inline; -begin -{$IFDEF IPHONEOS} - stopLoadingIndicator(); -{$ENDIF} -end; - -procedure SaveLoadingEnded; inline; -begin -{$IFDEF IPHONEOS} - saveFinishedSynching(); -{$ENDIF} -end; - - -end. diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uPhysFSLayer.pas --- a/hedgewars/uPhysFSLayer.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uPhysFSLayer.pas Tue Dec 04 09:15:55 2012 +0400 @@ -15,6 +15,7 @@ {$IFDEF WIN32} PhysfsLibName = 'libphysfs'; {$ELSE} + {$LINKLIB ../bin/libphysfs.a} PhysfsLibName = 'physfs'; {$ENDIF} diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uRender.pas --- a/hedgewars/uRender.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uRender.pas Tue Dec 04 09:15:55 2012 +0400 @@ -55,6 +55,12 @@ implementation uses uVariables; +{$IFDEF USE_TOUCH_INTERFACE} +const + FADE_ANIM_TIME = 500; + MOVE_ANIM_TIME = 500; +{$ENDIF} + var LastTint: LongWord = 0; procedure DrawSpriteFromRect(Sprite: TSprite; r: TSDL_Rect; X, Y, Height, Position: LongInt); diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uScript.pas --- a/hedgewars/uScript.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uScript.pas Tue Dec 04 09:15:55 2012 +0400 @@ -2319,6 +2319,7 @@ ScriptSetInteger('gstHHGone' ,$00100000); ScriptSetInteger('gstInvisible' ,$00200000); +// ai hints ScriptSetInteger('aihUsualProcessing' ,$00000000); ScriptSetInteger('aihDoesntMatter' ,$00000001); diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uSound.pas --- a/hedgewars/uSound.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uSound.pas Tue Dec 04 09:15:55 2012 +0400 @@ -120,6 +120,136 @@ isMusicEnabled: boolean; isSoundEnabled: boolean; isSEBackup: boolean; + VoiceList : array[0..7] of TVoice = ( + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil), + ( snd: sndNone; voicepack: nil)); + Soundz: array[TSound] of record + FileName: string[31]; + Path : TPathType; + end = ( + (FileName: ''; Path: ptNone ),// sndNone + (FileName: 'grenadeimpact.ogg'; Path: ptSounds),// sndGrenadeImpact + (FileName: 'explosion.ogg'; Path: ptSounds),// sndExplosion + (FileName: 'throwpowerup.ogg'; Path: ptSounds),// sndThrowPowerUp + (FileName: 'throwrelease.ogg'; Path: ptSounds),// sndThrowRelease + (FileName: 'splash.ogg'; Path: ptSounds),// sndSplash + (FileName: 'shotgunreload.ogg'; Path: ptSounds),// sndShotgunReload + (FileName: 'shotgunfire.ogg'; Path: ptSounds),// sndShotgunFire + (FileName: 'graveimpact.ogg'; Path: ptSounds),// sndGraveImpact + (FileName: 'mineimpact.ogg'; Path: ptSounds),// sndMineImpact + (FileName: 'minetick.ogg'; Path: ptSounds),// sndMineTicks + (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndMudballImpact + (FileName: 'pickhammer.ogg'; Path: ptSounds),// sndPickhammer + (FileName: 'gun.ogg'; Path: ptSounds),// sndGun + (FileName: 'bee.ogg'; Path: ptSounds),// sndBee + (FileName: 'Jump1.ogg'; Path: ptVoices),// sndJump1 + (FileName: 'Jump2.ogg'; Path: ptVoices),// sndJump2 + (FileName: 'Jump3.ogg'; Path: ptVoices),// sndJump3 + (FileName: 'Yessir.ogg'; Path: ptVoices),// sndYesSir + (FileName: 'Laugh.ogg'; Path: ptVoices),// sndLaugh + (FileName: 'Illgetyou.ogg'; Path: ptVoices),// sndIllGetYou + (FileName: 'JustYouWait.ogg'; Path: ptVoices),// sndJustYouWait + (FileName: 'Incoming.ogg'; Path: ptVoices),// sndIncoming + (FileName: 'Missed.ogg'; Path: ptVoices),// sndMissed + (FileName: 'Stupid.ogg'; Path: ptVoices),// sndStupid + (FileName: 'Firstblood.ogg'; Path: ptVoices),// sndFirstBlood + (FileName: 'Boring.ogg'; Path: ptVoices),// sndBoring + (FileName: 'Byebye.ogg'; Path: ptVoices),// sndByeBye + (FileName: 'Sameteam.ogg'; Path: ptVoices),// sndSameTeam + (FileName: 'Nutter.ogg'; Path: ptVoices),// sndNutter + (FileName: 'Reinforcements.ogg'; Path: ptVoices),// sndReinforce + (FileName: 'Traitor.ogg'; Path: ptVoices),// sndTraitor + (FileName: 'Youllregretthat.ogg'; Path: ptVoices),// sndRegret + (FileName: 'Enemydown.ogg'; Path: ptVoices),// sndEnemyDown + (FileName: 'Coward.ogg'; Path: ptVoices),// sndCoward + (FileName: 'Hurry.ogg'; Path: ptVoices),// sndHurry + (FileName: 'Watchit.ogg'; Path: ptVoices),// sndWatchIt + (FileName: 'Kamikaze.ogg'; Path: ptVoices),// sndKamikaze + (FileName: 'cake2.ogg'; Path: ptSounds),// sndCake + (FileName: 'Ow1.ogg'; Path: ptVoices),// sndOw1 + (FileName: 'Ow2.ogg'; Path: ptVoices),// sndOw2 + (FileName: 'Ow3.ogg'; Path: ptVoices),// sndOw3 + (FileName: 'Ow4.ogg'; Path: ptVoices),// sndOw4 + (FileName: 'Firepunch1.ogg'; Path: ptVoices),// sndFirepunch1 + (FileName: 'Firepunch2.ogg'; Path: ptVoices),// sndFirepunch2 + (FileName: 'Firepunch3.ogg'; Path: ptVoices),// sndFirepunch3 + (FileName: 'Firepunch4.ogg'; Path: ptVoices),// sndFirepunch4 + (FileName: 'Firepunch5.ogg'; Path: ptVoices),// sndFirepunch5 + (FileName: 'Firepunch6.ogg'; Path: ptVoices),// sndFirepunch6 + (FileName: 'Melon.ogg'; Path: ptVoices),// sndMelon + (FileName: 'Hellish.ogg'; Path: ptSounds),// sndHellish + (FileName: 'Yoohoo.ogg'; Path: ptSounds),// sndYoohoo + (FileName: 'rcplane.ogg'; Path: ptSounds),// sndRCPlane + (FileName: 'whipcrack.ogg'; Path: ptSounds),// sndWhipCrack + (FileName:'ride_of_the_valkyries.ogg'; Path: ptSounds),// sndRideOfTheValkyries + (FileName: 'denied.ogg'; Path: ptSounds),// sndDenied + (FileName: 'placed.ogg'; Path: ptSounds),// sndPlaced + (FileName: 'baseballbat.ogg'; Path: ptSounds),// sndBaseballBat + (FileName: 'steam.ogg'; Path: ptSounds),// sndVaporize + (FileName: 'warp.ogg'; Path: ptSounds),// sndWarp + (FileName: 'suddendeath.ogg'; Path: ptSounds),// sndSuddenDeath + (FileName: 'mortar.ogg'; Path: ptSounds),// sndMortar + (FileName: 'shutterclick.ogg'; Path: ptSounds),// sndShutter + (FileName: 'homerun.ogg'; Path: ptSounds),// sndHomerun + (FileName: 'molotov.ogg'; Path: ptSounds),// sndMolotov + (FileName: 'Takecover.ogg'; Path: ptVoices),// sndCover + (FileName: 'Uh-oh.ogg'; Path: ptVoices),// sndUhOh + (FileName: 'Oops.ogg'; Path: ptVoices),// sndOops + (FileName: 'Nooo.ogg'; Path: ptVoices),// sndNooo + (FileName: 'Hello.ogg'; Path: ptVoices),// sndHello + (FileName: 'ropeshot.ogg'; Path: ptSounds),// sndRopeShot + (FileName: 'ropeattach.ogg'; Path: ptSounds),// sndRopeAttach + (FileName: 'roperelease.ogg'; Path: ptSounds),// sndRopeRelease + (FileName: 'switchhog.ogg'; Path: ptSounds),// sndSwitchHog + (FileName: 'Victory.ogg'; Path: ptVoices),// sndVictory + (FileName: 'Flawless.ogg'; Path: ptVoices),// sndFlawless + (FileName: 'sniperreload.ogg'; Path: ptSounds),// sndSniperReload + (FileName: 'steps.ogg'; Path: ptSounds),// sndSteps + (FileName: 'lowgravity.ogg'; Path: ptSounds),// sndLowGravity + (FileName: 'hell_growl.ogg'; Path: ptSounds),// sndHellishImpact1 + (FileName: 'hell_ooff.ogg'; Path: ptSounds),// sndHellishImpact2 + (FileName: 'hell_ow.ogg'; Path: ptSounds),// sndHellishImpact3 + (FileName: 'hell_ugh.ogg'; Path: ptSounds),// sndHellishImpact4 + (FileName: 'melonimpact.ogg'; Path: ptSounds),// sndMelonImpact + (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndDroplet1 + (FileName: 'Droplet2.ogg'; Path: ptSounds),// sndDroplet2 + (FileName: 'Droplet3.ogg'; Path: ptSounds),// sndDroplet3 + (FileName: 'egg.ogg'; Path: ptSounds),// sndEggBreak + (FileName: 'drillgun.ogg'; Path: ptSounds),// sndDrillRocket + (FileName: 'PoisonCough.ogg'; Path: ptVoices),// sndPoisonCough + (FileName: 'PoisonMoan.ogg'; Path: ptVoices),// sndPoisonMoan + (FileName: 'BirdyLay.ogg'; Path: ptSounds),// sndBirdyLay + (FileName: 'Whistle.ogg'; Path: ptSounds),// sndWhistle + (FileName: 'beewater.ogg'; Path: ptSounds),// sndBeeWater + (FileName: '1C.ogg'; Path: ptSounds),// sndPiano0 + (FileName: '2D.ogg'; Path: ptSounds),// sndPiano1 + (FileName: '3E.ogg'; Path: ptSounds),// sndPiano2 + (FileName: '4F.ogg'; Path: ptSounds),// sndPiano3 + (FileName: '5G.ogg'; Path: ptSounds),// sndPiano4 + (FileName: '6A.ogg'; Path: ptSounds),// sndPiano5 + (FileName: '7B.ogg'; Path: ptSounds),// sndPiano6 + (FileName: '8C.ogg'; Path: ptSounds),// sndPiano7 + (FileName: '9D.ogg'; Path: ptSounds),// sndPiano8 + (FileName: 'skip.ogg'; Path: ptSounds),// sndSkip + (FileName: 'sinegun.ogg'; Path: ptSounds),// sndSineGun + (FileName: 'Ooff1.ogg'; Path: ptVoices),// sndOoff1 + (FileName: 'Ooff2.ogg'; Path: ptVoices),// sndOoff2 + (FileName: 'Ooff3.ogg'; Path: ptVoices),// sndOoff3 + (FileName: 'hammer.ogg'; Path: ptSounds),// sndWhack + (FileName: 'Comeonthen.ogg'; Path: ptVoices),// sndComeonthen + (FileName: 'parachute.ogg'; Path: ptSounds),// sndParachute + (FileName: 'bump.ogg'; Path: ptSounds),// sndBump + (FileName: 'hogchant3.ogg'; Path: ptSounds),// sndResurrector + (FileName: 'plane.ogg'; Path: ptSounds),// sndPlane + (FileName: 'TARDIS.ogg'; Path: ptSounds) // sndTardis + ); + function AskForVoicepack(name: shortstring): Pointer; @@ -256,7 +386,7 @@ if (voicepack^.chunks[snd] = nil) and (Soundz[snd].Path = ptVoices) and (Soundz[snd].FileName <> '') then begin s:= cPathz[Soundz[snd].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; - if (not FileExists(s)) and (snd in [sndFirePunch2, sndFirePunch3, sndFirePunch4, sndFirePunch5, sndFirePunch6]) then + if (not pfsExists(s)) and (snd in [sndFirePunch2, sndFirePunch3, sndFirePunch4, sndFirePunch5, sndFirePunch6]) then s:= cPathz[Soundz[sndFirePunch1].Path] + '/' + voicepack^.name + '/' + Soundz[snd].FileName; WriteToConsole(msgLoading + s + ' '); voicepack^.chunks[snd]:= Mix_LoadWAV_RW(rwopsOpenRead(s), 1); @@ -289,7 +419,7 @@ if (snd = sndVictory) or (snd = sndFlawless) then begin Mix_FadeOutChannel(-1, 800); - for i:= 0 to 7 do + for i:= 0 to High(VoiceList) do VoiceList[i].snd:= sndNone; LastVoice.snd:= sndNone; end; @@ -311,7 +441,7 @@ if (not isSoundEnabled) or fastUntilLag or ((LastVoice.snd <> sndNone) and (lastChan[LastVoice.snd] <> -1) and (Mix_Playing(lastChan[LastVoice.snd]) <> 0)) then exit; i:= 0; - while (i<8) and (VoiceList[i].snd = sndNone) do + while (i sndNone) then @@ -589,7 +719,7 @@ voicepacks[t].chunks[i]:= nil; (* on MOBILE SDL_mixer has to be compiled against Tremor (USE_OGG_TREMOR) - or sound files bigger than 32k will lockup the game *) + or sound files bigger than 32k will lockup the game on slow cpu *) for i:= Low(TSound) to High(TSound) do defVoicepack^.chunks[i]:= nil; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uStore.pas --- a/hedgewars/uStore.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uStore.pas Tue Dec 04 09:15:55 2012 +0400 @@ -33,7 +33,7 @@ procedure FinishProgress; function LoadImage(const filename: shortstring; imageFlags: LongInt): PSDL_Surface; -// loads an image from the game's data files +// loads an image from the games data files function LoadDataImage(const path: TPathType; const filename: shortstring; imageFlags: LongInt): PSDL_Surface; // like LoadDataImage but uses altPath as fallback-path if file not found/loadable in path function LoadDataImageAltPath(const path, altPath: TPathType; const filename: shortstring; imageFlags: LongInt): PSDL_Surface; @@ -56,7 +56,7 @@ procedure SwapBuffers; {$IFDEF USE_VIDEO_RECORDING}cdecl{$ELSE}inline{$ENDIF}; implementation -uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands +uses uMisc, uConsole, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands , uPhysFSLayer , uDebug {$IFDEF USE_CONTEXT_RESTORE}, uWorld{$ENDIF} @@ -71,6 +71,13 @@ {$ELSE} SDLPrimSurface: PSDL_Surface; {$ENDIF} + squaresize : LongInt; + numsquares : LongInt; + ProgrTex: PTexture; + +const + cHHFileName = 'Hedgehog'; + cCHFileName = 'Crosshair'; function WriteInRect(Surface: PSDL_Surface; X, Y: LongInt; Color: LongWord; Font: THWFont; s: ansistring): TSDL_Rect; var w, h: LongInt; @@ -437,7 +444,7 @@ IMG_Quit(); end; -{$IF NOT DEFINED(S3D_DISABLED) OR DEFINED(USE_VIDEO_RECORDING)} +{$IF DEFINED(USE_S3D_RENDERING) OR DEFINED(USE_VIDEO_RECORDING)} procedure CreateFramebuffer(var frame, depth, tex: GLuint); begin glGenFramebuffersEXT(1, @frame); @@ -539,7 +546,7 @@ if defaultFrame <> 0 then DeleteFramebuffer(defaultFrame, depthv, texv); {$ENDIF} -{$IFNDEF S3D_DISABLED} +{$IFDEF USE_S3D_RENDERING} if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then begin DeleteFramebuffer(framel, depthl, texl); @@ -805,7 +812,7 @@ end; {$ENDIF} -{$IFNDEF S3D_DISABLED} +{$IFDEF USE_S3D_RENDERING} if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then begin // prepare left and right frame buffers and associated textures @@ -879,8 +886,10 @@ squaresize:= texsurf^.w shr 1; numsquares:= texsurf^.h div squaresize; SDL_FreeSurface(texsurf); - - uMobile.GameLoading(); + with mobileRecord do + if GameLoading <> nil then + GameLoading(); + end; TryDo(ProgrTex <> nil, 'Error - Progress Texure is nil!', true); @@ -903,7 +912,9 @@ procedure FinishProgress; begin - uMobile.GameLoaded(); + with mobileRecord do + if GameLoaded <> nil then + GameLoaded(); WriteLnToConsole('Freeing progress surface... '); FreeTexture(ProgrTex); ProgrTex:= nil; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uTeams.pas Tue Dec 04 09:15:55 2012 +0400 @@ -46,6 +46,7 @@ var MaxTeamHealth: LongInt; GameOver: boolean; + NextClan: boolean; function CheckForWin: boolean; var AliveClan: PClan; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uTouch.pas --- a/hedgewars/uTouch.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uTouch.pas Tue Dec 04 09:15:55 2012 +0400 @@ -22,7 +22,7 @@ interface -uses SysUtils, uConsole, uVariables, SDLh, uFloat, uConsts, uCommands, GLUnit, uTypes, uCaptions, uAmmos, uWorld, uMobile; +uses SysUtils, uConsole, uVariables, SDLh, uFloat, uConsts, uCommands, GLUnit, uTypes, uCaptions, uAmmos, uWorld; procedure initModule; @@ -558,7 +558,7 @@ isOnCrosshair:= isOnRect((x-HalfRectSize), (y-HalfRectSize), RectSize, RectSize, finger); printFinger(finger); WriteLnToConsole(inttostr(finger.x) + ' ' + inttostr(x)); - WriteLnToConsole(inttostr(x) + ' ' + inttostr(y) + ' ' + inttostr(round(uMobile.getScreenDPI * 10))); + WriteLnToConsole(inttostr(x) + ' ' + inttostr(y) + ' ' + inttostr(round(mobileRecord.getScreenDPI() * 10))); end; function isOnCurrentHog(finger: TTouch_Data): boolean; @@ -640,7 +640,7 @@ for index := 0 to High(fingers) do fingers[index].id := nilFingerId; - rectSize:= round(baseRectSize * uMobile.getScreenDPI); + rectSize:= round(baseRectSize * mobileRecord.getScreenDPI()); halfRectSize:= rectSize shl 1; end; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uTypes.pas Tue Dec 04 09:15:55 2012 +0400 @@ -102,7 +102,7 @@ gtSniperRifleShot, gtJetpack, gtMolotov, gtBirdy, // 44 gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot, gtFlamethrower, // 50 gtSMine, gtPoisonCloud, gtHammer, gtHammerHit, gtResurrector, // 55 - gtNapalmBomb, gtSnowball, gtFlake, gtStructure, gtLandGun, gtTardis, // 61 + gtNapalmBomb, gtSnowball, gtFlake, {gtStructure,} gtLandGun, gtTardis, // 61 gtIceGun, gtAddAmmo, gtGenericFaller, gtKnife); // 65 // Gears that are _only_ of visual nature (e.g. background stuff, visual effects, speechbubbles, etc.) @@ -151,7 +151,7 @@ amRCPlane, amLowGravity, amExtraDamage, amInvulnerable, amExtraTime, // 35 amLaserSight, amVampiric, amSniperRifle, amJetpack, amMolotov, amBirdy, amPortalGun, // 42 amPiano, amGasBomb, amSineGun, amFlamethrower, amSMine, amHammer, // 48 - amResurrector, amDrillStrike, amSnowball, amTardis, amStructure, amLandGun, amIceGun, amKnife); // 54 + amResurrector, amDrillStrike, amSnowball, amTardis, {amStructure,} amLandGun, amIceGun, amKnife); // 54 // Different kind of crates that e.g. hedgehogs can pick up TCrateType = (HealthCrate, AmmoCrate, UtilityCrate); @@ -399,6 +399,18 @@ Flawless: boolean; end; + cdeclPtr = procedure; cdecl; + cdeclIntPtr = procedure(num: LongInt); cdecl; + functionDoublePtr = function: Double; + + TMobileRecord = record + getScreenDPI: functionDoublePtr; + PerformRumble: cdeclIntPtr; + GameLoading: cdeclPtr; + GameLoaded: cdeclPtr; + SaveLoadingEnded: cdeclPtr; + end; + TAmmoStrId = (sidGrenade, sidClusterBomb, sidBazooka, sidBee, sidShotgun, sidPickHammer, sidSkip, sidRope, sidMine, sidDEagle, sidDynamite, sidBaseballBat, sidFirePunch, sidSeconds, @@ -411,7 +423,7 @@ sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun, sidFlamethrower,sidSMine, sidHammer, sidResurrector, sidDrillStrike, sidSnowball, sidNothing, sidTardis, - sidStructure, sidLandGun, sidIceGun, sidKnife); + {sidStructure,} sidLandGun, sidIceGun, sidKnife); TMsgStrId = (sidStartFight, sidDraw, sidWinner, sidVolume, sidPaused, sidConfirm, sidSuddenDeath, sidRemaining, sidFuel, sidSync, diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uUtils.pas --- a/hedgewars/uUtils.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uUtils.pas Tue Dec 04 09:15:55 2012 +0400 @@ -73,6 +73,17 @@ procedure WriteLn(var f: textfile; s: shortstring); {$ENDIF} +function isPhone: Boolean; inline; +function getScreenDPI: Double; inline; //cdecl; external; + +{$IFDEF IPHONEOS} +procedure startLoadingIndicator; cdecl; external; +procedure stopLoadingIndicator; cdecl; external; +procedure saveFinishedSynching; cdecl; external; +function isApplePhone: Boolean; cdecl; external; +procedure AudioServicesPlaySystemSound(num: LongInt); cdecl; external; +{$ENDIF} + procedure initModule(isNotPreview: boolean); procedure freeModule; @@ -401,6 +412,31 @@ end; {$ENDIF} +// this function is just to determine whether we are running on a limited screen device +function isPhone: Boolean; inline; +begin + isPhone:= false; +{$IFDEF IPHONEOS} + isPhone:= isApplePhone(); +{$ENDIF} +{$IFDEF ANDROID} + //nasty nasty hack. TODO: implement callback to java to have a unified way of determining if it is a tablet + if (cScreenWidth < 1000) and (cScreenHeight < 500) then + isPhone:= true; +{$ENDIF} +end; + +//This dummy function should be reimplemented (externally). +function getScreenDPI: Double; inline; +begin +{$IFDEF ANDROID} +// getScreenDPI:= Android_JNI_getDensity(); + getScreenDPI:= 1; +{$ELSE} + getScreenDPI:= 1; +{$ENDIF} +end; + procedure initModule(isNotPreview: boolean); {$IFDEF DEBUGFILE} var logfileBase: shortstring; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uVariables.pas Tue Dec 04 09:15:55 2012 +0400 @@ -21,7 +21,7 @@ unit uVariables; interface -uses SDLh, uTypes, uFloat, GLunit, uConsts, Math, uMobile, uUtils; +uses SDLh, uTypes, uFloat, GLunit, uConsts, Math, uUtils; var /////// init flags /////// @@ -157,7 +157,6 @@ cVampiric : boolean; cArtillery : boolean; WeaponTooltipTex: PTexture; - AmmoMenuTex : PTexture; AmmoMenuInvalidated: boolean; AmmoRect : TSDL_Rect; HHTexture : PTexture; @@ -196,17 +195,10 @@ LuaTemplateNumber : LongWord; - VoiceList : array[0..7] of TVoice = ( - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil), - ( snd: sndNone; voicepack: nil)); LastVoice : TVoice = ( snd: sndNone; voicepack: nil ); + mobileRecord: TMobileRecord; + ///////////////////////////////////// //Buttons {$IFDEF USE_TOUCH_INTERFACE} @@ -690,126 +682,6 @@ (Sprite: sprJuggle; FramesCount: 49; Interval: 38; cmd: '/juggle'; Voice: sndNone; VoiceDelay: 0) ); - Soundz: array[TSound] of record - FileName: string[31]; - Path : TPathType; - end = ( - (FileName: ''; Path: ptNone ),// sndNone - (FileName: 'grenadeimpact.ogg'; Path: ptSounds),// sndGrenadeImpact - (FileName: 'explosion.ogg'; Path: ptSounds),// sndExplosion - (FileName: 'throwpowerup.ogg'; Path: ptSounds),// sndThrowPowerUp - (FileName: 'throwrelease.ogg'; Path: ptSounds),// sndThrowRelease - (FileName: 'splash.ogg'; Path: ptSounds),// sndSplash - (FileName: 'shotgunreload.ogg'; Path: ptSounds),// sndShotgunReload - (FileName: 'shotgunfire.ogg'; Path: ptSounds),// sndShotgunFire - (FileName: 'graveimpact.ogg'; Path: ptSounds),// sndGraveImpact - (FileName: 'mineimpact.ogg'; Path: ptSounds),// sndMineImpact - (FileName: 'minetick.ogg'; Path: ptSounds),// sndMineTicks - (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndMudballImpact - (FileName: 'pickhammer.ogg'; Path: ptSounds),// sndPickhammer - (FileName: 'gun.ogg'; Path: ptSounds),// sndGun - (FileName: 'bee.ogg'; Path: ptSounds),// sndBee - (FileName: 'Jump1.ogg'; Path: ptVoices),// sndJump1 - (FileName: 'Jump2.ogg'; Path: ptVoices),// sndJump2 - (FileName: 'Jump3.ogg'; Path: ptVoices),// sndJump3 - (FileName: 'Yessir.ogg'; Path: ptVoices),// sndYesSir - (FileName: 'Laugh.ogg'; Path: ptVoices),// sndLaugh - (FileName: 'Illgetyou.ogg'; Path: ptVoices),// sndIllGetYou - (FileName: 'JustYouWait.ogg'; Path: ptVoices),// sndJustYouWait - (FileName: 'Incoming.ogg'; Path: ptVoices),// sndIncoming - (FileName: 'Missed.ogg'; Path: ptVoices),// sndMissed - (FileName: 'Stupid.ogg'; Path: ptVoices),// sndStupid - (FileName: 'Firstblood.ogg'; Path: ptVoices),// sndFirstBlood - (FileName: 'Boring.ogg'; Path: ptVoices),// sndBoring - (FileName: 'Byebye.ogg'; Path: ptVoices),// sndByeBye - (FileName: 'Sameteam.ogg'; Path: ptVoices),// sndSameTeam - (FileName: 'Nutter.ogg'; Path: ptVoices),// sndNutter - (FileName: 'Reinforcements.ogg'; Path: ptVoices),// sndReinforce - (FileName: 'Traitor.ogg'; Path: ptVoices),// sndTraitor - (FileName: 'Youllregretthat.ogg'; Path: ptVoices),// sndRegret - (FileName: 'Enemydown.ogg'; Path: ptVoices),// sndEnemyDown - (FileName: 'Coward.ogg'; Path: ptVoices),// sndCoward - (FileName: 'Hurry.ogg'; Path: ptVoices),// sndHurry - (FileName: 'Watchit.ogg'; Path: ptVoices),// sndWatchIt - (FileName: 'Kamikaze.ogg'; Path: ptVoices),// sndKamikaze - (FileName: 'cake2.ogg'; Path: ptSounds),// sndCake - (FileName: 'Ow1.ogg'; Path: ptVoices),// sndOw1 - (FileName: 'Ow2.ogg'; Path: ptVoices),// sndOw2 - (FileName: 'Ow3.ogg'; Path: ptVoices),// sndOw3 - (FileName: 'Ow4.ogg'; Path: ptVoices),// sndOw4 - (FileName: 'Firepunch1.ogg'; Path: ptVoices),// sndFirepunch1 - (FileName: 'Firepunch2.ogg'; Path: ptVoices),// sndFirepunch2 - (FileName: 'Firepunch3.ogg'; Path: ptVoices),// sndFirepunch3 - (FileName: 'Firepunch4.ogg'; Path: ptVoices),// sndFirepunch4 - (FileName: 'Firepunch5.ogg'; Path: ptVoices),// sndFirepunch5 - (FileName: 'Firepunch6.ogg'; Path: ptVoices),// sndFirepunch6 - (FileName: 'Melon.ogg'; Path: ptVoices),// sndMelon - (FileName: 'Hellish.ogg'; Path: ptSounds),// sndHellish - (FileName: 'Yoohoo.ogg'; Path: ptSounds),// sndYoohoo - (FileName: 'rcplane.ogg'; Path: ptSounds),// sndRCPlane - (FileName: 'whipcrack.ogg'; Path: ptSounds),// sndWhipCrack - (FileName:'ride_of_the_valkyries.ogg'; Path: ptSounds),// sndRideOfTheValkyries - (FileName: 'denied.ogg'; Path: ptSounds),// sndDenied - (FileName: 'placed.ogg'; Path: ptSounds),// sndPlaced - (FileName: 'baseballbat.ogg'; Path: ptSounds),// sndBaseballBat - (FileName: 'steam.ogg'; Path: ptSounds),// sndVaporize - (FileName: 'warp.ogg'; Path: ptSounds),// sndWarp - (FileName: 'suddendeath.ogg'; Path: ptSounds),// sndSuddenDeath - (FileName: 'mortar.ogg'; Path: ptSounds),// sndMortar - (FileName: 'shutterclick.ogg'; Path: ptSounds),// sndShutter - (FileName: 'homerun.ogg'; Path: ptSounds),// sndHomerun - (FileName: 'molotov.ogg'; Path: ptSounds),// sndMolotov - (FileName: 'Takecover.ogg'; Path: ptVoices),// sndCover - (FileName: 'Uh-oh.ogg'; Path: ptVoices),// sndUhOh - (FileName: 'Oops.ogg'; Path: ptVoices),// sndOops - (FileName: 'Nooo.ogg'; Path: ptVoices),// sndNooo - (FileName: 'Hello.ogg'; Path: ptVoices),// sndHello - (FileName: 'ropeshot.ogg'; Path: ptSounds),// sndRopeShot - (FileName: 'ropeattach.ogg'; Path: ptSounds),// sndRopeAttach - (FileName: 'roperelease.ogg'; Path: ptSounds),// sndRopeRelease - (FileName: 'switchhog.ogg'; Path: ptSounds),// sndSwitchHog - (FileName: 'Victory.ogg'; Path: ptVoices),// sndVictory - (FileName: 'Flawless.ogg'; Path: ptVoices),// sndFlawless - (FileName: 'sniperreload.ogg'; Path: ptSounds),// sndSniperReload - (FileName: 'steps.ogg'; Path: ptSounds),// sndSteps - (FileName: 'lowgravity.ogg'; Path: ptSounds),// sndLowGravity - (FileName: 'hell_growl.ogg'; Path: ptSounds),// sndHellishImpact1 - (FileName: 'hell_ooff.ogg'; Path: ptSounds),// sndHellishImpact2 - (FileName: 'hell_ow.ogg'; Path: ptSounds),// sndHellishImpact3 - (FileName: 'hell_ugh.ogg'; Path: ptSounds),// sndHellishImpact4 - (FileName: 'melonimpact.ogg'; Path: ptSounds),// sndMelonImpact - (FileName: 'Droplet1.ogg'; Path: ptSounds),// sndDroplet1 - (FileName: 'Droplet2.ogg'; Path: ptSounds),// sndDroplet2 - (FileName: 'Droplet3.ogg'; Path: ptSounds),// sndDroplet3 - (FileName: 'egg.ogg'; Path: ptSounds),// sndEggBreak - (FileName: 'drillgun.ogg'; Path: ptSounds),// sndDrillRocket - (FileName: 'PoisonCough.ogg'; Path: ptVoices),// sndPoisonCough - (FileName: 'PoisonMoan.ogg'; Path: ptVoices),// sndPoisonMoan - (FileName: 'BirdyLay.ogg'; Path: ptSounds),// sndBirdyLay - (FileName: 'Whistle.ogg'; Path: ptSounds),// sndWhistle - (FileName: 'beewater.ogg'; Path: ptSounds),// sndBeeWater - (FileName: '1C.ogg'; Path: ptSounds),// sndPiano0 - (FileName: '2D.ogg'; Path: ptSounds),// sndPiano1 - (FileName: '3E.ogg'; Path: ptSounds),// sndPiano2 - (FileName: '4F.ogg'; Path: ptSounds),// sndPiano3 - (FileName: '5G.ogg'; Path: ptSounds),// sndPiano4 - (FileName: '6A.ogg'; Path: ptSounds),// sndPiano5 - (FileName: '7B.ogg'; Path: ptSounds),// sndPiano6 - (FileName: '8C.ogg'; Path: ptSounds),// sndPiano7 - (FileName: '9D.ogg'; Path: ptSounds),// sndPiano8 - (FileName: 'skip.ogg'; Path: ptSounds),// sndSkip - (FileName: 'sinegun.ogg'; Path: ptSounds),// sndSineGun - (FileName: 'Ooff1.ogg'; Path: ptVoices),// sndOoff1 - (FileName: 'Ooff2.ogg'; Path: ptVoices),// sndOoff2 - (FileName: 'Ooff3.ogg'; Path: ptVoices),// sndOoff3 - (FileName: 'hammer.ogg'; Path: ptSounds),// sndWhack - (FileName: 'Comeonthen.ogg'; Path: ptVoices),// sndComeonthen - (FileName: 'parachute.ogg'; Path: ptSounds),// sndParachute - (FileName: 'bump.ogg'; Path: ptSounds),// sndBump - (FileName: 'hogchant3.ogg'; Path: ptSounds),// sndResurrector - (FileName: 'plane.ogg'; Path: ptSounds),// sndPlane - (FileName: 'TARDIS.ogg'; Path: ptSounds) // sndTardis - ); var Ammoz: array [TAmmoType] of record NameId: TAmmoStrId; @@ -2257,6 +2129,7 @@ ejectY: 0), // Structure +{ (NameId: sidStructure; NameTex: nil; Probability: 0; @@ -2282,6 +2155,7 @@ PosSprite: sprWater; ejectX: 0; ejectY: 0), +} // Land Gun (NameId: sidLandGun; @@ -2359,76 +2233,6 @@ ejectY: 0) ); -const - GearKindAmmoTypeMap : array [TGearType] of TAmmoType = ( -(* gtFlame *) amNothing -(* gtHedgehog *) , amNothing -(* gtMine *) , amMine -(* gtCase *) , amNothing -(* gtExplosives *) , amNothing -(* gtGrenade *) , amGrenade -(* gtShell *) , amBazooka -(* gtGrave *) , amNothing -(* gtBee *) , amBee -(* gtShotgunShot *) , amShotgun -(* gtPickHammer *) , amPickHammer -(* gtRope *) , amRope -(* gtDEagleShot *) , amDEagle -(* gtDynamite *) , amDynamite -(* gtClusterBomb *) , amClusterBomb -(* gtCluster *) , amClusterBomb -(* gtShover *) , amBaseballBat // Shover is only used for baseball bat right now -(* gtFirePunch *) , amFirePunch -(* gtATStartGame *) , amNothing -(* gtATFinishGame *) , amNothing -(* gtParachute *) , amParachute -(* gtAirAttack *) , amAirAttack -(* gtAirBomb *) , amAirAttack -(* gtBlowTorch *) , amBlowTorch -(* gtGirder *) , amGirder -(* gtTeleport *) , amTeleport -(* gtSwitcher *) , amSwitch -(* gtTarget *) , amNothing -(* gtMortar *) , amMortar -(* gtWhip *) , amWhip -(* gtKamikaze *) , amKamikaze -(* gtCake *) , amCake -(* gtSeduction *) , amSeduction -(* gtWatermelon *) , amWatermelon -(* gtMelonPiece *) , amWatermelon -(* gtHellishBomb *) , amHellishBomb -(* gtWaterUp *) , amNothing -(* gtDrill *) , amDrill -(* gtBallGun *) , amBallgun -(* gtBall *) , amBallgun -(* gtRCPlane *) , amRCPlane -(*gtSniperRifleShot *) , amSniperRifle -(* gtJetpack *) , amJetpack -(* gtMolotov *) , amMolotov -(* gtBirdy *) , amBirdy -(* gtEgg *) , amBirdy -(* gtPortal *) , amPortalGun -(* gtPiano *) , amPiano -(* gtGasBomb *) , amGasBomb -(* gtSineGunShot *) , amSineGun -(* gtFlamethrower *) , amFlamethrower -(* gtSMine *) , amSMine -(* gtPoisonCloud *) , amNothing -(* gtHammer *) , amHammer -(* gtHammerHit *) , amHammer -(* gtResurrector *) , amResurrector -(* gtPoisonCloud *) , amNothing -(* gtSnowball *) , amSnowball -(* gtFlake *) , amNothing -(* gtStructure *) , amStructure // TODO - This will undoubtedly change once there is more than one structure -(* gtLandGun *) , amLandGun -(* gtTardis *) , amTardis -(* gtIceGun *) , amIceGun -(* gtAddAmmo *) , amNothing -(* gtGenericFaller *) , amNothing -(* gtKnife *) , amKnife - ); - var Land: TCollisionArray; LandPixels: TLandArray; @@ -2462,7 +2266,6 @@ LocalTeam: LongInt; // last non-bot, non-extdriven clan first team LocalAmmo: LongInt; // last non-bot, non-extdriven clan's first team's ammo index, updated to next upcoming hog for per-hog-ammo CurMinAngle, CurMaxAngle: Longword; - NextClan: boolean; FollowGear: PGear; WindBarWidth: LongInt; @@ -2473,13 +2276,9 @@ WaterColor, DeepWaterColor: TSDL_Color; SkyColor, RQSkyColor, SDSkyColor: TSDL_Color; SkyOffset: LongInt; - HorizontOffset: LongInt; {$IFDEF COUNTTICKS} cntTicks: LongWord; {$ENDIF} - cOffsetY: LongInt; - AFRToggle: Boolean; - bAFRRight: Boolean; PauseTexture, @@ -2488,9 +2287,6 @@ cScaleFactor: GLfloat; SupportNPOTT: Boolean; Step: LongInt; - squaresize : LongInt; - numsquares : LongInt; - ProgrTex: PTexture; MissionIcons: PSDL_Surface; ropeIconTex: PTexture; @@ -2502,24 +2298,12 @@ defaultFrame, depthv: GLuint; texv: GLuint; - VisualGearLayers: array[0..6] of PVisualGear; lastVisualGearByUID: PVisualGear; vobFrameTicks, vobFramesCount, vobCount: Longword; vobVelocity, vobFallSpeed: LongInt; vobSDFrameTicks, vobSDFramesCount, vobSDCount: Longword; vobSDVelocity, vobSDFallSpeed: LongInt; - ControllerNumControllers: Integer; - ControllerEnabled: Integer; - ControllerNumAxes: array[0..5] of Integer; - //ControllerNumBalls: array[0..5] of Integer; - ControllerNumHats: array[0..5] of Integer; - ControllerNumButtons: array[0..5] of Integer; - ControllerAxes: array[0..5] of array[0..19] of Integer; - //ControllerBalls: array[0..5] of array[0..19] of array[0..1] of Integer; - ControllerHats: array[0..5] of array[0..19] of Byte; - ControllerButtons: array[0..5] of array[0..19] of Byte; - DefaultBinds : TBinds; lastTurnChecksum : Longword; @@ -2737,6 +2521,19 @@ cMapName:= ''; LuaTemplateNumber:= 0; + + mobileRecord.getScreenDPI:= @getScreenDPI; //TODO: define external function. + {$IFDEF IPHONEOS} + mobileRecord.PerformRumble:= @AudioServicesPlaySystemSound; + mobileRecord.GameLoading:= @startLoadingIndicator; + mobileRecord.GameLoaded:= @stopLoadingIndicator; + mobileRecord.SaveLoadingEnded:= @saveFinishedSynching; + {$ELSE} + mobileRecord.PerformRumble:= nil; + mobileRecord.GameLoading:= nil; + mobileRecord.GameLoaded:= nil; + mobileRecord.SaveLoadingEnded:= nil; + {$ENDIF} end; procedure freeModule; diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uVisualGears.pas --- a/hedgewars/uVisualGears.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uVisualGears.pas Tue Dec 04 09:15:55 2012 +0400 @@ -53,10 +53,13 @@ procedure KickFlakes(Radius, X, Y: LongInt); implementation -uses uSound, uMobile, uVariables, uTextures, uRender, Math, uRenderUtils, uStore, uUtils; +uses uSound, uVariables, uTextures, uRender, Math, uRenderUtils, uStore, uUtils; -const cExplFrameTicks = 110; +const + cExplFrameTicks = 110; + cSmokeZ = 499; var VGCounter: LongWord; + VisualGearLayers: array[0..6] of PVisualGear; // For better maintainability the step handlers of visual gears are stored // in a separate file. diff -r 6482875b0d97 -r 171da01bd04d hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Fri Nov 30 18:19:52 2012 +0400 +++ b/hedgewars/uWorld.pas Tue Dec 04 09:15:55 2012 +0400 @@ -60,7 +60,6 @@ , uCaptions , uCursor , uCommands - , uMobile {$IFDEF USE_VIDEO_RECORDING} , uVideoRec {$ENDIF} @@ -84,6 +83,10 @@ isFirstFrame: boolean; AMAnimType: LongInt; recTexture: PTexture; + AmmoMenuTex : PTexture; + HorizontOffset: LongInt; + cOffsetY: LongInt; + AFRToggle: Boolean; const cStereo_Sky = 0.0500; cStereo_Horizon = 0.0250; @@ -93,6 +96,28 @@ cStereo_Water_near = 0.0025; cStereo_Outside = -0.0400; + AMAnimDuration = 200; + AMHidden = 0;//AMState values + AMShowingUp = 1; + AMShowing = 2; + AMHiding = 3; + + AMTypeMaskX = $00000001; + AMTypeMaskY = $00000002; + AMTypeMaskAlpha = $00000004; + AMTypeMaskSlide = $00000008; + +{$IFDEF MOBILE} + AMSlotSize = 48; + AMTITLE = 30; +{$ELSE} + AMSlotSize = 32; +{$ENDIF} + AMSlotPadding = (AMSlotSize - 32) shr 1; + + cSendCursorPosTime = 50; + cCursorEdgesDist = 100; + // helper functions to create the goal/game mode string function AddGoal(s: ansistring; gf: longword; si: TGoalStrId; i: LongInt): ansistring; var t: ansistring; @@ -220,7 +245,7 @@ {$IFDEF USE_TOUCH_INTERFACE} //positioning of the buttons -buttonScale:= uMobile.getScreenDPI/cDefaultZoomLevel; +buttonScale:= mobileRecord.getScreenDPI()/cDefaultZoomLevel; with JumpWidget do @@ -961,7 +986,7 @@ glClear(GL_COLOR_BUFFER_BIT); DrawWorldStereo(Lag, rmDefault) end -{$IFNDEF S3D_DISABLED} +{$IFDEF USE_S3D_RENDERING} else if (cStereoMode = smAFR) then begin AFRToggle:= not AFRToggle; @@ -1074,7 +1099,7 @@ procedure ChangeDepth(rm: TRenderMode; d: GLfloat); begin -{$IFDEF S3D_DISABLED} +{$IFNDEF USE_S3D_RENDERING} rm:= rm; d:= d; // avoid hint exit; {$ELSE} @@ -1092,7 +1117,7 @@ procedure ResetDepth(rm: TRenderMode); begin -{$IFDEF S3D_DISABLED} +{$IFNDEF USE_S3D_RENDERING} rm:= rm; // avoid hint exit; {$ELSE} diff -r 6482875b0d97 -r 171da01bd04d misc/libopenalbridge/CMakeLists.txt --- a/misc/libopenalbridge/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/misc/libopenalbridge/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -30,7 +30,7 @@ if(WIN32) if(MSVC) - SET_TARGET_PROPERTIES(openalbridge PROPERTIES LINK_FLAGS /DEF:openalbridge.def) + set_target_properties(openalbridge PROPERTIES LINK_FLAGS /DEF:openalbridge.def) endif(MSVC) #install it in the executable directory install(TARGETS openalbridge DESTINATION bin) diff -r 6482875b0d97 -r 171da01bd04d misc/physfs/CMakeLists.txt --- a/misc/physfs/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/misc/physfs/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -6,59 +6,59 @@ #lines overridden by Hedgewars configuration #CMAKE_MINIMUM_REQUIRED(VERSION 2.4) #PROJECT(PhysicsFS) -SET(PHYSFS_VERSION 2.1.0) +set(PHYSFS_VERSION 2.1.0) # Increment this if/when we break backwards compatibility. -SET(PHYSFS_SOVERSION 1) +set(PHYSFS_SOVERSION 1) # I hate that they define "WIN32" ... we're about to move to Win64...I hope! -IF(WIN32 AND NOT WINDOWS) - SET(WINDOWS TRUE) -ENDIF(WIN32 AND NOT WINDOWS) +if(WIN32 AND NOT WINDOWS) + set(WINDOWS true) +endif(WIN32 AND NOT WINDOWS) # Bleh, let's do it for "APPLE" too. -IF(APPLE AND NOT MACOSX) - SET(MACOSX TRUE) -ENDIF(APPLE AND NOT MACOSX) +if(APPLE AND NOT MACOSX) + set(MACOSX true) +endif(APPLE AND NOT MACOSX) # For now, Haiku and BeOS are the same, as far as the build system cares. -IF(HAIKU AND NOT BEOS) - SET(BEOS TRUE) -ENDIF(HAIKU AND NOT BEOS) +if(HAIKU AND NOT BEOS) + set(BEOS true) +endif(HAIKU AND NOT BEOS) -IF(CMAKE_SYSTEM_NAME STREQUAL "SunOS") - SET(SOLARIS TRUE) -ENDIF(CMAKE_SYSTEM_NAME STREQUAL "SunOS") +if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") + set(SOLARIS true) +endif(CMAKE_SYSTEM_NAME STREQUAL "SunOS") -INCLUDE(CheckIncludeFile) -INCLUDE(CheckLibraryExists) -INCLUDE(CheckCSourceCompiles) +include(CheckIncludeFile) +include(CheckLibraryExists) +include(CheckCSourceCompiles) include_directories(${CMAKE_CURRENT_SOURCE_DIR}/src) include_directories(${SDL_INCLUDE_DIR}) #hw include_directories(${LUA_INCLUDE_DIR}) #hw -IF(MACOSX) +if(MACOSX) # Fallback to older OS X on PowerPC to support wider range of systems... - IF(CMAKE_OSX_ARCHITECTURES MATCHES ppc) - ADD_DEFINITIONS(-DMAC_OS_X_VERSION_MIN_REQUIRED=1020) - SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} " -mmacosx-version-min=10.2") - ENDIF(CMAKE_OSX_ARCHITECTURES MATCHES ppc) + if(CMAKE_OSX_ARCHITECTURES MATCHES ppc) + add_definitions(-DMAC_OS_X_VERSION_MIN_REQUIRED=1020) + set(OTHER_LDFLAGS ${OTHER_LDFLAGS} " -mmacosx-version-min=10.2") + endif(CMAKE_OSX_ARCHITECTURES MATCHES ppc) # Need these everywhere... - ADD_DEFINITIONS(-fno-common) - SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework IOKit") -ENDIF(MACOSX) + add_definitions(-fno-common) + set(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework IOKit") +endif(MACOSX) # Add some gcc-specific command lines. -IF(CMAKE_COMPILER_IS_GNUCC) +if(CMAKE_COMPILER_IS_GNUCC) # Always build with debug symbols...you can strip it later. - ADD_DEFINITIONS(-g -pipe -Werror -fsigned-char) + add_definitions(-g -pipe -Werror -fsigned-char) # Stupid BeOS generates warnings in the system headers. - IF(NOT BEOS) - ADD_DEFINITIONS(-Wall) - ENDIF(NOT BEOS) + if(NOT BEOS) + add_definitions(-Wall) + endif(NOT BEOS) CHECK_C_SOURCE_COMPILES(" #if ((defined(__GNUC__)) && (__GNUC__ >= 4)) @@ -68,31 +68,31 @@ #endif " PHYSFS_IS_GCC4) - IF(PHYSFS_IS_GCC4) + if(PHYSFS_IS_GCC4) # Not supported on several operating systems at this time. - IF(NOT SOLARIS AND NOT WINDOWS) - ADD_DEFINITIONS(-fvisibility=hidden) - ENDIF(NOT SOLARIS AND NOT WINDOWS) - ENDIF(PHYSFS_IS_GCC4) + if(NOT SOLARIS AND NOT WINDOWS) + add_definitions(-fvisibility=hidden) + endif(NOT SOLARIS AND NOT WINDOWS) + endif(PHYSFS_IS_GCC4) # Don't use -rpath. - SET(CMAKE_SKIP_RPATH ON CACHE BOOL "Skip RPATH" FORCE) -ENDIF(CMAKE_COMPILER_IS_GNUCC) + set(CMAKE_SKIP_RPATH ON CACHE BOOL "Skip RPATH" FORCE) +endif(CMAKE_COMPILER_IS_GNUCC) -IF(CMAKE_C_COMPILER_ID STREQUAL "SunPro") - ADD_DEFINITIONS(-erroff=E_EMPTY_TRANSLATION_UNIT) - ADD_DEFINITIONS(-xldscope=hidden) -ENDIF(CMAKE_C_COMPILER_ID STREQUAL "SunPro") +if(CMAKE_C_COMPILER_ID STREQUAL "SunPro") + add_definitions(-erroff=E_EMPTY_TRANSLATION_UNIT) + add_definitions(-xldscope=hidden) +endif(CMAKE_C_COMPILER_ID STREQUAL "SunPro") -IF(MSVC) +if(MSVC) # VS.NET 8.0 got really really anal about strcpy, etc, which even if we # cleaned up our code, zlib, etc still use...so disable the warning. - ADD_DEFINITIONS(-D_CRT_SECURE_NO_WARNINGS=1) -ENDIF(MSVC) + add_definitions(-D_CRT_SECURE_NO_WARNINGS=1) +endif(MSVC) # Basic chunks of source code ... -SET(LZMA_SRCS +set(LZMA_SRCS src/lzma/C/7zCrc.c src/lzma/C/Archive/7z/7zBuffer.c src/lzma/C/Archive/7z/7zDecode.c @@ -106,20 +106,20 @@ src/lzma/C/Compress/Lzma/LzmaDecode.c ) -IF(BEOS) +if(BEOS) # We add this explicitly, since we don't want CMake to think this # is a C++ project unless we're on BeOS. - SET(PHYSFS_BEOS_SRCS src/platform_beos.cpp) - FIND_LIBRARY(BE_LIBRARY be) - FIND_LIBRARY(ROOT_LIBRARY root) - SET(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${BE_LIBRARY} ${ROOT_LIBRARY}) -ENDIF(BEOS) + set(PHYSFS_BEOS_SRCS src/platform_beos.cpp) + find_library(BE_LIBRARY be) + find_library(ROOT_LIBRARY root) + set(OPTIONAL_LIBRARY_LIBS ${OPTIONAL_LIBRARY_LIBS} ${BE_LIBRARY} ${ROOT_LIBRARY}) +endif(BEOS) # Almost everything is "compiled" here, but things that don't apply to the # build are #ifdef'd out. This is to make it easy to embed PhysicsFS into # another project or bring up a new build system: just compile all the source # code and #define the things you want. -SET(PHYSFS_SRCS +set(PHYSFS_SRCS src/physfs.c src/physfs_byteorder.c src/physfs_unicode.c @@ -148,23 +148,23 @@ # platform layers ... -IF(UNIX) - IF(BEOS) - SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE) - SET(PHYSFS_HAVE_THREAD_SUPPORT TRUE) - SET(HAVE_PTHREAD_H TRUE) - ELSE(BEOS) +if(UNIX) + if(BEOS) + set(PHYSFS_HAVE_CDROM_SUPPORT true) + set(PHYSFS_HAVE_THREAD_SUPPORT true) + set(HAVE_PTHREAD_H true) + else(BEOS) CHECK_INCLUDE_FILE(sys/ucred.h HAVE_UCRED_H) - IF(HAVE_UCRED_H) - ADD_DEFINITIONS(-DPHYSFS_HAVE_SYS_UCRED_H=1) - SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE) - ENDIF(HAVE_UCRED_H) + if(HAVE_UCRED_H) + add_definitions(-DPHYSFS_HAVE_SYS_UCRED_H=1) + set(PHYSFS_HAVE_CDROM_SUPPORT false) + endif(HAVE_UCRED_H) CHECK_INCLUDE_FILE(mntent.h HAVE_MNTENT_H) - IF(HAVE_MNTENT_H) - ADD_DEFINITIONS(-DPHYSFS_HAVE_MNTENT_H=1) - SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE) - ENDIF(HAVE_MNTENT_H) + if(HAVE_MNTENT_H) + add_definitions(-DPHYSFS_HAVE_MNTENT_H=1) + set(PHYSFS_HAVE_CDROM_SUPPORT false) + endif(HAVE_MNTENT_H) # !!! FIXME: Solaris fails this, because mnttab.h implicitly # !!! FIXME: depends on other system headers. :( @@ -175,150 +175,150 @@ int main(int argc, char **argv) { return 0; } " HAVE_SYS_MNTTAB_H) - IF(HAVE_SYS_MNTTAB_H) - ADD_DEFINITIONS(-DPHYSFS_HAVE_SYS_MNTTAB_H=1) - SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE) - ENDIF(HAVE_SYS_MNTTAB_H) + if(HAVE_SYS_MNTTAB_H) + add_definitions(-DPHYSFS_HAVE_SYS_MNTTAB_H=1) + set(PHYSFS_HAVE_CDROM_SUPPORT false) + endif(HAVE_SYS_MNTTAB_H) CHECK_INCLUDE_FILE(pthread.h HAVE_PTHREAD_H) - IF(HAVE_PTHREAD_H) - SET(PHYSFS_HAVE_THREAD_SUPPORT TRUE) - ENDIF(HAVE_PTHREAD_H) - ENDIF(BEOS) -ENDIF(UNIX) + if(HAVE_PTHREAD_H) + set(PHYSFS_HAVE_THREAD_SUPPORT false) + endif(HAVE_PTHREAD_H) + endif(BEOS) +endif(UNIX) -IF(WINDOWS) - SET(PHYSFS_HAVE_CDROM_SUPPORT TRUE) - SET(PHYSFS_HAVE_THREAD_SUPPORT TRUE) -ENDIF(WINDOWS) +if(WINDOWS) + set(PHYSFS_HAVE_CDROM_SUPPORT true) + set(PHYSFS_HAVE_THREAD_SUPPORT true) +endif(WINDOWS) -IF(NOT PHYSFS_HAVE_CDROM_SUPPORT) - ADD_DEFINITIONS(-DPHYSFS_NO_CDROM_SUPPORT=1) - MESSAGE(WARNING " ***") - MESSAGE(WARNING " *** There is no CD-ROM support in this build!") - MESSAGE(WARNING " *** PhysicsFS will just pretend there are no discs.") - MESSAGE(WARNING " *** This may be fine, depending on how PhysicsFS is used,") - MESSAGE(WARNING " *** but is this what you REALLY wanted?") - MESSAGE(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)") - MESSAGE(WARNING " ***") -ENDIF(NOT PHYSFS_HAVE_CDROM_SUPPORT) +if(NOT PHYSFS_HAVE_CDROM_SUPPORT) + add_definitions(-DPHYSFS_NO_CDROM_SUPPORT=1) + message(WARNING " ***") + message(WARNING " *** There is no CD-ROM support in this build!") + message(WARNING " *** PhysicsFS will just pretend there are no discs.") + message(WARNING " *** This may be fine, depending on how PhysicsFS is used,") + message(WARNING " *** but is this what you REALLY wanted?") + message(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)") + message(WARNING " ***") +endif(NOT PHYSFS_HAVE_CDROM_SUPPORT) -IF(PHYSFS_HAVE_THREAD_SUPPORT) - ADD_DEFINITIONS(-D_REENTRANT -D_THREAD_SAFE) -ELSE(PHYSFS_HAVE_THREAD_SUPPORT) - ADD_DEFINITIONS(-DPHYSFS_NO_THREAD_SUPPORT=1) - MESSAGE(WARNING " ***") - MESSAGE(WARNING " *** There is no thread support in this build!") - MESSAGE(WARNING " *** PhysicsFS will NOT be reentrant!") - MESSAGE(WARNING " *** This may be fine, depending on how PhysicsFS is used,") - MESSAGE(WARNING " *** but is this what you REALLY wanted?") - MESSAGE(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)") - MESSAGE(WARNING " ***") -ENDIF(PHYSFS_HAVE_THREAD_SUPPORT) +if(PHYSFS_HAVE_THREAD_SUPPORT) + add_definitions(-D_REENTRANT -D_THREAD_SAFE) +else(PHYSFS_HAVE_THREAD_SUPPORT) + add_definitions(-DPHYSFS_NO_THREAD_SUPPORT=1) + message(WARNING " ***") + message(WARNING " *** There is no thread support in this build!") + message(WARNING " *** PhysicsFS will NOT be reentrant!") + message(WARNING " *** This may be fine, depending on how PhysicsFS is used,") + message(WARNING " *** but is this what you REALLY wanted?") + message(WARNING " *** (Maybe fix CMakeLists.txt, or write a platform driver?)") + message(WARNING " ***") +endif(PHYSFS_HAVE_THREAD_SUPPORT) # Archivers ... -OPTION(PHYSFS_ARCHIVE_ZIP "Enable ZIP support" TRUE) -IF(PHYSFS_ARCHIVE_ZIP) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_ZIP=1) -ENDIF(PHYSFS_ARCHIVE_ZIP) +option(PHYSFS_ARCHIVE_ZIP "Enable ZIP support" true) +if(PHYSFS_ARCHIVE_ZIP) + add_definitions(-DPHYSFS_SUPPORTS_ZIP=1) +endif(PHYSFS_ARCHIVE_ZIP) -OPTION(PHYSFS_ARCHIVE_7Z "Enable 7zip support" FALSE) -IF(PHYSFS_ARCHIVE_7Z) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_7Z=1) +option(PHYSFS_ARCHIVE_7Z "Enable 7zip support" false) +if(PHYSFS_ARCHIVE_7Z) + add_definitions(-DPHYSFS_SUPPORTS_7Z=1) # !!! FIXME: rename to 7z.c? - SET(PHYSFS_SRCS ${PHYSFS_SRCS} ${LZMA_SRCS}) -ENDIF(PHYSFS_ARCHIVE_7Z) + set(PHYSFS_SRCS ${PHYSFS_SRCS} ${LZMA_SRCS}) +endif(PHYSFS_ARCHIVE_7Z) -OPTION(PHYSFS_ARCHIVE_GRP "Enable Build Engine GRP support" TRUE) -IF(PHYSFS_ARCHIVE_GRP) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_GRP=1) -ENDIF(PHYSFS_ARCHIVE_GRP) +option(PHYSFS_ARCHIVE_GRP "Enable Build Engine GRP support" true) +if(PHYSFS_ARCHIVE_GRP) + add_definitions(-DPHYSFS_SUPPORTS_GRP=1) +endif(PHYSFS_ARCHIVE_GRP) -OPTION(PHYSFS_ARCHIVE_WAD "Enable Doom WAD support" TRUE) -IF(PHYSFS_ARCHIVE_WAD) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_WAD=1) -ENDIF(PHYSFS_ARCHIVE_WAD) +option(PHYSFS_ARCHIVE_WAD "Enable Doom WAD support" true) +if(PHYSFS_ARCHIVE_WAD) + add_definitions(-DPHYSFS_SUPPORTS_WAD=1) +endif(PHYSFS_ARCHIVE_WAD) -OPTION(PHYSFS_ARCHIVE_HOG "Enable Descent I/II HOG support" TRUE) -IF(PHYSFS_ARCHIVE_HOG) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_HOG=1) -ENDIF(PHYSFS_ARCHIVE_HOG) +option(PHYSFS_ARCHIVE_HOG "Enable Descent I/II HOG support" true) +if(PHYSFS_ARCHIVE_HOG) + add_definitions(-DPHYSFS_SUPPORTS_HOG=1) +endif(PHYSFS_ARCHIVE_HOG) -OPTION(PHYSFS_ARCHIVE_MVL "Enable Descent I/II MVL support" TRUE) -IF(PHYSFS_ARCHIVE_MVL) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_MVL=1) -ENDIF(PHYSFS_ARCHIVE_MVL) +option(PHYSFS_ARCHIVE_MVL "Enable Descent I/II MVL support" true) +if(PHYSFS_ARCHIVE_MVL) + add_definitions(-DPHYSFS_SUPPORTS_MVL=1) +endif(PHYSFS_ARCHIVE_MVL) -OPTION(PHYSFS_ARCHIVE_QPAK "Enable Quake I/II QPAK support" TRUE) -IF(PHYSFS_ARCHIVE_QPAK) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_QPAK=1) -ENDIF(PHYSFS_ARCHIVE_QPAK) +option(PHYSFS_ARCHIVE_QPAK "Enable Quake I/II QPAK support" true) +if(PHYSFS_ARCHIVE_QPAK) + add_definitions(-DPHYSFS_SUPPORTS_QPAK=1) +endif(PHYSFS_ARCHIVE_QPAK) -OPTION(PHYSFS_ARCHIVE_ISO9660 "Enable ISO9660 support" TRUE) -IF(PHYSFS_ARCHIVE_ISO9660) - ADD_DEFINITIONS(-DPHYSFS_SUPPORTS_ISO9660=1) -ENDIF(PHYSFS_ARCHIVE_ISO9660) +option(PHYSFS_ARCHIVE_ISO9660 "Enable ISO9660 support" true) +if(PHYSFS_ARCHIVE_ISO9660) + add_definitions(-DPHYSFS_SUPPORTS_ISO9660=1) +endif(PHYSFS_ARCHIVE_ISO9660) #as needed by Hedgewars configuration -IF(WINDOWS) - OPTION(PHYSFS_BUILD_STATIC "Build static library" FALSE) - OPTION(PHYSFS_BUILD_SHARED "Build shared library" TRUE) - SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} ${SDL_LIBRARY}) -ELSE(WINDOWS) - OPTION(PHYSFS_BUILD_STATIC "Build static library" TRUE) - OPTION(PHYSFS_BUILD_SHARED "Build shared library" FALSE) -ENDIF(WINDOWS) +if(WINDOWS) + option(PHYSFS_BUILD_STATIC "Build static library" false) + option(PHYSFS_BUILD_SHARED "Build shared library" true) + set(OTHER_LDFLAGS ${OTHER_LDFLAGS} ${SDL_LIBRARY}) +else(WINDOWS) + option(PHYSFS_BUILD_STATIC "Build static library" true) + option(PHYSFS_BUILD_SHARED "Build shared library" false) +endif(WINDOWS) -IF(PHYSFS_BUILD_STATIC) - ADD_LIBRARY(physfs STATIC ${PHYSFS_SRCS}) - SET_TARGET_PROPERTIES(physfs PROPERTIES OUTPUT_NAME "physfs") - SET(PHYSFS_LIB_TARGET physfs) - SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs") -ENDIF(PHYSFS_BUILD_STATIC) +if(PHYSFS_BUILD_STATIC) + add_library(physfs STATIC ${PHYSFS_SRCS}) + set_target_properties(physfs PROPERTIES OUTPUT_NAME "physfs") + set(PHYSFS_LIB_TARGET physfs) + set(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs") +endif(PHYSFS_BUILD_STATIC) -IF(PHYSFS_BUILD_SHARED) +if(PHYSFS_BUILD_SHARED) find_package(SDL REQUIRED) - ADD_LIBRARY(physfs SHARED ${PHYSFS_SRCS}) - SET_TARGET_PROPERTIES(physfs PROPERTIES VERSION ${PHYSFS_VERSION}) - SET_TARGET_PROPERTIES(physfs PROPERTIES SOVERSION ${PHYSFS_SOVERSION}) - TARGET_LINK_LIBRARIES(physfs ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS}) - SET(PHYSFS_LIB_TARGET physfs) - SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs") - INSTALL(TARGETS ${PHYSFS_INSTALL_TARGETS} + add_library(physfs SHARED ${PHYSFS_SRCS}) + set_target_properties(physfs PROPERTIES VERSION ${PHYSFS_VERSION}) + set_target_properties(physfs PROPERTIES SOVERSION ${PHYSFS_SOVERSION}) + target_link_libraries(physfs ${OPTIONAL_LIBRARY_LIBS} ${OTHER_LDFLAGS}) + set(PHYSFS_LIB_TARGET physfs) + set(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";physfs") + install(TARGETS ${PHYSFS_INSTALL_TARGETS} RUNTIME DESTINATION bin) -ENDIF(PHYSFS_BUILD_SHARED) +endif(PHYSFS_BUILD_SHARED) -IF(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC) - MESSAGE(FATAL "Both shared and static libraries are disabled!") -ENDIF(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC) +if(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC) + message(FATAL "Both shared and static libraries are disabled!") +endif(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC) # CMake FAQ says I need this... -IF(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC) - SET_TARGET_PROPERTIES(physfs PROPERTIES CLEAN_DIRECT_OUTPUT 1) -ENDIF(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC) +if(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC) + set_target_properties(physfs PROPERTIES CLEAN_DIRECT_OUTPUT 1) +endif(PHYSFS_BUILD_SHARED AND PHYSFS_BUILD_STATIC) -OPTION(PHYSFS_BUILD_TEST "Build stdio test program." FALSE) -MARK_AS_ADVANCED(PHYSFS_BUILD_TEST) -IF(PHYSFS_BUILD_TEST) - FIND_PATH(READLINE_H readline/readline.h) - FIND_PATH(HISTORY_H readline/history.h) - IF(READLINE_H AND HISTORY_H) - FIND_LIBRARY(CURSES_LIBRARY NAMES curses ncurses) - SET(CMAKE_REQUIRED_LIBRARIES ${CURSES_LIBRARY}) - FIND_LIBRARY(READLINE_LIBRARY readline) - IF(READLINE_LIBRARY) - SET(HAVE_SYSTEM_READLINE TRUE) - SET(TEST_PHYSFS_LIBS ${TEST_PHYSFS_LIBS} ${READLINE_LIBRARY} ${CURSES_LIBRARY}) - INCLUDE_DIRECTORIES(${READLINE_H} ${HISTORY_H}) - ADD_DEFINITIONS(-DPHYSFS_HAVE_READLINE=1) - ENDIF(READLINE_LIBRARY) - ENDIF(READLINE_H AND HISTORY_H) - ADD_EXECUTABLE(test_physfs test/test_physfs.c) - TARGET_LINK_LIBRARIES(test_physfs ${PHYSFS_LIB_TARGET} ${TEST_PHYSFS_LIBS} ${OTHER_LDFLAGS}) - SET(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";test_physfs") -ENDIF(PHYSFS_BUILD_TEST) +option(PHYSFS_BUILD_TEST "Build stdio test program." false) +mark_as_advanced(PHYSFS_BUILD_TEST) +if(PHYSFS_BUILD_TEST) + find_path(READLINE_H readline/readline.h) + find_path(HISTORY_H readline/history.h) + if(READLINE_H AND HISTORY_H) + find_library(CURSES_LIBRARY NAMES curses ncurses) + set(CMAKE_REQUIRED_LIBRARIES ${CURSES_LIBRARY}) + find_library(READLINE_LIBRARY readline) + if(READLINE_LIBRARY) + set(HAVE_SYSTEM_READLINE true) + set(TEST_PHYSFS_LIBS ${TEST_PHYSFS_LIBS} ${READLINE_LIBRARY} ${CURSES_LIBRARY}) + include_directories(${READLINE_H} ${HISTORY_H}) + add_definitions(-DPHYSFS_HAVE_READLINE=1) + endif(READLINE_LIBRARY) + endif(READLINE_H AND HISTORY_H) + add_executable(test_physfs test/test_physfs.c) + target_link_libraries(test_physfs ${PHYSFS_LIB_TARGET} ${TEST_PHYSFS_LIBS} ${OTHER_LDFLAGS}) + set(PHYSFS_INSTALL_TARGETS ${PHYSFS_INSTALL_TARGETS} ";test_physfs") +endif(PHYSFS_BUILD_TEST) # Scripting language bindings... @@ -326,38 +326,38 @@ #CMake's SWIG support is basically useless. #FIND_PACKAGE(SWIG) -OPTION(PHYSFS_BUILD_SWIG "Build ${_LANG} bindings." FALSE) -MARK_AS_ADVANCED(PHYSFS_BUILD_SWIG) +option(PHYSFS_BUILD_SWIG "Build ${_LANG} bindings." false) +mark_as_advanced(PHYSFS_BUILD_SWIG) -FIND_PROGRAM(SWIG swig DOC "Path to swig command line app: http://swig.org/") -IF(NOT SWIG) - MESSAGE(STATUS "SWIG not found. You won't be able to build scripting language bindings.") -ELSE(NOT SWIG) - MARK_AS_ADVANCED(SWIG) - IF(DEFINED CMAKE_BUILD_TYPE) - IF((NOT CMAKE_BUILD_TYPE STREQUAL "") AND (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")) - IF(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") - SET(SWIG_OPT_CFLAGS "-small") - ELSE(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") - SET(SWIG_OPT_CFLAGS "-O") - ENDIF(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") - ENDIF((NOT CMAKE_BUILD_TYPE STREQUAL "") AND (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")) - ENDIF(DEFINED CMAKE_BUILD_TYPE) +find_program(SWIG swig DOC "Path to swig command line app: http://swig.org/") +if(NOT SWIG) + message(STATUS "SWIG not found. You won't be able to build scripting language bindings.") +else(NOT SWIG) + mark_as_advanced(SWIG) + if(DEFINED CMAKE_BUILD_TYPE) + if((NOT CMAKE_BUILD_TYPE STREQUAL "") AND (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")) + if(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") + set(SWIG_OPT_CFLAGS "-small") + else(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") + set(SWIG_OPT_CFLAGS "-O") + endif(CMAKE_BUILD_TYPE STREQUAL "MinSizeRel") + endif((NOT CMAKE_BUILD_TYPE STREQUAL "") AND (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")) + endif(DEFINED CMAKE_BUILD_TYPE) - SET(SWIG_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/physfs-swig-bindings") + set(SWIG_OUTPUT_DIR "${CMAKE_CURRENT_BINARY_DIR}/physfs-swig-bindings") - MACRO(CONFIGURE_SWIG_BINDING _LANG _INSTALLPATH _EXTRAOUTPUTS _EXTRACFLAGS _EXTRALDFLAGS) - STRING(TOUPPER "${_LANG}" _UPPERLANG) - STRING(TOLOWER "${_LANG}" _LOWERLANG) - SET(_TARGET "physfs-${_LOWERLANG}") - SET(_TARGETDIR "${SWIG_OUTPUT_DIR}/${_LOWERLANG}") + macro(CONFIGURE_SWIG_BINDING _LANG _INSTALLPATH _EXTRAOUTPUTS _EXTRACFLAGS _EXTRALDFLAGS) + string(TOUPPER "${_LANG}" _UPPERLANG) + string(TOLOWER "${_LANG}" _LOWERLANG) + set(_TARGET "physfs-${_LOWERLANG}") + set(_TARGETDIR "${SWIG_OUTPUT_DIR}/${_LOWERLANG}") - IF(NOT EXISTS "${_TARGETDIR}") - FILE(MAKE_DIRECTORY "${_TARGETDIR}") - ENDIF(NOT EXISTS "${_TARGETDIR}") + if(NOT EXISTS "${_TARGETDIR}") + file(MAKE_DIRECTORY "${_TARGETDIR}") + endif(NOT EXISTS "${_TARGETDIR}") - IF(PHYSFS_BUILD_${_UPPERLANG}) - ADD_CUSTOM_COMMAND( + if(PHYSFS_BUILD_${_UPPERLANG}) + add_custom_command( OUTPUT "${_TARGETDIR}/${_TARGET}.c" ${_EXTRAOUTPUTS} MAIN_DEPENDENCY "${CMAKE_CURRENT_SOURCE_DIR}/extras/physfs-swig.i" COMMAND "${SWIG}" @@ -365,66 +365,66 @@ COMMENT "Generating ${_LANG} bindings..." ) - ADD_LIBRARY(${_TARGET} SHARED "${_TARGETDIR}/${_TARGET}.c") - TARGET_LINK_LIBRARIES(${_TARGET} ${PHYSFS_LIB_TARGET}) - SET_TARGET_PROPERTIES(${_TARGET} PROPERTIES + add_library(${_TARGET} SHARED "${_TARGETDIR}/${_TARGET}.c") + target_link_libraries(${_TARGET} ${PHYSFS_LIB_TARGET}) + set_target_properties(${_TARGET} PROPERTIES COMPILE_FLAGS "${_EXTRACFLAGS}" LINK_FLAGS "${_EXTRALDFLAGS}" LIBRARY_OUTPUT_NAME "physfs" LIBRARY_OUTPUT_DIRECTORY "${_TARGETDIR}" CLEAN_DIRECT_OUTPUT 1 ) - INSTALL(TARGETS ${_TARGET} LIBRARY DESTINATION "${_INSTALLPATH}") - MESSAGE(STATUS "${_LANG} bindings configured!") - ELSE(PHYSFS_BUILD_${_UPPERLANG}) - MESSAGE(STATUS "Couldn't figure out ${_LANG} configuration. Skipping ${_LANG} bindings.") - ENDIF(PHYSFS_BUILD_${_UPPERLANG}) - ENDMACRO(CONFIGURE_SWIG_BINDING) + install(TARGETS ${_TARGET} LIBRARY DESTINATION "${_INSTALLPATH}") + message(STATUS "${_LANG} bindings configured!") + else(PHYSFS_BUILD_${_UPPERLANG}) + message(STATUS "Couldn't figure out ${_LANG} configuration. Skipping ${_LANG} bindings.") + endif(PHYSFS_BUILD_${_UPPERLANG}) + endmacro(CONFIGURE_SWIG_BINDING) - MACRO(ADD_SCRIPT_BINDING_OPTION _VAR _LANG _DEFVAL) - SET(BUILDSWIGVAL ${_DEFVAL}) - IF(NOT PHYSFS_BUILD_SWIG) - SET(BUILDSWIGVAL FALSE) - ENDIF(NOT PHYSFS_BUILD_SWIG) - OPTION(${_VAR} "Build ${_LANG} bindings." ${BUILDSWIGVAL}) - MARK_AS_ADVANCED(${_VAR}) - ENDMACRO(ADD_SCRIPT_BINDING_OPTION) + macro(ADD_SCRIPT_BINDING_OPTION _VAR _LANG _DEFVAL) + set(BUILDSWIGVAL ${_DEFVAL}) + if(NOT PHYSFS_BUILD_SWIG) + set(BUILDSWIGVAL false) + endif(NOT PHYSFS_BUILD_SWIG) + option(${_VAR} "Build ${_LANG} bindings." ${BUILDSWIGVAL}) + mark_as_advanced(${_VAR}) + endmacro(ADD_SCRIPT_BINDING_OPTION) - ADD_SCRIPT_BINDING_OPTION(PHYSFS_BUILD_PERL "Perl" TRUE) - ADD_SCRIPT_BINDING_OPTION(PHYSFS_BUILD_RUBY "Ruby" TRUE) -ENDIF(NOT SWIG) + ADD_SCRIPT_BINDING_OPTION(PHYSFS_BUILD_PERL "Perl" true) + ADD_SCRIPT_BINDING_OPTION(PHYSFS_BUILD_RUBY "Ruby" true) +endif(NOT SWIG) -IF(PHYSFS_BUILD_PERL) - MESSAGE(STATUS "Configuring Perl bindings...") - FIND_PROGRAM(PERL perl DOC "Path to perl command line app: http://perl.org/") - IF(NOT PERL) - MESSAGE(STATUS "Perl not found. You won't be able to build perl bindings.") - SET(PHYSFS_BUILD_PERL FALSE) - ENDIF(NOT PERL) - MARK_AS_ADVANCED(PERL) +if(PHYSFS_BUILD_PERL) + message(STATUS "Configuring Perl bindings...") + find_program(PERL perl DOC "Path to perl command line app: http://perl.org/") + if(NOT PERL) + message(STATUS "Perl not found. You won't be able to build perl bindings.") + set(PHYSFS_BUILD_PERL false) + endif(NOT PERL) + mark_as_advanced(PERL) - MACRO(GET_PERL_CONFIG _KEY _VALUE) - IF(PHYSFS_BUILD_PERL) - MESSAGE(STATUS "Figuring out perl config value '${_KEY}' ...") - EXECUTE_PROCESS( + macro(GET_PERL_CONFIG _KEY _VALUE) + if(PHYSFS_BUILD_PERL) + message(STATUS "Figuring out perl config value '${_KEY}' ...") + execute_process( COMMAND ${PERL} -w -e "use Config; print \$Config{${_KEY}};" RESULT_VARIABLE GET_PERL_CONFIG_RC OUTPUT_VARIABLE ${_VALUE} ) - IF(NOT GET_PERL_CONFIG_RC EQUAL 0) - MESSAGE(STATUS "Perl executable ('${PERL}') reported failure: ${GET_PERL_CONFIG_RC}") - SET(PHYSFS_BUILD_PERL FALSE) - ENDIF(NOT GET_PERL_CONFIG_RC EQUAL 0) - IF(NOT ${_VALUE}) - MESSAGE(STATUS "Perl executable ('${PERL}') didn't have a value for '${_KEY}'") - SET(PHYSFS_BUILD_PERL FALSE) - ENDIF(NOT ${_VALUE}) + if(NOT GET_PERL_CONFIG_RC EQUAL 0) + message(STATUS "Perl executable ('${PERL}') reported failure: ${GET_PERL_CONFIG_RC}") + set(PHYSFS_BUILD_PERL false) + endif(NOT GET_PERL_CONFIG_RC EQUAL 0) + if(NOT ${_VALUE}) + message(STATUS "Perl executable ('${PERL}') didn't have a value for '${_KEY}'") + set(PHYSFS_BUILD_PERL false) + endif(NOT ${_VALUE}) - IF(PHYSFS_BUILD_PERL) - MESSAGE(STATUS "Perl says: '${${_VALUE}}'.") - ENDIF(PHYSFS_BUILD_PERL) - ENDIF(PHYSFS_BUILD_PERL) - ENDMACRO(GET_PERL_CONFIG) + if(PHYSFS_BUILD_PERL) + message(STATUS "Perl says: '${${_VALUE}}'.") + endif(PHYSFS_BUILD_PERL) + endif(PHYSFS_BUILD_PERL) + endmacro(GET_PERL_CONFIG) # !!! FIXME: installsitearch might be the wrong location. GET_PERL_CONFIG("archlibexp" PERL_INCLUDE_PATH) @@ -433,63 +433,63 @@ GET_PERL_CONFIG("installsitearch" PERL_INSTALL_PATH) # !!! FIXME: this test for Mac OS X is wrong. - IF(MACOSX) + if(MACOSX) GET_PERL_CONFIG("libperl" PERL_LIBPERL) - SET(TMPLIBPERL "${PERL_LIBPERL}") - STRING(REGEX REPLACE "^lib" "" TMPLIBPERL "${TMPLIBPERL}") - STRING(REGEX REPLACE "\\.so$" "" TMPLIBPERL "${TMPLIBPERL}") - STRING(REGEX REPLACE "\\.dylib$" "" TMPLIBPERL "${TMPLIBPERL}") - STRING(REGEX REPLACE "\\.dll$" "" TMPLIBPERL "${TMPLIBPERL}") - IF(NOT "${TMPLIBPERL}" STREQUAL "${PERL_LIBPERL}") - MESSAGE(STATUS "Stripped '${PERL_LIBPERL}' down to '${TMPLIBPERL}'.") - SET(PERL_LIBPERL "${TMPLIBPERL}") - ENDIF(NOT "${TMPLIBPERL}" STREQUAL "${PERL_LIBPERL}") - SET(PERL_LIBPERL "-l${PERL_LIBPERL}") - ENDIF(MACOSX) + set(TMPLIBPERL "${PERL_LIBPERL}") + string(REGEX REPLACE "^lib" "" TMPLIBPERL "${TMPLIBPERL}") + string(REGEX REPLACE "\\.so$" "" TMPLIBPERL "${TMPLIBPERL}") + string(REGEX REPLACE "\\.dylib$" "" TMPLIBPERL "${TMPLIBPERL}") + string(REGEX REPLACE "\\.dll$" "" TMPLIBPERL "${TMPLIBPERL}") + if(NOT "${TMPLIBPERL}" STREQUAL "${PERL_LIBPERL}") + message(STATUS "Stripped '${PERL_LIBPERL}' down to '${TMPLIBPERL}'.") + set(PERL_LIBPERL "${TMPLIBPERL}") + endif(NOT "${TMPLIBPERL}" STREQUAL "${PERL_LIBPERL}") + set(PERL_LIBPERL "-l${PERL_LIBPERL}") + endif(MACOSX) CONFIGURE_SWIG_BINDING(Perl "${PERL_INSTALL_PATH}" "${SWIG_OUTPUT_DIR}/perl/physfs.pm" "\"-I${PERL_INCLUDE_PATH}/CORE\" ${PERL_CCFLAGS} -w" "\"-L${PERL_INCLUDE_PATH}/CORE\" ${PERL_LIBPERL} ${PERL_LDFLAGS}") - INSTALL(FILES "${SWIG_OUTPUT_DIR}/perl/physfs.pm" DESTINATION "${PERL_INSTALL_PATH}") - INSTALL( + install(FILES "${SWIG_OUTPUT_DIR}/perl/physfs.pm" DESTINATION "${PERL_INSTALL_PATH}") + install( FILES test/test_physfs.pl DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) -ENDIF(PHYSFS_BUILD_PERL) +endif(PHYSFS_BUILD_PERL) # !!! FIXME: lots of cut-and-paste from perl bindings. -IF(PHYSFS_BUILD_RUBY) - MESSAGE(STATUS "Configuring Ruby bindings...") - FIND_PROGRAM(RUBY ruby DOC "Path to ruby command line app: http://ruby-lang.org/") - IF(NOT RUBY) - MESSAGE(STATUS "Ruby not found. You won't be able to build ruby bindings.") - SET(PHYSFS_BUILD_RUBY FALSE) - ENDIF(NOT RUBY) - MARK_AS_ADVANCED(RUBY) +if(PHYSFS_BUILD_RUBY) + message(STATUS "Configuring Ruby bindings...") + find_program(RUBY ruby DOC "Path to ruby command line app: http://ruby-lang.org/") + if(NOT RUBY) + message(STATUS "Ruby not found. You won't be able to build ruby bindings.") + set(PHYSFS_BUILD_RUBY FALSE) + endif(NOT RUBY) + mark_as_advanced(RUBY) - MACRO(GET_RUBY_CONFIG _KEY _VALUE) - IF(PHYSFS_BUILD_RUBY) - MESSAGE(STATUS "Figuring out ruby config value '${_KEY}' ...") - EXECUTE_PROCESS( + macro(GET_RUBY_CONFIG _KEY _VALUE) + if(PHYSFS_BUILD_RUBY) + message(STATUS "Figuring out ruby config value '${_KEY}' ...") + execute_process( COMMAND ${RUBY} -e "require 'rbconfig'; puts RbConfig::CONFIG['${_KEY}'];" RESULT_VARIABLE GET_RUBY_CONFIG_RC OUTPUT_VARIABLE ${_VALUE} OUTPUT_STRIP_TRAILING_WHITESPACE ) - IF(NOT GET_RUBY_CONFIG_RC EQUAL 0) - MESSAGE(STATUS "Ruby executable ('${RUBY}') reported failure: ${GET_RUBY_CONFIG_RC}") - SET(PHYSFS_BUILD_RUBY FALSE) - ENDIF(NOT GET_RUBY_CONFIG_RC EQUAL 0) - IF(NOT ${_VALUE}) - MESSAGE(STATUS "Ruby executable ('${RUBY}') didn't have a value for '${_KEY}'") - SET(PHYSFS_BUILD_RUBY FALSE) - ENDIF(NOT ${_VALUE}) + if(NOT GET_RUBY_CONFIG_RC EQUAL 0) + message(STATUS "Ruby executable ('${RUBY}') reported failure: ${GET_RUBY_CONFIG_RC}") + set(PHYSFS_BUILD_RUBY FALSE) + endif(NOT GET_RUBY_CONFIG_RC EQUAL 0) + if(NOT ${_VALUE}) + message(STATUS "Ruby executable ('${RUBY}') didn't have a value for '${_KEY}'") + set(PHYSFS_BUILD_RUBY FALSE) + endif(NOT ${_VALUE}) - IF(PHYSFS_BUILD_RUBY) - MESSAGE(STATUS "Ruby says: '${${_VALUE}}'.") - ENDIF(PHYSFS_BUILD_RUBY) - ENDIF(PHYSFS_BUILD_RUBY) - ENDMACRO(GET_RUBY_CONFIG) + if(PHYSFS_BUILD_RUBY) + message(STATUS "Ruby says: '${${_VALUE}}'.") + endif(PHYSFS_BUILD_RUBY) + endif(PHYSFS_BUILD_RUBY) + endmacro(GET_RUBY_CONFIG) GET_RUBY_CONFIG("archdir" RUBY_INCLUDE_PATH) GET_RUBY_CONFIG("CFLAGS" RUBY_CCFLAGS) @@ -499,14 +499,14 @@ GET_RUBY_CONFIG("libdir" RUBY_LIBDIR) CONFIGURE_SWIG_BINDING(Ruby "${RUBY_INSTALL_PATH}" "" "\"-I${RUBY_INCLUDE_PATH}\" ${RUBY_CCFLAGS} -w" "\"-L${RUBY_LIBDIR}\" ${RUBY_LIBRUBY} ${RUBY_LDFLAGS}") - SET_TARGET_PROPERTIES(physfs-ruby PROPERTIES PREFIX "") - INSTALL( + set_target_properties(physfs-ruby PROPERTIES PREFIX "") + install( FILES test/test_physfs.rb DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE ) -ENDIF(PHYSFS_BUILD_RUBY) +endif(PHYSFS_BUILD_RUBY) #INSTALL(TARGETS ${PHYSFS_INSTALL_TARGETS} @@ -515,9 +515,9 @@ # ARCHIVE DESTINATION lib${LIB_SUFFIX}) #INSTALL(FILES src/physfs.h DESTINATION include) -IF(UNIX) - SET(PHYSFS_TARBALL "${CMAKE_CURRENT_SOURCE_DIR}/../physfs-${PHYSFS_VERSION}.tar.gz") - ADD_CUSTOM_TARGET( +if(UNIX) + set(PHYSFS_TARBALL "${CMAKE_CURRENT_SOURCE_DIR}/../physfs-${PHYSFS_VERSION}.tar.gz") + add_custom_target( dist hg archive -t tgz "${PHYSFS_TARBALL}" WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" @@ -529,17 +529,17 @@ # WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" # COMMENT "Uninstall the project..." # ) -ENDIF(UNIX) +endif(UNIX) -MACRO(MESSAGE_BOOL_OPTION _NAME _VALUE) - IF(${_VALUE}) - MESSAGE(STATUS " ${_NAME}: enabled") - ELSE(${_VALUE}) - MESSAGE(STATUS " ${_NAME}: disabled") - ENDIF(${_VALUE}) -ENDMACRO(MESSAGE_BOOL_OPTION) +macro(MESSAGE_BOOL_OPTION _NAME _VALUE) + if(${_VALUE}) + message(STATUS " ${_NAME}: enabled") + else(${_VALUE}) + message(STATUS " ${_NAME}: disabled") + endif(${_VALUE}) +endmacro(MESSAGE_BOOL_OPTION) -MESSAGE(STATUS "PhysicsFS will build with the following options:") +message(STATUS "PhysicsFS will build with the following options:") MESSAGE_BOOL_OPTION("ZIP support" PHYSFS_ARCHIVE_ZIP) MESSAGE_BOOL_OPTION("7zip support" PHYSFS_ARCHIVE_7Z) MESSAGE_BOOL_OPTION("GRP support" PHYSFS_ARCHIVE_GRP) @@ -554,9 +554,9 @@ MESSAGE_BOOL_OPTION("Build Perl bindings" PHYSFS_BUILD_PERL) MESSAGE_BOOL_OPTION("Build Ruby bindings" PHYSFS_BUILD_RUBY) MESSAGE_BOOL_OPTION("Build stdio test program" PHYSFS_BUILD_TEST) -IF(PHYSFS_BUILD_TEST) +if(PHYSFS_BUILD_TEST) MESSAGE_BOOL_OPTION(" Use readline in test program" HAVE_SYSTEM_READLINE) -ENDIF(PHYSFS_BUILD_TEST) +endif(PHYSFS_BUILD_TEST) # end of CMakeLists.txt ... diff -r 6482875b0d97 -r 171da01bd04d project_files/Android-build/CMakeLists.txt --- a/project_files/Android-build/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/project_files/Android-build/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -18,7 +18,7 @@ find_program(ANT ant DOC "Path to the java package creator: ant") if(NOT EXISTS ${ANT}) - MESSAGE(FATAL_ERROR "Couldn't detect the Ant build tool") + message(FATAL_ERROR "Couldn't detect the Ant build tool") endif() if(NOT ANDROID_NDK) @@ -26,9 +26,9 @@ endif() if(IS_DIRECTORY "${ANDROID_NDK}") - MESSAGE(STATUS "Detected the android NDK directory at: " ${ANDROID_NDK}) + message(STATUS "Detected the android NDK directory at: " ${ANDROID_NDK}) else () - MESSAGE(FATAL_ERROR "Couldn't detect the Android NDK directory") + message(FATAL_ERROR "Couldn't detect the Android NDK directory") endif() if(NOT ANDROID_NDK_TOOLCHAINDIR) @@ -39,9 +39,9 @@ endif() if(IS_DIRECTORY "${ANDROID_NDK_TOOLCHAINDIR}") - MESSAGE(STATUS "Detected the Android NDK toolchain at: ${ANDROID_NDK_TOOLCHAINDIR}") + message(STATUS "Detected the Android NDK toolchain at: ${ANDROID_NDK_TOOLCHAINDIR}") else () - MESSAGE(FATAL_ERROR "Couldn't detect the Android NDK toolchain directory: ${ANDROID_NDK_TOOLCHAINDIR}") + message(FATAL_ERROR "Couldn't detect the Android NDK toolchain directory: ${ANDROID_NDK_TOOLCHAINDIR}") endif() if(NOT ANDROID_SDK)#Check if its defined at the cmdline @@ -52,9 +52,9 @@ endif() if( IS_DIRECTORY "${ANDROID_SDK}") - MESSAGE(STATUS "Detected the android SDK directory at: " ${ANDROID_SDK}) + message(STATUS "Detected the android SDK directory at: " ${ANDROID_SDK}) else () - MESSAGE(FATAL_ERROR "Couldn't detect the Android SDK directory") + message(FATAL_ERROR "Couldn't detect the Android SDK directory") endif() if( NOT FPC_DIR) @@ -66,9 +66,9 @@ endif() if( IS_DIRECTORY "${FPC_DIR}") - MESSAGE(STATUS "Detected the FreePascal directory at: " "${FPC_DIR}") + message(STATUS "Detected the FreePascal directory at: " "${FPC_DIR}") else () - MESSAGE(FATAL_ERROR "Couldn't detect the FreePascal directory") + message(FATAL_ERROR "Couldn't detect the FreePascal directory") endif() set(SDL_DIR /home/richard/Downloads/android-project) @@ -77,7 +77,7 @@ set(ANDROID_SDK_API_LVL 16) set(ANDROID_NDK_API_LVL 5) -MESSAGE(STATUS "Creating Makefile.android...") +message(STATUS "Creating Makefile.android...") configure_file(Templates/Makefile.android .) @@ -89,9 +89,9 @@ "--target android-${ANDROID_SDK_API_LVL}" OUTPUT_VARIABLE androidoutput ) - MESSAGE(STATUS "Updating android project config...\n" ${androidoutput}) + message(STATUS "Updating android project config...\n" ${androidoutput}) else() - MESSAGE(FATAL_ERROR "Couldn't find the android executable in ${ANDROID_SDK}/platform-tools or ${ANDROID_SDK}/tools.") + message(FATAL_ERROR "Couldn't find the android executable in ${ANDROID_SDK}/platform-tools or ${ANDROID_SDK}/tools.") endif() exec_program(${HGCOMMAND} diff -r 6482875b0d97 -r 171da01bd04d project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj --- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Fri Nov 30 18:19:52 2012 +0400 +++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Tue Dec 04 09:15:55 2012 +0400 @@ -261,70 +261,70 @@ isa = PBXContainerItemProxy; containerPortal = 619599BA1364E65900B429B6 /* Freetype.xcodeproj */; proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D /* libFreetype */; + remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = libFreetype; }; 610FB7E316613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 61A19BF414D20D83004B1E6D /* SDL_net.xcodeproj */; proxyType = 1; - remoteGlobalIDString = BE48FF6507AFA9A800BB41DA /* Static Library */; + remoteGlobalIDString = BE48FF6507AFA9A800BB41DA; remoteInfo = "Static Library"; }; 610FB7E516613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 6195993F1364C82B00B429B6 /* Lua.xcodeproj */; proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D /* libLua */; + remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = libLua; }; 610FB7E716613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 61A19AE314D2010A004B1E6D /* SDL.xcodeproj */; proxyType = 1; - remoteGlobalIDString = FD6526620DE8FCCB002AD96B /* libSDL */; + remoteGlobalIDString = FD6526620DE8FCCB002AD96B; remoteInfo = libSDL; }; 610FB7E916613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 61A19C1E14D20F51004B1E6D /* SDL_mixer.xcodeproj */; proxyType = 1; - remoteGlobalIDString = BE1FA90707AF96B2004B6283 /* Static Library */; + remoteGlobalIDString = BE1FA90707AF96B2004B6283; remoteInfo = "Static Library"; }; 610FB7EB16613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 61A19BC114D20CDA004B1E6D /* SDL_ttf.xcodeproj */; proxyType = 1; - remoteGlobalIDString = BE48FD6807AFA17000BB41DA /* Static Library */; + remoteGlobalIDString = BE48FD6807AFA17000BB41DA; remoteInfo = "Static Library"; }; 610FB7ED16613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 619598181364BCD200B429B6 /* Tremor.xcodeproj */; proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D /* libTremor */; + remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = libTremor; }; 610FB7EF16613980002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 61A19B6114D20B6C004B1E6D /* SDL_image.xcodeproj */; proxyType = 1; - remoteGlobalIDString = BE1FA72F07AF4C45004B6283 /* libSDL_image */; + remoteGlobalIDString = BE1FA72F07AF4C45004B6283; remoteInfo = libSDL_image; }; 610FB7F7166139A4002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */; proxyType = 2; - remoteGlobalIDString = D2AAC07E0554694100DB518D /* libPhysfs.a */; + remoteGlobalIDString = D2AAC07E0554694100DB518D; remoteInfo = Physfs; }; 610FB81B166139EC002FB2A7 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = 610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */; proxyType = 1; - remoteGlobalIDString = D2AAC07D0554694100DB518D /* Physfs */; + remoteGlobalIDString = D2AAC07D0554694100DB518D; remoteInfo = Physfs; }; 6162456614E6159C00CC97FB /* PBXContainerItemProxy */ = { diff -r 6482875b0d97 -r 171da01bd04d project_files/hedgewars.pro --- a/project_files/hedgewars.pro Fri Nov 30 18:19:52 2012 +0400 +++ b/project_files/hedgewars.pro Tue Dec 04 09:15:55 2012 +0400 @@ -109,7 +109,8 @@ ../QTfrontend/model/playerslistmodel.h \ ../QTfrontend/util/LibavInteraction.h \ ../QTfrontend/util/FileEngine.h \ - ../QTfrontend/util/frontlibpoller.h + ../QTfrontend/util/frontlibpoller.h \ + ../QTfrontend/ui/dialog/bandialog.h SOURCES += ../QTfrontend/model/ammoSchemeModel.cpp \ @@ -201,7 +202,8 @@ ../QTfrontend/model/playerslistmodel.cpp \ ../QTfrontend/util/LibavInteraction.cpp \ ../QTfrontend/util/FileEngine.cpp \ - ../QTfrontend/util/frontlibpoller.cpp + ../QTfrontend/util/frontlibpoller.cpp \ + ../QTfrontend/ui/dialog/bandialog.cpp TRANSLATIONS += ../share/hedgewars/Data/Locale/hedgewars_ar.ts \ diff -r 6482875b0d97 -r 171da01bd04d share/CMakeLists.txt --- a/share/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/share/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -1,13 +1,13 @@ add_subdirectory(hedgewars) -IF(APPLE OR CROSSAPPLE) +if(APPLE OR CROSSAPPLE) #needed for CFBundleVersion and CFBundleShortVersionString #should reuse the variables set in main CMakeLists.txt - IF(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg)) + if(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg)) set(HEDGEWARS_REVISION ${revision_number}) - ELSE() + else() set(HEDGEWARS_REVISION ${HEDGEWARS_VERSION}) - ENDIF() + endif() configure_file(${hedgewars_SOURCE_DIR}/share/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/Info.plist) @@ -20,4 +20,4 @@ DESTINATION ../Resources/) install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/dsa_pub.pem" DESTINATION ../Resources/) -ENDIF(APPLE OR CROSSAPPLE) +endif(APPLE OR CROSSAPPLE) diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/Ammos@2x.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos@2x.png has changed diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw@2x.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw@2x.png has changed diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/BorderHorizontal.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/BorderHorizontal.png has changed diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/BorderVertical.png Binary file share/hedgewars/Data/Graphics/AmmoMenu/BorderVertical.png has changed diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Graphics/AmmoMenu/CMakeLists.txt --- a/share/hedgewars/Data/Graphics/AmmoMenu/CMakeLists.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/share/hedgewars/Data/Graphics/AmmoMenu/CMakeLists.txt Tue Dec 04 09:15:55 2012 +0400 @@ -1,5 +1,4 @@ file(GLOB AmmoMenuSprites *.png) -list(REMOVE_ITEM AmmoMenuSprites *@2x.png Border*.png) install(FILES ${AmmoMenuSprites} diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Locale/hedgewars_sk.ts --- a/share/hedgewars/Data/Locale/hedgewars_sk.ts Fri Nov 30 18:19:52 2012 +0400 +++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts Tue Dec 04 09:15:55 2012 +0400 @@ -5,7 +5,7 @@ AbstractPage Go back - + Krok späť @@ -57,7 +57,7 @@ HWAskQuitDialog Do you really want to quit? - + Naozaj chcete odísť? @@ -166,7 +166,7 @@ Someone already uses your nickname %1 on the server. Please pick another nickname: - + Prezývku %1 už niekto na serveri používa. Prosím, zvoľte si inú prezývku: @@ -314,29 +314,29 @@ Remote host has closed connection - + Vzdialený hostiteľ ukončiť spojenie The server is too old. Disconnecting now. - + Server je príliš zastaraný. Odpojím sa. HWPasswordDialog Password - Heslo + Heslo HWUploadVideoDialog Upload video - + Upload videa Upload - + Upload @@ -351,19 +351,19 @@ Duration: %1m %2s - + Trvanie: %1m %2s Video: %1x%2, - + Video: %1x%2, %1 fps, - + %1 fps, Audio: - + Zvuk: @@ -440,7 +440,7 @@ Eraser - + Guma @@ -532,7 +532,7 @@ PageInfo Open the snapshot folder - + Otvoriť priečinok so snímkami @@ -788,43 +788,43 @@ Local Game - + Miestna hra Play a game on a single computer - + Hrať hru na tomto počítači Network Game - + Hra na sieti Play a game across a network - + Hra cez sieť Read about who is behind the Hedgewars Project - + Prečítajte si, kto stojí za projektom Hedgewars Leave a feedback here reporting issues, suggesting features or just saying how you like Hedgewars - + Dajte nám späťnú väzbu formou hlásenia chýb, navrhovania nových vlastností alebo nám len napíšte, čo sa vám na Hedgewars páči Access the user created content downloadable from our website - + Stiahnuť obsah vytvorený inými užívateľmi z našej stránky Exit game - + Ukončiť hru Manage videos recorded from game - + Spravovať videá nahrané počas hrania Edit game preferences - + Upraviť nastavenia hry @@ -857,11 +857,11 @@ Join hundreds of players online! - + Pripojte sa ku stovkám hráčov online! Join or host your own game server in a Local Area Network. - + Pripojiť sa k existujúcej hre alebo vytvoriť vlastnú hru na miestnej sieti. @@ -908,47 +908,47 @@ General - Všeobecné + Všeobecné Advanced - Pokročilé + Pokročilé Reset to default colors - + Nastaviť východzie farby Proxy host - + Hostiteľ proxy Proxy port - + Port proxy Proxy login - + Login pre proxy Proxy password - + Heslo pre proxy No proxy - + Bez proxy Socks5 proxy - + Socks5 proxy HTTP proxy - + HTTP proxy System proxy settings - + Systémové nastavenia proxy @@ -1151,47 +1151,47 @@ PageSinglePlayer Simple Game - + Jednoduchá hra Play a quick game against the computer with random settings - + Zahrajte si rýchlu hru proti počítaču s náhodnými nastaveniami Multiplayer - + Hra viacerých hráčov Play a hotseat game against your friends, or AI teams - + Zahrajte si hru za týmto počítačom proti kamarátom alebo počítačovým protivníkom Campaign Mode - + Režim kampane Training Mode - + Tréningový režim Practice your skills in a range of training missions - + Cibrite si svoje schopnosti v rade tréningových misií Demos - + Demá Watch recorded demos - + Prezerať nahrané demá Load - Načítať + Načítať Load a previously saved game - + Načítať uloženú hru @@ -1206,50 +1206,50 @@ Pick the mission or training to play - + Vyberte si misiu alebo tréning Start fighting - + Začať boj PageVideos Name - Meno + Meno Size - + Veľkosť %1 bytes - - + + %1 bajtov (in progress...) - + (prebieha...) Date: - + Dátum: Size: - + Veľkosť: encoding - + kódovanie uploading - + uploadujem @@ -1355,23 +1355,23 @@ Save password - + Uložiť heslo Save account name and password - + Uložiť meno účtu a heslo Video is private - + Video je súkromné Record audio - + Nahrať audio Use game resolution - + Použiť rozlíšenie hry @@ -1537,27 +1537,27 @@ Custom colors - + Vlastné farby Miscellaneous - + Rozličné Video recording options - + Voľby nahrávania videa Videos - + Videá Description - + Popis Proxy settings - + Nastavenia proxy @@ -1743,63 +1743,63 @@ There are videos that are currently being processed. Exiting now will abort them. Do you really want to quit? - + Momentálne sa niektoré videá spracovávajú. Ukončením zrušíte spracovávanie. Naozaj chcete ukončiť program? Please provide either the YouTube account name or the email address associated with the Google Account. - + Prosím zadajte buď názov YouTube účtu alebo e-mailovú adresu prepojenú s Google účtom. Account name (or email): - + Názov účtu (alebo e-mail): Password: - + Heslo: Video title: - + Názov videa: Video description: - + Popis videa: Tags (comma separated): - + Značky (oddelené čiarkou): Summary - + Sumár Description - + Popis Nickname - Prezývka + Prezývka Format - + Formát Audio codec - + Audio kodek Video codec - + Video kodek Framerate - + Snímkovanie Bitrate (Kbps) - + Bitový tok (Kbps) @@ -1814,7 +1814,7 @@ anonymous - + anonymný @@ -1840,214 +1840,217 @@ Please fill out all fields - + Prosím, vyplňte všetky polia Error while authenticating at google.com: - + Chyba pri autentizácii voči google.com: Login or password is incorrect - + Prihlasovacie meno alebo heslo je nesprávne Error while sending metadata to youtube.com: - + Chyba pri posielaní metadát na youtube.com: Teams - Are you sure? - + Tímy - Ste si istý? Do you really want to delete the team '%1'? - + Naozaj chcete vymazať tím '%1'? Cannot delete default scheme '%1'! - + Nemôžem vymazať východziu schému '%1'! Please select a record from the list - + Prosím, vyberte nahrávku zo zoznamu Unable to start server - + Nepodarilo sa spustiť server Hedgewars - Error - + Hedgewars - Chyba Hedgewars - Success - + Hedgewars - Úspech All file associations have been set - + Všeky súborové asociácie boli nastavené Successfully posted the issue on hedgewars.googlecode.com - + Popis problému bol úspešne odoslaný na hedgewars.google.com Error during authentication at google.com - + Chyba počas autentizácie voči google.com Error reporting the issue, please try again later (or visit hedgewars.googlecode.com directly) - + Chyba pri hlásení problému, skúste to prosím neskôr (alebo navštívte priamo hedgewars.googlecode.com) Main - Error - + Hlavné okno - Chyba Cannot create directory %1 - Nepodarilo sa vytvoriť adresár %1 + Nepodarilo sa vytvoriť adresár %1 Failed to open data directory: %1 Please check your installation! - + Chyba pri otváraní adresára s dátami: +%1 + +Skontrolujte, prosím, inštaláciu! TCP - Error - + TCP - Chyba Unable to start the server: %1. - Nie je možné spustiť server: %1. + Nepodarilo sa spustiť server: %1. Unable to run engine at - + Nepodarilo sa spustiť enginu na Error code: %1 - + Kód chyby: %1 Video upload - Error - + Upload videa - Chyba Netgame - Error - + Sieťová hra - Chyba Please select a server from the list - + Prosím, vyberte server zo zoznamu Please enter room name - Prosím zadajte názov miestnosti + Prosím, zadajte názov miestnosti Record Play - Error - + Prehrávanie záznamu - Chyba Please select record from the list - Prosím vyberte záznam zo zoznamu + Prosím, vyberte záznam zo zoznamu Cannot rename to - + Nepodarilo sa premenovať na Cannot delete file - + Nepodarilo sa vymazať súbor Room Name - Error - + Názov miestnosti - Chyba Please select room from the list - Prosím vyberte miestnosť zo zoznamu + Prosím, vyberte miestnosť zo zoznamu Room Name - Are you sure? - + Názov miestnosti - Ste si istý? The game you are trying to join has started. Do you still want to join the room? - Hra, ku ktorej sa snažíte pripojiť, už začala. + Hra, ku ktorej sa snažíte pripojiť, už začala. Aj napriek tomu chcete vojsť do miestnosti? Schemes - Warning - + Schémy - Varovanie Schemes - Are you sure? - + Schémy - Ste si istý? Do you really want to delete the game scheme '%1'? - + Naozaj chcete vymazať hernú schému '%1'? Videos - Are you sure? - + Videa - Ste si istý? Do you really want to delete the video '%1'? - + Naozaj chcete vymazať video '%1'? Do you really want to remove %1 file(s)? - - + + Naozaj chcete vymazať %1 súbor(y)? Do you really want to cancel uploading %1? - + Naozaj chcete zrušiť uploadovanie %1? File error - Chyba v súbore + Chyba v súbore Cannot open '%1' for writing - + Nepodarilo sa otvoriť '%1' pre zápis Cannot open '%1' for reading - + Nepodarilo sa otvoriť '%1' pre čítanie Cannot use the ammo '%1'! - + Nemôžem použiť muníciu '%1'! Weapons - Warning - + Zbrane - Varovanie Cannot overwrite default weapon set '%1'! - + Nemôžete prepísať východziu sadu zbraní '%1'! Cannot delete default weapon set '%1'! - + Nemôžete vymazať východziu sadu zbraní '%1'! Weapons - Are you sure? - + Zbrane - Ste si istý? Do you really want to delete the weapon set '%1'? - + Naozaj chcete vymazať sadu zbraní '%1'? @@ -2137,94 +2140,94 @@ More info - + Viac informácii Set default options - + Nastaviť východzie Open videos directory - + Otvoriť adresár s videami Play - + Prehrať Upload to YouTube - + Uploadovať na YouTube Cancel uploading - + Zrušiť upload Restore default coding parameters - + Obnoviť pôvodné parametre pre kódovanie Open the video directory in your system - + Otvoriť adresár s videami vo vašom systéme Play this video - + Prehrať toto videa Delete this video - + Vymazať toto video Upload this video to your Youtube account - + Uploadovať video na váš účet YouTube RoomsListModel In progress - Prebieha + Prebieha Room Name - Názov miestnosti + Názov miestnosti C - C + C T - T + T Owner - Majiteľ + Majiteľ Map - Mapa + Mapa Rules - Pravidlá + Pravidlá Weapons - Výzbroj + Výzbroj Random Map - Náhodná mapa + Náhodná mapa Random Maze - Náhodné bludisko + Náhodné bludisko Hand-drawn - + Ručne kreslená @@ -2523,11 +2526,11 @@ mute audio - + stlmiť zvuk record - + nahrať @@ -2617,7 +2620,7 @@ Record video: - + Nahrať video: diff -r 6482875b0d97 -r 171da01bd04d share/hedgewars/Data/Locale/sk.txt --- a/share/hedgewars/Data/Locale/sk.txt Fri Nov 30 18:19:52 2012 +0400 +++ b/share/hedgewars/Data/Locale/sk.txt Tue Dec 04 09:15:55 2012 +0400 @@ -56,6 +56,8 @@ 00:53=TARDIS 00:54=Budova 00:55=Postrek zeme +00:56=Zmrazovač +00:57=Sekáčik 01:00=Do boja! 01:01=Remíza @@ -78,6 +80,7 @@ 01:18=Vysoký 01:19=Extrémny 01:20=%1 odskok +01:21=Vypnutý zvuk ; Správy o udalostiach ; Ježko (%1) zomrel diff -r 6482875b0d97 -r 171da01bd04d tools/PascalPreprocessor.hs --- a/tools/PascalPreprocessor.hs Fri Nov 30 18:19:52 2012 +0400 +++ b/tools/PascalPreprocessor.hs Tue Dec 04 09:15:55 2012 +0400 @@ -19,7 +19,6 @@ ("FPC", "") , ("PAS2C", "") , ("ENDIAN_LITTLE", "") - , ("S3D_DISABLED", "") ] preprocess :: String -> IO String