RType
RType.hpp
Go to the documentation of this file.
1 /*
2 ** EPITECH PROJECT, 2023
3 ** RType
4 ** File description:
5 ** RType.hpp
6 */
7 
8 #pragma once
9 
10 #include "./Scenes/IScene.hpp"
11 #include "./Scenes/Lobby/Lobby.hpp"
12 #include "./services/Graphic.hpp"
13 #include "IGame.hpp"
14 #include <SFML/Window/Event.hpp>
15 #include <SFML/Window/Keyboard.hpp>
16 #include <iostream>
17 #include <utility>
18 
19 class RType : public IGame
20 {
21  public:
22 
23  /**
24  * @brief Construct a new RType:: RType object
25  * @param socket
26  */
27  explicit RType(std::shared_ptr<ServerSocket> socket)
28  {
29  _socket = std::move(socket);
30  _scenes["Lobby"] = std::make_shared<LobbyScene>(_socket);
31  _currentScene = nullptr;
32  gettimeofday(&_broadcastGameState, nullptr);
33  }
34 
35  /**
36  * @brief Destroy the RType:: RType object
37  */
38  ~RType() override = default;
39 
40  /**
41  * @brief update, update the game
42  * @param event
43  * @param packet
44  */
45  void update(std::shared_ptr<Event> event, std::shared_ptr<Packet> packet) override
46  {
47  timeval currentTime{};
48  timeval elapsedTime{};
49  gettimeofday(&currentTime, nullptr);
50  timersub(&currentTime, &_broadcastGameState, &elapsedTime);
51 
52  if (!_socket->getClients().empty()) {
53  if (_currentScene == nullptr) {
54  _currentScene = _scenes["Lobby"];
55  _currentScene->restartScene();
56  }
57  } else {
58  _currentScene = nullptr;
59  }
60 
61  if (_currentScene == nullptr)
62  return;
63  _currentScene->update(event, packet);
64 
65  if (_socket->getClients().size() != last_client_nb) {
66  last_client_nb = _socket->getClients().size();
67  std::shared_ptr<Packet> sendpacket = std::make_shared<Packet>();
68  sendpacket->code = EVENT;
69  sendpacket->data_size = strlen("new player");
70  sendpacket->data = malloc(sendpacket->data_size);
71  memcpy(sendpacket->data, "new player", sendpacket->data_size);
72  _socket->broadcast(sendpacket.get());
73  }
74 
75  if (elapsedTime.tv_sec >= 5) {
76  _currentScene->broadcastGameState();
77  gettimeofday(&_broadcastGameState, nullptr);
78  }
79  }
80 
81  std::shared_ptr<ServerSocket> _socket;
83  std::shared_ptr<ISceneRType> _currentScene;
84  float direction = 0.5;
85  int last_client_nb = 0;
87 };