Merge from default to have recent fixes flibqtfrontend
authorunc0rr
Mon, 26 Nov 2012 00:09:54 +0400
branchflibqtfrontend
changeset 8126 5bfa1b2025d6
parent 8106 861d145b270e (current diff)
parent 8124 499151efdd72 (diff)
child 8128 ebef2de30c18
Merge from default to have recent fixes
QTfrontend/CMakeLists.txt
QTfrontend/team.cpp
QTfrontend/util/namegen.cpp
README_WINDOWS
misc/physfs/CMakeLists.txt
--- a/.hgignore	Mon Nov 26 00:06:42 2012 +0400
+++ b/.hgignore	Mon Nov 26 00:09:54 2012 +0400
@@ -30,6 +30,7 @@
 glob:misc/liblua/Xcode/build/
 glob:misc/libfreetype/Xcode/build/
 glob:misc/libfreetype/Xcode-iOS/build/
+glob:misc/physfs/Xcode/build/
 glob:moc_*.cxx_parameters
 relre:^release\/
 glob:*.log
--- a/CMakeLists.txt	Mon Nov 26 00:06:42 2012 +0400
+++ b/CMakeLists.txt	Mon Nov 26 00:09:54 2012 +0400
@@ -1,8 +1,7 @@
 project(hedgewars)
 
 #initialise cmake environment
-cmake_minimum_required(VERSION 2.6.0 FATAL_ERROR)
-cmake_policy(VERSION 2.6)
+cmake_minimum_required(VERSION 2.6.0)
 FOREACH(hwpolicy CMP0003 CMP0012 CMP0017)
     IF(POLICY ${hwpolicy})
         CMAKE_POLICY(SET ${hwpolicy} NEW)
@@ -11,9 +10,11 @@
 #use available modules, fallback to ours if not present (CMP0017 helps)
 set(CMAKE_MODULE_PATH "${CMAKE_ROOT}/Modules" "${CMAKE_CURRENT_SOURCE_DIR}/cmake_modules")
 
-#set some default values
-option(NOREVISION "Build Hedgewars without revision information" OFF)
 
+#usually this is set at release time
+option(NOREVISION "Build Hedgewars without revision information [default: off]" OFF)
+
+#set other default values
 option(NOSERVER "Disable gameServer build [default: auto]" OFF)
 option(NOPNG "Disable screenshoot compression [default: auto]" OFF)
 option(NOVIDEOREC "Disable video recording [default: auto]" OFF)
@@ -24,6 +25,7 @@
 option(CROSSAPPLE "Enable OSX when not on OSX [default: off]" OFF)
 option(MINIMAL_FLAGS "Respect system flags as much as possible [default: off]" OFF)
 
+
 #detect Mercurial revision (if present)
 IF(NOT NOREVISION)
     set(default_build_type "DEBUG")
@@ -44,7 +46,7 @@
 
         MESSAGE(STATUS "Building revision ${revision_number} from hash ${revision_hash} ${HGCHANGED}")
         IF(HGCHANGED)
-            MESSAGE(WARNING "You have uncommitted changes")
+            MESSAGE(WARNING "Notice: you have uncommitted changes in your repository")
         ENDIF()
         set(version_suffix "-${revision_number}${HGCHANGED}")
     ENDIF()
@@ -71,7 +73,6 @@
     set(CMAKE_INSTALL_PREFIX ${bundle_name}/Contents/MacOS/)
     set(DATA_INSTALL_DIR "../Resources/")
     set(target_dir ".")
-    set(minimum_macosx_version "10.6")
 else()
     set(target_dir "bin")
 endif()
@@ -85,12 +86,15 @@
     #detect on which system we are: if sw_vers cannot be found for any reason (re)use minimum_macosx_version
     find_program(sw_vers sw_vers)
     if(sw_vers)
-        execute_process(COMMAND ${sw_vers} "-productVersion" OUTPUT_VARIABLE current_macosx_version)
+        execute_process(COMMAND ${sw_vers} "-productVersion"
+                        OUTPUT_VARIABLE current_macosx_version
+                        OUTPUT_STRIP_TRAILING_WHITESPACE)
         string(REGEX REPLACE "([0-9]+.[0-9]+).[0-9]+" "\\1" current_macosx_version ${current_macosx_version})
-        else()
+    else()
         if(NOT minimum_macosx_version)
             message(FATAL_ERROR "sw_vers not found! Need explicit MACOSX_DEPLOYMENT_TARGET variable set")
         else()
+            message(WARNING "sw_vers not found! Fallback to MACOSX_DEPLOYMENT_TARGET variable")
             set(current_macosx_version ${minimum_macosx_version})
         endif()
     endif()
@@ -100,7 +104,7 @@
         set(minimum_macosx_version ${current_macosx_version})
     endif()
 
-    #lower systems don't have enough processing power anyways
+    #lower systems don't have enough processing power anyway
     if (minimum_macosx_version LESS "10.4")
         message(FATAL_ERROR "Hedgewars is not supported on Mac OS X pre-10.4")
     endif()
@@ -145,8 +149,8 @@
     #set deployment target
     set(pascal_flags "-k-macosx_version_min" "-k${minimum_macosx_version}" "-XR${CMAKE_OSX_SYSROOT}" ${pascal_flags})
 
-    message(STATUS "Build system: Mac OS X ${current_macosx_version} with GCC:${CMAKE_C_COMPILER}")
-    message(STATUS "Target system: Mac OS X ${minimum_macosx_version} for architecture(s):${CMAKE_OSX_ARCHITECTURES}")
+    message(STATUS "Build system: Mac OS X ${current_macosx_version} with C compiler: ${CMAKE_C_COMPILER}")
+    message(STATUS "Target system: Mac OS X ${minimum_macosx_version} for architecture(s): ${CMAKE_OSX_ARCHITECTURES}")
 endif(APPLE)
 
 
@@ -230,7 +234,7 @@
         add_subdirectory(gameServer)
         message(STATUS "Found GHC: ${ghc_executable}")
     else()
-        message(STATUS "Could NOT find GHC, server will not be built")
+        message(WARNING "Could NOT find GHC, server will not be built")
         set(HAVE_NETSERVER false)
     endif()
 else()
@@ -246,7 +250,7 @@
 else()
     message(STATUS "LUA will be provided by the bundled sources")
     add_subdirectory(misc/liblua)
-    #linking with liblua.a requires system readline -- this works everywhere, right?
+    #linking with liblua.a requires system readline
     set(pascal_flags "-k${EXECUTABLE_OUTPUT_PATH}/lib${LUA_LIBRARY}.a" "-k-lreadline" ${pascal_flags})
 endif()
 
@@ -254,10 +258,10 @@
 #main engine
 add_subdirectory(hedgewars)
 
-# physfs library
+#physfs library
 add_subdirectory(misc/physfs)
 
-# frontend library
+#frontend library
 add_subdirectory(project_files/frontlib)
 
 #Android related build scripts
--- a/INSTALL	Mon Nov 26 00:06:42 2012 +0400
+++ b/INSTALL	Mon Nov 26 00:09:54 2012 +0400
@@ -1,13 +1,14 @@
 To compile and install you need:
- - Qt >= 4.5
- - FreePascal >= 2.2.4
+ - CMake >= 2.6.0
+ - FreePascal >= 2.2.0
+ - Qt >= 4.5.0
  - SDL >= 1.2.5
  - SDL_net >= 1.2.5
  - SDL_mixer >= 1.2
  - SDL_image >= 1.2
  - SDL_ttf >= 2.0
- - CMake >= 2.6.0
  - Lua >= 5.1.0
+ - Physfs >= 2.0
 For server:
  - Glasgow Haskell Compiler >= 6.10
  - bytestring-show package
@@ -16,6 +17,11 @@
 For videorecording:
  - FFmpeg or LibAV
  - GLUT (when SDL < 2)
+For compressed screenshots:
+ - libpng
+
+Lua and Physfs will be automatically built if not found.
+
 
 1. Configure:
 $ cmake .
@@ -23,8 +29,12 @@
 $ cmake -DCMAKE_BUILD_TYPE="Release" -DCMAKE_INSTALL_PREFIX="install_prefix" \
 -DDATA_INSTALL_DIR="data_dir" -DNOSERVER=1 .
 
-add -DNOSERVER=0 to compile net server; if you have Qt installed but it is
-not found you can set it up with -DQT_QMAKE_EXECUTABLE="path_to_qmake"
+Add -DNOSERVER=0 to compile net server (remember to check out the additional
+dependencies with the hedgewars-server.cabal configuration file. If you have
+Qt installed but it is not found, you can set it up with
+-DQT_QMAKE_EXECUTABLE="path_to_qmake".
+To get a glimpse of the main configuration options, you may use this command
+`cat CMakeLists.txt | grep option`
 
 2. Compile:
 $ make
@@ -34,3 +44,4 @@
 
 
 That's all! Enjoy!
+
--- a/QTfrontend/CMakeLists.txt	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/CMakeLists.txt	Mon Nov 26 00:09:54 2012 +0400
@@ -164,8 +164,13 @@
     link_directories(${EXECUTABLE_OUTPUT_PATH})
 endif()
 
+#when debugging, always prompt a console to see fronted messages
+#TODO: check it doesn't interfere on UNIX
+if(CMAKE_BUILD_TYPE MATCHES "RELEASE")
+    set(console_access "WIN32")
+endif(CMAKE_BUILD_TYPE MATCHES "RELEASE")
 
-add_executable(hedgewars WIN32
+add_executable(hedgewars ${console_access}
     ${hwfr_src}
     ${hwfr_moc_srcs}
     ${hwfr_hdrs}
--- a/QTfrontend/gameuiconfig.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/gameuiconfig.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -44,10 +44,12 @@
 
 
 GameUIConfig::GameUIConfig(HWForm * FormWidgets, const QString & fileName)
-    : QSettings(fileName, QSettings::IniFormat)
+    : QSettings(fileName, QSettings::IniFormat, FormWidgets)
 {
     Form = FormWidgets;
 
+    setIniCodec("UTF-8");
+
     connect(Form->ui.pageOptions->CBEnableFrontendMusic, SIGNAL(toggled(bool)), Form, SLOT(Music(bool)));
 
     //Form->resize(value("frontend/width", 640).toUInt(), value("frontend/height", 450).toUInt());
@@ -77,7 +79,7 @@
 
     Form->ui.pageOptions->SLQuality->setValue(value("video/quality", 5).toUInt());
     Form->ui.pageOptions->CBStereoMode->setCurrentIndex(value("video/stereo", 0).toUInt());
-    Form->ui.pageOptions->CBEnableFrontendSound->setChecked(value("frontend/effects", true).toBool());
+    Form->ui.pageOptions->CBFrontendEffects->setChecked(value("frontend/effects", true).toBool());
     Form->ui.pageOptions->CBEnableSound->setChecked(value("audio/sound", true).toBool());
     Form->ui.pageOptions->CBEnableFrontendSound->setChecked(value("frontend/sound", true).toBool());
     Form->ui.pageOptions->CBEnableMusic->setChecked(value("audio/music", true).toBool());
@@ -96,7 +98,7 @@
     if (savePwd == false) {
         Form->ui.pageOptions->editNetPassword->setEnabled(savePwd);
         Form->ui.pageOptions->editNetPassword->setText("");
-        setNetPasswordLength(0);        
+        setNetPasswordLength(0);
     }
 
     delete netHost;
--- a/QTfrontend/hwform.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/hwform.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -127,7 +127,7 @@
 #ifdef USE_XFIRE
     xfire_init();
 #endif
-    gameSettings = new QSettings(cfgdir->absolutePath() + "/hedgewars.ini", QSettings::IniFormat);
+    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());
 
@@ -139,7 +139,7 @@
 
     ui.pageOptions->CBResolution->addItems(SDLInteraction::instance().getResolutions());
 
-    config = new GameUIConfig(this, cfgdir->absolutePath() + "/hedgewars.ini");
+    config = new GameUIConfig(this, "physfs://hedgewars.ini");
 
     ui.pageVideos->init(config);
 
@@ -636,8 +636,8 @@
 
    /* if (id == ID_PAGE_DRAWMAP || id == ID_PAGE_GAMESTATS)
         stopAnim = true;
-	This were disabled due to broken flake animations.  I believe the more general problems w/ opacity that forced its disable makes blocking these
-	unnecessary.
+    This were disabled due to broken flake animations.  I believe the more general problems w/ opacity that forced its disable makes blocking these
+    unnecessary.
    */
 
 #if (QT_VERSION >= 0x040600)
@@ -695,8 +695,8 @@
         animationOldSlide->start(QAbstractAnimation::DeleteWhenStopped);
         animationNewSlide->start(QAbstractAnimation::DeleteWhenStopped);
 
-    	/* this is for the situation when the animation below is interrupted by a new animation.  For some reason, finished is not being fired */ 	
-    	for(int i=0;i<MAX_PAGE;i++) if (i!=id && i!=lastid) ui.Pages->widget(i)->hide();
+        /* this is for the situation when the animation below is interrupted by a new animation.  For some reason, finished is not being fired */
+        for(int i=0;i<MAX_PAGE;i++) if (i!=id && i!=lastid) ui.Pages->widget(i)->hide();
     }
 #endif
 }
--- a/QTfrontend/main.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/main.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -228,13 +228,13 @@
     // setup PhysFS
     engine.mount(datadir->absolutePath());
     engine.mount(cfgdir->absolutePath() + "/Data");
-    engine.mount(cfgdir->absolutePath(), "/config");
+    engine.mount(cfgdir->absolutePath());
     engine.setWriteDir(cfgdir->absolutePath());
     engine.mountPacks();
 
     QTranslator Translator;
     {
-        QSettings settings("physfs://config/hedgewars.ini", QSettings::IniFormat);
+        QSettings settings("physfs://hedgewars.ini", QSettings::IniFormat);
         QString cc = settings.value("misc/locale", QString()).toString();
         if(cc.isEmpty())
             cc = QLocale::system().name();
--- a/QTfrontend/team.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/team.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -162,14 +162,14 @@
     if(m_team)
         flib_team_destroy(m_team);
 
-    m_team = flib_team_from_ini(QString("/config/Teams/%1.hwt").arg(name).toUtf8().data());
+    m_team = flib_team_from_ini(QString("/Teams/%1.hwt").arg(name).toUtf8().data());
 
     return m_team != NULL;
 }
 
 bool HWTeam::fileExists()
 {
-    QFile f(QString("physfs://config/Teams/%1.hwt").arg(name()));
+    QFile f(QString("physfs://Teams/%1.hwt").arg(name()));
     return f.exists();
 }
 
@@ -178,7 +178,7 @@
     if(m_team->remoteDriven)
         return false;
 
-    QFile cfgfile(QString("physfs://config/Teams/%1.hwt").arg(name()));
+    QFile cfgfile(QString("physfs://Teams/%1.hwt").arg(name()));
     cfgfile.remove();
     return true;
 }
@@ -187,12 +187,12 @@
 {
     if (m_oldTeamName != name())
     {
-        QFile cfgfile(QString("physfs://config/Teams/%1.hwt").arg(m_oldTeamName));
+        QFile cfgfile(QString("physfs://Teams/%1.hwt").arg(m_oldTeamName));
         cfgfile.remove();
         m_oldTeamName = name();
     }
 
-    return flib_team_to_ini(QString("physfs://config/Teams/%1.hwt").arg(name()).toUtf8(), m_team) == 0;
+    return flib_team_to_ini(QString("physfs://Teams/%1.hwt").arg(name()).toUtf8(), m_team) == 0;
 }
 
 
--- a/QTfrontend/ui/page/pageoptions.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/ui/page/pageoptions.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -191,11 +191,7 @@
 
             // List of installed languages
             CBLanguage = new QComboBox(groupMisc);
-            QDir tmpdir;
-            tmpdir.cd(cfgdir->absolutePath());
-            tmpdir.cd("Data/Locale");
-            tmpdir.setFilter(QDir::Files);
-            QStringList locs = tmpdir.entryList(QStringList("hedgewars_*.qm"));
+            QStringList locs = DataManager::instance().entryList("Locale", QDir::Files, QStringList("hedgewars_*.qm"));
             CBLanguage->addItem(QComboBox::tr("(System default)"), QString(""));
             for(int i = 0; i < locs.count(); i++)
             {
@@ -203,17 +199,6 @@
                 CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
             }
 
-            tmpdir.cd(datadir->absolutePath());
-            tmpdir.cd("Locale");
-            tmpdir.setFilter(QDir::Files);
-            QStringList tmplist = tmpdir.entryList(QStringList("hedgewars_*.qm"));
-            for(int i = 0; i < tmplist.count(); i++)
-            {
-                if (locs.contains(tmplist[i])) continue;
-                QLocale loc(tmplist[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
-                CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
-            }
-
             MiscLayout->addWidget(CBLanguage, 0, 1);
 
             // Label and field for net nick
--- a/QTfrontend/ui/page/pagetraining.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/ui/page/pagetraining.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -118,7 +118,7 @@
     DataManager & dataMgr = DataManager::instance();
 
     // get locale
-    QSettings settings(cfgdir->absolutePath() + "/hedgewars.ini",
+    QSettings settings("physfs://hedgewars.ini",
                        QSettings::IniFormat);
 
     QString loc = settings.value("misc/locale", "").toString();
--- a/QTfrontend/util/FileEngine.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/util/FileEngine.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -9,8 +9,9 @@
 const QString FileEngineHandler::scheme = "physfs:/";
 
 FileEngine::FileEngine(const QString& filename)
-: _handler(NULL)
-, _flags(0)
+    : m_handle(NULL)
+    , m_flags(0)
+    , m_bufferSet(false)
 {
     setFileName(filename);
 }
@@ -25,24 +26,24 @@
     close();
 
     if (openMode & QIODevice::WriteOnly) {
-        _handler = PHYSFS_openWrite(_filename.toUtf8().constData());
-        _flags = QAbstractFileEngine::WriteOwnerPerm | QAbstractFileEngine::WriteUserPerm | QAbstractFileEngine::FileType;
+        m_handle = PHYSFS_openWrite(m_fileName.toUtf8().constData());
+        m_flags = QAbstractFileEngine::WriteOwnerPerm | QAbstractFileEngine::WriteUserPerm | QAbstractFileEngine::FileType;
     }
 
     else if (openMode & QIODevice::ReadOnly) {
-        _handler = PHYSFS_openRead(_filename.toUtf8().constData());
+        m_handle = PHYSFS_openRead(m_fileName.toUtf8().constData());
     }
 
     else if (openMode & QIODevice::Append) {
-        _handler = PHYSFS_openAppend(_filename.toUtf8().constData());
+        m_handle = PHYSFS_openAppend(m_fileName.toUtf8().constData());
     }
 
     else {
-        qWarning("Bad file open mode: %d", (int)openMode);
+        qWarning("[PHYSFS] Bad file open mode: %d", (int)openMode);
     }
 
-    if (!_handler) {
-        qWarning("Failed to open %s, reason: %s", _filename.toUtf8().constData(), PHYSFS_getLastError());
+    if (!m_handle) {
+        qWarning("[PHYSFS] Failed to open %s, reason: %s", m_fileName.toUtf8().constData(), PHYSFS_getLastError());
         return false;
     }
 
@@ -52,8 +53,8 @@
 bool FileEngine::close()
 {
     if (isOpened()) {
-        int result = PHYSFS_close(_handler);
-        _handler = NULL;
+        int result = PHYSFS_close(m_handle);
+        m_handle = NULL;
         return result != 0;
     }
 
@@ -62,22 +63,22 @@
 
 bool FileEngine::flush()
 {
-    return PHYSFS_flush(_handler) != 0;
+    return PHYSFS_flush(m_handle) != 0;
 }
 
 qint64 FileEngine::size() const
 {
-    return _size;
+    return m_size;
 }
 
 qint64 FileEngine::pos() const
 {
-    return PHYSFS_tell(_handler);
+    return PHYSFS_tell(m_handle);
 }
 
 bool FileEngine::seek(qint64 pos)
 {
-    return PHYSFS_seek(_handler, pos) != 0;
+    return PHYSFS_seek(m_handle, pos) != 0;
 }
 
 bool FileEngine::isSequential() const
@@ -87,7 +88,7 @@
 
 bool FileEngine::remove()
 {
-    return PHYSFS_delete(_filename.toUtf8().constData()) != 0;
+    return PHYSFS_delete(m_fileName.toUtf8().constData()) != 0;
 }
 
 bool FileEngine::mkdir(const QString &dirName, bool createParentDirectories) const
@@ -123,7 +124,7 @@
 
     QString file;
     QStringList result;
-    char **files = PHYSFS_enumerateFiles(_filename.toUtf8().constData());
+    char **files = PHYSFS_enumerateFiles(m_fileName.toUtf8().constData());
 
     for (char **i = files; *i != NULL; i++) {
         file = QString::fromUtf8(*i);
@@ -140,7 +141,7 @@
 
 QAbstractFileEngine::FileFlags FileEngine::fileFlags(FileFlags type) const
 {
-    return type & _flags;
+    return type & m_flags;
 }
 
 QString FileEngine::fileName(FileName file) const
@@ -154,15 +155,15 @@
         }
         case QAbstractFileEngine::BaseName:
         {
-            int l = _filename.lastIndexOf('/');
-            QString s = _filename.mid(l + 1);
+            int l = m_fileName.lastIndexOf('/');
+            QString s = m_fileName.mid(l + 1);
             return s;
         }
         case QAbstractFileEngine::DefaultName:
         case QAbstractFileEngine::AbsoluteName:
         default:
         {
-            QString s = "physfs:/" + _filename;
+            QString s = "physfs:/" + m_fileName;
             return s;
         }
     }
@@ -175,7 +176,7 @@
     {
         case QAbstractFileEngine::ModificationTime:
         default:
-            return _datetime;
+            return m_date;
             break;
     };
 }
@@ -183,29 +184,29 @@
 void FileEngine::setFileName(const QString &file)
 {
     if(file.startsWith(FileEngineHandler::scheme))
-        _filename = file.mid(FileEngineHandler::scheme.size());
+        m_fileName = file.mid(FileEngineHandler::scheme.size());
     else
-        _filename = file;
+        m_fileName = file;
 
     PHYSFS_Stat stat;
-    if (PHYSFS_stat(_filename.toUtf8().constData(), &stat) != 0) {
-        _size = stat.filesize;
-        _datetime = QDateTime::fromTime_t(stat.modtime);
+    if (PHYSFS_stat(m_fileName.toUtf8().constData(), &stat) != 0) {
+        m_size = stat.filesize;
+        m_date = QDateTime::fromTime_t(stat.modtime);
 //        _flags |= QAbstractFileEngine::WriteUserPerm;
-        _flags |= QAbstractFileEngine::ReadUserPerm;
-        _flags |= QAbstractFileEngine::ExistsFlag;
+        m_flags |= QAbstractFileEngine::ReadUserPerm;
+        m_flags |= QAbstractFileEngine::ExistsFlag;
 
         switch (stat.filetype)
         {
             case PHYSFS_FILETYPE_REGULAR:
-                _flags |= QAbstractFileEngine::FileType;
+                m_flags |= QAbstractFileEngine::FileType;
                 break;
 
             case PHYSFS_FILETYPE_DIRECTORY:
-                _flags |= QAbstractFileEngine::DirectoryType;
+                m_flags |= QAbstractFileEngine::DirectoryType;
                 break;
             case PHYSFS_FILETYPE_SYMLINK:
-                _flags |= QAbstractFileEngine::LinkType;
+                m_flags |= QAbstractFileEngine::LinkType;
                 break;
             default: ;
         }
@@ -214,22 +215,43 @@
 
 bool FileEngine::atEnd() const
 {
-    return PHYSFS_eof(_handler) != 0;
+    return PHYSFS_eof(m_handle) != 0;
 }
 
 qint64 FileEngine::read(char *data, qint64 maxlen)
 {
-    return PHYSFS_readBytes(_handler, data, maxlen);
+    return PHYSFS_readBytes(m_handle, data, maxlen);
+}
+
+qint64 FileEngine::readLine(char *data, qint64 maxlen)
+{
+    if(!m_bufferSet)
+    {
+        PHYSFS_setBuffer(m_handle, 4096);
+        m_bufferSet = true;
+    }
+
+    qint64 bytesRead = 0;
+    while(PHYSFS_readBytes(m_handle, data, 1)
+          && maxlen
+          && (*data == '\n'))
+    {
+        ++data;
+        --maxlen;
+        ++bytesRead;
+    }
+
+    return bytesRead;
 }
 
 qint64 FileEngine::write(const char *data, qint64 len)
 {
-    return PHYSFS_writeBytes(_handler, data, len);
+    return PHYSFS_writeBytes(m_handle, data, len);
 }
 
 bool FileEngine::isOpened() const
 {
-    return _handler != NULL;
+    return m_handle != NULL;
 }
 
 QFile::FileError FileEngine::error() const
@@ -244,11 +266,13 @@
 
 bool FileEngine::supportsExtension(Extension extension) const
 {
-    return extension == QAbstractFileEngine::AtEndExtension;
+    return
+            (extension == QAbstractFileEngine::AtEndExtension)
+            || (extension == QAbstractFileEngine::FastReadLineExtension)
+            ;
 }
 
 
-
 FileEngineHandler::FileEngineHandler(char *argv0)
 {
     PHYSFS_init(argv0);
--- a/QTfrontend/util/FileEngine.h	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/util/FileEngine.h	Mon Nov 26 00:09:54 2012 +0400
@@ -38,6 +38,7 @@
         bool atEnd() const;
 
         virtual qint64 read(char *data, qint64 maxlen);
+        virtual qint64 readLine(char *data, qint64 maxlen);
         virtual qint64 write(const char *data, qint64 len);
 
         bool isOpened() const;
@@ -48,11 +49,12 @@
         virtual bool supportsExtension(Extension extension) const;
 
     private:
-        PHYSFS_file *_handler;
-        qint64 _size;
-        FileFlags _flags;
-        QString _filename;
-        QDateTime _datetime;
+        PHYSFS_file *m_handle;
+        qint64 m_size;
+        FileFlags m_flags;
+        QString m_fileName;
+        QDateTime m_date;
+        bool m_bufferSet;
 };
 
 class FileEngineHandler : public QAbstractFileEngineHandler
--- a/QTfrontend/util/SDLInteraction.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/util/SDLInteraction.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -28,6 +28,8 @@
 
 #include "SDLInteraction.h"
 
+#include "physfsrwops.h"
+
 extern char sdlkeys[1024][2][128];
 extern char xb360buttons[][128];
 extern char xb360dpad[128];
@@ -193,7 +195,7 @@
 {
     SDLAudioInit();
     if (!m_soundMap->contains(soundFile))
-        m_soundMap->insert(soundFile, Mix_LoadWAV(soundFile.toLocal8Bit().constData()));
+        m_soundMap->insert(soundFile, Mix_LoadWAV_RW(PHYSFSRWOPS_openRead(soundFile.toLocal8Bit().constData()), 1));
 
     //FIXME: this is a hack, but works as long as we have few concurrent playing sounds
     if (Mix_Playing(lastchannel) == false)
@@ -232,7 +234,7 @@
     SDLAudioInit();
 
     if (m_music == NULL)
-        m_music = Mix_LoadMUS(m_musicTrack.toLocal8Bit().constData());
+        m_music = Mix_LoadMUS_RW(PHYSFSRWOPS_openRead(m_musicTrack.toLocal8Bit().constData()));
 
     Mix_VolumeMusic(MIX_MAX_VOLUME - 28);
     Mix_FadeInMusic(m_music, -1, 1750);
--- a/QTfrontend/util/namegen.cpp	Mon Nov 26 00:06:42 2012 +0400
+++ b/QTfrontend/util/namegen.cpp	Mon Nov 26 00:09:54 2012 +0400
@@ -117,22 +117,21 @@
     QStringList list;
 
     // find .txt to load the names from
-    QFile * file = new QFile(QString("physfs://Names/%1.txt").arg(filename));
+    QFile file(QString("physfs://Names/%1.txt").arg(filename));
 
-    if (file->exists() && file->open(QIODevice::ReadOnly | QIODevice::Text))
+    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
     {
-        QTextStream in(file);
-        while (!in.atEnd())
+        QTextStream in(&file);
+        QString line;
+        do
         {
-            QString line = in.readLine();
+            line = in.readLine();
+
             if(!line.isEmpty())
                 list.append(line);
-        }
+        } while (!line.isNull());
     }
 
-    // this QFile isn't needed any further
-    delete file;
-
     if (list.size() == 0)
         list.append(filename);
 
@@ -145,22 +144,21 @@
     QStringList list;
 
     // find .cfg to load the dicts from
-    QFile * file = new QFile(QString("physfs://Names/%1.cfg").arg(hatname));
+    QFile file(QString("physfs://Names/%1.cfg").arg(hatname));
 
-    if (file->exists() && file->open(QIODevice::ReadOnly | QIODevice::Text))
+    if (file.open(QIODevice::ReadOnly | QIODevice::Text))
     {
-        QTextStream in(file);
-        while (!in.atEnd())
+        QTextStream in(&file);
+        QString line;
+        do
         {
-            QString line = in.readLine();
+            line = in.readLine();
+
             if(!line.isEmpty())
                 list.append(line);
-        }
+        } while (!line.isNull());
     }
 
-    // this QFile isn't needed any further
-    delete file;
-
     if (list.size() == 0)
         list.append(QString("generic"));
 
--- a/README	Mon Nov 26 00:06:42 2012 +0400
+++ b/README	Mon Nov 26 00:09:54 2012 +0400
@@ -5,3 +5,10 @@
 Source:
 Copyright 2004-2011 Andrey Korotaev <unC0Rr@gmail.com>
 Portions copyright 2006-2008 Igor Ulyanov aka Displacer <iulyanov@gmail.com>
+
+Instructions:
+depending on your system, consult our wiki at:
+- http://code.google.com/p/hedgewars/wiki/BuildingOnLinux
+- http://code.google.com/p/hedgewars/wiki/BuildingOnWindows
+- http://code.google.com/p/hedgewars/wiki/BuildingOnMac
+
--- a/README_WINDOWS	Mon Nov 26 00:06:42 2012 +0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1 +0,0 @@
-For instructions, please visit: http://code.google.com/p/hedgewars/wiki/BuildingOnWindows
--- a/hedgewars/CMakeLists.txt	Mon Nov 26 00:06:42 2012 +0400
+++ b/hedgewars/CMakeLists.txt	Mon Nov 26 00:09:54 2012 +0400
@@ -108,9 +108,13 @@
     find_program(fpc_executable fpc)
 ENDIF()
 
-if(fpc_executable)
-    execute_process(COMMAND ${fpc_executable} -iV OUTPUT_VARIABLE fpc_output)
-endif(fpc_executable)
+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)
 
 string(REGEX MATCH "[0-9]+\\.[0-9]+\\.[0-9]+" fpc_version "${fpc_output}")
 if(fpc_version)
@@ -129,17 +133,21 @@
     message(FATAL_ERROR "No FreePascal compiler found!")
 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
+    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
@@ -182,14 +190,13 @@
             set(pascal_flags "-k${PNG_LIBRARY}" ${pascal_flags})
         endif()
     else()
-        message(STATUS "Screenshots will be in BMP format because libpng was not found")
+        message(WARNING "Screenshots will be in BMP format because libpng was not found")
     endif()
 else()
     message(STATUS "Screenshots will be in BMP format per user request")
 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")
     #under some configurations CMAKE_BUILD_TOOL fails to pass on the jobserver, breaking parallel compilation
@@ -224,7 +231,7 @@
             set(pascal_flags "-k${FFMPEG_LIBAVCODEC}" "-k${FFMPEG_LIBAVFORMAT}" "-k${FFMPEG_LIBAVUTIL}" ${pascal_flags})
         ENDIF()
     else()
-        message(STATUS "Could NOT find FFMPEG/LibAV, video recording will be disabled")
+        message(WARNING "Could NOT find FFMPEG/LibAV, video recording will be disabled")
     endif()
 else()
     message(STATUS "Video recording disabled by user")
--- a/hedgewars/uLocale.pas	Mon Nov 26 00:06:42 2012 +0400
+++ b/hedgewars/uLocale.pas	Mon Nov 26 00:09:54 2012 +0400
@@ -40,7 +40,7 @@
     trevt_n: array[TEventId] of integer;
 
 procedure LoadLocale(FileName: shortstring);
-var s: shortstring;
+var s: ansistring;
     f: pfsFile;
     a, b, c: LongInt;
     first: array[TEventId] of boolean;
@@ -58,7 +58,7 @@
     begin
     while not pfsEof(f) do
         begin
-        pfsReadLn(f, s);
+        pfsReadLnA(f, s);
         if Length(s) = 0 then
             continue;
         if (s[1] < '0') or (s[1] > '9') then
--- a/hedgewars/uPhysFSLayer.pas	Mon Nov 26 00:06:42 2012 +0400
+++ b/hedgewars/uPhysFSLayer.pas	Mon Nov 26 00:09:54 2012 +0400
@@ -30,6 +30,7 @@
 function pfsClose(f: PFSFile): boolean;
 
 procedure pfsReadLn(f: PFSFile; var s: shortstring);
+procedure pfsReadLnA(f: PFSFile; var s: ansistring);
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
 function pfsEOF(f: PFSFile): boolean;
 
@@ -99,6 +100,28 @@
         end
 end;
 
+procedure pfsReadLnA(f: PFSFile; var s: ansistring);
+var c: char;
+    b: shortstring;
+begin
+s:= '';
+b[0]:= #0;
+
+while (PHYSFS_readBytes(f, @c, 1) = 1) and (c <> #10) do
+    if (c <> #13) then
+        begin
+        inc(b[0]);
+        b[byte(b[0])]:= c;
+        if b[0] = #255 then
+            begin
+            s:= s + b;
+            b[0]:= #0
+            end
+        end;
+        
+s:= s + b
+end;
+
 function pfsBlockRead(f: PFSFile; buf: pointer; size: Int64): Int64;
 var r: Int64;
 begin
--- a/hedgewars/uUtils.pas	Mon Nov 26 00:06:42 2012 +0400
+++ b/hedgewars/uUtils.pas	Mon Nov 26 00:09:54 2012 +0400
@@ -404,7 +404,7 @@
 procedure initModule(isNotPreview: boolean);
 {$IFDEF DEBUGFILE}
 var logfileBase: shortstring;
-{$IFNDEF MOBILE}var i: LongInt;{$ENDIF}
+    i: LongInt;
 {$ENDIF}
 begin
 {$IFDEF DEBUGFILE}
@@ -423,26 +423,25 @@
 {$I-}
 {$IFDEF MOBILE}
     {$IFDEF IPHONEOS} Assign(f, UserPathPrefix + '/hw-' + logfileBase + '.log'); {$ENDIF}
-    {$IFDEF ANDROID} Assign(f,pathPrefix + '/' + logfileBase + '.log'); {$ENDIF}
-    Rewrite(f);
+    {$IFDEF ANDROID} Assign(f, pathPrefix + '/' + logfileBase + '.log'); {$ENDIF}
+    i:= i; // avoid hint
 {$ELSE}
+    f:= stdout; // if everything fails, write to stderr
     if (UserPathPrefix <> '') then
         begin
-            i:= 0;
-            while(i < 7) do
+        if not FileExists(UserPathPrefix + '/Logs/') then
+            CreateDir(UserPathPrefix + '/Logs/');
+        i:= 0;
+        while(i < 7) do
             begin
-                assign(f, UserPathPrefix + '/Logs/' + logfileBase + inttostr(i) + '.log');
-                rewrite(f);
-                if IOResult = 0 then
-                    break;
-                inc(i)
+            assign(f, UserPathPrefix + '/Logs/' + logfileBase + inttostr(i) + '.log');
+            if IOResult = 0 then
+                break;
+            inc(i)
             end;
-            if i = 7 then
-                f:= stderr; // if everything fails, write to stderr
-        end
-    else
-        f:= stderr;
+        end;
 {$ENDIF}
+    Rewrite(f);
 {$I+}
 {$ENDIF}
 
--- a/misc/physfs/CMakeLists.txt	Mon Nov 26 00:06:42 2012 +0400
+++ b/misc/physfs/CMakeLists.txt	Mon Nov 26 00:09:54 2012 +0400
@@ -47,7 +47,7 @@
 
     # Need these everywhere...
     ADD_DEFINITIONS(-fno-common)
-    SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework Carbon -framework IOKit")
+    SET(OTHER_LDFLAGS ${OTHER_LDFLAGS} "-framework IOKit")
 ENDIF(MACOSX)
 
 # Add some gcc-specific command lines.
@@ -286,6 +286,8 @@
     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)
 
 IF(NOT PHYSFS_BUILD_SHARED AND NOT PHYSFS_BUILD_STATIC)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/physfs/Xcode/Physfs.xcodeproj/project.pbxproj	Mon Nov 26 00:09:54 2012 +0400
@@ -0,0 +1,354 @@
+// !$*UTF8*$!
+{
+	archiveVersion = 1;
+	classes = {
+	};
+	objectVersion = 45;
+	objects = {
+
+/* Begin PBXBuildFile section */
+		610FB79016613776002FB2A7 /* archiver_dir.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77916613776002FB2A7 /* archiver_dir.c */; };
+		610FB79116613776002FB2A7 /* archiver_grp.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77A16613776002FB2A7 /* archiver_grp.c */; };
+		610FB79216613776002FB2A7 /* archiver_hog.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77B16613776002FB2A7 /* archiver_hog.c */; };
+		610FB79316613776002FB2A7 /* archiver_iso9660.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77C16613776002FB2A7 /* archiver_iso9660.c */; };
+		610FB79416613776002FB2A7 /* archiver_lzma.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77D16613776002FB2A7 /* archiver_lzma.c */; };
+		610FB79516613776002FB2A7 /* archiver_mvl.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77E16613776002FB2A7 /* archiver_mvl.c */; };
+		610FB79616613776002FB2A7 /* archiver_qpak.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB77F16613776002FB2A7 /* archiver_qpak.c */; };
+		610FB79716613776002FB2A7 /* archiver_unpacked.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78016613776002FB2A7 /* archiver_unpacked.c */; };
+		610FB79816613776002FB2A7 /* archiver_wad.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78116613776002FB2A7 /* archiver_wad.c */; };
+		610FB79916613776002FB2A7 /* archiver_zip.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78216613776002FB2A7 /* archiver_zip.c */; };
+		610FB79A16613776002FB2A7 /* physfs_byteorder.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78316613776002FB2A7 /* physfs_byteorder.c */; };
+		610FB79B16613776002FB2A7 /* physfs_casefolding.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB78416613776002FB2A7 /* physfs_casefolding.h */; };
+		610FB79C16613776002FB2A7 /* physfs_internal.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB78516613776002FB2A7 /* physfs_internal.h */; };
+		610FB79D16613776002FB2A7 /* physfs_miniz.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB78616613776002FB2A7 /* physfs_miniz.h */; };
+		610FB79E16613776002FB2A7 /* physfs_platforms.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB78716613776002FB2A7 /* physfs_platforms.h */; };
+		610FB79F16613776002FB2A7 /* physfs_unicode.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78816613776002FB2A7 /* physfs_unicode.c */; };
+		610FB7A016613776002FB2A7 /* physfs.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78916613776002FB2A7 /* physfs.c */; };
+		610FB7A116613776002FB2A7 /* physfs.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB78A16613776002FB2A7 /* physfs.h */; };
+		610FB7A216613776002FB2A7 /* platform_beos.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78B16613776002FB2A7 /* platform_beos.cpp */; };
+		610FB7A316613776002FB2A7 /* platform_macosx.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78C16613776002FB2A7 /* platform_macosx.c */; };
+		610FB7A416613776002FB2A7 /* platform_posix.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78D16613776002FB2A7 /* platform_posix.c */; };
+		610FB7A516613776002FB2A7 /* platform_unix.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78E16613776002FB2A7 /* platform_unix.c */; };
+		610FB7A616613776002FB2A7 /* platform_windows.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB78F16613776002FB2A7 /* platform_windows.c */; };
+		610FB7AE16613813002FB2A7 /* hwpacksmounter.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB7A916613813002FB2A7 /* hwpacksmounter.c */; };
+		610FB7AF16613813002FB2A7 /* hwpacksmounter.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB7AA16613813002FB2A7 /* hwpacksmounter.h */; };
+		610FB7B016613813002FB2A7 /* physfslualoader.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB7AB16613813002FB2A7 /* physfslualoader.c */; };
+		610FB7B116613813002FB2A7 /* physfsrwops.c in Sources */ = {isa = PBXBuildFile; fileRef = 610FB7AC16613813002FB2A7 /* physfsrwops.c */; };
+		610FB7B216613813002FB2A7 /* physfsrwops.h in Headers */ = {isa = PBXBuildFile; fileRef = 610FB7AD16613813002FB2A7 /* physfsrwops.h */; };
+		AA747D9F0F9514B9006C5449 /* Physfs_Prefix.pch in Headers */ = {isa = PBXBuildFile; fileRef = AA747D9E0F9514B9006C5449 /* Physfs_Prefix.pch */; };
+		AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AACBBE490F95108600F1A2B1 /* Foundation.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+		610FB77916613776002FB2A7 /* archiver_dir.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_dir.c; path = ../src/archiver_dir.c; sourceTree = SOURCE_ROOT; };
+		610FB77A16613776002FB2A7 /* archiver_grp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_grp.c; path = ../src/archiver_grp.c; sourceTree = SOURCE_ROOT; };
+		610FB77B16613776002FB2A7 /* archiver_hog.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_hog.c; path = ../src/archiver_hog.c; sourceTree = SOURCE_ROOT; };
+		610FB77C16613776002FB2A7 /* archiver_iso9660.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_iso9660.c; path = ../src/archiver_iso9660.c; sourceTree = SOURCE_ROOT; };
+		610FB77D16613776002FB2A7 /* archiver_lzma.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_lzma.c; path = ../src/archiver_lzma.c; sourceTree = SOURCE_ROOT; };
+		610FB77E16613776002FB2A7 /* archiver_mvl.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_mvl.c; path = ../src/archiver_mvl.c; sourceTree = SOURCE_ROOT; };
+		610FB77F16613776002FB2A7 /* archiver_qpak.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_qpak.c; path = ../src/archiver_qpak.c; sourceTree = SOURCE_ROOT; };
+		610FB78016613776002FB2A7 /* archiver_unpacked.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_unpacked.c; path = ../src/archiver_unpacked.c; sourceTree = SOURCE_ROOT; };
+		610FB78116613776002FB2A7 /* archiver_wad.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_wad.c; path = ../src/archiver_wad.c; sourceTree = SOURCE_ROOT; };
+		610FB78216613776002FB2A7 /* archiver_zip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = archiver_zip.c; path = ../src/archiver_zip.c; sourceTree = SOURCE_ROOT; };
+		610FB78316613776002FB2A7 /* physfs_byteorder.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = physfs_byteorder.c; path = ../src/physfs_byteorder.c; sourceTree = SOURCE_ROOT; };
+		610FB78416613776002FB2A7 /* physfs_casefolding.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = physfs_casefolding.h; path = ../src/physfs_casefolding.h; sourceTree = SOURCE_ROOT; };
+		610FB78516613776002FB2A7 /* physfs_internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = physfs_internal.h; path = ../src/physfs_internal.h; sourceTree = SOURCE_ROOT; };
+		610FB78616613776002FB2A7 /* physfs_miniz.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = physfs_miniz.h; path = ../src/physfs_miniz.h; sourceTree = SOURCE_ROOT; };
+		610FB78716613776002FB2A7 /* physfs_platforms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = physfs_platforms.h; path = ../src/physfs_platforms.h; sourceTree = SOURCE_ROOT; };
+		610FB78816613776002FB2A7 /* physfs_unicode.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = physfs_unicode.c; path = ../src/physfs_unicode.c; sourceTree = SOURCE_ROOT; };
+		610FB78916613776002FB2A7 /* physfs.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = physfs.c; path = ../src/physfs.c; sourceTree = SOURCE_ROOT; };
+		610FB78A16613776002FB2A7 /* physfs.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = physfs.h; path = ../src/physfs.h; sourceTree = SOURCE_ROOT; };
+		610FB78B16613776002FB2A7 /* platform_beos.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = platform_beos.cpp; path = ../src/platform_beos.cpp; sourceTree = SOURCE_ROOT; };
+		610FB78C16613776002FB2A7 /* platform_macosx.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = platform_macosx.c; path = ../src/platform_macosx.c; sourceTree = SOURCE_ROOT; };
+		610FB78D16613776002FB2A7 /* platform_posix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = platform_posix.c; path = ../src/platform_posix.c; sourceTree = SOURCE_ROOT; };
+		610FB78E16613776002FB2A7 /* platform_unix.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = platform_unix.c; path = ../src/platform_unix.c; sourceTree = SOURCE_ROOT; };
+		610FB78F16613776002FB2A7 /* platform_windows.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = platform_windows.c; path = ../src/platform_windows.c; sourceTree = SOURCE_ROOT; };
+		610FB7A916613813002FB2A7 /* hwpacksmounter.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = hwpacksmounter.c; path = ../extras/hwpacksmounter.c; sourceTree = SOURCE_ROOT; };
+		610FB7AA16613813002FB2A7 /* hwpacksmounter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = hwpacksmounter.h; path = ../extras/hwpacksmounter.h; sourceTree = SOURCE_ROOT; };
+		610FB7AB16613813002FB2A7 /* physfslualoader.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = physfslualoader.c; path = ../extras/physfslualoader.c; sourceTree = SOURCE_ROOT; };
+		610FB7AC16613813002FB2A7 /* physfsrwops.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = physfsrwops.c; path = ../extras/physfsrwops.c; sourceTree = SOURCE_ROOT; };
+		610FB7AD16613813002FB2A7 /* physfsrwops.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = physfsrwops.h; path = ../extras/physfsrwops.h; sourceTree = SOURCE_ROOT; };
+		AA747D9E0F9514B9006C5449 /* Physfs_Prefix.pch */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Physfs_Prefix.pch; sourceTree = SOURCE_ROOT; };
+		AACBBE490F95108600F1A2B1 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
+		D2AAC07E0554694100DB518D /* libPhysfs.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libPhysfs.a; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+		D2AAC07C0554694100DB518D /* Frameworks */ = {
+			isa = PBXFrameworksBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AACBBE4A0F95108600F1A2B1 /* Foundation.framework in Frameworks */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+		034768DFFF38A50411DB9C8B /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				D2AAC07E0554694100DB518D /* libPhysfs.a */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
+		0867D691FE84028FC02AAC07 /* Physfs */ = {
+			isa = PBXGroup;
+			children = (
+				08FB77AEFE84172EC02AAC07 /* Sources */,
+				610FB77116613730002FB2A7 /* Extras */,
+				32C88DFF0371C24200C91783 /* Other Sources */,
+				0867D69AFE84028FC02AAC07 /* Frameworks */,
+				034768DFFF38A50411DB9C8B /* Products */,
+			);
+			name = Physfs;
+			sourceTree = "<group>";
+		};
+		0867D69AFE84028FC02AAC07 /* Frameworks */ = {
+			isa = PBXGroup;
+			children = (
+				AACBBE490F95108600F1A2B1 /* Foundation.framework */,
+			);
+			name = Frameworks;
+			sourceTree = "<group>";
+		};
+		08FB77AEFE84172EC02AAC07 /* Sources */ = {
+			isa = PBXGroup;
+			children = (
+				610FB77916613776002FB2A7 /* archiver_dir.c */,
+				610FB77A16613776002FB2A7 /* archiver_grp.c */,
+				610FB77B16613776002FB2A7 /* archiver_hog.c */,
+				610FB77C16613776002FB2A7 /* archiver_iso9660.c */,
+				610FB77D16613776002FB2A7 /* archiver_lzma.c */,
+				610FB77E16613776002FB2A7 /* archiver_mvl.c */,
+				610FB77F16613776002FB2A7 /* archiver_qpak.c */,
+				610FB78016613776002FB2A7 /* archiver_unpacked.c */,
+				610FB78116613776002FB2A7 /* archiver_wad.c */,
+				610FB78216613776002FB2A7 /* archiver_zip.c */,
+				610FB78316613776002FB2A7 /* physfs_byteorder.c */,
+				610FB78416613776002FB2A7 /* physfs_casefolding.h */,
+				610FB78516613776002FB2A7 /* physfs_internal.h */,
+				610FB78616613776002FB2A7 /* physfs_miniz.h */,
+				610FB78716613776002FB2A7 /* physfs_platforms.h */,
+				610FB78816613776002FB2A7 /* physfs_unicode.c */,
+				610FB78916613776002FB2A7 /* physfs.c */,
+				610FB78A16613776002FB2A7 /* physfs.h */,
+				610FB78B16613776002FB2A7 /* platform_beos.cpp */,
+				610FB78C16613776002FB2A7 /* platform_macosx.c */,
+				610FB78D16613776002FB2A7 /* platform_posix.c */,
+				610FB78E16613776002FB2A7 /* platform_unix.c */,
+				610FB78F16613776002FB2A7 /* platform_windows.c */,
+			);
+			name = Sources;
+			sourceTree = "<group>";
+		};
+		32C88DFF0371C24200C91783 /* Other Sources */ = {
+			isa = PBXGroup;
+			children = (
+				AA747D9E0F9514B9006C5449 /* Physfs_Prefix.pch */,
+			);
+			name = "Other Sources";
+			sourceTree = "<group>";
+		};
+		610FB77116613730002FB2A7 /* Extras */ = {
+			isa = PBXGroup;
+			children = (
+				610FB7A916613813002FB2A7 /* hwpacksmounter.c */,
+				610FB7AA16613813002FB2A7 /* hwpacksmounter.h */,
+				610FB7AB16613813002FB2A7 /* physfslualoader.c */,
+				610FB7AC16613813002FB2A7 /* physfsrwops.c */,
+				610FB7AD16613813002FB2A7 /* physfsrwops.h */,
+			);
+			name = Extras;
+			sourceTree = "<group>";
+		};
+/* End PBXGroup section */
+
+/* Begin PBXHeadersBuildPhase section */
+		D2AAC07A0554694100DB518D /* Headers */ = {
+			isa = PBXHeadersBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				AA747D9F0F9514B9006C5449 /* Physfs_Prefix.pch in Headers */,
+				610FB79B16613776002FB2A7 /* physfs_casefolding.h in Headers */,
+				610FB79C16613776002FB2A7 /* physfs_internal.h in Headers */,
+				610FB79D16613776002FB2A7 /* physfs_miniz.h in Headers */,
+				610FB79E16613776002FB2A7 /* physfs_platforms.h in Headers */,
+				610FB7A116613776002FB2A7 /* physfs.h in Headers */,
+				610FB7AF16613813002FB2A7 /* hwpacksmounter.h in Headers */,
+				610FB7B216613813002FB2A7 /* physfsrwops.h in Headers */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXHeadersBuildPhase section */
+
+/* Begin PBXNativeTarget section */
+		D2AAC07D0554694100DB518D /* Physfs */ = {
+			isa = PBXNativeTarget;
+			buildConfigurationList = 1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "Physfs" */;
+			buildPhases = (
+				D2AAC07A0554694100DB518D /* Headers */,
+				D2AAC07B0554694100DB518D /* Sources */,
+				D2AAC07C0554694100DB518D /* Frameworks */,
+			);
+			buildRules = (
+			);
+			dependencies = (
+			);
+			name = Physfs;
+			productName = Physfs;
+			productReference = D2AAC07E0554694100DB518D /* libPhysfs.a */;
+			productType = "com.apple.product-type.library.static";
+		};
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+		0867D690FE84028FC02AAC07 /* Project object */ = {
+			isa = PBXProject;
+			buildConfigurationList = 1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Physfs" */;
+			compatibilityVersion = "Xcode 3.1";
+			developmentRegion = English;
+			hasScannedForEncodings = 1;
+			knownRegions = (
+				English,
+				Japanese,
+				French,
+				German,
+			);
+			mainGroup = 0867D691FE84028FC02AAC07 /* Physfs */;
+			productRefGroup = 034768DFFF38A50411DB9C8B /* Products */;
+			projectDirPath = "";
+			projectRoot = "";
+			targets = (
+				D2AAC07D0554694100DB518D /* Physfs */,
+			);
+		};
+/* End PBXProject section */
+
+/* Begin PBXSourcesBuildPhase section */
+		D2AAC07B0554694100DB518D /* Sources */ = {
+			isa = PBXSourcesBuildPhase;
+			buildActionMask = 2147483647;
+			files = (
+				610FB79016613776002FB2A7 /* archiver_dir.c in Sources */,
+				610FB79116613776002FB2A7 /* archiver_grp.c in Sources */,
+				610FB79216613776002FB2A7 /* archiver_hog.c in Sources */,
+				610FB79316613776002FB2A7 /* archiver_iso9660.c in Sources */,
+				610FB79416613776002FB2A7 /* archiver_lzma.c in Sources */,
+				610FB79516613776002FB2A7 /* archiver_mvl.c in Sources */,
+				610FB79616613776002FB2A7 /* archiver_qpak.c in Sources */,
+				610FB79716613776002FB2A7 /* archiver_unpacked.c in Sources */,
+				610FB79816613776002FB2A7 /* archiver_wad.c in Sources */,
+				610FB79916613776002FB2A7 /* archiver_zip.c in Sources */,
+				610FB79A16613776002FB2A7 /* physfs_byteorder.c in Sources */,
+				610FB79F16613776002FB2A7 /* physfs_unicode.c in Sources */,
+				610FB7A016613776002FB2A7 /* physfs.c in Sources */,
+				610FB7A216613776002FB2A7 /* platform_beos.cpp in Sources */,
+				610FB7A316613776002FB2A7 /* platform_macosx.c in Sources */,
+				610FB7A416613776002FB2A7 /* platform_posix.c in Sources */,
+				610FB7A516613776002FB2A7 /* platform_unix.c in Sources */,
+				610FB7A616613776002FB2A7 /* platform_windows.c in Sources */,
+				610FB7AE16613813002FB2A7 /* hwpacksmounter.c in Sources */,
+				610FB7B016613813002FB2A7 /* physfslualoader.c in Sources */,
+				610FB7B116613813002FB2A7 /* physfsrwops.c in Sources */,
+			);
+			runOnlyForDeploymentPostprocessing = 0;
+		};
+/* End PBXSourcesBuildPhase section */
+
+/* Begin XCBuildConfiguration section */
+		1DEB921F08733DC00010E9CD /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+				COPY_PHASE_STRIP = NO;
+				DSTROOT = /tmp/Physfs.dst;
+				GCC_DYNAMIC_NO_PIC = NO;
+				GCC_ENABLE_FIX_AND_CONTINUE = YES;
+				GCC_MODEL_TUNING = G5;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = Physfs_Prefix.pch;
+				INSTALL_PATH = /usr/local/lib;
+				PRODUCT_NAME = Physfs;
+			};
+			name = Debug;
+		};
+		1DEB922008733DC00010E9CD /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+				DSTROOT = /tmp/Physfs.dst;
+				GCC_MODEL_TUNING = G5;
+				GCC_PRECOMPILE_PREFIX_HEADER = YES;
+				GCC_PREFIX_HEADER = Physfs_Prefix.pch;
+				INSTALL_PATH = /usr/local/lib;
+				PRODUCT_NAME = Physfs;
+			};
+			name = Release;
+		};
+		1DEB922308733DC00010E9CD /* Debug */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+				GCC_C_LANGUAGE_STANDARD = c99;
+				GCC_OPTIMIZATION_LEVEL = 0;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				HEADER_SEARCH_PATHS = (
+					"\"$(SRCROOT)/../../liblua\"",
+					"\"$(SRCROOT)/../../../../Library/SDL/include\"",
+				);
+				OTHER_LDFLAGS = "-ObjC";
+				PREBINDING = NO;
+				SDKROOT = iphoneos;
+			};
+			name = Debug;
+		};
+		1DEB922408733DC00010E9CD /* Release */ = {
+			isa = XCBuildConfiguration;
+			buildSettings = {
+				ALWAYS_SEARCH_USER_PATHS = NO;
+				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+				GCC_C_LANGUAGE_STANDARD = c99;
+				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+				GCC_WARN_UNUSED_VARIABLE = YES;
+				HEADER_SEARCH_PATHS = (
+					"\"$(SRCROOT)/../../liblua\"",
+					"\"$(SRCROOT)/../../../../Library/SDL/include\"",
+				);
+				OTHER_LDFLAGS = "-ObjC";
+				PREBINDING = NO;
+				SDKROOT = iphoneos;
+			};
+			name = Release;
+		};
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+		1DEB921E08733DC00010E9CD /* Build configuration list for PBXNativeTarget "Physfs" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1DEB921F08733DC00010E9CD /* Debug */,
+				1DEB922008733DC00010E9CD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+		1DEB922208733DC00010E9CD /* Build configuration list for PBXProject "Physfs" */ = {
+			isa = XCConfigurationList;
+			buildConfigurations = (
+				1DEB922308733DC00010E9CD /* Debug */,
+				1DEB922408733DC00010E9CD /* Release */,
+			);
+			defaultConfigurationIsVisible = 0;
+			defaultConfigurationName = Release;
+		};
+/* End XCConfigurationList section */
+	};
+	rootObject = 0867D690FE84028FC02AAC07 /* Project object */;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/physfs/Xcode/Physfs_Prefix.pch	Mon Nov 26 00:09:54 2012 +0400
@@ -0,0 +1,7 @@
+//
+// Prefix header for all source files of the 'CocoaTouchStaticLibrary' target in the 'CocoaTouchStaticLibrary' project.
+//
+
+#ifdef __OBJC__
+    #import <Foundation/Foundation.h>
+#endif
--- a/misc/physfs/extras/hwpacksmounter.c	Mon Nov 26 00:06:42 2012 +0400
+++ b/misc/physfs/extras/hwpacksmounter.c	Mon Nov 26 00:09:54 2012 +0400
@@ -1,11 +1,10 @@
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
-#include "physfs.h"
 
 #include "hwpacksmounter.h"
 
-void hedgewarsMountPackages()
+PHYSFS_DECL void hedgewarsMountPackages()
 {
     char ** filesList = PHYSFS_enumerateFiles("/");
     char **i;
--- a/misc/physfs/extras/hwpacksmounter.h	Mon Nov 26 00:06:42 2012 +0400
+++ b/misc/physfs/extras/hwpacksmounter.h	Mon Nov 26 00:09:54 2012 +0400
@@ -1,11 +1,13 @@
 #ifndef HEDGEWARS_PACKAGES_MOUNTER_H
 #define HEDGEWARS_PACKAGES_MOUNTER_H
 
+#include "physfs.h"
+
 #ifdef __cplusplus
 extern "C" {
 #endif
 
-void hedgewarsMountPackages();
+PHYSFS_DECL void hedgewarsMountPackages();
 
 
 #ifdef __cplusplus
--- a/misc/physfs/extras/physfslualoader.c	Mon Nov 26 00:06:42 2012 +0400
+++ b/misc/physfs/extras/physfslualoader.c	Mon Nov 26 00:09:54 2012 +0400
@@ -5,7 +5,7 @@
 
 void *physfsReaderBuffer;
 
-const char * physfsReader(lua_State *L, PHYSFS_File *f, size_t *size)
+PHYSFS_DECL const char * physfsReader(lua_State *L, PHYSFS_File *f, size_t *size)
 {
 
     if(PHYSFS_eof(f))
@@ -23,7 +23,7 @@
     }
 }
 
-void physfsReaderSetBuffer(void *buffer)
+PHYSFS_DECL void physfsReaderSetBuffer(void *buffer)
 {
     physfsReaderBuffer = buffer;
 }
--- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj	Mon Nov 26 00:06:42 2012 +0400
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj	Mon Nov 26 00:09:54 2012 +0400
@@ -34,6 +34,8 @@
 		610C8E3714E018D200CF5C4C /* MNEValueTrackingSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 610C8E3614E018D200CF5C4C /* MNEValueTrackingSlider.m */; };
 		610D5FB21270E2660033333A /* Icon-Small@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61F7A43411E290650040BA66 /* Icon-Small@2x.png */; };
 		610D5FB31270E26C0033333A /* Icon@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = 61F7A43611E290650040BA66 /* Icon@2x.png */; };
+		610FB7C81661390E002FB2A7 /* uPhysFSLayer.pas in Sources */ = {isa = PBXBuildFile; fileRef = 610FB7C71661390E002FB2A7 /* uPhysFSLayer.pas */; };
+		610FB81A166139DF002FB2A7 /* libPhysfs.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 610FB7F8166139A4002FB2A7 /* libPhysfs.a */; };
 		61156521147F48B6006729A9 /* About.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61156520147F48B6006729A9 /* About.strings */; };
 		61156523147F48B7006729A9 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61156522147F48B7006729A9 /* Localizable.strings */; };
 		61156525147F48B8006729A9 /* Scheme.strings in Resources */ = {isa = PBXBuildFile; fileRef = 61156524147F48B8006729A9 /* Scheme.strings */; };
@@ -255,6 +257,76 @@
 /* End PBXBuildRule section */
 
 /* Begin PBXContainerItemProxy section */
+		610FB7E116613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 619599BA1364E65900B429B6 /* Freetype.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = D2AAC07D0554694100DB518D /* libFreetype */;
+			remoteInfo = libFreetype;
+		};
+		610FB7E316613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 61A19BF414D20D83004B1E6D /* SDL_net.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = BE48FF6507AFA9A800BB41DA /* Static Library */;
+			remoteInfo = "Static Library";
+		};
+		610FB7E516613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 6195993F1364C82B00B429B6 /* Lua.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = D2AAC07D0554694100DB518D /* libLua */;
+			remoteInfo = libLua;
+		};
+		610FB7E716613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 61A19AE314D2010A004B1E6D /* SDL.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = FD6526620DE8FCCB002AD96B /* libSDL */;
+			remoteInfo = libSDL;
+		};
+		610FB7E916613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 61A19C1E14D20F51004B1E6D /* SDL_mixer.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = BE1FA90707AF96B2004B6283 /* Static Library */;
+			remoteInfo = "Static Library";
+		};
+		610FB7EB16613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 61A19BC114D20CDA004B1E6D /* SDL_ttf.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = BE48FD6807AFA17000BB41DA /* Static Library */;
+			remoteInfo = "Static Library";
+		};
+		610FB7ED16613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 619598181364BCD200B429B6 /* Tremor.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = D2AAC07D0554694100DB518D /* libTremor */;
+			remoteInfo = libTremor;
+		};
+		610FB7EF16613980002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 61A19B6114D20B6C004B1E6D /* SDL_image.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = BE1FA72F07AF4C45004B6283 /* libSDL_image */;
+			remoteInfo = libSDL_image;
+		};
+		610FB7F7166139A4002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */;
+			proxyType = 2;
+			remoteGlobalIDString = D2AAC07E0554694100DB518D /* libPhysfs.a */;
+			remoteInfo = Physfs;
+		};
+		610FB81B166139EC002FB2A7 /* PBXContainerItemProxy */ = {
+			isa = PBXContainerItemProxy;
+			containerPortal = 610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */;
+			proxyType = 1;
+			remoteGlobalIDString = D2AAC07D0554694100DB518D /* Physfs */;
+			remoteInfo = Physfs;
+		};
 		6162456614E6159C00CC97FB /* PBXContainerItemProxy */ = {
 			isa = PBXContainerItemProxy;
 			containerPortal = 619599BA1364E65900B429B6 /* Freetype.xcodeproj */;
@@ -346,6 +418,8 @@
 		610782951440EE5C00645B29 /* gameMods.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = gameMods.plist; path = Resources/gameMods.plist; sourceTree = "<group>"; };
 		610C8E3514E018D200CF5C4C /* MNEValueTrackingSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = MNEValueTrackingSlider.h; path = Classes/MNEValueTrackingSlider.h; sourceTree = "<group>"; };
 		610C8E3614E018D200CF5C4C /* MNEValueTrackingSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MNEValueTrackingSlider.m; path = Classes/MNEValueTrackingSlider.m; sourceTree = "<group>"; };
+		610FB7C71661390E002FB2A7 /* uPhysFSLayer.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uPhysFSLayer.pas; path = ../../hedgewars/uPhysFSLayer.pas; sourceTree = SOURCE_ROOT; };
+		610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = Physfs.xcodeproj; path = ../../misc/physfs/Xcode/Physfs.xcodeproj; sourceTree = SOURCE_ROOT; };
 		6115651A147F48AE006729A9 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = Locale/English.lproj/About.strings; sourceTree = "<group>"; };
 		6115651B147F48AE006729A9 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = Locale/English.lproj/Localizable.strings; sourceTree = "<group>"; };
 		6115651C147F48AE006729A9 /* English */ = {isa = PBXFileReference; fileEncoding = 10; lastKnownFileType = text.plist.strings; name = English; path = Locale/English.lproj/Scheme.strings; sourceTree = "<group>"; };
@@ -649,6 +723,7 @@
 				616245D114E6160200CC97FB /* libFreetype.a in Frameworks */,
 				619599451364C83D00B429B6 /* libLua.a in Frameworks */,
 				6195981F1364BCEF00B429B6 /* libTremor.a in Frameworks */,
+				610FB81A166139DF002FB2A7 /* libPhysfs.a in Frameworks */,
 				61A19AFC14D20170004B1E6D /* libSDL2.a in Frameworks */,
 				61A19B7714D20B7A004B1E6D /* libSDL2_image.a in Frameworks */,
 				61A19C2414D20F5A004B1E6D /* libSDL2_mixer.a in Frameworks */,
@@ -757,6 +832,7 @@
 		29B97323FDCFA39411CA2CEA /* Frameworks */ = {
 			isa = PBXGroup;
 			children = (
+				610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */,
 				619599BA1364E65900B429B6 /* Freetype.xcodeproj */,
 				6195993F1364C82B00B429B6 /* Lua.xcodeproj */,
 				619598181364BCD200B429B6 /* Tremor.xcodeproj */,
@@ -780,6 +856,14 @@
 			name = Frameworks;
 			sourceTree = "<group>";
 		};
+		610FB7F4166139A4002FB2A7 /* Products */ = {
+			isa = PBXGroup;
+			children = (
+				610FB7F8166139A4002FB2A7 /* libPhysfs.a */,
+			);
+			name = Products;
+			sourceTree = "<group>";
+		};
 		61156510147F481B006729A9 /* Locale */ = {
 			isa = PBXGroup;
 			children = (
@@ -1133,6 +1217,7 @@
 		9283015C0F10E48900CC5A3C /* Pascal Sources */ = {
 			isa = PBXGroup;
 			children = (
+				610FB7C71661390E002FB2A7 /* uPhysFSLayer.pas */,
 				619349C5160BAF3E00A08518 /* uAILandMarks.pas */,
 				619349C6160BAF3E00A08518 /* uGearsHandlers.pas */,
 				619349C7160BAF3E00A08518 /* uGearsHandlersRope.pas */,
@@ -1213,6 +1298,15 @@
 			);
 			dependencies = (
 				9283015A0F10E41300CC5A3C /* PBXTargetDependency */,
+				610FB7E216613980002FB2A7 /* PBXTargetDependency */,
+				610FB7E416613980002FB2A7 /* PBXTargetDependency */,
+				610FB7E616613980002FB2A7 /* PBXTargetDependency */,
+				610FB7E816613980002FB2A7 /* PBXTargetDependency */,
+				610FB7EA16613980002FB2A7 /* PBXTargetDependency */,
+				610FB7EC16613980002FB2A7 /* PBXTargetDependency */,
+				610FB7EE16613980002FB2A7 /* PBXTargetDependency */,
+				610FB7F016613980002FB2A7 /* PBXTargetDependency */,
+				610FB81C166139EC002FB2A7 /* PBXTargetDependency */,
 			);
 			name = Hedgewars;
 			productName = HedgewarsMobile;
@@ -1273,6 +1367,10 @@
 					ProjectRef = 6195993F1364C82B00B429B6 /* Lua.xcodeproj */;
 				},
 				{
+					ProductGroup = 610FB7F4166139A4002FB2A7 /* Products */;
+					ProjectRef = 610FB7F3166139A4002FB2A7 /* Physfs.xcodeproj */;
+				},
+				{
 					ProductGroup = 61A19AE414D2010A004B1E6D /* Products */;
 					ProjectRef = 61A19AE314D2010A004B1E6D /* SDL.xcodeproj */;
 				},
@@ -1307,6 +1405,13 @@
 /* End PBXProject section */
 
 /* Begin PBXReferenceProxy section */
+		610FB7F8166139A4002FB2A7 /* libPhysfs.a */ = {
+			isa = PBXReferenceProxy;
+			fileType = archive.ar;
+			path = libPhysfs.a;
+			remoteRef = 610FB7F7166139A4002FB2A7 /* PBXContainerItemProxy */;
+			sourceTree = BUILT_PRODUCTS_DIR;
+		};
 		6162456714E6159C00CC97FB /* libFreetype.a */ = {
 			isa = PBXReferenceProxy;
 			fileType = archive.ar;
@@ -1647,12 +1752,58 @@
 				619349C8160BAF3E00A08518 /* uAILandMarks.pas in Sources */,
 				619349C9160BAF3E00A08518 /* uGearsHandlers.pas in Sources */,
 				619349CA160BAF3E00A08518 /* uGearsHandlersRope.pas in Sources */,
+				610FB7C81661390E002FB2A7 /* uPhysFSLayer.pas in Sources */,
 			);
 			runOnlyForDeploymentPostprocessing = 0;
 		};
 /* End PBXSourcesBuildPhase section */
 
 /* Begin PBXTargetDependency section */
+		610FB7E216613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = libFreetype;
+			targetProxy = 610FB7E116613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7E416613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "Static Library";
+			targetProxy = 610FB7E316613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7E616613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = libLua;
+			targetProxy = 610FB7E516613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7E816613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = libSDL;
+			targetProxy = 610FB7E716613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7EA16613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "Static Library";
+			targetProxy = 610FB7E916613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7EC16613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = "Static Library";
+			targetProxy = 610FB7EB16613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7EE16613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = libTremor;
+			targetProxy = 610FB7ED16613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB7F016613980002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = libSDL_image;
+			targetProxy = 610FB7EF16613980002FB2A7 /* PBXContainerItemProxy */;
+		};
+		610FB81C166139EC002FB2A7 /* PBXTargetDependency */ = {
+			isa = PBXTargetDependency;
+			name = Physfs;
+			targetProxy = 610FB81B166139EC002FB2A7 /* PBXContainerItemProxy */;
+		};
 		9283015A0F10E41300CC5A3C /* PBXTargetDependency */ = {
 			isa = PBXTargetDependency;
 			target = 928301160F10CAFC00CC5A3C /* fpc */;
--- a/share/CMakeLists.txt	Mon Nov 26 00:06:42 2012 +0400
+++ b/share/CMakeLists.txt	Mon Nov 26 00:09:54 2012 +0400
@@ -1,28 +1,23 @@
 add_subdirectory(hedgewars)
 
 IF(APPLE OR CROSSAPPLE)
-	#needed for CFBundleVersion and CFBundleShortVersionString
-	FIND_PROGRAM(HGCOMMAND hg)
-	IF (HGCOMMAND AND (EXISTS ${hedgewars_SOURCE_DIR}/.hg))
-            execute_process(COMMAND ${HGCOMMAND} identify -in
-                            WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
-                            OUTPUT_VARIABLE internal_version
-                            ERROR_QUIET
-                        )
-		STRING(REGEX REPLACE "([0-9]+)(.*)" "\\1" revision_number ${internal_version})
-		set (HEDGEWARS_REVISION ${revision_number})
-	ELSE ()
-		set (HEDGEWARS_REVISION ${HEDGEWARS_VERSION})
-	ENDIF ()
+    #needed for CFBundleVersion and CFBundleShortVersionString
+        #should reuse the variables set in main CMakeLists.txt
+    IF(HGCOMMAND AND (EXISTS ${CMAKE_SOURCE_DIR}/.hg))
+        set(HEDGEWARS_REVISION ${revision_number})
+    ELSE()
+        set(HEDGEWARS_REVISION ${HEDGEWARS_VERSION})
+    ENDIF()
 
-	configure_file(${hedgewars_SOURCE_DIR}/share/Info.plist.in 
-		${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
-	install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/Info.plist"
-		DESTINATION ../)
-	install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/Icon.icns"
-		DESTINATION ../Resources/)
-	install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/hwico.icns"
-		DESTINATION ../Resources/)
-	install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/dsa_pub.pem"
-		DESTINATION ../Resources/)
+    configure_file(${hedgewars_SOURCE_DIR}/share/Info.plist.in
+                   ${CMAKE_CURRENT_BINARY_DIR}/Info.plist)
+    #path here should be Hedgewars.app/Contents/MacOS
+    install(PROGRAMS "${CMAKE_CURRENT_BINARY_DIR}/Info.plist"
+            DESTINATION ../)
+    install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/Icon.icns"
+            DESTINATION ../Resources/)
+    install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/hwico.icns"
+            DESTINATION ../Resources/)
+    install(PROGRAMS "${hedgewars_SOURCE_DIR}/share/dsa_pub.pem"
+            DESTINATION ../Resources/)
 ENDIF(APPLE OR CROSSAPPLE)