Skip to content
Snippets Groups Projects
GameServer.cpp 4.83 KiB
//
// Created by hoelshare on 22.05.17.
//
#define AUSGABE

#include "GameServer.hpp"
#include "ConfigPacket.hpp"
#include "Player.hpp"

#define RESISTANCE 100
#define HEALTH 100

void GameServer::setTeamPlay(char isTeam) {
#ifdef AUSGABE
    Serial.printf("Is team play: %s", isTeam ? "true" : "false");
#endif
    //TODO set Teamplay
}

void GameServer::secureQuestion() {
#ifdef AUSGABE
    Serial.printf("Sicherheitsabfrage!");
#endif
//secureMenu = new PlayerListMenu(4);
//secureMenu->addMenuItem(new MenuItem("Start?", [=]() { this->startGame(); Serial.println("Lambda Start - Ende"); }));
//secureMenu->addMenuItem(new MenuItem("Cancel?", [=]() {
//    ui->dispatchInput(badge->getJoystickState());
//    ui->closeCurrent();
//    ui->draw();
//}));
    //secureMenu->setRightAction([=]() {
    //    ui->dispatchInput(badge->getJoystickState());
    //    ui->closeCurrent();
    //    ui->draw();
    //});
    //secureMenu->setLeftAction([=]() { this->startGame(); });
    //ui->open(secureMenu);
}

void GameServer::kick() {
    if (playerList) {
//        unsigned short index = playerList->getIndex();
        // do something with the index
    }
}

void GameServer::update() {
    if (!this->gameStarted) {
        if (server->hasClient()) {
            Serial.println("Has Client");
            serverClients[numConnections] = server->available();
            Serial.printf("New connection %d\n", numConnections);

            handleWelcome(&(serverClients[numConnections]), numConnections);
        }
    } else {
//        Serial.println("Waiting for packets");
        for (short i = 0; i < numConnections; i++) { //iterate throu the slots
            if (serverClients[i].connected() && serverClients[i].available()) { //skip unconnected slots
                String message = serverClients[i].readStringUntil('\n');
                UrlDecode decode(message.c_str());
                String strTyp = String(decode.getKey("typ"));
                Serial.println(message);
                if (strTyp == "hit") {
                    HitPacket *packet = HitPacket::read(message);
                    sendHit(packet);
                    delete packet;
                }
            }
        }
    }
}

void GameServer::handleWelcome(WiFiClient *client, short iPlayer) {
    String message;
    message = client->readStringUntil('\n'); //faster the readBytesUntil()
    Serial.println(message);
    RemotePlayer player;
    player.nickname = message;
    player.pid = iPlayer;
    player.tid = 0;
    rPlayers[iPlayer] = player;
    numConnections++;
    sendAll(buildPlayerList());
    playerList->addMenuItem(new MenuItem(message, []() {}));
}

void GameServer::sendAll(String value) {
    for (short i = 0; i < numConnections; i++) {
        serverClients[i].print(value);
        serverClients[i].flush();
    }
}

void GameServer::sendIP() {
    String shareString = "a" + WiFi.localIP().toString() + "\n";
    badge->setGPIO(IR_EN, HIGH);
    Serial.println(shareString);
    Serial.println("NEC");
    uint32_t code = 0;
    uint8_t checksum = 0;
    for (int i = 0; i < shareString.length(); i++) {
        checksum += shareString.charAt(i);
        code = code | shareString.charAt(i) << (i % 4) * 8;
        if (i % 4 == 3) {
            irsend.sendNEC(code, 32);
            Serial.println(code, HEX);
            code = 0;
        }
    }
    if (code != 0) {
        irsend.sendNEC(code, 32);
        Serial.println(code, HEX);
    }
    Serial.print("Checksum: ");
    Serial.println(checksum); //224
    code = 0;
    code = checksum << 8 | 222;
    irsend.sendNEC(code, 32);
    badge->setGPIO(IR_EN, LOW);
}

void GameServer::startGame() {
    if (!gameStarted) {
        Serial.println("Start Game - GameServer");
        ConfigPacket config;
        for (int i = 0; i < 3; i++) {
            config.magazineSize[i] = Player::magazineSize[i];
            config.magazineReloadTime[i] = Player::magazineReloadTime[i];
            config.shotTime[i] = Player::shotTime[i];
            config.damage[i] = Player::damage[i];
        }
        config.resistance = RESISTANCE;
        config.health = HEALTH;
        String value = config.serial() + "\n";
        sendAll(value);
        sendAll(buildPlayerList());
        this->gameStarted = true;
        if (gameStartCallback) {
            Serial.println("Start Game - GameServer - call Callback");
            gameStartCallback();
        }
        Serial.println("Start Game - GameServer - Ende");
    }
}

void GameServer::sendHit(HitPacket *hitPacket) {
    int pid = hitPacket->playerId;
    serverClients[pid].print(hitPacket->serial());
    serverClients[pid].flush();
    Serial.printf(String("Send hit: " + hitPacket->serial()).c_str());
}

String GameServer::buildPlayerList() {
    String ret = String(numConnections);
    for (short i = 0; i < numConnections; i++) {
        ret += "&" + rPlayers[i].serial();
    }
    ret += "\n";
    return ret;
}