// Public functions Variant WidgetSaver::serialize(WidgetVirtual* w, std::map<std::string, WidgetVirtual*>& association, int& unknownIndex) { Variant rootVariant; rootVariant.createMap(); // write type switch (w->type) { case WidgetVirtual::VIRTUAL: rootVariant.insert("type", Variant("VIRTUAL")); break; case WidgetVirtual::BOARD: rootVariant.insert("type", Variant("BOARD")); break; case WidgetVirtual::IMAGE: rootVariant.insert("type", Variant("IMAGE")); break; case WidgetVirtual::LABEL: rootVariant.insert("type", Variant("LABEL")); break; case WidgetVirtual::CONSOLE: rootVariant.insert("type", Variant("CONSOLE")); break; case WidgetVirtual::RADIO_BUTTON: rootVariant.insert("type", Variant("RADIO_BUTTON"));break; default: rootVariant.insert("type", Variant("UNKNOWN")); break; } // write configuration rootVariant.insert("config", Variant((int)w->configuration)); // write sizes if (w->sizes[WidgetVirtual::DEFAULT] == w->sizes[WidgetVirtual::HOVER] && w->sizes[WidgetVirtual::DEFAULT] == w->sizes[WidgetVirtual::ACTIVE] && w->sizes[WidgetVirtual::DEFAULT] == w->sizes[WidgetVirtual::CURRENT]) rootVariant.insert("sizeAll", ToolBox::getFromVec2(w->sizes[WidgetVirtual::DEFAULT])); else { rootVariant.insert("sizeDefault", ToolBox::getFromVec2(w->sizes[WidgetVirtual::DEFAULT])); rootVariant.insert("sizeHover", ToolBox::getFromVec2(w->sizes[WidgetVirtual::HOVER])); rootVariant.insert("sizeActive", ToolBox::getFromVec2(w->sizes[WidgetVirtual::ACTIVE])); rootVariant.insert("sizeCurrent", ToolBox::getFromVec2(w->sizes[WidgetVirtual::CURRENT])); } // write positions if (w->positions[WidgetVirtual::DEFAULT] == w->positions[WidgetVirtual::HOVER] && w->positions[WidgetVirtual::DEFAULT] == w->positions[WidgetVirtual::ACTIVE] && w->positions[WidgetVirtual::DEFAULT] == w->positions[WidgetVirtual::CURRENT]) rootVariant.insert("positionAll", ToolBox::getFromVec3(w->positions[WidgetVirtual::DEFAULT])); else { rootVariant.insert("positionDefault", ToolBox::getFromVec3(w->positions[WidgetVirtual::DEFAULT])); rootVariant.insert("positionHover", ToolBox::getFromVec3(w->positions[WidgetVirtual::HOVER])); rootVariant.insert("positionActive", ToolBox::getFromVec3(w->positions[WidgetVirtual::ACTIVE])); rootVariant.insert("positionCurrent", ToolBox::getFromVec3(w->positions[WidgetVirtual::CURRENT])); } // write colors if (w->colors[WidgetVirtual::DEFAULT] == w->colors[WidgetVirtual::HOVER] && w->colors[WidgetVirtual::DEFAULT] == w->colors[WidgetVirtual::ACTIVE] && w->colors[WidgetVirtual::DEFAULT] == w->colors[WidgetVirtual::CURRENT]) rootVariant.insert("colorAll", ToolBox::getFromVec4(w->colors[WidgetVirtual::DEFAULT])); else { rootVariant.insert("colorDefault", ToolBox::getFromVec4(w->colors[WidgetVirtual::DEFAULT])); rootVariant.insert("colorHover", ToolBox::getFromVec4(w->colors[WidgetVirtual::HOVER])); rootVariant.insert("colorActive", ToolBox::getFromVec4(w->colors[WidgetVirtual::ACTIVE])); rootVariant.insert("colorCurrent", ToolBox::getFromVec4(w->colors[WidgetVirtual::CURRENT])); } // write shader and texture name if (w->shader && w->shader->name != "defaultWidget") rootVariant.insert("shader", Variant(w->shader->name)); if (w->texture) rootVariant.insert("texture", Variant(w->texture->name)); // derivate type switch (w->type) { case WidgetVirtual::BOARD: serializeBoard(static_cast<WidgetBoard*>(w), rootVariant); break; case WidgetVirtual::IMAGE: serializeImage(static_cast<WidgetImage*>(w), rootVariant); break; case WidgetVirtual::LABEL: serializeLabel(static_cast<WidgetLabel*>(w), rootVariant); break; case WidgetVirtual::CONSOLE: serializeConsole(static_cast<WidgetConsole*>(w), rootVariant); break; case WidgetVirtual::RADIO_BUTTON: serializeRadioButton(static_cast<WidgetRadioButton*>(w), rootVariant); break; default: break; } // children if (!w->children.empty()) { rootVariant.insert("children", Variant::MapType()); for (unsigned int i = 0; i < w->children.size(); ++i) { std::string name = "unknown_" + std::to_string(++unknownIndex); for (std::map<std::string, WidgetVirtual*>::iterator it = association.begin(); it != association.end(); ++it) { if (w->children[i] == it->second) { name = it->first; break; } } Variant child = serialize(w->children[i], association, unknownIndex); rootVariant.getMap()["children"].insert(name, child); } } // end return rootVariant; }
void GameStateOnline::update(float dt){ //upgrade pionka do krolowki if (!gameOver) { for(auto & piece : board.pieces){ if( ( ( piece.position.y == 7 && piece.color == PieceColor::WHITE ) || ( piece.position.y == 0 && piece.color == PieceColor::BLACK ) ) && !piece.king ){ piece.king = true; if(piece.color == PieceColor::WHITE){ piece.sprite.setTexture(this->game->textureManager.getReference(opponentKingString)); piece.type = KING_WHITE; } if(piece.color == PieceColor::BLACK){ piece.sprite.setTexture(this->game->textureManager.getReference(localPlayerKingString)); piece.type = KING_BLACK; } pieceUpgradeSound.play(); board.updateBoardState(); } } } //sprawdzanie konca gry int counterMy = 0, counterOpposite = 0; if (!gameOver) { for(auto & piece : board.pieces){ if(piece.color == PieceColor::WHITE) counterOpposite++; if(piece.color == PieceColor::BLACK) counterMy++; } } if (isEndOfLocalPlayerTurn) { ConnectionWithServer::BoardRepresentation board_representation = serializeBoard(); bool if_winner = (counterOpposite == 0); ConnectionWithServer::GameSituation situation; situation.board = board_representation; situation.ifWinner = if_winner; situation.movesSinceLastCapture = movesSinceLastCapture; connection->sendSituationAfterTurn(situation); if (connection->isError()) { gameOver = true; text.setString("Connection error"); } else { currentPlayer = -1; } isEndOfLocalPlayerTurn = false; } if (currentPlayer == -1 && gameOver == false) { if (delta == 0.f) { connection->refresh(); if (connection->isError()) { gameOver = true; if (connection->getErrorCode() == ConnectionWithServer::ErrorCode::OPPONENT_DISCONNECTED) text.setString("Opponent disconnected"); else text.setString("Connection error"); } if (connection->isReady()) { ConnectionWithServer::GameSituation situation = connection->getSituationAfterOpponentTurn(); ConnectionWithServer::BoardRepresentation& boardRepresentation = situation.board; movesSinceLastCapture = situation.movesSinceLastCapture; updateBoard(boardRepresentation); for(auto & piece : this->board.pieces){ if(piece.type == PIECE_WHITE) { piece.sprite.setTexture(this->game->textureManager.getReference(opponentPieceString)); } else if(piece.type == PIECE_BLACK) { piece.sprite.setTexture(this->game->textureManager.getReference(localPlayerPieceString)); } else if(piece.type == KING_WHITE) { piece.sprite.setTexture(this->game->textureManager.getReference(opponentKingString)); } else if(piece.type == KING_BLACK) { piece.sprite.setTexture(this->game->textureManager.getReference(localPlayerKingString)); } } board.updateBoardState(); board.updatePieceSprite(); currentPlayer = 1; } } } delta += dt; if (delta >= 1.f) { delta = 0.f; } if(movesSinceLastCapture >= 15 && !gameOver){ gameOver = true; winner.setTexture(game->textureManager.getReference("draw")); } if(counterOpposite == 0 && !gameOver) { gameOver = true; winner.setTexture(game->textureManager.getReference("player wins")); game->rick.stop(); winnerSound.play(); } if(counterMy == 0 && !gameOver) { gameOver = true; winner.setTexture(game->textureManager.getReference("player lost")); game->rick.stop(); } }