summaryrefslogtreecommitdiffstats
path: root/game/shared/splash.cc
blob: 2381f7a29b99e6148dfaf3a98b4287562d725a1a (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include "shared/pch.hh"

#include "shared/splash.hh"

constexpr static const char* SPLASHES_FILENAME_CLIENT = "misc/splashes_client.txt";
constexpr static const char* SPLASHES_FILENAME_SERVER = "misc/splashes_server.txt";
constexpr static std::size_t SPLASH_SERVER_MAX_LENGTH = 32;

static std::mt19937_64 splash_random;
static std::vector<std::string> splash_lines;

static std::string sanitize_line(const std::string& line)
{
    std::string result;

    for(auto chr : line) {
        if(chr != '\r' && chr != '\n') {
            result.push_back(chr);
        }
    }

    return result;
}

static void splash_init_filename(const char* filename)
{
    if(auto file = PHYSFS_openRead(filename)) {
        auto source = std::string(PHYSFS_fileLength(file), char(0x00));
        PHYSFS_readBytes(file, source.data(), source.size());
        PHYSFS_close(file);

        std::string line;
        std::istringstream stream(source);

        while(std::getline(stream, line))
            splash_lines.push_back(sanitize_line(line));
        splash_random.seed(std::random_device()());
    } else {
        splash_lines.push_back(fmt::format("{}: {}", filename, PHYSFS_getErrorByCode(PHYSFS_getLastErrorCode())));
        splash_random.seed(std::random_device()());
    }
}

void splash::init_client(void)
{
    splash_init_filename(SPLASHES_FILENAME_CLIENT);
}

void splash::init_server(void)
{
    splash_init_filename(SPLASHES_FILENAME_SERVER);

    // Server browser GUI should be able to display
    // these splash messages without text clipping over
    for(int i = 0; i < splash_lines.size(); i++) {
        splash_lines[i] = splash_lines[i].substr(0, SPLASH_SERVER_MAX_LENGTH);
    }
}

const char* splash::get(void)
{
    std::uniform_int_distribution<std::size_t> dist(0, splash_lines.size() - 1);
    return splash_lines.at(dist(splash_random)).c_str();
}