Skip to content

Commit

Permalink
#15 Added settings.ini that is read by a configuration class. It does…
Browse files Browse the repository at this point in the history
…n't have any effect yet but forwarding the configuration from the .ini file to the game etc is the next step.
  • Loading branch information
nitzel committed Apr 19, 2019
1 parent 2729002 commit 0375d82
Show file tree
Hide file tree
Showing 13 changed files with 741 additions and 7 deletions.
14 changes: 11 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -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
Expand All @@ -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)
15 changes: 15 additions & 0 deletions PlanetBattle Multiplayer.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,21 +21,32 @@
<ItemGroup>
<ClCompile Include="main.cpp" />
<ClCompile Include="src\client.cpp" />
<ClCompile Include="src\configuration.cpp" />
<ClCompile Include="src\draw.cpp" />
<ClCompile Include="src\game.cpp" />
<ClCompile Include="src\inc.cpp" />
<ClCompile Include="src\include\inih\ini.c" />
<ClCompile Include="src\include\inih\INIReader.cpp" />
<ClCompile Include="src\net.cpp" />
<ClCompile Include="src\server.cpp" />
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\client.hpp" />
<ClInclude Include="src\draw.hpp" />
<ClInclude Include="src\game.hpp" />
<ClInclude Include="src\configuration.hpp" />
<ClInclude Include="src\inc.hpp" />
<ClInclude Include="src\include\inih\ini.h" />
<ClInclude Include="src\include\inih\INIReader.hpp" />
<ClInclude Include="src\include\stb_image.h" />
<ClInclude Include="src\net.hpp" />
<ClInclude Include="src\server.hpp" />
</ItemGroup>
<ItemGroup>
<None Include="Makefile" />
<None Include="README.md" />
<None Include="settings.ini" />
</ItemGroup>
<PropertyGroup Label="Globals">
<VCProjectVersion>16.0</VCProjectVersion>
<ProjectGuid>{4A0F77B9-ADCF-4B3B-8ADD-2C0322F84308}</ProjectGuid>
Expand Down Expand Up @@ -109,6 +120,7 @@
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
Expand All @@ -124,6 +136,7 @@
<Optimization>Disabled</Optimization>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
Expand All @@ -137,6 +150,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
Expand All @@ -153,6 +167,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<SDLCheck>true</SDLCheck>
<ConformanceMode>true</ConformanceMode>
<LanguageStandard>stdcpp17</LanguageStandard>
</ClCompile>
<Link>
<SubSystem>Console</SubSystem>
Expand Down
23 changes: 23 additions & 0 deletions PlanetBattle Multiplayer.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,15 @@
<ClCompile Include="src\net.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\include\inih\ini.c">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\include\inih\INIReader.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\configuration.cpp">
<Filter>Source Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="src\draw.hpp">
Expand All @@ -59,5 +68,19 @@
<ClInclude Include="src\include\stb_image.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\include\inih\ini.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\configuration.hpp">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\include\inih\INIReader.hpp">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="Makefile" />
<None Include="README.md" />
<None Include="settings.ini" />
</ItemGroup>
</Project>
11 changes: 7 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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 [<targethost>]` and `-s [<maxshipsperplayer>]` 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")
Expand All @@ -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.

6 changes: 6 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#include "src/server.hpp"
#include "src/client.hpp"
#include "src/configuration.hpp"

#include <iostream>
#include <cstring> // std::strcmp
Expand All @@ -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
Expand Down
10 changes: 10 additions & 0 deletions settings.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
[Graphics]
width = 800
height = 600
[Server]
name = "Spiel1"
port = 12345
[Client]
name = "nitzel"
port = 12345
host = "127!!"
28 changes: 28 additions & 0 deletions src/configuration.cpp
Original file line number Diff line number Diff line change
@@ -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);
}
56 changes: 56 additions & 0 deletions src/configuration.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
#ifndef __CONFIGURATION__
#define __CONFIGURATION__

#include <string>
#include <iostream>
#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
94 changes: 94 additions & 0 deletions src/include/inih/INIReader.cpp
Original file line number Diff line number Diff line change
@@ -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 <algorithm>
#include <cctype>
#include <cstdlib>
#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<INIReader*>(user);
string key = MakeKey(section, name);
if (reader->_values[key].size() > 0)
reader->_values[key] += "\n";
reader->_values[key] += value;
return 1;
}
Loading

0 comments on commit 0375d82

Please sign in to comment.