# HG changeset patch # User Wuzzy # Date 1538680641 -7200 # Node ID b2cc4e4e380cd58d7aff6b652b014c7d1f582922 # Parent 219c2e58887480d411b1a8cd5d736b87be61b1e8# Parent 2b6702777c8c330d4c88f6c5ebfd55ec4bbf2bfb Merge Racer/TechRacer tie handling diff -r 219c2e588874 -r b2cc4e4e380c .hgignore --- a/.hgignore Wed Sep 05 20:09:32 2018 +0200 +++ b/.hgignore Thu Oct 04 21:17:21 2018 +0200 @@ -44,6 +44,7 @@ *.rej project_files/hwc/*.c project_files/hwc/*.h +project_files/hwc/*.out project_files/Android-build/SDL-android-project/jni/** project_files/Android-build/SDL-android-project/obj project_files/Android-build/SDL-android-project/libs/armeabi* diff -r 219c2e588874 -r b2cc4e4e380c ChangeLog.txt --- a/ChangeLog.txt Wed Sep 05 20:09:32 2018 +0200 +++ b/ChangeLog.txt Thu Oct 04 21:17:21 2018 +0200 @@ -9,7 +9,10 @@ + Increase hedgehog limit to 64 + Campaigns and missions now use the user's chosen custom clan colors + New default brown clan color for better contrast + + Allow to change volume during pause + + Rename chat command “/team” to “/clan” (but “/team” still works) * Functionality of controllers restored + * Fix sine gun dealing damage to attacker if shooting up * Fix crash when 2 or more controllers were connected * Fix hammer and pickhammer not digging correctly at wrap world edge * Fix drill rocket exploding when digging at bounce/wrap world edge @@ -38,9 +41,12 @@ Frontend: + Add setting to disable audio dampening when losing window focus + Rework player rankings: Losing clans are now ranked in the reverse order they died + + Add-ons now support preview images for campaign missions + + Add help button in main menu (link to Hedgewars Wiki) * Fix player rankings on round draw: Clans that died in the same turn now have the same rank * Fix rare crash when aborting video encoding in progress * Fix critical failure to cleanup teams list after rejoining game under certain conditions + * Fix displayed Sudden Death timeout being off by one * Controllers are detected again * Fix failure to shutdown game window properly after player got kicked * No longer allow having schemes with equal names (case-insensitive) @@ -88,12 +94,16 @@ Campaigns and missions: * A Classic Fairytale: Fix clan membership of princess in some missions * A Classic Fairytale, Mission 5: Tribe was not in same clan as Natives, screwing up stats a bit + * A Space Adventure, Hard Flying: Display current flying time next to team bar + A Space Adventure, final mission: Terrain types are easier to distinguish * A Space Adventure, Searching in the Dust: Fix display error when destroying device crate * A Space Adventure, Searching in the Dust: Don't take away control right above the pit near Sandy - * A Space Adeventure: Fix clan membership of PAotH in main Death Planet mission + * A Space Adventure, Hard Flying: Fix incorrect recorded time, was 6 seconds more than reality + * A Space Adventure: Fix clan membership of PAotH in main Death Planet mission + * A Space Adventure, final mission: Don't say "Missed" or "Yes, Sir!" when inappropriate * The Great Escape: Infinite attack mode did not work * Shotgun/Sniper Rifle Target Practicse: Suppress “X remaining” message + * Basic Movement Training: Back jumps should be easier now * Fix resurrection animation appearing at wrong position for some missions and styles Content: @@ -109,8 +119,8 @@ Lua API: * Deprecation: Setting TurnTimeLeft/ReadyTimeLeft directly is deprecated and will become useless in future. Use the setter functions below - + New call: SetTurnTimeLeft(TurnTimeLeft): Set remaining turn time - + New call: SetReadyTimeLeft(ReadyTimeLeft): Set remaining ready time + + New call: SetTurnTimeLeft(newTurnTimeLeft): Set remaining turn time + + New call: SetReadyTimeLeft(newReadyTimeLeft): Set remaining ready time + New call: Retreat(time [, respectGetAwayTimeFactor): Force current turn into retreating mode + New call: GetAmmoTimer(gearUid, ammoType): Returns current set timer for given ammoType and hog gear in ms. Returns nil for non-timerable ammo + New call: EnableSwitchHog(): Enable hog switching diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/campaign.cpp --- a/QTfrontend/campaign.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/campaign.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -137,8 +137,8 @@ missionInfo.realName = m_info->value(scriptPrefix+".name", missionInfo.name).toString(); missionInfo.description = m_info->value(scriptPrefix + ".desc", QObject::tr("No description available")).toString(); - QString image = campfile.value(QString("Mission %1/Script").arg(i)).toString().replace(QString(".lua"),QString(".png")); - missionInfo.image = ":/res/campaign/"+campaignName+"/"+image; + QString image = campfile.value(QString("Mission %1/Script").arg(i)).toString().replace(QString(".lua"),QString("@2x.png")); + missionInfo.image = "physfs://Graphics/Missions/Campaign/"+campaignName+"/"+image; if (!QFile::exists(missionInfo.image)) missionInfo.image = ":/res/CampaignDefault.png"; missionInfoList.append(missionInfo); @@ -159,8 +159,8 @@ missionInfo.realName = m_info->value(scriptPrefix+".name", missionInfo.name).toString(); missionInfo.description = m_info->value(scriptPrefix + ".desc", QObject::tr("No description available")).toString(); - QString image = campfile.value(QString("Mission %1/Script").arg(missionNumber)).toString().replace(QString(".lua"),QString(".png")); - missionInfo.image = ":/res/campaign/"+campaignName+"/"+image; + QString image = campfile.value(QString("Mission %1/Script").arg(missionNumber)).toString().replace(QString(".lua"),QString("@2x.png")); + missionInfo.image = "physfs://Graphics/Missions/Campaign/"+campaignName+"/"+image; if (!QFile::exists(missionInfo.image)) missionInfo.image = ":/res/CampaignDefault.png"; missionInfoList.append(missionInfo); diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/game.cpp --- a/QTfrontend/game.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/game.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -346,6 +346,20 @@ RawSendIPC(buf); } +void HWGame::FromNetWarning(const QString & msg) +{ + QByteArray buf; + HWProto::addStringToBuffer(buf, "s\x00" + msg + "\x20\x20"); + RawSendIPC(buf); +} + +void HWGame::FromNetError(const QString & msg) +{ + QByteArray buf; + HWProto::addStringToBuffer(buf, "s\x05" + msg + "\x20\x20"); + RawSendIPC(buf); +} + void HWGame::onClientRead() { quint8 msglen; diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/game.h --- a/QTfrontend/game.h Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/game.h Thu Oct 04 21:17:21 2018 +0200 @@ -105,6 +105,8 @@ public slots: void FromNet(const QByteArray & msg); void FromNetChat(const QString & msg); + void FromNetWarning(const QString & msg); + void FromNetError(const QString & msg); private: char msgbuf[MAXMSGCHARS]; diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/hedgewars.qrc --- a/QTfrontend/hedgewars.qrc Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/hedgewars.qrc Thu Oct 04 21:17:21 2018 +0200 @@ -35,30 +35,6 @@ res/botlevels/net3.png res/botlevels/net4.png res/botlevels/net5.png - res/campaign/A_Classic_Fairytale/first_blood.png - res/campaign/A_Classic_Fairytale/shadow.png - res/campaign/A_Classic_Fairytale/journey.png - res/campaign/A_Classic_Fairytale/united.png - res/campaign/A_Classic_Fairytale/backstab.png - res/campaign/A_Classic_Fairytale/dragon.png - res/campaign/A_Classic_Fairytale/family.png - res/campaign/A_Classic_Fairytale/queen.png - res/campaign/A_Classic_Fairytale/enemy.png - res/campaign/A_Classic_Fairytale/epil.png - res/campaign/A_Space_Adventure/cosmos.png - res/campaign/A_Space_Adventure/moon01.png - res/campaign/A_Space_Adventure/moon02.png - res/campaign/A_Space_Adventure/ice01.png - res/campaign/A_Space_Adventure/ice02.png - res/campaign/A_Space_Adventure/desert01.png - res/campaign/A_Space_Adventure/desert02.png - res/campaign/A_Space_Adventure/desert03.png - res/campaign/A_Space_Adventure/fruit01.png - res/campaign/A_Space_Adventure/fruit02.png - res/campaign/A_Space_Adventure/fruit03.png - res/campaign/A_Space_Adventure/death01.png - res/campaign/A_Space_Adventure/death02.png - res/campaign/A_Space_Adventure/final.png res/bonus.png res/Hedgehog.png res/net.png @@ -81,6 +57,7 @@ res/audio.png res/camera.png res/Settings.png + res/Help.png res/dropdown.png res/dropdown_disabled.png res/dropdown_selected.png @@ -209,6 +186,7 @@ res/StatsMostSelfDamage.png res/StatsSelfKilled.png res/StatsSkipped.png + res/StatsEverAfter.png res/StatsCustomAchievement.png res/Start.png res/mapRandom.png diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/hwform.cpp --- a/QTfrontend/hwform.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/hwform.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -246,6 +246,7 @@ connect(ui.pageMain->BtnDataDownload, SIGNAL(clicked()), pageSwitchMapper, SLOT(map())); pageSwitchMapper->setMapping(ui.pageMain->BtnDataDownload, ID_PAGE_DATADOWNLOAD); + connect(ui.pageMain->BtnHelp, SIGNAL(clicked()), this, SLOT(GoToHelp())); #ifdef VIDEOREC connect(ui.pageMain->BtnVideos, SIGNAL(clicked()), pageSwitchMapper, SLOT(map())); @@ -641,6 +642,13 @@ GoToPage(ID_PAGE_SCHEME); } +void HWForm::GoToHelp() +{ + // For now just opens the Hedgewars Wiki in external browser. + // TODO: Replace this with an offline help someday (bug 660). + QDesktopServices::openUrl(QUrl("https://hedgewars.org/wiki")); +} + void HWForm::GoToVideos() { GoToPage(ID_PAGE_VIDEOS); @@ -1865,6 +1873,8 @@ connect(game, SIGNAL(SendConsoleCommand(const QString&)), hwnet, SLOT(consoleCommand(const QString&))); connect(game, SIGNAL(SendTeamMessage(const QString &)), hwnet, SLOT(SendTeamMessage(const QString &))); connect(hwnet, SIGNAL(chatStringFromNet(const QString &)), game, SLOT(FromNetChat(const QString &)), Qt::QueuedConnection); + connect(hwnet, SIGNAL(Warning(const QString&)), game, SLOT(FromNetWarning(const QString&)), Qt::QueuedConnection); + connect(hwnet, SIGNAL(Error(const QString&)), game, SLOT(FromNetError(const QString&)), Qt::QueuedConnection); game->StartNet(); } diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/hwform.h --- a/QTfrontend/hwform.h Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/hwform.h Thu Oct 04 21:17:21 2018 +0200 @@ -75,6 +75,7 @@ void GoToSaves(); void GoToDemos(); void GoToNet(); + void GoToHelp(); void GoToEditWeapons(); void GoToNewWeapons(); void GoToWeapons(int index); diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/Help.png Binary file QTfrontend/res/Help.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/StatsEverAfter.png Binary file QTfrontend/res/StatsEverAfter.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/backstab.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/backstab.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/dragon.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/dragon.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/enemy.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/enemy.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/epil.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/epil.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/family.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/family.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/first_blood.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/first_blood.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/journey.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/journey.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/queen.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/queen.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/shadow.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/shadow.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Classic_Fairytale/united.png Binary file QTfrontend/res/campaign/A_Classic_Fairytale/united.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/cosmos.png Binary file QTfrontend/res/campaign/A_Space_Adventure/cosmos.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/death01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/death01.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/death02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/death02.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/desert01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/desert01.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/desert02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/desert02.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/desert03.png Binary file QTfrontend/res/campaign/A_Space_Adventure/desert03.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/final.png Binary file QTfrontend/res/campaign/A_Space_Adventure/final.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/fruit01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/fruit01.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/fruit02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/fruit02.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/fruit03.png Binary file QTfrontend/res/campaign/A_Space_Adventure/fruit03.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/ice01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/ice01.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/ice02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/ice02.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/moon01.png Binary file QTfrontend/res/campaign/A_Space_Adventure/moon01.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/res/campaign/A_Space_Adventure/moon02.png Binary file QTfrontend/res/campaign/A_Space_Adventure/moon02.png has changed diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/page/pagecampaign.cpp --- a/QTfrontend/ui/page/pagecampaign.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/ui/page/pagecampaign.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -46,7 +46,7 @@ infoLayout->setRowStretch(1, 1); // set this as default image first time page is created, this will change in hwform.cpp - btnPreview = formattedButton(":/res/campaign/A_Classic_Fairytale/first_blood.png", true); + btnPreview = formattedButton("physfs://Graphics/Missions/Campaign/A_Classic_Fairytale/first_blood@2x.png", true); btnPreview->setWhatsThis(tr("Start fighting")); infoLayout->setAlignment(btnPreview, Qt::AlignHCenter | Qt::AlignVCenter); diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/page/pagegamestats.cpp --- a/QTfrontend/ui/page/pagegamestats.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/ui/page/pagegamestats.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -401,5 +401,11 @@ scriptPlayerPosition = info.toInt(); break; } + case 'h' : + { + QString message = "

" + PageGameStats::tr("With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after.") + "

"; + AddStatText(message); + break; + } } } diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/page/pagemain.cpp --- a/QTfrontend/ui/page/pagemain.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/ui/page/pagemain.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -113,7 +113,10 @@ BtnVideos->setWhatsThis(tr("Manage videos recorded from game")); #endif - BtnSetup = addButton(":/res/Settings.png", bottomLayout, 2, true, Qt::AlignBottom); + BtnHelp = addButton(":/res/Help.png", bottomLayout, 2, true, Qt::AlignBottom); + BtnHelp->setWhatsThis(tr("Open the Hedgewars online game manual in your web browser")); + + BtnSetup = addButton(":/res/Settings.png", bottomLayout, 3, true, Qt::AlignBottom); BtnSetup->setWhatsThis(tr("Edit game preferences")); return bottomLayout; diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/page/pagemain.h --- a/QTfrontend/ui/page/pagemain.h Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/ui/page/pagemain.h Thu Oct 04 21:17:21 2018 +0200 @@ -40,6 +40,7 @@ QPushButton * BtnInfo; QPushButton * BtnDataDownload; QPushButton * BtnVideos; + QPushButton * BtnHelp; QLabel * mainNote; private: diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/page/pagescheme.cpp --- a/QTfrontend/ui/page/pagescheme.cpp Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/ui/page/pagescheme.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -30,6 +30,7 @@ #include "gameSchemeModel.h" #include "pagescheme.h" #include "FreqSpinBox.h" +#include "SDTimeoutSpinBox.h" #include "MinesTimeSpinBox.h" @@ -251,9 +252,21 @@ l->setWhatsThis(wtSuddenDeath); l->setPixmap(QPixmap(":/res/iconSuddenDeathTime.png")); glBSLayout->addWidget(l,3,1,1,1); - SB_SuddenDeath = new QSpinBox(gbBasicSettings); + /* NOTE: + The internally stored value for Sudden Death Timeout + is defined as + "number of full rounds to play till Sudden Death, minus one" + i.e. value 0 means Sudden Death starts in 2nd round. + The lowest possible internal value is 0. + The user-facing value is different, it's defined as + "number of full rounds to play till Sudden Death" + i.e. the user-facing value 1 is equivalent to internal value 0. + We use SDTimeoutSpinBox for the magic to happen. */ + SB_SuddenDeath = new SDTimeoutSpinBox(gbBasicSettings); SB_SuddenDeath->setWhatsThis(wtSuddenDeath); - SB_SuddenDeath->setRange(0, 50); + // Will display as 1-52 + SB_SuddenDeath->setRange(0, 51); + // Will display as 16 SB_SuddenDeath->setValue(15); SB_SuddenDeath->setSingleStep(3); glBSLayout->addWidget(SB_SuddenDeath,3,2,1,1); diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/page/pagescheme.h --- a/QTfrontend/ui/page/pagescheme.h Wed Sep 05 20:09:32 2018 +0200 +++ b/QTfrontend/ui/page/pagescheme.h Thu Oct 04 21:17:21 2018 +0200 @@ -23,6 +23,7 @@ #include "togglebutton.h" class FreqSpinBox; +class SDTimeoutSpinBox; class MinesTimeSpinBox; class PageScheme : public AbstractPage @@ -80,7 +81,7 @@ QSpinBox * SB_DamageModifier; QSpinBox * SB_TurnTime; QSpinBox * SB_InitHealth; - QSpinBox * SB_SuddenDeath; + SDTimeoutSpinBox * SB_SuddenDeath; QSpinBox * SB_WaterRise; QSpinBox * SB_HealthDecrease; FreqSpinBox * SB_CaseProb; diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/widget/SDTimeoutSpinBox.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/SDTimeoutSpinBox.cpp Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,49 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2015 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @brief SDTimeoutSpinBox class implementation + */ + +#include "SDTimeoutSpinBox.h" + +SDTimeoutSpinBox::SDTimeoutSpinBox(QWidget* parent) : QSpinBox(parent) +{ + // do nothing +}; + + +QString SDTimeoutSpinBox::textFromValue(int internalValue) const +{ + // user-facing value = internal value + 1 + return QString::number(internalValue + 1); +} + +int SDTimeoutSpinBox::valueFromText(const QString & userFacingString) const +{ + // internal value = user-facing value - 1 + bool ok; + int value = userFacingString.toInt(&ok); + + if (ok) + return value - 1; + // Fallback + else + return 15; +} diff -r 219c2e588874 -r b2cc4e4e380c QTfrontend/ui/widget/SDTimeoutSpinBox.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/QTfrontend/ui/widget/SDTimeoutSpinBox.h Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,65 @@ +/* + * Hedgewars, a free turn based strategy game + * Copyright (c) 2004-2015 Andrey Korotaev + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + +/** + * @file + * @brief SDTimeoutSpinBox class definition + */ + +#ifndef HEDGEWARS_SDTIMEOUTSPINBOX_H +#define HEDGEWARS_SDTIMEOUTSPINBOX_H + +#include +#include + +/** + * SpinBox for Sudden Death timeout. + * The internally stored Sudden Death timeout is different + * from the actual number of rounds it takes until SD starts. + * e.g. value 0 means SD starts in 2nd round + * @author Wuzzy + * @since 0.9.25 + */ +class SDTimeoutSpinBox : public QSpinBox +{ + Q_OBJECT + + public: + /** + * @brief Class constructor. + * @param parent parent widget. + */ + SDTimeoutSpinBox(QWidget * parent); + + protected: + /** + * Returns its value in real number of rounds. + * @param internal value integer value to be represented as string. + * @return the real number of rounds + */ + QString textFromValue(int value) const; + /** + * Returns the internally-used value for SD timeout. + * @param user-facing string, i.e. real number of rounds + * @return internally-stored SD timeout value + */ + int valueFromText(const QString & text) const; +}; + + +#endif // HEDGEWARS_SDTIMEOUTSPINBOX_H diff -r 219c2e588874 -r b2cc4e4e380c gameServer/HWProtoCore.hs --- a/gameServer/HWProtoCore.hs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer/HWProtoCore.hs Thu Oct 04 21:17:21 2018 +0200 @@ -65,6 +65,10 @@ else handleCmd_NotEntered cmd +unknownCmdWarningText :: B.ByteString +unknownCmdWarningText = loc "Unknown command or invalid parameters. Say '/help' in chat for a list of commands." + +handleCmd_loggedin ["CMD"] = return [Warning unknownCmdWarningText] handleCmd_loggedin ["CMD", parameters] = uncurry h $ extractParameters parameters where @@ -74,8 +78,6 @@ h "SAVE" n | not $ B.null n = let (sn, ln) = B.break (== ' ') n in if B.null ln then return [] else handleCmd ["SAVE", sn, B.tail ln] h "DELETE" n | not $ B.null n = handleCmd ["DELETE", n] h "STATS" _ = handleCmd ["STATS"] - h "PART" m | not $ B.null m = handleCmd ["PART", m] - | otherwise = handleCmd ["PART"] h "QUIT" m | not $ B.null m = handleCmd ["QUIT", m] | otherwise = handleCmd ["QUIT"] h "RND" p = handleCmd ("RND" : B.words p) @@ -94,8 +96,6 @@ | otherwise = handleCmd ["VOTE", ""] h "FORCE" msg | not $ B.null msg = handleCmd ["VOTE", upperCase msg, "FORCE"] | otherwise = handleCmd ["VOTE", "", "FORCE"] - h "VOTE" msg | not $ B.null msg = handleCmd ["VOTE", upperCase msg] - h "FORCE" msg | not $ B.null msg = handleCmd ["VOTE", upperCase msg, "FORCE"] h "MAXTEAMS" n | not $ B.null n = handleCmd ["MAXTEAMS", n] h "INFO" n | not $ B.null n = handleCmd ["INFO", n] h "HELP" _ = handleCmd ["HELP"] @@ -113,7 +113,7 @@ [ModifyClient (\c -> c{hasSuperPower = True}) , AnswerClients [sendChan cl] ["CHAT", nickServer, loc "Super power activated."] ] - h _ _ = return [Warning $ loc "Unknown command or invalid parameters. Say '/help' in chat for a list of commands." ] + h _ _ = return [Warning unknownCmdWarningText] extractParameters p = let (a, b) = B.break (== ' ') p in (upperCase a, B.dropWhile (== ' ') b) diff -r 219c2e588874 -r b2cc4e4e380c gameServer/HWProtoInRoomState.hs --- a/gameServer/HWProtoInRoomState.hs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer/HWProtoInRoomState.hs Thu Oct 04 21:17:21 2018 +0200 @@ -382,9 +382,9 @@ chans <- roomSameClanChans return [AnswerClients chans ["EM", engineMsg cl]] where - -- FIXME: Use different method to send team message, without hardcoding the format. - -- The formatting should be decided by the engine, not the sever. This one cannot be localized. - engineMsg cl = toEngineMsg $ B.concat ["b", "[Clan] ", nick cl, ": ", msg, "\x20\x20"] + -- This is formatted in a way so it can parsed by engine to make it translatable + -- Format: b] + engineMsg cl = toEngineMsg $ B.concat ["b", nick cl, "]", msg, "\x20\x20"] handleCmd_inRoom ["BAN", banNick] = do diff -r 219c2e588874 -r b2cc4e4e380c gameServer/HWProtoLobbyState.hs --- a/gameServer/HWProtoLobbyState.hs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer/HWProtoLobbyState.hs Thu Oct 04 21:17:21 2018 +0200 @@ -226,4 +226,6 @@ handleCmd_lobby ["STATS"] = serverAdminOnly $ return [Stats] -handleCmd_lobby _ = return [ProtocolError "Incorrect command (state: in lobby)"] +handleCmd_lobby (s:_) = return [ProtocolError $ "Incorrect command '" `B.append` s `B.append` "' (state: in lobby)"] + +handleCmd_lobby [] = return [ProtocolError "Empty command (state: in lobby)"] \ No newline at end of file diff -r 219c2e588874 -r b2cc4e4e380c gameServer/HWProtoNEState.hs --- a/gameServer/HWProtoNEState.hs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer/HWProtoNEState.hs Thu Oct 04 21:17:21 2018 +0200 @@ -101,4 +101,6 @@ parsedProto = readInt_ protoNum #endif -handleCmd_NotEntered _ = return [ProtocolError "Incorrect command (state: not entered)"] +handleCmd_NotEntered (s:_) = return [ProtocolError $ "Incorrect command '" `B.append` s `B.append` "' (state: not entered)"] + +handleCmd_NotEntered [] = return [ProtocolError "Empty command (state: not entered)"] \ No newline at end of file diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/Cargo.toml --- a/gameServer2/Cargo.toml Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/Cargo.toml Thu Oct 04 21:17:21 2018 +0200 @@ -1,22 +1,28 @@ -cargo-features = ["edition"] - [package] edition = "2018" name = "hedgewars-server" version = "0.0.1" authors = [ "Andrey Korotaev " ] +[features] +official-server = ["openssl"] +tls-connections = ["openssl"] +default = [] + [dependencies] rand = "0.5" mio = "0.6" slab = "0.4" netbuf = "0.4" nom = "4.0" -env_logger = "0.4" +env_logger = "0.5" log = "0.4" -proptest = "0.8" base64 = "0.9" bitflags = "1.0" serde = "1.0" -serde_yaml = "0.7" +serde_yaml = "0.8" serde_derive = "1.0" +openssl = { version = "0.10", optional = true } + +[dev-dependencies] +proptest = "0.8" \ No newline at end of file diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/main.rs --- a/gameServer2/src/main.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/main.rs Thu Oct 04 21:17:21 2018 +0200 @@ -1,28 +1,12 @@ #![allow(unused_imports)] #![deny(bare_trait_objects)] -#![feature(rust_2018_preview)] - -extern crate rand; -extern crate mio; -extern crate slab; -extern crate netbuf; -extern crate base64; -#[macro_use] -extern crate nom; -#[macro_use] -extern crate log; -extern crate env_logger; -#[macro_use] extern crate proptest; -#[macro_use] extern crate bitflags; -extern crate serde; -extern crate serde_yaml; -#[macro_use] extern crate serde_derive; //use std::io::*; //use rand::Rng; //use std::cmp::Ordering; use mio::net::*; use mio::*; +use log::*; mod utils; mod server; @@ -32,7 +16,7 @@ use std::time::Duration; fn main() { - env_logger::init().unwrap(); + env_logger::init(); info!("Hedgewars game server, protocol {}", utils::PROTOCOL_VERSION); diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/protocol/messages.rs --- a/gameServer2/src/protocol/messages.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/protocol/messages.rs Thu Oct 04 21:17:21 2018 +0200 @@ -20,7 +20,7 @@ Nick(String), Proto(u16), Password(String, String), - Checker(u32, String, String), + Checker(u16, String, String), // lobby List, Chat(String), @@ -77,6 +77,7 @@ Bye(String), Nick(String), Proto(u16), + ServerAuth(String), LobbyLeft(String, String), LobbyJoined(Vec), ChatMsg {nick: String, msg: String}, @@ -99,10 +100,14 @@ RoundFinished, ServerMessage(String), + Notice(String), Warning(String), Error(String), Connected(u32), Unreachable, + + //Deprecated messages + LegacyReady(bool, Vec) } pub fn server_chat(msg: String) -> HWServerMessage { @@ -122,8 +127,8 @@ Ammo(n, None) => ("AMMO".to_string(), vec![n.to_string()]), Ammo(n, Some(s)) => ("AMMO".to_string(), vec![n.to_string(), s.to_string()]), - Scheme(n, None) => ("SCHEME".to_string(), vec![n.to_string()]), - Scheme(n, Some(s)) => ("SCHEME".to_string(), { + Scheme(n, s) if s.is_empty() => ("SCHEME".to_string(), vec![n.to_string()]), + Scheme(n, s) => ("SCHEME".to_string(), { let mut v = vec![n.to_string()]; v.extend(s.clone().into_iter()); v @@ -151,6 +156,7 @@ }; } +#[cfg(test)] macro_rules! several { [$part: expr] => { once($part) }; [$part: expr, $($other: expr),*] => { once($part).chain(several![$($other),*]) }; @@ -161,6 +167,7 @@ * * This is the inverse of the `message` parser. */ + #[cfg(test)] pub(crate) fn to_raw_protocol(&self) -> String { use self::HWProtocolMessage::*; match self { @@ -265,6 +272,7 @@ Bye(msg) => msg!["BYE", msg], Nick(nick) => msg!["NICK", nick], Proto(proto) => msg!["PROTO", proto], + ServerAuth(hash) => msg!["SERVER_AUTH", hash], LobbyLeft(nick, msg) => msg!["LOBBY:LEFT", nick, msg], LobbyJoined(nicks) => construct_message(&["LOBBY:JOINED"], &nicks), @@ -295,8 +303,13 @@ RoundFinished => msg!["ROUND_FINISHED"], ChatMsg {nick, msg} => msg!["CHAT", nick, msg], ServerMessage(msg) => msg!["SERVER_MESSAGE", msg], + Notice(msg) => msg!["NOTICE", msg], Warning(msg) => msg!["WARNING", msg], Error(msg) => msg!["ERROR", msg], + + LegacyReady(is_ready, nicks) => + construct_message(&[if *is_ready {"READY"} else {"NOT_READY"}], &nicks), + _ => msg!["ERROR", "UNIMPLEMENTED"], } } diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/protocol/mod.rs --- a/gameServer2/src/protocol/mod.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/protocol/mod.rs Thu Oct 04 21:17:21 2018 +0200 @@ -7,6 +7,7 @@ }; pub mod messages; +#[cfg(test)] pub mod test; mod parser; diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/protocol/parser.rs --- a/gameServer2/src/protocol/parser.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/protocol/parser.rs Thu Oct 04 21:17:21 2018 +0200 @@ -14,11 +14,15 @@ ops::Range }; use super::{ - messages::{HWProtocolMessage, HWProtocolMessage::*}, - test::gen_proto_msg + messages::{HWProtocolMessage, HWProtocolMessage::*} +}; +#[cfg(test)] +use { + super::test::gen_proto_msg, + proptest::{proptest, proptest_helper} }; use crate::server::coretypes::{ - HedgehogInfo, TeamInfo, GameCfg, VoteType + HedgehogInfo, TeamInfo, GameCfg, VoteType, MAX_HEDGEHOGS_PER_TEAM }; named!(end_of_message, tag!("\n\n")); @@ -42,7 +46,7 @@ named!(hog_line<&[u8], HedgehogInfo>, do_parse!(name: str_line >> eol >> hat: str_line >> (HedgehogInfo{name: name.to_string(), hat: hat.to_string()}))); -named!(_8_hogs<&[u8], [HedgehogInfo; 8]>, +named!(_8_hogs<&[u8], [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize]>, do_parse!(h1: hog_line >> eol >> h2: hog_line >> eol >> h3: hog_line >> eol >> h4: hog_line >> eol >> h5: hog_line >> eol >> h6: hog_line >> eol >> @@ -131,7 +135,7 @@ s: a_line >> (Password(p, s))) | do_parse!(tag!("CHECKER") >> eol >> - i: u32_line >> eol >> + i: u16_line >> eol >> n: a_line >> eol >> p: a_line >> (Checker(i, n, p))) @@ -196,7 +200,7 @@ | do_parse!(tag!("SCHEME") >> eol >> name: a_line >> values: opt!(preceded!(eol, separated_list!(eol, a_line))) >> - (GameCfg::Scheme(name, values))) + (GameCfg::Scheme(name, values.unwrap_or(Vec::new())))) | do_parse!(tag!("FEATURE_SIZE") >> eol >> value: u32_line >> (GameCfg::FeatureSize(value))) @@ -242,6 +246,7 @@ named!(pub extract_messages<&[u8], Vec >, many0!(complete!(message))); +#[cfg(test)] proptest! { #[test] fn is_parser_composition_idempotent(ref msg in gen_proto_msg()) { diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/protocol/test.rs --- a/gameServer2/src/protocol/test.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/protocol/test.rs Thu Oct 04 21:17:21 2018 +0200 @@ -1,7 +1,7 @@ use proptest::{ test_runner::{TestRunner, Reason}, arbitrary::{any, any_with, Arbitrary, StrategyFor}, - strategy::{Strategy, BoxedStrategy, Just, Map}, + strategy::{Strategy, BoxedStrategy, Just, Map} }; use crate::server::coretypes::{GameCfg, TeamInfo, HedgehogInfo}; @@ -22,9 +22,6 @@ impl Into2> for Option{ fn into2(self) -> Option { self.map(|x| {x.0}) } } -impl Into2>> for Option>{ - fn into2(self) -> Option> { self.map(|x| {x.into2()}) } -} macro_rules! proto_msg_case { ($val: ident()) => @@ -74,7 +71,7 @@ 4 => Seed(Ascii), 5 => Template(u32), 6 => Ammo(Ascii, Option), - 7 => Scheme(Ascii, Option>), + 7 => Scheme(Ascii, Vec), 8 => Script(Ascii), 9 => Theme(Ascii), 10 => DrawnMap(Ascii)) @@ -120,7 +117,7 @@ 9 => Nick(Ascii), 10 => Proto(u16), 11 => Password(Ascii, Ascii), - 12 => Checker(u32, Ascii, Ascii), + 12 => Checker(u16, Ascii, Ascii), 13 => List(), 14 => Chat(Ascii), 15 => CreateRoom(Ascii, Option), diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/actions.rs --- a/gameServer2/src/server/actions.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/actions.rs Thu Oct 04 21:17:21 2018 +0200 @@ -143,12 +143,25 @@ }, ReactProtocolMessage(msg) => handlers::handle(server, client_id, msg), - CheckRegistered => - if server.clients[client_id].protocol_number > 0 && server.clients[client_id].nick != "" { - server.react(client_id, vec![ - JoinLobby, - ]); - }, + CheckRegistered => { + let client = &server.clients[client_id]; + if client.protocol_number > 0 && client.nick != "" { + let has_nick_clash = server.clients.iter().any( + |(id, c)| id != client_id && c.nick == client.nick); + + let actions = if !client.is_checker() && has_nick_clash { + if client.protocol_number < 38 { + vec![ByeClient("Nickname is already in use".to_string())] + } else { + server.clients[client_id].nick.clear(); + vec![Notice("NickAlreadyInUse".to_string()).send_self().action()] + } + } else { + vec![JoinLobby] + }; + server.react(client_id, actions); + } + }, JoinLobby => { server.clients[client_id].room_id = Some(server.lobby_id); @@ -466,6 +479,9 @@ None => {} } r.master_id = new_id; + if !r.is_fixed() && c.protocol_number < 42 { + r.name.replace_range(.., new_nick.as_ref().map_or("[]", String::as_str)); + } r.set_join_restriction(false); r.set_team_add_restriction(false); let is_fixed = r.is_fixed(); @@ -517,6 +533,8 @@ if !room.has_multiple_clans() { vec![Warn("The game can't be started with less than two clans!".to_string())] + } else if room.protocol_number <= 43 && room.players_number != room.ready_players_number { + vec![Warn("Not all players are ready".to_string())] } else if room.game_info.is_some() { vec![Warn("The game is already in progress".to_string())] } else { @@ -561,17 +579,13 @@ } FinishRoomGame(room_id) => { let mut actions = Vec::new(); - let old_info; - { - let r = &mut server.rooms[room_id]; - old_info = replace(&mut r.game_info, None); - r.game_info = None; - r.ready_players_number = 1; - actions.push(SendRoomUpdate(None)); - actions.push(RoundFinished.send_all().in_room(r.id).action()); - } - if let Some(info) = old_info { + let r = &mut server.rooms[room_id]; + r.ready_players_number = 1; + actions.push(SendRoomUpdate(None)); + actions.push(RoundFinished.send_all().in_room(r.id).action()); + + if let Some(info) = replace(&mut r.game_info, None) { for (_, c) in server.clients.iter() { if c.room_id == Some(room_id) && c.is_joined_mid_game() { actions.push(SendRoomData{ @@ -596,9 +610,14 @@ } else { None }).collect(); + if !nicks.is_empty() { - actions.push(ClientFlags("-r".to_string(), nicks) - .send_all().in_room(room_id).action()); + let msg = if r.protocol_number < 38 { + LegacyReady(false, nicks) + } else { + ClientFlags("-r".to_string(), nicks) + }; + actions.push(msg.send_all().in_room(room_id).action()); } server.react(client_id, actions); } diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/client.rs --- a/gameServer2/src/server/client.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/client.rs Thu Oct 04 21:17:21 2018 +0200 @@ -1,4 +1,5 @@ use super::coretypes::ClientId; +use bitflags::*; bitflags!{ pub struct ClientFlags: u8 { @@ -7,6 +8,7 @@ const IS_READY = 0b0000_0100; const IS_IN_GAME = 0b0000_1000; const IS_JOINED_MID_GAME = 0b0001_0000; + const IS_CHECKER = 0b0010_0000; const NONE = 0b0000_0000; const DEFAULT = Self::NONE.bits; @@ -17,6 +19,8 @@ pub id: ClientId, pub room_id: Option, pub nick: String, + pub web_password: String, + pub server_salt: String, pub protocol_number: u16, pub flags: ClientFlags, pub teams_in_game: u8, @@ -25,11 +29,13 @@ } impl HWClient { - pub fn new(id: ClientId) -> HWClient { + pub fn new(id: ClientId, salt: String) -> HWClient { HWClient { id, room_id: None, nick: String::new(), + web_password: String::new(), + server_salt: salt, protocol_number: 0, flags: ClientFlags::DEFAULT, teams_in_game: 0, @@ -51,10 +57,12 @@ pub fn is_ready(&self)-> bool { self.contains(ClientFlags::IS_READY) } pub fn is_in_game(&self)-> bool { self.contains(ClientFlags::IS_IN_GAME) } pub fn is_joined_mid_game(&self)-> bool { self.contains(ClientFlags::IS_JOINED_MID_GAME) } + pub fn is_checker(&self)-> bool { self.contains(ClientFlags::IS_CHECKER) } pub fn set_is_admin(&mut self, value: bool) { self.set(ClientFlags::IS_ADMIN, value) } pub fn set_is_master(&mut self, value: bool) { self.set(ClientFlags::IS_MASTER, value) } pub fn set_is_ready(&mut self, value: bool) { self.set(ClientFlags::IS_READY, value) } pub fn set_is_in_game(&mut self, value: bool) { self.set(ClientFlags::IS_IN_GAME, value) } pub fn set_is_joined_mid_game(&mut self, value: bool) { self.set(ClientFlags::IS_JOINED_MID_GAME, value) } + pub fn set_is_checker(&mut self, value: bool) { self.set(ClientFlags::IS_CHECKER, value) } } \ No newline at end of file diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/coretypes.rs --- a/gameServer2/src/server/coretypes.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/coretypes.rs Thu Oct 04 21:17:21 2018 +0200 @@ -1,6 +1,8 @@ pub type ClientId = usize; pub type RoomId = usize; +pub const MAX_HEDGEHOGS_PER_TEAM: u8 = 8; + #[derive(PartialEq, Eq, Clone, Debug)] pub enum ServerVar { MOTDNew(String), @@ -18,7 +20,7 @@ Template(u32), Ammo(String, Option), - Scheme(String, Option>), + Scheme(String, Vec), Script(String), Theme(String), DrawnMap(String) @@ -34,7 +36,7 @@ pub flag: String, pub difficulty: u8, pub hedgehogs_number: u8, - pub hedgehogs: [HedgehogInfo; 8], + pub hedgehogs: [HedgehogInfo; MAX_HEDGEHOGS_PER_TEAM as usize], } #[derive(PartialEq, Eq, Clone, Debug)] diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/handlers/checker.rs --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gameServer2/src/server/handlers/checker.rs Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,18 @@ +use mio; +use log::*; + +use crate::{ + server::{ + server::HWServer, + coretypes::ClientId, + }, + protocol::messages::{ + HWProtocolMessage + }, +}; + +pub fn handle(server: & mut HWServer, client_id: ClientId, message: HWProtocolMessage) { + match message { + _ => warn!("Unknown command"), + } +} diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/handlers/common.rs --- a/gameServer2/src/server/handlers/common.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/handlers/common.rs Thu Oct 04 21:17:21 2018 +0200 @@ -23,8 +23,8 @@ #[cfg(test)] mod tests { use super::*; - use protocol::messages::HWServerMessage::ChatMsg; - use server::actions::{ + use crate::protocol::messages::HWServerMessage::ChatMsg; + use crate::server::actions::{ Action::{self, Send}, PendingMessage, }; diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/handlers/inroom.rs --- a/gameServer2/src/server/handlers/inroom.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/handlers/inroom.rs Thu Oct 04 21:17:21 2018 +0200 @@ -2,7 +2,10 @@ use crate::{ server::{ - coretypes::{ClientId, RoomId, Voting, VoteType}, + coretypes::{ + ClientId, RoomId, Voting, VoteType, GameCfg, + MAX_HEDGEHOGS_PER_TEAM + }, server::HWServer, room::{HWRoom, RoomFlags}, actions::{Action, Action::*} @@ -20,6 +23,7 @@ }; use base64::{encode, decode}; use super::common::rnd_reply; +use log::*; #[derive(Clone)] struct ByMsg<'a> { @@ -53,7 +57,8 @@ match msg { [size, typ, body..] => VALID_MESSAGES.contains(typ) && match body { - [1...8, team, ..] if *typ == b'h' => team_indices.contains(team), + [1...MAX_HEDGEHOGS_PER_TEAM, team, ..] if *typ == b'h' => + team_indices.contains(team), _ => *typ != b'h' }, _ => false @@ -164,13 +169,20 @@ r.ready_players_number += 1; "+r" }; - c.set_is_ready(!c.is_ready()); - let mut v = - vec![ClientFlags(flags.to_string(), vec![c.nick.clone()]) - .send_all().in_room(r.id).action()]; + + let msg = if c.protocol_number < 38 { + LegacyReady(c.is_ready(), vec![c.nick.clone()]) + } else { + ClientFlags(flags.to_string(), vec![c.nick.clone()]) + }; + + let mut v = vec![msg.send_all().in_room(r.id).action()]; + if r.is_fixed() && r.ready_players_number == r.players_number { v.push(StartRoomGame(r.id)) } + + c.set_is_ready(!c.is_ready()); server.react(client_id, v); } } @@ -188,7 +200,7 @@ } else if r.is_team_add_restricted() { actions.push(Warn("This room currently does not allow adding new teams.".to_string())); } else { - let team = r.add_team(c.id, *info); + let team = r.add_team(c.id, *info, c.protocol_number < 42); c.teams_in_game += 1; c.clan = Some(team.color); actions.push(TeamAccepted(team.name.clone()) @@ -227,7 +239,7 @@ let actions = if let Some((_, team)) = r.find_team_and_owner_mut(|t| t.name == team_name) { if !c.is_master() { vec![ProtocolError("You're not the room master!".to_string())] - } else if number < 1 || number > 8 + } else if number < 1 || number > MAX_HEDGEHOGS_PER_TEAM || number > addable_hedgehogs + team.hedgehogs_number { vec![HedgehogsNumber(team.name.clone(), team.hedgehogs_number) .send_self().action()] @@ -274,6 +286,18 @@ } else if !c.is_master() { vec![ProtocolError("You're not the room master!".to_string())] } else { + let cfg = match cfg { + GameCfg::Scheme(name, mut values) => { + if c.protocol_number == 49 && values.len() >= 2 { + let mut s = "X".repeat(50); + s.push_str(&values.pop().unwrap()); + values.push(s); + } + GameCfg::Scheme(name, values) + } + cfg => cfg + }; + let v = vec![cfg.to_server_msg() .send_all().in_room(r.id).but_self().action()]; r.set_config(cfg); @@ -377,7 +401,7 @@ }, VoteType::HedgehogsPerTeam(number) => { match number { - 1...8 => None, + 1...MAX_HEDGEHOGS_PER_TEAM => None, _ => Some("/callvote hedgehogs: Specify number from 1 to 8.".to_string()) } }, diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/handlers/lobby.rs --- a/gameServer2/src/server/handlers/lobby.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/handlers/lobby.rs Thu Oct 04 21:17:21 2018 +0200 @@ -13,6 +13,7 @@ utils::is_name_illegal }; use super::common::rnd_reply; +use log::*; pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) { use crate::protocol::messages::HWProtocolMessage::*; diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/handlers/loggingin.rs --- a/gameServer2/src/server/handlers/loggingin.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/handlers/loggingin.rs Thu Oct 04 21:17:21 2018 +0200 @@ -2,6 +2,7 @@ use crate::{ server::{ + client::HWClient, server::HWServer, coretypes::ClientId, actions::{Action, Action::*} @@ -11,6 +12,29 @@ }, utils::is_name_illegal }; +#[cfg(feature = "official-server")] +use openssl::sha::sha1; +use std::fmt::{Formatter, LowerHex}; +use log::*; + +#[derive(PartialEq)] +struct Sha1Digest([u8; 20]); + +impl LowerHex for Sha1Digest { + fn fmt(&self, f: &mut Formatter) -> Result<(), std::fmt::Error> { + for byte in &self.0 { + write!(f, "{:02x}", byte)?; + } + Ok(()) + } +} + +#[cfg(feature = "official-server")] +fn get_hash(client: &HWClient, salt1: &str, salt2: &str) -> Sha1Digest { + let s = format!("{}{}{}{}{}", salt1, salt2, + client.web_password, client.protocol_number, "!hedgewars"); + Sha1Digest(sha1(s.as_bytes())) +} pub fn handle(server: & mut HWServer, client_id: ClientId, message: HWProtocolMessage) { match message { @@ -23,7 +47,7 @@ else if !client.nick.is_empty() { vec![ProtocolError("Nickname already provided.".to_string())] } - else if is_name_illegal(&nick) { + else if is_name_illegal(&nick) { vec![ByeClient("Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|}".to_string())] } else { @@ -33,7 +57,7 @@ }; server.react(client_id, actions); - }, + } HWProtocolMessage::Proto(proto) => { let client = &mut server.clients[client_id]; let actions = if client.protocol_number != 0 { @@ -48,7 +72,28 @@ CheckRegistered] }; server.react(client_id, actions); - }, + } + #[cfg(feature = "official-server")] + HWProtocolMessage::Password(hash, salt) => { + let c = &server.clients[client_id]; + + let client_hash = get_hash(c, &salt, &c.server_salt); + let server_hash = get_hash(c, &c.server_salt, &salt); + let actions = if client_hash == server_hash { + vec![ServerAuth(format!("{:x}", server_hash)).send_self().action(), + JoinLobby] + } else { + vec![ByeClient("Authentication failed".to_string())] + }; + server.react(client_id, actions); + } + #[cfg(feature = "official-server")] + HWProtocolMessage::Checker(protocol, nick, password) => { + let c = &mut server.clients[client_id]; + c.nick = nick; + c.web_password = password; + c.set_is_checker(true); + } _ => warn!("Incorrect command in logging-in state"), } } diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/handlers/mod.rs --- a/gameServer2/src/server/handlers/mod.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/handlers/mod.rs Thu Oct 04 21:17:21 2018 +0200 @@ -12,11 +12,13 @@ HWServerMessage::* } }; +use log::*; mod loggingin; mod lobby; mod inroom; mod common; +mod checker; pub fn handle(server: &mut HWServer, client_id: ClientId, message: HWProtocolMessage) { match message { diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/network.rs --- a/gameServer2/src/server/network.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/network.rs Thu Oct 04 21:17:21 2018 +0200 @@ -1,7 +1,7 @@ extern crate slab; use std::{ - io, io::{Error, ErrorKind, Write}, + io, io::{Error, ErrorKind, Read, Write}, net::{SocketAddr, IpAddr, Ipv4Addr}, collections::HashSet, mem::{swap, replace} @@ -13,6 +13,7 @@ }; use netbuf; use slab::Slab; +use log::*; use crate::{ utils, @@ -22,6 +23,15 @@ server::{HWServer}, coretypes::ClientId }; +#[cfg(feature = "tls-connections")] +use openssl::{ + ssl::{ + SslMethod, SslContext, Ssl, SslContextBuilder, + SslVerifyMode, SslFiletype, SslOptions, + SslStreamBuilder, HandshakeError, MidHandshakeSslStream, SslStream + }, + error::ErrorStack +}; const MAX_BYTES_PER_READ: usize = 2048; @@ -35,16 +45,43 @@ type NetworkResult = io::Result<(T, NetworkClientState)>; +#[cfg(not(feature = "tls-connections"))] +pub enum ClientSocket { + Plain(TcpStream) +} + +#[cfg(feature = "tls-connections")] +pub enum ClientSocket { + SslHandshake(Option>), + SslStream(SslStream) +} + +impl ClientSocket { + fn inner(&self) -> &TcpStream { + #[cfg(not(feature = "tls-connections"))] + match self { + ClientSocket::Plain(stream) => stream, + } + + #[cfg(feature = "tls-connections")] + match self { + ClientSocket::SslHandshake(Some(builder)) => builder.get_ref(), + ClientSocket::SslHandshake(None) => unreachable!(), + ClientSocket::SslStream(ssl_stream) => ssl_stream.get_ref() + } + } +} + pub struct NetworkClient { id: ClientId, - socket: TcpStream, + socket: ClientSocket, peer_addr: SocketAddr, decoder: ProtocolDecoder, buf_out: netbuf::Buf } impl NetworkClient { - pub fn new(id: ClientId, socket: TcpStream, peer_addr: SocketAddr) -> NetworkClient { + pub fn new(id: ClientId, socket: ClientSocket, peer_addr: SocketAddr) -> NetworkClient { NetworkClient { id, socket, peer_addr, decoder: ProtocolDecoder::new(), @@ -52,31 +89,53 @@ } } - pub fn read_messages(&mut self) -> NetworkResult> { + #[cfg(feature = "tls-connections")] + fn handshake_impl(&mut self, handshake: MidHandshakeSslStream) -> io::Result { + match handshake.handshake() { + Ok(stream) => { + self.socket = ClientSocket::SslStream(stream); + debug!("TLS handshake with {} ({}) completed", self.id, self.peer_addr); + Ok(NetworkClientState::Idle) + } + Err(HandshakeError::WouldBlock(new_handshake)) => { + self.socket = ClientSocket::SslHandshake(Some(new_handshake)); + Ok(NetworkClientState::Idle) + } + Err(HandshakeError::Failure(new_handshake)) => { + self.socket = ClientSocket::SslHandshake(Some(new_handshake)); + debug!("TLS handshake with {} ({}) failed", self.id, self.peer_addr); + Err(Error::new(ErrorKind::Other, "Connection failure")) + } + Err(HandshakeError::SetupFailure(_)) => unreachable!() + } + } + + fn read_impl(decoder: &mut ProtocolDecoder, source: &mut R, + id: ClientId, addr: &SocketAddr) -> NetworkResult> { let mut bytes_read = 0; let result = loop { - match self.decoder.read_from(&mut self.socket) { + match decoder.read_from(source) { Ok(bytes) => { - debug!("Client {}: read {} bytes", self.id, bytes); + debug!("Client {}: read {} bytes", id, bytes); bytes_read += bytes; if bytes == 0 { let result = if bytes_read == 0 { - info!("EOF for client {} ({})", self.id, self.peer_addr); + info!("EOF for client {} ({})", id, addr); (Vec::new(), NetworkClientState::Closed) } else { - (self.decoder.extract_messages(), NetworkClientState::NeedsRead) + (decoder.extract_messages(), NetworkClientState::NeedsRead) }; break Ok(result); } else if bytes_read >= MAX_BYTES_PER_READ { - break Ok((self.decoder.extract_messages(), NetworkClientState::NeedsRead)) + break Ok((decoder.extract_messages(), NetworkClientState::NeedsRead)) } } Err(ref error) if error.kind() == ErrorKind::WouldBlock => { let messages = if bytes_read == 0 { Vec::new() } else { - self.decoder.extract_messages() + decoder.extract_messages() }; break Ok((messages, NetworkClientState::Idle)); } @@ -84,14 +143,32 @@ break Err(error) } }; - self.decoder.sweep(); + decoder.sweep(); result } - pub fn flush(&mut self) -> NetworkResult<()> { + pub fn read(&mut self) -> NetworkResult> { + #[cfg(not(feature = "tls-connections"))] + match self.socket { + ClientSocket::Plain(ref mut stream) => + NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr), + } + + #[cfg(feature = "tls-connections")] + match self.socket { + ClientSocket::SslHandshake(ref mut handshake_opt) => { + let handshake = std::mem::replace(handshake_opt, None).unwrap(); + Ok((Vec::new(), self.handshake_impl(handshake)?)) + }, + ClientSocket::SslStream(ref mut stream) => + NetworkClient::read_impl(&mut self.decoder, stream, self.id, &self.peer_addr) + } + } + + fn write_impl(buf_out: &mut netbuf::Buf, destination: &mut W) -> NetworkResult<()> { let result = loop { - match self.buf_out.write_to(&mut self.socket) { - Ok(bytes) if self.buf_out.is_empty() || bytes == 0 => + match buf_out.write_to(destination) { + Ok(bytes) if buf_out.is_empty() || bytes == 0 => break Ok(((), NetworkClientState::Idle)), Ok(_) => (), Err(ref error) if error.kind() == ErrorKind::Interrupted @@ -102,7 +179,30 @@ break Err(error) } }; - self.socket.flush()?; + result + } + + pub fn write(&mut self) -> NetworkResult<()> { + let result = { + #[cfg(not(feature = "tls-connections"))] + match self.socket { + ClientSocket::Plain(ref mut stream) => + NetworkClient::write_impl(&mut self.buf_out, stream) + } + + #[cfg(feature = "tls-connections")] { + match self.socket { + ClientSocket::SslHandshake(ref mut handshake_opt) => { + let handshake = std::mem::replace(handshake_opt, None).unwrap(); + Ok(((), self.handshake_impl(handshake)?)) + } + ClientSocket::SslStream(ref mut stream) => + NetworkClient::write_impl(&mut self.buf_out, stream) + } + } + }; + + self.socket.inner().flush()?; result } @@ -119,12 +219,19 @@ } } +#[cfg(feature = "tls-connections")] +struct ServerSsl { + context: SslContext +} + pub struct NetworkLayer { listener: TcpListener, server: HWServer, clients: Slab, pending: HashSet<(ClientId, NetworkClientState)>, - pending_cache: Vec<(ClientId, NetworkClientState)> + pending_cache: Vec<(ClientId, NetworkClientState)>, + #[cfg(feature = "tls-connections")] + ssl: ServerSsl } impl NetworkLayer { @@ -133,7 +240,24 @@ let clients = Slab::with_capacity(clients_limit); let pending = HashSet::with_capacity(2 * clients_limit); let pending_cache = Vec::with_capacity(2 * clients_limit); - NetworkLayer {listener, server, clients, pending, pending_cache} + + NetworkLayer { + listener, server, clients, pending, pending_cache, + #[cfg(feature = "tls-connections")] + ssl: NetworkLayer::create_ssl_context() + } + } + + #[cfg(feature = "tls-connections")] + fn create_ssl_context() -> ServerSsl { + let mut builder = SslContextBuilder::new(SslMethod::tls()).unwrap(); + builder.set_verify(SslVerifyMode::NONE); + builder.set_read_ahead(true); + builder.set_certificate_file("ssl/cert.pem", SslFiletype::PEM).unwrap(); + builder.set_private_key_file("ssl/key.pem", SslFiletype::PEM).unwrap(); + builder.set_options(SslOptions::NO_COMPRESSION); + builder.set_cipher_list("DEFAULT:!LOW:!RC4:!EXP").unwrap(); + ServerSsl { context: builder.build() } } pub fn register_server(&self, poll: &Poll) -> io::Result<()> { @@ -144,7 +268,7 @@ fn deregister_client(&mut self, poll: &Poll, id: ClientId) { let mut client_exists = false; if let Some(ref client) = self.clients.get(id) { - poll.deregister(&client.socket) + poll.deregister(client.socket.inner()) .expect("could not deregister socket"); info!("client {} ({}) removed", client.id, client.peer_addr); client_exists = true; @@ -154,8 +278,8 @@ } } - fn register_client(&mut self, poll: &Poll, id: ClientId, client_socket: TcpStream, addr: SocketAddr) { - poll.register(&client_socket, Token(id), + fn register_client(&mut self, poll: &Poll, id: ClientId, client_socket: ClientSocket, addr: SocketAddr) { + poll.register(client_socket.inner(), Token(id), Ready::readable() | Ready::writable(), PollOpt::edge()) .expect("could not register socket with event loop"); @@ -180,12 +304,34 @@ } } + fn create_client_socket(&self, socket: TcpStream) -> io::Result { + #[cfg(not(feature = "tls-connections"))] { + Ok(ClientSocket::Plain(socket)) + } + + #[cfg(feature = "tls-connections")] { + let ssl = Ssl::new(&self.ssl.context).unwrap(); + let mut builder = SslStreamBuilder::new(ssl, socket); + builder.set_accept_state(); + match builder.handshake() { + Ok(stream) => + Ok(ClientSocket::SslStream(stream)), + Err(HandshakeError::WouldBlock(stream)) => + Ok(ClientSocket::SslHandshake(Some(stream))), + Err(e) => { + debug!("OpenSSL handshake failed: {}", e); + Err(Error::new(ErrorKind::Other, "Connection failure")) + } + } + } + } + pub fn accept_client(&mut self, poll: &Poll) -> io::Result<()> { let (client_socket, addr) = self.listener.accept()?; info!("Connected: {}", addr); let client_id = self.server.add_client(); - self.register_client(poll, client_id, client_socket, addr); + self.register_client(poll, client_id, self.create_client_socket(client_socket)?, addr); self.flush_server_messages(); Ok(()) @@ -205,7 +351,7 @@ client_id: ClientId) -> io::Result<()> { let messages = if let Some(ref mut client) = self.clients.get_mut(client_id) { - client.read_messages() + client.read() } else { warn!("invalid readable client: {}", client_id); Ok((Vec::new(), NetworkClientState::Idle)) @@ -246,7 +392,7 @@ client_id: ClientId) -> io::Result<()> { let result = if let Some(ref mut client) = self.clients.get_mut(client_id) { - client.flush() + client.write() } else { warn!("invalid writable client: {}", client_id); Ok(((), NetworkClientState::Idle)) diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/room.rs --- a/gameServer2/src/server/room.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/room.rs Thu Oct 04 21:17:21 2018 +0200 @@ -2,14 +2,20 @@ iter, collections::HashMap }; use crate::server::{ - coretypes::{ClientId, RoomId, TeamInfo, GameCfg, GameCfg::*, Voting}, + coretypes::{ + ClientId, RoomId, TeamInfo, GameCfg, GameCfg::*, Voting, + MAX_HEDGEHOGS_PER_TEAM + }, client::{HWClient} }; +use bitflags::*; use serde::{Serialize, Deserialize}; +use serde_derive::{Serialize, Deserialize}; use serde_yaml; -const MAX_HEDGEHOGS_IN_ROOM: u8 = 64; const MAX_TEAMS_IN_ROOM: u8 = 8; +const MAX_HEDGEHOGS_IN_ROOM: u8 = + MAX_HEDGEHOGS_PER_TEAM * MAX_HEDGEHOGS_PER_TEAM; #[derive(Clone, Serialize, Deserialize)] struct Ammo { @@ -20,7 +26,7 @@ #[derive(Clone, Serialize, Deserialize)] struct Scheme { name: String, - settings: Option> + settings: Vec } #[derive(Clone, Serialize, Deserialize)] @@ -50,7 +56,7 @@ template: 0, ammo: Ammo {name: "Default".to_string(), settings: None }, - scheme: Scheme {name: "Default".to_string(), settings: None }, + scheme: Scheme {name: "Default".to_string(), settings: Vec::new() }, script: "Normal".to_string(), theme: "\u{1f994}".to_string(), drawn_map: None @@ -176,11 +182,13 @@ MAX_HEDGEHOGS_IN_ROOM - self.hedgehogs_number() } - pub fn add_team(&mut self, owner_id: ClientId, mut team: TeamInfo) -> &TeamInfo { - team.color = iter::repeat(()).enumerate() - .map(|(i, _)| i as u8).take(u8::max_value() as usize + 1) - .find(|i| self.teams.iter().all(|(_, t)| t.color != *i )) - .unwrap_or(0u8); + pub fn add_team(&mut self, owner_id: ClientId, mut team: TeamInfo, preserve_color: bool) -> &TeamInfo { + if !preserve_color { + team.color = iter::repeat(()).enumerate() + .map(|(i, _)| i as u8).take(u8::max_value() as usize + 1) + .find(|i| self.teams.iter().all(|(_, t)| t.color != *i)) + .unwrap_or(0u8) + }; team.hedgehogs_number = if self.teams.is_empty() { self.default_hedgehog_number } else { diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/server/server.rs --- a/gameServer2/src/server/server.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/server/server.rs Thu Oct 04 21:17:21 2018 +0200 @@ -6,6 +6,9 @@ actions::{Destination, PendingMessage} }; use crate::protocol::messages::*; +use rand::{RngCore, thread_rng}; +use base64::{encode}; +use log::*; type Slab = slab::Slab; @@ -37,7 +40,10 @@ { let entry = self.clients.vacant_entry(); key = entry.key(); - let client = HWClient::new(entry.key()); + let mut salt = [0u8; 18]; + thread_rng().fill_bytes(&mut salt); + + let client = HWClient::new(entry.key(), encode(&salt)); entry.insert(client); } self.send(key, &Destination::ToSelf, HWServerMessage::Connected(utils::PROTOCOL_VERSION)); diff -r 219c2e588874 -r b2cc4e4e380c gameServer2/src/utils.rs --- a/gameServer2/src/utils.rs Wed Sep 05 20:09:32 2018 +0200 +++ b/gameServer2/src/utils.rs Thu Oct 04 21:17:21 2018 +0200 @@ -20,4 +20,48 @@ tmp.push(msg.clone().count() as u8); tmp.extend(msg); encode(&tmp) +} + +pub fn protocol_version_string(protocol_number: u16) -> &'static str { + match protocol_number { + 17 => "0.9.7-dev", + 19 => "0.9.7", + 20 => "0.9.8-dev", + 21 => "0.9.8", + 22 => "0.9.9-dev", + 23 => "0.9.9", + 24 => "0.9.10-dev", + 25 => "0.9.10", + 26 => "0.9.11-dev", + 27 => "0.9.11", + 28 => "0.9.12-dev", + 29 => "0.9.12", + 30 => "0.9.13-dev", + 31 => "0.9.13", + 32 => "0.9.14-dev", + 33 => "0.9.14", + 34 => "0.9.15-dev", + 35 => "0.9.14.1", + 37 => "0.9.15", + 38 => "0.9.16-dev", + 39 => "0.9.16", + 40 => "0.9.17-dev", + 41 => "0.9.17", + 42 => "0.9.18-dev", + 43 => "0.9.18", + 44 => "0.9.19-dev", + 45 => "0.9.19", + 46 => "0.9.20-dev", + 47 => "0.9.20", + 48 => "0.9.21-dev", + 49 => "0.9.21", + 50 => "0.9.22-dev", + 51 => "0.9.22", + 52 => "0.9.23-dev", + 53 => "0.9.23", + 54 => "0.9.24-dev", + 55 => "0.9.24", + 56 => "0.9.25-dev", + _ => "Unknown" + } } \ No newline at end of file diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/hwengine.pas --- a/hedgewars/hwengine.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/hwengine.pas Thu Oct 04 21:17:21 2018 +0200 @@ -45,15 +45,19 @@ procedure preInitEverything(); procedure initEverything(complete:boolean); procedure freeEverything(complete:boolean); +{$IFNDEF PAS2C} procedure catchUnhandledException(Obj: TObject; Addr: Pointer; FrameCount: Longint; Frames: PPointer); +{$ENDIF} implementation {$ELSE} procedure preInitEverything(); forward; procedure initEverything(complete:boolean); forward; procedure freeEverything(complete:boolean); forward; +{$IFNDEF PAS2C} procedure catchUnhandledException(Obj: TObject; Addr: Pointer; FrameCount: Longint; Frames: PPointer); forward; {$ENDIF} +{$ENDIF} {$IFDEF WIN32} type TSetProcessDpiAwareness = function(value: Integer): Integer; stdcall; @@ -600,6 +604,7 @@ freeEverything(false); end; +{$IFNDEF PAS2C} // Write backtrace to console and log when an unhandled exception occurred procedure catchUnhandledException(Obj: TObject; Addr: Pointer; FrameCount: Longint; Frames: PPointer); var @@ -621,6 +626,7 @@ WriteLnToConsole(BackTraceStrFunc(Frames[i])); end; end; +{$ENDIF} {$IFDEF HWLIBRARY} function RunEngine(argc: LongInt; argv: PPChar): LongInt; cdecl; export; @@ -649,8 +655,10 @@ // workaround for pascal's ParamStr and ParamCount init(argc, argv); {$ENDIF} +{$IFNDEF PAS2C} // Custom procedure for unhandled exceptions; ExceptProc is used by sysutils module ExceptProc:= @catchUnhandledException; +{$ENDIF} preInitEverything(); diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uChat.pas --- a/hedgewars/uChat.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uChat.pas Thu Oct 04 21:17:21 2018 +0200 @@ -437,12 +437,15 @@ t:= LocalTeam; x:= 0; +// speech bubble if (s[1] = '"') and (s[Length(s)] = '"') then x:= 1 +// thinking bubble else if (s[1] = '''') and (s[Length(s)] = '''') then x:= 2 +// yelling bubble else if (s[1] = '-') and (s[Length(s)] = '-') then x:= 3; @@ -462,7 +465,16 @@ if (s[1] = '/') then begin - // These 3 are same as above, only are to make the hedgehog say it on next attack + + // Ignore message-type commands with empty argument list + if (copy(s, 2, 2) = 'me') and (Length(s) = 3) then + exit; + if ((copy(s, 2, 3) = 'hsa') or (copy(s, 2, 3) = 'hta') or (copy(s, 2, 3) = 'hya')) and (Length(s) = 4) then + exit; + if ((copy(s, 2, 4) = 'team') or (copy(s, 2, 4) = 'clan')) and (Length(s) = 5) then + exit; + + // Speech bubble, but on next attack if (copy(s, 2, 4) = 'hsa ') then begin if CurrentTeam^.ExtDriven then @@ -472,6 +484,7 @@ exit end; + // Thinking bubble, but on next attack if (copy(s, 2, 4) = 'hta ') then begin if CurrentTeam^.ExtDriven then @@ -481,6 +494,7 @@ exit end; + // Yelling bubble, but on next attack if (copy(s, 2, 4) = 'hya ') then begin if CurrentTeam^.ExtDriven then @@ -490,9 +504,10 @@ exit end; - if (copy(s, 2, 5) = 'team ') and (length(s) > 6) then + // “/clan” or “/team” (“/team” is an alias for “/clan”) + if ((copy(s, 2, 5) = 'clan ') or (copy(s, 2, 5) = 'team ')) and (length(s) > 6) then begin - ParseCommand(s, true); + ParseCommand('team ' + copy(s, 7, Length(s) - 6), true); exit end; @@ -604,6 +619,8 @@ if (gameType = gmtNet) then SendConsoleCommand(s) + else + AddChatString(#0 + trcmd[sidCmdUnknown]); end else begin @@ -1113,7 +1130,7 @@ if copy(s, 1, 4) = '/me ' then s:= #2 + '* ' + UserNick + ' ' + copy(s, 5, Length(s) - 4) else - s:= #1 + Format(trmsg[sidChat], [UserNick, s]); + s:= #1 + Format(trmsg[sidChat], UserNick, s); AddChatString(s) end; @@ -1122,7 +1139,7 @@ begin SendIPC('b' + s); - s:= #4 + Format(trmsg[sidChatTeam], [UserNick, s]); + s:= #4 + Format(trmsg[sidChatTeam], UserNick, s); AddChatString(s) end; @@ -1160,7 +1177,7 @@ SetLine(InputStr, '', true) else begin - SetLine(InputStr, '/team ', true); + SetLine(InputStr, '/clan ', true); cursorPos:= 6; UpdateCursorCoords(); end; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uCommandHandlers.pas --- a/hedgewars/uCommandHandlers.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uCommandHandlers.pas Thu Oct 04 21:17:21 2018 +0200 @@ -131,7 +131,8 @@ procedure chCurU_m(var s: shortstring); begin s:= s; // avoid compiler hint -CursorMovementY:= 0; +if CursorMovementY < 0 then + CursorMovementY:= 0; end; procedure chCurD_p(var s: shortstring); @@ -143,7 +144,8 @@ procedure chCurD_m(var s: shortstring); begin s:= s; // avoid compiler hint -CursorMovementY:= 0; +if CursorMovementY > 0 then + CursorMovementY:= 0; end; procedure chCurL_p(var s: shortstring); @@ -155,7 +157,8 @@ procedure chCurL_m(var s: shortstring); begin s:= s; // avoid compiler hint -CursorMovementX:= 0; +if CursorMovementX < 0 then + CursorMovementX:= 0; end; procedure chCurR_p(var s: shortstring); @@ -167,7 +170,8 @@ procedure chCurR_m(var s: shortstring); begin s:= s; // avoid compiler hint -CursorMovementX:= 0; +if CursorMovementX > 0 then + CursorMovementX:= 0; end; procedure chLeft_p(var s: shortstring); diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uGame.pas --- a/hedgewars/uGame.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uGame.pas Thu Oct 04 21:17:21 2018 +0200 @@ -35,6 +35,37 @@ var i,j : LongInt; s: ansistring; begin + +inc(SoundTimerTicks, Lag); +if SoundTimerTicks >= 50 then + begin + SoundTimerTicks:= 0; + if cVolumeDelta <> 0 then + begin + j:= Volume; + i:= ChangeVolume(cVolumeDelta); + if (not cIsSoundEnabled) or (isAudioMuted and (j<>i)) then + AddCaption(trmsg[sidMute], capcolSetting, capgrpVolume) + else if not isAudioMuted then + begin + s:= ansistring(inttostr(i)); + AddCaption(FormatA(trmsg[sidVolume], s), capcolSetting, capgrpVolume) + end + end + else if cMuteToggle then + begin + MuteAudio; + if isAudioMuted then + AddCaption(trmsg[sidMute], capcolSetting, capgrpVolume) + else + begin + s:= ansistring(inttostr(GetVolumePercent())); + AddCaption(FormatA(trmsg[sidVolume], s), capcolSetting, capgrpVolume); + end; + cMuteToggle:= false; + end; + end; + if isPaused then exit; @@ -78,35 +109,6 @@ if cTestLua then Lag:= High(LongInt); -inc(SoundTimerTicks, Lag); -if SoundTimerTicks >= 50 then - begin - SoundTimerTicks:= 0; - if cVolumeDelta <> 0 then - begin - j:= Volume; - i:= ChangeVolume(cVolumeDelta); - if (not cIsSoundEnabled) or (isAudioMuted and (j<>i)) then - AddCaption(trmsg[sidMute], capcolSetting, capgrpVolume) - else if not isAudioMuted then - begin - s:= ansistring(inttostr(i)); - AddCaption(FormatA(trmsg[sidVolume], s), capcolSetting, capgrpVolume) - end - end - else if cMuteToggle then - begin - MuteAudio; - if isAudioMuted then - AddCaption(trmsg[sidMute], capcolSetting, capgrpVolume) - else - begin - s:= ansistring(inttostr(GetVolumePercent())); - AddCaption(FormatA(trmsg[sidVolume], s), capcolSetting, capgrpVolume); - end; - cMuteToggle:= false; - end; - end; PlayNextVoice; i:= 1; while (GameState <> gsExit) and (i <= Lag) and allOK do diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uGears.pas --- a/hedgewars/uGears.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uGears.pas Thu Oct 04 21:17:21 2018 +0200 @@ -336,14 +336,18 @@ if TotalRoundsPre = cSuddenDTurns + 1 then bWaterRising:= true; if bWaterRising and (cWaterRise > 0) then + begin + bDuringWaterRise:= true; AddGear(0, 0, gtWaterUp, 0, _0, _0, 0)^.Tag:= cWaterRise; + end; inc(step) end - else // since we are not raising the water, a second win-check isn't needed + else // since we are not raising the water, another win-check isn't needed inc(step,2); stChWin3: begin CheckForWin; + bDuringWaterRise:= false; inc(step) end; @@ -418,7 +422,8 @@ dec(delay2); if ((delay2 mod cInactDelay) = 0) and (CurrentHedgehog <> nil) and (CurrentHedgehog^.Gear <> nil) - and (not CurrentHedgehog^.Unplaced) then + and (not CurrentHedgehog^.Unplaced) + and (not PlacingHogs) then begin if (CurrentHedgehog^.Gear^.State and gstAttacked <> 0) and (Ammoz[CurrentHedgehog^.CurAmmoType].Ammo.Propz and ammoprop_NeedTarget <> 0) then @@ -1216,7 +1221,7 @@ Gear^.Text:= text; Gear^.FrameTicks:= x end; - AddChatString(#9+FormatA(trmsg[sidChatHog], [HH^.Name, text])); + AddChatString(#9+FormatA(trmsg[sidChatHog], HH^.Name, text)); end end else if (x >= 4) then diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uGearsHandlersMess.pas --- a/hedgewars/uGearsHandlersMess.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uGearsHandlersMess.pas Thu Oct 04 21:17:21 2018 +0200 @@ -3268,7 +3268,7 @@ with HHGear^ do begin State := State and (not gstAttacking); - Message := Message and (not gmAttack) + Message := Message and (not (gmAttack or gmSwitch)) end end; @@ -5478,7 +5478,7 @@ Gear^.dY.isNegative := not Gear^.dY.isNegative; HHGear^.dX := Gear^.dX; HHGear^.dY := Gear^.dY; - AmmoShove(Gear, 0, 80); + AmmoShove(Gear, 0, 79); Gear^.dX.isNegative := not Gear^.dX.isNegative; Gear^.dY.isNegative := not Gear^.dY.isNegative; end; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uGearsHedgehog.pas --- a/hedgewars/uGearsHedgehog.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uGearsHedgehog.pas Thu Oct 04 21:17:21 2018 +0200 @@ -186,6 +186,9 @@ Gear^.Message:= Gear^.Message and (not gmTimer); CurWeapon:= GetCurAmmoEntry(Gear^.Hedgehog^); with Gear^.Hedgehog^ do + if (((Gear^.State and gstAttacked) <> 0) and (GameFlags and gfInfAttack = 0)) + or ((Gear^.State and gstHHDriven) = 0) then + exit; if ((Gear^.Message and gmPrecise) <> 0) and ((CurWeapon^.Propz and ammoprop_SetBounce) <> 0) then begin color:= Gear^.Hedgehog^.Team^.Clan^.Color; @@ -579,7 +582,7 @@ speech^.Text:= SpeechText; speech^.Hedgehog:= Gear^.Hedgehog; speech^.FrameTicks:= SpeechType; - AddChatString(#9+FormatA(trmsg[sidChatHog], [Gear^.Hedgehog^.Name, SpeechText])); + AddChatString(#9+FormatA(trmsg[sidChatHog], Gear^.Hedgehog^.Name, SpeechText)); end; SpeechText:= '' end; @@ -866,6 +869,9 @@ exit end; +if (Gear^.Hedgehog^.Unplaced) then + exit; + if ((Gear^.Message and gmAnimate) <> 0) then begin Gear^.Message:= 0; @@ -910,7 +916,7 @@ end; if (Gear^.Message and (gmLeft or gmRight) <> 0) and (Gear^.State and gstMoving = 0) and - (CheckGearNear(Gear, gtPortal, 26, 26) <> nil) then + (CheckGearNear(Gear, gtPortal, 26, 26) = nil) then Gear^.PortalCounter:= 0; PrevdX:= hwSign(Gear^.dX); if (Gear^.Message and gmLeft )<>0 then diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uGearsRender.pas --- a/hedgewars/uGearsRender.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uGearsRender.pas Thu Oct 04 21:17:21 2018 +0200 @@ -301,7 +301,7 @@ sign, hx, hy, tx, ty, sx, sy, m: LongInt; // hedgehog, crosshair, temp, sprite, direction dx, dy, ax, ay, aAngle, dAngle, hAngle, lx, ly: real; // laser, change wraps: LongWord; // numbe of wraps for laser in world wrap - defaultPos, HatVisible: boolean; + defaultPos, HatVisible, inWorldBounds: boolean; HH: PHedgehog; CurWeapon: PAmmo; iceOffset:Longint; @@ -444,7 +444,8 @@ hx:= tx; hy:= ty; wraps:= 0; - while ((Land[ty, tx] and lfAll) = 0) do + inWorldBounds := ((ty and LAND_HEIGHT_MASK) or (tx and LAND_WIDTH_MASK)) = 0; + while inWorldBounds and ((Land[ty, tx] and lfAll) = 0) do begin if wraps > cMaxLaserSightWraps then break; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uGearsUtils.pas --- a/hedgewars/uGearsUtils.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uGearsUtils.pas Thu Oct 04 21:17:21 2018 +0200 @@ -1332,18 +1332,9 @@ if (Gear^.State and gstNoDamage) = 0 then begin - if (not (Gear^.Kind in [gtMinigun, gtPortal])) and - (Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot, gtMinigunBullet]) then - begin - VGear := AddVisualGear(t^.cX[i], t^.cY[i], vgtBulletHit); - if VGear <> nil then - VGear^.Angle := DxDy2Angle(-Ammo^.dX, Ammo^.dY); - end; - if (Gear^.Kind = gtHedgehog) and (Ammo^.State and gsttmpFlag <> 0) and (Ammo^.Kind = gtShover) then Gear^.FlightTime:= 1; - case Gear^.Kind of gtHedgehog, gtMine, @@ -1355,6 +1346,12 @@ gtExplosives: //, //gtStructure: begin + if Ammo^.Kind in [gtDEagleShot, gtSniperRifleShot, gtMinigunBullet] then + begin + VGear := AddVisualGear(t^.cX[i], t^.cY[i], vgtBulletHit); + if VGear <> nil then + VGear^.Angle := DxDy2Angle(-Ammo^.dX, Ammo^.dY); + end; if (Ammo^.Kind = gtDrill) then begin Ammo^.Timer:= 0; @@ -1397,13 +1394,13 @@ if (Gear^.Kind = gtHedgehog) and (Gear^.Hedgehog^.King or (Gear^.Hedgehog^.Effects[heFrozen] > 0)) then begin - Gear^.dX:= Gear^.dX + Ammo^.dX * Power * _0_005; - Gear^.dY:= Gear^.dY + Ammo^.dY * Power * _0_005 + Gear^.dX:= Ammo^.dX * Power * _0_005; + Gear^.dY:= Ammo^.dY * Power * _0_005 end else if ((Ammo^.Kind <> gtFlame) or (Gear^.Kind = gtHedgehog)) and (Power <> 0) then begin - Gear^.dX:= Gear^.dX + Ammo^.dX * Power * _0_01; - Gear^.dY:= Gear^.dY + Ammo^.dY * Power * _0_01 + Gear^.dX:= Ammo^.dX * Power * _0_01; + Gear^.dY:= Ammo^.dY * Power * _0_01 end; if (not isZero(Gear^.dX)) or (not isZero(Gear^.dY)) then diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uIO.pas --- a/hedgewars/uIO.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uIO.pas Thu Oct 04 21:17:21 2018 +0200 @@ -39,7 +39,7 @@ procedure doPut(putX, putY: LongInt; fromAI: boolean); implementation -uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug; +uses uConsole, uConsts, uVariables, uCommands, uUtils, uDebug, uLocale; const cSendEmptyPacketTime = 1000; @@ -147,6 +147,8 @@ procedure ParseIPCCommand(s: shortstring); var loTicks: Word; isProcessed: boolean; + nick, msg: shortstring; + i: LongInt; begin isProcessed := true; @@ -175,7 +177,30 @@ else isProcessed:= false; 'b': if gameType = gmtNet then - ParseChatCommand('chatmsg ' + #4, s, 2) + // parse team message from net + // expected format: ] + begin + i:= 2; + nick:= ''; + while (i <= length(s)) and (s[i] <> ']') do + begin + nick:= nick + s[i]; + inc(i) + end; + + inc(i); + msg:= ''; + while (i <= length(s)) do + begin + msg:= msg + s[i]; + inc(i) + end; + s:= 'b' + Format(trmsg[sidChatTeam], nick, msg); + if (nick = '') or (msg = '') then + isProcessed:= false + else + ParseChatCommand('chatmsg ' + #4, s, 2); + end else isProcessed:= false; else @@ -254,7 +279,7 @@ end; procedure SendStat(sit: TStatInfoType; s: shortstring); -const stc: array [TStatInfoType] of char = ('r', 'D', 'k', 'K', 'H', 'T', 'P', 's', 'S', 'B', 'c', 'g', 'p', 'R'); +const stc: array [TStatInfoType] of char = ('r', 'D', 'k', 'K', 'H', 'T', 'P', 's', 'S', 'B', 'c', 'g', 'p', 'R', 'h'); var buf: shortstring; begin buf:= 'i' + stc[sit] + s; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uLand.pas --- a/hedgewars/uLand.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uLand.pas Thu Oct 04 21:17:21 2018 +0200 @@ -984,12 +984,14 @@ procedure chSendLandDigest(var s: shortstring); var i: LongInt; + landPixelDigest : LongInt; begin + landPixelDigest:= 1; for i:= 0 to LAND_HEIGHT-1 do - syncedPixelDigest:= Adler32Update(syncedPixelDigest, @Land[i,0], LAND_WIDTH*2); - s:= 'M' + IntToStr(syncedPixelDigest); // + cScriptName; script name is no longer needed. scripts are hashed + landPixelDigest:= Adler32Update(landPixelDigest, @Land[i,0], LAND_WIDTH*2); + s:= 'M' + IntToStr(syncedPixelDigest)+'|'+IntToStr(landPixelDigest); - ScriptSetString('LandDigest', s); + ScriptSetString('LandDigest',IntToStr(landPixelDigest)); chLandCheck(s); if allOK then SendIPCRaw(@s[0], Length(s) + 1) diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uLandObjects.pas --- a/hedgewars/uLandObjects.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uLandObjects.pas Thu Oct 04 21:17:21 2018 +0200 @@ -204,7 +204,7 @@ pLandColor:= @LandPixels[(cpY + y) div 2, (cpX + x) div 2]; alpha:= (color and AMask) shr AShift; - if (alpha <> $FF) and (pLandColor^ <> 0) then + if ((alpha <> $FF) and ((pLandColor^) <> 0)) then begin landColor:= pLandColor^; color:= diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uLocale.pas --- a/hedgewars/uLocale.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uLocale.pas Thu Oct 04 21:17:21 2018 +0200 @@ -23,15 +23,31 @@ uses uTypes; const MAX_EVENT_STRINGS = 255; -const MAX_FORMAT_STRING_SYMBOLS = 9; procedure LoadLocale(FileName: shortstring); -function Format(fmt: shortstring; args: array of shortstring): shortstring; -function FormatA(fmt: ansistring; args: array of ansistring): ansistring; -function Format(fmt: shortstring; arg: shortstring): shortstring; -function FormatA(fmt: ansistring; arg: ansistring): ansistring; function GetEventString(e: TEventId): ansistring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: shortstring; argCount: Byte): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2, arg3: shortstring): shortstring; +function Format(fmt: shortstring; arg1, arg2: shortstring): shortstring; +function Format(fmt: shortstring; arg1: shortstring): shortstring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: ansistring; argCount: Byte): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1: ansistring): ansistring; + {$IFDEF HWLIBRARY} procedure LoadLocaleWrapper(path: pchar; userpath: pchar; filename: pchar); cdecl; export; {$ENDIF} @@ -119,60 +135,147 @@ end; // Format the string fmt. -// Take a shortstring with placeholders %1, %2, %3, etc. and replace +// Take a shortstring with placeholders %1, %2, %3, ... %9. and replace // them with the corresponding elements of an array with up to -// MAX_FORMAT_STRING_SYMBOLS. Important! Each placeholder can only be -// used exactly once and numbers MUST NOT be skipped (e.g. using %1 and %3 -// but not %2. -function Format(fmt: shortstring; args: array of shortstring): shortstring; +// argCount. ArgCount must not be larger than 9. +// Each placeholder must be used exactly once and numbers MUST NOT be +// skipped (e.g. using %1 and %3 but not %2. +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: shortstring; argCount: Byte): shortstring; var i, p: LongInt; -tempstr: shortstring; +tempstr, curArg: shortstring; begin tempstr:= fmt; -for i:=0 to MAX_FORMAT_STRING_SYMBOLS - 1 do +for i:=0 to argCount - 1 do begin + case i of + 0: curArg:= arg1; + 1: curArg:= arg2; + 2: curArg:= arg3; + 3: curArg:= arg4; + 4: curArg:= arg5; + 5: curArg:= arg6; + 6: curArg:= arg7; + 7: curArg:= arg8; + 8: curArg:= arg9; + end; + p:= Pos('%'+IntToStr(i+1), tempstr); - if (p = 0) or (i >= Length(args)) then + if (p = 0) then break else begin delete(tempstr, p, 2); - insert(args[i], tempstr, p); + insert(curArg, tempstr, p); end; end; Format:= tempstr; end; // Same as Format, but for ansistring -function FormatA(fmt: ansistring; args: array of ansistring): ansistring; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: ansistring; argCount: Byte): ansistring; var i, p: LongInt; -tempstr: ansistring; +tempstr, curArg: ansistring; begin tempstr:= fmt; -for i:=0 to MAX_FORMAT_STRING_SYMBOLS - 1 do +for i:=0 to argCount - 1 do begin + case i of + 0: curArg:= arg1; + 1: curArg:= arg2; + 2: curArg:= arg3; + 3: curArg:= arg4; + 4: curArg:= arg5; + 5: curArg:= arg6; + 6: curArg:= arg7; + 7: curArg:= arg8; + 8: curArg:= arg9; + end; + p:= Pos('%'+IntToStr(i+1), tempstr); - if (p = 0) or (i >= Length(args)) then + if (p = 0) then break else begin delete(tempstr, p, 2); - insert(args[i], tempstr, p); + insert(curArg, tempstr, p); end; end; FormatA:= tempstr; end; -// Same as Format above, but with only one placeholder %1, replaced by arg. -function Format(fmt: shortstring; arg: shortstring): shortstring; +// The following functions are just shortcuts of Format/FormatA, with fewer argument counts +function Format(fmt: shortstring; arg1: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, '', '', '', '', '', '', '', '', 1); +end; +function Format(fmt: shortstring; arg1, arg2: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, '', '', '', '', '', '', '', 2); +end; +function Format(fmt: shortstring; arg1, arg2, arg3: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, arg3, '', '', '', '', '', '', 3); +end; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4: shortstring): shortstring; begin - Format:= Format(fmt, [arg]); + Format:= Format(fmt, arg1, arg2, arg3, arg4, '', '', '', '', '', 4); +end; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, arg3, arg4, arg5, '', '', '', '', 5); +end; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, arg3, arg4, arg5, arg6, '', '', '', 6); +end; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, '', '', 7); +end; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, '', 8); +end; +function Format(fmt: shortstring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: shortstring): shortstring; +begin + Format:= Format(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 9); end; -// Same as above, but for ansistring -function FormatA(fmt: ansistring; arg: ansistring): ansistring; +function FormatA(fmt: ansistring; arg1: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, '', '', '', '', '', '', '', '', 1); +end; +function FormatA(fmt: ansistring; arg1, arg2: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, '', '', '', '', '', '', '', 2); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, arg3, '', '', '', '', '', '', 3); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, arg3, arg4, '', '', '', '', '', 4); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5: ansistring): ansistring; begin - FormatA:= FormatA(fmt, [arg]); + FormatA:= FormatA(fmt, arg1, arg2, arg3, arg4, arg5, '', '', '', '', 5); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, arg3, arg4, arg5, arg6, '', '', '', 6); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, '', '', 7); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, '', 8); +end; +function FormatA(fmt: ansistring; arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9: ansistring): ansistring; +begin + FormatA:= FormatA(fmt, arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8, arg9, 9); end; {$IFDEF HWLIBRARY} diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uScript.pas --- a/hedgewars/uScript.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uScript.pas Thu Oct 04 21:17:21 2018 +0200 @@ -1651,7 +1651,7 @@ vgear^.Text:= lua_tostring(L, 2); if Gear^.Kind = gtHedgehog then begin - AddChatString(#9+FormatA(trmsg[sidChatHog], [gear^.Hedgehog^.Name, vgear^.text])); + AddChatString(#9+FormatA(trmsg[sidChatHog], gear^.Hedgehog^.Name, vgear^.text)); vgear^.Hedgehog:= gear^.Hedgehog end else vgear^.Frame:= gear^.uid; @@ -2199,8 +2199,8 @@ var s: LongInt; soundState: boolean; const - call = 'SetSoundMasked'; - params = 'soundId, isMasked]'; + call = 'SetSoundMask'; + params = 'soundId, isMasked'; begin if CheckLuaParamCount(L, 2, call, params) then begin @@ -2810,7 +2810,7 @@ placed, behind, flipHoriz, flipVert : boolean; const call = 'PlaceSprite'; - params = 'x, y, sprite, frameIdx, tint, behind, flipHoriz, flipVert, [, landFlag, ... ]'; + params = 'x, y, sprite, frameIdx, tint, behind, flipHoriz, flipVert [, landFlag, ... ]'; begin placed:= false; if CheckAndFetchLuaParamMinCount(L, 4, call, params, n) then @@ -2858,7 +2858,7 @@ eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert : boolean; const call = 'EraseSprite'; - params = 'x, y, sprite, frameIdx, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert, [, landFlag, ... ]'; + params = 'x, y, sprite, frameIdx, eraseOnLFMatch, onlyEraseLF, flipHoriz, flipVert [, landFlag, ... ]'; begin if CheckAndFetchLuaParamMinCount(L, 4, call, params, n) then begin @@ -3212,7 +3212,7 @@ function lc_setturntimeleft(L : Plua_State) : LongInt; Cdecl; var number: Int64; begin - if CheckLuaParamCount(L, 1, 'SetTurnTimeLeft', 'TurnTimeLeft') then + if CheckLuaParamCount(L, 1, 'SetTurnTimeLeft', 'newTurnTimeLeft') then begin number:= Trunc(lua_tonumber(L, 1)); if number < 0 then @@ -3229,7 +3229,7 @@ function lc_setreadytimeleft(L : Plua_State) : LongInt; Cdecl; var number: Int64; begin - if CheckLuaParamCount(L, 1, 'SetReadyTimeLeft', 'ReadyTimeLeft') then + if CheckLuaParamCount(L, 1, 'SetReadyTimeLeft', 'newReadyTimeLeft') then begin number:= Trunc(lua_tonumber(L, 1)); if number < 0 then @@ -3654,7 +3654,7 @@ hedgewarsMountPackage(Str2PChar(copy(s, 3, length(s)-6)+'.hwp')); physfsReaderSetBuffer(@buf); -if Pos('Locale/',s) <> 0 then +if (Pos('Locale/',s) <> 0) or (s = 'Scripts/OfficialChallengeHashes.lua') then ret:= lua_load(luaState, @ScriptLocaleReader, f, Str2PChar(s)) else begin @@ -3752,11 +3752,13 @@ if isPendingTurnTimeLeft then begin TurnTimeLeft:= PendingTurnTimeLeft; + ScriptSetInteger('TurnTimeLeft', TurnTimeLeft); isPendingTurnTimeLeft:= false; end; if isPendingReadyTimeLeft then begin ReadyTimeLeft:= PendingReadyTimeLeft; + ScriptSetInteger('ReadyTimeLeft', ReadyTimeLeft); isPendingReadyTimeLeft:= false; end; end; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uStore.pas --- a/hedgewars/uStore.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uStore.pas Thu Oct 04 21:17:21 2018 +0200 @@ -511,7 +511,7 @@ AFKTexture:= RenderStringTex(trmsg[sidAFK], cCentralMessageColor, fntBig); keyConfirm:= KeyBindToName('confirm'); keyQuit:= KeyBindToName('quit'); - ConfirmTexture:= RenderStringTex(Format(trmsg[sidConfirm], [keyConfirm, keyQuit]), cCentralMessageColor, fntBig); + ConfirmTexture:= RenderStringTex(Format(trmsg[sidConfirm], keyConfirm, keyQuit), cCentralMessageColor, fntBig); SyncTexture:= RenderStringTex(trmsg[sidSync], cCentralMessageColor, fntBig); if not reload then @@ -772,8 +772,9 @@ var i: LongInt; f: PFSFile; key, value, l, temp: shortstring; - color: Longword; - c: byte; + color, tempColor: Longword; + clanID, tempClanID: byte; + conversionSuccess: boolean; begin if cOnlyStats then exit; @@ -786,6 +787,7 @@ while (not pfsEOF(f)) and (l <> '[colors]') do pfsReadLn(f, l); + conversionSuccess:= false; while (not pfsEOF(f)) and (l <> '') do begin pfsReadLn(f, l); @@ -801,11 +803,11 @@ if temp = 'color' then begin temp:= copy(key, 6, length(key) - 5); - try - c:= StrToInt(temp); - except - on E : EConvertError do continue; - end; + tempClanID:= StrToInt(temp, conversionSuccess); + if conversionSuccess then + clanID:= tempClanID + else + continue; end else continue; @@ -820,15 +822,15 @@ if value[1] <> '#' then continue; temp:= copy(value, 2, length(value) - 1); - try - color:= StrToInt('0x'+temp); - except - on E : EConvertError do continue; - end; + tempColor:= StrToInt('0x'+temp, conversionSuccess); + if conversionSuccess then + color:= tempColor + else + continue; end; - if c <= cClanColors then - ClanColorArray[c]:= color; + if clanID <= cClanColors then + ClanColorArray[clanID]:= color; end; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uTeams.pas --- a/hedgewars/uTeams.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uTeams.pas Thu Oct 04 21:17:21 2018 +0200 @@ -58,6 +58,7 @@ s, cap: ansistring; ts: array[0..(cMaxTeams - 1)] of ansistring; t, AliveCount, i, j: LongInt; + allWin, winCamera: boolean; begin CheckForWin:= false; AliveCount:= 0; @@ -75,11 +76,13 @@ TurnTimeLeft:= 0; ReadyTimeLeft:= 0; -// if the game ends during a multishot, do last TurnStats + TurnReaction -if (not bBetweenTurns) and isInMultiShoot then +// If the game ends during a multishot, or after the Sudden Death +// water has risen, do last turn stats / reaction. +if ((not bBetweenTurns) and isInMultiShoot) or (bDuringWaterRise) then begin TurnStats(); - TurnReaction(); + if (not bDuringWaterRise) then + TurnReaction(); TurnStatsReset(); end; @@ -98,6 +101,7 @@ end else // win begin + allWin:= false; with AliveClan^ do begin if TeamsNumber = 1 then // single team wins @@ -118,11 +122,25 @@ // Write victory message for caption and stats page if (TeamsNumber = cMaxTeams) or (TeamsCount = TeamsNumber) then + begin // No enemies for some reason … Everyone wins!!1! - s:= trmsg[sidWinnerAll] + s:= trmsg[sidWinnerAll]; + allWin:= true; + end else if (TeamsNumber >= 2) and (TeamsNumber < cMaxTeams) then // List all winning teams in a list - s:= FormatA(trmsg[TMsgStrId(Ord(sidWinner2) + (TeamsNumber - 2))], ts); + if (TeamsNumber = 2) then + s:= FormatA(trmsg[TMsgStrId(sidWinner2)], ts[0], ts[1]) + else if (TeamsNumber = 3) then + s:= FormatA(trmsg[TMsgStrId(sidWinner3)], ts[0], ts[1], ts[2]) + else if (TeamsNumber = 4) then + s:= FormatA(trmsg[TMsgStrId(sidWinner4)], ts[0], ts[1], ts[2], ts[3]) + else if (TeamsNumber = 5) then + s:= FormatA(trmsg[TMsgStrId(sidWinner5)], ts[0], ts[1], ts[2], ts[3], ts[4]) + else if (TeamsNumber = 6) then + s:= FormatA(trmsg[TMsgStrId(sidWinner6)], ts[0], ts[1], ts[2], ts[3], ts[4], ts[5]) + else if (TeamsNumber = 7) then + s:= FormatA(trmsg[TMsgStrId(sidWinner7)], ts[0], ts[1], ts[2], ts[3], ts[4], ts[5], ts[6]); // The winner caption is the same as the stats message and not randomized cap:= s; @@ -130,12 +148,21 @@ // TODO (maybe): Show victory animation/captions per-team instead of all winners at once? end; + // Enable winner state for winning hogs and move camera to a winning hedgehog + winCamera:= false; for j:= 0 to Pred(TeamsNumber) do with Teams[j]^ do for i:= 0 to cMaxHHIndex do with Hedgehogs[i] do if (Gear <> nil) then + begin + if (not winCamera) then + begin + FollowGear:= Gear; + winCamera:= true; + end; Gear^.State:= gstWinner; + end; if Flawless then AddVoice(sndFlawless, Teams[0]^.voicepack) else @@ -144,6 +171,8 @@ if SendGameResultOn then SendStat(siGameResult, shortstring(s)); + if allWin and SendAchievementsStatsOn then + SendStat(siEverAfter, ''); AddGear(0, 0, gtATFinishGame, 0, _0, _0, 3000) end; SendStats; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uTypes.pas --- a/hedgewars/uTypes.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uTypes.pas Thu Oct 04 21:17:21 2018 +0200 @@ -176,7 +176,7 @@ TStatInfoType = (siGameResult, siMaxStepDamage, siMaxStepKills, siKilledHHs, siClanHealth, siTeamStats, siPlayerKills, siMaxTeamDamage, siMaxTeamKills, siMaxTurnSkips, siCustomAchievement, siGraphTitle, - siPointType, siTeamRank); + siPointType, siTeamRank, siEverAfter); // Various 'emote' animations a hedgehog can do TWave = (waveRollup, waveSad, waveWave, waveHurrah, waveLemonade, waveShrug, waveJuggle); @@ -493,7 +493,7 @@ sidWinner2, sidWinner3, sidWinner4, sidWinner5, sidWinner6, sidWinner7, sidWinnerAll, sidTeamGone, sidTeamBack, sidAutoSkip, sidFPS, sidLuaParsingOff, sidLuaParsingOn, sidLuaParsingDenied, - sidAmmoCount, sidChat, sidChatTeam, sidChatHog); + sidAmmoCount, sidChat, sidChatTeam, sidChatHog, sidEverAfter); TCmdHelpStrId = ( sidCmdHeaderBasic, sidCmdTogglechat, sidCmdTeam, sidCmdMe, @@ -503,7 +503,7 @@ sidCmdHeaderTaunts, sidCmdSpeech, sidCmdThink, sidCmdYell, sidCmdSpeechNumberHint, sidCmdHsa, sidCmdHta, sidCmdHya, sidCmdHurrah, sidCmdIlovelotsoflemonade, sidCmdJuggle, - sidCmdRollup, sidCmdShrug, sidCmdWave); + sidCmdRollup, sidCmdShrug, sidCmdWave, sidCmdUnknown); // Events that are important for the course of the game or at least interesting for other reasons TEventId = (eidDied, eidDrowned, eidRoundStart, eidRoundWin, eidRoundDraw, diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uUtils.pas --- a/hedgewars/uUtils.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uUtils.pas Thu Oct 04 21:17:21 2018 +0200 @@ -50,6 +50,7 @@ function IntToStr(n: LongInt): shortstring; function StrToInt(s: shortstring): LongInt; +function StrToInt(s: shortstring; var success: boolean): LongInt; function FloatToStr(n: hwFloat): shortstring; function DxDy2Angle(const _dY, _dX: hwFloat): real; inline; @@ -331,9 +332,22 @@ str(n, IntToStr) end; -function StrToInt(s: shortstring): LongInt; +// Convert string to longint, with error checking. +// Success will be set to false when conversion failed. +// See documentation on Val procedure for syntax of s +function StrToInt(s: shortstring; var success: boolean): LongInt; +var Code: Word; begin -val(s, StrToInt); +val(s, StrToInt, Code); +success:= Code = 0; +end; + +// Convert string to longint, without error checking +function StrToInt(s: shortstring): LongInt; +var success: boolean; // ignored +begin +success:= true; // avoid compiler hint +StrToInt:= StrToInt(s, success); end; function FloatToStr(n: hwFloat): shortstring; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uVariables.pas --- a/hedgewars/uVariables.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uVariables.pas Thu Oct 04 21:17:21 2018 +0200 @@ -177,6 +177,7 @@ bBetweenTurns : boolean; bWaterRising : boolean; + bDuringWaterRise: boolean; CrosshairX : LongInt; CrosshairY : LongInt; @@ -2856,6 +2857,7 @@ flagDumpLand := false; bBetweenTurns := false; bWaterRising := false; + bDuringWaterRise:= false; isCursorVisible := false; isInLag := false; isPaused := false; diff -r 219c2e588874 -r b2cc4e4e380c hedgewars/uWorld.pas --- a/hedgewars/uWorld.pas Wed Sep 05 20:09:32 2018 +0200 +++ b/hedgewars/uWorld.pas Thu Oct 04 21:17:21 2018 +0200 @@ -2005,6 +2005,8 @@ ammoStr: ansistring; tmpsurf: PSDL_Surface; begin + if cOnlyStats then exit; + ammoStrId := Ammoz[ammoType].NameId; trluaammo[ammoStrId] := name; @@ -2014,7 +2016,7 @@ ammoStr:= trammo[ammoStrId]; if checkFails(length(ammoStr) > 0,'No default text/translation found for ammo type #' + intToStr(ord(ammoType)) + '!',true) then exit; - + tmpsurf:= TTF_RenderUTF8_Blended(Fontz[CheckCJKFont(ammoStr,fnt16)].Handle, PChar(ammoStr), cWhiteColorChannels); if checkFails(tmpsurf <> nil,'Name-texture creation for ammo type #' + intToStr(ord(ammoType)) + ' failed!',true) then exit; tmpsurf:= doSurfaceConversion(tmpsurf); diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/CMakeLists.txt --- a/share/hedgewars/Data/Graphics/Missions/CMakeLists.txt Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Graphics/Missions/CMakeLists.txt Thu Oct 04 21:17:21 2018 +0200 @@ -1,3 +1,4 @@ add_subdirectory(Training) add_subdirectory(Challenge) add_subdirectory(Scenario) +add_subdirectory(Campaign) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/CMakeLists.txt Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,5 @@ +file(GLOB MissionPics *@2x.png) + +install(FILES + ${MissionPics} + DESTINATION ${SHAREPATH}Data/Graphics/Missions/Campaign/A_Classic_Fairytale) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/backstab@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/backstab@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/dragon@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/dragon@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/enemy@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/enemy@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/epil@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/epil@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/family@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/family@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/first_blood@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/first_blood@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/journey@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/journey@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/queen@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/queen@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/shadow@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/shadow@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/united@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Classic_Fairytale/united@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/CMakeLists.txt Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,5 @@ +file(GLOB MissionPics *@2x.png) + +install(FILES + ${MissionPics} + DESTINATION ${SHAREPATH}Data/Graphics/Missions/Campaign/A_Space_Adventure) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/cosmos@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/cosmos@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/death01@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/death01@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/death02@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/death02@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert01@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert01@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert02@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert02@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert03@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/desert03@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/final@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/final@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/fruit01@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/fruit01@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/fruit02@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/fruit02@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/fruit03@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/fruit03@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/ice01@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/ice01@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/ice02@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/ice02@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/moon01@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/moon01@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/moon02@2x.png Binary file share/hedgewars/Data/Graphics/Missions/Campaign/A_Space_Adventure/moon02@2x.png has changed diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Graphics/Missions/Campaign/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Graphics/Missions/Campaign/CMakeLists.txt Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,2 @@ +add_subdirectory(A_Classic_Fairytale) +add_subdirectory(A_Space_Adventure) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/cs.lua --- a/share/hedgewars/Data/Locale/cs.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/cs.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/da.lua --- a/share/hedgewars/Data/Locale/da.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/da.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/de.lua --- a/share/hedgewars/Data/Locale/de.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/de.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ ["1 - Normal Girder"]="1 – Normaler Bauträger", ["1 - Normal Land"]="1 – Normales Gelände", ["1 - Normal Rubber"]="1 – Normales Gummi", +["+1 point"] = "+1 Punkt", -- Mutant ["-1 point"] = "-1 Punkt", -- Mutant -["+1 point"] = "+1 Punkt", -- Mutant ["-1 to anyone for a suicide"]="-1 für Selbstmord", ["+1 to the Bottom Feeder for killing anyone"] = "+1 für den Versager für jeden Abschuss", -- Mutant ["+1 to the Mutant for killing anyone"] = "+1 für den Mutanten für jeden Abschuss", -- Mutant @@ -121,8 +121,8 @@ ["Anton"] = "Anton", -- ["An unexpected event!"]="Ein unerwartetes Ereignis!", ["Anyway, the aliens accept me for who I am."] = "Jedenfalls akzeptieren die Außerirdischen mich für den, der ich bin!", -- A_Classic_Fairytale:queen +["A random hedgehog will inherit the weapons of his deceased team-mates"]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben", -- A_Space_Adventure:death02 ["A random hedgehog will inherit the weapons of his deceased team-mates."]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben.", -- A_Space_Adventure:death02 -["A random hedgehog will inherit the weapons of his deceased team-mates"]="Ein zufälliger Igel wird die Waffen seiner verstorbenen Teamkollegen erben", -- A_Space_Adventure:death02 ["Arashi"] = "Arashi", -- ["Areas surrounded by a green dashed outline are portal-proof and repel portals."] = "Land, das mit einer grünen gestrichtelten Linie umrandet ist, ist portalabweisend.", -- A_Space_Adventure:final ["Areas surrounded by a security border are indestructible."] = "Land, das eine Sicherheitsumrandung hat, ist unzerstörbar.", -- A_Space_Adventure:final @@ -163,8 +163,8 @@ ["Attack: Throw ball"] = "Angriff: Ball werfen", -- Knockball ["At the end of the game your health was "]="Am Ende des Spiels war deine Gesundheit ", ["At the end of the game your health was %d."] = "Am Ende des Spiels hattest du %d Gesundheit.", -- A_Space_Adventure:ice01 +["At the start of the game each enemy hog has only the weapon that he is named after"]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nach der er benannt wurde", -- A_Space_Adventure:death02 ["At the start of the game each enemy hog has only the weapon that he is named after."]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nach der er benannt wurde.", -- A_Space_Adventure:death02 -["At the start of the game each enemy hog has only the weapon that he is named after"]="Am Anfang des Spiels hat jeder feindliche Igel nur die Waffe, nach der er benannt wurde", -- A_Space_Adventure:death02 ["Australia"]="Australien", ["Available weapon specials:"] = "Verfügbare Waffenextras:", -- Continental_supplies ["Average pilot"]="Durchschnittlicher Pilot", @@ -586,11 +586,11 @@ ["DUD MINE PLACEMENT MODE"] = "BLINDGÄNGERMINENPLATZIERUNGSMODUS", -- HedgeEditor ["During the final testing of the device an accident happened"]="Bei den letzten Tests des Gerätes ist ein Unfall passiert.", ["During the final testing of the device an accident happened."] = "Bei den letzten Tests des Geräts ist ein Unfall passiert.", -- A_Space_Adventure:moon02 +["During the game you can get new RC planes by collecting the weapon crates"]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammelst", ["During the game you can get new RC planes by collecting the weapon crates."]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammelst.", -["During the game you can get new RC planes by collecting the weapon crates"]="Während des Spiels kannst du neue Funkflugzeuge erhalten, indem du die Waffenkisten sammelst", ["Dust Storm"] = "Staubsturm", -- Continental_supplies +["Each time you destroy all the targets on your current level you'll get teleported to the next level"]="Jedes Mal, wenn du alle Zielscheiben im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert", ["Each time you destroy all the targets on your current level you'll get teleported to the next level."]="Jedes Mal, wenn du alle Zielscheiben im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert.", -["Each time you destroy all the targets on your current level you'll get teleported to the next level"]="Jedes Mal, wenn du alle Zielscheiben im aktuellen Level zerstörst, wirst du zum nächsten Level teleportiert", ["Each time you play this missions enemy hogs will play in a random order"]="Jedes Mal, wenn du diese Mission spielst, werden die feindlichen Igel in einer zufälligen Reihenfolge spielen", -- A_Space_Adventure:death02 ["Each turn is only ONE SECOND!"]="Jeder Zug dauert nur EINE SEKUNDE!", ["Each turn you get 1-3 random weapons"]="Du bekommst jede Runde 1-3 zufällig gewählte Waffen", @@ -627,8 +627,8 @@ ["Epilogue"] = "Epilog", -- A_Classic_Fairytale:epil ["Eugene"] = "Eugen", -- ["Europe"]="Europa", +["Every 2 rings, the ring color will be green and you'll get an extra flying saucer"]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse", ["Every 2 rings, the ring color will be green and you'll get an extra flying saucer."]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse.", -["Every 2 rings, the ring color will be green and you'll get an extra flying saucer"]="Alle 2 Ringe wird der Ring grün und du erhältst eine neue fliegende Untertasse", ["Every 2 rings you'll get extra flying saucers"]="Alle 2 Ringe erhältst du neue fliegende Untertassen", ["Every 2 rings you'll get extra flying saucers."] = "Alle 2 Ringe erhältst du neue fliegende Untertassen.", -- A_Space_Adventure:ice02 ["Everyone knows this."]="Das weiß jeder.", @@ -1961,8 +1961,8 @@ ["So I shook my fist in the air!"] = "Und so schlug ich die Faust gen Himmel!", -- A_Classic_Fairytale:epil ["Soldier"]="Soldat", ["So, let me tell you what I know about Professor Hogevil."]="Also, lass mich erzählen, was ich über Professor Bösigel weiß.", +["Some parts of the land are indestructible"]="Einige Teile des Landes sind unzerstörbar", ["Some parts of the land are indestructible."]="Einige Teile des Landes sind unzerstörbar.", -["Some parts of the land are indestructible"]="Einige Teile des Landes sind unzerstörbar", ["Some sick game of yours?!"] = "Ein krankes Spiel von euch?!", -- A_Classic_Fairytale:queen ["Some weapons can be dropped from the rope."] = "Einige Waffen können vom Seil aus fallen gelassen werden.", -- Basic_Training_-_Rope ["Somewhere else on the planet of fruits, Captain Lime helps Hog Solo"]="Irgendwo anders auf dem Obstplaneten hilft Leutnant Limone Igel Einsam", @@ -2150,6 +2150,7 @@ ["Team Identity Mode"]="Team-Identitätsmodus", ["TEAM IDENTITY MODE"]="TEAMIDENTITÄTSMODUS", ["Team of Hearts"]="Team der Herzen", +["Teams are tied! Continue playing rounds until we have a winner!"] = "Gleichstand! Spielt weiter Runden, bis wir einen Sieger haben!", -- Space_Invasion ["Team’s best heights per round"]="Die Besthöhen der Teams pro Runde", ["Teamwork 2"] = "Teamwork 2", -- User_Mission_-_Teamwork_2 ["Teamwork"] = "Teamwork", -- User_Mission_-_Teamwork @@ -2233,8 +2234,8 @@ ["The First Encounter"]="Das erste Zusammentreffen", ["The first hedgehog to kill someone becomes the Mutant."] = "Der erste Igel, der einen anderen tötet, mutiert.", -- Mutant ["The first stop"]="Der erste Halt", +["The first turn will last 25 sec and every other turn 15 sec"]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern", ["The first turn will last 25 sec and every other turn 15 sec."]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern.", -["The first turn will last 25 sec and every other turn 15 sec"]="Der 1. Zug wird 25 Sek., jeder andere Zug 15 Sek. dauern", ["The flag will respawn next round."]="Die Flagge wird nächste Runde wieder auftauchen.", ["The flood has stopped! Challenge over."] = "Die Flut ist vorbei! Herausforderung beendet.", -- User_Mission_-_That_Sinking_Feeling ["The food bites back"]="Das Essen beißt zurück", @@ -2308,6 +2309,8 @@ ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "Die Geister der Ahnen sind sicherlich erfreut, Undichte Stelle.", -- A_Classic_Fairytale:first_blood ["The targets will guide you through the training."] = "Die Zielscheiben führen dich durch die Übung.", -- Basic_Training_-_Rope ["The team continued their quest of finding the rest of the tribe."] = "Das Team setzte die Suche nach dem Rest ihres Stammes fort.", -- A_Classic_Fairytale:queen +["The teams were tied, so an additional round has been played to determine the winner."] = "Die Teams hatten Gleichstand, also wurde eine weitere Runde gespielt, um den Sieger zu bestimmen.", -- Space_Invasion +["The teams were tied, so %d additional rounds have been played to determine the winner."] = "Die Teams hatten Gleichstand, also wurden %d weitere Runden gespielt, um den Sieger zu bestimmen.", -- Space_Invasion ["The time that you have left when you reach the blue hedgehog will be added to the next turn."]="Deine verbleibende Zeit wird zu deinem nächsten Zug addiert, sobald du den blauen Igel erreichst.", ["The Torment"]="Die Qual", ["The truth about Professor Hogevil"]="Die Wahrheit über Professor Bösigel", @@ -2375,6 +2378,7 @@ ["Throw a grenade to destroy the target!"] = "Wirf eine Granate, um die Zielscheibe zu zerstören!", -- Basic_Training_-_Grenade ["Thug #%d"] = "Rowdy %d", -- A_Space_Adventure:death01 ["thug"]="Rowdy", +["Tie-breaking round %d"] = "%d. Stichrunde", -- Space_Invasion ["Timbers"] = "Holz", -- ["Time: %.1fs"] = "Zeit: %.1fs", -- Racer, TechRacer ["Time: %.3fs by %s"] = "Zeit: %.3fs von %s", -- TrophyRace @@ -2425,8 +2429,8 @@ ["To win the game you have to find the right crate."]="Um das Spiel zu gewinnen, musst du die richtige Kiste finden.", ["To win the game you have to go next to Thanta."]="Um das Spiel zu gewinnen, musst du neben Thanta stehen.", ["To win the game you have to go to the surface."]="Um das Spiel zu gewinnen, musst du an die Oberfläche gelangen.", +["To win the game you have to pass into the rings in time"]="Um das Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen", ["To win the game you have to pass into the rings in time."]="Um das Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen.", -["To win the game you have to pass into the rings in time"]="Um das Spiel zu gewinnen, musst du rechtzeitig durch die Ringe fliegen", ["To win the game you have to stand next to Thanta."] = "Um das Spiel zu gewinnen, musst du neben Thanta stehen.", -- A_Space_Adventure:ice01 ["Toxic Team"]="Giftige Gegner", ["Track completed!"] = "Strecke durchlaufen!", -- Racer, TechRacer @@ -2512,16 +2516,16 @@ ["Use space button twice to change flying saucer while being in air."]="Drücke die Angriffstaste 2 mal, um die fliegende Untertasse im Flug zu wechseln", ["Use space button twice to change flying saucer while floating in mid-air."]="Drücke die Angriffstaste 2 mal, um die fliegende Untertasse im Flug zu wechseln.", ["Use the attack key twice to change the flying saucer while being in air."] = "Benutze die Angriffstaste 2 mal, um die fliegende Untertasse in der Luft zu wechseln.", -- A_Space_Adventure:ice02 +["Use the attack key twice to change the flying saucer while floating in mid-air"] = "Benutze die Angriffstaste 2 mal, um die Fliegende Untertasse während des Fluges zu wechseln", -- A_Space_Adventure:ice02 ["Use the attack key twice to change the flying saucer while floating in mid-air."] = "Benutze die Angriffstaste 2 mal, um die Fliegende Untertasse während des Fluges zu wechseln.", -- A_Space_Adventure:ice02 -["Use the attack key twice to change the flying saucer while floating in mid-air"] = "Benutze die Angriffstaste 2 mal, um die Fliegende Untertasse während des Fluges zu wechseln", -- A_Space_Adventure:ice02 ["Use the bazooka and the flying saucer to get the freezer."] = "Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern.", -- A_Space_Adventure:ice01 ["Use the bazooka and the flying saucer to get the icegun."]="Benutze die Bazooka und die fliegende Untertasse, um die Eiskanone zu ergattern", ["Use the flying saucer from the crate to fly to the moon."] = "Benutze die fliegende Untertasse aus der Kiste, um zum Mond zu fliegen.", -- A_Space_Adventure:cosmos ["Use the flying saucer to fly to the other planets."] = "Benutze die fliegende Untertasse, um zu den anderen Planeten zu fliegen.", -- A_Space_Adventure:cosmos ["Use the parachute ([Space] while in air) to get the next crate"]="Benutze den Fallschirm ([Leer] drücken, wenn in der Luft), um die nächste Kiste zu erhalten.", ["Use the portal gun to get to the next crate, then use the new gun to get to the final destination!|"]="Benutze das Portalgewehr, um zur nächsten Kiste zu kommen,|dann benutze das nächste Werkzeug, um zum letzten Ziel zu kommen.|", +["Use the RC plane and destroy the all the targets"]="Benutze das Funkflugzeug und zerstöre alle Zielscheiben", ["Use the RC plane and destroy the all the targets."]="Benutze das Funkflugzeug und zerstöre alle Zielscheiben.", -["Use the RC plane and destroy the all the targets"]="Benutze das Funkflugzeug und zerstöre alle Zielscheiben", ["Use the rope in order to catch the blue hedgehog"]="Benutze das Seil, um den blauen Igel zu fangen.", ["Use the rope to complete the obstacle course!"] = "Benutze das Seil, um die Hindernisstrecke abzuschließen!", -- Basic_Training_-_Rope ["Use the rope to get on the head of the mole, young one!"]="Benutze das Seil, um auf den Kopf des Maulwurfs zu gelangen, Jüngling!", @@ -2552,8 +2556,8 @@ ["Use this mode to tag gears for win/lose conditions."]="Benutze diesen Modus, um Gears für Sieg-/Niederlagebedingungen zu markieren.", ["Use this mode to waypoints"]="Benutze diesen Modus, um Wegpunkte zu platzieren", ["Use your ammo wisely."]="Benutze deine Munition weise.", +["Use your available weapons in order to eliminate the enemies"]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren", ["Use your available weapons in order to eliminate the enemies."]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren.", -["Use your available weapons in order to eliminate the enemies"]="Benutze deine verfügbaren Waffen, um die Gegner zu eliminieren", ["Use your ready time to think."]="Benutze deine Vorbereitungszeit zum Denken.", ["Use your rope to collect all crates as fast as possible."] = "Benutze dein Seil, um alle Kisten so schnell wie möglich einzusammeln.", -- ["Use your rope to get from start to finish as fast as you can!"]="Nutze das Seil, um von Start zu Ziel zu gelangen – so schnell du kannst!", @@ -2796,8 +2800,8 @@ ["You can dive with your flying saucer!"] = "Mit deiner fliegenden Untertasse kannst du abtauchen!", -- Basic_Training_-_Flying_Saucer ["You can even change your aiming direction in mid-flight if you first hold [Precise] and then press [Up] or [Down]."] = "Du kannst sogar deine Zielrichtung im Flug ändern, wenn du|zuerst [Genaues Zielen] gedrückt hältst, und dann [Hoch] oder [Runter] drückst.", -- Basic_Training_-_Flying_Saucer ["You can further customize the race by changing the scheme script parameter."] = "Du kannst das Rennen ferner bearbeiten, indem du den Skriptparameter im Schema änderst.", -- TechRacer +["You can only use the sniper rifle or the watermelon bomb"]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen", ["You can only use the sniper rifle or the watermelon bomb."]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen.", -["You can only use the sniper rifle or the watermelon bomb"]="Du kannst nur das Scharfschützengewehr oder die Wassermelonenbombe benutzen", ["You can practice moving around and using utilities in this mission.|However, it will never end!"] = "In dieser Mission kannst du üben, dich herumbewegen|und Werkzeuge benutzen.|Aber sie wird niemals enden!", -- A_Classic_Fairytale:epil ["You can set the bounciness of grenades (and grenade-like weapons)."] = "Du kannst die Sprunghaftigkeit von Granaten (und granatenähnlichen Waffen) setzen.", -- Basic_Training_-_Grenade ["You can’t open a portal on the blue surface."] = "Du kannst kein Portal auf der blauen Oberfläche öffnen.", -- portal @@ -2918,16 +2922,16 @@ ["You killed my father, you monster!"]="Du hast meinen Vater umgebracht, du Monster!", ["You know...taking a stroll."]="Du weißt schon … umherbummeln.", ["You know what? I don't even regret anything!"]="Weißt du was? Ich bereue nichts!", +["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles"] = "Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre)", -- A_Space_Adventure:fruit03 ["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles."] = "Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre).", -- A_Space_Adventure:fruit03 -["You'll get an extra sniper rifle every time you kill an enemy hog with a limit of max 4 rifles"] = "Du erhältst ein zusätzliches Scharfschützengewehr für jeden Igel, den du tötest (max. 4 Gewehre)", -- A_Space_Adventure:fruit03 +["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports"]="Du erhältst einen zusätzlichen Teleporter für jeden getöteten Igel (max. 2 Teleporter)", -- A_Space_Adventure:fruit03 ["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports."]="Du erhältst einen zusätzlichen Teleporter für jeden getöteten Igel (max. 2 Teleporter).", -- A_Space_Adventure:fruit03 -["You'll get an extra teleport every time you kill an enemy hog with a limit of max 2 teleports"]="Du erhältst einen zusätzlichen Teleporter für jeden getöteten Igel (max. 2 Teleporter)", -- A_Space_Adventure:fruit03 +["You'll get extra time in case you need it when you pass a ring"]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst", -- A_Space_Adventure:ice02 ["You'll get extra time in case you need it when you pass a ring."]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst.", -- A_Space_Adventure:ice02 -["You'll get extra time in case you need it when you pass a ring"]="Du erhältst Bonuszeit, wenn du sie brauchst, sobald du einen Ring passierst", -- A_Space_Adventure:ice02 +["You'll have only 2 watermelon bombs during the game"]="Du hast nur 2 Wassermelonenbomben während des Spiels", -- A_Space_Adventure:fruit03 ["You'll have only 2 watermelon bombs during the game."]="Du hast nur 2 Wassermelonenbomben während des Spiels.", -- A_Space_Adventure:fruit03 -["You'll have only 2 watermelon bombs during the game"]="Du hast nur 2 Wassermelonenbomben während des Spiels", -- A_Space_Adventure:fruit03 +["You'll have only one RC plane at the start of the mission"]="Am Anfang der Mission hast du nur ein Funkflugzeug", ["You'll have only one RC plane at the start of the mission."]="Am Anfang der Mission hast du nur ein Funkflugzeug.", -["You'll have only one RC plane at the start of the mission"]="Am Anfang der Mission hast du nur ein Funkflugzeug", ["You'll have to eliminate Captain Lime at the end."]="Am Ende musst du Leutnant Limone eliminieren.", -- A_Space_Adventure:fruit02 ["You'll have to eliminate the Fruit Assassins at the end."] = "Am Ende musst du die Obstassassinen eliminieren.", -- A_Space_Adventure:fruit02 ["You'll have to eliminate the Strawberry Assassins at the end."]="Am Ende musst du die Erdbeerassassinen eliminieren.", -- A_Space_Adventure:fruit02 diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/de.txt --- a/share/hedgewars/Data/Locale/de.txt Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/de.txt Thu Oct 04 21:17:21 2018 +0200 @@ -1398,7 +1398,7 @@ ; Chat command help 06:00=Liste der grundlegenden Client-Chatbefehle: 06:01=/togglechat: Chatanzeige umschalten -06:02=/team : Nachricht nur an Klanmitglieder schicken +06:02=/clan : Nachricht nur an Klanmitglieder schicken 06:03=/me : Chataktion, z.B. wird »/me isst Pizza« zu »* Spieler isst Pizza« 06:04=/pause: Pause umschalten 06:05=/pause: Automatisches Überspringen umschalten @@ -1422,3 +1422,4 @@ 06:23=/rollup: Igel sich einigeln lassen 06:24=/shrug: Igel mit den Achseln zucken lassen 06:25=/wave: Igel winken lassen +06:26=Unbekannter Befehl oder ungültige Parameter. Sag »/help« im Chat für eine Liste an Befehlen. diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/en.txt --- a/share/hedgewars/Data/Locale/en.txt Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/en.txt Thu Oct 04 21:17:21 2018 +0200 @@ -1301,7 +1301,7 @@ ; Chat command help 06:00=List of basic client chat commands: 06:01=/togglechat: Toggle chat display -06:02=/team : Send message to clan members only +06:02=/clan : Send message to clan members only 06:03=/me : Chat action, e.g. “/me eats pizza” becomes “* Player eats pizza” 06:04=/pause: Toggle pause 06:05=/pause: Toggle auto skip @@ -1325,3 +1325,4 @@ 06:23=/rollup: Make hedgehog roll up 06:24=/shrug: Make hedgehog shrug 06:25=/wave: Make hedgehog wave its hand +06:26=Unknown command or invalid parameters. Say “/help” in chat for a list of commands. diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/es.lua --- a/share/hedgewars/Data/Locale/es.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/es.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/fr.lua --- a/share/hedgewars/Data/Locale/fr.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/fr.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant ["-1 to anyone for a suicide"] = "-1 pour cause de suicide", -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -1582,8 +1582,8 @@ ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "L'une des deux tribus était pacifique, passant son temps à chasser et à s'entraîner, appréciant les petits plaisirs de la vie", -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1666,8 +1666,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos ["Play with me!"] = "Joue avec moi !", @@ -1860,8 +1860,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2182,6 +2182,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2344,6 +2345,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 ["The Torment"] = "Le supplice", -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2415,6 +2418,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_ar.ts --- a/share/hedgewars/Data/Locale/hedgewars_ar.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_ar.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1346,6 +1346,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4123,10 +4127,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4147,10 +4147,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4167,18 +4163,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4191,14 +4175,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4230,5 +4206,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_bg.ts --- a/share/hedgewars/Data/Locale/hedgewars_bg.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_bg.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1353,6 +1353,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4159,10 +4163,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4183,10 +4183,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4203,18 +4199,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4227,14 +4211,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4266,5 +4242,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_cs.ts --- a/share/hedgewars/Data/Locale/hedgewars_cs.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_cs.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1384,6 +1384,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4233,10 +4237,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4257,10 +4257,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4277,18 +4273,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4301,14 +4285,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4340,5 +4316,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_da.ts --- a/share/hedgewars/Data/Locale/hedgewars_da.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_da.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1371,6 +1371,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4229,10 +4233,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4253,10 +4253,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4273,18 +4269,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4297,14 +4281,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4336,5 +4312,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_de.ts --- a/share/hedgewars/Data/Locale/hedgewars_de.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_de.ts Thu Oct 04 21:17:21 2018 +0200 @@ -966,7 +966,7 @@ Please check the host name and port settings and/or try again later. Die Verbindung wurde vom Host abgelehnt oder die maximale Wartezeit ist abgelaufen. Dies könnte einen der folgenden Gründe haben: -– Das Hedgewars-Server-Programm läuft momentant nicht auf dem Host +– Das Hedgewars-Server-Programm läuft momentan nicht auf dem Host – Die angegebene Portnummer ist falsch – Es gibt ein temporäres Netzwerkproblem @@ -1187,7 +1187,7 @@ PageAdmin Clear Accounts Cache - Zwischenspeicher leeren + Konten-Zwischenspeicher leeren Fetch data @@ -1228,7 +1228,7 @@ Expiration - Ablaufzeitpunkt + Ablaufzeit Reason @@ -1545,6 +1545,10 @@ <b>%1</b> erledigte <b>%2</b> der eigenen Igel. + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + Da alle die gleiche Klanfarbe hatten, gab es keinen Grund für einen Kampf. Und wenn sie nicht gestorben sind, dann leben die Igel noch heute in Frieden. + PageInGame @@ -4732,7 +4736,7 @@ /rnd: Flip a virtual coin and reply with 'heads' or 'tails' - /rnd: Wirft eine virtuelle Münze und antwortet mit »heads« oder »tails« + /rnd: Wirft eine virtuelle Münze und antwortet mit »Kopf« oder »Zahl« /rnd [A] [B] [C] [...]: Reply with a random word from the given list @@ -4756,7 +4760,7 @@ /greeting <message>: Set greeting message to be shown to players who join the room - /greeting <Nachricht>: Begrüßungsnachricht für Spieler, die diesen Raum betreten, setzen + /greeting <Nachricht>: Begrüßungsnachricht für Spieler, die diesen Raum betreten, setzen /delegate <player>: Surrender room control to player @@ -4780,7 +4784,7 @@ /save <parameter> - /save <Parameter> + /save <Parameter> /stats: Query server stats @@ -4800,15 +4804,15 @@ /saveroom <file name>: Save room configuration into a file - /saveroom <Dateiname>: Raumeinstellungen in eine Datei speichern + /saveroom <Dateiname>: Raumeinstellungen in eine Datei speichern /loadroom <file name>: Load room configuration from a file - /loadroom <Dateiname>: Raumeinstellungen aus einer Datei laden + /loadroom <Dateiname>: Raumeinstellungen aus einer Datei laden /delete <parameter> - /delete <Parameter> + /delete <Parameter> List of lobby chat commands: @@ -4824,11 +4828,11 @@ Unknown command: - Unbekannter Befehl + Unbekannter Befehl Say '/help' in chat for a list of commands - Sag »/help« im Chat für eine Liste von Befehlen + Sag »/help« im Chat für eine Liste von Befehlen room @@ -4862,5 +4866,97 @@ Kicked Hinausgeworfen + + This server only allows registered users to join. + Dieser Server lässt nur registrierte Server rein. + + + heads + Kopf + + + tails + Zahl + + + This server does not support replays! + Dieser Server unterstützt keine Wiederholungen! + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + /greeting [Nachricht]: Setze oder leere die Begrüßungsnachricht für Spieler, die den Raum betreten + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + /save <Konfig-ID> <Konfig-Name>: Aktuelle Raumeinstellung als Wahloption für /callvote map hinzufügen + + + /delete <config ID>: Delete a votable room configuration + /delete <Konfig-ID>: Eine wählbare Raumeinstellung löschen + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + /saveroom <Dateiname>: Alle wählbaren Raumeinstellungen (und die Begrüßung) dieses Raums in eine Datei speichern + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + /loadroom <Dateiname>: Wählbare Raumeinstellungen (und Begrüßung) aus einer Datei laden + + + 'Registered only' state toggled. + »Registered only«-Zustand umgeschaltet. + + + Super power activated. + Superkraft aktiviert. + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + Unbekannter Befehl oder ungültige Parameter. Sag »/help« im Chat für eine Liste an Befehlen. + + + You can't kick yourself! + Du kannst dich nicht selbst hinauswerfen! + + + You can't kick the only other player! + Du kannst nicht den einzigen anderen Spieler hinauswerfen! + + + The player is not in your room. + Der Spieler befindet sich nicht in deinem Raum. + + + This player is protected from being kicked. + Dieser Spieler wird vor Hinauswürfen geschützt. + + + You're not the room master or a server admin! + Du bist nicht der Raumleiter oder ein Server-Admin! + + + You're already the room master. + Du bist bereits der Raumleiter. + + + Greeting message cleared. + Begrüßungsnachricht geleert. + + + Greeting message set. + Begrüßungsnachricht gesetzt. + + + /callvote kick: This is only allowed in rooms without a room master. + /callvote kick: Dies ist nur in Räumen ohne Raumleiter erlaubt. + + + /callvote map: No maps available. + /callvote map: Keine Karten verfügbar. + + + You're the new room master! + Du bist der neue Raumleiter! + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_el.ts --- a/share/hedgewars/Data/Locale/hedgewars_el.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_el.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1365,6 +1365,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4207,10 +4211,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4231,10 +4231,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4251,18 +4247,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4275,14 +4259,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4314,5 +4290,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_en.ts --- a/share/hedgewars/Data/Locale/hedgewars_en.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_en.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1461,6 +1461,10 @@ <b>%1</b> killed <b>%2</b> of their own hedgehogs. + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + PageInGame @@ -4540,7 +4544,7 @@ /greeting <message>: Set greeting message to be shown to players who join the room - /greeting <message>: Set greeting message to be shown to players who join the room + /greeting <message>: Set greeting message to be shown to players who join the room /delegate <player>: Surrender room control to player @@ -4564,7 +4568,7 @@ /save <parameter> - /save <parameter> + /save <parameter> /stats: Query server stats @@ -4584,15 +4588,15 @@ /saveroom <file name>: Save room configuration into a file - /saveroom <file name>: Save room configuration into a file + /saveroom <file name>: Save room configuration into a file /loadroom <file name>: Load room configuration from a file - /loadroom <file name>: Load room configuration from a file + /loadroom <file name>: Load room configuration from a file /delete <parameter> - /delete <parameter> + /delete <parameter> List of lobby chat commands: @@ -4608,11 +4612,11 @@ Unknown command: - Unknown command: + Unknown command: Say '/help' in chat for a list of commands - Say ‘/help’ in chat for a list of commands + Say ‘/help’ in chat for a list of commands room @@ -4646,5 +4650,97 @@ Kicked Kicked + + This server only allows registered users to join. + This server only allows registered users to join. + + + heads + heads + + + tails + tails + + + This server does not support replays! + This server does not support replays! + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + /delete <config ID>: Delete a votable room configuration + /delete <config ID>: Delete a votable room configuration + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + 'Registered only' state toggled. + ‘Registered only’ state toggled. + + + Super power activated. + Super power activated. + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + Unknown command or invalid parameters. Say ‘/help’ in chat for a list of commands. + + + You can't kick yourself! + You can’t kick yourself! + + + You can't kick the only other player! + You can’t kick the only other player! + + + The player is not in your room. + The player is not in your room. + + + This player is protected from being kicked. + This player is protected from being kicked. + + + You're not the room master or a server admin! + You’re not the room master or a server admin! + + + You're already the room master. + You’re already the room master. + + + Greeting message cleared. + Greeting message cleared. + + + Greeting message set. + Greeting message set. + + + /callvote kick: This is only allowed in rooms without a room master. + /callvote kick: This is only allowed in rooms without a room master. + + + /callvote map: No maps available. + /callvote map: No maps available. + + + You're the new room master! + You’re the new room master! + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_es.ts --- a/share/hedgewars/Data/Locale/hedgewars_es.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_es.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1371,6 +1371,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4225,10 +4229,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4249,10 +4249,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4269,18 +4265,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4293,14 +4277,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4332,5 +4308,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_fi.ts --- a/share/hedgewars/Data/Locale/hedgewars_fi.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_fi.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1422,6 +1422,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4425,10 +4429,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4449,10 +4449,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4469,18 +4465,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4493,14 +4477,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4532,5 +4508,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_fr.ts --- a/share/hedgewars/Data/Locale/hedgewars_fr.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_fr.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1447,6 +1447,10 @@ <b>%1</b> a tué <b>%2</b> de ses propres hérissons. + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4607,10 +4611,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4631,10 +4631,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4651,18 +4647,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4675,14 +4659,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4714,5 +4690,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_gd.ts --- a/share/hedgewars/Data/Locale/hedgewars_gd.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_gd.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1456,6 +1456,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4473,10 +4477,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4497,10 +4497,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4517,18 +4513,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4541,14 +4525,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4580,5 +4556,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_gl.ts --- a/share/hedgewars/Data/Locale/hedgewars_gl.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_gl.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1345,6 +1345,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4150,10 +4154,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4174,10 +4174,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4194,18 +4190,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4218,14 +4202,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4257,5 +4233,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_hu.ts --- a/share/hedgewars/Data/Locale/hedgewars_hu.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_hu.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1330,6 +1330,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4140,10 +4144,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4164,10 +4164,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4184,18 +4180,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4208,14 +4192,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4247,5 +4223,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_it.ts --- a/share/hedgewars/Data/Locale/hedgewars_it.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_it.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1430,6 +1430,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4479,10 +4483,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4503,10 +4503,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4523,18 +4519,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4547,14 +4531,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4586,5 +4562,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_ja.ts --- a/share/hedgewars/Data/Locale/hedgewars_ja.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_ja.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1340,6 +1340,10 @@ <b>%1</b>は自分の針鼠を<b>%2</b>匹犠牲にしました。 + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4086,10 +4090,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4110,10 +4110,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4130,18 +4126,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4154,14 +4138,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4193,5 +4169,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_ko.ts --- a/share/hedgewars/Data/Locale/hedgewars_ko.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_ko.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1307,6 +1307,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -3981,10 +3985,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4005,10 +4005,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4025,18 +4021,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4049,14 +4033,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4088,5 +4064,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_lt.ts --- a/share/hedgewars/Data/Locale/hedgewars_lt.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_lt.ts Thu Oct 04 21:17:21 2018 +0200 @@ -660,45 +660,45 @@ - - + + Cannot save record to file %1 - + Hedgewars Demo File File Types - + Hedgewars Save File File Types - + Demo name - + Demo name: - + Unknown network error (possibly missing SSL library). - + This feature requires an Internet connection, but you don't appear to be online (error code: %1). - + Internal error: Reply object is invalid. @@ -1011,17 +1011,17 @@ - + Server authentication error - + Room destroyed - + You got kicked @@ -1041,24 +1041,24 @@ - - + + %1 *** %2 has joined the room - + %1 *** %2 has left - + %1 *** %2 has left (message: "%3") - - + + %1 *** %2 has left (%3) @@ -1546,7 +1546,7 @@ - + Health graph @@ -1566,7 +1566,7 @@ - + The best shot award was won by <b>%1</b> with <b>%2</b> pts. @@ -1575,7 +1575,7 @@ - + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. @@ -1584,7 +1584,7 @@ - + A total of <b>%1</b> hedgehog(s) were killed during this round. @@ -1593,7 +1593,7 @@ - + (%1 kill) Number of kills in stats screen, written after the team name @@ -1603,7 +1603,7 @@ - + (%1 %2) For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points” @@ -1613,7 +1613,7 @@ - + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. @@ -1622,7 +1622,7 @@ - + <b>%1</b> killed <b>%2</b> of their own hedgehogs. @@ -1631,7 +1631,7 @@ - + <b>%1</b> was scared and skipped turn <b>%2</b> times. @@ -1639,6 +1639,11 @@ + + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -1785,7 +1790,7 @@ - + Start fighting (requires at least 2 teams) @@ -2525,13 +2530,13 @@ - + %1 (%2%) - %3 Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”) - + encoding @@ -2929,7 +2934,7 @@ - + Playing teams @@ -3321,12 +3326,12 @@ - + Not all players are ready - + Are you sure you want to start this game? Not all players are ready. @@ -3359,18 +3364,18 @@ - + Hedgewars - Success - + All file associations have been set - + File association failed. @@ -3401,7 +3406,7 @@ - + Netgame - Error @@ -3411,7 +3416,7 @@ - + Please enter room name @@ -3462,18 +3467,18 @@ - - + + Videos - Are you sure? - + Do you really want to delete the video '%1'? - + Do you really want to remove %1 file(s)? @@ -3906,7 +3911,7 @@ TeamSelWidget - + At least two teams are required to play! @@ -4681,447 +4686,527 @@ server - + New voting started - + kick - + map - + pause - + new seed - + /maxteams: specify number from 2 to 8 - + + 'Registered only' state toggled. + + + + + Super power activated. + + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - - Nickname is already in use - - - - No checker rights + Nickname is already in use - Authentication failed + This server only allows registered users to join. - 60 seconds cooldown after kick + No checker rights - Kicked + Authentication failed - kicked + 60 seconds cooldown after kick - Reconnected too fast + Kicked - Ping timeout + kicked - /info <player>: Show info about player + Reconnected too fast - /me <message>: Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza' + Ping timeout - /rnd: Flip a virtual coin and reply with 'heads' or 'tails' + heads - /rnd [A] [B] [C] [...]: Reply with a random word from the given list + tails - /watch <id>: Watch a demo stored on the server with the given ID + This server does not support replays! - /help: Show chat command help + /info <player>: Show info about player - /callvote [arguments]: Start a vote + /me <message>: Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza' - /vote <yes/no>: Vote 'yes' or 'no' for active vote + /rnd: Flip a virtual coin and reply with 'heads' or 'tails' - /greeting <message>: Set greeting message to be shown to players who join the room + /rnd [A] [B] [C] [...]: Reply with a random word from the given list - /delegate <player>: Surrender room control to player + /watch <id>: Watch a demo stored on the server with the given ID - /maxteams <N>: Limit maximum number of teams to N + /help: Show chat command help - /global <message>: Send global chat message which can be seen by everyone on the server + /callvote [arguments]: Start a vote - /registered_only: Toggle 'registered only' state. If enabled, only registered players can join server - - - - - /super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server + /vote <yes/no>: Vote 'yes' or 'no' for active vote - /save <parameter> + /delegate <player>: Surrender room control to player - /stats: Query server stats + /maxteams <N>: Limit maximum number of teams to N - /force <yes/no>: Force vote result for active vote + /global <message>: Send global chat message which can be seen by everyone on the server - /fix: Force this room to stay open when it is empty + /registered_only: Toggle 'registered only' state. If enabled, only registered players can join server - /unfix: Undo the /fix command + /super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server - /saveroom <file name>: Save room configuration into a file + /stats: Query server stats - /loadroom <file name>: Load room configuration from a file + /force <yes/no>: Force vote result for active vote - /delete <parameter> + /fix: Force this room to stay open when it is empty + /unfix: Undo the /fix command + + + + List of lobby chat commands: - + List of room chat commands: - - Commands for server admins only: - - - - Unknown command: + Commands for server admins only: + + + + + room + + + + + lobby + + + + + (playing) + + + + + (spectating) + + + + + Player is not online. + + + + + The game can't be started with less than two clans! + + + + + Empty config entry. + + + + + Access denied. + + + + + You're not the room master! + + + + + Corrupted hedgehogs info! + + + + + Too many teams! + + + + + Too many hedgehogs! + + + + + There's already a team with same name in the list. + + + + + Joining not possible: Round is in progress. + + + + + This room currently does not allow adding new teams. + + + + + Error: The team you tried to remove does not exist. + + + + + You can't remove a team you don't own. + + + + + Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + A room with the same name already exists. + + + + + You can't kick yourself! + + + + + You can't kick the only other player! + + + + + The player is not in your room. + + + + + This player is protected from being kicked. + + + + + You're not the room master or a server admin! + + + + + You're already the room master. + + + + + Greeting message cleared. + + + + + Greeting message set. + + + + + /callvote kick: You need to specify a nickname. + + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + + /callvote kick: No such user! + + + + + /callvote map: No maps available. + + + + + /callvote map: No such map! + + + + + /callvote pause: No game in progress! + + + + + /callvote hedgehogs: Specify number from 1 to 8. + + + + + /force: Please use 'yes' or 'no'. + + + + + /vote: Please use 'yes' or 'no'. + + + + + Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + No such room. + + + + + Room version incompatible to your Hedgewars version! + + + + + Access denied. This room currently doesn't allow joining. + + + + + Access denied. This room is for registered users only. + + + + + You are banned from this room. + + + + + Nickname already provided. + + + + + Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + Protocol already known. + + + + + Bad number. + + + + + There's no voting going on. + + + + + You already have voted. + + + + + Your vote has been counted. + + + + + Voting closed. + + + + + Pause toggled. + + + + + Voting expired. + + + + + hedgehogs per team: + + + + + You're the new room master! - Say '/help' in chat for a list of commands + Warning! Chat flood protection activated + + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + + /delete <config ID>: Delete a votable room configuration + + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file - room + Excess flood - lobby + Game messages flood detected - 1 - (playing) - - - - - (spectating) - - - - - Player is not online. - - - - - The game can't be started with less than two clans! - - - - - Empty config entry. - - - - - Access denied. - - - - - You're not the room master! - - - - - Corrupted hedgehogs info! - - - - - Too many teams! - - - - - Too many hedgehogs! - - - - - There's already a team with same name in the list. - - - - - Joining not possible: Round is in progress. - - - - - This room currently does not allow adding new teams. - - - - - Error: The team you tried to remove does not exist. - - - - - You can't remove a team you don't own. - - - - - Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - A room with the same name already exists. - - - - - /callvote kick: You need to specify a nickname. - - - - - /callvote kick: No such user! - - - - - /callvote map: No such map! - - - - - /callvote pause: No game in progress! - - - - - /callvote hedgehogs: Specify number from 1 to 8. - - - - - /force: Please use 'yes' or 'no'. - - - - - /vote: Please use 'yes' or 'no'. - - - - - Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - No such room. - - - - - Room version incompatible to your Hedgewars version! - - - - - Access denied. This room currently doesn't allow joining. - - - - - Access denied. This room is for registered users only. - - - - - You are banned from this room. - - - - - Nickname already provided. - - - - - Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - Protocol already known. - - - - - Bad number. - - - - - There's no voting going on. - - - - - You already have voted. - - - - - Your vote has been counted. - - - - - Voting closed. - - - - - Pause toggled. - - - - - Voting expired. - - - - - hedgehogs per team: - - - - - Warning! Chat flood protection activated - - - - - Excess flood - - - - - Game messages flood detected - 1 - - - - Warning! Joins flood protection activated diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_ms.ts --- a/share/hedgewars/Data/Locale/hedgewars_ms.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_ms.ts Thu Oct 04 21:17:21 2018 +0200 @@ -648,45 +648,45 @@ - - + + Cannot save record to file %1 - + Hedgewars Demo File File Types - + Hedgewars Save File File Types - + Demo name - + Demo name: - + Unknown network error (possibly missing SSL library). - + This feature requires an Internet connection, but you don't appear to be online (error code: %1). - + Internal error: Reply object is invalid. @@ -999,34 +999,34 @@ - + You got kicked - + Server authentication error - + %1 *** %2 has left - + %1 *** %2 has left (message: "%3") - - + + %1 *** %2 has left (%3) - - + + %1 *** %2 has joined the room @@ -1046,7 +1046,7 @@ - + Room destroyed @@ -1532,7 +1532,7 @@ - + Health graph @@ -1552,28 +1552,28 @@ - + The best shot award was won by <b>%1</b> with <b>%2</b> pts. - + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. - + A total of <b>%1</b> hedgehog(s) were killed during this round. - + (%1 kill) Number of kills in stats screen, written after the team name @@ -1581,7 +1581,7 @@ - + (%1 %2) For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points” @@ -1589,26 +1589,31 @@ - + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. - + <b>%1</b> killed <b>%2</b> of their own hedgehogs. - + <b>%1</b> was scared and skipped turn <b>%2</b> times. + + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -1755,7 +1760,7 @@ - + Start fighting (requires at least 2 teams) @@ -2491,13 +2496,13 @@ - + %1 (%2%) - %3 Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”) - + encoding @@ -2905,7 +2910,7 @@ - + Playing teams @@ -3287,12 +3292,12 @@ - + Not all players are ready - + Are you sure you want to start this game? Not all players are ready. @@ -3325,24 +3330,24 @@ - + Hedgewars - Success - + All file associations have been set - + File association failed. - + Netgame - Error @@ -3352,7 +3357,7 @@ - + Please enter room name @@ -3403,18 +3408,18 @@ - - + + Videos - Are you sure? - + Do you really want to delete the video '%1'? - + Do you really want to remove %1 file(s)? @@ -3870,7 +3875,7 @@ TeamSelWidget - + At least two teams are required to play! @@ -4645,447 +4650,527 @@ server - + New voting started - + kick - + map - + pause - + new seed - + /maxteams: specify number from 2 to 8 - + + 'Registered only' state toggled. + + + + + Super power activated. + + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - - Nickname is already in use - - - - No checker rights + Nickname is already in use - Authentication failed + This server only allows registered users to join. - 60 seconds cooldown after kick + No checker rights - Kicked + Authentication failed - kicked + 60 seconds cooldown after kick - Reconnected too fast + Kicked - Ping timeout + kicked - /info <player>: Show info about player + Reconnected too fast - /me <message>: Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza' + Ping timeout - /rnd: Flip a virtual coin and reply with 'heads' or 'tails' + heads - /rnd [A] [B] [C] [...]: Reply with a random word from the given list + tails - /watch <id>: Watch a demo stored on the server with the given ID + This server does not support replays! - /help: Show chat command help + /info <player>: Show info about player - /callvote [arguments]: Start a vote + /me <message>: Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza' - /vote <yes/no>: Vote 'yes' or 'no' for active vote + /rnd: Flip a virtual coin and reply with 'heads' or 'tails' - /greeting <message>: Set greeting message to be shown to players who join the room + /rnd [A] [B] [C] [...]: Reply with a random word from the given list - /delegate <player>: Surrender room control to player + /watch <id>: Watch a demo stored on the server with the given ID - /maxteams <N>: Limit maximum number of teams to N + /help: Show chat command help - /global <message>: Send global chat message which can be seen by everyone on the server + /callvote [arguments]: Start a vote - /registered_only: Toggle 'registered only' state. If enabled, only registered players can join server - - - - - /super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server + /vote <yes/no>: Vote 'yes' or 'no' for active vote - /save <parameter> + /delegate <player>: Surrender room control to player - /stats: Query server stats + /maxteams <N>: Limit maximum number of teams to N - /force <yes/no>: Force vote result for active vote + /global <message>: Send global chat message which can be seen by everyone on the server - /fix: Force this room to stay open when it is empty + /registered_only: Toggle 'registered only' state. If enabled, only registered players can join server - /unfix: Undo the /fix command + /super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server - /saveroom <file name>: Save room configuration into a file + /stats: Query server stats - /loadroom <file name>: Load room configuration from a file + /force <yes/no>: Force vote result for active vote - /delete <parameter> + /fix: Force this room to stay open when it is empty + /unfix: Undo the /fix command + + + + List of lobby chat commands: - + List of room chat commands: - - Commands for server admins only: - - - - Unknown command: + Commands for server admins only: + + + + + room + + + + + lobby + + + + + (playing) + + + + + (spectating) + + + + + Player is not online. + + + + + The game can't be started with less than two clans! + + + + + Empty config entry. + + + + + Access denied. + + + + + You're not the room master! + + + + + Corrupted hedgehogs info! + + + + + Too many teams! + + + + + Too many hedgehogs! + + + + + There's already a team with same name in the list. + + + + + Joining not possible: Round is in progress. + + + + + This room currently does not allow adding new teams. + + + + + Error: The team you tried to remove does not exist. + + + + + You can't remove a team you don't own. + + + + + Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + A room with the same name already exists. + + + + + You can't kick yourself! + + + + + You can't kick the only other player! + + + + + The player is not in your room. + + + + + This player is protected from being kicked. + + + + + You're not the room master or a server admin! + + + + + You're already the room master. + + + + + Greeting message cleared. + + + + + Greeting message set. + + + + + /callvote kick: You need to specify a nickname. + + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + + /callvote kick: No such user! + + + + + /callvote map: No maps available. + + + + + /callvote map: No such map! + + + + + /callvote pause: No game in progress! + + + + + /callvote hedgehogs: Specify number from 1 to 8. + + + + + /force: Please use 'yes' or 'no'. + + + + + /vote: Please use 'yes' or 'no'. + + + + + Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + No such room. + + + + + Room version incompatible to your Hedgewars version! + + + + + Access denied. This room currently doesn't allow joining. + + + + + Access denied. This room is for registered users only. + + + + + You are banned from this room. + + + + + Nickname already provided. + + + + + Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + Protocol already known. + + + + + Bad number. + + + + + There's no voting going on. + + + + + You already have voted. + + + + + Your vote has been counted. + + + + + Voting closed. + + + + + Pause toggled. + + + + + Voting expired. + + + + + hedgehogs per team: + + + + + You're the new room master! - Say '/help' in chat for a list of commands + Warning! Chat flood protection activated + + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + + /delete <config ID>: Delete a votable room configuration + + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file - room + Excess flood - lobby + Game messages flood detected - 1 - (playing) - - - - - (spectating) - - - - - Player is not online. - - - - - The game can't be started with less than two clans! - - - - - Empty config entry. - - - - - Access denied. - - - - - You're not the room master! - - - - - Corrupted hedgehogs info! - - - - - Too many teams! - - - - - Too many hedgehogs! - - - - - There's already a team with same name in the list. - - - - - Joining not possible: Round is in progress. - - - - - This room currently does not allow adding new teams. - - - - - Error: The team you tried to remove does not exist. - - - - - You can't remove a team you don't own. - - - - - Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - A room with the same name already exists. - - - - - /callvote kick: You need to specify a nickname. - - - - - /callvote kick: No such user! - - - - - /callvote map: No such map! - - - - - /callvote pause: No game in progress! - - - - - /callvote hedgehogs: Specify number from 1 to 8. - - - - - /force: Please use 'yes' or 'no'. - - - - - /vote: Please use 'yes' or 'no'. - - - - - Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - No such room. - - - - - Room version incompatible to your Hedgewars version! - - - - - Access denied. This room currently doesn't allow joining. - - - - - Access denied. This room is for registered users only. - - - - - You are banned from this room. - - - - - Nickname already provided. - - - - - Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - Protocol already known. - - - - - Bad number. - - - - - There's no voting going on. - - - - - You already have voted. - - - - - Your vote has been counted. - - - - - Voting closed. - - - - - Pause toggled. - - - - - Voting expired. - - - - - hedgehogs per team: - - - - - Warning! Chat flood protection activated - - - - - Excess flood - - - - - Game messages flood detected - 1 - - - - Warning! Joins flood protection activated diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_nl.ts --- a/share/hedgewars/Data/Locale/hedgewars_nl.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_nl.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1322,6 +1322,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -3999,10 +4003,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4023,10 +4023,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4043,18 +4039,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4067,14 +4051,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4106,5 +4082,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_pl.ts --- a/share/hedgewars/Data/Locale/hedgewars_pl.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1521,6 +1521,10 @@ <b>%1</b> zabili <b>%2</b> swoich jeży. + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4733,7 +4737,7 @@ /greeting <message>: Set greeting message to be shown to players who join the room - /greeting <wiadomość>: Ustaw wiadomość powitalną, która zostanie pokazana graczom dołączającym do pokoju + /greeting <wiadomość>: Ustaw wiadomość powitalną, która zostanie pokazana graczom dołączającym do pokoju /delegate <player>: Surrender room control to player @@ -4757,7 +4761,7 @@ /save <parameter> - /save <parametr> + /save <parametr> /stats: Query server stats @@ -4777,15 +4781,15 @@ /saveroom <file name>: Save room configuration into a file - /saveroom <nazwa pliku>: Zapisz konfigurację pokoju do pliku + /saveroom <nazwa pliku>: Zapisz konfigurację pokoju do pliku /loadroom <file name>: Load room configuration from a file - /loadroom <nazwa pliku>: Wczytaj konfigurację pokoju z pliku + /loadroom <nazwa pliku>: Wczytaj konfigurację pokoju z pliku /delete <parameter> - /delete <parametr> + /delete <parametr> List of lobby chat commands: @@ -4801,11 +4805,11 @@ Unknown command: - Nieznana komenda: + Nieznana komenda: Say '/help' in chat for a list of commands - Powiedz /help do czatu, by dostać listę komend + Powiedz /help do czatu, by dostać listę komend room @@ -4839,5 +4843,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_pt_BR.ts --- a/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_pt_BR.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1424,6 +1424,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4419,10 +4423,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4443,10 +4443,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4463,18 +4459,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4487,14 +4471,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4526,5 +4502,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_pt_PT.ts --- a/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1432,6 +1432,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4509,10 +4513,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4533,10 +4533,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4553,18 +4549,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4577,14 +4561,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4616,5 +4592,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_ro.ts --- a/share/hedgewars/Data/Locale/hedgewars_ro.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_ro.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1364,6 +1364,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4145,10 +4149,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4169,10 +4169,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4189,18 +4185,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4213,14 +4197,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4252,5 +4228,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_ru.ts --- a/share/hedgewars/Data/Locale/hedgewars_ru.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_ru.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1481,6 +1481,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4460,10 +4464,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4484,10 +4484,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4504,18 +4500,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4528,14 +4512,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4567,5 +4543,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_sk.ts --- a/share/hedgewars/Data/Locale/hedgewars_sk.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_sk.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1420,6 +1420,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4405,10 +4409,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4429,10 +4429,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4449,18 +4445,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4473,14 +4457,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4512,5 +4488,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_sv.ts --- a/share/hedgewars/Data/Locale/hedgewars_sv.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_sv.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1371,6 +1371,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4225,10 +4229,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4249,10 +4249,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4269,18 +4265,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4293,14 +4277,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4332,5 +4308,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_tr_TR.ts --- a/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_tr_TR.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1418,6 +1418,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4510,10 +4514,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4534,10 +4534,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4554,18 +4550,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4578,14 +4562,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4617,5 +4593,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_uk.ts --- a/share/hedgewars/Data/Locale/hedgewars_uk.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_uk.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1444,6 +1444,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4505,10 +4509,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4529,10 +4529,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4549,18 +4545,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4573,14 +4557,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4612,5 +4588,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_zh_CN.ts --- a/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_zh_CN.ts Thu Oct 04 21:17:21 2018 +0200 @@ -652,45 +652,45 @@ - + Hedgewars Demo File File Types - + Hedgewars Save File File Types - + Demo name - + Demo name: - + Unknown network error (possibly missing SSL library). - + This feature requires an Internet connection, but you don't appear to be online (error code: %1). - + Internal error: Reply object is invalid. - - + + Cannot save record to file %1 无法录入文件 %1 @@ -1022,29 +1022,29 @@ - + Server authentication error - + %1 *** %2 has left - + %1 *** %2 has left (message: "%3") - - + + %1 *** %2 has left (%3) - - + + %1 *** %2 has joined the room @@ -1053,12 +1053,12 @@ 退出原因: - + Room destroyed 房间损坏 - + You got kicked 被踢出 @@ -1551,7 +1551,7 @@ - + Health graph @@ -1571,28 +1571,28 @@ 保存 - + The best shot award was won by <b>%1</b> with <b>%2</b> pts. - + The best killer is <b>%1</b> with <b>%2</b> kills in a turn. - + A total of <b>%1</b> hedgehog(s) were killed during this round. - + (%1 kill) Number of kills in stats screen, written after the team name @@ -1600,7 +1600,7 @@ - + (%1 %2) For custom number of points in the stats screen, written after the team name. %1 is the number, %2 is the word. Example: “4 points” @@ -1608,26 +1608,31 @@ - + <b>%1</b> thought it's good to shoot their own hedgehogs for <b>%2</b> pts. - + <b>%1</b> killed <b>%2</b> of their own hedgehogs. - + <b>%1</b> was scared and skipped turn <b>%2</b> times. + + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -1769,7 +1774,7 @@ - + Start fighting (requires at least 2 teams) @@ -2522,13 +2527,13 @@ - + %1 (%2%) - %3 Video encoding list entry. %1 = file name, %2 = percent complete, %3 = video operation type (e.g. “encoding”) - + encoding @@ -2919,7 +2924,7 @@ 城堡模式 - + Playing teams 玩家队伍 @@ -3359,12 +3364,12 @@ 服务器连接丢失 - + Not all players are ready - + Are you sure you want to start this game? Not all players are ready. @@ -3397,24 +3402,24 @@ - + Hedgewars - Success - + All file associations have been set - + File association failed. - + Netgame - Error @@ -3424,7 +3429,7 @@ - + Please enter room name @@ -3475,18 +3480,18 @@ - - + + Videos - Are you sure? - + Do you really want to delete the video '%1'? - + Do you really want to remove %1 file(s)? @@ -3925,7 +3930,7 @@ TeamSelWidget - + At least two teams are required to play! @@ -4708,447 +4713,527 @@ server - + New voting started - + kick - + map - + pause 暂停 - + new seed - + /maxteams: specify number from 2 to 8 - + + 'Registered only' state toggled. + + + + + Super power activated. + + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + Available callvote commands: kick <nickname>, map <name>, pause, newseed, hedgehogs - - Nickname is already in use - - - - No checker rights + Nickname is already in use - Authentication failed + This server only allows registered users to join. - 60 seconds cooldown after kick + No checker rights - Kicked + Authentication failed - kicked + 60 seconds cooldown after kick - Reconnected too fast + Kicked - Ping timeout + kicked - /info <player>: Show info about player + Reconnected too fast - /me <message>: Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza' + Ping timeout - /rnd: Flip a virtual coin and reply with 'heads' or 'tails' + heads - /rnd [A] [B] [C] [...]: Reply with a random word from the given list + tails - /watch <id>: Watch a demo stored on the server with the given ID + This server does not support replays! - /help: Show chat command help + /info <player>: Show info about player - /callvote [arguments]: Start a vote + /me <message>: Chat action, e.g. '/me eats pizza' becomes '* Player eats pizza' - /vote <yes/no>: Vote 'yes' or 'no' for active vote + /rnd: Flip a virtual coin and reply with 'heads' or 'tails' - /greeting <message>: Set greeting message to be shown to players who join the room + /rnd [A] [B] [C] [...]: Reply with a random word from the given list - /delegate <player>: Surrender room control to player + /watch <id>: Watch a demo stored on the server with the given ID - /maxteams <N>: Limit maximum number of teams to N + /help: Show chat command help - /global <message>: Send global chat message which can be seen by everyone on the server + /callvote [arguments]: Start a vote - /registered_only: Toggle 'registered only' state. If enabled, only registered players can join server - - - - - /super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server + /vote <yes/no>: Vote 'yes' or 'no' for active vote - /save <parameter> + /delegate <player>: Surrender room control to player - /stats: Query server stats + /maxteams <N>: Limit maximum number of teams to N - /force <yes/no>: Force vote result for active vote + /global <message>: Send global chat message which can be seen by everyone on the server - /fix: Force this room to stay open when it is empty + /registered_only: Toggle 'registered only' state. If enabled, only registered players can join server - /unfix: Undo the /fix command + /super_power: Activate your super power. With it you can enter any room and are protected from kicking. Expires when you leave server - /saveroom <file name>: Save room configuration into a file + /stats: Query server stats - /loadroom <file name>: Load room configuration from a file + /force <yes/no>: Force vote result for active vote - /delete <parameter> + /fix: Force this room to stay open when it is empty + /unfix: Undo the /fix command + + + + List of lobby chat commands: - + List of room chat commands: - - Commands for server admins only: - - - - Unknown command: + Commands for server admins only: + + + + + room + + + + + lobby + + + + + (playing) + + + + + (spectating) + + + + + Player is not online. + + + + + The game can't be started with less than two clans! + + + + + Empty config entry. + + + + + Access denied. + + + + + You're not the room master! + + + + + Corrupted hedgehogs info! + + + + + Too many teams! + + + + + Too many hedgehogs! + + + + + There's already a team with same name in the list. + + + + + Joining not possible: Round is in progress. + + + + + This room currently does not allow adding new teams. + + + + + Error: The team you tried to remove does not exist. + + + + + You can't remove a team you don't own. + + + + + Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + A room with the same name already exists. + + + + + You can't kick yourself! + + + + + You can't kick the only other player! + + + + + The player is not in your room. + + + + + This player is protected from being kicked. + + + + + You're not the room master or a server admin! + + + + + You're already the room master. + + + + + Greeting message cleared. + + + + + Greeting message set. + + + + + /callvote kick: You need to specify a nickname. + + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + + /callvote kick: No such user! + + + + + /callvote map: No maps available. + + + + + /callvote map: No such map! + + + + + /callvote pause: No game in progress! + + + + + /callvote hedgehogs: Specify number from 1 to 8. + + + + + /force: Please use 'yes' or 'no'. + + + + + /vote: Please use 'yes' or 'no'. + + + + + Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + No such room. + + + + + Room version incompatible to your Hedgewars version! + + + + + Access denied. This room currently doesn't allow joining. + + + + + Access denied. This room is for registered users only. + + + + + You are banned from this room. + + + + + Nickname already provided. + + + + + Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} + + + + + Protocol already known. + + + + + Bad number. + + + + + There's no voting going on. + + + + + You already have voted. + + + + + Your vote has been counted. + + + + + Voting closed. + + + + + Pause toggled. + + + + + Voting expired. + + + + + hedgehogs per team: + + + + + You're the new room master! - Say '/help' in chat for a list of commands + Warning! Chat flood protection activated + + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + + /delete <config ID>: Delete a votable room configuration + + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file - room + Excess flood - lobby + Game messages flood detected - 1 - (playing) - - - - - (spectating) - - - - - Player is not online. - - - - - The game can't be started with less than two clans! - - - - - Empty config entry. - - - - - Access denied. - - - - - You're not the room master! - - - - - Corrupted hedgehogs info! - - - - - Too many teams! - - - - - Too many hedgehogs! - - - - - There's already a team with same name in the list. - - - - - Joining not possible: Round is in progress. - - - - - This room currently does not allow adding new teams. - - - - - Error: The team you tried to remove does not exist. - - - - - You can't remove a team you don't own. - - - - - Illegal room name! The room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - A room with the same name already exists. - - - - - /callvote kick: You need to specify a nickname. - - - - - /callvote kick: No such user! - - - - - /callvote map: No such map! - - - - - /callvote pause: No game in progress! - - - - - /callvote hedgehogs: Specify number from 1 to 8. - - - - - /force: Please use 'yes' or 'no'. - - - - - /vote: Please use 'yes' or 'no'. - - - - - Illegal room name! A room name must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - No such room. - - - - - Room version incompatible to your Hedgewars version! - - - - - Access denied. This room currently doesn't allow joining. - - - - - Access denied. This room is for registered users only. - - - - - You are banned from this room. - - - - - Nickname already provided. - - - - - Illegal nickname! Nicknames must be between 1-40 characters long, must not have a trailing or leading space and must not have any of these characters: $()*+?[]^{|} - - - - - Protocol already known. - - - - - Bad number. - - - - - There's no voting going on. - - - - - You already have voted. - - - - - Your vote has been counted. - - - - - Voting closed. - - - - - Pause toggled. - - - - - Voting expired. - - - - - hedgehogs per team: - - - - - Warning! Chat flood protection activated - - - - - Excess flood - - - - - Game messages flood detected - 1 - - - - Warning! Joins flood protection activated diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/hedgewars_zh_TW.ts --- a/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/hedgewars_zh_TW.ts Thu Oct 04 21:17:21 2018 +0200 @@ -1415,6 +1415,10 @@ + + With everyone having the same clan color, there was no reason to fight. And so the hedgehogs happily lived in peace ever after. + + PageInGame @@ -4473,10 +4477,6 @@ - /greeting <message>: Set greeting message to be shown to players who join the room - - - /delegate <player>: Surrender room control to player @@ -4497,10 +4497,6 @@ - /save <parameter> - - - /stats: Query server stats @@ -4517,18 +4513,6 @@ - /saveroom <file name>: Save room configuration into a file - - - - /loadroom <file name>: Load room configuration from a file - - - - /delete <parameter> - - - List of lobby chat commands: @@ -4541,14 +4525,6 @@ - Unknown command: - - - - Say '/help' in chat for a list of commands - - - room @@ -4580,5 +4556,97 @@ Kicked + + This server only allows registered users to join. + + + + heads + + + + tails + + + + This server does not support replays! + + + + /greeting [message]: Set or clear greeting message to be shown to players who join the room + + + + /save <config ID> <config name>: Add current room configuration as votable choice for /callvote map + + + + /delete <config ID>: Delete a votable room configuration + + + + /saveroom <file name>: Save all votable room configurations (and the greeting) of this room into a file + + + + /loadroom <file name>: Load votable room configurations (and greeting) from a file + + + + 'Registered only' state toggled. + + + + Super power activated. + + + + Unknown command or invalid parameters. Say '/help' in chat for a list of commands. + + + + You can't kick yourself! + + + + You can't kick the only other player! + + + + The player is not in your room. + + + + This player is protected from being kicked. + + + + You're not the room master or a server admin! + + + + You're already the room master. + + + + Greeting message cleared. + + + + Greeting message set. + + + + /callvote kick: This is only allowed in rooms without a room master. + + + + /callvote map: No maps available. + + + + You're the new room master! + + diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/it.lua --- a/share/hedgewars/Data/Locale/it.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/it.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant ["-1 to anyone for a suicide"] = "-1 a chiunque per essersi suicidato", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -1569,8 +1569,8 @@ ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "Una tribù era pacifica, andava a caccia e si allenanava, godendo dei piccoli piaceri della vita...", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1652,8 +1652,8 @@ -- ["Place weapon crates"] = "", -- HedgeEditor -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag + ["Planes Used"] = "Aerei usati", -- User_Mission_-_RCPlane_Challenge ["Planes Used:"] = "Aerei usati:", -- User_Mission_-_RCPlane_Challenge - ["Planes Used"] = "Aerei usati", -- User_Mission_-_RCPlane_Challenge -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 ["The Torment"] = "La tormenta", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/ko.lua --- a/share/hedgewars/Data/Locale/ko.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/ko.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/lt.lua --- a/share/hedgewars/Data/Locale/lt.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/lt.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/pl.lua --- a/share/hedgewars/Data/Locale/pl.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/pl.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ ["%.1f seconds were remaining."] = "%.1f sekund pozostało.", -- Basic_Training_-_Bazooka ["+1 Grenade"] = "+1 granat", -- Basic_Training_-_Flying_Saucer ["+1 mine!"] = "+1 mina!", -- Tumbler + ["+1 point"] = "+1 punkt", -- Mutant ["-1 point"] = "-1 punkt", -- Mutant - ["+1 point"] = "+1 punkt", -- Mutant ["-1 to anyone for a suicide"] = "-1 dla każdego za samobójstwo", -- Mutant ["+1 to the Bottom Feeder for killing anyone"] = "+1 dla Pasożyta za zabicie kogokolwiek", -- Mutant ["+1 to the Mutant for killing anyone"] = "+1 dla Mutanta za zabicie kogokolwiek", -- Mutant @@ -1570,8 +1570,8 @@ ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "Nasze plemię było pokojowe, spędzając swój czas na polowaniu i treningu, ciesząc się z małych przyjemności w życiu...", -- A_Classic_Fairytale:first_blood ["Oneye"] = "Jednooki", -- portal ["Only Hog Solo can be trusted with the crate."] = "Skrzynia może być powierzona tylko Hogowi Solo.", -- A_Space_Adventure:fruit02 + ["Only one hog per team allowed! Excess hogs will be removed"] = "Dozwolony tylko jeden jeż na drużynę! Nadmiarowe jeże będą usunięte", -- Mutant ["Only one hog per team allowed! Excess hogs will be removed."] = "Dozwolony tylko jeden jeż na drużynę! Nadmiarowe jeże będą usunięte.", -- Mutant - ["Only one hog per team allowed! Excess hogs will be removed"] = "Dozwolony tylko jeden jeż na drużynę! Nadmiarowe jeże będą usunięte", -- Mutant ["Only the best pilots can master the following stunts."] = "Tylko najlepsi piloci mogą opanować następujące wyczyny.", -- Basic_Training_-_Flying_Saucer ["Only two clans allowed! Excess hedgehogs will be removed."] = "Tylko dwa klany dozwolone! Nadmiarowe jeże będą usunięte.", -- CTF_Blizzard ["On the Ice Planet, where ice rules ..."] = "Na Lodowej Planecie, gdzie rządzi lód...", -- A_Space_Adventure:ice01 @@ -1849,8 +1849,8 @@ ["Score points by killing other hedgehogs (see below)."] = "Zdobądź punkty, zabijając inne jeże (zobacz niżej).", -- Mutant ["Score points by killing other hedgehogs."] = "Zdobądź punkty zabijając inne jeże.", -- Mutant ["Scores: "] = "Wyniki: ", -- Capture_the_Flag + ["Scores"] = "Wyniki", -- Mutant ["Scores:"] = "Wyniki:", -- Mutant - ["Scores"] = "Wyniki", -- Mutant ["Scoring: "] = "Wynki: ", -- Mutant ["Script parameter examples:"] = "Przykłady parametrów skryptu:", -- Gravity -- ["%s (%d)"] = "", -- Continental_supplies @@ -2171,6 +2171,7 @@ ["Team Identity Mode"] = "Tryb Tożsamości Drużyny", -- HedgeEditor ["TEAM IDENTITY MODE"] = "TRYB TOŻSAMOŚCI DRUŻYNY", -- HedgeEditor ["Team of Hearts"] = "Drużyna Serc", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion ["Team Scores:"] = "Wyniki drużyn:", -- Control ["Team scores:"] = "Wyniki drużyn:", -- Space_Invasion ["Teamwork 2"] = "Praca zespołowa 2", -- User_Mission_-_Teamwork_2 @@ -2333,6 +2334,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood ["The targets will guide you through the training."] = "Cele poprowadzą cię przez trening.", -- Basic_Training_-_Rope ["The team continued their quest of finding the rest of the tribe."] = "Drużyna kontynuowała swoje zadanie odnalezienia reszty plemienia.", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "Czas, który ci pozostanie po dotarciu do niebieskiego jeża, zosanie dodany do następnej tury.", -- A_Space_Adventure:moon02 ["The Torment"] = "Udręka", -- A_Classic_Fairytale:first_blood ["The truth about Professor Hogevil"] = "Prawda o Profesorze Jeżozło", -- A_Space_Adventure:moon02 @@ -2403,6 +2406,7 @@ ["Throw a grenade to destroy the target!"] = "Rzuć granatem, by zniszczyć cel!", -- Basic_Training_-_Grenade ["Throw some grenades to destroy the targets!"] = "Rzuć trochę granatów, by zniszczyć cele!", -- Basic_Training_-_Grenade ["Thug #%d"] = "Zbir #%d", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion ["Timbers"] = "Drewna", ["Time: %.1fs"] = "Czas: %.1fs", -- Racer, TechRacer ["Time: %.3fs by %s"] = "Czas: %.3fs (%s)", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/pt_BR.lua --- a/share/hedgewars/Data/Locale/pt_BR.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/pt_BR.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/pt_PT.lua --- a/share/hedgewars/Data/Locale/pt_PT.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/pt_PT.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/ru.lua --- a/share/hedgewars/Data/Locale/ru.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/ru.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant ["-1 to anyone for a suicide"] = "-1 за самоубийство", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator: Generates energy."] = "", -- Construction_Mode ["Generator"] = "Генератор", -- Construction_Mode @@ -1053,8 +1053,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1568,8 +1568,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1844,8 +1844,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2166,6 +2166,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor ["Team of Hearts"] = "Команда сердец", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2327,6 +2328,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2397,6 +2400,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/sk.lua --- a/share/hedgewars/Data/Locale/sk.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/sk.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2170,6 +2170,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2332,6 +2333,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2402,6 +2405,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/stub.lua --- a/share/hedgewars/Data/Locale/stub.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/stub.lua Thu Oct 04 21:17:21 2018 +0200 @@ -8,8 +8,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -2030,6 +2030,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 -- ["Teamwork"] = "", -- User_Mission_-_Teamwork -- ["Team Zook"] = "", -- Target_Practice_-_Bazooka_easy, Target_Practice_-_Bazooka_hard @@ -2177,6 +2178,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2242,6 +2245,7 @@ -- ["Throw a baseball at your foes|and send them flying!"] = "", -- Knockball -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/sv.lua --- a/share/hedgewars/Data/Locale/sv.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/sv.lua Thu Oct 04 21:17:21 2018 +0200 @@ -1,6 +1,6 @@ locale = { + ["!!!"] = "!!!", -- ["..."] = "", - ["!!!"] = "!!!", -- ["011101000"] = "", -- A_Classic_Fairytale:dragon -- ["011101001"] = "", -- A_Classic_Fairytale:backstab, A_Classic_Fairytale:dragon, A_Classic_Fairytale:enemy, A_Classic_Fairytale:family, A_Classic_Fairytale:journey, A_Classic_Fairytale:queen, A_Classic_Fairytale:shadow, A_Classic_Fairytale:united -- ["10 weapon schemes"] = "", -- Continental_supplies @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1653,8 +1653,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1847,8 +1847,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2169,6 +2169,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2331,6 +2332,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2401,6 +2404,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/tr.lua --- a/share/hedgewars/Data/Locale/tr.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/tr.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1570,8 +1570,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1654,8 +1654,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1849,8 +1849,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2172,6 +2172,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2334,6 +2335,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2404,6 +2407,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/uk.lua --- a/share/hedgewars/Data/Locale/uk.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/uk.lua Thu Oct 04 21:17:21 2018 +0200 @@ -10,8 +10,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -712,8 +712,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1053,8 +1053,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1568,8 +1568,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1652,8 +1652,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos ["Play with me!"] = "Зіграй зі мною!", -- A_Classic_Fairytale:shadow @@ -1846,8 +1846,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2168,6 +2168,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2330,6 +2331,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2400,6 +2403,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Locale/zh_CN.lua --- a/share/hedgewars/Data/Locale/zh_CN.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Locale/zh_CN.lua Thu Oct 04 21:17:21 2018 +0200 @@ -11,8 +11,8 @@ -- ["%.1fs"] = "", -- Racer, TechRacer -- ["+1 Grenade"] = "", -- Basic_Training_-_Flying_Saucer -- ["+1 mine!"] = "", -- Tumbler +-- ["+1 point"] = "", -- Mutant -- ["-1 point"] = "", -- Mutant --- ["+1 point"] = "", -- Mutant -- ["-1 to anyone for a suicide"] = "", -- Mutant -- ["+1 to the Bottom Feeder for killing anyone"] = "", -- Mutant -- ["+1 to the Mutant for killing anyone"] = "", -- Mutant @@ -713,8 +713,8 @@ -- ["Gear information hidden"] = "", -- HedgeEditor -- ["Gear information shown"] = "", -- HedgeEditor -- ["Gear Placement Tool"] = "", -- HedgeEditor +-- ["General information"] = "", -- Continental_supplies -- ["General information:"] = "", -- Continental_supplies --- ["General information"] = "", -- Continental_supplies -- ["General Lemon"] = "", -- A_Space_Adventure:fruit01 -- ["Generator"] = "", -- Construction_Mode -- ["Generator: Generates energy."] = "", -- Construction_Mode @@ -1054,8 +1054,8 @@ -- ["If you can get that crate fast enough, your beloved \"princess\" may go free."] = "", -- A_Classic_Fairytale:journey -- ["If you decide to help us, though, we will no longer need to find a new governor for the island."] = "", -- A_Classic_Fairytale:shadow -- ["If you don't want to slip away, you have to keep moving!"] = "", -- Basic_Training_-_Movement +-- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you get stuck, use your Desert Eagle or restart the mission!|"] = "", -- A_Classic_Fairytale:journey --- ["If you get stuck, use your Desert Eagle or restart the mission!"] = "", -- A_Classic_Fairytale:journey -- ["If you help us you can keep the device if you find it but we'll keep everything else."] = "", -- A_Space_Adventure:fruit02 -- ["If you hurt an enemy, you'll get one third of the damage dealt."] = "", -- A_Space_Adventure:death02 -- ["If you injure a hedgehog you'll get 35% of the damage dealt."] = "", -- A_Space_Adventure:death02 @@ -1569,8 +1569,8 @@ -- ["One tribe was peaceful, spending their time hunting and training, enjoying the small pleasures of life..."] = "", -- A_Classic_Fairytale:first_blood -- ["Oneye"] = "", -- portal -- ["Only Hog Solo can be trusted with the crate."] = "", -- A_Space_Adventure:fruit02 +-- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only one hog per team allowed! Excess hogs will be removed."] = "", -- Mutant --- ["Only one hog per team allowed! Excess hogs will be removed"] = "", -- Mutant -- ["Only the best pilots can master the following stunts."] = "", -- Basic_Training_-_Flying_Saucer -- ["Only two clans allowed! Excess hedgehogs will be removed."] = "", -- CTF_Blizzard -- ["On the Ice Planet, where ice rules ..."] = "", -- A_Space_Adventure:ice01 @@ -1655,8 +1655,8 @@ -- ["- Place your clan flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["- Place your team flag at the end of your first turn"] = "", -- Capture_the_Flag -- ["Planes used: %d"] = "", -- User_Mission_-_RCPlane_Challenge +-- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planes Used:"] = "", -- User_Mission_-_RCPlane_Challenge --- ["Planes Used"] = "", -- User_Mission_-_RCPlane_Challenge -- ["Planets with all missions completed will be marked with two flowers."] = "", -- A_Space_Adventure:cosmos -- ["Planets with completed main missions will be marked with a flower."] = "", -- A_Space_Adventure:cosmos -- ["Play with me!"] = "", -- A_Classic_Fairytale:shadow @@ -1849,8 +1849,8 @@ -- ["Score points by killing other hedgehogs."] = "", -- Mutant -- ["Score points by killing other hedgehogs (see below)."] = "", -- Mutant -- ["Scores: "] = "", -- Capture_the_Flag +-- ["Scores"] = "", -- Mutant -- ["Scores:"] = "", -- Mutant --- ["Scores"] = "", -- Mutant -- ["Scoring: "] = "", -- Mutant -- ["Script parameter examples:"] = "", -- Gravity -- ["%s (+%d)"] = "", -- Battalion @@ -2171,6 +2171,7 @@ -- ["Team Identity Mode"] = "", -- HedgeEditor -- ["TEAM IDENTITY MODE"] = "", -- HedgeEditor -- ["Team of Hearts"] = "", -- Challenge_-_Speed_Shoppa_-_Hedgelove +-- ["Teams are tied! Continue playing rounds until we have a winner!"] = "", -- Space_Invasion -- ["Team Scores:"] = "", -- Control -- ["Team scores:"] = "", -- Space_Invasion -- ["Teamwork 2"] = "", -- User_Mission_-_Teamwork_2 @@ -2333,6 +2334,8 @@ -- ["The spirits of the ancestors are surely pleased, Leaks A Lot."] = "", -- A_Classic_Fairytale:first_blood -- ["The targets will guide you through the training."] = "", -- Basic_Training_-_Rope -- ["The team continued their quest of finding the rest of the tribe."] = "", -- A_Classic_Fairytale:queen +-- ["The teams were tied, so an additional round has been played to determine the winner."] = "", -- Space_Invasion +-- ["The teams were tied, so %d additional rounds have been played to determine the winner."] = "", -- Space_Invasion -- ["The time that you have left when you reach the blue hedgehog will be added to the next turn."] = "", -- A_Space_Adventure:moon02 -- ["The Torment"] = "", -- A_Classic_Fairytale:first_blood -- ["The truth about Professor Hogevil"] = "", -- A_Space_Adventure:moon02 @@ -2403,6 +2406,7 @@ -- ["Throw a grenade to destroy the target!"] = "", -- Basic_Training_-_Grenade -- ["Throw some grenades to destroy the targets!"] = "", -- Basic_Training_-_Grenade -- ["Thug #%d"] = "", -- A_Space_Adventure:death01 +-- ["Tie-breaking round %d"] = "", -- Space_Invasion -- ["Timbers"] = "", -- -- ["Time: %.1fs"] = "", -- Racer, TechRacer -- ["Time: %.3fs by %s"] = "", -- TrophyRace diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Maps/CTF_Blizzard/map.lua --- a/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Maps/CTF_Blizzard/map.lua Thu Oct 04 21:17:21 2018 +0200 @@ -580,6 +580,10 @@ fSpawnX[1] = 3123 fSpawnY[1] = 1747 + if ClansCount < 2 then + return + end + for i = 0, 1 do fGear[i] = SpawnFakeAmmoCrate(fSpawnX[i],fSpawnY[i],false,false) fCirc[i] = AddVisualGear(fSpawnX[i],fSpawnY[i],vgtCircle,0,true) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Maps/TrophyRace/map.lua --- a/share/hedgewars/Data/Maps/TrophyRace/map.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Maps/TrophyRace/map.lua Thu Oct 04 21:17:21 2018 +0200 @@ -82,7 +82,9 @@ for i=0, ClansCount-1 do clantimes[i] = 0 end - SendAchievementsStatsOff() + if ClansCount >= 2 then + SendAchievementsStatsOff() + end end function onAmmoStoreInit() diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/desert02.lua Thu Oct 04 21:17:21 2018 +0200 @@ -5,6 +5,7 @@ HedgewarsScriptLoad("/Scripts/Locale.lua") HedgewarsScriptLoad("/Scripts/Animate.lua") +HedgewarsScriptLoad("/Scripts/Achievements.lua") HedgewarsScriptLoad("/Missions/Campaign/A_Space_Adventure/global_functions.lua") ----------------- VARIABLES -------------------- @@ -17,6 +18,10 @@ local goals = { [dialog01] = {missionName, loc("Getting ready"), loc("Use the rope to quickly get to the surface!") .. "|" .. loc("Mines time: 1 second"), 1, 4500}, } +-- For an achievement/award (see below) +local cratesCollected = 0 +local totalCrates = 0 +local damageTaken = false -- health crates healthX = 565 health1Y = 1400 @@ -121,12 +126,25 @@ function onGearAdd(gear) if GetGearType(gear) == gtRope then HideMission() + elseif GetGearType(gear) == gtCase then + totalCrates = totalCrates + 1 end end function onGearDelete(gear) if gear == hero.gear then hero.dead = true + damageTaken = true + end + -- Crate collected + if GetGearType(gear) == gtCase and band(GetGearMessage(gear), gmDestroy) ~= 0 then + cratesCollected = cratesCollected + 1 + end +end + +function onGearDamage(gear) + if gear == hero.gear then + damageTaken = true end end @@ -177,6 +195,10 @@ SendStat(siCustomAchievement, loc("This is a new personal best, congratulations!")) end end + -- Achievement awarded for escaping with all crates collected and no damage taken + if (not damageTaken) and (cratesCollected >= totalCrates) then + awardAchievement(loc("Better Safe Than Sorry")) + end sendSimpleTeamRankings({teamA.name}) SaveCampaignVar("Mission7Won", "true") checkAllMissionsCompleted() diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/final.lua Thu Oct 04 21:17:21 2018 +0200 @@ -160,6 +160,8 @@ end function heroBoomReaction(gear) + SetSoundMask(sndMissed, true) + SetSoundMask(sndYesSir, true) if GetHealth(gear) and GetHealth(gear) > 0 then HogSay(gear, loc("Kaboom! Hahahaha! Take this, stupid meteorite!"), SAY_SHOUT, 2) end diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua --- a/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice02.lua Thu Oct 04 21:17:21 2018 +0200 @@ -13,15 +13,16 @@ local missionName = loc("Hard flying") local challengeStarted = false local currentWaypoint = 1 -local radius = 75 -local totalTime = 15000 +local radius = 75 -- Ring radius. Will become smaller and smaller +local totalTime = 15000 -- Total available time. Initial value is start time; is added to later when player wins extra time local totalSaucers = 3 local gameEnded = false +local heroTurn = false local RED = 0xff0000ff -local GREEN = 0x38d61cff +local GREEN = 0x00ff00ff local challengeObjectives = loc("To win the game you have to pass into the rings in time.").. "|"..loc("You'll get extra time in case you need it when you pass a ring.").."|".. - loc("Every 2 rings, the ring color will be green and you'll get an extra flying saucer.").."|".. + loc("Green double rings also give you a new flying saucer.").."|".. loc("Use the attack key twice to change the flying saucer while floating in mid-air.") local timeRecord -- dialogs @@ -45,7 +46,6 @@ teamB.name = loc("Allies") teamB.color = -6 -- way points -local current waypoint = 1 local waypoints = { [1] = {x=1450, y=140}, [2] = {x=990, y=580}, @@ -69,7 +69,7 @@ function onGameInit() GameFlags = gfInvulnerable + gfOneClanMode Seed = 1 - TurnTime = 15000 + TurnTime = totalTime Ready = 25000 CaseFreq = 0 MinesNum = 0 @@ -132,6 +132,7 @@ elseif not hero.dead and CurrentHedgehog == hero.gear and challengeStarted then SetWeapon(amJetpack) end + heroTurn = CurrentHedgehog == hero.gear end function onGameTick() @@ -152,6 +153,7 @@ local totalTimePrinted = totalTime / 1000 local saucersLeft = GetAmmoCount(hero.gear, amJetpack) local saucersUsed = totalSaucers - saucersLeft + SetTeamLabel(teamA.name, string.format(loc("%.3f s"), totalTimePrinted)) SendStat(siGameResult, loc("Hooray! You are a champion!")) SendStat(siCustomAchievement, string.format(loc("You completed the mission in %.3f seconds."), totalTimePrinted)) if timeRecord ~= nil and totalTime >= timeRecord then @@ -175,9 +177,15 @@ SendStat(siPlayerKills, totalTime, GetHogTeamName(hero.gear)) SaveCampaignVar("Mission6Won", "true") checkAllMissionsCompleted() + SetTurnTimeLeft(MAX_TURN_TIME) EndGame() end end + if heroTurn and challengeStarted and not gameEnded and not hero.dead and ReadyTimeLeft == 0 then + local time = totalTime - TurnTimeLeft + local timePrinted = time / 1000 + SetTeamLabel(teamA.name, string.format(loc("%.1f s"), timePrinted)) + end end function onGearDelete(gear) @@ -246,15 +254,18 @@ if currentWaypoint > 1 then local wp = waypoints[currentWaypoint-1] DeleteVisualGear(wp.gear) + DeleteVisualGear(wp.gear2) end if currentWaypoint < 16 then local wp = waypoints[currentWaypoint] wp.gear = AddVisualGear(1,1,vgtCircle,1,true) - -- add bonus time and "fuel" + -- 1st, 3rd, 5th, 7th, 9th, ... ring if currentWaypoint % 2 == 0 then + -- Render single red ring + SetVisualGearValues(wp.gear, wp.x,wp.y, 20, 200, 0, 0, 100, radius, 3, RED) + -- Give 1 flying saucer and, if needed, extra time + AddAmmo(hero.gear, amJetpack, GetAmmoCount(hero.gear, amJetpack)+1) PlaySound(sndShotgunReload) - SetVisualGearValues(wp.gear, wp.x,wp.y, 20, 200, 0, 0, 100, radius, 3, RED) - AddAmmo(hero.gear, amJetpack, GetAmmoCount(hero.gear, amJetpack)+1) totalSaucers = totalSaucers + 1 local vgear = AddVisualGear(GetX(hero.gear), GetY(hero.gear), vgtAmmo, 0, true) if vgear ~= nil then @@ -270,12 +281,17 @@ message = loc("Got 1 more saucer") end AnimCaption(hero.gear, message, 4000) + -- 2nd, 4th, 6th, 8th, 10th, ... ring else + -- Render double green ring SetVisualGearValues(wp.gear, wp.x,wp.y, 20, 200, 0, 0, 100, radius, 3, GREEN) + wp.gear2 = AddVisualGear(1,1,vgtCircle,1,true) + SetVisualGearValues(wp.gear2, wp.x,wp.y, 20, 200, 0, 0, 100, radius - 6, 2, GREEN) + -- Give extra time, if needed if TurnTimeLeft <= 16000 then - SetTurnTimeLeft(TurnTimeLeft + 6000) - totalTime = totalTime + 6000 if currentWaypoint ~= 1 then + SetTurnTimeLeft(TurnTimeLeft + 6000) + totalTime = totalTime + 6000 PlaySound(sndExtraTime) AnimCaption(hero.gear, loc("6 more seconds added to the clock"), 4000) end @@ -306,7 +322,7 @@ SendStat(siGameResult, loc("Oh man! Learn how to fly!")) SendStat(siCustomAchievement, loc("To win the game you have to pass into the rings in time.")) SendStat(siCustomAchievement, loc("You'll get extra time in case you need it when you pass a ring.")) - SendStat(siCustomAchievement, loc("Every 2 rings you'll get extra flying saucers.")) + SendStat(siCustomAchievement, loc("Green double rings also give you a new flying saucer.")) SendStat(siCustomAchievement, loc("Use the attack key twice to change the flying saucer while being in air.")) sendSimpleTeamRankings({teamA.name}) EndGame() diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua --- a/share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Missions/Training/Basic_Training_-_Movement.lua Thu Oct 04 21:17:21 2018 +0200 @@ -162,7 +162,8 @@ PlaceSprite(1175, 1772, sprAmGirder, 0, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1226, 1738, sprAmGirder, 2, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1275, 1705, sprAmGirder, 0, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) - PlaceSprite(1325, 1683, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) + PlaceSprite(1325, 1700, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) + PlaceSprite(1342, 1638, sprAmGirder, 2, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1368, 1560, sprAmGirder, 3, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1390, 1665, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1481, 1716, sprAmGirder, 4, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) @@ -192,7 +193,7 @@ PlaceSprite(1545, 1811, sprAmGirder, 2, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1577, 1761, sprAmGirder, 0, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(1610, 1811, sprAmGirder, 2, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) - PlaceSprite(1440, 1531, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) + PlaceSprite(1440, 1511, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(2082, 1337, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(2187, 1273, sprAmGirder, 6, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) PlaceSprite(2097, 1246, sprAmGirder, 4, U_LAND_TINT_NORMAL, nil, nil, nil, lfNormal) @@ -237,7 +238,7 @@ crates[4] = SpawnHealthCrate(889, 1829) -- Back Jumping crates[5] = SpawnHealthCrate(1486, 1694) -- Walking on Ice crates[6] = SpawnHealthCrate(2033, 1470) -- Walking on Ice completed - crates[7] = SpawnHealthCrate(1297, 1683) -- Back Jumping 2 + crates[7] = SpawnHealthCrate(1198, 1750) -- Back Jumping 2 crates[8] = SpawnSupplyCrate(1851, 1402, amSwitch, 100) -- Switch Hedgehog crates[9] = SpawnHealthCrate(564, 1772) -- Health crates[10] = SpawnHealthCrate(2290, 1622) -- Turning Around @@ -247,6 +248,7 @@ ShowMission(loc("Basic Movement Training"), loc("Training complete!"),loc("Congratulations! You have completed the obstacle course!"), 0, 0) SendStat(siGameResult, loc("You have completed the Basic Movement Training!")) SendStat(siCustomAchievement, loc("Congratulations!")) + SendStat(siCustomAchievement, loc("Return to the training menu by pressing the “Go back” button.")) SendStat(siPlayerKills, "0", loc("Training Team")) PlaySound(sndVictory, CurrentHedgehog) -- Disable controls, end game @@ -310,10 +312,8 @@ loc("High Jump: [Backspace]").."|"..loc("Back Jump: [Backspace] ×2"), 2, 6600) elseif gear == crates[7] then ShowMission(loc("Basic Movement Training"), loc("Back Jumping (2/2)"), - loc("To get over the next obstacle, you need to perform your back jump precisely.").."|".. - loc("Hint: Hit “High Jump” again when you're close to the highest point of a high jump.").."|".. - loc("Hint: Don't stand too close at the wall before you jump!").."|".. - loc("Hint: Use the flower for orientation.").."|".. + loc("To get over the next obstacles, keep some distance from the wall before you back jump.").."|".. + loc("Hint: To jump higher, wait a bit before you hit “High Jump” a second time.").."|".. loc("High Jump: [Backspace]").."|"..loc("Back Jump: [Backspace] ×2"), 2, 15000) elseif gear == crates[5] then ShowMission(loc("Basic Movement Training"), loc("Walking on Ice"), diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Mutant.lua Thu Oct 04 21:17:21 2018 +0200 @@ -153,9 +153,11 @@ end function onGameStart() - SendHealthStatsOff() + if ClansCount >= 2 then + SendHealthStatsOff() + SendAchievementsStatsOff() + end SendRankingStatsOff() - SendAchievementsStatsOff() trackTeams() teamScan() runOnHogs(saveStuff) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Scripts/Multiplayer/Racer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Racer.lua Thu Oct 04 21:17:21 2018 +0200 @@ -697,10 +697,12 @@ end function onGameStart() - SendGameResultOff() - SendRankingStatsOff() - SendHealthStatsOff() - SendAchievementsStatsOff() + if ClansCount >= 2 then + SendGameResultOff() + SendRankingStatsOff() + SendHealthStatsOff() + SendAchievementsStatsOff() + end SetSoundMask(sndIncoming, true) SetSoundMask(sndMissed, true) diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/Space_Invasion.lua Thu Oct 04 21:17:21 2018 +0200 @@ -1091,10 +1091,12 @@ end function onGameStart() - SendGameResultOff() - SendRankingStatsOff() - SendAchievementsStatsOff() - SendHealthStatsOff() + if ClansCount >= 2 then + SendGameResultOff() + SendRankingStatsOff() + SendAchievementsStatsOff() + SendHealthStatsOff() + end ShowMission ( loc("SPACE INVASION"), diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua --- a/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Scripts/Multiplayer/TechRacer.lua Thu Oct 04 21:17:21 2018 +0200 @@ -899,10 +899,12 @@ end function onGameStart() - SendGameResultOff() - SendRankingStatsOff() - SendAchievementsStatsOff() - SendHealthStatsOff() + if ClansCount >= 2 then + SendGameResultOff() + SendRankingStatsOff() + SendAchievementsStatsOff() + SendHealthStatsOff() + end trackTeams() diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Scripts/OfficialChallengeHashes.lua --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/share/hedgewars/Data/Scripts/OfficialChallengeHashes.lua Thu Oct 04 21:17:21 2018 +0200 @@ -0,0 +1,31 @@ +official_racer_maps = { + ["Border,60526986531,838018718"] = "Racer Challenge #1" + , ["Border,71022545335,-490229244"] = "Racer Challenge #2" + , ["Border,40469748943,806689586"] = "Racer Challenge #3" + , ["85940488650,-134869715"] = "Racer Challenge #4" + , ["62080348735,-661895109"] = "Racer Challenge #5" + , ["56818170733,479034891"] = "Racer Challenge #6" + , ["Border,25372705797,1770509913"] = "Racer Challenge #7" + , ["Border,10917540013,1902370941"] = "Racer Challenge #8" + , ["Border,43890274319,185940363"] = "Racer Challenge #9" + , ["Border,27870148394,751885839"] = "Racer Challenge #10" + , ["Border,22647869226,178845011"] = "Racer Challenge #11" + , ["Border,46954401793,706743197"] = "Racer Challenge #12" + , ["Border,60760377667,157242054"] = "Racer Challenge #13" + , ["Border,51825989393,-1585582638"] = "Racer Challenge #14" + , ["81841189250,256715557"] = "Racer Challenge #15" + , ["Border,44246064625,-528106034"] = "Racer Challenge #16" + , ["60906776802,-1389184823"] = "Racer Challenge #17" + , ["Border,70774747774,-534640804"] = "Racer Challenge #18" + , ["Border,50512019610,-1839546856"] = "Racer Challenge #19" + , ["60715683005,-281312897"] = "Racer Challenge #20" +-- tech racer + , ["Border,19661006772,-975391975"] = "Tech Racer #1" + , ["Border,19661306766,-975391975"] = "Tech Racer #2" + , ["Border,19661606760,-975391975"] = "Tech Racer #3" + , ["Border,19661906754,-975391975"] = "Tech Racer #4" + , ["Border,19662206748,-975391975"] = "Tech Racer #5" + , ["Border,19662506742,-975391975"] = "Tech Racer #6" + , ["Border,19662806736,-975391975"] = "Tech Racer #7" + , ["Border,19663106730,-975391975"] = "Tech Racer #8" +} diff -r 219c2e588874 -r b2cc4e4e380c share/hedgewars/Data/Scripts/OfficialChallenges.lua --- a/share/hedgewars/Data/Scripts/OfficialChallenges.lua Wed Sep 05 20:09:32 2018 +0200 +++ b/share/hedgewars/Data/Scripts/OfficialChallenges.lua Thu Oct 04 21:17:21 2018 +0200 @@ -1,34 +1,4 @@ -local maps = { - ["Border,60526986531,M838018718Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #1" - , ["Border,71022545335,M-490229244Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #2" - , ["Border,40469748943,M806689586Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #3" - , ["85940488650,M-134869715Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #4" - , ["62080348735,M-661895109Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #5" - , ["56818170733,M479034891Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #6" - , ["Border,25372705797,M1770509913Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #7" - , ["Border,10917540013,M1902370941Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #8" - , ["Border,43890274319,M185940363Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #9" - , ["Border,27870148394,M751885839Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #10" - , ["Border,22647869226,M178845011Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #11" - , ["Border,46954401793,M706743197Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #12" - , ["Border,60760377667,M157242054Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #13" - , ["Border,51825989393,M-1585582638Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #14" - , ["81841189250,M256715557Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #15" - , ["Border,44246064625,M-528106034Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #16" - , ["60906776802,M-1389184823Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #17" - , ["Border,70774747774,M-534640804Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #18" - , ["Border,50512019610,M-1839546856Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #19" - , ["60715683005,M-281312897Scripts/Multiplayer/Racer.lua"] = "Racer Challenge #20" --- tech racer - , ["Border,19661006772,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #1" - , ["Border,19661306766,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #2" - , ["Border,19661606760,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #3" - , ["Border,19661906754,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #4" - , ["Border,19662206748,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #5" - , ["Border,19662506742,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #6" - , ["Border,19662806736,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #7" - , ["Border,19663106730,M-975391975Scripts/Multiplayer/TechRacer.lua"] = "Tech Racer #8" - } +HedgewarsScriptLoad("/Scripts/OfficialChallengeHashes.lua") -- modified Adler hash local hashA = 0 @@ -58,6 +28,6 @@ end --WriteLnToConsole(mapString) - return(maps[mapString]) + return(official_racer_maps[mapString]) end end diff -r 219c2e588874 -r b2cc4e4e380c tools/pas2c/Pas2C.hs --- a/tools/pas2c/Pas2C.hs Wed Sep 05 20:09:32 2018 +0200 +++ b/tools/pas2c/Pas2C.hs Thu Oct 04 21:17:21 2018 +0200 @@ -1,6 +1,7 @@ {-# LANGUAGE ScopedTypeVariables #-} module Pas2C where +import Prelude hiding ((<>)) import Text.PrettyPrint.HughesPJ import Data.Maybe import Data.Char