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