- frontlib loads team config via physfs flibqtfrontend
authorunc0rr
Sun, 25 Nov 2012 01:13:51 +0400
branchflibqtfrontend
changeset 8100 0e6fadf81a2c
parent 8097 59a8feebec2c
child 8103 c247346d296f
- frontlib loads team config via physfs - some more work on frontlib port
QTfrontend/CMakeLists.txt
QTfrontend/game.cpp
QTfrontend/game.h
QTfrontend/team.cpp
QTfrontend/team.h
QTfrontend/util/frontlibpoller.cpp
misc/physfs/CMakeLists.txt
misc/physfs/extras/physfsfgets.c
misc/physfs/extras/physfsfgets.h
project_files/frontlib/CMakeLists.txt
project_files/frontlib/iniparser/iniparser.c
project_files/hedgewars.pro
--- a/QTfrontend/CMakeLists.txt	Sat Nov 24 00:07:05 2012 +0400
+++ b/QTfrontend/CMakeLists.txt	Sun Nov 25 01:13:51 2012 +0400
@@ -174,8 +174,8 @@
 
 
 set(HW_LINK_LIBS
+    frontlib
     physfs
-    frontlib
     ${QT_LIBRARIES}
     ${SDL_LIBRARY}
     ${SDLMIXER_LIBRARY}
--- a/QTfrontend/game.cpp	Sat Nov 24 00:07:05 2012 +0400
+++ b/QTfrontend/game.cpp	Sun Nov 25 01:13:51 2012 +0400
@@ -30,16 +30,16 @@
 #include "teamselect.h"
 #include "proto.h"
 #include "campaign.h"
-
-#include <QTextStream>
 #include "ThemeModel.h"
+#include "frontlibpoller.h"
 
 QString training, campaign, campaignScript, campaignTeam; // TODO: Cleaner solution?
 
 HWGame::HWGame(GameUIConfig * config, GameCFGWidget * gamecfg, QString ammo, TeamSelWidget* pTeamSelWidget) :
-    TCPBase(0),
-    ammostr(ammo),
-    m_pTeamSelWidget(pTeamSelWidget)
+    TCPBase(0)
+    , ammostr(ammo)
+    , m_pTeamSelWidget(pTeamSelWidget)
+    , m_conn(NULL)
 {
     this->config = config;
     this->gamecfg = gamecfg;
@@ -49,6 +49,9 @@
 HWGame::~HWGame()
 {
     SetGameState(gsDestroyed);
+
+    if(m_conn)
+        flib_gameconn_destroy(m_conn);
 }
 
 void HWGame::onClientDisconnect()
@@ -318,7 +321,7 @@
     arguments << QString::number(resolution.width());
     arguments << QString::number(resolution.height());
     arguments << QString::number(config->bitDepth()); // bpp
-    //arguments << QString("%1").arg(ipc_port);
+    arguments << QString::number(flib_gameconn_getport(m_conn));
     arguments << (config->vid_Fullscreen() ? "1" : "0");
     arguments << (config->isSoundEnabled() ? "1" : "0");
     arguments << (config->isMusicEnabled() ? "1" : "0");
@@ -372,8 +375,27 @@
 
 void HWGame::StartQuick()
 {
+    ThemeModel * themeModel = DataManager::instance().themeModel();
     gameType = gtQLocal;
-    //demo.clear();
+/*
+typedef struct {
+    char *style;				// e.g. "Capture the Flag"
+    flib_scheme *gamescheme;
+    flib_map *map;
+    flib_teamlist *teamlist;
+} flib_gamesetup;
+ */
+    flib_gamesetup gameSetup;
+    gameSetup.style = NULL;
+    gameSetup.gamescheme = flib_scheme_create("Default");
+    gameSetup.map = flib_map_create_regular(
+                QUuid::createUuid().toByteArray().constData()
+                , themeModel->rowCount() > 0 ? themeModel->index(rand() % themeModel->rowCount()).data().toString().toUtf8().constData() : "Sheep"
+                , 3);
+    gameSetup.teamlist = flib_teamlist_create();
+
+    m_conn = flib_gameconn_create(config->netNick().toUtf8().constData(), &gameSetup, false);
+
     start(false);
     SetGameState(gsStarted);
 }
@@ -442,5 +464,5 @@
 
 void HWGame::onEngineStart()
 {
-
+    new FrontLibPoller((void (*)(void *))flib_gameconn_tick, m_conn, this);
 }
--- a/QTfrontend/game.h	Sat Nov 24 00:07:05 2012 +0400
+++ b/QTfrontend/game.h	Sun Nov 25 01:13:51 2012 +0400
@@ -24,6 +24,7 @@
 #include "namegen.h"
 
 #include "tcpBase.h"
+#include "frontlib.h"
 
 class GameUIConfig;
 class GameCFGWidget;
@@ -104,6 +105,8 @@
         TeamSelWidget* m_pTeamSelWidget;
         GameType gameType;
 
+        flib_gameconn * m_conn;
+
         void commonConfig();
         void SendConfig();
         void SendQuickConfig();
--- a/QTfrontend/team.cpp	Sat Nov 24 00:07:05 2012 +0400
+++ b/QTfrontend/team.cpp	Sun Nov 25 01:13:51 2012 +0400
@@ -23,6 +23,7 @@
 #include <QCryptographicHash>
 #include <QSettings>
 #include <QStandardItemModel>
+#include <QDebug>
 
 #include "team.h"
 #include "hwform.h"
@@ -33,6 +34,7 @@
     , m_difficulty(0)
     , m_numHedgehogs(4)
     , m_isNetTeam(false)
+    , m_team(NULL)
 {
     m_name = teamname;
     OldTeamName = m_name;
@@ -62,6 +64,7 @@
     QObject(0)
     , m_numHedgehogs(4)
     , m_isNetTeam(true)
+    , m_team(NULL)
 {
     // net teams are configured from QStringList
     if(strLst.size() != 23) throw HWTeamConstructException();
@@ -92,6 +95,7 @@
     , m_difficulty(0)
     , m_numHedgehogs(4)
     , m_isNetTeam(false)
+    , m_team(NULL)
 {
     m_name = QString("Team");
     for (int i = 0; i < HEDGEHOGS_PER_TEAM; i++)
@@ -129,6 +133,7 @@
     , m_hedgehogs(other.m_hedgehogs)
     , m_difficulty(other.m_difficulty)
     , m_binds(other.m_binds)
+    , m_team(flib_team_copy(other.m_team))
     , m_numHedgehogs(other.m_numHedgehogs)
     , m_color(other.m_color)
     , m_isNetTeam(other.m_isNetTeam)
@@ -167,8 +172,20 @@
     return *this;
 }
 
+HWTeam::~HWTeam()
+{
+    if(m_team)
+        flib_team_destroy(m_team);
+}
+
 bool HWTeam::loadFromFile()
 {
+    if(m_team)
+        flib_team_destroy(m_team);
+
+    m_team = flib_team_from_ini(QString("/config/Teams/%1.hwt").arg(m_name).toUtf8().constData());
+
+    /*
     QSettings teamfile(QString("physfs://config/Teams/%1.hwt").arg(m_name), QSettings::IniFormat, 0);
     teamfile.setIniCodec("UTF-8");
     m_name = teamfile.value("Team/Name", m_name).toString();
@@ -196,8 +213,8 @@
         if(achievements[i][0][0])
             AchievementProgress[i] = teamfile.value(QString("Achievements/%1").arg(achievements[i][0]), 0).toUInt();
         else
-            break;
-    return true;
+            break;*/
+    return m_team != NULL;
 }
 
 bool HWTeam::fileExists()
--- a/QTfrontend/team.h	Sat Nov 24 00:07:05 2012 +0400
+++ b/QTfrontend/team.h	Sun Nov 25 01:13:51 2012 +0400
@@ -25,6 +25,7 @@
 #include "binds.h"
 #include "achievements.h"
 #include "hwconsts.h"
+#include "frontlib.h"
 
 class HWForm;
 class GameUIConfig;
@@ -53,6 +54,7 @@
         HWTeam(const QStringList& strLst);
         HWTeam();
         HWTeam(const HWTeam & other);
+        ~HWTeam();
 
         // file operations
         static HWTeam loadFromFile(const QString & teamName);
@@ -117,6 +119,8 @@
         quint8 m_difficulty;
         QList<BindAction> m_binds;
 
+        flib_team * m_team;
+
         // class members that contain info for the current game setup
         quint8 m_numHedgehogs;
         int m_color;
--- a/QTfrontend/util/frontlibpoller.cpp	Sat Nov 24 00:07:05 2012 +0400
+++ b/QTfrontend/util/frontlibpoller.cpp	Sun Nov 25 01:13:51 2012 +0400
@@ -8,7 +8,8 @@
     m_poll = poll;
     m_data = data;
 
-    m_timer.start(50, this);
+    if(m_data)
+        m_timer.start(50, this);
 }
 
 void FrontLibPoller::timerEvent(QTimerEvent *event)
--- a/misc/physfs/CMakeLists.txt	Sat Nov 24 00:07:05 2012 +0400
+++ b/misc/physfs/CMakeLists.txt	Sun Nov 25 01:13:51 2012 +0400
@@ -141,6 +141,7 @@
     extras/physfsrwops.c
     extras/physfslualoader.c
     extras/hwpacksmounter.c
+    extras/physfsfgets.c
     ${PHYSFS_BEOS_SRCS}
 )
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/physfs/extras/physfsfgets.c	Sun Nov 25 01:13:51 2012 +0400
@@ -0,0 +1,27 @@
+#include <stdlib.h>
+
+#include "physfsfgets.h"
+
+char * PHYSFS_fgets(char * str, int size, PHYSFS_file * f)
+{
+    int i = 0;
+    char c;
+
+    if(size <= 0 || PHYSFS_eof(f))
+        return NULL;
+
+    do
+    {
+        if (PHYSFS_readBytes(f, &c, 1) < 1)
+            break;
+
+        str[i] = c;
+        ++i;
+    } while(c != '\n' && i < size - 1);
+
+    str[i] = '\0';
+    if (i == 0)
+        return NULL;
+    else
+        return str;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/misc/physfs/extras/physfsfgets.h	Sun Nov 25 01:13:51 2012 +0400
@@ -0,0 +1,17 @@
+#ifndef PHYSFS_FGETS_H
+#define PHYSFS_FGETS_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "physfs.h"
+
+char * PHYSFS_fgets(char * str, int size, PHYSFS_file * f);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
--- a/project_files/frontlib/CMakeLists.txt	Sat Nov 24 00:07:05 2012 +0400
+++ b/project_files/frontlib/CMakeLists.txt	Sun Nov 25 01:13:51 2012 +0400
@@ -7,6 +7,7 @@
 file(GLOB frontlib_src
         *.c *.h
         base64/*.c base64/*.h
+        iniparser/*.c iniparser/*.h
         ipc/*.c ipc/*.h
         md5/*.c md5/*.h
         model/*.c model/*.h
@@ -17,5 +18,7 @@
 include_directories(${SDL_INCLUDE_DIR})
 include_directories(${SDLNET_INCLUDE_DIR})
 include_directories(${ZLIB_INCLUDE_DIR})
+include_directories(${CMAKE_SOURCE_DIR}/misc/physfs/src)
+include_directories(${CMAKE_SOURCE_DIR}/misc/physfs/extras)
 
 add_library(frontlib STATIC ${frontlib_src})
--- a/project_files/frontlib/iniparser/iniparser.c	Sat Nov 24 00:07:05 2012 +0400
+++ b/project_files/frontlib/iniparser/iniparser.c	Sun Nov 25 01:13:51 2012 +0400
@@ -9,6 +9,8 @@
 /*---------------------------- Includes ------------------------------------*/
 #include <ctype.h>
 #include "iniparser.h"
+#include "physfs.h"
+#include "physfsfgets.h"
 
 /*---------------------------- Defines -------------------------------------*/
 #define ASCIILINESZ         (1024)
@@ -628,7 +630,7 @@
 /*--------------------------------------------------------------------------*/
 dictionary * iniparser_load(const char * ininame)
 {
-    FILE * in ;
+    PHYSFS_File * in ;
 
     char line    [ASCIILINESZ+1] ;
     char section [ASCIILINESZ+1] ;
@@ -643,14 +645,14 @@
 
     dictionary * dict ;
 
-    if ((in=fopen(ininame, "r"))==NULL) {
+    if ((in = PHYSFS_openRead(ininame))==NULL) {
         fprintf(stderr, "iniparser: cannot open %s\n", ininame);
         return NULL ;
     }
 
     dict = dictionary_new(0) ;
     if (!dict) {
-        fclose(in);
+        PHYSFS_close(in);
         return NULL ;
     }
 
@@ -660,7 +662,7 @@
     memset(val,     0, ASCIILINESZ);
     last=0 ;
 
-    while (fgets(line+last, ASCIILINESZ-last, in)!=NULL) {
+    while (PHYSFS_fgets(line+last, ASCIILINESZ-last, in)!=NULL) {
         lineno++ ;
         len = (int)strlen(line)-1;
         if (len==0)
@@ -672,7 +674,7 @@
                     ininame,
                     lineno);
             dictionary_del(dict);
-            fclose(in);
+            PHYSFS_close(in);
             return NULL ;
         }
         /* Get rid of \n and spaces at end of line */
@@ -725,7 +727,7 @@
         dictionary_del(dict);
         dict = NULL ;
     }
-    fclose(in);
+    PHYSFS_close(in);
     return dict ;
 }
 
--- a/project_files/hedgewars.pro	Sat Nov 24 00:07:05 2012 +0400
+++ b/project_files/hedgewars.pro	Sun Nov 25 01:13:51 2012 +0400
@@ -236,7 +236,7 @@
 
 RESOURCES += ../QTfrontend/hedgewars.qrc
 
-LIBS += -L../bin -lphysfs -lfrontlib
+LIBS += -L../bin -lfrontlib -lphysfs
 
 macx {
     QMAKE_MACOSX_DEPLOYMENT_TARGET = 10.6