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;
}