pasaeta loca de clang-format (despres m'arrepentiré pero bueno)
This commit is contained in:
258
source/utils.h
258
source/utils.h
@@ -1,187 +1,169 @@
|
||||
#pragma once
|
||||
|
||||
#include <SDL3/SDL.h> // Para Uint8, SDL_FRect, SDL_FPoint, SDL_Renderer
|
||||
#include <stdint.h> // Para int32_t
|
||||
#include <SDL3/SDL.h> // Para Uint8, SDL_FRect, SDL_FPoint, SDL_Renderer
|
||||
#include <stdint.h> // Para int32_t
|
||||
|
||||
#include <algorithm> // Para max, min
|
||||
#include <array> // Para array
|
||||
#include <cctype> // Para isxdigit
|
||||
#include <cstdlib> // Para abs, size_t
|
||||
#include <array> // Para array
|
||||
#include <cctype> // Para isxdigit
|
||||
#include <cstdlib> // Para abs, size_t
|
||||
#include <stdexcept> // Para invalid_argument
|
||||
#include <string> // Para string, basic_string, stoi
|
||||
#include <vector> // Para vector
|
||||
#include <string> // Para string, basic_string, stoi
|
||||
#include <vector> // Para vector
|
||||
|
||||
// --- Constantes ---
|
||||
constexpr int BLOCK = 8;
|
||||
constexpr int TOTAL_DEMO_DATA = 2000;
|
||||
constexpr size_t COLOR_CYCLE_SIZE = 6; // Mitad del ciclo espejado
|
||||
constexpr size_t COLOR_CYCLE_SIZE = 6; // Mitad del ciclo espejado
|
||||
|
||||
// --- Estructuras y tipos ---
|
||||
struct Overrides
|
||||
{
|
||||
std::string param_file; // Fichero de parametros a utilizar
|
||||
bool clear_hi_score_table; // Reinicia la tabla de records
|
||||
struct Overrides {
|
||||
std::string param_file; // Fichero de parametros a utilizar
|
||||
bool clear_hi_score_table; // Reinicia la tabla de records
|
||||
|
||||
Overrides()
|
||||
: param_file(""), clear_hi_score_table(false) {}
|
||||
Overrides()
|
||||
: param_file(""), clear_hi_score_table(false) {}
|
||||
};
|
||||
extern Overrides overrides;
|
||||
|
||||
// Estructura para definir un circulo
|
||||
struct Circle
|
||||
{
|
||||
int x, y, r;
|
||||
Circle() : x(0), y(0), r(0) {}
|
||||
Circle(int xCoord, int yCoord, int radius)
|
||||
: x(xCoord), y(yCoord), r(radius) {}
|
||||
struct Circle {
|
||||
int x, y, r;
|
||||
Circle() : x(0), y(0), r(0) {}
|
||||
Circle(int xCoord, int yCoord, int radius)
|
||||
: x(xCoord), y(yCoord), r(radius) {}
|
||||
};
|
||||
|
||||
// Estructura para definir un color RGBA
|
||||
struct Color
|
||||
{
|
||||
Uint8 r, g, b, a;
|
||||
constexpr Color() : r(0), g(0), b(0), a(255) {}
|
||||
explicit constexpr Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha = 255) : r(red), g(green), b(blue), a(alpha) {}
|
||||
struct Color {
|
||||
Uint8 r, g, b, a;
|
||||
constexpr Color() : r(0), g(0), b(0), a(255) {}
|
||||
explicit constexpr Color(Uint8 red, Uint8 green, Uint8 blue, Uint8 alpha = 255) : r(red), g(green), b(blue), a(alpha) {}
|
||||
|
||||
constexpr Color inverse() const { return Color(255 - r, 255 - g, 255 - b, a); }
|
||||
constexpr Color lighten(int amount = 50) const
|
||||
{
|
||||
return Color(
|
||||
std::min(255, r + amount),
|
||||
std::min(255, g + amount),
|
||||
std::min(255, b + amount),
|
||||
a);
|
||||
}
|
||||
constexpr Color darken(int amount = 50) const
|
||||
{
|
||||
return Color(
|
||||
std::max(0, r - amount),
|
||||
std::max(0, g - amount),
|
||||
std::max(0, b - amount),
|
||||
a);
|
||||
}
|
||||
constexpr Color inverse() const { return Color(255 - r, 255 - g, 255 - b, a); }
|
||||
constexpr Color lighten(int amount = 50) const {
|
||||
return Color(
|
||||
std::min(255, r + amount),
|
||||
std::min(255, g + amount),
|
||||
std::min(255, b + amount),
|
||||
a);
|
||||
}
|
||||
constexpr Color darken(int amount = 50) const {
|
||||
return Color(
|
||||
std::max(0, r - amount),
|
||||
std::max(0, g - amount),
|
||||
std::max(0, b - amount),
|
||||
a);
|
||||
}
|
||||
|
||||
// Método estático para crear Color desde string hexadecimal
|
||||
static Color fromHex(const std::string &hexStr)
|
||||
{
|
||||
std::string hex = hexStr;
|
||||
// Método estático para crear Color desde string hexadecimal
|
||||
static Color fromHex(const std::string &hexStr) {
|
||||
std::string hex = hexStr;
|
||||
|
||||
// Quitar '#' si existe
|
||||
if (!hex.empty() && hex[0] == '#')
|
||||
{
|
||||
hex = hex.substr(1);
|
||||
}
|
||||
// Quitar '#' si existe
|
||||
if (!hex.empty() && hex[0] == '#') {
|
||||
hex = hex.substr(1);
|
||||
}
|
||||
|
||||
// Verificar longitud válida (6 para RGB o 8 para RGBA)
|
||||
if (hex.length() != 6 && hex.length() != 8)
|
||||
{
|
||||
throw std::invalid_argument("String hexadecimal debe tener 6 o 8 caracteres");
|
||||
}
|
||||
// Verificar longitud válida (6 para RGB o 8 para RGBA)
|
||||
if (hex.length() != 6 && hex.length() != 8) {
|
||||
throw std::invalid_argument("String hexadecimal debe tener 6 o 8 caracteres");
|
||||
}
|
||||
|
||||
// Verificar que todos los caracteres sean hexadecimales válidos
|
||||
for (char c : hex)
|
||||
{
|
||||
if (!std::isxdigit(c))
|
||||
{
|
||||
throw std::invalid_argument("String contiene caracteres no hexadecimales");
|
||||
}
|
||||
}
|
||||
// Verificar que todos los caracteres sean hexadecimales válidos
|
||||
for (char c : hex) {
|
||||
if (!std::isxdigit(c)) {
|
||||
throw std::invalid_argument("String contiene caracteres no hexadecimales");
|
||||
}
|
||||
}
|
||||
|
||||
// Convertir cada par de caracteres a valores RGB(A)
|
||||
Uint8 r = static_cast<Uint8>(std::stoi(hex.substr(0, 2), nullptr, 16));
|
||||
Uint8 g = static_cast<Uint8>(std::stoi(hex.substr(2, 2), nullptr, 16));
|
||||
Uint8 b = static_cast<Uint8>(std::stoi(hex.substr(4, 2), nullptr, 16));
|
||||
Uint8 a = 255; // Alpha por defecto
|
||||
// Convertir cada par de caracteres a valores RGB(A)
|
||||
Uint8 r = static_cast<Uint8>(std::stoi(hex.substr(0, 2), nullptr, 16));
|
||||
Uint8 g = static_cast<Uint8>(std::stoi(hex.substr(2, 2), nullptr, 16));
|
||||
Uint8 b = static_cast<Uint8>(std::stoi(hex.substr(4, 2), nullptr, 16));
|
||||
Uint8 a = 255; // Alpha por defecto
|
||||
|
||||
// Si tiene 8 caracteres, extraer el alpha
|
||||
if (hex.length() == 8)
|
||||
{
|
||||
a = static_cast<Uint8>(std::stoi(hex.substr(6, 2), nullptr, 16));
|
||||
}
|
||||
// Si tiene 8 caracteres, extraer el alpha
|
||||
if (hex.length() == 8) {
|
||||
a = static_cast<Uint8>(std::stoi(hex.substr(6, 2), nullptr, 16));
|
||||
}
|
||||
|
||||
return Color(r, g, b, a);
|
||||
}
|
||||
return Color(r, g, b, a);
|
||||
}
|
||||
|
||||
constexpr bool isEqualTo(const Color &other) const
|
||||
{
|
||||
return r == other.r && g == other.g && b == other.b && a == other.a;
|
||||
}
|
||||
constexpr bool isEqualTo(const Color &other) const {
|
||||
return r == other.r && g == other.g && b == other.b && a == other.a;
|
||||
}
|
||||
|
||||
constexpr Color approachTo(const Color &target, int step = 1) const
|
||||
{
|
||||
Uint8 newR = (std::abs(r - target.r) <= step) ? target.r : (r < target.r ? r + step : r - step);
|
||||
Uint8 newG = (std::abs(g - target.g) <= step) ? target.g : (g < target.g ? g + step : g - step);
|
||||
Uint8 newB = (std::abs(b - target.b) <= step) ? target.b : (b < target.b ? b + step : b - step);
|
||||
Uint8 newA = (std::abs(a - target.a) <= step) ? target.a : (a < target.a ? a + step : a - step);
|
||||
constexpr Color approachTo(const Color &target, int step = 1) const {
|
||||
Uint8 newR = (std::abs(r - target.r) <= step) ? target.r : (r < target.r ? r + step : r - step);
|
||||
Uint8 newG = (std::abs(g - target.g) <= step) ? target.g : (g < target.g ? g + step : g - step);
|
||||
Uint8 newB = (std::abs(b - target.b) <= step) ? target.b : (b < target.b ? b + step : b - step);
|
||||
Uint8 newA = (std::abs(a - target.a) <= step) ? target.a : (a < target.a ? a + step : a - step);
|
||||
|
||||
return Color(newR, newG, newB, newA);
|
||||
}
|
||||
return Color(newR, newG, newB, newA);
|
||||
}
|
||||
};
|
||||
|
||||
// Estructura para definir un color HSV
|
||||
struct HSV
|
||||
{
|
||||
float h, s, v;
|
||||
struct HSV {
|
||||
float h, s, v;
|
||||
};
|
||||
|
||||
// Estructura para definir el ciclo de color
|
||||
enum class ColorCycleStyle
|
||||
{
|
||||
SubtlePulse, // Variación leve en brillo (por defecto)
|
||||
HueWave, // Variación suave en tono (sin verde)
|
||||
Vibrant, // Cambios agresivos en tono y brillo
|
||||
DarkenGlow, // Oscurece hacia el centro y regresa
|
||||
LightFlash // Ilumina hacia el centro y regresa
|
||||
enum class ColorCycleStyle {
|
||||
SubtlePulse, // Variación leve en brillo (por defecto)
|
||||
HueWave, // Variación suave en tono (sin verde)
|
||||
Vibrant, // Cambios agresivos en tono y brillo
|
||||
DarkenGlow, // Oscurece hacia el centro y regresa
|
||||
LightFlash // Ilumina hacia el centro y regresa
|
||||
};
|
||||
|
||||
// Posiciones de las notificaciones
|
||||
enum class NotifyPosition
|
||||
{
|
||||
TOP,
|
||||
BOTTOM,
|
||||
LEFT,
|
||||
MIDDLE,
|
||||
RIGHT,
|
||||
enum class NotifyPosition {
|
||||
TOP,
|
||||
BOTTOM,
|
||||
LEFT,
|
||||
MIDDLE,
|
||||
RIGHT,
|
||||
};
|
||||
|
||||
// Estructura para datos de la demo
|
||||
struct DemoKeys
|
||||
{
|
||||
Uint8 left;
|
||||
Uint8 right;
|
||||
Uint8 no_input;
|
||||
Uint8 fire;
|
||||
Uint8 fire_left;
|
||||
Uint8 fire_right;
|
||||
struct DemoKeys {
|
||||
Uint8 left;
|
||||
Uint8 right;
|
||||
Uint8 no_input;
|
||||
Uint8 fire;
|
||||
Uint8 fire_left;
|
||||
Uint8 fire_right;
|
||||
|
||||
explicit DemoKeys(Uint8 l = 0, Uint8 r = 0, Uint8 ni = 0, Uint8 f = 0, Uint8 fl = 0, Uint8 fr = 0)
|
||||
: left(l), right(r), no_input(ni), fire(f), fire_left(fl), fire_right(fr) {}
|
||||
explicit DemoKeys(Uint8 l = 0, Uint8 r = 0, Uint8 ni = 0, Uint8 f = 0, Uint8 fl = 0, Uint8 fr = 0)
|
||||
: left(l), right(r), no_input(ni), fire(f), fire_left(fl), fire_right(fr) {}
|
||||
};
|
||||
|
||||
using DemoData = std::vector<DemoKeys>;
|
||||
|
||||
struct Demo
|
||||
{
|
||||
bool enabled; // Indica si está activo el modo demo
|
||||
bool recording; // Indica si está activado el modo para grabar la demo
|
||||
int counter; // Contador para el modo demo
|
||||
DemoKeys keys; // Variable con las pulsaciones de teclas del modo demo
|
||||
std::vector<DemoData> data; // Vector con diferentes sets de datos con los movimientos para la demo
|
||||
struct Demo {
|
||||
bool enabled; // Indica si está activo el modo demo
|
||||
bool recording; // Indica si está activado el modo para grabar la demo
|
||||
int counter; // Contador para el modo demo
|
||||
DemoKeys keys; // Variable con las pulsaciones de teclas del modo demo
|
||||
std::vector<DemoData> data; // Vector con diferentes sets de datos con los movimientos para la demo
|
||||
|
||||
Demo() : enabled(false), recording(false), counter(0), keys(), data() {}
|
||||
Demo(bool e, bool r, int c, const DemoKeys &k, const std::vector<DemoData> &d)
|
||||
: enabled(e), recording(r), counter(c), keys(k), data(d) {}
|
||||
Demo() : enabled(false), recording(false), counter(0), keys(), data() {}
|
||||
Demo(bool e, bool r, int c, const DemoKeys &k, const std::vector<DemoData> &d)
|
||||
: enabled(e), recording(r), counter(c), keys(k), data(d) {}
|
||||
};
|
||||
|
||||
// Posiciones dentro de un rectangulo
|
||||
struct Zone
|
||||
{
|
||||
SDL_FRect rect; // Rectangulo que define la zona
|
||||
float center_x; // Anclaje al 50% del eje X
|
||||
float first_quarter_x; // Anclaje al 25% del eje X
|
||||
float third_quarter_x; // Anclaje al 75% del eje X
|
||||
float center_y; // Anclaje al 50% del eje Y
|
||||
float first_quarter_y; // Anclaje al 25% del eje Y
|
||||
float third_quarter_y; // Anclaje al 75% del eje Y
|
||||
struct Zone {
|
||||
SDL_FRect rect; // Rectangulo que define la zona
|
||||
float center_x; // Anclaje al 50% del eje X
|
||||
float first_quarter_x; // Anclaje al 25% del eje X
|
||||
float third_quarter_x; // Anclaje al 75% del eje X
|
||||
float center_y; // Anclaje al 50% del eje Y
|
||||
float first_quarter_y; // Anclaje al 25% del eje Y
|
||||
float third_quarter_y; // Anclaje al 75% del eje Y
|
||||
};
|
||||
|
||||
// --- Alias ---
|
||||
@@ -241,8 +223,8 @@ double easeOutElastic(double t);
|
||||
double easeInElastic(double t);
|
||||
|
||||
// Utilidades varias
|
||||
bool stringInVector(const std::vector<std::string> &vec, const std::string &str); // Comprueba si un vector contiene una cadena
|
||||
void printWithDots(const std::string &text1, const std::string &text2, const std::string &text3); // Imprime una línea con puntos
|
||||
bool stringInVector(const std::vector<std::string> &vec, const std::string &str); // Comprueba si un vector contiene una cadena
|
||||
void printWithDots(const std::string &text1, const std::string &text2, const std::string &text3); // Imprime una línea con puntos
|
||||
|
||||
// Demo
|
||||
DemoData loadDemoDataFromFile(const std::string &file_path);
|
||||
@@ -252,5 +234,5 @@ bool saveDemoFile(const std::string &file_path, const DemoData &dd);
|
||||
#endif
|
||||
|
||||
// Ficheros y rutas
|
||||
std::string getFileName(const std::string &path); // Obtiene el nombre de un fichero a partir de una ruta
|
||||
std::string getPath(const std::string &full_path); // Obtiene la ruta eliminando el nombre del fichero
|
||||
std::string getFileName(const std::string &path); // Obtiene el nombre de un fichero a partir de una ruta
|
||||
std::string getPath(const std::string &full_path); // Obtiene la ruta eliminando el nombre del fichero
|
||||
Reference in New Issue
Block a user