diff -r 0e6fadf81a2c -r c247346d296f QTfrontend/team.cpp --- a/QTfrontend/team.cpp Sun Nov 25 01:13:51 2012 +0400 +++ b/QTfrontend/team.cpp Sun Nov 25 22:17:11 2012 +0400 @@ -29,119 +29,91 @@ #include "hwform.h" #include "DataManager.h" -HWTeam::HWTeam(const QString & teamname) : - QObject(0) - , m_difficulty(0) - , m_numHedgehogs(4) - , m_isNetTeam(false) - , m_team(NULL) +HWTeam::HWTeam(const QString & teamname, QObject *parent) : + QObject(parent) { - m_name = teamname; - OldTeamName = m_name; + flib_team team; + bzero(&team, sizeof(team)); + team.name = teamname.toUtf8().data(); + team.grave = "Statue"; + team.fort = "Plane"; + team.voicepack = "Default"; + team.flag = "hedgewars"; + for (int i = 0; i < HEDGEHOGS_PER_TEAM; i++) { - m_hedgehogs.append(HWHog()); - m_hedgehogs[i].Name = (QLineEdit::tr("hedgehog %1").arg(i+1)); - m_hedgehogs[i].Hat = "NoHat"; + team.hogs[i].name = QLineEdit::tr("hedgehog %1").arg(i+1).toUtf8().data(); + team.hogs[i].hat = "NoHat"; } - m_grave = "Statue"; - m_fort = "Plane"; - m_voicepack = "Default"; - m_flag = "hedgewars"; + + m_oldTeamName = teamname; + + QVector binds(BINDS_NUMBER); for(int i = 0; i < BINDS_NUMBER; i++) { - m_binds.append(BindAction()); - m_binds[i].action = cbinds[i].action; - m_binds[i].strbind = cbinds[i].strbind; + binds[i].action = cbinds[i].action.toUtf8().data(); + binds[i].binding = cbinds[i].strbind.toUtf8().data(); } - m_rounds = 0; - m_wins = 0; - m_campaignProgress = 0; - m_color = 0; + team.bindings = binds.data(); + team.bindingCount = binds.size(); + + team.remoteDriven = false; + team.hogsInGame = 4; + + m_team = flib_team_copy(&team); } -HWTeam::HWTeam(const QStringList& strLst) : - QObject(0) - , m_numHedgehogs(4) - , m_isNetTeam(true) - , m_team(NULL) +HWTeam::HWTeam(const QStringList& strLst, QObject *parent) : + QObject(parent) { // net teams are configured from QStringList if(strLst.size() != 23) throw HWTeamConstructException(); - m_name = strLst[0]; - m_grave = strLst[1]; - m_fort = strLst[2]; - m_voicepack = strLst[3]; - m_flag = strLst[4]; - m_owner = strLst[5]; - m_difficulty = strLst[6].toUInt(); - for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) - { - m_hedgehogs.append(HWHog()); - m_hedgehogs[i].Name=strLst[i * 2 + 7]; - m_hedgehogs[i].Hat=strLst[i * 2 + 8]; -// Somehow claymore managed an empty hat. Until we figure out how, this should avoid a repeat -// Checking net teams is probably pointless, but can't hurt. - if (m_hedgehogs[i].Hat.isEmpty()) m_hedgehogs[i].Hat = "NoHat"; - } - m_rounds = 0; - m_wins = 0; - m_campaignProgress = 0; - m_color = 0; -} + flib_team team; + bzero(&team, sizeof(team)); + team.name = strLst[0].toUtf8().data(); + m_oldTeamName = strLst[0]; + team.grave = strLst[1].toUtf8().data(); + team.fort = strLst[2].toUtf8().data(); + team.voicepack = strLst[3].toUtf8().data(); + team.flag = strLst[4].toUtf8().data(); + team.ownerName = strLst[5].toUtf8().data(); + int difficulty = strLst[6].toUInt(); -HWTeam::HWTeam() : - QObject(0) - , 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++) { - m_hedgehogs.append(HWHog()); - m_hedgehogs[i].Name.sprintf("hedgehog %d", i); - m_hedgehogs[i].Hat = "NoHat"; + team.hogs[i].name = strLst[i * 2 + 7].toUtf8().data(); + + QString hat = strLst[i * 2 + 8]; + if (hat.isEmpty()) + team.hogs[i].hat = "NoHat"; + else + team.hogs[i].hat = hat.toUtf8().data(); + + team.hogs[i].difficulty = difficulty; } - m_grave = QString("Simple"); // default - m_fort = QString("Island"); // default - m_voicepack = "Default"; - m_flag = "hedgewars"; + m_oldTeamName = strLst[0]; + QVector binds(BINDS_NUMBER); for(int i = 0; i < BINDS_NUMBER; i++) { - m_binds.append(BindAction()); - m_binds[i].action = cbinds[i].action; - m_binds[i].strbind = cbinds[i].strbind; + binds[i].action = cbinds[i].action.toUtf8().data(); + binds[i].binding = cbinds[i].strbind.toUtf8().data(); } - m_rounds = 0; - m_wins = 0; - m_campaignProgress = 0; - m_color = 0; + team.bindings = binds.data(); + team.bindingCount = binds.size(); + + team.remoteDriven = true; + team.hogsInGame = 4; + + m_team = flib_team_copy(&team); } + HWTeam::HWTeam(const HWTeam & other) : - QObject(0) - , OldTeamName(other.OldTeamName) - , m_name(other.m_name) - , m_grave(other.m_grave) - , m_fort(other.m_fort) - , m_flag(other.m_flag) - , m_voicepack(other.m_voicepack) - , m_hedgehogs(other.m_hedgehogs) - , m_difficulty(other.m_difficulty) - , m_binds(other.m_binds) + QObject(other.parent()) + , m_oldTeamName(other.m_oldTeamName) , m_team(flib_team_copy(other.m_team)) - , m_numHedgehogs(other.m_numHedgehogs) - , m_color(other.m_color) - , m_isNetTeam(other.m_isNetTeam) - , m_owner(other.m_owner) - , m_campaignProgress(other.m_campaignProgress) - , m_rounds(other.m_rounds) - , m_wins(other.m_wins) -// , AchievementProgress(other.AchievementProgress) { } @@ -150,23 +122,8 @@ { if(this != &other) { - OldTeamName = other.OldTeamName; - m_name = other.m_name; - m_grave = other.m_grave; - m_fort = other.m_fort; - m_flag = other.m_flag; - m_voicepack = other.m_voicepack; - m_hedgehogs = other.m_hedgehogs; - m_difficulty = other.m_difficulty; - m_binds = other.m_binds; - m_numHedgehogs = other.m_numHedgehogs; - m_color = other.m_color; - m_isNetTeam = other.m_isNetTeam; - m_owner = other.m_owner; - m_campaignProgress = other.m_campaignProgress; - m_rounds = other.m_rounds; - m_wins = other.m_wins; - m_color = other.m_color; + m_oldTeamName = other.m_oldTeamName; + m_team = flib_team_copy(other.m_team); } return *this; @@ -180,143 +137,59 @@ bool HWTeam::loadFromFile() { + QString name = QString::fromUtf8(m_team->name); + if(m_team) flib_team_destroy(m_team); - m_team = flib_team_from_ini(QString("/config/Teams/%1.hwt").arg(m_name).toUtf8().constData()); + m_team = flib_team_from_ini(QString("/config/Teams/%1.hwt").arg(name).toUtf8().data()); - /* - 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(); - m_grave = teamfile.value("Team/Grave", "Statue").toString(); - m_fort = teamfile.value("Team/Fort", "Plane").toString(); - m_voicepack = teamfile.value("Team/Voicepack", "Default").toString(); - m_flag = teamfile.value("Team/Flag", "hedgewars").toString(); - m_difficulty = teamfile.value("Team/Difficulty", 0).toInt(); - m_rounds = teamfile.value("Team/Rounds", 0).toInt(); - m_wins = teamfile.value("Team/Wins", 0).toInt(); - m_campaignProgress = teamfile.value("Team/CampaignProgress", 0).toInt(); - for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) - { - QString hh = QString("Hedgehog%1/").arg(i); - m_hedgehogs[i].Name = teamfile.value(hh + "Name", QString("hedgehog %1").arg(i+1)).toString(); - m_hedgehogs[i].Hat = teamfile.value(hh + "Hat", "NoHat").toString(); - m_hedgehogs[i].Rounds = teamfile.value(hh + "Rounds", 0).toInt(); - m_hedgehogs[i].Kills = teamfile.value(hh + "Kills", 0).toInt(); - m_hedgehogs[i].Deaths = teamfile.value(hh + "Deaths", 0).toInt(); - m_hedgehogs[i].Suicides = teamfile.value(hh + "Suicides", 0).toInt(); - } - for(int i = 0; i < BINDS_NUMBER; i++) - m_binds[i].strbind = teamfile.value(QString("Binds/%1").arg(m_binds[i].action), cbinds[i].strbind).toString(); - for(int i = 0; i < MAX_ACHIEVEMENTS; i++) - if(achievements[i][0][0]) - AchievementProgress[i] = teamfile.value(QString("Achievements/%1").arg(achievements[i][0]), 0).toUInt(); - else - break;*/ return m_team != NULL; } bool HWTeam::fileExists() { - QFile f(QString("physfs://config/Teams/%1.hwt").arg(m_name)); + QFile f(QString("physfs://config/Teams/%1.hwt").arg(name())); return f.exists(); } bool HWTeam::deleteFile() { - if(m_isNetTeam) + if(m_team->remoteDriven) return false; - QFile cfgfile(QString("physfs://config/Teams/%1.hwt").arg(m_name)); + + QFile cfgfile(QString("physfs://config/Teams/%1.hwt").arg(name())); cfgfile.remove(); return true; } bool HWTeam::saveToFile() { - if (OldTeamName != m_name) + if (m_oldTeamName != name()) { - QFile cfgfile(QString("physfs://config/Teams/%1.hwt").arg(OldTeamName)); + QFile cfgfile(QString("physfs://config/Teams/%1.hwt").arg(m_oldTeamName)); cfgfile.remove(); - OldTeamName = m_name; + m_oldTeamName = name(); } - QSettings teamfile(QString("physfs://config/Teams/%1.hwt").arg(m_name), QSettings::IniFormat, 0); - teamfile.setIniCodec("UTF-8"); - teamfile.setValue("Team/Name", m_name); - teamfile.setValue("Team/Grave", m_grave); - teamfile.setValue("Team/Fort", m_fort); - teamfile.setValue("Team/Voicepack", m_voicepack); - teamfile.setValue("Team/Flag", m_flag); - teamfile.setValue("Team/Difficulty", m_difficulty); - teamfile.setValue("Team/Rounds", m_rounds); - teamfile.setValue("Team/Wins", m_wins); - teamfile.setValue("Team/CampaignProgress", m_campaignProgress); - for(int i = 0; i < HEDGEHOGS_PER_TEAM; i++) - { - QString hh = QString("Hedgehog%1/").arg(i); - teamfile.setValue(hh + "Name", m_hedgehogs[i].Name); - teamfile.setValue(hh + "Hat", m_hedgehogs[i].Hat); - teamfile.setValue(hh + "Rounds", m_hedgehogs[i].Rounds); - teamfile.setValue(hh + "Kills", m_hedgehogs[i].Kills); - teamfile.setValue(hh + "Deaths", m_hedgehogs[i].Deaths); - teamfile.setValue(hh + "Suicides", m_hedgehogs[i].Suicides); - } - for(int i = 0; i < BINDS_NUMBER; i++) - teamfile.setValue(QString("Binds/%1").arg(m_binds[i].action), m_binds[i].strbind); - for(int i = 0; i < MAX_ACHIEVEMENTS; i++) - if(achievements[i][0][0]) - teamfile.setValue(QString("Achievements/%1").arg(achievements[i][0]), AchievementProgress[i]); - else - break; - return true; + + return flib_team_to_ini(QString("physfs://config/Teams/%1.hwt").arg(name()).toUtf8(), m_team) == 0; } -QStringList HWTeam::teamGameConfig(quint32 InitHealth) const -{ - QStringList sl; - if (m_isNetTeam) - { - sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(QString(QCryptographicHash::hash(m_owner.toUtf8(), QCryptographicHash::Md5).toHex()))); - sl.push_back("erdriven"); - } - else sl.push_back(QString("eaddteam %3 %1 %2").arg(qcolor().rgb() & 0xffffff).arg(m_name).arg(playerHash)); - - sl.push_back(QString("egrave " + m_grave)); - sl.push_back(QString("efort " + m_fort)); - sl.push_back(QString("evoicepack " + m_voicepack)); - sl.push_back(QString("eflag " + m_flag)); - - if (!m_isNetTeam) - for(int i = 0; i < BINDS_NUMBER; i++) - if(!m_binds[i].strbind.isEmpty()) - sl.push_back(QString("ebind " + m_binds[i].strbind + " " + m_binds[i].action)); - - for (int t = 0; t < m_numHedgehogs; t++) - { - sl.push_back(QString("eaddhh %1 %2 %3") - .arg(QString::number(m_difficulty), - QString::number(InitHealth), - m_hedgehogs[t].Name)); - sl.push_back(QString("ehat %1") - .arg(m_hedgehogs[t].Hat)); - } - return sl; -} bool HWTeam::isNetTeam() const { - return m_isNetTeam; + return m_team->remoteDriven; } bool HWTeam::operator==(const HWTeam& t1) const { - return m_name==t1.m_name; + return qstrcmp(m_team->name, t1.m_team->name) == 0; } bool HWTeam::operator<(const HWTeam& t1) const { - return m_namename, t1.m_team->name) < 0; // if names are equal - test if it is net team } @@ -326,27 +199,45 @@ // name QString HWTeam::name() const { - return m_name; + return QString::fromUtf8(m_team->name); } + void HWTeam::setName(const QString & name) { - m_name = name; + free(m_team->name); + + m_team->name = qstrdup(name.toUtf8().constData()); +} + +QString HWTeam::hedgehogName(int index) const +{ + return QString::fromUtf8(m_team->hogs[index].name); } -// single hedgehog -const HWHog & HWTeam::hedgehog(unsigned int idx) const +QString HWTeam::hedgehogHat(int index) const { - return m_hedgehogs[idx]; + return QString::fromUtf8(m_team->hogs[index].hat); } -void HWTeam::setHedgehog(unsigned int idx, HWHog hh) + +void HWTeam::setHedgehogName(int index, const QString & name) { - m_hedgehogs[idx] = hh; + free(m_team->hogs[index].name); + + m_team->hogs[index].name = qstrdup(name.toUtf8().constData()); } +void HWTeam::setHedgehogHat(int index, const QString & hat) +{ + free(m_team->hogs[index].hat); + + m_team->hogs[index].hat = qstrdup(hat.toUtf8().constData()); +} + + // owner QString HWTeam::owner() const { - return m_owner; + return QString::fromUtf8(m_team->ownerName); } @@ -354,105 +245,121 @@ // difficulty unsigned int HWTeam::difficulty() const { - return m_difficulty; + return m_team->hogs[0].difficulty; } + void HWTeam::setDifficulty(unsigned int level) { - m_difficulty = level; + for(int i = 0; i < HEDGEHOGS_PER_TEAM; ++i) + m_team->hogs[i].difficulty = level; } // color int HWTeam::color() const { - return m_color; + return m_team->colorIndex; } QColor HWTeam::qcolor() const { - return DataManager::instance().colorsModel()->item(m_color)->data().value(); + return DataManager::instance().colorsModel()->item(m_team->colorIndex)->data().value(); } void HWTeam::setColor(int color) { - m_color = color % DataManager::instance().colorsModel()->rowCount(); + m_team->colorIndex = color % DataManager::instance().colorsModel()->rowCount(); } // binds QString HWTeam::keyBind(unsigned int idx) const { - return m_binds[idx].strbind; + return QString::fromUtf8(m_team->bindings[idx].binding); } + void HWTeam::bindKey(unsigned int idx, const QString & key) { - m_binds[idx].strbind = key; + free(m_team->bindings[idx].binding); + + m_team->bindings[idx].binding = qstrdup(key.toUtf8().constData()); } // flag -void HWTeam::setFlag(const QString & flag) +void HWTeam::setFlag(const QString & flag) { - m_flag = flag; + free(m_team->flag); + + m_team->flag = strdup(flag.toUtf8().constData()); } + QString HWTeam::flag() const { - return m_flag; + return QString::fromUtf8(m_team->flag); } // fort -void HWTeam::setFort(const QString & fort) +void HWTeam::setFort(const QString & fort) { - m_fort = fort; + free(m_team->fort); + + m_team->fort = strdup(fort.toUtf8().constData()); } + QString HWTeam::fort() const { - return m_fort; + return QString::fromUtf8(m_team->fort); } // grave void HWTeam::setGrave(const QString & grave) { - m_grave = grave; + free(m_team->grave); + + m_team->grave = strdup(grave.toUtf8().constData()); } + QString HWTeam::grave() const { - return m_grave; + return QString::fromUtf8(m_team->grave); } // voicepack - getter/setter void HWTeam::setVoicepack(const QString & voicepack) { - m_voicepack = voicepack; + free(m_team->voicepack); + + m_team->voicepack = strdup(voicepack.toUtf8().constData()); } + QString HWTeam::voicepack() const { - return m_voicepack; + return QString::fromUtf8(m_team->voicepack); } // campaignProgress - getter unsigned int HWTeam::campaignProgress() const { - return m_campaignProgress; -}; + return m_team->campaignProgress; +} // amount of hedgehogs unsigned char HWTeam::numHedgehogs() const { - return m_numHedgehogs; + return m_team->hogsInGame; } + void HWTeam::setNumHedgehogs(unsigned char num) { - m_numHedgehogs = num; + m_team->hogsInGame = num; } - - // rounds+wins - incrementors void HWTeam::incRounds() { - m_rounds++; + m_team->rounds++; } void HWTeam::incWins() { - m_wins++; + m_team->wins++; }