Skip to content

Nintendo Switch port (using AI Claude) (wersja po poprawkach i uwagach) - #15

Open
szczuru wants to merge 23 commits into
mszula:masterfrom
szczuru:port-switch
Open

Nintendo Switch port (using AI Claude) (wersja po poprawkach i uwagach)#15
szczuru wants to merge 23 commits into
mszula:masterfrom
szczuru:port-switch

Conversation

@szczuru

@szczuru szczuru commented Jul 1, 2026

Copy link
Copy Markdown

Cześć, podejście nr 2 :) Wszystkie porty się kompilują bez błędów, zmiany w wersji na switcha podobne do tych ostatnio z pewnymi różnicami:

  • -Brak detekcji pada nintendo, na stałe zmienione mapowanie AB->BA bo SDL mapuje przyciski jak na Xboxie. W osobnym pliku gamepad_switch.c
  • -obsługa dotyku (zmiana trybu przyciskiem minus - relative/touchpad/off)
  • -zmiana aspect ratio - przyciskiem X (Y w SDL)
  • -tak jak ostatnio można kompilować bez sekretu wacki EXE jeśli wrzuci się ten plik razem z danymi ale tym razem jeśli jest sekret to skompiluje się na wzór innych portów.

Poniżej opis, o który poprosiłem Calude, tak by spiął wszystkie zmiany:

Filozofia tej iteracji

Po Twojej uwadze o "puchnięciu" gamepad_sdl.c przeprojektowałem podejście: Switch ma teraz własny plik wejścia (gamepad_switch.c) zamiast modyfikować współdzielony gamepad_sdl.c. Dzięki temu gamepad_sdl.c w ogóle nie jest dotykany w tym PR — żadnego ryzyka regresji na PortMaster/PS2 w warstwie inputu.

** Pliki zastępujące istniejące (4 pliki)**

src/config.c
Dodaje dwie nowe zmienne globalne: g_aspect_mode ("stretch"/"4:3") i g_touch_mode ("absolute"/"relative"/"off"), persystowane w wacki.cfg jako nowe klucze. Celowo zdefiniowane właśnie tutaj (nie w video_sdl.c/platform_sdl.c), żeby były dostępne dla każdego targetu przez linkowanie config.c — w tym PS2, który nie linkuje plików SDL-family. To naprawia undefined reference na PS2, które wystąpiło w poprzedniej wersji tego PR. Dodatkowo: wacki.cfg jest teraz tworzony automatycznie przy pierwszym uruchomieniu na każdej platformie (wcześniej robił to tylko desktopowy first-run picker; handheld targets nigdy go nie pokazują, więc plik nigdy nie powstawał).

src/platform/sdl/video_sdl.c
Dodaje obsługę g_aspect_mode. W trybie "4:3" SDL_RenderSetLogicalSize dostaje 640×480 i SDL automatycznie letterboxuje (czarne pasy) na ekranach nie-4:3. W trybie "stretch" (domyślny, zachowuje dotychczasowe zachowanie) SDL_RenderSetLogicalSize jest wyłączane (0,0), a tekstura renderowana jest explicit SDL_Rect na cały rozmiar okna — SDL nigdy nie rozciąga nieproporcjonalnie przez RenderSetLogicalSize (zawsze zachowuje AR, zgodnie z dokumentacją), więc to jedyny sposób na edge-to-edge fill. Nowa funkcja platform_video_get_present_state() eksponuje aktualny stan skalowania dla platform_sdl.c, żeby współrzędne myszy/dotyku mogły być poprawnie przeliczone w trybie stretch.

src/platform/sdl/platform_sdl.c
Dodaje obsługę g_touch_mode i SDL_FINGER* events. "absolute" to czyste wykorzystanie wbudowanego SDL_HINT_TOUCH_MOUSE_EVENTS (tap=klik), z dodanym gestem two-finger-tap = RMB (toggle aktora). "relative" zamienia cały panel w touchpad — delta między próbkami tego samego palca przesuwa kursor, nigdy nie generuje kliknięcia (zaprojektowane z myślą o przyszłych portach z ekranem dotykowym, np. PS Vita). Cały blok dotyku jest pod #ifndef ANDROID, bo Android ma już własny mechanizm (android_touch.h) — nic z tego nie wchodzi w kolizję z istniejącym kodem. Dodatkowo: skalowanie współrzędnych myszy w handle_mouse_motion pod #elif defined(WACKI_SWITCH) — potrzebne tylko gdy stretch mode wyłącza logical-size scaling. Dodatkowo PS2 linkował nasz zmodyfikowany platform_sdl.c (który wywołuje platform_video_toggle_aspect_mode() przy klawiszu F10), ale nie linkuje video_sdl.c (ma własny video_ps2.c), więc symbol jest niezdefiniowany, więc obudowano wywołania w platform_sdl.c guardem #ifndef WACKI_PS2 — PS2 nie ma klawiatury, więc F10 tam nigdy nie trafi.

src/platform/sdl/system_sdl.c
Dodaje blok #ifdef SWITCH analogiczny do istniejącego #ifdef ANDROID: mkdir + chdir do sdmc:/switch/wacki/ przed ConfigLoad(). Uzasadnienie: hbmenu/nx-hbloader nie gwarantuje spójnego cwd między uruchomieniami (w przeciwieństwie do desktopa czy handheldów z launcher scriptem, który robi cd do folderu ROM-u przed exec). Bez tego Wacki.sav i wacki.cfg (otwierane relatywną ścieżką) lądowały w różnych miejscach po każdym restarcie — testowane na sprzęcie, zapis "znikał" po wyłączeniu konsoli, dopóki tego nie dodałem.

src/platform/sdl/sdl_internal.h
Trzy nowe deklaracje: platform_video_toggle_aspect_mode(), platform_video_get_present_state(), platform_touch_cycle_mode() — łączą video_sdl.c/platform_sdl.c z gamepad_switch.c (i potencjalnie przyszłymi gamepad_*.c innych targetów).

Patch do głównego Makefile (jedna linia)

.DEFAULT_GOAL := all na samej górze pliku. Bez tego make TARGET= wywołane bez explicit celu buduje tylko pusty katalog dist/ i kończy z kodem 0 — bo $(DIST): jest zdefiniowane przed all:, a GNU Make domyślnie bierze pierwszy zdefiniowany target. Złapałem to empirycznie przy testowaniu CI (build "przechodził" bez błędu, ale .nro nigdy nie powstawał).

Nowe pliki (zero wpływu na istniejące platformy)

src/platform/switch/ — switch.c (hooks provider), gamepad_switch.c (Joy-Con/Pro Controller, z komentarzem wyjaśniającym dlaczego fizyczne A/B/X/Y są "zamienione" względem stałych SDL — Nintendo ma lustrzany układ liter względem konwencji Xbox, na której bazuje nazewnictwo SDL)

storage_switch.c (zapis z fsdevCommitDevice, bez którego libnx gubi dane po power-off)

data_root_switch.c, embedded_wacki_pe_stub.c (pusty stub gdy WACKI.EXE nie jest embedowane).

mk/switch.mk, tools/build-switch.sh, .github/workflows/switch.yml — workflow opcjonalnie pobiera WACKI.EXE z sekretu WACKI_EXE_URL (ten sam mechanizm co reszta repo) i wbudowuje statycznie; bez sekretu używa pustego stuba, a gra ładuje WACKI.EXE gracza z karty SD w runtime przez PeLoaderInit() (PeLoaderRead już sprawdza dynamicznie załadowany obraz przed tabelą embedded, więc to nie wymaga zmian w pe_loader.c).

assets/icons/wacki-switch.jpg - ikona gry w pliku nro - jpg 256x256px

szczuru added 23 commits July 1, 2026 19:16
Add Makefile for Nintendo Switch homebrew development with devkitA64 and SDL2.
Updated comments and added new configuration keys for aspect and touch modes.
Updated SDL platform layer to support touch modes and improve event handling.
Added new functions for video and touch mode handling.
Add support for Switch platform to manage working directory.
Added support for aspect ratio modes in SDL video output, allowing for 'stretch' and '4:3' modes. Updated related functions to handle aspect mode toggling and rendering adjustments.
Implement functions to probe SD-card data roots for the Switch platform.
Add empty PE slice table for WACKI.EXE fallback.
Implement Joy-Con / Pro Controller input handling for Nintendo Switch, including button mappings and event handling.
Implement save-image storage HAL for Switch platform, including functions for reading and writing save data with atomic replacement.
Implement Nintendo Switch homebrew platform hooks including loading WACKI.EXE and applying video preferences.
This script sets up the environment and runs a Docker container to cross-compile for the Switch platform using devkitpro/devkita64.
Added support for F10 and F8 key functionalities in SDL platform.
Updated comments to clarify touch screen mode and event handling for SDL2, including enhancements for the Switch platform.
Fix missing newline at the end of the file.
Updated NACP creation command to include a new author path and version (commit# added)..
Remove version retrieval from git for WACKI_VERSION.
@szczuru

szczuru commented Jul 7, 2026

Copy link
Copy Markdown
Author

Cześć, nadgoniłem ostatnie Twoje commity, wszystko się kompiluje. Dodałem przekazywanie WACKI_VERSION do pliku nro (wynikowy plik dla Switcha), jako "autor" zmieniłem na mszula/szczuru/AI.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant