Merge
authorMedo <smaxein@googlemail.com>
Sat, 18 Aug 2012 00:48:09 +0200
changeset 7550 3c4b4cb40f40
parent 7508 763d3961400b (current diff)
parent 7548 c7a21fc530de (diff)
child 7552 1209e1c3c620
Merge
--- a/QTfrontend/gameuiconfig.cpp	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/gameuiconfig.cpp	Sat Aug 18 00:48:09 2012 +0200
@@ -22,6 +22,7 @@
 #include <QDesktopWidget>
 #include <QInputDialog>
 #include <QCryptographicHash>
+#include <QStandardItemModel>
 
 #include "gameuiconfig.h"
 #include "hwform.h"
@@ -30,6 +31,7 @@
 #include "hwconsts.h"
 #include "fpsedit.h"
 #include "HWApplication.h"
+#include "DataManager.h"
 
 GameUIConfig::GameUIConfig(HWForm * FormWidgets, const QString & fileName)
     : QSettings(fileName, QSettings::IniFormat)
@@ -108,6 +110,12 @@
     depth = HWApplication::desktop()->depth();
     if (depth < 16) depth = 16;
     else if (depth > 16) depth = 32;
+
+    { // load colors
+        QStandardItemModel * model = DataManager::instance().colorsModel();
+        for(int i = model->rowCount() - 1; i >= 0; --i)
+            model->item(i)->setData(QColor(value(QString("colors/color%1").arg(i), model->item(i)->data().value<QColor>()).value<QColor>()));
+    }
 }
 
 QStringList GameUIConfig::GetTeamsList()
@@ -182,6 +190,13 @@
 #ifdef SPARKLE_ENABLED
     setValue("misc/autoUpdate", isAutoUpdateEnabled());
 #endif
+
+    { // save colors
+        QStandardItemModel * model = DataManager::instance().colorsModel();
+        for(int i = model->rowCount() - 1; i >= 0; --i)
+            setValue(QString("colors/color%1").arg(i), model->item(i)->data());
+    }
+
     Form->gameSettings->sync();
 }
 
--- a/QTfrontend/net/newnetclient.cpp	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/net/newnetclient.cpp	Sat Aug 18 00:48:09 2012 +0200
@@ -384,38 +384,6 @@
         return;
     }
 
-    if (lst[0] == "ADD_TEAM")
-    {
-        if(lst.size() != 24)
-        {
-            qWarning("Net: Bad ADDTEAM message");
-            return;
-        }
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        emit AddNetTeam(tmp);
-        return;
-    }
-
-    if (lst[0] == "REMOVE_TEAM")
-    {
-        if(lst.size() != 2)
-        {
-            qWarning("Net: Bad REMOVETEAM message");
-            return;
-        }
-        emit RemoveNetTeam(HWTeam(lst[1]));
-        return;
-    }
-
-    if(lst[0] == "ROOMABANDONED")
-    {
-        netClientState = InLobby;
-        askRoomsList();
-        emit LeftRoom(tr("Room destroyed"));
-        return;
-    }
-
     if(lst[0] == "KICKED")
     {
         netClientState = InLobby;
@@ -424,31 +392,6 @@
         return;
     }
 
-    if(lst[0] == "JOINED")
-    {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad JOINED message");
-            return;
-        }
-
-        for(int i = 1; i < lst.size(); ++i)
-        {
-            if (lst[i] == mynick)
-            {
-                netClientState = InRoom;
-                emit EnteredGame();
-                emit roomMaster(isChief);
-                if (isChief)
-                    emit configAsked();
-            }
-
-            emit nickAdded(lst[i], isChief && (lst[i] != mynick));
-            emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
-        }
-        return;
-    }
-
     if(lst[0] == "LOBBY:JOINED")
     {
         if(lst.size() < 2)
@@ -472,21 +415,6 @@
         return;
     }
 
-    if(lst[0] == "LEFT")
-    {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad LEFT message");
-            return;
-        }
-        emit nickRemoved(lst[1]);
-        if (lst.size() < 3)
-            emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1]));
-        else
-            emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2]));
-        return;
-    }
-
     if(lst[0] == "ROOM" && lst.size() == 10 && lst[1] == "ADD")
     {
         QStringList tmp = lst;
@@ -529,13 +457,6 @@
         return;
     }
 
-    if (lst[0] == "RUN_GAME")
-    {
-        netClientState = InGame;
-        emit AskForRunGame();
-        return;
-    }
-
     if (lst[0] == "ASKPASSWORD")
     {
         emit AskForPassword(mynick);
@@ -563,76 +484,6 @@
         return;
     }
 
-    if (lst[0] == "TEAM_ACCEPTED")
-    {
-        if (lst.size() != 2)
-        {
-            qWarning("Net: Bad TEAM_ACCEPTED message");
-            return;
-        }
-        emit TeamAccepted(lst[1]);
-        return;
-    }
-
-
-    if (lst[0] == "CFG")
-    {
-        if(lst.size() < 3)
-        {
-            qWarning("Net: Bad CFG message");
-            return;
-        }
-        QStringList tmp = lst;
-        tmp.removeFirst();
-        tmp.removeFirst();
-        if (lst[1] == "SCHEME")
-            emit netSchemeConfig(tmp);
-        else
-            emit paramChanged(lst[1], tmp);
-        return;
-    }
-
-    if (lst[0] == "HH_NUM")
-    {
-        if (lst.size() != 3)
-        {
-            qWarning("Net: Bad TEAM_ACCEPTED message");
-            return;
-        }
-        HWTeam tmptm(lst[1]);
-        tmptm.setNumHedgehogs(lst[2].toUInt());
-        emit hhnumChanged(tmptm);
-        return;
-    }
-
-    if (lst[0] == "TEAM_COLOR")
-    {
-        if (lst.size() != 3)
-        {
-            qWarning("Net: Bad TEAM_COLOR message");
-            return;
-        }
-        HWTeam tmptm(lst[1]);
-        tmptm.setColor(lst[2].toInt());
-        emit teamColorChanged(tmptm);
-        return;
-    }
-
-    if (lst[0] == "EM")
-    {
-        if(lst.size() < 2)
-        {
-            qWarning("Net: Bad EM message");
-            return;
-        }
-        for(int i = 1; i < lst.size(); ++i)
-        {
-            QByteArray em = QByteArray::fromBase64(lst[i].toAscii());
-            emit FromNet(em);
-        }
-        return;
-    }
-
     if (lst[0] == "BYE")
     {
         if (lst.size() < 2)
@@ -650,26 +501,192 @@
         return;
     }
 
-
     if (lst[0] == "ADMIN_ACCESS")
     {
         emit adminAccess(true);
         return;
     }
 
-    if (lst[0] == "ROOM_CONTROL_ACCESS")
+    if(netClientState == InLobby && lst[0] == "JOINED")
     {
-        if (lst.size() < 2)
+        if(lst.size() < 2 || lst[1] != mynick)
         {
-            qWarning("Net: Bad ROOM_CONTROL_ACCESS message");
+            qWarning("Net: Bad JOINED message");
             return;
         }
-        isChief = (lst[1] != "0");
-        emit roomMaster(isChief);
+
+        for(int i = 1; i < lst.size(); ++i)
+        {
+            if (lst[i] == mynick)
+            {
+                netClientState = InRoom;
+                emit EnteredGame();
+                emit roomMaster(isChief);
+                if (isChief)
+                    emit configAsked();
+            }
+
+            emit nickAdded(lst[i], isChief && (lst[i] != mynick));
+            emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
+        }
         return;
     }
 
-    qWarning() << "Net: Unknown message:" << lst;
+    if(netClientState == InRoom || netClientState == InGame)
+    {
+        if (lst[0] == "EM")
+        {
+            if(lst.size() < 2)
+            {
+                qWarning("Net: Bad EM message");
+                return;
+            }
+            for(int i = 1; i < lst.size(); ++i)
+            {
+                QByteArray em = QByteArray::fromBase64(lst[i].toAscii());
+                emit FromNet(em);
+            }
+            return;
+        }
+
+        if (lst[0] == "ADD_TEAM")
+        {
+            if(lst.size() != 24)
+            {
+                qWarning("Net: Bad ADDTEAM message");
+                return;
+            }
+            QStringList tmp = lst;
+            tmp.removeFirst();
+            emit AddNetTeam(tmp);
+            return;
+        }
+
+        if (lst[0] == "REMOVE_TEAM")
+        {
+            if(lst.size() != 2)
+            {
+                qWarning("Net: Bad REMOVETEAM message");
+                return;
+            }
+            emit RemoveNetTeam(HWTeam(lst[1]));
+            return;
+        }
+
+        if(lst[0] == "ROOMABANDONED")
+        {
+            netClientState = InLobby;
+            askRoomsList();
+            emit LeftRoom(tr("Room destroyed"));
+            return;
+        }
+
+        if (lst[0] == "RUN_GAME")
+        {
+            netClientState = InGame;
+            emit AskForRunGame();
+            return;
+        }
+
+        if (lst[0] == "TEAM_ACCEPTED")
+        {
+            if (lst.size() != 2)
+            {
+                qWarning("Net: Bad TEAM_ACCEPTED message");
+                return;
+            }
+            emit TeamAccepted(lst[1]);
+            return;
+        }
+
+        if (lst[0] == "CFG")
+        {
+            if(lst.size() < 3)
+            {
+                qWarning("Net: Bad CFG message");
+                return;
+            }
+            QStringList tmp = lst;
+            tmp.removeFirst();
+            tmp.removeFirst();
+            if (lst[1] == "SCHEME")
+                emit netSchemeConfig(tmp);
+            else
+                emit paramChanged(lst[1], tmp);
+            return;
+        }
+
+        if (lst[0] == "HH_NUM")
+        {
+            if (lst.size() != 3)
+            {
+                qWarning("Net: Bad TEAM_ACCEPTED message");
+                return;
+            }
+            HWTeam tmptm(lst[1]);
+            tmptm.setNumHedgehogs(lst[2].toUInt());
+            emit hhnumChanged(tmptm);
+            return;
+        }
+
+        if (lst[0] == "TEAM_COLOR")
+        {
+            if (lst.size() != 3)
+            {
+                qWarning("Net: Bad TEAM_COLOR message");
+                return;
+            }
+            HWTeam tmptm(lst[1]);
+            tmptm.setColor(lst[2].toInt());
+            emit teamColorChanged(tmptm);
+            return;
+        }
+
+        if(lst[0] == "JOINED")
+        {
+            if(lst.size() < 2)
+            {
+                qWarning("Net: Bad JOINED message");
+                return;
+            }
+
+            for(int i = 1; i < lst.size(); ++i)
+            {
+                emit nickAdded(lst[i], isChief && (lst[i] != mynick));
+                emit chatStringFromNet(tr("%1 *** %2 has joined the room").arg('\x03').arg(lst[i]));
+            }
+            return;
+        }
+
+        if(lst[0] == "LEFT")
+        {
+            if(lst.size() < 2)
+            {
+                qWarning("Net: Bad LEFT message");
+                return;
+            }
+            emit nickRemoved(lst[1]);
+            if (lst.size() < 3)
+                emit chatStringFromNet(tr("%1 *** %2 has left").arg('\x03').arg(lst[1]));
+            else
+                emit chatStringFromNet(tr("%1 *** %2 has left (%3)").arg('\x03').arg(lst[1], lst[2]));
+            return;
+        }
+
+        if (lst[0] == "ROOM_CONTROL_ACCESS")
+        {
+            if (lst.size() < 2)
+            {
+                qWarning("Net: Bad ROOM_CONTROL_ACCESS message");
+                return;
+            }
+            isChief = (lst[1] != "0");
+            emit roomMaster(isChief);
+            return;
+        }
+    }
+
+    qWarning() << "Net: Unknown message or wrong state:" << lst;
 }
 
 void HWNewNet::onHedgehogsNumChanged(const HWTeam& team)
--- a/QTfrontend/ui/page/pageeditteam.cpp	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/ui/page/pageeditteam.cpp	Sat Aug 18 00:48:09 2012 +0200
@@ -289,6 +289,9 @@
     int idx = list.indexOf("cpu.png");
     if (idx >= 0)
         list.removeAt(idx);
+    idx = list.indexOf("cpu_plain.png");
+    if (idx >= 0)
+        list.removeAt(idx);
     idx = list.indexOf("hedgewars.png");
     if (idx >= 0)
         list.removeAt(idx);
--- a/QTfrontend/ui/page/pageoptions.cpp	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/ui/page/pageoptions.cpp	Sat Aug 18 00:48:09 2012 +0200
@@ -28,368 +28,397 @@
 #include <QTextBrowser>
 #include <QTableWidget>
 #include <QSlider>
+#include <QSignalMapper>
+#include <QColorDialog>
+#include <QStandardItemModel>
 
 #include "pageoptions.h"
 #include "hwconsts.h"
 #include "fpsedit.h"
 #include "igbox.h"
+#include "DataManager.h"
 
 // TODO cleanup
 QLayout * PageOptions::bodyLayoutDefinition()
 {
-    QGridLayout * pageLayout = new QGridLayout();
-    pageLayout->setColumnStretch(0, 100);
-    pageLayout->setColumnStretch(1, 100);
-    pageLayout->setColumnStretch(2, 100);
-    pageLayout->setRowStretch(0, 0);
-    //pageLayout->setRowStretch(1, 100);
-    pageLayout->setRowStretch(2, 0);
-    pageLayout->setContentsMargins(7, 7, 7, 0);
-    pageLayout->setSpacing(0);
+    QVBoxLayout * pageLayout = new QVBoxLayout();
 
+    QTabWidget * tabs = new QTabWidget(this);
+    pageLayout->addWidget(tabs);
+    QWidget * page1 = new QWidget(this);
+    QWidget * page2 = new QWidget(this);
+    tabs->addTab(page1, tr("General"));
+    tabs->addTab(page2, tr("Advanced"));
+
+    { // page 1
+        QGridLayout * page1Layout = new QGridLayout(page1);
+        //gbTBLayout->setMargin(0);
+        page1Layout->setSpacing(0);
+        page1Layout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
 
-    QGroupBox * gbTwoBoxes = new QGroupBox(this);
-    pageLayout->addWidget(gbTwoBoxes, 0, 0, 1, 3);
-    QGridLayout * gbTBLayout = new QGridLayout(gbTwoBoxes);
-    gbTBLayout->setMargin(0);
-    gbTBLayout->setSpacing(0);
-    gbTBLayout->setAlignment(Qt::AlignTop | Qt::AlignLeft);
-
-    QPixmap pmNew(":/res/new.png");
-    QPixmap pmEdit(":/res/edit.png");
-    QPixmap pmDelete(":/res/delete.png");
+        QPixmap pmNew(":/res/new.png");
+        QPixmap pmEdit(":/res/edit.png");
+        QPixmap pmDelete(":/res/delete.png");
 
-    {
-        teamsBox = new IconedGroupBox(this);
-        //teamsBox->setContentTopPadding(0);
-        //teamsBox->setAttribute(Qt::WA_PaintOnScreen, true);
-        teamsBox->setIcon(QIcon(":/res/teamicon.png"));
-        teamsBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-        teamsBox->setTitle(QGroupBox::tr("Teams"));
+        {
+            teamsBox = new IconedGroupBox(this);
+            //teamsBox->setContentTopPadding(0);
+            //teamsBox->setAttribute(Qt::WA_PaintOnScreen, true);
+            teamsBox->setIcon(QIcon(":/res/teamicon.png"));
+            teamsBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            teamsBox->setTitle(QGroupBox::tr("Teams"));
 
-        QGridLayout * GBTlayout = new QGridLayout(teamsBox);
+            QGridLayout * GBTlayout = new QGridLayout(teamsBox);
 
-        CBTeamName = new QComboBox(teamsBox);
-        GBTlayout->addWidget(CBTeamName, 0, 0);
+            CBTeamName = new QComboBox(teamsBox);
+            GBTlayout->addWidget(CBTeamName, 0, 0);
 
-        BtnNewTeam = new QPushButton(teamsBox);
-        BtnNewTeam->setToolTip(tr("New team"));
-        BtnNewTeam->setIconSize(pmNew.size());
-        BtnNewTeam->setIcon(pmNew);
-        BtnNewTeam->setMaximumWidth(pmNew.width() + 6);
-        connect(BtnNewTeam, SIGNAL(clicked()), this, SIGNAL(newTeamRequested()));
-        GBTlayout->addWidget(BtnNewTeam, 0, 1);
+            BtnNewTeam = new QPushButton(teamsBox);
+            BtnNewTeam->setToolTip(tr("New team"));
+            BtnNewTeam->setIconSize(pmNew.size());
+            BtnNewTeam->setIcon(pmNew);
+            BtnNewTeam->setMaximumWidth(pmNew.width() + 6);
+            connect(BtnNewTeam, SIGNAL(clicked()), this, SIGNAL(newTeamRequested()));
+            GBTlayout->addWidget(BtnNewTeam, 0, 1);
 
-        BtnEditTeam = new QPushButton(teamsBox);
-        BtnEditTeam->setToolTip(tr("Edit team"));
-        BtnEditTeam->setIconSize(pmEdit.size());
-        BtnEditTeam->setIcon(pmEdit);
-        BtnEditTeam->setMaximumWidth(pmEdit.width() + 6);
-        connect(BtnEditTeam, SIGNAL(clicked()), this, SLOT(requestEditSelectedTeam()));
-        GBTlayout->addWidget(BtnEditTeam, 0, 2);
+            BtnEditTeam = new QPushButton(teamsBox);
+            BtnEditTeam->setToolTip(tr("Edit team"));
+            BtnEditTeam->setIconSize(pmEdit.size());
+            BtnEditTeam->setIcon(pmEdit);
+            BtnEditTeam->setMaximumWidth(pmEdit.width() + 6);
+            connect(BtnEditTeam, SIGNAL(clicked()), this, SLOT(requestEditSelectedTeam()));
+            GBTlayout->addWidget(BtnEditTeam, 0, 2);
 
-        BtnDeleteTeam = new QPushButton(teamsBox);
-        BtnDeleteTeam->setToolTip(tr("Delete team"));
-        BtnDeleteTeam->setIconSize(pmDelete.size());
-        BtnDeleteTeam->setIcon(pmDelete);
-        BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6);
-        connect(BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(requestDeleteSelectedTeam()));
-        GBTlayout->addWidget(BtnDeleteTeam, 0, 3);
-
-        LblNoEditTeam = new QLabel(teamsBox);
-        LblNoEditTeam->setText(tr("You can't edit teams from team selection. Go back to main menu to add, edit or delete teams."));
-        LblNoEditTeam->setWordWrap(true);
-        LblNoEditTeam->setVisible(false);
-        GBTlayout->addWidget(LblNoEditTeam, 0, 0);
+            BtnDeleteTeam = new QPushButton(teamsBox);
+            BtnDeleteTeam->setToolTip(tr("Delete team"));
+            BtnDeleteTeam->setIconSize(pmDelete.size());
+            BtnDeleteTeam->setIcon(pmDelete);
+            BtnDeleteTeam->setMaximumWidth(pmDelete.width() + 6);
+            connect(BtnDeleteTeam, SIGNAL(clicked()), this, SLOT(requestDeleteSelectedTeam()));
+            GBTlayout->addWidget(BtnDeleteTeam, 0, 3);
 
-        gbTBLayout->addWidget(teamsBox, 0, 0);
-    }
-
-    {
-        IconedGroupBox* groupWeapons = new IconedGroupBox(this);
+            LblNoEditTeam = new QLabel(teamsBox);
+            LblNoEditTeam->setText(tr("You can't edit teams from team selection. Go back to main menu to add, edit or delete teams."));
+            LblNoEditTeam->setWordWrap(true);
+            LblNoEditTeam->setVisible(false);
+            GBTlayout->addWidget(LblNoEditTeam, 0, 0);
 
-        //groupWeapons->setContentTopPadding(0);
-        //groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-        groupWeapons->setIcon(QIcon(":/res/weaponsicon.png"));
-        groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-        groupWeapons->setTitle(QGroupBox::tr("Schemes and Weapons"));
-        QGridLayout * WeaponsLayout = new QGridLayout(groupWeapons);
+            page1Layout->addWidget(teamsBox, 0, 0);
+        }
 
-        QLabel* SchemeLabel = new QLabel(groupWeapons);
-        SchemeLabel->setText(QLabel::tr("Game scheme"));
-        WeaponsLayout->addWidget(SchemeLabel, 1, 0);
+        {
+            IconedGroupBox* groupWeapons = new IconedGroupBox(this);
 
-        SchemesName = new QComboBox(groupWeapons);
-        WeaponsLayout->addWidget(SchemesName, 1, 1);
+            //groupWeapons->setContentTopPadding(0);
+            //groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
+            groupWeapons->setIcon(QIcon(":/res/weaponsicon.png"));
+            groupWeapons->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            groupWeapons->setTitle(QGroupBox::tr("Schemes and Weapons"));
+            QGridLayout * WeaponsLayout = new QGridLayout(groupWeapons);
 
-        SchemeNew = new QPushButton(groupWeapons);
-        SchemeNew->setWhatsThis(tr("New scheme"));
-        SchemeNew->setIconSize(pmNew.size());
-        SchemeNew->setIcon(pmNew);
-        SchemeNew->setMaximumWidth(pmNew.width() + 6);
-        WeaponsLayout->addWidget(SchemeNew, 1, 2);
+            QLabel* SchemeLabel = new QLabel(groupWeapons);
+            SchemeLabel->setText(QLabel::tr("Game scheme"));
+            WeaponsLayout->addWidget(SchemeLabel, 1, 0);
 
-        SchemeEdit = new QPushButton(groupWeapons);
-        SchemeEdit->setWhatsThis(tr("Edit scheme"));
-        SchemeEdit->setIconSize(pmEdit.size());
-        SchemeEdit->setIcon(pmEdit);
-        SchemeEdit->setMaximumWidth(pmEdit.width() + 6);
-        WeaponsLayout->addWidget(SchemeEdit, 1, 3);
+            SchemesName = new QComboBox(groupWeapons);
+            WeaponsLayout->addWidget(SchemesName, 1, 1);
 
-        SchemeDelete = new QPushButton(groupWeapons);
-        SchemeDelete->setWhatsThis(tr("Delete scheme"));
-        SchemeDelete->setIconSize(pmDelete.size());
-        SchemeDelete->setIcon(pmDelete);
-        SchemeDelete->setMaximumWidth(pmDelete.width() + 6);
-        WeaponsLayout->addWidget(SchemeDelete, 1, 4);
+            SchemeNew = new QPushButton(groupWeapons);
+            SchemeNew->setWhatsThis(tr("New scheme"));
+            SchemeNew->setIconSize(pmNew.size());
+            SchemeNew->setIcon(pmNew);
+            SchemeNew->setMaximumWidth(pmNew.width() + 6);
+            WeaponsLayout->addWidget(SchemeNew, 1, 2);
 
-        QLabel* WeaponLabel = new QLabel(groupWeapons);
-        WeaponLabel->setText(QLabel::tr("Weapons"));
-        WeaponsLayout->addWidget(WeaponLabel, 2, 0);
-
-        WeaponsName = new QComboBox(groupWeapons);
-        WeaponsLayout->addWidget(WeaponsName, 2, 1);
-
-        WeaponNew = new QPushButton(groupWeapons);
-        WeaponNew->setWhatsThis(tr("New weapon set"));
-        WeaponNew->setIconSize(pmNew.size());
-        WeaponNew->setIcon(pmNew);
-        WeaponNew->setMaximumWidth(pmNew.width() + 6);
-        WeaponsLayout->addWidget(WeaponNew, 2, 2);
+            SchemeEdit = new QPushButton(groupWeapons);
+            SchemeEdit->setWhatsThis(tr("Edit scheme"));
+            SchemeEdit->setIconSize(pmEdit.size());
+            SchemeEdit->setIcon(pmEdit);
+            SchemeEdit->setMaximumWidth(pmEdit.width() + 6);
+            WeaponsLayout->addWidget(SchemeEdit, 1, 3);
 
-        WeaponEdit = new QPushButton(groupWeapons);
-        WeaponEdit->setWhatsThis(tr("Edit weapon set"));
-        WeaponEdit->setIconSize(pmEdit.size());
-        WeaponEdit->setIcon(pmEdit);
-        WeaponEdit->setMaximumWidth(pmEdit.width() + 6);
-        WeaponsLayout->addWidget(WeaponEdit, 2, 3);
+            SchemeDelete = new QPushButton(groupWeapons);
+            SchemeDelete->setWhatsThis(tr("Delete scheme"));
+            SchemeDelete->setIconSize(pmDelete.size());
+            SchemeDelete->setIcon(pmDelete);
+            SchemeDelete->setMaximumWidth(pmDelete.width() + 6);
+            WeaponsLayout->addWidget(SchemeDelete, 1, 4);
 
-        WeaponDelete = new QPushButton(groupWeapons);
-        WeaponDelete->setWhatsThis(tr("Delete weapon set"));
-        WeaponDelete->setIconSize(pmDelete.size());
-        WeaponDelete->setIcon(pmDelete);
-        WeaponDelete->setMaximumWidth(pmDelete.width() + 6);
-        WeaponsLayout->addWidget(WeaponDelete, 2, 4);
+            QLabel* WeaponLabel = new QLabel(groupWeapons);
+            WeaponLabel->setText(QLabel::tr("Weapons"));
+            WeaponsLayout->addWidget(WeaponLabel, 2, 0);
 
-        WeaponTooltip = new QCheckBox(this);
-        WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips"));
-        WeaponsLayout->addWidget(WeaponTooltip, 3, 0, 1, 4);
-
-        gbTBLayout->addWidget(groupWeapons, 1, 0);
-    }
+            WeaponsName = new QComboBox(groupWeapons);
+            WeaponsLayout->addWidget(WeaponsName, 2, 1);
 
-    {
-        IconedGroupBox* groupMisc = new IconedGroupBox(this);
-        //groupMisc->setContentTopPadding(0);
-        groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding);
-        groupMisc->setIcon(QIcon(":/res/miscicon.png"));
-        //groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-        groupMisc->setTitle(QGroupBox::tr("Misc"));
-        QGridLayout * MiscLayout = new QGridLayout(groupMisc);
+            WeaponNew = new QPushButton(groupWeapons);
+            WeaponNew->setWhatsThis(tr("New weapon set"));
+            WeaponNew->setIconSize(pmNew.size());
+            WeaponNew->setIcon(pmNew);
+            WeaponNew->setMaximumWidth(pmNew.width() + 6);
+            WeaponsLayout->addWidget(WeaponNew, 2, 2);
 
-        // Label for "Language"
-        QLabel *labelLanguage = new QLabel(groupMisc);
-        labelLanguage->setText(QLabel::tr("Locale") + " *");
-        MiscLayout->addWidget(labelLanguage, 0, 0);
+            WeaponEdit = new QPushButton(groupWeapons);
+            WeaponEdit->setWhatsThis(tr("Edit weapon set"));
+            WeaponEdit->setIconSize(pmEdit.size());
+            WeaponEdit->setIcon(pmEdit);
+            WeaponEdit->setMaximumWidth(pmEdit.width() + 6);
+            WeaponsLayout->addWidget(WeaponEdit, 2, 3);
 
-        // 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"));
-        CBLanguage->addItem(QComboBox::tr("(System default)"), QString(""));
-        for(int i = 0; i < locs.count(); i++)
-        {
-            QLocale loc(locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
-            CBLanguage->addItem(QLocale::languageToString(loc.language()) + " (" + QLocale::countryToString(loc.country()) + ")", loc.name());
+            WeaponDelete = new QPushButton(groupWeapons);
+            WeaponDelete->setWhatsThis(tr("Delete weapon set"));
+            WeaponDelete->setIconSize(pmDelete.size());
+            WeaponDelete->setIcon(pmDelete);
+            WeaponDelete->setMaximumWidth(pmDelete.width() + 6);
+            WeaponsLayout->addWidget(WeaponDelete, 2, 4);
+
+            WeaponTooltip = new QCheckBox(this);
+            WeaponTooltip->setText(QCheckBox::tr("Show ammo menu tooltips"));
+            WeaponsLayout->addWidget(WeaponTooltip, 3, 0, 1, 4);
+
+            page1Layout->addWidget(groupWeapons, 1, 0);
         }
 
-        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());
+            IconedGroupBox* groupMisc = new IconedGroupBox(this);
+            //groupMisc->setContentTopPadding(0);
+            groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::MinimumExpanding);
+            groupMisc->setIcon(QIcon(":/res/miscicon.png"));
+            //groupMisc->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            groupMisc->setTitle(QGroupBox::tr("Misc"));
+            QGridLayout * MiscLayout = new QGridLayout(groupMisc);
+
+            // Label for "Language"
+            QLabel *labelLanguage = new QLabel(groupMisc);
+            labelLanguage->setText(QLabel::tr("Locale") + " *");
+            MiscLayout->addWidget(labelLanguage, 0, 0);
+
+            // 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"));
+            CBLanguage->addItem(QComboBox::tr("(System default)"), QString(""));
+            for(int i = 0; i < locs.count(); i++)
+            {
+                QLocale loc(locs[i].replace(QRegExp("hedgewars_(.*)\\.qm"), "\\1"));
+                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
+            labelNN = new QLabel(groupMisc);
+            labelNN->setText(QLabel::tr("Nickname"));
+            MiscLayout->addWidget(labelNN, 1, 0);
+
+            editNetNick = new QLineEdit(groupMisc);
+            editNetNick->setMaxLength(20);
+            editNetNick->setText(QLineEdit::tr("anonymous"));
+            MiscLayout->addWidget(editNetNick, 1, 1);
+
+            // checkbox and field for password
+            CBSavePassword = new QCheckBox(groupMisc);
+            CBSavePassword->setText(QCheckBox::tr("Save password"));
+            MiscLayout->addWidget(CBSavePassword, 2, 0);
+
+            editNetPassword = new QLineEdit(groupMisc);
+            editNetPassword->setEchoMode(QLineEdit::Password);
+            MiscLayout->addWidget(editNetPassword, 2, 1);
+
+            CBNameWithDate = new QCheckBox(groupMisc);
+            CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name"));
+            MiscLayout->addWidget(CBNameWithDate, 5, 0, 1, 2);
+
+            BtnAssociateFiles = new QPushButton(groupMisc);
+            BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions"));
+            BtnAssociateFiles->setVisible(!custom_data && !custom_config);
+            MiscLayout->addWidget(BtnAssociateFiles, 6, 0, 1, 2);
+
+    #ifdef __APPLE__
+    #ifdef SPARKLE_ENABLED
+            CBAutoUpdate = new QCheckBox(groupMisc);
+            CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup"));
+            MiscLayout->addWidget(CBAutoUpdate, 7, 0, 1, 3);
+    #endif
+    #endif
+            page1Layout->addWidget(groupMisc, 2, 0);
         }
 
-        MiscLayout->addWidget(CBLanguage, 0, 1);
+        {
+            AGGroupBox = new IconedGroupBox(this);
+            //AGGroupBox->setContentTopPadding(0);
+            AGGroupBox->setIcon(QIcon(":/res/graphicsicon.png"));
+            //AGGroupBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
+            AGGroupBox->setTitle(QGroupBox::tr("Audio/Graphic options"));
+
+            QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox);
+            QHBoxLayout * GBAreslayout = new QHBoxLayout(0);
+            QHBoxLayout * GBAstereolayout = new QHBoxLayout(0);
+            QHBoxLayout * GBAqualayout = new QHBoxLayout(0);
 
-        // Label and field for net nick
-        labelNN = new QLabel(groupMisc);
-        labelNN->setText(QLabel::tr("Nickname"));
-        MiscLayout->addWidget(labelNN, 1, 0);
+            CBFrontendFullscreen = new QCheckBox(AGGroupBox);
+            CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen"));
+            GBAlayout->addWidget(CBFrontendFullscreen);
+
+            CBFrontendEffects = new QCheckBox(AGGroupBox);
+            CBFrontendEffects->setText(QCheckBox::tr("Frontend effects"));
+            GBAlayout->addWidget(CBFrontendEffects);
+
+            CBEnableFrontendSound = new QCheckBox(AGGroupBox);
+            CBEnableFrontendSound->setText(QCheckBox::tr("Enable frontend sounds"));
+            GBAlayout->addWidget(CBEnableFrontendSound);
+
+            CBEnableFrontendMusic = new QCheckBox(AGGroupBox);
+            CBEnableFrontendMusic->setText(QCheckBox::tr("Enable frontend music"));
+            GBAlayout->addWidget(CBEnableFrontendMusic);
 
-        editNetNick = new QLineEdit(groupMisc);
-        editNetNick->setMaxLength(20);
-        editNetNick->setText(QLineEdit::tr("anonymous"));
-        MiscLayout->addWidget(editNetNick, 1, 1);
+            QFrame * hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            QLabel * resolution = new QLabel(AGGroupBox);
+            resolution->setText(QLabel::tr("Resolution"));
+            GBAreslayout->addWidget(resolution);
+
+            CBResolution = new QComboBox(AGGroupBox);
+            GBAreslayout->addWidget(CBResolution);
+            GBAlayout->addLayout(GBAreslayout);
 
-        // checkbox and field for password
-        CBSavePassword = new QCheckBox(groupMisc);
-        CBSavePassword->setText(QCheckBox::tr("Save password"));
-        MiscLayout->addWidget(CBSavePassword, 2, 0);
+            CBFullscreen = new QCheckBox(AGGroupBox);
+            CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
+            GBAreslayout->addWidget(CBFullscreen);
+
+            QLabel * quality = new QLabel(AGGroupBox);
+            quality->setText(QLabel::tr("Quality"));
+            quality->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
+            GBAqualayout->addWidget(quality);
+
+            SLQuality = new QSlider(Qt::Horizontal, AGGroupBox);
+            SLQuality->setTickPosition(QSlider::TicksBelow);
+            SLQuality->setMaximum(5);
+            SLQuality->setMinimum(0);
+            SLQuality->setFixedWidth(150);
+            GBAqualayout->addWidget(SLQuality);
+            GBAlayout->addLayout(GBAqualayout);
+
+            QLabel * stereo = new QLabel(AGGroupBox);
+            stereo->setText(QLabel::tr("Stereo rendering"));
+            GBAstereolayout->addWidget(stereo);
 
-        editNetPassword = new QLineEdit(groupMisc);
-        editNetPassword->setEchoMode(QLineEdit::Password);
-        MiscLayout->addWidget(editNetPassword, 2, 1);
+            CBStereoMode = new QComboBox(AGGroupBox);
+            CBStereoMode->addItem(QComboBox::tr("Disabled"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Cyan"));
+            CBStereoMode->addItem(QComboBox::tr("Cyan/Red"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Blue"));
+            CBStereoMode->addItem(QComboBox::tr("Blue/Red"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Green"));
+            CBStereoMode->addItem(QComboBox::tr("Green/Red"));
+            CBStereoMode->addItem(QComboBox::tr("Side-by-side"));
+            CBStereoMode->addItem(QComboBox::tr("Top-Bottom"));
+            CBStereoMode->addItem(QComboBox::tr("Wiggle"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Cyan grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Cyan/Red grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Blue grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Blue/Red grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Red/Green grayscale"));
+            CBStereoMode->addItem(QComboBox::tr("Green/Red grayscale"));
 
-        CBNameWithDate = new QCheckBox(groupMisc);
-        CBNameWithDate->setText(QCheckBox::tr("Append date and time to record file name"));
-        MiscLayout->addWidget(CBNameWithDate, 5, 0, 1, 2);
+            GBAstereolayout->addWidget(CBStereoMode);
+            GBAlayout->addLayout(GBAstereolayout);
+
+            QHBoxLayout * GBAfpslayout = new QHBoxLayout(0);
+            QLabel * maxfps = new QLabel(AGGroupBox);
+            maxfps->setText(QLabel::tr("FPS limit"));
+            GBAfpslayout->addWidget(maxfps);
+            GBAlayout->addLayout(GBAfpslayout);
+            fpsedit = new FPSEdit(AGGroupBox);
+            GBAfpslayout->addWidget(fpsedit);
+
+            CBShowFPS = new QCheckBox(AGGroupBox);
+            CBShowFPS->setText(QCheckBox::tr("Show FPS"));
+            GBAfpslayout->addWidget(CBShowFPS);
 
-        BtnAssociateFiles = new QPushButton(groupMisc);
-        BtnAssociateFiles->setText(QPushButton::tr("Associate file extensions"));
-        BtnAssociateFiles->setVisible(!custom_data && !custom_config);
-        MiscLayout->addWidget(BtnAssociateFiles, 6, 0, 1, 2);
+            hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            QGridLayout * GBAvollayout = new QGridLayout();
+            QLabel * vol = new QLabel(AGGroupBox);
+            vol->setText(QLabel::tr("Initial sound volume"));
+            GBAvollayout->addWidget(vol, 0, 0, 1, 2);
+            GBAlayout->addLayout(GBAvollayout);
+            volumeBox = new QSpinBox(AGGroupBox);
+            volumeBox->setRange(0, 100);
+            volumeBox->setSingleStep(5);
+            GBAvollayout->addWidget(volumeBox, 0, 2);
 
-#ifdef __APPLE__
-#ifdef SPARKLE_ENABLED
-        CBAutoUpdate = new QCheckBox(groupMisc);
-        CBAutoUpdate->setText(QCheckBox::tr("Check for updates at startup"));
-        MiscLayout->addWidget(CBAutoUpdate, 7, 0, 1, 3);
-#endif
-#endif
-        gbTBLayout->addWidget(groupMisc, 2, 0);
+            CBEnableSound = new QCheckBox(AGGroupBox);
+            CBEnableSound->setText(QCheckBox::tr("Enable sound"));
+            GBAvollayout->addWidget(CBEnableSound, 1, 0, 1, 1);
+
+            CBEnableMusic = new QCheckBox(AGGroupBox);
+            CBEnableMusic->setText(QCheckBox::tr("Enable music"));
+            GBAvollayout->addWidget(CBEnableMusic, 1, 1, 1, 2);
+
+            GBAvollayout->setSizeConstraint(QLayout::SetMinimumSize);
+
+            hr = new QFrame(AGGroupBox);
+            hr->setFrameStyle(QFrame::HLine);
+            hr->setLineWidth(3);
+            hr->setFixedHeight(10);
+            GBAlayout->addWidget(hr);
+
+            CBAltDamage = new QCheckBox(AGGroupBox);
+            CBAltDamage->setText(QCheckBox::tr("Alternative damage show"));
+            GBAlayout->addWidget(CBAltDamage);
+
+            page1Layout->addWidget(AGGroupBox, 0, 1, 3, 1);
+        }
     }
 
-    {
-        AGGroupBox = new IconedGroupBox(this);
-        //AGGroupBox->setContentTopPadding(0);
-        AGGroupBox->setIcon(QIcon(":/res/graphicsicon.png"));
-        //AGGroupBox->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Fixed);
-        AGGroupBox->setTitle(QGroupBox::tr("Audio/Graphic options"));
-
-        QVBoxLayout * GBAlayout = new QVBoxLayout(AGGroupBox);
-        QHBoxLayout * GBAreslayout = new QHBoxLayout(0);
-        QHBoxLayout * GBAstereolayout = new QHBoxLayout(0);
-        QHBoxLayout * GBAqualayout = new QHBoxLayout(0);
-
-        CBFrontendFullscreen = new QCheckBox(AGGroupBox);
-        CBFrontendFullscreen->setText(QCheckBox::tr("Frontend fullscreen"));
-        GBAlayout->addWidget(CBFrontendFullscreen);
-
-        CBFrontendEffects = new QCheckBox(AGGroupBox);
-        CBFrontendEffects->setText(QCheckBox::tr("Frontend effects"));
-        GBAlayout->addWidget(CBFrontendEffects);
-
-        CBEnableFrontendSound = new QCheckBox(AGGroupBox);
-        CBEnableFrontendSound->setText(QCheckBox::tr("Enable frontend sounds"));
-        GBAlayout->addWidget(CBEnableFrontendSound);
-
-        CBEnableFrontendMusic = new QCheckBox(AGGroupBox);
-        CBEnableFrontendMusic->setText(QCheckBox::tr("Enable frontend music"));
-        GBAlayout->addWidget(CBEnableFrontendMusic);
+    { // page 2
+        QGridLayout * page2Layout = new QGridLayout(page2);
 
-        QFrame * hr = new QFrame(AGGroupBox);
-        hr->setFrameStyle(QFrame::HLine);
-        hr->setLineWidth(3);
-        hr->setFixedHeight(10);
-        GBAlayout->addWidget(hr);
-
-        QLabel * resolution = new QLabel(AGGroupBox);
-        resolution->setText(QLabel::tr("Resolution"));
-        GBAreslayout->addWidget(resolution);
-
-        CBResolution = new QComboBox(AGGroupBox);
-        GBAreslayout->addWidget(CBResolution);
-        GBAlayout->addLayout(GBAreslayout);
+        IconedGroupBox * gbColors = new IconedGroupBox(this);
+        //gbColors->setIcon(QIcon(":/res/teamicon.png"));
+        gbColors->setTitle(QGroupBox::tr("Custom colors"));
+        page2Layout->addWidget(gbColors, 0, 0, 1, 3);
+        QVBoxLayout * gbCLayout = new QVBoxLayout(gbColors);
 
-        CBFullscreen = new QCheckBox(AGGroupBox);
-        CBFullscreen->setText(QCheckBox::tr("Fullscreen"));
-        GBAreslayout->addWidget(CBFullscreen);
-
-        QLabel * quality = new QLabel(AGGroupBox);
-        quality->setText(QLabel::tr("Quality"));
-        quality->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
-        GBAqualayout->addWidget(quality);
+        QSignalMapper * mapper = new QSignalMapper(this);
 
-        SLQuality = new QSlider(Qt::Horizontal, AGGroupBox);
-        SLQuality->setTickPosition(QSlider::TicksBelow);
-        SLQuality->setMaximum(5);
-        SLQuality->setMinimum(0);
-        SLQuality->setFixedWidth(150);
-        GBAqualayout->addWidget(SLQuality);
-        GBAlayout->addLayout(GBAqualayout);
-
-        QLabel * stereo = new QLabel(AGGroupBox);
-        stereo->setText(QLabel::tr("Stereo rendering"));
-        GBAstereolayout->addWidget(stereo);
+        QStandardItemModel * model = DataManager::instance().colorsModel();
 
-        CBStereoMode = new QComboBox(AGGroupBox);
-        CBStereoMode->addItem(QComboBox::tr("Disabled"));
-        CBStereoMode->addItem(QComboBox::tr("Red/Cyan"));
-        CBStereoMode->addItem(QComboBox::tr("Cyan/Red"));
-        CBStereoMode->addItem(QComboBox::tr("Red/Blue"));
-        CBStereoMode->addItem(QComboBox::tr("Blue/Red"));
-        CBStereoMode->addItem(QComboBox::tr("Red/Green"));
-        CBStereoMode->addItem(QComboBox::tr("Green/Red"));
-        CBStereoMode->addItem(QComboBox::tr("Side-by-side"));
-        CBStereoMode->addItem(QComboBox::tr("Top-Bottom"));
-        CBStereoMode->addItem(QComboBox::tr("Wiggle"));
-        CBStereoMode->addItem(QComboBox::tr("Red/Cyan grayscale"));
-        CBStereoMode->addItem(QComboBox::tr("Cyan/Red grayscale"));
-        CBStereoMode->addItem(QComboBox::tr("Red/Blue grayscale"));
-        CBStereoMode->addItem(QComboBox::tr("Blue/Red grayscale"));
-        CBStereoMode->addItem(QComboBox::tr("Red/Green grayscale"));
-        CBStereoMode->addItem(QComboBox::tr("Green/Red grayscale"));
-
-        GBAstereolayout->addWidget(CBStereoMode);
-        GBAlayout->addLayout(GBAstereolayout);
-
-        QHBoxLayout * GBAfpslayout = new QHBoxLayout(0);
-        QLabel * maxfps = new QLabel(AGGroupBox);
-        maxfps->setText(QLabel::tr("FPS limit"));
-        GBAfpslayout->addWidget(maxfps);
-        GBAlayout->addLayout(GBAfpslayout);
-        fpsedit = new FPSEdit(AGGroupBox);
-        GBAfpslayout->addWidget(fpsedit);
-
-        CBShowFPS = new QCheckBox(AGGroupBox);
-        CBShowFPS->setText(QCheckBox::tr("Show FPS"));
-        GBAfpslayout->addWidget(CBShowFPS);
+        connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex)), this, SLOT(onColorModelDataChanged(QModelIndex,QModelIndex)));
+        for(int i = 0; i < model->rowCount(); ++i)
+        {
+            QPushButton * btn = new QPushButton(this);
+            gbCLayout->addWidget(btn);
+            btn->setStyleSheet(QString("background: %1").arg(model->item(i)->data().value<QColor>().name()));
+            m_colorButtons.append(btn);
+            connect(btn, SIGNAL(clicked()), mapper, SLOT(map()));
+            mapper->setMapping(btn, i);
+        }
 
-        hr = new QFrame(AGGroupBox);
-        hr->setFrameStyle(QFrame::HLine);
-        hr->setLineWidth(3);
-        hr->setFixedHeight(10);
-        GBAlayout->addWidget(hr);
-
-        QGridLayout * GBAvollayout = new QGridLayout();
-        QLabel * vol = new QLabel(AGGroupBox);
-        vol->setText(QLabel::tr("Initial sound volume"));
-        GBAvollayout->addWidget(vol, 0, 0, 1, 2);
-        GBAlayout->addLayout(GBAvollayout);
-        volumeBox = new QSpinBox(AGGroupBox);
-        volumeBox->setRange(0, 100);
-        volumeBox->setSingleStep(5);
-        GBAvollayout->addWidget(volumeBox, 0, 2);
-
-        CBEnableSound = new QCheckBox(AGGroupBox);
-        CBEnableSound->setText(QCheckBox::tr("Enable sound"));
-        GBAvollayout->addWidget(CBEnableSound, 1, 0, 1, 1);
-
-        CBEnableMusic = new QCheckBox(AGGroupBox);
-        CBEnableMusic->setText(QCheckBox::tr("Enable music"));
-        GBAvollayout->addWidget(CBEnableMusic, 1, 1, 1, 2);
-
-        GBAvollayout->setSizeConstraint(QLayout::SetMinimumSize);
-
-        hr = new QFrame(AGGroupBox);
-        hr->setFrameStyle(QFrame::HLine);
-        hr->setLineWidth(3);
-        hr->setFixedHeight(10);
-        GBAlayout->addWidget(hr);
-
-        CBAltDamage = new QCheckBox(AGGroupBox);
-        CBAltDamage->setText(QCheckBox::tr("Alternative damage show"));
-        GBAlayout->addWidget(CBAltDamage);
-
-        gbTBLayout->addWidget(AGGroupBox, 0, 1, 3, 1);
+        connect(mapper, SIGNAL(mapped(int)), this, SLOT(colorButtonClicked(int)));
     }
 
     previousQuality = this->SLQuality->value();
@@ -499,3 +528,25 @@
     CBTeamName->setVisible(enabled);
     LblNoEditTeam->setVisible(!enabled);
 }
+
+void PageOptions::colorButtonClicked(int i)
+{
+    if(i < 0 || i >= m_colorButtons.size())
+        return;
+
+    QPalette p = m_colorButtons[i]->palette();
+    QColor c = QColorDialog::getColor(p.color(QPalette::Button));
+
+    if(c.isValid())
+    {
+        DataManager::instance().colorsModel()->item(i)->setData(c);
+        m_colorButtons[i]->setStyleSheet(QString("background: %1").arg(c.name()));
+    }
+}
+
+void PageOptions::onColorModelDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight)
+{
+    QStandardItemModel * model = DataManager::instance().colorsModel();
+
+    m_colorButtons[topLeft.row()]->setStyleSheet(QString("background: %1").arg(model->item(topLeft.row())->data().value<QColor>().name()));
+}
--- a/QTfrontend/ui/page/pageoptions.h	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/ui/page/pageoptions.h	Sat Aug 18 00:48:09 2012 +0200
@@ -23,6 +23,7 @@
 
 class FPSEdit;
 class IconedGroupBox;
+class QSignalMapper;
 
 class PageOptions : public AbstractPage
 {
@@ -91,6 +92,7 @@
         QPushButton *BtnNewTeam;
         QPushButton *BtnEditTeam;
         QPushButton *BtnDeleteTeam;
+        QList<QPushButton *> m_colorButtons;
 
     private slots:
         void forceFullscreen(int index);
@@ -101,6 +103,8 @@
         void requestEditSelectedTeam();
         void requestDeleteSelectedTeam();
         void savePwdChanged(int state);
+        void colorButtonClicked(int i);
+        void onColorModelDataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
 };
 
 #endif
--- a/QTfrontend/ui/widget/chatwidget.cpp	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/ui/widget/chatwidget.cpp	Sat Aug 18 00:48:09 2012 +0200
@@ -922,7 +922,7 @@
     if(b)
     {
         chatNicks->insertAction(0, acKick);
-//      chatNicks->insertAction(0, acBan);
+        chatNicks->insertAction(0, acBan);
     }
 }
 
--- a/QTfrontend/ui/widget/teamselect.cpp	Sat Aug 18 00:47:51 2012 +0200
+++ b/QTfrontend/ui/widget/teamselect.cpp	Sat Aug 18 00:48:09 2012 +0200
@@ -135,6 +135,11 @@
             curPlayingTeams.erase(itPlay);
             break;
         }
+        else
+        {
+            qWarning() << QString("removeNetTeam: team '%1' was actually a local team!").arg(team.name());
+            break;
+        }
     }
     emit setEnabledGameStart(curPlayingTeams.size()>1);
 }
--- a/gameServer/Actions.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/gameServer/Actions.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -146,9 +146,14 @@
     io $
         infoM "Clients" (show ci ++ " quits: " ++ B.unpack msg)
 
-    processAction $ AnswerClients [chan] ["BYE", msg]
     when loggedIn $ processAction $ AnswerClients clientsChans ["LOBBY:LEFT", clNick, msg]
 
+    mapM processAction
+        [
+        AnswerClients [chan] ["BYE", msg]
+        , ModifyClient (\c -> c{logonPassed = False}) -- this will effectively hide client from others while he isn't deleted from list
+        ]
+
     s <- get
     put $! s{removedClients = ci `Set.insert` removedClients s}
 
@@ -216,7 +221,7 @@
     chans <- othersChans
 
     if master then
-        if gameProgress && playersNum > 1 then
+        if playersNum > 1 then
             mapM_ processAction [ChangeMaster, NoticeMessage AdminLeft, RemoveClientTeams ci, AnswerClients chans ["LEFT", clNick, msg]]
             else
             processAction RemoveRoom
@@ -225,7 +230,7 @@
 
     -- when not removing room
     ready <- client's isReady
-    when (not master || (gameProgress && playersNum > 1)) . io $ do
+    when (not master || playersNum > 1) . io $ do
         modifyRoom rnc (\r -> r{
                 playersIn = playersIn r - 1,
                 readyPlayers = if ready then readyPlayers r - 1 else readyPlayers r
@@ -418,11 +423,22 @@
 processAction JoinLobby = do
     chan <- client's sendChan
     clientNick <- client's nick
-    (lobbyNicks, clientsChans) <- liftM (unzip . Prelude.map (nick &&& sendChan) . Prelude.filter logonPassed) $! allClientsS
-    mapM_ processAction $
-        AnswerClients clientsChans ["LOBBY:JOINED", clientNick]
-        : AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)
-        : [ModifyClient (\cl -> cl{logonPassed = True}), SendServerMessage]
+    isAuthenticated <- liftM (not . B.null) $ client's webPassword
+    isAdmin <- client's isAdministrator
+    loggedInClients <- liftM (Prelude.filter logonPassed) $! allClientsS
+    let (lobbyNicks, clientsChans) = unzip . L.map (nick &&& sendChan) $ loggedInClients
+    let authenticatedNicks = L.map nick . L.filter (not . B.null . webPassword) $ loggedInClients
+    let adminsNicks = L.map nick . L.filter isAdministrator $ loggedInClients
+    let clFlags = B.concat . L.concat $ [["u" | isAuthenticated], ["a" | isAdmin]]
+    mapM_ processAction . concat $ [
+        [AnswerClients clientsChans ["LOBBY:JOINED", clientNick]]
+        , [AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)]
+        , [AnswerClients [chan] ("CLIENT_FLAGS" : "+u" : authenticatedNicks) | not $ null authenticatedNicks]
+        , [AnswerClients [chan] ("CLIENT_FLAGS" : "+a" : adminsNicks) | not $ null adminsNicks]
+        , [AnswerClients (chan : clientsChans) ["CLIENT_FLAGS",  B.concat["+" , clFlags], clientNick] | not $ B.null clFlags]
+        , [ModifyClient (\cl -> cl{logonPassed = True})]
+        , [SendServerMessage]
+        ]
 
 
 processAction (KickClient kickId) = do
@@ -453,9 +469,9 @@
 
 processAction BanList = do
     ch <- client's sendChan
-    bans <- gets (bans . serverInfo)
+    bans <- gets (B.pack . unlines . map show . bans . serverInfo)
     processAction $
-        AnswerClients [ch] ["BANLIST", B.pack $ show bans]
+        AnswerClients [ch] ["BANLIST", bans]
 
 
 
@@ -522,9 +538,11 @@
     where
         kickTimeouted rnc ci = do
             pq <- io $ client'sM rnc pingsQueue ci
-            when (pq > 0) $
+            when (pq > 0) $ do
                 withStateT (\as -> as{clientIndex = Just ci}) $
                     processAction (ByeClient "Ping timeout")
+                when (pq > 1) $
+                    processAction $ DeleteClient ci -- smth went wrong with client io threads, issue DeleteClient here
 
 
 processAction StatsAction = do
--- a/gameServer/CoreTypes.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/gameServer/CoreTypes.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -94,6 +94,7 @@
         readyPlayers :: !Int,
         isRestrictedJoins :: Bool,
         isRestrictedTeams :: Bool,
+        roomBansList :: [B.ByteString],
         mapParams :: Map.Map B.ByteString B.ByteString,
         params :: Map.Map B.ByteString [B.ByteString]
     }
@@ -111,6 +112,7 @@
         0
         False
         False
+        []
         (
             Map.fromList $ Prelude.zipWith (,)
                 ["MAP", "MAPGEN", "MAZE_SIZE", "SEED", "TEMPLATE"]
--- a/gameServer/HWProtoInRoomState.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/gameServer/HWProtoInRoomState.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -278,6 +278,14 @@
     where
         engineMsg cl = toEngineMsg $ B.concat ["b", nick cl, "(team): ", msg, "\x20\x20"]
 
+handleCmd_inRoom ["BAN", banNick] = do
+    (_, rnc) <- ask
+    maybeClientId <- clientByNick banNick
+    let banId = fromJust maybeClientId
+    master <- liftM isMaster thisClient
+    return [ModifyRoom (\r -> r{roomBansList = (host $ rnc `client` banId) : roomBansList r}) | master && isJust maybeClientId]
+
+
 handleCmd_inRoom ["LIST"] = return [] -- for old clients (<= 0.9.17)
 
 handleCmd_inRoom (s:_) = return [ProtocolError $ "Incorrect command '" `B.append` s `B.append` "' (state: in room)"]
--- a/gameServer/HWProtoLobbyState.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/gameServer/HWProtoLobbyState.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -70,11 +70,14 @@
     let jRoomClients = map (client irnc) $ roomClients irnc jRI
     let nicks = map nick jRoomClients
     let chans = map sendChan (cl : jRoomClients)
+    let isBanned = host cl `elem` roomBansList jRoom
     return $
         if isNothing maybeRI || not sameProto then
             [Warning "No such room"]
             else if isRestrictedJoins jRoom then
             [Warning "Joining restricted"]
+            else if isBanned then
+            [Warning "You are banned in this room"]
             else if roomPassword /= password jRoom then
             [NoticeMessage WrongPassword]
             else
@@ -183,7 +186,7 @@
 
 handleCmd_lobby ["RESTART_SERVER"] = do
     cl <- thisClient
-    return [RestartServer]
+    return [RestartServer | isAdministrator cl]
 
 
 handleCmd_lobby _ = return [ProtocolError "Incorrect command (state: in lobby)"]
--- a/gameServer/ServerCore.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/gameServer/ServerCore.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -43,7 +43,7 @@
 
         ClientMessage (ci, cmd) -> do
             liftIO $ debugM "Clients" $ show ci ++ ": " ++ show cmd
-            
+
             removed <- gets removedClients
             unless (ci `Set.member` removed) $ do
                 modify (\s -> s{clientIndex = Just ci})
@@ -75,8 +75,6 @@
             (fromJust $ serverSocket si)
             (coreChan si)
 
-    return ()
-
     _ <- forkIO $ timerLoop 0 $ coreChan si
 
     startDBConnection si
--- a/hedgewars/GSHandlers.inc	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/GSHandlers.inc	Sat Aug 18 00:48:09 2012 +0200
@@ -610,11 +610,10 @@
     // move back to cloud layer
         if yy > cWaterLine then
             move:= true
-        else if ((yy and LAND_HEIGHT_MASK) <> 0)
-        or (xx > LAND_WIDTH + 512) or (xx < -512) then
+        else if (xx > snowRight) or (xx < snowLeft) then
             move:=true
         // Solid pixel encountered
-        else if ((xx and LAND_WIDTH_MASK) = 0) and (Land[yy, xx] <> 0) then
+        else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) and (Land[yy, xx] <> 0) then
             begin
             lf:= Land[yy, xx] and (lfObject or lfBasic or lfIndestructible);
             // If there's room below keep falling
@@ -724,8 +723,8 @@
         exit
         end;
     Gear^.Pos:= 0;
-    Gear^.X:= int2hwFloat(GetRandom(LAND_WIDTH+1024)-512);
-    Gear^.Y:= int2hwFloat(750+(GetRandom(50)-25));
+    Gear^.X:= int2hwFloat(GetRandom(snowRight-snowLeft)+snowLeft);
+    Gear^.Y:= int2hwFloat(LAND_HEIGHT-1300+(GetRandom(50)-25));
     Gear^.State:= Gear^.State or gstInvisible;
     end
 end;
@@ -1817,7 +1816,7 @@
                 Message := Message and (not gmAttack)
                 end;
         DeleteGear(Gear);
-	exit;
+        exit;
         end;
     if CheckGearDrowning(HHGear) then DeleteGear(Gear)
 end;
@@ -3685,10 +3684,6 @@
 
     Gear^.X := HHGear^.X;
     Gear^.Y := HHGear^.Y;
-    // For some reason I need to reapply followgear here, something else grabs it otherwise.
-    // This is probably not needed anymore
-    if not CurrentTeam^.ExtDriven then
-        FollowGear := HHGear;
 
     if not isUnderWater and hasBorder and ((HHGear^.X < _0)
     or (hwRound(HHGear^.X) > LAND_WIDTH)) then
@@ -4788,7 +4783,7 @@
         Gear^.Timer:= Gear^.Tag
         end;
 
-    if (Gear^.Health = 0) or (HHGear^.Damage <> 0) then
+    if (Gear^.Health = 0) or ((HHGear^.State and gstHHDriven) = 0) then
         begin
         DeleteGear(Gear);
         AfterAttack
@@ -4864,7 +4859,7 @@
         Gear^.Timer:= Gear^.Tag
         end;
 
-    if (Gear^.Health = 0) or (HHGear^.Damage <> 0) or ((HHGear^.Message and gmAttack) <> 0) then
+    if (Gear^.Health = 0) or ((HHGear^.State and gstHHDriven) = 0) or ((HHGear^.Message and gmAttack) <> 0) then
         begin
         HHGear^.Message:= HHGear^.Message and (not gmAttack);
         DeleteGear(Gear);
--- a/hedgewars/SDLh.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/SDLh.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -410,12 +410,10 @@
 
     PSDL_Color = ^TSDL_Color;
     TSDL_Color = record
-        case Byte of
-            0: ( r: Byte;
-                 g: Byte;
-                 b: Byte;
-                 unused: Byte; );
-            1: ( value: LongWord; );
+            r: Byte;
+            g: Byte;
+            b: Byte;
+            unused: Byte;
         end;
 
 
--- a/hedgewars/hwengine.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/hwengine.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -57,6 +57,9 @@
         gsLandGen:
             begin
             GenMap;
+            uLandTexture.initModule;
+            UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT, false); 
+            uAILandMarks.initModule;
             ParseCommand('sendlanddigest', true);
             GameState:= gsStart;
             end;
@@ -401,7 +404,6 @@
         uAI.initModule;
         //uAIActions does not need initialization
         //uAIAmmoTests does not need initialization
-        uAILandMarks.initModule;
         uAIMisc.initModule;
         uAmmos.initModule;
         uChat.initModule;
@@ -413,7 +415,6 @@
         //uLandGraphics does not need initialization
         //uLandObjects does not need initialization
         //uLandTemplates does not need initialization
-        uLandTexture.initModule;
         //uLocale does not need initialization
         uRandom.initModule;
         uScript.initModule;
--- a/hedgewars/uAI.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uAI.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -178,9 +178,12 @@
                         begin
                         AddAction(BestActions, aia_attack, aim_push, 350 + random(200), 0, 0);
                         AddAction(BestActions, aia_attack, aim_release, 1, 0, 0);
-                                                
-                        AddAction(BestActions, aia_Down, aim_push, 100 + random(150), 0, 0);
-                        AddAction(BestActions, aia_Down, aim_release, 32, 0, 0);
+                         
+                        if abs(ap.Angle) > 32 then
+                           begin
+                           AddAction(BestActions, aia_Down, aim_push, 100 + random(150), 0, 0);
+                           AddAction(BestActions, aia_Down, aim_release, 32, 0, 0);
+                           end;
                         
                         AddAction(BestActions, aia_waitAngle, ap.Angle, 250, 0, 0);
                         AddAction(BestActions, aia_attack, aim_push, 1, 0, 0);
@@ -274,7 +277,8 @@
                 break;
 
             if (BotLevel < 5) and (GoInfo.JumpType = jmpHJump) then // hjump support
-                if Push(ticks, Actions, AltMe, Me^.Message) then
+                // check if we could go backwards and maybe ljump over a gap after this hjump
+                if Push(ticks, Actions, AltMe, Me^.Message xor 3) then
                     begin
                     with Stack.States[Pred(Stack.Count)] do
                         begin
@@ -291,9 +295,8 @@
                         else
                             AddAction(MadeActions, aia_LookRight, 0, 200, 0, 0);
                         end;
-                    
-                    // check if we could go backwards and maybe ljump over a gap after this hjump
-                    Push(ticks, Stack.States[Pred(Stack.Count)].MadeActions, AltMe, Me^.Message xor 3)
+                    // but first check walking forward
+                    Push(ticks, Stack.States[Pred(Stack.Count)].MadeActions, AltMe, Me^.Message)
                     end;
             if (BotLevel < 3) and (GoInfo.JumpType = jmpLJump) then // ljump support
                 begin
--- a/hedgewars/uAIAmmoTests.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uAIAmmoTests.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -47,6 +47,7 @@
 function TestBaseballBat(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
 function TestFirePunch(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
 function TestWhip(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
+function TestKamikaze(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
 function TestAirAttack(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
 function TestTeleport(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
 function TestHammer(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
@@ -84,7 +85,7 @@
             //(proc: @TestTeleport;    flags: amtest_OnTurn), // amTeleport
             (proc: nil;              flags: 0), // amSwitch
             (proc: @TestMortar;      flags: 0), // amMortar
-            (proc: nil;              flags: 0), // amKamikaze
+            (proc: @TestKamikaze;    flags: 0), // amKamikaze
             (proc: @TestCake;        flags: amtest_OnTurn or amtest_NoTarget), // amCake
             (proc: nil;              flags: 0), // amSeduction
             (proc: @TestWatermelon;  flags: 0), // amWatermelon
@@ -167,7 +168,7 @@
         
         EX:= trunc(x);
         EY:= trunc(y);
-        if Me^.Hedgehog^.BotLevel = 1 then
+        if Level = 1 then
             value:= RateExplosion(Me, EX, EY, 101, afTrackFall or afErasesLand)
         else value:= RateExplosion(Me, EX, EY, 101);
         if value = 0 then
@@ -330,7 +331,7 @@
     EX:= trunc(x);
     EY:= trunc(y);
     if t < 50 then 
-        if Me^.Hedgehog^.BotLevel = 1 then
+        if Level = 1 then
             Score:= RateExplosion(Me, EX, EY, 101, afTrackFall or afErasesLand)
         else Score:= RateExplosion(Me, EX, EY, 101)
     else 
@@ -361,12 +362,12 @@
     t: LongInt;
 begin
 valueResult:= BadTurn;
-TestTime:= 0;
+TestTime:= 500;
 ap.ExplR:= 0;
 meX:= hwFloat2Float(Me^.X);
 meY:= hwFloat2Float(Me^.Y);
 repeat
-    inc(TestTime, 1000);
+    inc(TestTime, 900);
     // Try to overshoot slightly, seems to pay slightly better dividends in terms of hitting cluster
     if meX<Targ.X then
         Vx:= ((Targ.X+10) - meX) / (TestTime + tDelta)
@@ -398,14 +399,14 @@
         begin
         ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level));
         ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15);
-        ap.Time:= TestTime;
+        ap.Time:= TestTime div 1000 * 1000;
         ap.ExplR:= 90;
         ap.ExplX:= EX;
         ap.ExplY:= EY;
         valueResult:= Score
         end;
      end
-until (TestTime = 4000);
+until (TestTime = 4100);
 TestClusterBomb:= valueResult
 end;
 
@@ -418,12 +419,12 @@
     t: LongInt;
 begin
 valueResult:= BadTurn;
-TestTime:= 0;
+TestTime:= 500;
 ap.ExplR:= 0;
 meX:= hwFloat2Float(Me^.X);
 meY:= hwFloat2Float(Me^.Y);
 repeat
-    inc(TestTime, 1000);
+    inc(TestTime, 900);
     Vx:= (Targ.X - meX) / (TestTime + tDelta);
     Vy:= cGravityf * ((TestTime + tDelta) div 2) - ((Targ.Y-50) - meY) / (TestTime + tDelta);
     r:= sqr(Vx)+sqr(Vy);
@@ -452,14 +453,14 @@
             begin
             ap.Angle:= DxDy2AttackAnglef(Vx, Vy) + AIrndSign(random(Level));
             ap.Power:= trunc(sqrt(r) * cMaxPower) + AIrndSign(random(Level) * 15);
-            ap.Time:= TestTime;
+            ap.Time:= TestTime div 1000 * 1000;
             ap.ExplR:= 300;
             ap.ExplX:= EX;
             ap.ExplY:= EY;
             valueResult:= Score
             end;
         end
-until (TestTime = 4000);
+until (TestTime = 4100);
 TestWatermelon:= valueResult
 end;
 
@@ -600,19 +601,22 @@
     d: Longword;
     fallDmg, valueResult: LongInt;
 begin
-if Me^.Hedgehog^.BotLevel > 3 then exit(BadTurn);
+if Level > 3 then exit(BadTurn);
 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent;
 Level:= Level; // avoid compiler hint
 ap.ExplR:= 0;
 ap.Time:= 0;
 ap.Power:= 1;
+
 x:= hwFloat2Float(Me^.X);
 y:= hwFloat2Float(Me^.Y);
+
 if Abs(trunc(x) - Targ.X) + Abs(trunc(y) - Targ.Y) < 40 then
     begin
     TestDesertEagle:= BadTurn;
     exit(BadTurn);
     end;
+
 t:= 2 / sqrt(sqr(Targ.X - x)+sqr(Targ.Y-y));
 Vx:= (Targ.X - x) * t;
 Vy:= (Targ.Y - y) * t;
@@ -650,7 +654,7 @@
     d: Longword;
     fallDmg, valueResult: LongInt;
 begin
-if Me^.Hedgehog^.BotLevel > 3 then exit(BadTurn);
+if Level > 3 then exit(BadTurn);
 dmgMod:= 0.01 * hwFloat2Float(cDamageModifier) * cDamagePercent;
 Level:= Level; // avoid compiler hint
 ap.ExplR:= 0;
@@ -700,9 +704,9 @@
     x, y, trackFall: LongInt;
     dx, dy: real;
 begin
-    if Me^.Hedgehog^.BotLevel < 3 then trackFall:= afTrackFall
+    if Level < 3 then trackFall:= afTrackFall
     else trackFall:= 0;
-    Level:= Level; // avoid compiler hint
+
     ap.ExplR:= 0;
     ap.Time:= 0;
     ap.Power:= 1;
@@ -749,9 +753,9 @@
 var valueResult, v1, v2, i: LongInt;
     x, y, trackFall: LongInt;
 begin
-    if Me^.Hedgehog^.BotLevel = 1 then trackFall:= afTrackFall
+    if Level = 1 then trackFall:= afTrackFall
     else trackFall:= 0;
-    Level:= Level; // avoid compiler hint
+
     ap.ExplR:= 0;
     ap.Time:= 0;
     ap.Power:= 1;
@@ -805,9 +809,9 @@
 var valueResult, v1, v2: LongInt;
     x, y, trackFall: LongInt;
 begin
-    if Me^.Hedgehog^.BotLevel = 1 then trackFall:= afTrackFall
+    if Level = 1 then trackFall:= afTrackFall
     else trackFall:= 0;
-    Level:= Level; // avoid compiler hint
+
     ap.ExplR:= 0;
     ap.Time:= 0;
     ap.Power:= 1;
@@ -822,7 +826,7 @@
             , 30, 30, 25
             , -1, -0.8, trackFall or afSetSkip);
     v1:= v1 +
-        RateShove(Me, x, y
+        RateShove(Me, x - 2, y
             , 30, 30, 25
             , -1, -0.8, trackFall);
     // now try opposite direction
@@ -830,7 +834,7 @@
             , 30, 30, 25
             , 1, -0.8, trackFall or afSetSkip);
     v2:= v2 +
-        RateShove(Me, x, y
+        RateShove(Me, x + 2, y
             , 30, 30, 25
             , 1, -0.8, trackFall);
 
@@ -854,6 +858,90 @@
     TestWhip:= valueResult;
 end;
 
+function TestKamikaze(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
+const step = 8;
+var valueResult, i, v, tx: LongInt;
+    trackFall: LongInt;
+    t, d, x, y, dx, dy, cx: real;
+begin
+    ap.ExplR:= 0;
+    ap.Time:= 0;
+    ap.Power:= 1;
+
+    if Level = 1 then 
+        trackFall:= afTrackFall
+    else if Level = 2 then
+        trackFall:= 0
+    else
+        exit(BadTurn);
+        
+    valueResult:= 0;
+    v:= 0;
+
+    x:= hwFloat2Float(Me^.X);
+    y:= hwFloat2Float(Me^.Y);
+    d:= sqrt(sqr(Targ.X - x) + sqr(Targ.Y - y));
+    if d < 10 then
+        begin
+        dx:= 0;
+        dy:= 8;
+        ap.Angle:= 2048
+        end
+    else
+        begin
+        t:= step / d;
+        dx:= (Targ.X - x) * t;
+        dy:= (Targ.Y - y) * t;
+
+        ap.Angle:= DxDy2AttackAnglef(dx, -dy)
+        end;
+    
+    if dx >= 0 then cx:= 0.45 else cx:= -0.45;
+
+    for i:= 0 to 512 div step - 2 do
+        begin
+        valueResult:= valueResult + 
+            RateShove(Me, trunc(x), trunc(y)
+                , 30, 30, 25
+                , cx, -0.9, trackFall or afSetSkip);
+                
+        x:= x + dx;
+        y:= y + dy;
+        end;
+    if dx = 0 then
+        begin
+        x:= hwFloat2Float(Me^.X);
+        y:= hwFloat2Float(Me^.Y);
+        tx:= trunc(x);
+        v:= RateShove(Me, tx, trunc(y)
+                , 30, 30, 25
+                , -cx, -0.9, trackFall);
+        for i:= 1 to 512 div step - 2 do
+            begin
+            y:= y + dy;
+            v:= v + 
+                RateShove(Me, tx, trunc(y)
+                    , 30, 30, 25
+                    , -cx, -0.9, trackFall or afSetSkip);
+            end
+        end;
+    if v > valueResult then
+        begin
+        ap.Angle:= -2048;
+        valueResult:= v
+        end;
+        
+    v:= RateShove(Me, trunc(x), trunc(y)
+            , 30, 30, 25
+            , cx, -0.9, trackFall);
+    valueResult:= valueResult + v - KillScore * friendlyfactor div 100 * 1024;
+    
+    if v < 65536 then
+        inc(valueResult, RateExplosion(Me, trunc(x), trunc(y), 30));
+
+    TestKamikaze:= valueResult;
+end;
+
 function TestHammer(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
 var rate: LongInt;
 begin
@@ -1008,7 +1096,8 @@
     x, y, trackFall: LongInt;
     cake: TGear;
 begin
-    Level:= Level; // avoid compiler hint
+    if (Level > 2) then
+        exit(BadTurn);
     ap.ExplR:= 0;
     ap.Time:= 0;
     ap.Power:= BadTurn; // use it as max score value in checkCakeWalk
--- a/hedgewars/uAILandMarks.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uAILandMarks.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -1,71 +1,71 @@
-unit uAILandMarks;
-
-interface
-const markWasHere = $01;
-
-procedure addMark(X, Y: LongInt; mark: byte);
-function  checkMark(X, Y: LongInt; mark: byte) : boolean;
-procedure clearAllMarks;
-procedure clearMarks(mark: byte);
-
-procedure initModule;
-procedure freeModule;
-
-implementation
-uses uVariables;
-
-const gr = 2;
-
-var marks: array of array of byte;
-    WIDTH, HEIGHT: Longword;
-
-procedure addMark(X, Y: LongInt; mark: byte);
-begin
-    if((X and LAND_WIDTH_MASK) = 0) and ((Y and LAND_HEIGHT_MASK) = 0) then
-        begin
-        X:= X shr gr;
-        Y:= Y shr gr;
-        marks[Y, X]:= marks[Y, X] or mark
-        end
-end;
-
-function  checkMark(X, Y: LongInt; mark: byte) : boolean;
-begin
-    checkMark:= ((X and LAND_WIDTH_MASK) = 0) 
-        and ((Y and LAND_HEIGHT_MASK) = 0) 
-        and ((marks[Y shr gr, X shr gr] and mark) <> 0)
-end;
-
-procedure clearAllMarks;
-var 
-    Y, X: Longword;
-begin
-    for Y:= 0 to Pred(HEIGHT) do
-        for X:= 0 to Pred(WIDTH) do
-            marks[Y, X]:= 0
-end;
-
-procedure clearMarks(mark: byte);
-var 
-    Y, X: Longword;
-begin
-    for Y:= 0 to Pred(HEIGHT) do
-        for X:= 0 to Pred(WIDTH) do
-            marks[Y, X]:= marks[Y, X] and (not mark)
-end;
-
-
-procedure initModule;
-begin
-    WIDTH:= LAND_WIDTH shr gr;
-    HEIGHT:= LAND_HEIGHT shr gr;
-    
-    SetLength(marks, HEIGHT, WIDTH);
-end;
-
-procedure freeModule;
-begin
-    SetLength(marks, 0, 0);
-end;
-
-end.
+unit uAILandMarks;
+
+interface
+const markWasHere = $01;
+
+procedure addMark(X, Y: LongInt; mark: byte);
+function  checkMark(X, Y: LongInt; mark: byte) : boolean;
+procedure clearAllMarks;
+procedure clearMarks(mark: byte);
+
+procedure initModule;
+procedure freeModule;
+
+implementation
+uses uVariables;
+
+const gr = 2;
+
+var marks: array of array of byte;
+    WIDTH, HEIGHT: Longword;
+
+procedure addMark(X, Y: LongInt; mark: byte);
+begin
+    if((X and LAND_WIDTH_MASK) = 0) and ((Y and LAND_HEIGHT_MASK) = 0) then
+        begin
+        X:= X shr gr;
+        Y:= Y shr gr;
+        marks[Y, X]:= marks[Y, X] or mark
+        end
+end;
+
+function  checkMark(X, Y: LongInt; mark: byte) : boolean;
+begin
+    checkMark:= ((X and LAND_WIDTH_MASK) = 0) 
+        and ((Y and LAND_HEIGHT_MASK) = 0) 
+        and ((marks[Y shr gr, X shr gr] and mark) <> 0)
+end;
+
+procedure clearAllMarks;
+var 
+    Y, X: Longword;
+begin
+    for Y:= 0 to Pred(HEIGHT) do
+        for X:= 0 to Pred(WIDTH) do
+            marks[Y, X]:= 0
+end;
+
+procedure clearMarks(mark: byte);
+var 
+    Y, X: Longword;
+begin
+    for Y:= 0 to Pred(HEIGHT) do
+        for X:= 0 to Pred(WIDTH) do
+            marks[Y, X]:= marks[Y, X] and (not mark)
+end;
+
+
+procedure initModule;
+begin
+    WIDTH:= LAND_WIDTH shr gr;
+    HEIGHT:= LAND_HEIGHT shr gr;
+    
+    SetLength(marks, HEIGHT, WIDTH);
+end;
+
+procedure freeModule;
+begin
+    SetLength(marks, 0, 0);
+end;
+
+end.
--- a/hedgewars/uAIMisc.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uAIMisc.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -86,12 +86,13 @@
         ar: array[0..Pred(MAXBONUS div 8)] of TBonus;  // don't use too many
         end;
 
+const KillScore = 200;
+var friendlyfactor: LongInt = 300;
+       
 implementation
 uses uCollisions, uVariables, uUtils, uDebug, uLandTexture;
 
-const KillScore = 200;
-
-var friendlyfactor: LongInt = 300;
+var 
     KnownExplosion: record
         X, Y, Radius: LongInt
         end = (X: 0; Y: 0; Radius: 0);
--- a/hedgewars/uCollisions.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uCollisions.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -82,7 +82,7 @@
     X:= hwRound(Gear^.X);
     Y:= hwRound(Gear^.Y);
     Radius:= Gear^.Radius;
-    ChangeRoundInLand(X, Y, Radius - 1, true, Gear = CurrentHedgehog^.Gear);
+    ChangeRoundInLand(X, Y, Radius - 1, true, (Gear = CurrentHedgehog^.Gear) or (Gear^.Kind = gtCase));
     cGear:= Gear
     end;
 Gear^.CollisionIndex:= Count;
@@ -103,7 +103,7 @@
 if Gear^.CollisionIndex >= 0 then
     begin
     with cinfos[Gear^.CollisionIndex] do
-        ChangeRoundInLand(X, Y, Radius - 1, false, Gear = CurrentHedgehog^.Gear);
+        ChangeRoundInLand(X, Y, Radius - 1, false, (Gear = CurrentHedgehog^.Gear) or (Gear^.Kind = gtCase));
     cinfos[Gear^.CollisionIndex]:= cinfos[Pred(Count)];
     cinfos[Gear^.CollisionIndex].cGear^.CollisionIndex:= Gear^.CollisionIndex;
     Gear^.CollisionIndex:= -1;
@@ -138,7 +138,7 @@
 var x, y, i: LongInt;
 begin
 // Special case to emulate the old intersect gear clearing, but with a bit of slop for pixel overlap
-if (Gear^.CollisionMask = $FF7F) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
+if (Gear^.CollisionMask = $FF7F) and (Gear^.Kind <> gtHedgehog) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
     ((hwRound(Gear^.Hedgehog^.Gear^.X) + Gear^.Hedgehog^.Gear^.Radius + 4 < hwRound(Gear^.X) - Gear^.Radius) or
      (hwRound(Gear^.Hedgehog^.Gear^.X) - Gear^.Hedgehog^.Gear^.Radius - 4 > hwRound(Gear^.X) + Gear^.Radius)) then
     Gear^.CollisionMask:= $FFFF;
@@ -168,7 +168,7 @@
 var x, y, i: LongInt;
 begin
 // Special case to emulate the old intersect gear clearing, but with a bit of slop for pixel overlap
-if (Gear^.CollisionMask = $FF7F) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
+if (Gear^.CollisionMask = $FF7F) and (Gear^.Kind <> gtHedgehog) and (Gear^.Hedgehog <> nil) and (Gear^.Hedgehog^.Gear <> nil) and
     ((hwRound(Gear^.Hedgehog^.Gear^.Y) + Gear^.Hedgehog^.Gear^.Radius + 4 < hwRound(Gear^.Y) - Gear^.Radius) or
      (hwRound(Gear^.Hedgehog^.Gear^.Y) - Gear^.Hedgehog^.Gear^.Radius - 4 > hwRound(Gear^.Y) + Gear^.Radius)) then
     Gear^.CollisionMask:= $FFFF;
--- a/hedgewars/uCommandHandlers.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uCommandHandlers.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -614,13 +614,14 @@
 if CheckNoTeamOrHH or isPaused then
     exit;
 
-if FollowGear <> nil then
+if autoCameraOn then
     begin
+    FollowGear:= nil;
     AddCaption('Auto Camera Off', $CCCCCC, capgrpVolume);
     autoCameraOn:= false
     end
-    else
-        begin
+else
+    begin
     AddCaption('Auto Camera On', $CCCCCC, capgrpVolume);
     bShowFinger:= true;
     if not CurrentHedgehog^.Unplaced then
--- a/hedgewars/uConsts.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uConsts.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -245,6 +245,7 @@
 
     gmRemoveFromList = $00004000;
     gmAddToList      = $00008000;
+    gmDelete         = $00010000;
     gmAllStoppable = gmLeft or gmRight or gmUp or gmDown or gmAttack or gmPrecise;
 
     cMaxSlotIndex       = 9;
--- a/hedgewars/uFloat.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uFloat.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -369,7 +369,7 @@
 function hwPow(const t: hwFloat;p: LongWord): hwFloat;
 begin
 hwPow:= t;
-if p mod 2 = 0 then hwPow.isNegative:= t.isNegative;
+if p mod 2 = 0 then hwPow.isNegative:= false;
 
 while p > 0 do
     begin
--- a/hedgewars/uGears.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uGears.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -77,6 +77,7 @@
     stAfterDelay, stChWin, stWater, stChWin2, stHealth,
     stSpawn, stNTurn);
     upd: Longword;
+    snowLeft,snowRight: LongInt;
     //SDMusic: shortstring;
 
 // For better maintainability the step handlers of gears are stored in
@@ -206,23 +207,28 @@
     curHandledGear:= t;
     t:= curHandledGear^.NextGear;
 
-    if curHandledGear^.Message and gmRemoveFromList <> 0 then 
-        begin
-        RemoveGearFromList(curHandledGear);
-        // since I can't think of any good reason this would ever be separate from a remove from list, going to keep it inside this block
-        if curHandledGear^.Message and gmAddToList <> 0 then InsertGearToList(curHandledGear);
-        curHandledGear^.Message:= curHandledGear^.Message and (not (gmRemoveFromList or gmAddToList))
-        end;
-    if curHandledGear^.Active then
+    if curHandledGear^.Message and gmDelete <> 0 then
+        DeleteGear(curHandledGear)
+    else
         begin
-        if curHandledGear^.RenderTimer and (curHandledGear^.Timer > 500) and ((curHandledGear^.Timer mod 1000) = 0) then
+        if curHandledGear^.Message and gmRemoveFromList <> 0 then 
+            begin
+            RemoveGearFromList(curHandledGear);
+            // since I can't think of any good reason this would ever be separate from a remove from list, going to keep it inside this block
+            if curHandledGear^.Message and gmAddToList <> 0 then InsertGearToList(curHandledGear);
+            curHandledGear^.Message:= curHandledGear^.Message and (not (gmRemoveFromList or gmAddToList))
+            end;
+        if curHandledGear^.Active then
             begin
-            FreeTexture(curHandledGear^.Tex);
-            curHandledGear^.Tex:= RenderStringTex(inttostr(curHandledGear^.Timer div 1000), cWhiteColor, fntSmall);
-            end;
-        curHandledGear^.doStep(curHandledGear);
-        // might be useful later
-        //ScriptCall('onGearStep', Gear^.uid);
+            if curHandledGear^.RenderTimer and (curHandledGear^.Timer > 500) and ((curHandledGear^.Timer mod 1000) = 0) then
+                begin
+                FreeTexture(curHandledGear^.Tex);
+                curHandledGear^.Tex:= RenderStringTex(inttostr(curHandledGear^.Timer div 1000), cWhiteColor, fntSmall);
+                end;
+            curHandledGear^.doStep(curHandledGear);
+            // might be useful later
+            //ScriptCall('onGearStep', Gear^.uid);
+            end
         end
     end;
 curHandledGear:= nil;
@@ -642,9 +648,12 @@
     AddGear(rx, ry, gtGenericFaller, gstInvisible, rdx, rdy, $FFFFFFFF);
     end;
 
+snowRight:= max(LAND_WIDTH,4096)+512;
+snowLeft:= -(snowRight-LAND_WIDTH);
+
 if not hasBorder and ((Theme = 'Snow') or (Theme = 'Christmas')) then
-    for i:= 0 to Pred(vobCount*2) do
-        AddGear(GetRandom(LAND_WIDTH+1024)-512, LAND_HEIGHT - GetRandom(LAND_HEIGHT div 2), gtFlake, 0, _0, _0, 0);
+    for i:= vobCount * max(LAND_WIDTH,4096) div 2048 downto 1 do
+        AddGear(GetRandom(snowRight-snowLeft)+snowLeft, LAND_HEIGHT-1300+GetRandom(750), gtFlake, 0, _0, _0, 0);
 end;
 
 
--- a/hedgewars/uGearsHedgehog.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uGearsHedgehog.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -455,11 +455,13 @@
 procedure AfterAttack;
 var s: shortstring;
     a: TAmmoType;
+    HHGear: PGear;
 begin
-with CurrentHedgehog^.Gear^, CurrentHedgehog^ do
+with CurrentHedgehog^ do
     begin
+    HHGear:= Gear;
     a:= CurAmmoType;
-    State:= State and (not gstAttacking);
+    if HHGear <> nil then HHGear^.State:= HHGear^.State and (not gstAttacking);
     if (Ammoz[a].Ammo.Propz and ammoprop_Effect) = 0 then
         begin
         Inc(MultiShootAttacks);
@@ -484,8 +486,8 @@
                     TagTurnTimeLeft:= TurnTimeLeft;
                 TurnTimeLeft:=(Ammoz[a].TimeAfterTurn * cGetAwayTime) div 100;
                 end;
-            if ((Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) = 0) then
-                State:= State or gstAttacked;
+            if ((Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) = 0) and (HHGear <> nil) then 
+                HHGear^.State:= HHGear^.State or gstAttacked;
             if (Ammoz[a].Ammo.Propz and ammoprop_NoRoundEnd) <> 0 then
                 ApplyAmmoChanges(CurrentHedgehog^)
             end;
--- a/hedgewars/uGearsRender.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uGearsRender.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -376,26 +376,26 @@
                         hAngle:= 0;
                         i:= -1
                         end;
-                if ((Gear^.State and gstWinner) = 0) then
-                    begin
-                    DrawHedgehog(ox, oy,
-                            i,
-                            1,
-                            0,
-                            DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + dAngle);
-                    with HH^ do
-                        if (HatTex <> nil) then
-                            begin
-                            DrawTextureRotatedF(HatTex, 1.0, -1.0, -6.0, ox, oy, 0, i, 32, 32,
-                                i*DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + hAngle);
-                            if HatTex^.w > 64 then
+                    if ((Gear^.State and gstWinner) = 0) then
+                        begin
+                        DrawHedgehog(ox, oy,
+                                i,
+                                1,
+                                0,
+                                DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + dAngle);
+                        with HH^ do
+                            if (HatTex <> nil) then
                                 begin
-                                Tint(HH^.Team^.Clan^.Color shl 8 or $FF);
-                                DrawTextureRotatedF(HatTex, 1.0, -1.0, -6.0, ox, oy, 32, i, 32, 32,
+                                DrawTextureRotatedF(HatTex, 1.0, -1.0, -6.0, ox, oy, 0, i, 32, 32,
                                     i*DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + hAngle);
-                                Tint($FF, $FF, $FF, $FF)
+                                if HatTex^.w > 64 then
+                                    begin
+                                    Tint(HH^.Team^.Clan^.Color shl 8 or $FF);
+                                    DrawTextureRotatedF(HatTex, 1.0, -1.0, -6.0, ox, oy, 32, i, 32, 32,
+                                        i*DxDy2Angle(CurAmmoGear^.dY, CurAmmoGear^.dX) + hAngle);
+                                    Tint($FF, $FF, $FF, $FF)
+                                    end
                                 end
-                            end
                     end;
                     DrawAltWeapon(Gear, ox, oy);
                     defaultPos:= false
--- a/hedgewars/uLand.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uLand.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -20,7 +20,7 @@
 
 unit uLand;
 interface
-uses SDLh, uLandTemplates, uFloat, uConsts, GLunit, uTypes;
+uses SDLh, uLandTemplates, uFloat, uConsts, GLunit, uTypes, uAILandMarks;
 
 procedure initModule;
 procedure freeModule;
@@ -35,6 +35,28 @@
 
 var digest: shortstring;
 
+procedure ResizeLand(width, height: LongWord);
+var potW, potH: LongWord;
+begin 
+potW:= toPowerOf2(width);
+potH:= toPowerOf2(height);
+if (potW <> LAND_WIDTH) or (potH <> LAND_HEIGHT) then
+    begin
+    LAND_WIDTH:= potW;
+    LAND_HEIGHT:= potH;
+    LAND_WIDTH_MASK:= not(LAND_WIDTH-1);
+    LAND_HEIGHT_MASK:= not(LAND_HEIGHT-1);
+    cWaterLine:= LAND_HEIGHT;
+    if (cReducedQuality and rqBlurryLand) = 0 then
+        SetLength(LandPixels, LAND_HEIGHT, LAND_WIDTH)
+    else
+        SetLength(LandPixels, LAND_HEIGHT div 2, LAND_WIDTH div 2);
+
+    SetLength(Land, LAND_HEIGHT, LAND_WIDTH);
+    SetLength(LandDirty, (LAND_HEIGHT div 32), (LAND_WIDTH div 32));
+    end;
+end;
+
 procedure ColorizeLand(Surface: PSDL_Surface);
 var tmpsurf: PSDL_Surface;
     r, rr: TSDL_Rect;
@@ -181,6 +203,7 @@
     i: Longword;
     y, x: Longword;
 begin
+    ResizeLand(Template.TemplateWidth, Template.TemplateHeight);
     for y:= 0 to LAND_HEIGHT - 1 do
         for x:= 0 to LAND_WIDTH - 1 do
             Land[y, x]:= lfBasic;
@@ -237,6 +260,7 @@
 
 procedure GenDrawnMap;
 begin
+    ResizeLand(4096, 2048);
     uLandPainted.Draw;
 
     MaxHedgehogs:= 48;
@@ -299,7 +323,7 @@
     WriteLnToConsole('Generating land...');
     case cMapGen of
         0: GenBlank(EdgeTemplates[SelectTemplate]);
-        1: GenMaze;
+        1: begin ResizeLand(4096,2048); GenMaze; end;
         2: GenDrawnMap;
     else
         OutError('Unknown mapgen', true);
@@ -489,7 +513,10 @@
     if tmpsurf = nil then
         tmpsurf:= LoadImage(Pathz[ptMissionMaps] + '/' + mapName + '/map', ifAlpha or ifCritical or ifTransparent or ifIgnoreCaps);
     end;
-TryDo((tmpsurf^.w <= LAND_WIDTH) and (tmpsurf^.h <= LAND_HEIGHT), 'Map dimensions too big!', true);
+// (bare) Sanity check. Considering possible LongInt comparisons as well as just how much system memoery it would take
+TryDo((tmpsurf^.w < $40000000) and (tmpsurf^.h < $40000000) and (tmpsurf^.w * tmpsurf^.h < 6*1024*1024*1024), 'Map dimensions too big!', true);
+
+ResizeLand(tmpsurf^.w, tmpsurf^.h);
 
 // unC0Rr - should this be passed from the GUI? I am not sure which layer does what
 s:= UserPathz[ptMapCurrent] + '/map.cfg';
@@ -676,12 +703,10 @@
                 LandPixels[y,x]:= w or (LandPixels[y div 2, x div 2] and AMask)
                 end
     end;
-
-UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT, false);
 end;
 
 procedure GenPreview(out Preview: TPreview);
-var x, y, xx, yy, t, bit, cbit, lh, lw: LongInt;
+var rh, rw, ox, oy, x, y, xx, yy, t, bit, cbit, lh, lw: LongInt;
 begin
     WriteLnToConsole('Generating preview...');
     case cMapGen of
@@ -692,8 +717,21 @@
         OutError('Unknown mapgen', true);
     end;
 
-    lh:= LAND_HEIGHT div 128;
-    lw:= LAND_WIDTH div 32;
+    // strict scaling needed here since preview assumes a rectangle
+    rh:= max(LAND_HEIGHT,2048);
+    rw:= max(LAND_WIDTH,4096);
+    ox:= 0;
+    if rw < rh*2 then
+        begin
+        rw:= rh*2;
+        end;
+    if rh < rw div 2 then rh:= rw * 2;
+    
+    ox:= (rw-LAND_WIDTH) div 2;
+    oy:= rh-LAND_HEIGHT;
+
+    lh:= rh div 128;
+    lw:= rw div 32;
     for y:= 0 to 127 do
         for x:= 0 to 31 do
         begin
@@ -704,7 +742,8 @@
                 cbit:= bit * 8;
                 for yy:= y * lh to y * lh + 7 do
                     for xx:= x * lw + cbit to x * lw + cbit + 7 do
-                        if Land[yy, xx] <> 0 then
+                        if ((yy-oy) and LAND_HEIGHT_MASK = 0) and ((xx-ox) and LAND_WIDTH_MASK = 0) 
+                           and (Land[yy-oy, xx-ox] <> 0) then
                             inc(t);
                 if t > 8 then
                     Preview[y, x]:= Preview[y, x] or ($80 shr bit);
--- a/hedgewars/uLandGraphics.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uLandGraphics.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -59,7 +59,7 @@
         begin
         addBgColor:= NewColor;
         exit
-        end; 
+        end;
     // Get colors
     oRed   := (OldColor shr RShift);
     oGreen := (OldColor shr GShift);
@@ -72,7 +72,7 @@
     // Mix colors
     nRed   := min(255,((nRed*nAlpha) div 255) + ((oRed*oAlpha*byte(255-nAlpha)) div 65025));
     nGreen := min(255,((nGreen*nAlpha) div 255) + ((oGreen*oAlpha*byte(255-nAlpha)) div 65025));
-    nBlue  := min(255,((nBlue*nAlpha) div 255) + ((oBlue*oAlpha*byte(255-nAlpha)) div 65025)); 
+    nBlue  := min(255,((nBlue*nAlpha) div 255) + ((oBlue*oAlpha*byte(255-nAlpha)) div 65025));
     nAlpha := min(255, oAlpha + nAlpha);
 
     addBgColor := (nAlpha shl AShift) or (nRed shl RShift) or (nGreen shl GShift) or (nBlue shl BShift);
@@ -106,25 +106,25 @@
     begin
     if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
-            if isCurrent then 
+            if isCurrent then
                 Land[y + dy, i]:= Land[y + dy, i] and $FF7F
             else if Land[y + dy, i] and $007F > 0 then
                 Land[y + dy, i]:= (Land[y + dy, i] and $FF80) or ((Land[y + dy, i] and $7F) - 1);
     if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
-            if isCurrent then 
+            if isCurrent then
                 Land[y - dy, i]:= Land[y - dy, i] and $FF7F
             else if Land[y - dy, i] and $007F > 0 then
                 Land[y - dy, i]:= (Land[y - dy, i] and $FF80) or ((Land[y - dy, i] and $7F) - 1);
     if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
-            if isCurrent then 
+            if isCurrent then
                 Land[y + dx, i]:= Land[y + dx, i] and $FF7F
             else if Land[y + dx, i] and $007F > 0 then
                 Land[y + dx, i]:= (Land[y + dx, i] and $FF80) or ((Land[y + dx, i] and $7F) - 1);
     if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
         for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
-            if isCurrent then 
+            if isCurrent then
                 Land[y - dx, i]:= Land[y - dx, i] and $FF7F
             else if Land[y - dx, i] and $007F > 0 then
                 Land[y - dx, i]:= (Land[y - dx, i] and $FF80) or ((Land[y - dx, i] and $7F) - 1)
@@ -133,27 +133,27 @@
     begin
     if ((y + dy) and LAND_HEIGHT_MASK) = 0 then
         for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
-            if isCurrent then 
+            if isCurrent then
                 Land[y + dy, i]:= Land[y + dy, i] or $80
             else if Land[y + dy, i] and $007F < 127 then
                 Land[y + dy, i]:= (Land[y + dy, i] and $FF80) or ((Land[y + dy, i] and $7F) + 1);
-    if ((y - dy) and LAND_HEIGHT_MASK) = 0 then                                                   
-        for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do                                  
-            if isCurrent then                                                                     
-                Land[y - dy, i]:= Land[y - dy, i] or $80                                          
-            else if Land[y - dy, i] and $007F < 127 then                                          
+    if ((y - dy) and LAND_HEIGHT_MASK) = 0 then
+        for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
+            if isCurrent then
+                Land[y - dy, i]:= Land[y - dy, i] or $80
+            else if Land[y - dy, i] and $007F < 127 then
                 Land[y - dy, i]:= (Land[y - dy, i] and $FF80) or ((Land[y - dy, i] and $7F) + 1);
-    if ((y + dx) and LAND_HEIGHT_MASK) = 0 then                                                   
-        for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do                                  
-            if isCurrent then                                                                     
-                Land[y + dx, i]:= Land[y + dx, i] or $80                                          
-            else if Land[y + dx, i] and $007F < 127 then                                          
+    if ((y + dx) and LAND_HEIGHT_MASK) = 0 then
+        for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
+            if isCurrent then
+                Land[y + dx, i]:= Land[y + dx, i] or $80
+            else if Land[y + dx, i] and $007F < 127 then
                 Land[y + dx, i]:= (Land[y + dx, i] and $FF80) or ((Land[y + dx, i] and $7F) + 1);
-    if ((y - dx) and LAND_HEIGHT_MASK) = 0 then                                                   
-        for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do                                  
-            if isCurrent then                                                                     
-                Land[y - dx, i]:= Land[y - dx, i] or $80                                          
-            else if Land[y - dx, i] and $007F < 127 then                                          
+    if ((y - dx) and LAND_HEIGHT_MASK) = 0 then
+        for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
+            if isCurrent then
+                Land[y - dx, i]:= Land[y - dx, i] or $80
+            else if Land[y - dx, i] and $007F < 127 then
                 Land[y - dx, i]:= (Land[y - dx, i] and $FF80) or ((Land[y - dx, i] and $7F) + 1)
     end
 end;
@@ -266,7 +266,7 @@
                 inc(cnt);
                 LandPixels[by, bx]:= LandBackPixel(i, t)
                 end
-            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then 
+            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
                 LandPixels[by, bx]:= 0
             end;
 
@@ -288,7 +288,7 @@
                 inc(cnt);
                 LandPixels[by, bx]:= LandBackPixel(i, t)
                 end
-            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then 
+            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
                 LandPixels[by, bx]:= 0
             end;
 
@@ -310,7 +310,7 @@
                 inc(cnt);
                 LandPixels[by, bx]:= LandBackPixel(i, t)
                 end
-            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then 
+            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
                 LandPixels[by, bx]:= 0
             end;
 t:= y - dx;
@@ -331,7 +331,7 @@
                 inc(cnt);
                 LandPixels[by, bx]:= LandBackPixel(i, t)
                 end
-            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then 
+            else if ((Land[t, i] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
                 LandPixels[by, bx]:= 0
             end;
 FillLandCircleLinesBG:= cnt;
@@ -504,7 +504,7 @@
                     end;
                 if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
                     LandPixels[by, bx]:= LandBackPixel(tx, ty)
-                else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then 
+                else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
                     LandPixels[by, bx]:= 0
                 end
             end;
@@ -567,7 +567,7 @@
     and ((tx and LAND_WIDTH_MASK) = 0)
     and (((Land[ty, tx] and lfBasic) <> 0) or ((Land[ty, tx] and lfObject) <> 0)) then
         begin
-        if despeckle then 
+        if despeckle then
             begin
             Land[ty, tx]:= Land[ty, tx] or lfDamaged;
             LandDirty[ty div 32, tx div 32]:= 1
@@ -837,7 +837,7 @@
 procedure Smooth(X, Y: LongInt);
 begin
 // a bit of AA for explosions
-if (Land[Y, X] = 0) and (Y > LongInt(topY) + 1) and 
+if (Land[Y, X] = 0) and (Y > LongInt(topY) + 1) and
     (Y < LAND_HEIGHT-2) and (X > LongInt(leftX) + 1) and (X < LongInt(rightX) - 1) then
     begin
     if ((((Land[y, x-1] and lfDamaged) <> 0) and (((Land[y+1,x] and lfDamaged) <> 0)) or ((Land[y-1,x] and lfDamaged) <> 0))
--- a/hedgewars/uLandObjects.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uLandObjects.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -501,7 +501,7 @@
             c2.g:= t;
             c2.b:= t
             end;
-        ExplosionBorderColor:= c2.value or AMask;
+        ExplosionBorderColor:= c2.r shl 24 or c2.g shl 16 or c2.b shl 8 or $FF; 
         end
     else if key = 'water-top' then
         begin
@@ -554,7 +554,7 @@
         SetMusicName(Trim(s))
     else if key = 'clouds' then
         begin
-        cCloudsNumber:= Word(StrToInt(Trim(s))) * cScreenSpace div LAND_WIDTH;
+        cCloudsNumber:= Word(StrToInt(Trim(s))) * cScreenSpace div 4096;
         cSDCloudsNumber:= cCloudsNumber
         end
     else if key = 'object' then
@@ -700,7 +700,7 @@
     else if key = 'sd-water-opacity' then
         SDWaterOpacity:= StrToInt(Trim(s))
     else if key = 'sd-clouds' then
-        cSDCloudsNumber:= Word(StrToInt(Trim(s))) * cScreenSpace div LAND_WIDTH
+        cSDCloudsNumber:= Word(StrToInt(Trim(s))) * cScreenSpace div 4096
     else if key = 'sd-flakes' then
         begin
         i:= Pos(',', s);
--- a/hedgewars/uLandTemplates.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uLandTemplates.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -1571,9 +1571,191 @@
       (
        (X: 512; Y:    0)
       );
+// Many islands
+const Template43Points: array[0..173] of TSDL_Rect =
+      (
+       (x:   95; y: 500; w:   1; h:   1),
+       (x:  100; y: 275; w:  25; h: 100),
+       (x:  325; y: 275; w:  25; h: 100),
+       (x:  330; y: 500; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x:  725; y: 125; w:   1; h:   1),
+       (x:  725; y:  25; w:   5; h:  25),
+       (x:  825; y:  35; w:   5; h:  10),
+       (x:  825; y: 135; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 1150; y: 550; w:  25; h:  50),
+       (x: 1250; y: 300; w:  25; h:  50),
+       (x: 1350; y: 300; w:  25; h:  50),
+       (x: 1400; y: 575; w:  25; h:  50),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x:  525; y:1050; w:  50; h:  50),
+       (x:  700; y: 800; w: 100; h: 150),
+       (x:  950; y: 900; w: 100; h: 150),
+       (x: 1100; y:1100; w:  50; h:  50),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x:  175; y:1500; w:   1; h:   1),
+       (x:  210; y:1400; w:   5; h:  25),
+       (x:  240; y:1400; w:   5; h:  25),
+       (x:  275; y:1510; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x:  450; y:1800; w: 100; h: 100),
+       (x:  600; y:1750; w: 100; h: 100),
+       (x:  750; y:1750; w: 100; h: 100),
+       (x:  950; y:1850; w: 100; h: 100),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 1075; y:1450; w:   1; h:   1),
+       (x: 1110; y:1300; w:   5; h:  25),
+       (x: 1140; y:1300; w:   5; h:  25),
+       (x: 1175; y:1430; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 1600; y:1250; w:  25; h: 100),
+       (x: 1700; y:1150; w:  25; h: 100),
+       (x: 1850; y: 500; w:  50; h: 100),
+       (x: 1950; y: 550; w:  50; h: 150),
+       (x: 2250; y:1150; w:  25; h: 100),
+       (x: 2350; y:1250; w:  25; h: 100),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 1750; y:2010; w:   1; h:   1),
+       (x: 1900; y:1870; w:  50; h:  50),
+       (x: 2050; y:1870; w:  50; h:  50),
+       (x: 2175; y:2010; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 2500; y:1700; w:   1; h:   1),
+       (x: 2575; y:1500; w:  10; h:  50),
+       (x: 2650; y:1500; w:  10; h:  50),
+       (x: 2700; y:1690; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 2000; y: 125; w:   1; h:   1),
+       (x: 2050; y:  50; w:  25; h:  25),
+       (x: 2100; y:  50; w:  25; h:  25),
+       (x: 2150; y: 150; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 2600; y: 250; w:  25; h: 100),
+       (x: 2750; y: 400; w:  50; h:  50),
+       (x: 2900; y: 525; w:  50; h:  50),
+       (x: 3150; y: 550; w:  50; h: 100),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 2800; y:1150; w:   1; h:   1),
+       (x: 2840; y: 950; w:  25; h:  25),
+       (x: 2880; y: 950; w:  25; h:  25),
+       (x: 2900; y:1150; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 3075; y:1985; w:   1; h:   1),
+       (x: 3325; y:1700; w:  50; h: 100),
+       (x: 3475; y:1700; w:  50; h: 100),
+       (x: 3625; y:1985; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 3200; y:1450; w:   1; h:   1),
+       (x: 3240; y:1350; w:  25; h:  25),
+       (x: 3280; y:1350; w:  25; h:  25),
+       (x: 3300; y:1450; w:   1; h:   1),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 3500; y:1050; w:  25; h:  50),
+       (x: 3650; y: 600; w:  50; h: 100),
+       (x: 3800; y: 600; w:  50; h: 100),
+       (x: 3900; y:1000; w:  25; h:  50),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x: 3800; y: 200; w:  25; h:  50),
+       (x: 3875; y: 100; w:  50; h:  50),
+       (x: 3925; y:  50; w:  50; h:  25),
+       (x: 4050; y: 125; w:  25; h:  50),
+       (x: NTPX; y:   0; w:   1; h:   1),
+       (x:   95; y:2548; w:   1; h:   1),
+       (x:  100; y:2323; w:  25; h: 100),
+       (x:  325; y:2323; w:  25; h: 100),
+       (x:  330; y:2548; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x:  725; y:2173; w:   1; h:   1),
+       (x:  725; y:2073; w:   5; h:  25),
+       (x:  825; y:2083; w:   5; h:  10),
+       (x:  825; y:2183; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 1150; y:2598; w:  25; h:  50),
+       (x: 1250; y:2348; w:  25; h:  50),
+       (x: 1350; y:2348; w:  25; h:  50),
+       (x: 1400; y:2623; w:  25; h:  50),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x:  525; y:3098; w:  50; h:  50),
+       (x:  700; y:2848; w: 100; h: 150),
+       (x:  950; y:2948; w: 100; h: 150),
+       (x: 1100; y:3148; w:  50; h:  50),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x:  175; y:3548; w:   1; h:   1),
+       (x:  210; y:3448; w:   5; h:  25),
+       (x:  240; y:3448; w:   5; h:  25),
+       (x:  275; y:3558; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x:  450; y:3848; w: 100; h: 100),
+       (x:  600; y:3798; w: 100; h: 100),
+       (x:  750; y:3798; w: 100; h: 100),
+       (x:  950; y:3898; w: 100; h: 100),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 1075; y:3498; w:   1; h:   1),
+       (x: 1110; y:3348; w:   5; h:  25),
+       (x: 1140; y:3348; w:   5; h:  25),
+       (x: 1175; y:3478; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 1600; y:3298; w:  25; h: 100),
+       (x: 1700; y:3198; w:  25; h: 100),
+       (x: 1850; y:2548; w:  50; h: 100),
+       (x: 1950; y:2598; w:  50; h: 150),
+       (x: 2250; y:3198; w:  25; h: 100),
+       (x: 2350; y:3298; w:  25; h: 100),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 1750; y:4058; w:   1; h:   1),
+       (x: 1900; y:3918; w:  50; h:  50),
+       (x: 2050; y:3918; w:  50; h:  50),
+       (x: 2175; y:4058; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 2500; y:3748; w:   1; h:   1),
+       (x: 2575; y:3548; w:  10; h:  50),
+       (x: 2650; y:3548; w:  10; h:  50),
+       (x: 2700; y:3738; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 2000; y:2173; w:   1; h:   1),
+       (x: 2050; y:2098; w:  25; h:  25),
+       (x: 2100; y:2098; w:  25; h:  25),
+       (x: 2150; y:2198; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 2600; y:2298; w:  25; h: 100),
+       (x: 2750; y:2448; w:  50; h:  50),
+       (x: 2900; y:2573; w:  50; h:  50),
+       (x: 3150; y:2598; w:  50; h: 100),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 2800; y:3198; w:   1; h:   1),
+       (x: 2840; y:2998; w:  25; h:  25),
+       (x: 2880; y:2998; w:  25; h:  25),
+       (x: 2900; y:3198; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 3075; y:4033; w:   1; h:   1),
+       (x: 3325; y:3748; w:  50; h: 100),
+       (x: 3475; y:3748; w:  50; h: 100),
+       (x: 3625; y:4033; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 3200; y:3498; w:   1; h:   1),
+       (x: 3240; y:3398; w:  25; h:  25),
+       (x: 3280; y:3398; w:  25; h:  25),
+       (x: 3300; y:3498; w:   1; h:   1),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 3500; y:3098; w:  25; h:  50),
+       (x: 3650; y:2648; w:  50; h: 100),
+       (x: 3800; y:2648; w:  50; h: 100),
+       (x: 3900; y:3048; w:  25; h:  50),
+       (x: NTPX; y:2048; w:   1; h:   1),
+       (x: 3800; y:2248; w:  25; h:  50),
+       (x: 3875; y:2148; w:  50; h:  50),
+       (x: 3925; y:2098; w:  50; h:  25),
+       (x: 4050; y:2173; w:  25; h:  50),
+       (x: NTPX; y:2048; w:   1; h:   1)
+      );
+      Template43FPoints: array[0..0] of TPoint =
+      (
+       (X: 4095; Y:    0)
+      );
 
 ////////////////////////////////////////////////////////////////////////
-var EdgeTemplates: array[0..42] of TEdgeTemplate =
+var EdgeTemplates: array[0..43] of TEdgeTemplate =
       (
        (BasePoints: @Template0Points;
         BasePointsCount: Succ(High(Template0Points));
@@ -2047,19 +2229,30 @@
         canMirror: true; canFlip: false; isNegative: false; canInvert: false;
         hasGirders: false;
         MaxHedgeHogs: 8;
+       ),
+       (BasePoints: @Template43Points;
+        BasePointsCount: Succ(High(Template43Points));
+        FillPoints: @Template43FPoints;
+        FillPointsCount: Succ(High(Template43FPoints));
+        BezierizeCount: 3;
+        RandPassesCount: 5;
+        TemplateHeight: 4096; TemplateWidth: 4096;
+        canMirror: true; canFlip: true; isNegative: false; canInvert: false;
+        hasGirders: true;
+        MaxHedgeHogs: 48;
        )
       );
 const SmallTemplates: array[0..2] of Longword = ( 39, 40, 42 );
 const MediumTemplates: array[0..17] of Longword =
       ( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17 );
-const LargeTemplates: array[0..19] of Longword =
+const LargeTemplates: array[0..20] of Longword =
       (
         18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
-        28, 29, 30, 31, 32, 33, 34, 35, 37, 38
+        28, 29, 30, 31, 32, 33, 34, 35, 37, 38, 43
       );
 const CavernTemplates: array[0..4] of Longword = (36, 2, 3, 21, 29);
 //const WackyTemplates: array[0..4] of Longword = (37, 38, 39, 40, 41);
-const WackyTemplates: array[0..2] of Longword = (37, 38, 41);
+const WackyTemplates: array[0..3] of Longword = (37, 38, 41, 43);
 
 implementation
 
--- a/hedgewars/uRenderUtils.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uRenderUtils.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -92,7 +92,7 @@
     textRect.y:= Y;
     textRect.w:= w;
     textRect.h:= h;
-    DrawRoundRect(@finalRect, cWhiteColor, endian(cNearBlackColorChannels.value), Surface, true);
+    DrawRoundRect(@finalRect, cWhiteColor, cNearBlackColor, Surface, true);
     clr.r:= (Color shr 16) and $FF;
     clr.g:= (Color shr 8) and $FF;
     clr.b:= Color and $FF;
--- a/hedgewars/uScript.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uScript.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -412,7 +412,7 @@
         begin
         gear:= GearByUID(lua_tointeger(L, 1));
         if gear <> nil then
-            DeleteGear(gear);
+            gear^.Message:= gear^.Message or gmDelete;
         end;
     lc_deletegear:= 0
 end;
@@ -744,7 +744,7 @@
             TryDo(texsurf <> nil, errmsgCreateSurface, true);
             TryDo(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
 
-            DrawRoundRect(@r, cWhiteColor, cNearBlackColorChannels.value, texsurf, true);
+            DrawRoundRect(@r, cWhiteColor, cNearBlackColor, texsurf, true);
             rr:= r;
             inc(rr.x, 2); dec(rr.w, 4); inc(rr.y, 2); dec(rr.h, 4);
             DrawRoundRect(@rr, clan^.Color, clan^.Color, texsurf, false);
--- a/hedgewars/uStore.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uStore.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -131,10 +131,11 @@
 
 procedure WriteNames(Font: THWFont);
 var t: LongInt;
-    i: LongInt;
+    i, maxLevel: LongInt;
     r, rr: TSDL_Rect;
     drY: LongInt;
     texsurf, flagsurf, iconsurf: PSDL_Surface;
+    foundBot: boolean;
 begin
 r.x:= 0;
 r.y:= 0;
@@ -151,7 +152,7 @@
         TryDo(texsurf <> nil, errmsgCreateSurface, true);
         TryDo(SDL_SetColorKey(texsurf, SDL_SRCCOLORKEY, 0) = 0, errmsgTransparentSet, true);
 
-        DrawRoundRect(@r, cWhiteColor, cNearBlackColorChannels.value, texsurf, true);
+        DrawRoundRect(@r, cWhiteColor, cNearBlackColor, texsurf, true);
         rr:= r;
         inc(rr.x, 2); dec(rr.w, 4); inc(rr.y, 2); dec(rr.h, 4);
         DrawRoundRect(@rr, Clan^.Color, Clan^.Color, texsurf, false);
@@ -172,11 +173,28 @@
         DrawRoundRect(@r, cWhiteColor, cNearBlackColor, texsurf, true);
 
         // overwrite flag for cpu teams and keep players from using it
-        if (Hedgehogs[0].Gear <> nil) and (Hedgehogs[0].BotLevel > 0) then
-            if Flag = 'hedgewars' then
-                Flag:= 'cpu'
-        else if Flag = 'cpu' then
-            Flag:= 'hedgewars';
+        foundBot:= false;
+        maxLevel:= -1;
+        for i:= 0 to cMaxHHIndex do
+            with Hedgehogs[i] do
+                if (Gear <> nil) and (BotLevel > 0) then
+                    begin
+                    foundBot:= true;
+                    // initially was going to do the highest botlevel of the team, but for now, just apply if entire team has same bot level
+                    if maxLevel = -1 then maxLevel:= BotLevel
+                    else if (maxLevel > 0) and (maxLevel <> BotLevel) then maxLevel:= 0; 
+                    //if (maxLevel > 0) and (BotLevel < maxLevel) then maxLevel:= BotLevel
+                    end
+                else if Gear <> nil then  maxLevel:= 0;
+
+        if foundBot then
+            begin
+            // disabled the plain flag - I think it looks ok even w/ full bars obscuring CPU
+            //if (maxLevel > 0) and (maxLevel < 3) then Flag:= 'cpu_plain' else 
+            Flag:= 'cpu'
+            end
+        else if (Flag = 'cpu') or (Flag = 'cpu_plain') then
+                Flag:= 'hedgewars';
 
         flagsurf:= LoadImage(UserPathz[ptFlags] + '/' + Flag, ifNone);
         if flagsurf = nil then
@@ -186,16 +204,27 @@
         if flagsurf = nil then
             flagsurf:= LoadImage(Pathz[ptFlags] + '/hedgewars', ifNone);
         TryDo(flagsurf <> nil, 'Failed to load flag "' + Flag + '" as well as the default flag', true);
+
+        case maxLevel of
+            1: copyToXY(SpritesData[sprBotlevels].Surface, flagsurf, 0, 0); 
+            2: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 5, 2, 17, 13, 5, 2); 
+            3: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 9, 5, 13, 10, 9, 5); 
+            4: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 13, 9, 9, 6, 13, 9); 
+            5: copyToXYFromRect(SpritesData[sprBotlevels].Surface, flagsurf, 17, 11, 5, 4, 17, 11)
+            end;
+
         copyToXY(flagsurf, texsurf, 2, 2);
         SDL_FreeSurface(flagsurf);
         flagsurf:= nil;
 
+
         // restore black border pixels inside the flag
         PLongwordArray(texsurf^.pixels)^[32 * 2 +  2]:= cNearBlackColor;
         PLongwordArray(texsurf^.pixels)^[32 * 2 + 23]:= cNearBlackColor;
         PLongwordArray(texsurf^.pixels)^[32 * 16 +  2]:= cNearBlackColor;
         PLongwordArray(texsurf^.pixels)^[32 * 16 + 23]:= cNearBlackColor;
 
+
         FlagTex:= Surface2Tex(texsurf, false);
         SDL_FreeSurface(texsurf);
         texsurf:= nil;
@@ -204,7 +233,7 @@
 
         dec(drY, r.h + 2);
         DrawHealthY:= drY;
-        for i:= 0 to 7 do
+        for i:= 0 to cMaxHHIndex do
             with Hedgehogs[i] do
                 if Gear <> nil then
                     begin
@@ -294,7 +323,6 @@
             WriteLnToConsole(msgOK)
             end;
 
-WriteNames(fnt16);
 MakeCrossHairs;
 LoadGraves;
 if not reload then
@@ -391,6 +419,8 @@
                 Surface:= nil
         end;
 
+WriteNames(fnt16);
+
 if not reload then
     AddProgress;
 
--- a/hedgewars/uTypes.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uTypes.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -86,7 +86,7 @@
             sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb,
             sprBulletHit, sprSnowball, sprHandSnowball, sprSnow,
             sprSDFlake, sprSDWater, sprSDCloud, sprSDSplash, sprSDDroplet, sprTardis,
-            sprSlider
+            sprSlider, sprBotlevels
             );
 
     // Gears that interact with other Gears and/or Land
--- a/hedgewars/uUtils.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uUtils.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -43,7 +43,7 @@
 function  StrToInt(s: shortstring): LongInt;
 function  FloatToStr(n: hwFloat): shortstring;
 
-function  DxDy2Angle(const _dY, _dX: hwFloat): GLfloat;
+function  DxDy2Angle(const _dY, _dX: hwFloat): GLfloat; inline;
 function  DxDy2Angle32(const _dY, _dX: hwFloat): LongInt;
 function  DxDy2AttackAngle(const _dY, _dX: hwFloat): LongInt;
 function  DxDy2AttackAnglef(const _dY, _dX: extended): LongInt;
@@ -182,15 +182,11 @@
 end;
 
 
-function DxDy2Angle(const _dY, _dX: hwFloat): GLfloat;
+function DxDy2Angle(const _dY, _dX: hwFloat): GLfloat; inline;
 var dY, dX: Extended;
 begin
-dY:= _dY.QWordValue / $100000000;
-if _dY.isNegative then
-    dY:= - dY;
-dX:= _dX.QWordValue / $100000000;
-if _dX.isNegative then
-    dX:= - dX;
+dY:= hwFloat2Float(_dY);
+dX:= hwFloat2Float(_dX);
 DxDy2Angle:= arctan2(dY, dX) * 180 / pi
 end;
 
@@ -198,12 +194,8 @@
 const _16divPI: Extended = 16/pi;
 var dY, dX: Extended;
 begin
-dY:= _dY.QWordValue / $100000000;
-if _dY.isNegative then
-    dY:= - dY;
-dX:= _dX.QWordValue / $100000000;
-if _dX.isNegative then
-    dX:= - dX;
+dY:= hwFloat2Float(_dY);
+dX:= hwFloat2Float(_dX);
 DxDy2Angle32:= trunc(arctan2(dY, dX) * _16divPI) and $1f
 end;
 
@@ -211,12 +203,8 @@
 const MaxAngleDivPI: Extended = cMaxAngle/pi;
 var dY, dX: Extended;
 begin
-dY:= _dY.QWordValue / $100000000;
-if _dY.isNegative then
-    dY:= - dY;
-dX:= _dX.QWordValue / $100000000;
-if _dX.isNegative then
-    dX:= - dX;
+dY:= hwFloat2Float(_dY);
+dX:= hwFloat2Float(_dX);
 DxDy2AttackAngle:= trunc(arctan2(dY, dX) * MaxAngleDivPI)
 end;
 
--- a/hedgewars/uVariables.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uVariables.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -644,7 +644,9 @@
             (FileName:  'TARDIS'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
             Width:  48; Height: 79; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpHighest; getDimensions: false; getImageDimensions: true),// sprTardis
             (FileName:  'slider'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
-            Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false) // sprSlider
+            Width: 3; Height: 17; imageWidth: 3; imageHeight: 17; saveSurf: false; priority: tpLow; getDimensions: false; getImageDimensions: false), // sprSlider
+            (FileName:  'botlevels'; Path: ptGraphics; AltPath: ptNone; Texture: nil; Surface: nil;
+            Width: 22; Height: 15; imageWidth: 22; imageHeight: 15; saveSurf: true; priority: tpLow; getDimensions: false; getImageDimensions: false) // sprBotlevels
             );
 
 const
--- a/hedgewars/uVisualGears.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uVisualGears.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -958,10 +958,10 @@
     exit;
 
 if hasBorder or ((Theme <> 'Snow') and (Theme <> 'Christmas')) then
-    for i:= 0 to Pred(vobCount * cScreenSpace div LAND_WIDTH) do
+    for i:= 0 to Pred(vobCount * cScreenSpace div 4096) do
         AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake)
 else
-    for i:= 0 to Pred((vobCount * cScreenSpace div LAND_WIDTH) div 3) do
+    for i:= 0 to Pred((vobCount * cScreenSpace div 4096) div 3) do
         AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake);
 end;
 
--- a/hedgewars/uWorld.pas	Sat Aug 18 00:47:51 2012 +0200
+++ b/hedgewars/uWorld.pas	Sat Aug 18 00:48:09 2012 +0200
@@ -1614,10 +1614,7 @@
     uCursor.updatePosition();
 {$ENDIF}
 z:= round(200/zoom);
-if not PlacingHogs and (FollowGear <> nil) and (not isCursorVisible) and (not bShowAmmoMenu) and (not fastUntilLag) then
-    if (not autoCameraOn) then
-        FollowGear:= nil
-    else
+if not PlacingHogs and (FollowGear <> nil) and (not isCursorVisible) and (not bShowAmmoMenu) and (not fastUntilLag) and autoCameraOn then
     if ((abs(CursorPoint.X - prevPoint.X) + abs(CursorPoint.Y - prevpoint.Y)) > 4) then
         begin
         FollowGear:= nil;
Binary file share/hedgewars/Data/Graphics/Flags/cpu_plain.png has changed
Binary file share/hedgewars/Data/Graphics/botlevels.png has changed
--- a/share/hedgewars/Data/Locale/en.txt	Sat Aug 18 00:47:51 2012 +0200
+++ b/share/hedgewars/Data/Locale/en.txt	Sat Aug 18 00:48:09 2012 +0200
@@ -492,7 +492,7 @@
 04:36=Well, sometimes you're just too bad in aiming. Get|some assistance using modern day technology.|Attack: Activate
 04:37=Don't fear the daylight. It will just last one turn|but will enable you to absorb the damage you do to|other hogs.|Attack: Activate
 04:38=The sniper rifle can be the most devastating weapon|in your whole arsenal, however it's very ineffective|at close quarters. The damage dealt increases with|the distance to its target.|Attack: Shoot (twice)
-04:39=Fly to other parts of the map using the flying|saucer. This hard to master utility is able to|take you to almost any position on the battlefield.|Attack: Activate|Up/Left/Right: Apply force in one direction|Long Jump: Drop grenades or similar weapons
+04:39=Fly to other parts of the map using the flying|saucer. This hard to master utility can|take you to almost any position on the battlefield.|Attack: Activate|Up/Left/Right: Apply force in one direction|Long Jump: Drop grenades or similar weapons
 04:40=Set some ground on fire using this bottle filled|with (soon to be) burning liquid.|Attack: Hold to shoot with more power
 04:41=The evidence nature might even top the flying|saucer. Birdy can carry your hog around and|drop eggs on your enemies!|Be quick, as using Birdy eats into your turn|time!|Attack: Activate and drop eggs|Up/Left/Right: Flap in one direction
 04:42=This portable portal device is capable|of instantly transporting you, your enemies,|or your weaponry between two points on the|terrain.|Use it wisely and your campaign will be a...|HUGE SUCCESS!|Attack: Shoot a portal|Switch: Cycle portal colours
@@ -506,7 +506,7 @@
 04:50=Is someone hiding underground?|Dig them out with a drill strike!|Timer controls how far it will dig.
 04:51=Get in a free shot by hurling a ball of mud.|Stings a bit, and knocks hogs back.
 04:52=UNUSED
-04:53=Go on an adventure through time and space,|while leaving your comrades to fight on alone.|Be prepared to return at any time,|or for Sudden Death or if they are all defeated.|Disclaimer. Does not function in Sudden Death,|if you are alone, or if you are a King.
+04:53=Take a trip through time and space,|while leaving your comrades to fight on alone.|Be prepared to return at any time,|or for Sudden Death or if they are all defeated.|Disclaimer. Does not function in Sudden Death,|if you are alone, or if you are a King.
 04:54=INCOMPLETE                                                                                                                                     
 04:55=Spray a stream of sticky flakes.|Build bridges, bury enemies, seal off tunnels.|Be careful you don't get any on you!
 
--- a/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts	Sat Aug 18 00:47:51 2012 +0200
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts	Sat Aug 18 00:48:09 2012 +0200
@@ -2,325 +2,240 @@
 <!DOCTYPE TS>
 <TS version="2.0" language="zh_CN">
 <context>
-    <name>AmmoSchemeModel</name>
-    <message>
-        <source>new</source>
-        <translation>新建</translation>
-    </message>
-    <message>
-        <source>copy of</source>
-        <translation>副本</translation>
-    </message>
-</context>
-<context>
-    <name>DrawMapWidget</name>
-    <message>
-        <source>File error</source>
-        <translation>文件错误</translation>
-    </message>
-    <message>
-        <source>Cannot open file &apos;%1&apos; for writing</source>
-        <translatorcomment>无法打开文件 &apos;%1&apos; 写入</translatorcomment>
-        <translation>无法打开要写入的文件 &apos;%1&apos;</translation>
-    </message>
-    <message>
-        <source>Cannot read file &apos;%1&apos;</source>
-        <translation>无法读取文件 &apos;%1&apos;</translation>
-    </message>
-</context>
-<context>
     <name>FreqSpinBox</name>
     <message>
+        <location filename="../../../../QTfrontend/misc.h" line="38"/>
         <source>Never</source>
         <translation>从不</translation>
     </message>
     <message numerus="yes">
+        <location filename="../../../../QTfrontend/misc.h" line="40"/>
         <source>Every %1 turn</source>
         <translation>
-            <numerusform>每 %1 个回合</numerusform>
+            <numerusform>每隔 %1 回合</numerusform>
         </translation>
     </message>
 </context>
 <context>
     <name>GameCFGWidget</name>
     <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="129"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="129"/>
         <source>Illegal ammo scheme</source>
         <translation>无法使用此弹药设置</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="57"/>
         <source>Edit schemes</source>
         <translation>修改游戏设置</translation>
     </message>
-    <message>
-        <source>Edit weapons</source>
-        <translation>修改武器</translation>
-    </message>
-    <message>
-        <source>When this option is enabled selecting a game scheme will auto-select a weapon</source>
-        <translation>使用此项则游戏框架自动选择武器配备</translation>
-    </message>
-    <message>
-        <source>Game Options</source>
-        <translation>游戏选项</translation>
-    </message>
 </context>
 <context>
-    <name>HWChatWidget</name>
-    <message>
-        <source>%1 *** %2 has been removed from your ignore list</source>
-        <translation type="obsolete">%1 *** %2 已经从您的忽略列表中移除</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has been added to your ignore list</source>
-        <translation type="obsolete">%1 *** %2 已经添加到您的忽略列表中</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has been removed from your friends list</source>
-        <translation type="obsolete">%1 *** %2 已经从您的朋友列表中移除</translation>
-    </message>
+    <name>GameUIConfig</name>
     <message>
-        <source>%1 *** %2 has been added to your friends list</source>
-        <translation type="obsolete">%1 *** %2 已经添加到您的朋友列表中</translation>
-    </message>
-    <message>
-        <source>%1 has been removed from your ignore list</source>
-        <translation>%1 已从您的忽略列表中移除</translation>
-    </message>
-    <message>
-        <source>%1 has been added to your ignore list</source>
-        <translation>%1 已被添加到您的忽略列表中</translation>
-    </message>
-    <message>
-        <source>%1 has been removed from your friends list</source>
-        <translation>%1 已从您的好友列表中移除</translation>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="0"/>
+        <source>Error</source>
+        <translation type="obsolete">错误</translation>
     </message>
     <message>
-        <source>%1 has been added to your friends list</source>
-        <translation>%1 已加入您的好友列表</translation>
-    </message>
-    <message>
-        <source>Stylesheet imported from %1</source>
-        <translation>已从 %1 导入样式表</translation>
-    </message>
-    <message>
-        <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation>键入 %1 以使用当前的样式表,键入 %2 以重置!</translation>
-    </message>
-    <message>
-        <source>Couldn&apos;t read %1</source>
-        <translation>无法读取 %1</translation>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="0"/>
+        <source>Cannot create directory %1</source>
+        <translation type="obsolete">不能创建路径</translation>
     </message>
     <message>
-        <source>StyleSheet discarded</source>
-        <translation>已丢弃样式表</translation>
-    </message>
-    <message>
-        <source>StyleSheet saved to %1</source>
-        <translation>样式表已保存到 %1</translation>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="0"/>
+        <source>Quit</source>
+        <translation type="obsolete">退出</translation>
     </message>
     <message>
-        <source>Failed to save StyleSheet to %1</source>
-        <translation>保存样式表到 %1 失败</translation>
-    </message>
-    <message>
-        <source>%1 is not a valid command!</source>
-        <translation>%1 不是一个有效的命令!</translation>
-    </message>
-    <message>
-        <source>Kicking %1 ...</source>
-        <translation>正在踢出 %1 ...</translation>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="0"/>
+        <source>Cannot save options to file %1</source>
+        <translation type="obsolete">不能把选项保存到 %1</translation>
     </message>
 </context>
 <context>
     <name>HWForm</name>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="639"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="0"/>
+        <source>Please, select demo from the list above</source>
+        <translation type="obsolete">请选择一个DEMO</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="484"/>
         <source>OK</source>
         <translation>确认</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="0"/>
+        <source>Please, select server from the list above</source>
+        <translation type="obsolete">请选择一个服务器</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="483"/>
+        <source>Please, select record from the list above</source>
+        <translation>请选择一个记录</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="794"/>
         <source>Cannot save record to file %1</source>
         <translation>无法录入文件 %1</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="640"/>
         <source>Unable to start the server</source>
         <translation>开启服务端出现错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="256"/>
         <source>new</source>
-        <translation type="obsolete">新</translation>
-    </message>
-    <message>
-        <source>Please select record from the list above</source>
-        <translation>请选择一个记录</translation>
-    </message>
-    <message>
-        <source>DefaultTeam</source>
-        <translation>默认队伍</translation>
-    </message>
-    <message>
-        <source>Hedgewars Demo File</source>
-        <comment>File Types</comment>
-        <translation>刺猬大作战回放文件</translation>
-    </message>
-    <message>
-        <source>Hedgewars Save File</source>
-        <comment>File Types</comment>
-        <translation>刺猬大作战存档文件</translation>
-    </message>
-    <message>
-        <source>Demo name</source>
-        <translation>回放录像名称</translation>
-    </message>
-    <message>
-        <source>Demo name:</source>
-        <translation>回放录像名称:</translation>
-    </message>
-    <message>
-        <source>Game aborted</source>
-        <translation>游戏被中断</translation>
-    </message>
-    <message>
-        <source>Password</source>
-        <translation>密码</translation>
-    </message>
-    <message>
-        <source>Your nickname %1 is
-registered on Hedgewars.org
-Please provide your password below
-or pick another nickname in game config:</source>
-        <translation>您的昵称%1
-在Hedgewars.org已注册
-请输入您的密码
-或从游戏配置中选择另一个昵称:</translation>
-    </message>
-    <message>
-        <source>No password supplied.</source>
-        <translation>没有填写密码.</translation>
-    </message>
-    <message>
-        <source>Nickname</source>
-        <translation>昵称</translation>
-    </message>
-    <message>
-        <source>Some one already uses
- your nickname %1
-on the server.
-Please pick another nickname:</source>
-        <translation>您的昵称 %1
-以被其他人
-在服务器上使用
-请选择另一个昵称:</translation>
-    </message>
-    <message>
-        <source>No nickname supplied.</source>
-        <translation>没有填写昵称。</translation>
+        <translation>新</translation>
     </message>
 </context>
 <context>
     <name>HWGame</name>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="0"/>
+        <source>Error</source>
+        <translation type="obsolete">错误</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="0"/>
+        <source>Unable to start the server: %1.</source>
+        <translation type="obsolete">开启服务端出现错误: %1.</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/game.cpp" line="280"/>
         <source>en.txt</source>
         <translation>zh_CN.txt</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/game.cpp" line="0"/>
+        <source>Cannot save demo to file %1</source>
+        <translation type="obsolete">不能把demo保存为 %1</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/game.cpp" line="0"/>
+        <source>Quit</source>
+        <translation type="obsolete">退出</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/game.cpp" line="305"/>
         <source>Cannot open demofile %1</source>
         <translation>DEMO %1 打不开</translation>
     </message>
+    <message>
+        <location filename="../../../../QTfrontend/game.cpp" line="0"/>
+        <source>Unable to run engine: %1 (</source>
+        <translation type="obsolete">引擎无法启动: %1 (</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/game.cpp" line="147"/>
+        <source>Error reading training config file</source>
+        <translation>训练设置文件无法读取</translation>
+    </message>
 </context>
 <context>
     <name>HWMapContainer</name>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="90"/>
         <source>Map</source>
         <translation>地图</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="110"/>
         <source>Themes</source>
         <translation>主题</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="93"/>
         <source>Filter</source>
         <translation>过滤</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="97"/>
         <source>All</source>
         <translation>全部</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="98"/>
         <source>Small</source>
         <translation>小型</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="99"/>
         <source>Medium</source>
         <translation>中型</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="100"/>
         <source>Large</source>
         <translation>大型</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="101"/>
         <source>Cavern</source>
         <translation>洞穴</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="102"/>
         <source>Wacky</source>
-        <translation>险峻</translation>
-    </message>
-    <message>
-        <source>Type</source>
-        <translation>类型</translation>
+        <translation>曲折</translation>
     </message>
+</context>
+<context>
+    <name>HWNet</name>
     <message>
-        <source>Small tunnels</source>
-        <translation>小型隧道</translation>
-    </message>
-    <message>
-        <source>Medium tunnels</source>
-        <translation>中型隧道</translation>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="0"/>
+        <source>Error</source>
+        <translation type="obsolete">错误</translation>
     </message>
     <message>
-        <source>Large tunnels</source>
-        <translation>大型隧道</translation>
-    </message>
-    <message>
-        <source>Small floating islands</source>
-        <translation>小型漂浮岛屿</translation>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="0"/>
+        <source>The host was not found. Please check the host name and port settings.</source>
+        <translation type="obsolete">未发现主机。请检查主机名和端口设置。</translation>
     </message>
     <message>
-        <source>Medium floating islands</source>
-        <translation>中型漂浮岛屿</translation>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="0"/>
+        <source>Connection refused</source>
+        <translation type="obsolete">连接被拒绝</translation>
+    </message>
+</context>
+<context>
+    <name>HWNetServer</name>
+    <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="0"/>
+        <source>Error</source>
+        <translation type="obsolete">错误</translation>
     </message>
     <message>
-        <source>Large floating islands</source>
-        <translation>大型漂浮岛屿</translation>
-    </message>
-    <message>
-        <source>Seed</source>
-        <translation>作种</translation>
-    </message>
-    <message>
-        <source>Set</source>
-        <translation>设定</translation>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="0"/>
+        <source>Unable to start the server: %1.</source>
+        <translation type="obsolete">无法启动服务端: %1.</translation>
     </message>
 </context>
 <context>
     <name>HWNetServersModel</name>
     <message>
+        <location filename="../../../../QTfrontend/netserverslist.cpp" line="45"/>
         <source>Title</source>
-        <translation>名称</translation>
+        <translation>标题</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/netserverslist.cpp" line="46"/>
         <source>IP</source>
         <translation>IP</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/netserverslist.cpp" line="47"/>
         <source>Port</source>
         <translation>端口</translation>
     </message>
@@ -328,177 +243,109 @@
 <context>
     <name>HWNewNet</name>
     <message>
-        <source>The host was not found. Please check the host name and port settings.</source>
-        <translation>没找到主机。请检查主机名和端口设置。</translation>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="187"/>
+        <source>Error</source>
+        <translation type="obsolete">错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="192"/>
+        <source>The host was not found. Please check the host name and port settings.</source>
+        <translation>错误没找到这个主机。请检查主机名和端口设置。</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="195"/>
         <source>Connection refused</source>
         <translation>连接被拒绝</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="402"/>
+        <source>*** %1 joined</source>
+        <translation>*** %1 加入</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="439"/>
+        <source>*** %1 left</source>
+        <translation>*** %1 离开</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="441"/>
+        <source>*** %1 left (%2)</source>
+        <translation>*** %1 离开 (%2)</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="531"/>
         <source>Quit reason: </source>
         <translation>退出原因:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="350"/>
         <source>Room destroyed</source>
         <translation>房间损坏</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="357"/>
         <source>You got kicked</source>
         <translation>被踢出</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="452"/>
         <source>Password</source>
-        <translation type="obsolete">密码</translation>
-    </message>
-    <message>
-        <source>Your nickname %1 is
-registered on Hedgewars.org
-Please provide your password
-or pick another nickname:</source>
-        <translation type="obsolete">您的昵称%1
-在Hedgewars.org已注册
-请输入您的密码
-或选择另一个昵称:</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has joined the room</source>
-        <translation>%1 *** %2 进入这个房间了</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has joined</source>
-        <translation>%1 *** %2 加入了</translation>
+        <translation>密码</translation>
     </message>
     <message>
-        <source>%1 *** %2 has left (%3)</source>
-        <translation>%1 *** %2 离开了(%3)</translation>
-    </message>
-    <message>
-        <source>%1 *** %2 has left</source>
-        <translation>%1 *** %2 离开了</translation>
-    </message>
-    <message>
-        <source>Your nickname %1 is
-registered on Hedgewars.org
-Please provide your password below
-or pick another nickname in game config:</source>
-        <translation type="obsolete">您的昵称%1
-在Hedgewars.org已注册
-请输入您的密码
-或从游戏配置中选择另一个昵称:</translation>
-    </message>
-    <message>
-        <source>Nickname</source>
-        <translation type="obsolete">昵称</translation>
-    </message>
-    <message>
-        <source>User quit</source>
-        <translation>用户退出</translation>
+        <location filename="../../../../QTfrontend/newnetclient.cpp" line="452"/>
+        <source>Enter your password:</source>
+        <translation>输入你的密码:</translation>
     </message>
 </context>
 <context>
     <name>KB</name>
     <message>
+        <location filename="../../../../QTfrontend/KB.h" line="32"/>
         <source>SDL_ttf returned error while rendering text, most propably it is related to the bug in freetype2. It&apos;s recommended to update your freetype lib.</source>
-        <translation>渲染文字时SDL_ttf 返回错误,可能有关freetype2的bug。建议升级 freetype。</translation>
+        <translation>SDL_ttf 返回错误-渲染文字失败,可能有关freetype2的bug。建议升级 freetype。</translation>
     </message>
 </context>
 <context>
     <name>PageAdmin</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="1063"/>
         <source>Server message:</source>
-        <translation type="obsolete">服务器信息:</translation>
-    </message>
-    <message>
-        <source>Set message</source>
-        <translation type="obsolete">设定信息</translation>
-    </message>
-    <message>
-        <source>Clear Accounts Cache</source>
-        <translation>清空账户缓存</translation>
-    </message>
-    <message>
-        <source>Fetch data</source>
-        <translation>获取数据</translation>
+        <translation>服务器信息:</translation>
     </message>
     <message>
-        <source>Server message for latest version:</source>
-        <translation>最新版本的服务器信息:</translation>
-    </message>
-    <message>
-        <source>Server message for previous versions:</source>
-        <translation>之前版本的服务器信息:</translation>
-    </message>
-    <message>
-        <source>Latest version protocol number:</source>
-        <translation>最新版本的通讯协议号码:</translation>
-    </message>
-    <message>
-        <source>MOTD preview:</source>
-        <translation>MOTD预览:</translation>
-    </message>
-    <message>
-        <source>Set data</source>
-        <translation>设定数据</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="1069"/>
+        <source>Set message</source>
+        <translation>设定信息</translation>
     </message>
 </context>
 <context>
     <name>PageConnecting</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="848"/>
         <source>Connecting...</source>
         <translation>连接中...</translation>
     </message>
-    <message>
-        <source>Cancel</source>
-        <translation type="obsolete">取消</translation>
-    </message>
-</context>
-<context>
-    <name>PageDrawMap</name>
-    <message>
-        <source>Undo</source>
-        <translation>取消</translation>
-    </message>
-    <message>
-        <source>Clear</source>
-        <translation>清除</translation>
-    </message>
-    <message>
-        <source>Load</source>
-        <translation>读取</translation>
-    </message>
-    <message>
-        <source>Save</source>
-        <translation>保存</translation>
-    </message>
-    <message>
-        <source>Load drawn map</source>
-        <translation>读取已经绘制的地图</translation>
-    </message>
-    <message>
-        <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
-        <translation type="obsolete">绘制的地图 (*.hwmap);;全部文件 (*.*)</translation>
-    </message>
-    <message>
-        <source>Save drawn map</source>
-        <translation>保存绘制的地图</translation>
-    </message>
-    <message>
-        <source>Drawn Maps</source>
-        <translation>绘制的地图</translation>
-    </message>
-    <message>
-        <source>All files</source>
-        <translation>全部文件</translation>
-    </message>
 </context>
 <context>
     <name>PageEditTeam</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Discard</source>
+        <translation type="obsolete">中止</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Save</source>
+        <translation type="obsolete">保存</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="106"/>
         <source>General</source>
         <translation>常规</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="107"/>
         <source>Advanced</source>
         <translation>进阶</translation>
     </message>
@@ -506,393 +353,87 @@
 <context>
     <name>PageGameStats</name>
     <message>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="101"/>
         <source>&lt;p&gt;The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.&lt;/p&gt;</source>
-        <translation type="obsolete">&lt;p&gt;最佳射手奖给与 &lt;b&gt;%1&lt;/b&gt;:伤害 &lt;b&gt;%2&lt;/b&gt;点。&lt;/p&gt;</translation>
-    </message>
-    <message numerus="yes">
-        <source>&lt;p&gt;The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.&lt;/p&gt;</source>
-        <translation type="obsolete">
-            <numerusform>&lt;p&gt;最佳杀手是 &lt;b&gt;%1&lt;/b&gt;单回合击杀刺猬数:&lt;b&gt;%2&lt;/b&gt;&lt;/p&gt;</numerusform>
-        </translation>
+        <translation>&lt;p&gt;最佳射手是&lt;b&gt;%1&lt;/b&gt;。伤害 &lt;b&gt;%2&lt;/b&gt;点。&lt;/p&gt;</translation>
     </message>
     <message numerus="yes">
-        <source>&lt;p&gt;A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.&lt;/p&gt;</source>
-        <translation type="obsolete">
-            <numerusform>&lt;p&gt;本轮总共有&lt;b&gt;%1&lt;/b&gt;只刺猬被击杀&lt;/p&gt;</numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>Details</source>
-        <translation>细节</translation>
-    </message>
-    <message>
-        <source>Health graph</source>
-        <translation>健康值图形</translation>
-    </message>
-    <message>
-        <source>Ranking</source>
-        <translation>排名</translation>
-    </message>
-    <message>
-        <source>The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation>最佳射手&lt;b&gt;%1&lt;/b&gt;制造了&lt;b&gt;%2&lt;/b&gt;点伤害。</translation>
-    </message>
-    <message numerus="yes">
-        <source>The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.</source>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="108"/>
+        <source>&lt;p&gt;The best killer is &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills in a turn.&lt;/p&gt;</source>
         <translation>
-            <numerusform>最佳杀手 &lt;b&gt;%1&lt;/b&gt; 完成了单回合&lt;b&gt;%2&lt;/b&gt;次击杀。</numerusform>
+            <numerusform>&lt;p&gt;最佳杀手&lt;b&gt;%1&lt;/b&gt;:却敌&lt;b&gt;%2&lt;/b&gt;&lt;/p&gt;</numerusform>
         </translation>
     </message>
     <message numerus="yes">
-        <source>A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.</source>
-        <translation>
-            <numerusform>总共 &lt;b&gt;%1&lt;/b&gt; 只刺猬在本轮失去生命。</numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>(%1 kill)</source>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="115"/>
+        <source>&lt;p&gt;A total of &lt;b&gt;%1&lt;/b&gt; hedgehog(s) were killed during this round.&lt;/p&gt;</source>
         <translation>
-            <numerusform>(%1 击杀)</numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>(%1 kills)</source>
-        <translation type="obsolete">(%1 击杀)</translation>
-    </message>
-    <message numerus="yes">
-        <source>&lt;b&gt;%1&lt;/b&gt; thought it&apos;s good to shoot his own hedgehogs with &lt;b&gt;%2&lt;/b&gt; pts.</source>
-        <translation>
-            <numerusform>&lt;b&gt;%1&lt;/b&gt;以为给自己的刺猬造成 &lt;b&gt;%2&lt;/b&gt; 点创伤是小意思。</numerusform>
+            <numerusform>&lt;p&gt;有&lt;b&gt;%1&lt;/b&gt;个刺猬在此局失去生命。&lt;/p&gt;</numerusform>
         </translation>
     </message>
-    <message numerus="yes">
-        <source>&lt;b&gt;%1&lt;/b&gt; killed &lt;b&gt;%2&lt;/b&gt; of his own hedgehogs.</source>
-        <translation>
-            <numerusform>&lt;b&gt;%1&lt;/b&gt; 整垮了 &lt;b&gt;%2&lt;/b&gt; 只自己的刺猬。</numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>&lt;b&gt;%1&lt;/b&gt; was scared and skipped turn &lt;b&gt;%2&lt;/b&gt; times.</source>
-        <translation>
-            <numerusform>&lt;b&gt;%1&lt;/b&gt; 受惊了,共计 &lt;b&gt;%2&lt;/b&gt; 次放弃。</numerusform>
-        </translation>
-    </message>
-</context>
-<context>
-    <name>PageInGame</name>
-    <message>
-        <source>In game...</source>
-        <translation type="unfinished"></translation>
-    </message>
 </context>
 <context>
     <name>PageMain</name>
     <message>
-        <source>Local Game (Play a game on a single computer)</source>
-        <translation>单机游戏(在一台电脑上)</translation>
-    </message>
-    <message>
-        <source>Network Game (Play a game across a network)</source>
-        <translation>网络游戏(通过网络)</translation>
-    </message>
-    <message>
-        <source>Simply pick the same color as a friend to play together as a team. Each of you will still control his or her own hedgehogs but they&apos;ll win or lose together.</source>
-        <comment>Tips</comment>
-        <translation>点击同色作为同一组的友军。控制权不分享,但是共同胜利/失败。</translation>
-    </message>
-    <message>
-        <source>Some weapons might do only low damage but they can be a lot more devastating in the right situation. Try to use the Desert Eagle to knock multiple hedgehogs into the water.</source>
-        <comment>Tips</comment>
-        <translation>有些武器可能威力低下但是有毁灭性的效果。比如沙漠之鹰能把多个刺猬打入水中。</translation>
-    </message>
-    <message>
-        <source>If you&apos;re unsure what to do and don&apos;t want to waste ammo, skip one round. But don&apos;t let too much time pass as there will be Sudden Death!</source>
-        <comment>Tips</comment>
-        <translation>加入不确定怎么做,不要浪费弹药,跳过此回合。但是注意突然时间!</translation>
-    </message>
-    <message>
-        <source>Want to save ropse? Release the rope in mid air and then shoot again. As long as you don&apos;t touch the ground you&apos;ll reuse your rope without wasting ammo!</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">保存绳子?在半空释放然后再次射出。只要不接触地面停止就可以继续使用同一根不会浪费!</translation>
-    </message>
-    <message>
-        <source>If you&apos;d like to keep others from using your preferred nickname on the official server, register an account at http://www.hedgewars.org/.</source>
-        <comment>Tips</comment>
-        <translation>如果您确定好了一个昵称不想让别人使用,那么在  http://www.hedgewars.org/. 注册一个帐号吧。</translation>
-    </message>
-    <message>
-        <source>You&apos;re bored of default gameplay? Try one of the missions - they&apos;ll offer different gameplay depending on the one you picked.</source>
-        <comment>Tips</comment>
-        <translation>厌倦了默认的玩法?试试任务吧——每个任务都有不同的玩法。</translation>
-    </message>
-    <message>
-        <source>By default the game will always record the last game played as a demo. Select &apos;Local Game&apos; and pick the &apos;Demos&apos; button on the lower right corner to play or manage them.</source>
-        <comment>Tips</comment>
-        <translation>默认情况下游戏记录最后的游戏作为Demo,选择单机游戏——然后Demo——然后点击右下角开始回放或者整理。</translation>
-    </message>
-    <message>
-        <source>Hedgewars is Open Source and Freeware we create in our spare time. If you&apos;ve got problems, ask on our forums but please don&apos;t expect 24/7 support!</source>
-        <comment>Tips</comment>
-        <translation>刺猬大作战是一个开放源代码的免费软件,它充分利用了我们的业余时间。如果您有问题,到论坛来吧,不过7×24小时支持不可能!</translation>
-    </message>
-    <message>
-        <source>Hedgewars is Open Source and Freeware we create in our spare time. If you like it, help us with a small donation or contribute your own work!</source>
-        <comment>Tips</comment>
-        <translation>刺猬大作战是一个开放源代码的免费软件,它充分利用了我们的业余时间。如果您喜欢它,我们接受您的捐赠/感谢!</translation>
-    </message>
-    <message>
-        <source>Hedgewars is Open Source and Freeware we create in our spare time. Share it with your family and friends as you like!</source>
-        <comment>Tips</comment>
-        <translation>刺猬大作战是一个开放源代码的免费软件,它充分利用了我们的业余时间。与他人分享它吧!</translation>
-    </message>
-    <message>
-        <source>From time to time there will be official tournaments. Upcoming events will be announced at http://www.hedgewars.org/ some days in advance.</source>
-        <comment>Tips</comment>
-        <translation>官方的竞赛一直存在。临近时去  http://www.hedgewars.org/  即可看到。</translation>
-    </message>
-    <message>
-        <source>Hedgewars is available in many languages. If the translation in your language seems to be missing or outdated, feel free to contact us!</source>
-        <comment>Tips</comment>
-        <translation>Hedgewars 被翻译成多种语言,中文是刺猬大作战——同样为翻译名。如果您的语言翻译有什么缺失/过时/遗漏或任何问题,来联系我们吧!</translation>
-    </message>
-    <message>
-        <source>Hedgewars can be run on lots of different operating systems including Microsoft Windows, Mac OS X and Linux.</source>
-        <comment>Tips</comment>
-        <translation>刺猬大作战可以运行的操作系统包括:GNU/Linux、Mac OS X、MicroSoft Windows。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Multiplayer</source>
+        <translation type="obsolete">多人游戏</translation>
     </message>
     <message>
-        <source>Always remember you&apos;re able to set up your own games in local and network/online play. You&apos;re not restricted to the &apos;Simple Game&apos; option.</source>
-        <comment>Tips</comment>
-        <translation>您可以建立自己的网络游戏/局域网游戏。不仅限于 &quot;简单游戏&quot; 选项。</translation>
-    </message>
-    <message>
-        <source>Create an account on http://www.hedgewars.org/ to keep others from using your most favourite nickname while playing on the official server.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">在官方服务器 http://www.hedgewars.org/ 建立自己的帐号——就能一直使用最喜欢的昵称</translation>
-    </message>
-    <message>
-        <source>While playing you should give yourself a short break at least once an hour.</source>
-        <comment>Tips</comment>
-        <translation>最好玩一个小时就休息一下,如果你要继续用电脑。</translation>
-    </message>
-    <message>
-        <source>If your graphics card isn&apos;t able to provide hardware accelerated OpenGL, try to enable the low quality mode to improve performance.</source>
-        <comment>Tips</comment>
-        <translation>假如你的显卡不能提供OpenGL硬件加速,试着用降低效果的方式运行。</translation>
-    </message>
-    <message>
-        <source>We&apos;re open to suggestions and constructive feedback. If you don&apos;t like something or got a great idea, let us know!</source>
-        <comment>Tips</comment>
-        <translation>我们接受意见和建设性反馈。假如您有好电子或者不喜欢的东西,告诉我们!</translation>
-    </message>
-    <message>
-        <source>Especially while playing online be polite and always remember there might be some minors playing with or against you as well!</source>
-        <comment>Tips</comment>
-        <translation>特别是网络游戏,请有礼貌记住对方也和您一样是人!</translation>
-    </message>
-    <message>
-        <source>Special game modes such as &apos;Vampirism&apos; or &apos;Karma&apos; allow you to develop completely new tactics. Try them in a custom game!</source>
-        <comment>Tips</comment>
-        <translation>特别游戏模式“吸血“、”因果报应“需要全新的战术。现在自定义游戏里试试!</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Single Player</source>
+        <translation type="obsolete">单人游戏</translation>
     </message>
     <message>
-        <source>The Windows version of Hedgewars supports Xfire. Make sure to add Hedgwars to its game list so your friends can see you playing.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">Windows版本的刺猬大作战支持Xfire。添加它到游戏列表里让您的朋友看到。</translation>
-    </message>
-    <message>
-        <source>You should never install Hedgewars on computers you don&apos;t own (school, university, work, etc.). Please ask the responsible person instead!</source>
-        <comment>Tips</comment>
-        <translation>您不应该在不属于您的计算机上安装刺猬大作战——比如学校/工作场所等。您应当向计算机的负责人咨询!</translation>
-    </message>
-    <message>
-        <source>Hedgewars can be perfect for short games during breaks. Just ensure you don&apos;t add too many hedgehogs or use an huge map. Reducing time and health might help as well.</source>
-        <comment>Tips</comment>
-        <translation>刺猬大作战适合短时间休息,不需要太多刺猬挤在大地图上。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Net game</source>
+        <translation type="obsolete">网络游戏</translation>
     </message>
     <message>
-        <source>No hedgehogs were harmed in making this game.</source>
-        <comment>Tips</comment>
-        <translation>在制作这款游戏时没有任何刺猬受到伤害。</translation>
-    </message>
-    <message>
-        <source>Connect one or more gamepads before launching the game to be able to assign their controls to your teams.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">在运行游戏前连接游戏板</translation>
-    </message>
-    <message>
-        <source>Hedgewars is Open Source and Freeware we create in our spare time. If someone sold you the game, you should try get a refund!</source>
-        <comment>Tips</comment>
-        <translation>刺猬大作战是开放源代码的免费软件,用我们的闲暇时间创造。如果有人卖给你,那么应该把钱拿回来!</translation>
-    </message>
-    <message>
-        <source>Create an account on %1 to keep others from using your most favourite nickname while playing on the official server.</source>
-        <comment>Tips</comment>
-        <translation>在 %1 建立一个帐号阻止其他人使用你喜欢的名称在官方服务器游戏。</translation>
-    </message>
-    <message>
-        <source>There are three different jumps available. Tap [high jump] twice to do a very high/backwards jump.</source>
-        <comment>Tips</comment>
-        <translation>三种跳跃方式。点击[高跳]两次做出跳跃高度极限的后空翻。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Saved games</source>
+        <translation type="obsolete">存档</translation>
     </message>
     <message>
-        <source>Afraid of falling off a cliff? Hold down [precise] to turn [left] or [right] without actually moving.</source>
-        <comment>Tips</comment>
-        <translation>害怕掉下悬崖?按住[精确]后再点击[左][右]就会只转身,不移动位置。</translation>
-    </message>
-    <message>
-        <source>Some weapons require special strategies or just lots of training, so don&apos;t give up on a particular tool if you miss an enemy once.</source>
-        <comment>Tips</comment>
-        <translation>有些武器需要特殊策略或者仅仅是大量的练习,假如你一次失去准星,也不要放弃。</translation>
-    </message>
-    <message>
-        <source>Most weapons won&apos;t work once they touch the water. The Homing Bee as well as the Cake are exceptions to this.</source>
-        <comment>Tips</comment>
-        <translation>多数武器不会在接触水之后生效。归巢的蜜蜂和蛋糕是例外。</translation>
-    </message>
-    <message>
-        <source>The Old Limbuger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once.</source>
-        <comment>Tips</comment>
-        <translation>老干酪发射器造成小规模爆炸,然后产生随风移动的有毒云雾——能一次毒害多个刺猬。</translation>
-    </message>
-    <message>
-        <source>The Piano Strike is the most damaging air strike. You&apos;ll lose the hedgehog performing it, so there&apos;s a huge downside as well.</source>
-        <comment>Tips</comment>
-        <translation>钢琴攻击是最大威力的空袭。弹奏钢琴的刺猬会跟着钢琴返回天堂。</translation>
-    </message>
-    <message>
-        <source>The Homing Bee can be tricky to use. It&apos;s turn radius depends on it&apos;s velocity, so try to not use full power.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">归巢的蜜蜂有些技巧。它的回转半径和初速有关,最好不用全力发射。</translation>
-    </message>
-    <message>
-        <source>Sticky Mines are a perfect tool to create small chain reactions knocking enemy hedgehogs into dire situations ... or water.</source>
-        <comment>Tips</comment>
-        <translation>黏着地雷是创造小范围连锁反应的绝佳武器。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Demos</source>
+        <translation type="obsolete">Demo</translation>
     </message>
     <message>
-        <source>The Hammer is most effective when used on bridges or girders. Hit hogs will just break through the ground.</source>
-        <comment>Tips</comment>
-        <translation>锤是桥梁上/分界处最佳武器之一,只是刚刚好把刺猬打陷——如果没底就没办法了。</translation>
-    </message>
-    <message>
-        <source>If you&apos;re stuck behind an enemy hedgehog, use the Hammer to free yourself without getting damaged by an explosion.</source>
-        <comment>Tips</comment>
-        <translation>假如对方刺猬把你堵住了,一锤打下去让自己轻松些。</translation>
-    </message>
-    <message>
-        <source>The Cake&apos;s maximum walking distance depends on the ground it has to pass. Use [attack] to detonate it early.</source>
-        <comment>Tips</comment>
-        <translation>蛋糕的最大行走距离取决于地表。也可按下[攻击键]激活起爆。</translation>
-    </message>
-    <message>
-        <source>The Flame Thrower is a weapon but it can be used for tunnel digging as well.</source>
-        <comment>Tips</comment>
-        <translation>火焰喷射器是一种武器,也是一种开路机器。</translation>
-    </message>
-    <message>
-        <source>Use the Incinerating Grenade to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">燃烧瓶可以短时阻止刺猬通过特定区域(比如通道或平台)</translation>
-    </message>
-    <message>
-        <source>Want to know who&apos;s behind the game? Click on the Hedgewars logo in the main menu to see the credits.</source>
-        <comment>Tips</comment>
-        <translation>想要知道谁是此游戏的幕后人员?点击主菜单的Hedgewars Logo就可以看到贡献者名单。</translation>
-    </message>
-    <message>
-        <source>Like hedgewars? Become a fan on %1 or join our group at %2. You could follow us on %3 as well!</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">喜欢刺猬大作战(hedgewars)?那么加入我们 %1 或者 %2.。你可以在 %3 跟随我们!</translation>
-    </message>
-    <message>
-        <source>You can find your Hedgewars configuration files under &quot;My Documents\Hedgewars&quot;. Create backups or take the files with you, but don&apos;t edit them by hand.</source>
-        <comment>Tips</comment>
-        <translation>你可以在( 我的文档\Hedgewars)里找到设置文件。可以创建备份,但不要手动修改。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Setup</source>
+        <translation type="obsolete">设置</translation>
     </message>
     <message>
-        <source>You can find your Hedgewars configuration files under &quot;Hedgewars&quot; in your home directory. Create backups or take the files with you, but don&apos;t edit them by hand.</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">你可以在家目录找到 .hedgewars。可以创建备份,但不要手动修改。</translation>
-    </message>
-    <message>
-        <source>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</source>
-        <comment>Tips</comment>
-        <translation>在游戏开始前连接游戏手柄才能用它们操控你的队伍。</translation>
-    </message>
-    <message>
-        <source>If your graphics card isn&apos;t able to provide hardware accelerated OpenGL, try to update the associated drivers.</source>
-        <comment>Tips</comment>
-        <translation>加入你的显卡不能使用OpenGL硬件加速,请升级相应驱动。</translation>
-    </message>
-    <message>
-        <source>Like Hedgewars? Become a fan on %1 or join our group at %2. You could follow us on %3 as well!</source>
-        <comment>Tips</comment>
-        <translation type="obsolete">喜欢刺猬大作战(Hedgewars)吗?加入 %2 ,成为 %1 粉丝,也可以在  %3 跟随我们!</translation>
-    </message>
-    <message>
-        <source>Feel free to draw your own graves, hats, flags or even maps and themes! But note that you&apos;ll have to share them somewhere to use them online.</source>
-        <comment>Tips</comment>
-        <translation>欢迎你自己绘制墓碑,帽子(头饰),旗帜或者地图,主题!但是记住,如果要在网上使用,你的必须把它们分享出来。</translation>
-    </message>
-    <message>
-        <source>Really want to wear a specific hat? Donate to us and receive an exclusive hat of your choice!</source>
-        <comment>Tips</comment>
-        <translation>非常想要一个帽子?捐赠的话就给你!</translation>
-    </message>
-    <message>
-        <source>Keep your video card drivers up to date to avoid issues playing the game.</source>
-        <comment>Tips</comment>
-        <translation>保持显卡驱动最新避免可能的麻烦。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>About</source>
+        <translation type="obsolete">关于</translation>
     </message>
     <message>
-        <source>You&apos;re able to associate Hedgewars related files (savegames and demo recordings) with the game to launch them right from your favorite file or internet browser.</source>
-        <comment>Tips</comment>
-        <translation>你可以关联刺猬大作战的相关文件(比如存档和回放)到本游戏以便在网络或文件浏览器中直接打开这些文件。</translation>
-    </message>
-    <message>
-        <source>Want to save ropes? Release the rope in mid air and then shoot again. As long as you don&apos;t touch the ground you&apos;ll reuse your rope without wasting ammo!</source>
-        <comment>Tips</comment>
-        <translation>想要节省绳子?放开绳子之后再次发射,只要你不曾脱离绳子接触接触地面就可以继续使用同一根!</translation>
-    </message>
-    <message>
-        <source>Like Hedgewars? Become a fan on %1 or follow us on %2!</source>
-        <comment>Tips</comment>
-        <translation>喜欢刺猬大作战Hedgewars吗?来 %1 或者 %2 追随我们吧!</translation>
-    </message>
-    <message>
-        <source>You can find your Hedgewars configuration files under &quot;Library/Application Support/Hedgewars&quot; in your home directory. Create backups or take the files with you, but don&apos;t edit them by hand.</source>
-        <comment>Tips</comment>
-        <translation>在家目录的&quot;Library/Application Support/Hedgewars&quot;找到刺猬的配置文件。备份随你,但是不要手动编辑。</translation>
+        <location filename="../../../../QTfrontend/statsPage.cpp" line="0"/>
+        <source>Exit</source>
+        <translation type="obsolete">退出</translation>
     </message>
     <message>
-        <source>You can find your Hedgewars configuration files under &quot;.hedgewars&quot; in your home directory. Create backups or take the files with you, but don&apos;t edit them by hand.</source>
-        <comment>Tips</comment>
-        <translation>在家目录的&quot;.hedgewars&quot;找到刺猬的配置文件。备份随你,但是不要手动编辑。</translation>
-    </message>
-    <message>
-        <source>The Windows version of Hedgewars supports Xfire. Make sure to add Hedgewars to its game list so your friends can see you playing.</source>
-        <comment>Tips</comment>
-        <translation>Windows版本的刺猬大作战支持Xfire。您可以添加刺猬大作战到它的游戏列表里让您的朋友看到。</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="81"/>
+        <source>Local Game (Play a game on a single computer)</source>
+        <translation>本地游戏(在一台电脑上)</translation>
     </message>
     <message>
-        <source>Use the Molotov or Flame Thrower to temporary keep hedgehogs from passing terrain such as tunnels or platforms.</source>
-        <comment>Tips</comment>
-        <translation>使用燃烧瓶或火焰喷射器可以短时阻止刺猬通过特定区域(比如隧道或平台).</translation>
-    </message>
-    <message>
-        <source>The Homing Bee can be tricky to use. Its turn radius depends on its velocity, so try to not use full power.</source>
-        <comment>Tips</comment>
-        <translation>使用归巢的蜜蜂有些技巧,它的回转半径和发射速度有关,所以最好不要全力发射。</translation>
-    </message>
-    <message>
-        <source>Downloadable Content</source>
-        <translation>可下载内容</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="85"/>
+        <source>Network Game (Play a game across a network)</source>
+        <translation>网络游戏(通过网络)</translation>
     </message>
 </context>
 <context>
     <name>PageMultiplayer</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Back</source>
+        <translation type="obsolete">返回</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="309"/>
         <source>Start</source>
         <translation>开始</translation>
     </message>
@@ -900,40 +441,43 @@
 <context>
     <name>PageNet</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Local</source>
+        <translation type="obsolete">本地</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Internet</source>
+        <translation type="obsolete">Internet</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="520"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
-        <source>Please select server from the list above</source>
+        <location filename="../../../../QTfrontend/pages.cpp" line="520"/>
+        <source>Please, select server from the list above</source>
         <translation>请选择一个服务器</translation>
     </message>
 </context>
 <context>
     <name>PageNetGame</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="626"/>
         <source>Control</source>
-        <translation>房间管理</translation>
-    </message>
-    <message>
-        <source>Error</source>
-        <translation>错误</translation>
-    </message>
-    <message>
-        <source>Please enter room name</source>
-        <translation>请键入房间名</translation>
-    </message>
-    <message>
-        <source>OK</source>
-        <translation>确定</translation>
+        <translation>Ctrl</translation>
     </message>
 </context>
 <context>
     <name>PageNetType</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="1097"/>
         <source>LAN game</source>
         <translation>局域网游戏</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="1098"/>
         <source>Official server</source>
         <translation>官方服务器</translation>
     </message>
@@ -941,925 +485,681 @@
 <context>
     <name>PageOptions</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="344"/>
         <source>New team</source>
         <translation>新队伍</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="345"/>
         <source>Edit team</source>
         <translation>修改队伍设定</translation>
     </message>
     <message>
-        <source>Delete team</source>
-        <translation>删除队伍</translation>
-    </message>
-    <message>
-        <source>New weapon scheme</source>
-        <translation type="obsolete">新武器配置</translation>
-    </message>
-    <message>
-        <source>Edit weapon scheme</source>
-        <translation type="obsolete">修改武器配置</translation>
-    </message>
-    <message>
-        <source>Delete weapon scheme</source>
-        <translation type="obsolete">删除武器配置</translation>
-    </message>
-    <message>
-        <source>You can&apos;t edit teams from team selection. Go back to main menu to add, edit or delete teams.</source>
-        <translation>您不能在队伍选择界面修改队伍。请返回主页面进行添加、修改、删除队伍等操作。</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Save</source>
+        <translation type="obsolete">保存</translation>
     </message>
     <message>
-        <source>New scheme</source>
-        <translation>新框架</translation>
-    </message>
-    <message>
-        <source>Edit scheme</source>
-        <translation>修改框架</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Back</source>
+        <translation type="obsolete">返回</translation>
     </message>
     <message>
-        <source>Delete scheme</source>
-        <translation>删除框架</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="373"/>
+        <source>Weapons set</source>
+        <translation>新武器设定</translation>
     </message>
     <message>
-        <source>New weapon set</source>
-        <translation>新武器配置</translation>
-    </message>
-    <message>
-        <source>Edit weapon set</source>
-        <translation>修改武器配置</translation>
-    </message>
-    <message>
-        <source>Delete weapon set</source>
-        <translation>删除武器配置</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="376"/>
+        <source>Edit</source>
+        <translation>修改当前武器设定</translation>
     </message>
 </context>
 <context>
     <name>PagePlayDemo</name>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="149"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="137"/>
+        <source>Please, select record from the list</source>
+        <translation>请从列表选择记录</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="138"/>
         <source>OK</source>
         <translation>确认</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="113"/>
         <source>Rename dialog</source>
         <translation>重命名对话框</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="113"/>
         <source>Enter new file name:</source>
         <translation>输入新的文件名:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="124"/>
         <source>Cannot rename to</source>
         <translation>不能改变名字</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="149"/>
         <source>Cannot delete file</source>
         <translation>不能删除文件</translation>
     </message>
-    <message>
-        <source>Please select record from the list</source>
-        <translation>请从列表选择记录</translation>
-    </message>
 </context>
 <context>
     <name>PageRoomsList</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="764"/>
         <source>Create</source>
         <translation>建立</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="765"/>
         <source>Join</source>
         <translation>加入</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="766"/>
         <source>Refresh</source>
         <translation>刷新</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="828"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="818"/>
+        <source>Please, enter room name</source>
+        <translation>请键入房间名</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="830"/>
         <source>OK</source>
         <translation>确认</translation>
     </message>
     <message>
-        <source>Admin features</source>
-        <translation>管理员功能</translation>
-    </message>
-    <message>
-        <source>Room Name:</source>
-        <translation>房间名:</translation>
-    </message>
-    <message>
-        <source>This game is in lobby.
-You may join and start playing once the game starts.</source>
-        <translation>游戏正在大厅中。
-您可以加入等待游戏开始。</translation>
-    </message>
-    <message>
-        <source>This game is in progress.
-You may join and spectate now but you&apos;ll have to wait for the game to end to start playing.</source>
-        <translation>游戏正在进行中。
-您可以加入观战但必须等游戏结束才能参与游戏。</translation>
-    </message>
-    <message>
-        <source>%1 is the host. He may adjust settings and start the game.</source>
-        <translation>%1 是房主,他可以调整设置、开始游戏。</translation>
-    </message>
-    <message>
-        <source>Random Map</source>
-        <translation>随机地图</translation>
-    </message>
-    <message>
-        <source>Games may be played on precreated or randomized maps.</source>
-        <translation>游戏可以在预先创建或者随机产生的地图上进行。</translation>
-    </message>
-    <message>
-        <source>The Game Scheme defines general options and preferences like Round Time, Sudden Death or Vampirism.</source>
-        <translation>游戏设置包括一般选项例如回合时间,突然死亡或吸血模式。</translation>
-    </message>
-    <message>
-        <source>The Weapon Scheme defines available weapons and their ammunition count.</source>
-        <translation>武器配置包括可以选用的武器和弹药数量。</translation>
-    </message>
-    <message numerus="yes">
-        <source>There are %1 clients connected to this room.</source>
-        <translation>
-            <numerusform>有 %1 个客户端连接到这个房间。</numerusform>
-        </translation>
-    </message>
-    <message numerus="yes">
-        <source>There are %1 teams participating in this room.</source>
-        <translation>
-            <numerusform>有 %1 个队伍加入这个房间。</numerusform>
-        </translation>
-    </message>
-    <message>
-        <source>Please enter room name</source>
-        <translation>请键入房间名</translation>
-    </message>
-    <message>
-        <source>Please select room from the list</source>
+        <location filename="../../../../QTfrontend/pages.cpp" line="829"/>
+        <source>Please, select room from the list</source>
         <translation>请从列表选中房间</translation>
     </message>
     <message>
-        <source>Random Maze</source>
-        <translation>随机迷宫</translation>
-    </message>
-    <message>
-        <source>State:</source>
-        <translation type="obsolete">游戏状态</translation>
-    </message>
-    <message>
-        <source>Rules:</source>
-        <translation>规则</translation>
-    </message>
-    <message>
-        <source>Weapons:</source>
-        <translation>武器</translation>
-    </message>
-    <message>
-        <source>Search:</source>
-        <translation>搜索</translation>
-    </message>
-    <message>
-        <source>Clear</source>
-        <translation>清除</translation>
-    </message>
-    <message>
-        <source>Warning</source>
-        <translation>警告</translation>
-    </message>
-    <message>
-        <source>The game you are trying to join has started.
-Do you still want to join the room?</source>
-        <translation>你要加入的游戏已经开始了。
-还要进入房间吗?</translation>
-    </message>
-    <message numerus="yes">
-        <source>%1 players online</source>
-        <translation>
-            <numerusform>%1 个玩家在线</numerusform>
-        </translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="769"/>
+        <source>Admin features</source>
+        <translation>管理员功能</translation>
     </message>
 </context>
 <context>
     <name>PageScheme</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="1008"/>
         <source>New</source>
-        <translation>新模式</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>删除</translation>
-    </message>
-    <message>
-        <source>Defend your fort and destroy the opponents, two team colours max!</source>
-        <translation>保卫你的城堡,破坏对手的,努力吧!</translation>
-    </message>
-    <message>
-        <source>Teams will start on opposite sides of the terrain, two team colours max!</source>
-        <translation>队伍开始在对手的地盘,努力!</translation>
-    </message>
-    <message>
-        <source>Land can not be destroyed!</source>
-        <translation>地面无法破坏!</translation>
-    </message>
-    <message>
-        <source>Add an indestructable border around the terrain</source>
-        <translation type="obsolete">添加不可毁坏地边界</translation>
-    </message>
-    <message>
-        <source>Lower gravity</source>
-        <translation>低重力</translation>
-    </message>
-    <message>
-        <source>Assisted aiming with laser sight</source>
-        <translation>激光瞄准辅助</translation>
-    </message>
-    <message>
-        <source>All hogs have a personal forcefield</source>
-        <translation>每个刺猬都有一个力场</translation>
-    </message>
-    <message>
-        <source>Enable random mines</source>
-        <translation type="obsolete">开启随机地雷</translation>
-    </message>
-    <message>
-        <source>Gain 80% of the damage you do back in health</source>
-        <translation>伤害的80%变成自身力量</translation>
-    </message>
-    <message>
-        <source>Share your opponents pain, share their damage</source>
-        <translation>分担你的对手的疼痛</translation>
-    </message>
-    <message>
-        <source>Your hogs are unable to move, put your artillery skills to the test</source>
-        <translation>你的刺猬不能移动,检验你射击技巧的时候到了</translation>
-    </message>
-    <message>
-        <source>Random</source>
-        <translation>随机</translation>
-    </message>
-    <message>
-        <source>Seconds</source>
-        <translation>秒钟</translation>
+        <translation>新游戏</translation>
     </message>
     <message>
-        <source>Order of play is random instead of in room order.</source>
-        <translation>出场顺序是随机的而不是按照房间顺序。</translation>
-    </message>
-    <message>
-        <source>Play with a King. If he dies, your side dies.</source>
-        <translation>国王不能死。</translation>
-    </message>
-    <message>
-        <source>Take turns placing your hedgehogs before the start of play.</source>
-        <translation>在开局前轮流手动放置刺猬。</translation>
-    </message>
-    <message>
-        <source>Ammo is shared between all teams that share a colour.</source>
-        <translation>同色队伍共享所有弹药。</translation>
-    </message>
-    <message>
-        <source>Disable girders when generating random maps.</source>
-        <translation>禁止随机生成地图时使用梁。</translation>
-    </message>
-    <message>
-        <source>Disable land objects when generating random maps.</source>
-        <translation type="unfinished">禁止随机生成地图时使用地面物体。</translation>
-    </message>
-    <message>
-        <source>AI respawns on death.</source>
-        <translation>AI 死亡再生。</translation>
-    </message>
-    <message>
-        <source>Attacking does not end your turn.</source>
-        <translation>攻击不会结束当前回合。</translation>
-    </message>
-    <message>
-        <source>Weapons are reset to starting values each turn.</source>
-        <translation>在每回合武器将自动重置到开始设定。</translation>
-    </message>
-    <message>
-        <source>Each hedgehog has its own ammo. It does not share with the team.</source>
-        <translation>每个刺猬都有独立的弹药,而非团队分享。</translation>
-    </message>
-    <message>
-        <source>All (living) hedgehogs are fully restored at the end of turn</source>
-        <translation>所有活着的刺猬在回合结束时完全恢复健康</translation>
-    </message>
-    <message>
-        <source>You will not have to worry about wind anymore.</source>
-        <translation>不用担心风的影响了。</translation>
-    </message>
-    <message>
-        <source>Wind will affect almost everything.</source>
-        <translation>风无所不在。</translation>
-    </message>
-    <message>
-        <source>Copy</source>
-        <translation>备份</translation>
-    </message>
-    <message>
-        <source>Teams in each clan take successive turns sharing their turn time.</source>
-        <translation>在同一集团中的队伍在共用的回合时间里使用连续的回合。</translation>
-    </message>
-    <message>
-        <source>Add an indestructible border around the terrain</source>
-        <translation>添加不可毁坏地边界</translation>
-    </message>
-    <message>
-        <source>Add an indestructible border along the bottom</source>
-        <translation>在底部添加一个不可毁坏的边界</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="1009"/>
+        <source>Delete</source>
+        <translation>删除</translation>
     </message>
 </context>
 <context>
     <name>PageSelectWeapon</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Back</source>
+        <translation type="obsolete">返回</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="729"/>
         <source>Default</source>
         <translation>默认</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="730"/>
         <source>Delete</source>
         <translation>删除</translation>
     </message>
     <message>
-        <source>New</source>
-        <translation>新模式</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Save</source>
+        <translation type="obsolete">保存</translation>
+    </message>
+</context>
+<context>
+    <name>PageSimpleGame</name>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Back</source>
+        <translation type="obsolete">返回</translation>
     </message>
     <message>
-        <source>Copy</source>
-        <translation>备份</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Simple Game</source>
+        <translation type="obsolete">简单游戏</translation>
     </message>
 </context>
 <context>
     <name>PageSinglePlayer</name>
     <message>
-        <source>Simple Game (a quick game against the computer, settings are chosen for you)</source>
-        <translation>快速游戏 (使用预设对抗电脑)</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Simple Game</source>
+        <translation type="obsolete">简单游戏</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Training</source>
+        <translation type="obsolete">训练</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Multiplayer</source>
+        <translation type="obsolete">多人游戏</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Saved games</source>
+        <translation type="obsolete">游戏存档</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Demos</source>
+        <translation type="obsolete">Demo</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="685"/>
+        <source>Simple Game (a quick game against the computer, settings are chosen for you)</source>
+        <translation>快速游戏 (对抗电脑,固定设置)</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="688"/>
         <source>Multiplayer (play a hotseat game against your friends, or AI teams)</source>
         <translation>多人游戏 (热坐对抗朋友或AI)</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="693"/>
         <source>Training Mode (Practice your skills in a range of training missions). IN DEVELOPMENT</source>
-        <translation type="obsolete">训练模式 (一系列训练任务)。开发中</translation>
+        <translation>训练模式 (一系列训练任务)。开发中</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="699"/>
         <source>Demos (Watch recorded demos)</source>
         <translation>Demo (观看记录的Demo)</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="702"/>
         <source>Load (Load a previously saved game)</source>
         <translation>读取 (读取之前保存的游戏)</translation>
     </message>
-    <message>
-        <source>Campaign Mode (...). IN DEVELOPMENT</source>
-        <translation type="obsolete">战役模式 ——开发中</translation>
-    </message>
-    <message>
-        <source>Campaign Mode (...)</source>
-        <translation>战役模式 (...)</translation>
-    </message>
-    <message>
-        <source>Training Mode (Practice your skills in a range of training missions)</source>
-        <translation>训练模式(在一系列训练任务中练习你的技能)</translation>
-    </message>
-</context>
-<context>
-    <name>PageTraining</name>
-    <message>
-        <source>No description available</source>
-        <translation>没有可用描述</translation>
-    </message>
-    <message>
-        <source>Select a mission!</source>
-        <translation>选择一个任务!</translation>
-    </message>
 </context>
 <context>
     <name>QAction</name>
     <message>
+        <location filename="../../../../QTfrontend/chatwidget.cpp" line="62"/>
         <source>Kick</source>
-        <translation>踢出</translation>
+        <translation>踢</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="638"/>
         <source>Start</source>
         <translation>开始</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="628"/>
         <source>Restrict Joins</source>
         <translation>限制参与</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="630"/>
         <source>Restrict Team Additions</source>
-        <translation>限制增加团队</translation>
+        <translation>限制团队插件</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/chatwidget.cpp" line="60"/>
         <source>Info</source>
         <translation>信息</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/chatwidget.cpp" line="64"/>
         <source>Ban</source>
         <translation>屏蔽</translation>
     </message>
-    <message>
-        <source>Follow</source>
-        <translation>跟随</translation>
-    </message>
-    <message>
-        <source>Ignore</source>
-        <translation>忽略</translation>
-    </message>
-    <message>
-        <source>Add friend</source>
-        <translation>添加朋友</translation>
-    </message>
-    <message>
-        <source>Unignore</source>
-        <translation>取消忽略</translation>
-    </message>
-    <message>
-        <source>Remove friend</source>
-        <translation>移除朋友</translation>
-    </message>
-    <message>
-        <source>Update</source>
-        <translation>更新</translation>
-    </message>
 </context>
 <context>
     <name>QCheckBox</name>
     <message>
-        <source>Check for updates at startup</source>
-        <translation>启动时检查程序升级</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="415"/>
+        <source>Enable sound</source>
+        <translation>开启音效</translation>
     </message>
     <message>
-        <source>Enable sound</source>
-        <translation>开启游戏音效</translation>
-    </message>
-    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="407"/>
         <source>Fullscreen</source>
         <translation>游戏全屏幕</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="861"/>
+        <source>Forts mode</source>
+        <translation type="obsolete">城堡模式</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="434"/>
         <source>Show FPS</source>
         <translation>显示帧率 (FPS)</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="438"/>
         <source>Alternative damage show</source>
         <translation>另一种伤害显示方式</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="419"/>
         <source>Enable music</source>
-        <translation>开启游戏音乐</translation>
+        <translation>开启音乐</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="411"/>
         <source>Frontend fullscreen</source>
-        <translation>前端界面全屏幕</translation>
-    </message>
-    <message>
-        <source>Append date and time to record file name</source>
-        <translation>记录名称中包含具体时间和日期</translation>
+        <translation>界面全屏幕</translation>
     </message>
     <message>
-        <source>Reduced quality</source>
-        <translation type="obsolete">降低显示效果</translation>
-    </message>
-    <message>
-        <source>Show ammo menu tooltips</source>
-        <translation>显示武器菜单提示</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="865"/>
+        <source>Divide teams</source>
+        <translation type="obsolete">分组</translation>
     </message>
     <message>
-        <source>Enable frontend sounds</source>
-        <translation>开启前端界面音效</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="442"/>
+        <source>Append date and time to record file name</source>
+        <translation>记录名称中包含具体时间日期</translation>
     </message>
     <message>
-        <source>Enable frontend music</source>
-        <translation>开启前端界面音乐</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="869"/>
+        <source>Solid land</source>
+        <translation type="obsolete">固实地面</translation>
     </message>
     <message>
-        <source>Frontend effects</source>
-        <translation>前端界面效果</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="403"/>
+        <source>Reduce Quality</source>
+        <translation>降低质量</translation>
     </message>
 </context>
 <context>
     <name>QComboBox</name>
     <message>
+        <location filename="../../../../QTfrontend/mapContainer.cpp" line="62"/>
         <source>generated map...</source>
         <translation>生成地图...</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="171"/>
         <source>Human</source>
         <translation>玩家</translation>
     </message>
     <message>
-        <source>Level</source>
-        <translation>Lv 级别</translation>
-    </message>
-    <message>
-        <source>(System default)</source>
-        <translation>(系统默认)</translation>
-    </message>
-    <message>
-        <source>generated maze...</source>
-        <translation>生成迷宫...</translation>
-    </message>
-    <message>
-        <source>Mission</source>
-        <translation>任务</translation>
-    </message>
-    <message>
-        <source>Community</source>
-        <translation>社区</translation>
-    </message>
-    <message>
-        <source>Any</source>
-        <translation>任意</translation>
-    </message>
-    <message>
-        <source>In lobby</source>
-        <translation>大厅中</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Level 5</source>
+        <translation type="obsolete">Lv 5</translation>
     </message>
     <message>
-        <source>In progress</source>
-        <translation>进行中</translation>
-    </message>
-    <message>
-        <source>Default</source>
-        <translation type="obsolete">默认</translation>
-    </message>
-    <message>
-        <source>Pro mode</source>
-        <translation type="obsolete">高手模式</translation>
-    </message>
-    <message>
-        <source>Shoppa</source>
-        <translation type="obsolete">绳子党</translation>
-    </message>
-    <message>
-        <source>Basketball</source>
-        <translation type="obsolete">篮球</translation>
-    </message>
-    <message>
-        <source>Minefield</source>
-        <translation type="obsolete">雷区</translation>
-    </message>
-    <message>
-        <source>Barrel mayhem</source>
-        <translation type="obsolete">炼狱场</translation>
-    </message>
-    <message>
-        <source>Tunnel hogs</source>
-        <translation type="obsolete">刺猬洞</translation>
-    </message>
-    <message>
-        <source>Crazy</source>
-        <translation type="obsolete">疯狂刺猬</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Level 4</source>
+        <translation type="obsolete">Lv 4</translation>
     </message>
     <message>
-        <source>hand drawn map...</source>
-        <translation>手绘地图...</translation>
-    </message>
-    <message>
-        <source>Disabled</source>
-        <translation>禁用</translation>
-    </message>
-    <message>
-        <source>Red/Cyan</source>
-        <translation>红/青</translation>
-    </message>
-    <message>
-        <source>Cyan/Red</source>
-        <translation>青/红</translation>
-    </message>
-    <message>
-        <source>Red/Blue</source>
-        <translation>红/蓝</translation>
-    </message>
-    <message>
-        <source>Blue/Red</source>
-        <translation>蓝/红</translation>
-    </message>
-    <message>
-        <source>Red/Green</source>
-        <translation>红/绿</translation>
-    </message>
-    <message>
-        <source>Green/Red</source>
-        <translation>绿/红</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Level 3</source>
+        <translation type="obsolete">Lv 3</translation>
     </message>
     <message>
-        <source>Side-by-side</source>
-        <translation>横向排列</translation>
-    </message>
-    <message>
-        <source>Top-Bottom</source>
-        <translation>自顶向下</translation>
-    </message>
-    <message>
-        <source>Wiggle</source>
-        <translation type="unfinished"></translation>
-    </message>
-    <message>
-        <source>Red/Cyan grayscale</source>
-        <translation type="unfinished">红/青 灰度</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Level 2</source>
+        <translation type="obsolete">Lv 2</translation>
     </message>
     <message>
-        <source>Cyan/Red grayscale</source>
-        <translation type="unfinished">青/红 灰度</translation>
-    </message>
-    <message>
-        <source>Red/Blue grayscale</source>
-        <translation type="unfinished">红/蓝 灰度</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Level 1</source>
+        <translation type="obsolete">Lv 1</translation>
     </message>
     <message>
-        <source>Blue/Red grayscale</source>
-        <translation type="unfinished">蓝/红 灰度</translation>
-    </message>
-    <message>
-        <source>Red/Green grayscale</source>
-        <translation type="unfinished">红/绿 灰度</translation>
-    </message>
-    <message>
-        <source>Green/Red grayscale</source>
-        <translation type="unfinished">绿/红 灰度</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="175"/>
+        <source>Level</source>
+        <translation>Lv 级别</translation>
     </message>
 </context>
 <context>
     <name>QGroupBox</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="126"/>
         <source>Team Members</source>
         <translation>成员</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="161"/>
+        <source>Team</source>
+        <translation>队伍</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="202"/>
         <source>Fort</source>
         <translation>城堡模式</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="236"/>
         <source>Key binds</source>
         <translation>键位绑定</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="335"/>
         <source>Teams</source>
         <translation>队伍</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="384"/>
         <source>Audio/Graphic options</source>
         <translation>音频/视频选项</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Net nick</source>
+        <translation type="obsolete">昵称</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Net options</source>
+        <translation type="obsolete">网络选项</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Landscape</source>
+        <translation type="obsolete">地形</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Game scheme</source>
+        <translation type="obsolete">游戏设置</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="228"/>
         <source>Playing teams</source>
         <translation>玩家队伍</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="0"/>
+        <source>Team level</source>
+        <translation type="obsolete">队伍级别</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="473"/>
         <source>Net game</source>
-        <translation>局域网络游戏</translation>
+        <translation>网络游戏</translation>
     </message>
     <message>
-        <source>Weapons</source>
-        <translation type="obsolete">武器</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Servers list</source>
+        <translation type="obsolete">服务器列表</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="370"/>
+        <source>Weapons</source>
+        <translation>武器</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="862"/>
+        <source>Scheme options</source>
+        <translation type="obsolete">游戏设定</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="866"/>
         <source>Game Modifiers</source>
         <translation>游戏修改</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="867"/>
         <source>Basic Settings</source>
         <translation>基本设置</translation>
     </message>
-    <message>
-        <source>Team Settings</source>
-        <translation>队伍设定</translation>
-    </message>
-    <message>
-        <source>Misc</source>
-        <translation>杂项</translation>
-    </message>
-    <message>
-        <source>Schemes and Weapons</source>
-        <translation>游戏框架和武器配置</translation>
-    </message>
 </context>
 <context>
     <name>QLabel</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="353"/>
         <source>Net nick</source>
         <translation>网络游戏昵称</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Server address</source>
+        <translation type="obsolete">服务器地址</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>&lt;div align=&quot;center&quot;&gt;&lt;h1&gt;Hedgewars&lt;/h1&gt;&lt;h3&gt;Version 0.8&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;http://www.hedgewars.org/&quot;&gt;http://www.hedgewars.org/&lt;/a&gt;&lt;/p&gt;&lt;br&gt;This program is distributed under the GNU General Public License&lt;/div&gt;</source>
+        <translation type="obsolete">&lt;div align=&quot;center&quot;&gt;&lt;h1&gt;刺猬大作战&lt;/h1&gt;&lt;h3&gt;0.8&lt;/h3&gt;&lt;p&gt;&lt;a href=&quot;http://www.hedgewars.org/&quot;&gt;http://www.hedgewars.org/&lt;/a&gt;&lt;/p&gt;&lt;br&gt;This program is distributed under the GNU General Public License&lt;/div&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>&lt;h2&gt;Developers:&lt;/h2&gt;&lt;p&gt;Andrey Korotaev &amp;lt;&lt;a href=&quot;mailto:unC0Rr@gmail.com&quot;&gt;unC0Rr@gmail.com&lt;/a&gt;&amp;gt;&lt;br&gt;Igor Ulyanov &amp;lt;&lt;a href=&quot;mailto:iulyanov@gmail.com&quot;&gt;iulyanov@gmail.com&lt;/a&gt;&amp;gt;&lt;/p&gt;&lt;h2&gt;Translations:&lt;/h2&gt;english: Andrey Korotaev &amp;lt;&lt;a href=&quot;mailto:unC0Rr@gmail.com&quot;&gt;unC0Rr@gmail.com&lt;/a&gt;&amp;gt;&lt;br&gt;russian: Andrey Korotaev &amp;lt;&lt;a href=&quot;mailto:unC0Rr@gmail.com&quot;&gt;unC0Rr@gmail.com&lt;/a&gt;&amp;gt;</source>
+        <translation type="obsolete">&lt;h2&gt;Developers:&lt;/h2&gt;&lt;p&gt;Andrey Korotaev &amp;lt;&lt;a href=&quot;mailto:unC0Rr@gmail.com&quot;&gt;unC0Rr@gmail.com&lt;/a&gt;&amp;gt;&lt;br&gt;Igor Ulyanov &amp;lt;&lt;a href=&quot;mailto:iulyanov@gmail.com&quot;&gt;iulyanov@gmail.com&lt;/a&gt;&amp;gt;&lt;/p&gt;&lt;h2&gt;Translations:&lt;/h2&gt;english: Andrey Korotaev &amp;lt;&lt;a href=&quot;mailto:unC0Rr@gmail.com&quot;&gt;unC0Rr@gmail.com&lt;/a&gt;&amp;gt;&lt;br&gt;russian: Andrey Korotaev &amp;lt;&lt;a href=&quot;mailto:unC0Rr@gmail.com&quot;&gt;unC0Rr@gmail.com&lt;/a&gt;&amp;gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>difficulty:</source>
+        <translation type="obsolete">难度:</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>&lt;h3&gt;Version 0.8&lt;/h3&gt;</source>
+        <translation type="obsolete">&lt;h3&gt;版本 0.8&lt;/h3&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="46"/>
         <source>This program is distributed under the GNU General Public License</source>
-        <translation type="obsolete">This program is distributed under the GNU General Public License</translation>
+        <translation>This program is distributed under the GNU General Public License</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="0"/>
+        <source>&lt;h2&gt;Translations:&lt;/h2&gt;</source>
+        <translation type="obsolete">&lt;h2&gt;翻译:&lt;/h2&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="0"/>
+        <source>&lt;h2&gt;Developers:&lt;/h2&gt;</source>
+        <translation type="obsolete">&lt;h2&gt;开发者:&lt;/h2&gt;</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="0"/>
+        <source>&lt;h2&gt;Translations:&lt;/h2&gt;&lt;p&gt;</source>
+        <translation type="obsolete">&lt;h2&gt;翻译:&lt;/h2&gt;&lt;p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="0"/>
+        <source>&lt;h2&gt;Special thanks:&lt;/h2&gt;&lt;p&gt;</source>
+        <translation type="obsolete">&lt;h2&gt;特别感谢:&lt;/h2&gt;&lt;p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="0"/>
+        <source>&lt;h3&gt;Version 0.8.1&lt;/h3&gt;</source>
+        <translation type="obsolete">&lt;h3&gt;版本 0.8.1&lt;/h3&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="0"/>
+        <source>&lt;h2&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;</source>
+        <translation type="obsolete">&lt;h2&gt;&lt;/h2&gt;&lt;p&gt;&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="62"/>
+        <source>Turn time</source>
+        <translation type="obsolete">回合时间</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="63"/>
+        <source>Initial health</source>
+        <translation type="obsolete">初始生命值</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="687"/>
+        <source>&lt;p&gt;The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; pts.&lt;/p&gt;</source>
+        <translation type="obsolete">&lt;p&gt;射击冠军&lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; .&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="699"/>
+        <source>&lt;p&gt;A total of &lt;b&gt;%1&lt;/b&gt; Hedgehog(s) were killed during this round.&lt;/p&gt;</source>
+        <translation type="obsolete">&lt;p&gt;阵亡&lt;b&gt;%1&lt;/b&gt; &lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="0"/>
+        <source>&lt;h3&gt;Version 0.9&lt;/h3&gt;</source>
+        <translation type="obsolete">&lt;h3&gt;版本0.9&lt;/h3&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="389"/>
         <source>Resolution</source>
         <translation>分辨率</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="398"/>
         <source>FPS limit</source>
         <translation>FPS 上限</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="61"/>
         <source>Developers:</source>
         <translation>开发者:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="71"/>
         <source>Art:</source>
         <translation>艺术:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="91"/>
         <source>Translations:</source>
         <translation>翻译:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="111"/>
         <source>Special thanks:</source>
         <translation>特别感谢:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="564"/>
         <source>Server name:</source>
         <translation>服务器名:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="571"/>
         <source>Server port:</source>
         <translation>服务器端口:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/input_ip.cpp" line="32"/>
         <source>Host:</source>
         <translation>主机:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/input_ip.cpp" line="36"/>
         <source>Port:</source>
         <translation>端口:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="61"/>
         <source>Weapons</source>
         <translation>武器</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="0"/>
+        <source>&lt;h3&gt;Version 0.9.2&lt;/h3&gt;</source>
+        <translation type="obsolete">&lt;h3&gt;版本0.9.2&lt;/h3&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="43"/>
         <source>Version</source>
         <translation>版本</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="694"/>
+        <source>&lt;p&gt;The best shot award was won by &lt;b&gt;%1&lt;/b&gt; with &lt;b&gt;%2&lt;/b&gt; kills.&lt;/p&gt;</source>
+        <translation type="obsolete">&lt;p&gt;最佳射手&lt;b&gt;%1&lt;/b&gt;取得的战果 &lt;b&gt;%2&lt;/b&gt;&lt;/p&gt;</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/about.cpp" line="83"/>
         <source>Sounds:</source>
         <translation>声音:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="424"/>
         <source>Initial sound volume</source>
         <translation>初始音量</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="923"/>
         <source>Damage Modifier</source>
-        <translation>伤害修正值</translation>
+        <translation>伤害修改</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="938"/>
         <source>Turn Time</source>
         <translation>回合时间</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="953"/>
         <source>Initial Health</source>
         <translation>初始生命值</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="968"/>
         <source>Sudden Death Timeout</source>
         <translation>死亡模式倒计时</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="980"/>
+        <source>Case Probability</source>
+        <translation type="obsolete">箱子掉落几率</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="998"/>
         <source>Scheme Name:</source>
         <translation>设置名称:</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="983"/>
         <source>Crate Drops</source>
         <translation>箱子降落</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/gamecfgwidget.cpp" line="53"/>
         <source>Game scheme</source>
         <translation>游戏设置</translation>
     </message>
-    <message>
-        <source>Mines Time</source>
-        <translation>布雷时间</translation>
-    </message>
-    <message>
-        <source>Mines</source>
-        <translation>地雷</translation>
-    </message>
-    <message>
-        <source>% Dud Mines</source>
-        <translation>% 地雷故障</translation>
-    </message>
-    <message>
-        <source>Name</source>
-        <translation>名称</translation>
-    </message>
-    <message>
-        <source>Type</source>
-        <translation>类型</translation>
-    </message>
-    <message>
-        <source>Grave</source>
-        <translation>墓碑</translation>
-    </message>
-    <message>
-        <source>Flag</source>
-        <translation>旗帜</translation>
-    </message>
-    <message>
-        <source>Voice</source>
-        <translation>声音</translation>
-    </message>
-    <message>
-        <source>Locale</source>
-        <translation>Locale</translation>
-    </message>
-    <message>
-        <source>Restart game to apply</source>
-        <translation>需要重新启动游戏方可应用</translation>
-    </message>
-    <message>
-        <source>Explosives</source>
-        <translation>爆炸物</translation>
-    </message>
-    <message>
-        <source>Tip: </source>
-        <translation>提示:</translation>
-    </message>
-    <message>
-        <source>This development build is &apos;work in progress&apos; and may not be compatible with other versions of the game. Some features might be broken or incomplete. Use at your own risk!</source>
-        <translation>当前运行的为开发版本,不同其他版本兼容。功能或许损坏、不完整。请自行承担风险!</translation>
-    </message>
-    <message>
-        <source>Quality</source>
-        <translation>图像质量</translation>
-    </message>
-    <message>
-        <source>Sudden Death Water Rise</source>
-        <translation>死亡模式水位上涨</translation>
-    </message>
-    <message>
-        <source>Sudden Death Health Decrease</source>
-        <translation>死亡模式健康降低</translation>
-    </message>
-    <message>
-        <source>% Rope Length</source>
-        <translation>% 绳长</translation>
-    </message>
-    <message>
-        <source>% Health Crates</source>
-        <translation>% 生命箱</translation>
-    </message>
-    <message>
-        <source>Health in Crates</source>
-        <translation>生命箱的值数</translation>
-    </message>
-    <message>
-        <source>Gameplay</source>
-        <translation type="obsolete">游戏</translation>
-    </message>
-    <message>
-        <source>Stereo rendering</source>
-        <translation>立体渲染</translation>
-    </message>
-    <message>
-        <source>Style</source>
-        <translation type="unfinished">样式</translation>
-    </message>
-    <message>
-        <source>Scheme</source>
-        <translation type="unfinished">模式</translation>
-    </message>
-    <message>
-        <source>Password</source>
-        <translation>密码</translation>
-    </message>
-    <message>
-        <source>% Get Away Time</source>
-        <translation>% 脱身时间</translation>
-    </message>
-    <message>
-        <source>This program is distributed under the GNU General Public License v2</source>
-        <translation>本程序在GNU通用许可证协议第二版(GNU GPLv2)下发布</translation>
-    </message>
 </context>
 <context>
     <name>QLineEdit</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="358"/>
         <source>unnamed</source>
         <translation>无名</translation>
     </message>
-    <message>
-        <source>hedgehog %1</source>
-        <translation>刺猬 %1</translation>
-    </message>
 </context>
 <context>
     <name>QMainWindow</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>-= by unC0Rr =-</source>
+        <translation type="obsolete">-= by unC0Rr =-</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Hedgewars</source>
+        <translation type="obsolete">刺猬大作战</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/ui_hwform.cpp" line="37"/>
         <source>Hedgewars %1</source>
         <translation>刺猬大作战 %1</translation>
     </message>
@@ -1867,10 +1167,12 @@
 <context>
     <name>QMessageBox</name>
     <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="272"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="275"/>
         <source>Failed to open data directory:
 %1
 Please check your installation</source>
@@ -1879,233 +1181,292 @@
 请检查</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="685"/>
         <source>Network</source>
         <translation>网络</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/hwform.cpp" line="686"/>
         <source>Connection to server is lost</source>
-        <translation>与服务器的连接丢失</translation>
+        <translation>服务器连接丢失</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/selectWeapon.cpp" line="170"/>
         <source>Weapons</source>
         <translation>武器</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/selectWeapon.cpp" line="165"/>
         <source>Can not delete default weapon set</source>
-        <translation type="obsolete">不能删除默认武器设定</translation>
+        <translation>不能删除默认武器设定</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/selectWeapon.cpp" line="170"/>
         <source>Really delete this weapon set?</source>
         <translation>真的删除这个武器设定吗?</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/selectWeapon.cpp" line="127"/>
         <source>Can not edit default weapon set</source>
-        <translation type="obsolete">不能更改默认的武器设定</translation>
-    </message>
-    <message>
-        <source>Can not overwrite default weapon set &apos;%1&apos;!</source>
-        <translation>不能覆盖默认的武器配置 &apos;%1&apos;!</translation>
-    </message>
-    <message>
-        <source>All file associations have been set.</source>
-        <translation>所有相关文件已经设定。</translation>
-    </message>
-    <message>
-        <source>Teams</source>
-        <translation>队伍</translation>
-    </message>
-    <message>
-        <source>Really delete this team?</source>
-        <translation>真的要删除队伍?</translation>
-    </message>
-    <message>
-        <source>Schemes</source>
-        <translation>游戏框架</translation>
-    </message>
-    <message>
-        <source>Can not delete default scheme &apos;%1&apos;!</source>
-        <translation>无法删除默认游戏框架 &apos;%1&apos;!</translation>
-    </message>
-    <message>
-        <source>File association failed.</source>
-        <translation>文件关联失败。</translation>
-    </message>
-    <message>
-        <source>Really delete this game scheme?</source>
-        <translation>真的删除此游戏框架?</translation>
-    </message>
-    <message>
-        <source>Can not delete default weapon set &apos;%1&apos;!</source>
-        <translation>无法删除武器配置%1&apos;!</translation>
+        <translation>不能更改默认的武器设定</translation>
     </message>
 </context>
 <context>
     <name>QObject</name>
     <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="35"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="36"/>
         <source>Cannot create directory %1</source>
         <translation>无法创建路径 %1</translation>
     </message>
     <message>
-        <source>OK</source>
-        <translation>确认</translation>
+        <location filename="../../../../QTfrontend/main.cpp" line="0"/>
+        <source>Quit</source>
+        <translation type="obsolete">退出</translation>
     </message>
     <message>
-        <source>Nickname</source>
-        <translation>昵称</translation>
-    </message>
-    <message>
-        <source>Please enter your nickname</source>
-        <translation>请输入您的昵称</translation>
+        <location filename="../../../../QTfrontend/main.cpp" line="37"/>
+        <source>OK</source>
+        <translation>确认</translation>
     </message>
 </context>
 <context>
     <name>QPushButton</name>
     <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="0"/>
+        <source>Single Player</source>
+        <translation type="obsolete">单人游戏</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="0"/>
+        <source>Multiplayer</source>
+        <translation type="obsolete">多人游戏</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="0"/>
+        <source>Net game</source>
+        <translation type="obsolete">网络游戏</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/main.cpp" line="0"/>
+        <source>Demos</source>
+        <translation type="obsolete">Demo</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="237"/>
         <source>Setup</source>
         <translation>设置</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="0"/>
+        <source>Exit</source>
+        <translation type="obsolete">退出</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="0"/>
+        <source>Back</source>
+        <translation type="obsolete">返回</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="0"/>
+        <source>Simple Game</source>
+        <translation type="obsolete">简单游戏</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="0"/>
+        <source>Discard</source>
+        <translation type="obsolete">中止</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/teamselect.cpp" line="0"/>
+        <source>Save</source>
+        <translation type="obsolete">保存</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="75"/>
         <source>Play demo</source>
         <translation>播放 demo</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="0"/>
+        <source>New team</source>
+        <translation type="obsolete">新队伍</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="0"/>
+        <source>Edit team</source>
+        <translation type="obsolete">编辑队伍</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="482"/>
         <source>Connect</source>
         <translation>连接</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Disconnect</source>
+        <translation type="obsolete">失去连接</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Join</source>
+        <translation type="obsolete">加入</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Create</source>
+        <translation type="obsolete">创建</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Add Team</source>
+        <translation type="obsolete">添加队伍</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="714"/>
         <source>Go!</source>
         <translation>上场!</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="544"/>
         <source>Start</source>
         <translation>开始</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>About</source>
+        <translation type="obsolete">关于</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="466"/>
         <source>Start server</source>
         <translation>开始服务端</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="491"/>
         <source>Update</source>
         <translation>更新</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="0"/>
+        <source>Waiting</source>
+        <translation type="obsolete">等待中</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="80"/>
         <source>Load</source>
         <translation>读取</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="0"/>
+        <source>Weapons scheme</source>
+        <translation type="obsolete">武器设定</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="0"/>
+        <source>Training</source>
+        <translation type="obsolete">训练</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="496"/>
         <source>Specify</source>
         <translation>指定</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="580"/>
         <source>default</source>
         <translation>默认</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="48"/>
         <source>Rename</source>
         <translation>重命名</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/input_ip.cpp" line="52"/>
         <source>OK</source>
         <translation>确定</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/input_ip.cpp" line="57"/>
         <source>Cancel</source>
         <translation>取消</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/playrecordpage.cpp" line="52"/>
         <source>Delete</source>
         <translation>删除</translation>
     </message>
     <message>
-        <source>Ready</source>
-        <translation>准备好了</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="501"/>
+        <source>Join official server</source>
+        <translation type="obsolete">加入官方服务器</translation>
     </message>
     <message>
-        <source>Random Team</source>
-        <translation>随机分配队伍</translation>
-    </message>
-    <message>
-        <source>Associate file extensions</source>
-        <translation>相关文件扩展</translation>
-    </message>
-    <message>
-        <source>more</source>
-        <translation>更多</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="618"/>
+        <source>Ready</source>
+        <translation>准备好了</translation>
     </message>
 </context>
 <context>
     <name>QTableWidget</name>
     <message>
-        <source>Room Name</source>
-        <translation>房间名</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="787"/>
+        <source>Room name</source>
+        <translation>房间名称</translation>
     </message>
     <message>
-        <source>C</source>
-        <translation>人数限制</translation>
-    </message>
-    <message>
-        <source>T</source>
-        <translation>时间限制</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="788"/>
+        <source>Players number</source>
+        <translation>玩家数量</translation>
     </message>
     <message>
-        <source>Owner</source>
-        <translation>创建者</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="790"/>
+        <source>Round in progress</source>
+        <translation>回合数</translation>
+    </message>
+</context>
+<context>
+    <name>QToolBox</name>
+    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="242"/>
+        <source>Actions</source>
+        <translation>行动</translation>
     </message>
     <message>
-        <source>Map</source>
-        <translation>地图</translation>
-    </message>
-    <message>
-        <source>Rules</source>
-        <translation>规则</translation>
-    </message>
-    <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="244"/>
         <source>Weapons</source>
         <translation>武器</translation>
     </message>
-</context>
-<context>
-    <name>SelWeaponWidget</name>
     <message>
-        <source>Weapon set</source>
-        <translation>武器设置</translation>
-    </message>
-    <message>
-        <source>Probabilities</source>
-        <translation>空中支援几率</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="246"/>
+        <source>Weapon properties</source>
+        <translation>武器选项</translation>
     </message>
     <message>
-        <source>Ammo in boxes</source>
-        <translation>弹药箱</translation>
-    </message>
-    <message>
-        <source>Delays</source>
-        <translation>延迟回合数</translation>
-    </message>
-    <message>
-        <source>new</source>
-        <translation>新</translation>
-    </message>
-    <message>
-        <source>copy of</source>
-        <translation>副本</translation>
+        <location filename="../../../../QTfrontend/pages.cpp" line="248"/>
+        <source>Other</source>
+        <translation>其他</translation>
     </message>
 </context>
 <context>
     <name>TCPBase</name>
     <message>
+        <location filename="../../../../QTfrontend/tcpBase.cpp" line="99"/>
         <source>Error</source>
         <translation>错误</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/tcpBase.cpp" line="45"/>
         <source>Unable to start the server: %1.</source>
         <translation>无法开始服务端: %1.</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/tcpBase.cpp" line="101"/>
         <source>Unable to run engine: %1 (</source>
         <translation>无法运行引擎: %1 (</translation>
     </message>
@@ -2113,678 +1474,362 @@
 <context>
     <name>ToggleButtonWidget</name>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="888"/>
         <source>Fort Mode</source>
         <translation>城堡模式</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="892"/>
         <source>Divide Teams</source>
         <translation>团体行动</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="896"/>
         <source>Solid Land</source>
         <translation>固实地面</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="900"/>
         <source>Add Border</source>
         <translation>添加边界</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="904"/>
         <source>Low Gravity</source>
         <translation>低重力</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="908"/>
         <source>Laser Sight</source>
         <translation>激光瞄准</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="912"/>
         <source>Invulnerable</source>
         <translation>刀枪不入</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/pages.cpp" line="916"/>
         <source>Add Mines</source>
-        <translation type="obsolete">布置地雷</translation>
-    </message>
-    <message>
-        <source>Vampirism</source>
-        <translation>吸血鬼</translation>
-    </message>
-    <message>
-        <source>Karma</source>
-        <translation>因果报应</translation>
-    </message>
-    <message>
-        <source>Artillery</source>
-        <translation>射术</translation>
-    </message>
-    <message>
-        <source>Random Order</source>
-        <translation>随机顺序</translation>
-    </message>
-    <message>
-        <source>King</source>
-        <translation>国王模式</translation>
-    </message>
-    <message>
-        <source>Place Hedgehogs</source>
-        <translation>手动放置刺猬</translation>
-    </message>
-    <message>
-        <source>Clan Shares Ammo</source>
-        <translation>团队共享弹药</translation>
-    </message>
-    <message>
-        <source>Disable Girders</source>
-        <translation>禁止梁</translation>
-    </message>
-    <message>
-        <source>Disable Land Objects</source>
-        <translation>禁止地面物件</translation>
-    </message>
-    <message>
-        <source>AI Survival Mode</source>
-        <translation>AI生存模式</translation>
-    </message>
-    <message>
-        <source>Unlimited Attacks</source>
-        <translation>无限攻击</translation>
-    </message>
-    <message>
-        <source>Reset Weapons</source>
-        <translation>重置武器</translation>
-    </message>
-    <message>
-        <source>Per Hedgehog Ammo</source>
-        <translation>每个刺猬的弹药</translation>
-    </message>
-    <message>
-        <source>Reset Health</source>
-        <translation>重置生命值</translation>
-    </message>
-    <message>
-        <source>Disable Wind</source>
-        <translation>禁止风力作用</translation>
-    </message>
-    <message>
-        <source>More Wind</source>
-        <translation>让风来地更猛烈吧</translation>
-    </message>
-    <message>
-        <source>Tag Team</source>
-        <translation>为队伍添加标签</translation>
-    </message>
-    <message>
-        <source>Add Bottom Border</source>
-        <translation>添加底部边界</translation>
+        <translation>布置地雷</translation>
     </message>
 </context>
 <context>
     <name>binds</name>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="23"/>
         <source>up</source>
         <translation>上</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="24"/>
         <source>left</source>
         <translation>左</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="25"/>
         <source>right</source>
         <translation>右</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="26"/>
         <source>down</source>
         <translation>下</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="28"/>
+        <source>jump</source>
+        <translation>跳</translation>
+    </message>
+    <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="29"/>
         <source>attack</source>
         <translation>攻击</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="31"/>
         <source>put</source>
         <translation>放</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="32"/>
         <source>switch</source>
         <translation>切换</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="35"/>
         <source>slot 1</source>
         <translation>slot 1</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="36"/>
         <source>slot 2</source>
         <translation>slot 2</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="37"/>
         <source>slot 3</source>
         <translation>slot 3</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="38"/>
         <source>slot 4</source>
         <translation>slot 4</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="39"/>
         <source>slot 5</source>
         <translation>slot 5</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="40"/>
         <source>slot 6</source>
         <translation>slot 6</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="41"/>
         <source>slot 7</source>
         <translation>slot 7</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="42"/>
         <source>slot 8</source>
         <translation>slot 8</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="44"/>
         <source>timer 1 sec</source>
         <translation>定时1秒</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="45"/>
         <source>timer 2 sec</source>
         <translation>定时2秒</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="46"/>
         <source>timer 3 sec</source>
         <translation>定时3秒</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="47"/>
         <source>timer 4 sec</source>
         <translation>定时4秒</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="48"/>
         <source>timer 5 sec</source>
         <translation>定时5秒</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="56"/>
         <source>capture</source>
-        <translation>截取</translation>
+        <translation>夺取</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="58"/>
         <source>quit</source>
         <translation>退出</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="33"/>
         <source>find hedgehog</source>
-        <translation>寻找刺猬</translation>
+        <translation>找到 刺猬</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="34"/>
         <source>ammo menu</source>
         <translation>弹药菜单</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="53"/>
         <source>volume down</source>
         <translation>降低音量</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="54"/>
         <source>volume up</source>
         <translation>提高音量</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="55"/>
         <source>change mode</source>
         <translation>改变模式</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="51"/>
         <source>pause</source>
         <translation>暂停</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="43"/>
         <source>slot 9</source>
         <translation>slot 9</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="57"/>
         <source>hedgehogs
 info</source>
         <translation>刺猬大作战
 信息</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="49"/>
         <source>chat</source>
         <translation>聊天</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="50"/>
         <source>chat history</source>
         <translation>聊天记录</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="52"/>
         <source>confirmation</source>
         <translation>确认</translation>
     </message>
     <message>
+        <location filename="../../../../QTfrontend/binds.cpp" line="30"/>
         <source>precise aim</source>
         <translation>练习瞄准</translation>
     </message>
-    <message>
-        <source>zoom in</source>
-        <translation>放大</translation>
-    </message>
-    <message>
-        <source>zoom out</source>
-        <translation>缩小</translation>
-    </message>
-    <message>
-        <source>reset zoom</source>
-        <translation>重置</translation>
-    </message>
-    <message>
-        <source>long jump</source>
-        <translation>远跳</translation>
-    </message>
-    <message>
-        <source>high jump</source>
-        <translation>高跳</translation>
-    </message>
-    <message>
-        <source>slot 10</source>
-        <translation>slot 10</translation>
-    </message>
-</context>
-<context>
-    <name>binds (categories)</name>
-    <message>
-        <source>Basic controls</source>
-        <translation>基本控制</translation>
-    </message>
-    <message>
-        <source>Weapon controls</source>
-        <translation>武器控制</translation>
-    </message>
-    <message>
-        <source>Camera and cursor controls</source>
-        <translation>镜头和光标控制</translation>
-    </message>
-    <message>
-        <source>Other</source>
-        <translation>其他</translation>
-    </message>
-</context>
-<context>
-    <name>binds (descriptions)</name>
-    <message>
-        <source>Move your hogs and aim:</source>
-        <translation>移动您的刺猬同时瞄准:</translation>
-    </message>
-    <message>
-        <source>Traverse gaps and obstacles by jumping:</source>
-        <translation>使用跳跃越过沟渠、障碍:</translation>
-    </message>
-    <message>
-        <source>Fire your selected weapon or trigger an utility item:</source>
-        <translation>使用选择的武器开火、使用物品:</translation>
-    </message>
-    <message>
-        <source>Pick a weapon or a target location under the cursor:</source>
-        <translation>选取一个武器或者瞄准光标下的地点:</translation>
-    </message>
-    <message>
-        <source>Switch your currently active hog (if possible):</source>
-        <translation>切换到您当前活动的刺猬(如果可用):</translation>
-    </message>
-    <message>
-        <source>Pick a weapon or utility item:</source>
-        <translation>选择一个武器或物品:</translation>
-    </message>
-    <message>
-        <source>Set the timer on bombs and timed weapons:</source>
-        <translation>设置定时炸弹等武器起爆时间:</translation>
-    </message>
-    <message>
-        <source>Move the camera to the active hog:</source>
-        <translation>移动镜头到选中的刺猬:</translation>
-    </message>
-    <message>
-        <source>Move the cursor or camera without using the mouse:</source>
-        <translation>不用鼠标移动光标或镜头:</translation>
-    </message>
-    <message>
-        <source>Modify the camera&apos;s zoom level:</source>
-        <translation>调整镜头放大倍数:</translation>
-    </message>
-    <message>
-        <source>Talk to your team or all participants:</source>
-        <translation>同队友或全部参与者对话:</translation>
-    </message>
-    <message>
-        <source>Pause, continue or leave your game:</source>
-        <translation>暂停、继续或离开游戏:</translation>
-    </message>
-    <message>
-        <source>Modify the game&apos;s volume while playing:</source>
-        <translation>调整游戏时音量:</translation>
-    </message>
-    <message>
-        <source>Toggle fullscreen mode:</source>
-        <translation>全屏模式:</translation>
-    </message>
-    <message>
-        <source>Take a screenshot:</source>
-        <translation>截图:</translation>
-    </message>
-    <message>
-        <source>Toggle labels above hedgehogs:</source>
-        <translation>切换刺猬头顶标签的显示方式:</translation>
-    </message>
 </context>
 <context>
-    <name>binds (keys)</name>
-    <message>
-        <source>Axis</source>
-        <translation>Axis轴</translation>
-    </message>
+    <name>teams</name>
     <message>
-        <source>(Up)</source>
-        <translation>(上)</translation>
-    </message>
-    <message>
-        <source>(Down)</source>
-        <translation>(下)</translation>
-    </message>
-    <message>
-        <source>Hat</source>
-        <translation>帽子</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="53"/>
+        <source>Hedgehogs</source>
+        <translation>刺猬 </translation>
     </message>
     <message>
-        <source>(Left)</source>
-        <translation>(左)</translation>
-    </message>
-    <message>
-        <source>(Right)</source>
-        <translation>(右)</translation>
-    </message>
-    <message>
-        <source>Button</source>
-        <translation>按键</translation>
-    </message>
-    <message>
-        <source>Keyboard</source>
-        <translation>键盘</translation>
-    </message>
-    <message>
-        <source>Mouse: Left button</source>
-        <translation>鼠标:左键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="54"/>
+        <source>hedgehog 1</source>
+        <translation>刺猬 1号</translation>
     </message>
     <message>
-        <source>Mouse: Middle button</source>
-        <translation>鼠标:中键</translation>
-    </message>
-    <message>
-        <source>Mouse: Right button</source>
-        <translation>鼠标:右键</translation>
-    </message>
-    <message>
-        <source>Mouse: Wheel up</source>
-        <translation>鼠标滚轮:向上</translation>
-    </message>
-    <message>
-        <source>Mouse: Wheel down</source>
-        <translation>鼠标滚轮:向下</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="55"/>
+        <source>hedgehog 2</source>
+        <translation>刺猬 2号</translation>
     </message>
     <message>
-        <source>Backspace</source>
-        <translation>退格键</translation>
-    </message>
-    <message>
-        <source>Tab</source>
-        <translation>Tab</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="56"/>
+        <source>hedgehog 3</source>
+        <translation>刺猬 3号</translation>
     </message>
     <message>
-        <source>Clear</source>
-        <translation>Num Lock / Clear</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="57"/>
+        <source>hedgehog 4</source>
+        <translation>刺猬 4号</translation>
     </message>
     <message>
-        <source>Return</source>
-        <translation>回车</translation>
-    </message>
-    <message>
-        <source>Pause</source>
-        <translation>暂停键</translation>
-    </message>
-    <message>
-        <source>Escape</source>
-        <translation>ESC键(退出键)</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="58"/>
+        <source>hedgehog 5</source>
+        <translation>刺猬 5号</translation>
     </message>
     <message>
-        <source>Space</source>
-        <translation>空格键</translation>
-    </message>
-    <message>
-        <source>Delete</source>
-        <translation>Del(删除键)</translation>
-    </message>
-    <message>
-        <source>Numpad 0</source>
-        <translation>小键盘0</translation>
-    </message>
-    <message>
-        <source>Numpad 1</source>
-        <translation>小键盘1</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="59"/>
+        <source>hedgehog 6</source>
+        <translation>刺猬 6号</translation>
     </message>
     <message>
-        <source>Numpad 2</source>
-        <translation>小键盘2</translation>
-    </message>
-    <message>
-        <source>Numpad 3</source>
-        <translation>小键盘3</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="60"/>
+        <source>hedgehog 7</source>
+        <translation>刺猬 7号</translation>
     </message>
     <message>
-        <source>Numpad 4</source>
-        <translation>小键盘4</translation>
-    </message>
-    <message>
-        <source>Numpad 5</source>
-        <translation>小键盘5</translation>
-    </message>
-    <message>
-        <source>Numpad 6</source>
-        <translation>小键盘6</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="61"/>
+        <source>hedgehog 8</source>
+        <translation>刺猬 8号</translation>
     </message>
     <message>
-        <source>Numpad 7</source>
-        <translation>小键盘7</translation>
-    </message>
-    <message>
-        <source>Numpad 8</source>
-        <translation>小键盘8</translation>
-    </message>
-    <message>
-        <source>Numpad 9</source>
-        <translation>小键盘9</translation>
-    </message>
-    <message>
-        <source>Numpad .</source>
-        <translation>小键盘.</translation>
-    </message>
-    <message>
-        <source>Numpad /</source>
-        <translation>小键盘/</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="73"/>
+        <source>Goddess</source>
+        <translation>女神</translation>
     </message>
     <message>
-        <source>Numpad *</source>
-        <translation>小键盘*</translation>
-    </message>
-    <message>
-        <source>Numpad -</source>
-        <translation>小键盘-</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="74"/>
+        <source>Isis</source>
+        <translation>艾希丝</translation>
     </message>
     <message>
-        <source>Numpad +</source>
-        <translation>小键盘+</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="75"/>
+        <source>Astarte</source>
+        <translation>阿斯德尔特</translation>
     </message>
     <message>
-        <source>Enter</source>
-        <translation>回车键</translation>
-    </message>
-    <message>
-        <source>Equals</source>
-        <translation>等于</translation>
-    </message>
-    <message>
-        <source>Up</source>
-        <translation>上</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="76"/>
+        <source>Diana</source>
+        <translation>黛安娜</translation>
     </message>
     <message>
-        <source>Down</source>
-        <translation>下</translation>
-    </message>
-    <message>
-        <source>Right</source>
-        <translation>右</translation>
-    </message>
-    <message>
-        <source>Left</source>
-        <translation>左</translation>
-    </message>
-    <message>
-        <source>Insert</source>
-        <translation>插入键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="77"/>
+        <source>Aphrodite</source>
+        <translation>阿弗罗狄特</translation>
     </message>
     <message>
-        <source>Home</source>
-        <translation>Home键</translation>
-    </message>
-    <message>
-        <source>End</source>
-        <translation>End键</translation>
-    </message>
-    <message>
-        <source>Page up</source>
-        <translation>向上翻页键</translation>
-    </message>
-    <message>
-        <source>Page down</source>
-        <translation>向下翻页键</translation>
-    </message>
-    <message>
-        <source>Num lock</source>
-        <translation>小键盘数字锁</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="78"/>
+        <source>Hecate</source>
+        <translation>赫卡特</translation>
     </message>
     <message>
-        <source>Caps lock</source>
-        <translation>大小写切换键</translation>
-    </message>
-    <message>
-        <source>Scroll lock</source>
-        <translation>Scroll Lock键</translation>
-    </message>
-    <message>
-        <source>Right shift</source>
-        <translation>右Shift键</translation>
-    </message>
-    <message>
-        <source>Left shift</source>
-        <translation>左Shift键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="79"/>
+        <source>Demeter</source>
+        <translation>得墨忒耳</translation>
     </message>
     <message>
-        <source>Right ctrl</source>
-        <translation>右Ctrl键</translation>
-    </message>
-    <message>
-        <source>Left ctrl</source>
-        <translation>左Ctrl键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="80"/>
+        <source>Kali</source>
+        <translation>迦梨</translation>
     </message>
     <message>
-        <source>Right alt</source>
-        <translation>右Alt键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="81"/>
+        <source>Inanna</source>
+        <translation>維納斯</translation>
     </message>
     <message>
-        <source>Left alt</source>
-        <translation>左Alt键</translation>
-    </message>
-    <message>
-        <source>Right meta</source>
-        <translation>右meta键</translation>
-    </message>
-    <message>
-        <source>Left meta</source>
-        <translation>左meta键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="93"/>
+        <source>Fruits</source>
+        <translation>水果</translation>
     </message>
     <message>
-        <source>A button</source>
-        <translation>A 键</translation>
-    </message>
-    <message>
-        <source>B button</source>
-        <translation>B 键</translation>
-    </message>
-    <message>
-        <source>X button</source>
-        <translation>X 键</translation>
-    </message>
-    <message>
-        <source>Y button</source>
-        <translation>Y 键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="94"/>
+        <source>Banana</source>
+        <translation>香蕉</translation>
     </message>
     <message>
-        <source>LB button</source>
-        <translation>LB 键</translation>
-    </message>
-    <message>
-        <source>RB button</source>
-        <translation>RB 键</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="95"/>
+        <source>Apple</source>
+        <translation>苹果</translation>
     </message>
     <message>
-        <source>Back button</source>
-        <translation>返回键</translation>
-    </message>
-    <message>
-        <source>Start button</source>
-        <translation>开始键</translation>
-    </message>
-    <message>
-        <source>Left stick</source>
-        <translation>左摇杆</translation>
-    </message>
-    <message>
-        <source>Right stick</source>
-        <translation>右摇杆</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="96"/>
+        <source>Orange</source>
+        <translation>橙子</translation>
     </message>
     <message>
-        <source>Left stick (Right)</source>
-        <translation>右(左摇杆)</translation>
-    </message>
-    <message>
-        <source>Left stick (Left)</source>
-        <translation>左(左摇杆)</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="97"/>
+        <source>Lemon</source>
+        <translation>柠檬</translation>
     </message>
     <message>
-        <source>Left stick (Down)</source>
-        <translation>下(左摇杆)</translation>
-    </message>
-    <message>
-        <source>Left stick (Up)</source>
-        <translation>上(左摇杆)</translation>
-    </message>
-    <message>
-        <source>Left trigger</source>
-        <translation>左制动</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="98"/>
+        <source>Pineapple</source>
+        <translation>菠萝</translation>
     </message>
     <message>
-        <source>Right trigger</source>
-        <translation>右制动</translation>
-    </message>
-    <message>
-        <source>Right stick (Down)</source>
-        <translation>下(右摇杆)</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="99"/>
+        <source>Mango</source>
+        <translation>芒果</translation>
     </message>
     <message>
-        <source>Right stick (Up)</source>
-        <translation>上(右摇杆)</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="100"/>
+        <source>Peach</source>
+        <translation>桃子</translation>
     </message>
     <message>
-        <source>Right stick (Right)</source>
-        <translation>右(右摇杆)</translation>
-    </message>
-    <message>
-        <source>Right stick (Left)</source>
-        <translation>左(右摇杆)</translation>
-    </message>
-    <message>
-        <source>DPad</source>
-        <translation>DPad板</translation>
+        <location filename="../../../../QTfrontend/predefteams.h" line="101"/>
+        <source>Plum</source>
+        <translation>梅子</translation>
     </message>
 </context>
 </TS>
--- a/share/hedgewars/Data/Locale/zh_CN.txt	Sat Aug 18 00:47:51 2012 +0200
+++ b/share/hedgewars/Data/Locale/zh_CN.txt	Sat Aug 18 00:48:09 2012 +0200
@@ -1,825 +1,47 @@
 ; Simplified Chinese locale
 
 00:00=手榴弹
-00:01=集束炸弹
-00:02=火箭筒
-00:03=归巢的蜜蜂
-00:04=霰弹枪
-00:05=大锤
-00:06=跳过回合
+00:01=子母炸弹
+00:02=火箭炮
+00:03=UFO
+00:04=散弹枪
+00:05=气锤
+00:06=掠过
 00:07=绳索
 00:08=地雷
 00:09=沙漠之鹰
 00:10=炸药
 00:11=球棒
-00:12=Shoryuken
+00:12=升龙拳
 00:13=秒
 00:14=降落伞
 00:15=空袭
-00:16=地雷空袭
+00:16=地雷袭击
 00:17=喷灯
-00:18=钢梁
+00:18=钢板
 00:19=传送
-00:20=切换刺猬
+00:20=切换
 00:21=迫击炮
 00:22=鞭子
 00:23=神风特工队
 00:24=蛋糕
-00:25=引诱
+00:25=吸引
 00:26=西瓜炸弹
 00:27=地狱礼花
-00:28=钻头火箭
+00:28=钻地火箭
 00:29=弹珠炮
-00:30=汽油弹空袭
-00:31=遥控轰炸机
+00:30=燃烧弹
+00:31=轰炸机
 00:32=低重力
-00:33=增强伤害
-00:34=无敌
+00:33=附加伤害
+00:34=刀枪不入
 00:35=加时
 00:36=激光瞄准
-00:37=吸血
-00:38=狙击枪
-00:39=UFO
-00:40=燃烧瓶
-00:41=鸟儿
-00:42=传送器
-00:43=飞来的钢琴
-00:44=毒奶酪
-00:45=正弦能量炮
-00:46=火焰喷射器
-00:47=固定地雷
-00:48=大锤
-00:49=复苏
-00:50=电钻空袭
-00:51=土块
 
-01:00=开战!
-01:01=平局
-01:02= %1 胜利!
+01:00=战斗啦!
+01:01=平手
+01:02= %1 胜!
 01:03=音量 %1%
 01:04=暂停
-01:05=确定要退出? (是Y/否Esc)
-01:06=死亡模式!
-01:07=%1 剩余
-01:08=燃料
-01:09=同步中...
-01:10=使用本工具不会结束回合!
-01:11=您还不能用它!
-01:12=死亡模式前最后一回合!
-01:13=%1 回合倒计时!
-01:14=预备上, %1!
-
-; Event messages
-; Hog (%1) died
-; 02:00=%1 has kicked the bucket!
-02:00=%1 翘辫子了!
-; 02:00=%1 has seen the light!
-02:00=%1 目睹圣光降临!
-; 02:00=%1 never saw that coming!
-02:00=%1 无法瞑目!
-; 02:00=%1 waves goodbye!
-02:00=%1 向大家挥手道别。
-; 02:00=%1 has gone to a better place!
-02:00=%1 去了极乐世界!
-; 02:00=%1 meets his maker!
-02:00=%1 去见造物主了!
-; 02:00=%1 can hang on no longer!
-02:00=%1 再也受不了了!
-; 02:00=%1 has done his duty!
-02:00=%1 完成了他的使命!
-; 02:00=%1 makes the ultimate sacrifice!
-02:00=%1 做了最大的牺牲!
-; 02:00=%1 departs this mortal coil!
-02:00=%1 摆脱了躯壳的束缚!
-; 02:00=%1 makes like a tree and leaves!
-02:00=%1 叶落归根。
-; 02:00=%1 has timed out!
-02:00=%1 大限已至。
-; 02:00=%1 says peace out!
-02:00=%1 悄然离场了。
-; 02:00=%1 will be fondly remembered!
-02:00=%1 永远活在我们心中!
-; 02:00=%1 has an aneurysm!
-02:00=%1 不治而亡。
-; 02:00=%1 leaves behind a wife and child
-02:00=%1 留下一家孤儿寡母
-; 02:00=%1 has launched his last bazooka
-02:00=%1 发射了最后一发火箭弹
-; 02:00=%1 has tossed his last grenade
-02:00=%1 扔出了最后一枚手榴弹
-; 02:00=%1 has baked his last cake
-02:00=%1 烘烤了最后一块蛋糕
-; 02:00=%1 has swung on his last rope
-02:00=%1 最后一次甩出了绳索
-; 02:00=%1 has called his last airstrike
-02:00=%1 最后一次呼叫空袭
-; 02:00=%1 has pumped his last shotgun
-02:00=%1 最后一次抽出了霰弹枪
-; 02:00=%1 has thrown his last melon
-02:00=%1 最后一次扔出了西瓜炸弹
-; 02:00=%1 has drawn his last deagle
-02:00=%1 最后一次拔出了沙漠之鹰
-; 02:00=%1 took one shot too many
-02:00=%1 挨了太多枪子了
-; 02:00=%1 could really have used a health crate
-02:00=%1 真该用下医疗包的
-; 02:00=%1 has gone to play a better game
-02:00=%1 去玩更有意思的游戏去了
-; 02:00=%1 has ragequit life
-02:00=%1 拔网线了!
-; 02:00=%1 fails
-02:00=%1 失败了
-; 02:00=Poor poor %1...
-02:00=可怜的 %1...
-; 02:00=%1 prefers wormux
-02:00=%1 更喜欢 Warmux
-; 02:00=%1 has been blocking shots with his face
-02:00=%1 勇于面对子弹,结果相当惨烈
-; 02:00=%1 is a hero amongst me...err..hogs
-02:00=%1 是位英雄……额……在刺猬当中
-; 02:00=%1 finds his place in Valhalla
-02:00=%1 在勇者纪念碑上找到了自己的位置
-; 02:00=%1 has left the building
-02:00=%1 离开了这间屋子
-; 02:00=%1 goes the way of the dinosaurs
-02:00=%1 步上了恐龙的道路
-; 02:00=%1 brings hedgehogs one step closer to extinction
-02:00=%1 让刺猬向物种灭绝更近了一步
-; 02:00=%1 brings a tear to my eye
-02:00=%1 带走了我一滴眼泪
-; 02:00=%1 is an ex-hog
-02:00=%1 生前是一只刺猬
-; 02:00=%1 is pushing up the daisies
-02:00=%1 被菊花簇拥
-; 02:00=%1 has ceased to be
-02:00=%1 被删除了
-; 02:00=Say goodbye to %1
-02:00=对 %1 说再见
-; 02:00=No hope left for %1
-02:00=%1 没有希望了
-; 02:00=%1 faces the final curtain
-02:00=%1 面容被落下的帷幕遮住了
-; 02:00=Smoke 'em if you got 'em, %1
-02:00=%1 抓紧时间实现你最后的愿望吧
-; 02:00=%1 suffers a Spontaneous Massive Existence Failure
-02:00=%1 遭遇了自发性大规模故障
-; 02:00=%1 has passed on
-02:00=%1 走了
-; 02:00=%1 is stone dead
-02:00=%1 永垂不朽
-; 02:00=%1 is no more
-02:00=%1 不在了
-; 02:00=%1 has expired
-02:00=%1 已故
-; 02:00=Bereft of life, %1 rests in peace
-02:00=%1 安详地躺着
-; 02:00=%1 joins the choir invisible
-02:00=%1 加入了隐形唱诗班
-; 02:00=Farewell %1, we hardly knew ye!
-02:00=%1, 永别了,我们还没熟悉你呢!
-; 02:00=%1 had a low tolerance for being shot
-02:00=%1 抗打击能力不足
-; 02:00=%1 could have used an extra life
-02:00=%1 本该有第二条命的
-; 02:00=Is there a doctor in the house?
-02:00=这里有医生吗?
-
-; Hog (%1) drowned
-; 02:01=%1 plays submarine!
-02:01=%1 去玩潜水艇了!
-; 02:01=%1 mimics the Titanic!
-02:01=%1 学泰坦尼克去了!
-; 02:01=%1 swims like a stone!
-02:01=%1 石沉大海!
-;02:01=%1 checks out the deep end
-02:01=%1 说要去检查深水区
-;02:01=%1 goes glug glug glug
-02:01=%1 :“咕噜咕噜咕噜……”
-;02:01=%1 goes splash
-02:01=%1 栽入水花里
-;02:01=%1 forgot his armbands
-02:01=%1 忘记了戴臂章
-;02:01=%1 really should have taken swimming lessons
-02:01=%1 真的该去学游泳的
-;02:01=%1 left his surfboard at home
-02:01=%1 把救生圈忘家了
-;02:01=%1 is washed up
-02:01=%1 被冲走了
-;02:01=%1 is one soggy hog
-02:01=%1 脑子进水了
-;02:01=%1 forgot to bring his life jacket
-02:01=%1 忘记带救生衣了
-;02:01=%1 goes splish splash splish
-02:01=%1 实现了水上飘,身后一片水花荡漾
-;02:01=%1 is sleeping with the fishes
-02:01=%1 将会和鱼睡在一起
-;02:01=%1 thinks the water physics suck in this game
-02:01=%1 认为这游戏关于落水的设定糟糕透了
-;02:01=%1 looks thirsty
-02:01=%1 看样子很渴
-;02:01=the sea claims %1
-02:01=大海吞没了 %1
-;02:01=%1 is lost at sea
-02:01=%1 在海上迷失了
-;02:01=%1 should have brought his scuba gear
-02:01=%1 应该要带潜水工具的
-;02:01=%1 gets a burial at sea
-02:01=%1 享受到了海葬待遇
-;02:01=%1 has that sinking feeling
-02:01=%1 觉得自己在下沉
-;02:01=%1 is practicing his backstroke
-02:01=%1 终于能实践自己的游泳理论了
-;02:01=%1 goes in search of the Titanic
-02:01=%1 去泰坦尼克号寻宝了
-;02:01=%1 is not Jesus
-02:01=很遗憾 %1 不是耶稣
-;02:01=%1 is finding Nemo
-02:01=%1 正在寻找Nemo
-;02:01=%1 springs a leak
-02:01=%1 钻入了一个水洼
-;02:01=You've gotta wonder how many hogs are down there
-02:01=你会知道海底还会有多少同伴的
-;02:01=%1 makes the ocean slightly higher
-02:01=%1 让海平面高了那么一点, 就一点
-;02:01=%1 didn't enlist in the Navy
-02:01=很明显 %1 没在海军服役过
-;02:01=%1 is doing his impersonation of a dead fish
-02:01=%1 其实是在模仿死鱼啦
-;02:01=At least you didn't go down the toilet, %1
-02:01=还好 %1 你不是掉进了厕所
-;02:01=Sonic couldn't swim and neither can %1
-02:01=索尼克不能游泳, %1 也一样
-;02:01=%1 wants to play Ecco the dolphin
-02:01=%1 想玩海底漫步
-;02:01=%1 has gone to visit Aquaria
-02:01=%1 去水族馆报到了
-;02:01=%1 has found the lost city of Atlantis
-02:01=%1 找到了传说中的亚特兰蒂斯城
-;02:01=%1 aims for the lead role in Bioshock 3
-02:01=%1 立志在生化奇兵3中担任头号角色
-;02:01=Your doggy paddle could use a little work, %1
-02:01=你的狗刨式会有点用的, %1
-;02:01=%1 should have brought a jet ski
-02:01=%1 竟然没带摩托艇
-;02:01=%1 doesn't like watersports
-02:01=%1 不喜欢水上运动
-;02:01=%1 is forever blowing bubbles
-02:01=%1 学会了绝技: 神风吹泡泡
-;02:01=%1 is short of a raft
-02:01=%1 需要一个救生艇
-;02:01=%1 thinks salt water is good for the skin
-02:01=%1 认为盐水对皮肤有好处
-;02:01=%1 gets salt water in his wounds
-02:01=%1 的伤口沾上了盐水
-;02:01=%1 has walked the plank
-02:01=%1 错过了那块木板
-;02:01=%1 has a bath
-02:01=%1 洗澡去了
-;02:01=%1 is wet wet wet
-02:01=%1 全身都是水,水,水……
-;02:01=%1 gets his quills wet
-02:01=%1 把刺全弄湿了
-;02:01=It's Davy Jones' locker for %1
-02:01=深海阎王正在等待 %1
-
-; Round starts
-; 02:02=Let's fight!
-02:02=开战吧!
-; 02:02=Armed and ready!
-02:02=武装准备!
-;02:02=Let's get ready to rumble!
-02:02=准备对轰!
-;02:02=Let's get it on!
-02:02=为胜利而战吧!
-;02:02=Let's get this party started
-02:02=让我们开始这个派对吧
-;02:02=Last hog standing wins
-02:02=胜利属于最后一个生还者
-;02:02=Let's go!
-02:02=出发吧!
-;02:02=Let's rock!
-02:02=一起摇滚吧!
-;02:02=Let's jam!
-;02:02=It's beginning...
-02:02=开始了...
-;02:02=This is the start of something big
-02:02=这是一个伟大的开始
-;02:02=Welcome to Hedgewars
-02:02=欢迎来到刺猬大作战
-;02:02=Welcome to the front lines
-02:02=欢迎来到前线
-;02:02=Crush your enemies!
-02:02=目标:粉碎你的敌人!
-;02:02=May the best hog win
-02:02=祝愿胜利属于最厉害的刺猬!
-;02:02=Victory or death
-02:02=胜利或死亡
-;02:02=To the victor goes the spoils
-02:02=战利品只属于胜利者
-;02:02=Losing is not an option
-02:02=字典里面应该没有"输"这个字的
-;02:02=Cry havoc! Let loose the hogs of war!
-02:02=放声喊吧! 这是刺猬的战争!
-;02:02=Hedgewars, brought to you by Hedgewars.org
-02:02=欢迎来到刺猬大作战, Hedgewars.org 为你呈现
-02:02=GL HF
-;02:02=Just count yourself lucky you're not up against Tiyuri
-02:02=你看你多幸运不是在对战 Tiyuri
-;02:02=Just count yourself lucky you're not up against unC0Rr
-02:02=你看你多幸运不是在对战 unC0Rr
-;02:02=Just count yourself lucky you're not up against Nemo
-02:02=你看你多幸运不是在对战 Nemo
-;02:02=Just count yourself lucky you're not up against Smaxx
-02:02=你看你多幸运不是在对战 Smaxx
-;02:02=Just count yourself lucky you're not up against Jessor
-02:02=你看你多幸运不是在对战 Jessor
-;02:02=Give it your all!
-02:02=展现你的一切吧!
-;02:02=The losers do the cleaning up!
-02:02=输的要罚扫厕所!
-;02:02=Let the fight of the millenium begin
-02:02=宇宙之战开始了
-;02:02=Let the fight of the century begin
-02:02=世纪之战开始了
-;02:02=Let the fight of the decade begin
-02:02=正义之战开始了
-;02:02=Let the fight of the year begin
-02:02=年度争霸战开始了
-;02:02=Let the fight of the month begin
-02:02=本月之星争霸战开始了
-;02:02=Let the fight of the week begin
-02:02=每周擂主争霸战开始了
-;02:02=Let the fight of the day begin
-02:02=本日最强入围赛开始了
-;02:02=Let the fight of the hour begin
-02:02=我们能战一小时!
-;02:02=Do your best!
-02:02=诸君努力!
-;02:02=Destroy the enemy!
-02:02=目标: 摧毁敌人
-;02:02=Good luck
-02:02=祝你好运
-;02:02=Have fun~
-02:02=开心玩~
-;02:02=Fight the good fight
-02:02=漂亮的战斗
-;02:02=Fight dirty
-02:02=不择手段
-;02:02=Fight with honour
-02:02=满载荣誉而战
-;02:02=Don't give up
-02:02=教练告诉你: 别放弃
-;02:02=Never surrender
-02:02=永不屈服!
-;02:02=Rock 'em and sock 'em!
-02:02=蹂虐对手
-;02:02=Let the fragfest begin!
-02:02=积分赛开始!
-;02:02=I hope you're ready for a tussle!
-02:02=你准备好恶战了么?
-;02:02=Go Go Go!
-02:02=冲冲冲!
-;02:02=Hedgehogs advance!
-02:02=刺猬向前冲!
-;02:02=Bring it to them!
-02:02=炸飞他们!
-;02:02=Have no fear!
-02:02=无所畏惧!
-;02:02=Be brave and conquer
-02:02=敢于征服!
-
-; Round ends (win; unused atm)
-02:03=回合结束(胜利)
-
-; Round ends (draw; unused atm)
-02:04=回合结束(平局)
-
-; New health crate
-;02:05=Incoming aid!
-02:05=医疗包!
-;02:05=Medic!
-02:05=急救包!
-;02:05=First aid from the skies!
-02:05=救援物资空运来了!
-;02:05=A health pack for you
-02:05=你的医疗包到了
-;02:05=Good health.. in box form!
-02:05=生命就在那箱子里!
-;02:05=The doctor calls
-02:05=医生的紧急呼叫
-;02:05=Fresh band-aids!
-02:05=新鲜创可贴!
-;02:05=This will make you feel better
-02:05=吃了这个感觉会好些的...
-;02:05=A Hi-Potion! Whoops wrong game
-02:05=兴奋剂!呃。。。走错地方了
-;02:05=A pick-me-up!
-02:05=万金油!
-;02:05=Grab it
-02:05=捉住它
-;02:05=A healthy snack
-02:05=健康食品
-;02:05=A remedy to pain
-02:05=止痛饼来了
-;02:05=Correct Dosage: as many as you can find!
-02:05=使用方法: 吃得越多越好
-;02:05=Urgent delivery
-02:05=紧急物资
-;02:05=Supplies!
-02:05=补给!
-
-; New ammo crate
-; 02:06=More weapons!
-02:06=武器!
-;02:06=Reinforcements!
-02:06=增援!
-;02:06=Lock and load!
-02:06=准备!
-;02:06=I wonder what weapon is in there?
-02:06=我要的那个会在的吧...
-;02:06=Supplies!
-02:06=补给!
-;02:06=What could be inside?
-02:06=里面会有啥呢?
-;02:06=Christmas comes early in Hedgewars
-02:06=刺猬大作战每天都是圣诞节
-;02:06=A present!
-02:06=礼物送到!
-;02:06=Special delivery!
-02:06=特快专递!
-;02:06=It was a nightmare getting this through customs
-02:06=本局的噩梦来了
-;02:06=Destructive toys from the heavens
-02:06=玩具从天堂掉下来了
-;02:06=Warning! Contents Volatile
-02:06=警告! 内含危险物品
-;02:06=Pick it up or blow it up, choice is yours
-02:06=拿走或打爆, 随你
-;02:06=Goodies!
-02:06=好玩意儿!
-;02:06=Mmmmm Ammo
-02:06=弹药!!!!
-;02:06=A box of destructive power
-02:06=潘朵拉之盒
-;02:06=Airmail!
-02:06=天降之物!
-;02:06=Whatever's in that box, it ain't pizza
-02:06=无论里面是啥, 那肯定不会是软妹子
-;02:06=Get it!
-02:06=拿走它!
-;02:06=Weapon drop incoming
-02:06=武器掉下来了!
-;02:06=Don't let the enemy grab that!
-02:06=别让敌人拿了!
-;02:06=Shiny new toys!
-02:06=新玩具!
-;02:06=A mysterious box!
-02:06=神秘的箱子!
-
-; New utility crate
-; 02:07=Tooltime!
-02:07=工具箱!
-;02:07=This could come in handy...
-02:07=这可能派上用场
-;02:07=Utilities!
-02:07=工具!
-;02:07=Utilise this box
-02:07=工具在这里!
-;02:07=Watch out below
-02:07=快看这里!
-;02:07=More utilities!
-02:07=更多选择更多欢笑, 尽在工具包
-;02:07=Tools for you!
-02:07=一堆工具, 送给你!
-;02:07=This should be good!
-02:07=这看见起来蛮好...
-;02:07=Use this wisely
-02:07=使用这个才是明智的选择
-;02:07=Ooo this box is heavy
-02:07=好重...好重...
-;02:07=You might need this
-02:07=会有用的
-
-; Hog (%1) skips his turn
-; 02:08=%1 is sooo boring...
-02:08=%1 太无聊了...
-;02:08=%1 couldn't be bothered
-02:08=%1 不想被打扰!
-;02:08=%1 is one lazy hog
-02:08=%1 太懒了
-;02:08=%1 is thoughtless
-02:08=%1 太轻率了
-;02:08=%1 gave up
-02:08=%1 放弃了
-;02:08=You snooze you lose, %1
-02:08=不认真你就输了, %1
-;02:08=%1 shamelessly skips
-02:08=%1 无耻的跳过了本回合
-;02:08=%1 is really lazy
-02:08=%1 真的太懒了
-;02:08=%1 needs a little more motivation
-02:08=%1 没有动力了
-;02:08=%1 is a pacifist
-02:08=%1 是和平主义者
-;02:08=%1 has a breather
-02:08=%1 需要喘息一下
-;02:08=%1 has a rest
-02:08=%1 需要休息
-;02:08=%1 chills out
-02:08=%1 发冷了
-;02:08=%1 has no faith in his own abilities
-02:08=%1 做啥都没信心了
-;02:08=%1 decides to do nothing at all
-02:08=%1 决定啥都不做
-;02:08=%1 lets the enemy destroy itself
-02:08=%1 认为敌人会自杀的
-;02:08=%1 would be terrible at parties
-02:08=%1 将会陷入可怕的事件中
-;02:08=%1 hides out
-02:08=%1 说:“你看不到我,你看不到我……”
-;02:08=%1 has decided to pass on this opportunity
-02:08=%1 已经决定放弃这个机会
-;02:08=%1 decides the best thing he can do is...nothing
-02:08=%1 决定他现在最应该做的是......坐着不动
-;02:08=%1 is a big wuss
-02:08=%1 大笨蛋!
-;02:08=Buck Buck Buck, %1 is a chicken
-02:08=%1 是小鸡鸡
-;02:08=%1 is looking a little yellow
-02:08=%1 看来有点印堂发黑
-;02:08=%1 is a coward!
-02:08=%1 是懦夫!
-;02:08=%1 is waiting for sudden death
-02:08=%1 在等待突然死亡模式
-;02:08=%1 is not the fighting type
-02:08=%1 不是战斗系的
-;02:08=%1 is reconsidering his purpose in life
-02:08=%1 正在重新寻找他的人生
-;02:08=%1 was never much of a good shot anyway
-02:08=%1 从来没一次打准的
-;02:08=%1 didn't want to join the army in the first place
-02:08=%1 不想参军
-;02:08=Stop wasting our time, %1
-02:08=别浪费时间了! %1
-;02:08=I'm dissapointed in you, %1
-02:08=我对你失望了, %1
-;02:08=Come on, you can do better than that %1
-02:08=%1 明明就能做的更好的
-;02:08=%1's will has broken
-02:08=%1 会被打飞的
-;02:08=%1 apparently has better things to do
-02:08=%1 显然有更好的事情等着做
-;02:08=%1 is scared stiff
-02:08=%1 怕刺激
-;02:08=%1 has fallen asleep
-02:08=%1 睡着了
-
-; Hog (%1) hurts himself only
-; 02:09=%1 should practice aiming!
-02:09=%1 该练练瞄准了!
-; 02:09=%1 seems to hate himself.
-02:09=%1 似乎看自己很不爽。
-; 02:09=%1 is standing on the wrong side!
-02:09=%1 在表演乌龙!
-; 02:09=%1 makes like an emo
-02:09=%1 以为自己无敌
-; 02:09=%1 was holding his weapon the wrong way around
-02:09=%1 好像把武器拿错方向了
-;02:09=%1 is a little sadistic
-02:09=%1 有点施虐狂
-;02:09=%1 is a masochist
-02:09=%1 是受虐狂
-;02:09=%1 has no instinct of self-preservation
-02:09=%1 根本不会自我保护
-;02:09=%1 messed up
-02:09=%1 乱套了
-;02:09=%1 screwed up
-02:09=%1 搞砸了
-;02:09=That was a poor shot, %1
-02:09=%1 这一发真渣
-;02:09=%1 is a little too careless with dangerous weapons
-02:09=%1 太不小心用那些危险的玩意了
-;02:09=%1 should consider a change of career
-02:09=%1 正在考虑转职
-;02:09=Worst. Shot. Ever!
-02:09=更差! 最差! 非常差!
-;02:09=No no no %1, you shoot at the ENEMY!
-02:09=No no no %1, 你要打敌人!
-;02:09=%1 should only be destroying the enemy
-02:09=%1 应该消灭敌人才对
-;02:09=%1 moves one step closer to suicide
-02:09=%1 正在走向自杀
-;02:09=%1 aids the enemy
-02:09=%1 帮助敌人
-;02:09=That was stupid %1
-02:09= %1 是笨蛋
-;02:09=%1 lives by the mantra of "no pain, no gain"
-02:09=%1 贯彻“不付出,何收获“的原则
-;02:09=%1 is confused
-02:09=%1 思维混乱了
-;02:09=%1 hurt itself in its confusion
-02:09=%1 在混乱中攻击自己
-;02:09=%1 has a knack for embarrassing himself
-02:09=%1 正在为自己尴尬
-;02:09=%1 is a klutz!
-02:09=%1 就是一个笨蛋!
-;02:09=%1 is clumsy
-02:09=%1 笨手笨脚的
-;02:09=%1 shows the enemy what he's capable of
-02:09=%1 展示了自己的能力
-;02:09=%1 can't be expected to be perfect all the time
-02:09=%1 不能每次都完美
-;02:09=Don't worry %1, pobody's nerfect
-02:09=不用担心 %1 , 人都不是完美的
-;02:09=%1 totally did that on purpose
-02:09=%1 这么做真的是有目的
-;02:09=I won't tell anyone if you don't, %1
-02:09=我不会把 %1 的事情到处说的
-;02:09=How embarrassing!
-02:09=何等的失态!
-;02:09=I'm sure nobody saw that %1
-02:09=保证,决没人看到 %1 做什么
-;02:09=%1 needs to review his field manual
-02:09=%1 需要复习说明书
-;02:09=%1's weapon clearly malfunctioned
-02:09=%1 的武器很明显坏了
-
-; Hog shot an home run (using the bat and another hog)
-; 02:10=Home Run!
-02:10=全垒打!
-; 02:10=A bird, a plane, ...
-02:10=一只鸟,一架飞机,...
-; 02:10=That one is out!
-02:10=那一位出界了!
-
-; Hog (%1) has to leave (team is gone)
-02:11=%1 必须上床了
-02:11=%1 玩的过火了,休息一下
-02:11=发射!这位已经被送出去
-02:11=%1 必须走了
-
-; Weapon Categories
-03:00=定时手雷
-03:01=定时手雷
-03:02=弹道武器
-03:03=制导武器
-03:04=枪 (多发子弹)
-03:05=钻孔工具
-03:06=动作
-03:07=移动工具
-03:08=接近式炸弹
-03:09=枪 (多发子弹)
-03:10=BOOM!
-03:11=咚!
-03:12=武术
-03:13=未使用
-03:14=移动工具
-03:15=空投打击
-03:16=空投打击
-03:17=打洞工具
-03:18=工具
-03:19=移动工具
-03:20=动作
-03:21=弹道武器
-03:22=叫我主人!
-03:23=武术 (真的!)
-03:24=蛋糕不是谎言!
-03:25=化妆的诱惑
-03:26=果汁手雷
-03:27=烫手手雷
-03:28=弹道武器
-03:29=弹道武器
-03:30=空投打击
-03:31=遥控飞机(不是玩具!)
-03:32=临时效果
-03:33=临时效果
-03:34=临时效果
-03:35=临时效果
-03:36=临时效果
-03:37=临时效果
-03:38=枪 (多发子弹)
-03:39=移动工具
-03:40=燃烧弹
-;03:41=Huge fan of Squawks
-03:41=粉丝的呼喊
-;03:42=I'm making a note here...
-03:42=我将在此做一记录...
-; the misspelled "Beethoven" is intentional (-> to beat)
-;03:43=Performing Beathoven's deadly sonata
-03:43=正在演奏贝揍芬的死亡奏鸣曲
-;03:44=Best before: 1923
-03:44=此日期前最佳:1923
-;03:45=The power of science
-03:45=科学的力量
-;03:46=Hot Hot Hot!
-03:46=烫烫烫!
-;03:47=Stick these somewhere useful!
-03:47= 呆在有利的地方!
-;03:48=It's Hammer time!
-03:48=大锤威武!
-;03:49=Does what you guess
-03:49=尽情猜想
-;03:50=Moles fan
-03:50=地道战
-
-; Weapon Descriptions (use | as line breaks)
-04:00=使用简单的手榴弹攻击敌人.|定时器倒数到0就会爆炸.|1-5: 设定定时器|攻击键: 按住蓄力.
-04:01=使用集束手雷攻击敌人.|定时器倒数到0就会爆炸并裂开成几块.|1-5: 设定定时器|攻击键: 按住蓄力.
-04:02=使用弹道导弹攻击敌人.|受风力影响.|攻击键: 按住蓄力.
-04:03=发射一个制导导弹攻击所选目标.|如果要精确打击就不要使用全力发射.|光标: 选定目标|攻击键: 按住蓄力.
-04:04=霰弹枪有两排子弹.|因为是霰弹枪所以不一定要对准敌人.|攻击键: 开枪 (两发)
-04:05=向地底出发! 使用他就能在地面|打个洞, 就能去其他地方.|攻击键: 开始/停止打洞
-04:06=闷了? 没法打? 保存体力? 没问题!|跳过这回合就可以了, 懦夫!|攻击键: 跳过回合
-04:07=用绳索就可以去很远的地方.|还能空降到别的刺猬身上丢手榴弹呢.|攻击键: 发射/收回绳索|长跳键: 发射手榴弹或其他武器
-04:08=你能用地雷阻止敌人靠近.|还能静悄悄的放在敌人脚下.|一定要在爆炸前逃离到安全的地方!|攻击键: 把地雷放在你的脚下
-04:09=自我感觉准头不行? |沙漠之鹰有4颗子弹呢.|攻击键: 开枪 (四发)
-04:10=使用强力炸药就是一个明智的选择.|这是最经典的轰炸方式.|攻击键: 把炸药放在你的脚下
-04:11=把敌人打飞, 飞出地图或者飞进水里.|或者把地雷打过去?|攻击键: 敲打你面前的所有东西
-04:12=这就是武术的威力!|致命的气功!|攻击键: 使用升龙拳
-04:13=UNUSED
-04:14=有恐高症? 拿降落伞吧.|他能慢慢的安全的把你带到地面.|攻击键: 展开降落伞
-04:15=呼叫一架飞机轰炸你的敌人.|左/右方向键: 决定攻击方向|光标: 选定目标
-04:16=呼叫一架飞机投下大量地雷.|左/右方向键: 决定攻击方向|光标: 选定目标
-04:17=需要个安全的地方? 使用喷灯为你挖掘一条安全的隧道!|攻击键: 开始/停止挖掘
-04:18=喷灯还不够?还要个更安全的地方?|建造若干条大梁挡住吧.|左/右方向键: 选择梁的方向|光标: 建造
-04:19=适当的时候撤退是比所有的攻击|更安全的选择|光标: 选择传送目标
-04:20=可以让你更换当前使用的刺猬.|攻击键: 启动切换功能
-04:21=用炮弹发射器发射一个手榴弹样|的东西. 在爆炸之后会裂开成小块|攻击键: 全力发射
-04:22=这不只是女王才用的东西!|这鞭子能解决很多问题, 比如说那些|喜欢站在悬崖边上的小屁孩.|攻击键: 鞭打你面前的一切东西
-04:23=自杀式炸弹袭击向来好用!|用你的一条命攻击直线上的一切东西并爆炸.|攻击键: 启动自杀性攻击
-04:24=生日快乐! 嗱, 放下这个蛋糕, 他|就会走到敌人身边然后爆炸.| 而且能贴着地形走.|攻击键: 让蛋糕开始/结束走路
-04:25=使用美人计让敌人向着你这个方向跳|(比如跳进海里).|攻击键: 使用本工具诱惑敌人
-04:26=把这个多汁的西瓜扔向敌人!| 一旦定时器倒数完, 就会|炸成几块更强力的炸弹.|攻击键: 按住蓄力.
-04:27=让地狱的礼花在敌人头上绽放!|这真的是危险品, 使用时候记得原理|爆炸之后还会燃烧好一阵子|攻击键: 按住蓄力.
-04:28=本火箭在发射后将会钻到地里|一旦燃料用完或者打穿地面就会爆炸.|攻击键: 按住蓄力.
-04:29=还记得小时候玩的玻璃球么?|不过这个是炸弹版. 发射大量的小玻|璃球然后爆炸|攻击键: 全力发射|上/下方向键: 发射过程中更换方向
-04:30=呼叫一架飞机空投燃烧弹.|用得好的话会造成巨大伤害.|左/右方向键: 决定攻击方向|光标: 选定目标
-04:31=啊哈, 遥控飞机除了能帮你|收集物品之外. 还能空投炸弹.|攻击键: 飞机起飞/投放炸弹|长跳键: 战场之神|上/下方向键: 控制方向
-04:32=低重力装置能影响更多东西!| 除了跳得更远之外还能让|敌人飞得更远.|攻击键: 激活
-04:33=有时候致命打击还是不够过瘾.|攻击键: 激活
-04:34=你打不到我!|攻击键: 激活
-04:35=时间流逝得很快, 你也知道|刺猬腿短.|攻击键: 激活
-04:36=好吧, 你最后还是承认自己眼神不好.|高科技还是能帮你不少的.|攻击键: 激活
-04:37=不用害怕白天.|这只能本回合有效, 可以把造成的伤害变|成自己的血量 .|攻击键: 激活
-04:38=你也知道狙击枪的威力,|能打比较远的地方.|攻击键: 射击 (2发子弹)
-04:39=驾驶飞碟可以飞到地图上的任何角落.|不过这个东西连发明者都认为很难用.|攻击键: 激活|上/左/右方向键: 向某方向飞|前跳:攻击敌人
-04:40=把地面填满汽油然后....|攻击键: 按住蓄力.
-;04:41=The evidence nature might even top the flying|saucer. Birdy can carry your hog around and|drop eggs on your enemies!|Be quick, as using Birdy eats into your turn|time!|Attack: Activate and drop eggs|Up/Left/Right: Flap in one direction
-04:41=自然的力量胜过飞盘的证据。|鸟儿可以携带刺猬并在敌人头上下蛋!|要快!使用鸟儿会消耗回合时间!|攻击键: 激活鸟儿和下蛋|上/左/右方向键: 向某方向飞
-;04:42=This portable portal device is capable|of instantly transporting you, your enemies,|or your weaponry between two points on the|terrain.|Use it wisely and your campaign will be a...|HUGE SUCCESS!|Attack: Shoot a portal|Switch: Cycle portal colours
-04:42=移动传送装置|迅速传输自己或者敌人或者|你的武器,直接连接|地表的两个不同位置。|如果用的聪明那你的战斗将是一场……|巨大的胜利!|攻击键: 发射一个传送点|切换键: 改变颜色
-;04:43=Make your musical debut an explosive success!|Drop a piano from the heavens, but beware...|someone needs to play it, and that may cost you|your life!|Cursor: Select target region|F1-F9: Play the piano
-04:43=音乐细胞的迸发!|钢琴从天堂降落,带|着演奏者最终回归天堂|光标: 选择目标区域|F1-F9:演奏钢琴
-04:44=这不是奶酪!而是生化武器!|爆炸只有一次,带来的毒害是深远的!|1-5: 设定定时器|攻击键: 按住蓄力
-;04:45=All those physics classes have finally |paid off, launch a devastating Sine |wave at your foes. |Watch out, this weapon packs quite a kick. (This weapon is incomplete)|Attack: Shoot
-04:45=全部物理阶级最终|转化为正弦波动|留心,力是相对的|攻击键: 发射
-;04:46=Cover your foes with sizzling liquid flame.|Heartwarming!|Attack: Activate|Up/Down: Continue aiming|Left/Right: Modify spitting power
-04:46= 用满腔的火焰虐待你的对手吧。|攻击键: 激活|上/下方向键: 改变攻击方向|左/右方向键: 调整喷射距离
-;04:47=Double the fun with two spiky, sneaky, sticky mines.|Set up a chain reaction or defend yourself (or both!)|Attack: Hold to shoot with more power (twice)
-04:47=两次机会双重乐趣,隐蔽且黏着的地雷。|利用脑力造成连锁反应!|攻击键: 按住蓄力(两发)
-;04:48=Why should the moles get all the abuse?|Wacking a hog can be just as fun! A good|blow from this hammer will shave off one|third of a hog's health and plunge them|underground.|Attack: Activate
-04:48=痛扁刺猬:用力一锤|将使中者镶入地表,削减它健康的1/3.|攻击键: 打
-;04:49=Resurrect your friends!|But beware that this also resurrects your foes.|Attack: Keep attack pressed to resurrect slowly|Up: Accelerate resurrection
-04:49=复苏|注意,一视同仁|使用: 按住使用键|上: 提高速率
-
-; Game goal strings
-;05:01=The following rules apply
-05:01= 将应用以下规则
-;05:02=Forts: Defend your fortress; vanquish your enemies!
-05:02= 城堡: 守住你的城堡; 削平你的敌人!
-;05:03=Low Gravity: Watch your step
-05:03= 低重力: 注意脚步
-;05:04=Invulnerability: Hogs are (almost) invulnerable
-05:04=无敌: 刺猬不受伤害
-;05:05=Vampirism: Hogs will be healed for the damage dealt
-05:05=吸血: 敌人失去的就是我的
-;05:06=Karma: Hogs will be damaged for the damage dealt
-05:06=因果效应: 伤害有多少,自己都知道
-;05:07=Protect the King: Don't let your king die!|Place the King: Pick a protected starting point for your King
-05:07=保护国王: 国王不能死!|放置国王: 为国王选择安全的起始地点
-;05:08=Place Hedgehogs: Place your hogs before the game starts
-05:08=选择起始点: 游戏开始前手动放置刺猬
-;05:09=Artillery: Hogs can't walk to change position
-05:09=远程打击: 不许动!
-;05:10=Indestructible Terrain: Most weapons won't destroy terrain
-05:10=无损地表: 多数武器无法改变地形
-;05:11=Shared Ammo: All teams of the same color share their ammunition
-05:11=共享装备: 同色的刺猬共享它们的装备
-;05:12=Mine Timers: Mines will detonate after %1 second(s)
-05:12=地雷定时器: %1 秒起爆
-;05:13=Mine Timers: Mines will detonate instantly
-05:13=地雷定时器: 立即起爆
-;05:14=Mine Timers: Mines will detonate after 0 - 3 seconds
-05:14=地雷定时器: 0-3 秒起爆
-;05:15=Damage Modifier: All weapons will do %1% damage
-05:15=伤害修正: 武器伤害使用 %1% 修正值
-;05:16=Health of all hogs is reset on end of turn
-05:16=所有活着的刺猬回合结尾时彻底恢复健康
-;05:17=AI hogs respawn on death
-05:17=AI刺猬即时复活
-;05:18=Unlimited Attacks
-05:18=无限攻击法则
-;05:19=Weapons are reset on end of turn
-05:19=武器在回合结束时重置
-;05:20=Weapons are not shared between hogs
-05:20=刺猬的武器无法分享
+01:05=退出 (Y/Esc)?
+01:06=出现紧急情况!
--- a/tools/PascalParser.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/tools/PascalParser.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -270,12 +270,12 @@
         char ';'
         comments
         forward <- liftM isJust $ optionMaybe (try (string "forward;") >> comments)
-        many functionDecorator
+        inline <- liftM (any (== "inline;")) $ many functionDecorator
         b <- if isImpl && (not forward) then
                 liftM Just functionBody
                 else
                 return Nothing
-        return $ [OperatorDeclaration i rid ret vs b]
+        return $ [OperatorDeclaration i rid inline ret vs b]
 
 
     funcDecl = do
@@ -295,21 +295,24 @@
         char ';'
         comments
         forward <- liftM isJust $ optionMaybe (try (string "forward;") >> comments)
-        many functionDecorator
+        inline <- liftM (any (== "inline;")) $ many functionDecorator
         b <- if isImpl && (not forward) then
                 liftM Just functionBody
                 else
                 return Nothing
-        return $ [FunctionDeclaration i ret vs b]
+        return $ [FunctionDeclaration i inline ret vs b]
 
-    functionDecorator = choice [
-        try $ string "inline;"
-        , try $ caseInsensitiveString "cdecl;"
-        , try $ string "overload;"
-        , try $ string "export;"
-        , try $ string "varargs;"
-        , try (string "external") >> comments >> iD >> optional (string "name" >> comments >> stringLiteral pas)>> string ";"
-        ] >> comments
+    functionDecorator = do
+        d <- choice [
+            try $ string "inline;"
+            , try $ caseInsensitiveString "cdecl;"
+            , try $ string "overload;"
+            , try $ string "export;"
+            , try $ string "varargs;"
+            , try (string "external") >> comments >> iD >> optional (string "name" >> comments >> stringLiteral pas)>> string ";"
+            ]
+        comments
+        return d
 
 
 program = do
--- a/tools/PascalUnitSyntaxTree.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/tools/PascalUnitSyntaxTree.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -19,8 +19,8 @@
     deriving Show
 data TypeVarDeclaration = TypeDeclaration Identifier TypeDecl
     | VarDeclaration Bool Bool ([Identifier], TypeDecl) (Maybe InitExpression)
-    | FunctionDeclaration Identifier TypeDecl [TypeVarDeclaration] (Maybe (TypesAndVars, Phrase))
-    | OperatorDeclaration String Identifier TypeDecl [TypeVarDeclaration] (Maybe (TypesAndVars, Phrase))
+    | FunctionDeclaration Identifier Bool TypeDecl [TypeVarDeclaration] (Maybe (TypesAndVars, Phrase))
+    | OperatorDeclaration String Identifier Bool TypeDecl [TypeVarDeclaration] (Maybe (TypesAndVars, Phrase))
     deriving Show
 data TypeDecl = SimpleType Identifier
     | RangeType Range
--- a/tools/pas2c.hs	Sat Aug 18 00:47:51 2012 +0200
+++ b/tools/pas2c.hs	Sat Aug 18 00:48:09 2012 +0200
@@ -17,24 +17,32 @@
 import Data.List (find)
 import Numeric
 
-import PascalParser
+import PascalParser(pascalUnit)
 import PascalUnitSyntaxTree
 
 
 data InsertOption =
     IOInsert
+    | IOInsertWithType Doc
     | IOLookup
     | IOLookupLast
     | IOLookupFunction Int
     | IODeferred
 
-type Record = (String, BaseType)
+data Record = Record
+    {
+        lcaseId :: String,
+        baseType :: BaseType,
+        typeDecl :: Doc
+    }
+    deriving Show
 type Records = Map.Map String [Record]
 data RenderState = RenderState
     {
         currentScope :: Records,
         lastIdentifier :: String,
         lastType :: BaseType,
+        lastIdTypeDecl :: Doc,
         stringConsts :: [(String, String)],
         uniqCounter :: Int,
         toMangle :: Set.Set String,
@@ -43,7 +51,9 @@
         namespaces :: Map.Map String Records
     }
 
-emptyState = RenderState Map.empty "" BTUnknown [] 0 Set.empty "" ""
+rec2Records = map (\(a, b) -> Record a b empty)
+
+emptyState = RenderState Map.empty "" BTUnknown empty [] 0 Set.empty "" ""
 
 getUniq :: State RenderState Int
 getUniq = do
@@ -161,12 +171,12 @@
     nss <- gets namespaces
     withState' (\st -> st{currentScope = fromMaybe Map.empty $ Map.lookup li (namespaces st)}) f
 
-withRecordNamespace :: String -> [(String, BaseType)] -> State RenderState Doc -> State RenderState Doc
+withRecordNamespace :: String -> [Record] -> State RenderState Doc -> State RenderState Doc
 withRecordNamespace _ [] = error "withRecordNamespace: empty record"
 withRecordNamespace prefix recs = withState' f
     where
         f st = st{currentScope = Map.unionWith un records (currentScope st), currentUnit = ""}
-        records = Map.fromList $ map (\(a, b) -> (map toLower a, [(prefix ++ a, b)])) recs
+        records = Map.fromList $ map (\(Record a b d) -> (map toLower a, [Record (prefix ++ a) b d])) recs
         un [a] b = a : b
 
 toCFiles :: Map.Map String Records -> (String, PascalUnit) -> IO ()
@@ -200,7 +210,7 @@
 
 pascal2C (Program _ implementation mainFunction) = do
     impl <- implementation2C implementation
-    [main] <- tvar2C True False True True (FunctionDeclaration (Identifier "main" BTInt) (SimpleType $ Identifier "int" BTInt) [VarDeclaration False False ([Identifier "argc" BTInt], SimpleType (Identifier "Integer" BTInt)) Nothing, VarDeclaration False False ([Identifier "argv" BTUnknown], SimpleType (Identifier "PPChar" BTUnknown)) Nothing] (Just (TypesAndVars [], mainFunction)))
+    [main] <- tvar2C True False True True (FunctionDeclaration (Identifier "main" BTInt) False (SimpleType $ Identifier "int" BTInt) [VarDeclaration False False ([Identifier "argc" BTInt], SimpleType (Identifier "Integer" BTInt)) Nothing, VarDeclaration False False ([Identifier "argv" BTUnknown], SimpleType (Identifier "PPChar" BTUnknown)) Nothing] (Just (TypesAndVars [], mainFunction)))
     return $ impl $+$ main
 
 
@@ -231,7 +241,7 @@
     where
         initMap = Map.empty
         --initMap = Map.fromList [("reset", 2)]
-        ins (FunctionDeclaration (Identifier i _) _ _ _) m = Map.insertWith (+) (map toLower i) 1 m
+        ins (FunctionDeclaration (Identifier i _) _ _ _ _) m = Map.insertWith (+) (map toLower i) 1 m
         ins _ m = m
 
 -- the second bool indicates whether declare variable as extern or not
@@ -261,8 +271,11 @@
 uses2List (Uses ids) = map (\(Identifier i _) -> i) ids
 
 
+setLastIdValues vv = (\s -> s{lastType = baseType vv, lastIdentifier = lcaseId vv, lastIdTypeDecl = typeDecl vv})
+
 id2C :: InsertOption -> Identifier -> State RenderState Doc
-id2C IOInsert (Identifier i t) = do
+id2C IOInsert i = id2C (IOInsertWithType empty) i
+id2C (IOInsertWithType d) (Identifier i t) = do
     ns <- gets currentScope
     tom <- gets (Set.member n . toMangle)
     cu <- gets currentUnit
@@ -271,7 +284,7 @@
             (BTFunction _ _ _, _) -> (cu ++ i, t)
             (BTVarParam t', _) -> ('(' : '*' : i ++ ")" , t')
             _ -> (i, t)
-    modify (\s -> s{currentScope = Map.insertWith (++) n [(i', t')] (currentScope s), lastIdentifier = n})
+    modify (\s -> s{currentScope = Map.insertWith (++) n [Record i' t' d] (currentScope s), lastIdentifier = n})
     return $ text i'
     where
         n = map toLower i
@@ -286,9 +299,9 @@
         error $ "Not defined: '" ++ i' ++ "'\n" ++ show lt ++ "\nwith num of params = " ++ show params ++ "\n" ++ show v
         else
         let vv = fromMaybe (head $ fromJust v) . find checkParam $ fromJust v in
-            modify (\s -> s{lastType = snd vv, lastIdentifier = fst vv}) >> (return . text . fst $ vv)
+            modify (setLastIdValues vv) >> (return . text . lcaseId $ vv)
     where
-        checkParam (_, BTFunction _ p _) = p == params
+        checkParam (Record _ (BTFunction _ p _) _) = p == params
         checkParam _ = False
 id2C IODeferred (Identifier i t) = do
     let i' = map toLower i
@@ -296,7 +309,7 @@
     if (isNothing v) then
         modify (\s -> s{lastType = BTUnknown, lastIdentifier = i}) >> return (text i)
         else
-        let vv = head $ fromJust v in modify (\s -> s{lastType = snd vv, lastIdentifier = fst vv}) >> (return . text . fst $ vv)
+        let vv = head $ fromJust v in modify (setLastIdValues vv) >> (return . text . lcaseId $ vv)
 
 id2CLookup :: ([Record] -> Record) -> Identifier -> State RenderState Doc
 id2CLookup f (Identifier i t) = do
@@ -306,30 +319,34 @@
     if isNothing v then
         error $ "Not defined: '" ++ i' ++ "'\n" ++ show lt
         else
-        let vv = f $ fromJust v in modify (\s -> s{lastType = snd vv, lastIdentifier = fst vv}) >> (return . text . fst $ vv)
+        let vv = f $ fromJust v in modify (setLastIdValues vv) >> (return . text . lcaseId $ vv)
 
 
 id2CTyped :: TypeDecl -> Identifier -> State RenderState Doc
-id2CTyped t (Identifier i _) = do
+id2CTyped = id2CTyped2 Nothing
+
+id2CTyped2 :: Maybe Doc -> TypeDecl -> Identifier -> State RenderState Doc
+id2CTyped2 md t (Identifier i _) = do
     tb <- resolveType t
     case (t, tb) of
         (_, BTUnknown) -> do
             error $ "id2CTyped: type BTUnknown for " ++ show i ++ "\ntype: " ++ show t
         (SimpleType {}, BTRecord _ r) -> do
             ts <- type2C t
-            id2C IOInsert (Identifier i (BTRecord (render $ ts empty) r))
+            id2C (IOInsertWithType $ ts empty) (Identifier i (BTRecord (render $ ts empty) r))
         (_, BTRecord _ r) -> do
             ts <- type2C t
-            id2C IOInsert (Identifier i (BTRecord i r))
-        _ -> id2C IOInsert (Identifier i tb)
-
+            id2C (IOInsertWithType $ ts empty) (Identifier i (BTRecord i r))
+        _ -> case md of
+                Nothing -> id2C IOInsert (Identifier i tb)
+                Just ts -> id2C (IOInsertWithType ts) (Identifier i tb)
 
 
 resolveType :: TypeDecl -> State RenderState BaseType
 resolveType st@(SimpleType (Identifier i _)) = do
     let i' = map toLower i
     v <- gets $ Map.lookup i' . currentScope
-    if isJust v then return . snd . head $ fromJust v else return $ f i'
+    if isJust v then return . baseType . head $ fromJust v else return $ f i'
     where
     f "integer" = BTInt
     f "pointer" = BTPointerTo BTVoid
@@ -372,7 +389,7 @@
 resolve s (BTUnresolved t) = do
     v <- gets $ Map.lookup t . currentScope
     if isJust v then
-        resolve s . snd . head . fromJust $ v
+        resolve s . baseType . head . fromJust $ v
         else
         error $ "Unknown type " ++ show t ++ "\n" ++ s
 resolve _ t = return t
@@ -412,20 +429,21 @@
         ps = zip ['a'..] (toIsVarList params)
 
 fun2C :: Bool -> String -> TypeVarDeclaration -> State RenderState [Doc]
-fun2C _ _ (FunctionDeclaration name returnType params Nothing) = do
+fun2C _ _ (FunctionDeclaration name inline returnType params Nothing) = do
     t <- type2C returnType
     t'<- gets lastType
     p <- withState' id $ functionParams2C params
     n <- liftM render . id2C IOInsert $ setBaseType (BTFunction hasVars (numberOfDeclarations params) t') name
+    let decor = if inline then text "inline" else empty
     if hasVars then
-        return [funWithVarsToDefine n params $+$ t empty <+> text (n ++ "__vars") <> parens p]
+        return [funWithVarsToDefine n params $+$ decor <+> t empty <+> text (n ++ "__vars") <> parens p]
         else
-        return [t empty <+> text n <> parens p]
+        return [decor <+> t empty <+> text n <> parens p]
     where
         hasVars = hasPassByReference params
 
 
-fun2C True rv (FunctionDeclaration name@(Identifier i _) returnType params (Just (tvars, phrase))) = do
+fun2C True rv (FunctionDeclaration name@(Identifier i _) inline returnType params (Just (tvars, phrase))) = do
     let res = docToLower $ text rv <> text "_result"
     t <- type2C returnType
     t'<- gets lastType
@@ -438,7 +456,7 @@
             VoidType -> True
             _ -> False
 
-    (p, ph) <- withState' (\st -> st{currentScope = Map.insertWith un (map toLower rv) [(render res, t')] $ currentScope st
+    (p, ph) <- withState' (\st -> st{currentScope = Map.insertWith un (map toLower rv) [Record (render res) t' empty] $ currentScope st
             , currentFunctionResult = if isVoid then [] else render res}) $ do
         p <- functionParams2C params
         ph <- liftM2 ($+$) (typesAndVars2C False False True tvars) (phrase2C' phrase)
@@ -446,11 +464,12 @@
 
     let phrasesBlock = if isVoid then ph else t empty <+> res <> semi $+$ ph $+$ text "return" <+> res <> semi
     let define = if hasVars then text "#ifndef" <+> text n $+$ funWithVarsToDefine n params $+$ text "#endif" else empty
+    let decor = if inline then text "inline" else empty
     return [
         define
         $+$
         --(if notDeclared && hasVars then funWithVarsToDefine n params else empty) $+$
-        t empty <+> text (if hasVars then n ++ "__vars" else n) <> parens p
+        decor <+> t empty <+> text (if hasVars then n ++ "__vars" else n) <> parens p
         $+$
         text "{"
         $+$
@@ -463,14 +482,14 @@
     un [a] b = a : b
     hasVars = hasPassByReference params
 
-fun2C False _ (FunctionDeclaration (Identifier name _) _ _ _) = error $ "nested functions not allowed: " ++ name
+fun2C False _ (FunctionDeclaration (Identifier name _) _ _ _ _) = error $ "nested functions not allowed: " ++ name
 fun2C _ tv _ = error $ "fun2C: I don't render " ++ show tv
 
 -- the second bool indicates whether declare variable as extern or not
 -- the third bool indicates whether include types or not
 -- the fourth bool indicates whether ignore initialization or not (basically for dynamic arrays since we cannot do initialization in function params)
 tvar2C :: Bool -> Bool -> Bool -> Bool -> TypeVarDeclaration -> State RenderState [Doc]
-tvar2C b _ includeType _ f@(FunctionDeclaration (Identifier name _) _ _ _) = do
+tvar2C b _ includeType _ f@(FunctionDeclaration (Identifier name _) _ _ _ _) = do
     t <- fun2C b name f
     if includeType then return t else return []
 tvar2C _ _ includeType _ td@(TypeDeclaration i' t) = do
@@ -480,7 +499,7 @@
 
 tvar2C _ _ _ _ (VarDeclaration True _ (ids, t) Nothing) = do
     t' <- liftM ((empty <+>) . ) $ type2C t
-    liftM (map(\i -> t' i)) $ mapM (id2CTyped (VarParamType t)) ids
+    liftM (map(\i -> t' i)) $ mapM (id2CTyped2 (Just $ t' empty) (VarParamType t)) ids
 
 tvar2C _ externVar includeType ignoreInit (VarDeclaration _ isConst (ids, t) mInitExpr) = do
     t' <- liftM (((if isConst then text "static const" else if externVar 
@@ -515,7 +534,7 @@
                     
                 (_, _) -> return result
             
-         _ -> liftM (map(\i -> varDeclDecision isConst includeType (t' i) ie)) $ mapM (id2CTyped t) ids
+         _ -> liftM (map(\i -> varDeclDecision isConst includeType (t' i) ie)) $ mapM (id2CTyped2 (Just $ t' empty) t) ids
     where
     initExpr Nothing = return $ empty
     initExpr (Just e) = liftM (text "=" <+>) (initExpr2C e)
@@ -528,9 +547,9 @@
         ArrayDecl _ _ -> error "Mixed dynamic array and static array are not supported."
         _ -> 0
 
-tvar2C f _ _ _ (OperatorDeclaration op (Identifier i _) ret params body) = do
+tvar2C f _ _ _ (OperatorDeclaration op (Identifier i _) inline ret params body) = do
     r <- op2CTyped op (extractTypes params)
-    fun2C f i (FunctionDeclaration r ret params body)
+    fun2C f i (FunctionDeclaration r inline ret params body)
 
 
 op2CTyped :: String -> [TypeDecl] -> State RenderState Identifier
@@ -780,20 +799,27 @@
     r <- ref2C ref
     t <- gets lastType
     case t of
-        (BTRecord _ rs) -> withRecordNamespace (render r ++ ".") rs $ phrase2C $ wrapPhrase p
+        (BTRecord _ rs) -> withRecordNamespace (render r ++ ".") (rec2Records rs) $ phrase2C $ wrapPhrase p
         a -> do
             error $ "'with' block referencing non-record type " ++ show a ++ "\n" ++ show wb
 phrase2C (ForCycle i' e1' e2' p up) = do
     i <- id2C IOLookup i'
+    iType <- gets lastIdTypeDecl
     e1 <- expr2C e1'
     e2 <- expr2C e2'
-    ph <- phrase2C (wrapPhrase p)
-    cmp <- return $ if up == True then "<=" else ">="
-    inc <- return $ if up == True then "++" else "--"
-    return $
-        text "for" <> (parens . hsep . punctuate (char ';') $ [i <+> text "=" <+> parens e1, i <+> text cmp <+> parens e2, text inc <> i])
+    let inc = if up then "inc" else "dec"
+    let add = if up then "+ 1" else "- 1"
+    let iEnd = i <> text "__end__"
+    ph <- phrase2C . appendPhrase (BuiltInFunctionCall [Reference $ SimpleReference i'] (SimpleReference (Identifier inc BTUnknown))) $ wrapPhrase p
+    return . braces $
+        i <+> text "=" <+> e1 <> semi
         $$
-        ph
+        iType <+> iEnd <+> text "=" <+> e2 <> semi
+        $$ 
+        text "if" <+> (parens $ i <+> text "<=" <+> iEnd) <+> text "do" <+> ph <+>
+        text "while" <> parens (i <+> text "!=" <+> iEnd <+> text add) <> semi
+    where
+        appendPhrase p (Phrases ps) = Phrases $ ps ++ [p]
 phrase2C (RepeatCycle e' p') = do
     e <- expr2C e'
     p <- phrase2C (Phrases p')
@@ -992,7 +1018,7 @@
     r1 <- ref2C ref1
     t <- fromPointer (show ref1) =<< gets lastType
     r2 <- case t of
-        BTRecord _ rs -> withRecordNamespace "" rs $ ref2C ref2
+        BTRecord _ rs -> withRecordNamespace "" (rec2Records rs) $ ref2C ref2
         BTUnit -> error "What??"
         a -> error $ "dereferencing from " ++ show a ++ "\n" ++ show rf
     return $
@@ -1002,7 +1028,7 @@
     t <- gets lastType
     case t of
         BTRecord _ rs -> do
-            r2 <- withRecordNamespace "" rs $ ref2C ref2
+            r2 <- withRecordNamespace "" (rec2Records rs) $ ref2C ref2
             return $ r1 <> text "." <> r2
         BTUnit -> withLastIdNamespace $ ref2C ref2
         a -> error $ "dereferencing from " ++ show a ++ "\n" ++ show rf