--- a/.hgtags Tue Dec 14 22:32:47 2010 +0100
+++ b/.hgtags Thu Dec 23 11:13:57 2010 -0500
@@ -23,3 +23,4 @@
3620607258cdc1213dce20cb6ad7872f6b8085e0 Hedgewars-iOS-1.0.1
adffb668f06e265b45d1e4aedc283e6f4e5ba7e8 Hedgewars-iOS-1.1
ede569bb76f389bd5dfbb7ebf68af3087e3e881c Hedgewars-iOS-1.2
+a5735e877aae61cd705265e2f8c0c7ad08d45f0e Hedgewars-iOS-1.2.1
--- a/QTfrontend/SDLs.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/SDLs.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -166,7 +166,7 @@
SDLMusicInit();
if (music == NULL) {
- music = Mix_LoadMUS((datadir->absolutePath() + "/Music/main theme.ogg").toLocal8Bit().constData());
+ music = Mix_LoadMUS((datadir->absolutePath() + "/Music/main_theme.ogg").toLocal8Bit().constData());
}
Mix_VolumeMusic(MIX_MAX_VOLUME - 28);
--- a/QTfrontend/SquareLabel.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/SquareLabel.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -29,6 +29,8 @@
void SquareLabel::paintEvent(QPaintEvent * event)
{
+ Q_UNUSED(event);
+
QPainter painter(this);
int pixsize;
if (width() > height()) {
--- a/QTfrontend/ammoSchemeModel.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/ammoSchemeModel.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -577,6 +577,10 @@
QVariant AmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
+ Q_UNUSED(section);
+ Q_UNUSED(orientation);
+ Q_UNUSED(role);
+
return QVariant();
}
@@ -598,6 +602,8 @@
Qt::ItemFlags AmmoSchemeModel::flags(const QModelIndex & index) const
{
+ Q_UNUSED(index);
+
return
Qt::ItemIsEnabled
| Qt::ItemIsSelectable
@@ -620,12 +626,22 @@
bool AmmoSchemeModel::insertRows(int row, int count, const QModelIndex & parent)
{
- beginInsertRows(parent, row, row);
+ Q_UNUSED(count);
+
+ beginInsertRows(parent, schemes.size(), schemes.size());
- QList<QVariant> newScheme = defaultScheme;
- newScheme[0] = QVariant(tr("new"));
-
- schemes.insert(row, newScheme);
+ if (row == -1)
+ {
+ QList<QVariant> newScheme = defaultScheme;
+ newScheme[0] = QVariant(tr("new"));
+ schemes.insert(schemes.size(), newScheme);
+ }
+ else
+ {
+ QList<QVariant> newScheme = schemes[row];
+ newScheme[0] = QVariant(tr("copy of") + " " + newScheme[0].toString());
+ schemes.insert(schemes.size(), newScheme);
+ }
endInsertRows();
@@ -684,6 +700,10 @@
QVariant NetAmmoSchemeModel::headerData(int section, Qt::Orientation orientation, int role) const
{
+ Q_UNUSED(section);
+ Q_UNUSED(orientation);
+ Q_UNUSED(role);
+
return QVariant();
}
--- a/QTfrontend/bgwidget.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/bgwidget.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -103,6 +103,8 @@
void BGWidget::paintEvent(QPaintEvent *event)
{
+ Q_UNUSED(event);
+
QPainter p;
p.begin(this);
//p.setRenderHint(QPainter::Antialiasing);
--- a/QTfrontend/chatwidget.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/chatwidget.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -341,6 +341,8 @@
void HWChatWidget::chatNickSelected(int index)
{
+ Q_UNUSED(index);
+
QListWidgetItem* item = chatNicks->currentItem();
if (!item)
return;
--- a/QTfrontend/drawmapscene.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/drawmapscene.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -57,6 +57,8 @@
void DrawMapScene::mouseReleaseEvent(QGraphicsSceneMouseEvent * mouseEvent)
{
+ Q_UNUSED(mouseEvent);
+
simplifyLast();
m_currPath = 0;
@@ -73,6 +75,14 @@
}
}
+void DrawMapScene::clearMap()
+{
+ clear();
+ paths.clear();
+
+ emit pathChanged();
+}
+
QByteArray DrawMapScene::encode()
{
QByteArray b;
@@ -128,11 +138,15 @@
points.append(QPoint(px, py));
}
+
+ emit pathChanged();
}
void DrawMapScene::simplifyLast()
{
- QList<QPoint> points = paths[0];
+ if(!paths.size()) return;
+
+ QList<QPoint> points = paths.at(0);
QPoint prevPoint = points.first();
int i = 1;
--- a/QTfrontend/drawmapscene.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/drawmapscene.h Thu Dec 23 11:13:57 2010 -0500
@@ -22,6 +22,7 @@
public slots:
void undo();
+ void clearMap();
void simplifyLast();
private:
--- a/QTfrontend/drawmapwidget.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/drawmapwidget.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -1,3 +1,6 @@
+#include <QFile>
+#include <QMessageBox>
+
#include "drawmapwidget.h"
DrawMapWidget::DrawMapWidget(QWidget *parent) :
@@ -5,6 +8,8 @@
ui(new Ui::DrawMapWidget)
{
ui->setupUi(this);
+
+ m_scene = 0;
}
DrawMapWidget::~DrawMapWidget()
@@ -27,6 +32,7 @@
void DrawMapWidget::setScene(DrawMapScene * scene)
{
ui->graphicsView->setScene(scene);
+ m_scene = scene;
}
void DrawMapWidget::resizeEvent(QResizeEvent * event)
@@ -36,3 +42,46 @@
if(ui->graphicsView && ui->graphicsView->scene())
ui->graphicsView->fitInView(ui->graphicsView->scene()->sceneRect(), Qt::KeepAspectRatio);
}
+
+void DrawMapWidget::showEvent(QShowEvent * event)
+{
+ Q_UNUSED(event);
+
+ resizeEvent(0);
+}
+
+void DrawMapWidget::undo()
+{
+ if(m_scene) m_scene->undo();
+}
+
+void DrawMapWidget::clear()
+{
+ if(m_scene) m_scene->clearMap();
+}
+
+void DrawMapWidget::save(const QString & fileName)
+{
+ if(m_scene)
+ {
+ QFile file(fileName);
+
+ if(!file.open(QIODevice::WriteOnly))
+ QMessageBox::warning(this, tr("File error"), tr("Cannot open file '%1' for writing").arg(fileName));
+ else
+ file.write(qCompress(m_scene->encode()).toBase64());
+ }
+}
+
+void DrawMapWidget::load(const QString & fileName)
+{
+ if(m_scene)
+ {
+ QFile f(fileName);
+
+ if(!f.open(QIODevice::ReadOnly))
+ QMessageBox::warning(this, tr("File error"), tr("Cannot read file '%1'").arg(fileName));
+ else
+ m_scene->decode(qUncompress(QByteArray::fromBase64(f.readAll())));
+ }
+}
--- a/QTfrontend/drawmapwidget.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/drawmapwidget.h Thu Dec 23 11:13:57 2010 -0500
@@ -15,7 +15,6 @@
{
public:
QGraphicsView *graphicsView;
- QPushButton *pbUndo;
void setupUi(QWidget *drawMapWidget)
{
@@ -50,12 +49,21 @@
void setScene(DrawMapScene * scene);
+public slots:
+ void undo();
+ void clear();
+ void save(const QString & fileName);
+ void load(const QString & fileName);
+
protected:
void changeEvent(QEvent *e);
virtual void resizeEvent(QResizeEvent * event);
+ virtual void showEvent(QShowEvent * event);
private:
Ui::DrawMapWidget *ui;
+
+ DrawMapScene * m_scene;
};
#endif // DRAWMAPWIDGET_H
--- a/QTfrontend/gamecfgwidget.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/gamecfgwidget.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -32,7 +32,7 @@
#include "ammoSchemeModel.h"
#include "proto.h"
-GameCFGWidget::GameCFGWidget(QWidget* parent, bool externalControl) :
+GameCFGWidget::GameCFGWidget(QWidget* parent) :
QGroupBox(parent), mainLayout(this)
{
mainLayout.setMargin(0);
@@ -43,7 +43,7 @@
IconedGroupBox *GBoxOptions = new IconedGroupBox(this);
GBoxOptions->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
- mainLayout.addWidget(GBoxOptions);
+ mainLayout.addWidget(GBoxOptions, 1, 0);
QGridLayout *GBoxOptionsLayout = new QGridLayout(GBoxOptions);
@@ -58,6 +58,7 @@
for (int i = 0; i < scriptList->size(); ++i) {
QString script = (*scriptList)[i].remove(".lua", Qt::CaseInsensitive);
QList<QVariant> scriptInfo;
+ scriptInfo.push_back(script);
QFile scriptCfgFile(QString("%1/Scripts/Multiplayer/%2.cfg").arg(datadir->absolutePath()).arg(script));
if (scriptCfgFile.exists() && scriptCfgFile.open(QFile::ReadOnly)) {
QString scheme;
@@ -80,7 +81,7 @@
scriptInfo.push_back("locked");
scriptInfo.push_back("locked");
}
- Scripts->addItem(script, scriptInfo);
+ Scripts->addItem(script.replace("_", " "), scriptInfo);
}
connect(Scripts, SIGNAL(currentIndexChanged(int)), this, SLOT(scriptChanged(int)));
@@ -244,6 +245,7 @@
{
case MAPGEN_MAZE:
bcfg << QString("e$maze_size %1").arg(pMapContainer->get_maze_size()).toUtf8();
+ break;
case MAPGEN_DRAWN:
{
@@ -256,6 +258,7 @@
bcfg << tmp;
data.remove(0, 200);
}
+ break;
}
default: ;
}
@@ -271,7 +274,7 @@
if (Scripts->currentIndex() > 0)
{
- bcfg << QString("escript Scripts/Multiplayer/%1.lua").arg(Scripts->currentText()).toUtf8();
+ bcfg << QString("escript Scripts/Multiplayer/%1.lua").arg(Scripts->itemData(Scripts->currentIndex()).toList()[0].toString()).toUtf8();
}
QByteArray result;
@@ -351,6 +354,10 @@
Scripts->setCurrentIndex(Scripts->findText(value));
return;
}
+ if (param == "DRAWNMAP") {
+ pMapContainer->setDrawnMapData(qUncompress(QByteArray::fromBase64(slValue[0].toLatin1())));
+ return;
+ }
}
if (slValue.size() == 2)
@@ -433,7 +440,6 @@
void GameCFGWidget::seedChanged(const QString & value)
{
- qDebug("GameCFGWidget::seedChanged");
emit paramChanged("SEED", QStringList(value));
}
@@ -470,8 +476,8 @@
{
if(index > 0)
{
- QString scheme = Scripts->itemData(Scripts->currentIndex()).toList()[0].toString();
- QString weapons = Scripts->itemData(Scripts->currentIndex()).toList()[1].toString();
+ QString scheme = Scripts->itemData(Scripts->currentIndex()).toList()[1].toString();
+ QString weapons = Scripts->itemData(Scripts->currentIndex()).toList()[2].toString();
if (scheme == "locked")
{
@@ -534,6 +540,5 @@
void GameCFGWidget::onDrawnMapChanged(const QByteArray & data)
{
- qDebug("GameCFGWidget::onDrawnMapChanged");
emit paramChanged("DRAWNMAP", QStringList(qCompress(data, 9).toBase64()));
}
--- a/QTfrontend/gamecfgwidget.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/gamecfgwidget.h Thu Dec 23 11:13:57 2010 -0500
@@ -36,7 +36,7 @@
Q_OBJECT
public:
- GameCFGWidget(QWidget* parent, bool externalControl=false);
+ GameCFGWidget(QWidget* parent);
quint32 getGameFlags() const;
quint32 getInitHealth() const;
QByteArray getFullConfig() const;
--- a/QTfrontend/hats.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/hats.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -77,6 +77,10 @@
QVariant HatsModel::headerData(int section,
Qt::Orientation orientation, int role) const
{
+ Q_UNUSED(section);
+ Q_UNUSED(orientation);
+ Q_UNUSED(role);
+
return QVariant();
}
--- a/QTfrontend/hwconsts.cpp.in Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/hwconsts.cpp.in Thu Dec 23 11:13:57 2010 -0500
@@ -37,10 +37,10 @@
int cMaxTeams = 6;
QString * cDefaultAmmoStore = new QString(
- "93919294221991210322351110012010000002111101010111"
- "04050405416006555465544647765766666661555101011154"
- "00000000000002055000000400070040000000002000000006"
- "13111103121111111231141111111111111112111111011111"
+ "939192942219912103223511100120100000021111010101112"
+ "040504054160065554655446477657666666615551010111541"
+ "000000000000020550000004000700400000000020000000060"
+ "131111031211111112311411111111111111121111110111112"
);
int cAmmoNumber = cDefaultAmmoStore->size() / 4;
@@ -49,40 +49,40 @@
<< qMakePair(QString("Default"), *cDefaultAmmoStore)
<< qMakePair(QString("Crazy"), QString(
// TODO: Remove Piano's unlimited uses!
- "99999999999999999929999999999999992999999999099999"
- "11111101111111111111111111111111111111111111011111"
- "00000000000000000000000000000000000000000000000000"
- "13111103121111111231141111111111111112111101011111"
+ "999999999999999999299999999999999929999999990999999"
+ "111111011111111111111111111111111111111111110111111"
+ "000000000000000000000000000000000000000000000000000"
+ "131111031211111112311411111111111111121111010111111"
))
<< qMakePair(QString("Pro Mode"), QString(
- "90900090000000000000090000000000000000000000000000"
- "00000000000000000000000000000000000000000000000000"
- "00000000000002055000000400070040000000002000000000"
- "11111111111111111111111111111111111111111001011111"
+ "909000900000000000000900000000000000000000000000000"
+ "000000000000000000000000000000000000000000000000000"
+ "000000000000020550000004000700400000000020000000000"
+ "111111111111111111111111111111111111111110010111111"
))
<< qMakePair(QString("Shoppa"), QString(
- "00000099000000000000000000000000000000000000000000"
- "44444100442444022101121212224220000000020004000100"
- "00000000000000000000000000000000000000000000000000"
- "11111111111111111111111111111111111111111011011111"
+ "000000990000000000000000000000000000000000000000000"
+ "444441004424440221011212122242200000000200040001001"
+ "000000000000000000000000000000000000000000000000000"
+ "111111111111111111111111111111111111111110110111111"
))
<< qMakePair(QString("Clean Slate"),QString(
- "10100090000100000110000000000000000000000000000010"
- "04050405416006555465544647765766666661555101011154"
- "00000000000000000000000000000000000000000000000000"
- "13111103121111111231141111111111111112111111011111"
+ "101000900001000001100000000000000000000000000000100"
+ "040504054160065554655446477657666666615551010111541"
+ "000000000000000000000000000000000000000000000000000"
+ "131111031211111112311411111111111111121111110111111"
))
<< qMakePair(QString("Minefield"), QString(
- "00000099000900000003000000000000000000000000000000"
- "00000000000000000000000000000000000000000000000000"
- "00000000000002055000000400070040000000002000000006"
- "11111111111111111111111111111111111111111111011111"
+ "000000990009000000030000000000000000000000000000000"
+ "000000000000000000000000000000000000000000000000000"
+ "000000000000020550000004000700400000000020000000060"
+ "111111111111111111111111111111111111111111110111111"
))
<< qMakePair(QString("Thinking with Portals"), QString(
- "90000090020000000021000000000000001100000900000000"
- "04050405416006555465544647765766666661555101011154"
- "00000000000002055000000400070040000000002000000006"
- "13111103121111111231141111111111111112111111011111"
+ "900000900200000000210000000000000011000009000000000"
+ "040504054160065554655446477657666666615551010111541"
+ "000000000000020550000004000700400000000020000000060"
+ "131111031211111112311411111111111111121111110111111"
));
QColor *colors[] = {
--- a/QTfrontend/hwform.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/hwform.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -86,7 +86,7 @@
ui.setupUi(this);
setMinimumSize(760, 580);
- setFocusPolicy(Qt::StrongFocus);
+ //setFocusPolicy(Qt::StrongFocus);
CustomizePalettes();
ui.pageOptions->CBResolution->addItems(sdli.getResolutions());
@@ -308,11 +308,13 @@
}
}
+/*
void HWForm::keyReleaseEvent(QKeyEvent *event)
{
- if (event->key() == Qt::Key_Escape /*|| event->key() == Qt::Key_Backspace*/ )
+ if (event->key() == Qt::Key_Escape)
this->GoBack();
}
+*/
void HWForm::CustomizePalettes()
{
@@ -436,7 +438,7 @@
if(id == ID_PAGE_DRAWMAP)
{
DrawMapScene * scene;
- if(lastid = ID_PAGE_MULTIPLAYER)
+ if(lastid == ID_PAGE_MULTIPLAYER)
scene = ui.pageMultiplayer->gameCFG->pMapContainer->getDrawMapScene();
else
scene = ui.pageNetGame->pGameCFG->pMapContainer->getDrawMapScene();
@@ -445,7 +447,7 @@
}
if(lastid == ID_PAGE_DRAWMAP)
{
- if(id = ID_PAGE_MULTIPLAYER)
+ if(id == ID_PAGE_MULTIPLAYER)
ui.pageMultiplayer->gameCFG->pMapContainer->mapDrawingFinished();
else
ui.pageNetGame->pGameCFG->pMapContainer->mapDrawingFinished();
@@ -662,6 +664,7 @@
QMessageBox::warning(0, QMessageBox::tr("Schemes"), QMessageBox::tr("Can not delete default scheme '%1'!").arg(ui.pageOptions->SchemesName->currentText()));
} else {
ui.pageScheme->deleteRow();
+ ammoSchemeModel->Save();
}
}
@@ -875,7 +878,6 @@
void HWForm::NetDisconnect()
{
- //qDebug("NetDisconnect");
if(hwnet) {
hwnet->Disconnect();
delete hwnet;
@@ -898,8 +900,9 @@
{
if(pnetserver) return; // we have server - let it care of all things
if (hwnet) {
- hwnet->deleteLater();
+ HWNewNet * tmp = hwnet;
hwnet = 0;
+ tmp->deleteLater();
QMessageBox::warning(this, QMessageBox::tr("Network"),
QMessageBox::tr("Connection to server is lost"));
@@ -1157,6 +1160,8 @@
void HWForm::UpdateCampaignPage(int index)
{
+ Q_UNUSED(index);
+
HWTeam team(ui.pageCampaign->CBTeam->currentText());
ui.pageCampaign->CBSelect->clear();
@@ -1167,7 +1172,7 @@
QStringList entries = tmpdir.entryList(QStringList("*#*.lua"));
//entries.sort();
for(int i = 0; (i < entries.count()) && (i <= team.CampaignProgress); i++)
- ui.pageCampaign->CBSelect->addItem(QString(entries[i]).replace(QRegExp("^(\\d+)#(.+)\\.lua"), QComboBox::tr("Mission") + " \\1: \\2"), QString(entries[i]).replace(QRegExp("^(.*)\\.lua"), "\\1"));
+ ui.pageCampaign->CBSelect->addItem(QString(entries[i]).replace(QRegExp("^(\\d+)#(.+)\\.lua"), QComboBox::tr("Mission") + " \\1: \\2").replace("_", " "), QString(entries[i]).replace(QRegExp("^(.*)\\.lua"), "\\1"));
}
void HWForm::AssociateFiles()
--- a/QTfrontend/hwform.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/hwform.h Thu Dec 23 11:13:57 2010 -0500
@@ -122,7 +122,7 @@
void closeEvent(QCloseEvent *event);
void CustomizePalettes();
void resizeEvent(QResizeEvent * event);
- void keyReleaseEvent(QKeyEvent *event);
+ //void keyReleaseEvent(QKeyEvent *event);
enum PageIDs {
ID_PAGE_SETUP_TEAM = 0,
--- a/QTfrontend/hwmap.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/hwmap.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -27,13 +27,13 @@
{
}
-void HWMap::getImage(std::string seed, int filter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData)
+void HWMap::getImage(const QString & seed, int filter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData)
{
m_seed = seed;
templateFilter = filter;
m_mapgen = mapgen;
m_maze_size = maze_size;
- m_drawMapData = drawMapData;
+ if(mapgen == MAPGEN_DRAWN) m_drawMapData = drawMapData;
Start();
}
@@ -60,14 +60,14 @@
void HWMap::SendToClientFirst()
{
- SendIPC(QString("eseed %1").arg(m_seed.c_str()).toLatin1());
- SendIPC(QString("e$template_filter %1").arg(templateFilter).toLatin1());
- SendIPC(QString("e$mapgen %1").arg(m_mapgen).toLatin1());
+ SendIPC(QString("eseed %1").arg(m_seed).toUtf8());
+ SendIPC(QString("e$template_filter %1").arg(templateFilter).toUtf8());
+ SendIPC(QString("e$mapgen %1").arg(m_mapgen).toUtf8());
switch (m_mapgen)
{
case MAPGEN_MAZE:
- SendIPC(QString("e$maze_size %1").arg(m_maze_size).toLatin1());
+ SendIPC(QString("e$maze_size %1").arg(m_maze_size).toUtf8());
break;
case MAPGEN_DRAWN:
--- a/QTfrontend/hwmap.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/hwmap.h Thu Dec 23 11:13:57 2010 -0500
@@ -25,14 +25,12 @@
#include "tcpBase.h"
-#include <string>
-
enum MapGenerator
{
MAPGEN_REGULAR,
MAPGEN_MAZE,
MAPGEN_DRAWN,
- MAPGEN_LAST
+ MAPGEN_MAP
};
class HWMap : public TCPBase
@@ -42,7 +40,7 @@
public:
HWMap();
virtual ~HWMap();
- void getImage(std::string seed, int templateFilter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData);
+ void getImage(const QString & seed, int templateFilter, MapGenerator mapgen, int maze_size, const QByteArray & drawMapData);
protected:
virtual QStringList setArguments();
@@ -54,7 +52,7 @@
void HHLimitReceived(int hhLimit);
private:
- std::string m_seed;
+ QString m_seed;
int templateFilter;
MapGenerator m_mapgen;
int m_maze_size;
--- a/QTfrontend/igbox.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/igbox.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -24,6 +24,7 @@
#include "igbox.h"
IconedGroupBox::IconedGroupBox(QWidget * parent)
+ : QGroupBox(parent)
{
// Has issues with border-radius on children
// setAttribute(Qt::WA_PaintOnScreen, true);
@@ -56,6 +57,8 @@
void IconedGroupBox::paintEvent(QPaintEvent * event)
{
+ Q_UNUSED(event);
+
QStylePainter painter(this);
QStyleOptionGroupBox option;
--- a/QTfrontend/itemNum.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/itemNum.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -68,6 +68,8 @@
void ItemNum::paintEvent(QPaintEvent* event)
{
+ Q_UNUSED(event);
+
QPainter painter(this);
if (numItems==maxItems+1) {
--- a/QTfrontend/mapContainer.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/mapContainer.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -30,6 +30,7 @@
#include <QVBoxLayout>
#include <QIcon>
#include <QLineEdit>
+#include <QMessageBox>
#include "hwconsts.h"
#include "mapContainer.h"
@@ -39,8 +40,7 @@
QWidget(parent),
mainLayout(this),
pMap(0),
- mapgen(MAPGEN_REGULAR),
- maze_size(0)
+ mapgen(MAPGEN_REGULAR)
{
hhSmall.load(":/res/hh_small.png");
hhLimit = 18;
@@ -51,17 +51,23 @@
QApplication::style()->pixelMetric(QStyle::PM_LayoutRightMargin),
QApplication::style()->pixelMetric(QStyle::PM_LayoutBottomMargin));
- imageButt = new QPushButton(this);
+ QWidget* mapWidget = new QWidget(this);
+ mainLayout.addWidget(mapWidget, 0, 0, Qt::AlignHCenter);
+
+ QGridLayout* mapLayout = new QGridLayout(mapWidget);
+ mapLayout->setMargin(0);
+
+ imageButt = new QPushButton(mapWidget);
imageButt->setObjectName("imageButt");
imageButt->setFixedSize(256 + 6, 128 + 6);
imageButt->setFlat(true);
imageButt->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);//QSizePolicy::Minimum, QSizePolicy::Minimum);
- mainLayout.addWidget(imageButt, 0, 0, 1, 2);
+ mapLayout->addWidget(imageButt, 0, 0, 1, 2);
//connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomSeed()));
//connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomTheme()));
connect(imageButt, SIGNAL(clicked()), this, SLOT(setRandomMap()));
- chooseMap = new QComboBox(this);
+ chooseMap = new QComboBox(mapWidget);
chooseMap->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
chooseMap->addItem(
// FIXME - need real icons. Disabling until then
@@ -135,29 +141,29 @@
chooseMap->insertSeparator(missionindex); // separator between missions and maps
connect(chooseMap, SIGNAL(currentIndexChanged(int)), this, SLOT(mapChanged(int)));
- mainLayout.addWidget(chooseMap, 1, 1);
+ mapLayout->addWidget(chooseMap, 1, 1);
- QLabel * lblMap = new QLabel(tr("Map"), this);
- mainLayout.addWidget(lblMap, 1, 0);
+ QLabel * lblMap = new QLabel(tr("Map"), mapWidget);
+ mapLayout->addWidget(lblMap, 1, 0);
- lblFilter = new QLabel(tr("Filter"), this);
- mainLayout.addWidget(lblFilter, 2, 0);
+ lblFilter = new QLabel(tr("Filter"), mapWidget);
+ mapLayout->addWidget(lblFilter, 2, 0);
- CB_TemplateFilter = new QComboBox(this);
+ CB_TemplateFilter = new QComboBox(mapWidget);
CB_TemplateFilter->addItem(tr("All"), 0);
CB_TemplateFilter->addItem(tr("Small"), 1);
CB_TemplateFilter->addItem(tr("Medium"), 2);
CB_TemplateFilter->addItem(tr("Large"), 3);
CB_TemplateFilter->addItem(tr("Cavern"), 4);
CB_TemplateFilter->addItem(tr("Wacky"), 5);
- mainLayout.addWidget(CB_TemplateFilter, 2, 1);
+ mapLayout->addWidget(CB_TemplateFilter, 2, 1);
connect(CB_TemplateFilter, SIGNAL(currentIndexChanged(int)), this, SLOT(templateFilterChanged(int)));
- maze_size_label = new QLabel(tr("Type"), this);
+ maze_size_label = new QLabel(tr("Type"), mapWidget);
mainLayout.addWidget(maze_size_label, 2, 0);
maze_size_label->hide();
- maze_size_selection = new QComboBox(this);
+ maze_size_selection = new QComboBox(mapWidget);
maze_size_selection->addItem(tr("Small tunnels"), 0);
maze_size_selection->addItem(tr("Medium tunnels"), 1);
maze_size_selection->addItem(tr("Large tunnels"), 2);
@@ -165,23 +171,23 @@
maze_size_selection->addItem(tr("Medium floating islands"), 4);
maze_size_selection->addItem(tr("Large floating islands"), 5);
maze_size_selection->setCurrentIndex(1);
- maze_size = 1;
- mainLayout.addWidget(maze_size_selection, 2, 1);
+
+ mapLayout->addWidget(maze_size_selection, 2, 1);
maze_size_selection->hide();
connect(maze_size_selection, SIGNAL(currentIndexChanged(int)), this, SLOT(setMaze_size(int)));
- gbThemes = new IconedGroupBox(this);
+ gbThemes = new IconedGroupBox(mapWidget);
gbThemes->setTitleTextPadding(60);
gbThemes->setContentTopPadding(6);
gbThemes->setTitle(tr("Themes"));
//gbThemes->setStyleSheet("padding: 0px"); // doesn't work - stylesheet is set with icon
- mainLayout.addWidget(gbThemes, 0, 2, 3, 1);
+ mapLayout->addWidget(gbThemes, 0, 2, 3, 1);
QVBoxLayout * gbTLayout = new QVBoxLayout(gbThemes);
gbTLayout->setContentsMargins(0, 0, 0 ,0);
gbTLayout->setSpacing(0);
- lwThemes = new QListWidget(this);
+ lwThemes = new QListWidget(mapWidget);
lwThemes->setMinimumHeight(30);
lwThemes->setFixedWidth(140);
for (int i = 0; i < Themes->size(); ++i) {
@@ -210,13 +216,26 @@
gbTLayout->addWidget(lwThemes);
lwThemes->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Minimum);
- QLabel* seedLabel = new QLabel(tr("Seed"), this);
- mainLayout.addWidget(seedLabel, 3, 0);
- seedEdit = new QLineEdit(this);
- mainLayout.addWidget(seedEdit, 3, 1, 1, 2);
- connect(seedEdit, SIGNAL(textChanged(const QString&)), this, SLOT(seedEdited(const QString&)));
+ mapLayout->setSizeConstraint(QLayout::SetFixedSize);
+
+ QWidget* seedWidget = new QWidget(this);
+ mainLayout.addWidget(seedWidget, 1, 0);
+
+ QGridLayout* seedLayout = new QGridLayout(seedWidget);
+ seedLayout->setMargin(0);
- mainLayout.setSizeConstraint(QLayout::SetFixedSize);//SetMinimumSize
+ QLabel* seedLabel = new QLabel(tr("Seed"), seedWidget);
+ seedLayout->addWidget(seedLabel, 3, 0);
+ seedEdit = new QLineEdit(seedWidget);
+ seedEdit->setMaxLength(54);
+ connect(seedEdit, SIGNAL(returnPressed()), this, SLOT(seedEdited()));
+ seedLayout->addWidget(seedEdit, 3, 1);
+ seedLayout->setColumnStretch(1, 5);
+ seedSet = new QPushButton(seedWidget);
+ seedSet->setText(QPushButton::tr("Set"));
+ connect(seedSet, SIGNAL(clicked()), this, SLOT(seedEdited()));
+ seedLayout->setColumnStretch(2, 1);
+ seedLayout->addWidget(seedSet, 3, 2);
setRandomSeed();
setRandomTheme();
@@ -239,7 +258,7 @@
p.drawPixmap(QPoint(0, 0), px);
addInfoToPreview(pxres);
- chooseMap->setCurrentIndex(mapgen);
+ //chooseMap->setCurrentIndex(mapgen);
pMap = 0;
}
@@ -253,7 +272,7 @@
switch(index) {
case MAPGEN_REGULAR:
mapgen = MAPGEN_REGULAR;
- changeImage();
+ updatePreview();
gbThemes->show();
lblFilter->show();
CB_TemplateFilter->show();
@@ -265,7 +284,7 @@
break;
case MAPGEN_MAZE:
mapgen = MAPGEN_MAZE;
- changeImage();
+ updatePreview();
gbThemes->show();
lblFilter->hide();
CB_TemplateFilter->hide();
@@ -277,7 +296,7 @@
break;
case MAPGEN_DRAWN:
mapgen = MAPGEN_DRAWN;
- changeImage();
+ updatePreview();
gbThemes->show();
lblFilter->hide();
CB_TemplateFilter->hide();
@@ -288,7 +307,7 @@
emit themeChanged(chooseMap->itemData(index).toList()[1].toString());
break;
default:
- loadMap(index);
+ updatePreview();
gbThemes->hide();
lblFilter->hide();
CB_TemplateFilter->hide();
@@ -298,19 +317,6 @@
}
}
-void HWMapContainer::loadMap(int index)
-{
- QPixmap mapImage;
- if(!mapImage.load(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(index).toList()[0].toString() + "/preview.png")) {
- changeImage();
- chooseMap->setCurrentIndex(0);
- return;
- }
-
- hhLimit = chooseMap->itemData(index).toList()[2].toInt();
- addInfoToPreview(mapImage);
-}
-
// Should this add text to identify map size?
void HWMapContainer::addInfoToPreview(QPixmap image)
{
@@ -331,7 +337,7 @@
imageButt->setIconSize(image.size());
}
-void HWMapContainer::changeImage()
+void HWMapContainer::askForGeneratedPreview()
{
if (pMap)
{
@@ -343,7 +349,12 @@
pMap = new HWMap();
connect(pMap, SIGNAL(ImageReceived(const QImage)), this, SLOT(setImage(const QImage)));
connect(pMap, SIGNAL(HHLimitReceived(int)), this, SLOT(setHHLimit(int)));
- pMap->getImage(m_seed.toStdString(), getTemplateFilter(), mapgen, maze_size, getDrawnMapData());
+ pMap->getImage(m_seed,
+ getTemplateFilter(),
+ get_mapgen(),
+ get_maze_size(),
+ getDrawnMapData()
+ );
}
void HWMapContainer::themeSelected(int currentRow)
@@ -370,7 +381,7 @@
QString HWMapContainer::getCurrentMap() const
{
- if(chooseMap->currentIndex() <= 2) return QString();
+ if(chooseMap->currentIndex() < MAPGEN_MAP) return QString();
return chooseMap->itemData(chooseMap->currentIndex()).toList()[0].toString();
}
@@ -407,6 +418,7 @@
void HWMapContainer::resizeEvent ( QResizeEvent * event )
{
+ Q_UNUSED(event);
//imageButt->setIconSize(imageButt->size());
}
@@ -415,18 +427,12 @@
m_seed = seed;
if (seed != seedEdit->text())
seedEdit->setText(seed);
- if (chooseMap->currentIndex() < MAPGEN_LAST)
- changeImage();
+ if (chooseMap->currentIndex() < MAPGEN_MAP)
+ updatePreview();
}
void HWMapContainer::setMap(const QString & map)
{
- if(map == "+rnd+" || map == "+maze+" || map == "+drawn+")
- {
- changeImage();
- return;
- }
-
int id = 0;
for(int i = 0; i < chooseMap->count(); i++)
if(!chooseMap->itemData(i).isNull() && chooseMap->itemData(i).toList()[0].toString() == map)
@@ -443,7 +449,7 @@
pMap = 0;
}
chooseMap->setCurrentIndex(id);
- loadMap(id);
+ updatePreview();
}
}
@@ -453,7 +459,7 @@
if(items.size())
lwThemes->setCurrentItem(items.at(0));
}
-#include <QMessageBox>
+
void HWMapContainer::setRandomMap()
{
setRandomSeed();
@@ -467,7 +473,7 @@
emit drawMapRequested();
break;
default:
- if(chooseMap->currentIndex() < numMissions + 4)
+ if(chooseMap->currentIndex() <= numMissions + MAPGEN_MAP + 1)
setRandomMission();
else
setRandomStatic();
@@ -477,13 +483,16 @@
void HWMapContainer::setRandomStatic()
{
- chooseMap->setCurrentIndex(4 + numMissions + rand() % (chooseMap->count() - 4 - numMissions));
+ int i = MAPGEN_MAP + 3 + numMissions + rand() % (chooseMap->count() - MAPGEN_MAP - 3 - numMissions);
+ chooseMap->setCurrentIndex(i);
setRandomSeed();
}
void HWMapContainer::setRandomMission()
{
- chooseMap->setCurrentIndex(3 + rand() % numMissions);
+ int i = MAPGEN_MAP + 2 + rand() % numMissions;
+ qDebug() << i << MAPGEN_MAP << numMissions;
+ chooseMap->setCurrentIndex(i);
setRandomSeed();
}
@@ -492,8 +501,8 @@
m_seed = QUuid::createUuid().toString();
seedEdit->setText(m_seed);
emit seedChanged(m_seed);
- if (chooseMap->currentIndex() < MAPGEN_LAST)
- changeImage();
+ if (chooseMap->currentIndex() < MAPGEN_MAP)
+ updatePreview();
}
void HWMapContainer::setRandomTheme()
@@ -511,7 +520,7 @@
void HWMapContainer::templateFilterChanged(int filter)
{
emit newTemplateFilter(filter);
- changeImage();
+ updatePreview();
}
MapGenerator HWMapContainer::get_mapgen(void) const
@@ -521,22 +530,28 @@
int HWMapContainer::get_maze_size(void) const
{
- return maze_size;
+ return maze_size_selection->currentIndex();
}
void HWMapContainer::setMaze_size(int size)
{
- maze_size = size;
maze_size_selection->setCurrentIndex(size);
emit maze_sizeChanged(size);
- changeImage();
+ updatePreview();
}
void HWMapContainer::setMapgen(MapGenerator m)
{
mapgen = m;
+ chooseMap->setCurrentIndex(m);
emit mapgenChanged(m);
- changeImage();
+ updatePreview();
+}
+
+void HWMapContainer::setDrawnMapData(const QByteArray & ar)
+{
+ drawMapScene.decode(ar);
+ updatePreview();
}
QByteArray HWMapContainer::getDrawnMapData()
@@ -544,14 +559,14 @@
return drawMapScene.encode();
}
-void HWMapContainer::seedEdited(const QString & seed)
+void HWMapContainer::seedEdited()
{
- if (seed.isEmpty() || seed.size() > 54)
+ if (seedEdit->text().isEmpty())
seedEdit->setText(m_seed);
else
{
- setSeed(seed);
- emit seedChanged(seed);
+ setSeed(seedEdit->text());
+ emit seedChanged(seedEdit->text());
}
}
@@ -564,5 +579,33 @@
{
emit drawnMapChanged(getDrawnMapData());
- changeImage();
-}
\ No newline at end of file
+ updatePreview();
+}
+
+void HWMapContainer::updatePreview()
+{
+ int curIndex = chooseMap->currentIndex();
+
+ switch(curIndex)
+ {
+ case MAPGEN_REGULAR:
+ askForGeneratedPreview();
+ break;
+ case MAPGEN_MAZE:
+ askForGeneratedPreview();
+ break;
+ case MAPGEN_DRAWN:
+ askForGeneratedPreview();
+ break;
+ default:
+ QPixmap mapImage;
+ qDebug() << "Map data" << curIndex << chooseMap->currentText() << chooseMap->itemData(curIndex);
+ if(!mapImage.load(datadir->absolutePath() + "/Maps/" + chooseMap->itemData(curIndex).toList()[0].toString() + "/preview.png")) {
+ imageButt->setIcon(QIcon());
+ return;
+ }
+
+ hhLimit = chooseMap->itemData(curIndex).toList()[2].toInt();
+ addInfoToPreview(mapImage);
+ }
+}
--- a/QTfrontend/mapContainer.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/mapContainer.h Thu Dec 23 11:13:57 2010 -0500
@@ -55,16 +55,17 @@
bool getCurrentIsMission() const;
QByteArray getDrawnMapData();
DrawMapScene * getDrawMapScene();
+ void mapDrawingFinished();
public slots:
- void changeImage();
- void mapDrawingFinished();
+ void askForGeneratedPreview();
void setSeed(const QString & seed);
void setMap(const QString & map);
void setTheme(const QString & theme);
void setTemplateFilter(int);
void setMapgen(MapGenerator m);
void setMaze_size(int size);
+ void setDrawnMapData(const QByteArray & ar);
signals:
void seedChanged(const QString & seed);
@@ -88,7 +89,7 @@
void themeSelected(int currentRow);
void addInfoToPreview(QPixmap image);
void templateFilterChanged(int filter);
- void seedEdited(const QString & seed);
+ void seedEdited();
protected:
virtual void resizeEvent ( QResizeEvent * event );
@@ -102,6 +103,7 @@
HWMap* pMap;
QString m_seed;
QLineEdit* seedEdit;
+ QPushButton* seedSet;
int hhLimit;
int templateFilter;
QPixmap hhSmall;
@@ -111,10 +113,9 @@
QComboBox *maze_size_selection;
MapGenerator mapgen;
int numMissions;
- int maze_size;
DrawMapScene drawMapScene;
- void loadMap(int index);
+ void updatePreview();
};
#endif // _HWMAP_CONTAINER_INCLUDED
--- a/QTfrontend/netregister.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/netregister.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -21,7 +21,8 @@
HWNetRegisterServer::HWNetRegisterServer(QObject *parent, const QString & descr, quint16 port) :
QObject(parent)
{
-
+ Q_UNUSED(descr);
+ Q_UNUSED(port);
}
void HWNetRegisterServer::unregister()
--- a/QTfrontend/pages.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/pages.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -40,6 +40,7 @@
#include <QDataWidgetMapper>
#include <QTime>
#include <QSlider>
+#include <QFileDialog>
#include "ammoSchemeModel.h"
#include "pages.h"
@@ -563,7 +564,6 @@
SchemeDelete->setIconSize(pmDelete.size());
SchemeDelete->setIcon(pmDelete);
SchemeDelete->setMaximumWidth(pmDelete.width() + 6);
- SchemeDelete->setEnabled(false);
WeaponsLayout->addWidget(SchemeDelete, 1, 4);
QLabel* WeaponLabel = new QLabel(groupWeapons);
@@ -1063,7 +1063,10 @@
tmpdir.setFilter(QDir::Files);
CBSelect->addItems(tmpdir.entryList(QStringList("*.lua")).replaceInStrings(QRegExp("^(.*)\\.lua"), "\\1"));
for(int i = 0; i < CBSelect->count(); i++)
+ {
CBSelect->setItemData(i, CBSelect->itemText(i));
+ CBSelect->setItemText(i, CBSelect->itemText(i).replace("_", " "));
+ }
pageLayout->addWidget(CBSelect, 1, 1);
@@ -1104,23 +1107,25 @@
QGridLayout * pageLayout = new QGridLayout(this);
pWeapons = new SelWeaponWidget(cAmmoNumber, this);
- pageLayout->addWidget(pWeapons, 0, 0, 1, 6);
+ pageLayout->addWidget(pWeapons, 0, 0, 1, 5);
- BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true);
- BtnDefault = addButton(tr("Default"), pageLayout, 1, 2);
- BtnNew = addButton(tr("New"), pageLayout, 1, 3);
- BtnDelete = addButton(tr("Delete"), pageLayout, 1, 4);
- BtnSave = addButton(":/res/Save.png", pageLayout, 1, 5, true);
+ BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, 2, 1, true);
+ BtnDefault = addButton(tr("Default"), pageLayout, 1, 3);
+ BtnNew = addButton(tr("New"), pageLayout, 1, 2);
+ BtnCopy = addButton(tr("Copy"), pageLayout, 2, 2);
+ BtnDelete = addButton(tr("Delete"), pageLayout, 2, 3);
+ BtnSave = addButton(":/res/Save.png", pageLayout, 1, 4, 2, 1, true);
BtnSave->setStyleSheet("QPushButton{margin: 24px 0px 0px 0px;}");
BtnBack->setFixedHeight(BtnSave->height());
BtnBack->setStyleSheet("QPushButton{margin-top: 31px;}");
selectWeaponSet = new QComboBox(this);
- pageLayout->addWidget(selectWeaponSet, 1, 1);
+ pageLayout->addWidget(selectWeaponSet, 1, 1, 2, 1);
connect(BtnDefault, SIGNAL(clicked()), pWeapons, SLOT(setDefault()));
connect(BtnSave, SIGNAL(clicked()), pWeapons, SLOT(save()));
connect(BtnNew, SIGNAL(clicked()), pWeapons, SLOT(newWeaponsName()));
+ connect(BtnCopy, SIGNAL(clicked()), pWeapons, SLOT(copy()));
connect(selectWeaponSet, SIGNAL(currentIndexChanged(const QString&)), pWeapons, SLOT(setWeaponsName(const QString&)));
}
@@ -1502,7 +1507,7 @@
sp.setVerticalPolicy(QSizePolicy::MinimumExpanding);
sp.setHorizontalPolicy(QSizePolicy::Expanding);
- pageLayout->addWidget(gb, 1,0,13,4);
+ pageLayout->addWidget(gb, 1,0,13,5);
gbGameModes = new QGroupBox(QGroupBox::tr("Game Modifiers"), gb);
gbBasicSettings = new QGroupBox(QGroupBox::tr("Basic Settings"), gb);
@@ -1829,12 +1834,14 @@
mapper = new QDataWidgetMapper(this);
BtnBack = addButton(":/res/Exit.png", pageLayout, 15, 0, true);
- BtnNew = addButton(tr("New"), pageLayout, 15, 2);
- BtnDelete = addButton(tr("Delete"), pageLayout, 15, 3);
+ BtnCopy = addButton(tr("Copy"), pageLayout, 15, 2);
+ BtnNew = addButton(tr("New"), pageLayout, 15, 3);
+ BtnDelete = addButton(tr("Delete"), pageLayout, 15, 4);
selectScheme = new QComboBox(this);
pageLayout->addWidget(selectScheme, 15, 1);
+ connect(BtnCopy, SIGNAL(clicked()), this, SLOT(copyRow()));
connect(BtnNew, SIGNAL(clicked()), this, SLOT(newRow()));
connect(BtnDelete, SIGNAL(clicked()), this, SLOT(deleteRow()));
connect(selectScheme, SIGNAL(currentIndexChanged(int)), mapper, SLOT(setCurrentIndex(int)));
@@ -1891,7 +1898,14 @@
void PageScheme::newRow()
{
QAbstractItemModel * model = mapper->model();
- model->insertRow(model->rowCount());
+ model->insertRow(-1);
+ selectScheme->setCurrentIndex(model->rowCount() - 1);
+}
+
+void PageScheme::copyRow()
+{
+ QAbstractItemModel * model = mapper->model();
+ model->insertRow(selectScheme->currentIndex());
selectScheme->setCurrentIndex(model->rowCount() - 1);
}
@@ -2018,8 +2032,34 @@
{
QGridLayout * pageLayout = new QGridLayout(this);
- BtnBack = addButton(":/res/Exit.png", pageLayout, 1, 0, true);
+ QPushButton * pbUndo = addButton(tr("Undo"), pageLayout, 0, 0);
+ QPushButton * pbClear = addButton(tr("Clear"), pageLayout, 1, 0);
+ QPushButton * pbLoad = addButton(tr("Load"), pageLayout, 2, 0);
+ QPushButton * pbSave = addButton(tr("Save"), pageLayout, 3, 0);
+
+ BtnBack = addButton(":/res/Exit.png", pageLayout, 5, 0, true);
drawMapWidget = new DrawMapWidget(this);
- pageLayout->addWidget(drawMapWidget, 0, 0, 1, 2);
+ pageLayout->addWidget(drawMapWidget, 0, 1, 5, 1);
+
+ connect(pbUndo, SIGNAL(clicked()), drawMapWidget, SLOT(undo()));
+ connect(pbClear, SIGNAL(clicked()), drawMapWidget, SLOT(clear()));
+ connect(pbLoad, SIGNAL(clicked()), this, SLOT(load()));
+ connect(pbSave, SIGNAL(clicked()), this, SLOT(save()));
}
+
+void PageDrawMap::load()
+{
+ QString fileName = QFileDialog::getOpenFileName(this, tr("Load drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*.*)"));
+
+ if(!fileName.isEmpty())
+ drawMapWidget->load(fileName);
+}
+
+void PageDrawMap::save()
+{
+ QString fileName = QFileDialog::getSaveFileName(this, tr("Save drawn map"), ".", tr("Drawn Maps (*.hwmap);;All files (*.*)"));
+
+ if(!fileName.isEmpty())
+ drawMapWidget->save(fileName);
+}
--- a/QTfrontend/pages.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/pages.h Thu Dec 23 11:13:57 2010 -0500
@@ -71,8 +71,10 @@
protected:
AbstractPage(QWidget* parent = 0) {
+ Q_UNUSED(parent);
+
font14 = new QFont("MS Shell Dlg", 14);
- setFocusPolicy(Qt::StrongFocus);
+ //setFocusPolicy(Qt::StrongFocus);
}
virtual ~AbstractPage() {};
@@ -393,6 +395,7 @@
QPushButton *BtnDefault;
QPushButton *BtnDelete;
QPushButton *BtnNew;
+ QPushButton *BtnCopy;
QPushButton *BtnBack;
SelWeaponWidget* pWeapons;
QComboBox* selectWeaponSet;
@@ -467,6 +470,7 @@
PageScheme(QWidget* parent = 0);
QPushButton * BtnBack;
+ QPushButton * BtnCopy;
QPushButton * BtnNew;
QPushButton * BtnDelete;
QPushButton * BtnSave;
@@ -476,6 +480,7 @@
public slots:
void newRow();
+ void copyRow();
void deleteRow();
private:
@@ -585,6 +590,10 @@
QPushButton * BtnBack;
DrawMapWidget * drawMapWidget;
+
+private slots:
+ void load();
+ void save();
};
#endif // PAGES_H
Binary file QTfrontend/res/btnMoreWind.png has changed
Binary file QTfrontend/res/btnNoWind.png has changed
--- a/QTfrontend/selectWeapon.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/selectWeapon.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -269,3 +269,10 @@
{
return wconf->allKeys();
}
+
+void SelWeaponWidget::copy()
+{
+ QString ammo = getWeaponsString(curWeaponsName);
+ setWeaponsName(tr("copy of") + " " + curWeaponsName);
+ setWeapons(ammo);
+}
--- a/QTfrontend/selectWeapon.h Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/selectWeapon.h Thu Dec 23 11:13:57 2010 -0500
@@ -59,6 +59,7 @@
void deleteWeaponsName();
void newWeaponsName();
void save();
+ void copy();
signals:
void weaponsChanged();
--- a/QTfrontend/statsPage.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/statsPage.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -31,6 +31,8 @@
void FitGraphicsView::resizeEvent(QResizeEvent * event)
{
+ Q_UNUSED(event);
+
fitInView(sceneRect());
}
--- a/QTfrontend/togglebutton.cpp Tue Dec 14 22:32:47 2010 +0100
+++ b/QTfrontend/togglebutton.cpp Thu Dec 23 11:13:57 2010 -0500
@@ -19,6 +19,7 @@
#include "togglebutton.h"
ToggleButtonWidget::ToggleButtonWidget(QWidget * parent, QString img)
+ : QPushButton(parent)
{
setCheckable(true);
--- a/gameServer/Actions.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/Actions.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,134 +1,171 @@
-{-# LANGUAGE OverloadedStrings #-}
module Actions where
-import Control.Concurrent
+import Control.Concurrent.STM
import Control.Concurrent.Chan
+import Data.IntMap
import qualified Data.IntSet as IntSet
-import qualified Data.Set as Set
import qualified Data.Sequence as Seq
import System.Log.Logger
import Control.Monad
import Data.Time
import Data.Maybe
-import Control.Monad.Reader
-import Control.Monad.State.Strict
-import qualified Data.ByteString.Char8 as B
-----------------------------
import CoreTypes
import Utils
-import ClientIO
-import ServerState
data Action =
- AnswerClients ![ClientChan] ![B.ByteString]
+ AnswerThisClient [String]
+ | AnswerAll [String]
+ | AnswerAllOthers [String]
+ | AnswerThisRoom [String]
+ | AnswerOthersInRoom [String]
+ | AnswerSameClan [String]
+ | AnswerLobby [String]
| SendServerMessage
| SendServerVars
- | MoveToRoom RoomIndex
- | MoveToLobby B.ByteString
- | RemoveTeam B.ByteString
+ | RoomAddThisClient Int -- roomID
+ | RoomRemoveThisClient String
+ | RemoveTeam String
| RemoveRoom
| UnreadyRoomClients
- | JoinLobby
- | ProtocolError B.ByteString
- | Warning B.ByteString
- | ByeClient B.ByteString
- | KickClient ClientIndex
- | KickRoomClient ClientIndex
- | BanClient B.ByteString -- nick
- | RemoveClientTeams ClientIndex
+ | MoveToLobby
+ | ProtocolError String
+ | Warning String
+ | ByeClient String
+ | KickClient Int -- clID
+ | KickRoomClient Int -- clID
+ | BanClient String -- nick
+ | RemoveClientTeams Int -- clID
| ModifyClient (ClientInfo -> ClientInfo)
- | ModifyClient2 ClientIndex (ClientInfo -> ClientInfo)
+ | ModifyClient2 Int (ClientInfo -> ClientInfo)
| ModifyRoom (RoomInfo -> RoomInfo)
| ModifyServerInfo (ServerInfo -> ServerInfo)
- | AddRoom B.ByteString B.ByteString
+ | AddRoom String String
| CheckRegistered
| ClearAccountsCache
| ProcessAccountInfo AccountInfo
| Dump
| AddClient ClientInfo
- | DeleteClient ClientIndex
| PingAll
| StatsAction
-type CmdHandler = [B.ByteString] -> Reader (ClientIndex, IRnC) [Action]
+type CmdHandler = Int -> Clients -> Rooms -> [String] -> [Action]
+
+replaceID a (b, c, d, e) = (a, c, d, e)
+
+processAction :: (Int, ServerInfo, Clients, Rooms) -> Action -> IO (Int, ServerInfo, Clients, Rooms)
+
+
+processAction (clID, serverInfo, clients, rooms) (AnswerThisClient msg) = do
+ writeChan (sendChan $ clients ! clID) msg
+ return (clID, serverInfo, clients, rooms)
-processAction :: Action -> StateT ServerState IO ()
+processAction (clID, serverInfo, clients, rooms) (AnswerAll msg) = do
+ mapM_ (\cl -> writeChan (sendChan cl) msg) (elems clients)
+ return (clID, serverInfo, clients, rooms)
+
+
+processAction (clID, serverInfo, clients, rooms) (AnswerAllOthers msg) = do
+ mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) $
+ Prelude.filter (\id' -> (id' /= clID) && logonPassed (clients ! id')) (keys clients)
+ return (clID, serverInfo, clients, rooms)
+
+
+processAction (clID, serverInfo, clients, rooms) (AnswerThisRoom msg) = do
+ mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) roomClients
+ return (clID, serverInfo, clients, rooms)
+ where
+ roomClients = IntSet.elems $ playersIDs room
+ room = rooms ! rID
+ rID = roomID client
+ client = clients ! clID
-processAction (AnswerClients chans msg) = do
- liftIO $ map (flip seq ()) chans `seq` map (flip seq ()) msg `seq` mapM_ (flip writeChan msg) chans
+processAction (clID, serverInfo, clients, rooms) (AnswerOthersInRoom msg) = do
+ mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) $ Prelude.filter (/= clID) roomClients
+ return (clID, serverInfo, clients, rooms)
+ where
+ roomClients = IntSet.elems $ playersIDs room
+ room = rooms ! rID
+ rID = roomID client
+ client = clients ! clID
+
+
+processAction (clID, serverInfo, clients, rooms) (AnswerLobby msg) = do
+ mapM_ (\id' -> writeChan (sendChan $ clients ! id') msg) roomClients
+ return (clID, serverInfo, clients, rooms)
+ where
+ roomClients = IntSet.elems $ playersIDs room
+ room = rooms ! 0
-processAction SendServerMessage = do
- chan <- client's sendChan
- protonum <- client's clientProto
- si <- liftM serverInfo get
- let message = if protonum < latestReleaseVersion si then
+processAction (clID, serverInfo, clients, rooms) (AnswerSameClan msg) = do
+ mapM_ (\cl -> writeChan (sendChan cl) msg) sameClanOrSpec
+ return (clID, serverInfo, clients, rooms)
+ where
+ otherRoomClients = Prelude.map ((!) clients) $ IntSet.elems $ clID `IntSet.delete` (playersIDs room)
+ sameClanOrSpec = if teamsInGame client > 0 then sameClanClients else spectators
+ spectators = Prelude.filter (\cl -> teamsInGame cl == 0) otherRoomClients
+ sameClanClients = Prelude.filter (\cl -> teamsInGame cl > 0 && clientClan cl == thisClan) otherRoomClients
+ thisClan = clientClan client
+ room = rooms ! rID
+ rID = roomID client
+ client = clients ! clID
+
+
+processAction (clID, serverInfo, clients, rooms) SendServerMessage = do
+ writeChan (sendChan $ clients ! clID) ["SERVER_MESSAGE", message serverInfo]
+ return (clID, serverInfo, clients, rooms)
+ where
+ client = clients ! clID
+ message si = if clientProto client < latestReleaseVersion si then
serverMessageForOldVersions si
else
serverMessage si
- processAction $ AnswerClients [chan] ["SERVER_MESSAGE", message]
-{-
-processAction (clID, serverInfo, rnc) SendServerVars = do
+processAction (clID, serverInfo, clients, rooms) SendServerVars = do
writeChan (sendChan $ clients ! clID) ("SERVER_VARS" : vars)
- return (clID, serverInfo, rnc)
+ return (clID, serverInfo, clients, rooms)
where
client = clients ! clID
vars = [
- "MOTD_NEW", serverMessage serverInfo,
- "MOTD_OLD", serverMessageForOldVersions serverInfo,
+ "MOTD_NEW", serverMessage serverInfo,
+ "MOTD_OLD", serverMessageForOldVersions serverInfo,
"LATEST_PROTO", show $ latestReleaseVersion serverInfo
]
--}
+processAction (clID, serverInfo, clients, rooms) (ProtocolError msg) = do
+ writeChan (sendChan $ clients ! clID) ["ERROR", msg]
+ return (clID, serverInfo, clients, rooms)
-processAction (ProtocolError msg) = do
- chan <- client's sendChan
- processAction $ AnswerClients [chan] ["ERROR", msg]
+
+processAction (clID, serverInfo, clients, rooms) (Warning msg) = do
+ writeChan (sendChan $ clients ! clID) ["WARNING", msg]
+ return (clID, serverInfo, clients, rooms)
-processAction (Warning msg) = do
- chan <- client's sendChan
- processAction $ AnswerClients [chan] ["WARNING", msg]
-
-processAction (ByeClient msg) = do
- (Just ci) <- gets clientIndex
- rnc <- gets roomsClients
- ri <- clientRoomA
-
- chan <- client's sendChan
- ready <- client's isReady
+processAction (clID, serverInfo, clients, rooms) (ByeClient msg) = do
+ infoM "Clients" (show (clientUID client) ++ " quits: " ++ msg)
+ (_, _, newClients, newRooms) <-
+ if roomID client /= 0 then
+ processAction (clID, serverInfo, clients, rooms) $ RoomRemoveThisClient "quit"
+ else
+ return (clID, serverInfo, clients, rooms)
- when (ri /= lobbyId) $ do
- processAction $ MoveToLobby ("quit: " `B.append` msg)
- liftIO $ modifyRoom rnc (\r -> r{
- --playersIDs = IntSet.delete ci (playersIDs r)
- playersIn = (playersIn r) - 1,
- readyPlayers = if ready then readyPlayers r - 1 else readyPlayers r
- }) ri
- return ()
-
- liftIO $ do
- infoM "Clients" (show ci ++ " quits: " ++ (B.unpack msg))
-
- --mapM_ (processAction (ci, serverInfo, rnc)) $ answerOthersQuit ++ answerInformRoom
-
- processAction $ AnswerClients [chan] ["BYE", msg]
-
- s <- get
- put $! s{removedClients = ci `Set.insert` removedClients s}
-
-processAction (DeleteClient ci) = do
- rnc <- gets roomsClients
- liftIO $ removeClient rnc ci
-
- s <- get
- put $! s{removedClients = ci `Set.delete` removedClients s}
-
-{-
+ mapM_ (processAction (clID, serverInfo, newClients, newRooms)) $ answerOthersQuit ++ answerInformRoom
+ writeChan (sendChan $ clients ! clID) ["BYE", msg]
+ return (
+ 0,
+ serverInfo,
+ delete clID newClients,
+ adjust (\r -> r{
+ playersIDs = IntSet.delete clID (playersIDs r),
+ playersIn = (playersIn r) - 1,
+ readyPlayers = if isReady client then readyPlayers r - 1 else readyPlayers r
+ }) (roomID $ newClients ! clID) newRooms
+ )
where
client = clients ! clID
clientNick = nick client
@@ -147,57 +184,46 @@
else
[AnswerAll ["LOBBY:LEFT", clientNick]]
else
- []
--}
+ []
+
+
+processAction (clID, serverInfo, clients, rooms) (ModifyClient func) =
+ return (clID, serverInfo, adjust func clID clients, rooms)
+
-processAction (ModifyClient f) = do
- (Just ci) <- gets clientIndex
- rnc <- gets roomsClients
- liftIO $ modifyClient rnc f ci
- return ()
+processAction (clID, serverInfo, clients, rooms) (ModifyClient2 cl2ID func) =
+ return (clID, serverInfo, adjust func cl2ID clients, rooms)
+
-processAction (ModifyClient2 ci f) = do
- rnc <- gets roomsClients
- liftIO $ modifyClient rnc f ci
- return ()
+processAction (clID, serverInfo, clients, rooms) (ModifyRoom func) =
+ return (clID, serverInfo, clients, adjust func rID rooms)
+ where
+ rID = roomID $ clients ! clID
-processAction (ModifyRoom f) = do
- rnc <- gets roomsClients
- ri <- clientRoomA
- liftIO $ modifyRoom rnc f ri
- return ()
+processAction (clID, serverInfo, clients, rooms) (ModifyServerInfo func) =
+ return (clID, func serverInfo, clients, rooms)
-{-
-
-processAction (clID, serverInfo, rnc) (ModifyServerInfo func) =
- return (clID, func serverInfo, rnc)
-
--}
-processAction (MoveToRoom ri) = do
- (Just ci) <- gets clientIndex
- rnc <- gets roomsClients
- liftIO $ do
- modifyClient rnc (\cl -> cl{teamsInGame = 0}) ci
- modifyRoom rnc (\r -> r{playersIn = (playersIn r) + 1}) ri
-
- liftIO $ moveClientToRoom rnc ri ci
-
- chans <- liftM (map sendChan) $ roomClientsS ri
- clNick <- client's nick
+processAction (clID, serverInfo, clients, rooms) (RoomAddThisClient rID) =
+ processAction (
+ clID,
+ serverInfo,
+ adjust (\cl -> cl{roomID = rID, teamsInGame = if rID == 0 then teamsInGame cl else 0}) clID clients,
+ adjust (\r -> r{playersIDs = IntSet.insert clID (playersIDs r), playersIn = (playersIn r) + 1}) rID $
+ adjust (\r -> r{playersIDs = IntSet.delete clID (playersIDs r)}) 0 rooms
+ ) joinMsg
+ where
+ client = clients ! clID
+ joinMsg = if rID == 0 then
+ AnswerAllOthers ["LOBBY:JOINED", nick client]
+ else
+ AnswerThisRoom ["JOINED", nick client]
- processAction $ AnswerClients chans ["JOINED", clNick]
-processAction (MoveToLobby msg) = do
- (Just ci) <- gets clientIndex
- --ri <- clientRoomA
- rnc <- gets roomsClients
-
- liftIO $ moveClientToLobby rnc ci
-
-{-
+processAction (clID, serverInfo, clients, rooms) (RoomRemoveThisClient msg) = do
(_, _, newClients, newRooms) <-
+ if roomID client /= 0 then
if isMaster client then
if (gameinprogress room) && (playersIn room > 1) then
(changeMaster >>= (\state -> foldM processAction state
@@ -205,15 +231,16 @@
AnswerOthersInRoom ["WARNING", "Admin left the room"],
RemoveClientTeams clID]))
else -- not in game
- processAction (clID, serverInfo, rnc) RemoveRoom
+ processAction (clID, serverInfo, clients, rooms) RemoveRoom
else -- not master
foldM
processAction
- (clID, serverInfo, rnc)
+ (clID, serverInfo, clients, rooms)
[AnswerOthersInRoom ["LEFT", nick client, msg],
RemoveClientTeams clID]
-
-
+ else -- in lobby
+ return (clID, serverInfo, clients, rooms)
+
return (
clID,
serverInfo,
@@ -232,7 +259,7 @@
}
insertClientToRoom r = r{playersIDs = IntSet.insert clID (playersIDs r)}
changeMaster = do
- processAction (newMasterId, serverInfo, rnc) $ AnswerThisClient ["ROOM_CONTROL_ACCESS", "1"]
+ processAction (newMasterId, serverInfo, clients, rooms) $ AnswerThisClient ["ROOM_CONTROL_ACCESS", "1"]
return (
clID,
serverInfo,
@@ -243,35 +270,34 @@
otherPlayersSet = IntSet.delete clID (playersIDs room)
newMasterId = IntSet.findMin otherPlayersSet
newMasterClient = clients ! newMasterId
--}
+
-processAction (AddRoom roomName roomPassword) = do
- Just clId <- gets clientIndex
- rnc <- gets roomsClients
- proto <- liftIO $ client'sM rnc clientProto clId
-
+processAction (clID, serverInfo, clients, rooms) (AddRoom roomName roomPassword) = do
+ let newServerInfo = serverInfo {nextRoomID = newID}
let room = newRoom{
- masterID = clId,
+ roomUID = newID,
+ masterID = clID,
name = roomName,
password = roomPassword,
- roomProto = proto
+ roomProto = (clientProto client)
}
- rId <- liftIO $ addRoom rnc room
-
- processAction $ MoveToRoom rId
-
- chans <- liftM (map sendChan) $! roomClientsS lobbyId
+ processAction (clID, serverInfo, clients, rooms) $ AnswerLobby ["ROOM", "ADD", roomName]
- mapM_ processAction [
- AnswerClients chans ["ROOM", "ADD", roomName]
- , ModifyClient (\cl -> cl{isMaster = True})
- ]
+ processAction (
+ clID,
+ newServerInfo,
+ adjust (\cl -> cl{isMaster = True}) clID clients,
+ insert newID room rooms
+ ) $ RoomAddThisClient newID
+ where
+ newID = (nextRoomID serverInfo) - 1
+ client = clients ! clID
-{-
-processAction (clID, serverInfo, rnc) (RemoveRoom) = do
- processAction (clID, serverInfo, rnc) $ AnswerLobby ["ROOM", "DEL", name room]
- processAction (clID, serverInfo, rnc) $ AnswerOthersInRoom ["ROOMABANDONED", name room]
+
+processAction (clID, serverInfo, clients, rooms) (RemoveRoom) = do
+ processAction (clID, serverInfo, clients, rooms) $ AnswerLobby ["ROOM", "DEL", name room]
+ processAction (clID, serverInfo, clients, rooms) $ AnswerOthersInRoom ["ROOMABANDONED", name room]
return (clID,
serverInfo,
Data.IntMap.map (\cl -> if roomID cl == rID then cl{roomID = 0, isMaster = False, isReady = False, teamsInGame = undefined} else cl) clients,
@@ -282,163 +308,139 @@
rID = roomID client
client = clients ! clID
--}
-processAction (UnreadyRoomClients) = do
- rnc <- gets roomsClients
- ri <- clientRoomA
- roomPlayers <- roomClientsS ri
- roomClIDs <- liftIO $ roomClientsIndicesM rnc ri
- processAction $ AnswerClients (map sendChan roomPlayers) ("NOT_READY" : map nick roomPlayers)
- liftIO $ mapM_ (modifyClient rnc (\cl -> cl{isReady = False})) roomClIDs
- processAction $ ModifyRoom (\r -> r{readyPlayers = 0})
+
+processAction (clID, serverInfo, clients, rooms) (UnreadyRoomClients) = do
+ processAction (clID, serverInfo, clients, rooms) $ AnswerThisRoom ("NOT_READY" : roomPlayers)
+ return (clID,
+ serverInfo,
+ Data.IntMap.map (\cl -> if roomID cl == rID then cl{isReady = False} else cl) clients,
+ adjust (\r -> r{readyPlayers = 0}) rID rooms)
+ where
+ room = rooms ! rID
+ rID = roomID client
+ client = clients ! clID
+ roomPlayers = Prelude.map (nick . (clients !)) roomPlayersIDs
+ roomPlayersIDs = IntSet.elems $ playersIDs room
-processAction (RemoveTeam teamName) = do
- rnc <- gets roomsClients
- cl <- client's id
- ri <- clientRoomA
- inGame <- liftIO $ room'sM rnc gameinprogress ri
- chans <- liftM (map sendChan . filter (/= cl)) $ roomClientsS ri
- if inGame then
- mapM_ processAction [
- AnswerClients chans ["REMOVE_TEAM", teamName],
- ModifyRoom (\r -> r{teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r})
- ]
+processAction (clID, serverInfo, clients, rooms) (RemoveTeam teamName) = do
+ newRooms <- if not $ gameinprogress room then
+ do
+ processAction (clID, serverInfo, clients, rooms) $ AnswerOthersInRoom ["REMOVE_TEAM", teamName]
+ return $
+ adjust (\r -> r{teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r}) rID rooms
else
- mapM_ processAction [
- AnswerClients chans ["EM", rmTeamMsg],
- ModifyRoom (\r -> r{
- teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r,
- leftTeams = teamName : leftTeams r,
- roundMsgs = roundMsgs r Seq.|> rmTeamMsg
- })
- ]
+ do
+ processAction (clID, serverInfo, clients, rooms) $ AnswerOthersInRoom ["EM", rmTeamMsg]
+ return $
+ adjust (\r -> r{
+ teams = Prelude.filter (\t -> teamName /= teamname t) $ teams r,
+ leftTeams = teamName : leftTeams r,
+ roundMsgs = roundMsgs r Seq.|> rmTeamMsg
+ }) rID rooms
+ return (clID, serverInfo, clients, newRooms)
where
- rmTeamMsg = toEngineMsg $ (B.singleton 'F') `B.append` teamName
+ room = rooms ! rID
+ rID = roomID client
+ client = clients ! clID
+ rmTeamMsg = toEngineMsg $ 'F' : teamName
-processAction CheckRegistered = do
- (Just ci) <- gets clientIndex
- n <- client's nick
- h <- client's host
- db <- gets (dbQueries . serverInfo)
- liftIO $ writeChan db $ CheckAccount ci n h
- return ()
-{-
-processAction (clID, serverInfo, rnc) (ClearAccountsCache) = do
- writeChan (dbQueries serverInfo) ClearCache
- return (clID, serverInfo, rnc)
+processAction (clID, serverInfo, clients, rooms) (CheckRegistered) = do
+ writeChan (dbQueries serverInfo) $ CheckAccount (clientUID client) (nick client) (host client)
+ return (clID, serverInfo, clients, rooms)
where
client = clients ! clID
-processAction (clID, serverInfo, rnc) (Dump) = do
+processAction (clID, serverInfo, clients, rooms) (ClearAccountsCache) = do
+ writeChan (dbQueries serverInfo) ClearCache
+ return (clID, serverInfo, clients, rooms)
+ where
+ client = clients ! clID
+
+
+processAction (clID, serverInfo, clients, rooms) (Dump) = do
writeChan (sendChan $ clients ! clID) ["DUMP", show serverInfo, showTree clients, showTree rooms]
- return (clID, serverInfo, rnc)
--}
+ return (clID, serverInfo, clients, rooms)
-processAction (ProcessAccountInfo info) =
+
+processAction (clID, serverInfo, clients, rooms) (ProcessAccountInfo info) =
case info of
HasAccount passwd isAdmin -> do
- chan <- client's sendChan
- processAction $ AnswerClients [chan] ["ASKPASSWORD"]
+ infoM "Clients" $ show clID ++ " has account"
+ writeChan (sendChan $ clients ! clID) ["ASKPASSWORD"]
+ return (clID, serverInfo, adjust (\cl -> cl{webPassword = passwd, isAdministrator = isAdmin}) clID clients, rooms)
Guest -> do
- processAction JoinLobby
+ infoM "Clients" $ show clID ++ " is guest"
+ processAction (clID, serverInfo, adjust (\cl -> cl{logonPassed = True}) clID clients, rooms) MoveToLobby
Admin -> do
- mapM processAction [ModifyClient (\cl -> cl{isAdministrator = True}), JoinLobby]
- chan <- client's sendChan
- processAction $ AnswerClients [chan] ["ADMIN_ACCESS"]
+ infoM "Clients" $ show clID ++ " is admin"
+ foldM processAction (clID, serverInfo, adjust (\cl -> cl{logonPassed = True, isAdministrator = True}) clID clients, rooms) [MoveToLobby, AnswerThisClient ["ADMIN_ACCESS"]]
-processAction JoinLobby = do
- chan <- client's sendChan
- clientNick <- client's nick
- (lobbyNicks, clientsChans) <- liftM (unzip . Prelude.map (\c -> (nick c, sendChan c)) . Prelude.filter logonPassed) $! allClientsS
- mapM_ processAction $
- (AnswerClients clientsChans ["LOBBY:JOINED", clientNick])
- : [AnswerClients [chan] ("LOBBY:JOINED" : clientNick : lobbyNicks)]
- ++ [ModifyClient (\cl -> cl{logonPassed = True}), SendServerMessage]
+processAction (clID, serverInfo, clients, rooms) (MoveToLobby) =
+ foldM processAction (clID, serverInfo, clients, rooms) $
+ (RoomAddThisClient 0)
+ : answerLobbyNicks
+ ++ [SendServerMessage]
-{-
-processAction (clID, serverInfo, rnc) (RoomAddThisClient rID) =
- processAction (
- clID,
- serverInfo,
- adjust (\cl -> cl{roomID = rID, teamsInGame = if rID == 0 then teamsInGame cl else 0}) clID clients,
- adjust (\r -> r{playersIDs = IntSet.insert clID (playersIDs r), playersIn = (playersIn r) + 1}) rID $
- adjust (\r -> r{playersIDs = IntSet.delete clID (playersIDs r)}) 0 rooms
- ) joinMsg
+ -- ++ (answerServerMessage client clients)
where
- client = clients ! clID
- joinMsg = if rID == 0 then
- AnswerAllOthers ["LOBBY:JOINED", nick client]
- else
- AnswerThisRoom ["JOINED", nick client]
-
-processAction (clID, serverInfo, rnc) (KickClient kickID) =
- liftM2 replaceID (return clID) (processAction (kickID, serverInfo, rnc) $ ByeClient "Kicked")
+ lobbyNicks = Prelude.map nick $ Prelude.filter logonPassed $ elems clients
+ answerLobbyNicks = [AnswerThisClient ("LOBBY:JOINED": lobbyNicks) | not $ Prelude.null lobbyNicks]
-processAction (clID, serverInfo, rnc) (BanClient banNick) =
- return (clID, serverInfo, rnc)
+processAction (clID, serverInfo, clients, rooms) (KickClient kickID) =
+ liftM2 replaceID (return clID) (processAction (kickID, serverInfo, clients, rooms) $ ByeClient "Kicked")
+
+
+processAction (clID, serverInfo, clients, rooms) (BanClient banNick) =
+ return (clID, serverInfo, clients, rooms)
-processAction (clID, serverInfo, rnc) (KickRoomClient kickID) = do
+processAction (clID, serverInfo, clients, rooms) (KickRoomClient kickID) = do
writeChan (sendChan $ clients ! kickID) ["KICKED"]
- liftM2 replaceID (return clID) (processAction (kickID, serverInfo, rnc) $ RoomRemoveThisClient "kicked")
+ liftM2 replaceID (return clID) (processAction (kickID, serverInfo, clients, rooms) $ RoomRemoveThisClient "kicked")
-processAction (clID, serverInfo, rnc) (RemoveClientTeams teamsClID) =
+processAction (clID, serverInfo, clients, rooms) (RemoveClientTeams teamsClID) =
liftM2 replaceID (return clID) $
- foldM processAction (teamsClID, serverInfo, rnc) removeTeamsActions
+ foldM processAction (teamsClID, serverInfo, clients, rooms) removeTeamsActions
where
client = clients ! teamsClID
room = rooms ! (roomID client)
teamsToRemove = Prelude.filter (\t -> teamowner t == nick client) $ teams room
removeTeamsActions = Prelude.map (RemoveTeam . teamname) teamsToRemove
--}
+
-processAction (AddClient client) = do
- rnc <- gets roomsClients
- si <- gets serverInfo
- liftIO $ do
- ci <- addClient rnc client
- forkIO $ clientRecvLoop (clientSocket client) (coreChan si) ci
- forkIO $ clientSendLoop (clientSocket client) (sendChan client) ci
+processAction (clID, serverInfo, clients, rooms) (AddClient client) = do
+ let updatedClients = insert (clientUID client) client clients
+ infoM "Clients" (show (clientUID client) ++ ": New client. Time: " ++ show (connectTime client))
+ writeChan (sendChan client) ["CONNECTED", "Hedgewars server http://www.hedgewars.org/"]
- infoM "Clients" (show ci ++ ": New client. Time: " ++ show (connectTime client))
-
- processAction $ AnswerClients [sendChan client] ["CONNECTED", "Hedgewars server http://www.hedgewars.org/"]
-{- let newLogins = takeWhile (\(_ , time) -> (connectTime client) `diffUTCTime` time <= 11) $ lastLogins serverInfo
+ let newLogins = takeWhile (\(_ , time) -> (connectTime client) `diffUTCTime` time <= 11) $ lastLogins serverInfo
- if False && (isJust $ host client `Prelude.lookup` newLogins) then
- processAction (ci, serverInfo{lastLogins = newLogins}, rnc) $ ByeClient "Reconnected too fast"
- else
- return (ci, serverInfo)
--}
-
+ if isJust $ host client `Prelude.lookup` newLogins then
+ processAction (clID, serverInfo{lastLogins = newLogins}, updatedClients, rooms) $ ByeClient "Reconnected too fast"
+ else
+ return (clID, serverInfo{lastLogins = (host client, connectTime client) : newLogins}, updatedClients, rooms)
-processAction PingAll = do
- rnc <- gets roomsClients
- liftIO (allClientsM rnc) >>= mapM_ (kickTimeouted rnc)
- cis <- liftIO $ allClientsM rnc
- chans <- liftIO $ mapM (client'sM rnc sendChan) cis
- liftIO $ mapM_ (modifyClient rnc (\cl -> cl{pingsQueue = pingsQueue cl + 1})) cis
- processAction $ AnswerClients chans ["PING"]
+processAction (clID, serverInfo, clients, rooms) PingAll = do
+ (_, _, newClients, newRooms) <- foldM kickTimeouted (clID, serverInfo, clients, rooms) $ elems clients
+ processAction (clID,
+ serverInfo,
+ Data.IntMap.map (\cl -> cl{pingsQueue = pingsQueue cl + 1}) newClients,
+ newRooms) $ AnswerAll ["PING"]
where
- kickTimeouted rnc ci = do
- pq <- liftIO $ client'sM rnc pingsQueue ci
- when (pq > 0) $
- withStateT (\as -> as{clientIndex = Just ci}) $
- processAction (ByeClient "Ping timeout")
+ kickTimeouted (clID, serverInfo, clients, rooms) client =
+ if pingsQueue client > 0 then
+ processAction (clientUID client, serverInfo, clients, rooms) $ ByeClient "Ping timeout"
+ else
+ return (clID, serverInfo, clients, rooms)
-processAction (StatsAction) = do
- rnc <- gets roomsClients
- si <- gets serverInfo
- (roomsNum, clientsNum) <- liftIO $ withRoomsAndClients rnc stats
- liftIO $ writeChan (dbQueries si) $ SendStats clientsNum (roomsNum - 1)
- where
- stats irnc = (length $ allRooms irnc, length $ allClients irnc)
-
+processAction (clID, serverInfo, clients, rooms) (StatsAction) = do
+ writeChan (dbQueries serverInfo) $ SendStats (size clients) (size rooms - 1)
+ return (clID, serverInfo, clients, rooms)
--- a/gameServer/CMakeLists.txt Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/CMakeLists.txt Thu Dec 23 11:13:57 2010 -0500
@@ -1,48 +1,43 @@
find_program(ghc_executable ghc)
if(NOT ghc_executable)
- message(FATAL_ERROR "Cannot find GHC")
+ message(FATAL_ERROR "Cannot find GHC")
endif(NOT ghc_executable)
set(hwserver_sources
- OfficialServer/DBInteraction.hs
- Actions.hs
- ClientIO.hs
- CoreTypes.hs
- HWProtoCore.hs
- HWProtoInRoomState.hs
- HWProtoLobbyState.hs
- HWProtoNEState.hs
- HandlerUtils.hs
- NetRoutines.hs
- Opts.hs
- RoomsAndClients.hs
- ServerCore.hs
- ServerState.hs
- Store.hs
- Utils.hs
- hedgewars-server.hs
- )
+ OfficialServer/DBInteraction.hs
+ Actions.hs
+ ClientIO.hs
+ CoreTypes.hs
+ HWProtoCore.hs
+ HWProtoInRoomState.hs
+ HWProtoLobbyState.hs
+ HWProtoNEState.hs
+ NetRoutines.hs
+ Opts.hs
+ ServerCore.hs
+ Utils.hs
+ hedgewars-server.hs
+ )
set(hwserv_main ${hedgewars_SOURCE_DIR}/gameServer/hedgewars-server.hs)
set(ghc_flags
- -Wall
- --make ${hwserv_main}
- -i${hedgewars_SOURCE_DIR}/gameServer
- -o ${EXECUTABLE_OUTPUT_PATH}/hedgewars-server${CMAKE_EXECUTABLE_SUFFIX}
- -odir ${CMAKE_CURRENT_BINARY_DIR}
- -hidir ${CMAKE_CURRENT_BINARY_DIR})
+ --make ${hwserv_main}
+ -i${hedgewars_SOURCE_DIR}/gameServer
+ -o ${EXECUTABLE_OUTPUT_PATH}/hedgewars-server${CMAKE_EXECUTABLE_SUFFIX}
+ -odir ${CMAKE_CURRENT_BINARY_DIR}
+ -hidir ${CMAKE_CURRENT_BINARY_DIR})
set(ghc_flags ${haskell_compiler_flags_cmn} ${ghc_flags})
add_custom_command(OUTPUT "${EXECUTABLE_OUTPUT_PATH}/hedgewars-server${CMAKE_EXECUTABLE_SUFFIX}"
- COMMAND "${ghc_executable}"
- ARGS ${ghc_flags}
- MAIN_DEPENDENCY ${hwserv_main}
- DEPENDS ${hwserver_sources}
- )
+ COMMAND "${ghc_executable}"
+ ARGS ${ghc_flags}
+ MAIN_DEPENDENCY ${hwserv_main}
+ DEPENDS ${hwserver_sources}
+ )
add_custom_target(hedgewars-server ALL DEPENDS "${EXECUTABLE_OUTPUT_PATH}/hedgewars-server${CMAKE_EXECUTABLE_SUFFIX}")
--- a/gameServer/ClientIO.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/ClientIO.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,4 +1,4 @@
-{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
module ClientIO where
import qualified Control.Exception as Exception
@@ -6,71 +6,45 @@
import Control.Concurrent
import Control.Monad
import System.IO
-import Network
-import Network.Socket.ByteString
-import qualified Data.ByteString.Char8 as B
+import qualified Data.ByteString.UTF8 as BUTF8
+import qualified Data.ByteString as B
----------------
import CoreTypes
-import RoomsAndClients
-import Utils
-
-pDelim :: B.ByteString
-pDelim = B.pack "\n\n"
-
-bs2Packets :: B.ByteString -> ([[B.ByteString]], B.ByteString)
-bs2Packets buf = unfoldrE extractPackets buf
- where
- extractPackets :: B.ByteString -> Either B.ByteString ([B.ByteString], B.ByteString)
- extractPackets buf =
- let buf' = until (not . B.isPrefixOf pDelim) (B.drop 2) buf in
- let (bsPacket, bufTail) = B.breakSubstring pDelim buf' in
- if B.null bufTail then
- Left bsPacket
- else
- if B.null bsPacket then
- Left bufTail
- else
- Right (B.splitWith (== '\n') bsPacket, bufTail)
-
+listenLoop :: Handle -> Int -> [String] -> Chan CoreMessage -> Int -> IO ()
+listenLoop handle linesNumber buf chan clientID = do
+ str <- liftM BUTF8.toString $ B.hGetLine handle
+ if (linesNumber > 50) || (length str > 20000) then
+ writeChan chan $ ClientMessage (clientID, ["QUIT", "Protocol violation"])
+ else
+ if str == "" then do
+ writeChan chan $ ClientMessage (clientID, buf)
+ yield
+ listenLoop handle 0 [] chan clientID
+ else
+ listenLoop handle (linesNumber + 1) (buf ++ [str]) chan clientID
-listenLoop :: Socket -> Chan CoreMessage -> ClientIndex -> IO ()
-listenLoop sock chan ci = recieveWithBufferLoop B.empty
- where
- recieveWithBufferLoop recvBuf = do
- recvBS <- recv sock 4096
--- putStrLn $ show sock ++ " got smth: " ++ (show $ B.length recvBS)
- unless (B.null recvBS) $ do
- let (packets, newrecvBuf) = bs2Packets $ B.append recvBuf recvBS
- forM_ packets sendPacket
- recieveWithBufferLoop newrecvBuf
-
- sendPacket packet = writeChan chan $ ClientMessage (ci, packet)
-
+clientRecvLoop :: Handle -> Chan CoreMessage -> Int -> IO ()
+clientRecvLoop handle chan clientID =
+ listenLoop handle 0 [] chan clientID
+ `catch` (\e -> clientOff (show e) >> return ())
+ where clientOff msg = writeChan chan $ ClientMessage (clientID, ["QUIT", msg]) -- if the client disconnects, we perform as if it sent QUIT message
-clientRecvLoop :: Socket -> Chan CoreMessage -> ClientIndex -> IO ()
-clientRecvLoop s chan ci = do
- msg <- (listenLoop s chan ci >> return "Connection closed") `catch` (return . B.pack . show)
- clientOff msg
- where
- clientOff msg = mapM_ (writeChan chan) [ClientMessage (ci, ["QUIT", msg]), Remove ci]
-
-
+clientSendLoop :: Handle -> Chan CoreMessage -> Chan [String] -> Int -> IO()
+clientSendLoop handle coreChan chan clientID = do
+ answer <- readChan chan
+ doClose <- Exception.handle
+ (\(e :: Exception.IOException) -> if isQuit answer then return True else sendQuit e >> return False) $ do
+ B.hPutStrLn handle $ BUTF8.fromString $ unlines answer
+ hFlush handle
+ return $ isQuit answer
-clientSendLoop :: Socket -> Chan [B.ByteString] -> ClientIndex -> IO ()
-clientSendLoop s chan ci = do
- answer <- readChan chan
- Exception.handle
- (\(e :: Exception.IOException) -> when (not $ isQuit answer) $ sendQuit e) $ do
- sendAll s $ (B.unlines answer) `B.append` (B.singleton '\n')
-
- if (isQuit answer) then
- Exception.handle (\(_ :: Exception.IOException) -> putStrLn "error on sClose") $ sClose s
+ if doClose then
+ Exception.handle (\(_ :: Exception.IOException) -> putStrLn "error on hClose") $ hClose handle
else
- clientSendLoop s chan ci
+ clientSendLoop handle coreChan chan clientID
where
- --sendQuit e = writeChan coreChan $ ClientMessage (ci, ["QUIT", B.pack $ show e])
- sendQuit e = putStrLn $ show e
+ sendQuit e = writeChan coreChan $ ClientMessage (clientID, ["QUIT", show e])
isQuit ("BYE":xs) = True
isQuit _ = False
--- a/gameServer/CoreTypes.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/CoreTypes.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,4 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
module CoreTypes where
import System.IO
@@ -6,95 +5,102 @@
import Control.Concurrent.STM
import Data.Word
import qualified Data.Map as Map
+import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import Data.Sequence(Seq, empty)
import Data.Time
import Network
import Data.Function
-import Data.ByteString.Char8 as B
-import RoomsAndClients
-
-type ClientChan = Chan [B.ByteString]
data ClientInfo =
ClientInfo
{
- sendChan :: ClientChan,
- clientSocket :: Socket,
- host :: B.ByteString,
+ clientUID :: !Int,
+ sendChan :: Chan [String],
+ clientHandle :: Handle,
+ host :: String,
connectTime :: UTCTime,
- nick :: B.ByteString,
- webPassword :: B.ByteString,
+ nick :: String,
+ webPassword :: String,
logonPassed :: Bool,
clientProto :: !Word16,
- roomID :: RoomIndex,
+ roomID :: !Int,
pingsQueue :: !Word,
isMaster :: Bool,
- isReady :: !Bool,
+ isReady :: Bool,
isAdministrator :: Bool,
- clientClan :: B.ByteString,
+ clientClan :: String,
teamsInGame :: Word
}
instance Show ClientInfo where
- show ci = " nick: " ++ (unpack $ nick ci) ++ " host: " ++ (unpack $ host ci)
+ show ci = show (clientUID ci)
+ ++ " nick: " ++ (nick ci)
+ ++ " host: " ++ (host ci)
instance Eq ClientInfo where
- (==) = (==) `on` clientSocket
+ (==) = (==) `on` clientHandle
data HedgehogInfo =
- HedgehogInfo B.ByteString B.ByteString
+ HedgehogInfo String String
data TeamInfo =
TeamInfo
{
- teamownerId :: ClientIndex,
- teamowner :: B.ByteString,
- teamname :: B.ByteString,
- teamcolor :: B.ByteString,
- teamgrave :: B.ByteString,
- teamfort :: B.ByteString,
- teamvoicepack :: B.ByteString,
- teamflag :: B.ByteString,
+ teamownerId :: !Int,
+ teamowner :: String,
+ teamname :: String,
+ teamcolor :: String,
+ teamgrave :: String,
+ teamfort :: String,
+ teamvoicepack :: String,
+ teamflag :: String,
difficulty :: Int,
hhnum :: Int,
hedgehogs :: [HedgehogInfo]
}
instance Show TeamInfo where
- show ti = "owner: " ++ (unpack $ teamowner ti)
- ++ "name: " ++ (unpack $ teamname ti)
- ++ "color: " ++ (unpack $ teamcolor ti)
+ show ti = "owner: " ++ (teamowner ti)
+ ++ "name: " ++ (teamname ti)
+ ++ "color: " ++ (teamcolor ti)
data RoomInfo =
RoomInfo
{
- masterID :: ClientIndex,
- name :: B.ByteString,
- password :: B.ByteString,
+ roomUID :: !Int,
+ masterID :: !Int,
+ name :: String,
+ password :: String,
roomProto :: Word16,
teams :: [TeamInfo],
gameinprogress :: Bool,
playersIn :: !Int,
readyPlayers :: !Int,
+ playersIDs :: IntSet.IntSet,
isRestrictedJoins :: Bool,
isRestrictedTeams :: Bool,
- roundMsgs :: Seq B.ByteString,
- leftTeams :: [B.ByteString],
+ roundMsgs :: Seq String,
+ leftTeams :: [String],
teamsAtStart :: [TeamInfo],
- params :: Map.Map B.ByteString [B.ByteString]
+ params :: Map.Map String [String]
}
instance Show RoomInfo where
- show ri = ", players: " ++ show (playersIn ri)
+ show ri = show (roomUID ri)
+ ++ ", players ids: " ++ show (IntSet.size $ playersIDs ri)
+ ++ ", players: " ++ show (playersIn ri)
++ ", ready: " ++ show (readyPlayers ri)
++ ", teams: " ++ show (teams ri)
-newRoom :: RoomInfo
+instance Eq RoomInfo where
+ (==) = (==) `on` roomUID
+
newRoom = (
RoomInfo
- undefined
+ 0
+ 0
""
""
0
@@ -102,6 +108,7 @@
False
0
0
+ IntSet.empty
False
False
Data.Sequence.empty
@@ -121,24 +128,23 @@
ServerInfo
{
isDedicated :: Bool,
- serverMessage :: B.ByteString,
- serverMessageForOldVersions :: B.ByteString,
+ serverMessage :: String,
+ serverMessageForOldVersions :: String,
latestReleaseVersion :: Word16,
listenPort :: PortNumber,
nextRoomID :: Int,
- dbHost :: B.ByteString,
- dbLogin :: B.ByteString,
- dbPassword :: B.ByteString,
- lastLogins :: [(B.ByteString, UTCTime)],
+ dbHost :: String,
+ dbLogin :: String,
+ dbPassword :: String,
+ lastLogins :: [(String, UTCTime)],
stats :: TMVar StatisticsInfo,
coreChan :: Chan CoreMessage,
dbQueries :: Chan DBQuery
}
instance Show ServerInfo where
- show _ = "Server Info"
+ show si = "Server Info"
-newServerInfo :: TMVar StatisticsInfo -> Chan CoreMessage -> Chan DBQuery -> ServerInfo
newServerInfo = (
ServerInfo
True
@@ -154,31 +160,29 @@
)
data AccountInfo =
- HasAccount B.ByteString Bool
+ HasAccount String Bool
| Guest
| Admin
deriving (Show, Read)
data DBQuery =
- CheckAccount ClientIndex B.ByteString B.ByteString
+ CheckAccount Int String String
| ClearCache
| SendStats Int Int
deriving (Show, Read)
data CoreMessage =
Accept ClientInfo
- | ClientMessage (ClientIndex, [B.ByteString])
- | ClientAccountInfo (ClientIndex, AccountInfo)
+ | ClientMessage (Int, [String])
+ | ClientAccountInfo (Int, AccountInfo)
| TimerAction Int
- | Remove ClientIndex
+
+type Clients = IntMap.IntMap ClientInfo
+type Rooms = IntMap.IntMap RoomInfo
-instance Show CoreMessage where
- show (Accept _) = "Accept"
- show (ClientMessage _) = "ClientMessage"
- show (ClientAccountInfo _) = "ClientAccountInfo"
- show (TimerAction _) = "TimerAction"
- show (Remove _) = "Remove"
-
-type MRnC = MRoomsAndClients RoomInfo ClientInfo
-type IRnC = IRoomsAndClients RoomInfo ClientInfo
+--type ClientsTransform = [ClientInfo] -> [ClientInfo]
+--type RoomsTransform = [RoomInfo] -> [RoomInfo]
+--type HandlesSelector = ClientInfo -> [ClientInfo] -> [RoomInfo] -> [ClientInfo]
+--type Answer = ServerInfo -> (HandlesSelector, [String])
+type ClientsSelector = Clients -> Rooms -> [Int]
--- a/gameServer/HWProtoCore.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/HWProtoCore.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,10 +1,8 @@
-{-# LANGUAGE OverloadedStrings #-}
module HWProtoCore where
import qualified Data.IntMap as IntMap
import Data.Foldable
import Data.Maybe
-import Control.Monad.Reader
--------------------------------------
import CoreTypes
import Actions
@@ -12,37 +10,35 @@
import HWProtoNEState
import HWProtoLobbyState
import HWProtoInRoomState
-import HandlerUtils
-import RoomsAndClients
handleCmd, handleCmd_loggedin :: CmdHandler
-
-handleCmd ["PING"] = answerClient ["PONG"]
+handleCmd clID _ _ ["PING"] = [AnswerThisClient ["PONG"]]
-
-handleCmd ("QUIT" : xs) = return [ByeClient msg]
+handleCmd clID clients rooms ("QUIT" : xs) =
+ [ByeClient msg]
where
msg = if not $ null xs then head xs else ""
-{-
-handleCmd ["PONG"] =
+
+handleCmd clID clients _ ["PONG"] =
if pingsQueue client == 0 then
[ProtocolError "Protocol violation"]
else
[ModifyClient (\cl -> cl{pingsQueue = pingsQueue cl - 1})]
where
client = clients IntMap.! clID
--}
+
-handleCmd cmd = do
- (ci, irnc) <- ask
- if logonPassed (irnc `client` ci) then
- handleCmd_loggedin cmd
- else
- handleCmd_NotEntered cmd
+handleCmd clID clients rooms cmd =
+ if not $ logonPassed client then
+ handleCmd_NotEntered clID clients rooms cmd
+ else
+ handleCmd_loggedin clID clients rooms cmd
+ where
+ client = clients IntMap.! clID
-{-
+
handleCmd_loggedin clID clients rooms ["INFO", asknick] =
if noSuchClient then
[]
@@ -66,12 +62,11 @@
then if teamsInGame client > 0 then "(playing)" else "(spectating)"
else ""
--}
-
-handleCmd_loggedin cmd = do
- (ci, rnc) <- ask
- if clientRoom rnc ci == lobbyId then
- handleCmd_lobby cmd
- else
- handleCmd_inRoom cmd
+handleCmd_loggedin clID clients rooms cmd =
+ if roomID client == 0 then
+ handleCmd_lobby clID clients rooms cmd
+ else
+ handleCmd_inRoom clID clients rooms cmd
+ where
+ client = clients IntMap.! clID
--- a/gameServer/HWProtoInRoomState.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/HWProtoInRoomState.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,240 +1,182 @@
-{-# LANGUAGE OverloadedStrings #-}
module HWProtoInRoomState where
import qualified Data.Foldable as Foldable
+import qualified Data.IntMap as IntMap
import qualified Data.Map as Map
import Data.Sequence(Seq, (|>), (><), fromList, empty)
import Data.List
import Data.Maybe
-import qualified Data.ByteString.Char8 as B
-import Control.Monad
-import Control.Monad.Reader
--------------------------------------
import CoreTypes
import Actions
import Utils
-import HandlerUtils
-import RoomsAndClients
+
handleCmd_inRoom :: CmdHandler
-handleCmd_inRoom ["CHAT", msg] = do
- n <- clientNick
- s <- roomOthersChans
- return [AnswerClients s ["CHAT", n, msg]]
+handleCmd_inRoom clID clients _ ["CHAT", msg] =
+ [AnswerOthersInRoom ["CHAT", clientNick, msg]]
+ where
+ clientNick = nick $ clients IntMap.! clID
-handleCmd_inRoom ["PART"] = return [MoveToLobby "part"]
-handleCmd_inRoom ["PART", msg] = return [MoveToLobby $ "part: " `B.append` msg]
+handleCmd_inRoom clID clients rooms ["PART"] =
+ [RoomRemoveThisClient "part"]
+ where
+ client = clients IntMap.! clID
-handleCmd_inRoom ("CFG" : paramName : paramStrs)
- | null paramStrs = return [ProtocolError "Empty config entry"]
- | otherwise = do
- chans <- roomOthersChans
- cl <- thisClient
- if isMaster cl then
- return [
- ModifyRoom (\r -> r{params = Map.insert paramName paramStrs (params r)}),
- AnswerClients chans ("CFG" : paramName : paramStrs)]
- else
- return [ProtocolError "Not room master"]
+handleCmd_inRoom clID clients rooms ("CFG" : paramName : paramStrs)
+ | null paramStrs = [ProtocolError "Empty config entry"]
+ | isMaster client =
+ [ModifyRoom (\r -> r{params = Map.insert paramName paramStrs (params r)}),
+ AnswerOthersInRoom ("CFG" : paramName : paramStrs)]
+ | otherwise = [ProtocolError "Not room master"]
+ where
+ client = clients IntMap.! clID
-handleCmd_inRoom ("ADD_TEAM" : name : color : grave : fort : voicepack : flag : difStr : hhsInfo)
- | length hhsInfo /= 16 = return [ProtocolError "Corrupted hedgehogs info"]
- | otherwise = do
- (ci, rnc) <- ask
- r <- thisRoom
- clNick <- clientNick
- clChan <- thisClientChans
- othersChans <- roomOthersChans
- return $
- if not . null . drop 5 $ teams r then
- [Warning "too many teams"]
- else if canAddNumber r <= 0 then
- [Warning "too many hedgehogs"]
- else if isJust $ findTeam r then
- [Warning "There's already a team with same name in the list"]
- else if gameinprogress r then
- [Warning "round in progress"]
- else if isRestrictedTeams r then
- [Warning "restricted"]
- else
- [ModifyRoom (\r -> r{teams = teams r ++ [newTeam ci clNick r]}),
- ModifyClient (\c -> c{teamsInGame = teamsInGame c + 1, clientClan = color}),
- AnswerClients clChan ["TEAM_ACCEPTED", name],
- AnswerClients othersChans $ teamToNet $ newTeam ci clNick r,
- AnswerClients othersChans ["TEAM_COLOR", name, color]
- ]
- where
- canAddNumber r = 48 - (sum . map hhnum $ teams r)
- findTeam = find (\t -> name == teamname t) . teams
- newTeam ci clNick r = (TeamInfo ci clNick name color grave fort voicepack flag difficulty (newTeamHHNum r) (hhsList hhsInfo))
- difficulty = case B.readInt difStr of
- Just (i, t) | B.null t -> fromIntegral i
- otherwise -> 0
+handleCmd_inRoom clID clients rooms ("ADD_TEAM" : name : color : grave : fort : voicepack : flag : difStr : hhsInfo)
+ | length hhsInfo == 15 && clientProto client < 30 = handleCmd_inRoom clID clients rooms ("ADD_TEAM" : name : color : grave : fort : voicepack : " " : flag : difStr : hhsInfo)
+ | length hhsInfo /= 16 = [ProtocolError "Corrupted hedgehogs info"]
+ | length (teams room) == 6 = [Warning "too many teams"]
+ | canAddNumber <= 0 = [Warning "too many hedgehogs"]
+ | isJust findTeam = [Warning "There's already a team with same name in the list"]
+ | gameinprogress room = [Warning "round in progress"]
+ | isRestrictedTeams room = [Warning "restricted"]
+ | otherwise =
+ [ModifyRoom (\r -> r{teams = teams r ++ [newTeam]}),
+ ModifyClient (\c -> c{teamsInGame = teamsInGame c + 1, clientClan = color}),
+ AnswerThisClient ["TEAM_ACCEPTED", name],
+ AnswerOthersInRoom $ teamToNet (clientProto client) newTeam,
+ AnswerOthersInRoom ["TEAM_COLOR", name, color]
+ ]
+ where
+ client = clients IntMap.! clID
+ room = rooms IntMap.! (roomID client)
+ canAddNumber = 48 - (sum . map hhnum $ teams room)
+ findTeam = find (\t -> name == teamname t) $ teams room
+ newTeam = (TeamInfo clID (nick client) name color grave fort voicepack flag difficulty newTeamHHNum (hhsList hhsInfo))
+ difficulty = fromMaybe 0 (maybeRead difStr :: Maybe Int)
hhsList [] = []
- hhsList [_] = error "Hedgehogs list with odd elements number"
hhsList (n:h:hhs) = HedgehogInfo n h : hhsList hhs
- newTeamHHNum r = min 4 (canAddNumber r)
-
-handleCmd_inRoom ["REMOVE_TEAM", name] = do
- (ci, rnc) <- ask
- r <- thisRoom
- clNick <- clientNick
-
- let maybeTeam = findTeam r
- let team = fromJust maybeTeam
+ newTeamHHNum = min 4 canAddNumber
- return $
- if isNothing $ findTeam r then
- [Warning "REMOVE_TEAM: no such team"]
- else if clNick /= teamowner team then
- [ProtocolError "Not team owner!"]
- else
- [RemoveTeam name,
- ModifyClient
- (\c -> c{
- teamsInGame = teamsInGame c - 1,
- clientClan = if teamsInGame c == 1 then undefined else anotherTeamClan ci r
- })
- ]
+handleCmd_inRoom clID clients rooms ["REMOVE_TEAM", teamName]
+ | noSuchTeam = [Warning "REMOVE_TEAM: no such team"]
+ | nick client /= teamowner team = [ProtocolError "Not team owner!"]
+ | otherwise =
+ [RemoveTeam teamName,
+ ModifyClient (\c -> c{teamsInGame = teamsInGame c - 1, clientClan = if teamsInGame client == 1 then undefined else anotherTeamClan})
+ ]
where
- anotherTeamClan ci = teamcolor . fromJust . find (\t -> teamownerId t == ci) . teams
- findTeam = find (\t -> name == teamname t) . teams
+ client = clients IntMap.! clID
+ room = rooms IntMap.! (roomID client)
+ noSuchTeam = isNothing findTeam
+ team = fromJust findTeam
+ findTeam = find (\t -> teamName == teamname t) $ teams room
+ anotherTeamClan = teamcolor $ fromJust $ find (\t -> teamownerId t == clID) $ teams room
-handleCmd_inRoom ["HH_NUM", teamName, numberStr] = do
- cl <- thisClient
- others <- roomOthersChans
- r <- thisRoom
-
- let maybeTeam = findTeam r
- let team = fromJust maybeTeam
-
- return $
- if not $ isMaster cl then
- [ProtocolError "Not room master"]
- else if hhNumber < 1 || hhNumber > 8 || isNothing maybeTeam || hhNumber > (canAddNumber r) + (hhnum team) then
- []
- else
- [ModifyRoom $ modifyTeam team{hhnum = hhNumber},
- AnswerClients others ["HH_NUM", teamName, B.pack $ show hhNumber]]
+handleCmd_inRoom clID clients rooms ["HH_NUM", teamName, numberStr]
+ | not $ isMaster client = [ProtocolError "Not room master"]
+ | hhNumber < 1 || hhNumber > 8 || noSuchTeam || hhNumber > (canAddNumber + (hhnum team)) = []
+ | otherwise =
+ [ModifyRoom $ modifyTeam team{hhnum = hhNumber},
+ AnswerOthersInRoom ["HH_NUM", teamName, show hhNumber]]
where
- hhNumber = case B.readInt numberStr of
- Just (i, t) | B.null t -> fromIntegral i
- otherwise -> 0
- findTeam = find (\t -> teamName == teamname t) . teams
- canAddNumber = (-) 48 . sum . map hhnum . teams
-
+ client = clients IntMap.! clID
+ room = rooms IntMap.! (roomID client)
+ hhNumber = fromMaybe 0 (maybeRead numberStr :: Maybe Int)
+ noSuchTeam = isNothing findTeam
+ team = fromJust findTeam
+ findTeam = find (\t -> teamName == teamname t) $ teams room
+ canAddNumber = 48 - (sum . map hhnum $ teams room)
-handleCmd_inRoom ["TEAM_COLOR", teamName, newColor] = do
- cl <- thisClient
- others <- roomOthersChans
- r <- thisRoom
-
- let maybeTeam = findTeam r
- let team = fromJust maybeTeam
-
- return $
- if not $ isMaster cl then
- [ProtocolError "Not room master"]
- else if isNothing maybeTeam then
- []
- else
- [ModifyRoom $ modifyTeam team{teamcolor = newColor},
- AnswerClients others ["TEAM_COLOR", teamName, newColor],
+handleCmd_inRoom clID clients rooms ["TEAM_COLOR", teamName, newColor]
+ | not $ isMaster client = [ProtocolError "Not room master"]
+ | noSuchTeam = []
+ | otherwise = [ModifyRoom $ modifyTeam team{teamcolor = newColor},
+ AnswerOthersInRoom ["TEAM_COLOR", teamName, newColor],
ModifyClient2 (teamownerId team) (\c -> c{clientClan = newColor})]
where
- findTeam = find (\t -> teamName == teamname t) . teams
+ noSuchTeam = isNothing findTeam
+ team = fromJust findTeam
+ findTeam = find (\t -> teamName == teamname t) $ teams room
+ client = clients IntMap.! clID
+ room = rooms IntMap.! (roomID client)
-handleCmd_inRoom ["TOGGLE_READY"] = do
- cl <- thisClient
- chans <- roomClientsChans
- return [
- ModifyClient (\c -> c{isReady = not $ isReady cl}),
- ModifyRoom (\r -> r{readyPlayers = readyPlayers r + (if isReady cl then -1 else 1)}),
- AnswerClients chans [if isReady cl then "NOT_READY" else "READY", nick cl]
- ]
+handleCmd_inRoom clID clients rooms ["TOGGLE_READY"] =
+ [ModifyClient (\c -> c{isReady = not $ isReady client}),
+ ModifyRoom (\r -> r{readyPlayers = readyPlayers r + (if isReady client then -1 else 1)}),
+ AnswerThisRoom [if isReady client then "NOT_READY" else "READY", nick client]]
+ where
+ client = clients IntMap.! clID
-handleCmd_inRoom ["START_GAME"] = do
- cl <- thisClient
- r <- thisRoom
- chans <- roomClientsChans
- if isMaster cl && (playersIn r == readyPlayers r) && (not $ gameinprogress r) then
- if enoughClans r then
- return [
- ModifyRoom
+handleCmd_inRoom clID clients rooms ["START_GAME"] =
+ if isMaster client && (playersIn room == readyPlayers room) && (not . gameinprogress) room then
+ if enoughClans then
+ [ModifyRoom
(\r -> r{
gameinprogress = True,
roundMsgs = empty,
leftTeams = [],
teamsAtStart = teams r}
),
- AnswerClients chans ["RUN_GAME"]
- ]
- else
- return [Warning "Less than two clans!"]
+ AnswerThisRoom ["RUN_GAME"]]
else
- return []
+ [Warning "Less than two clans!"]
+ else
+ []
where
- enoughClans = not . null . drop 1 . group . map teamcolor . teams
+ client = clients IntMap.! clID
+ room = rooms IntMap.! (roomID client)
+ enoughClans = not $ null $ drop 1 $ group $ map teamcolor $ teams room
-handleCmd_inRoom ["EM", msg] = do
- cl <- thisClient
- r <- thisRoom
- chans <- roomOthersChans
-
- if (teamsInGame cl > 0) && isLegal then
- return $ (AnswerClients chans ["EM", msg]) : [ModifyRoom (\r -> r{roundMsgs = roundMsgs r |> msg}) | not isKeepAlive]
- else
- return []
+handleCmd_inRoom clID clients rooms ["EM", msg] =
+ if (teamsInGame client > 0) && isLegal then
+ (AnswerOthersInRoom ["EM", msg]) : [ModifyRoom (\r -> r{roundMsgs = roundMsgs r |> msg}) | not isKeepAlive]
+ else
+ []
where
+ client = clients IntMap.! clID
(isLegal, isKeepAlive) = checkNetCmd msg
-
-handleCmd_inRoom ["ROUNDFINISHED"] = do
- cl <- thisClient
- r <- thisRoom
- chans <- roomClientsChans
-
- if isMaster cl && (gameinprogress r) then
- return $ (ModifyRoom
+handleCmd_inRoom clID clients rooms ["ROUNDFINISHED"] =
+ if isMaster client then
+ [ModifyRoom
(\r -> r{
gameinprogress = False,
readyPlayers = 0,
roundMsgs = empty,
leftTeams = [],
teamsAtStart = []}
- ))
- : UnreadyRoomClients
- : answerRemovedTeams chans r
- else
- return []
+ ),
+ UnreadyRoomClients
+ ] ++ answerRemovedTeams
+ else
+ []
where
- answerRemovedTeams chans = map (\t -> AnswerClients chans ["REMOVE_TEAM", t]) . leftTeams
-
-handleCmd_inRoom ["TOGGLE_RESTRICT_JOINS"] = do
- cl <- thisClient
- return $
- if not $ isMaster cl then
- [ProtocolError "Not room master"]
- else
- [ModifyRoom (\r -> r{isRestrictedJoins = not $ isRestrictedJoins r})]
+ client = clients IntMap.! clID
+ room = rooms IntMap.! (roomID client)
+ answerRemovedTeams = map (\t -> AnswerThisRoom ["REMOVE_TEAM", t]) $ leftTeams room
-handleCmd_inRoom ["TOGGLE_RESTRICT_TEAMS"] = do
- cl <- thisClient
- return $
- if not $ isMaster cl then
- [ProtocolError "Not room master"]
- else
- [ModifyRoom (\r -> r{isRestrictedTeams = not $ isRestrictedTeams r})]
+handleCmd_inRoom clID clients _ ["TOGGLE_RESTRICT_JOINS"]
+ | isMaster client = [ModifyRoom (\r -> r{isRestrictedJoins = not $ isRestrictedJoins r})]
+ | otherwise = [ProtocolError "Not room master"]
+ where
+ client = clients IntMap.! clID
+
-{-
+handleCmd_inRoom clID clients _ ["TOGGLE_RESTRICT_TEAMS"]
+ | isMaster client = [ModifyRoom (\r -> r{isRestrictedTeams = not $ isRestrictedTeams r})]
+ | otherwise = [ProtocolError "Not room master"]
+ where
+ client = clients IntMap.! clID
+
handleCmd_inRoom clID clients rooms ["KICK", kickNick] =
[KickRoomClient kickID | isMaster client && not noSuchClient && (kickID /= clID) && (roomID client == roomID kickClient)]
where
@@ -250,5 +192,5 @@
where
client = clients IntMap.! clID
engineMsg = toEngineMsg $ 'b' : ((nick client) ++ "(team): " ++ msg ++ "\x20\x20")
--}
-handleCmd_inRoom _ = return [ProtocolError "Incorrect command (state: in room)"]
+
+handleCmd_inRoom clID _ _ _ = [ProtocolError "Incorrect command (state: in room)"]
--- a/gameServer/HWProtoLobbyState.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/HWProtoLobbyState.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,102 +1,73 @@
-{-# LANGUAGE OverloadedStrings #-}
module HWProtoLobbyState where
import qualified Data.Map as Map
+import qualified Data.IntMap as IntMap
import qualified Data.IntSet as IntSet
import qualified Data.Foldable as Foldable
import Data.Maybe
import Data.List
import Data.Word
-import Control.Monad.Reader
-import qualified Data.ByteString.Char8 as B
--------------------------------------
import CoreTypes
import Actions
import Utils
-import HandlerUtils
-import RoomsAndClients
-{-answerAllTeams protocol teams = concatMap toAnswer teams
+answerAllTeams protocol teams = concatMap toAnswer teams
where
toAnswer team =
[AnswerThisClient $ teamToNet protocol team,
AnswerThisClient ["TEAM_COLOR", teamname team, teamcolor team],
AnswerThisClient ["HH_NUM", teamname team, show $ hhnum team]]
--}
+
handleCmd_lobby :: CmdHandler
-
-handleCmd_lobby ["LIST"] = do
- (ci, irnc) <- ask
- let cl = irnc `client` ci
- rooms <- allRoomInfos
- let roomsInfoList = concatMap (roomInfo irnc) . filter (\r -> (roomProto r == clientProto cl) && not (isRestrictedJoins r))
- return [AnswerClients [sendChan cl] ("ROOMS" : roomsInfoList rooms)]
+handleCmd_lobby clID clients rooms ["LIST"] =
+ [AnswerThisClient ("ROOMS" : roomsInfoList)]
where
- roomInfo irnc room = [
- showB $ gameinprogress room,
+ roomsInfoList = concatMap roomInfo sameProtoRooms
+ sameProtoRooms = filter (\r -> (roomProto r == protocol) && not (isRestrictedJoins r)) roomsList
+ roomsList = IntMap.elems rooms
+ protocol = clientProto client
+ client = clients IntMap.! clID
+ roomInfo room
+ | clientProto client < 28 = [
name room,
- showB $ playersIn room,
- showB $ length $ teams room,
- nick $ irnc `client` masterID room,
+ show (playersIn room) ++ "(" ++ show (length $ teams room) ++ ")",
+ show $ gameinprogress room
+ ]
+ | otherwise = [
+ show $ gameinprogress room,
+ name room,
+ show $ playersIn room,
+ show $ length $ teams room,
+ nick $ clients IntMap.! (masterID room),
head (Map.findWithDefault ["+gen+"] "MAP" (params room)),
head (Map.findWithDefault ["Default"] "SCHEME" (params room)),
head (Map.findWithDefault ["Default"] "AMMO" (params room))
]
-
-handleCmd_lobby ["CHAT", msg] = do
- n <- clientNick
- s <- roomOthersChans
- return [AnswerClients s ["CHAT", n, msg]]
-
-handleCmd_lobby ["CREATE_ROOM", newRoom, roomPassword]
- | illegalName newRoom = return [Warning "Illegal room name"]
- | otherwise = do
- rs <- allRoomInfos
- cl <- thisClient
- return $ if isJust $ find (\room -> newRoom == name room) rs then
- [Warning "Room exists"]
- else
- [
- AddRoom newRoom roomPassword,
- AnswerClients [sendChan cl] ["NOT_READY", nick cl]
- ]
-
-
-handleCmd_lobby ["CREATE_ROOM", newRoom] =
- handleCmd_lobby ["CREATE_ROOM", newRoom, ""]
+handleCmd_lobby clID clients _ ["CHAT", msg] =
+ [AnswerOthersInRoom ["CHAT", clientNick, msg]]
+ where
+ clientNick = nick $ clients IntMap.! clID
-handleCmd_lobby ["JOIN_ROOM", roomName, roomPassword] = do
- (ci, irnc) <- ask
- let ris = allRooms irnc
- cl <- thisClient
- let maybeRI = find (\ri -> roomName == name (irnc `room` ri)) ris
- let jRI = fromJust maybeRI
- let jRoom = irnc `room` jRI
- let jRoomClients = map (client irnc) $! roomClients irnc jRI -- no lazyness here!
- return $
- if isNothing maybeRI then
- [Warning "No such rooms"]
- else if isRestrictedJoins jRoom then
- [Warning "Joining restricted"]
- else if roomPassword /= password jRoom then
- [Warning "Wrong password"]
- else
- [
- MoveToRoom jRI,
- AnswerClients (map sendChan $ cl : jRoomClients) ["NOT_READY", nick cl]
- ]
- ++ [ AnswerClients [sendChan cl] $ "JOINED" : map nick jRoomClients | playersIn jRoom /= 0]
- ++ (map (readynessMessage cl) jRoomClients)
-
+handleCmd_lobby clID clients rooms ["CREATE_ROOM", newRoom, roomPassword]
+ | haveSameRoom = [Warning "Room exists"]
+ | illegalName newRoom = [Warning "Illegal room name"]
+ | otherwise =
+ [RoomRemoveThisClient "", -- leave lobby
+ AddRoom newRoom roomPassword,
+ AnswerThisClient ["NOT_READY", clientNick]
+ ]
where
- readynessMessage cl c = AnswerClients [sendChan cl] [if isReady c then "READY" else "NOT_READY", nick c]
+ clientNick = nick $ clients IntMap.! clID
+ haveSameRoom = isJust $ find (\room -> newRoom == name room) $ IntMap.elems rooms
+handleCmd_lobby clID clients rooms ["CREATE_ROOM", newRoom] =
+ handleCmd_lobby clID clients rooms ["CREATE_ROOM", newRoom, ""]
-{-
handleCmd_lobby clID clients rooms ["JOIN_ROOM", roomName, roomPassword]
| noSuchRoom = [Warning "No such room"]
@@ -112,6 +83,12 @@
++ answerTeams
++ watchRound
where
+ noSuchRoom = isNothing mbRoom
+ mbRoom = find (\r -> roomName == name r && roomProto r == clientProto client) $ IntMap.elems rooms
+ jRoom = fromJust mbRoom
+ rID = roomUID jRoom
+ client = clients IntMap.! clID
+ roomClientsIDs = IntSet.elems $ playersIDs jRoom
answerNicks =
[AnswerThisClient $ "JOINED" :
map (\clID -> nick $ clients IntMap.! clID) roomClientsIDs | playersIn jRoom /= 0]
@@ -123,9 +100,9 @@
roomClientsIDs
toAnswer (paramName, paramStrs) = AnswerThisClient $ "CFG" : paramName : paramStrs
-
- answerFullConfig = map toAnswer (leftConfigPart ++ rightConfigPart)
- (leftConfigPart, rightConfigPart) = partition (\(p, _) -> p /= "MAP") (Map.toList $ params jRoom)
+
+ answerFullConfig = map toAnswer ((Data.List.reverse . Data.List.sort $ leftConfigPart) ++ rightConfigPart)
+ (leftConfigPart, rightConfigPart) = partition (\(p, _) -> p == "MAP" || p == "MAPGEN") (Map.toList $ params jRoom)
watchRound = if not $ gameinprogress jRoom then
[]
@@ -137,12 +114,12 @@
answerAllTeams (clientProto client) (teamsAtStart jRoom)
else
answerAllTeams (clientProto client) (teams jRoom)
--}
+
-handleCmd_lobby ["JOIN_ROOM", roomName] =
- handleCmd_lobby ["JOIN_ROOM", roomName, ""]
+handleCmd_lobby clID clients rooms ["JOIN_ROOM", roomName] =
+ handleCmd_lobby clID clients rooms ["JOIN_ROOM", roomName, ""]
+
-{-
handleCmd_lobby clID clients rooms ["FOLLOW", asknick] =
if noSuchClient || roomID followClient == 0 then
[]
@@ -203,7 +180,6 @@
[ClearAccountsCache | isAdministrator client]
where
client = clients IntMap.! clID
--}
-handleCmd_lobby _ = return [ProtocolError "Incorrect command (state: in lobby)"]
+handleCmd_lobby clID _ _ _ = [ProtocolError "Incorrect command (state: in lobby)"]
--- a/gameServer/HWProtoNEState.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/HWProtoNEState.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,66 +1,54 @@
-{-# LANGUAGE OverloadedStrings #-}
module HWProtoNEState where
import qualified Data.IntMap as IntMap
import Data.Maybe
import Data.List
import Data.Word
-import Control.Monad.Reader
-import qualified Data.ByteString.Char8 as B
--------------------------------------
import CoreTypes
import Actions
import Utils
-import RoomsAndClients
handleCmd_NotEntered :: CmdHandler
-handleCmd_NotEntered ["NICK", newNick] = do
- (ci, irnc) <- ask
- let cl = irnc `client` ci
- if not . B.null $ nick cl then return [ProtocolError "Nickname already chosen"]
- else
- if haveSameNick irnc (nick cl) then return [AnswerClients [sendChan cl] ["WARNING", "Nickname already in use"], ByeClient ""]
- else
- if illegalName newNick then return [ByeClient "Illegal nickname"]
- else
- return $
- ModifyClient (\c -> c{nick = newNick}) :
- AnswerClients [sendChan cl] ["NICK", newNick] :
- [CheckRegistered | clientProto cl /= 0]
+handleCmd_NotEntered clID clients _ ["NICK", newNick]
+ | not . null $ nick client = [ProtocolError "Nickname already chosen"]
+ | haveSameNick = [AnswerThisClient ["WARNING", "Nickname already in use"], ByeClient ""]
+ | illegalName newNick = [ByeClient "Illegal nickname"]
+ | otherwise =
+ ModifyClient (\c -> c{nick = newNick}) :
+ AnswerThisClient ["NICK", newNick] :
+ [CheckRegistered | clientProto client /= 0]
where
- haveSameNick irnc clNick = isJust $ find (\cl -> newNick == clNick) $ map (client irnc) $ allClients irnc
-
-handleCmd_NotEntered ["PROTO", protoNum] = do
- (ci, irnc) <- ask
- let cl = irnc `client` ci
- if clientProto cl > 0 then return [ProtocolError "Protocol already known"]
- else
- if parsedProto == 0 then return [ProtocolError "Bad number"]
- else
- return $
- ModifyClient (\c -> c{clientProto = parsedProto}) :
- AnswerClients [sendChan cl] ["PROTO", B.pack $ show parsedProto] :
- [CheckRegistered | not . B.null $ nick cl]
- where
- parsedProto = case B.readInt protoNum of
- Just (i, t) | B.null t -> fromIntegral i
- otherwise -> 0
+ client = clients IntMap.! clID
+ haveSameNick = isJust $ find (\cl -> newNick == nick cl) $ IntMap.elems clients
-handleCmd_NotEntered ["PASSWORD", passwd] = do
- (ci, irnc) <- ask
- let cl = irnc `client` ci
+handleCmd_NotEntered clID clients _ ["PROTO", protoNum]
+ | clientProto client > 0 = [ProtocolError "Protocol already known"]
+ | parsedProto == 0 = [ProtocolError "Bad number"]
+ | otherwise =
+ ModifyClient (\c -> c{clientProto = parsedProto}) :
+ AnswerThisClient ["PROTO", show parsedProto] :
+ [CheckRegistered | (not . null) (nick client)]
+ where
+ client = clients IntMap.! clID
+ parsedProto = fromMaybe 0 (maybeRead protoNum :: Maybe Word16)
- if passwd == webPassword cl then
- return $ JoinLobby : [AnswerClients [sendChan cl] ["ADMIN_ACCESS"] | isAdministrator cl]
- else
- return [ByeClient "Authentication failed"]
-{-
+handleCmd_NotEntered clID clients _ ["PASSWORD", passwd] =
+ if passwd == webPassword client then
+ [ModifyClient (\cl -> cl{logonPassed = True}),
+ MoveToLobby] ++ adminNotice
+ else
+ [ByeClient "Authentication failed"]
+ where
+ client = clients IntMap.! clID
+ adminNotice = [AnswerThisClient ["ADMIN_ACCESS"] | isAdministrator client]
+
handleCmd_NotEntered clID clients _ ["DUMP"] =
if isAdministrator (clients IntMap.! clID) then [Dump] else []
--}
+
-handleCmd_NotEntered _ = return [ProtocolError "Incorrect command (state: not entered)"]
+handleCmd_NotEntered clID _ _ _ = [ProtocolError "Incorrect command (state: not entered)"]
--- a/gameServer/HandlerUtils.hs Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,45 +0,0 @@
-module HandlerUtils where
-
-import Control.Monad.Reader
-import qualified Data.ByteString.Char8 as B
-
-import RoomsAndClients
-import CoreTypes
-import Actions
-
-thisClient :: Reader (ClientIndex, IRnC) ClientInfo
-thisClient = do
- (ci, rnc) <- ask
- return $ rnc `client` ci
-
-thisRoom :: Reader (ClientIndex, IRnC) RoomInfo
-thisRoom = do
- (ci, rnc) <- ask
- let ri = clientRoom rnc ci
- return $ rnc `room` ri
-
-clientNick :: Reader (ClientIndex, IRnC) B.ByteString
-clientNick = liftM nick thisClient
-
-roomOthersChans :: Reader (ClientIndex, IRnC) [ClientChan]
-roomOthersChans = do
- (ci, rnc) <- ask
- let ri = clientRoom rnc ci
- return $ map (sendChan . client rnc) $ filter (/= ci) (roomClients rnc ri)
-
-roomClientsChans :: Reader (ClientIndex, IRnC) [ClientChan]
-roomClientsChans = do
- (ci, rnc) <- ask
- let ri = clientRoom rnc ci
- return $ map (sendChan . client rnc) (roomClients rnc ri)
-
-thisClientChans :: Reader (ClientIndex, IRnC) [ClientChan]
-thisClientChans = do
- (ci, rnc) <- ask
- return $ [sendChan (rnc `client` ci)]
-
-answerClient :: [B.ByteString] -> Reader (ClientIndex, IRnC) [Action]
-answerClient msg = thisClientChans >>= return . (: []) . flip AnswerClients msg
-
-allRoomInfos :: Reader (a, IRnC) [RoomInfo]
-allRoomInfos = liftM ((\irnc -> map (room irnc) $ allRooms irnc) . snd) ask
--- a/gameServer/NetRoutines.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/NetRoutines.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,41 +1,46 @@
-{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
module NetRoutines where
+import Network
import Network.Socket
import System.IO
+import Control.Concurrent
import Control.Concurrent.Chan
+import Control.Concurrent.STM
import qualified Control.Exception as Exception
import Data.Time
-import Control.Monad
-----------------------------
import CoreTypes
+import ClientIO
import Utils
-import RoomsAndClients
-acceptLoop :: Socket -> Chan CoreMessage -> IO ()
-acceptLoop servSock chan = forever $ do
+acceptLoop :: Socket -> Chan CoreMessage -> Int -> IO ()
+acceptLoop servSock coreChan clientCounter = do
Exception.handle
(\(_ :: Exception.IOException) -> putStrLn "exception on connect") $
do
- (sock, sockAddr) <- Network.Socket.accept servSock
+ (socket, sockAddr) <- Network.Socket.accept servSock
+ cHandle <- socketToHandle socket ReadWriteMode
+ hSetBuffering cHandle LineBuffering
clientHost <- sockAddr2String sockAddr
currentTime <- getCurrentTime
-
- sendChan' <- newChan
+
+ sendChan <- newChan
let newClient =
(ClientInfo
- sendChan'
- sock
+ nextID
+ sendChan
+ cHandle
clientHost
currentTime
""
""
False
0
- lobbyId
+ 0
0
False
False
@@ -44,5 +49,12 @@
undefined
)
- writeChan chan $ Accept newClient
+ writeChan coreChan $ Accept newClient
+
+ forkIO $ clientRecvLoop cHandle coreChan nextID
+ forkIO $ clientSendLoop cHandle coreChan sendChan nextID
return ()
+
+ acceptLoop servSock coreChan nextID
+ where
+ nextID = clientCounter + 1
--- a/gameServer/OfficialServer/DBInteraction.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/OfficialServer/DBInteraction.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,4 +1,4 @@
-{-# LANGUAGE CPP, ScopedTypeVariables, OverloadedStrings #-}
+{-# LANGUAGE CPP, ScopedTypeVariables #-}
module OfficialServer.DBInteraction
(
startDBConnection
@@ -20,7 +20,7 @@
localAddressList = ["127.0.0.1", "0:0:0:0:0:0:0:1", "0:0:0:0:0:ffff:7f00:1"]
-fakeDbConnection serverInfo = forever $ do
+fakeDbConnection serverInfo = do
q <- readChan $ dbQueries serverInfo
case q of
CheckAccount clUid _ clHost -> do
@@ -29,6 +29,8 @@
ClearCache -> return ()
SendStats {} -> return ()
+ fakeDbConnection serverInfo
+
#if defined(OFFICIAL_SERVER)
pipeDbConnectionLoop queries coreChan hIn hOut accountsCache =
--- a/gameServer/OfficialServer/extdbinterface.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/OfficialServer/extdbinterface.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,4 +1,4 @@
-{-# LANGUAGE ScopedTypeVariables, OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
module Main where
@@ -26,7 +26,7 @@
case q of
CheckAccount clUid clNick _ -> do
statement <- prepare dbConn dbQueryAccount
- execute statement [SqlByteString $ clNick]
+ execute statement [SqlString $ clNick]
passAndRole <- fetchRow statement
finish statement
let response =
@@ -47,7 +47,7 @@
dbConnectionLoop mySQLConnectionInfo =
- Control.Exception.handle (\(e :: IOException) -> hPutStrLn stderr $ show e) $ handleSqlError $
+ Control.Exception.handle (\(_ :: IOException) -> return ()) $ handleSqlError $
bracket
(connectMySQL mySQLConnectionInfo)
(disconnect)
--- a/gameServer/Opts.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/Opts.hs Thu Dec 23 11:13:57 2010 -0500
@@ -3,12 +3,10 @@
getOpts,
) where
-import System.Environment
+import System.Environment ( getArgs )
import System.Console.GetOpt
import Network
import Data.Maybe ( fromMaybe )
-import qualified Data.ByteString.Char8 as B
-
import CoreTypes
import Utils
@@ -32,9 +30,9 @@
where
readDedicated = fromMaybe True (maybeRead str :: Maybe Bool)
-readDbLogin str opts = opts{dbLogin = B.pack str}
-readDbPassword str opts = opts{dbPassword = B.pack str}
-readDbHost str opts = opts{dbHost = B.pack str}
+readDbLogin str opts = opts{dbLogin = str}
+readDbPassword str opts = opts{dbPassword = str}
+readDbHost str opts = opts{dbHost = str}
getOpts :: ServerInfo -> IO ServerInfo
getOpts opts = do
--- a/gameServer/RoomsAndClients.hs Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,196 +0,0 @@
-module RoomsAndClients(
- RoomIndex(),
- ClientIndex(),
- MRoomsAndClients(),
- IRoomsAndClients(),
- newRoomsAndClients,
- addRoom,
- addClient,
- removeRoom,
- removeClient,
- modifyRoom,
- modifyClient,
- lobbyId,
- moveClientToLobby,
- moveClientToRoom,
- clientRoomM,
- clientExists,
- client,
- room,
- client'sM,
- room'sM,
- allClientsM,
- clientsM,
- roomClientsM,
- roomClientsIndicesM,
- withRoomsAndClients,
- allRooms,
- allClients,
- clientRoom,
- showRooms,
- roomClients
- ) where
-
-
-import Store
-import Control.Monad
-
-
-data Room r = Room {
- roomClients' :: [ClientIndex],
- room' :: r
- }
-
-
-data Client c = Client {
- clientRoom' :: RoomIndex,
- client' :: c
- }
-
-
-newtype RoomIndex = RoomIndex ElemIndex
- deriving (Eq)
-newtype ClientIndex = ClientIndex ElemIndex
- deriving (Eq, Show, Read, Ord)
-
-instance Show RoomIndex where
- show (RoomIndex i) = 'r' : show i
-
-unRoomIndex :: RoomIndex -> ElemIndex
-unRoomIndex (RoomIndex r) = r
-
-unClientIndex :: ClientIndex -> ElemIndex
-unClientIndex (ClientIndex c) = c
-
-
-newtype MRoomsAndClients r c = MRoomsAndClients (MStore (Room r), MStore (Client c))
-newtype IRoomsAndClients r c = IRoomsAndClients (IStore (Room r), IStore (Client c))
-
-
-lobbyId :: RoomIndex
-lobbyId = RoomIndex firstIndex
-
-
-newRoomsAndClients :: r -> IO (MRoomsAndClients r c)
-newRoomsAndClients r = do
- rooms <- newStore
- clients <- newStore
- let rnc = MRoomsAndClients (rooms, clients)
- ri <- addRoom rnc r
- when (ri /= lobbyId) $ error "Empty struct inserts not at firstIndex index"
- return rnc
-
-
-roomAddClient :: ClientIndex -> Room r -> Room r
-roomAddClient cl room = let cls = cl : roomClients' room; nr = room{roomClients' = cls} in cls `seq` nr `seq` nr
-
-roomRemoveClient :: ClientIndex -> Room r -> Room r
-roomRemoveClient cl room = let cls = filter (/= cl) $ roomClients' room; nr = room{roomClients' = cls} in cls `seq` nr `seq` nr
-
-
-addRoom :: MRoomsAndClients r c -> r -> IO RoomIndex
-addRoom (MRoomsAndClients (rooms, _)) room = do
- i <- addElem rooms (Room [] room)
- return $ RoomIndex i
-
-
-addClient :: MRoomsAndClients r c -> c -> IO ClientIndex
-addClient (MRoomsAndClients (rooms, clients)) client = do
- i <- addElem clients (Client lobbyId client)
- modifyElem rooms (roomAddClient (ClientIndex i)) (unRoomIndex lobbyId)
- return $ ClientIndex i
-
-removeRoom :: MRoomsAndClients r c -> RoomIndex -> IO ()
-removeRoom rnc@(MRoomsAndClients (rooms, _)) room@(RoomIndex ri)
- | room == lobbyId = error "Cannot delete lobby"
- | otherwise = do
- clIds <- liftM roomClients' $ readElem rooms ri
- forM_ clIds (moveClientToLobby rnc)
- removeElem rooms ri
-
-
-removeClient :: MRoomsAndClients r c -> ClientIndex -> IO ()
-removeClient (MRoomsAndClients (rooms, clients)) cl@(ClientIndex ci) = do
- RoomIndex ri <- liftM clientRoom' $ readElem clients ci
- modifyElem rooms (roomRemoveClient cl) ri
- removeElem clients ci
-
-
-modifyRoom :: MRoomsAndClients r c -> (r -> r) -> RoomIndex -> IO ()
-modifyRoom (MRoomsAndClients (rooms, _)) f (RoomIndex ri) = modifyElem rooms (\r -> r{room' = f $ room' r}) ri
-
-modifyClient :: MRoomsAndClients r c -> (c -> c) -> ClientIndex -> IO ()
-modifyClient (MRoomsAndClients (_, clients)) f (ClientIndex ci) = modifyElem clients (\c -> c{client' = f $ client' c}) ci
-
-moveClientInRooms :: MRoomsAndClients r c -> RoomIndex -> RoomIndex -> ClientIndex -> IO ()
-moveClientInRooms (MRoomsAndClients (rooms, clients)) (RoomIndex riFrom) rt@(RoomIndex riTo) cl@(ClientIndex ci) = do
- modifyElem rooms (roomRemoveClient cl) riFrom
- modifyElem rooms (roomAddClient cl) riTo
- modifyElem clients (\c -> c{clientRoom' = rt}) ci
-
-
-moveClientToLobby :: MRoomsAndClients r c -> ClientIndex -> IO ()
-moveClientToLobby rnc ci = do
- room <- clientRoomM rnc ci
- moveClientInRooms rnc room lobbyId ci
-
-
-moveClientToRoom :: MRoomsAndClients r c -> RoomIndex -> ClientIndex -> IO ()
-moveClientToRoom rnc ri ci = moveClientInRooms rnc lobbyId ri ci
-
-
-clientExists :: MRoomsAndClients r c -> ClientIndex -> IO Bool
-clientExists (MRoomsAndClients (_, clients)) (ClientIndex ci) = elemExists clients ci
-
-clientRoomM :: MRoomsAndClients r c -> ClientIndex -> IO RoomIndex
-clientRoomM (MRoomsAndClients (_, clients)) (ClientIndex ci) = liftM clientRoom' (clients `readElem` ci)
-
-client'sM :: MRoomsAndClients r c -> (c -> a) -> ClientIndex -> IO a
-client'sM (MRoomsAndClients (_, clients)) f (ClientIndex ci) = liftM (f . client') (clients `readElem` ci)
-
-room'sM :: MRoomsAndClients r c -> (r -> a) -> RoomIndex -> IO a
-room'sM (MRoomsAndClients (rooms, _)) f (RoomIndex ri) = liftM (f . room') (rooms `readElem` ri)
-
-allClientsM :: MRoomsAndClients r c -> IO [ClientIndex]
-allClientsM (MRoomsAndClients (_, clients)) = liftM (map ClientIndex) $ indicesM clients
-
-clientsM :: MRoomsAndClients r c -> IO [c]
-clientsM (MRoomsAndClients (_, clients)) = indicesM clients >>= mapM (\ci -> liftM client' $ readElem clients ci)
-
-roomClientsIndicesM :: MRoomsAndClients r c -> RoomIndex -> IO [ClientIndex]
-roomClientsIndicesM (MRoomsAndClients (rooms, clients)) (RoomIndex ri) = liftM roomClients' (rooms `readElem` ri)
-
-roomClientsM :: MRoomsAndClients r c -> RoomIndex -> IO [c]
-roomClientsM (MRoomsAndClients (rooms, clients)) (RoomIndex ri) = liftM roomClients' (rooms `readElem` ri) >>= mapM (\(ClientIndex ci) -> liftM client' $ readElem clients ci)
-
-withRoomsAndClients :: MRoomsAndClients r c -> (IRoomsAndClients r c -> a) -> IO a
-withRoomsAndClients (MRoomsAndClients (rooms, clients)) f =
- withIStore2 rooms clients (\r c -> f $ IRoomsAndClients (r, c))
-
-----------------------------------------
------------ IRoomsAndClients -----------
-
-showRooms :: (Show r, Show c) => IRoomsAndClients r c -> String
-showRooms rnc@(IRoomsAndClients (rooms, clients)) = concatMap showRoom (allRooms rnc)
- where
- showRoom r = unlines $ ((show r) ++ ": " ++ (show $ room' $ rooms ! (unRoomIndex r))) : (map showClient (roomClients' $ rooms ! (unRoomIndex r)))
- showClient c = " " ++ (show c) ++ ": " ++ (show $ client' $ clients ! (unClientIndex c))
-
-
-allRooms :: IRoomsAndClients r c -> [RoomIndex]
-allRooms (IRoomsAndClients (rooms, _)) = map RoomIndex $ indices rooms
-
-allClients :: IRoomsAndClients r c -> [ClientIndex]
-allClients (IRoomsAndClients (_, clients)) = map ClientIndex $ indices clients
-
-clientRoom :: IRoomsAndClients r c -> ClientIndex -> RoomIndex
-clientRoom (IRoomsAndClients (_, clients)) (ClientIndex ci) = clientRoom' (clients ! ci)
-
-client :: IRoomsAndClients r c -> ClientIndex -> c
-client (IRoomsAndClients (_, clients)) (ClientIndex ci) = client' (clients ! ci)
-
-room :: IRoomsAndClients r c -> RoomIndex -> r
-room (IRoomsAndClients (rooms, _)) (RoomIndex ri) = room' (rooms ! ri)
-
-roomClients :: IRoomsAndClients r c -> RoomIndex -> [ClientIndex]
-roomClients (IRoomsAndClients (rooms, _)) (RoomIndex ri) = roomClients' $ (rooms ! ri)
--- a/gameServer/ServerCore.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/ServerCore.hs Thu Dec 23 11:13:57 2010 -0500
@@ -2,75 +2,69 @@
import Network
import Control.Concurrent
+import Control.Concurrent.STM
import Control.Concurrent.Chan
import Control.Monad
import qualified Data.IntMap as IntMap
import System.Log.Logger
-import Control.Monad.Reader
-import Control.Monad.State.Strict
-import Data.Set as Set
-import qualified Data.ByteString.Char8 as B
--------------------------------------
import CoreTypes
import NetRoutines
+import Utils
import HWProtoCore
import Actions
import OfficialServer.DBInteraction
-import ServerState
-
-
-timerLoop :: Int -> Chan CoreMessage -> IO ()
-timerLoop tick messagesChan = threadDelay (30 * 10^6) >> writeChan messagesChan (TimerAction tick) >> timerLoop (tick + 1) messagesChan
-reactCmd :: [B.ByteString] -> StateT ServerState IO ()
-reactCmd cmd = do
- (Just ci) <- gets clientIndex
- rnc <- gets roomsClients
- actions <- liftIO $ withRoomsAndClients rnc (\irnc -> runReader (handleCmd cmd) (ci, irnc))
- forM_ actions processAction
+timerLoop :: Int -> Chan CoreMessage -> IO()
+timerLoop tick messagesChan = threadDelay (30 * 10^6) >> writeChan messagesChan (TimerAction tick) >> timerLoop (tick + 1) messagesChan
+
+firstAway (_, a, b, c) = (a, b, c)
+
+reactCmd :: ServerInfo -> Int -> [String] -> Clients -> Rooms -> IO (ServerInfo, Clients, Rooms)
+reactCmd serverInfo clID cmd clients rooms =
+ liftM firstAway $ foldM processAction (clID, serverInfo, clients, rooms) $ handleCmd clID clients rooms cmd
-mainLoop :: StateT ServerState IO ()
-mainLoop = forever $ do
- get >>= \s -> put $! s
-
- si <- gets serverInfo
- r <- liftIO $ readChan $ coreChan si
-
- case r of
- Accept ci -> processAction (AddClient ci)
-
- ClientMessage (ci, cmd) -> do
- liftIO $ debugM "Clients" $ (show ci) ++ ": " ++ (show cmd)
+mainLoop :: ServerInfo -> Clients -> Rooms -> IO ()
+mainLoop serverInfo clients rooms = do
+ r <- readChan $ coreChan serverInfo
+
+ (newServerInfo, mClients, mRooms) <-
+ case r of
+ Accept ci ->
+ liftM firstAway $ processAction
+ (clientUID ci, serverInfo, clients, rooms) (AddClient ci)
- removed <- gets removedClients
- when (not $ ci `Set.member` removed) $ do
- as <- get
- put $! as{clientIndex = Just ci}
- reactCmd cmd
-
- Remove ci -> do
- liftIO $ debugM "Clients" $ "DeleteClient: " ++ show ci
- processAction (DeleteClient ci)
+ ClientMessage (clID, cmd) -> do
+ debugM "Clients" $ (show clID) ++ ": " ++ (show cmd)
+ if clID `IntMap.member` clients then
+ reactCmd serverInfo clID cmd clients rooms
+ else
+ do
+ debugM "Clients" "Message from dead client"
+ return (serverInfo, clients, rooms)
- --else
- --do
- --debugM "Clients" "Message from dead client"
- --return (serverInfo, rnc)
+ ClientAccountInfo (clID, info) ->
+ if clID `IntMap.member` clients then
+ liftM firstAway $ processAction
+ (clID, serverInfo, clients, rooms)
+ (ProcessAccountInfo info)
+ else
+ do
+ debugM "Clients" "Got info for dead client"
+ return (serverInfo, clients, rooms)
- ClientAccountInfo (ci, info) -> do
- rnc <- gets roomsClients
- exists <- liftIO $ clientExists rnc ci
- when (exists) $ do
- as <- get
- put $! as{clientIndex = Just ci}
- processAction (ProcessAccountInfo info)
- return ()
+ TimerAction tick ->
+ liftM firstAway $
+ foldM processAction (0, serverInfo, clients, rooms) $
+ PingAll : [StatsAction | even tick]
+
- TimerAction tick ->
- mapM_ processAction $
- PingAll : [StatsAction | even tick]
+ {- let hadRooms = (not $ null rooms) && (null mrooms)
+ in unless ((not $ isDedicated serverInfo) && ((null clientsIn) || hadRooms)) $
+ mainLoop serverInfo acceptChan messagesChan clientsIn mrooms -}
+ mainLoop newServerInfo mClients mRooms
startServer :: ServerInfo -> Socket -> IO ()
startServer serverInfo serverSocket = do
@@ -80,15 +74,14 @@
acceptLoop
serverSocket
(coreChan serverInfo)
+ 0
return ()
-
- --forkIO $ timerLoop 0 $ coreChan serverInfo
+
+ forkIO $ timerLoop 0 $ coreChan serverInfo
startDBConnection serverInfo
- rnc <- newRoomsAndClients newRoom
+ forkIO $ mainLoop serverInfo IntMap.empty (IntMap.singleton 0 newRoom)
- forkIO $ evalStateT mainLoop (ServerState Nothing serverInfo Set.empty rnc)
-
- forever $ threadDelay (60 * 60 * 10^6)
+ forever $ threadDelay (60 * 60 * 10^6) >> putStrLn "***"
\ No newline at end of file
--- a/gameServer/ServerState.hs Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,43 +0,0 @@
-module ServerState
- (
- module RoomsAndClients,
- clientRoomA,
- ServerState(..),
- client's,
- allClientsS,
- roomClientsS
- ) where
-
-import Control.Monad.State.Strict
-import Data.Set as Set
-----------------------
-import RoomsAndClients
-import CoreTypes
-
-data ServerState = ServerState {
- clientIndex :: !(Maybe ClientIndex),
- serverInfo :: !ServerInfo,
- removedClients :: !(Set.Set ClientIndex),
- roomsClients :: !MRnC
- }
-
-
-clientRoomA :: StateT ServerState IO RoomIndex
-clientRoomA = do
- (Just ci) <- gets clientIndex
- rnc <- gets roomsClients
- liftIO $ clientRoomM rnc ci
-
-client's :: (ClientInfo -> a) -> StateT ServerState IO a
-client's f = do
- (Just ci) <- gets clientIndex
- rnc <- gets roomsClients
- liftIO $ client'sM rnc f ci
-
-allClientsS :: StateT ServerState IO [ClientInfo]
-allClientsS = gets roomsClients >>= liftIO . clientsM
-
-roomClientsS :: RoomIndex -> StateT ServerState IO [ClientInfo]
-roomClientsS ri = do
- rnc <- gets roomsClients
- liftIO $ roomClientsM rnc ri
--- a/gameServer/Store.hs Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,145 +0,0 @@
-module Store(
- ElemIndex(),
- MStore(),
- IStore(),
- newStore,
- addElem,
- removeElem,
- readElem,
- writeElem,
- modifyElem,
- elemExists,
- firstIndex,
- indicesM,
- withIStore,
- withIStore2,
- (!),
- indices
- ) where
-
-import qualified Data.Array.IArray as IA
-import qualified Data.Array.IO as IOA
-import qualified Data.IntSet as IntSet
-import Data.IORef
-import Control.Monad
-
-
-newtype ElemIndex = ElemIndex Int
- deriving (Eq, Show, Read, Ord)
-newtype MStore e = MStore (IORef (IntSet.IntSet, IntSet.IntSet, IOA.IOArray Int e))
-newtype IStore e = IStore (IntSet.IntSet, IA.Array Int e)
-
-
-firstIndex :: ElemIndex
-firstIndex = ElemIndex 0
-
--- MStore code
-initialSize :: Int
-initialSize = 10
-
-
-growFunc :: Int -> Int
-growFunc a = a * 3 `div` 2
-
-
-newStore :: IO (MStore e)
-newStore = do
- newar <- IOA.newArray_ (0, initialSize - 1)
- new <- newIORef (IntSet.empty, IntSet.fromAscList [0..initialSize - 1], newar)
- return (MStore new)
-
-
-growStore :: MStore e -> IO ()
-growStore (MStore ref) = do
- (busyElems, freeElems, arr) <- readIORef ref
- (_, m') <- IOA.getBounds arr
- let newM' = growFunc (m' + 1) - 1
- newArr <- IOA.newArray_ (0, newM')
- sequence_ [IOA.readArray arr i >>= IOA.writeArray newArr i | i <- [0..m']]
- writeIORef ref (busyElems, freeElems `IntSet.union` (IntSet.fromAscList [m'+1..newM']), newArr)
-
-
-growIfNeeded :: MStore e -> IO ()
-growIfNeeded m@(MStore ref) = do
- (_, freeElems, _) <- readIORef ref
- when (IntSet.null freeElems) $ growStore m
-
-
-addElem :: MStore e -> e -> IO ElemIndex
-addElem m@(MStore ref) element = do
- growIfNeeded m
- (busyElems, freeElems, arr) <- readIORef ref
- let (n, freeElems') = IntSet.deleteFindMin freeElems
- IOA.writeArray arr n element
- writeIORef ref (IntSet.insert n busyElems, freeElems', arr)
- return $ ElemIndex n
-
-
-removeElem :: MStore e -> ElemIndex -> IO ()
-removeElem (MStore ref) (ElemIndex n) = do
- (busyElems, freeElems, arr) <- readIORef ref
- IOA.writeArray arr n (error $ "Store: no element " ++ show n)
- writeIORef ref (IntSet.delete n busyElems, IntSet.insert n freeElems, arr)
-
-
-readElem :: MStore e -> ElemIndex -> IO e
-readElem (MStore ref) (ElemIndex n) = readIORef ref >>= \(_, _, arr) -> IOA.readArray arr n
-
-
-writeElem :: MStore e -> ElemIndex -> e -> IO ()
-writeElem (MStore ref) (ElemIndex n) el = readIORef ref >>= \(_, _, arr) -> IOA.writeArray arr n el
-
-
-modifyElem :: MStore e -> (e -> e) -> ElemIndex -> IO ()
-modifyElem (MStore ref) f (ElemIndex n) = do
- (_, _, arr) <- readIORef ref
- IOA.readArray arr n >>= IOA.writeArray arr n . f
-
-elemExists :: MStore e -> ElemIndex -> IO Bool
-elemExists (MStore ref) (ElemIndex n) = do
- (_, free, _) <- readIORef ref
- return $ n `IntSet.notMember` free
-
-indicesM :: MStore e -> IO [ElemIndex]
-indicesM (MStore ref) = do
- (busy, _, _) <- readIORef ref
- return $ map ElemIndex $ IntSet.toList busy
-
-
--- A way to see MStore elements in pure code via IStore
-m2i :: MStore e -> IO (IStore e)
-m2i (MStore ref) = do
- (a, _, c') <- readIORef ref
- c <- IOA.unsafeFreeze c'
- return $ IStore (a, c)
-
-i2m :: (MStore e) -> IStore e -> IO ()
-i2m (MStore ref) (IStore (_, arr)) = do
- (b, e, _) <- readIORef ref
- a <- IOA.unsafeThaw arr
- writeIORef ref (b, e, a)
-
-withIStore :: MStore e -> (IStore e -> a) -> IO a
-withIStore m f = do
- i <- m2i m
- let res = f i
- res `seq` i2m m i
- return res
-
-
-withIStore2 :: MStore e1 -> MStore e2 -> (IStore e1 -> IStore e2 -> a) -> IO a
-withIStore2 m1 m2 f = do
- i1 <- m2i m1
- i2 <- m2i m2
- let res = f i1 i2
- res `seq` i2m m1 i1
- i2m m2 i2
- return res
-
-
--- IStore code
-(!) :: IStore e -> ElemIndex -> e
-(!) (IStore (_, arr)) (ElemIndex i) = (IA.!) arr i
-
-indices :: IStore e -> [ElemIndex]
-indices (IStore (busy, _)) = map ElemIndex $ IntSet.toList busy
--- a/gameServer/Utils.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/Utils.hs Thu Dec 23 11:13:57 2010 -0500
@@ -1,4 +1,3 @@
-{-# LANGUAGE OverloadedStrings #-}
module Utils where
import Control.Concurrent
@@ -17,34 +16,37 @@
import Data.Maybe
-------------------------------------------------
import qualified Codec.Binary.Base64 as Base64
-import qualified Data.ByteString.Char8 as B
-import qualified Data.ByteString as BW
+import qualified Data.ByteString.UTF8 as BUTF8
+import qualified Data.ByteString as B
import CoreTypes
-sockAddr2String :: SockAddr -> IO B.ByteString
-sockAddr2String (SockAddrInet _ hostAddr) = liftM B.pack $ inet_ntoa hostAddr
+sockAddr2String :: SockAddr -> IO String
+sockAddr2String (SockAddrInet _ hostAddr) = inet_ntoa hostAddr
sockAddr2String (SockAddrInet6 _ _ (a, b, c, d) _) =
- return $ B.pack $ (foldr1 (.)
+ return $ (foldr1 (.)
$ List.intersperse (\a -> ':':a)
$ concatMap (\n -> (\(a, b) -> [showHex a, showHex b]) $ divMod n 65536) [a, b, c, d]) []
-toEngineMsg :: B.ByteString -> B.ByteString
-toEngineMsg msg = B.pack $ Base64.encode (fromIntegral (BW.length msg) : (BW.unpack msg))
+toEngineMsg :: String -> String
+toEngineMsg msg = Base64.encode (fromIntegral (B.length encodedMsg) : (B.unpack encodedMsg))
+ where
+ encodedMsg = BUTF8.fromString msg
-fromEngineMsg :: B.ByteString -> Maybe B.ByteString
-fromEngineMsg msg = Base64.decode (B.unpack msg) >>= removeLength >>= return . BW.pack
+fromEngineMsg :: String -> Maybe String
+fromEngineMsg msg = liftM (map w2c) (Base64.decode msg >>= removeLength)
where
removeLength (x:xs) = if length xs == fromIntegral x then Just xs else Nothing
removeLength _ = Nothing
-checkNetCmd :: B.ByteString -> (Bool, Bool)
-checkNetCmd = check . liftM B.unpack . fromEngineMsg
+checkNetCmd :: String -> (Bool, Bool)
+checkNetCmd msg = check decoded
where
+ decoded = fromEngineMsg msg
check Nothing = (False, False)
check (Just (m:ms)) = (m `Set.member` legalMessages, m == '+')
check _ = (False, False)
- legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sFNpPwtghb12345" ++ slotMessages
+ legalMessages = Set.fromList $ "M#+LlRrUuDdZzAaSjJ,sFNpPwtghbc12345" ++ slotMessages
slotMessages = "\128\129\130\131\132\133\134\135\136\137\138"
maybeRead :: Read a => String -> Maybe a
@@ -52,17 +54,29 @@
[(x, rest)] | all isSpace rest -> Just x
_ -> Nothing
-teamToNet :: TeamInfo -> [B.ByteString]
-teamToNet team =
- "ADD_TEAM"
- : teamname team
- : teamgrave team
- : teamfort team
- : teamvoicepack team
- : teamflag team
- : teamowner team
- : (B.pack $ show $ difficulty team)
- : hhsInfo
+teamToNet :: Word16 -> TeamInfo -> [String]
+teamToNet protocol team
+ | protocol < 30 = [
+ "ADD_TEAM",
+ teamname team,
+ teamgrave team,
+ teamfort team,
+ teamvoicepack team,
+ teamowner team,
+ show $ difficulty team
+ ]
+ ++ hhsInfo
+ | otherwise = [
+ "ADD_TEAM",
+ teamname team,
+ teamgrave team,
+ teamfort team,
+ teamvoicepack team,
+ teamflag team,
+ teamowner team,
+ show $ difficulty team
+ ]
+ ++ hhsInfo
where
hhsInfo = concatMap (\(HedgehogInfo name hat) -> [name, hat]) $ hedgehogs team
@@ -76,10 +90,10 @@
else
t : replaceTeam team teams
-illegalName :: B.ByteString -> Bool
-illegalName = all isSpace . B.unpack
+illegalName :: String -> Bool
+illegalName = all isSpace
-protoNumber2ver :: Word16 -> B.ByteString
+protoNumber2ver :: Word16 -> String
protoNumber2ver 17 = "0.9.7-dev"
protoNumber2ver 19 = "0.9.7"
protoNumber2ver 20 = "0.9.8-dev"
@@ -105,13 +119,3 @@
putStr msg
hFlush stdout
getLine
-
-
-unfoldrE :: (b -> Either b (a, b)) -> b -> ([a], b)
-unfoldrE f b =
- case f b of
- Right (a, new_b) -> let (a', b') = unfoldrE f new_b in (a : a', b')
- Left new_b -> ([], new_b)
-
-showB :: Show a => a -> B.ByteString
-showB = B.pack .show
--- a/gameServer/hedgewars-server.cabal Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,32 +0,0 @@
-Name: hedgewars-server
-Version: 0.1
-Synopsis: hedgewars server
-Description: hedgewars server
-Homepage: http://www.hedgewars.org/
-License: GPL-2
-Author: unC0Rr
-Maintainer: unC0Rr@hedgewars.org
-Category: Game
-Build-type: Simple
-Cabal-version: >=1.2
-
-
-Executable hedgewars-server
- main-is: hedgewars-server.hs
-
- Build-depends:
- base >= 4,
- unix,
- containers,
- array,
- bytestring,
- network-bytestring,
- network,
- time,
- stm,
- mtl,
- dataenc,
- hslogger,
- process
-
- ghc-options: -O2
\ No newline at end of file
--- a/gameServer/hedgewars-server.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/hedgewars-server.hs Thu Dec 23 11:13:57 2010 -0500
@@ -2,15 +2,23 @@
module Main where
-import Network
+import Network.Socket
+import qualified Network
+import Network.BSD
import Control.Concurrent.STM
import Control.Concurrent.Chan
+#if defined(NEW_EXCEPTIONS)
+import qualified Control.OldException as Exception
+#else
import qualified Control.Exception as Exception
+#endif
import System.Log.Logger
-----------------------------------
import Opts
import CoreTypes
+import OfficialServer.DBInteraction
import ServerCore
+import Utils
#if !defined(mingw32_HOST_OS)
@@ -18,12 +26,10 @@
#endif
-setupLoggers :: IO ()
setupLoggers =
updateGlobalLogger "Clients"
(setLevel INFO)
-main :: IO ()
main = withSocketsDo $ do
#if !defined(mingw32_HOST_OS)
installHandler sigPIPE Ignore Nothing;
@@ -32,11 +38,11 @@
setupLoggers
- stats' <- atomically $ newTMVar (StatisticsInfo 0 0)
+ stats <- atomically $ newTMVar (StatisticsInfo 0 0)
dbQueriesChan <- newChan
- coreChan' <- newChan
- serverInfo' <- getOpts $ newServerInfo stats' coreChan' dbQueriesChan
-
+ coreChan <- newChan
+ serverInfo' <- getOpts $ newServerInfo stats coreChan dbQueriesChan
+
#if defined(OFFICIAL_SERVER)
dbHost' <- askFromConsole "DB host: "
dbLogin' <- askFromConsole "login: "
@@ -46,7 +52,14 @@
let serverInfo = serverInfo'
#endif
+
+ proto <- getProtocolNumber "tcp"
Exception.bracket
- (Network.listenOn $ Network.PortNumber $ listenPort serverInfo)
+ (socket AF_INET Stream proto)
sClose
- (startServer serverInfo)
+ (\sock -> do
+ setSocketOption sock ReuseAddr 1
+ bindSocket sock (SockAddrInet (listenPort serverInfo) iNADDR_ANY)
+ listen sock maxListenQueue
+ startServer serverInfo sock
+ )
--- a/gameServer/stresstest.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/stresstest.hs Thu Dec 23 11:13:57 2010 -0500
@@ -6,7 +6,7 @@
import System.IO
import Control.Concurrent
import Network
-import Control.OldException
+import Control.Exception
import Control.Monad
import System.Random
@@ -14,24 +14,24 @@
import System.Posix
#endif
-session1 nick room = ["NICK", nick, "", "PROTO", "32", "", "PING", "", "CHAT", "lobby 1", "", "CREATE_ROOM", room, "", "CHAT", "room 1", "", "QUIT", "creator", ""]
-session2 nick room = ["NICK", nick, "", "PROTO", "32", "", "LIST", "", "JOIN_ROOM", room, "", "CHAT", "room 2", "", "PART", "", "CHAT", "lobby after part", "", "QUIT", "part-quit", ""]
-session3 nick room = ["NICK", nick, "", "PROTO", "32", "", "LIST", "", "JOIN_ROON", room, "", "CHAT", "room 2", "", "QUIT", "quit", ""]
+session1 nick room = ["NICK", nick, "", "PROTO", "24", "", "CHAT", "lobby 1", "", "CREATE", room, "", "CHAT", "room 1", "", "QUIT", "bye-bye", ""]
+session2 nick room = ["NICK", nick, "", "PROTO", "24", "", "LIST", "", "JOIN", room, "", "CHAT", "room 2", "", "PART", "", "CHAT", "lobby after part", "", "QUIT", "bye-bye", ""]
+session3 nick room = ["NICK", nick, "", "PROTO", "24", "", "LIST", "", "JOIN", room, "", "CHAT", "room 2", "", "QUIT", "bye-bye", ""]
emulateSession sock s = do
- mapM_ (\x -> hPutStrLn sock x >> hFlush sock >> randomRIO (30000::Int, 59000) >>= threadDelay) s
+ mapM_ (\x -> hPutStrLn sock x >> hFlush sock >> randomRIO (50000::Int, 90000) >>= threadDelay) s
hFlush sock
threadDelay 225000
-testing = Control.OldException.handle print $ do
+testing = Control.Exception.handle print $ do
putStrLn "Start"
sock <- connectTo "127.0.0.1" (PortNumber 46631)
num1 <- randomRIO (70000::Int, 70100)
num2 <- randomRIO (0::Int, 2)
num3 <- randomRIO (0::Int, 5)
- let nick1 = 'n' : show num1
- let room1 = 'r' : show num2
+ let nick1 = show num1
+ let room1 = show num2
case num2 of
0 -> emulateSession sock $ session1 nick1 room1
1 -> emulateSession sock $ session2 nick1 room1
@@ -40,7 +40,7 @@
putStrLn "Finish"
forks = forever $ do
- delay <- randomRIO (30000::Int, 59000)
+ delay <- randomRIO (10000::Int, 19000)
threadDelay delay
forkIO testing
--- a/gameServer/stresstest2.hs Tue Dec 14 22:32:47 2010 +0100
+++ b/gameServer/stresstest2.hs Thu Dec 23 11:13:57 2010 -0500
@@ -6,7 +6,7 @@
import System.IO
import Control.Concurrent
import Network
-import Control.OldException
+import Control.Exception
import Control.Monad
import System.Random
@@ -14,28 +14,22 @@
import System.Posix
#endif
-session1 nick room = ["NICK", nick, "", "PROTO", "32", ""]
-
-
-
-testing = Control.OldException.handle print $ do
- putStrLn "Start"
+testing = Control.Exception.handle print $ do
+ delay <- randomRIO (100::Int, 300)
+ threadDelay delay
sock <- connectTo "127.0.0.1" (PortNumber 46631)
+ hClose sock
- num1 <- randomRIO (70000::Int, 70100)
- num2 <- randomRIO (0::Int, 2)
- num3 <- randomRIO (0::Int, 5)
- let nick1 = 'n' : show num1
- let room1 = 'r' : show num2
- mapM_ (\x -> hPutStrLn sock x >> hFlush sock >> randomRIO (300::Int, 590) >>= threadDelay) $ session1 nick1 room1
- mapM_ (\x -> hPutStrLn sock x >> hFlush sock) $ concatMap (\x -> ["CHAT_MSG", show x, ""]) [1..]
- hClose sock
- putStrLn "Finish"
-
-forks = testing
+forks i = do
+ delay <- randomRIO (50::Int, 190)
+ if i `mod` 10 == 0 then putStr (show i) else putStr "."
+ hFlush stdout
+ threadDelay delay
+ forkIO testing
+ forks (i + 1)
main = withSocketsDo $ do
#if !defined(mingw32_HOST_OS)
installHandler sigPIPE Ignore Nothing;
#endif
- forks
+ forks 1
--- a/gameServer/stresstest3.hs Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-{-# LANGUAGE CPP #-}
-
-module Main where
-
-import IO
-import System.IO
-import Control.Concurrent
-import Network
-import Control.OldException
-import Control.Monad
-import System.Random
-import Control.Monad.State
-import Data.List
-
-#if !defined(mingw32_HOST_OS)
-import System.Posix
-#endif
-
-type SState = Handle
-io = liftIO
-
-readPacket :: StateT SState IO [String]
-readPacket = do
- h <- get
- p <- io $ hGetPacket h []
- return p
- where
- hGetPacket h buf = do
- l <- hGetLine h
- if (not $ null l) then hGetPacket h (buf ++ [l]) else return buf
-
-waitPacket :: String -> StateT SState IO Bool
-waitPacket s = do
- p <- readPacket
- return $ head p == s
-
-sendPacket :: [String] -> StateT SState IO ()
-sendPacket s = do
- h <- get
- io $ do
- mapM_ (hPutStrLn h) s
- hPutStrLn h ""
- hFlush h
-
-emulateSession :: StateT SState IO ()
-emulateSession = do
- n <- io $ randomRIO (100000::Int, 100100)
- waitPacket "CONNECTED"
- sendPacket ["NICK", "test" ++ (show n)]
- waitPacket "NICK"
- sendPacket ["PROTO", "31"]
- waitPacket "PROTO"
- b <- waitPacket "LOBBY:JOINED"
- --io $ print b
- sendPacket ["QUIT", "BYE"]
- return ()
-
-testing = Control.OldException.handle print $ do
- putStr "+"
- sock <- connectTo "127.0.0.1" (PortNumber 46631)
- evalStateT emulateSession sock
- --hClose sock
- putStr "-"
- hFlush stdout
-
-forks = forM_ [1..100] $ const $ do
- delay <- randomRIO (10000::Int, 30000)
- threadDelay delay
- forkIO testing
-
-main = withSocketsDo $ do
-#if !defined(mingw32_HOST_OS)
- installHandler sigPIPE Ignore Nothing;
-#endif
- forks
--- a/hedgewars/GSHandlers.inc Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/GSHandlers.inc Thu Dec 23 11:13:57 2010 -0500
@@ -28,32 +28,32 @@
// Gear is still on the same Pixel it was before
if steps < 1 then
- begin
+ begin
if onlyCheckIfChanged then
- begin
+ begin
Gear^.X := Gear^.X + dX;
Gear^.Y := Gear^.Y + dY;
EXIT;
- end
+ end
else
steps := 1;
- end;
+ end;
if steps > 1 then
- begin
+ begin
sX:= dX / steps;
sY:= dY / steps;
- end
+ end
else
- begin
+ begin
sX:= dX;
sY:= dY;
- end;
+ end;
caller:= Gear^.doStep;
for i:= 1 to steps do
- begin
+ begin
Gear^.X := Gear^.X + sX;
Gear^.Y := Gear^.Y + sY;
step(Gear);
@@ -61,7 +61,7 @@
or ((Gear^.State and gstCollision) <> 0)
or ((Gear^.State and gstMoving) = 0) then
break;
- end;
+ end;
end;
procedure makeHogsWorry(x, y: hwFloat; r: LongInt);
@@ -71,27 +71,27 @@
begin
gi := GearsList;
while gi <> nil do
- begin
+ begin
if (gi^.Kind = gtHedgehog) then
- begin
+ begin
d := r - hwRound(Distance(gi^.X - x, gi^.Y - y));
if (d > 1) and not gi^.Invulnerable and (GetRandom(2) = 0) then
- begin
+ begin
if (CurrentHedgehog^.Gear = gi) then
PlaySound(sndOops, gi^.Hedgehog^.Team^.voicepack)
else
- begin
+ begin
if (gi^.State and gstMoving) = 0 then
gi^.State := gi^.State or gstLoser;
if d > r div 2 then
PlaySound(sndNooo, gi^.Hedgehog^.Team^.voicepack)
else
PlaySound(sndUhOh, gi^.Hedgehog^.Team^.voicepack);
+ end;
end;
end;
+ gi := gi^.NextGear
end;
- gi := gi^.NextGear
- end;
end;
////////////////////////////////////////////////////////////////////////////////
procedure doStepDrowningGear(Gear: PGear);
@@ -107,28 +107,29 @@
isSubmersible:= (Gear = CurrentHedgehog^.Gear) and (CurAmmoGear <> nil) and (CurAmmoGear^.AmmoType = amJetpack);
// probably needs tweaking. might need to be in a case statement based upon gear type
if cWaterLine < hwRound(Gear^.Y) + Gear^.Radius then
- begin
+ begin
skipSpeed := _0_25;
skipAngle := _1_9;
skipDecay := _0_87;
// this could perhaps be a tiny bit higher.
if (hwSqr(Gear^.dX) + hwSqr(Gear^.dY) > skipSpeed) and
(hwAbs(Gear^.dX) > skipAngle * hwAbs(Gear^.dY)) then
- begin
+ begin
Gear^.dY.isNegative := true;
Gear^.dY := Gear^.dY * skipDecay;
Gear^.dX := Gear^.dX * skipDecay;
CheckGearDrowning := false;
PlaySound(sndSkip)
- end
+ end
else
- begin
+ begin
if not isSubmersible then
- begin
+ begin
CheckGearDrowning := true;
Gear^.State := gstDrowning;
Gear^.RenderTimer := false;
- if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) and (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then
+ if (Gear^.Kind <> gtSniperRifleShot) and (Gear^.Kind <> gtShotgunShot) and
+ (Gear^.Kind <> gtDEagleShot) and (Gear^.Kind <> gtSineGunShot) then
if Gear^.Kind = gtHedgehog then
begin
if Gear^.Hedgehog^.Effects[heResurrectable] then
@@ -152,21 +153,21 @@
if ((cReducedQuality and rqPlainSplash) = 0) and
(((not isSubmersible) and (hwRound(Gear^.Y) < cWaterLine + 64 + Gear^.Radius)) or
(isSubmersible and (hwRound(Gear^.Y) < cWaterLine + 2 + Gear^.Radius) and ((CurAmmoGear^.Pos = 0) and (CurAmmoGear^.dY < _0_01)))) then
- begin
+ begin
AddVisualGear(hwRound(Gear^.X), cWaterLine, vgtSplash);
maxDrops := (Gear^.Radius div 2) + hwRound(Gear^.dX * Gear^.Radius * 2) + hwRound(Gear^.
dY * Gear^.Radius * 2);
for i:= max(maxDrops div 3, min(32, Random(maxDrops))) downto 0 do
- begin
+ begin
particle := AddVisualGear(hwRound(Gear^.X) - 3 + Random(6), cWaterLine, vgtDroplet);
if particle <> nil then
- begin
+ begin
particle^.dX := particle^.dX - (Gear^.dX.QWordValue / 42949672960);
particle^.dY := particle^.dY - (Gear^.dY.QWordValue / 21474836480)
+ end
end
- end
- end;
+ end;
if isSubmersible and (CurAmmoGear^.Pos = 0) then CurAmmoGear^.Pos := 1000
end
else
@@ -188,17 +189,16 @@
particle: PVisualGear;
begin
if _0_4 < Gear^.dY then
- begin
+ begin
dmg := ModifyDamage(1 + hwRound((hwAbs(Gear^.dY) - _0_4) * 70), Gear);
PlaySound(sndBump);
if dmg < 1 then exit;
for i:= min(12, (3 + dmg div 10)) downto 0 do
- begin
- particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12,
- vgtDust);
+ begin
+ particle := AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480);
- end;
+ end;
if (Gear^.Invulnerable) then exit;
@@ -267,60 +267,60 @@
if (hwRound(Gear^.X) < LAND_WIDTH div -2) or (hwRound(Gear^.X) > LAND_WIDTH * 3 div 2) then Gear^.State := Gear^.State or gstCollision;
if Gear^.dY.isNegative then
- begin
+ begin
isFalling := true;
if TestCollisionYwithGear(Gear, -1) then
- begin
+ begin
collV := -1;
Gear^.dX := Gear^.dX * Gear^.Friction;
Gear^.dY := - Gear^.dY * Gear^.Elasticity;
Gear^.State := Gear^.State or gstCollision
- end
+ end
else if (Gear^.AdvBounce=1) and TestCollisionYwithGear(Gear, 1) then collV := 1;
- end
+ end
else if TestCollisionYwithGear(Gear, 1) then
begin
- collV := 1;
- isFalling := false;
- Gear^.dX := Gear^.dX * Gear^.Friction;
- Gear^.dY := - Gear^.dY * Gear^.Elasticity;
- Gear^.State := Gear^.State or gstCollision
+ collV := 1;
+ isFalling := false;
+ Gear^.dX := Gear^.dX * Gear^.Friction;
+ Gear^.dY := - Gear^.dY * Gear^.Elasticity;
+ Gear^.State := Gear^.State or gstCollision
end
else
- begin
+ begin
isFalling := true;
if (Gear^.AdvBounce=1) and not Gear^.dY.isNegative and TestCollisionYwithGear(Gear, -1) then
collV := -1;
- end;
+ end;
if TestCollisionXwithGear(Gear, hwSign(Gear^.dX)) then
- begin
+ begin
collH := hwSign(Gear^.dX);
Gear^.dX := - Gear^.dX * Gear^.Elasticity;
Gear^.dY := Gear^.dY * Gear^.Elasticity;
Gear^.State := Gear^.State or gstCollision
- end
+ end
else if (Gear^.AdvBounce=1) and TestCollisionXwithGear(Gear, -hwSign(Gear^.dX)) then
collH := -hwSign(Gear^.dX);
//if Gear^.AdvBounce and (collV <>0) and (collH <> 0) and (hwSqr(tdX) + hwSqr(tdY) > _0_08) then
if (Gear^.AdvBounce=1) and (collV <>0) and (collH <> 0) and ((collV=-1) or ((tdX.QWordValue +
tdY.QWordValue) > _0_2.QWordValue)) then
- begin
+ begin
Gear^.dX := tdY*Gear^.Elasticity*Gear^.Friction;
Gear^.dY := tdX*Gear^.Elasticity;
//*Gear^.Friction;
Gear^.dY.isNegative := not tdY.isNegative;
isFalling := false;
Gear^.AdvBounce := 10;
- end;
+ end;
if Gear^.AdvBounce > 1 then dec(Gear^.AdvBounce);
if isFalling then
begin
Gear^.dY := Gear^.dY + cGravity;
- if (GameFlags and gfMoreWind) <> 0 then Gear^.dX := Gear^.dX + cWindSpeed * _16 / max(12,sqr(Gear^.Radius))
+ if (GameFlags and gfMoreWind) <> 0 then Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density
end;
Gear^.X := Gear^.X + Gear^.dX;
@@ -519,16 +519,128 @@
if (GameFlags and gfMoreWind) = 0 then Gear^.dX := Gear^.dX + cWindSpeed;
doStepFallingGear(Gear);
if (Gear^.State and gstCollision) <> 0 then
- begin
+ begin
doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y), 50, EXPLAutoSound);
DeleteGear(Gear);
exit
- end;
+ end;
if (GameTicks and $3F) = 0 then
AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtSmokeTrace);
end;
////////////////////////////////////////////////////////////////////////////////
+procedure doStepSnowball(Gear: PGear);
+var kick, i: LongInt;
+ particle: PVisualGear;
+begin
+ AllInactive := false;
+ if (GameFlags and gfMoreWind) = 0 then Gear^.dX := Gear^.dX + cWindSpeed;
+ doStepFallingGear(Gear);
+ CalcRotationDirAngle(Gear);
+ if (Gear^.State and gstCollision) <> 0 then
+ begin
+ kick:= hwRound((hwAbs(Gear^.dX)+hwAbs(Gear^.dY)) * _20);
+ Gear^.dY.isNegative:= not Gear^.dY.isNegative;
+ Gear^.dX.isNegative:= not Gear^.dX.isNegative;
+ AmmoShove(Gear, 1, kick);
+ for i:= 15 + kick div 10 downto 0 do
+ begin
+ particle := AddVisualGear(hwRound(Gear^.X) + Random(25), hwRound(Gear^.Y) + Random(25), vgtDust);
+ if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480)
+ end;
+ DeleteGear(Gear);
+ exit
+ end;
+ if ((GameTicks and $1F) = 0) and (Random(3) = 0) then
+ begin
+ particle:= AddVisualGear(hwRound(Gear^.X), hwRound(Gear^.Y), vgtDust);
+ if particle <> nil then particle^.dX := particle^.dX + (Gear^.dX.QWordValue / 21474836480)
+ end
+end;
+
+procedure doStepSnowflake(Gear: PGear);
+var xx, yy, px, py, i: LongInt;
+ move, allpx: Boolean;
+ s: PSDL_Surface;
+ p: PLongwordArray;
+begin
+if GameTicks and $7 = 0 then
+ begin
+ with Gear^ do
+ begin
+ X:= X + cWindSpeed * 1600 + dX;
+ Y:= Y + dY + cGravity * vobFallSpeed * 8; // using same value as flakes to try and get similar results
+ xx:= hwRound(X);
+ yy:= hwRound(Y);
+ if vobVelocity <> 0 then
+ begin
+ DirAngle := DirAngle + (Angle / 1250000000);
+ if DirAngle < 0 then DirAngle := DirAngle + 360
+ else if 360 < DirAngle then DirAngle := DirAngle - 360;
+ end;
+
+ inc(Health, 8);
+ if Health > vobFrameTicks then
+ begin
+ dec(Health, vobFrameTicks);
+ inc(Timer);
+ if Timer = vobFramesCount then Timer:= 0
+ end;
+
+ move:= false;
+ // move back to cloud layer
+ if yy > cWaterLine then move:= true
+ else if ((yy and LAND_HEIGHT_MASK) = 0) and ((xx and LAND_WIDTH_MASK) = 0) and (Land[yy, xx] > 255) then
+ begin
+ // we've collided with land. draw some stuff and get back into the clouds
+ move:= true;
+////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
+ if cWindSpeed * 1600 + dX < _0 then i:= -1
+ else i:= 1;
+ if (yy > 0) and ((Land[yy-1, xx] and $FF00) = 0) then dec(yy)
+ else dec(xx, i);
+ dec(yy,2);
+ dec(xx,i);
+ s:= SpritesData[sprSnow].Surface;
+ p:= s^.pixels;
+ allpx:= true;
+ for py:= 0 to Pred(s^.h) do
+ begin
+ for px:= 0 to Pred(s^.w) do
+ if ((yy + py and LAND_HEIGHT_MASK) = 0) and ((xx + px and LAND_WIDTH_MASK) = 0) and
+ ((Land[yy + py, xx + px] and $FF00) = 0) then
+ begin
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[yy + py, xx + px]:= p^[px]
+ else
+ LandPixels[(yy + py) div 2, (xx + px) div 2]:= p^[px]
+ end
+ else allpx:= false;
+ p:= @(p^[s^.pitch shr 2])
+ end;
+ if allpx then UpdateLandTexture(xx, 4, yy, 4)
+ else UpdateLandTexture(xx, 1, yy, 1);
+ inc(yy,2);
+ inc(xx,i);
+ if ((xx and LAND_WIDTH_MASK) = 0) and ((yy and LAND_HEIGHT_MASK) = 0) then Land[yy, xx]:= Land[yy, xx] or lfObject;
+ if yy > 0 then
+ begin
+ Land[yy-1, xx]:= Land[yy-1, xx] or lfObject;
+ if ((xx-i and LAND_WIDTH_MASK) = 0) then Land[yy-1, xx-i]:= Land[yy-1, xx-i] or lfObject;
+ end;
+ if ((xx-i and LAND_WIDTH_MASK) = 0) and ((yy and LAND_HEIGHT_MASK) = 0) then Land[yy, xx-i]:= Land[yy, xx-i] or lfObject
+////////////////////////////////// TODO - ASK UNC0RR FOR A GOOD HOME FOR THIS ////////////////////////////////////
+ end;
+ if move then
+ begin
+ X:= int2hwFloat(GetRandom(LAND_WIDTH+1024)-512);
+ Y:= int2hwFloat(750+(GetRandom(50)-25))
+ end
+ end
+ end
+end;
+
+////////////////////////////////////////////////////////////////////////////////
procedure doStepGrave(Gear: PGear);
begin
AllInactive := false;
@@ -895,7 +1007,7 @@
////////////////////////////////////////////////////////////////////////////////
procedure doStepPickHammerWork(Gear: PGear);
var
- i, ei: LongInt;
+ i, ei, x, y: LongInt;
HHGear: PGear;
begin
AllInactive := false;
@@ -903,53 +1015,58 @@
dec(Gear^.Timer);
if (Gear^.Timer = 0)or((Gear^.Message and gmDestroy) <> 0)or((HHGear^.State and gstHHDriven) =
0) then
- begin
+ begin
StopSound(Gear^.SoundChannel);
DeleteGear(Gear);
AfterAttack;
doStepHedgehogMoving(HHGear); // for gfInfAttack
exit
- end;
-
+ end;
+
+ x:= hwRound(Gear^.X);
+ y:= hwRound(Gear^.Y);
if (Gear^.Timer mod 33) = 0 then
- begin
+ begin
HHGear^.State := HHGear^.State or gstNoDamage;
- doMakeExplosion(hwRound(Gear^.X), hwRound(Gear^.Y) + 7, 6, EXPLDontDraw);
+ doMakeExplosion(x, y + 7, 6, EXPLDontDraw);
HHGear^.State := HHGear^.State and not gstNoDamage
- end;
+ end;
if (Gear^.Timer mod 47) = 0 then
- begin
- for i:= 0 to 1 do
- AddVisualGear(hwRound(Gear^.X) - 5 + Random(10), hwRound(Gear^.Y) + 12, vgtDust);
- i := hwRound(Gear^.X) - Gear^.Radius - LongInt(GetRandom(2));
- ei := hwRound(Gear^.X) + Gear^.Radius + LongInt(GetRandom(2));
+ begin
+ // ok. this was an attempt to turn off dust if not actually drilling land. I have no idea why it isn't working as expected
+ //if ((y + 12 and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) and (Land[y + 12, x] > 255) then
+ for i:= 0 to 1 do
+ AddVisualGear(x - 5 + Random(10), y + 12, vgtDust);
+
+ i := x - Gear^.Radius - LongInt(GetRandom(2));
+ ei := x + Gear^.Radius + LongInt(GetRandom(2));
while i <= ei do
- begin
- DrawExplosion(i, hwRound(Gear^.Y) + 3, 3);
+ begin
+ DrawExplosion(i, y + 3, 3);
inc(i, 1)
- end;
+ end;
if CheckLandValue(hwRound(Gear^.X + Gear^.dX + SignAs(_6,Gear^.dX)), hwRound(Gear^.Y + _1_9)
, lfIndestructible) then
- begin
+ begin
Gear^.X := Gear^.X + Gear^.dX;
Gear^.Y := Gear^.Y + _1_9;
- end;
+ end;
SetAllHHToActive;
- end;
+ end;
if TestCollisionYwithGear(Gear, 1) then
- begin
+ begin
Gear^.dY := _0;
SetLittle(HHGear^.dX);
HHGear^.dY := _0;
- end
+ end
else
- begin
+ begin
Gear^.dY := Gear^.dY + cGravity;
Gear^.Y := Gear^.Y + Gear^.dY;
if hwRound(Gear^.Y) > cWaterLine then Gear^.Timer := 1
- end;
+ end;
Gear^.X := Gear^.X + HHGear^.dX;
HHGear^.X := Gear^.X;
@@ -1121,7 +1238,7 @@
HHGear^.X := HHGear^.X + HHGear^.dX;
HHGear^.Y := HHGear^.Y + HHGear^.dY;
HHGear^.dY := HHGear^.dY + cGravity;
- if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed * _0_2;
+ if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
if (Gear^.Message and gmAttack) <> 0 then
begin
@@ -1187,7 +1304,7 @@
if not TestCollisionYwithGear(HHGear, 1) then
begin
HHGear^.dY := HHGear^.dY + cGravity;
- if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed * _0_2
+ if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density;
end;
ropeDx := HHGear^.X - Gear^.X;
@@ -1416,7 +1533,7 @@
HHGear^.Y := HHGear^.Y + HHGear^.dY;
Gear^.Y := Gear^.Y + HHGear^.dY;
HHGear^.dY := HHGear^.dY + cGravity;
- if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed * _0_2
+ if (GameFlags and gfMoreWind) <> 0 then HHGear^.dX := HHGear^.dX + cWindSpeed / HHGear^.Density
end;
tt := Gear^.Elasticity;
@@ -1858,10 +1975,10 @@
DeleteCI(HHGear);
for i:= 0 to 3 do
- begin
+ begin
AmmoShove(Gear, 30, 25);
Gear^.X := Gear^.X + Gear^.dX * 5
- end;
+ end;
HHGear^.State := (HHGear^.State and (not gstNoDamage)) or gstMoving;
@@ -2688,7 +2805,7 @@
if ((y and LAND_HEIGHT_MASK) = 0) and ((x and LAND_WIDTH_MASK) = 0) then
if (Land[y, x] <> 0) then
- begin
+ begin
Gear^.dX.isNegative := not Gear^.dX.isNegative;
Gear^.dY.isNegative := not Gear^.dY.isNegative;
Gear^.dX := Gear^.dX * _1_5;
@@ -2696,13 +2813,13 @@
AmmoShove(Gear, 0, 40);
AfterAttack;
DeleteGear(Gear)
- end
+ end
+ else
else
- else
- begin
+ begin
AfterAttack;
DeleteGear(Gear)
- end
+ end
end;
procedure doStepSeductionWear(Gear: PGear);
@@ -3663,7 +3780,7 @@
iterator^.dY:= iterator^.dY + hwAbs(cGravity * (iterator^.Y - conPortal^.Y))
end;
- if not isbullet then
+ if not isbullet and (iterator^.Kind <> gtFlake) then
FollowGear := iterator;
//AddFileLog('portal''d');
--- a/hedgewars/HHHandlers.inc Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/HHHandlers.inc Thu Dec 23 11:13:57 2010 -0500
@@ -207,6 +207,7 @@
amClusterBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtClusterBomb, 0, newDx, newDy, CurWeapon^.Timer);
amGasBomb: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtGasBomb, 0, newDx, newDy, CurWeapon^.Timer);
amBazooka: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtShell, 0, newDx, newDy, 0);
+ amSnowball: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtSnowball, 0, newDx, newDy, 0);
amBee: FollowGear:= AddGear(hwRound(lx), hwRound(ly), gtBee, 0, newDx, newDy, 0);
amShotgun: begin
PlaySound(sndShotgunReload);
@@ -275,7 +276,8 @@
end;
amLowGravity: begin
PlaySound(sndLowGravity);
- cGravity:= cMaxWindSpeed
+ cGravity:= cMaxWindSpeed;
+ cGravityf:= 0.00025
end;
amExtraDamage:begin
PlaySound(sndHellishImpact4);
@@ -667,12 +669,12 @@
Gear^.dY:= Gear^.dY + cGravity;
// this set of circumstances could be less complex if jumping was more clearly identified
if ((GameFlags and gfMoreWind) <> 0) and
- (Gear^.Damage <> 0) or
+ (((Gear^.Damage <> 0) or
((CurAmmoGear <> nil) and
((CurAmmoGear^.AmmoType = amJetpack) or
(CurAmmoGear^.AmmoType = amBirdy))) or
- ((Gear^.dY.QWordValue + Gear^.dX.QWordValue) > _0_55.QWordValue)
- then Gear^.dX := Gear^.dX + cWindSpeed * _0_2
+ ((Gear^.dY.QWordValue + Gear^.dX.QWordValue) > _0_55.QWordValue)))
+ then Gear^.dX := Gear^.dX + cWindSpeed / Gear^.Density
end
end
else
--- a/hedgewars/PascalExports.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/PascalExports.pas Thu Dec 23 11:13:57 2010 -0500
@@ -25,7 +25,6 @@
uCommands;
{$INCLUDE "config.inc"}
-var dummy: boolean; // avoid compiler hint
implementation
{$IFDEF HWLIBRARY}
@@ -33,7 +32,7 @@
previousGameState: TGameState;
// retrieve protocol information
-procedure HW_versionInfo(netProto: PShortInt; versionStr: PPChar); cdecl; export;
+procedure HW_versionInfo(netProto: PLongInt; versionStr: PPChar); cdecl; export;
begin
netProto^:= cNetProtoVersion;
versionStr^:= cVersionString;
--- a/hedgewars/hwLibrary.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/hwLibrary.pas Thu Dec 23 11:13:57 2010 -0500
@@ -16,6 +16,5 @@
begin
// avoid compiler warnings about units not being used
isTerminated:= isTerminated;
- dummy:= dummy;
end.
--- a/hedgewars/uAIAmmoTests.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uAIAmmoTests.pas Thu Dec 23 11:13:57 2010 -0500
@@ -31,6 +31,7 @@
end;
function TestBazooka(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
+function TestSnowball(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
function TestGrenade(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
function TestMolotov(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
function TestClusterBomb(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
@@ -102,7 +103,8 @@
(proc: @TestGrenade; flags: 0), // amSMine
(proc: @TestFirePunch; flags: 0), // amHammer
(proc: nil; flags: 0), // amResurrector
- (proc: nil; flags: 0) // amDrillStrike
+ (proc: nil; flags: 0),// amDrillStrike
+ (proc: @TestSnowball; flags: 0) // amSnowball
);
const BadTurn = Low(LongInt) div 4;
@@ -172,6 +174,63 @@
TestBazooka:= valueResult
end;
+function TestSnowball(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
+var Vx, Vy, r: hwFloat;
+ rTime: LongInt;
+ Score, EX, EY: LongInt;
+ valueResult: LongInt;
+
+ function CheckTrace: LongInt;
+ var x, y, dX, dY: hwFloat;
+ t: LongInt;
+ value: LongInt;
+ begin
+ x:= Me^.X;
+ y:= Me^.Y;
+ dX:= Vx;
+ dY:= -Vy;
+ t:= rTime;
+ repeat
+ x:= x + dX;
+ y:= y + dY;
+ dX:= dX + cWindSpeed;
+ dY:= dY + cGravity;
+ dec(t)
+ until TestCollExcludingMe(Me, hwRound(x), hwRound(y), 5) or (t <= 0);
+ EX:= hwRound(x);
+ EY:= hwRound(y);
+ value:= RateExplosion(Me, EX, EY, 5);
+ if value = 0 then value:= - Metric(Targ.X, Targ.Y, EX, EY) div 64;
+ CheckTrace:= value;
+ end;
+
+begin
+ap.Time:= 0;
+rTime:= 350;
+ap.ExplR:= 0;
+valueResult:= BadTurn;
+repeat
+ rTime:= rTime + 300 + Level * 50 + random(300);
+ Vx:= - cWindSpeed * rTime * _0_5 + (int2hwFloat(Targ.X + AIrndSign(2)) - Me^.X) / int2hwFloat(rTime);
+ Vy:= cGravity * rTime * _0_5 - (int2hwFloat(Targ.Y) - Me^.Y) / int2hwFloat(rTime);
+ r:= Distance(Vx, Vy);
+ if not (r > _1) then
+ begin
+ Score:= CheckTrace;
+ if valueResult <= Score then
+ begin
+ ap.Angle:= DxDy2AttackAngle(Vx, Vy) + AIrndSign(random((Level - 1) * 9));
+ ap.Power:= hwRound(r * cMaxPower) - random((Level - 1) * 17 + 1);
+ ap.ExplR:= 100;
+ ap.ExplX:= EX;
+ ap.ExplY:= EY;
+ valueResult:= Score
+ end;
+ end
+until (rTime > 4250);
+TestSnowball:= valueResult
+end;
+
function TestMolotov(Me: PGear; Targ: TPoint; Level: LongInt; var ap: TAttackParams): LongInt;
var Vx, Vy, r: hwFloat;
Score, EX, EY, valueResult: LongInt;
--- a/hedgewars/uCommandHandlers.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uCommandHandlers.pas Thu Dec 23 11:13:57 2010 -0500
@@ -9,6 +9,17 @@
implementation
uses uCommands, uTypes, uVariables, uIO, uDebug, uConsts, uScript, uUtils, SDLh, uRandom;
+procedure chGenCmd(var s: shortstring);
+begin
+case s[1] of
+ 'R': if ReadyTimeLeft > 1 then
+ begin
+ ReadyTimeLeft:= 1;
+ if not CurrentTeam^.ExtDriven then SendIPC('c'+s);
+ end
+ end
+end;
+
procedure chQuit(var s: shortstring);
const prevGState: TGameState = gsConfirm;
begin
@@ -152,7 +163,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('L');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmLeft and InputMask)
@@ -172,7 +182,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('R');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmRight and InputMask)
@@ -192,7 +201,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('U');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmUp and InputMask)
@@ -212,7 +220,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('D');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmDown and InputMask)
@@ -232,7 +239,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('Z');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmPrecise and InputMask);
@@ -252,7 +258,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('j');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmLJump and InputMask)
@@ -263,7 +268,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('J');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmHJump and InputMask)
@@ -273,7 +277,6 @@
begin
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
begin
@@ -304,7 +307,6 @@
s:= s; // avoid compiler hint
if CheckNoTeamOrHH or isPaused then exit;
if not CurrentTeam^.ExtDriven then SendIPC('S');
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
Message:= Message or (gmSwitch and InputMask)
@@ -326,7 +328,6 @@
if (s[0] <> #1) or (s[1] < '1') or (s[1] > '5') or CheckNoTeamOrHH then exit;
if not CurrentTeam^.ExtDriven then SendIPC(s);
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
begin
@@ -342,7 +343,6 @@
slot:= byte(s[1]) - 49;
if slot > cMaxSlotIndex then exit;
if not CurrentTeam^.ExtDriven then SendIPC(char(byte(s[1]) + 79));
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
with CurrentHedgehog^.Gear^ do
begin
@@ -407,6 +407,7 @@
if isDeveloperMode then
begin
Pathz[ptCurrTheme]:= Pathz[ptThemes] + '/' + s;
+Theme:= s;
InitStepsFlags:= InitStepsFlags or cifTheme
end
end;
@@ -438,7 +439,6 @@
((MultiShootAttacks > 0) and ((Ammoz[CurAmmoType].Ammo.Propz and ammoprop_NoRoundEnd) = 0)) or
((Gear^.State and gstHHDriven) = 0) then else bShowAmmoMenu:= true
end;
- if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1
end
end;
@@ -465,7 +465,6 @@
procedure chPause(var s: shortstring);
begin
s:= s; // avoid compiler hint
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
if gameType <> gmtNet then
isPaused:= not isPaused;
SDL_ShowCursor(ord(isPaused))
@@ -512,6 +511,24 @@
procedure initModule;
begin
+//////// Begin top sorted by freq analysis not including chatmsg
+ RegisterVariable('+right' , vtCommand, @chRight_p , false);
+ RegisterVariable('-right' , vtCommand, @chRight_m , false);
+ RegisterVariable('+up' , vtCommand, @chUp_p , false);
+ RegisterVariable('-up' , vtCommand, @chUp_m , false);
+ RegisterVariable('+left' , vtCommand, @chLeft_p , false);
+ RegisterVariable('-left' , vtCommand, @chLeft_m , false);
+ RegisterVariable('+attack' , vtCommand, @chAttack_p , false);
+ RegisterVariable('+down' , vtCommand, @chDown_p , false);
+ RegisterVariable('-down' , vtCommand, @chDown_m , false);
+ RegisterVariable('hjump' , vtCommand, @chHJump , false);
+ RegisterVariable('ljump' , vtCommand, @chLJump , false);
+ RegisterVariable('nextturn', vtCommand, @chNextTurn , false);
+ RegisterVariable('-attack' , vtCommand, @chAttack_m , false);
+ RegisterVariable('slot' , vtCommand, @chSlot , false);
+ RegisterVariable('setweap' , vtCommand, @chSetWeapon , false);
+//////// End top by freq analysis
+ RegisterVariable('gencmd' , vtCommand, @chGenCmd , false);
RegisterVariable('flag' , vtCommand, @chFlag , false);
RegisterVariable('script' , vtCommand, @chScript , false);
RegisterVariable('proto' , vtCommand, @chCheckProto , true );
@@ -555,25 +572,10 @@
RegisterVariable('ammomenu', vtCommand, @chAmmoMenu , true);
RegisterVariable('+precise', vtCommand, @chPrecise_p , false);
RegisterVariable('-precise', vtCommand, @chPrecise_m , false);
- RegisterVariable('+left' , vtCommand, @chLeft_p , false);
- RegisterVariable('-left' , vtCommand, @chLeft_m , false);
- RegisterVariable('+right' , vtCommand, @chRight_p , false);
- RegisterVariable('-right' , vtCommand, @chRight_m , false);
- RegisterVariable('+up' , vtCommand, @chUp_p , false);
- RegisterVariable('-up' , vtCommand, @chUp_m , false);
- RegisterVariable('+down' , vtCommand, @chDown_p , false);
- RegisterVariable('-down' , vtCommand, @chDown_m , false);
- RegisterVariable('+attack' , vtCommand, @chAttack_p , false);
- RegisterVariable('-attack' , vtCommand, @chAttack_m , false);
RegisterVariable('switch' , vtCommand, @chSwitch , false);
- RegisterVariable('nextturn', vtCommand, @chNextTurn , false);
RegisterVariable('timer' , vtCommand, @chTimer , false);
RegisterVariable('taunt' , vtCommand, @chTaunt , false);
- RegisterVariable('setweap' , vtCommand, @chSetWeapon , false);
- RegisterVariable('slot' , vtCommand, @chSlot , false);
RegisterVariable('put' , vtCommand, @chPut , false);
- RegisterVariable('ljump' , vtCommand, @chLJump , false);
- RegisterVariable('hjump' , vtCommand, @chHJump , false);
RegisterVariable('+volup' , vtCommand, @chVol_p , true );
RegisterVariable('-volup' , vtCommand, @chVol_m , true );
RegisterVariable('+voldown', vtCommand, @chVol_m , true );
--- a/hedgewars/uCommands.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uCommands.pas Thu Dec 23 11:13:57 2010 -0500
@@ -56,11 +56,11 @@
begin
//WriteLnToConsole(CmdStr);
if CmdStr[0]=#0 then exit;
-{$IFDEF DEBUGFILE}AddFileLog('ParseCommand "' + CmdStr + '"');{$ENDIF}
c:= CmdStr[1];
if c in ['/', '$'] then Delete(CmdStr, 1, 1) else c:= '/';
s:= '';
SplitBySpace(CmdStr, s);
+{$IFDEF DEBUGFILE}AddFileLog('[Cmd] ' + c + CmdStr + ' (' + inttostr(length(CmdStr)) + ')');{$ENDIF}
t:= Variables;
while t <> nil do
begin
--- a/hedgewars/uConsole.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uConsole.pas Thu Dec 23 11:13:57 2010 -0500
@@ -31,7 +31,7 @@
uses Types, uVariables, uUtils;
const cLineWidth: LongInt = 0;
- cLinesCount = 256;
+ cLinesCount = 8;
type
TTextLine = record
@@ -52,7 +52,7 @@
done: boolean;
begin
{$IFNDEF NOCONSOLE}
-{$IFDEF DEBUGFILE}AddFileLog('Console write: ' + s);{$ENDIF}
+{$IFDEF DEBUGFILE}AddFileLog('[Con] ' + s);{$ENDIF}
Write(s);
done:= false;
--- a/hedgewars/uGears.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uGears.pas Thu Dec 23 11:13:57 2010 -0500
@@ -47,7 +47,7 @@
implementation
uses uStore, uSound, uTeams, uRandom, uCollisions, uIO, uLandGraphics,
uAIMisc, uLocale, uAI, uAmmos, uStats, uVisualGears, uScript, GLunit, uMobile, uVariables,
- uCommands, uUtils, uTextures, uRenderUtils, uGearsRender, uCaptions, uDebug;
+ uCommands, uUtils, uTextures, uRenderUtils, uGearsRender, uCaptions, uDebug, uLandTexture;
procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord); forward;
@@ -127,7 +127,9 @@
@doStepHammer,
@doStepHammerHit,
@doStepResurrector,
- @doStepNapalmBomb
+ @doStepNapalmBomb,
+ @doStepSnowball,
+ @doStepSnowflake
);
procedure InsertGearToList(Gear: PGear);
@@ -219,6 +221,7 @@
gear^.Radius:= 5;
gear^.Elasticity:= _0_8;
gear^.Friction:= _0_8;
+ gear^.Density:= _1_5;
gear^.RenderTimer:= true;
if gear^.Timer = 0 then gear^.Timer:= 3000
end;
@@ -229,15 +232,20 @@
gear^.Radius:= 6;
gear^.Elasticity:= _0_8;
gear^.Friction:= _0_995;
+ gear^.Density:= _2;
gear^.RenderTimer:= true;
if gear^.Timer = 0 then gear^.Timer:= 3000
end;
+ gtMelonPiece: begin
+ gear^.Density:= _2;
+ end;
gtHedgehog: begin
gear^.AdvBounce:= 1;
gear^.Radius:= cHHRadius;
gear^.Elasticity:= _0_35;
gear^.Friction:= _0_999;
gear^.Angle:= cMaxAngle div 2;
+ gear^.Density:= _3;
gear^.Z:= cHHZ;
if (GameFlags and gfAISurvival) <> 0 then
if gear^.Hedgehog^.BotLevel > 0 then
@@ -245,6 +253,28 @@
end;
gtShell: begin
gear^.Radius:= 4;
+ gear^.Density:= _1;
+ end;
+ gtSnowball: begin
+ gear^.Radius:= 4;
+ gear^.Elasticity:= _1;
+ gear^.Friction:= _1;
+ gear^.Density:= _0_5;
+ end;
+
+ gtFlake: begin
+ with Gear^ do
+ begin
+ DirAngle:= random * 360;
+ dx.isNegative:= GetRandom(2) = 0;
+ dx.QWordValue:= GetRandom(100000000);
+ dy.isNegative:= false;
+ dy.QWordValue:= GetRandom(70000000);
+ if GetRandom(2) = 0 then dx := -dx;
+ Health:= random(vobFrameTicks);
+ Timer:= random(vobFramesCount);
+ Angle:= (random(2) * 2 - 1) * (1 + random(10000)) * vobVelocity
+ end
end;
gtGrave: begin
gear^.ImpactSound:= sndGraveImpact;
@@ -282,6 +312,7 @@
gear^.Radius:= 2;
gear^.Elasticity:= _0_55;
gear^.Friction:= _0_995;
+ gear^.Density:= _0_9;
if cMinesTime < 0 then
gear^.Timer:= getrandom(51)*100
else
@@ -293,6 +324,7 @@
gear^.Radius:= 2;
gear^.Elasticity:= _0_55;
gear^.Friction:= _0_995;
+ gear^.Density:= _0_9;
gear^.Timer:= 500;
end;
gtCase: begin
@@ -307,6 +339,7 @@
gear^.Radius:= 16;
gear^.Elasticity:= _0_4;
gear^.Friction:= _0_995;
+ gear^.Density:= _6;
gear^.Health:= cBarrelHealth
end;
gtDEagleShot: begin
@@ -321,10 +354,12 @@
gear^.Radius:= 3;
gear^.Elasticity:= _0_55;
gear^.Friction:= _0_03;
+ gear^.Density:= _2;
gear^.Timer:= 5000;
end;
gtCluster: begin
gear^.Radius:= 2;
+ gear^.Density:= _1_5;
gear^.RenderTimer:= true
end;
gtShover: gear^.Radius:= 20;
@@ -332,6 +367,7 @@
gear^.Tag:= GetRandom(32);
gear^.Radius:= 1;
gear^.Health:= 5;
+ gear^.Density:= _1;
if (gear^.dY.QWordValue = 0) and (gear^.dX.QWordValue = 0) then
begin
gear^.dY:= (getrandom - _0_8) * _0_03;
@@ -344,6 +380,7 @@
end;
gtAirBomb: begin
gear^.Radius:= 5;
+ gear^.Density:= _2;
end;
gtBlowTorch: begin
gear^.Radius:= cHHRadius + cBlowTorchC;
@@ -362,7 +399,8 @@
gtMortar: begin
gear^.Radius:= 4;
gear^.Elasticity:= _0_2;
- gear^.Friction:= _0_08
+ gear^.Friction:= _0_08;
+ gear^.Density:= _1;
end;
gtWhip: gear^.Radius:= 20;
gtHammer: gear^.Radius:= 20;
@@ -385,12 +423,14 @@
gear^.Radius:= 4;
gear^.Elasticity:= _0_5;
gear^.Friction:= _0_96;
+ gear^.Density:= _1_5;
gear^.RenderTimer:= true;
gear^.Timer:= 5000
end;
gtDrill: begin
gear^.Timer:= 5000;
- gear^.Radius:= 4
+ gear^.Radius:= 4;
+ gear^.Density:= _1;
end;
gtBall: begin
gear^.ImpactSound:= sndGrenadeImpact;
@@ -401,6 +441,7 @@
gear^.Timer:= 5000;
gear^.Elasticity:= _0_7;
gear^.Friction:= _0_995;
+ gear^.Density:= _1_5;
end;
gtBallgun: begin
gear^.Timer:= 5001;
@@ -416,6 +457,7 @@
end;
gtMolotov: begin
gear^.Radius:= 6;
+ gear^.Density:= _2;
end;
gtBirdy: begin
gear^.Radius:= 16; // todo: check
@@ -427,6 +469,7 @@
gear^.Radius:= 4;
gear^.Elasticity:= _0_6;
gear^.Friction:= _0_96;
+ gear^.Density:= _1;
if gear^.Timer = 0 then gear^.Timer:= 3000
end;
gtPortal: begin
@@ -440,7 +483,8 @@
gear^.Health:= 100;
end;
gtPiano: begin
- gear^.Radius:= 32
+ gear^.Radius:= 32;
+ gear^.Density:= _50;
end;
gtSineGunShot: begin
gear^.Radius:= 5;
@@ -466,6 +510,7 @@
gtNapalmBomb: begin
gear^.Timer:= 1000;
gear^.Radius:= 5;
+ gear^.Density:= _1_5;
end;
end;
@@ -876,7 +921,10 @@
SpeechText:= ''; // in case it has not been consumed
if (GameFlags and gfLowGravity) = 0 then
+ begin
cGravity:= cMaxWindSpeed * 2;
+ cGravityf:= 0.00025 * 2
+ end;
if (GameFlags and gfVampiric) = 0 then
cVampiric:= false;
@@ -1051,7 +1099,10 @@
end;
if (GameFlags and gfLowGravity) <> 0 then
+ begin
cGravity:= cMaxWindSpeed;
+ cGravityf:= 0.00025
+ end;
if (GameFlags and gfVampiric) <> 0 then
cVampiric:= true;
@@ -1068,7 +1119,11 @@
cLaserSighting:= true;
if (GameFlags and gfArtillery) <> 0 then
- cArtillery:= true
+ cArtillery:= true;
+
+if (Theme = 'Snow') or (Theme = 'Christmas') then
+ for i:= 0 to Pred(vobCount*2) do
+ AddGear(GetRandom(LAND_WIDTH+1024)-512, LAND_HEIGHT - GetRandom(1024), gtFlake, 0, _0, _0, 0);
end;
procedure doMakeExplosion(X, Y, Radius: LongInt; Mask: LongWord);
@@ -1245,13 +1300,10 @@
begin
if (Ammo^.Kind = gtDEagleShot) or (Ammo^.Kind = gtSniperRifleShot) then
- begin
+ begin
VGear := AddVisualGear(hwround(Ammo^.X), hwround(Ammo^.Y), vgtBulletHit);
- if VGear <> nil then
- begin
- VGear^.Angle := DxDy2Angle(-Ammo^.dX, Ammo^.dY);
+ if VGear <> nil then VGear^.Angle := DxDy2Angle(-Ammo^.dX, Ammo^.dY);
end;
- end;
if (Gear^.Kind = gtHedgehog) and (Ammo^.State and gsttmpFlag <> 0) and (Ammo^.Kind = gtShover) then Gear^.FlightTime:= 1;
--- a/hedgewars/uGearsRender.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uGearsRender.pas Thu Dec 23 11:13:57 2010 -0500
@@ -543,6 +543,7 @@
CurWeapon:= GetAmmoEntry(HH^);
case amt of
amBazooka: DrawRotated(sprHandBazooka, hx, hy, sign, aangle);
+ amSnowball: DrawRotated(sprHandSnowball, hx, hy, sign, aangle);
amMortar: DrawRotated(sprHandMortar, hx, hy, sign, aangle);
amMolotov: DrawRotated(sprHandMolotov, hx, hy, sign, aangle);
amBallgun: DrawRotated(sprHandBallgun, hx, hy, sign, aangle);
@@ -845,6 +846,7 @@
begin
case Gear^.Kind of
gtBomb: DrawRotated(sprBomb, x, y, 0, Gear^.DirAngle);
+ gtSnowball: DrawRotated(sprSnowball, x, y, 0, Gear^.DirAngle);
gtGasBomb: DrawRotated(sprCheese, x, y, 0, Gear^.DirAngle);
gtMolotov: DrawRotated(sprMolotov, x, y, 0, Gear^.DirAngle);
@@ -1015,6 +1017,16 @@
Tint($FF, $FF, $FF, $FF);
end;
gtNapalmBomb: DrawRotated(sprNapalmBomb, x, y, 0, DxDy2Angle(Gear^.dY, Gear^.dX));
+ gtFlake: if not isInLag then
+ begin
+ if vobVelocity = 0 then
+ //DrawSprite(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer)
+ DrawSprite(sprFlake, x, y, Gear^.Timer)
+ else
+ //DrawRotatedF(sprFlake, x-SpritesData[sprFlake].Width div 2, y-SpritesData[sprFlake].Height div 2, Gear^.Timer, 1, Gear^.DirAngle);
+ DrawRotatedF(sprFlake, x, y, Gear^.Timer, 1, Gear^.DirAngle)
+ end;
+
end;
if Gear^.RenderTimer and (Gear^.Tex <> nil) then DrawCentered(x + 8, y + 8, Gear^.Tex);
end;
--- a/hedgewars/uIO.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uIO.pas Thu Dec 23 11:13:57 2010 -0500
@@ -139,7 +139,7 @@
else
loTicks:= SDLNet_Read16(@s[byte(s[0]) - 1]);
AddCmd(loTicks, s);
- {$IFDEF DEBUGFILE}AddFileLog('IPC in: '+s[1]+' ticks '+IntToStr(lastcmd^.loTime));{$ENDIF}
+ {$IFDEF DEBUGFILE}AddFileLog('[IPC in] '+s[1]+' ticks '+IntToStr(lastcmd^.loTime));{$ENDIF}
end
end;
@@ -220,7 +220,7 @@
SendEmptyPacketTicks:= 0;
if s[0]>#251 then s[0]:= #251;
SDLNet_Write16(GameTicks, @s[Succ(byte(s[0]))]);
- {$IFDEF DEBUGFILE}AddFileLog('IPC send: '+ s[1]);{$ENDIF}
+ {$IFDEF DEBUGFILE}AddFileLog('[IPC out] '+ s[1]);{$ENDIF}
inc(s[0], 2);
SDLNet_TCP_Send(IPCSock, @s, Succ(byte(s[0])))
end
@@ -247,7 +247,7 @@
procedure SendIPCTimeInc;
const timeinc: shortstring = '#';
begin
-{$IFDEF DEBUGFILE}AddFileLog('IPC Send #');{$ENDIF}
+{$IFDEF DEBUGFILE}AddFileLog('[IPC out] <time increment>');{$ENDIF}
SendIPCRaw(@timeinc, 2)
end;
@@ -309,6 +309,10 @@
'j': ParseCommand('ljump', true);
'J': ParseCommand('hjump', true);
',': ParseCommand('skip', true);
+ 'c': begin
+ s:= copy(headcmd^.str, 2, Pred(headcmd^.len));
+ ParseCommand('gencmd ' + s, true);
+ end;
's': begin
s:= copy(headcmd^.str, 2, Pred(headcmd^.len));
ParseCommand('chatmsg ' + s, true);
@@ -371,7 +375,6 @@
procedure doPut(putX, putY: LongInt; fromAI: boolean);
begin
if CheckNoTeamOrHH or isPaused then exit;
-if ReadyTimeLeft > 1 then ReadyTimeLeft:= 1;
bShowFinger:= false;
if not CurrentTeam^.ExtDriven and bShowAmmoMenu then
begin
--- a/hedgewars/uKeys.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uKeys.pas Thu Dec 23 11:13:57 2010 -0500
@@ -171,14 +171,19 @@
if CurrentBinds[i][0] <> #0 then
begin
if (i > 3) and (tkbdn[i] <> 0) and not ((CurrentBinds[i] = 'put') or (CurrentBinds[i] = 'ammomenu') or (CurrentBinds[i] = '+cur_u') or (CurrentBinds[i] = '+cur_d') or (CurrentBinds[i] = '+cur_l') or (CurrentBinds[i] = '+cur_r')) then hideAmmoMenu:= true;
- if (tkbd[i] = 0) and (tkbdn[i] <> 0) then ParseCommand(CurrentBinds[i], Trusted)
+ if (tkbd[i] = 0) and (tkbdn[i] <> 0) then
+ begin
+ ParseCommand(CurrentBinds[i], Trusted);
+ if (CurrentTeam <> nil) and not CurrentTeam^.ExtDriven and (ReadyTimeLeft > 1) then ParseCommand('gencmd R', true)
+ end
else if (CurrentBinds[i][1] = '+')
and (tkbdn[i] = 0)
and (tkbd[i] <> 0) then
begin
s:= CurrentBinds[i];
s[1]:= '-';
- ParseCommand(s, Trusted)
+ ParseCommand(s, Trusted);
+ if (CurrentTeam <> nil) and not CurrentTeam^.ExtDriven and (ReadyTimeLeft > 1) then ParseCommand('gencmd R', true)
end;
tkbd[i]:= tkbdn[i]
end
--- a/hedgewars/uLand.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uLand.pas Thu Dec 23 11:13:57 2010 -0500
@@ -553,7 +553,7 @@
begin
uLandPainted.Draw;
- MaxHedgehogs:= 18;
+ MaxHedgehogs:= 48;
hasGirders:= true;
playHeight:= 2048;
playWidth:= 4096;
@@ -1045,6 +1045,8 @@
0: GenBlank(EdgeTemplates[SelectTemplate]);
1: GenMaze;
2: GenDrawnMap;
+ else
+ OutError('Unknown mapgen', true);
end;
AddProgress();
@@ -1286,6 +1288,8 @@
0: GenBlank(EdgeTemplates[SelectTemplate]);
1: GenMaze;
2: GenDrawnMap;
+ else
+ OutError('Unknown mapgen', true);
end;
lh:= LAND_HEIGHT div 128;
--- a/hedgewars/uLandGraphics.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uLandGraphics.pas Thu Dec 23 11:13:57 2010 -0500
@@ -198,12 +198,13 @@
else
LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
end
- else
- if ((Land[t, i] and lfObject) <> 0) then
- if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[t, i]:= 0
- else
- LandPixels[t div 2, i div 2]:= 0;
+ else if not isMap or ((Land[t, i] and lfObject) <> 0) then
+ begin
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[t, i]:= 0
+ else
+ LandPixels[t div 2, i div 2]:= 0
+ end;
t:= y - dy;
if (t and LAND_HEIGHT_MASK) = 0 then
@@ -216,12 +217,13 @@
else
LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
end
- else
- if ((Land[t, i] and lfObject) <> 0) then
- if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[t, i]:= 0
- else
- LandPixels[t div 2, i div 2]:= 0;
+ else if not isMap or ((Land[t, i] and lfObject) <> 0) then
+ begin
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[t, i]:= 0
+ else
+ LandPixels[t div 2, i div 2]:= 0
+ end;
t:= y + dx;
if (t and LAND_HEIGHT_MASK) = 0 then
@@ -230,16 +232,17 @@
begin
inc(cnt);
if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[t, i]:= LandBackPixel(i, t)
- else
- LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
+ LandPixels[t, i]:= LandBackPixel(i, t)
+ else
+ LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
end
- else
- if ((Land[t, i] and lfObject) <> 0) then
+ else if not isMap or ((Land[t, i] and lfObject) <> 0) then
+ begin
if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[t, i]:= 0
+ LandPixels[t, i]:= 0
else
- LandPixels[t div 2, i div 2]:= 0;
+ LandPixels[t div 2, i div 2]:= 0
+ end;
t:= y - dx;
if (t and LAND_HEIGHT_MASK) = 0 then
@@ -252,12 +255,13 @@
else
LandPixels[t div 2, i div 2]:= LandBackPixel(i, t)
end
- else
- if ((Land[t, i] and lfObject) <> 0) then
- if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[t, i]:= 0
- else
- LandPixels[t div 2, i div 2]:= 0;
+ else if not isMap or ((Land[t, i] and lfObject) <> 0) then
+ begin
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[t, i]:= 0
+ else
+ LandPixels[t div 2, i div 2]:= 0
+ end;
FillLandCircleLinesBG:= cnt;
end;
@@ -267,7 +271,7 @@
t:= y + dy;
if (t and LAND_HEIGHT_MASK) = 0 then
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
- if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) then
+ if (Land[t, i] and (lfBasic or lfObject)) <> 0 then
begin
if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[t, i]:= cExplosionBorderColor
@@ -282,7 +286,7 @@
t:= y - dy;
if (t and LAND_HEIGHT_MASK) = 0 then
for i:= Max(x - dx, 0) to Min(x + dx, LAND_WIDTH - 1) do
- if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) then
+ if (Land[t, i] and (lfBasic or lfObject)) <> 0 then
begin
if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[t, i]:= cExplosionBorderColor
@@ -296,7 +300,7 @@
t:= y + dx;
if (t and LAND_HEIGHT_MASK) = 0 then
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
- if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) then
+ if (Land[t, i] and (lfBasic or lfObject)) <> 0 then
begin
if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[t, i]:= cExplosionBorderColor
@@ -311,7 +315,7 @@
t:= y - dx;
if (t and LAND_HEIGHT_MASK) = 0 then
for i:= Max(x - dy, 0) to Min(x + dy, LAND_WIDTH - 1) do
- if ((Land[t, i] and lfBasic) <> 0) or ((Land[t, i] and lfObject) <> 0) then
+ if (Land[t, i] and (lfBasic or lfObject)) <> 0 then
begin
if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[t, i]:= cExplosionBorderColor
@@ -414,12 +418,13 @@
LandPixels[ty, tx]:= LandBackPixel(tx, ty)
else
LandPixels[ty div 2, tx div 2]:= LandBackPixel(tx, ty)
- else
- if (Land[ty, tx] and lfObject) <> 0 then
- if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[ty, tx]:= 0
- else
- LandPixels[ty div 2, tx div 2]:= 0;
+ else if not isMap then
+ begin
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[ty, tx]:= 0
+ else
+ LandPixels[ty div 2, tx div 2]:= 0
+ end;
inc(y, dY)
end;
@@ -430,7 +435,7 @@
begin
for ty:= Max(y - Radius, 0) to Min(y + Radius, LAND_HEIGHT) do
for tx:= Max(0, ar^[i].Left - Radius) to Min(LAND_WIDTH, ar^[i].Right + Radius) do
- if ((Land[ty, tx] and lfBasic) <> 0) or ((Land[ty, tx] and lfObject) <> 0) then
+ if (Land[ty, tx] and (lfBasic or lfObject)) <> 0 then
begin
if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[ty, tx]:= cExplosionBorderColor
@@ -474,13 +479,12 @@
ty:= hwRound(Y);
if ((ty and LAND_HEIGHT_MASK) = 0) and
((tx and LAND_WIDTH_MASK) = 0) and
- (((Land[ty, tx] and lfBasic) <> 0) or
- ((Land[ty, tx] and lfObject) <> 0)) then
+ ((Land[ty, tx] and (lfBasic or lfObject)) <> 0) then
begin
Land[ty, tx]:= Land[ty, tx] or lfDamaged;
- if (cReducedQuality and rqBlurryLand) = 0 then
+ if (cReducedQuality and rqBlurryLand) = 0 then
LandPixels[ty, tx]:= cExplosionBorderColor
- else
+ else
LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
end
end;
@@ -500,15 +504,13 @@
ty:= hwRound(Y);
if ((ty and LAND_HEIGHT_MASK) = 0) and
((tx and LAND_WIDTH_MASK) = 0) and
- (((Land[ty, tx] and lfBasic) <> 0) or
- ((Land[ty, tx] and lfObject) <> 0)) then
+ ((Land[ty, tx] and (lfBasic or lfObject)) <> 0) then
begin
Land[ty, tx]:= Land[ty, tx] or lfDamaged;
- if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[ty, tx]:= cExplosionBorderColor
- else
- LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
-
+ if (cReducedQuality and rqBlurryLand) = 0 then
+ LandPixels[ty, tx]:= cExplosionBorderColor
+ else
+ LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
end
end;
X:= nx;
@@ -526,12 +528,13 @@
LandPixels[ty, tx]:= LandBackPixel(tx, ty)
else
LandPixels[ty div 2, tx div 2]:= LandBackPixel(tx, ty)
- else
- if (Land[ty, tx] and lfObject) <> 0 then
+ else if not isMap or ((Land[ty, tx] and lfObject) <> 0) then
+ begin
if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[ty, tx]:= 0
+ LandPixels[ty, tx]:= 0
else
- LandPixels[ty div 2, tx div 2]:= 0;
+ LandPixels[ty div 2, tx div 2]:= 0
+ end;
Land[ty, tx]:= 0;
end
@@ -544,15 +547,13 @@
ty:= hwRound(Y);
if ((ty and LAND_HEIGHT_MASK) = 0) and
((tx and LAND_WIDTH_MASK) = 0) and
- (((Land[ty, tx] and lfBasic) <> 0) or
- ((Land[ty, tx] and lfObject) <> 0)) then
+ ((Land[ty, tx] and (lfBasic or lfObject)) <> 0) then
begin
Land[ty, tx]:= Land[ty, tx] or lfDamaged;
if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[ty, tx]:= cExplosionBorderColor
+ LandPixels[ty, tx]:= cExplosionBorderColor
else
- LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
-
+ LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
end
end;
nx:= nx - dY;
@@ -571,14 +572,13 @@
ty:= hwRound(Y);
if ((ty and LAND_HEIGHT_MASK) = 0) and
((tx and LAND_WIDTH_MASK) = 0) and
- (((Land[ty, tx] and lfBasic) <> 0) or
- ((Land[ty, tx] and lfObject) <> 0)) then
+ ((Land[ty, tx] and (lfBasic or lfObject)) <> 0) then
begin
Land[ty, tx]:= Land[ty, tx] or lfDamaged;
if (cReducedQuality and rqBlurryLand) = 0 then
- LandPixels[ty, tx]:= cExplosionBorderColor
+ LandPixels[ty, tx]:= cExplosionBorderColor
else
- LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
+ LandPixels[ty div 2, tx div 2]:= cExplosionBorderColor
end
end;
nx:= nx - dY;
@@ -689,14 +689,16 @@
if c < 4 then // 0-3 neighbours
begin
if (cReducedQuality and rqBlurryLand) = 0 then
+ begin
if (Land[Y, X] and lfBasic) <> 0 then
LandPixels[Y, X]:= LandBackPixel(X, Y)
- else
+ else if not isMap or ((Land[Y, X] and lfObject) <> 0) then
LandPixels[Y, X]:= 0
+ end
else
if (Land[Y, X] and lfBasic) <> 0 then
LandPixels[Y div 2, X div 2]:= LandBackPixel(X, Y)
- else
+ else if not isMap or ((Land[Y, X] and lfObject) <> 0) then
LandPixels[Y div 2, X div 2]:= 0;
Land[Y, X]:= 0;
--- a/hedgewars/uLandObjects.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uLandObjects.pas Thu Dec 23 11:13:57 2010 -0500
@@ -226,7 +226,9 @@
tmpx2:= bx;
while (tmpx <= bx - rect.w div 2 - 1) and bRes do
begin
- bRes:= (Land[rect.y, tmpx] = Color) and (Land[by, tmpx] = Color) and
+ bRes:= ((rect.y and LAND_HEIGHT_MASK) = 0) and ((by and LAND_HEIGHT_MASK) = 0) and
+ ((tmpx and LAND_WIDTH_MASK) = 0) and ((tmpx2 and LAND_WIDTH_MASK) = 0) and
+ (Land[rect.y, tmpx] = Color) and (Land[by, tmpx] = Color) and
(Land[rect.y, tmpx2] = Color) and (Land[by, tmpx2] = Color);
inc(tmpx);
dec(tmpx2)
@@ -235,7 +237,9 @@
tmpy2:= by-1;
while (tmpy <= by - rect.h div 2 - 1) and bRes do
begin
- bRes:= (Land[tmpy, rect.x] = Color) and (Land[tmpy, bx] = Color) and
+ bRes:= ((tmpy and LAND_HEIGHT_MASK) = 0) and ((tmpy2 and LAND_HEIGHT_MASK) = 0) and
+ ((rect.x and LAND_WIDTH_MASK) = 0) and ((bx and LAND_WIDTH_MASK) = 0) and
+ (Land[tmpy, rect.x] = Color) and (Land[tmpy, bx] = Color) and
(Land[tmpy2, rect.x] = Color) and (Land[tmpy2, bx] = Color);
inc(tmpy);
dec(tmpy2)
@@ -364,7 +368,7 @@
procedure ReadThemeInfo(var ThemeObjects: TThemeObjects; var SprayObjects: TSprayObjects);
var s: shortstring;
f: textfile;
- i, ii: LongInt;
+ i, ii, numFlakes: LongInt;
c1, c2: TSDL_Color;
procedure CheckRect(Width, Height, x, y, w, h: LongWord);
@@ -456,14 +460,18 @@
Readln(f, vobFramesCount, vobFrameTicks, vobVelocity, vobFallSpeed);
// adjust amount of flakes scaled by screen space
-vobCount:= longint(vobCount) * cScreenSpace div LAND_WIDTH;
+vobCount:= longint(vobCount);
+numFlakes:= vobCount * cScreenSpace div LAND_WIDTH;
if (cReducedQuality and rqKillFlakes) <> 0 then
- vobCount:= 0;
-
+ numFlakes:= 0;
-for i:= 0 to Pred(vobCount) do
- AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake);
+if Theme <> 'Snow' then
+ for i:= 0 to Pred(numFlakes) do
+ AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake)
+else
+ for i:= 0 to Pred(numFlakes div 3) do
+ AddVisualGear(cLeftScreenBorder + random(cScreenSpace), random(1024+200) - 100 + LAND_HEIGHT, vgtFlake);
Close(f);
{$I+}
--- a/hedgewars/uMisc.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uMisc.pas Thu Dec 23 11:13:57 2010 -0500
@@ -122,11 +122,11 @@
var convertedSurf: PSDL_Surface = nil;
begin
if (tmpsurf^.format^.bitsperpixel = 24) or ((tmpsurf^.format^.bitsperpixel = 32) and (tmpsurf^.format^.rshift > tmpsurf^.format^.bshift)) then
- begin
+ begin
convertedSurf:= SDL_ConvertSurface(tmpsurf, @conversionFormat, SDL_SWSURFACE);
SDL_FreeSurface(tmpsurf);
exit(convertedSurf);
- end;
+ end;
exit(tmpsurf);
end;
--- a/hedgewars/uRenderUtils.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uRenderUtils.pas Thu Dec 23 11:13:57 2010 -0500
@@ -175,7 +175,7 @@
var textWidth, textHeight, x, y, w, h, i, j, pos, prevpos, line, numLines, edgeWidth, edgeHeight, cornerWidth, cornerHeight: LongInt;
finalSurface, tmpsurf, rotatedEdge: PSDL_Surface;
rect: TSDL_Rect;
- chars: set of char = [#9,' ','.',';',':','?','!',','];
+ chars: set of char = [#9,' ',';',':','?','!',','];
substr: shortstring;
edge, corner, tail: TSPrite;
begin
@@ -353,4 +353,4 @@
SDL_FreeSurface(finalSurface);
end;
-end.
\ No newline at end of file
+end.
--- a/hedgewars/uScript.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uScript.pas Thu Dec 23 11:13:57 2010 -0500
@@ -381,7 +381,7 @@
vg^.dY:= lua_tonumber(L, 5);
vg^.Angle:= lua_tonumber(L, 6);
vg^.Frame:= lua_tointeger(L, 7);
- vg^.FrameTicks:= lua_tointeger(L, 8);
+ if lua_tointeger(L, 8) <> 0 then vg^.FrameTicks:= lua_tointeger(L, 8); // find a better way to do this. maybe need to break all these up.
vg^.State:= lua_tointeger(L, 9);
vg^.Timer:= lua_tointeger(L, 10);
vg^.Tint:= lua_tointeger(L, 11);
@@ -674,17 +674,17 @@
function lc_hogsay(L : Plua_State) : LongInt; Cdecl;
var gear : PGear;
vgear : PVisualGear;
+ s : LongWord;
begin
- if lua_gettop(L) <> 3 then
- begin
- LuaError('Lua: Wrong number of parameters passed to HogSay!');
- end
- else
+ if lua_gettop(L) = 4 then s:= lua_tointeger(L, 4)
+ else s:= 0;
+
+ if (lua_gettop(L) = 4) or (lua_gettop(L) = 3) then
begin
gear:= GearByUID(lua_tointeger(L, 1));
if gear <> nil then
begin
- vgear:= AddVisualGear(0, 0, vgtSpeechBubble);
+ vgear:= AddVisualGear(0, 0, vgtSpeechBubble, s, true);
if vgear <> nil then
begin
vgear^.Text:= lua_tostring(L, 2);
@@ -693,7 +693,8 @@
if (vgear^.FrameTicks < 1) or (vgear^.FrameTicks > 3) then vgear^.FrameTicks:= 1;
end;
end
- end;
+ end
+ else LuaError('Lua: Wrong number of parameters passed to HogSay!');
lc_hogsay:= 0
end;
@@ -826,9 +827,11 @@
function lc_findplace(L : Plua_State) : LongInt; Cdecl;
var gear: PGear;
fall: boolean;
+ tryhard: boolean;
left, right: LongInt;
begin
- if lua_gettop(L) <> 4 then
+ tryhard:= false;
+ if (lua_gettop(L) <> 4) and (lua_gettop(L) <> 5) then
LuaError('Lua: Wrong number of parameters passed to FindPlace!')
else
begin
@@ -836,10 +839,13 @@
fall:= lua_toboolean(L, 2);
left:= lua_tointeger(L, 3);
right:= lua_tointeger(L, 4);
+ if lua_gettop(L) = 5 then tryhard:= lua_toboolean(L, 5);
if gear <> nil then
- FindPlace(gear, fall, left, right)
+ FindPlace(gear, fall, left, right, tryhard);
+ if gear <> nil then lua_pushinteger(L, gear^.uid)
+ else lua_pushnil(L);
end;
- lc_findplace:= 0
+ lc_findplace:= 1
end;
function lc_playsound(L : Plua_State) : LongInt; Cdecl;
@@ -1081,6 +1087,18 @@
lua_pushstring(L, str2pchar(Pathz[ptData]));
lc_getdatapath:= 1
end;
+
+function lc_maphasborder(L : Plua_State) : LongInt; Cdecl;
+begin
+ if lua_gettop(L) <> 0 then
+ begin
+ LuaError('Lua: Wrong number of parameters passed to MapHasBorder!');
+ lua_pushnil(L);
+ end
+ else
+ lua_pushboolean(L, hasBorder);
+ lc_maphasborder:= 1
+end;
///////////////////
procedure ScriptPrintStack;
@@ -1491,6 +1509,7 @@
lua_register(luaState, 'GetRandom', @lc_getrandom);
lua_register(luaState, 'SetWind', @lc_setwind);
lua_register(luaState, 'GetDataPath', @lc_getdatapath);
+lua_register(luaState, 'MapHasBorder', @lc_maphasborder);
ScriptClearStack; // just to be sure stack is empty
--- a/hedgewars/uStore.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uStore.pas Thu Dec 23 11:13:57 2010 -0500
@@ -391,7 +391,7 @@
var tmpsurf: PSDL_Surface;
s: shortstring;
begin
- WriteToConsole(msgLoading + filename + '.png [flags: ' + inttostr(imageFlags) + ']');
+ WriteToConsole(msgLoading + filename + '.png [flags: ' + inttostr(imageFlags) + '] ');
s:= filename + '.png';
tmpsurf:= IMG_Load(Str2PChar(s));
--- a/hedgewars/uTypes.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uTypes.pas Thu Dec 23 11:13:57 2010 -0500
@@ -52,7 +52,7 @@
sprCheese, sprHandCheese, sprHandFlamethrower, sprChunk, sprNote,
sprSMineOff, sprSMineOn, sprHandSMine, sprHammer,
sprHandResurrector, sprCross, sprAirDrill, sprNapalmBomb,
- sprBulletHit
+ sprBulletHit, sprSnowball, sprHandSnowball, sprSnow
);
// Gears that interact with other Gears and/or Land
@@ -67,7 +67,7 @@
gtSniperRifleShot, gtJetpack, gtMolotov, gtExplosives, gtBirdy, // 45
gtEgg, gtPortal, gtPiano, gtGasBomb, gtSineGunShot, gtFlamethrower, // 51
gtSMine, gtPoisonCloud, gtHammer, gtHammerHit, gtResurrector, // 56
- gtNapalmBomb); // 57
+ gtNapalmBomb, gtSnowball, gtFlake); // 58
// Gears that are _only_ of visual nature (e.g. background stuff, visual effects, speechbubbles, etc.)
TVisualGearType = (vgtFlake, vgtCloud, vgtExplPart, vgtExplPart2, vgtFire,
@@ -112,7 +112,7 @@
amRCPlane, amLowGravity, amExtraDamage, amInvulnerable, amExtraTime, // 35
amLaserSight, amVampiric, amSniperRifle, amJetpack, amMolotov, amBirdy, amPortalGun, // 42
amPiano, amGasBomb, amSineGun, amFlamethrower, amSMine, amHammer, // 48
- amResurrector, amDrillStrike);
+ amResurrector, amDrillStrike, amSnowball);
TCrateType = (HealthCrate, AmmoCrate, UtilityCrate);
@@ -196,6 +196,7 @@
Timer : LongWord;
Elasticity: hwFloat;
Friction : hwFloat;
+ Density : hwFloat;
Message, MsgParam : Longword;
Hedgehog: PHedgehog;
Health, Damage, Karma: LongInt;
@@ -342,7 +343,7 @@
sidLowGravity, sidExtraDamage, sidInvulnerable, sidExtraTime,
sidLaserSight, sidVampiric, sidSniperRifle, sidJetpack,
sidMolotov, sidBirdy, sidPortalGun, sidPiano, sidGasBomb, sidSineGun, sidFlamethrower,
- sidSMine, sidHammer, sidResurrector, sidDrillStrike);
+ sidSMine, sidHammer, sidResurrector, sidDrillStrike, sidSnowball);
TMsgStrId = (sidStartFight, sidDraw, sidWinner, sidVolume, sidPaused,
sidConfirm, sidSuddenDeath, sidRemaining, sidFuel, sidSync,
--- a/hedgewars/uVariables.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uVariables.pas Thu Dec 23 11:13:57 2010 -0500
@@ -23,7 +23,7 @@
cReducedQuality : LongWord = rqNone;
//userNick is in uChat
recordFileName : shortstring = '';
- cReadyDelay : Longword = 0;
+ cReadyDelay : Longword = 5000;
cLogfileBase : shortstring = 'debug';
//////////////////////////
@@ -139,6 +139,8 @@
ScreenFadeValue : LongInt;
ScreenFadeSpeed : LongInt;
+ Theme : shortstring;
+
{$IFDEF SDL13}
SDLwindow : PSDL_Window;
{$ENDIF}
@@ -548,8 +550,14 @@
(FileName: 'BulletHit'; Path: ptGraphics; AltPath: ptNone;
Texture: nil; Surface: nil; Width: 32; Height: 32;
imageWidth: 0; imageHeight: 0; saveSurf: false; priority:
- tpMedium; getDimensions: false; getImageDimensions: true)
+ tpMedium; getDimensions: false; getImageDimensions: true),
// sprNapalmBomb
+ (FileName: 'Snowball'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
+ Width: 16; Height: 16; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprSnowball
+ (FileName: 'amSnowball'; Path: ptCurrTheme; AltPath: ptHedgehog; Texture: nil; Surface: nil;
+ Width: 64; Height: 64; imageWidth: 0; imageHeight: 0; saveSurf: false; priority: tpMedium; getDimensions: false; getImageDimensions: true),// sprHandSnowball
+ (FileName: 'Snow'; Path: ptCurrTheme; AltPath: ptGraphics; Texture: nil; Surface: nil;
+ Width: 4; Height: 4; imageWidth: 0; imageHeight: 0; saveSurf: true; priority: tpMedium; getDimensions: false; getImageDimensions: true) // sprSnow
);
@@ -1957,11 +1965,32 @@
PosCount: 2;
PosSprite: sprAmAirplane;
ejectX: 0;
+ ejectY: 0),
+// Snowball
+ (NameId: sidSnowball;
+ NameTex: nil;
+ Probability: 0;
+ NumberInCase: 1;
+ Ammo: (Propz: ammoprop_Power or ammoprop_AltUse;
+ Count: 2;
+ NumPerTurn: 0;
+ Timer: 0;
+ Pos: 0;
+ AmmoType: amSnowball;
+ AttackVoice: sndNone);
+ Slot: 0;
+ TimeAfterTurn: 3000;
+ minAngle: 0;
+ maxAngle: 0;
+ isDamaging: true;
+ SkipTurns: 0;
+ PosCount: 1;
+ PosSprite: sprWater;
+ ejectX: 0;
ejectY: 0)
);
-
conversionFormat: TSDL_PixelFormat = (
palette: nil;
BitsPerPixel : 32;
@@ -2248,7 +2277,7 @@
cReducedQuality := rqNone;
//userNick is in uChat
recordFileName := '';
- cReadyDelay := 0;
+ cReadyDelay := 5000;
end;
end.
--- a/hedgewars/uVisualGears.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uVisualGears.pas Thu Dec 23 11:13:57 2010 -0500
@@ -374,6 +374,7 @@
procedure DrawVisualGears(Layer: LongWord);
var Gear: PVisualGear;
tinted: boolean;
+ tmp: real;
begin
Gear:= VisualGearsList;
case Layer of
@@ -497,7 +498,12 @@
vgtSmallDamageTag: DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
vgtSpeechBubble: if (Gear^.Tex <> nil) and (((Gear^.State = 0) and (Gear^.Hedgehog^.Team = CurrentTeam)) or (Gear^.State = 2)) then DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
vgtHealthTag: if Gear^.Tex <> nil then DrawCentered(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.Tex);
- vgtCircle: DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
+ vgtCircle: if gear^.Angle = 1 then
+ begin
+ tmp:= Gear^.State / 100;
+ DrawTexture(round(Gear^.X-24*tmp) + WorldDx, round(Gear^.Y-24*tmp) + WorldDy, SpritesData[sprVampiric].Texture, tmp)
+ end
+ else DrawCircle(round(Gear^.X) + WorldDx, round(Gear^.Y) + WorldDy, Gear^.State, Gear^.Timer);
end;
if (Gear^.Tint <> $FFFFFFFF) or tinted then Tint($FF,$FF,$FF,$FF);
Gear:= Gear^.NextGear
--- a/hedgewars/uWorld.pas Tue Dec 14 22:32:47 2010 +0100
+++ b/hedgewars/uWorld.pas Thu Dec 23 11:13:57 2010 -0500
@@ -1102,8 +1102,8 @@
end
else
begin
- r.x:= ((-icon - 1) shr 5) * 32;
- r.y:= ((-icon - 1) mod 32) * 32;
+ r.x:= ((-icon - 1) shr 4) * 32;
+ r.y:= ((-icon - 1) mod 16) * 32;
missionTex:= RenderHelpWindow(caption, subcaption, text, '', 0, SpritesData[sprAMAmmos].Surface, @r)
end;
end;
--- a/project_files/HedgewarsMobile/Classes/AboutViewController.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/AboutViewController.m Thu Dec 23 11:13:57 2010 -0500
@@ -98,7 +98,7 @@
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger) section {
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
char *fullver;
- short int proto = 20;
+ int proto;
HW_versionInfo(&proto, &fullver);
NSString *footerString = [[NSString alloc] initWithFormat:
--- a/project_files/HedgewarsMobile/Classes/CommodityFunctions.h Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/CommodityFunctions.h Thu Dec 23 11:13:57 2010 -0500
@@ -58,7 +58,7 @@
#define IS_DUALHEAD() ([[UIScreen class] respondsToSelector:@selector(screens)] && [[UIScreen screens] count] > 1)
#define IS_IPAD() (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad)
#define IS_NOT_POWERFUL() ([modelType() hasPrefix:@"iPhone1"] || [modelType() hasPrefix:@"iPod1,1"] || [modelType() hasPrefix:@"iPod2,1"])
-#define IS_NOT_VERY_POWERFUL() ([modelType() hasPrefix:@"iPad1"] || [modelType() hasPrefix:@"iPhone2"] || [modelType() hasPrefix:@"iPod3"] )
+#define IS_NOT_VERY_POWERFUL() ([modelType() hasPrefix:@"iPad1"] || [modelType() hasPrefix:@"iPhone2"] || [modelType() hasPrefix:@"iPod3"] || [modelType() hasPrefix:@"iPod4"] )
#define DEFAULT_NETGAME_PORT 46631
--- a/project_files/HedgewarsMobile/Classes/CreationChamber.h Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/CreationChamber.h Thu Dec 23 11:13:57 2010 -0500
@@ -23,4 +23,4 @@
void createTeamNamed (NSString *nameWithoutExt);
void createWeaponNamed (NSString *nameWithoutExt, int type);
-void createSchemeNamed (NSString *nameWithoutExt);
\ No newline at end of file
+void createSchemeNamed (NSString *nameWithoutExt);
--- a/project_files/HedgewarsMobile/Classes/CreationChamber.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/CreationChamber.m Thu Dec 23 11:13:57 2010 -0500
@@ -74,57 +74,54 @@
NSDictionary *theWeapon = nil;
switch (type) {
- case 0: //default
+ default: //default
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"93919294221991210322351110012010000002111101010111",@"ammostore_initialqt",
- @"04050405416006555465544647765766666661555101011154",@"ammostore_probability",
- @"00000000000002055000000400070040000000002000000006",@"ammostore_delay",
- @"13111103121111111231141111111111111112111111011111",@"ammostore_crate", nil];
+ @"939192942219912103223511100120100000021111010101112",@"ammostore_initialqt",
+ @"040504054160065554655446477657666666615551010111541",@"ammostore_probability",
+ @"000000000000020550000004000700400000000020000000060",@"ammostore_delay",
+ @"131111031211111112311411111111111111121111110111112",@"ammostore_crate", nil];
break;
case 1: //crazy
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"99999999999999999929999999999999992999999999099999",@"ammostore_initialqt",
- @"11111101111111111111111111111111111111111111011111",@"ammostore_probability",
- @"00000000000000000000000000000000000000000000000000",@"ammostore_delay",
- @"13111103121111111231141111111111111112111101011111",@"ammostore_crate", nil];
+ @"999999999999999999299999999999999929999999990999999",@"ammostore_initialqt",
+ @"111111011111111111111111111111111111111111110111111",@"ammostore_probability",
+ @"000000000000000000000000000000000000000000000000000",@"ammostore_delay",
+ @"131111031211111112311411111111111111121111010111111",@"ammostore_crate", nil];
break;
case 2: //pro mode
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"90900090000000000000090000000000000000000000000000",@"ammostore_initialqt",
- @"00000000000000000000000000000000000000000000000000",@"ammostore_probability",
- @"00000000000002055000000400070040000000002000000000",@"ammostore_delay",
- @"11111111111111111111111111111111111111111001011111",@"ammostore_crate", nil];
+ @"909000900000000000000900000000000000000000000000000",@"ammostore_initialqt",
+ @"000000000000000000000000000000000000000000000000000",@"ammostore_probability",
+ @"000000000000020550000004000700400000000020000000000",@"ammostore_delay",
+ @"111111111111111111111111111111111111111110010111111",@"ammostore_crate", nil];
break;
case 3: //shoppa
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"00000099000000000000000000000000000000000000000000",@"ammostore_initialqt",
- @"44444100442444022101121212224220000000020004000100",@"ammostore_probability",
- @"00000000000000000000000000000000000000000000000000",@"ammostore_delay",
- @"11111111111111111111111111111111111111111011011111",@"ammostore_crate", nil];
+ @"000000990000000000000000000000000000000000000000000",@"ammostore_initialqt",
+ @"444441004424440221011212122242200000000200040001001",@"ammostore_probability",
+ @"000000000000000000000000000000000000000000000000000",@"ammostore_delay",
+ @"111111111111111111111111111111111111111110110111111",@"ammostore_crate", nil];
break;
case 4: //clean slate
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"10100090000100000110000000000000000000000000000010",@"ammostore_initialqt",
- @"04050405416006555465544647765766666661555101011154",@"ammostore_probability",
- @"00000000000002055000000400070040000000002000000000",@"ammostore_delay",
- @"13111103121111111231141111111111111112111111011111",@"ammostore_crate", nil];
+ @"101000900001000001100000000000000000000000000000100",@"ammostore_initialqt",
+ @"040504054160065554655446477657666666615551010111541",@"ammostore_probability",
+ @"000000000000020550000004000700400000000020000000000",@"ammostore_delay",
+ @"131111031211111112311411111111111111121111110111111",@"ammostore_crate", nil];
break;
case 5: //minefield
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"00000099000900000003000000000000000000000000000000",@"ammostore_initialqt",
- @"00000000000000000000000000000000000000000000000000",@"ammostore_probability",
- @"00000000000002055000000400070040000000002000000000",@"ammostore_delay",
- @"11111111111111111111111111111111111111111111011111",@"ammostore_crate", nil];
+ @"000000990009000000030000000000000000000000000000000",@"ammostore_initialqt",
+ @"000000000000000000000000000000000000000000000000000",@"ammostore_probability",
+ @"000000000000020550000004000700400000000020000000000",@"ammostore_delay",
+ @"111111111111111111111111111111111111111111110111111",@"ammostore_crate", nil];
break;
case 6: //thinking with portals
theWeapon = [[NSDictionary alloc] initWithObjectsAndKeys:
- @"90000090020000000021000000000000001100000900000000",@"ammostore_initialqt",
- @"04050405416006555465544647765766666661555101011154",@"ammostore_probability",
- @"00000000000002055000000400070040000000002000000006",@"ammostore_delay",
- @"13111103121111111231141111111111111112111111011111",@"ammostore_crate", nil];
- break;
- default:
- NSLog(@"Nope");
+ @"900000900200000000210000000000000011000009000000000",@"ammostore_initialqt",
+ @"040504054160065554655446477657666666615551010111541",@"ammostore_probability",
+ @"000000000000020550000004000700400000000020000000060",@"ammostore_delay",
+ @"131111031211111112311411111111111111121111110111111",@"ammostore_crate", nil];
break;
}
@@ -145,47 +142,51 @@
error:NULL];
}
+ int basicFlags[] = {100, 100, 45, 15, 47, 5, 100, 5, 35, 25, 3, 4, 0, 2};
+ BOOL gameFlags[] = {NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, NO, YES, NO, NO, NO, NO,
+ NO, NO, NO, NO, NO, NO, NO};
+
NSMutableArray *basicArray = [[NSMutableArray alloc] initWithObjects:
- [NSNumber numberWithInt:100], //initialhealth
- [NSNumber numberWithInt:45], //turntime
- [NSNumber numberWithInt:3], //minestime
- [NSNumber numberWithInt:100], //damagemodifier
- [NSNumber numberWithInt:15], //suddendeathtimeout
- [NSNumber numberWithInt:47], //waterrise
- [NSNumber numberWithInt:5], //healthdecrease
- [NSNumber numberWithInt:100], //ropelength
- [NSNumber numberWithInt:5], //cratedrops
- [NSNumber numberWithInt:35], //healthprob
- [NSNumber numberWithInt:25], //healthamount
- [NSNumber numberWithInt:4], //minesnumber
- [NSNumber numberWithInt:0], //dudmines
- [NSNumber numberWithInt:2], //explosives
+ [NSNumber numberWithInt:basicFlags[0]], //initialhealth
+ [NSNumber numberWithInt:basicFlags[1]], //damagemodifier
+ [NSNumber numberWithInt:basicFlags[2]], //turntime
+ [NSNumber numberWithInt:basicFlags[3]], //suddendeathtimeout
+ [NSNumber numberWithInt:basicFlags[4]], //waterrise
+ [NSNumber numberWithInt:basicFlags[5]], //healthdecrease
+ [NSNumber numberWithInt:basicFlags[6]], //ropelength
+ [NSNumber numberWithInt:basicFlags[7]], //cratedrops
+ [NSNumber numberWithInt:basicFlags[8]], //healthprob
+ [NSNumber numberWithInt:basicFlags[9]], //healthamount
+ [NSNumber numberWithInt:basicFlags[10]], //minestime
+ [NSNumber numberWithInt:basicFlags[11]], //minesnumber
+ [NSNumber numberWithInt:basicFlags[12]], //dudmines
+ [NSNumber numberWithInt:basicFlags[13]], //explosives
nil];
NSMutableArray *gamemodArray= [[NSMutableArray alloc] initWithObjects:
- [NSNumber numberWithBool:NO], //fortmode
- [NSNumber numberWithBool:NO], //divideteam
- [NSNumber numberWithBool:NO], //solidland
- [NSNumber numberWithBool:NO], //addborder
- [NSNumber numberWithBool:NO], //lowgravity
- [NSNumber numberWithBool:NO], //lasersight
- [NSNumber numberWithBool:NO], //invulnerable
- [NSNumber numberWithBool:NO], //resethealth
- [NSNumber numberWithBool:NO], //vampirism
- [NSNumber numberWithBool:NO], //karma
- [NSNumber numberWithBool:NO], //artillery
- [NSNumber numberWithBool:YES], //randomorder
- [NSNumber numberWithBool:NO], //king
- [NSNumber numberWithBool:NO], //placehedgehogs
- [NSNumber numberWithBool:NO], //clansharesammo
- [NSNumber numberWithBool:NO], //disablegirders
- [NSNumber numberWithBool:NO], //disablelandobjects
- [NSNumber numberWithBool:NO], //aisurvival
- [NSNumber numberWithBool:NO], //infattack
- [NSNumber numberWithBool:NO], //resetweaps
- [NSNumber numberWithBool:NO], //perhogammo
- [NSNumber numberWithBool:NO], //nowind
- [NSNumber numberWithBool:NO], //morewind
+ [NSNumber numberWithBool:gameFlags[0]], //fortmode
+ [NSNumber numberWithBool:gameFlags[1]], //divideteam
+ [NSNumber numberWithBool:gameFlags[2]], //solidland
+ [NSNumber numberWithBool:gameFlags[3]], //addborder
+ [NSNumber numberWithBool:gameFlags[4]], //lowgravity
+ [NSNumber numberWithBool:gameFlags[5]], //lasersight
+ [NSNumber numberWithBool:gameFlags[6]], //invulnerable
+ [NSNumber numberWithBool:gameFlags[7]], //resethealth
+ [NSNumber numberWithBool:gameFlags[8]], //vampirism
+ [NSNumber numberWithBool:gameFlags[9]], //karma
+ [NSNumber numberWithBool:gameFlags[10]], //artillery
+ [NSNumber numberWithBool:gameFlags[11]], //randomorder
+ [NSNumber numberWithBool:gameFlags[12]], //king
+ [NSNumber numberWithBool:gameFlags[13]], //placehedgehogs
+ [NSNumber numberWithBool:gameFlags[14]], //clansharesammo
+ [NSNumber numberWithBool:gameFlags[15]], //disablegirders
+ [NSNumber numberWithBool:gameFlags[16]], //disablelandobjects
+ [NSNumber numberWithBool:gameFlags[17]], //aisurvival
+ [NSNumber numberWithBool:gameFlags[18]], //infattack
+ [NSNumber numberWithBool:gameFlags[19]], //resetweaps
+ [NSNumber numberWithBool:gameFlags[20]], //perhogammo
+ [NSNumber numberWithBool:gameFlags[21]], //nowind
+ [NSNumber numberWithBool:gameFlags[22]], //morewind
nil];
NSMutableDictionary *theScheme = [[NSMutableDictionary alloc] initWithObjectsAndKeys:
--- a/project_files/HedgewarsMobile/Classes/GameSetup.h Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/GameSetup.h Thu Dec 23 11:13:57 2010 -0500
@@ -42,9 +42,8 @@
-(id) initWithDictionary:(NSDictionary *)gameDictionary;
-(void) engineProtocol;
--(void) startThread:(NSString *)selector;
--(int) sendToEngine:(NSString *)string;
--(int) sendToEngineNoSave:(NSString *)string;
+-(int) sendToEngine:(NSString *)string;
+-(int) sendToEngineNoSave:(NSString *)string;
-(void) provideTeamData:(NSString *)teamName forHogs:(NSInteger) numberOfPlayingHogs withHealth:(NSInteger) initialHealth ofColor:(NSNumber *)teamColor;
-(void) provideAmmoData:(NSString *)ammostoreName forPlayingTeams:(NSInteger) numberOfTeams;
-(NSInteger) provideScheme:(NSString *)schemeName;
--- a/project_files/HedgewarsMobile/Classes/GameSetup.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/GameSetup.m Thu Dec 23 11:13:57 2010 -0500
@@ -21,7 +21,6 @@
#import "GameSetup.h"
#import "SDL_uikitappdelegate.h"
-#import "SDL_net.h"
#import "PascalImports.h"
#import "CommodityFunctions.h"
#import "OverlayViewController.h"
@@ -183,28 +182,16 @@
NSArray *mods = [[NSArray alloc] initWithContentsOfFile:path];
[path release];
- int i = 0;
- // initial health
- result = [[basicArray objectAtIndex:i++] intValue];
+ result = [[basicArray objectAtIndex:0] intValue];
- // turn time
- NSInteger tentativeTurntime = [[basicArray objectAtIndex:i++] intValue];
- if (tentativeTurntime >= 100)
- tentativeTurntime = 9999;
- NSString *turnTime = [[NSString alloc] initWithFormat:@"e$turntime %d",tentativeTurntime * 1000];
- [self sendToEngine:turnTime];
- [turnTime release];
-
- NSString *minesTime = [[NSString alloc] initWithFormat:@"e$turntime %d",[[basicArray objectAtIndex:i++] intValue] * 1000];
- [self sendToEngine:minesTime];
- [minesTime release];
-
- for (; i < [basicArray count]; i++) {
- NSDictionary *basicDict = [mods objectAtIndex:i];
- NSString *command = [basicDict objectForKey:@"command"];
+ for (int i = 1; i < [basicArray count]; i++) {
+ NSDictionary *dict = [mods objectAtIndex:i];
+ NSString *command = [dict objectForKey:@"command"];
NSInteger value = [[basicArray objectAtIndex:i] intValue];
- if ([basicDict objectForKey:@"checkOverMax"] && value >= [[basicDict objectForKey:@"max"] intValue])
+ if ([[dict objectForKey:@"checkOverMax"] boolValue] && value >= [[dict objectForKey:@"max"] intValue])
value = 9999;
+ if ([[dict objectForKey:@"times1000"] boolValue])
+ value = value * 1000;
NSString *strToSend = [[NSString alloc] initWithFormat:@"%@ %d",command,value];
[self sendToEngine:strToSend];
[strToSend release];
@@ -216,13 +203,7 @@
}
#pragma mark -
-#pragma mark Thread/Network relevant code
-// select one of GameSetup method and execute it in a seprate thread
--(void) startThread:(NSString *)selector {
- SEL usage = NSSelectorFromString(selector);
- [NSThread detachNewThreadSelector:usage toTarget:self withObject:nil];
-}
-
+#pragma mark Network relevant code
-(void) dumpRawData:(const uint8_t*)buffer ofSize:(uint8_t) length {
// is it performant to reopen the stream every time?
NSOutputStream *os = [[NSOutputStream alloc] initToFileAtPath:self.savePath append:YES];
@@ -250,148 +231,6 @@
return SDLNet_TCP_Send(csd, [string UTF8String], length);
}
--(int) sendToServer:(NSString *)command withArgument:(NSString *)argument {
- NSString *message = [[NSString alloc] initWithFormat:@"%@\n%@\n\n",command,argument];
- int result = SDLNet_TCP_Send(esd, [message UTF8String], [message length]);
- [message release];
- return result;
-}
-
--(int) sendToServer:(NSString *)command {
- NSString *message = [[NSString alloc] initWithFormat:@"%@\n\n",command];
- int result = SDLNet_TCP_Send(esd, [message UTF8String], [message length]);
- [message release];
- return result;
-}
-
--(void) serverProtocol {
- NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
- IPaddress ip;
- BOOL clientQuit = NO;
- char *buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE);
- int dim = BUFFER_SIZE;
- uint8_t msgSize;
- NSString *arg = nil;
-
- if (SDLNet_Init() < 0) {
- DLog(@"SDLNet_Init: %s", SDLNet_GetError());
- clientQuit = YES;
- }
-
- // Resolving the host using NULL make network interface to listen
- if (SDLNet_ResolveHost(&ip, "netserver.hedgewars.org", DEFAULT_NETGAME_PORT) < 0 && !clientQuit) {
- DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
- clientQuit = YES;
- }
-
- // Open a connection with the IP provided (listen on the host's port)
- if (!(esd = SDLNet_TCP_Open(&ip)) && !clientQuit) {
- DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), DEFAULT_NETGAME_PORT);
- clientQuit = YES;
- }
-
- DLog(@"Found server on port %d", DEFAULT_NETGAME_PORT);
- while (!clientQuit) {
- int index = 0;
- BOOL exitBufferLoop = NO;
- memset(buffer, '\0', dim);
-
- while (exitBufferLoop != YES) {
- msgSize = SDLNet_TCP_Recv(esd, &buffer[index], 2);
-
- // exit in case of error
- if (msgSize <= 0) {
- DLog(@"SDLNet_TCP_Recv: %s", SDLNet_GetError());
- clientQuit = YES;
- break;
- }
-
- // update index position and check for End-Of-Message
- index += msgSize;
- if (strncmp(&buffer[index-2], "\n\n", 2) == 0) {
- exitBufferLoop = YES;
- }
-
- // if message is too big allocate new space
- if (index >= dim) {
- dim += BUFFER_SIZE;
- buffer = (char *)realloc(buffer, dim);
- if (buffer == NULL) {
- clientQuit = YES;
- break;
- }
- }
- }
-
- NSString *bufferedMessage = [[NSString alloc] initWithBytes:buffer length:index-2 encoding:NSASCIIStringEncoding];
- NSArray *listOfCommands = [bufferedMessage componentsSeparatedByString:@"\n"];
- [bufferedMessage release];
- NSString *command = [listOfCommands objectAtIndex:0];
- DLog(@"size = %d, %@", index-2, listOfCommands);
- if ([command isEqualToString:@"PING"]) {
- if ([listOfCommands count] > 1)
- [self sendToServer:@"PONG" withArgument:[listOfCommands objectAtIndex:1]];
- else
- [self sendToServer:@"PONG"];
-
- [arg release];
- }
- else if ([command isEqualToString:@"NICK"]) {
- //TODO: what is this for?
- }
- else if ([command isEqualToString:@"PROTO"]) {
- if ([[listOfCommands objectAtIndex:1] intValue] == 34) {
- //TODO: unused
- }
- }
- else if ([command isEqualToString:@"ROOM"]) {
- //TODO: stub
- }
- else if ([command isEqualToString:@"LOBBY:LEFT"]) {
- //TODO: stub
- }
- else if ([command isEqualToString:@"LOBBY:JOINED"]) {
- //TODO: stub
- }
- else if ([command isEqualToString:@"ASKPASSWORD"]) {
- //TODO: store hashed password in settings.plist (nil here will vouluntary trigger an exception)
- [self sendToServer:@"PASSWORD" withArgument:nil];
- }
- else if ([command isEqualToString:@"CONNECTED"]) {
- [self sendToServer:@"NICK" withArgument:@"koda"];
- [self sendToServer:@"PROTO" withArgument:@"34"];
- }
- else if ([command isEqualToString:@"SERVER_MESSAGE"]) {
- DLog(@"%@", [listOfCommands objectAtIndex:1]);
- }
- else if ([command isEqualToString:@"WARNING"]) {
- if ([listOfCommands count] > 1)
- DLog(@"Server warning - %@", [listOfCommands objectAtIndex:1]);
- else
- DLog(@"Server warning - unknown");
- }
- else if ([command isEqualToString:@"ERROR"]) {
- DLog(@"Server error - %@", [listOfCommands objectAtIndex:1]);
- }
- else if ([command isEqualToString:@"BYE"]) {
- //TODO: handle "Reconnected too fast"
- DLog(@"Server disconnected, reason: %@", [listOfCommands objectAtIndex:1]);
- clientQuit = YES;
- }
- else {
- DLog(@"Unknown/Unsupported message received: %@", command);
- }
- }
- DLog(@"Server exited, ending thread");
-
- free(buffer);
- // Close the client socket
- SDLNet_TCP_Close(esd);
- SDLNet_Quit();
-
- [pool release];
-}
-
// method that handles net setup with engine and keeps connection alive
-(void) engineProtocol {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
@@ -494,14 +333,14 @@
[self dumpRawData:buffer ofSize:msgSize];
sscanf((char *)buffer, "%*s %d", &eProto);
- short int netProto = 0;
+ int netProto;
char *versionStr;
HW_versionInfo(&netProto, &versionStr);
if (netProto == eProto) {
DLog(@"Setting protocol version %d (%s)", eProto, versionStr);
} else {
- DLog(@"ERROR - wrong protocol number: [%s] - expecting %d", &buffer[1], eProto);
+ DLog(@"ERROR - wrong protocol number: %d (expecting %d)", netProto, eProto);
clientQuit = YES;
}
break;
@@ -510,11 +349,35 @@
case 'r':
DLog(@"Winning team: %s", &buffer[2]);
break;
+ case 'D':
+ DLog(@"Best Shot: %s", &buffer[2]);
+ break;
case 'k':
DLog(@"Best Hedgehog: %s", &buffer[2]);
break;
+ case 'K':
+ DLog(@"Hogs Killed: %s", &buffer[2]);
+ break;
+ case 'H':
+ //something about team health
+ break;
+ case 'T':
+ // local team stats
+ break;
+ case 'P':
+ // player postion
+ break;
+ case 's':
+ DLog(@"Most self damage: %s", &buffer[2]);
+ break;
+ case 'S':
+ DLog(@"Most friendly fire: %s", &buffer[2]);
+ break;
+ case 'B':
+ DLog(@"Most turn skipped by: %s", &buffer[2]);
+ break;
default:
- // TODO: losta stats stuff
+ DLog(@"Unhandled stat message, see statsPage.cpp");
break;
}
break;
@@ -570,19 +433,19 @@
NSString *verticalSize = [[NSString alloc] initWithFormat:@"%d", height];
const char **gameArgs = (const char**) malloc(sizeof(char *) * 10);
NSInteger tmpQuality;
+ BOOL enhanced = [[self.systemSettings objectForKey:@"enhanced"] boolValue];
NSString *modelId = modelType();
- if ([modelId hasPrefix:@"iPhone1"] || // = iPhone or iPhone 3G
- [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) // = iPod Touch or iPod Touch 2G
- tmpQuality = 0x00000001 | 0x00000002 | 0x00000008 | 0x00000040; // rqLowRes | rqBlurryLand | rqSimpleRope | rqKillFlakes
- else if ([modelId hasPrefix:@"iPhone2"] || // = iPhone 3GS
- [modelId hasPrefix:@"iPod3"]) // = iPod Touch 3G
- tmpQuality = 0x00000002 | 0x00000040; // rqBlurryLand | rqKillFlakes
- else if ([modelId hasPrefix:@"iPad1"]) // = iPad
- tmpQuality = 0x00000002; // rqBlurryLand
- else // = everything else
- tmpQuality = 0; // full quality
- if (IS_IPAD() == NO) // = disable tooltips on phone
+ if ([modelId hasPrefix:@"iPhone1"] || [modelId hasPrefix:@"iPod1,1"] || [modelId hasPrefix:@"iPod2,1"]) // = iPhone and iPhone 3G or iPod Touch or iPod Touch 2G
+ tmpQuality = 0x00000001 | 0x00000002 | 0x00000008 | 0x00000040; // rqLowRes | rqBlurryLand | rqSimpleRope | rqKillFlakes
+ else if ([modelId hasPrefix:@"iPhone2"] || [modelId hasPrefix:@"iPod3"]) // = iPhone 3GS or iPod Touch 3G
+ tmpQuality = 0x00000002 | 0x00000040; // rqBlurryLand | rqKillFlakes
+ else if ([modelId hasPrefix:@"iPad1"] || [modelId hasPrefix:@"iPod4"] || enhanced == NO) // = iPad 1G or iPod Touch 4G or not enhanced mode
+ tmpQuality = 0x00000002; // rqBlurryLand
+ else // = everything else
+ tmpQuality = 0; // full quality
+
+ if (IS_IPAD() == NO) // = disable tooltips on phone
tmpQuality = tmpQuality | 0x00000400;
// prevents using an empty nickname
--- a/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/GeneralSettingsViewController.m Thu Dec 23 11:13:57 2010 -0500
@@ -76,7 +76,13 @@
case 30: //alternateSwitch
[self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"alternate"];
break;
- case 60: //getReady
+ case 70: //enhanced graphics
+ [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"enhanced"];
+ break;
+ case 80: //nomultitasking
+ [self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"multitasking"];
+ break;
+ case 60: //classic menu
[self.settingsDictionary setObject:[NSNumber numberWithBool:theSwitch.on] forKey:@"menu"];
break;
default:
@@ -88,8 +94,10 @@
-(void) saveTextFieldValue:(NSString *)textString withTag:(NSInteger) tagValue {
if (tagValue == 40)
[self.settingsDictionary setObject:textString forKey:@"username"];
- else
- [self.settingsDictionary setObject:textString forKey:@"password"];
+ else {
+ [self.settingsDictionary setObject:[NSNumber numberWithInt:[textString length]] forKey:@"password_length"];
+ [self.settingsDictionary setObject:[textString MD5hash] forKey:@"password"];
+ }
}
#pragma mark -
@@ -98,7 +106,7 @@
return 3;
}
--(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+-(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger )section {
switch (section) {
case 0: // user and pass
return 1; // set 2 here for the password field
@@ -107,10 +115,10 @@
return 2;
break;
case 2: // other stuff
- if (IS_IPAD())
- return 2;
+ if (IS_IPAD() == YES)
+ return 4;
else
- return 1;
+ return 3;
break;
default:
DLog(@"Nope");
@@ -166,11 +174,19 @@
editableCell.textField.secureTextEntry = NO;
editableCell.tag = 40;
} else {
+ // create a dummy password for setting some visual content for the password
+ int pwdLength = [[self.settingsDictionary objectForKey:@"password_length"] intValue];
+ char *dummyStr = (char *)malloc(sizeof(char)*pwdLength);
+ for (int i = 0; i < pwdLength; i++)
+ dummyStr[i] = i;
+ NSString *dummy = [[NSString alloc] initWithBytes:dummyStr length:pwdLength encoding:NSASCIIStringEncoding];
+ free(dummyStr);
editableCell.titleLabel.text = NSLocalizedString(@"Password","from the settings table");
editableCell.textField.placeholder = NSLocalizedString(@"Insert your password",@"");
- editableCell.textField.text = [self.settingsDictionary objectForKey:@"password"];
+ editableCell.textField.text = dummy;
editableCell.textField.secureTextEntry = YES;
editableCell.tag = 50;
+ [dummy release];
}
editableCell.accessoryView = nil;
@@ -208,16 +224,34 @@
}
switchContent = (UISwitch *)cell.accessoryView;
- if (row == 0) {
- cell.textLabel.text = NSLocalizedString(@"Alternate Damage", @"");
- cell.detailTextLabel.text = NSLocalizedString(@"Damage popups will notify you on every single hit", @"");
- switchContent.on = [[self.settingsDictionary objectForKey:@"alternate"] boolValue];
- switchContent.tag = 30;
- } else {
- cell.textLabel.text = NSLocalizedString(@"Classic Ammo Menu", @"");
- cell.detailTextLabel.text = NSLocalizedString(@"Select which style of ammo menu you prefer",@"");
- switchContent.on = [[self.settingsDictionary objectForKey:@"menu"] boolValue];
- switchContent.tag = 60;
+ switch (row) {
+ case 0:
+ cell.textLabel.text = NSLocalizedString(@"Alternate Damage", @"");
+ cell.detailTextLabel.text = NSLocalizedString(@"Damage popups will notify you on every single hit", @"");
+ switchContent.on = [[self.settingsDictionary objectForKey:@"alternate"] boolValue];
+ switchContent.tag = 30;
+ break;
+ case 1:
+ cell.textLabel.text = NSLocalizedString(@"Enanched Graphics Mode", @"");
+ cell.detailTextLabel.text = NSLocalizedString(@"The game will use more memory so it could crash!", @"");
+ switchContent.on = [[self.settingsDictionary objectForKey:@"enhanced"] boolValue];
+ switchContent.tag = 70;
+ break;
+ case 2:
+ cell.textLabel.text = NSLocalizedString(@"Multitasking Enabled", @"");
+ cell.detailTextLabel.text = NSLocalizedString(@"Disable it in case of issues when returing in game", @"");
+ switchContent.on = [[self.settingsDictionary objectForKey:@"multitasking"] boolValue];
+ switchContent.tag = 80;
+ break;
+ case 3:
+ cell.textLabel.text = NSLocalizedString(@"Classic Ammo Menu", @"");
+ cell.detailTextLabel.text = NSLocalizedString(@"Select which style of ammo menu you prefer",@"");
+ switchContent.on = [[self.settingsDictionary objectForKey:@"menu"] boolValue];
+ switchContent.tag = 60;
+ break;
+ default:
+ DLog(@"Nope");
+ break;
}
break;
default:
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m Thu Dec 23 11:13:57 2010 -0500
@@ -27,6 +27,7 @@
#import "SplitViewRootController.h"
#import "AboutViewController.h"
#import "SavedGamesViewController.h"
+#import "ServerSetup.h"
@implementation MainMenuViewController
@synthesize gameConfigViewController, settingsViewController, aboutViewController, savedGamesViewController;
@@ -124,6 +125,15 @@
[userDefaults synchronize];
[self createNecessaryFiles];
}
+
+ ServerSetup *setup = [[ServerSetup alloc] init];
+ if ([setup isNetworkReachable]) {
+ DLog(@"network is reachable");
+ [NSThread detachNewThreadSelector:@selector(serverProtocol)
+ toTarget:setup
+ withObject:nil];
+ }
+ [setup release];
}
--- a/project_files/HedgewarsMobile/Classes/OverlayViewController.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/OverlayViewController.m Thu Dec 23 11:13:57 2010 -0500
@@ -509,11 +509,25 @@
#pragma mark -
#pragma mark Custom touch event handling
+-(BOOL) shouldIgnoreTouch:(NSSet *)allTouches {
+ if (isGameRunning() == NO)
+ return YES;
+
+ // ignore activity near the dpad and buttons
+ CGPoint touchPoint = [[[allTouches allObjects] objectAtIndex:0] locationInView:self.view];
+ CGSize screen = [[UIScreen mainScreen] bounds].size;
+
+ if ((touchPoint.x < 160 && touchPoint.y > screen.width - 155 ) ||
+ (touchPoint.x > screen.height - 135 && touchPoint.y > screen.width - 140))
+ return YES;
+ return NO;
+}
+
-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSSet *allTouches = [event allTouches];
UITouch *first, *second;
- if (isGameRunning() == NO)
+ if ([self shouldIgnoreTouch:allTouches] == YES)
return;
// hide in-game menu
@@ -552,9 +566,9 @@
NSSet *allTouches = [event allTouches];
CGPoint currentPosition = [[[allTouches allObjects] objectAtIndex:0] locationInView:self.view];
- if (isGameRunning() == NO)
+ if ([self shouldIgnoreTouch:allTouches] == YES)
return;
-
+
switch ([allTouches count]) {
case 1:
// if we're in the menu we just click in the point
@@ -644,9 +658,9 @@
int x, y, dx, dy;
UITouch *touch, *first, *second;
- if (isGameRunning() == NO)
+ if ([self shouldIgnoreTouch:allTouches] == YES)
return;
-
+
switch ([allTouches count]) {
case 1:
touch = [[allTouches allObjects] objectAtIndex:0];
--- a/project_files/HedgewarsMobile/Classes/PascalImports.h Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/PascalImports.h Thu Dec 23 11:13:57 2010 -0500
@@ -34,7 +34,7 @@
void GenLandPreview(void);
void LoadLocaleWrapper(const char *filename);
- void HW_versionInfo(short int *netProto, char **versionStr);
+ void HW_versionInfo(int *protoNum, char **versionStr);
void HW_click(void);
void HW_ammoMenu(void);
--- a/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/SDL_uikitappdelegate.m Thu Dec 23 11:13:57 2010 -0500
@@ -121,10 +121,10 @@
// pull out useful configuration info from various files
GameSetup *setup = [[GameSetup alloc] initWithDictionary:gameDictionary];
NSNumber *isNetGameNum = [gameDictionary objectForKey:@"netgame"];
-
- [setup startThread:@"engineProtocol"];
- if ([isNetGameNum boolValue] == YES)
- [setup startThread:@"serverProtocol"];
+
+ [NSThread detachNewThreadSelector:@selector(engineProtocol)
+ toTarget:setup
+ withObject:nil];
const char **gameArgs = [setup getSettings:[gameDictionary objectForKey:@"savefile"]];
NSNumber *menuStyle = [NSNumber numberWithBool:setup.menuStyle];
@@ -232,8 +232,9 @@
if ([device respondsToSelector:@selector(isMultitaskingSupported)] &&
device.multitaskingSupported &&
self.isInGame) {
- // multiasking in-game works only for ios >= 4.2, returns a black screen on other verions
- if (NSClassFromString(@"UIPrintInfo"))
+ // let's try to be permissive with multitasking here...
+ NSDictionary *settings = [[NSDictionary alloc] initWithContentsOfFile:SETTINGS_FILE()];
+ if ([[settings objectForKey:@"multitasking"] boolValue])
HW_suspend();
else {
// so the game returns to the configuration view
@@ -246,6 +247,7 @@
longjmp(*(jump_env()), 1);
}
}
+ [settings release];
}
}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/ServerSetup.h Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,35 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2009-2010 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * File created on 16/12/2010.
+ */
+
+
+#import <Foundation/Foundation.h>
+#import "SDL_net.h"
+
+@interface ServerSetup : NSObject {
+ NSDictionary *systemSettings;
+
+ TCPsocket sd; // External socket descriptor
+}
+
+@property (nonatomic, retain) NSDictionary *systemSettings;
+
+-(BOOL) isNetworkReachable;
+
+@end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Classes/ServerSetup.m Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,221 @@
+/*
+ * Hedgewars-iOS, a Hedgewars port for iOS devices
+ * Copyright (c) 2009-2010 Vittorio Giovara <vittorio.giovara@gmail.com>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * File created on 10/01/2010.
+ */
+
+
+#import "ServerSetup.h"
+#import "PascalImports.h"
+#import "CommodityFunctions.h"
+#import <SystemConfiguration/SCNetworkReachability.h>
+#import <netinet/in.h>
+
+#define BUFFER_SIZE 256
+
+@implementation ServerSetup
+@synthesize systemSettings;
+
+-(id) init {
+ if (self = [super init]) {
+ NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:SETTINGS_FILE()];
+ self.systemSettings = dict;
+ [dict release];
+ }
+ return self;
+}
+
+-(void) dealloc {
+
+ [super dealloc];
+}
+
+// reusing appirater method
+-(BOOL) isNetworkReachable {
+ // Create zero addy
+ struct sockaddr_in zeroAddress;
+ bzero(&zeroAddress, sizeof(zeroAddress));
+ zeroAddress.sin_len = sizeof(zeroAddress);
+ zeroAddress.sin_family = AF_INET;
+
+ // Recover reachability flags
+ SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress);
+ SCNetworkReachabilityFlags flags;
+
+ BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
+ CFRelease(defaultRouteReachability);
+
+ if (!didRetrieveFlags) {
+ NSLog(@"Error. Could not recover network reachability flags");
+ return NO;
+ }
+
+ BOOL isReachable = flags & kSCNetworkFlagsReachable;
+ BOOL needsConnection = flags & kSCNetworkFlagsConnectionRequired;
+ BOOL nonWiFi = flags & kSCNetworkReachabilityFlagsTransientConnection;
+
+ NSURL *testURL = [NSURL URLWithString:@"http://www.apple.com/"];
+ NSURLRequest *testRequest = [NSURLRequest requestWithURL:testURL
+ cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
+ timeoutInterval:20.0];
+ NSURLConnection *testConnection = [[NSURLConnection alloc] initWithRequest:testRequest delegate:self];
+
+ return ((isReachable && !needsConnection) || nonWiFi) ? (testConnection ? YES : NO) : NO;
+}
+
+-(int) sendToServer:(NSString *)command {
+ NSString *message = [[NSString alloc] initWithFormat:@"%@\n\n",command];
+ int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]);
+ [message release];
+ return result;
+}
+
+-(int) sendToServer:(NSString *)command withArgument:(NSString *)argument {
+ NSString *message = [[NSString alloc] initWithFormat:@"%@\n%@\n\n",command,argument];
+ int result = SDLNet_TCP_Send(sd, [message UTF8String], [message length]);
+ [message release];
+ return result;
+}
+
+-(void) serverProtocol {
+ NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
+ IPaddress ip;
+ BOOL clientQuit = NO;
+ char *buffer = (char *)malloc(sizeof(char)*BUFFER_SIZE);
+ int dim = BUFFER_SIZE;
+ uint8_t msgSize;
+
+ if (SDLNet_Init() < 0) {
+ DLog(@"SDLNet_Init: %s", SDLNet_GetError());
+ clientQuit = YES;
+ }
+
+ // Resolving the host using NULL make network interface to listen
+ if (SDLNet_ResolveHost(&ip, "netserver.hedgewars.org", DEFAULT_NETGAME_PORT) < 0 && !clientQuit) {
+ DLog(@"SDLNet_ResolveHost: %s\n", SDLNet_GetError());
+ clientQuit = YES;
+ }
+
+ // Open a connection with the IP provided (listen on the host's port)
+ if (!(sd = SDLNet_TCP_Open(&ip)) && !clientQuit) {
+ DLog(@"SDLNet_TCP_Open: %s %\n", SDLNet_GetError(), DEFAULT_NETGAME_PORT);
+ clientQuit = YES;
+ }
+
+ DLog(@"Found server on port %d", DEFAULT_NETGAME_PORT);
+ while (!clientQuit) {
+ int index = 0;
+ BOOL exitBufferLoop = NO;
+ memset(buffer, '\0', dim);
+
+ while (exitBufferLoop != YES) {
+ msgSize = SDLNet_TCP_Recv(sd, &buffer[index], 2);
+
+ // exit in case of error
+ if (msgSize <= 0) {
+ DLog(@"SDLNet_TCP_Recv: %s", SDLNet_GetError());
+ clientQuit = YES;
+ break;
+ }
+
+ // update index position and check for End-Of-Message
+ index += msgSize;
+ if (strncmp(&buffer[index-2], "\n\n", 2) == 0) {
+ exitBufferLoop = YES;
+ }
+
+ // if message is too big allocate new space
+ if (index >= dim) {
+ dim += BUFFER_SIZE;
+ buffer = (char *)realloc(buffer, dim);
+ if (buffer == NULL) {
+ clientQuit = YES;
+ break;
+ }
+ }
+ }
+
+ NSString *bufferedMessage = [[NSString alloc] initWithBytes:buffer length:index-2 encoding:NSASCIIStringEncoding];
+ NSArray *listOfCommands = [bufferedMessage componentsSeparatedByString:@"\n"];
+ [bufferedMessage release];
+ NSString *command = [listOfCommands objectAtIndex:0];
+ DLog(@"size = %d, %@", index-2, listOfCommands);
+ if ([command isEqualToString:@"PING"]) {
+ if ([listOfCommands count] > 1)
+ [self sendToServer:@"PONG" withArgument:[listOfCommands objectAtIndex:1]];
+ else
+ [self sendToServer:@"PONG"];
+ DLog(@"PONG");
+ }
+ else if ([command isEqualToString:@"NICK"]) {
+ //what is this for?
+ }
+ else if ([command isEqualToString:@"PROTO"]) {
+ //what is this for?
+ }
+ else if ([command isEqualToString:@"ROOM"]) {
+ //TODO: stub
+ }
+ else if ([command isEqualToString:@"LOBBY:LEFT"]) {
+ //TODO: stub
+ }
+ else if ([command isEqualToString:@"LOBBY:JOINED"]) {
+ //TODO: stub
+ }
+ else if ([command isEqualToString:@"ASKPASSWORD"]) {
+ NSString *pwd = [self.systemSettings objectForKey:@"password"];
+ [self sendToServer:@"PASSWORD" withArgument:pwd];
+ }
+ else if ([command isEqualToString:@"CONNECTED"]) {
+ int netProto;
+ char *versionStr;
+ HW_versionInfo(&netProto, &versionStr);
+ NSString *nick = [self.systemSettings objectForKey:@"username"];
+ [self sendToServer:@"NICK" withArgument:nick];
+ [self sendToServer:@"PROTO" withArgument:[NSString stringWithFormat:@"%d",netProto]];
+ }
+ else if ([command isEqualToString:@"SERVER_MESSAGE"]) {
+ DLog(@"%@", [listOfCommands objectAtIndex:1]);
+ }
+ else if ([command isEqualToString:@"WARNING"]) {
+ if ([listOfCommands count] > 1)
+ DLog(@"Server warning - %@", [listOfCommands objectAtIndex:1]);
+ else
+ DLog(@"Server warning - unknown");
+ }
+ else if ([command isEqualToString:@"ERROR"]) {
+ DLog(@"Server error - %@", [listOfCommands objectAtIndex:1]);
+ }
+ else if ([command isEqualToString:@"BYE"]) {
+ //TODO: handle "Reconnected too fast"
+ DLog(@"Server disconnected, reason: %@", [listOfCommands objectAtIndex:1]);
+ clientQuit = YES;
+ }
+ else {
+ DLog(@"Unknown/Unsupported message received: %@", command);
+ }
+ }
+ DLog(@"Server closed connection, ending thread");
+
+ free(buffer);
+ SDLNet_TCP_Close(sd);
+ SDLNet_Quit();
+
+ [pool release];
+}
+
+@end
--- a/project_files/HedgewarsMobile/Classes/TeamConfigViewController.m Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Classes/TeamConfigViewController.m Thu Dec 23 11:13:57 2010 -0500
@@ -222,21 +222,22 @@
}
-(CGFloat) tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section {
- return 20;
+ return IS_IPAD() ? 40 : 20;
}
-(UIView *)tableView:(UITableView *)tableView viewForFooterInSection:(NSInteger) section {
- UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, 20)];
+ NSInteger height = IS_IPAD() ? 40 : 20;
+ UIView *footer = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width, height)];
footer.backgroundColor = [UIColor clearColor];
- UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width*80/100, 20)];
- label.center = CGPointMake(self.tableView.frame.size.width/2, 20/2);
+ UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, self.tableView.frame.size.width*80/100, height)];
+ label.center = CGPointMake(self.tableView.frame.size.width/2, height/2);
label.textAlignment = UITextAlignmentCenter;
label.font = [UIFont italicSystemFontOfSize:12];
label.textColor = [UIColor whiteColor];
- label.numberOfLines = 1;
+ label.numberOfLines = 2;
if (section == 0)
- label.text = NSLocalizedString(@"Tap to add hogs or change color, touch and hold to remove team.",@"");
+ label.text = NSLocalizedString(@"Tap to add hogs or change color, touch and hold to remove a team.",@"");
else
label.text = NSLocalizedString(@"The robot badge indicates an AI-controlled team.",@"");
--- a/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Hedgewars.xcodeproj/project.pbxproj Thu Dec 23 11:13:57 2010 -0500
@@ -191,6 +191,7 @@
61DF0EDC1284DF2300F3F10B /* HelpPageLobbyViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61DF0EDB1284DF2300F3F10B /* HelpPageLobbyViewController-iPhone.xib */; };
61DF0F211284F72A00F3F10B /* HelpPageInGameViewController-iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 61DF0F201284F72A00F3F10B /* HelpPageInGameViewController-iPhone.xib */; };
61E1F4F811D004240016A5AA /* adler32.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61E1F4F711D004240016A5AA /* adler32.pas */; };
+ 61E2E12E12BAAEE30051B659 /* ServerSetup.m in Sources */ = {isa = PBXBuildFile; fileRef = 61E2E12D12BAAEE30051B659 /* ServerSetup.m */; };
61E2F7441283752C00E12521 /* fb.png in Resources */ = {isa = PBXBuildFile; fileRef = 61E2F7421283752C00E12521 /* fb.png */; };
61E2F7451283752C00E12521 /* tw.png in Resources */ = {isa = PBXBuildFile; fileRef = 61E2F7431283752C00E12521 /* tw.png */; };
61E5D68D12AB006F00566F29 /* uLandPainted.pas in Sources */ = {isa = PBXBuildFile; fileRef = 61E5D68C12AB006F00566F29 /* uLandPainted.pas */; };
@@ -971,6 +972,8 @@
61DF0EDB1284DF2300F3F10B /* HelpPageLobbyViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "HelpPageLobbyViewController-iPhone.xib"; path = "../Resources/HelpPageLobbyViewController-iPhone.xib"; sourceTree = "<group>"; };
61DF0F201284F72A00F3F10B /* HelpPageInGameViewController-iPhone.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = "HelpPageInGameViewController-iPhone.xib"; path = "Resources/HelpPageInGameViewController-iPhone.xib"; sourceTree = SOURCE_ROOT; };
61E1F4F711D004240016A5AA /* adler32.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = adler32.pas; path = ../../hedgewars/adler32.pas; sourceTree = SOURCE_ROOT; };
+ 61E2E12C12BAAEE30051B659 /* ServerSetup.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ServerSetup.h; sourceTree = "<group>"; };
+ 61E2E12D12BAAEE30051B659 /* ServerSetup.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = ServerSetup.m; sourceTree = "<group>"; };
61E2F7421283752C00E12521 /* fb.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = fb.png; path = Resources/Icons/fb.png; sourceTree = "<group>"; };
61E2F7431283752C00E12521 /* tw.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = tw.png; path = Resources/Icons/tw.png; sourceTree = "<group>"; };
61E5D68C12AB006F00566F29 /* uLandPainted.pas */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.pascal; name = uLandPainted.pas; path = ../../hedgewars/uLandPainted.pas; sourceTree = SOURCE_ROOT; };
@@ -1046,6 +1049,8 @@
6165924C11CA9CB400D6E256 /* MainMenuViewController-iPhone.xib */,
616591E611CA9BA200D6E256 /* GameSetup.h */,
616591E711CA9BA200D6E256 /* GameSetup.m */,
+ 61E2E12C12BAAEE30051B659 /* ServerSetup.h */,
+ 61E2E12D12BAAEE30051B659 /* ServerSetup.m */,
);
path = Classes;
sourceTree = "<group>";
@@ -2288,7 +2293,7 @@
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
- shellScript = "#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\ncp -R ${PROJECT_DIR}/../../share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some files from QTfrontend/res\nmkdir ${PROJECT_DIR}/Data/Graphics/Btn\ncp ${PROJECT_DIR}/../../QTfrontend/res/btn*.png ${PROJECT_DIR}/Data/Graphics/Btn\ncp ${PROJECT_DIR}/../../QTfrontend/res/ammopic.png ${PROJECT_DIR}/Data/Graphics/Btn/iconAmmo.png\ncp ${PROJECT_DIR}/../../QTfrontend/res/icon*.png ${PROJECT_DIR}/Data/Graphics/Btn\ncp -R ${PROJECT_DIR}/../../QTfrontend/res/botlevels ${PROJECT_DIR}/Data/Graphics/Hedgehog/botlevels\n\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg -delete\nfind ${PROJECT_DIR}/Data -name *.svgz -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\nfind ${PROJECT_DIR}/Data -name *.orig -delete\n\n#delete desktop frontend translation\nrm -rf ${PROJECT_DIR}/Data/Locale/hedgewars_*\n\n#delete dummy maps and hats\nrm -rf ${PROJECT_DIR}/Data/Maps/{test*,Ruler}\nrm -rf ${PROJECT_DIR}/Data/Hats/{TeamCap,TeamHeadband,TeamHair}\n\n#copy mono audio\ncp -R ${PROJECT_DIR}/audio/* ${PROJECT_DIR}/Data/\n\n#the following ones must be removed\nrm -rf ${PROJECT_DIR}/Data/Maps/{Cheese,FlightJoust}\n\n#move Lua maps in Missions\nmkdir ${PROJECT_DIR}/Data/Missions/Maps/\nmv ${PROJECT_DIR}/Data/Maps/{Basketball,Knockball,TrophyRace} ${PROJECT_DIR}/Data/Missions/Maps/\n\n#reduce the number of flakes for City\nawk '{if ($1 == 1500) $1=40; print $0}' < ${PROJECT_DIR}/Data/Themes/City/theme.cfg > /tmp/tempfile\nmv /tmp/tempfile ${PROJECT_DIR}/Data/Themes/City/theme.cfg\n\n#remove Isalnd from the list of Themes\nawk '{if ($1 != \"Island\") print $0}' < ${PROJECT_DIR}/Data/Themes/themes.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Themes/themes.cfg\n\n#remove Isalnd from the Maps and themes\nrm -rf ${PROJECT_DIR}/Data/Themes/Island\nawk '{if ($1 == \"Island\") print \"Nature\"}' < ${PROJECT_DIR}/Data/Maps/Cave/map.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Maps/Cave/map.cfg\nawk '{if ($1 == \"Island\") print \"Nature\"}' < ${PROJECT_DIR}/Data/Maps/Lonely_Island/map.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Maps/Lonely_Island/map.cfg\nawk '{if ($1 == \"Island\") print \"Nature\"}' < ${PROJECT_DIR}/Data/Maps/PirateFlag/map.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Maps/PirateFlag/map.cfg\n\n#delete the Classic voice\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/Classic\n\n#delete useless fonts\nrm -rf ${PROJECT_DIR}/Data/Fonts/{wqy-zenhei.ttc,DroidSansFallback.ttf}\n\n#delete all names, reserved hats\nrm -rf ${PROJECT_DIR}/Data/Names/\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/\n";
+ shellScript = "#copy new stuff over old stuff\nrm -rf ${PROJECT_DIR}/Data\ncp -R ${PROJECT_DIR}/../../share/hedgewars/Data ${PROJECT_DIR}/Data\n\n#copy some files from QTfrontend/res\nmkdir ${PROJECT_DIR}/Data/Graphics/Btn\ncp ${PROJECT_DIR}/../../QTfrontend/res/btn*.png ${PROJECT_DIR}/Data/Graphics/Btn\ncp ${PROJECT_DIR}/../../QTfrontend/res/ammopic.png ${PROJECT_DIR}/Data/Graphics/Btn/iconAmmo.png\ncp ${PROJECT_DIR}/../../QTfrontend/res/icon*.png ${PROJECT_DIR}/Data/Graphics/Btn\ncp -R ${PROJECT_DIR}/../../QTfrontend/res/botlevels ${PROJECT_DIR}/Data/Graphics/Hedgehog/botlevels\n\n#delete all CMakeLists.txt and image source files\nfind ${PROJECT_DIR}/Data -name CMakeLists.txt -delete\nfind ${PROJECT_DIR}/Data -name *.svg -delete\nfind ${PROJECT_DIR}/Data -name *.svgz -delete\nfind ${PROJECT_DIR}/Data -name *.sifz -delete\nfind ${PROJECT_DIR}/Data -name *.xcf -delete\nfind ${PROJECT_DIR}/Data -name *.orig -delete\n\n#delete desktop frontend translation\nrm -rf ${PROJECT_DIR}/Data/Locale/hedgewars_*\n\n#delete dummy maps and hats\nrm -rf ${PROJECT_DIR}/Data/Maps/{test*,Ruler}\nrm -rf ${PROJECT_DIR}/Data/Hats/{TeamCap,TeamHeadband,TeamHair}\nrm -rf ${PROJECT_DIR}/Data/misc/\n\n#copy mono audio\ncp -R ${PROJECT_DIR}/audio/* ${PROJECT_DIR}/Data/\n\n#the following ones must be removed\nrm -rf ${PROJECT_DIR}/Data/Maps/{Cheese,FlightJoust}\n\n#move Lua maps in Missions\nmkdir ${PROJECT_DIR}/Data/Missions/Maps/\nmv ${PROJECT_DIR}/Data/Maps/{Basketball,Knockball,TrophyRace} ${PROJECT_DIR}/Data/Missions/Maps/\n\n#reduce the number of flakes for City\nawk '{if ($1 == 1500) $1=40; print $0}' < ${PROJECT_DIR}/Data/Themes/City/theme.cfg > /tmp/tempfile\nmv /tmp/tempfile ${PROJECT_DIR}/Data/Themes/City/theme.cfg\n\n#remove Isalnd from the list of Themes\nawk '{if ($1 != \"Island\") print $0}' < ${PROJECT_DIR}/Data/Themes/themes.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Themes/themes.cfg\n\n#remove Isalnd from the Maps and themes\nrm -rf ${PROJECT_DIR}/Data/Themes/Island\nawk '{if ($1 == \"Island\") print \"Nature\"}' < ${PROJECT_DIR}/Data/Maps/Cave/map.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Maps/Cave/map.cfg\nawk '{if ($1 == \"Island\") print \"Nature\"}' < ${PROJECT_DIR}/Data/Maps/Lonely_Island/map.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Maps/Lonely_Island/map.cfg\nawk '{if ($1 == \"Island\") print \"Nature\"}' < ${PROJECT_DIR}/Data/Maps/PirateFlag/map.cfg > /tmp/tempfile && mv /tmp/tempfile ${PROJECT_DIR}/Data/Maps/PirateFlag/map.cfg\n\n#delete the Classic voice\nrm -rf ${PROJECT_DIR}/Data/Sounds/voices/Classic\n\n#delete useless fonts\nrm -rf ${PROJECT_DIR}/Data/Fonts/{wqy-zenhei.ttc,DroidSansFallback.ttf}\n\n#delete all names, reserved hats\nrm -rf ${PROJECT_DIR}/Data/Names/\nrm -rf ${PROJECT_DIR}/Data/Graphics/Hats/Reserved/\n";
showEnvVarsInLog = 0;
};
9283011B0F10CB2D00CC5A3C /* Build libfpc.a */ = {
@@ -2418,6 +2423,7 @@
61E5D68D12AB006F00566F29 /* uLandPainted.pas in Sources */,
61F544C712AF1748007FD913 /* HoldTableViewCell.m in Sources */,
61AC067412B2E32D000B52A2 /* Appirater.m in Sources */,
+ 61E2E12E12BAAEE30051B659 /* ServerSetup.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
--- a/project_files/HedgewarsMobile/Info.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Info.plist Thu Dec 23 11:13:57 2010 -0500
@@ -28,7 +28,7 @@
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleVersion</key>
- <string>1.2</string>
+ <string>1.2.1</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>UILaunchImageFile~ipad</key>
--- a/project_files/HedgewarsMobile/Resources/HelpPageInGameViewController-iPhone.xib Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/HelpPageInGameViewController-iPhone.xib Thu Dec 23 11:13:57 2010 -0500
@@ -360,7 +360,7 @@
<string key="NSFrame">{{-1, 0}, {481, 44}}</string>
<reference key="NSSuperview" ref="766721923"/>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- <object class="NSMutableArray" key="IBUIItems">
+ <object class="NSArray" key="IBUIItems">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="IBUINavigationItem" id="477618874">
<reference key="IBUINavigationBar" ref="126317414"/>
@@ -368,6 +368,7 @@
<object class="IBUIBarButtonItem" key="IBUILeftBarButtonItem" id="843591489">
<string key="IBUITitle">Back</string>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
+ <int key="IBUIStyle">1</int>
<reference key="IBUINavigationItem" ref="477618874"/>
</object>
<string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
--- a/project_files/HedgewarsMobile/Resources/OverlayViewController.xib Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/OverlayViewController.xib Thu Dec 23 11:13:57 2010 -0500
@@ -42,40 +42,6 @@
<int key="NSvFlags">274</int>
<object class="NSMutableArray" key="NSSubviews">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIView" id="442546943">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">268</int>
- <string key="NSFrame">{{0, 170}, {180, 150}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- <object class="NSColorSpace" key="NSCustomColorSpace" id="692152543">
- <int key="NSID">2</int>
- </object>
- </object>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <float key="IBUIAlpha">0.0</float>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
- <object class="IBUIView" id="358748789">
- <reference key="NSNextResponder" ref="191373211"/>
- <int key="NSvFlags">265</int>
- <string key="NSFrame">{{337, 187}, {143, 133}}</string>
- <reference key="NSSuperview" ref="191373211"/>
- <object class="NSColor" key="IBUIBackgroundColor">
- <int key="NSColorSpace">3</int>
- <bytes key="NSWhite">MQA</bytes>
- <reference key="NSCustomColorSpace" ref="692152543"/>
- </object>
- <bool key="IBUIOpaque">NO</bool>
- <bool key="IBUIClearsContextBeforeDrawing">NO</bool>
- <float key="IBUIAlpha">0.0</float>
- <bool key="IBUIUserInteractionEnabled">NO</bool>
- <string key="targetRuntimeIdentifier">IBCocoaTouchFramework</string>
- </object>
<object class="IBUIButton" id="584263820">
<reference key="NSNextResponder" ref="191373211"/>
<int key="NSvFlags">268</int>
@@ -628,8 +594,6 @@
<reference ref="123494776"/>
<reference ref="132251648"/>
<reference ref="752933969"/>
- <reference ref="358748789"/>
- <reference ref="442546943"/>
<reference ref="50885250"/>
<reference ref="309477778"/>
</object>
@@ -698,18 +662,6 @@
<reference key="object" ref="50885250"/>
<reference key="parent" ref="191373211"/>
</object>
- <object class="IBObjectRecord">
- <int key="objectID">71</int>
- <reference key="object" ref="442546943"/>
- <reference key="parent" ref="191373211"/>
- <string key="objectName">safezoneleft</string>
- </object>
- <object class="IBObjectRecord">
- <int key="objectID">72</int>
- <reference key="object" ref="358748789"/>
- <reference key="parent" ref="191373211"/>
- <string key="objectName">safezoneright</string>
- </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -721,6 +673,7 @@
<string>1.IBEditorWindowLastContentRect</string>
<string>1.IBPluginDependency</string>
<string>12.IBPluginDependency</string>
+ <string>12.IBViewBoundsToFrameTransform</string>
<string>17.IBPluginDependency</string>
<string>22.IBPluginDependency</string>
<string>4.IBPluginDependency</string>
@@ -729,18 +682,17 @@
<string>53.IBPluginDependency</string>
<string>58.IBPluginDependency</string>
<string>67.IBPluginDependency</string>
- <string>71.IBPluginDependency</string>
- <string>72.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
<string>OverlayViewController</string>
<string>UIResponder</string>
- <string>{{567, 304}, {480, 320}}</string>
+ <string>{{690, 375}, {480, 320}}</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
+ <object class="NSAffineTransform">
+ <bytes key="NSTransformStruct">P4AAAL+AAABCkAAAw5SAAA</bytes>
+ </object>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Barrel Mayhem.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Barrel Mayhem.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>30</integer>
- <integer>0</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -17,6 +16,7 @@
<integer>25</integer>
<integer>0</integer>
<integer>0</integer>
+ <integer>0</integer>
<integer>40</integer>
</array>
<key>gamemod</key>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Clean Slate.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Clean Slate.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>45</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>5</integer>
<integer>35</integer>
<integer>25</integer>
+ <integer>3</integer>
<integer>4</integer>
<integer>0</integer>
<integer>2</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Default.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Default.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>45</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>5</integer>
<integer>35</integer>
<integer>25</integer>
+ <integer>3</integer>
<integer>4</integer>
<integer>0</integer>
<integer>2</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Fort Mode.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Fort Mode.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>45</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>5</integer>
<integer>35</integer>
<integer>25</integer>
+ <integer>3</integer>
<integer>0</integer>
<integer>0</integer>
<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/King Mode.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/King Mode.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>45</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>5</integer>
<integer>35</integer>
<integer>25</integer>
+ <integer>3</integer>
<integer>4</integer>
<integer>0</integer>
<integer>2</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Minefield.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Minefield.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>50</integer>
+ <integer>150</integer>
<integer>30</integer>
- <integer>0</integer>
- <integer>150</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>0</integer>
<integer>35</integer>
<integer>25</integer>
+ <integer>0</integer>
<integer>80</integer>
<integer>0</integer>
<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Pro Mode.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Pro Mode.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>15</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>0</integer>
<integer>35</integer>
<integer>25</integer>
+ <integer>3</integer>
<integer>0</integer>
<integer>0</integer>
<integer>2</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Shoppa.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Shoppa.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>300</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>50</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>1</integer>
<integer>0</integer>
<integer>35</integer>
+ <integer>3</integer>
<integer>0</integer>
<integer>0</integer>
<integer>0</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Thinking with Portals.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Thinking with Portals.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,9 +5,8 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>45</integer>
- <integer>4</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
@@ -15,6 +14,7 @@
<integer>2</integer>
<integer>25</integer>
<integer>25</integer>
+ <integer>4</integer>
<integer>5</integer>
<integer>0</integer>
<integer>5</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Timeless.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Timeless.plist Thu Dec 23 11:13:57 2010 -0500
@@ -6,7 +6,6 @@
<array>
<integer>100</integer>
<integer>100</integer>
- <integer>5</integer>
<integer>100</integer>
<integer>100</integer>
<integer>47</integer>
@@ -15,6 +14,7 @@
<integer>5</integer>
<integer>35</integer>
<integer>30</integer>
+ <integer>5</integer>
<integer>3</integer>
<integer>10</integer>
<integer>2</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/Schemes/Tunnel Hogs.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/Schemes/Tunnel Hogs.plist Thu Dec 23 11:13:57 2010 -0500
@@ -5,15 +5,15 @@
<key>basic</key>
<array>
<integer>100</integer>
+ <integer>100</integer>
<integer>30</integer>
- <integer>3</integer>
- <integer>100</integer>
<integer>15</integer>
<integer>47</integer>
<integer>5</integer>
<integer>100</integer>
<integer>5</integer>
<integer>35</integer>
+ <integer>3</integer>
<integer>25</integer>
<integer>10</integer>
<integer>10</integer>
--- a/project_files/HedgewarsMobile/Resources/Settings/iFrontend/basicFlags_en.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/iFrontend/basicFlags_en.plist Thu Dec 23 11:13:57 2010 -0500
@@ -3,10 +3,6 @@
<plist version="1.0">
<array>
<dict>
- <key>checkOverMax</key>
- <false/>
- <key>command</key>
- <string></string>
<key>default</key>
<integer>100</integer>
<key>image</key>
@@ -21,37 +17,7 @@
<dict>
<key>checkOverMax</key>
<false/>
- <key>command</key>
- <string>e$turntime</string>
- <key>default</key>
- <integer>45</integer>
- <key>image</key>
- <string>Time</string>
- <key>max</key>
- <integer>100</integer>
- <key>min</key>
- <integer>1</integer>
- <key>title</key>
- <string>Turn Time</string>
- </dict>
- <dict>
- <key>checkOverMax</key>
- <false/>
- <key>command</key>
- <string>e$minestime</string>
- <key>default</key>
- <integer>3</integer>
- <key>image</key>
- <string>Time</string>
- <key>max</key>
- <integer>5</integer>
- <key>min</key>
- <integer>-1</integer>
- <key>title</key>
- <string>Mines Time</string>
- </dict>
- <dict>
- <key>checkOverMax</key>
+ <key>times1000</key>
<false/>
<key>command</key>
<string>e$damagepct</string>
@@ -69,6 +35,26 @@
<dict>
<key>checkOverMax</key>
<true/>
+ <key>times1000</key>
+ <true/>
+ <key>command</key>
+ <string>e$turntime</string>
+ <key>default</key>
+ <integer>45</integer>
+ <key>image</key>
+ <string>Time</string>
+ <key>max</key>
+ <integer>100</integer>
+ <key>min</key>
+ <integer>1</integer>
+ <key>title</key>
+ <string>Turn Time</string>
+ </dict>
+ <dict>
+ <key>checkOverMax</key>
+ <true/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$sd_turns</string>
<key>default</key>
@@ -85,6 +71,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$waterrise</string>
<key>default</key>
@@ -101,6 +89,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$healthdec</string>
<key>default</key>
@@ -117,6 +107,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$ropepct</string>
<key>default</key>
@@ -133,6 +125,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$casefreq</string>
<key>default</key>
@@ -149,6 +143,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$healthprob</string>
<key>default</key>
@@ -165,6 +161,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$hcaseamount</string>
<key>default</key>
@@ -181,6 +179,26 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <true/>
+ <key>command</key>
+ <string>e$minestime</string>
+ <key>default</key>
+ <integer>3</integer>
+ <key>image</key>
+ <string>Time</string>
+ <key>max</key>
+ <integer>5</integer>
+ <key>min</key>
+ <integer>-1</integer>
+ <key>title</key>
+ <string>Mines Time</string>
+ </dict>
+ <dict>
+ <key>checkOverMax</key>
+ <false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$minesnum</string>
<key>default</key>
@@ -197,6 +215,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$minedudpct</string>
<key>default</key>
@@ -213,6 +233,8 @@
<dict>
<key>checkOverMax</key>
<false/>
+ <key>times1000</key>
+ <false/>
<key>command</key>
<string>e$explosives</string>
<key>default</key>
--- a/project_files/HedgewarsMobile/Resources/Settings/settings.plist Tue Dec 14 22:32:47 2010 +0100
+++ b/project_files/HedgewarsMobile/Resources/Settings/settings.plist Thu Dec 23 11:13:57 2010 -0500
@@ -14,5 +14,11 @@
<string></string>
<key>menu</key>
<false/>
+ <key>password_length</key>
+ <integer>0</integer>
+ <key>enhanced</key>
+ <false/>
+ <key>multitasking</key>
+ <true/>
</dict>
</plist>
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos.png has changed
Binary file share/hedgewars/Data/Graphics/AmmoMenu/Ammos_bw.png has changed
Binary file share/hedgewars/Data/Graphics/Hats/WhySoSerious.png has changed
Binary file share/hedgewars/Data/Graphics/Hedgehog/amSnowball.png has changed
Binary file share/hedgewars/Data/Graphics/NapalmBomb.png has changed
Binary file share/hedgewars/Data/Graphics/Snow.png has changed
Binary file share/hedgewars/Data/Graphics/Snowball.png has changed
--- a/share/hedgewars/Data/Locale/en.txt Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/en.txt Thu Dec 23 11:13:57 2010 -0500
@@ -51,6 +51,7 @@
00:48=Hammer
00:49=Resurrector
00:50=Drill Strike
+00:51=Mudball
01:00=Let's fight!
01:01=Round draw
--- a/share/hedgewars/Data/Locale/hedgewars_ar.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_ar.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>جديد</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -183,6 +187,10 @@
<source>Large floating islands</source>
<translation type="unfinished">جزر طائفة كبيرة</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -313,6 +321,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">تحميل</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1011,6 +1050,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1026,6 +1069,10 @@
<source>New</source>
<translation type="unfinished">جديد</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1202,6 +1249,14 @@
<source>Default</source>
<translation type="obsolete">التلقائي</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1428,6 +1483,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1611,6 +1670,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1665,6 +1728,10 @@
<source>new</source>
<translation type="unfinished">جديد</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_bg.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_bg.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation type="unfinished">Нов отбор</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -182,6 +186,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -294,6 +302,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Зареждане</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -961,6 +1000,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -976,6 +1019,10 @@
<source>New</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1148,6 +1195,14 @@
<source>Default</source>
<translation type="obsolete">По подразбиране</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1374,6 +1429,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1557,6 +1616,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1611,6 +1674,10 @@
<source>new</source>
<translation type="unfinished">Нов отбор</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_cs.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_cs.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation type="unfinished">nový</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -183,6 +187,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -295,6 +303,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Nahrát</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -970,6 +1009,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -985,6 +1028,10 @@
<source>New</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1157,6 +1204,14 @@
<source>Default</source>
<translation type="obsolete">Základní</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1383,6 +1438,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1566,6 +1625,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1620,6 +1683,10 @@
<source>new</source>
<translation type="unfinished">nový</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_de.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_de.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>Neu</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -186,6 +190,10 @@
<source>Large floating islands</source>
<translation>Große schwebende Inseln</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -321,6 +329,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Laden</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1035,6 +1074,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1050,6 +1093,10 @@
<source>New</source>
<translation type="unfinished">Neu</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1226,6 +1273,14 @@
<source>Default</source>
<translation type="obsolete">Standard</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1458,6 +1513,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1641,6 +1700,10 @@
<source>Associate file extensions</source>
<translation>Ordne Dateitypen zu</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1695,6 +1758,10 @@
<source>new</source>
<translation type="unfinished">Neu</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_en.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_en.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>new</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -186,6 +190,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -319,6 +327,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Load</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1019,6 +1058,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1034,6 +1077,10 @@
<source>New</source>
<translation type="unfinished">New</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1210,6 +1257,14 @@
<source>Default</source>
<translation type="obsolete">Default</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1436,6 +1491,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1619,6 +1678,10 @@
<source>Associate file extensions</source>
<translation>Associate file extensions</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1673,6 +1736,10 @@
<source>new</source>
<translation type="unfinished">new</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_es.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_es.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>Nuevo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -190,6 +194,10 @@
<source>Large floating islands</source>
<translation>Islas grandes</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -323,6 +331,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Cargar</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1037,6 +1076,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1052,6 +1095,10 @@
<source>New</source>
<translation type="unfinished">Nuevo</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1256,6 +1303,14 @@
<source>Crazy</source>
<translation type="obsolete">Lunático</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1495,6 +1550,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1678,6 +1737,10 @@
<source>Associate file extensions</source>
<translation>Asociar tipos de archivo</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1732,6 +1795,10 @@
<source>new</source>
<translation type="unfinished">Nuevo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_fi.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_fi.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>uusi</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -182,6 +186,10 @@
<source>Large floating islands</source>
<translation>Suuria kelluvia saaria</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -315,6 +323,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Tyhjennä</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Lataa</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1029,6 +1068,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1044,6 +1087,10 @@
<source>New</source>
<translation type="unfinished">Uusi</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1248,6 +1295,14 @@
<source>Crazy</source>
<translation type="obsolete">Sekopäinen</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1474,6 +1529,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1657,6 +1716,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1711,6 +1774,10 @@
<source>new</source>
<translation type="unfinished">uusi</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_fr.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_fr.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>Nouveau</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -182,6 +186,10 @@
<source>Large floating islands</source>
<translation>Grandes îles flottantes</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -312,6 +320,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Charger</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -999,6 +1038,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1014,6 +1057,10 @@
<source>New</source>
<translation type="unfinished">Nouveau</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1190,6 +1237,14 @@
<source>Default</source>
<translation type="obsolete">Défaut</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1416,6 +1471,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1599,6 +1658,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1653,6 +1716,10 @@
<source>new</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_hu.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_hu.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>új</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -181,6 +185,10 @@
<source>Large floating islands</source>
<translation>Nagy lebegő szigetek</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -311,6 +319,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Törlés</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Betöltés</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1000,6 +1039,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1015,6 +1058,10 @@
<source>New</source>
<translation type="unfinished">Új</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1191,6 +1238,14 @@
<source>Default</source>
<translation type="obsolete">Default</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1423,6 +1478,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1606,6 +1665,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1660,6 +1723,10 @@
<source>new</source>
<translation type="unfinished">új</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_it.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_it.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>nuovo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -186,6 +190,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -316,6 +324,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Cancella</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Carica</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1015,6 +1054,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1030,6 +1073,10 @@
<source>New</source>
<translation type="unfinished">Nuovo</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1206,6 +1253,14 @@
<source>Default</source>
<translation type="obsolete">Default</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1438,6 +1493,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1621,6 +1680,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1675,6 +1738,10 @@
<source>new</source>
<translation type="unfinished">nuovo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_ja.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_ja.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation type="unfinished">作成</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -181,6 +185,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -293,6 +301,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">ロード</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -952,6 +991,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -967,6 +1010,10 @@
<source>New</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1139,6 +1186,14 @@
<source>Default</source>
<translation type="obsolete">デフォールト</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1365,6 +1420,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1548,6 +1607,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1602,6 +1665,10 @@
<source>new</source>
<translation type="unfinished">作成</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_nl.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_nl.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -178,6 +182,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -300,6 +308,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -963,6 +1002,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -978,6 +1021,10 @@
<source>New</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1146,6 +1193,14 @@
<source>In progress</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1368,6 +1423,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1541,6 +1600,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1595,6 +1658,10 @@
<source>new</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>nowy</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -191,6 +195,10 @@
<source>Large floating islands</source>
<translation>Duże wyspy</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -324,6 +332,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Wczytaj</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1063,6 +1102,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1078,6 +1121,10 @@
<source>New</source>
<translation type="unfinished">Nowy</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1282,6 +1329,14 @@
<source>Crazy</source>
<translation type="obsolete">Crazy</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1524,6 +1579,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1707,6 +1766,10 @@
<source>Associate file extensions</source>
<translation>Powiąż typy plików z Hedgewars</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1761,6 +1824,10 @@
<source>new</source>
<translation type="unfinished">nowy</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>Novo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation>cópia de</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -42,7 +46,7 @@
</message>
<message>
<source>When this option is enabled selecting a game scheme will auto-select a weapon</source>
- <translation type="unfinished"></translation>
+ <translation>Quando esta opção está habilitada a seleção de um esquema de jogo implicará em auto seleção do esquema de armas</translation>
</message>
</context>
<context>
@@ -182,6 +186,11 @@
<source>Large floating islands</source>
<translation>Ilhas grandes</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translatorcomment>checar</translatorcomment>
+ <translation type="unfinished">Semeie</translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -307,6 +316,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation>Desfazer</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Limpar</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation>Carregar</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Salvar</translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation>Carregar mapa</translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation>Mapas Desenhados (*.hwmaps);; Todos os arquivos (*.*)</translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation>Salvar Mapa</translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -430,21 +470,21 @@
</message>
<message numerus="yes">
<source><b>%1</b> thought it's good to shoot his own hedgehogs with <b>%2</b> pts.</source>
- <translation type="unfinished">
+ <translation>
<numerusform><b>%1</b> pensou que era bom atirar na sua própria equipe totalizando <b>%2</b> ponto.</numerusform>
<numerusform><b>%1</b> pensou que era bom atirar na sua própria equipe totalizando <b>%2</b> pontos.</numerusform>
</translation>
</message>
<message numerus="yes">
<source><b>%1</b> killed <b>%2</b> of his own hedgehogs.</source>
- <translation type="unfinished">
+ <translation>
<numerusform><b>%1</b> matou <b>%2</b> dos próprios ouriços.</p>.</numerusform>
<numerusform><b>%1</b> matou <b>%2</b> dos próprios ouriços.</p>.</numerusform>
</translation>
</message>
<message numerus="yes">
<source><b>%1</b> was scared and skipped turn <b>%2</b> times.</source>
- <translation type="unfinished">
+ <translation>
<numerusform><b>%1</b> estava assustado e passou o turno <b>%2</b> vez.</p>.</numerusform>
<numerusform><b>%1</b> estava assustado e passou o turno <b>%2</b> vezes.</p>.</numerusform>
</translation>
@@ -719,17 +759,17 @@
<message>
<source>Want to save ropes? Release the rope in mid air and then shoot again. As long as you don't touch the ground you'll reuse your rope without wasting ammo!</source>
<comment>Tips</comment>
- <translation type="unfinished">Quer economizar corda? Solte-a quando estiver no meio do ar e então atire de novo. Se você não tocar o solo, você reutilizará a corda e não desperdiçará o seu arsenal!</translation>
+ <translation>Quer economizar corda? Solte-a quando estiver no meio do ar e então atire de novo. Se você não tocar o solo, você reutilizará a corda e não desperdiçará-la do seu arsenal!</translation>
</message>
<message>
<source>You can find your Hedgewars configuration files under "Library/Application Support/Hedgewars" in your home directory. Create backups or take the files with you, but don't edit them by hand.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Você pode encontrar os arquivos de configuração do Hedgewars em "Library/Application Support/Hedgewars" no seu diretório base. Crie backups ou leve os arquivos com você, mas não os edite manualmente.</translation>
</message>
<message>
<source>You can find your Hedgewars configuration files under ".hedgewars" in your home directory. Create backups or take the files with you, but don't edit them by hand.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Você pode encontrar os arquivos de configuração do Hedgewars em ".hedgewars/" no seu diretório base. Crie backups ou leve os arquivos com você, mas não os edite manualmente.</translation>
</message>
</context>
<context>
@@ -800,27 +840,27 @@
</message>
<message>
<source>New scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Novo Esquema</translation>
</message>
<message>
<source>Edit scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Editar Esquema</translation>
</message>
<message>
<source>Delete scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Apagar Esquema</translation>
</message>
<message>
<source>New weapon set</source>
- <translation type="unfinished"></translation>
+ <translation>Novo esquema de armas</translation>
</message>
<message>
<source>Edit weapon set</source>
- <translation type="unfinished"></translation>
+ <translation>Editar esquema de armas</translation>
</message>
<message>
<source>Delete weapon set</source>
- <translation type="unfinished"></translation>
+ <translation>Apagar esquema de armas</translation>
</message>
</context>
<context>
@@ -1081,11 +1121,15 @@
</message>
<message>
<source>You will not have to worry about wind anymore.</source>
- <translation type="unfinished"></translation>
+ <translation>Você não tem que se preocupar com o vento mais.</translation>
</message>
<message>
<source>Wind will affect almost everything.</source>
- <translation type="unfinished"></translation>
+ <translation>Vento afetará quase tudo.</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copiar</translation>
</message>
</context>
<context>
@@ -1100,7 +1144,11 @@
</message>
<message>
<source>New</source>
- <translation type="unfinished">Novo</translation>
+ <translation>Novo</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Copiar</translation>
</message>
</context>
<context>
@@ -1306,6 +1354,14 @@
<source>Crazy</source>
<translation type="obsolete">Crazy</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished">Normal</translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished">mapa desenhado a mão...</translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1359,7 +1415,7 @@
</message>
<message>
<source>Schemes and Weapons</source>
- <translation type="unfinished"></translation>
+ <translation>Esquemas e Armas</translation>
</message>
</context>
<context>
@@ -1540,7 +1596,11 @@
</message>
<message>
<source>% Rope Length</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">% Comprimento da Corda</translation>
+ </message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished">Modo de Jogo</translation>
</message>
</context>
<context>
@@ -1615,23 +1675,23 @@
</message>
<message>
<source>Really delete this team?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Realmente deseja apagar esta Equipe?</translation>
</message>
<message>
<source>Schemes</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Esquemas</translation>
</message>
<message>
<source>Can not delete default scheme '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Esquema padrão não pode ser apagado '%1'!</translation>
</message>
<message>
<source>Really delete this game scheme?</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Realmente deseja apagar este esquema de jogo?</translation>
</message>
<message>
<source>Can not delete default weapon set '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Esquema de armas não pode ser apagado '%1'!</translation>
</message>
</context>
<context>
@@ -1727,6 +1787,11 @@
<source>Associate file extensions</source>
<translation>Associar extensão de arquivos.</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translatorcomment>Esquema esta muito genérico</translatorcomment>
+ <translation type="unfinished">Esquema</translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1781,7 +1846,11 @@
</message>
<message>
<source>new</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">novo</translation>
+ </message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished">cópia de</translation>
</message>
</context>
<context>
@@ -1891,11 +1960,11 @@
</message>
<message>
<source>Disable Wind</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Desativar Vento</translation>
</message>
<message>
<source>More Wind</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Mais Vento</translation>
</message>
</context>
<context>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>novo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -182,6 +186,10 @@
<source>Large floating islands</source>
<translation>Ilhas flutuantes grandes</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -315,6 +323,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Carregar</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1029,6 +1068,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1044,6 +1087,10 @@
<source>New</source>
<translation type="unfinished">Novo</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1220,6 +1267,14 @@
<source>Default</source>
<translation type="obsolete">Predefinido</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1446,6 +1501,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1629,6 +1688,10 @@
<source>Associate file extensions</source>
<translation>Associar com as extensões dos ficheiros</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1683,6 +1746,10 @@
<source>new</source>
<translation type="unfinished">novo</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_ru.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_ru.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>новый</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -187,6 +191,10 @@
<source>Large floating islands</source>
<translation>Большие островки</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -320,6 +328,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Очистить</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Загрузить</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1030,6 +1069,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1045,6 +1088,10 @@
<source>New</source>
<translation type="unfinished">Новая</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1221,6 +1268,14 @@
<source>Default</source>
<translation type="obsolete">По умолчанию</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1457,6 +1512,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1640,6 +1699,10 @@
<source>Associate file extensions</source>
<translation>Сопоставить расширения файлов</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1694,6 +1757,10 @@
<source>new</source>
<translation type="unfinished">новый</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_sk.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>nový</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -187,6 +191,10 @@
<source>Large floating islands</source>
<translation>Veľké plávajúce ostrovčeky</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -322,6 +330,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Načítať</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1051,6 +1090,10 @@
<source>Wind will affect almost everything.</source>
<translation>Vietor bude ovplyvňovať takmer všetko.</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1066,6 +1109,10 @@
<source>New</source>
<translation>Nová</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1270,6 +1317,14 @@
<source>Crazy</source>
<translation type="obsolete">Šialené</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1507,6 +1562,10 @@
<source>% Rope Length</source>
<translation>% dĺžka lana</translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1690,6 +1749,10 @@
<source>Associate file extensions</source>
<translation>Asociovať prípony súborov.</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1744,6 +1807,10 @@
<source>new</source>
<translation>nový</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_sv.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_sv.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>ny</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation>kopia av</translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -26,7 +30,7 @@
<name>GameCFGWidget</name>
<message>
<source>Edit weapons</source>
- <translation>Redigera vapenscheman</translation>
+ <translation>Redigera vapenset</translation>
</message>
<message>
<source>Error</source>
@@ -42,7 +46,7 @@
</message>
<message>
<source>When this option is enabled selecting a game scheme will auto-select a weapon</source>
- <translation type="unfinished"></translation>
+ <translation>När det här valet är aktivt kommer vapnen att ändras när du ändrar spelschema</translation>
</message>
</context>
<context>
@@ -182,6 +186,10 @@
<source>Large floating islands</source>
<translation>Stora flytande öar</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation>Frö</translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -315,6 +323,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation>Ångra</translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation>Rensa</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation>Läs in</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation>Spara</translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation>Läs in ritad karta</translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation>Ritade kartor (*.hwmap);;Alla filer (*.*)</translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation>Spara ritad karta</translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -666,12 +705,12 @@
<message>
<source>You can find your Hedgewars configuration files under "Library/Application Support/Hedgewars" in your home directory. Create backups or take the files with you, but don't edit them by hand.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation>Du kan hitta dina konfigurationsfiler under "Library/Application Support/Hedgewars" i din hem-mapp. Gör en säkerhetskopia eller ta med dig filerna, men redigera dem inte för hand.</translation>
</message>
<message>
<source>You can find your Hedgewars configuration files under ".hedgewars" in your home directory. Create backups or take the files with you, but don't edit them by hand.</source>
<comment>Tips</comment>
- <translation type="unfinished"></translation>
+ <translation>Du kan hitta dina konfigurationsfiler under ".hedgewars" i din hem-mapp. Gör en säkerhetskopia eller ta med dig filerna, men redigera dem inte för hand.</translation>
</message>
</context>
<context>
@@ -742,27 +781,27 @@
</message>
<message>
<source>New scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Nytt schema</translation>
</message>
<message>
<source>Edit scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Redigera schema</translation>
</message>
<message>
<source>Delete scheme</source>
- <translation type="unfinished"></translation>
+ <translation>Ta bort schema</translation>
</message>
<message>
<source>New weapon set</source>
- <translation type="unfinished"></translation>
+ <translation>Nytt vapenset</translation>
</message>
<message>
<source>Edit weapon set</source>
- <translation type="unfinished"></translation>
+ <translation>Redigera vapenset</translation>
</message>
<message>
<source>Delete weapon set</source>
- <translation type="unfinished"></translation>
+ <translation>Ta bort vapenset</translation>
</message>
</context>
<context>
@@ -1023,11 +1062,15 @@
</message>
<message>
<source>You will not have to worry about wind anymore.</source>
- <translation type="unfinished"></translation>
+ <translation>Nu behöver du inte oroa dig för vinden längre.</translation>
</message>
<message>
<source>Wind will affect almost everything.</source>
- <translation type="unfinished"></translation>
+ <translation>Vind påverkar nästan allting.</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Kopiera</translation>
</message>
</context>
<context>
@@ -1042,7 +1085,11 @@
</message>
<message>
<source>New</source>
- <translation type="unfinished">Ny</translation>
+ <translation>Ny</translation>
+ </message>
+ <message>
+ <source>Copy</source>
+ <translation>Kopiera</translation>
</message>
</context>
<context>
@@ -1248,6 +1295,14 @@
<source>Crazy</source>
<translation type="obsolete">Galet</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation>Vanligt</translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation>handritad karta...</translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1301,7 +1356,7 @@
</message>
<message>
<source>Schemes and Weapons</source>
- <translation type="unfinished"></translation>
+ <translation>Scheman och vapen</translation>
</message>
</context>
<context>
@@ -1478,7 +1533,11 @@
</message>
<message>
<source>% Rope Length</source>
- <translation type="unfinished"></translation>
+ <translation>% replängd</translation>
+ </message>
+ <message>
+ <source>Gameplay</source>
+ <translation>Speltyp</translation>
</message>
</context>
<context>
@@ -1547,27 +1606,27 @@
</message>
<message>
<source>Teams</source>
- <translation type="unfinished">Lag</translation>
+ <translation>Lag</translation>
</message>
<message>
<source>Really delete this team?</source>
- <translation type="unfinished"></translation>
+ <translation>Vill du verkligen ta bort detta lag?</translation>
</message>
<message>
<source>Schemes</source>
- <translation type="unfinished"></translation>
+ <translation>Scheman</translation>
</message>
<message>
<source>Can not delete default scheme '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation>Kan inte ta bort standardschema '%1'!</translation>
</message>
<message>
<source>Really delete this game scheme?</source>
- <translation type="unfinished"></translation>
+ <translation>Vill du verkligen ta bort detta spelschema?</translation>
</message>
<message>
<source>Can not delete default weapon set '%1'!</source>
- <translation type="unfinished"></translation>
+ <translation>Kan inte ta bort standardvapenset '%1'!</translation>
</message>
</context>
<context>
@@ -1663,6 +1722,10 @@
<source>Associate file extensions</source>
<translation>Associera filextentioner</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation>Ange</translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1715,7 +1778,11 @@
</message>
<message>
<source>new</source>
- <translation type="unfinished">ny</translation>
+ <translation>ny</translation>
+ </message>
+ <message>
+ <source>copy of</source>
+ <translation>kopia av</translation>
</message>
</context>
<context>
@@ -1825,11 +1892,11 @@
</message>
<message>
<source>Disable Wind</source>
- <translation type="unfinished"></translation>
+ <translation>Avaktivera vind</translation>
</message>
<message>
<source>More Wind</source>
- <translation type="unfinished"></translation>
+ <translation>Mer vind</translation>
</message>
</context>
<context>
--- a/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>yeni</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -181,6 +185,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -301,6 +309,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Yükle</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -964,6 +1003,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -979,6 +1022,10 @@
<source>New</source>
<translation type="unfinished">Yeni</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1151,6 +1198,14 @@
<source>Default</source>
<translation type="obsolete">Öntanımlı</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1377,6 +1432,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1560,6 +1619,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1614,6 +1677,10 @@
<source>new</source>
<translation type="unfinished">yeni</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_uk.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>нова</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -187,6 +191,10 @@
<source>Large floating islands</source>
<translation>Великі плавучі острова</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -320,6 +328,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">Очистити</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">Завантажити</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1030,6 +1069,10 @@
<source>Wind will affect almost everything.</source>
<translation>Вітер вплине майже на все.</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1045,6 +1088,10 @@
<source>New</source>
<translation>Нова</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1221,6 +1268,14 @@
<source>Default</source>
<translation type="obsolete">За замовчуванням</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1447,6 +1502,10 @@
<source>% Rope Length</source>
<translation>% Довжина Мотузки</translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1630,6 +1689,10 @@
<source>Associate file extensions</source>
<translation>Асоціювати файлові розширення</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1684,6 +1747,10 @@
<source>new</source>
<translation>нова</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
@@ -2086,7 +2153,7 @@
</message>
<message>
<source>Delete</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Видалити</translation>
</message>
<message>
<source>Mouse: Left button</source>
@@ -2118,7 +2185,7 @@
</message>
<message>
<source>Clear</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">Очистити</translation>
</message>
<message>
<source>Return</source>
--- a/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>新建</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -181,6 +185,10 @@
<source>Large floating islands</source>
<translation>大型漂浮岛屿</translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -314,6 +322,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">读取</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -1038,6 +1077,10 @@
<source>Wind will affect almost everything.</source>
<translation>风无所不在。</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1053,6 +1096,10 @@
<source>New</source>
<translation>新模式</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1257,6 +1304,14 @@
<source>Crazy</source>
<translation type="obsolete">疯狂刺猬</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1483,6 +1538,10 @@
<source>Health in Crates</source>
<translation>生命箱的值数</translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1666,6 +1725,10 @@
<source>Associate file extensions</source>
<translation>相关文件扩展</translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1720,6 +1783,10 @@
<source>new</source>
<translation>新</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,10 @@
<source>new</source>
<translation>新</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>FreqSpinBox</name>
@@ -181,6 +185,10 @@
<source>Large floating islands</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Seed</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>HWNetServersModel</name>
@@ -311,6 +319,37 @@
</message>
</context>
<context>
+ <name>PageDrawMap</name>
+ <message>
+ <source>Undo</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Clear</source>
+ <translation type="unfinished">清除</translation>
+ </message>
+ <message>
+ <source>Load</source>
+ <translation type="unfinished">讀取</translation>
+ </message>
+ <message>
+ <source>Save</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Load drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Drawn Maps (*.hwmap);;All files (*.*)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>Save drawn map</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
<name>PageEditTeam</name>
<message>
<source>General</source>
@@ -988,6 +1027,10 @@
<source>Wind will affect almost everything.</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSelectWeapon</name>
@@ -1003,6 +1046,10 @@
<source>New</source>
<translation type="unfinished">新模式</translation>
</message>
+ <message>
+ <source>Copy</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>PageSinglePlayer</name>
@@ -1179,6 +1226,14 @@
<source>Default</source>
<translation type="obsolete">默認</translation>
</message>
+ <message>
+ <source>Normal</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <source>hand drawn map...</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QGroupBox</name>
@@ -1405,6 +1460,10 @@
<source>% Rope Length</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Gameplay</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QLineEdit</name>
@@ -1588,6 +1647,10 @@
<source>Associate file extensions</source>
<translation type="unfinished"></translation>
</message>
+ <message>
+ <source>Set</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>QTableWidget</name>
@@ -1642,6 +1705,10 @@
<source>new</source>
<translation type="unfinished">新</translation>
</message>
+ <message>
+ <source>copy of</source>
+ <translation type="unfinished"></translation>
+ </message>
</context>
<context>
<name>TCPBase</name>
--- a/share/hedgewars/Data/Locale/pt_BR.txt Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/pt_BR.txt Thu Dec 23 11:13:57 2010 -0500
@@ -50,6 +50,8 @@
00:47=Mina Adesiva
00:48=Martelo
00:49=Ressucitador
+00:50=Ataque Perfurador
+00:51=Bola de Lama
01:00=Hora de lutar!
01:01=Partida empatou
@@ -65,6 +67,7 @@
01:11=Esta arma ou utilidade ainda não está disponível
01:12=Último round antes da Morte Súbita!
01:13=%1 rounds até a Morte Súbita
+01:14=Se prepare, %1!
; Event messages
; Hog (%1) died
@@ -87,6 +90,9 @@
02:00=%1 foi embora para Passárgada
02:00=%1 foi comprar cigarros
02:00=%1 empacotou
+02:00=%1 não aguentou o tranco
+02:00=%1 será conhecido postumamente
+02:00=%1 balbuceou palavras incompreensíveis
; Hog (%1) drowned
02:01=%1 bebeu água até não poder mais
@@ -280,6 +286,8 @@
03:47=Grudenta
03:48=Tanto bate até que fura!
03:49=Faz o que você imagina
+03:50=Contra covardes
+03:51=Devagar, e sempre....
; Weapon Descriptions (use | as line breaks)
04:00=Ataque seus inimigos usando uma granada simples|Ela explodirá assim que o tempo passar|1-5: Escolha o tempo da granada|Ataque: Quanto mais tempo, mais forte o lançamento.
--- a/share/hedgewars/Data/Locale/sv.lua Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Locale/sv.lua Thu Dec 23 11:13:57 2010 -0500
@@ -24,4 +24,7 @@
["Fastest lap: "] = "Snabbast varv: ",
["Best laps per team: "] = "Bästa varv per lag: ",
["Team %d: "] = "Lag %d: ",
+ ["Random Weapons"] = "Slumpade vapen",
+ ["A game of luck"] = "Ett lyckospel",
+ ["There has been a mix-up with your gear and now you|have to utilize whatever is coming your way!"] = "Det har uppstått ett missförstånd om din utrustning|och nu måste du använda vad du kan hitta!",
}
--- a/share/hedgewars/Data/Missions/Campaign/01#Boot Camp.lua Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,357 +0,0 @@
--- IMPORTANT -- THIS IS WORK IN PROGRESS AND VERY LIKELY TO BE CHANGED AGAIN
--- IMPORTANT -- DO NOT TRANSLATE THIS AS IT USES THE OLD SYSTEM AND WILL BE UPDATED LATER!
-
-local teamnames = {}
-local hognames = {}
-teamnames[0] = {
- ["en"] = "Bloody Rookies",
- ["de"] = "Blutige Anfänger",
- ["pl"] = "Żótodzioby",
- ["sv"] = "Blodiga nybörjare",
- ["es"] = "Reclutas",
- ["pt_PT"] = "Recrutas",
- ["pt_BR"] = "Maldito Recrutas",
- ["sk"] = "Regruti"
-}
-
-teamnames[1] = {
- ["en"] = "Instructors",
- ["de"] = "Ausbilder",
- ["pl"] = "Instruktor",
- ["sv"] = "Instruktör",
- ["es"] = "Instructores",
- ["pt_PT"] = "Instrutores",
- ["pt_BR"] = "Instrutores",
- ["sk"] = "Inštruktori"
-}
-
-hognames[0] = {
- ["en"] = "Joker",
- ["de"] = "Joker",
- ["pl"] = "Joker",
- ["sv"] = "Joker",
- ["es"] = "Joker",
- ["pt_PT"] = "Joker",
- ["pt_BR"] = "Comediante",
- ["sk"] = "Komediant"
-}
-
-hognames[1] = {
- ["en"] = "Harthog",
- ["de"] = "Harthog",
- ["pl"] = "Harthog",
- ["sv"] = "Harthog",
- ["es"] = "Harthog",
- ["pt_PT"] = "Harthog",
- ["pt_BR"] = "Harthog",
- ["sk"] = "Harthog"
-}
-
-local caption = {
- ["en"] = "Boot Camp",
- ["de"] = "Grundausbildung",
- ["pl"] = "Poligon",
- ["sv"] = "Grundutbildning",
- ["es"] = "Campamento militar",
- ["pt_PT"] = "Acampamento militar",
- ["pt_BR"] = "Acampamento Militar",
- ["sk"] = "Výcvikový tábor"
-
-}
-
-local subcaption = {
- ["en"] = "Follow the instructions!",
- ["de"] = "Befolge die Anweisungen!",
- ["pl"] = "Wykonuj polecenia!",
- ["sv"] = "Följ instruktioner!",
- ["es"] = "¡Sigue las órdenes!",
- ["pt_PT"] = "Segue as instruções!",
- ["pt_BR"] = "Siga as ordens!",
- ["sk"] = "Postupujte podľa inštrukcií!"
-}
-
-local goals = {}
-
-goals[0] = {
- ["en"] = "Listen to your Drill Instructor and follow his lead!",
- ["de"] = "Höre deinem Ausbilder zu und befolge seine Anweisungen!",
- ["pl"] = "Słuchaj instruktora i wykonuj jego rozkazy!",
- ["sv"] = "Lyssna på din instruktör och gör som han säger!",
- ["es"] = "¡Escucha atentamente a tu instructor de maniobras y sigue sus órdenes!",
- ["pt_PT"] = "Ouve atentamente o teu Instrutor e segue as suas ordens!",
- ["pt_BR"] = "Escute seu instrutor de escavação e siga seu líder",
- ["sk"] = "Počúvajte vášho inštruktora výcviku a vykonávajte jeho rozkazy!"
-}
-
-goals[1] = {
- ["en"] = "Destroy the target to finish this mission!",
- ["de"] = "Zerstöre das Ziel, um diese Mission abzuschließen!",
- ["pl"] = "Zniszcz cel by ukończyć misję!",
- ["sv"] = "Förstör målet för att avklara uppdraget!",
- ["es"] = "¡Destruye el objetivo para completar esta misión!",
- ["pt_PT"] = "Destrói o alvo para completar esta missão!",
- ["pt_BR"] = "Destrua o alvo para concluir a missão",
- ["sk"] = "Pre ukončenie misie zneškodnite cieľ!"
-}
-
-goals[2] = {
- ["en"] = "Excellent! You've passed the Boot Camp!",
- ["de"] = "Ausgezeichnet! Du hast das Ausbildungslager bestanden!",
- ["pl"] = "Doskonale! Wyszedłeś cało z poligonu!",
- ["sv"] = "Brilliant! Du har klarat av grundutbildningen!",
- ["es"] = "¡Excelente! ¡Has completado la maniobra de hoy!",
- ["pt_PT"] = "Excelente! Completaste o treino para recrutas!",
- ["pt_BR"] = "Excelente! Você completou a manobra",
- ["pt_BR"] = "Výborne! Prešli ste výcvikovým táborom!"
-}
-
-local failed = {
- ["en"] = "You failed! Follow the instructions and shoot the target only!",
- ["de"] = "Du hast versagt! Befolge die Anweisungen und schieß nur auf das Ziel!",
- ["pl"] = "Przegrałeś! Wykonuj instrukcje poprawnie i strzelaj tylko w podane cele!",
- ["sv"] = "Du har misslyckats! Följ instruktionerna och sjut endast på målen!",
- ["es"] = "¡Has fallado! ¡Sigue las instrucciones y destruye únicamente el objetivo!",
- ["pt_PT"] = "Falhaste! Segue as instruções e destrói apenas o alvo!",
- ["pt_BR"] = "Você falhou! Siga as instruções e atire somente no alvo",
- ["sk"] = "Prehrali ste! Nasledujte inštrukcie a strieľajte iba na cieľ!"
-}
-
-local drill = {}
-
-drill[0] = {
- ["en"] = "Allright, maggot!",
- ["de"] = "Also gut, du Made!",
- ["pl"] = "Słuchaj mnie gnido!",
- ["sv"] = "Dåså, din mask!",
- ["es"] = "¡Muy bien, escoria!",
- ["pt_PT"] = "Bom trabalho verme!",
- ["pt_BR"] = "Parabéns escória",
- ["sk"] = "Počúvaj, ty červík!"
-}
-
-drill[1] = {
- ["en"] = "Show that you aren't that useless.",
- ["de"] = "Zeig, dass du nicht so nutzlos bist.",
- ["pl"] = "Udowodnij, że nie jesteś bezwartościowy.",
- ["sv"] = "Visa att du inte är så värdelös!",
- ["es"] = "Demuéstrame que no eres tan inútil como pareces.",
- ["pt_PT"] = "Prova-me que não és tão inútil como pareces.",
- ["pt_BR"] = "Mostre que você não é um inútil.",
- ["sk"] = "Dokáž, že nie si na svete úplne zbytočným."
-}
-
-drill[2] = {
- ["en"] = "Use [left] to move to the left!",
- ["de"] = "Benutze [Links], um nach links zu gehen!",
- ["pl"] = "Użyj [lewo] by poruszyć się w lewą stronę!",
- ["sv"] = "Använd [vänster] för att gå åt vänster!",
- ["es"] = "¡Aprieta [izquierda] para desplazarte a la izquierda!",
- ["pt_PT"] = "Carrega [esquerda] para te moveres para a esquerda!",
- ["pt_BR"] = "Use [esquerda] para mover para a esquerda",
- ["sk"] = "Stlačte [vľavo] pre pohyb doľava"
-}
-
-drill[3] = {
- ["en"] = "Good! Now use [right] to come back!",
- ["de"] = "Gut! Nun komm mit [Rechts] zurück!",
- ["pl"] = "Dobzre, Teraz użyj [prawo] by wrócić!",
- ["sv"] = "Bra! Använd nu [höger] för att gå tillbaka!",
- ["es"] = "¡Muy bien! ¡Ahora presiona [derecha] para volver!",
- ["pt_PT"] = "Muito bem! Agora pressiona [direita] para voltar!",
- ["pt_BR"] = "Bom! Agora use [direita] para voltar",
- ["sk"] = "Dobre! Teraz použite [vpravo] a vráťte sa naspäť!"
-}
-
-drill[4] = {
- ["en"] = "Excellent!",
- ["de"] = "Ausgezeichnet!",
- ["pl"] = "Wspaniale!",
- ["sv"] = "Utmärkt!",
- ["es"] = "¡Excelente!",
- ["pt_PT"] = "Excelente!",
- ["pt_BR"] = "Excelente!",
- ["sk"] = "Výborne!"
-}
-
-drill[5] = {
- ["en"] = "Now jump to the left using [return]!",
- ["de"] = "Jetzt springe mit [Eingabetaste] nach links!",
- ["pl"] = "Teraz skocz w lewo używając [Enter]",
- ["sv"] = "Hoppa nu åt vänster med hjälp av [enter]!",
- ["es"] = "¡Ahora salta hacia la izquierda usando [intro]!",
- ["pt_PT"] = "Agora salta para a esquerda pressionando [retrocesso]!",
- ["pt_BR"] = "Agora pule para a esquerda usando [return]!",
- ["sk"] = "Teraz skočte doľava stlačením [enter]!"
-}
-
-drill[6] = {
- ["en"] = "Use [up] and [down] to aim.",
- ["de"] = "Benutze [Hoch] und [Runter], um zu zielen.",
- ["pl"] = "Użyj klawiszy [góra] i [dół] by celować.",
- ["sv"] = "Använd [upp] och [ner] för att sikta!",
- ["es"] = "Presiora [arriba] y [abajo] para apuntar.",
- ["pt_PT"] = "Pressiona [cima] e [baixo] para apontar.",
- ["pt_BR"] = "Pressione [acima] e [abaixo] para mirar.",
- ["sk"] = "Stlačte [hore] a [dole] pre mierenie."
-}
-
-drill[7] = {
- ["en"] = "Hold [space] to power up your shot and then release it to shoot.",
- ["de"] = "Halte [Leertaste], um deinen Schuss aufzuladen, und lasse dann rechtzeitig los.",
- ["pl"] = "Przytrzymaj spację by zwiększyć siłę strzału.",
- ["sv"] = "Håll ner [mellanslag] för att få kraft och släpp för att skjuta!",
- ["es"] = "Mantén presionada la [barra espaciadora] para controlar la fuerza del disparo y suéltala para disparar.",
- ["pt_PT"] = "Mantem a [barra de espaços] pressionada para controlar a força do tiro e larga-a para disparar.",
- ["pt_BR"] = "Mantenha pressionado [espaço] para aumentar a força do seu tiro e solte para atirar",
- ["sk"] = "Držte stlačený [medzerník] pre nabíjanie, jeho uvoľnením vystrelíte."
-}
-
-drill[8] = {
- ["en"] = "Destroy the target to finish your basic training!",
- ["de"] = "Zerstöre das Ziel, um deine Grundausbildung abzuschließen!",
- ["pl"] = "Zniszcz cel by by ukończyć trening podstawowy!",
- ["sv"] = "Förstör målet för att avsluta din grundutbildning!",
- ["es"] = "¡Destruye el objetivo para completar el entrenamiento básico!",
- ["pt_PT"] = "Destrói o alvo para completar o treino básico!",
- ["pt_BR"] = "Destrua o alvo para terminar o treino básico",
- ["sk"] = "Zneškodnite cieľ na ukončenie základného výcviku!"
-}
-
-local function loc(text)
- if text == nil then return "**missing**"
- elseif text[L] == nil then return text["en"]
- else return text[L]
- end
-end
-
-local player = nil
-local instructor = nil
-local target = nil
-
-function onGameStart()
-
-end
-
-local player_start_x = 2300
-local player_start_y = 1250
-local target_x = 1900
-local target_y = 1250
-local player_health = 100
-local instructor_health = 100
-local teamcolor = 14483456
-
-local progress = 0
-local time_start = 0
-
-function onGameTick()
- if progress == -1 and (time_start + 2500) == GameTime then
- EndGame()
- elseif progress == -1 then
-
- elseif progress > 0 and ((TurnTimeLeft == 0) or (GetHealth(player) ~= player_health) or (GetHealth(instructor) ~= instructor_health)) then
- progress = -1
- ShowMission(loc(caption), loc(subcaption), loc(failed), -amBazooka, 0)
- time_start = GameTime
- PlaySound(sndNooo)
- TurnTimeLeft = 0
- elseif GameTime == 0 then
- ShowMission(loc(caption), loc(subcaption), loc(goals[0]), -amBazooka, 0)
- TurnTimeLeft = 60000
- elseif GameTime == 2500 then
- FollowGear(instructor)
- HogSay(instructor, loc(drill[0]), SAY_SAY)
- elseif GameTime == 5000 then
- FollowGear(instructor)
- HogSay(instructor, loc(drill[1]), SAY_SAY)
- elseif GameTime == 7500 then
- FollowGear(instructor)
- HogSay(instructor, loc(drill[2]), SAY_SHOUT)
- progress = 1
- TurnTimeLeft = 10000
- elseif progress == 1 then
- local x, y = GetGearPosition(player)
- if x < player_start_x - 50 then
- progress = 2
- FollowGear(instructor)
- HogSay(instructor, loc(drill[3]), SAY_SHOUT)
- TurnTimeLeft = 10000
- end
- elseif progress == 2 then
- local x, y = GetGearPosition(player)
- if x > player_start_x then
- progress = 3
- FollowGear(instructor)
- HogSay(instructor, loc(drill[4]), SAY_SAY)
- time_start = GameTime
- end
- elseif progress == 3 and (time_start + 2500 == GameTime) then
- progress = 4
- FollowGear(instructor)
- HogSay(instructor, loc(drill[5]), SAY_SHOUT)
- HogTurnLeft(player, true)
- TurnTimeLeft = 10000
- elseif progress == 4 then
- local x, y = GetGearPosition(player)
- if y < player_start_y then
- progress = 5
- FollowGear(instructor)
- HogSay(instructor, "Yeah!", SAY_SAY)
- time_start = GameTime
- TurnTimeLeft = 30000
- end
- elseif progress == 5 and (time_start + 2500 == GameTime) then
- FollowGear(instructor)
- HogSay(instructor, loc(drill[6]), SAY_SAY)
- elseif progress == 5 and (time_start + 5000 == GameTime) then
- FollowGear(instructor)
- HogSay(instructor, loc(drill[7]), SAY_SAY)
- elseif progress == 5 and (time_start + 7500 == GameTime) then
- FollowGear(instructor)
- HogSay(instructor, loc(drill[8]), SAY_SHOUT)
- ShowMission(loc(caption), loc(subcaption), loc(goals[1]), 1, 0)
- target = AddGear(target_x, target_y, gtTarget, 0, 0, 0, 0)
- TurnTimeLeft = 60000
- elseif progress == 5 and (time_start + 10000 == GameTime) then
- FollowGear(target)
- elseif progress == 6 then
- progress = 7
- ShowMission(loc(caption), loc(subcaption), loc(goals[2]), 0, 0)
- PlaySound(sndVictory)
- time_start = GameTime
- elseif progress == 7 and (time_start + 2500 == GameTime) then
- EndGame()
- end
-end
-
-function onGameInit()
- Seed = 0
- GameFlags = gfMultiWeapon + gfOneClanMode
- TurnTime = 25000
- CaseFreq = 0
- MinesNum = 0
- Explosives = 0
- Delay = 2500
- Map = "Mushrooms"
- Theme = "Nature"
-
- AddTeam(loc(teamnames[0]), teamcolor, "Simple", "Island", "Default")
- player = AddHog(loc(hognames[0]), 0, player_health, "NoHat")
- SetGearPosition(player, player_start_x, player_start_y)
-
- AddTeam(loc(teamnames[1]), teamcolor + 1, "Simple", "Island", "Default")
- instructor = AddHog(loc(hognames[1]), 0, instructor_health, "NoHat")
- SetGearPosition(instructor, player_start_x + 100, player_start_y)
- HogTurnLeft(instructor, true)
-
- FollowGear(player)
-end
-
-function onAmmoStoreInit()
- SetAmmo(amBazooka, 9, 0, 0, 0)
-end
-
-function onGearDelete(gear)
- if GetGearType(gear) == gtTarget then
- progress = 6
- end
-end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/01#Boot_Camp.lua Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,357 @@
+-- IMPORTANT -- THIS IS WORK IN PROGRESS AND VERY LIKELY TO BE CHANGED AGAIN
+-- IMPORTANT -- DO NOT TRANSLATE THIS AS IT USES THE OLD SYSTEM AND WILL BE UPDATED LATER!
+
+local teamnames = {}
+local hognames = {}
+teamnames[0] = {
+ ["en"] = "Bloody Rookies",
+ ["de"] = "Blutige Anfänger",
+ ["pl"] = "Żótodzioby",
+ ["sv"] = "Blodiga nybörjare",
+ ["es"] = "Reclutas",
+ ["pt_PT"] = "Recrutas",
+ ["pt_BR"] = "Malditos Recrutas",
+ ["sk"] = "Regruti"
+}
+
+teamnames[1] = {
+ ["en"] = "Instructors",
+ ["de"] = "Ausbilder",
+ ["pl"] = "Instruktor",
+ ["sv"] = "Instruktör",
+ ["es"] = "Instructores",
+ ["pt_PT"] = "Instrutores",
+ ["pt_BR"] = "Instrutores",
+ ["sk"] = "Inštruktori"
+}
+
+hognames[0] = {
+ ["en"] = "Joker",
+ ["de"] = "Joker",
+ ["pl"] = "Joker",
+ ["sv"] = "Joker",
+ ["es"] = "Joker",
+ ["pt_PT"] = "Joker",
+ ["pt_BR"] = "Comediante",
+ ["sk"] = "Komediant"
+}
+
+hognames[1] = {
+ ["en"] = "Harthog",
+ ["de"] = "Harthog",
+ ["pl"] = "Harthog",
+ ["sv"] = "Harthog",
+ ["es"] = "Harthog",
+ ["pt_PT"] = "Harthog",
+ ["pt_BR"] = "Harthog",
+ ["sk"] = "Harthog"
+}
+
+local caption = {
+ ["en"] = "Boot Camp",
+ ["de"] = "Grundausbildung",
+ ["pl"] = "Poligon",
+ ["sv"] = "Grundutbildning",
+ ["es"] = "Campamento militar",
+ ["pt_PT"] = "Acampamento militar",
+ ["pt_BR"] = "Acampamento Militar",
+ ["sk"] = "Výcvikový tábor"
+
+}
+
+local subcaption = {
+ ["en"] = "Follow the instructions!",
+ ["de"] = "Befolge die Anweisungen!",
+ ["pl"] = "Wykonuj polecenia!",
+ ["sv"] = "Följ instruktioner!",
+ ["es"] = "¡Sigue las órdenes!",
+ ["pt_PT"] = "Segue as instruções!",
+ ["pt_BR"] = "Siga as ordens!",
+ ["sk"] = "Postupujte podľa inštrukcií!"
+}
+
+local goals = {}
+
+goals[0] = {
+ ["en"] = "Listen to your Drill Instructor and follow his lead!",
+ ["de"] = "Höre deinem Ausbilder zu und befolge seine Anweisungen!",
+ ["pl"] = "Słuchaj instruktora i wykonuj jego rozkazy!",
+ ["sv"] = "Lyssna på din instruktör och gör som han säger!",
+ ["es"] = "¡Escucha atentamente a tu instructor de maniobras y sigue sus órdenes!",
+ ["pt_PT"] = "Ouve atentamente o teu Instrutor e segue as suas ordens!",
+ ["pt_BR"] = "Escute seu instrutor de escavação e siga seu líder",
+ ["sk"] = "Počúvajte vášho inštruktora výcviku a vykonávajte jeho rozkazy!"
+}
+
+goals[1] = {
+ ["en"] = "Destroy the target to finish this mission!",
+ ["de"] = "Zerstöre das Ziel, um diese Mission abzuschließen!",
+ ["pl"] = "Zniszcz cel by ukończyć misję!",
+ ["sv"] = "Förstör målet för att avklara uppdraget!",
+ ["es"] = "¡Destruye el objetivo para completar esta misión!",
+ ["pt_PT"] = "Destrói o alvo para completar esta missão!",
+ ["pt_BR"] = "Destrua o alvo para concluir a missão",
+ ["sk"] = "Pre ukončenie misie zneškodnite cieľ!"
+}
+
+goals[2] = {
+ ["en"] = "Excellent! You've passed the Boot Camp!",
+ ["de"] = "Ausgezeichnet! Du hast das Ausbildungslager bestanden!",
+ ["pl"] = "Doskonale! Wyszedłeś cało z poligonu!",
+ ["sv"] = "Brilliant! Du har klarat av grundutbildningen!",
+ ["es"] = "¡Excelente! ¡Has completado la maniobra de hoy!",
+ ["pt_PT"] = "Excelente! Completaste o treino para recrutas!",
+ ["pt_BR"] = "Excelente! Você completou a manobra",
+ ["pt_BR"] = "Výborne! Prešli ste výcvikovým táborom!"
+}
+
+local failed = {
+ ["en"] = "You failed! Follow the instructions and shoot the target only!",
+ ["de"] = "Du hast versagt! Befolge die Anweisungen und schieß nur auf das Ziel!",
+ ["pl"] = "Przegrałeś! Wykonuj instrukcje poprawnie i strzelaj tylko w podane cele!",
+ ["sv"] = "Du har misslyckats! Följ instruktionerna och sjut endast på målen!",
+ ["es"] = "¡Has fallado! ¡Sigue las instrucciones y destruye únicamente el objetivo!",
+ ["pt_PT"] = "Falhaste! Segue as instruções e destrói apenas o alvo!",
+ ["pt_BR"] = "Você falhou! Siga as instruções e atire somente no alvo",
+ ["sk"] = "Prehrali ste! Nasledujte inštrukcie a strieľajte iba na cieľ!"
+}
+
+local drill = {}
+
+drill[0] = {
+ ["en"] = "Allright, maggot!",
+ ["de"] = "Also gut, du Made!",
+ ["pl"] = "Słuchaj mnie gnido!",
+ ["sv"] = "Dåså, din mask!",
+ ["es"] = "¡Muy bien, escoria!",
+ ["pt_PT"] = "Bom trabalho verme!",
+ ["pt_BR"] = "Parabéns escória",
+ ["sk"] = "Počúvaj, ty červík!"
+}
+
+drill[1] = {
+ ["en"] = "Show that you aren't that useless.",
+ ["de"] = "Zeig, dass du nicht so nutzlos bist.",
+ ["pl"] = "Udowodnij, że nie jesteś bezwartościowy.",
+ ["sv"] = "Visa att du inte är så värdelös!",
+ ["es"] = "Demuéstrame que no eres tan inútil como pareces.",
+ ["pt_PT"] = "Prova-me que não és tão inútil como pareces.",
+ ["pt_BR"] = "Mostre que você não é um inútil.",
+ ["sk"] = "Dokáž, že nie si na svete úplne zbytočným."
+}
+
+drill[2] = {
+ ["en"] = "Use [left] to move to the left!",
+ ["de"] = "Benutze [Links], um nach links zu gehen!",
+ ["pl"] = "Użyj [lewo] by poruszyć się w lewą stronę!",
+ ["sv"] = "Använd [vänster] för att gå åt vänster!",
+ ["es"] = "¡Aprieta [izquierda] para desplazarte a la izquierda!",
+ ["pt_PT"] = "Carrega [esquerda] para te moveres para a esquerda!",
+ ["pt_BR"] = "Use [esquerda] para mover para a esquerda",
+ ["sk"] = "Stlačte [vľavo] pre pohyb doľava"
+}
+
+drill[3] = {
+ ["en"] = "Good! Now use [right] to come back!",
+ ["de"] = "Gut! Nun komm mit [Rechts] zurück!",
+ ["pl"] = "Dobzre, Teraz użyj [prawo] by wrócić!",
+ ["sv"] = "Bra! Använd nu [höger] för att gå tillbaka!",
+ ["es"] = "¡Muy bien! ¡Ahora presiona [derecha] para volver!",
+ ["pt_PT"] = "Muito bem! Agora pressiona [direita] para voltar!",
+ ["pt_BR"] = "Bom! Agora use [direita] para voltar",
+ ["sk"] = "Dobre! Teraz použite [vpravo] a vráťte sa naspäť!"
+}
+
+drill[4] = {
+ ["en"] = "Excellent!",
+ ["de"] = "Ausgezeichnet!",
+ ["pl"] = "Wspaniale!",
+ ["sv"] = "Utmärkt!",
+ ["es"] = "¡Excelente!",
+ ["pt_PT"] = "Excelente!",
+ ["pt_BR"] = "Excelente!",
+ ["sk"] = "Výborne!"
+}
+
+drill[5] = {
+ ["en"] = "Now jump to the left using [return]!",
+ ["de"] = "Jetzt springe mit [Eingabetaste] nach links!",
+ ["pl"] = "Teraz skocz w lewo używając [Enter]",
+ ["sv"] = "Hoppa nu åt vänster med hjälp av [enter]!",
+ ["es"] = "¡Ahora salta hacia la izquierda usando [intro]!",
+ ["pt_PT"] = "Agora salta para a esquerda pressionando [retrocesso]!",
+ ["pt_BR"] = "Agora pule para a esquerda usando [return]!",
+ ["sk"] = "Teraz skočte doľava stlačením [enter]!"
+}
+
+drill[6] = {
+ ["en"] = "Use [up] and [down] to aim.",
+ ["de"] = "Benutze [Hoch] und [Runter], um zu zielen.",
+ ["pl"] = "Użyj klawiszy [góra] i [dół] by celować.",
+ ["sv"] = "Använd [upp] och [ner] för att sikta!",
+ ["es"] = "Presiora [arriba] y [abajo] para apuntar.",
+ ["pt_PT"] = "Pressiona [cima] e [baixo] para apontar.",
+ ["pt_BR"] = "Pressione [acima] e [abaixo] para mirar.",
+ ["sk"] = "Stlačte [hore] a [dole] pre mierenie."
+}
+
+drill[7] = {
+ ["en"] = "Hold [space] to power up your shot and then release it to shoot.",
+ ["de"] = "Halte [Leertaste], um deinen Schuss aufzuladen, und lasse dann rechtzeitig los.",
+ ["pl"] = "Przytrzymaj spację by zwiększyć siłę strzału.",
+ ["sv"] = "Håll ner [mellanslag] för att få kraft och släpp för att skjuta!",
+ ["es"] = "Mantén presionada la [barra espaciadora] para controlar la fuerza del disparo y suéltala para disparar.",
+ ["pt_PT"] = "Mantem a [barra de espaços] pressionada para controlar a força do tiro e larga-a para disparar.",
+ ["pt_BR"] = "Mantenha pressionado [espaço] para aumentar a força do seu tiro e solte para atirar",
+ ["sk"] = "Držte stlačený [medzerník] pre nabíjanie, jeho uvoľnením vystrelíte."
+}
+
+drill[8] = {
+ ["en"] = "Destroy the target to finish your basic training!",
+ ["de"] = "Zerstöre das Ziel, um deine Grundausbildung abzuschließen!",
+ ["pl"] = "Zniszcz cel by by ukończyć trening podstawowy!",
+ ["sv"] = "Förstör målet för att avsluta din grundutbildning!",
+ ["es"] = "¡Destruye el objetivo para completar el entrenamiento básico!",
+ ["pt_PT"] = "Destrói o alvo para completar o treino básico!",
+ ["pt_BR"] = "Destrua o alvo para terminar o treino básico",
+ ["sk"] = "Zneškodnite cieľ na ukončenie základného výcviku!"
+}
+
+local function loc(text)
+ if text == nil then return "**missing**"
+ elseif text[L] == nil then return text["en"]
+ else return text[L]
+ end
+end
+
+local player = nil
+local instructor = nil
+local target = nil
+
+function onGameStart()
+
+end
+
+local player_start_x = 2300
+local player_start_y = 1250
+local target_x = 1900
+local target_y = 1250
+local player_health = 100
+local instructor_health = 100
+local teamcolor = 14483456
+
+local progress = 0
+local time_start = 0
+
+function onGameTick()
+ if progress == -1 and (time_start + 2500) == GameTime then
+ EndGame()
+ elseif progress == -1 then
+
+ elseif progress > 0 and ((TurnTimeLeft == 0) or (GetHealth(player) ~= player_health) or (GetHealth(instructor) ~= instructor_health)) then
+ progress = -1
+ ShowMission(loc(caption), loc(subcaption), loc(failed), -amBazooka, 0)
+ time_start = GameTime
+ PlaySound(sndNooo)
+ TurnTimeLeft = 0
+ elseif GameTime == 0 then
+ ShowMission(loc(caption), loc(subcaption), loc(goals[0]), -amBazooka, 0)
+ TurnTimeLeft = 60000
+ elseif GameTime == 2500 then
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[0]), SAY_SAY)
+ elseif GameTime == 5000 then
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[1]), SAY_SAY)
+ elseif GameTime == 7500 then
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[2]), SAY_SHOUT)
+ progress = 1
+ TurnTimeLeft = 10000
+ elseif progress == 1 then
+ local x, y = GetGearPosition(player)
+ if x < player_start_x - 50 then
+ progress = 2
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[3]), SAY_SHOUT)
+ TurnTimeLeft = 10000
+ end
+ elseif progress == 2 then
+ local x, y = GetGearPosition(player)
+ if x > player_start_x then
+ progress = 3
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[4]), SAY_SAY)
+ time_start = GameTime
+ end
+ elseif progress == 3 and (time_start + 2500 == GameTime) then
+ progress = 4
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[5]), SAY_SHOUT)
+ HogTurnLeft(player, true)
+ TurnTimeLeft = 10000
+ elseif progress == 4 then
+ local x, y = GetGearPosition(player)
+ if y < player_start_y then
+ progress = 5
+ FollowGear(instructor)
+ HogSay(instructor, "Yeah!", SAY_SAY)
+ time_start = GameTime
+ TurnTimeLeft = 30000
+ end
+ elseif progress == 5 and (time_start + 2500 == GameTime) then
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[6]), SAY_SAY)
+ elseif progress == 5 and (time_start + 5000 == GameTime) then
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[7]), SAY_SAY)
+ elseif progress == 5 and (time_start + 7500 == GameTime) then
+ FollowGear(instructor)
+ HogSay(instructor, loc(drill[8]), SAY_SHOUT)
+ ShowMission(loc(caption), loc(subcaption), loc(goals[1]), 1, 0)
+ target = AddGear(target_x, target_y, gtTarget, 0, 0, 0, 0)
+ TurnTimeLeft = 60000
+ elseif progress == 5 and (time_start + 10000 == GameTime) then
+ FollowGear(target)
+ elseif progress == 6 then
+ progress = 7
+ ShowMission(loc(caption), loc(subcaption), loc(goals[2]), 0, 0)
+ PlaySound(sndVictory)
+ time_start = GameTime
+ elseif progress == 7 and (time_start + 2500 == GameTime) then
+ EndGame()
+ end
+end
+
+function onGameInit()
+ Seed = 0
+ GameFlags = gfMultiWeapon + gfOneClanMode
+ TurnTime = 25000
+ CaseFreq = 0
+ MinesNum = 0
+ Explosives = 0
+ Delay = 2500
+ Map = "Mushrooms"
+ Theme = "Nature"
+
+ AddTeam(loc(teamnames[0]), teamcolor, "Simple", "Island", "Default")
+ player = AddHog(loc(hognames[0]), 0, player_health, "NoHat")
+ SetGearPosition(player, player_start_x, player_start_y)
+
+ AddTeam(loc(teamnames[1]), teamcolor + 1, "Simple", "Island", "Default")
+ instructor = AddHog(loc(hognames[1]), 0, instructor_health, "NoHat")
+ SetGearPosition(instructor, player_start_x + 100, player_start_y)
+ HogTurnLeft(instructor, true)
+
+ FollowGear(player)
+end
+
+function onAmmoStoreInit()
+ SetAmmo(amBazooka, 9, 0, 0, 0)
+end
+
+function onGearDelete(gear)
+ if GetGearType(gear) == gtTarget then
+ progress = 6
+ end
+end
--- a/share/hedgewars/Data/Missions/Training/SniperRifle.lua Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,303 +0,0 @@
--- Hedgewars SniperRifle Training
--- Scripting Example
-
--- Lines such as this one are comments - they are ignored
--- by the game, no matter what kind of text is in there.
--- It's also possible to place a comment after some real
--- instruction as you see below. In short, everything
--- following "--" is ignored.
-
----------------------------------------------------------------
--- At first we implement the localization library using loadfile.
--- This allows us to localize strings without needing to think
--- about translations.
--- We can use the function loc(text) to localize a string.
-
-loadfile(GetDataPath() .. "Scripts/Locale.lua")()
-
--- This variable will hold the number of destroyed targets.
-local score = 0
--- This variable represents the number of targets to destroy.
-local score_goal = 31
--- This variable controls how many milliseconds/ticks we'd
--- like to wait before we end the round once all targets
--- have been destroyed.
-local end_timer = 5000 -- 5000 ms = 5 s
--- This variable is set to true if the game is lost (i.e.
--- time runs out).
-local game_lost = false
--- This variable will point to the hog's gear
-local player = nil
--- This variable will grab the time left at the end of the round
-local time_goal = 0
-
-local target = nil
-
-local last_hit_time = 0
--- This is a custom function to make it easier to
--- spawn more targets with just one line of code
--- You may define as many custom functions as you
--- like.
-function spawnTarget(x, y)
- -- add a new target gear
- target = AddGear(x, y, gtTarget, 0, 0, 0, 0)
- -- have the camera move to the target so the player knows where it is
- FollowGear(target)
-end
-
-function blowUp(x, y)
- -- adds some TNT
- gear = AddGear(x, y, gtDynamite, 0, 0, 0, 0)
-end
-
--- This function is called before the game loads its
--- resources.
--- It's one of the predefined function names that will
--- be called by the game. They give you entry points
--- where you're able to call your own code using either
--- provided instructions or custom functions.
-function onGameInit()
- -- At first we have to overwrite/set some global variables
- -- that define the map, the game has to load, as well as
- -- other things such as the game rules to use, etc.
- -- Things we don't modify here will use their default values.
-
- -- The base number for the random number generator
- Seed = 0
- -- Game settings and rules
- GameFlags = gfMultiWeapon + gfOneClanMode + gfArtillery
- -- The time the player has to move each round (in ms)
- TurnTime = 150000
- -- The frequency of crate drops
- CaseFreq = 0
- -- The number of mines being placed
- MinesNum = 0
- -- The number of explosives being placed
- Explosives = 0
- -- The delay between each round
- Delay = 0
- -- The map to be played
- Map = "Ropes"
- -- The theme to be used
- Theme = "City"
-
- -- Create the player team
- AddTeam(loc("Sniperz"), 14483456, "Simple", "Island", "Default")
- -- And add a hog to it
- player = AddHog(loc("Hunter"), 0, 1, "Sniper")
- SetGearPosition(player, 602, 1465)
-end
-
--- This function is called when the round starts
--- it spawns the first target that has to be destroyed.
--- In addition it shows the scenario goal(s).
-function onGameStart()
- -- Spawn the first target.
- spawnTarget(860,1020)
-
- -- Show some nice mission goals.
- -- Parameters are: caption, sub caption, description,
- -- extra text, icon and time to show.
- -- A negative icon parameter (-n) represents the n-th weapon icon
- -- A positive icon paramter (n) represents the (n+1)-th mission icon
- -- A timeframe of 0 is replaced with the default time to show.
- ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."), -amSniperRifle, 0)
-end
-
--- This function is called every game tick.
--- Note that there are 1000 ticks within one second.
--- You shouldn't try to calculate too complicated
--- code here as this might slow down your game.
-function onGameTick()
- if game_lost then
- return
- end
- -- after a target is destroyed, show hog, then target
- if (target ~= nil) and (TurnTimeLeft + 1300 < last_hit_time) then
- -- move camera to the target
- FollowGear(target)
- elseif TurnTimeLeft + 300 < last_hit_time then
- -- move camera to the hog
- FollowGear(player)
- end
- -- If time's up, set the game to be lost.
- -- We actually check the time to be "1 ms" as it
- -- will be at "0 ms" right at the start of the game.
- if TurnTimeLeft == 1 and score < score_goal then
- game_lost = true
- -- ... and show a short message.
- ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Oh no! Time's up! Just try again."), -amSkip, 0)
- -- How about killing our poor hog due to his poor performance?
- SetHealth(player, 0)
- -- Just to be sure set the goal time to 1 ms
- time_goal = 1
- end
- -- If the goal is reached or we've lost ...
- if score == score_goal or game_lost then
- -- ... check to see if the time we'd like to
- -- wait has passed and then ...
- if end_timer == 0 then
- -- ... end the game ...
- EndGame()
- else
- -- ... or just lower the timer by 1.
- end_timer = end_timer - 1
- -- Reset the time left to stop the timer
- TurnTimeLeft = time_goal
- end
- end
-end
-
--- This function is called when the game is initialized
--- to request the available ammo and probabilities
-function onAmmoStoreInit()
- -- add an unlimited supply of shotgun ammo
- SetAmmo(amSniperRifle, 9, 0, 0, 0)
-end
-
--- This function is called when a new gear is added.
--- We don't need it for this training, so we can
--- keep it empty.
-function onGearAdd(gear)
-end
-
--- This function is called before a gear is destroyed.
--- We use it to count the number of targets destroyed.
-function onGearDelete(gear)
-
- if GetGearType(gear) == gtCase then
- game_lost = true
- return
- end
-
- if (GetGearType(gear) == gtTarget) then
- -- remember when the target was hit for adjusting the camera
- last_hit_time = TurnTimeLeft
- -- Add one point to our score/counter
- score = score + 1
- -- If we haven't reached the goal ...
- if score < score_goal then
- -- ... spawn another target.
- if score == 1 then
- spawnTarget(1520,1350)
- elseif score == 2 then
- spawnTarget(1730,1040)
- elseif score == 3 then
- spawnTarget(2080,780)
- elseif score == 4 then
- blowUp(1730,1226)
- blowUp(1440,1595)
- blowUp(1527,1575)
- blowUp(1614,1595)
- blowUp(1420,1675)
- blowUp(1527,1675)
- blowUp(1634,1675)
- blowUp(1440,1755)
- blowUp(1527,1775)
- blowUp(1614,1755)
- spawnTarget(1527,1667)
- elseif score == 5 then
- spawnTarget(1527,1667)
- elseif score == 6 then
- spawnTarget(2175,1300)
- elseif score == 7 then
- spawnTarget(2250,940)
- elseif score == 8 then
- spawnTarget(2665,1540)
- elseif score == 9 then
- spawnTarget(3040,1160)
- elseif score == 10 then
- spawnTarget(2930,1500)
- elseif score == 11 then
- spawnTarget(700,720)
- elseif score == 12 then
- blowUp(914,1222)
- blowUp(1050,1222)
- blowUp(1160,1008)
- blowUp(1160,1093)
- blowUp(1160,1188)
- blowUp(375,911)
- blowUp(510,911)
- blowUp(640,911)
- blowUp(780,911)
- blowUp(920,911)
- blowUp(1060,913)
- blowUp(1198,913)
- spawnTarget(1200,730)
- elseif score == 13 then
- spawnTarget(1200,830)
- elseif score == 14 then
- spawnTarget(1430,450)
- elseif score == 15 then
- spawnTarget(796,240)
- elseif score == 16 then
- spawnTarget(300,10)
- elseif score == 17 then
- spawnTarget(2080,820)
- elseif score == 18 then
- blowUp(2110,920)
- blowUp(2210,920)
- blowUp(2200,305)
- blowUp(2300,305)
- blowUp(2300,400)
- blowUp(2300,500)
- blowUp(2300,600)
- blowUp(2300,700)
- blowUp(2300,800)
- blowUp(2300,900)
- blowUp(2401,305)
- blowUp(2532,305)
- blowUp(2663,305)
- spawnTarget(2300,760)
- elseif score == 19 then
- spawnTarget(2300,760)
- elseif score == 20 then
- spawnTarget(2738,190)
- elseif score == 21 then
- spawnTarget(2590,-100)
- elseif score == 22 then
- blowUp(2790,305)
- blowUp(2930,305)
- blowUp(3060,305)
- blowUp(3190,305)
- blowUp(3310,305)
- blowUp(3393,613)
- blowUp(2805,370)
- blowUp(2805,500)
- blowUp(2805,630)
- blowUp(2805,760)
- blowUp(2805,890)
- blowUp(2700,890)
- blowUp(3258,370)
- blowUp(3258,475)
- blowUp(3264,575)
- spawnTarget(3230,240)
- elseif score == 23 then
- spawnTarget(3230,290)
- elseif score == 24 then
- spawnTarget(3670,250)
- elseif score == 25 then
- spawnTarget(2620,-100)
- elseif score == 26 then
- spawnTarget(2870,300)
- elseif score == 27 then
- spawnTarget(3850,900)
- elseif score == 28 then
- spawnTarget(3780,300)
- elseif score == 29 then
- spawnTarget(3670,0)
- elseif score == 30 then
- spawnTarget(3480,1200)
- end
- else
- if not game_lost then
- -- Otherwise show that the goal was accomplished
- ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Congratulations! You've eliminated all targets|within the allowed time frame."), 0, 0)
- -- Also let the hogs shout "victory!"
- PlaySound(sndVictory)
- -- Save the time left so we may keep it.
- time_goal = TurnTimeLeft
- end
- end
- end
-end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Training/Sniper_Rifle.lua Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,303 @@
+-- Hedgewars SniperRifle Training
+-- Scripting Example
+
+-- Lines such as this one are comments - they are ignored
+-- by the game, no matter what kind of text is in there.
+-- It's also possible to place a comment after some real
+-- instruction as you see below. In short, everything
+-- following "--" is ignored.
+
+---------------------------------------------------------------
+-- At first we implement the localization library using loadfile.
+-- This allows us to localize strings without needing to think
+-- about translations.
+-- We can use the function loc(text) to localize a string.
+
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+
+-- This variable will hold the number of destroyed targets.
+local score = 0
+-- This variable represents the number of targets to destroy.
+local score_goal = 31
+-- This variable controls how many milliseconds/ticks we'd
+-- like to wait before we end the round once all targets
+-- have been destroyed.
+local end_timer = 5000 -- 5000 ms = 5 s
+-- This variable is set to true if the game is lost (i.e.
+-- time runs out).
+local game_lost = false
+-- This variable will point to the hog's gear
+local player = nil
+-- This variable will grab the time left at the end of the round
+local time_goal = 0
+
+local target = nil
+
+local last_hit_time = 0
+-- This is a custom function to make it easier to
+-- spawn more targets with just one line of code
+-- You may define as many custom functions as you
+-- like.
+function spawnTarget(x, y)
+ -- add a new target gear
+ target = AddGear(x, y, gtTarget, 0, 0, 0, 0)
+ -- have the camera move to the target so the player knows where it is
+ FollowGear(target)
+end
+
+function blowUp(x, y)
+ -- adds some TNT
+ gear = AddGear(x, y, gtDynamite, 0, 0, 0, 0)
+end
+
+-- This function is called before the game loads its
+-- resources.
+-- It's one of the predefined function names that will
+-- be called by the game. They give you entry points
+-- where you're able to call your own code using either
+-- provided instructions or custom functions.
+function onGameInit()
+ -- At first we have to overwrite/set some global variables
+ -- that define the map, the game has to load, as well as
+ -- other things such as the game rules to use, etc.
+ -- Things we don't modify here will use their default values.
+
+ -- The base number for the random number generator
+ Seed = 0
+ -- Game settings and rules
+ GameFlags = gfMultiWeapon + gfOneClanMode + gfArtillery
+ -- The time the player has to move each round (in ms)
+ TurnTime = 150000
+ -- The frequency of crate drops
+ CaseFreq = 0
+ -- The number of mines being placed
+ MinesNum = 0
+ -- The number of explosives being placed
+ Explosives = 0
+ -- The delay between each round
+ Delay = 0
+ -- The map to be played
+ Map = "Ropes"
+ -- The theme to be used
+ Theme = "City"
+
+ -- Create the player team
+ AddTeam(loc("Sniperz"), 14483456, "Simple", "Island", "Default")
+ -- And add a hog to it
+ player = AddHog(loc("Hunter"), 0, 1, "Sniper")
+ SetGearPosition(player, 602, 1465)
+end
+
+-- This function is called when the round starts
+-- it spawns the first target that has to be destroyed.
+-- In addition it shows the scenario goal(s).
+function onGameStart()
+ -- Spawn the first target.
+ spawnTarget(860,1020)
+
+ -- Show some nice mission goals.
+ -- Parameters are: caption, sub caption, description,
+ -- extra text, icon and time to show.
+ -- A negative icon parameter (-n) represents the n-th weapon icon
+ -- A positive icon paramter (n) represents the (n+1)-th mission icon
+ -- A timeframe of 0 is replaced with the default time to show.
+ ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."), -amSniperRifle, 0)
+end
+
+-- This function is called every game tick.
+-- Note that there are 1000 ticks within one second.
+-- You shouldn't try to calculate too complicated
+-- code here as this might slow down your game.
+function onGameTick()
+ if game_lost then
+ return
+ end
+ -- after a target is destroyed, show hog, then target
+ if (target ~= nil) and (TurnTimeLeft + 1300 < last_hit_time) then
+ -- move camera to the target
+ FollowGear(target)
+ elseif TurnTimeLeft + 300 < last_hit_time then
+ -- move camera to the hog
+ FollowGear(player)
+ end
+ -- If time's up, set the game to be lost.
+ -- We actually check the time to be "1 ms" as it
+ -- will be at "0 ms" right at the start of the game.
+ if TurnTimeLeft == 1 and score < score_goal then
+ game_lost = true
+ -- ... and show a short message.
+ ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Oh no! Time's up! Just try again."), -amSkip, 0)
+ -- How about killing our poor hog due to his poor performance?
+ SetHealth(player, 0)
+ -- Just to be sure set the goal time to 1 ms
+ time_goal = 1
+ end
+ -- If the goal is reached or we've lost ...
+ if score == score_goal or game_lost then
+ -- ... check to see if the time we'd like to
+ -- wait has passed and then ...
+ if end_timer == 0 then
+ -- ... end the game ...
+ EndGame()
+ else
+ -- ... or just lower the timer by 1.
+ end_timer = end_timer - 1
+ -- Reset the time left to stop the timer
+ TurnTimeLeft = time_goal
+ end
+ end
+end
+
+-- This function is called when the game is initialized
+-- to request the available ammo and probabilities
+function onAmmoStoreInit()
+ -- add an unlimited supply of shotgun ammo
+ SetAmmo(amSniperRifle, 9, 0, 0, 0)
+end
+
+-- This function is called when a new gear is added.
+-- We don't need it for this training, so we can
+-- keep it empty.
+function onGearAdd(gear)
+end
+
+-- This function is called before a gear is destroyed.
+-- We use it to count the number of targets destroyed.
+function onGearDelete(gear)
+
+ if GetGearType(gear) == gtCase then
+ game_lost = true
+ return
+ end
+
+ if (GetGearType(gear) == gtTarget) then
+ -- remember when the target was hit for adjusting the camera
+ last_hit_time = TurnTimeLeft
+ -- Add one point to our score/counter
+ score = score + 1
+ -- If we haven't reached the goal ...
+ if score < score_goal then
+ -- ... spawn another target.
+ if score == 1 then
+ spawnTarget(1520,1350)
+ elseif score == 2 then
+ spawnTarget(1730,1040)
+ elseif score == 3 then
+ spawnTarget(2080,780)
+ elseif score == 4 then
+ blowUp(1730,1226)
+ blowUp(1440,1595)
+ blowUp(1527,1575)
+ blowUp(1614,1595)
+ blowUp(1420,1675)
+ blowUp(1527,1675)
+ blowUp(1634,1675)
+ blowUp(1440,1755)
+ blowUp(1527,1775)
+ blowUp(1614,1755)
+ spawnTarget(1527,1667)
+ elseif score == 5 then
+ spawnTarget(1527,1667)
+ elseif score == 6 then
+ spawnTarget(2175,1300)
+ elseif score == 7 then
+ spawnTarget(2250,940)
+ elseif score == 8 then
+ spawnTarget(2665,1540)
+ elseif score == 9 then
+ spawnTarget(3040,1160)
+ elseif score == 10 then
+ spawnTarget(2930,1500)
+ elseif score == 11 then
+ spawnTarget(700,720)
+ elseif score == 12 then
+ blowUp(914,1222)
+ blowUp(1050,1222)
+ blowUp(1160,1008)
+ blowUp(1160,1093)
+ blowUp(1160,1188)
+ blowUp(375,911)
+ blowUp(510,911)
+ blowUp(640,911)
+ blowUp(780,911)
+ blowUp(920,911)
+ blowUp(1060,913)
+ blowUp(1198,913)
+ spawnTarget(1200,730)
+ elseif score == 13 then
+ spawnTarget(1200,830)
+ elseif score == 14 then
+ spawnTarget(1430,450)
+ elseif score == 15 then
+ spawnTarget(796,240)
+ elseif score == 16 then
+ spawnTarget(300,10)
+ elseif score == 17 then
+ spawnTarget(2080,820)
+ elseif score == 18 then
+ blowUp(2110,920)
+ blowUp(2210,920)
+ blowUp(2200,305)
+ blowUp(2300,305)
+ blowUp(2300,400)
+ blowUp(2300,500)
+ blowUp(2300,600)
+ blowUp(2300,700)
+ blowUp(2300,800)
+ blowUp(2300,900)
+ blowUp(2401,305)
+ blowUp(2532,305)
+ blowUp(2663,305)
+ spawnTarget(2300,760)
+ elseif score == 19 then
+ spawnTarget(2300,760)
+ elseif score == 20 then
+ spawnTarget(2738,190)
+ elseif score == 21 then
+ spawnTarget(2590,-100)
+ elseif score == 22 then
+ blowUp(2790,305)
+ blowUp(2930,305)
+ blowUp(3060,305)
+ blowUp(3190,305)
+ blowUp(3310,305)
+ blowUp(3393,613)
+ blowUp(2805,370)
+ blowUp(2805,500)
+ blowUp(2805,630)
+ blowUp(2805,760)
+ blowUp(2805,890)
+ blowUp(2700,890)
+ blowUp(3258,370)
+ blowUp(3258,475)
+ blowUp(3264,575)
+ spawnTarget(3230,240)
+ elseif score == 23 then
+ spawnTarget(3230,290)
+ elseif score == 24 then
+ spawnTarget(3670,250)
+ elseif score == 25 then
+ spawnTarget(2620,-100)
+ elseif score == 26 then
+ spawnTarget(2870,300)
+ elseif score == 27 then
+ spawnTarget(3850,900)
+ elseif score == 28 then
+ spawnTarget(3780,300)
+ elseif score == 29 then
+ spawnTarget(3670,0)
+ elseif score == 30 then
+ spawnTarget(3480,1200)
+ end
+ else
+ if not game_lost then
+ -- Otherwise show that the goal was accomplished
+ ShowMission(loc("Sniper Training"), loc("Aiming Practice"), loc("Congratulations! You've eliminated all targets|within the allowed time frame."), 0, 0)
+ -- Also let the hogs shout "victory!"
+ PlaySound(sndVictory)
+ -- Save the time left so we may keep it.
+ time_goal = TurnTimeLeft
+ end
+ end
+ end
+end
Binary file share/hedgewars/Data/Music/main theme.ogg has changed
Binary file share/hedgewars/Data/Music/main_theme.ogg has changed
--- a/share/hedgewars/Data/Scripts/Multiplayer/RandomWeapon.cfg Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2 +0,0 @@
-Default
-locked
--- a/share/hedgewars/Data/Scripts/Multiplayer/RandomWeapon.lua Tue Dec 14 22:32:47 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,42 +0,0 @@
-local weapons = { amGrenade, amClusterBomb, amBazooka, amBee, amShotgun,
- amMine, amDEagle, amDynamite, amFirePunch, amWhip, amPickHammer,
- amBaseballBat, amAirAttack, amMineStrike, amTeleport, amMortar, amCake,
- amSeduction, amWatermelon, amHellishBomb, amNapalm, amDrill, amBallgun,
- amRCPlane, amSniperRifle, amMolotov, amBirdy, amBlowTorch,
- amGasBomb, amFlamethrower, amSMine, amHammer, amDrillStrike }
-
-local lastRound = -1
-local weapon = 0
-
-function onGameInit()
- GameFlags = band(bor(GameFlags, gfResetWeps), bnot(gfInfAttack + gfPerHogAmmo))
-end
-
-function onAmmoStoreInit()
- SetAmmo(amSkip, 9, 0, 0, 0)
-
- SetAmmo(amParachute, 0, 1, 0, 1)
- SetAmmo(amGirder, 0, 1, 0, 2)
- SetAmmo(amSwitch, 0, 1, 0, 1)
- SetAmmo(amLowGravity, 0, 1, 0, 1)
- SetAmmo(amExtraDamage, 0, 1, 0, 1)
- SetAmmo(amInvulnerable, 0, 1, 0, 1)
- SetAmmo(amExtraTime, 0, 1, 0, 1)
- SetAmmo(amLaserSight, 0, 1, 0, 1)
- SetAmmo(amVampiric, 0, 1, 0, 1)
- SetAmmo(amJetpack, 0, 1, 0, 1)
- SetAmmo(amPortalGun, 0, 1, 0, 1)
- SetAmmo(amResurrector, 0, 1, 0, 1)
-
- for i, w in pairs(weapons) do
- SetAmmo(w, 0, 0, 0, 1)
- end
-end
-
-function onNewTurn()
- if lastRound ~= TotalRounds then
- weapon = GetRandom(table.maxn(weapons)) + 1
- lastRound = TotalRounds
- end
- AddAmmo(CurrentHedgehog, weapons[weapon])
-end
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Random_Weapon.cfg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,2 @@
+Default
+locked
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Random_Weapon.lua Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,54 @@
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+
+local weapons = { amGrenade, amClusterBomb, amBazooka, amBee, amShotgun,
+ amMine, amDEagle, amDynamite, amFirePunch, amWhip, amPickHammer,
+ amBaseballBat, amTeleport, amMortar, amCake, amSeduction,
+ amWatermelon, amHellishBomb, amDrill, amBallgun, amRCPlane,
+ amSniperRifle, amMolotov, amBirdy, amBlowTorch, amGasBomb,
+ amFlamethrower, amSMine, amHammer, amSnowball }
+
+local airweapons = { amAirAttack, amMineStrike, amNapalm, amDrillStrike }
+
+
+function onGameInit()
+ GameFlags = band(bor(GameFlags, gfResetWeps), bnot(gfInfAttack + gfPerHogAmmo))
+end
+
+function onGameStart()
+ if MapHasBorder() == false then
+ for i, w in pairs(airweapons) do
+ table.insert(weapons, w)
+ end
+ end
+
+ ShowMission(loc("Random Weapons"), loc("A game of luck"), loc("There has been a mix-up with your gear and now you|have to utilize whatever is coming your way!"), -amSkip, 0)
+end
+
+function onAmmoStoreInit()
+ SetAmmo(amSkip, 9, 0, 0, 0)
+
+ SetAmmo(amParachute, 0, 1, 0, 1)
+ SetAmmo(amGirder, 0, 1, 0, 2)
+ SetAmmo(amSwitch, 0, 1, 0, 1)
+ SetAmmo(amLowGravity, 0, 1, 0, 1)
+ SetAmmo(amExtraDamage, 0, 1, 0, 1)
+ SetAmmo(amInvulnerable, 0, 1, 0, 1)
+ SetAmmo(amExtraTime, 0, 1, 0, 1)
+ SetAmmo(amLaserSight, 0, 1, 0, 1)
+ SetAmmo(amVampiric, 0, 1, 0, 1)
+ SetAmmo(amJetpack, 0, 1, 0, 1)
+ SetAmmo(amPortalGun, 0, 1, 0, 1)
+ SetAmmo(amResurrector, 0, 1, 0, 1)
+
+ for i, w in pairs(weapons) do
+ SetAmmo(w, 0, 0, 0, 1)
+ end
+
+ for i, w in pairs(airweapons) do
+ SetAmmo(w, 0, 0, 0, 1)
+ end
+end
+
+function onNewTurn()
+ AddAmmo(CurrentHedgehog, weapons[GetRandom(table.maxn(weapons)) + 1])
+end
--- a/share/hedgewars/Data/Themes/CMakeLists.txt Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Themes/CMakeLists.txt Thu Dec 23 11:13:57 2010 -0500
@@ -7,6 +7,7 @@
Cake
Castle
Cheese
+ Christmas
Deepspace
City
CrazyMission
Binary file share/hedgewars/Data/Themes/Christmas/Ball.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/Ball.svg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,500 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/mnt/y/src/hedgewars/share/hedgewars/Data/Themes/Snow/Ball.png"
+ inkscape:version="0.48.0 r9654"
+ version="1.1"
+ id="svg2"
+ height="174.48601"
+ width="166.29604"
+ sodipodi:docname="Ball.svg">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1.4142136"
+ inkscape:cx="80.36706"
+ inkscape:cy="129.02805"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1280"
+ inkscape:window-height="948"
+ inkscape:window-x="-4"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ fit-margin-top="15"
+ fit-margin-left="15"
+ fit-margin-right="15"
+ fit-margin-bottom="15" />
+ <defs
+ id="defs4">
+ <pattern
+ inkscape:stockid="Polka dots, medium"
+ id="Polkadots-med"
+ patternTransform="translate(0,0) scale(10,10)"
+ height="10"
+ width="10"
+ patternUnits="userSpaceOnUse"
+ inkscape:collect="always">
+ <circle
+ id="circle4775"
+ r="0.15"
+ cy="0.810"
+ cx="2.567"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4777"
+ r="0.15"
+ cy="2.33"
+ cx="3.048"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4779"
+ r="0.15"
+ cy="2.415"
+ cx="4.418"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4781"
+ r="0.15"
+ cy="3.029"
+ cx="1.844"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4783"
+ r="0.15"
+ cy="1.363"
+ cx="6.08"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4785"
+ r="0.15"
+ cy="4.413"
+ cx="5.819"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4787"
+ r="0.15"
+ cy="4.048"
+ cx="4.305"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4789"
+ r="0.15"
+ cy="3.045"
+ cx="5.541"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4791"
+ r="0.15"
+ cy="5.527"
+ cx="4.785"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4793"
+ r="0.15"
+ cy="5.184"
+ cx="2.667"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4795"
+ r="0.15"
+ cy="1.448"
+ cx="7.965"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4797"
+ r="0.15"
+ cy="5.049"
+ cx="7.047"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4799"
+ r="0.15"
+ cy="0.895"
+ cx="4.340"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4801"
+ r="0.15"
+ cy="0.340"
+ cx="7.125"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4803"
+ r="0.15"
+ cy="1.049"
+ cx="9.553"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4805"
+ r="0.15"
+ cy="2.689"
+ cx="7.006"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4807"
+ r="0.15"
+ cy="2.689"
+ cx="8.909"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4809"
+ r="0.15"
+ cy="4.407"
+ cx="9.315"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4811"
+ r="0.15"
+ cy="3.870"
+ cx="7.820"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4813"
+ r="0.15"
+ cy="5.948"
+ cx="8.270"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4815"
+ r="0.15"
+ cy="7.428"
+ cx="7.973"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4817"
+ r="0.15"
+ cy="8.072"
+ cx="9.342"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4819"
+ r="0.15"
+ cy="9.315"
+ cx="8.206"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4821"
+ r="0.15"
+ cy="9.475"
+ cx="9.682"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4823"
+ r="0.15"
+ cy="6.186"
+ cx="9.688"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4825"
+ r="0.15"
+ cy="6.296"
+ cx="3.379"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4827"
+ r="0.15"
+ cy="8.204"
+ cx="2.871"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4829"
+ r="0.15"
+ cy="8.719"
+ cx="4.59"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4831"
+ r="0.15"
+ cy="9.671"
+ cx="3.181"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4833"
+ r="0.15"
+ cy="7.315"
+ cx="5.734"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4835"
+ r="0.15"
+ cy="6.513"
+ cx="6.707"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4837"
+ r="0.15"
+ cy="9.670"
+ cx="5.730"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4839"
+ r="0.15"
+ cy="8.373"
+ cx="6.535"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4841"
+ r="0.15"
+ cy="7.154"
+ cx="4.37"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4843"
+ r="0.15"
+ cy="7.25"
+ cx="0.622"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4845"
+ r="0.15"
+ cy="5.679"
+ cx="0.831"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4847"
+ r="0.15"
+ cy="8.519"
+ cx="1.257"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4849"
+ r="0.15"
+ cy="6.877"
+ cx="1.989"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4851"
+ r="0.15"
+ cy="3.181"
+ cx="0.374"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4853"
+ r="0.15"
+ cy="1.664"
+ cx="1.166"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4855"
+ r="0.15"
+ cy="0.093"
+ cx="1.151"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4857"
+ r="0.15"
+ cy="10.093"
+ cx="1.151"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4859"
+ r="0.15"
+ cy="4.451"
+ cx="1.302"
+ style="fill:black;stroke:none" />
+ <circle
+ id="circle4861"
+ r="0.15"
+ cy="3.763"
+ cx="3.047"
+ style="fill:black;stroke:none" />
+ </pattern>
+ <linearGradient
+ id="linearGradient5294"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#d6cda8;stop-opacity:1;"
+ offset="0"
+ id="stop5296" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter5306"
+ color-interpolation-filters="sRGB">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.365"
+ id="feGaussianBlur5308" />
+ </filter>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(-212.23005,-401.7896)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Capa 1">
+ <path
+ transform="matrix(0.91975398,0,0,0.91975398,22.211138,104.12914)"
+ d="m 370,422.94403 c 0,40.31679 -32.68321,73 -73,73 -40.31679,0 -73,-32.68321 -73,-73 0,-40.31679 32.68321,-73 73,-73 40.31679,0 73,32.68321 73,73 z"
+ sodipodi:ry="73"
+ sodipodi:rx="73"
+ sodipodi:cy="422.94403"
+ sodipodi:cx="297"
+ id="path2993"
+ style="color:#000000;fill:#ff1333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.17449450000000022;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.84031947,0,0,0.84031947,48.729821,134.14847)"
+ d="m 370,422.94403 c 0,40.31679 -32.68321,73 -73,73 -40.31679,0 -73,-32.68321 -73,-73 0,-40.31679 32.68321,-73 73,-73 40.31679,0 73,32.68321 73,73 z"
+ sodipodi:ry="73"
+ sodipodi:rx="73"
+ sodipodi:cy="422.94403"
+ sodipodi:cx="297"
+ id="path4863"
+ style="color:#000000;fill:#db001e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.38004708;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ transform="matrix(0.75568304,0,0,0.75568304,74.628784,166.46039)"
+ d="m 370,422.94403 c 0,40.31679 -32.68321,73 -73,73 -40.31679,0 -73,-32.68321 -73,-73 0,-40.31679 32.68321,-73 73,-73 40.31679,0 73,32.68321 73,73 z"
+ sodipodi:ry="73"
+ sodipodi:rx="73"
+ sodipodi:cy="422.94403"
+ sodipodi:cx="297"
+ id="path4861"
+ style="color:#000000;fill:#ba1128;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.64661217;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#db001e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.00033593;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4865"
+ sodipodi:cx="297"
+ sodipodi:cy="422.94403"
+ sodipodi:rx="73"
+ sodipodi:ry="73"
+ d="m 370,422.94403 c 0,40.31679 -32.68321,73 -73,73 -40.31679,0 -73,-32.68321 -73,-73 0,-40.31679 32.68321,-73 73,-73 40.31679,0 73,32.68321 73,73 z"
+ transform="matrix(0.66659203,0,0,0.66659203,102.27796,201.54903)" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#ff1333;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:4.33197927;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4859"
+ sodipodi:cx="297"
+ sodipodi:cy="422.94403"
+ sodipodi:rx="73"
+ sodipodi:ry="73"
+ d="m 370,422.94403 c 0,40.31679 -32.68321,73 -73,73 -40.31679,0 -73,-32.68321 -73,-73 0,-40.31679 32.68321,-73 73,-73 40.31679,0 73,32.68321 73,73 z"
+ transform="matrix(0.46168275,0,0,0.46168275,167.0382,279.00707)" />
+ <path
+ style="color:#000000;fill:#db001e;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.1744945;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 306.5,356.94403 c 0,0 -2.73266,4.32937 -2.20392,6.58181 1.53,6.51778 7.72953,11.28629 14.18584,14.21842 10.56187,4.79667 15.53801,1.93885 17.83576,1.25408 2.29775,-0.68477 5.05732,-6.05431 5.05732,-6.05431 z"
+ id="path4867"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.91975398,0,0,0.91975398,22.211138,104.12914)"
+ sodipodi:nodetypes="caszcc" />
+ <path
+ sodipodi:nodetypes="caszcc"
+ transform="matrix(0.85354994,0,0,0.85354994,43.51081,128.58694)"
+ inkscape:connector-curvature="0"
+ id="path2992"
+ d="m 305.28774,355.86647 c 0,0 -1.16087,2.07446 -0.8691,3.11082 2.03786,7.23833 10.05772,12.43679 16.51403,15.36892 10.56187,4.79667 16.72498,2.68395 19.02273,1.99918 2.29775,-0.68477 2.49716,-3.53606 2.49716,-3.53606 z"
+ style="color:#000000;fill:#ba1128;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.34315515;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#4e0202;stroke-width:2.17449450000000022;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path4596"
+ sodipodi:cx="297"
+ sodipodi:cy="422.94403"
+ sodipodi:rx="73"
+ sodipodi:ry="73"
+ d="m 370,422.94403 c 0,40.31679 -32.68321,73 -73,73 -40.31679,0 -73,-32.68321 -73,-73 0,-40.31679 32.68321,-73 73,-73 40.31679,0 73,32.68321 73,73 z"
+ transform="matrix(0.91975398,0,0,0.91975398,22.211138,104.12914)" />
+ <path
+ sodipodi:type="arc"
+ style="opacity:0.07999998;color:#000000;fill:url(#Polkadots-med);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.1744945;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter5306);enable-background:accumulate"
+ id="path3782"
+ sodipodi:cx="297"
+ sodipodi:cy="422.94403"
+ sodipodi:rx="73"
+ sodipodi:ry="73"
+ d="m 370,422.94403 a 73,73 0 1 1 -146,0 73,73 0 1 1 146,0 z"
+ transform="matrix(0.91975398,0,0,0.91975398,22.211138,104.12914)" />
+ <path
+ style="color:#000000;fill:#d6cda8;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.17449450000000022;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 313.53125,348.15625 -7.0625,13.21875 c -1.57064,3.36111 4.47808,9.50282 13.5,13.71875 8.91328,4.16516 17.40727,4.91175 19.125,1.6875 l 7.0625,-13.25 c -1.71773,3.22425 -10.21172,2.50891 -19.125,-1.65625 -9.02192,-4.21593 -15.07064,-10.35764 -13.5,-13.71875 z"
+ transform="matrix(0.91975397,0,0,0.91975397,23.590775,99.530366)"
+ id="path4835"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#e9ddaf;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2.17449450000000022;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3763"
+ sodipodi:cx="330.57242"
+ sodipodi:cy="326.79236"
+ sodipodi:rx="18.031223"
+ sodipodi:ry="6.7175145"
+ d="m 348.60364,326.79236 c 0,3.70998 -8.07285,6.71751 -18.03122,6.71751 -9.95837,0 -18.03123,-3.00753 -18.03123,-6.71751 0,-3.70998 8.07286,-6.71752 18.03123,-6.71752 9.95837,0 18.03122,3.00754 18.03122,6.71752 z"
+ transform="matrix(0.83326358,0.38938306,-0.38938306,0.83326358,178.77915,25.740395)" />
+ <path
+ style="color:#000000;fill:#cdbd83;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 113.25 22.625 L 116.78125 25.96875 L 130 30.875 C 129.98824 30.177813 129.74247 29.40851 129.28125 28.59375 L 113.25 22.625 z M 103.6875 25.25 C 104.97035 26.350122 106.52355 27.460563 108.25 28.5 L 120.5 30 L 117.25 26.9375 L 103.6875 25.25 z "
+ transform="translate(212.23005,401.7896)"
+ id="path4531" />
+ <path
+ style="fill:#f6f1de;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="M 104.8125 16 C 102.21698 15.965977 100.35076 16.616266 99.71875 17.96875 C 98.861017 19.804264 100.50076 22.517173 103.6875 25.25 L 117.875 27 L 113.25 22.625 L 129.28125 28.59375 C 127.60613 25.634583 123.16214 22.079323 117.375 19.375 C 112.7074 17.193838 108.14959 16.043744 104.8125 16 z "
+ transform="translate(212.23005,401.7896)"
+ id="path4526" />
+ <path
+ style="fill:#eae5d2;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 122.15625 33.75 L 115.8125 45.9375 C 117.16213 46.126689 118.40845 46.150605 119.46875 46.0625 L 125.84375 33.90625 C 124.77101 33.985804 123.51411 33.946798 122.15625 33.75 z "
+ transform="translate(212.23005,401.7896)"
+ id="path4562" />
+ <path
+ style="fill:#b4aa88;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 100.53125 21.8125 L 94.03125 33.96875 C 95.891195 36.830268 100.16907 40.18585 105.65625 42.75 C 106.74463 43.258598 107.8139 43.697179 108.875 44.09375 L 114.65625 31.65625 C 113.82719 31.329725 112.99985 30.956714 112.15625 30.5625 C 106.66907 27.99835 102.39119 24.674018 100.53125 21.8125 z "
+ transform="translate(212.23005,401.7896)"
+ id="path4557" />
+ <path
+ style="fill:#eae5d2;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="M 101.8125 23.46875 L 95.3125 35.59375 C 97.079312 37.539404 99.776333 39.59705 103.0625 41.40625 L 109.4375 29.1875 C 106.21619 27.400212 103.55754 25.385175 101.8125 23.46875 z "
+ transform="translate(212.23005,401.7896)"
+ id="path4547" />
+ <g
+ id="g4549"
+ style="color:#000000;fill:#d6cda8;fill-opacity:1;fill-rule:nonzero;stroke:#2a2626;stroke-width:2.1744945;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.83326358,0.38938306,-0.38938306,0.83326358,178.77915,25.740395)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path4590"
+ transform="matrix(0.91975397,0,0,0.91975397,23.590775,99.530366)"
+ d="m 313.53125,348.15625 -7.0625,13.21875 c -1.57064,3.36111 4.47808,9.50282 13.5,13.71875 8.91328,4.16516 17.40727,4.91175 19.125,1.6875 l 7.0625,-13.25 c -1.71773,3.22425 -10.21172,2.50891 -19.125,-1.65625 -9.02192,-4.21593 -15.07064,-10.35764 -13.5,-13.71875 z"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2a2626;stroke-width:2.17449450000000022;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ transform="matrix(0.83326358,0.38938306,-0.38938306,0.83326358,178.77915,25.740395)"
+ d="m 348.60364,326.79236 c 0,3.70998 -8.07285,6.71751 -18.03122,6.71751 -9.95837,0 -18.03123,-3.00753 -18.03123,-6.71751 0,-3.70998 8.07286,-6.71752 18.03123,-6.71752 9.95837,0 18.03122,3.00754 18.03122,6.71752 z"
+ sodipodi:ry="6.7175145"
+ sodipodi:rx="18.031223"
+ sodipodi:cy="326.79236"
+ sodipodi:cx="330.57242"
+ id="path4539"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#3f3939;stroke-width:2.17449450000000022;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ </g>
+</svg>
Binary file share/hedgewars/Data/Themes/Christmas/Border.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/CMakeLists.txt Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,6 @@
+file(GLOB images *.png)
+
+install(FILES
+ theme.cfg
+ ${images}
+ DESTINATION ${SHAREPATH}Data/Themes/Christmas)
Binary file share/hedgewars/Data/Themes/Christmas/CandyCane.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/CandyCane.svg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,108 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ width="170"
+ height="110"
+ sodipodi:docname="CandyCane.svg"
+ inkscape:export-filename="/mnt/y/src/hedgewars/share/hedgewars/Data/Themes/Snow/CandyCane.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="948"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="-11.109747"
+ inkscape:cy="170.919"
+ inkscape:window-x="-4"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="svg2" />
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <path
+ transform="matrix(0.99996682,-0.00814622,0.00814622,0.99996682,-3.3250037,2.002064)"
+ style="fill:#ffe1e1;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+ d="M 98.945902,20.95956 C 119.53592,6.7381361 133.54015,-2.6399103 159.17362,19.150707 184.80709,40.941324 161.17973,70.957752 133.32243,98.7382 123.66781,108.36618 110.58735,93.615078 118.05668,85.309841 144.29781,56.13203 154.61929,44.026158 144.31113,35.263349 134.00297,26.500539 127.886,25.729792 110.52359,37.721927 93.161179,49.714062 18.617925,101.20072 -0.60318179,114.47664 -10.678193,121.4354 -22.3913,104.76657 -12.180867,97.714276 7.3379658,84.232713 78.355886,35.180983 98.945902,20.95956 z"
+ id="path2983"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="zzsszzssz" />
+ <path
+ style="fill:#e3d5d5;fill-opacity:1;stroke:none"
+ d="M 127.15625 21.375 C 126.89507 21.371633 126.64149 21.392663 126.375 21.40625 C 122.11109 21.623643 116.52003 24.230901 108 30.21875 L -2.5 107.84375 C -5.4843107 109.94111 -8.8395619 110.36152 -11.75 109.53125 C -14.398774 108.77563 -16.660875 107.09061 -18.34375 104.96875 C -20.174482 112.63703 -11.009819 122.09802 -3 116.46875 L 107.5 38.8125 C 124.76414 26.679325 130.90205 27.415203 141.28125 36.09375 C 141.50532 36.281108 141.70133 36.465481 141.90625 36.65625 C 142.3059 35.343614 142.47152 34.195063 142.4375 33.1875 C 142.36279 30.975088 141.46413 29.247347 139.1875 27.34375 C 134.44886 23.381548 131.07393 21.425499 127.15625 21.375 z M 167.15625 40.96875 C 166.51749 43.247034 165.70191 45.548915 164.6875 47.84375 C 158.38922 62.091976 145.46614 76.751128 131.59375 90.8125 C 128.84251 93.601215 125.53429 94.798363 122.46875 94.625 C 119.40321 94.451637 116.65888 92.991481 114.5625 90.9375 C 114.19935 90.581695 113.85527 90.203771 113.53125 89.8125 C 111.3404 98.069719 122.46535 108.11711 130.8125 99.65625 C 150.27388 79.929757 167.61527 59.095736 167.15625 40.96875 z "
+ id="path3769" />
+ <path
+ style="fill:#ec0000;stroke:none;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;fill-opacity:1"
+ d="M 126.4375 7.28125 C 125.77508 7.3061172 125.09316 7.3861625 124.40625 7.46875 C 124.23779 7.4924953 124.07426 7.5045298 123.90625 7.53125 C 121.66503 7.8877012 119.44577 8.4763869 117.25 9.3125 C 117.17593 9.3407065 117.10531 9.377552 117.03125 9.40625 C 116.67437 9.5511789 116.33284 9.7130739 115.96875 9.875 C 115.76066 9.9622204 115.55186 10.034087 115.34375 10.125 C 114.26835 10.626305 113.17338 11.216397 112.03125 11.875 C 115.37822 11.722262 121.68172 14.274721 125.4375 18.21875 C 129.19327 22.162779 129.41762 26.616298 131.78125 29.0625 L 135.65625 32.03125 C 137.44334 33.075966 139.2895 34.428355 141.28125 36.09375 C 141.76155 36.495349 142.16996 36.894508 142.5625 37.3125 L 144.28125 38.625 C 144.37775 35.224613 147.11426 31.736865 147.875 26.34375 C 148.6129 21.112553 147.28823 15.062813 145.34375 12.28125 C 144.99653 12.082207 144.6555 11.873915 144.3125 11.6875 C 138.63668 9.5404183 133.13081 7.0299849 126.4375 7.28125 z M 99.6875 19.78125 C 99.504725 19.783867 99.330423 19.799948 99.15625 19.8125 C 98.051563 20.580231 96.923489 21.353489 95.78125 22.15625 L 79.625 33.5 C 82.841408 33.534041 87.146995 35.010054 91.40625 36.6875 C 96.474123 38.68341 101.57156 40.775809 104.96875 40.59375 L 107.5 38.8125 C 113.62698 34.506479 118.33499 31.818161 122.34375 30.53125 L 123.78125 29.71875 C 120.44478 29.054732 116.81325 25.83336 111.9375 23.40625 C 107.67123 21.282528 102.99694 19.733858 99.6875 19.78125 z M 159.25 23.5 C 160.2092 26.710361 159.31671 34.348988 155.71875 38.4375 C 152.12081 42.526011 147.57205 43.019406 145.3125 45.5625 L 145.03125 46.0625 C 144.24967 50.035101 141.45105 54.846446 136.90625 60.90625 L 136.03125 62.53125 C 139.19664 61.285012 144.37059 61.912819 149.8125 61.6875 C 155.23098 61.463151 161.09876 59.530558 163.5 57.1875 C 163.50554 57.174855 163.52572 57.168894 163.53125 57.15625 C 167.07134 49.061197 168.26196 41.225399 166 33.96875 C 165.983 33.914211 165.95489 33.866976 165.9375 33.8125 C 164.49503 30.071697 162.16338 26.666787 159.25 23.5 z M 67.59375 41.96875 L 47.28125 56.25 C 50.534875 56.042868 55.06938 57.551766 59.65625 59.15625 C 64.797547 60.954672 69.987381 62.844562 73.375 62.53125 L 93.15625 48.59375 C 89.763264 48.842365 84.637305 46.833691 79.53125 44.9375 C 75.19919 43.328739 70.823343 41.92093 67.59375 41.96875 z M 35.75 64.78125 C 35.497007 64.792918 35.268515 64.811478 35.03125 64.84375 L 18.78125 76.28125 L 14.75 79.1875 C 14.954812 79.143772 15.1882 79.087814 15.40625 79.0625 L 15.5 79.0625 C 18.766753 78.723984 23.438947 80.346069 28.21875 82 C 33.030446 83.664966 37.87323 85.418378 41.25 85.375 C 41.259798 85.374874 41.271477 85.375156 41.28125 85.375 L 61.65625 71.03125 C 58.268217 71.330482 53.100833 69.432077 47.96875 67.65625 C 43.464803 66.097773 38.989544 64.631841 35.75 64.78125 z M 154.71875 72.1875 C 151.72111 73.663064 146.39271 73.801982 141.25 73.34375 C 135.82485 72.860352 130.46009 72.060652 127.21875 73.09375 L 123.375 77.3125 C 120.89955 80.151512 118.30255 83.105396 115.4375 86.34375 C 114.28103 87.650908 113.61795 89.128126 113.375 90.625 C 116.5715 90.410455 120.79203 91.011862 124.96875 91.5625 C 130.21774 92.254502 135.48061 92.79858 138.5625 91.53125 C 139.20961 90.836889 139.86384 90.133098 140.5 89.4375 L 152.75 74.875 C 153.42308 73.979915 154.08162 73.080343 154.71875 72.1875 z M 4.3125 87.4375 C 3.8494863 87.453321 3.409625 87.506294 3 87.59375 L -14.03125 99.34375 L -14.71875 99.8125 C -15.367219 100.26824 -15.931084 100.75712 -16.40625 101.28125 C -13.1208 100.91711 -8.3437597 102.60616 -3.53125 104.40625 C 1.0049669 106.10299 5.5660666 107.88941 8.90625 108.09375 L 29.09375 93.90625 C 25.735233 93.792011 21.072403 92.112257 16.5 90.46875 C 12.014967 88.856646 7.5535959 87.326753 4.3125 87.4375 z "
+ id="path4757" />
+ <path
+ style="fill:#c00808;fill-opacity:1;stroke:none"
+ d="M 127.78125 21.40625 C 129.45749 24.37264 130.04456 27.265136 131.78125 29.0625 L 135.625 32 L 135.65625 32.03125 C 135.69779 32.055539 135.73966 32.069108 135.78125 32.09375 C 136.18946 32.335109 136.58442 32.601554 137 32.875 C 137.46083 33.180428 137.9341 33.497936 138.40625 33.84375 C 138.7306 34.081311 139.0439 34.306332 139.375 34.5625 C 140.00168 35.042727 140.62615 35.545992 141.28125 36.09375 C 141.4981 36.275064 141.71356 36.442723 141.90625 36.625 C 142.29937 35.32475 142.47126 34.187445 142.4375 33.1875 C 142.36279 30.975088 141.46413 29.247347 139.1875 27.34375 C 134.70614 23.596672 131.4358 21.649973 127.78125 21.40625 z M 115.5 25.40625 C 113.27406 26.679653 110.80289 28.248888 108 30.21875 L 96.1875 38.53125 C 99.538193 39.771221 102.65134 40.717943 104.96875 40.59375 L 107.5 38.8125 C 108.5915 38.045395 109.61949 37.353148 110.625 36.6875 C 111.05536 36.402716 111.42792 36.141554 111.84375 35.875 C 112.17269 35.663594 112.49239 35.481363 112.8125 35.28125 C 113.14193 35.075809 113.46076 34.849843 113.78125 34.65625 C 114.55908 34.184889 115.30307 33.777564 116.03125 33.375 C 116.14888 33.31016 116.25859 33.250573 116.375 33.1875 C 117.13957 32.772038 117.87849 32.402492 118.59375 32.0625 C 119.35336 31.701425 120.10171 31.371748 120.8125 31.09375 C 120.84425 31.081332 120.87459 31.074754 120.90625 31.0625 C 121.34117 30.894177 121.73771 30.731594 122.15625 30.59375 C 122.21726 30.573626 122.28307 30.550731 122.34375 30.53125 L 123.78125 29.71875 C 121.31489 29.2279 118.67222 27.338131 115.5 25.40625 z M 167.15625 40.96875 C 166.51749 43.247034 165.70191 45.548915 164.6875 47.84375 C 162.86979 51.95584 160.47236 56.093704 157.6875 60.25 C 160.15194 59.44919 162.24854 58.393617 163.46875 57.21875 C 163.47427 57.206164 163.49449 57.200085 163.5 57.1875 C 163.55421 57.063749 163.60313 56.936119 163.65625 56.8125 C 163.82307 56.424252 164.00034 56.043151 164.15625 55.65625 C 164.24289 55.440815 164.32308 55.21503 164.40625 55 C 164.52169 54.702276 164.64126 54.421871 164.75 54.125 C 164.86052 53.822854 164.95909 53.52003 165.0625 53.21875 C 165.26807 52.620976 165.44797 52.031501 165.625 51.4375 C 165.65621 51.332766 165.68844 51.229612 165.71875 51.125 C 166.03639 50.025998 166.31699 48.960176 166.53125 47.875 C 166.60874 47.487273 166.68621 47.104535 166.75 46.71875 C 166.76354 46.635725 166.76835 46.551684 166.78125 46.46875 C 166.84415 46.064281 166.89005 45.652258 166.9375 45.25 C 166.97353 44.944576 167.00429 44.647854 167.03125 44.34375 C 167.06725 43.945329 167.10487 43.552325 167.125 43.15625 C 167.1609 42.426154 167.17559 41.69046 167.15625 40.96875 z M 84.46875 46.75 L 64.46875 60.8125 C 67.887445 61.92869 71.053442 62.745965 73.375 62.53125 L 93.15625 48.59375 C 90.870721 48.761218 87.791172 47.906684 84.46875 46.75 z M 52.5 69.21875 L 32.28125 83.40625 C 35.65283 84.525556 38.832092 85.40606 41.25 85.375 L 61.65625 71.03125 C 59.278274 71.241273 56.003653 70.371718 52.5 69.21875 z M 154.6875 72.1875 C 152.9376 73.04096 150.38856 73.434453 147.5625 73.53125 C 142.64135 79.341922 137.19939 85.13049 131.59375 90.8125 C 131.10313 91.309804 130.58401 91.727668 130.0625 92.125 C 133.43046 92.403018 136.49498 92.381454 138.5625 91.53125 C 139.20961 90.836889 139.86384 90.133098 140.5 89.4375 L 152.59375 75.03125 C 152.63772 74.972938 152.70618 74.933304 152.75 74.875 C 153.11115 74.394734 153.46079 73.918617 153.8125 73.4375 C 153.94238 73.259946 154.05905 73.083713 154.1875 72.90625 C 154.36044 72.667319 154.5172 72.426253 154.6875 72.1875 z M 113.5625 89.84375 C 113.49685 90.092782 113.41666 90.342848 113.375 90.59375 C 113.37336 90.603654 113.37661 90.615094 113.375 90.625 C 113.65477 90.606222 113.95526 90.600608 114.25 90.59375 C 114.0157 90.348111 113.77929 90.104078 113.5625 89.84375 z M 20.3125 91.8125 L 0.34375 105.84375 C 3.5083706 106.98909 6.5292597 107.94833 8.90625 108.09375 L 29.09375 93.90625 C 26.670262 93.823816 23.570246 92.923422 20.3125 91.8125 z "
+ id="path3775" />
+ <path
+ sodipodi:nodetypes="zzsszzssz"
+ inkscape:connector-curvature="0"
+ id="path4760"
+ d="M 98.945902,20.95956 C 119.53592,6.7381361 133.54015,-2.6399103 159.17362,19.150707 184.80709,40.941324 161.17973,70.957752 133.32243,98.7382 123.66781,108.36618 110.58735,93.615078 118.05668,85.309841 144.29781,56.13203 154.61929,44.026158 144.31113,35.263349 134.00297,26.500539 127.886,25.729792 110.52359,37.721927 93.161179,49.714062 18.617925,101.20072 -0.60318179,114.47664 -10.678193,121.4354 -22.3913,104.76657 -12.180867,97.714276 7.3379658,84.232713 78.355886,35.180983 98.945902,20.95956 z"
+ style="fill:none;stroke:#282828;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ transform="matrix(0.99996682,-0.00814622,0.00814622,0.99996682,-3.3250037,2.002064)" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-1.6879333"
+ inkscape:original="M 129.90625 31.625 C 124.71475 31.54936 118.67158 34.366751 109.5 40.8125 L -1 118.46875 C -6.1179987 122.06566 -11.697927 119.50977 -14.59375 115.1875 C -14.464848 122.30188 -6.2525489 129.56581 1 124.46875 L 111.5 46.8125 C 128.76414 34.679325 134.90205 35.415203 145.28125 44.09375 C 146.05938 44.744384 146.70142 45.397879 147.25 46.09375 C 147.3334 43.002232 146.06139 40.41836 143.28125 38.09375 C 138.416 34.025681 134.48699 31.691737 129.90625 31.625 z M 168.6875 38.625 C 172.42046 57.72355 153.85284 80.329288 132.8125 101.65625 C 127.30526 107.23851 120.57767 104.76212 117.28125 100.0625 C 117.34975 107.71802 127.21785 115.35436 134.8125 107.65625 C 158.10113 84.050373 178.34756 58.874813 168.6875 38.625 z "
+ style="fill:#c8b7b7;stroke:none;fill-opacity:1"
+ id="path4769"
+ d="m 129.875,33.3125 c -4.56193,-0.06647 -10.33074,2.496767 -19.40625,8.875 l -110.5,77.65625 c -2.948982,2.07253 -6.2553688,2.4266 -9.09375,1.5625 -0.6845797,-0.20841 -1.246396,-0.64032 -1.875,-0.96875 0.702251,1.00118 1.5293709,1.91916 2.5,2.59375 2.5265643,1.75596 5.4588091,2.2218 8.53125,0.0625 l 110.5,-77.65625 c 8.7222,-6.129928 14.77896,-9.192335 20.34375,-9.46875 4.23039,-0.210133 7.93215,1.291258 11.78125,3.96875 -0.19773,-0.184195 -0.24668,-0.376815 -0.46875,-0.5625 -4.76591,-3.985006 -8.29087,-6.003909 -12.3125,-6.0625 z m 39.21875,21.09375 c -1.6176,5.212654 -4.25059,10.504627 -7.625,15.8125 -6.92259,10.889077 -16.91352,21.925978 -27.46875,32.625 -3.08259,3.12458 -6.79717,4.13405 -10.09375,3.53125 -1.0162,-0.18582 -1.96036,-0.56141 -2.875,-1 0.84044,1.10698 1.82126,2.12604 3,2.78125 2.88914,1.60595 6.24909,1.70272 9.59375,-1.6875 11.60537,-11.763465 22.40485,-23.903213 29.03125,-35.4375 3.3132,-5.767143 5.57087,-11.327652 6.4375,-16.625 z"
+ transform="translate(-3.6,-8.4)" />
+ <path
+ style="fill:#800000;stroke:none"
+ d="M 129.65625 25.46875 C 130.02244 26.3205 130.40956 27.107951 130.84375 27.8125 C 133.66335 28.338331 136.33539 29.634229 139.0625 31.53125 C 138.86477 31.347055 138.81582 31.154435 138.59375 30.96875 C 135.19768 28.12913 132.42081 26.31383 129.65625 25.46875 z M 118.09375 27 C 114.97782 28.432203 111.34362 30.640718 106.875 33.78125 L 98.8125 39.46875 C 100.01443 39.855138 101.15731 40.142495 102.21875 40.34375 L 106.9375 37.03125 C 112.69653 32.983824 117.28313 30.297579 121.34375 28.84375 C 120.3175 28.352511 119.23129 27.706582 118.09375 27 z M 165.5 46 C 164.09681 50.521727 161.90872 55.119048 159.15625 59.71875 C 159.82398 59.454223 160.48856 59.175495 161.0625 58.875 C 163.27848 54.441035 164.82278 50.139544 165.5 46 z M 87.1875 47.625 L 67.25 61.625 C 68.520186 61.976796 69.706554 62.253557 70.8125 62.40625 L 90.6875 48.4375 C 89.601412 48.270328 88.432599 47.994943 87.1875 47.625 z M 55.25 70.0625 L 35.03125 84.28125 C 36.257916 84.639339 37.438034 84.896362 38.53125 85.09375 L 58.78125 70.875 C 57.68552 70.701052 56.495265 70.416951 55.25 70.0625 z M 152.0625 73.0625 C 151.25196 73.235192 150.36653 73.352995 149.4375 73.4375 C 144.35717 79.760359 138.5543 86.068715 132.5 92.28125 C 133.66586 92.315912 134.74714 92.264396 135.75 92.15625 C 141.77286 85.801577 147.40517 79.388122 152.125 73.0625 C 152.10471 73.066903 152.08288 73.058157 152.0625 73.0625 z M 23.0625 92.6875 L 3 106.78125 C 4.1749713 107.1624 5.3153737 107.45257 6.375 107.6875 L 26.46875 93.59375 C 25.39473 93.381549 24.254552 93.045495 23.0625 92.6875 z "
+ id="path4771" />
+ <path
+ transform="translate(0,0.70710678)"
+ style="fill:#ffffff;stroke:none"
+ d="m 127.4375,8.40625 c -10.17898,0.3210867 -19.4565,6.659236 -30.96875,14.75 l -110.5,77.65625 c -1.984905,1.39498 -2.892619,3.11207 -3.1875,4.9375 0.416466,-0.40494 0.802477,-0.82906 1.3125,-1.1875 l 110.5,-77.65625 c 10.23987,-7.196544 18.93629,-13.304708 28.59375,-14.84375 9.65746,-1.539042 20.03846,1.677599 33.09375,12.59375 4.34574,3.633679 7.28852,7.581177 9.15625,11.71875 C 164.25746,30.841687 161.04839,25.655689 155.21875,20.78125 144.05869,11.449788 135.35594,8.1564696 127.4375,8.40625 z"
+ id="path2988"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="scccccsscss" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="0.3365728"
+ inkscape:original="M 143 55.875 C 138.06107 63.553841 129.67596 73.16956 117.9375 86.4375 C 116.98855 87.510098 116.454 88.674088 116.21875 89.875 C 126.21581 78.570107 133.88232 69.794646 138.75 62.9375 C 140.63507 60.28198 141.95698 57.987468 143 55.875 z "
+ style="fill:#ffffff;stroke:none"
+ id="path3765"
+ d="m 142.9375,55.53125 a 0.33660645,0.33660645 0 0 0 -0.21875,0.15625 c -4.91433,7.640588 -13.29356,17.264178 -25.03125,30.53125 -0.98746,1.116124 -1.56665,2.33871 -1.8125,3.59375 a 0.33660645,0.33660645 0 0 0 0.125,0.3125 0.33660645,0.33660645 0 0 0 0.40625,0.03125 0.33660645,0.33660645 0 0 0 0.0625,-0.0625 c 9.99775,-11.305675 17.67672,-20.086107 22.5625,-26.96875 1.89505,-2.66958 3.23108,-4.966809 4.28125,-7.09375 a 0.33660645,0.33660645 0 0 0 -0.0313,-0.34375 0.33660645,0.33660645 0 0 0 -0.34375,-0.15625 z"
+ transform="translate(0,0.707107)" />
+</svg>
Binary file share/hedgewars/Data/Themes/Christmas/Chunk.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Dust.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Flake.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Girder.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/Girder.svg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,347 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ width="116"
+ height="18"
+ sodipodi:docname="Girder.svg"
+ inkscape:export-filename="/mnt/y/src/hedgewars/share/hedgewars/Data/Themes/Christmas/Girder.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ enable-background="new">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6">
+ <linearGradient
+ id="linearGradient3957">
+ <stop
+ style="stop-color:#ff53f4;stop-opacity:1;"
+ offset="0"
+ id="stop3959" />
+ <stop
+ style="stop-color:#ff53f4;stop-opacity:0;"
+ offset="1"
+ id="stop3961" />
+ </linearGradient>
+ <filter
+ inkscape:collect="always"
+ id="filter3950">
+ <feBlend
+ inkscape:collect="always"
+ mode="lighten"
+ in2="BackgroundImage"
+ id="feBlend3952" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter3987">
+ <feBlend
+ inkscape:collect="always"
+ mode="darken"
+ in2="BackgroundImage"
+ id="feBlend3989" />
+ </filter>
+ <filter
+ inkscape:collect="always"
+ id="filter4004">
+ <feGaussianBlur
+ inkscape:collect="always"
+ stdDeviation="0.15522888"
+ id="feGaussianBlur4006" />
+ </filter>
+ </defs>
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1183"
+ inkscape:window-height="723"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="5.6568542"
+ inkscape:cx="53.483092"
+ inkscape:cy="23.722394"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg2" />
+ <path
+ sodipodi:type="inkscape:offset"
+ inkscape:radius="-0.60285324"
+ inkscape:original="M 11.6875 1.28125 C 9.8292093 1.3283952 7.9075827 1.5006408 6.15625 1.71875 C 2.6535845 2.1549684 -0.15625 2.75 -0.15625 2.75 A 1.5016267 1.5016267 0 1 0 0.46875 5.6875 C 0.46875 5.6875 3.1651154 5.106715 6.53125 4.6875 C 9.8973846 4.268285 13.978797 4.06676 16.21875 4.59375 C 17.211114 4.8272219 18.219801 5.5425736 19.375 6.4375 C 20.530199 7.3324264 21.809306 8.3996966 23.5625 8.90625 C 26.760949 9.8303834 30.101058 9.6729653 33.15625 9.28125 C 36.011172 8.9152119 38.508054 7.6321791 40.84375 6.59375 C 43.179446 5.5553209 45.298132 4.7562047 47.375 4.9375 C 47.824354 4.976725 48.400525 5.2899756 49.15625 5.8125 C 49.911975 6.3350244 50.809635 7.0506058 52.09375 7.375 C 55.351539 8.1979851 59.301604 9.0750475 62.9375 7.625 C 69.967805 4.8212139 74.688017 4.8982248 81.8125 5.875 C 86.959909 6.5807159 92.594301 8.8955375 98.53125 7.875 C 99.593497 7.6924039 100.30909 7.1224668 100.84375 6.75 C 101.37841 6.3775332 101.72551 6.2150259 101.90625 6.1875 C 102.55157 6.089219 103.41814 6.3253362 104.53125 6.6875 C 105.64436 7.0496638 107.01406 7.5223582 108.59375 7.25 C 109.54 7.0868551 110.4981 7.205444 111.90625 6.84375 C 113.37413 6.4667134 116.65625 5.65625 116.65625 5.65625 A 1.50015 1.50015 0 1 0 115.96875 2.75 C 115.96875 2.75 112.68631 3.5444944 111.15625 3.9375 C 110.28342 4.1616909 109.46828 4.0442633 108.09375 4.28125 C 107.45865 4.3907501 106.57388 4.1720669 105.46875 3.8125 C 104.36362 3.4529331 103.04528 2.9786485 101.46875 3.21875 C 100.39506 3.3822699 99.666492 3.9352728 99.125 4.3125 C 98.583508 4.6897272 98.219551 4.8738819 98.03125 4.90625 C 93.209861 5.7350273 87.886297 3.6832775 82.21875 2.90625 C 74.916551 1.9051098 69.309659 1.8537757 61.8125 4.84375 C 59.311962 5.8410003 55.991183 5.2638571 52.84375 4.46875 C 52.338424 4.3410943 51.688457 3.9061916 50.875 3.34375 C 50.061543 2.7813084 49.04556 2.0900266 47.65625 1.96875 C 44.692486 1.7100351 42.048327 2.7663609 39.625 3.84375 C 37.201673 4.9211391 34.945046 6.0350732 32.78125 6.3125 C 29.897332 6.6822557 26.960229 6.7691756 24.40625 6.03125 C 23.405382 5.7420673 22.391716 4.9711909 21.21875 4.0625 C 20.045784 3.1538091 18.704412 2.1105504 16.90625 1.6875 C 15.35895 1.3234692 13.545791 1.2341048 11.6875 1.28125 z "
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#002b11;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans"
+ id="path3937"
+ d="m 11.6875,1.875 c -1.8316079,0.046468 -3.7324579,0.2212639 -5.46875,0.4375 -3.4751844,0.4327959 -6.25,1.03125 -6.25,1.03125 -0.03368056,0.00717 0.0020384,-0.00881 -0.03125,0 -0.03328837,0.00881 -0.02968402,0.020817 -0.0625,0.03125 -0.032816,0.010433 0.001015,-0.01203 -0.03125,0 -0.0322645,0.01203 3.8537e-4,0.017651 -0.03125,0.03125 -0.0316354,0.013599 -0.03157,-0.015135 -0.0625,0 -0.03093,0.015135 -0.0011,0.014616 -0.03125,0.03125 -0.0301501,0.016634 -0.001952,0.013156 -0.03125,0.03125 -0.0292976,0.018094 -0.002876,-0.01951 -0.03125,0 -0.0283744,0.01951 -0.003867,0.010372 -0.03125,0.03125 -0.027383,0.020878 -0.0361745,0.00905 -0.0625,0.03125 -0.0263255,0.022197 -0.006045,0.00779 -0.03125,0.03125 -0.0252047,0.023462 -0.007227,0.00658 -0.03125,0.03125 -0.0240231,0.02467 -0.008466,0.00543 -0.03125,0.03125 -0.0227837,0.025819 0.0214893,0.00434 0,0.03125 -0.0214893,0.026906 -0.0111068,0.00332 -0.03125,0.03125 -0.0201432,0.027928 -0.0125014,0.00237 -0.03125,0.03125 -0.0187486,0.028883 -0.0139412,0.032732 -0.03125,0.0625 -0.0173088,0.029768 -0.0154227,6.685e-4 -0.03125,0.03125 -0.0158273,0.030581 0.0143076,-7.13e-5 0,0.03125 -0.0143076,0.031321 -0.0184965,-7.356e-4 -0.03125,0.03125 -0.0127535,0.031986 0.0111687,0.029927 0,0.0625 -0.0111687,0.032573 -0.021693,-0.00183 -0.03125,0.03125 -0.009557,0.033082 0.007922,-0.00226 0,0.03125 -0.007922,0.033511 0.006268,0.028641 0,0.0625 -0.006268,0.033859 -0.0266505,-0.00288 -0.03125,0.03125 -0.004599,0.034126 0.002919,0.028189 0,0.0625 -0.002919,0.034311 0.001232,-0.00316 0,0.03125 -0.001232,0.034412 -4.5763e-4,-0.00318 0,0.03125 4.5763e-4,0.034431 -0.002147,0.028132 0,0.0625 0.002147,0.034368 -0.00383,-0.00297 0,0.03125 0.00383,0.034221 0.0257452,0.028508 0.03125,0.0625 0.005505,0.033992 -0.007166,-0.00243 0,0.03125 0.007166,0.033681 -0.00881,-0.00204 0,0.03125 0.00881,0.033288 0.0208172,0.029684 0.03125,0.0625 0.0104328,0.032816 -0.0120305,-0.00101 0,0.03125 0.0120305,0.032265 0.0176509,-3.854e-4 0.03125,0.03125 0.0135991,0.031635 -0.015135,0.03157 0,0.0625 0.015135,0.03093 0.0146155,0.0011 0.03125,0.03125 0.0166345,0.03015 0.0131562,0.00195 0.03125,0.03125 0.0180938,0.029298 -0.0195096,0.00288 0,0.03125 0.0195096,0.028374 0.0103716,0.00387 0.03125,0.03125 0.0208784,0.027383 0.009053,0.036175 0.03125,0.0625 0.0221968,0.026325 0.007788,0.00605 0.03125,0.03125 0.0234618,0.025205 0.00658,0.00723 0.03125,0.03125 0.0246703,0.024023 0.005431,0.00847 0.03125,0.03125 0.0258193,0.022784 0.004344,-0.021489 0.03125,0 0.0269062,0.021489 0.003322,0.011107 0.03125,0.03125 0.0279282,0.020143 0.002367,0.012501 0.03125,0.03125 0.0288829,0.018749 0.0327319,0.013941 0.0625,0.03125 0.0297681,0.017309 6.6846e-4,0.015423 0.03125,0.03125 0.0305815,0.015827 -7.131e-5,-0.014308 0.03125,0 0.0313213,0.014308 -7.3562e-4,0.018497 0.03125,0.03125 0.0319856,0.012753 0.0299271,-0.011169 0.0625,0 0.03257288,0.011169 -0.001832,0.021693 0.03125,0.03125 0.03308167,0.00956 -0.0022608,-0.00792 0.03125,0 0.03351076,0.00792 0.02864088,-0.00627 0.0625,0 0.03385912,0.00627 -0.00287591,0.02665 0.03125,0.03125 0.03412591,0.0046 0.02818951,-0.00292 0.0625,0 0.03431049,0.00292 -0.0031624,-0.00123 0.03125,0 0.0344124,0.00123 -0.003181,4.576e-4 0.03125,0 0.0344314,-4.576e-4 0.0281325,0.00215 0.0625,0 0.0343675,-0.00215 -0.002971,0.00383 0.03125,0 0.0342208,-0.00383 0.0285084,-0.025745 0.0625,-0.03125 0.0339916,-0.0055 -0.002431,0.00717 0.03125,0 0,0 2.7302831,-0.5772254 6.125,-1 C 9.8706757,3.6700776 13.911532,3.4277762 16.34375,4 c 1.170938,0.2754847 2.239695,1.0650258 3.40625,1.96875 1.168322,0.9050931 2.357372,1.8781716 3.96875,2.34375 3.073386,0.8879988 6.354574,0.7622579 9.375,0.375 2.722645,-0.3490784 5.1416,-1.6077269 7.5,-2.65625 2.354447,-1.0467657 4.578609,-1.8852302 6.84375,-1.6875 0.681879,0.059522 1.281582,0.4288066 2.0625,0.96875 0.783817,0.5419475 1.605316,1.179579 2.75,1.46875 3.244206,0.8195538 7.050097,1.6446578 10.46875,0.28125 7.120076,-2.8395881 12.031741,-2.7623132 19.1875,-1.78125 5.264515,0.7217713 10.807068,2.9839637 16.53125,2 C 99.337878,7.1264786 99.93568,6.6431289 100.5,6.25 c 0.56759,-0.3954063 0.89619,-0.5928478 1.3125,-0.65625 0.86682,-0.1320145 1.77891,0.1644564 2.90625,0.53125 1.12151,0.3648959 2.37415,0.7738513 3.78125,0.53125 1.0616,-0.1830322 1.93642,-0.068848 3.25,-0.40625 1.47598,-0.3791182 4.75,-1.1875 4.75,-1.1875 a 0.60291352,0.60291352 0 0 1 0.0625,0 c 0.0362,-0.00496 0.0266,0.00683 0.0625,0 0.0359,-0.00683 -0.004,-0.022557 0.0313,-0.03125 0.0355,-0.00869 0.0275,0.010528 0.0625,0 0.035,-0.010528 -0.003,-0.018916 0.0313,-0.03125 0.0344,-0.012334 0.0288,0.014107 0.0625,0 0.0337,-0.014107 -0.002,-0.015409 0.0313,-0.03125 0.0329,-0.015841 -7.8e-4,0.017533 0.0313,0 0.032,-0.017533 0.0314,-0.012073 0.0625,-0.03125 0.0311,-0.019177 0.001,-0.010481 0.0313,-0.03125 0.03,-0.020769 0.002,-0.00895 0.0313,-0.03125 0.0289,-0.022304 0.004,-0.00747 0.0313,-0.03125 0.0277,-0.023779 0.005,-0.00606 0.0313,-0.03125 0.0264,-0.02519 0.006,-0.00472 0.0313,-0.03125 0.0251,-0.026532 0.008,-0.00345 0.0313,-0.03125 0.0237,-0.027802 0.009,-0.00225 0.0313,-0.03125 0.0222,-0.028997 0.0106,-0.00114 0.0313,-0.03125 0.0207,-0.030113 0.0122,-0.031352 0.0313,-0.0625 0.0191,-0.031148 0.0138,8.48e-4 0.0313,-0.03125 0.0174,-0.032098 -0.0157,0.00171 0,-0.03125 0.0157,-0.032961 0.0173,-0.028766 0.0313,-0.0625 0.014,-0.033734 0.019,0.00317 0.0313,-0.03125 0.0122,-0.034416 -0.0104,0.00375 0,-0.03125 0.0104,-0.035005 -0.009,-0.027001 0,-0.0625 0.009,-0.035499 0.0246,0.00465 0.0313,-0.03125 0.007,-0.035896 -0.005,-0.026304 0,-0.0625 0.005,-0.036196 -0.003,0.00515 0,-0.03125 0.003,-0.036398 -0.001,-0.025999 0,-0.0625 0.001,-0.036501 8.7e-4,0.00525 0,-0.03125 -8.7e-4,-0.036505 0.003,-0.02609 0,-0.0625 -0.003,-0.03641 0.005,0.00497 0,-0.03125 -0.005,-0.036216 0.007,-0.026576 0,-0.0625 -0.007,-0.035924 -0.0228,0.00428 -0.0313,-0.03125 -0.008,-0.035534 0.0102,-0.027451 0,-0.0625 -0.0102,-0.035049 0.0121,0.00322 0,-0.03125 -0.0121,-0.034468 -0.0174,0.00254 -0.0313,-0.03125 -0.0138,-0.033793 -0.0157,-0.029473 -0.0313,-0.0625 -0.0156,-0.033027 0.0173,9.214e-4 0,-0.03125 -0.0173,-0.032171 -0.0123,-2.16e-5 -0.0313,-0.03125 -0.0189,-0.031228 -0.0107,-0.032299 -0.0313,-0.0625 -0.0205,-0.030201 -0.009,-0.00216 -0.0313,-0.03125 -0.0221,-0.029091 -0.008,-0.00335 -0.0313,-0.03125 -0.0236,-0.027903 -0.006,-0.00461 -0.0313,-0.03125 -0.025,-0.026638 -0.005,-0.00595 -0.0313,-0.03125 -0.0263,-0.025302 -0.004,-0.00735 -0.0313,-0.03125 -0.0276,-0.023897 -0.002,-0.00882 -0.0313,-0.03125 -0.0288,-0.022427 -0.001,-0.010354 -0.0313,-0.03125 -0.0299,-0.020896 -2.6e-4,-0.011942 -0.0313,-0.03125 -0.031,-0.019308 -0.0305,-0.013582 -0.0625,-0.03125 -0.032,-0.017668 0.002,0.015981 -0.0313,0 -0.0328,-0.015981 0.002,-0.017 -0.0313,-0.03125 -0.0336,-0.01425 -0.0282,-0.01877 -0.0625,-0.03125 -0.0343,-0.01248 0.004,0.010676 -0.0313,0 -0.0349,-0.010676 -0.0271,0.00884 -0.0625,0 -0.0354,-0.00884 0.005,-0.024263 -0.0313,-0.03125 -0.0358,-0.00699 0.005,0.00511 -0.0313,0 -0.0362,-0.00511 -0.0261,0.00322 -0.0625,0 -0.0364,-0.00322 0.005,0.00132 -0.0313,0 -0.0365,-0.00132 -0.026,-5.782e-4 -0.0625,0 -0.0365,5.782e-4 0.005,-0.00248 -0.0313,0 -0.0364,0.00248 -0.0263,-0.00437 -0.0625,0 -0.0362,0.00437 0.005,-0.00625 -0.0313,0 -0.036,0.00625 -0.0269,-0.00812 -0.0625,0 -0.0356,0.00812 0.004,0.021289 -0.0313,0.03125 -0.0351,0.00996 -0.0279,-0.011776 -0.0625,0 a 0.60291352,0.60291352 0 0 1 -0.0313,0.03125 c 0,0 -3.29404,0.797475 -4.8125,1.1875 -1.00956,0.2593098 -1.82266,0.119209 -3.125,0.34375 -0.85992,0.1482625 -1.77948,-0.1333935 -2.90625,-0.5 -1.11931,-0.3641809 -2.30849,-0.7772783 -3.71875,-0.5625 -0.91382,0.139172 -1.53362,0.6097906 -2.09375,1 C 98.898805,5.2095485 98.561731,5.424928 98.125,5.5 93.06687,6.3694721 87.701391,4.2645299 82.125,3.5 74.861197,2.5041239 69.430139,2.455467 62.03125,5.40625 59.285787,6.5011797 55.865395,5.8653024 52.6875,5.0625 51.985951,4.8852745 51.348693,4.4089478 50.53125,3.84375 49.72087,3.2834358 48.810714,2.6687321 47.59375,2.5625 44.802553,2.3188489 42.283239,3.335569 39.875,4.40625 37.465675,5.4774139 35.157007,6.6096603 32.84375,6.90625 29.920441,7.2810561 26.934516,7.4006419 24.25,6.625 23.078941,6.2866438 22.019155,5.44183 20.84375,4.53125 19.670089,3.6220208 18.429397,2.6690067 16.78125,2.28125 15.31474,1.9362265 13.516543,1.8285968 11.6875,1.875 z"
+ transform="translate(0,-1.09434)" />
+ <g
+ id="g3794"
+ transform="matrix(0.93083461,0.14457877,-0.14457877,0.93083461,-9.5560514,-4.4782799)">
+ <g
+ id="g3852"
+ transform="matrix(0.88020957,0,0,0.88020957,2.0106003,0.78001647)">
+ <path
+ style="fill:#ff5353;fill-opacity:1;stroke:#d20000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3792"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3804"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#ffbfbf;fill-opacity:1;stroke:none" />
+ <path
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.652016,-0.627109 3.128706,-0.409628 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ id="path3765"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ id="g3857"
+ transform="matrix(0.79366442,-0.41407639,0.41407639,0.79366442,68.400139,-0.2190763)">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3859"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#ff5353;fill-opacity:1;stroke:#d20000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216" />
+ <path
+ style="fill:#ffbfbf;fill-opacity:1;stroke:none"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3861"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3863"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.158491,-0.472045 2.629493,-0.538087 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ id="g3865"
+ transform="matrix(0.87622168,0.1643472,-0.13496643,0.72420958,84.889605,-12.483415)">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3867"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#53fff8;fill-opacity:1;stroke:#0073d2;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216" />
+ <path
+ style="fill:#bffffd;fill-opacity:1;stroke:none"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3869"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3871"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.089127,-0.497822 1.897861,-1.346695 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ transform="matrix(0.86700865,-0.49829018,0.41258483,0.71596181,39.555562,5.276502)"
+ id="g3873">
+ <path
+ style="fill:#53fff8;fill-opacity:1;stroke:#0073d2;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3875"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3877"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#bffffd;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.089127,-0.497822 1.897861,-1.346695 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ id="path3879"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ transform="matrix(0.99995926,0.00809455,-0.00160462,0.594738,27.22871,2.810441)"
+ id="g3881">
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c -0.26541,2.834126 4.11079,3.492492 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ id="path3887"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ffd553;fill-opacity:1;stroke:#d28e00;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 -0.516651,-0.993142 -3.319139,-1.4720252 -4.029253,-0.04734 z"
+ id="path3883"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3885"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 -0.574274,-0.621426 -2.367696,-1.5972338 -4.029253,-0.04734 z"
+ style="fill:#ffefbf;fill-opacity:1;stroke:none" />
+ </g>
+ <g
+ id="g3889"
+ transform="matrix(0.79654416,-0.07300138,0.07300138,0.79654416,105.49043,-11.634656)">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3891"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#ffc353;fill-opacity:1;stroke:#d27300;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216" />
+ <path
+ style="fill:#ffe4bf;fill-opacity:1;stroke:none"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3893"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ inkscape:connector-curvature="0"
+ id="path3895"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.652016,-0.627109 3.128706,-0.409628 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ </g>
+ <g
+ id="g3897"
+ transform="matrix(0.87538072,-0.48341766,0.29031565,0.51906906,110.1631,-3.5222437)">
+ <path
+ inkscape:connector-curvature="0"
+ id="path3899"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c -0.26541,2.834126 4.11079,3.492492 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="ccccccccc" />
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3901"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 -0.516651,-0.993142 -3.319139,-1.4720252 -4.029253,-0.04734 z"
+ style="fill:#77ff53;fill-opacity:1;stroke:#21d200;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216" />
+ <path
+ style="fill:#d4ffce;fill-opacity:1;stroke:none"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 -0.574274,-0.621426 -2.367696,-1.5972338 -4.029253,-0.04734 z"
+ id="path3903"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)" />
+ </g>
+ <g
+ transform="matrix(0.85467231,-0.08542993,0.07141237,0.70616335,58.188074,-1.5267724)"
+ id="g3905">
+ <path
+ style="fill:#69ff53;fill-opacity:1;stroke:#05d200;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3907"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc" />
+ <path
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)"
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3909"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#d0ffbf;fill-opacity:1;stroke:none" />
+ <path
+ sodipodi:nodetypes="ccccccccc"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.089127,-0.497822 1.897861,-1.346695 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ id="path3911"
+ inkscape:connector-curvature="0" />
+ </g>
+ <g
+ id="g3921"
+ transform="matrix(0.86963065,0.36390025,-0.30144031,0.71076987,19.197462,-3.9433455)">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3923"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#fd53ff;fill-opacity:1;stroke:#d200cf;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216" />
+ <path
+ style="fill:#ffbffd;fill-opacity:1;stroke:none"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3925"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3927"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.089127,-0.497822 1.897861,-1.346695 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ <g
+ id="g3929"
+ transform="matrix(0.85844005,-0.02904662,0.0248245,0.70933077,93.759226,-8.5973955)">
+ <path
+ sodipodi:nodetypes="cccc"
+ inkscape:connector-curvature="0"
+ id="path3931"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ style="fill:#ff53f4;fill-opacity:1;stroke:#ca00d2;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:0.98039216" />
+ <path
+ style="fill:#ffbffb;fill-opacity:1;stroke:none"
+ d="m 15.946514,11.151204 c -0.615601,4.354136 0.426443,7.402933 1.731156,9.588835 1.8803,-2.400512 2.470287,-5.322994 2.298097,-9.5415 z"
+ id="path3933"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccc"
+ transform="matrix(0.60616889,0,0,0.60616889,6.9895477,4.8126328)" />
+ <path
+ inkscape:connector-curvature="0"
+ id="path3935"
+ d="m 17.178692,4.9999085 -0.07738,2.0893004 -1.00596,1.083341 -0.386907,3.5595491 c 1.089127,-0.497822 1.897861,-1.346695 4.565508,0 l -0.464289,-3.8690751 -1.160722,-0.773815 0,-2.0119189 z"
+ style="fill:#005522;fill-opacity:1;stroke:#002b11;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ sodipodi:nodetypes="ccccccccc" />
+ </g>
+ </g>
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Highlights"
+ style="filter:url(#filter3987);opacity:0.44000000000000000" />
+ <path
+ style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;baseline-shift:baseline;color:#000000;fill:#005522;fill-opacity:1;stroke:none;stroke-width:2;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;font-family:Sans;-inkscape-font-specification:Sans;filter:url(#filter4004)"
+ d="M 11.6875,0.78125 C 9.8558921,0.8277183 7.9550421,1.0025139 6.21875,1.21875 2.7435656,1.6515459 -0.03125,2.25 -0.03125,2.25 c -0.03368056,0.00717 0.0020384,-0.00881 -0.03125,0 -0.03328837,0.00881 -0.02968402,0.020817 -0.0625,0.03125 -0.032816,0.010433 0.001015,-0.01203 -0.03125,0 -0.0322645,0.01203 3.8537e-4,0.017651 -0.03125,0.03125 -0.0316354,0.013599 -0.03157,-0.015135 -0.0625,0 C -0.28093,2.327635 -0.2511,2.327116 -0.28125,2.34375 -0.3114001,2.360384 -0.283202,2.356906 -0.3125,2.375 -0.3417976,2.393094 -0.315376,2.35549 -0.34375,2.375 -0.3721244,2.39451 -0.347617,2.385372 -0.375,2.40625 -0.402383,2.427128 -0.4111745,2.4153 -0.4375,2.4375 -0.4638255,2.459697 -0.443545,2.44529 -0.46875,2.46875 -0.4939547,2.492212 -0.475977,2.47533 -0.5,2.5 c -0.0240231,0.02467 -0.008466,0.00543 -0.03125,0.03125 -0.0227837,0.025819 0.0214893,0.00434 0,0.03125 C -0.5527393,2.589406 -0.5423568,2.56582 -0.5625,2.59375 -0.5826432,2.621678 -0.5750014,2.59612 -0.59375,2.625 -0.6124986,2.653883 -0.6076912,2.657732 -0.625,2.6875 c -0.0173088,0.029768 -0.0154227,6.685e-4 -0.03125,0.03125 -0.0158273,0.030581 0.0143076,-7.13e-5 0,0.03125 -0.0143076,0.031321 -0.0184965,-7.356e-4 -0.03125,0.03125 -0.0127535,0.031986 0.0111687,0.029927 0,0.0625 -0.0111687,0.032573 -0.021693,-0.00183 -0.03125,0.03125 -0.009557,0.033082 0.007922,-0.00226 0,0.03125 -0.007922,0.033511 0.006268,0.028641 0,0.0625 C -0.7250184,3.0026091 -0.74540054,2.9658741 -0.75,3 c -0.004599,0.034126 0.002919,0.028189 0,0.0625 -0.002919,0.034311 0.001232,-0.00316 0,0.03125 -0.001232,0.034412 -4.5763e-4,-0.00318 0,0.03125 4.5763e-4,0.034431 -0.002147,0.028132 0,0.0625 0.002147,0.034368 -0.00383,-0.00297 0,0.03125 0.00383,0.034221 0.0257452,0.028508 0.03125,0.0625 0.005505,0.033992 -0.007166,-0.00243 0,0.03125 0.007166,0.033681 -0.00881,-0.00204 0,0.03125 0.00881,0.033288 0.0208172,0.029684 0.03125,0.0625 0.0104328,0.032816 -0.0120305,-0.00101 0,0.03125 0.0120305,0.032265 0.0176509,-3.854e-4 0.03125,0.03125 C -0.6404227,3.438169 -0.6423088,3.46727 -0.625,3.4375 -0.6076912,3.407732 -0.6124986,3.403883 -0.59375,3.375 -0.5750014,3.346117 -0.5826432,3.37168 -0.5625,3.34375 -0.5423568,3.315822 -0.552739,3.33941 -0.53125,3.3125 c 0.0214893,-0.026906 -0.0227837,-0.00543 0,-0.03125 C -0.5084663,3.255431 -0.524023,3.27467 -0.5,3.25 -0.4759769,3.22533 -0.493955,3.24221 -0.46875,3.21875 -0.4435453,3.195288 -0.463826,3.2097 -0.4375,3.1875 -0.4111745,3.165303 -0.402383,3.177128 -0.375,3.15625 -0.347617,3.135372 -0.372124,3.14451 -0.34375,3.125 c 0.0283744,-0.01951 0.001952,0.018094 0.03125,0 0.0292976,-0.018094 0.0011,-0.014616 0.03125,-0.03125 0.0301501,-0.016634 3.2002e-4,-0.016115 0.03125,-0.03125 0.03093,-0.015135 0.0308646,0.013599 0.0625,0 0.0316354,-0.013599 -0.001015,-0.01922 0.03125,-0.03125 0.0322645,-0.01203 -0.001566,0.010433 0.03125,0 C -0.09218402,3.020817 -0.09578837,3.00881 -0.0625,3 c 0.03328837,-0.00881 -0.0024306,0.00717 0.03125,0 0,0 2.7748156,-0.5984541 6.25,-1.03125 1.7362921,-0.2162361 3.6371421,-0.3910317 5.46875,-0.4375 1.829043,-0.046403 3.62724,0.061227 5.09375,0.40625 1.648147,0.3877567 2.888839,1.3407708 4.0625,2.25 1.175405,0.91058 2.235191,1.7553938 3.40625,2.09375 2.684516,0.7756419 5.670441,0.6560561 8.59375,0.28125 2.313257,-0.2965897 4.621925,-1.4288361 7.03125,-2.5 2.408239,-1.070681 4.927553,-2.0874011 7.71875,-1.84375 1.216964,0.1062321 2.12712,0.7209358 2.9375,1.28125 0.817443,0.5651978 1.454701,1.0415245 2.15625,1.21875 3.177895,0.8028024 6.598287,1.4386797 9.34375,0.34375 7.398889,-2.950783 12.829947,-2.9021261 20.09375,-1.90625 5.576391,0.7645299 10.94187,2.8694721 16,2 0.436731,-0.075072 0.773805,-0.2904515 1.34375,-0.6875 0.56013,-0.3902094 1.17993,-0.860828 2.09375,-1 1.41026,-0.2147783 2.59944,0.1983191 3.71875,0.5625 1.12677,0.3666065 2.04633,0.6482625 2.90625,0.5 1.30234,-0.224541 2.11544,-0.08444 3.125,-0.34375 C 112.83096,3.797475 116.125,3 116.125,3 a 0.60291352,0.60291352 0 0 0 0.0313,-0.03125 c 0.0346,-0.011776 0.0274,0.00996 0.0625,0 0.0351,-0.00996 -0.004,-0.023132 0.0313,-0.03125 0.0356,-0.00812 0.0265,0.00625 0.0625,0 0.036,-0.00625 -0.005,0.00437 0.0313,0 0.0362,-0.00437 0.0261,0.00248 0.0625,0 0.0364,-0.00248 -0.005,5.782e-4 0.0313,0 0.0365,-5.782e-4 0.026,-0.00132 0.0625,0 0.0365,0.00132 -0.005,-0.00322 0.0313,0 0.0364,0.00322 0.0263,-0.00511 0.0625,0 0.0362,0.00511 -0.005,-0.00699 0.0313,0 0.0358,0.00699 -0.004,0.022407 0.0313,0.03125 0.0354,0.00884 0.0276,-0.010676 0.0625,0 0.0349,0.010676 -0.003,-0.01248 0.0313,0 0.0343,0.01248 0.0289,0.017 0.0625,0.03125 0.0336,0.01425 -0.002,0.015269 0.0313,0.03125 0.0328,0.015981 -7.1e-4,-0.017668 0.0313,0 0.032,0.017668 0.0315,0.011942 0.0625,0.03125 0.031,0.019308 10e-4,0.010354 0.0313,0.03125 0.0299,0.020896 0.002,0.00882 0.0313,0.03125 0.0288,0.022427 0.004,0.00735 0.0313,0.03125 0.0276,0.023897 0.005,0.00595 0.0313,0.03125 0.0263,0.025302 0.006,0.00461 0.0313,0.03125 0.025,0.026638 0.008,0.00335 0.0313,0.03125 0.0236,0.027903 0.009,0.00216 0.0313,0.03125 0.0221,0.029091 0.0107,0.00105 0.0313,0.03125 0.0205,0.030201 0.0123,0.031272 0.0313,0.0625 0.0189,0.031228 0.014,-9.214e-4 0.0313,0.03125 0.0173,0.032171 -0.0156,-0.00178 0,0.03125 0.005,-0.00915 0.0229,-0.011009 0.0313,-0.03125 0.014,-0.033734 0.019,0.00317 0.0313,-0.03125 0.0122,-0.034416 -0.0104,0.00375 0,-0.03125 0.0104,-0.035005 -0.009,-0.027001 0,-0.0625 0.009,-0.035499 0.0246,0.00465 0.0313,-0.03125 0.007,-0.035896 -0.005,-0.026304 0,-0.0625 0.005,-0.036196 -0.003,0.00515 0,-0.03125 0.003,-0.036398 -10e-4,-0.025999 0,-0.0625 0.001,-0.036501 8.7e-4,0.00525 0,-0.03125 -8.7e-4,-0.036505 0.003,-0.02609 0,-0.0625 -0.003,-0.03641 0.005,0.00497 0,-0.03125 -0.005,-0.036216 0.007,-0.026576 0,-0.0625 -0.007,-0.035924 -0.0228,0.00428 -0.0313,-0.03125 -0.008,-0.035534 0.0102,-0.027451 0,-0.0625 -0.0102,-0.035049 0.0121,0.00322 0,-0.03125 -0.0121,-0.034468 -0.0174,0.00254 -0.0313,-0.03125 -0.0138,-0.033793 -0.0157,-0.029473 -0.0313,-0.0625 -0.0156,-0.033027 0.0173,9.214e-4 0,-0.03125 C 117.2337,2.624079 117.2387,2.6562284 117.2197,2.625 117.2008,2.593772 117.209,2.592701 117.1884,2.5625 117.1679,2.532299 117.1794,2.56034 117.1571,2.53125 117.135,2.502159 117.1491,2.5279 117.1258,2.5 c -0.0236,-0.027903 -0.006,-0.00461 -0.0313,-0.03125 -0.025,-0.026638 -0.005,-0.00595 -0.0313,-0.03125 -0.0263,-0.025302 -0.004,-0.00735 -0.0313,-0.03125 -0.0276,-0.023897 -0.002,-0.00882 -0.0313,-0.03125 -0.0288,-0.022427 -0.001,-0.010354 -0.0313,-0.03125 -0.0299,-0.020896 -2.6e-4,-0.011942 -0.0313,-0.03125 -0.031,-0.019308 -0.0305,-0.013582 -0.0625,-0.03125 -0.032,-0.017668 0.002,0.015981 -0.0313,0 -0.0328,-0.015981 0.002,-0.017 -0.0313,-0.03125 -0.0336,-0.01425 -0.0282,-0.01877 -0.0625,-0.03125 -0.0343,-0.01248 0.004,0.010676 -0.0313,0 -0.0349,-0.010676 -0.0271,0.00884 -0.0625,0 -0.0354,-0.00884 0.005,-0.024263 -0.0313,-0.03125 -0.0358,-0.00699 0.005,0.00511 -0.0313,0 -0.0362,-0.00511 -0.0261,0.00322 -0.0625,0 -0.0364,-0.00322 0.005,0.00132 -0.0313,0 -0.0365,-0.00132 -0.026,-5.782e-4 -0.0625,0 -0.0365,5.782e-4 0.005,-0.00248 -0.0313,0 -0.0364,0.00248 -0.0263,-0.00437 -0.0625,0 -0.0362,0.00437 0.005,-0.00625 -0.0313,0 -0.036,0.00625 -0.0269,-0.00812 -0.0625,0 -0.0356,0.00812 0.004,0.021289 -0.0313,0.03125 -0.0351,0.00996 -0.0279,-0.011776 -0.0625,0 A 0.60291352,0.60291352 0 0 1 116.125,2.25 c 0,0 -3.29404,0.797475 -4.8125,1.1875 -1.00956,0.2593098 -1.82266,0.119209 -3.125,0.34375 -0.85992,0.1482625 -1.77948,-0.1333935 -2.90625,-0.5 -1.11931,-0.3641809 -2.30849,-0.7772783 -3.71875,-0.5625 -0.91382,0.139172 -1.53362,0.6097906 -2.09375,1 -0.569945,0.3970485 -0.907019,0.612428 -1.34375,0.6875 -5.05813,0.8694721 -10.423609,-1.2354701 -16,-2 C 74.861197,1.4103739 69.430139,1.361717 62.03125,4.3125 59.285787,5.4074297 55.865395,4.7715524 52.6875,3.96875 51.985951,3.7915245 51.348693,3.3151978 50.53125,2.75 49.72087,2.1896858 48.810714,1.5749821 47.59375,1.46875 44.802553,1.2250989 42.283239,2.241819 39.875,3.3125 37.465675,4.3836639 35.157007,5.5159103 32.84375,5.8125 29.920441,6.1873061 26.934516,6.3068919 24.25,5.53125 23.078941,5.1928938 22.019155,4.34808 20.84375,3.4375 19.670089,2.5282708 18.429397,1.5752567 16.78125,1.1875 15.31474,0.8424765 13.516543,0.7348468 11.6875,0.78125 z"
+ id="path3995"
+ inkscape:connector-curvature="0"
+ transform="translate(0,0.125)" />
+</svg>
Binary file share/hedgewars/Data/Themes/Christmas/Girder.xcf has changed
Binary file share/hedgewars/Data/Themes/Christmas/LandBackTex.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/LandTex.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Sky.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Skytrees.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Snowball.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/Snowman.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/Snowman.svg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,731 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:osb="http://www.openswatchbook.org/uri/2009/osb"
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:export-ydpi="90"
+ inkscape:export-xdpi="90"
+ inkscape:export-filename="/mnt/y/src/hedgewars/share/hedgewars/Data/Themes/Christmas/Snowman.png"
+ inkscape:version="0.48.0 r9654"
+ version="1.1"
+ id="svg2"
+ height="310.98691"
+ width="206.98897"
+ sodipodi:docname="Snowman.svg">
+ <sodipodi:namedview
+ id="base"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1.0"
+ inkscape:pageopacity="0.0"
+ inkscape:pageshadow="2"
+ inkscape:zoom="1"
+ inkscape:cx="93.888364"
+ inkscape:cy="261.46368"
+ inkscape:document-units="px"
+ inkscape:current-layer="layer1"
+ showgrid="false"
+ inkscape:window-width="1280"
+ inkscape:window-height="948"
+ inkscape:window-x="-4"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ fit-margin-top="15"
+ fit-margin-left="15"
+ fit-margin-right="15"
+ fit-margin-bottom="15" />
+ <defs
+ id="defs4">
+ <linearGradient
+ id="linearGradient5294"
+ osb:paint="solid">
+ <stop
+ style="stop-color:#d6cda8;stop-opacity:1;"
+ offset="0"
+ id="stop5296" />
+ </linearGradient>
+ </defs>
+ <metadata
+ id="metadata7">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ transform="translate(-182.50939,-276.81877)"
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Capa 1">
+ <path
+ style="fill:#803300;stroke:none"
+ d="m 105.71246,56.752729 c 7.46213,-5.760648 23.33493,-13.178662 26.87006,-19.79899 2.45086,-4.589786 0.73247,-12.830541 1.06066,-21.566757 0.15093,-4.017553 5.08192,-1.265077 4.99264,1.623161 -0.15297,4.948786 -1.03168,10.850098 -0.39644,14.286742 0.41149,2.226135 3.10061,3.719978 5.3033,4.242641 3.66792,0.87034 10.05917,-4.796236 15.20279,-7.424622 3.27995,-1.676053 4.41702,5.485288 0.70711,7.424622 -4.74078,2.478219 -10.60559,5.171136 -16.26346,6.717514 -3.2154,0.878815 -6.7894,0.214876 -9.89949,1.414214 -4.91011,1.893475 -7.59035,5.387249 -11.4021,9.015611 -0.85361,0.812546 -2.94457,1.841759 -3.8007,2.65165 -3.08683,2.920104 -5.0381,4.237932 -10.6066,7.071068 -1.76076,0.895835 -3.33155,-4.449639 -1.76777,-5.656854 z"
+ id="path4040"
+ inkscape:connector-curvature="0"
+ transform="translate(214.73005,386.2896)"
+ sodipodi:nodetypes="ssssssssssssss" />
+ <path
+ style="fill:#6c2b00;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 166.21875 123.5 C 166.01352 123.82047 165.89768 124.24015 165.875 124.84375 C 165.72783 128.76137 165.97834 132.53495 166.09375 135.96875 C 166.21053 132.25846 165.99944 127.97005 166.21875 123.5 z M 170.5 132.25 C 170.3747 133.60364 170.28956 134.86486 170.28125 136.03125 C 170.32755 134.83045 170.40445 133.54527 170.5 132.25 z M 193.96875 141.1875 C 193.57354 142.16405 192.88133 143.01671 191.875 143.5 C 186.96419 145.85846 180.90577 148.40292 175.09375 149.78125 C 171.79075 150.56456 168.17565 149.76182 164.96875 150.875 C 159.9058 152.63245 157.03626 156.09507 153.03125 159.65625 C 152.13436 160.45375 149.99311 161.45529 149.09375 162.25 C 145.85105 165.11538 143.79678 166.37142 138.03125 169.0625 C 137.81339 169.16418 137.60792 169.1551 137.40625 169.09375 C 137.7111 170.77349 138.65168 172.402 139.6875 171.875 C 145.256 169.04186 147.22567 167.7326 150.3125 164.8125 C 151.16863 164.00261 153.24014 162.9688 154.09375 162.15625 C 157.9055 158.52789 160.58989 155.04972 165.5 153.15625 C 168.61009 151.95691 172.19085 152.59756 175.40625 151.71875 C 181.06412 150.17237 186.94672 147.47822 191.6875 145 C 193.13962 144.24091 193.83965 142.70357 193.96875 141.1875 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4573" />
+ <path
+ style="fill:#9e4100;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 167.53125 122.84375 C 166.64707 122.79612 165.9316 123.33717 165.875 124.84375 C 165.87263 124.90673 165.87716 124.96832 165.875 125.03125 C 166.36652 125.26083 166.86087 125.4923 167.25 125.75 C 167.68528 126.03826 168.36925 126.04485 168.625 126.5 C 169.91235 128.79107 168.29098 131.74735 168.25 134.375 C 168.2104 136.9167 167.58617 139.58348 168.375 142 C 168.64405 142.82422 169.2058 143.57373 169.875 144.125 C 171.60238 145.54797 173.76354 146.95825 176 146.875 C 177.13649 146.8327 178.53594 146.28829 179 145.25 C 179.10003 145.0262 179.13922 144.77654 179.125 144.53125 C 177.86882 145.02335 176.70631 145.22692 175.75 145 C 173.54731 144.47734 170.88024 143.00738 170.46875 140.78125 C 169.83351 137.34461 170.69078 131.41754 170.84375 126.46875 C 170.89955 124.6636 169.00488 122.92314 167.53125 122.84375 z M 192.09375 137.34375 C 191.756 137.30455 191.37874 137.38424 190.96875 137.59375 C 188.07931 139.07025 184.81668 141.49088 181.84375 143.1875 C 181.89455 143.20617 181.95035 143.23728 182 143.25 C 184.01815 143.76704 186.00656 142.10538 188 141.5 C 188.79438 141.25876 189.57401 140.53172 190.375 140.75 C 190.91585 140.89739 191.0432 141.67509 191.5 142 C 192.08649 142.41715 192.77619 143.0289 193.46875 143.0625 C 194.55481 140.73672 193.85131 137.54775 192.09375 137.34375 z M 165.1875 145.5625 C 165.06927 145.86295 164.95931 146.16257 164.8125 146.4375 C 161.27737 153.05783 145.39963 160.4581 137.9375 166.21875 C 137.31134 166.70214 137.18506 167.85598 137.375 169 C 138.31377 168.83634 139.25853 168.56702 140 168.375 C 142.10367 167.83022 143.74132 166.15143 145.5 164.875 C 146.98526 163.79701 148.3072 162.50919 149.75 161.375 C 153.68084 158.28493 157.66163 155.25341 161.75 152.375 C 163.79106 150.938 164.66442 150.17895 165.625 147.875 C 165.92784 147.14863 165.48706 146.3161 165.1875 145.5625 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4525" />
+ <path
+ sodipodi:nodetypes="ssssssssssssss"
+ transform="translate(214.73005,386.2896)"
+ inkscape:connector-curvature="0"
+ id="path4533"
+ d="m 105.71246,56.752729 c 7.46213,-5.760648 23.33493,-13.178662 26.87006,-19.79899 2.45086,-4.589786 0.73247,-12.830541 1.06066,-21.566757 0.15093,-4.017553 5.08192,-1.265077 4.99264,1.623161 -0.15297,4.948786 -1.03168,10.850098 -0.39644,14.286742 0.41149,2.226135 3.10061,3.719978 5.3033,4.242641 3.66792,0.87034 10.05917,-4.796236 15.20279,-7.424622 3.27995,-1.676053 4.41702,5.485288 0.70711,7.424622 -4.74078,2.478219 -10.60559,5.171136 -16.26346,6.717514 -3.2154,0.878815 -6.7894,0.214876 -9.89949,1.414214 -4.91011,1.893475 -7.59035,5.387249 -11.4021,9.015611 -0.85361,0.812546 -2.94457,1.841759 -3.8007,2.65165 -3.08683,2.920104 -5.0381,4.237932 -10.6066,7.071068 -1.76076,0.895835 -3.33155,-4.449639 -1.76777,-5.656854 z"
+ style="fill:none;stroke:#552200;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none" />
+ <path
+ style="fill:#c98c49;stroke:#502d16;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+ d="m 116.82322,156.98081 c 5.47921,-34.10468 11.02733,-101.506931 11.70622,-154.9445492 0.0545,-4.292547 -8.61436,-3.6884688 -8.52513,0.8535534 0.77332,39.3643978 -3.28415,113.5674358 -9.76687,154.3033058 -1.09084,6.85458 5.56316,6.15288 6.58578,-0.21231 z"
+ id="path3958"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="sssss" />
+ <path
+ style="color:#000000;fill:#bb7444;fill-opacity:1;fill-rule:nonzero;stroke:#502d16;stroke-width:0.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 119.5,3.4860082 c 2.77397,2.02233 7.2219,2.6172072 10.25,1 3.42025,-1.8266431 3.37639,-7.0057742 5.5,-10.2499999 3.54262,-5.4120353 10.28529,-11.1224403 11.02773,-17.5480973 0.15833,-1.370295 -0.57057,-3.034651 -1.75,-3.75 -9.77087,-5.926241 -26.52139,-4.554208 -34.95711,-0.267763 -1.20939,0.614527 -1.60008,1.770384 -1.85095,3.103553 -1.01315,5.383998 5.48408,13.488267 7.78033,18.4623113 1.408,3.0499587 1.28552,7.2710364 4,9.2499959 z"
+ id="path4017"
+ inkscape:connector-curvature="0"
+ transform="translate(211.52295,401.7896)"
+ sodipodi:nodetypes="sssssssss" />
+ <path
+ style="fill:#bb7444;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
+ d="M 153.65625 127.9375 C 152.96682 127.99595 152.28678 128.25904 151.9375 128.53125 C 151.58822 128.80346 151.52343 128.91452 151.53125 129.3125 C 152.30881 168.89251 148.27787 243.01165 141.75 284.03125 C 141.54281 285.33316 141.78097 285.94494 141.875 286.125 C 142.11722 286.04849 143.38052 285.36227 143.75 283.0625 C 149.19233 249.18739 154.76034 181.77043 155.4375 128.46875 C 155.44121 128.17648 155.50074 128.33489 155.25 128.1875 C 154.99926 128.04011 154.34201 127.87936 153.65625 127.9375 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4094" />
+ <path
+ id="path3882"
+ transform="translate(182.50939,276.81877)"
+ style="fill:none;stroke:#916032;stroke-width:1px;stroke-linecap:round;stroke-linejoin:round;stroke-opacity:1;opacity:0.65"
+ d="m 143,104.23691 c 4.05914,2.46906 7.30046,4.92423 12.125,4.875 m 9.875,-2.625 c 0,0 -0.41133,5.75618 -1.5,8.375 -0.5857,1.40893 -2.625,3.75 -2.625,3.75 m -12.125,-7.125 c 0,0 0.38667,5.19841 1.25,7.625 0.86963,2.44431 3.875,6.75 3.875,6.75 m -4.5,92.5 c 0,0 1.57832,-0.73239 2.125,-1.375 1.68043,-1.97531 3.125,-7.125 3.125,-7.125 m -3.125,-60.75 c 0,0 0.92625,7.7939 1.75,11.625 0.58231,2.70823 2.25,8 2.25,8 m -5.875,26.75 c 0,0 2.10205,-0.5468 3,-1.125 1.13949,-0.73373 2.875,-2.875 2.875,-2.875"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccsssssssssssssss" />
+ <path
+ style="color:#000000;fill:#c98c49;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 155.5625,93.9375 c -6.46345,0.138034 -12.75089,1.575527 -16.96875,3.71875 -1.20939,0.614527 -1.62413,1.760581 -1.875,3.09375 -1.01315,5.384 5.485,13.49471 7.78125,18.46875 1.408,3.04996 1.28552,7.27104 4,9.25 0.19168,0.13975 2.36289,0.77948 2.56954,0.90533 -2.74751,-2.23783 -3.19699,-7.08349 -4.34099,-9.56158 -2.29625,-4.97404 -8.7944,-13.08475 -7.78125,-18.46875 0.25087,-1.33317 0.28081,-2.510473 1.4902,-3.125 8.43572,-4.286445 18.63538,-4.644991 28.40625,1.28125 1.17943,0.71535 1.90833,2.37971 1.75,3.75 -0.74244,6.42566 -7.48863,12.15046 -11.03125,17.5625 -1.88361,2.87758 -2.06575,7.26757 -4.46875,9.5 1.01864,-0.12034 2.79589,-0.38426 3.65625,-0.84375 3.42025,-1.82664 3.37639,-7.00577 5.5,-10.25 3.54262,-5.41204 10.28881,-11.13684 11.03125,-17.5625 0.15833,-1.37029 -0.57057,-3.034651 -1.75,-3.75 -4.88544,-2.963121 -11.5053,-4.106784 -17.96875,-3.96875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4087"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssccsssssscsssss" />
+ <path
+ sodipodi:nodetypes="sssssssss"
+ transform="translate(211.52295,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4092"
+ d="m 119.5,3.4860082 c 2.77397,2.02233 7.2219,2.6172072 10.25,1 3.42025,-1.8266431 3.37639,-7.0057742 5.5,-10.2499999 3.54262,-5.4120353 10.28529,-11.1224403 11.02773,-17.5480973 0.15833,-1.370295 -0.57057,-3.034651 -1.75,-3.75 -9.77087,-5.926241 -26.52139,-4.554208 -34.95711,-0.267763 -1.20939,0.614527 -1.60008,1.770384 -1.85095,3.103553 -1.01315,5.383998 5.48408,13.488267 7.78033,18.4623113 1.408,3.0499587 1.28552,7.2710364 4,9.2499959 z"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#502d16;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:#d4aa00;stroke:#554400;stroke-width:2;stroke-linecap:butt;stroke-linejoin:round;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 108.89444,-25.448434 c 1.23909,2.929251 22.95487,3.279206 32.88047,1.414213 0,0 1.48998,-0.188386 1.94454,-0.707106 2.7043,-3.086028 1.36595,-8.124179 2.65165,-12.020816 3.62002,-10.971379 14.14774,-30.710413 14.14214,-31.643028 0.0163,-0.690433 -1.49871,-1.736061 -1.94454,-1.414214 -0.50893,0.367398 -1.98849,3.154754 -2.82843,4.242641 0.47698,-1.782082 1.48728,-4.6648 1.41421,-5.480077 -0.11085,-1.236804 -11.49406,-2.278914 -17.32411,-2.651651 -7.29402,-0.466334 -20.63286,-0.968333 -21.52256,0.618718 -0.35566,0.634416 0.55979,10.076272 0.83968,15.114408 -1.1783,-4.83395 -2.49772,-13.781102 -3.53553,-14.495689 -0.79374,-0.610818 -10.99588,1.140811 -10.92799,2.132044 -0.0437,0.485627 1.91237,6.530014 3.14981,9.888771 -1.53206,-3.064129 -4.06138,-8.770308 -5.08233,-8.79464 -0.7591,-0.0625 -2.4122,1.532778 -3.952884,2.617259 -1.271348,0.894898 -3.390527,1.282308 -3.750303,2.336089 -0.21796,1.075481 3.887763,8.849966 5.714457,13.564011 l -7.954955,-8.485282 -1.944544,3.005204 c 0,0 6.368177,5.157381 8.662058,8.485281 3.429551,4.975496 4.978171,11.016478 7.247841,16.61701 0.75638,1.8664 2.12132,5.656854 2.12132,5.656854 z"
+ id="path4036"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="sssscscssscccccsccccsss" />
+ <path
+ style="color:#000000;fill:#aa8700;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 153.34375,55.125 c -2.63387,0.03613 -4.53646,0.277616 -4.84375,0.84375 -0.32757,0.603491 0.49221,8.332447 0.75,13.125 -0.25217,-1.068449 -0.48868,-2.375137 -0.75,-3.71875 -0.0211,-0.09715 -0.0414,-0.18241 -0.0625,-0.28125 -0.006,-0.032 -0.0251,-0.0617 -0.0313,-0.09375 -0.37047,-1.740136 -0.71887,-3.320124 -1.09375,-5.1875 -0.0483,-0.226301 -0.10837,-0.473308 -0.15625,-0.6875 -0.41086,-1.838141 -0.7978,-3.213842 -1.15625,-3.46875 -0.73106,-0.581044 -10.12503,1.088335 -10.0625,2.03125 -0.0402,0.461955 2.07903,7.586215 3.21875,10.78125 -1.41108,-2.914768 -4.55967,-10.008104 -5.5,-10.03125 -0.69916,-0.05945 -2.20598,1.312132 -3.625,2.34375 -1.17095,0.851276 -3.13738,1.216335 -3.46875,2.21875 -0.20075,1.023057 4.06755,8.359491 5.75,12.84375 l -2.15625,-2.375 c 0.10491,0.256853 0.21871,0.539212 0.3125,0.78125 l -5.6875,-6.09375 -1.5625,2.46875 c 0,0 5.85601,4.928068 7.96875,8.09375 3.15873,4.732966 4.72206,10.984965 6.8125,16.3125 0.69665,1.775423 1.9375,5.375 1.9375,5.375 0.0136,0.0333 0.0436,0.0612 0.0625,0.0937 5.15396,1.99455 21.95385,2.06679 30.625,0.4375 0,0 0.28096,-0.0589 0.46875,-0.0937 2.38887,-2.955234 1.07784,-8.299647 2.25,-11.96875 3.33416,-10.43658 13.19082,-27.831595 13.18566,-28.71875 0.015,-0.656778 -0.12193,-0.90305 -0.53255,-0.596891 -0.46874,0.349489 -3.067,4.187033 -3.84061,5.221891 0.43931,-1.695215 2.03605,-5.661964 1.96875,-6.4375 -0.1021,-1.176516 -10.44283,-2.551682 -15.8125,-2.90625 C 164.11368,55.160248 148.9535,55.125 153.3437,55.125 z"
+ transform="translate(182.50939,276.31877)"
+ id="path4595"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccccccccccsccccccssccccscscsssc" />
+ <path
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 65.499998,-9.5139876 c -8.954294,0.1483005 -19.248892,-7.3923174 -26.749999,-2.4999994 -5.076694,3.3110851 -4.642742,11.29096509 -5.75,17.2499991 -2.666936,14.3528919 1.541694,29.5875679 -2,43.7499989 -1.880955,7.52151 -8.690055,13.358327 -10,20.999999 -0.537986,3.138385 1.205024,6.322445 1,9.5 -1.621617,25.13261 -27.4347299,50.35742 -17.4999991,73.5 2.356767,5.49 9.7275671,7.45939 15.4999991,9 36.232152,9.67 76.167573,13.51674 109.671571,-3.32843 3.72263,-1.87167 6.85226,-5.88399 7.5,-10 3.42497,-21.7637 -15.53292,-37.86474 -18.67157,-59.67157 -0.5229,-3.633015 0.85173,-7.346439 0.5,-11 C 117.98121,67.403485 114.81009,57.089033 111.5,46.986011 107.73188,35.484991 99.989549,25.329759 97.499997,13.486012 95.64834,4.6769747 99.566229,-4.0905867 92.757356,-9.9784532 84.75125,-16.901605 76.082864,-9.6892604 65.499998,-9.5139876 z"
+ id="path3052"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="ssssssssssssssss" />
+ <path
+ style="fill:#d4dce4;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 147.0625,192.5 c -0.73871,-3.45489 -0.44801,0.45923 -0.5625,0.75 -0.85979,2.18351 -0.69371,4.65399 -0.75,7 -0.0681,2.83741 0.85701,5.68431 0.5,8.5 -0.30829,2.43144 -1.93102,4.56994 -2.25,7 -0.43437,3.30911 0.95216,6.69327 0.5,10 -0.28561,2.08875 -3.38129,4.40736 -2,6 0.61045,0.70385 2.03342,0.0954 2.75,-0.5 1.44032,-1.19684 1.38252,-3.48204 2,-5.25 0.63436,-1.81631 0.88874,-3.77965 1.75,-5.5 0.12034,-0.24038 0.46875,-0.65625 0.46875,-0.65625 1.15929,-1.623 -0.96051,-3.86367 -1.25,-5.875 -0.5229,-3.63302 0.85173,-7.34644 0.5,-11 -0.33823,-3.51328 -0.91725,-7.01249 -1.65625,-10.46875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4493"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssssssssssss" />
+ <path
+ style="color:#000000;fill:#d4dce4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.5;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 73.21875,111.375 -6.03125,12 -1.8125,9 c -0.05069,0.0311 -0.123971,0.0429 -0.15625,0.0937 -3.217071,5.06524 -0.05161,16.19117 -0.125,24.03125 -0.06555,7.00168 -0.778248,11.54518 -1.25,18.53125 -0.284296,4.21008 -2.571865,7.76236 -2.90625,11.96875 -0.224526,2.82442 1.461451,6.07267 0,8.5 -1.653622,2.74651 -5.629723,1.38193 -6.375,4.5 -0.806233,3.37309 2.651005,5.25506 3.875,8.5 1.656427,4.39136 -1.635981,9.05524 -2.5625,13.65625 -1.089735,5.41154 -6.7124,9.1321 -8,14.5 -1.166917,4.86478 3.172961,10.77116 0.5,15 -2.233343,3.53333 -7.23705,4.10521 -9.71875,7.46875 -3.584189,4.85778 -4.010612,14.2576 -1.1875,19.59375 2.998417,5.6675 9.610859,6.15012 15.75,8 12.988819,3.9139 30.909319,6.1819 44.46875,6.59375 8.83555,0.26837 17.77189,0.39966 26.5,-1 11.30233,-1.81247 28.33838,-2.14268 33.53125,-12.34375 0.88498,-1.73849 -0.41033,-4.36929 -2,-5.5 -9.37221,-6.66629 -23.02025,0.20218 -34.5,-0.5 -6.19103,-0.37869 -15.10802,3.19295 -18.5,-2 -1.81603,-2.78025 1.78638,-6.4089 3,-9.5 1.28056,-3.26159 3.09866,-6.28845 4.5,-9.5 1.07684,-2.46787 4.11884,-5.05088 3,-7.5 -1.90545,-4.17098 -15.88288,0.26948 -19,-3.09375 -2.225867,-2.40161 -2.45002,-6.2259 -2.5,-9.5 -0.06787,-4.4467 3.211056,-8.55779 3,-13 -0.275138,-5.79098 -4.148285,-10.86227 -5.5,-16.5 -1.571752,-6.55546 -3.251345,-13.26344 -3,-20 0.140197,-3.75756 0.05789,-8.1408 2.5,-11 1.165829,-1.36494 3.880454,-0.59685 5,-2 3.080313,-3.86063 8.35791,-10.43849 9.375,-15.90625 0.17918,-0.10793 0.36621,-0.18814 0.53125,-0.28125 0.64357,-0.36308 0.86019,-0.90717 1.59911,-0.90717 0.73892,0 1.00766,1.14797 1.6875,1.4375 0.96315,0.4102 2.08251,0.4081 3.125,0.3125 0.66969,-0.0614 1.83335,0.10189 1.9375,-0.5625 0.32304,-2.06077 -5.0993,-1.41593 -5.1875,-3.5 -0.0407,-0.96222 1.61516,-1.08828 2.25,-1.8125 0.73954,-0.84366 0.9189,-1.2375 1.75,-1.99112 2.8439,-2.57878 6.69652,-2.18423 9.84467,-4.38128 1.52232,-1.06241 2.939,-2.35169 4,-3.875 0.88498,-1.27058 2.49372,-6.28293 2.49372,-6.28293 l 0.125,-1.5625 0.5,-3.6875 c 0,0 -1.6367,0.47858 -3.96875,1.28125 1.21308,-2.99791 1.40107,-6.69849 -0.125,-9.375 -1.04422,-1.83141 -3.78012,-3.80531 -5.65625,-2.84375 -0.57763,0.29605 -0.76986,1.1252 -0.6875,1.875 L 105.5,113.625 c -3.24171,0.86482 -6.636536,1.78339 -10.28125,1.84375 -6.031125,0.0999 -12.672166,-3.27202 -18.65625,-4 z m 44.53125,8.0625 c 0.53888,0.46039 1.66092,0.29448 2.09375,0.90625 0.68597,0.96955 0.80866,2.40305 0.4375,3.53125 -1.28301,3.89986 -5.20831,6.41134 -8.46875,8.90625 -1.8308,1.40094 -4.01857,3.52714 -5.4375,2.25 -0.0112,-0.0101 -0.0202,-0.0208 -0.0313,-0.0313 -0.11355,-0.1749 -0.18744,-0.39723 -0.25,-0.65625 -0.282,-1.16765 1.06806,-2.38194 0.71875,-3.53125 -0.3877,-1.2756 -3.15148,-1.51529 -2.84375,-2.8125 0.88732,-3.74045 6.88312,-3.83211 10.25,-5.6875 1.23941,-0.683 2.74347,-2.1156 3.53125,-2.875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path3990"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccsssssssssssssssssssssssssssscsscsscssssccccssccscccssscccsssc" />
+ <path
+ sodipodi:nodetypes="ssssssssssssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4515"
+ d="m 65.499998,-9.5139876 c -8.954294,0.1483005 -19.248892,-7.3923174 -26.749999,-2.4999994 -5.076694,3.3110851 -4.642742,11.29096509 -5.75,17.2499991 -2.666936,14.3528919 1.541694,29.5875679 -2,43.7499989 -1.880955,7.52151 -8.690055,13.358327 -10,20.999999 -0.537986,3.138385 1.205024,6.322445 1,9.5 -1.621617,25.13261 -27.4347299,50.35742 -17.4999991,73.5 2.356767,5.49 9.7275671,7.45939 15.4999991,9 36.232152,9.67 76.167573,13.51674 109.671571,-3.32843 3.72263,-1.87167 6.85226,-5.88399 7.5,-10 3.42497,-21.7637 -15.53292,-37.86474 -18.67157,-59.67157 -0.5229,-3.633015 0.85173,-7.346439 0.5,-11 C 117.98121,67.403485 114.81009,57.089033 111.5,46.986011 107.73188,35.484991 99.989549,25.329759 97.499997,13.486012 95.64834,4.6769747 99.566229,-4.0905867 92.757356,-9.9784532 84.75125,-16.901605 76.082864,-9.6892604 65.499998,-9.5139876 z"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#272759;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:#d4dce4;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 103.625,175.73691 c 0,0 -2.29065,0.98649 -3.3125,1.6875 -0.90024,0.61758 -1.942833,1.21429 -2.4375,2.1875 -0.65469,1.28804 -0.429955,2.86764 -0.4375,4.3125 -0.006,1.15054 0.174494,2.29525 0.3125,3.4375 0.133941,1.10861 -0.256876,2.49146 0.5,3.3125 0.493216,0.53503 1.465797,0.19184 2.125,0.5 0.94365,0.44114 1.50312,1.57284 2.5,1.875 1.81706,0.55076 3.92384,0.39074 5.6875,-0.3125 1.34546,-0.53649 2.54345,-1.58504 3.3125,-2.8125 0.35413,-0.56522 0.21107,-1.33634 0.5,-1.9375 0.45124,-0.93886 1.72011,-1.46991 1.875,-2.5 0.21068,-1.40107 -0.56107,-2.88678 -1.4375,-4 -1.75858,-2.2337 -4.73195,-3.15278 -7.125,-4.6875 -0.49632,-0.31831 -1.5,-0.9375 -1.5,-0.9375"
+ id="path4453"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="sssssssssssssss" />
+ <path
+ style="fill:#d4dce4;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 109.75,212.23691 c -2.41487,-0.37958 -4.77871,1.77364 -6.375,3.625 -0.90446,1.04898 -0.93967,2.60834 -1.5,3.875 -0.30154,0.68164 -0.99482,1.25466 -1,2 -0.009,1.34174 0.90491,2.5828 1.75,3.625 0.72963,0.89981 1.75946,1.52429 2.75,2.125 1.0202,0.6187 2.07523,1.29138 3.25,1.5 1.5229,0.27044 3.17672,0.168 4.625,-0.375 1.11585,-0.41836 2.05303,-1.26216 2.875,-2.125 0.62173,-0.65265 1.18569,-1.40519 1.5,-2.25 0.35141,-0.94453 0.68128,-2.03989 0.375,-3 -1.23683,-3.87721 -4.22966,-8.36807 -8.25,-9 z"
+ id="path4455"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ssssssssssss" />
+ <path
+ style="color:#000000;fill:#d4dce4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 116.25,82.236008 c -1.74043,-1.513524 -6.40687,5.996226 -10.25,8 -3.01514,1.572071 -7.427194,0.874871 -9.75,3 -3.443086,3.150069 9.48005,1.160979 14,0 1.84232,-0.473211 3.93497,-1.174005 5,-2.75 1.55105,-2.295182 3.09029,-6.432228 1,-8.25 z"
+ id="path3999"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="ssssss" />
+ <path
+ style="fill:#c7d2dd;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 63,286.48691 c -4.503164,-0.73076 -9.705824,0.28313 -13.5,-2.25 -3.269182,-2.18262 -8.104791,-6.53429 -6.25,-10 1.337509,-2.49916 6.788612,2.00962 8.5,-0.25 1.244679,-1.6434 -2.570574,-4.23822 -1.5,-6 0.934187,-1.53734 3.463352,-1.04024 5.25,-1.25 1.407003,-0.16519 3.53364,1.2222 4.25,0 1.207409,-2.05999 -2.253486,-4.21344 -3.5,-6.25 -0.470564,-0.76881 -1.710059,-1.37343 -1.5,-2.25 0.713006,-2.97535 5.94994,-2.2288 8,-4.5 1.400383,-1.55145 3.943355,-4.23845 2.5,-5.75 -1.293283,-1.35439 -3.662768,2.9938 -5.25,2 -2.410781,-1.50944 -1.578877,-5.77911 -0.75,-8.5 0.811622,-2.66425 5.428409,-3.72059 5.25,-6.5 -0.1699,-2.64686 -6.113341,-2.8727 -5.75,-5.5 0.413659,-2.99114 6.717836,-1.51612 8,-4.25 0.867458,-1.84963 -1.153264,-3.95935 -1.25,-6 -0.03573,-0.75377 0.02677,-1.52916 0.25,-2.25 0.419069,-1.35326 1.781222,-2.35033 2,-3.75 0.143883,-0.92052 0.145899,-2.07853 -0.5,-2.75 -1.065243,-1.10741 -3.153016,-0.26058 -4.5,-1 -0.723163,-0.39698 -1.949639,-0.94956 -1.75,-1.75 0.759134,-3.04368 5.874021,-3.01179 9,-2.75 0.928445,0.0778 1.612317,1.53298 2.5,1.25 1.349745,-0.43027 2.307318,-2.36707 2,-3.75 -0.632714,-2.84721 -5.241301,-2.92322 -7,-5.25 -0.699881,-0.92595 -1.542154,-2.12667 -1.25,-3.25 0.655294,-2.5196 5.145845,-2.54069 6,-5 1.061726,-3.05695 -1.201022,-6.3641 -2,-9.5 -0.429613,-1.68618 -2.614301,-3.66355 -1.5,-5 1.449731,-1.73876 4.722325,-0.25674 6.75,0.75 2.059029,1.02231 5.363272,2.78446 4.75,5 -0.415311,1.50038 -4.14367,-0.26547 -4.5,1.25 -0.513226,2.18275 4.653941,2.28459 5,4.5 0.178673,1.14383 -1.059087,2.07107 -1.75,3 -1.020435,1.37198 -2.959508,2.12782 -3.5,3.75 -0.980332,2.94228 0.186927,6.25718 1,9.25 0.479156,1.76371 1.053892,3.61812 2.25,5 0.711087,0.82153 1.920624,1.04808 2.75,1.75 0.855788,0.72427 2.46827,1.40032 2.25,2.5 -0.413629,2.08394 -4.890243,0.80714 -5.75,2.75 -1.056217,2.38682 0.446593,5.61315 2.25,7.5 1.220064,1.27652 4.768137,-5.1e-4 5,1.75 0.25191,1.90187 -3.172472,2.15823 -4.75,3.25 -0.836435,0.57888 -2.242158,0.76601 -2.5,1.75 -0.585766,2.23543 1.006637,5.08091 3,6.25 1.152364,0.67585 2.898349,-1.0057 4,-0.25 1.369219,0.93925 2.405952,3.35853 1.5,4.75 -0.823468,1.26478 -3.452084,-0.58612 -4.5,0.5 -2.32096,2.40557 -0.694485,6.65777 -0.75,10 -0.03324,2.00146 -1.324113,4.76343 0.25,6 2.339013,1.83745 7.388957,-4.39477 8.75,-1.75 1.672591,3.25016 -7.28314,3.9157 -8,7.5 -0.35843,1.79215 2.005957,3.18872 2.25,5 0.360397,2.67485 -1.041039,5.30908 -1.25,8 -0.07742,0.997 -0.633989,2.22666 0,3 1.616361,1.97164 5.942251,-0.51827 7.5,1.5 0.867079,1.12342 -1.262465,3.25561 -0.25,4.25 4.65111,4.56806 13.91113,-4.85627 19.5,-1.5 1.24767,0.74926 0.92956,2.79794 1.75,4 0.66437,0.9734 1.3521,2.23314 2.5,2.5 3.77326,0.87721 7.20997,-4.55161 11,-3.75 1.44241,0.30508 1.91176,2.38135 3.25,3 2.51445,1.16239 7.77722,-1.72948 8.25,1 0.54065,3.12129 -5.45039,3.39292 -8.5,4.25 -5.71629,1.60653 -11.81612,1.71459 -17.75,1.5 -16.019015,-0.5793 -31.677495,-4.93236 -47.5,-7.5 z"
+ id="path3864"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss" />
+ <path
+ style="fill:#c7d2dd;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 65.584154,134.03344 c -1.109323,0.43933 -1.654938,2.24103 -1.237437,3.35875 0.470636,1.25997 2.623971,0.95557 3.535534,1.94455 1.269193,1.37699 2.305909,3.25385 2.298097,5.12652 -0.0065,1.55567 -2.547113,2.8084 -1.944544,4.24264 0.606447,1.44347 3.539894,0.29568 4.419418,1.59099 1.026675,1.51203 0.961222,4.04996 -0.176777,5.48008 -1.290443,1.6217 -5.008509,-0.22321 -6.010407,1.59099 -0.477521,0.86468 0.426789,1.95278 0.883883,2.82843 1.37993,2.64351 5.253347,4.09769 5.480078,7.07106 0.09226,1.20984 -0.7745,2.4851 -1.767767,3.18199 -1.514678,1.06271 -4.787425,-0.83188 -5.480078,0.88388 -0.441172,1.09282 1.539417,1.8036 2.12132,2.82843 1.226489,2.16006 3.154783,4.43185 2.828428,6.89429 -0.331367,2.50026 -4.126623,3.53238 -4.596195,6.0104 -0.319475,1.68594 0.544014,3.47083 1.414214,4.94975 0.549388,0.93369 1.897083,1.29172 2.298097,2.2981 0.80735,2.02611 1.340789,4.97423 -0.176777,6.54074 -1.39642,1.44145 -4.829358,-1.26907 -6.010407,0.35355 -0.967228,1.32886 0.379876,3.37084 1.237437,4.77297 1.110659,1.81595 4.051553,2.23994 4.77297,4.24264 1.838664,5.10425 -0.632218,10.98387 -2.474873,16.08668 -0.933582,2.58534 -4.743304,4.36831 -4.242641,7.07107 0.313466,1.6922 2.406407,3.63806 4.065864,3.18198 5.180797,-1.42387 4.485129,-9.8251 5.833631,-15.02602 1.298848,-5.00941 1.916979,-10.20855 2.12132,-15.37957 0.200436,-5.0722 -2.00346,-10.25165 -0.883883,-15.2028 0.593296,-2.62376 3.30892,-4.44438 3.889087,-7.07107 0.560484,-2.53758 -0.44189,-5.18093 -0.53033,-7.77817 -0.0742,-2.17898 -1.474368,-4.93459 0,-6.54074 1.399786,-1.5249 5.612328,1.4582 6.187184,-0.53033 0.677496,-2.34359 -5.066337,-2.10368 -5.833631,-4.41942 -0.59826,-1.80558 -0.05429,-4.52556 1.590991,-5.48007 1.520554,-0.88215 3.532432,1.97848 5.126524,1.23743 1.07534,-0.49989 2.002418,-2.06979 1.59099,-3.18198 -0.842929,-2.27865 -7.198433,-0.44693 -6.717514,-2.82842 0.5832,-2.88798 6.533139,1.83421 8.838834,0 0.615237,-0.48943 0.904914,-1.60691 0.53033,-2.2981 -1.225746,-2.26177 -7.121844,-0.0822 -7.247844,-2.65165 -0.08649,-1.76368 3.226444,-1.44586 4.772971,-2.2981 0.973743,-0.5366 1.718405,-1.70482 2.828427,-1.76777 2.868277,-0.16266 5.995917,1.45908 7.778174,3.71231 1.383819,1.7495 -0.550272,5.4841 1.414214,6.54074 1.002259,0.53909 2.518744,-0.31263 3.181984,-1.23743 1.54689,-2.15692 1.51539,-5.56848 0.35355,-7.95496 -1.33129,-2.73453 -4.815946,-3.73971 -7.424621,-5.3033 -5.696024,-3.41409 -11.266334,-8.00369 -17.854447,-8.83883 -3.405133,-0.43165 -6.672001,2.55972 -10.076271,2.12132 -0.261364,-0.0337 -0.462098,-0.45058 -0.707107,-0.35355 z"
+ id="path3845"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="sssssssssssssssssssssssssssssssssssssssssssssssss" />
+ <path
+ style="fill:#d4dce4;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 106.25,254.48691 c -1.66743,0.87355 -2.26835,3.1517 -2.625,5 -0.3095,1.60394 -0.12945,3.36762 0.5,4.875 0.70717,1.69351 1.83131,3.4861 3.5,4.25 1.62952,0.74597 3.58642,-0.0119 5.375,-0.125 1.21236,-0.0767 2.60484,0.28452 3.625,-0.375 1.25432,-0.81091 1.70239,-2.48539 2.25,-3.875 0.54846,-1.39177 1.54133,-2.98044 1,-4.375 -0.9536,-2.45664 -4.03731,-3.56214 -6.5,-4.5 -2.23617,-0.8516 -5.00542,-1.98543 -7.125,-0.875 z"
+ id="path4457"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ssssssssss" />
+ <path
+ style="color:#000000;fill:#aa0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 90.55386,-8.3452848 c -0.200706,1.3088886 1.942905,2.7865548 1.900349,4.1100581 -0.09576,2.9781373 -1.957593,5.723525 -3.71231,8.1317278 C 84.983766,9.0542263 77.494984,11.114074 74.599764,16.8012 c -0.726238,1.426561 -1.789654,3.784736 -0.530331,4.77297 2.023813,1.588155 4.923914,-1.548292 7.247845,-2.65165 3.96202,-1.881091 8.020071,-3.821299 11.313708,-6.717514 2.584791,-2.2729007 4.701036,-4.3216337 5.745243,-7.6013981 0.751663,-2.360909 0.1664,-5.09050312 -0.353554,-7.5130094 -0.438595,-2.0434504 -0.438529,-4.5938037 -1.679379,-6.2755725 -0.672035,-0.910834 -1.527059,-2.249948 -2.65165,-2.12132 -1.417197,0.162096 -2.921583,1.5510525 -3.137786,2.9610092 z"
+ id="path3093"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="ssssssssssss" />
+ <path
+ style="fill:#c30b0b;fill-opacity:1;stroke:none"
+ d="M 123.03125 113.75 C 121.73526 114.08712 120.47831 115.33986 120.28125 116.625 C 120.08054 117.93389 122.23006 119.4265 122.1875 120.75 C 122.0917 123.72814 120.22347 126.4668 118.46875 128.875 C 115.16673 133.40675 108.97829 135.53342 105.5625 139.84375 L 106.375 142.875 C 106.375 142.875 109.39003 139.19897 111.25 137.75 C 113.32522 136.13334 116.13099 135.59083 118.125 133.875 C 120.33625 131.97223 122.44435 129.78537 123.96875 127.28125 C 125.85418 126.29162 126.37197 128.70813 126.46875 132.53125 L 126.6875 132.53125 C 127.2648 131.64527 127.73957 130.67495 128.09375 129.5625 C 128.84541 127.20159 128.26995 124.48501 127.75 122.0625 C 127.3114 120.01905 127.30335 117.46302 126.0625 115.78125 C 125.87894 115.53246 125.68138 115.27406 125.46875 115 L 125.1875 115.9375 C 124.6266 115.04409 124 114.25 124 114.25 L 123.03125 113.75 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4190" />
+ <path
+ style="fill:#900000;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 128.03125,123.5 c 0,0 -0.36007,4.25358 -1.28125,6.125 -1.18757,2.41259 -3.20677,4.37683 -5.25,6.125 -1.26521,1.0825 -2.786,1.83173 -4.25,2.625 -1.37659,0.74591 -2.88656,1.23031 -4.25,2 -0.39247,0.22156 -0.76753,0.47552 -1.125,0.75 -1.10055,0.84506 -1.89192,2.11372 -3.125,2.75 -1.29332,0.66737 -3.70346,-0.34883 -4.25,1 -0.29732,0.73379 1.28125,2 1.28125,2 1.70056,-0.43386 3.61373,-2.19188 5.25,-2.96875 3.96202,-1.88109 8.01886,-3.82253 11.3125,-6.71875 2.58479,-2.2729 4.70579,-4.34524 5.75,-7.625 0.60771,-1.90878 0.33653,-4.02886 -0.0625,-6.0625 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4316"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cssssssscsssc" />
+ <path
+ sodipodi:nodetypes="ssssssssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4192"
+ d="m 90.55386,-8.3452848 c -0.200706,1.3088886 1.942905,2.7865548 1.900349,4.1100581 -0.09576,2.9781373 -1.957593,5.723525 -3.71231,8.1317278 C 84.983766,9.0542263 77.494984,11.114074 74.599764,16.8012 c -0.726238,1.426561 -1.789654,3.784736 -0.530331,4.77297 2.023813,1.588155 4.923914,-1.548292 7.247845,-2.65165 3.96202,-1.881091 8.020071,-3.821299 11.313708,-6.717514 2.584791,-2.2729007 4.701036,-4.3216337 5.745243,-7.6013981 0.751663,-2.360909 0.1664,-5.09050312 -0.353554,-7.5130094 -0.438595,-2.0434504 -0.438529,-4.5938037 -1.679379,-6.2755725 -0.672035,-0.910834 -1.527059,-2.249948 -2.65165,-2.12132 -1.417197,0.162096 -2.921583,1.5510525 -3.137786,2.9610092 z"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="fill:#aa0000;stroke:none"
+ d="m 40.811368,-14.884722 c -2.237145,-0.286337 -5.01082,1.193655 -6.290739,3.0507 -2.020273,2.9312296 -3.952178,9.3489536 -3.218592,12.83255244 0.842739,4.00193526 2.659294,5.66234076 5.997845,8.02449466 7.334995,5.1897929 17.622142,4.0761519 25.809397,7.7781749 2.845666,1.286722 4.836402,5.117448 7.954951,4.949747 1.718507,-0.09241 3.961505,-1.464158 4.065864,-3.181981 0.181916,-2.994479 -4.014848,-4.498038 -6.363961,-6.36396 C 65.450079,9.5710337 61.610105,7.6729794 57.982755,5.4874913 52.667549,2.2850656 45.881664,1.4592377 42.072853,-3.4397316 c -1.053226,-1.3546805 -2.000066,-3.3230957 -1.944544,-5.0381356 0.02834,-0.8755328 1.408213,-1.9692428 1.237437,-2.8284268 -0.325325,-1.63673 1.100868,-3.366569 -0.554378,-3.578428 z"
+ id="path3091"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="sssssssssssss" />
+ <path
+ style="fill:#a00000;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;fill-opacity:1;fill-rule:nonzero"
+ d="M 67.1875 117.125 C 66.99006 117.1271 66.805342 117.16268 66.625 117.25 C 65.2481 117.91665 64.830845 119.7897 64.375 121.25 C 63.838819 122.96766 63.806329 124.82691 63.875 126.625 C 63.94114 128.35679 63.751044 130.33382 64.75 131.75 C 66.902998 134.80222 70.917316 136.01839 74.46875 137.3125 C 74.510758 137.32395 74.551677 137.33244 74.59375 137.34375 C 76.810568 137.93989 79.125761 138.36876 81.4375 138.78125 C 84.643763 139.12751 87.889912 139.37154 90.75 140.75 C 90.925031 140.83436 91.090595 140.96431 91.25 141.125 C 91.259158 141.1284 91.272096 141.12159 91.28125 141.125 C 91.808125 141.32147 92.332047 141.54987 92.84375 141.78125 C 93.212187 141.94785 93.562173 142.16856 93.90625 142.40625 C 93.426054 141.27791 91.148235 139.65704 92 138.75 C 92.658498 138.04877 94.339242 140.49484 94.75 139.625 C 95.470517 138.0992 91.754806 138.00313 90.5 136.875 C 89.662825 136.12234 88.817278 135.28525 88.375 134.25 C 87.921269 133.18794 88.104168 131.91695 88.125 130.71875 C 87.987202 130.63684 87.855979 130.55143 87.71875 130.46875 C 82.403544 127.26632 75.590061 126.43022 71.78125 121.53125 C 71.029419 120.56423 70.348754 119.27709 70.03125 118 C 69.689499 117.88043 69.336725 117.74413 69 117.625 C 68.433312 117.42452 67.779821 117.1187 67.1875 117.125 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4713" />
+ <path
+ style="fill:#900000;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 61.21875,121.03125 c -0.04771,0.24509 -0.08642,0.47698 -0.125,0.71875 l 0.03125,0.375 -0.0625,-0.0625 c -0.208692,1.45422 -0.258891,2.82525 -0.03125,3.90625 0.842739,4.00194 2.661449,5.6691 6,8.03125 7.334995,5.18979 17.625245,4.07923 25.8125,7.78125 2.845666,1.28672 4.818951,5.1052 7.9375,4.9375 0.68551,-0.0369 1.47286,-0.27149 2.15625,-0.65625 0,0 -3.216527,-1.1963 -4.6875,-2.0625 -2.254824,-1.32778 -3.910047,-3.57874 -6.25,-4.75 -6.510103,-3.25861 -14.35824,-3.01889 -21,-6 -2.341129,-1.0508 -4.844502,-2.16429 -6.5,-4.125 -1.807201,-2.14038 -3.25,-7.75 -3.25,-7.75 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4205"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccsssscsssscc" />
+ <path
+ style="fill:#c30b0b;fill-opacity:1;stroke:none"
+ d="m 69.875,110.71875 c -0.532429,-0.0187 -1.038617,0.0459 -1.5,0.15625 -1.461694,0.34947 -1.689595,2.02874 -2.241117,3.42678 -1.07045,2.71345 -1.212064,6.15752 0.125,8.75 1.776306,3.44414 6.132078,4.43336 9.551777,6.25628 4.652383,2.48001 10.18477,2.96733 14.875,5.375 3.732284,1.91592 5.616263,4.77672 9.57951,6.15273 1.18347,0.41089 3.04137,2.83587 3.48483,1.66421 0.65197,-1.72258 -2.88988,-2.28561 -4.375,-3.375 -4.054245,-2.97394 -8.139367,-5.91563 -12.375,-8.625 -1.968593,-1.25923 -4.330193,-2.29832 -6.625,-3.375 -0.107489,-0.0439 -0.205351,-0.11201 -0.3125,-0.15625 -3.158278,-1.30391 -6.18502,-2.74129 -8.28125,-5.4375 -1.053226,-1.35468 -1.993022,-3.31621 -1.9375,-5.03125 0.02834,-0.87553 1.420776,-1.98457 1.25,-2.84375 -0.19793,-0.9958 0.239667,-2.01685 0.25,-2.71875 -0.473776,-0.13033 -0.979324,-0.20159 -1.46875,-0.21875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4183"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csssssssssccssscc" />
+ <g
+ id="g4549"
+ style="color:#000000;fill:#d6cda8;fill-opacity:1;fill-rule:nonzero;stroke:#2a2626;stroke-width:2.1744945;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ transform="matrix(0.83326358,0.38938306,-0.38938306,0.83326358,178.77915,25.740395)" />
+ <path
+ sodipodi:nodetypes="sssssssssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4188"
+ d="m 40.811368,-14.884722 c -2.237145,-0.286337 -5.01082,1.193655 -6.290739,3.0507 -2.020273,2.9312296 -3.952178,9.3489536 -3.218592,12.83255244 0.842739,4.00193526 2.659294,5.66234076 5.997845,8.02449466 7.334995,5.1897929 17.622142,4.0761519 25.809397,7.7781749 2.845666,1.286722 4.836402,5.117448 7.954951,4.949747 1.718507,-0.09241 3.961505,-1.464158 4.065864,-3.181981 0.181916,-2.994479 -4.014848,-4.498038 -6.363961,-6.36396 C 65.450079,9.5710337 61.610105,7.6729794 57.982755,5.4874913 52.667549,2.2850656 45.881664,1.4592377 42.072853,-3.4397316 c -1.053226,-1.3546805 -2.000066,-3.3230957 -1.944544,-5.0381356 0.02834,-0.8755328 1.408213,-1.9692428 1.237437,-2.8284268 -0.325325,-1.63673 1.100868,-3.366569 -0.554378,-3.578428 z"
+ style="fill:none;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 68.589356,-68.758719 c -8.373119,0.487955 -17.410337,2.28914 -24.04163,7.424621 -7.990433,6.188042 -15.570432,15.708722 -15.909902,25.809397 -0.246133,7.323514 6.394128,13.216216 10.253048,19.445436 1.911912,3.086284 3.188484,7.0790337 6.363961,8.8388347 11.053175,6.1255007 25.758798,6.2132439 37.830212,2.4748736 6.013092,-1.8621817 11.902958,-6.1044913 14.849242,-11.6672613 3.981083,-7.51653 3.484103,-17.125093 1.767767,-25.455844 -1.765547,-8.56962 -4.998127,-18.115576 -12.020815,-23.334523 -5.194748,-3.860503 -12.630683,-3.91207 -19.091883,-3.535534 z"
+ id="path3071"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="ssssssssss" />
+ <path
+ style="color:#000000;fill:#d4dce4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 76.78125,-68.75 c -16.894915,0.71382 -34.234605,10.223464 -45.375,22.9375 -1.605576,3.281005 -2.662194,6.738827 -2.78125,10.28125 -0.134492,4.001701 1.81831,7.56437 4.21875,11 1.580404,0.377723 3.115906,0.846797 4.28125,1.75 2.778899,2.153794 4.909543,5.110389 6.71875,8.125 1.11494,1.857782 1.126749,4.298977 2.46875,6 1.380538,1.749869 3.192525,3.3237813 5.28125,4.15625 1.668342,0.6649237 3.448608,1.1119311 5.25,1.375 3.497206,0.5107195 7.175616,0.1113316 10.6875,-0.21875 4.263506,-0.4007263 9.084763,-0.2878708 13.5625,-0.875 0.01994,-0.00261 0.04309,0.00524 0.0625,0 0.646312,-0.1746097 1.309771,-0.3197848 1.9375,-0.53125 8.771388,-2.9548481 -2.26253,-6.567214 -3.6875,-6.53125 -8.818656,0.222571 -14.366543,-0.219014 -16.75,-4.09375 -1.528778,-2.485302 -5.785117,-11.407794 -5.125,-14.25 2.018643,-8.69149 33.963651,-24.353605 31.5625,-34.1875 -0.03873,-0.125957 -0.07594,-0.253938 -0.125,-0.375 -0.0061,-0.0053 -0.02518,0.0053 -0.03125,0 -0.404224,-0.35293 -0.817579,-0.709894 -1.25,-1.03125 -3.062328,-2.275784 -6.913798,-3.210191 -10.875,-3.53125 -0.01029,-8.34e-4 -0.02096,8.26e-4 -0.03125,0 z"
+ transform="translate(212.23005,401.7896)"
+ id="path3968"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccscsssssssssssscccscc" />
+ <path
+ style="fill:#d4dce4;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 127.625 77.75 C 127.625 77.75 128.5978 86.324546 128.5 90.625 C 128.38272 95.781758 128.69545 101.22285 126.75 106 C 125.23799 109.71282 121.56202 112.14022 119.375 115.5 C 119.03938 116.01559 118.5 117.125 118.5 117.125 L 118.96875 117.40625 C 122.59087 115.1979 125.74358 112.14249 127.65625 108.53125 C 131.63733 101.01472 131.15384 91.424501 129.4375 83.09375 C 129.08211 81.368776 128.61821 79.604588 128.125 77.84375 L 127.625 77.75 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4755" />
+ <path
+ transform="matrix(0.51188471,0,0,0.51828281,272.30589,398.62447)"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ sodipodi:ry="6.5407376"
+ sodipodi:rx="6.5407376"
+ sodipodi:cy="-40.474449"
+ sodipodi:cx="57.275646"
+ id="path3963"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2.91220379;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ style="color:#000000;fill:#d4dce4;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 66.114484,-30.751735 c -1.749391,0.956727 -2.385688,3.209394 -3.358757,4.949748 -2.239527,4.00544 -7.328042,8.277252 -5.656855,12.551145 0.932665,2.385197 4.629272,3.7776426 7.071068,3.005204 2.447606,-0.774277 2.260225,-4.715924 4.065864,-6.540738 3.24234,-3.276771 9.553237,-3.328171 11.667262,-7.424621 1.055284,-2.044875 1.335433,-5.331452 -0.353553,-6.894291 -3.288176,-3.042588 -9.504527,-1.796005 -13.435029,0.353553 z"
+ id="path4007"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="ssssssss" />
+ <path
+ style="color:#000000;fill:#b0becc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 110.25,120.23691 c -4.20564,-2.66678 -9.60298,-0.29652 -12.75,-0.25 -6.199561,-0.78748 -13.197505,-3.6045 -18.25,-1.25 -1.70264,1.05589 -3.748343,-1.83519 -5.75,-1.75 -0.448358,0.0191 -1.159769,0.0604 -1.25,0.5 -0.28435,1.38533 1.858421,2.16526 3,3 2.196284,1.60596 4.618225,3.05968 7.25,3.75 4.516843,1.18477 9.376237,1.15297 14,0.5 4.77516,-0.67435 11.7624,-0.1061 13.75,-4.5 z"
+ id="path4306"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="cccsssssc" />
+ <path
+ sodipodi:nodetypes="ssssssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4085"
+ d="m 68.589356,-68.758719 c -8.373119,0.487955 -17.410337,2.28914 -24.04163,7.424621 -7.990433,6.188042 -15.570432,15.708722 -15.909902,25.809397 -0.246133,7.323514 6.394128,13.216216 10.253048,19.445436 1.911912,3.086284 3.188484,7.0790337 6.363961,8.8388347 11.053175,6.1255007 25.758798,6.2132439 37.830212,2.4748736 6.013092,-1.8621817 11.902958,-6.1044913 14.849242,-11.6672613 3.981083,-7.51653 3.484103,-17.125093 1.767767,-25.455844 -1.765547,-8.56962 -4.998127,-18.115576 -12.020815,-23.334523 -5.194748,-3.860503 -12.630683,-3.91207 -19.091883,-3.535534 z"
+ style="color:#000000;fill:none;stroke:#272759;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#b0becc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 96.625,97.861908 c -1.325373,1.028409 -1.595576,3.233412 -1.25,4.875002 0.305641,1.45189 1.268283,3.42316 2.75,3.5 2.58606,0.13411 5.4291,-1.83757 6.8125,-3.75 1.14883,-1.58815 1.41872,-3.209841 0.0625,-4.625002 -1.93159,-2.015532 -6.169429,-1.71139 -8.375,0 z"
+ id="path4287"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ssssss" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2.91220379;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3961"
+ sodipodi:cx="57.275646"
+ sodipodi:cy="-40.474449"
+ sodipodi:rx="6.5407376"
+ sodipodi:ry="6.5407376"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ transform="matrix(0.51188471,0,0,0.51828281,265.05589,405.37447)" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ transform="matrix(0.48437471,0,0,0.48437471,243.03747,295.60731)"
+ id="path4247" />
+ <path
+ style="fill:#ff6600;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 73.249998,-36.263987 c -2.459777,0.259905 -5.361056,1.69179 -6.25,4 -1.024423,2.659992 0.393259,6.087244 2.25,8.25 3.207713,3.736386 8.896137,4.252303 13.5,6 5.149633,1.95488 10.745192,2.699525 15.749999,5 3.740173,1.719181 6.479273,5.6178472 10.500003,6.4999994 1.54369,0.3386878 2.59952,-0.7217847 1.5,-2.25 -1.45901,-2.0278614 -5.45959,-4.7224184 -8.23483,-6.7222714 -5.111493,-3.68336 -10.560559,-6.337135 -15.265172,-10.527728 -2.772413,-2.469503 -4.644441,-5.965246 -7.75,-8 -1.786661,-1.170616 -3.875824,-2.474444 -6,-2.25 z"
+ id="path3079"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="sssssssssss" />
+ <path
+ style="color:#000000;fill:#b0becc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 115.75,61.986908 c 0,0 -2.56878,3.905776 -4.25,5.5 -4.99851,4.739856 -12.138098,6.125884 -16,11.75 -1.008421,1.46857 0.864907,3.692583 0,5.25 -1.908431,3.436463 -7.086684,3.879398 -11,4.25 -1.85509,0.175682 -3.354377,1.923001 -4.875,3 -4.673472,3.310041 -10.318328,1.728497 -14.875,1.875 -3.009997,0.09677 -7.5,-3.875 -7.5,-3.875 0,0 19.244218,-18.427598 31.25,-23.5 8.468347,-3.577848 27.25,-4.25 27.25,-4.25 z"
+ id="path4251"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="csssssscsc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.37881243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3081"
+ sodipodi:cx="57.275646"
+ sodipodi:cy="-40.474449"
+ sodipodi:rx="6.5407376"
+ sodipodi:ry="6.5407376"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ transform="matrix(1.0811569,0,0,1.0946704,208.20046,406.32844)" />
+ <path
+ transform="matrix(1.0811569,0,0,1.0946704,235.60085,405.091)"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ sodipodi:ry="6.5407376"
+ sodipodi:rx="6.5407376"
+ sodipodi:cy="-40.474449"
+ sodipodi:cx="57.275646"
+ id="path3085"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.37881243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ style="color:#000000;fill:#aa0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 71.241006,22.988384 c -0.178454,2.74844 -0.276161,4.507598 -0.707106,6.717514 -0.774602,3.972212 -3.104327,8.518098 -3.358758,11.667262 -0.127772,1.581466 4.11713,2.889366 4.419418,1.767766 1.065144,-3.95208 1.178118,-8.111306 1.414213,-12.197591 0.146153,-2.529581 0.413158,-5.199963 0,-7.601398 -0.10189,-0.592224 -1.728831,-0.953216 -1.767767,-0.353553 z"
+ id="path3099"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="sssssss" />
+ <path
+ style="color:#000000;fill:#c30b0b;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 75.660424,23.518714 c 1.097529,0.360746 2.126408,1.051898 3.270368,1.325825 1.351549,0.323635 2.72974,0.261935 4.154253,0.353553 1.003553,0.06454 0.731777,2.873324 -0.265165,3.005204 -1.933661,0.255793 -3.338466,-0.287068 -4.772971,-1.06066 -1.228711,-0.662612 -2.307714,-1.787611 -3.005204,-2.916816 -0.164588,-0.26646 0.321186,-0.804902 0.618719,-0.707106 z"
+ id="path3101"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="sssssss" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ transform="translate(163.65844,179.08395)"
+ id="path4239" />
+ <path
+ style="fill:#4d4d4d;stroke:#1a1a1a;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.835045,-76.269126 c -7.190636,-7.312709 -33.950146,1.642875 -48.004833,9.985281 -11.082713,6.578339 -27.63676,21.71499 -25.04163,29.458891 3.479808,10.38379 34.092686,-5.665621 48.547726,-14.377416 10.006629,-6.030817 32.170784,-17.264462 24.498737,-25.066756 z"
+ id="path3898"
+ inkscape:connector-curvature="0"
+ transform="translate(217.48005,402.0396)"
+ sodipodi:nodetypes="sasas" />
+ <path
+ style="fill:#666666;stroke:none"
+ d="M 112.25,46.25 C 101.03152,46.074759 83.868977,53.461981 73.327962,59.718786 62.245249,66.297125 45.15487,80.662349 47.75,88.40625 c 3.479808,10.38379 34.10746,-5.663205 48.5625,-14.375 10.00663,-6.030817 32.17205,-17.291456 24.5,-25.09375 -1.79766,-1.828177 -4.82301,-2.629086 -8.5625,-2.6875 z m -2.90625,0.96875 c 4.28443,-0.137706 7.7496,0.62242 9.71875,2.625 C 126.53267,57.440737 104.96207,68.377876 95.21875,74.25 81.144075,82.732556 51.325741,98.360554 47.9375,88.25 45.410657,80.70987 62.036876,66.749025 72.827962,60.343786 82.663952,54.505461 98.39464,47.570667 109.34375,47.21875 z"
+ transform="matrix(0.97000354,0,0,0.95995614,185.05584,279.20747)"
+ id="path4160"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssssssssss" />
+ <path
+ transform="matrix(0.51188471,0,0,0.51828281,237.18089,403.24947)"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ sodipodi:ry="6.5407376"
+ sodipodi:rx="6.5407376"
+ sodipodi:cy="-40.474449"
+ sodipodi:cx="57.275646"
+ id="path3955"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2.91220379;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2.91220379;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3957"
+ sodipodi:cx="57.275646"
+ sodipodi:cy="-40.474449"
+ sodipodi:rx="6.5407376"
+ sodipodi:ry="6.5407376"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ transform="matrix(0.51188471,0,0,0.51828281,246.18089,407.62447)" />
+ <path
+ transform="matrix(0.51188471,0,0,0.51828281,256.30589,407.24947)"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ sodipodi:ry="6.5407376"
+ sodipodi:rx="6.5407376"
+ sodipodi:cy="-40.474449"
+ sodipodi:cx="57.275646"
+ id="path3959"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:2.91220379;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ style="fill:#333333;stroke:none"
+ d="M 100.3125,60.59375 64.875,72.6875 l -16.125,10 c -0.07303,0.842798 -0.214264,2.811002 0.02903,3.536993 2.388804,7.128219 17.220684,1.709234 31.177697,-5.150889 0.1875,-0.103734 0.407911,-0.345476 0.75,-0.6875 l 4.855774,-4.854854 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4129"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccscscc" />
+ <path
+ style="fill:#333333;stroke:#000000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 45.5625,-107.46875 c -7.822112,-0.12219 -19.443142,5.63023 -26.792893,9.992799 -7.727451,4.586765 -19.9540684,14.013995 -18.144607,19.413451 0.32376567,0.966121 0.9804687,1.571789 1.90625,1.9375 1.8466362,1.434148 11.63376,9.122138 16.46875,14.875 2.730832,3.249252 6.363885,9.562693 7.84375,12.125 0.01925,0.233638 0.272079,0.661132 0.34375,0.875 1.8752,5.595619 18.366714,-3.055386 26.15625,-7.75 5.392375,-3.249888 17.145562,-9.160422 13.1875,-13.53125 -0.124349,-0.137317 -0.336917,-0.552535 -0.4375,-0.71875 -6.289007,-9.408763 -11.429095,-19.62295 -13.5625,-32 0.29184,-1.17145 0.02153,-2.27363 -1,-3.3125 -1.253423,-1.2747 -3.361379,-1.86552 -5.96875,-1.90625 z"
+ transform="translate(218.10505,401.5396)"
+ id="path3971"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssscscsssccss" />
+ <path
+ style="fill:#282828;fill-opacity:1;stroke:none"
+ d="m 43,45.861908 c 9.960043,10.036245 17.401498,20.387313 24.75,30.75 l 11.5,-4.125 c -7.515752,-12.75315 -14.150791,-25.330158 -20,-37.75 z"
+ id="path4165"
+ inkscape:connector-curvature="0"
+ transform="translate(181.75939,276.69377)"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#4d4d4d;fill-opacity:1;stroke:none"
+ d="m 86.34375,20 -7.5,7.1875 5.125,11.5625 4.5,9.46875 7,10.5 3,4.0625 c 0.0067,-0.005 0.02457,0.005 0.03125,0 3.41609,-2.546027 5.71295,-5.288055 3.625,-7.59375 -0.12435,-0.137317 -0.33692,-0.552535 -0.4375,-0.71875 -6.289007,-9.408763 -11.429095,-19.62295 -13.5625,-32 0.0105,-0.04214 0.02222,-0.08303 0.03125,-0.125 L 86.34375,20 z"
+ transform="translate(181.09515,277.17233)"
+ id="path4148"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#4d4d4d;stroke:#000000;stroke-width:0.71710014;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 85.835045,-76.269126 c -7.190636,-7.312709 -32.628828,2.799522 -46.356867,10.745881 -11.306131,6.544456 -29.284726,20.95439 -26.689596,28.698291 3.479808,10.38379 31.158996,-8.249912 44.998261,-16.152148 10.553548,-6.026088 35.720249,-15.48973 28.048202,-23.292024 z"
+ id="path3967"
+ inkscape:connector-curvature="0"
+ transform="matrix(0.69725269,0,0,0.69725269,209.79975,349.14251)"
+ sodipodi:nodetypes="sasas" />
+ <path
+ transform="matrix(1.0811569,0,0,1.0946704,226.70046,504.07844)"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ sodipodi:ry="6.5407376"
+ sodipodi:rx="6.5407376"
+ sodipodi:cy="-40.474449"
+ sodipodi:cx="57.275646"
+ id="path3936"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.37881243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ sodipodi:type="arc"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.37881243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ id="path3938"
+ sodipodi:cx="57.275646"
+ sodipodi:cy="-40.474449"
+ sodipodi:rx="6.5407376"
+ sodipodi:ry="6.5407376"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ transform="matrix(1.0811569,0,0,1.0946704,231.20046,540.57844)" />
+ <path
+ transform="matrix(1.0811569,0,0,1.0946704,233.20046,580.57844)"
+ d="m 63.816384,-40.474449 c 0,3.612349 -2.928388,6.540737 -6.540738,6.540737 -3.612349,0 -6.540737,-2.928388 -6.540737,-6.540737 0,-3.61235 2.928388,-6.540738 6.540737,-6.540738 3.61235,0 6.540738,2.928388 6.540738,6.540738 z"
+ sodipodi:ry="6.5407376"
+ sodipodi:rx="6.5407376"
+ sodipodi:cy="-40.474449"
+ sodipodi:cx="57.275646"
+ id="path3940"
+ style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#1a1a1a;stroke-width:1.37881243;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ sodipodi:type="arc" />
+ <path
+ style="color:#000000;fill:#b0becc;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 73.59375 161.90625 C 72.852921 161.90625 72.049157 162.13336 71.46875 162.59375 C 70.718558 163.18881 70.336355 164.16598 70 165.0625 C 69.831525 165.51155 69.612423 166.00929 69.75 166.46875 C 69.769243 166.53301 69.815467 166.5952 69.84375 166.65625 C 68.831559 168.2596 68.185941 169.74332 67.34375 171.5 C 67.062381 172.08689 67.937081 172.7017 68.5 172.375 C 70.729441 171.0811 73.377196 169.36896 74.34375 167.09375 C 74.88915 166.40447 75.754523 165.90648 76 165.0625 C 76.232189 164.2642 76.251877 163.23169 75.71875 162.59375 C 75.243689 162.02529 74.334579 161.90625 73.59375 161.90625 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4431" />
+ <path
+ style="color:#000000;fill:#803300;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 46,54.486008 c -6.094477,-3.491768 -15.701496,-3.266205 -22.5,-7.25 -1.37362,-0.804916 -2.149224,-2.407311 -3.5,-3.25 -0.984777,-0.614359 -2.439817,-0.418841 -3.25,-1.25 -2.778081,-2.850007 -3.703329,-7.281088 -4,-11.25 -0.487294,-6.519099 2.374672,-10.304078 3.75,-19.25 C 17.118877,8.2104777 11.771968,6.445776 11.5,9.7360082 10.712096,19.267964 11.169885,23.112997 9,24.236008 c -1.4235915,0.736771 -3.2326064,1.266683 -4.75,0.75 -4.14116972,-1.410097 -8.2523258,-7.950291 -14.5,-14.75 -1.512887,-1.6465637 -5.910109,3.153137 -3,6 4.6285975,4.528003 10.720147,9.19514 15,14.75 1.230154,1.596628 1.4794867,3.926921 3,5.25 1.015623,0.883748 2.7864923,0.559706 3.75,1.5 1.3626057,1.329777 1.4934265,3.502832 2.25,5.25 0.578317,1.335517 0.747608,2.944886 1.75,4 1.155088,1.215842 2.941315,1.631129 4.5,2.25 9.139626,3.62886 18.846442,8.086521 28.25,8.5 1.540173,0.06772 2.385245,-2.313104 0.75,-3.25 z"
+ id="path4042"
+ inkscape:connector-curvature="0"
+ transform="translate(210.23005,385.2896)"
+ sodipodi:nodetypes="sssssssssssssssssss" />
+ <path
+ style="color:#000000;fill:#6c2b00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 39.40625 117.5 C 39.317299 117.70767 39.241756 117.94043 39.21875 118.21875 C 38.870822 122.42794 38.758142 125.47215 38.5625 127.71875 C 38.975022 125.68154 39.055584 122.39589 39.40625 117.5 z M 44.125 121.25 C 42.959338 126.67515 41.396059 130.15178 40.9375 134.15625 C 41.712586 130.52861 43.191098 126.93363 44.125 121.25 z M 13.59375 121.65625 C 13.364301 122.69038 13.539183 123.80939 14.46875 124.71875 C 19.097347 129.24675 25.188897 133.91389 29.46875 139.46875 C 30.698904 141.06538 30.948237 143.39567 32.46875 144.71875 C 33.484373 145.6025 35.255242 145.27846 36.21875 146.21875 C 37.581356 147.54853 37.712176 149.72158 38.46875 151.46875 C 39.047067 152.80427 39.216358 154.41364 40.21875 155.46875 C 41.373838 156.68459 43.160065 157.09988 44.71875 157.71875 C 53.858376 161.34761 63.565192 165.80527 72.96875 166.21875 C 73.714219 166.25153 74.282644 165.70435 74.5 165.03125 C 74.470979 165.03167 74.435778 165.03255 74.40625 165.03125 C 64.69494 164.60424 54.68874 159.99762 45.25 156.25 C 43.640304 155.61088 41.786641 155.16188 40.59375 153.90625 C 39.558553 152.81661 39.378494 151.16047 38.78125 149.78125 C 37.999916 147.9769 37.87595 145.7483 36.46875 144.375 C 35.473709 143.40393 33.642611 143.72517 32.59375 142.8125 C 31.023475 141.44612 30.770413 139.05513 29.5 137.40625 C 25.080079 131.66959 18.780079 126.83244 14 122.15625 C 13.834747 121.99459 13.715119 121.82866 13.59375 121.65625 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4488" />
+ <path
+ style="fill:#9e4100;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 16.78125 118.375 C 14.965865 118.22955 11.922405 122.22774 14.46875 124.71875 C 14.582254 124.82979 14.697285 124.95128 14.8125 125.0625 C 14.7343 124.78944 14.697322 124.51 14.6875 124.21875 C 14.64706 123.01975 15.526333 123.21546 16.5 122 C 16.989437 121.38902 17.743473 121.9662 18.34375 122.46875 C 20.064281 123.90906 20.646585 126.43848 22.34375 127.90625 C 24.928535 130.14166 26.491902 131.26611 29.6875 134.65625 C 30.582195 135.60541 32.11707 136.07351 33.40625 135.875 C 34.844947 135.65347 36.329334 134.63502 36.9375 133.3125 C 37.075625 133.01213 37.155127 132.70089 37.1875 132.375 C 37.043813 132.50377 36.895053 132.62751 36.71875 132.71875 C 35.295158 133.45552 33.486144 133.98543 31.96875 133.46875 C 27.82758 132.05865 23.716424 125.51846 17.46875 118.71875 C 17.279639 118.51293 17.040591 118.39578 16.78125 118.375 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4409" />
+ <path
+ style="color:#000000;fill:#9e4100;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 41.09375,116.5 c -0.920162,-0.0394 -1.705692,0.4654 -1.84375,1.625 0.129595,0.36885 0.289195,0.73701 0.53125,1.0625 0.697749,0.93825 1.792733,0.7064 2.15625,2 0.705931,2.51211 -0.398508,7.31467 -1.25,9.78125 -0.880523,2.55067 -3.242104,3.38321 -3.5625,6.0625 -0.27215,2.27583 1.971814,4.27558 2.125,6.5625 0.04403,0.65733 -0.39621,1.28079 -0.34375,1.9375 0.169192,2.11784 0.522288,4.57017 2.09375,6 1.617331,1.47156 4.097726,0.22849 5.5,1.90625 0.568093,0.6797 0.518278,1.64479 1.0625,2.34375 1.522601,1.95552 4.401721,2.11382 6.75,2.90625 3.549197,1.19769 3.925607,2.09577 8.210405,2.60761 0.315083,0.0376 0.3729,-0.55768 0.375,-0.875 0.0017,-0.25738 -0.02856,-0.52675 -0.09375,-0.78125 -4.839587,-1.11142 -7.399811,-1.46743 -11.585405,-3.92011 -1.37362,-0.80492 -2.149224,-2.40731 -3.5,-3.25 -0.984777,-0.61436 -2.439817,-0.41884 -3.25,-1.25 -2.778081,-2.85001 -3.703329,-7.28109 -4,-11.25 -0.487294,-6.5191 2.374672,-10.30408 3.75,-19.25 0.386798,-2.51596 -1.546518,-4.15122 -3.125,-4.21875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4404"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="scsssssssssssccssssss" />
+ <path
+ style="fill:#2d1650;stroke:#000000;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 96.3125,46.34375 c -1.543178,3.951225 -10.181498,8.446981 -14.625,11.125 -6.439526,3.880988 -18.490639,10.318898 -24.40625,10.125 1.61154,2.549211 3.090915,5.088291 3.90625,6.5 0.01925,0.233638 0.272079,0.661132 0.34375,0.875 1.8752,5.595619 18.366714,-3.055386 26.15625,-7.75 5.392375,-3.249888 17.14556,-9.160422 13.1875,-13.53125 -0.12435,-0.137317 -0.33692,-0.552535 -0.4375,-0.71875 -1.445193,-2.162103 -2.823691,-4.361361 -4.125,-6.625 z"
+ transform="translate(183.75939,278.31877)"
+ id="path4080"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccssscc" />
+ <path
+ style="fill:#d45500;stroke:none"
+ d="m 97,92.1875 c -0.09422,0.171374 -0.210975,0.348777 -0.28125,0.53125 -1.024423,2.659992 0.393259,6.087244 2.25,8.25 3.20771,3.73639 8.89614,4.2523 13.5,6 5.14963,1.95488 10.68269,2.82452 15.6875,5.125 3.74017,1.71918 6.54177,5.49285 10.5625,6.375 0.84321,0.185 1.53218,-0.0644 1.8125,-0.5625 -0.14474,-0.0142 -0.28279,-0.0213 -0.4375,-0.0625 -4.1607,-1.10895 -6.85893,-4.93564 -10.6875,-6.90625 -5.12309,-2.63691 -10.30323,-4.3425 -15.59375,-6.625 C 109.08268,102.27191 103.17828,101.4601 100,97.40625 98.8192,95.900155 97.225803,94.179461 97,92.1875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4114"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csssssccsssc" />
+ <path
+ id="path4249"
+ transform="matrix(0.48437471,0,0,0.48437471,250.24196,289.07697)"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#ff7f2a;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="M 103.75 88.6875 C 103.48609 88.671042 103.23427 88.690695 102.96875 88.71875 C 101.48796 88.875213 99.859193 89.464829 98.59375 90.40625 C 98.902964 90.323289 99.228824 90.267691 99.53125 90.21875 C 101.75482 89.858916 104.01945 91.090051 105.96875 92.21875 C 109.35701 94.180644 111.53099 97.748473 114.59375 100.1875 C 119.79106 104.32638 125.68501 106.82511 131.28125 110.40625 C 134.31968 112.3506 138.6896 114.94963 140.34375 117 C 140.47296 117.16016 140.54324 117.31768 140.625 117.46875 C 140.65183 117.11075 140.5627 116.6968 140.21875 116.21875 C 138.75974 114.19089 134.77524 111.49985 132 109.5 C 126.88851 105.81664 121.42336 103.15934 116.71875 98.96875 C 113.94634 96.499247 112.07431 93.003504 108.96875 90.96875 C 107.40542 89.944461 105.59734 88.802705 103.75 88.6875 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4119" />
+ <path
+ style="fill:none;stroke:#aa4400;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 110.125,91.611908 c -4.70034,-3.092931 -8.26946,-0.791066 -9.875,3.5 -0.780742,4.435832 0.0987,8.545142 5.8125,9.000002"
+ id="path4104"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#aa4400;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 115.25,97.736908 c -2.88222,-1.897829 -5.07399,1.085387 -5.4375,4.187502 -0.17707,2.81459 1.21858,5.78464 4.3125,5.5625"
+ id="path4106"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#aa4400;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 119.25,101.11191 c -2.41833,-1.802759 -4.88885,0.0372 -4.5,3.0625 0.40858,2.33994 0.81056,3.99583 3.75,4.3125"
+ id="path4108"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ccc" />
+ <path
+ style="fill:none;stroke:#aa4400;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
+ d="m 130.375,108.61191 c -0.52819,-1.09782 -2.98022,-1.1735 -3.28125,0.0937 -0.33783,1.42217 -0.39338,3.23625 1.15625,3.15625"
+ id="path4110"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="csc" />
+ <path
+ sodipodi:nodetypes="sssssssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4112"
+ d="m 73.249998,-36.263987 c -2.459777,0.259905 -5.361056,1.69179 -6.25,4 -1.024423,2.659992 0.393259,6.087244 2.25,8.25 3.207713,3.736386 8.896137,4.252303 13.5,6 5.149633,1.95488 10.745192,2.699525 15.749999,5 3.740173,1.719181 6.479273,5.6178472 10.500003,6.4999994 1.54369,0.3386878 2.59952,-0.7217847 1.5,-2.25 -1.45901,-2.0278614 -5.45959,-4.7224184 -8.23483,-6.7222714 -5.111493,-3.68336 -10.560559,-6.337135 -15.265172,-10.527728 -2.772413,-2.469503 -4.644441,-5.965246 -7.75,-8 -1.786661,-1.170616 -3.875824,-2.474444 -6,-2.25 z"
+ style="fill:none;stroke:#552200;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
+ <path
+ style="fill:#4d2689;fill-opacity:1;stroke:none"
+ d="m 96.75,49.25 c -1.243013,1.648522 -3.448083,3.328599 -5.84375,4.90625 l 6,9.78125 c 2.701938,-1.835925 5.02881,-3.80607 5.65625,-5.6875 L 96.875,49.4375 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4143"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="cccccc" />
+ <path
+ style="fill:#3e3e3e;fill-opacity:1;stroke:none"
+ d="m 70.512455,25.652317 c -3.526467,1.33718 -7.136781,2.560077 -10.408379,4.436422 -3.087413,1.77071 -5.567675,4.458302 -8.573669,6.363961 -2.047291,1.297887 -5.470253,2.501975 -6.411296,3.43198 -1.642181,1.62292 4.609365,-0.660083 6.764849,-1.487437 3.954191,-1.517764 7.417949,-4.094284 11.048544,-6.275572 4.430223,-2.661711 11.456358,-3.917669 13.091436,-8.307743 0.643835,-1.728653 -3.70063,1.151741 -5.511485,1.838389 z"
+ id="path4153"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="aaasaasa" />
+ <path
+ style="fill:#6e2ec4;fill-opacity:1;stroke:none"
+ d="m 95.9375,50.1875 c -0.512936,0.537769 -1.122532,1.059259 -1.78125,1.59375 l 6.125,9.96875 c 0.7106,-0.657835 1.29662,-1.312778 1.71875,-1.96875 z"
+ transform="translate(182.50939,276.81877)"
+ id="path4155"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ccccc" />
+ <path
+ style="fill:#23113f;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
+ d="M 78.875 61.3125 C 72.998446 64.583926 65.347784 68.284633 60.3125 68.96875 L 64.75 76.75 L 64.96875 78.1875 C 69.083494 78.974602 77.723965 74.97161 84.34375 71.34375 L 78.875 61.3125 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4167" />
+ <path
+ style="fill:#c30b0b;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 102 149.0625 L 101.65625 151.34375 C 101.65625 151.34375 101.13182 156.87003 100.75 159.5 C 100.35248 162.23808 99.099647 165.50731 99.25 168.34375 C 100.22869 168.62954 101.176 168.63146 101.3125 168.125 C 102.37764 164.17292 102.48265 159.99254 102.71875 155.90625 C 102.84483 153.72417 103.05199 151.44111 102.84375 149.3125 C 102.37917 149.16073 102 149.0625 102 149.0625 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4378" />
+ <path
+ sodipodi:nodetypes="sssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4380"
+ d="m 71.241006,22.988384 c -0.178454,2.74844 -0.276161,4.507598 -0.707106,6.717514 -0.774602,3.972212 -3.104327,8.518098 -3.358758,11.667262 -0.127772,1.581466 4.11713,2.889366 4.419418,1.767766 1.065144,-3.95208 1.178118,-8.111306 1.414213,-12.197591 0.146153,-2.529581 0.413158,-5.199963 0,-7.601398 -0.10189,-0.592224 -1.728831,-0.953216 -1.767767,-0.353553 z"
+ style="color:#000000;fill:none;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#aa0000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50000000000000000;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 73.37305,13.960209 c -2.554722,0.569292 -3.97482,4.101716 -4.065864,6.717515 -0.06699,1.924818 0.875309,4.369667 2.640927,5.139087 1.79568,0.782521 4.41542,-0.07585 5.656854,-1.59099 1.500848,-1.831747 1.57808,-4.954683 0.541054,-7.083631 -0.837355,-1.719037 -2.906616,-3.597878 -4.772971,-3.181981 z"
+ id="path3095"
+ inkscape:connector-curvature="0"
+ transform="translate(212.23005,401.7896)"
+ sodipodi:nodetypes="ssssss" />
+ <path
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881242999999998;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 106.125 175.78125 C 103.83008 175.78125 101.79193 176.90979 100.5 178.625 C 101.82789 177.46058 103.54294 176.75 105.4375 176.75 C 109.61916 176.75 113 180.17232 113 184.40625 C 113 184.45909 113.00105 184.50992 113 184.5625 C 113.11602 184.04797 113.1875 183.51888 113.1875 182.96875 C 113.1875 179.01442 110.03052 175.78125 106.125 175.78125 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4227" />
+ <path
+ id="path4233"
+ transform="translate(186.95134,313.26072)"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ transform="translate(188.95134,353.4375)"
+ id="path4235" />
+ <path
+ id="path4237"
+ transform="translate(191.30489,177.79105)"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ id="path4241"
+ transform="matrix(0.48437471,0,0,0.48437471,215.03747,293.81706)"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ transform="matrix(0.48437471,0,0,0.48437471,224.15357,297.99384)"
+ id="path4243" />
+ <path
+ id="path4245"
+ transform="matrix(0.48437471,0,0,0.48437471,234.15357,297.81706)"
+ d="m 106.125,175.78125 c -2.29492,0 -4.33307,1.12854 -5.625,2.84375 1.32789,-1.16442 3.04294,-1.875 4.9375,-1.875 4.18166,0 7.5625,3.42232 7.5625,7.65625 0,0.0528 0.001,0.10367 0,0.15625 0.11602,-0.51453 0.1875,-1.04362 0.1875,-1.59375 0,-3.95433 -3.15698,-7.1875 -7.0625,-7.1875 z"
+ style="color:#000000;fill:#ececec;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.37881243;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ inkscape:connector-curvature="0" />
+ <path
+ style="fill:#c30b0b;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 104.0625 138.90625 L 104.125 139.5 C 104.125 139.5 102.01351 140.57628 102.09375 141.53125 C 102.20874 142.89985 104.69461 142.78234 105.4375 143.9375 C 105.85944 144.5936 105.25772 145.74181 105.875 146.21875 C 106.5246 146.72066 107.53468 146.88925 108.4375 146.71875 C 108.7354 145.16951 108.52314 143.45559 107.875 142.125 C 107.18 140.6982 105.63442 139.14975 104.0625 138.90625 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4351" />
+ <path
+ style="fill:#900000;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="M 102 139.40625 C 100.14036 140.58345 99.108227 143.44461 99.03125 145.65625 C 98.96426 147.58107 99.890632 150.01183 101.65625 150.78125 C 103.45193 151.56377 106.07107 150.70264 107.3125 149.1875 C 108.28822 147.99666 108.67389 146.27937 108.53125 144.625 C 108.23402 144.54792 107.91322 144.5158 107.65625 144.625 C 106.64966 145.05274 107.00205 146.86911 106.15625 147.5625 C 105.32687 148.24243 103.78973 149.22574 103.0625 148.4375 C 102.72111 148.06747 103.79436 147.49302 103.59375 147.03125 C 103.2253 146.18315 101.54511 146.7375 101.03125 145.96875 C 100.60555 145.3319 100.86607 144.40426 101.03125 143.65625 C 101.22737 142.76811 102.1875 141.1875 102.1875 141.1875 L 103.0625 139.78125 C 103.0625 139.78125 102.58397 139.60043 102 139.40625 z "
+ transform="translate(182.50939,276.81877)"
+ id="path4338" />
+ <path
+ sodipodi:nodetypes="ssssss"
+ transform="translate(212.23005,401.7896)"
+ inkscape:connector-curvature="0"
+ id="path4340"
+ d="m 73.37305,13.960209 c -2.554722,0.569292 -3.97482,4.101716 -4.065864,6.717515 -0.06699,1.924818 0.875309,4.369667 2.640927,5.139087 1.79568,0.782521 4.41542,-0.07585 5.656854,-1.59099 1.500848,-1.831747 1.57808,-4.954683 0.541054,-7.083631 -0.837355,-1.719037 -2.906616,-3.597878 -4.772971,-3.181981 z"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#2b0000;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ sodipodi:nodetypes="sssssssssssssssssss"
+ transform="translate(210.23005,385.2896)"
+ inkscape:connector-curvature="0"
+ id="path4402"
+ d="m 46,54.486008 c -6.094477,-3.491768 -15.701496,-3.266205 -22.5,-7.25 -1.37362,-0.804916 -2.149224,-2.407311 -3.5,-3.25 -0.984777,-0.614359 -2.439817,-0.418841 -3.25,-1.25 -2.778081,-2.850007 -3.703329,-7.281088 -4,-11.25 -0.487294,-6.519099 2.374672,-10.304078 3.75,-19.25 C 17.118877,8.2104777 11.771968,6.445776 11.5,9.7360082 10.712096,19.267964 11.169885,23.112997 9,24.236008 c -1.4235915,0.736771 -3.2326064,1.266683 -4.75,0.75 -4.14116972,-1.410097 -8.2523258,-7.950291 -14.5,-14.75 -1.512887,-1.6465637 -5.910109,3.153137 -3,6 4.6285975,4.528003 10.720147,9.19514 15,14.75 1.230154,1.596628 1.4794867,3.926921 3,5.25 1.015623,0.883748 2.7864923,0.559706 3.75,1.5 1.3626057,1.329777 1.4934265,3.502832 2.25,5.25 0.578317,1.335517 0.747608,2.944886 1.75,4 1.155088,1.215842 2.941315,1.631129 4.5,2.25 9.139626,3.62886 18.846442,8.086521 28.25,8.5 1.540173,0.06772 2.385245,-2.313104 0.75,-3.25 z"
+ style="color:#000000;fill:none;fill-opacity:1;fill-rule:nonzero;stroke:#552200;stroke-width:2;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
+ <path
+ style="color:#000000;fill:#c7d2dd;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.50000000000000000;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 123.74369,290.12726 c -6.89291,5.78182 -38.019296,3.5973 -54.624002,0.7071 -8.224661,-1.43157 -16.422126,-1.8353 -19.622213,-9.54594 -1.959775,-4.72209 3.74953,-9.62565 6.717514,-13.78858 2.128577,-2.98556 6.605505,-4.30408 7.778175,-7.77817 1.407245,-4.16903 -2.17952,-8.70066 -1.767767,-13.08148 0.48824,-5.1946 3.885594,-9.74142 4.949747,-14.84924 1.351414,-6.48664 -0.09594,-13.44058 1.767767,-19.79899 2.781096,-9.48827 0.985918,-16.16198 1.767767,-24.21841 0.189204,-1.94962 -1.225205,-5.51273 0.707107,-5.83363 3.743825,-0.62174 4.103481,6.55351 4.949747,10.25305 1.576771,6.89302 -1.864627,14.39241 0,21.2132 0.794141,2.90496 4.739323,4.77003 4.596195,7.77818 -0.152365,3.20227 -5.122047,4.6172 -5.656855,7.77817 -0.883168,5.21994 1.283785,11.07294 4.596194,15.2028 2.707249,3.37536 10.384397,2.13802 11.313709,6.36396 1.124009,5.11131 -7.299013,7.84898 -9.192388,12.72792 -1.115908,2.87552 -2.363677,6.39667 -1.06066,9.19239 3.162078,6.78447 11.84512,9.45693 18.738329,12.37437 7.557524,3.1986 30.329114,0.0293 24.041634,5.3033 z"
+ id="path4517"
+ inkscape:connector-curvature="0"
+ transform="translate(182.50939,276.81877)"
+ sodipodi:nodetypes="ssssssssaaasssssssss" />
+ <path
+ style="color:#000000;fill:#8c6f00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1px;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 157.34375,53.96875 c 0,0 0.97839,1.943666 1.21875,3 1.61066,7.078642 1.27601,14.459224 1.25,21.71875 -0.0165,4.605598 -0.6741,9.211256 -0.875,13.8125 -0.11055,2.532072 -0.1875,7.59375 -0.1875,7.59375 0,0 1.23799,-8.360339 1.59375,-12.5625 0.69657,-8.227719 2.6556,-16.647989 1.0625,-24.75 -0.6257,-3.182115 -4.0625,-8.8125 -4.0625,-8.8125 z M 138.5,57.375 c 0,0 2.76131,8.837287 3.625,13.375 1.81664,9.544299 3.21104,27.109694 3.5,30.875 0.051,0.006 0.10487,-0.005 0.15625,0 0.0447,-1.800674 0.12782,-5.752062 -0.0313,-8.375 -0.58441,-9.636382 -0.62111,-19.535153 -3.5,-28.75 -0.80034,-2.561754 -3.75,-7.125 -3.75,-7.125 z m -6.96875,4.53125 -0.90625,0.71875 c 0,0 3.85757,7.914073 5.5,12 1.39707,3.475549 3.71875,10.625 3.71875,10.625 0,0 -1.83949,-11.908987 -4.25,-17.34375 -0.9807,-2.211092 -4.0625,-6 -4.0625,-6 z m 48.59375,3 c 0,0 -3.40075,4.661433 -4.9375,7.09375 -2.67806,4.238739 -5.8695,8.300117 -7.4375,13.0625 C 166.20943,89.741601 166,99.75 166,99.75 c 0,0 1.29087,-8.510284 2.65625,-12.5625 1.54022,-4.571112 3.94921,-8.820881 6.1875,-13.09375 1.64149,-3.13359 5.28125,-9.1875 5.28125,-9.1875 z M 165.375,70.75 c 0,0 -1.32253,5.735186 -1.875,8.625 -0.91197,4.770233 -1.76705,9.556576 -2.375,14.375 -0.34825,2.760093 -0.50815,5.310336 -0.75,8.25 0.7467,-0.0275 1.48929,-0.0533 2.21875,-0.0937 -0.37589,-2.630718 -0.90721,-5.358292 -0.84375,-8.03125 0.18521,-7.800267 3.625,-23.125 3.625,-23.125 z M 152.25,77 c 0,0 1.07501,10.570298 1.125,15.875 0.0292,3.096483 -0.29148,4.880416 -0.46875,9.1875 0.58227,0.0132 1.15779,0.0264 1.75,0.0313 C 154.71965,99.085914 154.58117,96.751865 154.375,94 153.94804,88.305217 152.25,77 152.25,77 z M 171,89.90625 c -0.0717,-0.06237 -0.49826,0.588765 -0.625,0.84375 -1.31365,2.642802 -1.66449,5.69285 -2,8.625 -0.0746,0.652 -0.31517,1.39774 -0.21875,2.03125 0.76748,-0.0909 1.49891,-0.17194 2.1875,-0.28125 -0.1527,-0.87189 -0.63058,-1.910112 -0.59375,-2.75 0.12363,-2.819881 0.95298,-6.314345 1.25,-8.375 0.006,-0.04026 0.0102,-0.08484 0,-0.09375 z M 138.125,92 c 0,0 1.2181,5.76234 2.0625,8.5625 0.47763,0.17235 1.06466,0.32628 1.71875,0.46875 C 141.16431,98.966258 140.19941,96.559686 139.25,94.375 138.90086,93.571593 138.125,92 138.125,92 z"
+ transform="translate(182.50939,276.19377)"
+ id="path4617"
+ inkscape:connector-curvature="0" />
+ </g>
+</svg>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/Tree.svg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,148 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ id="svg2"
+ version="1.1"
+ inkscape:version="0.48.0 r9654"
+ width="504.5993"
+ height="610.18024"
+ sodipodi:docname="Tree.svg"
+ inkscape:export-filename="/mnt/y/src/hedgewars/share/hedgewars/Data/Themes/Snow/Tree.png"
+ inkscape:export-xdpi="90"
+ inkscape:export-ydpi="90"
+ style="display:inline">
+ <metadata
+ id="metadata8">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs6" />
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1280"
+ inkscape:window-height="948"
+ id="namedview4"
+ showgrid="false"
+ inkscape:zoom="1"
+ inkscape:cx="233.91995"
+ inkscape:cy="372.34274"
+ inkscape:window-x="-4"
+ inkscape:window-y="-3"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="layer2"
+ fit-margin-left="10"
+ fit-margin-top="10"
+ fit-margin-right="10"
+ fit-margin-bottom="10" />
+ <g
+ inkscape:groupmode="layer"
+ id="layer2"
+ inkscape:label="Tree"
+ style="display:inline"
+ transform="translate(-135.98141,-164.8895)">
+ <path
+ transform="matrix(0.65,0,0,0.65,135.7151,164.67243)"
+ style="fill:#5f2e0f;fill-opacity:1;stroke:none;stroke-width:3.07692308;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 296.93853,21.238122 c -0.10072,-5.311671 9.03207,-5.372259 9.26777,-0.06486 13.49414,303.856778 73.5633,646.642128 115.99806,885.664408 3.60199,20.28892 -53.00611,20.54225 -56.73285,0.27588 -43.63546,-237.294 -62.05999,-544.51833 -68.53298,-885.875424 z"
+ id="path2987"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssss" />
+ <path
+ style="fill:#492513;fill-opacity:1;stroke:none;stroke-width:2;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 328.75,178.15625 c -0.009,0.10036 -0.0333,0.20534 -0.0313,0.3125 1.20884,63.74911 3.0856,125.65312 5.78125,185.1875 0.98057,21.65618 2.06705,43.0011 3.28125,64 0.24268,4.19702 0.49751,8.36176 0.75,12.53125 0.25254,4.17177 0.4875,8.32494 0.75,12.46875 0.26294,4.14941 0.5394,8.28533 0.8125,12.40625 0.27272,4.11525 0.56074,8.22609 0.84375,12.3125 0.13259,1.91451 0.27138,3.81064 0.40625,5.71875 0.19709,2.78938 0.39174,5.56815 0.59375,8.34375 0.007,0.10096 -0.007,0.21156 0,0.3125 0.24231,3.32585 0.50054,6.63166 0.75,9.9375 0.25445,3.37047 0.51927,6.74434 0.78125,10.09375 0.1406,1.7983 0.29471,3.61408 0.4375,5.40625 0.4899,6.14617 0.98397,12.23939 1.5,18.3125 0.11742,1.38261 0.22496,2.77747 0.34375,4.15625 0.27869,3.23309 0.55744,6.44442 0.84375,9.65625 0.3479,3.90473 0.70321,7.78332 1.0625,11.65625 0.26951,2.90402 0.53651,5.80158 0.8125,8.6875 0.16004,1.67412 0.33777,3.33202 0.5,5 0.30465,3.13089 0.62504,6.2659 0.9375,9.375 0.38254,3.80804 0.76185,7.60005 1.15625,11.375 0.29169,2.79079 0.57675,5.54 0.875,8.3125 0.23441,2.17993 0.48025,4.36272 0.71875,6.53125 0.22012,2.0007 0.43262,4.00907 0.65625,6 0.1892,1.68496 0.40203,3.35333 0.59375,5.03125 0.71459,6.25157 1.43734,12.44123 2.1875,18.59375 0.42577,3.49203 0.84383,6.9779 1.28125,10.4375 0.51788,4.09733 1.02806,8.16749 1.5625,12.21875 0.0502,0.38005 0.10595,0.7766 0.15625,1.15625 0.53879,4.06788 1.10047,8.10437 1.65625,12.125 0.31864,2.30464 0.64446,4.58604 0.96875,6.875 0.99124,6.9967 1.98647,13.90207 3.03125,20.75 0.52035,3.41062 1.05989,6.84567 1.59375,10.21875 0.50845,3.21248 1.0104,6.38445 1.53125,9.5625 0.0779,0.47557 0.17179,0.96271 0.25,1.4375 0.42143,2.55813 0.85167,5.12074 1.28125,7.65625 0.0789,0.46588 0.13954,0.94114 0.21875,1.40625 1.18299,6.94626 2.41079,13.78957 3.65625,20.5625 2.02114,10.99114 27.97488,12.70897 35.15625,5.3125 -9.60235,0.60717 -20.49606,-2.42536 -21.90625,-9.34375 -1.88506,-9.24804 -3.69434,-18.6444 -5.46875,-28.21875 6.85589,-8.27778 11.83388,-17.22116 11.8125,-24.125 2.62077,1.28045 5.29595,2.49699 8,3.65625 -18.01522,-102.8584 -38.59588,-226.9297 -52.34375,-351.46875 -3.49881,-1.2671 -5.66634,-4.15364 -7.125,-3.96875 -0.53649,0.068 -0.96176,0.55193 -1.34375,1.6875 -0.16723,0.49713 -0.33181,0.97292 -0.5,1.46875 -3.43461,-54.89564 -6.2115,-111.76406 -8.46875,-170.21875 -0.89159,-0.0601 -1.68607,-0.38401 -2.34375,-0.90625 z"
+ id="path3832"
+ inkscape:connector-curvature="0" />
+ <path
+ sodipodi:nodetypes="sssss"
+ inkscape:connector-curvature="0"
+ id="path3876"
+ d="m 296.93853,21.238122 c -0.10072,-5.311671 9.03207,-5.372259 9.26777,-0.06486 13.49414,303.856778 73.5633,646.642128 115.99806,885.664408 3.60199,20.28892 -53.00611,20.54225 -56.73285,0.27588 -43.63546,-237.294 -62.05999,-544.51833 -68.53298,-885.875424 z"
+ style="fill:none;stroke:#180a06;stroke-width:3.07692308;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(0.65,0,0,0.65,135.7151,164.67243)" />
+ <path
+ transform="matrix(1.3149827,-0.00668523,0.00668523,1.3149827,-55.087493,193.79475)"
+ style="fill:#146e00;fill-opacity:1;stroke:#081806;stroke-width:1.5209129;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 319.46875,101 c -1.65606,0.0782 -2.19937,6.76313 -8.28125,7.03125 -5.63851,0.24857 -7.90201,-6.15962 -9.25,-2.21875 -21.2033,61.98832 -52.55447,110.49869 -67.83162,167.89034 -13.03871,48.98251 -61.11487,91.48838 -81.81314,120.02059 -8.56483,11.80647 69.26117,1.88581 102.16668,-22.42281 -12.33302,11.98558 -15.62895,12.2216 -25.55729,23.07898 -13.29736,14.54164 52.95239,-5.54434 76.79879,-22.24443 4.00857,10.22945 -9.50303,33.10275 -1.15621,35.89953 9.15213,3.06662 36.17641,-21.81066 36.2042,-35.79459 34.7051,17.17534 80.22718,20.24539 98.313,13.08265 9.54549,-3.78042 -24.57076,-13.08154 -34.8517,-28.02412 23.67301,9.37386 128.5212,-16.05974 113.26807,-25.3765 -11.84715,-7.23636 -89.44681,-16.99465 -118.1778,-70.08415 C 371.35051,210.19165 351.47407,146.63825 320.875,102.15625 320.29202,101.30877 319.85092,100.98195 319.46875,101 z"
+ id="path3758"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssscscscscssss" />
+ <path
+ inkscape:connector-curvature="0"
+ style="color:#000000;fill:#0f5a00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.07692308;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 320.1875,253.4375 c -0.41562,0.0527 -0.77598,0.29497 -1.125,0.71875 -28.10113,83.5007 -65.32991,155.00303 -96.03125,227.71875 -2.67656,9.91512 -5.41819,19.9752 -8.34375,30.34375 -4.59474,16.28434 -11.82625,31.95787 -20.78125,46.9375 -3.73544,11.59184 -7.20496,23.30124 -10.3125,35.21875 -4.49778,17.24911 -11.12856,34.1062 -19.25,50.5 -11.14372,22.89304 -25.23189,44.8535 -40.4375,65.71875 26.16037,-2.48898 63.80515,-15.60156 76.34375,-23.3125 -3.79291,23.88421 -12.95337,43.67331 -28.03125,63.40625 -29.71284,38.88619 98.85074,-25.07949 147,-62.5 13.45368,20.46403 82.58,81.07804 103.28125,68.15625 11.99874,-7.48966 -6.37185,-36.68384 -14.46875,-53.5625 75.87898,21.94557 144.23115,33.77556 175.3125,23.1875 16.40438,-5.58827 -62.42224,-42.39576 -75.625,-76.21875 16.42909,8.59099 68.93776,15.60128 108.84375,11.03125 C 577.45,640.85996 539.58133,612.482 516.6875,570.6875 481.58149,506.59866 452.58337,433.37473 420.96875,365.625 394.30566,328.19903 367.07149,291.67656 344.4375,257.75 c -1.92265,1.4674 -4.36081,2.5285 -7.59375,2.6875 -8.90971,0.43817 -13.7085,-7.37363 -16.65625,-7 z"
+ id="path3823"
+ transform="matrix(0.65,0,0,0.65,135.89853,164.493)" />
+ <path
+ sodipodi:nodetypes="ssssscscscscssss"
+ inkscape:connector-curvature="0"
+ id="path2988"
+ d="m 298.368,105.37663 c -1.65606,0.0782 -2.19937,6.76313 -8.28125,7.03125 -5.63851,0.24857 -7.90201,-6.15962 -9.25,-2.21875 -21.2033,61.98832 -27.53959,106.2541 -40.86199,164.13075 -11.27715,48.99146 -61.99117,90.60312 -86.79079,117.35287 -9.91654,10.69633 57.8099,2.0478 78.0088,-6.17736 -1.55465,14.24238 -1.09821,19.04964 -9.45032,31.16149 -16.45888,23.8679 57.95776,-9.53109 85.36823,-33.0641 8.5518,11.72055 51.0067,37.42259 62.88298,29.17867 6.88366,-4.7783 -2.61002,-15.69542 -7.88855,-25.44911 45.53312,10.79456 84.09614,9.98902 102.18196,2.82628 9.54549,-3.78042 -33.95083,-16.06524 -42.73992,-35.69785 16.35706,4.63905 109.39285,-7.34896 90.33644,-19.32746 -11.75326,-7.38789 -74.11876,-28.95437 -102.27599,-79.39854 -28.62207,-51.27692 -79.23428,-104.70989 -109.83335,-149.19189 -0.58298,-0.84748 -1.02408,-1.1743 -1.40625,-1.15625 z"
+ style="fill:#146e00;fill-opacity:1;stroke:#081806;stroke-width:1.82285532;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(1.0958756,0.05348031,-0.05348031,1.0958756,29.077562,169.68329)" />
+ <path
+ style="color:#000000;fill:#0f5a00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.07692308;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 330.03125,210.1875 c -2.79849,-0.004 -4.25537,11.23586 -14.53125,11.1875 -4.98231,-0.0234 -8.26162,-3.03017 -10.625,-4.96875 -6.82881,14.5648 -14.15994,29.73844 -21.65625,45.28125 -28.62494,80.85438 -42.42597,146.64324 -65.53125,228.53125 -6.32921,22.43153 -17.65139,43.67897 -31.625,63.59375 19.91615,-1.46051 42.29084,-11.11106 49.19178,-14.40501 -10.5634,31.58846 -50.67448,86.89086 -33.47303,85.87376 49.41912,-2.92209 100.44658,-44.72398 153.49816,-84.79778 15.31145,16.91759 162.33422,77.4232 137.03309,35.92278 -10.22199,-16.76674 -21.05705,-36.97004 -27.89521,-57.30758 10.93648,6.82193 54.82317,12.26228 78.39521,6.90133 -14.54387,-15.44511 -27.67175,-33.08423 -37.625,-53.15625 -3.98608,-8.03845 -8.27364,-16.13878 -12.8125,-24.25 C 476.96716,431.50048 462.1134,413.53112 448.5625,396.125 407.10558,342.87364 375.27491,288.40686 340.96875,225.90625 c -2.98421,-4.59796 -5.87994,-9.1663 -8.65625,-13.65625 -0.91315,-1.47679 -1.63544,-2.06149 -2.28125,-2.0625 z"
+ id="path3803"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="csccsccscsccscscsc"
+ transform="matrix(0.65,0,0,0.65,135.89853,164.493)" />
+ <path
+ sodipodi:nodetypes="ssssscscscsas"
+ inkscape:connector-curvature="0"
+ id="path3827"
+ d="m 294,37.589998 c 1.23808,-3.396201 3.08301,2.217832 7.98,2.1 6.50099,-0.156428 5.8855,-8.910976 8.505,-4.935 25.77956,39.12925 59.33575,84.733602 83.28188,129.724662 23.55723,44.26039 69.93625,81.54297 80.00663,88.15762 16.32783,10.7248 -58.84551,17.44858 -72.95843,13.13926 10.85003,21.27004 41.25256,48.70031 29.65093,52.94224 -18.63072,6.81199 -74.33112,-15.11318 -116.2053,-37.87763 -9.0546,13.6227 -108.49078,66.25587 -94.97001,34.14262 5.46257,-12.97419 7.42341,-21.52116 10.10711,-36.66674 -11.7685,8.19367 -76.35606,9.95928 -65.0931,-1.3465 23.9316,-24.02258 47.90041,-60.84121 66.81104,-94.45012 C 256.93955,136.62507 274.52548,91.010838 294,37.589998 z"
+ style="fill:#146e00;fill-opacity:1;stroke:#081806;stroke-width:2.20576477;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ transform="matrix(-0.89667058,0.13458791,0.13458791,0.89667058,611.4391,214.21042)" />
+ <path
+ style="color:#000000;fill:#0f5a00;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3.07692313;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
+ d="m 311.9375,187.03125 c -0.45977,0.0563 -0.91431,0.5574 -1.4375,1.6875 -27.46069,59.31641 -64.3135,129.16439 -88.03125,196.1875 -2.19825,6.21197 -4.68756,12.4126 -7.40625,18.5 9.23441,-2.30912 19.5091,-7.19983 23.49816,-12.08455 -1.55465,14.24238 -0.86672,21.44123 -8.40441,35.8033 -13.47341,25.67175 46.38444,-10.86252 74.4375,-31.4375 2.2683,12.90795 -7.86004,46.45072 -3.28125,48.25 8.78235,3.4511 36.05234,-29.29285 39.9375,-46.1875 36.98649,19.43247 80.84963,45.61244 92.65625,40.53125 6.46895,-2.78403 -14.08591,-32.24239 -22.875,-51.875 6.40826,1.81746 28.2105,4.89062 47.875,0.25 -2.81705,-3.52702 -5.62443,-7.03829 -8.34375,-10.53125 -45.12677,-57.96528 -78.8238,-117.24493 -116.75,-186.90625 -2.41113,-4.42868 -3.78274,3.71109 -10.5625,4.5625 -7.31287,0.91836 -9.32018,-6.99387 -11.3125,-6.75 z"
+ id="path3774"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssccscscsccssss"
+ transform="matrix(0.65,0,0,0.65,135.89853,164.493)" />
+ <path
+ style="fill:#146e00;fill-opacity:1;stroke:#081806;stroke-width:3.07692313;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 319.46875,101 c -1.65606,0.0782 -2.19937,6.76313 -8.28125,7.03125 -5.63851,0.24857 -7.90201,-6.15962 -9.25,-2.21875 -21.2033,61.98832 -47.80813,109.18658 -67.40625,165.25 -14.83543,42.43898 -53.45622,95.95168 -76.03125,122.34375 -9.48106,11.08416 60.3011,-3.05609 80.5,-11.28125 -1.55465,14.24238 0.19394,16.13793 -7.34375,30.5 -13.47341,25.67175 45.13444,-3.86252 73.1875,-24.4375 2.2683,12.90795 -6.61004,39.45072 -2.03125,41.25 8.78235,3.4511 34.30234,-24.54285 38.1875,-41.4375 36.98649,19.43247 84.76437,42.44107 94.40625,35.78125 5.79467,-4.00249 -11.33591,-26.49239 -20.125,-46.125 16.35706,4.63905 115.11891,-19.959 96.0625,-31.9375 -11.75326,-7.38789 -79.96777,-37.74333 -108.125,-88.1875 -28.62207,-51.27692 -51.74468,-110.893 -82.34375,-155.375 -0.58298,-0.84748 -1.02408,-1.1743 -1.40625,-1.15625 z"
+ id="path3778"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssscscscscssss"
+ transform="matrix(0.65,0,0,0.65,135.89853,164.493)" />
+ <path
+ style="fill:#0f5a00;fill-opacity:1;stroke:none;stroke-width:3.07692308;stroke-miterlimit:4;stroke-dasharray:none"
+ d="m 319.46875,101 c -1.65606,0.0782 -2.19937,6.76313 -8.28125,7.03125 -5.63851,0.24857 -7.90201,-6.15962 -9.25,-2.21875 -21.2033,61.98832 -47.80813,109.18658 -67.40625,165.25 -3.41406,9.76644 -8.08331,20.11989 -13.53125,30.59375 -1.89182,9.79149 -3.53943,15.38615 -7.96875,25.90625 -13.52077,32.11325 82.97665,-29.03355 92.03125,-42.65625 41.87418,22.76445 85.1814,46.68995 122.5,40.375 8.92075,-1.50954 -23.93122,-31.04246 -34.78125,-52.3125 3.84719,1.17472 14.70944,4.99423 24.78125,5.03125 -5.41287,-6.40955 -10.29834,-13.22133 -14.34375,-20.46875 -28.62207,-51.27692 -51.74468,-110.893 -82.34375,-155.375 -0.58298,-0.84748 -1.02408,-1.1743 -1.40625,-1.15625 z"
+ id="path3765"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="sssscscsccsss"
+ transform="matrix(0.65,0,0,0.65,135.89853,165.87186)" />
+ <path
+ transform="matrix(0.65,0,0,0.65,135.7151,164.67243)"
+ style="fill:#146e00;fill-opacity:1;stroke:#081806;stroke-width:3.07692313;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
+ d="m 294,37.589998 c 1.95506,-5.362959 3.08301,2.217832 7.98,2.1 6.50099,-0.156428 4.86541,-10.459312 8.505,-4.935 25.77959,39.129232 53.64887,87.413942 77.595,132.405002 23.55723,44.26039 74.34962,81.85249 84.42,88.46714 16.32783,10.7248 -61.06708,14.12218 -75.18,9.81286 10.46541,18.96235 43.88485,44.66864 32.51397,49.06794 -23.32642,9.0248 -82.35265,-12.61746 -124.22683,-35.38191 -9.0546,13.6227 -103.82696,69.78768 -90.30619,37.67443 5.46257,-12.97419 6.67932,-18.36488 9.36302,-33.51046 -11.7685,8.19367 -71.01105,13.11498 -59.74809,1.8092 23.9316,-24.02258 51.80898,-63.55221 71.24714,-99.3784 C 261.44192,139.12962 274.52551,91.010848 294,37.589998 z"
+ id="path3757"
+ inkscape:connector-curvature="0"
+ sodipodi:nodetypes="ssssscscscsas" />
+ </g>
+</svg>
Binary file share/hedgewars/Data/Themes/Christmas/amSnowball.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/holly.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/holly2.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/horizont.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/icon.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/icon@2x.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/plant2.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/plant3.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/plant4.png has changed
Binary file share/hedgewars/Data/Themes/Christmas/reindeer.png has changed
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Themes/Christmas/theme.cfg Thu Dec 23 11:13:57 2010 -0500
@@ -0,0 +1,26 @@
+9 14 45
+141 151 213
+$54 $5C $9D
+$34 $3C $7D $80
+snow.ogg
+9
+6
+reindeer
+1 90 232 94 12 2 55 60 90 73 80 134 105 64
+tree
+1 238 706 36 9 2 122 355 208 293 164 168 82 154
+plant2
+3 0 85 25 25 2 0 0 170 70 50 70 120 40
+plant3
+3 26 0 48 1 1 25 15 50 60
+plant4
+3 45 4 1 45 1 20 45 20 60
+Snowman
+1 38 283 119 14 1 38 21 124 216
+2
+holly
+4
+holly2
+4
+100
+3 99999999 100 300
Binary file share/hedgewars/Data/Themes/Christmas/tree.png has changed
Binary file share/hedgewars/Data/Themes/Compost/Snowball.png has changed
Binary file share/hedgewars/Data/Themes/Compost/amSnowball.png has changed
Binary file share/hedgewars/Data/Themes/Snow/Snowball.png has changed
Binary file share/hedgewars/Data/Themes/Snow/amSnowball.png has changed
Binary file share/hedgewars/Data/Themes/Underwater/Snowball.png has changed
Binary file share/hedgewars/Data/Themes/Underwater/amSnowball.png has changed
--- a/share/hedgewars/Data/Themes/themes.cfg Tue Dec 14 22:32:47 2010 +0100
+++ b/share/hedgewars/Data/Themes/themes.cfg Thu Dec 23 11:13:57 2010 -0500
@@ -4,6 +4,7 @@
Brick
Castle
Cheese
+Christmas
City
Compost
Desert