# HG changeset patch # User smxx # Date 1271421511 0 # Node ID b18a166e6ca4085f4a1e43269f395bece281c876 # Parent 6289df7747c0e9f579141d77a71f99faf7d93124 Frontend: * Added missing default binds for alternative camera movement (Numpad 2, 4, 6 and 8) * Added new hedgehog structure to teams and added loading/saving of basic stats * Added loading/saving of local achievements to teams (wip; might change/get dropped) diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/CMakeLists.txt --- a/QTfrontend/CMakeLists.txt Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/CMakeLists.txt Fri Apr 16 12:38:31 2010 +0000 @@ -87,6 +87,7 @@ ammoSchemeModel.cpp togglebutton.cpp bgwidget.cpp + achievements.cpp ) #xfire integration diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/achievements.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/achievements.cpp Fri Apr 16 12:38:31 2010 +0000 @@ -0,0 +1,30 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2010 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#include + +#include "achievements.h" + +const char achievements[][5][256] = { + // 5 array members each: id, caption, description, image, required number + //{"rounds1", QT_TRANSLATE_NOOP("achievements", "No complete Newbie!"), QT_TRANSLATE_NOOP("achievements", "Manage to survive %1 games playing on the official server, no matter if it's a draw or win."), "nonewb", 1}, + //{"rounds2", QT_TRANSLATE_NOOP("achievements", "Getting used to it!"), QT_TRANSLATE_NOOP("achievements", "Manage to survive %1 games playing on the official server, no matter if it's a draw or win."), "getused", 25}, + //{"rounds3", QT_TRANSLATE_NOOP("achievements", "Backyard Veteran"), QT_TRANSLATE_NOOP("achievements", "Manage to survive %1 games playing on the official server, no matter if it's a draw or win."), "veteran", 100}, + //{"rounds4", QT_TRANSLATE_NOOP("achievements", "1001 Stories to tell"), QT_TRANSLATE_NOOP("achievements", "Manage to survive %1 games playing on the official server, no matter if it's a draw or win."), "stories", 1001}, + {0, 0, 0, 0, 0} // "terminator" line +}; diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/achievements.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/achievements.h Fri Apr 16 12:38:31 2010 +0000 @@ -0,0 +1,25 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2005-2010 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + */ + +#ifndef ACHIEVEMENTS_H +#define ACHIEVEMENTS_H + +#define MAX_ACHIEVEMENTS 128 +extern const char achievements[][5][256]; + +#endif // ACHIEVEMENTS_H diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/binds.cpp --- a/QTfrontend/binds.cpp Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/binds.cpp Fri Apr 16 12:38:31 2010 +0000 @@ -46,10 +46,10 @@ {"timer 4", "4", QT_TRANSLATE_NOOP("binds", "timer 4 sec"), NULL, NULL}, {"timer 5", "5", QT_TRANSLATE_NOOP("binds", "timer 5 sec"), NULL, NULL}, {"findhh", "h", QT_TRANSLATE_NOOP("binds", "find hedgehog"), QT_TRANSLATE_NOOP("binds (categories)", "Camera and cursor controls"), QT_TRANSLATE_NOOP("binds (descriptions)", "Move the camera to the active hog:")}, - {"+cur_u", "", QT_TRANSLATE_NOOP("binds", "up"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Move the cursor or camera without using the mouse:")}, - {"+cur_l", "", QT_TRANSLATE_NOOP("binds", "left"), NULL, NULL}, - {"+cur_r", "", QT_TRANSLATE_NOOP("binds", "right"), NULL, NULL}, - {"+cur_d", "", QT_TRANSLATE_NOOP("binds", "down"), NULL, NULL}, + {"+cur_u", "[8]", QT_TRANSLATE_NOOP("binds", "up"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Move the cursor or camera without using the mouse:")}, + {"+cur_l", "[4]", QT_TRANSLATE_NOOP("binds", "left"), NULL, NULL}, + {"+cur_r", "[6]", QT_TRANSLATE_NOOP("binds", "right"), NULL, NULL}, + {"+cur_d", "[2]", QT_TRANSLATE_NOOP("binds", "down"), NULL, NULL}, // {"+cur_m", "", QT_TRANSLATE_NOOP("binds", "movement key modifier"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Specify a modifier key to move camera and cursor using your default hog movement keys:")}, {"zoomin", "wheeldown", QT_TRANSLATE_NOOP("binds", "zoom in"), NULL, QT_TRANSLATE_NOOP("binds (descriptions)", "Modify the camera's zoom level:")}, {"zoomout", "wheelup", QT_TRANSLATE_NOOP("binds", "zoom out"), NULL, NULL}, diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/game.cpp --- a/QTfrontend/game.cpp Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/game.cpp Fri Apr 16 12:38:31 2010 +0000 @@ -124,7 +124,7 @@ team2->numHedgehogs = 4; do namegen.TeamRandomNames(team2,TRUE); - while(!team2->TeamName.compare(team1->TeamName) || !team2->HHHat[0].compare(team1->HHHat[0])); + while(!team2->TeamName.compare(team1->TeamName) || !team2->Hedgehogs[0].Hat.compare(team1->Hedgehogs[0].Hat)); HWProto::addStringListToBuffer(teamscfg, team2->TeamGameConfig(100)); diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/namegen.cpp --- a/QTfrontend/namegen.cpp Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/namegen.cpp Fri Apr 16 12:38:31 2010 +0000 @@ -62,7 +62,7 @@ for(int i = 0; i < 8; i++) { if ((TypesHatnames[kind].size()) > 0){ - team->HHHat[i] = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())]; + team->Hedgehogs[i].Hat = TypesHatnames[kind][rand()%(TypesHatnames[kind].size())]; } RandomNameByHat(team,i); } @@ -75,12 +75,12 @@ void HWNamegen::RandomNameByHat(HWTeam*& team, const int &i) { QStringList Dictionaries; - HatCfgLoad(team->HHHat[i],Dictionaries); + HatCfgLoad(team->Hedgehogs[i].Hat,Dictionaries); QStringList Dictionary; DictLoad(Dictionaries[rand()%(Dictionaries.size())],Dictionary); - team->HHName[i] = Dictionary[rand()%(Dictionary.size())]; + team->Hedgehogs[i].Name = Dictionary[rand()%(Dictionary.size())]; } void HWNamegen::DictLoad(const QString filename, QStringList &list) diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/newnetclient.cpp --- a/QTfrontend/newnetclient.cpp Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/newnetclient.cpp Fri Apr 16 12:38:31 2010 +0000 @@ -122,9 +122,9 @@ for(int i = 0; i < 8; ++i) { cmd.append(delimeter); - cmd.append(team.HHName[i]); + cmd.append(team.Hedgehogs[i].Name); cmd.append(delimeter); - cmd.append(team.HHHat[i]); + cmd.append(team.Hedgehogs[i].Hat); } RawSendNet(cmd); } diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/team.cpp --- a/QTfrontend/team.cpp Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/team.cpp Fri Apr 16 12:38:31 2010 +0000 @@ -38,8 +38,8 @@ OldTeamName = TeamName; for (int i = 0; i < 8; i++) { - HHName[i].sprintf("hedgehog %d", i); - HHHat[i] = "NoHat"; + Hedgehogs[i].Name.sprintf("hedgehog %d", i); + Hedgehogs[i].Hat = "NoHat"; } Grave = "Statue"; Fort = "Plane"; @@ -67,11 +67,11 @@ difficulty = strLst[6].toUInt(); for(int i = 0; i < 8; i++) { - HHName[i]=strLst[i * 2 + 7]; - HHHat[i]=strLst[i * 2 + 8]; + Hedgehogs[i].Name=strLst[i * 2 + 7]; + 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 (HHHat[i].length() == 0) HHHat[i] = "NoHat"; + if (Hedgehogs[i].Hat.length() == 0) Hedgehogs[i].Hat = "NoHat"; } } @@ -83,8 +83,8 @@ TeamName = QString("Team"); for (int i = 0; i < 8; i++) { - HHName[i].sprintf("hedgehog %d", i); - HHHat[i] = "NoHat"; + Hedgehogs[i].Name.sprintf("hedgehog %d", i); + Hedgehogs[i].Hat = "NoHat"; } Grave = QString("Simple"); // default @@ -113,15 +113,20 @@ for(int i = 0; i < 8; i++) { QString hh = QString("Hedgehog%1/").arg(i); - HHName[i] = teamfile.value(hh + "Name", QString("hedgehog %1").arg(i)).toString(); - HHHat[i] = teamfile.value(hh + "Hat", "NoHat").toString(); - //teamfile.setValue(hh + "Kills", 0); - //teamfile.setValue(hh + "Deaths", 0); - //teamfile.setValue(hh + "Rounds", 0); - //teamfile.setValue(hh + "Suicides", 0); + Hedgehogs[i].Name = teamfile.value(hh + "Name", QString("hedgehog %1").arg(i)).toString(); + Hedgehogs[i].Hat = teamfile.value(hh + "Hat", "NoHat").toString(); + Hedgehogs[i].Rounds = teamfile.value(hh + "Rounds", 0).toInt(); + Hedgehogs[i].Kills = teamfile.value(hh + "Kills", 0).toInt(); + Hedgehogs[i].Deaths = teamfile.value(hh + "Deaths", 0).toInt(); + Hedgehogs[i].Suicides = teamfile.value(hh + "Suicides", 0).toInt(); } for(int i = 0; i < BINDS_NUMBER; i++) binds[i].action = teamfile.value(QString("Binds/%1").arg(binds[i].strbind), cbinds[i].action).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 true; } @@ -153,15 +158,20 @@ for(int i = 0; i < 8; i++) { QString hh = QString("Hedgehog%1/").arg(i); - teamfile.setValue(hh + "Name", HHName[i]); - teamfile.setValue(hh + "Hat", HHHat[i]); - teamfile.setValue(hh + "Kills", 0); - teamfile.setValue(hh + "Deaths", 0); - teamfile.setValue(hh + "Rounds", 0); - teamfile.setValue(hh + "Suicides", 0); + teamfile.setValue(hh + "Name", Hedgehogs[i].Name); + teamfile.setValue(hh + "Hat", Hedgehogs[i].Hat); + teamfile.setValue(hh + "Rounds", Hedgehogs[i].Rounds); + teamfile.setValue(hh + "Kills", Hedgehogs[i].Kills); + teamfile.setValue(hh + "Deaths", Hedgehogs[i].Deaths); + teamfile.setValue(hh + "Suicides", Hedgehogs[i].Suicides); } for(int i = 0; i < BINDS_NUMBER; i++) teamfile.setValue(QString("Binds/%1").arg(binds[i].strbind), binds[i].action); + 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; } @@ -171,11 +181,11 @@ hwform->ui.pageEditTeam->CBTeamLvl->setCurrentIndex(difficulty); for(int i = 0; i < 8; i++) { - hwform->ui.pageEditTeam->HHNameEdit[i]->setText(HHName[i]); - if (HHHat[i].startsWith("Reserved")) - hwform->ui.pageEditTeam->HHHats[i]->setCurrentIndex(hwform->ui.pageEditTeam->HHHats[i]->findData("Reserved "+HHHat[i].remove(0,40), Qt::DisplayRole)); + hwform->ui.pageEditTeam->HHNameEdit[i]->setText(Hedgehogs[i].Name); + if (Hedgehogs[i].Hat.startsWith("Reserved")) + hwform->ui.pageEditTeam->HHHats[i]->setCurrentIndex(hwform->ui.pageEditTeam->HHHats[i]->findData("Reserved "+Hedgehogs[i].Hat.remove(0,40), Qt::DisplayRole)); else - hwform->ui.pageEditTeam->HHHats[i]->setCurrentIndex(hwform->ui.pageEditTeam->HHHats[i]->findData(HHHat[i], Qt::DisplayRole)); + hwform->ui.pageEditTeam->HHHats[i]->setCurrentIndex(hwform->ui.pageEditTeam->HHHats[i]->findData(Hedgehogs[i].Hat, Qt::DisplayRole)); } hwform->ui.pageEditTeam->CBGrave->setCurrentIndex(hwform->ui.pageEditTeam->CBGrave->findText(Grave)); hwform->ui.pageEditTeam->CBFlag->setCurrentIndex(hwform->ui.pageEditTeam->CBFlag->findText(Flag)); @@ -196,11 +206,11 @@ difficulty = hwform->ui.pageEditTeam->CBTeamLvl->currentIndex(); for(int i = 0; i < 8; i++) { - HHName[i] = hwform->ui.pageEditTeam->HHNameEdit[i]->text(); + Hedgehogs[i].Name = hwform->ui.pageEditTeam->HHNameEdit[i]->text(); if (hwform->ui.pageEditTeam->HHHats[i]->currentText().startsWith("Reserved")) - HHHat[i] = "Reserved"+playerHash+hwform->ui.pageEditTeam->HHHats[i]->currentText().remove(0,9); + Hedgehogs[i].Hat = "Reserved"+playerHash+hwform->ui.pageEditTeam->HHHats[i]->currentText().remove(0,9); else - HHHat[i] = hwform->ui.pageEditTeam->HHHats[i]->currentText(); + Hedgehogs[i].Hat = hwform->ui.pageEditTeam->HHHats[i]->currentText(); } Grave = hwform->ui.pageEditTeam->CBGrave->currentText(); @@ -238,9 +248,9 @@ sl.push_back(QString("eaddhh %1 %2 %3") .arg(QString::number(difficulty), QString::number(InitHealth), - HHName[t])); + Hedgehogs[t].Name)); sl.push_back(QString("ehat %1") - .arg(HHHat[t])); + .arg(Hedgehogs[t].Hat)); } return sl; } diff -r 6289df7747c0 -r b18a166e6ca4 QTfrontend/team.h --- a/QTfrontend/team.h Fri Apr 16 00:02:30 2010 +0000 +++ b/QTfrontend/team.h Fri Apr 16 12:38:31 2010 +0000 @@ -23,6 +23,7 @@ #include #include #include "binds.h" +#include "achievements.h" class HWForm; class GameUIConfig; @@ -31,6 +32,13 @@ { }; +struct HWHog +{ + QString Name; + QString Hat; + int Rounds, Kills, Deaths, Suicides; +}; + class HWTeam { public: @@ -41,13 +49,13 @@ bool isNetTeam() const; QString TeamName; - QString HHName[8]; - QString HHHat[8]; QString Grave; QString Fort; QString Flag; QString Voicepack; QString Owner; + HWHog Hedgehogs[8]; + unsigned int AchievementProgress[MAX_ACHIEVEMENTS]; unsigned int difficulty; BindAction binds[BINDS_NUMBER]; diff -r 6289df7747c0 -r b18a166e6ca4 project_files/hedgewars.pro --- a/project_files/hedgewars.pro Fri Apr 16 00:02:30 2010 +0000 +++ b/project_files/hedgewars.pro Fri Apr 16 12:38:31 2010 +0000 @@ -32,7 +32,8 @@ ../QTfrontend/team.h ../QTfrontend/teamselect.h \ ../QTfrontend/teamselhelper.h ../QTfrontend/togglebutton.h \ ../QTfrontend/ui_hwform.h ../QTfrontend/vertScrollArea.h \ - ../QTfrontend/weaponItem.h ../QTfrontend/xfire.h + ../QTfrontend/weaponItem.h ../QTfrontend/xfire.h \ + ../QTfrontend/achievements.h SOURCES += ../QTfrontend/SDLs.cpp ../QTfrontend/SquareLabel.cpp \ ../QTfrontend/about.cpp ../QTfrontend/ammoSchemeModel.cpp \ @@ -55,6 +56,7 @@ ../QTfrontend/teamselect.cpp ../QTfrontend/teamselhelper.cpp \ ../QTfrontend/togglebutton.cpp ../QTfrontend/ui_hwform.cpp \ ../QTfrontend/vertScrollArea.cpp ../QTfrontend/weaponItem.cpp \ + ../QTfrontend/achievements.cpp win32 { SOURCES += ../QTfrontend/xfire.cpp