[springlobby] 04/06: Imported Upstream version 0.224
Markus Koschany
apo-guest at moszumanska.debian.org
Tue Jun 2 19:52:07 UTC 2015
This is an automated email from the git hooks/post-receive script.
apo-guest pushed a commit to branch master
in repository springlobby.
commit 2921fb630676515c5f1651eaf0d4a62b34c2bd6f
Author: Markus Koschany <apo at gambaru.de>
Date: Tue Jun 2 20:47:21 2015 +0200
Imported Upstream version 0.224
---
ChangeLog | 10 +++
VERSION | 2 +-
springlobby_config.h | 2 +-
src/CMakeLists.txt | 1 +
src/autohost.h | 3 +-
src/autohostmanager.cpp | 18 ++++++
src/autohostmanager.h | 5 +-
src/battle.cpp | 13 ----
src/gui/infodialog.cpp | 1 -
src/gui/infodialog.h | 1 +
src/gui/mapselectdialog.cpp | 1 -
src/gui/selectusersdialog.cpp | 1 -
src/gui/singleplayertab.cpp | 83 +++++++++++++-----------
src/gui/singleplayertab.h | 5 ++
src/gui/sltipwin.cpp | 36 +++++------
src/gui/sltipwin.h | 8 +--
src/gui/textentrydialog.cpp | 40 ++++++++++++
src/gui/textentrydialog.h | 40 ++----------
src/ibattle.cpp | 34 ++++++----
src/log.cpp | 14 +---
src/lsl/lib/cimg/CImg.h | 5 +-
src/lsl/src/lslutils/conversion.h | 2 +-
src/serverevents.cpp | 132 +++++++++++++++++++++++---------------
src/tasserver.cpp | 23 ++++---
src/tasserver.h | 2 +-
src/tests/lslconversion.cpp | 21 ++++++
26 files changed, 295 insertions(+), 208 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index e846182..2b83e7f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
ChangeLog of Springlobby
+## 0.224
+ - fix startposition type ignored
+
+## 0.223
+ - fix invalid sync check (makes relayhost/hosting work again)
+ - set focus to text input when prompting
+ - allow to select engine version for singleplayer games (thanks OursDesCavernes!)
+ - fix detection of autohosts
+ - fix crash when selecting map / clicking start on autohosts
+
## 0.222
- fix crash when going to tools/download archives
- (try to) fix bug: tipwindow consumes first mouse events
diff --git a/VERSION b/VERSION
index 10d2e8d..4a3543f 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-0.222
+0.224
diff --git a/springlobby_config.h b/springlobby_config.h
index ae5ea4f..07ad7c6 100644
--- a/springlobby_config.h
+++ b/springlobby_config.h
@@ -6,6 +6,6 @@
#undef VERSION
/* the git tag / commit we build from */
-#define VERSION "0.222"
+#define VERSION "0.224"
#endif /* SPRINGLOBBY_HEADERGUARD_CONFIG_H */
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index bc0a419..8701a30 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -194,6 +194,7 @@ set(springlobbySrc
gui/singleplayertab.cpp
gui/selectusersdialog.cpp
gui/taskbar.cpp
+ gui/textentrydialog.cpp
gui/ui.cpp
gui/wxtextctrlhist.cpp
diff --git a/src/autohost.h b/src/autohost.h
index d8ce465..73bd076 100644
--- a/src/autohost.h
+++ b/src/autohost.h
@@ -3,8 +3,7 @@
#ifndef SPRINGLOBBY_HEADERGUARD_AUTOHOST_H
#define SPRINGLOBBY_HEADERGUARD_AUTOHOST_H
-//including this header is only really needed for time_t ..
-#include <wx/string.h>
+#include <time.h>
#include <wx/arrstr.h>
class IBattle;
diff --git a/src/autohostmanager.cpp b/src/autohostmanager.cpp
index a638c86..f2de69f 100644
--- a/src/autohostmanager.cpp
+++ b/src/autohostmanager.cpp
@@ -20,14 +20,25 @@ AutohostHandler::~AutohostHandler()
void AutohostHandler::Send(const std::string& cmd)
{
+ if (m_battle == nullptr) {
+ return;
+ }
m_battle->Say(cmd);
}
void AutohostHandler::SayFounder(const std::string& cmd)
{
+ if (m_battle == nullptr) {
+ return;
+ }
m_battle->GetFounder().Say(cmd);
}
+void AutohostHandler::SetBattle(IBattle* battle)
+{
+ m_battle = battle;
+}
+
//========================
//-------- Springie ------
//========================
@@ -160,10 +171,12 @@ bool AutohostManager::RecognizeAutohost(const std::string& type)
{
if (type == "SPRINGIE") {
m_type = AutohostManager::AUTOHOSTTYPE_SPRINGIE;
+ Configure();
return true;
}
if (type == "SPADS") {
m_type = AutohostManager::AUTOHOSTTYPE_SPADS;
+ Configure();
return true;
}
@@ -172,6 +185,11 @@ bool AutohostManager::RecognizeAutohost(const std::string& type)
return false;
}
+void AutohostManager::Configure()
+{
+ GetAutohostHandler().SetBattle(m_battle);
+}
+
AutohostManager::AutohostType AutohostManager::GetAutohostType()
{
return m_type;
diff --git a/src/autohostmanager.h b/src/autohostmanager.h
index ea4315f..4fdf35a 100644
--- a/src/autohostmanager.h
+++ b/src/autohostmanager.h
@@ -20,12 +20,13 @@ public:
virtual void AddStartBox(int /*posx*/, int /*posy*/, int /*w*/, int /*h*/){};
virtual void Notify(){};
virtual void Start(){};
+ void SetBattle(IBattle* battle);
protected:
virtual void Send(const std::string& /*cmd*/);
virtual void SayFounder(const std::string& /*cmd*/);
+
private:
- void SetBattle(IBattle* battle);
IBattle* m_battle;
@@ -76,7 +77,6 @@ public:
~AutohostManager();
void SetBattle(IBattle* bt);
-
bool RecognizeAutohost(const std::string& type);
AutohostType GetAutohostType();
@@ -84,6 +84,7 @@ public:
AutohostHandler& GetAutohostHandler();
private:
+ void Configure();
SpringieHandler m_springie;
SpadsHandler m_spads;
diff --git a/src/battle.cpp b/src/battle.cpp
index 06576d9..68ccb5f 100644
--- a/src/battle.cpp
+++ b/src/battle.cpp
@@ -20,7 +20,6 @@
#include "utils/conversion.h"
#include "utils/uievents.h"
#include "utils/battleevents.h"
-#include "utils/slpaths.h"
#include "gui/uiutils.h"
#include "settings.h"
#include "useractions.h"
@@ -593,18 +592,6 @@ void Battle::StartHostedBattle()
if (UserExists(GetProxy()) && !GetUser(GetProxy()).Status().in_game) {
// DON'T set m_generating_script here, it will trick the script generating code to think we're the host
wxString hostscript = spring().WriteScriptTxt(*this);
- try {
- wxString path = TowxString(SlPaths::GetDataDir()) + _T("relayhost_script.txt");
- if (!wxFile::Access(path, wxFile::write)) {
- wxLogError(_T("Access denied to script.txt."));
- }
-
- wxFile f(path, wxFile::write);
- f.Write(hostscript);
- f.Close();
-
- } catch (...) {
- }
m_serv.SendScriptToProxy(STD_STRING(hostscript));
}
}
diff --git a/src/gui/infodialog.cpp b/src/gui/infodialog.cpp
index 41ccbd7..c742a30 100644
--- a/src/gui/infodialog.cpp
+++ b/src/gui/infodialog.cpp
@@ -95,4 +95,3 @@ InfoDialog::InfoDialog(wxWindow* parent)
InfoDialog::~InfoDialog()
{
}
-
diff --git a/src/gui/infodialog.h b/src/gui/infodialog.h
index ee25670..727a9d4 100644
--- a/src/gui/infodialog.h
+++ b/src/gui/infodialog.h
@@ -12,6 +12,7 @@ class InfoDialog : public wxDialog
public:
InfoDialog(wxWindow* parent);
virtual ~InfoDialog();
+
private:
wxBoxSizer* m_main_sizer;
};
diff --git a/src/gui/mapselectdialog.cpp b/src/gui/mapselectdialog.cpp
index 159b601..2e460ac 100644
--- a/src/gui/mapselectdialog.cpp
+++ b/src/gui/mapselectdialog.cpp
@@ -156,7 +156,6 @@ MapSelectDialog::~MapSelectDialog()
if (IsShown())
EndModal(0);
-
}
diff --git a/src/gui/selectusersdialog.cpp b/src/gui/selectusersdialog.cpp
index 92d16ea..8aaad46 100644
--- a/src/gui/selectusersdialog.cpp
+++ b/src/gui/selectusersdialog.cpp
@@ -101,7 +101,6 @@ SelectUsersDialog::SelectUsersDialog(wxWindow* parent, wxWindowID id, const wxSt
SelectUsersDialog::~SelectUsersDialog()
{
ClearList();
-
}
void SelectUsersDialog::Initialize()
diff --git a/src/gui/singleplayertab.cpp b/src/gui/singleplayertab.cpp
index e0b1902..f027bcc 100644
--- a/src/gui/singleplayertab.cpp
+++ b/src/gui/singleplayertab.cpp
@@ -38,6 +38,7 @@ BEGIN_EVENT_TABLE(SinglePlayerTab, wxPanel)
EVT_CHOICE(SP_MAP_PICK, SinglePlayerTab::OnMapSelect)
EVT_CHOICE(SP_MOD_PICK, SinglePlayerTab::OnModSelect)
+EVT_CHOICE(SP_ENGINE_PICK, SinglePlayerTab::OnEngineSelect)
EVT_BUTTON(SP_BROWSE_MAP, SinglePlayerTab::OnMapBrowse)
EVT_BUTTON(SP_ADD_BOT, SinglePlayerTab::OnAddBot)
EVT_BUTTON(SP_RESET, SinglePlayerTab::OnReset)
@@ -117,6 +118,15 @@ SinglePlayerTab::SinglePlayerTab(wxWindow* parent, MainSinglePlayerTab& msptab)
m_mod_pick = new wxChoice(this, SP_MOD_PICK);
m_ctrl_sizer->Add(m_mod_pick, 1, wxALL, 5);
+ m_mod_lbl = new wxStaticText(this, -1, _("Engine:"));
+ m_ctrl_sizer->Add(m_mod_lbl, 0, wxALIGN_CENTER_VERTICAL | wxALL, 5);
+
+ wxArrayString m_engine_picChoices;
+ wxBoxSizer* mod_choice_button_sizer2 = new wxBoxSizer(wxHORIZONTAL);
+ m_engine_pic = new wxChoice(this, SP_ENGINE_PICK, wxDefaultPosition, wxDefaultSize, m_engine_picChoices, 0);
+ m_engine_pic->SetToolTip(_("Select the engine version to play."));
+ mod_choice_button_sizer2->Add(m_engine_pic, 0, wxALL, 5);
+ m_ctrl_sizer->Add(mod_choice_button_sizer2, 0, wxEXPAND | wxALL, 1);
// m_ctrl_sizer->Add( 0, 0, 1, wxEXPAND, 0 );
@@ -146,12 +156,17 @@ SinglePlayerTab::SinglePlayerTab(wxWindow* parent, MainSinglePlayerTab& msptab)
m_main_sizer->Add(m_buttons_sizer, 0, wxEXPAND, 5);
- this->SetSizer(m_main_sizer);
- this->Layout();
+ m_battle.SetEngineName("spring");
+ m_battle.SetEngineVersion(SlPaths::GetCurrentUsedSpringIndex());
ReloadMaplist();
ReloadModlist();
+ ReloadEngineList();
ConnectGlobalEvent(this, GlobalEvent::OnUnitsyncReloaded, wxObjectEventFunction(&SinglePlayerTab::OnUnitsyncReloaded));
+
+ this->SetSizer(m_main_sizer);
+ this->Layout();
+
}
@@ -198,6 +213,26 @@ void SinglePlayerTab::ReloadModlist()
}
}
+void SinglePlayerTab::ReloadEngineList()
+{
+ m_engine_pic->Clear();
+ std::map<std::string, LSL::SpringBundle> versions = SlPaths::GetSpringVersionList();
+ const std::string last = SlPaths::GetCurrentUsedSpringIndex();
+ int i = 0;
+ for (auto pair : versions) {
+ m_engine_pic->Insert(TowxString(pair.first), i);
+ if (last == pair.first) {
+ m_engine_pic->SetSelection(i);
+ }
+ i++;
+ }
+
+ if (m_engine_pic->GetSelection() == wxNOT_FOUND) {
+ m_engine_pic->SetSelection(0);
+ }
+ //unitsync change needs a refresh of games as well
+ ReloadModlist();
+}
void SinglePlayerTab::SetMap(unsigned int index)
{
@@ -295,6 +330,13 @@ void SinglePlayerTab::OnModSelect(wxCommandEvent& /*unused*/)
customMessageBoxNoModal(SL_MAIN_ICON, _("Incompatible bots have been removed after game selection changed."), _("Bots removed"));
}
+void SinglePlayerTab::OnEngineSelect(wxCommandEvent& /*event*/)
+{
+ SlPaths::SetUsedSpringIndex(STD_STRING(m_engine_pic->GetString(m_engine_pic->GetSelection())));
+ LSL::usync().ReloadUnitSyncLib();
+ m_battle.SetEngineVersion(STD_STRING(m_engine_pic->GetString(m_engine_pic->GetSelection())));
+ ReloadEngineList();
+}
void SinglePlayerTab::OnMapBrowse(wxCommandEvent& /*unused*/)
{
@@ -351,9 +393,6 @@ void SinglePlayerTab::OnStart(wxCommandEvent& /*unused*/)
return;
}
- m_battle.SetEngineName("spring");
- m_battle.SetEngineVersion(SlPaths::GetCurrentUsedSpringIndex()); //FIXME: make engine version selectable
-
if (ValidSetup())
m_battle.StartSpring();
}
@@ -387,40 +426,6 @@ void SinglePlayerTab::OnColorButton(wxCommandEvent& /*unused*/)
m_battle.ForceColour(u, wxColourTolsl(CurrentColour));
UpdateMinimap();
}
-/*
-void SinglePlayerTab::UpdateTag( const wxString& Tag )
-{
- long type;
- Tag.BeforeFirst( '_' ).ToLong( &type );
- const wxString key = Tag.AfterFirst( '_' );
- if ( type == LSL::OptionsWrapper::PrivateOptions ) {
- if ( key == _T("mapname") ) {
- m_addbot_btn->Enable( false );
- try
- {
- m_map_pick->SetSelection(LSL::usync().GetMapIndex(m_battle.GetHostMapName()));
- UpdateMinimap();
- m_addbot_btn->Enable( true );
- }
- catch (...) {}
- }
- else if ( key == _T("modname") ) {
- try
- {
-// int pln = m_battle.GetNumUsers();
-// int botn = m_battle.GetNumBots();
- UpdateMinimap();
-// pln -= m_battle.GetNumUsers();
-// botn -= m_battle.GetNumBots();
-// assert( pln == 0 );
-// assert( botn == 0 );
-
- }
- catch (...) {}
- }
- }
-}
-*/
void SinglePlayerTab::UpdatePresetList()
{
diff --git a/src/gui/singleplayertab.h b/src/gui/singleplayertab.h
index 861930c..6e1e305 100644
--- a/src/gui/singleplayertab.h
+++ b/src/gui/singleplayertab.h
@@ -32,6 +32,7 @@ public:
void UpdateMinimap();
void ReloadMaplist();
void ReloadModlist();
+ void ReloadEngineList();
void UpdatePresetList();
IBattle& GetBattle()
@@ -43,6 +44,7 @@ public:
void OnMapSelect(wxCommandEvent& event);
void OnModSelect(wxCommandEvent& event);
+ void OnEngineSelect(wxCommandEvent& event);
void OnMapBrowse(wxCommandEvent& event);
void OnAddBot(wxCommandEvent& event);
void OnStart(wxCommandEvent& event);
@@ -56,6 +58,7 @@ public:
void SetMap(unsigned int index);
void SetMod(unsigned int index);
+ void SetEngine(unsigned int index);
private:
wxBoxSizer* m_main_sizer;
@@ -64,6 +67,7 @@ private:
MapCtrl* m_minimap;
wxChoice* m_map_pick;
wxChoice* m_mod_pick;
+ wxChoice* m_engine_pic;
wxStaticText* m_map_lbl;
wxStaticText* m_mod_lbl;
wxButton* m_select_btn;
@@ -81,6 +85,7 @@ private:
enum {
SP_MAP_PICK = wxID_HIGHEST,
SP_MOD_PICK,
+ SP_ENGINE_PICK,
SP_BROWSE_MAP,
SP_ADD_BOT,
SP_RESET,
diff --git a/src/gui/sltipwin.cpp b/src/gui/sltipwin.cpp
index 7c81965..9261fa5 100644
--- a/src/gui/sltipwin.cpp
+++ b/src/gui/sltipwin.cpp
@@ -7,11 +7,12 @@
#if wxUSE_TIPWINDOW
SLTipWindow::SLTipWindow(wxWindow* parent, const wxString& text)
- : wxTipWindow(parent, text), wxEventFilter()
+ : wxTipWindow(parent, text)
+ , wxEventFilter()
{
parentWindow = parent;
creationTime = wxDateTime::GetTimeNow();
-
+
//Register event hook
wxEvtHandler::AddFilter(this);
isHookInstalled = true;
@@ -19,7 +20,7 @@ SLTipWindow::SLTipWindow(wxWindow* parent, const wxString& text)
SLTipWindow::~SLTipWindow()
{
- if( isHookInstalled == true ) {
+ if (isHookInstalled == true) {
wxEvtHandler::RemoveFilter(this);
isHookInstalled = false;
}
@@ -29,15 +30,15 @@ SLTipWindow::~SLTipWindow()
int SLTipWindow::FilterEvent(wxEvent& hookedEvent)
{
//Only mouse events are in interest
- if( isMouseEvent(hookedEvent) == true ) {
+ if (isMouseEvent(hookedEvent) == true) {
//Remove hook before proceed, prevents deadlock
wxEvtHandler::RemoveFilter(this);
isHookInstalled = false;
-
+
//Send event to parent control
wxEvent* clonedEvent = hookedEvent.Clone();
parentWindow->GetEventHandler()->QueueEvent(clonedEvent);
-
+
//Close tip window
Close();
return Event_Processed;
@@ -50,22 +51,21 @@ int SLTipWindow::FilterEvent(wxEvent& hookedEvent)
bool SLTipWindow::isMouseEvent(wxEvent& hookedEvent)
{
wxEventType et = hookedEvent.GetEventType();
-
+
//Check for almost all possible mouse events
- if( et == wxEVT_LEFT_DOWN ||
- et == wxEVT_RIGHT_DOWN ||
- et == wxEVT_MIDDLE_DOWN ||
- et == wxEVT_LEFT_DCLICK ||
- et == wxEVT_RIGHT_DCLICK ||
- et == wxEVT_MIDDLE_DCLICK ||
- et == wxEVT_MOUSEWHEEL )
- {
+ if (et == wxEVT_LEFT_DOWN ||
+ et == wxEVT_RIGHT_DOWN ||
+ et == wxEVT_MIDDLE_DOWN ||
+ et == wxEVT_LEFT_DCLICK ||
+ et == wxEVT_RIGHT_DCLICK ||
+ et == wxEVT_MIDDLE_DCLICK ||
+ et == wxEVT_MOUSEWHEEL) {
return true;
}
-
+
//Detect mouse motion only after some delay
- if( wxDateTime::GetTimeNow() - creationTime >= MOTION_DETECTION_DELAY ) {
- if( et == wxEVT_MOTION ) {
+ if (wxDateTime::GetTimeNow() - creationTime >= MOTION_DETECTION_DELAY) {
+ if (et == wxEVT_MOTION) {
return true;
}
}
diff --git a/src/gui/sltipwin.h b/src/gui/sltipwin.h
index e455fcc..1fab0e4 100644
--- a/src/gui/sltipwin.h
+++ b/src/gui/sltipwin.h
@@ -14,17 +14,17 @@ class SLTipWindow : public wxTipWindow, public wxEventFilter
public:
SLTipWindow(wxWindow* parent, const wxString& text);
virtual ~SLTipWindow();
-
+
virtual int FilterEvent(wxEvent&);
-
+
private:
bool isMouseEvent(wxEvent&);
-
+
private:
wxWindow* parentWindow;
bool isHookInstalled;
time_t creationTime;
-
+
private:
const int MOTION_DETECTION_DELAY = 1;
};
diff --git a/src/gui/textentrydialog.cpp b/src/gui/textentrydialog.cpp
new file mode 100644
index 0000000..00dc65c
--- /dev/null
+++ b/src/gui/textentrydialog.cpp
@@ -0,0 +1,40 @@
+/* This file is part of the Springlobby (GPL v2 or later), see COPYING */
+
+#include "textentrydialog.h"
+#include <wx/stattext.h>
+#include <wx/sizer.h>
+#include <wx/textctrl.h>
+
+TextEntryDialog::TextEntryDialog(wxWindow* parent, const wxString& title, const wxString& heading, const wxString& answer, bool multiline)
+ : wxDialog(parent, -1, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
+ wxStaticText* text = new wxStaticText(this, -1, heading);
+ long inputstyle = 0;
+ if (multiline)
+ inputstyle = wxTE_MULTILINE;
+ input = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, inputstyle);
+ if (multiline)
+ input->SetInitialSize(wxSize(400, 300));
+ SetValue(answer);
+ wxSizer* buttons = CreateButtonSizer(wxOK | wxCANCEL);
+ wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->Add(text, 0, wxALL, 5);
+ sizer->Add(input, 1, wxEXPAND | wxALL, 5);
+ sizer->Add(buttons, 0, wxEXPAND | wxALL, 5);
+ SetSizerAndFit(sizer);
+ input->SetFocus();
+}
+
+TextEntryDialog::~TextEntryDialog()
+{
+}
+
+void TextEntryDialog::SetValue(const wxString& value)
+{
+ input->SetValue(value);
+}
+
+const wxString TextEntryDialog::GetValue()
+{
+ return input->GetValue();
+}
diff --git a/src/gui/textentrydialog.h b/src/gui/textentrydialog.h
index 040eef8..6ef1ef7 100644
--- a/src/gui/textentrydialog.h
+++ b/src/gui/textentrydialog.h
@@ -2,44 +2,16 @@
#include <wx/string.h>
#include <wx/dialog.h>
-#include <wx/stattext.h>
-#include <wx/sizer.h>
+
+class wxTextCtrl;
class TextEntryDialog : public wxDialog
{
public:
- TextEntryDialog(wxWindow* parent, const wxString& title, const wxString& heading, const wxString& answer, bool multiline = false)
- : wxDialog(parent, -1, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
- {
- wxStaticText* text = new wxStaticText(this, -1, heading);
- long inputstyle = 0;
- if (multiline)
- inputstyle = wxTE_MULTILINE;
- input = new wxTextCtrl(this, -1, wxEmptyString, wxDefaultPosition, wxDefaultSize, inputstyle);
- if (multiline)
- input->SetInitialSize(wxSize(400, 300));
- SetValue(answer);
- wxSizer* buttons = CreateButtonSizer(wxOK | wxCANCEL);
- wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
- sizer->Add(text, 0, wxALL, 5);
- sizer->Add(input, 1, wxEXPAND | wxALL, 5);
- sizer->Add(buttons, 0, wxEXPAND | wxALL, 5);
- SetSizerAndFit(sizer);
- }
-
- virtual ~TextEntryDialog()
- {
- }
-
- void SetValue(const wxString& value)
- {
- input->SetValue(value);
- }
-
- const wxString GetValue()
- {
- return input->GetValue();
- }
+ TextEntryDialog(wxWindow* parent, const wxString& title, const wxString& heading, const wxString& answer, bool multiline = false);
+ virtual ~TextEntryDialog();
+ void SetValue(const wxString& value);
+ const wxString GetValue();
private:
wxTextCtrl* input;
diff --git a/src/ibattle.cpp b/src/ibattle.cpp
index a8ce7d1..1401897 100644
--- a/src/ibattle.cpp
+++ b/src/ibattle.cpp
@@ -65,19 +65,31 @@ bool IBattle::IsSynced()
{
LoadMod();
LoadMap();
- bool synced = true;
+ if (!m_host_mod.name.empty() && m_local_mod.name != m_host_mod.name) {
+ wxLogWarning("Not synced: game name doesn't match: %s %s", m_host_mod.name.c_str(), m_local_mod.name.c_str());
+ return false;
+ }
+ if (!m_host_map.name.empty() && m_local_map.name != m_host_map.name) {
+ wxLogWarning("Not synced: map name doesn't match: %s %s", m_host_map.name.c_str(), m_local_map.name.c_str());
+ return false;
+ }
+ if (!m_host_mod.hash.empty() && m_host_mod.hash != "0" && m_host_mod.hash != m_local_mod.hash) {
+ wxLogWarning("Not synced: game hash doesn't match: %s %s", m_host_mod.hash.c_str(), m_host_mod.hash.c_str());
+ return false;
+ }
if (!m_host_map.hash.empty() && m_host_map.hash != "0" && m_host_map.hash != m_local_map.hash) {
- synced = false;
- } else if (!m_host_map.name.empty() && m_local_map.name != m_host_map.name) {
- synced = false;
- } else if (!m_host_mod.hash.empty() && m_host_mod.hash != "0" && m_host_mod.hash != m_local_mod.hash) {
- synced = false;
- } else if (!m_host_mod.name.empty() && m_local_mod.name != m_host_mod.name) {
- synced = false;
- } else if (!MapExists() || !ModExists()) {
- synced = false;
+ wxLogWarning("Not synced: map hash doesn't match: %s %s", m_host_map.hash.c_str(), m_local_map.hash.c_str());
+ return false;
+ }
+ if (!ModExists()) {
+ wxLogWarning("Not synced: game doesn't exist: %s %s", m_host_mod.name.c_str());
+ return false;
}
- return synced;
+ if (!MapExists()) {
+ wxLogWarning("Not synced: map doesn't exist: %s %s", m_host_map.name.c_str());
+ return false;
+ }
+ return true;
}
std::vector<LSL::lslColor>& IBattle::GetFixColoursPalette(int numteams) const
diff --git a/src/log.cpp b/src/log.cpp
index ce801b4..90c519f 100644
--- a/src/log.cpp
+++ b/src/log.cpp
@@ -35,20 +35,8 @@ public:
}
}
- // don't remove this override, it is used & needed!
- virtual void DoLogText(const wxString& msg)
- {
- DoLog(2, msg, 0);
- }
-
- // don't remove this override, it is used & needed!
- virtual void DoLogString(const wxChar* msg, time_t timestamp)
- {
- DoLog(2, msg, timestamp);
- }
-
// catch and process all log messages
- virtual void DoLog(wxLogLevel loglevel, const wxChar* msg, time_t /*time*/)
+ void DoLog(wxLogLevel loglevel, const wxChar* msg, time_t /*time*/) override
{
if (gui && (loglevel == wxLOG_Error || loglevel == wxLOG_FatalError)) // show user only errors
diff --git a/src/lsl/lib/cimg/CImg.h b/src/lsl/lib/cimg/CImg.h
index b6fdaf5..559f82b 100644
--- a/src/lsl/lib/cimg/CImg.h
+++ b/src/lsl/lib/cimg/CImg.h
@@ -4943,7 +4943,6 @@ namespace cimg_library_suffixed {
if (usage) {
std::fprintf(cimg::output(),"\n %s%s%s",cimg::t_red,cimg::basename(argv[0]),cimg::t_normal);
std::fprintf(cimg::output(),": %s",usage);
- std::fprintf(cimg::output()," (%s, %s)\n\n",__DATE__,__TIME__);
}
if (defaut) std::fprintf(cimg::output(),"%s\n",defaut);
}
@@ -5040,9 +5039,9 @@ namespace cimg_library_suffixed {
\note Output is done on the default output stream.
**/
inline void info() {
- std::fprintf(cimg::output(),"\n %s%sCImg Library %u.%u.%u%s, compiled %s ( %s ) with the following flags:\n\n",
+ std::fprintf(cimg::output(),"\n %s%sCImg Library %u.%u.%u%s, compiled with the following flags:\n\n",
cimg::t_red,cimg::t_bold,cimg_version/100,(cimg_version/10)%10,cimg_version%10,
- cimg::t_normal,__DATE__,__TIME__);
+ cimg::t_normal);
std::fprintf(cimg::output()," > Operating System: %s%-13s%s %s('cimg_OS'=%d)%s\n",
cimg::t_bold,
diff --git a/src/lsl/src/lslutils/conversion.h b/src/lsl/src/lslutils/conversion.h
index 059a148..c041791 100644
--- a/src/lsl/src/lslutils/conversion.h
+++ b/src/lsl/src/lslutils/conversion.h
@@ -32,7 +32,7 @@ static inline std::string MakeHashUnsigned( const std::string& hash )
static inline std::string MakeHashSigned( const std::string& hash )
{
- return ToString( FromString<int>( hash ) );
+ return ToString((int)FromString<long>( hash ) );
}
// convert const char* to std::string, as std::string(NULL) crashes
diff --git a/src/serverevents.cpp b/src/serverevents.cpp
index 634eda7..fe2fb1c 100644
--- a/src/serverevents.cpp
+++ b/src/serverevents.cpp
@@ -405,67 +405,99 @@ static bool parseSkill(const std::string& value, double& result)
return false;
}
+static bool parseTeam(const std::string& value, int& result)
+{
+ const int res = sscanf(value.c_str(), "team%d", &result);
+ return res == 1;
+}
+
void ServerEvents::OnSetBattleInfo(int battleid, const std::string& param, const std::string& value)
{
slLogDebugFunc("%s, %s", param.c_str(), value.c_str());
- try {
- IBattle& battle = m_serv.GetBattle(battleid);
- battle.m_script_tags[param] = value;
- wxString key = TowxString(param);
- if (key.Left(5) == _T("game/")) {
- key = key.AfterFirst('/');
- if (key.Left(11) == _T( "mapoptions/" )) {
- key = key.AfterFirst('/');
- battle.CustomBattleOptions().setSingleOption(STD_STRING(key), value, LSL::Enum::MapOption);
- battle.Update(stdprintf("%d_%s", LSL::Enum::MapOption, STD_STRING(key).c_str()));
- //Player's TrueSkill changed
- } else if (key.Left(8) == _T( "players/" )) {
- wxString nickName = key.AfterFirst('/').BeforeFirst('/');
- wxString playerParam = key.AfterFirst('/').AfterFirst('/');
- if (playerParam == _T("skill")) {
+ IBattle& battle = m_serv.GetBattle(battleid);
+ battle.m_script_tags[param] = value;
+ const LSL::StringVector vec = LSL::Util::StringTokenize(param, "/"); //split string by slash
+
+ switch (vec.size()) {
+ case 3: { // depth 3
+ if (param.find("game/mapoptions") == 0) {
+ battle.CustomBattleOptions().setSingleOption(vec[2], value, LSL::Enum::MapOption);
+ battle.Update(stdprintf("%d_%s", LSL::Enum::MapOption, vec[2].c_str()));
+ return;
+ }
+ if (param.find("game/modoptions/") == 0) {
+ battle.CustomBattleOptions().setSingleOption(vec[2], value, LSL::Enum::ModOption);
+ battle.Update(stdprintf("%d_%s", LSL::Enum::ModOption, vec[2].c_str()));
+ return;
+ }
+ if (param.find("game/restrict") == 0) {
+ OnBattleDisableUnit(battleid, vec[2], LSL::Util::FromString<int>(value));
+ return;
+ }
+ if (param.find("game/") == 0) { //game/team0/startposx=1692.
+ int team = -1;
+ if (parseTeam(vec[1], team)) {
+ const bool xpos = vec[2] == "startposx";
+ const bool ypos = vec[2] == "startposy";
+ if (xpos || ypos) {
+ int numusers = battle.GetNumUsers();
+ for (int i = 0; i < numusers; i++) {
+ User& usr = battle.GetUser(i);
+ UserBattleStatus& status = usr.BattleStatus();
+ if (status.team == team) {
+ if (xpos) {
+ status.pos.x = LSL::Util::FromString<int>(value);
+ }
+ if (ypos) {
+ status.pos.y = LSL::Util::FromString<int>(value);
+ }
+ battle.OnUserBattleStatusUpdated(usr, status);
+ }
+ }
+ return;
+ }
+ }
+ }
+ break;
+ }
+ case 4: { //depth 4
+ if (param.find("game/players/") == 0) {
+ if (vec[3] == "skill") {
+ const std::string nick = vec[2];
double skill;
if (parseSkill(value, skill)) {
- battle.OnPlayerTrueskillChanged(STD_STRING(nickName), skill); //(std::string& nickname, double trueskill_value)
+ battle.OnPlayerTrueskillChanged(nick, skill); //(std::string& nickname, double trueskill_value)
}
+ return;
}
- } else if (key.Left(11) == _T( "modoptions/" )) {
- key = key.AfterFirst('/');
- battle.CustomBattleOptions().setSingleOption(STD_STRING(key), value, LSL::Enum::ModOption);
- battle.Update(stdprintf("%d_%s", LSL::Enum::ModOption, STD_STRING(key).c_str()));
- } else if (key.Left(8) == _T( "restrict" )) {
- OnBattleDisableUnit(battleid, STD_STRING(key.AfterFirst(_T('/'))), LSL::Util::FromString<int>(value));
- } else if (key.Left(4) == _T( "team" ) && key.Find(_T("startpos")) != wxNOT_FOUND) {
- int team = FromwxString(key.BeforeFirst(_T('/')).Mid(4));
- if (key.Find(_T("startposx")) != wxNOT_FOUND) {
- int numusers = battle.GetNumUsers();
- for (int i = 0; i < numusers; i++) {
- User& usr = battle.GetUser(i);
- UserBattleStatus& status = usr.BattleStatus();
- if (status.team == team) {
- status.pos.x = LSL::Util::FromString<int>(value);
- battle.OnUserBattleStatusUpdated(usr, status);
- }
- }
- } else if (key.Find(_T("startposy")) != wxNOT_FOUND) {
- int numusers = battle.GetNumUsers();
- for (int i = 0; i < numusers; i++) {
- User& usr = battle.GetUser(i);
- UserBattleStatus& status = usr.BattleStatus();
- if (status.team == team) {
- status.pos.y = LSL::Util::FromString<int>(value);
- battle.OnUserBattleStatusUpdated(usr, status);
- }
- }
+ if (vec[3] == "skilluncertainty") { //this is ignored
+ return;
}
- } else if (key.Left(8) == _T("hosttype")) {
- battle.m_autohost_manager->RecognizeAutohost(value);
- } else {
- battle.CustomBattleOptions().setSingleOption(STD_STRING(key), value, LSL::Enum::EngineOption);
- battle.Update(stdprintf("%d_%s", LSL::Enum::EngineOption, STD_STRING(key).c_str()));
}
+ break;
}
- } catch (assert_exception) {
+ case 2: { //depth 2
+ if (param == "game/hosttype") {
+ if (battle.m_autohost_manager->RecognizeAutohost(value)) {
+ OnSaidBattle(battleid, battle.GetMe().GetNick(), stdprintf("detected %s autohost", value.c_str())); //FIXME: add event for that + add a label?!
+ }
+ return;
+ }
+ // i.e. game/startpostype
+ battle.CustomBattleOptions().setSingleOption(vec[1], value, LSL::Enum::EngineOption);
+ battle.Update(stdprintf("%d_%s", LSL::Enum::EngineOption, vec[1].c_str()));
+ return;
+ }
+ /*
+ //seems unused
+ case 1: { //depth 1
+ battle.CustomBattleOptions().setSingleOption(vec[0], value, LSL::Enum::EngineOption);
+ battle.Update(stdprintf("%d_%s", LSL::Enum::EngineOption, vec[0].c_str()));
+ return;
+ }
+*/
}
+ wxLogWarning("Unhandled SETSCRIPTTAGS: %s=%s", param.c_str(), value.c_str());
}
void ServerEvents::OnUnsetBattleInfo(int /*battleid*/, const std::string& /*param*/)
diff --git a/src/tasserver.cpp b/src/tasserver.cpp
index 5920e97..31ed681 100644
--- a/src/tasserver.cpp
+++ b/src/tasserver.cpp
@@ -953,7 +953,7 @@ void TASServer::RelayCmd(const std::string& command, const std::string& param)
}
wxString msg = _T("!") + TowxString(command).Lower(); // prefix commands with !
if (!param.empty()) {
- msg += + _T(" ") + TowxString(param);
+ msg += _T(" ") + TowxString(param);
}
SayPrivate(m_relay_host_bot, STD_STRING(msg));
}
@@ -1338,11 +1338,10 @@ void TASServer::SendHostInfo(HostInfo update)
if ((update & (IBattle::HI_Map | IBattle::HI_Locked | IBattle::HI_Spectators)) > 0) {
// UPDATEBATTLEINFO Spectatorsize locked maphash {mapname}
- wxString cmd = wxString::Format(_T("%d %d "), battle.GetSpectators(), battle.IsLocked());
- cmd += TowxString(LSL::Util::MakeHashSigned(battle.LoadMap().hash) + " ");
- cmd += TowxString(battle.LoadMap().name);
+ std::string cmd = stdprintf("%d %d %s %s", battle.GetSpectators(), battle.IsLocked(),
+ LSL::Util::MakeHashSigned(battle.LoadMap().hash).c_str(), battle.LoadMap().name.c_str());
- SendCmd("UPDATEBATTLEINFO", STD_STRING(cmd), battle.IsProxy());
+ SendCmd("UPDATEBATTLEINFO", cmd, battle.IsProxy());
}
if ((update & IBattle::HI_Send_All_opts) > 0) {
std::string cmd;
@@ -1992,19 +1991,19 @@ IBattle::GameType IntToGameType(int gt)
}
// send script.txt to relayhost
-void TASServer::SendScriptToProxy( const std::string& script )
+void TASServer::SendScriptToProxy(const std::string& script)
{
LSL::StringVector strings = LSL::Util::StringTokenize(script, "\n");
int relaylenghtprefix = 10 + 1 + m_relay_host_bot.length() + 2; // SAYPRIVATE + space + botname + space + exclamation mark lenght
int lenght = script.size();
- lenght += relaylenghtprefix + 11 + 1; // CLEANSCRIPT command size
- lenght += strings.size() * ( relaylenghtprefix + 16 + 1 ); // num lines * APPENDSCRIPTLINE + space command size ( \n is already counted in script.size)
- lenght += relaylenghtprefix + 9 + 1; // STARTGAME command size
- const int time = lenght / m_sock->GetSendRateLimit(); // calculate time in seconds to upload script
- DoActionBattle( m_battle_id, stdprintf("is preparing to start the game, game will start in approximately %d seconds",time));
+ lenght += relaylenghtprefix + 11 + 1; // CLEANSCRIPT command size
+ lenght += strings.size() * (relaylenghtprefix + 16 + 1); // num lines * APPENDSCRIPTLINE + space command size ( \n is already counted in script.size)
+ lenght += relaylenghtprefix + 9 + 1; // STARTGAME command size
+ const int time = lenght / m_sock->GetSendRateLimit(); // calculate time in seconds to upload script
+ DoActionBattle(m_battle_id, stdprintf("is preparing to start the game, game will start in approximately %d seconds", time));
RelayCmd("CLEANSCRIPT");
- for (const std::string& line: strings) {
+ for (const std::string& line : strings) {
RelayCmd("APPENDSCRIPTLINE", line);
}
RelayCmd("STARTGAME");
diff --git a/src/tasserver.h b/src/tasserver.h
index a1fd765..9cd21ee 100644
--- a/src/tasserver.h
+++ b/src/tasserver.h
@@ -119,7 +119,7 @@ public:
virtual void ExecuteCommand(const std::string& in);
- void SendScriptToProxy( const std::string& script ) override;
+ void SendScriptToProxy(const std::string& script) override;
private:
void SendUdpSourcePort(int udpport);
diff --git a/src/tests/lslconversion.cpp b/src/tests/lslconversion.cpp
index d0f2e78..815b5cd 100644
--- a/src/tests/lslconversion.cpp
+++ b/src/tests/lslconversion.cpp
@@ -6,7 +6,9 @@
#include <stdio.h>
#include "utils/lslconversion.h"
#include <lslutils/misc.h>
+#include <lslutils/conversion.h>
#include "user.h"
+#include "utils/conversion.h"
#include <wx/colour.h>
@@ -166,3 +168,22 @@ BOOST_AUTO_TEST_CASE(userstatus)
us.bot = true;
BOOST_CHECK(us == UserStatus::FromInt(UserStatus::ToInt(us)));
}
+
+BOOST_AUTO_TEST_CASE(hashes)
+{
+ const unsigned int overflow = 2232970410; //this
+ const int negative = -2147483648;
+
+ BOOST_CHECK("-2061996886" == LSL::Util::MakeHashSigned(LSL::Util::ToString(overflow)));
+ BOOST_CHECK(stdprintf("%d", negative) == LSL::Util::MakeHashSigned(LSL::Util::ToString(negative)));
+
+ BOOST_CHECK("2232970410" == LSL::Util::MakeHashUnsigned(LSL::Util::ToString(overflow)));
+ BOOST_CHECK(stdprintf("%u", negative) == LSL::Util::MakeHashUnsigned(LSL::Util::ToString(negative)));
+
+ BOOST_CHECK("2232970410" == LSL::Util::MakeHashUnsigned(stdprintf("%d", overflow)));
+ BOOST_CHECK(stdprintf("%u", negative) == LSL::Util::MakeHashUnsigned(stdprintf("%d", negative)));
+
+ BOOST_CHECK("2232970410" == LSL::Util::MakeHashUnsigned(stdprintf("%u", overflow)));
+ BOOST_CHECK("2147483648" == LSL::Util::MakeHashUnsigned(stdprintf("%u", negative)));
+}
+
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/springlobby.git
More information about the Pkg-games-commits
mailing list