aboutsummaryrefslogtreecommitdiff
path: root/terminal-game-utils.hpp
diff options
context:
space:
mode:
authorroy <[email protected]>2026-07-07 04:30:15 +0300
committerroy <[email protected]>2026-07-07 04:30:15 +0300
commite9bea125cce5d6ff81feca41598fb3d8e57de254 (patch)
tree266a017b82b3537ab27a66bfb04f005fef383716 /terminal-game-utils.hpp
parenta581945aa7c77251420489f4b22222ec15abcd7a (diff)
Updated dep. Added apple, collision and losing.
Diffstat (limited to 'terminal-game-utils.hpp')
-rw-r--r--terminal-game-utils.hpp253
1 files changed, 129 insertions, 124 deletions
diff --git a/terminal-game-utils.hpp b/terminal-game-utils.hpp
index d7d9522..aa540bb 100644
--- a/terminal-game-utils.hpp
+++ b/terminal-game-utils.hpp
@@ -14,142 +14,142 @@ inline struct termios orig_termios;
inline std::string newline = "\n\r";
enum class GameKey {
- INVALID,
- LEFTARROW,
- DOWNARROW,
- UPARROW,
- RIGHTARROW,
- ESCAPE,
- A,
- B,
- C,
- D,
- E,
- F,
- G,
- H,
- I,
- J,
- K,
- L,
- M,
- N,
- O,
- P,
- Q,
- R,
- S,
- T,
- U,
- V,
- W,
- X,
- Y,
- Z,
- SPACE,
+ INVALID,
+ LEFTARROW,
+ DOWNARROW,
+ UPARROW,
+ RIGHTARROW,
+ ESCAPE,
+ A,
+ B,
+ C,
+ D,
+ E,
+ F,
+ G,
+ H,
+ I,
+ J,
+ K,
+ L,
+ M,
+ N,
+ O,
+ P,
+ Q,
+ R,
+ S,
+ T,
+ U,
+ V,
+ W,
+ X,
+ Y,
+ Z,
+ SPACE,
};
inline std::map<std::string, GameKey> KeyMap = {{"a", GameKey::A},
- {"b", GameKey::B},
- {"c", GameKey::C},
- {"d", GameKey::D},
- {"e", GameKey::E},
- {"f", GameKey::F},
- {"g", GameKey::G},
- {"h", GameKey::H},
- {"i", GameKey::I},
- {"j", GameKey::J},
- {"k", GameKey::K},
- {"l", GameKey::L},
- {"m", GameKey::M},
- {"n", GameKey::N},
- {"o", GameKey::O},
- {"p", GameKey::P},
- {"q", GameKey::Q},
- {"r", GameKey::R},
- {"s", GameKey::S},
- {"t", GameKey::T},
- {"u", GameKey::U},
- {"v", GameKey::V},
- {"w", GameKey::W},
- {"x", GameKey::X},
- {"y", GameKey::Y},
- {"z", GameKey::Z},
- {"A", GameKey::A},
- {"B", GameKey::B},
- {"C", GameKey::C},
- {"D", GameKey::D},
- {"E", GameKey::E},
- {"F", GameKey::F},
- {"G", GameKey::G},
- {"H", GameKey::H},
- {"I", GameKey::I},
- {"J", GameKey::J},
- {"K", GameKey::K},
- {"L", GameKey::L},
- {"M", GameKey::M},
- {"N", GameKey::N},
- {"O", GameKey::O},
- {"P", GameKey::P},
- {"Q", GameKey::Q},
- {"R", GameKey::R},
- {"S", GameKey::S},
- {"T", GameKey::T},
- {"U", GameKey::U},
- {"V", GameKey::V},
- {"W", GameKey::W},
- {"X", GameKey::X},
- {"Y", GameKey::Y},
- {"Z", GameKey::Z},
- {"\x1b", GameKey::ESCAPE},
- {"\x1b[D", GameKey::LEFTARROW},
- {"\x1b[B", GameKey::DOWNARROW},
- {"\x1b[A", GameKey::UPARROW},
- {"\x1b[C", GameKey::RIGHTARROW},
- {" ", GameKey::SPACE}};
+ {"b", GameKey::B},
+ {"c", GameKey::C},
+ {"d", GameKey::D},
+ {"e", GameKey::E},
+ {"f", GameKey::F},
+ {"g", GameKey::G},
+ {"h", GameKey::H},
+ {"i", GameKey::I},
+ {"j", GameKey::J},
+ {"k", GameKey::K},
+ {"l", GameKey::L},
+ {"m", GameKey::M},
+ {"n", GameKey::N},
+ {"o", GameKey::O},
+ {"p", GameKey::P},
+ {"q", GameKey::Q},
+ {"r", GameKey::R},
+ {"s", GameKey::S},
+ {"t", GameKey::T},
+ {"u", GameKey::U},
+ {"v", GameKey::V},
+ {"w", GameKey::W},
+ {"x", GameKey::X},
+ {"y", GameKey::Y},
+ {"z", GameKey::Z},
+ {"A", GameKey::A},
+ {"B", GameKey::B},
+ {"C", GameKey::C},
+ {"D", GameKey::D},
+ {"E", GameKey::E},
+ {"F", GameKey::F},
+ {"G", GameKey::G},
+ {"H", GameKey::H},
+ {"I", GameKey::I},
+ {"J", GameKey::J},
+ {"K", GameKey::K},
+ {"L", GameKey::L},
+ {"M", GameKey::M},
+ {"N", GameKey::N},
+ {"O", GameKey::O},
+ {"P", GameKey::P},
+ {"Q", GameKey::Q},
+ {"R", GameKey::R},
+ {"S", GameKey::S},
+ {"T", GameKey::T},
+ {"U", GameKey::U},
+ {"V", GameKey::V},
+ {"W", GameKey::W},
+ {"X", GameKey::X},
+ {"Y", GameKey::Y},
+ {"Z", GameKey::Z},
+ {"\x1b", GameKey::ESCAPE},
+ {"\x1b[D", GameKey::LEFTARROW},
+ {"\x1b[B", GameKey::DOWNARROW},
+ {"\x1b[A", GameKey::UPARROW},
+ {"\x1b[C", GameKey::RIGHTARROW},
+ {" ", GameKey::SPACE}};
inline void DisableRawMode() { tcsetattr(0, TCSAFLUSH, &orig_termios); }
inline void EnableRawMode() {
- tcgetattr(0, &orig_termios);
+ tcgetattr(0, &orig_termios);
- atexit(DisableRawMode);
- struct termios raw = orig_termios;
- raw.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON);
- raw.c_oflag &= ~(OPOST);
- raw.c_cflag |= (CS8);
- raw.c_lflag &= ~(ECHO | ICANON | IEXTEN);
- raw.c_cc[VMIN] = 1;
- raw.c_cc[VTIME] = 0;
+ atexit(DisableRawMode);
+ struct termios raw = orig_termios;
+ raw.c_iflag &= ~(ICRNL | INPCK | ISTRIP | IXON);
+ raw.c_oflag &= ~(OPOST);
+ raw.c_cflag |= (CS8);
+ raw.c_lflag &= ~(ECHO | ICANON | IEXTEN);
+ raw.c_cc[VMIN] = 1;
+ raw.c_cc[VTIME] = 0;
- tcsetattr(0, TCSAFLUSH, &raw);
+ tcsetattr(0, TCSAFLUSH, &raw);
}
inline bool InputAvailable(int timeout_ms) {
- pollfd pfd{};
- pfd.fd = STDIN_FILENO;
- pfd.events = POLLIN;
+ pollfd pfd{};
+ pfd.fd = STDIN_FILENO;
+ pfd.events = POLLIN;
- return poll(&pfd, 1, timeout_ms) > 0;
+ return poll(&pfd, 1, timeout_ms) > 0;
}
inline GameKey GetKeyPress() {
- std::string keypress_string;
- char c;
+ std::string keypress_string;
+ char c;
- read(STDIN_FILENO, &c, 1);
- keypress_string += c;
+ read(STDIN_FILENO, &c, 1);
+ keypress_string += c;
- if (c == 27)
- while (InputAvailable(10)) {
- read(STDIN_FILENO, &c, 1);
- keypress_string += c;
- }
+ if (c == 27)
+ while (InputAvailable(10)) {
+ read(STDIN_FILENO, &c, 1);
+ keypress_string += c;
+ }
- if (KeyMap.find(keypress_string) != KeyMap.end())
- return KeyMap[keypress_string];
- return GameKey::INVALID;
+ if (KeyMap.find(keypress_string) != KeyMap.end())
+ return KeyMap[keypress_string];
+ return GameKey::INVALID;
}
// Text printers:
@@ -161,7 +161,7 @@ inline void TextRed() { std::cout << "\033[31m"; }
inline void TextBlue() { std::cout << "\033[34m"; }
inline void TextRGB(int r, int g, int b) {
- std::cout << std::format("\033[38;2;{};{};{}m", r, g, b);
+ std::cout << std::format("\033[38;2;{};{};{}m", r, g, b);
};
// Background printers:
@@ -173,26 +173,31 @@ inline void BGRed() { std::cout << "\033[41m"; }
inline void BGBlue() { std::cout << "\033[44m"; }
inline void BGRGB(int r, int g, int b) {
- std::cout << std::format("\033[48;2;{};{};{}m", r, g, b);
+ std::cout << std::format("\033[48;2;{};{};{}m", r, g, b);
}
inline void TerminalColorReset() { std::cout << "\033[0m"; }
// Game buffer printers:
-
-inline void EnterGameBuffer() { std::cout << "\033[?1049h"; }
-
+//
inline void LeaveGameBuffer() { std::cout << "\033[?1049l"; }
+inline void EnterGameBuffer() {
+ std::cout << "\033[?1049h";
+ atexit(LeaveGameBuffer);
+}
+
inline void MoveCursor(int row, int col) {
- std::cout << "\033[" << (row + 1) << ";" << (col + 1) << "H" << std::flush;
+ std::cout << "\033[" << (row + 1) << ";" << (col + 1) << "H" << std::flush;
}
inline void MakeCursorVisible() { std::cout << "\033[?25h"; }
inline void MakeCursorInvisible() {
- std::cout << "\033[?25l";
- atexit(MakeCursorVisible);
+ std::cout << "\033[?25l";
+ atexit(MakeCursorVisible);
}
+inline void ClearTerminal() { std::cout << "\033[H\033[J"; }
+
}; // namespace tgu