feat(input): carrega gamecontrollerdb i corregeix l'ordre d'assignació de mandos
This commit is contained in:
1 parent
4f1a3260a5
commit
c77f90f6b6
5 files changed
+2276
-16
No files matched your search
@@ -14,7 +14,7 @@ endif
|
|||||||
|
|
||||||
CMAKE_DEFS := -DGIT_HASH=$(GIT_HASH)
|
CMAKE_DEFS := -DGIT_HASH=$(GIT_HASH)
|
||||||
|
|
||||||
.PHONY: all debug release run run-debug clean rebuild show-version pack format format-check tidy tidy-fix cppcheck hooks-install help
|
.PHONY: all debug release run run-debug clean rebuild show-version pack controllerdb format format-check tidy tidy-fix cppcheck hooks-install help
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# COMPILACIÓ
|
# COMPILACIÓ
|
||||||
@@ -61,6 +61,14 @@ pack:
|
|||||||
@cmake --build $(BUILDDIR) --target pack_resources
|
@cmake --build $(BUILDDIR) --target pack_resources
|
||||||
@./$(BUILDDIR)/pack_resources data $(BUILDDIR)/resources.pack
|
@./$(BUILDDIR)/pack_resources data $(BUILDDIR)/resources.pack
|
||||||
|
|
||||||
|
# Descàrrega de la base de dades de mappings de mandos. SDL només pot
|
||||||
|
# obrir-la des del filesystem (no del pack), per això viu a data/input/.
|
||||||
|
controllerdb:
|
||||||
|
@echo "Descarregant gamecontrollerdb.txt..."
|
||||||
|
@curl -fsSL https://raw.githubusercontent.com/mdqinc/SDL_GameControllerDB/master/gamecontrollerdb.txt \
|
||||||
|
-o data/input/gamecontrollerdb.txt
|
||||||
|
@echo "data/input/gamecontrollerdb.txt actualitzat"
|
||||||
|
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
# CODE QUALITY (delegados a cmake)
|
# CODE QUALITY (delegados a cmake)
|
||||||
# ==============================================================================
|
# ==============================================================================
|
||||||
@@ -110,6 +118,7 @@ help:
|
|||||||
@echo ""
|
@echo ""
|
||||||
@echo " Recursos:"
|
@echo " Recursos:"
|
||||||
@echo " make pack - Empaquetar data/ a $(BUILDDIR)/resources.pack (format AE26)"
|
@echo " make pack - Empaquetar data/ a $(BUILDDIR)/resources.pack (format AE26)"
|
||||||
|
@echo " make controllerdb - Descarregar data/input/gamecontrollerdb.txt actualitzat"
|
||||||
@echo ""
|
@echo ""
|
||||||
@echo " Qualitat de codi:"
|
@echo " Qualitat de codi:"
|
||||||
@echo " make format - Formatar codi amb clang-format"
|
@echo " make format - Formatar codi amb clang-format"
|
||||||
|
|||||||
File diff suppressed because it is too large.
Load diff
@@ -150,10 +150,15 @@ void GamepadManager::init() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// `gamecontrollerdb.txt` és opcional. Si no existeix, SDL retorna -1 i
|
// `gamecontrollerdb.txt` és opcional. Si no existeix, SDL retorna -1 i
|
||||||
// continuem amb les definicions internes del sistema.
|
// continuem amb les definicions internes del sistema. Sempre informem
|
||||||
const int ADDED = SDL_AddGamepadMappingsFromFile("data/input/gamecontrollerdb.txt");
|
// del resultat per facilitar el diagnòstic de mandos no reconeguts.
|
||||||
if (ADDED > 0) {
|
static constexpr const char* DB_PATH = "data/input/gamecontrollerdb.txt";
|
||||||
std::cout << "GamepadManager: " << ADDED << " mappings de gamecontrollerdb.txt\n";
|
const int ADDED = SDL_AddGamepadMappingsFromFile(DB_PATH);
|
||||||
|
if (ADDED < 0) {
|
||||||
|
std::cout << "GamepadManager: no s'ha pogut carregar " << DB_PATH
|
||||||
|
<< ": " << SDL_GetError() << '\n';
|
||||||
|
} else {
|
||||||
|
std::cout << "GamepadManager: " << ADDED << " mappings carregats de " << DB_PATH << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
int count = 0;
|
int count = 0;
|
||||||
@@ -164,6 +169,7 @@ void GamepadManager::init() {
|
|||||||
}
|
}
|
||||||
SDL_free(ids);
|
SDL_free(ids);
|
||||||
}
|
}
|
||||||
|
std::cout << "GamepadManager: " << entries_.size() << " mando(s) detectat(s) a l'inici\n";
|
||||||
initialized_ = true;
|
initialized_ = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -262,6 +268,15 @@ void GamepadManager::assignToPlayer(int player_id, const std::string& name, cons
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Traç de l'assignació persistida (vinculada o pendent) perquè quede
|
||||||
|
// visible a la consola igual que les autoassignacions.
|
||||||
|
if (a.pad != nullptr) {
|
||||||
|
std::cout << "GamepadManager: assignat " << a.name
|
||||||
|
<< " → P" << (player_id + 1) << '\n';
|
||||||
|
} else {
|
||||||
|
std::cout << "GamepadManager: P" << (player_id + 1) << " pendent ("
|
||||||
|
<< (a.name.empty() ? a.path : a.name) << " no connectat)\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GamepadManager::unassignFromPlayer(int player_id) {
|
void GamepadManager::unassignFromPlayer(int player_id) {
|
||||||
|
|||||||
@@ -65,6 +65,16 @@ Director::Director() {
|
|||||||
// Prepara la carpeta de sistema (~/.config/jailgames/aee_2026/) i carrega
|
// Prepara la carpeta de sistema (~/.config/jailgames/aee_2026/) i carrega
|
||||||
// les opcions; si no existeix config.yaml el crea amb els defaults.
|
// les opcions; si no existeix config.yaml el crea amb els defaults.
|
||||||
createSystemFolder();
|
createSystemFolder();
|
||||||
|
|
||||||
|
// Gamepad: descobreix mandos presents silenciosament. Cal fer-ho ABANS
|
||||||
|
// de `Options::loadFromFile`, ja que aquesta crida internament a
|
||||||
|
// `applyControlsToGamepadManager` (rebind d'assignacions persistides +
|
||||||
|
// auto-assign de slots buits) i necessita que `entries_` ja estiga
|
||||||
|
// poblat per a poder casar mandos↔jugadors. A partir d'ara els events
|
||||||
|
// SDL_EVENT_GAMEPAD_ADDED/REMOVED arribaran via `processGamepadEvents()`
|
||||||
|
// i dispararan notificacions.
|
||||||
|
GamepadManager::get().init();
|
||||||
|
|
||||||
Options::setConfigFile(system_folder_ + "config.yaml");
|
Options::setConfigFile(system_folder_ + "config.yaml");
|
||||||
if (!Options::loadFromFile()) {
|
if (!Options::loadFromFile()) {
|
||||||
std::cerr << "Director: no s'ha pogut carregar ni desar config.yaml a " << system_folder_ << '\n';
|
std::cerr << "Director: no s'ha pogut carregar ni desar config.yaml a " << system_folder_ << '\n';
|
||||||
@@ -121,11 +131,6 @@ Director::Director() {
|
|||||||
// JA_Music_t que continga, així que no queden streams orfes.
|
// JA_Music_t que continga, així que no queden streams orfes.
|
||||||
Audio::init(Options::buildAudioConfig());
|
Audio::init(Options::buildAudioConfig());
|
||||||
|
|
||||||
// Gamepad: descobreix mandos presents silenciosament. A partir d'ara
|
|
||||||
// els events SDL_EVENT_GAMEPAD_ADDED/REMOVED arribaran via
|
|
||||||
// `processGamepadEvents()` i dispararan notificacions.
|
|
||||||
GamepadManager::get().init();
|
|
||||||
|
|
||||||
// Font compartida pels overlays: construïm una sola instància de Text
|
// Font compartida pels overlays: construïm una sola instància de Text
|
||||||
// i la injectem als consumidors (Notifier, RenderInfo) per a que cap
|
// i la injectem als consumidors (Notifier, RenderInfo) per a que cap
|
||||||
// d'ells hagi de conèixer els noms dels recursos concrets.
|
// d'ells hagi de conèixer els noms dels recursos concrets.
|
||||||
|
|||||||
@@ -176,12 +176,11 @@ namespace {
|
|||||||
parseGamepadAssignment(node, "gamepad_p2", g_controls.gamepad_p2);
|
parseGamepadAssignment(node, "gamepad_p2", g_controls.gamepad_p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Aplica les assignacions persistides al GamepadManager. Cridat
|
// Aplica les assignacions persistides al GamepadManager. Ordre garantit
|
||||||
// després de `loadFromFile` perquè l'ordre és: GamepadManager::init
|
// pel Director: GamepadManager::init (obre tots els mandos físics) →
|
||||||
// (obre tots els mandos físics) → Options::loadFromFile (llig YAML)
|
// Options::loadFromFile (llig YAML) → aquesta funció (casa
|
||||||
// → aquesta funció (casa mandos↔jugadors) → auto-assign per ordre
|
// mandos↔jugadors) → auto-assign per ordre els slots que hagen quedat
|
||||||
// els slots que hagen quedat buits (equivalent al patró de
|
// buits (equivalent al patró de `coffee_crisis_arcade_edition`).
|
||||||
// `coffee_crisis_arcade_edition`).
|
|
||||||
void applyControlsToGamepadManager() {
|
void applyControlsToGamepadManager() {
|
||||||
auto& gm = GamepadManager::get();
|
auto& gm = GamepadManager::get();
|
||||||
gm.assignToPlayer(0, g_controls.gamepad_p1.name, g_controls.gamepad_p1.path);
|
gm.assignToPlayer(0, g_controls.gamepad_p1.name, g_controls.gamepad_p1.path);
|
||||||
|
|||||||
Reference in new issue
Block a user