Skip to content

Commit 955c619

Browse files
authored
Merge pull request #87 from G-Epitech/rtp-109-add-gamestart-and-gameend-client-infos
RTP-109 - Add gamestart and gameend client infos
2 parents f082727 + 82900e0 commit 955c619

File tree

33 files changed

+531
-55
lines changed

33 files changed

+531
-55
lines changed

client/main.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
#include "./src/scenes/menu.hpp"
1717
#include "./src/scenes/settings.hpp"
1818
#include "libs/mew/src/game/builder.hpp"
19+
#include "libs/mew/src/game/game.hpp"
20+
#include "scenes/end.hpp"
1921

2022
using namespace mew::game;
2123
using namespace rtype::client::builder;

client/src/builder/scenes.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#include "client/src/scenes/register.hpp"
1515
#include "client/src/scenes/settings.hpp"
1616
#include "client/src/scenes/start/start.hpp"
17+
#include "scenes/end.hpp"
1718

1819
using namespace rtype::client::builder;
1920
using namespace rtype::client::scenes;
@@ -26,6 +27,7 @@ void Scenes::LoadScenes(mew::game::Game *game) {
2627
game->managers.scenes->RegisterScene<SceneGame>();
2728
game->managers.scenes->RegisterScene<SceneStart>();
2829
game->managers.scenes->RegisterScene<SceneLeaderboard>();
30+
game->managers.scenes->RegisterScene<SceneEnd>();
2931
}
3032

3133
void Scenes::SetEntryScene(mew::game::Game *game) {

client/src/builder/settings.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,19 @@
88
#include "settings.hpp"
99

1010
#include "client/src/constants/settings.hpp"
11+
#include "constants/chat.hpp"
12+
#include "constants/game.hpp"
13+
#include "constants/user.hpp"
1114

1215
using namespace rtype::client::builder;
1316

1417
void Settings::LoadSettings(mew::game::Game *game) {
1518
game->managers.settings->Set(SETTING_APP_VOLUME, SETTING_DEFAULT_APP_VOLUME);
1619
game->managers.settings->Set(SETTING_GAME_KEYMAP, SETTING_DEFAULT_GAME_KEYMAP);
1720
game->managers.settings->Set(SETTING_GAME_ANIMATIONS, SETTING_DEFAULT_GAME_ANIMATIONS);
18-
game->managers.settings->Set(SETTING_GAME_CHAT_OPEN, SETTING_DEFAULT_GAME_CHAT_OPEN);
19-
game->managers.settings->Set(SETTING_PLAYER_USERNAME,
20-
std::string(SETTING_DEFAULT_PLAYER_USERNAME));
21+
game->managers.settings->Set(CHAT_IS_OPEN, CHAT_DEFAULT_IS_OPEN);
22+
game->managers.settings->Set(PLAYER_USERNAME, std::string(PLAYER_DEFAULT_USERNAME));
23+
game->managers.settings->Set(GAME_END_SCORE, static_cast<std::size_t>(GAME_DEFAULT_END_SCORE));
24+
game->managers.settings->Set(GAME_END_WIN, GAME_DEFAULT_END_WIN);
25+
game->managers.settings->Set(GAME_END_TIME, static_cast<time_t>(GAME_DEFAULT_END_TIME));
2126
}

client/src/constants/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,6 @@ target_sources(${CLIENT_CORE_LIB} PRIVATE
22
settings.hpp
33
window.hpp
44
chat.hpp
5+
game.hpp
6+
user.hpp
57
)

client/src/constants/chat.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,5 @@
1111
#define CHAT_MESSAGE_MAX_LENGTH 100
1212
#define CHAT_PIXELS_LEFT 200
1313
#define CHAT_CHAR_SIZE 12
14+
#define CHAT_IS_OPEN "game:chat"
15+
#define CHAT_DEFAULT_IS_OPEN false

client/src/constants/game.hpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
/*
2+
** EPITECH PROJECT, 2024
3+
** r-type
4+
** File description:
5+
** game.hpp
6+
*/
7+
8+
#pragma once
9+
10+
#define GAME_END_SCORE "game:end:score"
11+
#define GAME_END_WIN "game:end:win"
12+
#define GAME_END_TIME "game:end:time"
13+
14+
#define GAME_DEFAULT_END_SCORE 0
15+
#define GAME_DEFAULT_END_WIN false
16+
#define GAME_DEFAULT_END_TIME 0

client/src/constants/settings.hpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,10 @@
1010
#include "./game/keymap.hpp"
1111

1212
#define SETTING_APP_VOLUME "app:volume"
13-
#define SETTING_GAME_ANIMATIONS "app:fullscreen"
13+
#define SETTING_GAME_ANIMATIONS "app:animations"
1414
#define SETTING_GAME_KEYMAP "game:keymap"
1515
#define SETTING_APP_BLINDNESS_MODE "app:blindness_mode"
16-
#define SETTING_GAME_CHAT_OPEN "game:chat"
17-
#define SETTING_PLAYER_USERNAME "player:username"
18-
#define SETTING_PLAYER_USERNAME_MAX_LENGTH 20
1916

2017
#define SETTING_DEFAULT_APP_VOLUME 100
2118
#define SETTING_DEFAULT_GAME_ANIMATIONS true
2219
#define SETTING_DEFAULT_GAME_KEYMAP rtype::client::KeyMap::ZQSD
23-
#define SETTING_DEFAULT_GAME_CHAT_OPEN false
24-
#define SETTING_DEFAULT_PLAYER_USERNAME "Ptit'plouf"

client/src/constants/user.hpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
/*
2+
** EPITECH PROJECT, 2024
3+
** r-type
4+
** File description:
5+
** user.hpp
6+
*/
7+
8+
#pragma once
9+
10+
#define PLAYER_USERNAME "player:username"
11+
#define PLAYER_USERNAME_MAX_LENGTH 20
12+
13+
#define PLAYER_DEFAULT_USERNAME "Ptit'plouf"

client/src/scenes/CMakeLists.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,7 @@ target_sources(${CLIENT_CORE_LIB} PRIVATE
1111
leaderboard.hpp
1212
register.cpp
1313
register.hpp
14+
end.cpp
15+
end.hpp
1416
)
1517
add_subdirectory(start)

client/src/scenes/end.cpp

Lines changed: 139 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,139 @@
1+
/*
2+
** EPITECH PROJECT, 2024
3+
** rtype
4+
** File description:
5+
** leaderboard.cpp
6+
*/
7+
8+
#include "end.hpp"
9+
10+
#include "client/src/systems/leaderboard/sync.hpp"
11+
#include "constants/game.hpp"
12+
#include "constants/settings.hpp"
13+
#include "libs/mew/src/sets/events/events.hpp"
14+
#include "menu.hpp"
15+
16+
using namespace rtype::client;
17+
using namespace rtype::client::scenes;
18+
using namespace mew::sets::events;
19+
using namespace mew::sets;
20+
using namespace mew::sets::drawable;
21+
using namespace mew::managers;
22+
using namespace zygarde::core::components;
23+
using namespace zygarde::core::types;
24+
using namespace rtype::client::systems;
25+
using namespace rtype::client::services;
26+
27+
SceneEnd::SceneEnd(DependenciesHandler::Ptr services) : SceneBase(std::move(services)) {
28+
serverConnectionService_ = services_->GetOrThrow<ServerConnectionService>();
29+
settingsManager_ = services_->GetOrThrow<SettingsManager>();
30+
}
31+
32+
void SceneEnd::OnCreate() {
33+
const Vector3f origin{managers_.window->GetWidth() / 2, managers_.window->GetHeight() / 2};
34+
constexpr Alignment textAligns{HorizontalAlign::kCenter, VerticalAlign::kCenter};
35+
36+
CreateWin(origin, textAligns);
37+
CreateScore(origin, textAligns);
38+
CreateTime(origin, textAligns);
39+
CreateBackButton();
40+
CreateMainEntity();
41+
}
42+
43+
void SceneEnd::OnActivate() {}
44+
45+
void SceneEnd::CreateMainEntity() const {
46+
const auto main = registry_->SpawnEntity();
47+
48+
registry_->AddComponent<OnMousePressed>(
49+
main,
50+
OnMousePressed{.strategy = MouseEventTarget::kAnyTarget,
51+
.handler = [this](const sf::Mouse::Button &button, const sf::Vector2f &pos,
52+
const MouseEventTarget &target) {
53+
if (button == sf::Mouse::Button::Left) {
54+
managers_.sound->PlaySound("buttons:click");
55+
}
56+
}});
57+
}
58+
59+
void SceneEnd::CreateBackButton() const {
60+
const auto exit_button = registry_->SpawnEntity();
61+
const auto aligns = Alignment{HorizontalAlign::kCenter, VerticalAlign::kCenter};
62+
const auto point = Vector3f(managers_.window->GetWidth() / 2, managers_.window->GetHeight() - 50);
63+
64+
registry_->AddComponent<Position>(exit_button, {point, aligns});
65+
registry_->AddComponent<Drawable>(exit_button,
66+
{Text{"Back", "main", 20}, WindowManager::View::HUD});
67+
registry_->AddComponent<OnMousePressed>(
68+
exit_button,
69+
OnMousePressed{.strategy = MouseEventTarget::kLocalTarget,
70+
.handler = [this](const sf::Mouse::Button &button, const sf::Vector2f &pos,
71+
const MouseEventTarget &target) {
72+
if (button == sf::Mouse::Button::Left) {
73+
managers_.scenes->GoToScene<SceneMenu>();
74+
}
75+
}});
76+
registry_->AddComponent<OnMouseMoved>(
77+
exit_button, OnMouseMoved{.strategy = MouseEventTarget::kAnyTarget,
78+
.handler = [this, exit_button](const sf::Vector2f &pos,
79+
const MouseEventTarget &target) {
80+
auto drawables = registry_->GetComponents<Drawable>();
81+
82+
auto &dr = (*drawables)[static_cast<std::size_t>(exit_button)];
83+
84+
if (dr) {
85+
auto &drawable = dr.value();
86+
auto &variant = drawable.drawable;
87+
88+
if (std::holds_alternative<Text>(variant)) {
89+
auto &text = std::get<Text>(variant);
90+
if (target == MouseEventTarget::kLocalTarget) {
91+
text.style = sf::Text::Style::Underlined;
92+
} else {
93+
text.style = sf::Text::Style::Regular;
94+
}
95+
}
96+
}
97+
}});
98+
}
99+
100+
void SceneEnd::CreateWin(const zygarde::core::types::Vector3f &origin,
101+
const Alignment &aligns) const {
102+
const auto win_entity = registry_->SpawnEntity();
103+
const auto point = Vector3f(origin.x, origin.y - 150);
104+
const bool win = settingsManager_->Get<bool>(GAME_END_WIN);
105+
const auto text = win ? "Win" : "Lose";
106+
const auto color = win ? sf::Color::Green : sf::Color::Red;
107+
108+
registry_->AddComponent<Position>(win_entity, {point, aligns});
109+
registry_->AddComponent<Drawable>(
110+
win_entity, {Text{text, "main", 50, sf::Text::Style::Bold, color}, WindowManager::View::HUD});
111+
}
112+
113+
void SceneEnd::CreateScore(const zygarde::core::types::Vector3f &origin,
114+
const Alignment &aligns) const {
115+
const auto title = registry_->SpawnEntity();
116+
const auto point = Vector3f(origin.x, origin.y);
117+
const auto score = settingsManager_->Get<std::size_t>(GAME_END_SCORE);
118+
const auto text = "Score: " + std::to_string(score);
119+
120+
registry_->AddComponent<Position>(title, {point, aligns});
121+
registry_->AddComponent<Drawable>(title, {Text{text, "main", 25}, WindowManager::View::HUD});
122+
}
123+
124+
void SceneEnd::CreateTime(const zygarde::core::types::Vector3f &origin,
125+
const Alignment &aligns) const {
126+
const auto info = registry_->SpawnEntity();
127+
const auto point = Vector3f(origin.x, origin.y + 30);
128+
const auto time = settingsManager_->Get<time_t>(GAME_END_TIME);
129+
130+
const auto *localTime = std::localtime(&time);
131+
132+
char buffer[6] = {0};
133+
std::strftime(buffer, sizeof(buffer), "%M:%S", localTime);
134+
const std::string text_time(buffer);
135+
const std::string text = "Time: " + text_time;
136+
137+
registry_->AddComponent<Position>(info, {point, aligns});
138+
registry_->AddComponent<Drawable>(info, {Text{text, "main", 20}, WindowManager::View::HUD});
139+
}

0 commit comments

Comments
 (0)