diff --git a/Makefile b/Makefile
index c275363..0413132 100644
--- a/Makefile
+++ b/Makefile
@@ -1,6 +1,6 @@
EXE=pb_gnu
# -Wno-comment // or /* within a comment
-CFLAGS=-c -Wall -std=c++11 -Wno-comment -g
+CFLAGS=-c -Wall -std=c++11 -Wno-comment -Os -D__NO_INLINE_HYPOTF__
#for optimization add -Os -D__NO_INLINE_HYPOTF__
#optimization gave a speed bonus from 40 to 65fps at 2x20.000 ships
LDFLAGS=-lglfw3 -lenet
@@ -27,8 +27,8 @@ endif
all: $(EXE)
# executable
-$(EXE): main.o server.o client.o inc.o draw.o game.o net.o makefile
- $(CC) main.o server.o client.o inc.o draw.o game.o net.o -o $(EXE) $(LDFLAGS)
+$(EXE): main.o server.o client.o inc.o draw.o game.o net.o configuration.o inih.o inihreader.o makefile
+ $(CC) main.o server.o client.o inc.o draw.o game.o net.o configuration.o inih.o inihreader.o -o $(EXE) $(LDFLAGS)
main.o: main.cpp src/server.hpp src/client.hpp makefile
$(CC) $(CFLAGS) $(LDFLAGS) main.cpp
@@ -51,6 +51,14 @@ inc.o: src/inc.cpp src/inc.hpp makefile
net.o: src/net.cpp src/net.hpp makefile
$(CC) $(CFLAGS) $(LDFLAGS) src/net.cpp
+configuration.o: src/configuration.cpp src/configuration.hpp src/include/inih/INIReader.hpp makefile
+ $(CC) $(CFLAGS) $(LDFLAGS) src/configuration.cpp
+
+inih.o: src/include/inih/ini.c src/include/inih/ini.h makefile
+ $(CC) $(CFLAGS) $(LDFLAGS) src/include/inih/ini.c -o inih.o
+inihreader.o: src/include/inih/ini.c src/include/inih/INIReader.hpp src/include/inih/INIReader.cpp makefile
+ $(CC) $(CFLAGS) $(LDFLAGS) src/include/inih/INIReader.cpp -o inihreader.o
+
clean:
$(RM) *.o
$(RM) $(EXE)
diff --git a/PlanetBattle Multiplayer.vcxproj b/PlanetBattle Multiplayer.vcxproj
index 63093e6..d4f338d 100644
--- a/PlanetBattle Multiplayer.vcxproj
+++ b/PlanetBattle Multiplayer.vcxproj
@@ -21,9 +21,12 @@
+
+
+
@@ -31,11 +34,19 @@
+
+
+
+
+
+
+
+
16.0
{4A0F77B9-ADCF-4B3B-8ADD-2C0322F84308}
@@ -109,6 +120,7 @@
Disabled
true
true
+ stdcpp17
Console
@@ -124,6 +136,7 @@
Disabled
true
true
+ stdcpp17
Console
@@ -137,6 +150,7 @@
true
true
true
+ stdcpp17
Console
@@ -153,6 +167,7 @@
true
true
true
+ stdcpp17
Console
diff --git a/PlanetBattle Multiplayer.vcxproj.filters b/PlanetBattle Multiplayer.vcxproj.filters
index 9ccb6ee..8a05e4e 100644
--- a/PlanetBattle Multiplayer.vcxproj.filters
+++ b/PlanetBattle Multiplayer.vcxproj.filters
@@ -36,6 +36,15 @@
Source Files
+
+ Source Files
+
+
+ Source Files
+
+
+ Source Files
+
@@ -59,5 +68,19 @@
Header Files
+
+ Header Files
+
+
+ Header Files
+
+
+ Header Files
+
+
+
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
index 3f1c0a6..600b92d 100644
--- a/README.md
+++ b/README.md
@@ -9,10 +9,11 @@ A [Planet Battle 3](http://forums.purebasic.com/german/viewtopic.php?f=12&t=1810
Requires: [glfw3](http://www.glfw.org/download.html "glfw"), [ENet](http://enet.bespin.org/ "ENet")
> Note: I tweaked `math.h` to only not only `hypotf` inlined when using `-D__NO_INLINE_HYPOTF__`. If you get compilerproblems regarding `hypotf`, try `-D__NO_INLINE__` instead.
-Run `make` to compile and run `./server` or `./client` to play!
-It is important that the game will not start until there are two clients connected to the server, so make sure you start the `client` twice or have a friend that connects, too.
+Run `make` to compile and run `./game` to play!
+It is important that the game will not start until there are two clients connected to the server, so make sure you start the game as client twice or have a friend that connects, too.
-Both, client and server, can take a console-parameter. For the client it is the server-ip, and for the server it's the maximum amount of ships per player.
+To start the game as a client or as a sever you can use the console paramters `-c []` and `-s []` respectively or just run it up and enter the configuration in the console.
+The settings.ini file is not yet functional (see issue #15).
# ToDo
- [ ] [another todolist](https://github.com/nitzel/pb_mp/blob/master/notes/todo%2Bideas.md "more extensive todo list")
@@ -35,4 +36,6 @@ Both, client and server, can take a console-parameter. For the client it is the
- [glfw3](http://www.glfw.org/download.html "glfw") awesome cross os lib for GL setup and window creation
- [ENet](http://enet.bespin.org/ "ENet") networking library. (un-)reliable packets via UDP.
-
+
+ - [inih](https://github.com/benhoyt/inih "INI Not Invented Here by Ben Hoyt") by Ben Hoyt to read ini files.
+
\ No newline at end of file
diff --git a/main.cpp b/main.cpp
index 99b5f89..d1f7941 100644
--- a/main.cpp
+++ b/main.cpp
@@ -1,5 +1,6 @@
#include "src/server.hpp"
#include "src/client.hpp"
+#include "src/configuration.hpp"
#include
#include // std::strcmp
@@ -10,6 +11,11 @@ int main(int argc, char** argv) {
std::cout << i << ' ' << argv[i] << std::endl;
}
std::cout << std::endl;
+
+ // todo 20190419nitzel Forward to and use the settings in the game etc, to replace the #defines in
+ CConfiguration config("settings.ini");
+ std::cout << "Config=" << config << std::endl;
+
if (argc == 1) {
// ask user
diff --git a/settings.ini b/settings.ini
new file mode 100644
index 0000000..222b670
--- /dev/null
+++ b/settings.ini
@@ -0,0 +1,10 @@
+[Graphics]
+width = 800
+height = 600
+[Server]
+name = "Spiel1"
+port = 12345
+[Client]
+name = "nitzel"
+port = 12345
+host = "127!!"
\ No newline at end of file
diff --git a/src/configuration.cpp b/src/configuration.cpp
new file mode 100644
index 0000000..75a5e7a
--- /dev/null
+++ b/src/configuration.cpp
@@ -0,0 +1,28 @@
+#include "configuration.hpp"
+
+const std::string CConfiguration::CServer::section = "Server";
+const std::string CConfiguration::CClient::section = "Client";
+
+CConfiguration::CServer::CServer(INIReader& iniReader) :
+ port(iniReader.GetInteger(CServer::section, "port", port)),
+ name(iniReader.GetString(CServer::section, "name", name)) {
+}
+
+CConfiguration::CServer::CServer() {
+}
+
+CConfiguration::CClient::CClient(INIReader& iniReader) :
+ port(iniReader.GetInteger(CClient::section, "port", port)),
+ name(iniReader.GetString(CClient::section, "name", name)),
+ host(iniReader.GetString(CClient::section, "host", host)) {
+}
+
+CConfiguration::CClient::CClient() {
+}
+
+
+CConfiguration::CConfiguration(std::string iniFilename) {
+ INIReader iniReader(iniFilename);
+ server = CConfiguration::CServer(iniReader);
+ client = CConfiguration::CClient(iniReader);
+}
diff --git a/src/configuration.hpp b/src/configuration.hpp
new file mode 100644
index 0000000..3fe9a98
--- /dev/null
+++ b/src/configuration.hpp
@@ -0,0 +1,56 @@
+#ifndef __CONFIGURATION__
+#define __CONFIGURATION__
+
+#include
+#include
+#include "include/inih/INIReader.hpp"
+
+#define DEFAULT_PORT 12345
+
+/// Reads the configuration from an ini file.
+/// Has default values for missing entries.
+class CConfiguration {
+public:
+ /// Server-section of ini file.
+ class CServer {
+ private:
+ static const std::string section;
+ public:
+ unsigned int port = DEFAULT_PORT;
+ std::string name = "Planet Battle";
+
+ CServer();
+ CServer(INIReader& iniReader);
+ friend std::ostream& operator<< (std::ostream& os, CConfiguration::CServer& server) {
+ return os << "[name=" << server.name << "; port=" << server.port << ";]";
+ }
+ };
+
+ /// Client-section of ini file.
+ class CClient {
+ private:
+ static const std::string section;
+ public:
+ unsigned int port = DEFAULT_PORT;
+ std::string name = "unknown";
+ std::string host = "localhost";
+
+ CClient();
+ CClient(INIReader& iniReader);
+ friend std::ostream& operator<< (std::ostream& os, CConfiguration::CClient& client) {
+ return os << "[name=" << client.name << "; port=" << client.port << "; host=" << client.host << ";]";
+ }
+ };
+
+private:
+public:
+ CServer server;
+ CClient client;
+ //CConfiguration() = delete;
+ CConfiguration(std::string iniFilename = "config.ini");
+ friend std::ostream& operator<< (std::ostream& os, CConfiguration& configuration) {
+ return os << "[Server=" << configuration.server << "; Client=" << configuration.client << ";]";
+ }
+};
+
+#endif
\ No newline at end of file
diff --git a/src/include/inih/INIReader.cpp b/src/include/inih/INIReader.cpp
new file mode 100644
index 0000000..b9f1961
--- /dev/null
+++ b/src/include/inih/INIReader.cpp
@@ -0,0 +1,94 @@
+// Read an INI file into easy-to-access name/value pairs.
+
+// inih and INIReader are released under the New BSD license (see LICENSE.txt).
+// Go to the project home page for more info:
+//
+// https://github.com/benhoyt/inih
+
+#include
+#include
+#include
+#include "ini.h"
+#include "INIReader.hpp"
+
+using std::string;
+
+INIReader::INIReader(const string& filename)
+{
+ _error = ini_parse(filename.c_str(), ValueHandler, this);
+}
+
+int INIReader::ParseError() const
+{
+ return _error;
+}
+
+string INIReader::Get(const string& section, const string& name, const string& default_value) const
+{
+ string key = MakeKey(section, name);
+ // Use _values.find() here instead of _values.at() to support pre C++11 compilers
+ return _values.count(key) ? _values.find(key)->second : default_value;
+}
+
+string INIReader::GetString(const string& section, const string& name, const string& default_value) const
+{
+ const string str = Get(section, name, "");
+ return str.empty() ? default_value : str;
+}
+
+long INIReader::GetInteger(const string& section, const string& name, long default_value) const
+{
+ string valstr = Get(section, name, "");
+ const char* value = valstr.c_str();
+ char* end;
+ // This parses "1234" (decimal) and also "0x4D2" (hex)
+ long n = strtol(value, &end, 0);
+ return end > value ? n : default_value;
+}
+
+double INIReader::GetReal(const string& section, const string& name, double default_value) const
+{
+ string valstr = Get(section, name, "");
+ const char* value = valstr.c_str();
+ char* end;
+ double n = strtod(value, &end);
+ return end > value ? n : default_value;
+}
+
+bool INIReader::GetBoolean(const string& section, const string& name, bool default_value) const
+{
+ string valstr = Get(section, name, "");
+ // Convert to lower case to make string comparisons case-insensitive
+ std::transform(valstr.begin(), valstr.end(), valstr.begin(), ::tolower);
+ if (valstr == "true" || valstr == "yes" || valstr == "on" || valstr == "1")
+ return true;
+ else if (valstr == "false" || valstr == "no" || valstr == "off" || valstr == "0")
+ return false;
+ else
+ return default_value;
+}
+
+bool INIReader::HasValue(const std::string& section, const std::string& name) const
+{
+ string key = MakeKey(section, name);
+ return _values.count(key);
+}
+
+string INIReader::MakeKey(const string& section, const string& name)
+{
+ string key = section + "=" + name;
+ // Convert to lower case to make section/name lookups case-insensitive
+ std::transform(key.begin(), key.end(), key.begin(), ::tolower);
+ return key;
+}
+
+int INIReader::ValueHandler(void* user, const char* section, const char* name,
+ const char* value)
+{
+ INIReader* reader = static_cast(user);
+ string key = MakeKey(section, name);
+ if (reader->_values[key].size() > 0)
+ reader->_values[key] += "\n";
+ reader->_values[key] += value;
+ return 1;
+}
diff --git a/src/include/inih/INIReader.hpp b/src/include/inih/INIReader.hpp
new file mode 100644
index 0000000..19538fb
--- /dev/null
+++ b/src/include/inih/INIReader.hpp
@@ -0,0 +1,61 @@
+// Read an INI file into easy-to-access name/value pairs.
+
+// inih and INIReader are released under the New BSD license (see LICENSE.txt).
+// Go to the project home page for more info:
+//
+// https://github.com/benhoyt/inih
+
+#ifndef __INIREADER_H__
+#define __INIREADER_H__
+
+#include