Lint: bugs reales + enums uint8_t + use-equals-default
Resuelve la categoría de findings de tidy que son bugs reales o cambios
de tipo concretos, no transforms automáticos:
Bugs reales (bugprone-* y clang-diagnostic-*):
- bugprone-empty-catch en postfx_config.cpp: el catch silencioso del
parser RGB era intencional (fallback a defaults si el array no parsea
como int). Marcado con @INTENTIONAL (keyword ya configurado en
.clang-tidy via bugprone-empty-catch.IgnoreCatchWithKeywords) y
comentario ampliado explicando la decisión.
- clang-diagnostic-unused-private-field en Starfield: el campo
'densitat_' se asignaba en el constructor pero nunca se leía. El
parámetro 'densitat' se reparte directamente en las CapaConfig al
construir, así que el field era código muerto. Eliminado.
- bugprone-branch-clone en vector_text.cpp: el switch de
get_shape_filename tenía dos grupos consecutivos (dígitos 0-9 y
mayúsculas A-Z) con cuerpo idéntico. Fusionados en un único case con
comentario explicando que comparten path porque la shape se llama
igual que el caracter.
- bugprone-switch-missing-default-case en Input::handleEvent: el switch
manejaba solo SDL_EVENT_GAMEPAD_ADDED/REMOVED y caía por fall-through
a un return {} fuera del switch. Añadido default: explícito con
comentario sobre qué hace Input vs el resto del sistema.
- bugprone-implicit-widening-of-multiplication-result en
GameScene::bullets_ y Collision::Context::bullets: 'MAX_BALES * 2'
es int*int y se widening implícitamente a std::size_t para el
template arg de std::array. Cast explícito a size_t en ambos sitios.
Otros mecánicos:
- performance-enum-size: 10 enums sin tipo subyacente pasaron a
': std::uint8_t' (PrimitiveType, InputAction, Mode, SceneType,
Option, AnimationState, TitleState, ModeSpawn, EstatStage,
ShipState). #include <cstdint> añadido donde faltaba.
- modernize-use-equals-default en SpawnController: el ctor por
defecto tenía cuerpo vacío ({}). Pasado a '= default;'.
Cero supresiones. La única "marca" es @INTENTIONAL en el empty-catch,
que es el mecanismo configurado en el .clang-tidy del proyecto para
distinguir intencionales de accidentales.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -40,8 +40,10 @@ void readRgb255(const fkyaml::node& node, const char* key,
|
|||||||
dst_r = static_cast<float>(R) / 255.0F;
|
dst_r = static_cast<float>(R) / 255.0F;
|
||||||
dst_g = static_cast<float>(G) / 255.0F;
|
dst_g = static_cast<float>(G) / 255.0F;
|
||||||
dst_b = static_cast<float>(B) / 255.0F;
|
dst_b = static_cast<float>(B) / 255.0F;
|
||||||
} catch (...) {
|
} catch (...) { // @INTENTIONAL
|
||||||
// Mantiene los defaults si algún elemento no es entero.
|
// Mantiene los defaults si algún elemento del RGB no es entero parseable
|
||||||
|
// (el YAML viene de archivo, así que es razonable degradar a los defaults
|
||||||
|
// en vez de propagar la excepción y abortar el load del postpro entero).
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -3,6 +3,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -11,7 +12,7 @@
|
|||||||
namespace Graphics {
|
namespace Graphics {
|
||||||
|
|
||||||
// Tipo de primitiva dins de una shape
|
// Tipo de primitiva dins de una shape
|
||||||
enum class PrimitiveType {
|
enum class PrimitiveType : std::uint8_t {
|
||||||
POLYLINE, // Secuencia de points connectats
|
POLYLINE, // Secuencia de points connectats
|
||||||
LINE // Línia individual (2 points)
|
LINE // Línia individual (2 points)
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -21,8 +21,7 @@ Starfield::Starfield(Rendering::Renderer* renderer,
|
|||||||
: shape_estrella_(ShapeLoader::load("star.shp")),
|
: shape_estrella_(ShapeLoader::load("star.shp")),
|
||||||
renderer_(renderer),
|
renderer_(renderer),
|
||||||
punt_fuga_(punt_fuga),
|
punt_fuga_(punt_fuga),
|
||||||
area_(area),
|
area_(area) {
|
||||||
densitat_(densitat) {
|
|
||||||
if (!shape_estrella_ || !shape_estrella_->isValid()) {
|
if (!shape_estrella_ || !shape_estrella_->isValid()) {
|
||||||
std::cerr << "ERROR: No s'ha pogut load star.shp" << '\n';
|
std::cerr << "ERROR: No s'ha pogut load star.shp" << '\n';
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -77,7 +77,6 @@ class Starfield {
|
|||||||
Vec2 punt_fuga_; // Vec2 de origin de las estrelles
|
Vec2 punt_fuga_; // Vec2 de origin de las estrelles
|
||||||
SDL_FRect area_; // Àrea activa
|
SDL_FRect area_; // Àrea activa
|
||||||
float radi_max_; // Distancia màxima del centro al límit de pantalla
|
float radi_max_; // Distancia màxima del centro al límit de pantalla
|
||||||
int densitat_; // Nombre total de estrelles
|
|
||||||
float multiplicador_brightness_{1.0F}; // Multiplicador de brightness (1.0 = default)
|
float multiplicador_brightness_{1.0F}; // Multiplicador de brightness (1.0 = default)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -80,7 +80,9 @@ void VectorText::load_charset() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
auto VectorText::get_shape_filename(char c) const -> std::string {
|
auto VectorText::get_shape_filename(char c) const -> std::string {
|
||||||
// Mapeo carácter → nombre de archivo (con prefix "font/")
|
// Mapeo carácter → nombre de archivo (con prefix "font/").
|
||||||
|
// Dígitos 0-9 y mayúsculas A-Z comparten el mismo path: la shape se llama
|
||||||
|
// como el caracter mismo, así que se agrupan en un único case.
|
||||||
switch (c) {
|
switch (c) {
|
||||||
case '0':
|
case '0':
|
||||||
case '1':
|
case '1':
|
||||||
@@ -92,9 +94,6 @@ auto VectorText::get_shape_filename(char c) const -> std::string {
|
|||||||
case '7':
|
case '7':
|
||||||
case '8':
|
case '8':
|
||||||
case '9':
|
case '9':
|
||||||
return std::string("font/char_") + c + ".shp";
|
|
||||||
|
|
||||||
// Lletres majúscules A-Z
|
|
||||||
case 'A':
|
case 'A':
|
||||||
case 'B':
|
case 'B':
|
||||||
case 'C':
|
case 'C':
|
||||||
|
|||||||
@@ -420,8 +420,11 @@ auto Input::handleEvent(const SDL_Event& event) -> std::string {
|
|||||||
return addGamepad(event.gdevice.which);
|
return addGamepad(event.gdevice.which);
|
||||||
case SDL_EVENT_GAMEPAD_REMOVED:
|
case SDL_EVENT_GAMEPAD_REMOVED:
|
||||||
return removeGamepad(event.gdevice.which);
|
return removeGamepad(event.gdevice.which);
|
||||||
|
default:
|
||||||
|
// El resto de eventos SDL no interesan a Input (los maneja el resto
|
||||||
|
// del sistema: ventana, teclado, mouse).
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
return {};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
auto Input::addGamepad(int device_index) -> std::string {
|
auto Input::addGamepad(int device_index) -> std::string {
|
||||||
|
|||||||
@@ -3,11 +3,12 @@
|
|||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
|
|
||||||
// --- Enums ---
|
// --- Enums ---
|
||||||
enum class InputAction : int { // Acciones de entrada posibles en el juego
|
enum class InputAction : std::uint8_t { // Acciones de entrada posibles en el juego
|
||||||
// Inputs de juego (movimiento y acción)
|
// Inputs de juego (movimiento y acción)
|
||||||
LEFT, // Rotar izquierda
|
LEFT, // Rotar izquierda
|
||||||
RIGHT, // Rotar derecha
|
RIGHT, // Rotar derecha
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
namespace GameConfig {
|
namespace GameConfig {
|
||||||
|
|
||||||
// Mode de juego
|
// Mode de juego
|
||||||
enum class Mode {
|
enum class Mode : std::uint8_t {
|
||||||
NORMAL, // Partida normal
|
NORMAL, // Partida normal
|
||||||
DEMO // Mode demostració (futur)
|
DEMO // Mode demostració (futur)
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3,6 +3,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
#include "core/system/game_config.hpp"
|
#include "core/system/game_config.hpp"
|
||||||
|
|
||||||
namespace SceneManager {
|
namespace SceneManager {
|
||||||
@@ -12,7 +14,7 @@ namespace SceneManager {
|
|||||||
class SceneContext {
|
class SceneContext {
|
||||||
public:
|
public:
|
||||||
// Tipo de escena del juego
|
// Tipo de escena del juego
|
||||||
enum class SceneType {
|
enum class SceneType : std::uint8_t {
|
||||||
LOGO, // Pantalla de start (logo JAILGAMES)
|
LOGO, // Pantalla de start (logo JAILGAMES)
|
||||||
TITLE, // Pantalla de título con menú
|
TITLE, // Pantalla de título con menú
|
||||||
GAME, // Juego principal (Asteroids)
|
GAME, // Juego principal (Asteroids)
|
||||||
@@ -20,7 +22,7 @@ class SceneContext {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Opciones específiques para cada escena
|
// Opciones específiques para cada escena
|
||||||
enum class Option {
|
enum class Option : std::uint8_t {
|
||||||
NONE, // Sin opciones especials (comportament per defecte)
|
NONE, // Sin opciones especials (comportament per defecte)
|
||||||
JUMP_TO_TITLE_MAIN, // TITLE: Saltar directament a MAIN (starfield instantani)
|
JUMP_TO_TITLE_MAIN, // TITLE: Saltar directament a MAIN (starfield instantani)
|
||||||
// MODE_DEMO, // GAME: Mode demostració con IA (futur)
|
// MODE_DEMO, // GAME: Mode demostració con IA (futur)
|
||||||
|
|||||||
@@ -61,7 +61,9 @@ class GameScene final : public Scene {
|
|||||||
// Estat del juego
|
// Estat del juego
|
||||||
std::array<Ship, 2> ships_; // [0]=P1, [1]=P2
|
std::array<Ship, 2> ships_; // [0]=P1, [1]=P2
|
||||||
std::array<Enemy, Constants::MAX_ORNIS> enemies_;
|
std::array<Enemy, Constants::MAX_ORNIS> enemies_;
|
||||||
std::array<Bullet, Constants::MAX_BALES * 2> bullets_; // 6 balas: P1=[0,1,2], P2=[3,4,5]
|
// 6 balas: P1=[0,1,2], P2=[3,4,5]. El cast a size_t evita la
|
||||||
|
// widening conversion implícita que detecta clang-tidy.
|
||||||
|
std::array<Bullet, static_cast<std::size_t>(Constants::MAX_BALES) * 2> bullets_;
|
||||||
std::array<float, 2> hit_timer_per_player_; // Death timers per player (seconds)
|
std::array<float, 2> hit_timer_per_player_; // Death timers per player (seconds)
|
||||||
|
|
||||||
// Lives and game over system
|
// Lives and game over system
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ class LogoScene final : public Scene {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// Màquina de estats per l'animación
|
// Màquina de estats per l'animación
|
||||||
enum class AnimationState {
|
enum class AnimationState : std::uint8_t {
|
||||||
PRE_ANIMATION, // Pantalla negra inicial
|
PRE_ANIMATION, // Pantalla negra inicial
|
||||||
ANIMATION, // Animación de zoom de lletres
|
ANIMATION, // Animación de zoom de lletres
|
||||||
POST_ANIMATION, // Logo complet visible
|
POST_ANIMATION, // Logo complet visible
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@@ -39,7 +40,7 @@ class TitleScene final : public Scene {
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
// Màquina de estats per la pantalla de título
|
// Màquina de estats per la pantalla de título
|
||||||
enum class TitleState {
|
enum class TitleState : std::uint8_t {
|
||||||
STARFIELD_FADE_IN, // Fade-in del starfield (3.0s)
|
STARFIELD_FADE_IN, // Fade-in del starfield (3.0s)
|
||||||
STARFIELD, // Pantalla con camp de estrelles (4.0s)
|
STARFIELD, // Pantalla con camp de estrelles (4.0s)
|
||||||
MAIN, // Pantalla de título con text (indefinit, hasta START)
|
MAIN, // Pantalla de título con text (indefinit, hasta START)
|
||||||
|
|||||||
@@ -15,9 +15,7 @@
|
|||||||
|
|
||||||
namespace StageSystem {
|
namespace StageSystem {
|
||||||
|
|
||||||
SpawnController::SpawnController()
|
SpawnController::SpawnController() = default;
|
||||||
|
|
||||||
{}
|
|
||||||
|
|
||||||
void SpawnController::configure(const StageConfig* config) {
|
void SpawnController::configure(const StageConfig* config) {
|
||||||
config_ = config;
|
config_ = config;
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
namespace StageSystem {
|
namespace StageSystem {
|
||||||
|
|
||||||
// Tipo de mode de spawn
|
// Tipo de mode de spawn
|
||||||
enum class ModeSpawn {
|
enum class ModeSpawn : std::uint8_t {
|
||||||
PROGRESSIVE, // Spawn progressiu con intervals
|
PROGRESSIVE, // Spawn progressiu con intervals
|
||||||
IMMEDIATE, // Todos los enemigos de cop
|
IMMEDIATE, // Todos los enemigos de cop
|
||||||
WAVE // Onades de 3-5 enemigos (futura extensió)
|
WAVE // Onades de 3-5 enemigos (futura extensió)
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ namespace Systems::Collision {
|
|||||||
struct Context {
|
struct Context {
|
||||||
std::array<Ship, 2>& ships;
|
std::array<Ship, 2>& ships;
|
||||||
std::array<Enemy, Defaults::Entities::MAX_ORNIS>& enemies;
|
std::array<Enemy, Defaults::Entities::MAX_ORNIS>& enemies;
|
||||||
std::array<Bullet, Defaults::Entities::MAX_BALES * 2>& bullets;
|
std::array<Bullet, static_cast<std::size_t>(Defaults::Entities::MAX_BALES) * 2>& bullets;
|
||||||
std::array<float, 2>& hit_timer_per_player;
|
std::array<float, 2>& hit_timer_per_player;
|
||||||
std::array<int, 2>& score_per_player;
|
std::array<int, 2>& score_per_player;
|
||||||
std::array<int, 2>& lives_per_player;
|
std::array<int, 2>& lives_per_player;
|
||||||
|
|||||||
@@ -8,6 +8,7 @@
|
|||||||
#include <SDL3/SDL.h>
|
#include <SDL3/SDL.h>
|
||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
|
#include <cstdint>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
|
||||||
#include "core/graphics/shape.hpp"
|
#include "core/graphics/shape.hpp"
|
||||||
@@ -16,7 +17,7 @@
|
|||||||
namespace Title {
|
namespace Title {
|
||||||
|
|
||||||
// Estats de l'animación de la ship
|
// Estats de l'animación de la ship
|
||||||
enum class ShipState {
|
enum class ShipState : std::uint8_t {
|
||||||
ENTERING, // Entrant desde fuera de pantalla
|
ENTERING, // Entrant desde fuera de pantalla
|
||||||
FLOATING, // Flotante en posición estàtica
|
FLOATING, // Flotante en posición estàtica
|
||||||
EXITING // Volant hacia el point de fuga
|
EXITING // Volant hacia el point de fuga
|
||||||
|
|||||||
Reference in New Issue
Block a user