Zhakuj sobie Pasjansa
Drogi czytelniku, jeśli szukasz porad jak spreparować najlepszego pośród Windowsowych Pasjansów tak aby działał na Windows 10, chcesz dodać do menu opcje schowane dotychczas w tzw. „głębokim ukryciu” lub nawet podmienić kilka bitmap – to lepiej trafić nie mogłeś.
Poradnik opiera się na wersji Pasjansa, którego można znaleźć w każdym 64 bitowym Windows 7 Home Premium z SP1. Podejrzewam, że jest taki sam we wszystkich dystrybucjach tego systemu, ale na wszelki wypadek precyzuję na czym pracowałem. Zakładam też, że użytkownik ma niezbędne uprawnienia administratora i potrafi posługiwać się managerem plików. ;)
Pasjans (i nie tylko) pół przenośny
Wszystkie gry Microsoftu znajdują się w "C:\Program Files\Microsoft Games\" w swoich katalogach. Skopiuj więc cały folder na np. pulpit (skróty, ikony i zbędne pakiety językowe możesz bez obaw wyrzucić). Wszystkie karcianki używają dodatkowej biblioteki, którą znajdziesz w "C:\Windows\System32\CardGames.dll". Wrzuć ją do każdego folderu z grą karcianą (ponieważ każdy program poszukuje DLL‑ek także w "%APPDIR%").
Aby gry dały się uruchomić poza swoim matczynym środowiskiem trzeba zmienić w każdym głównym pliku wykonywalnym dwa bajty (w zasadzie to wystarczy nawet tylko jeden, pierwszy z dalej wymienionych). Nie mam pojęcia za co odpowiadają (disassemblerka nie jest moją mocną stroną), ale tak zrobiła ekipa Winaero, więc prawdopodobnie oba coś tam NOP‑ują (zła się w dwóch bajtach przemycić nie da, więc tematu nie drążyłem). ;)
Otwórz więc plik wykonywalny "Solitaire.exe" za pomocą dowolnego edytora heksadecymalnego (wystarczy np. darmowy HxD) i zamień wartości: 3BC60F4CCE3BCD0F na 39C00F4CCE3BCD0F.
Ze wszystkimi grami postępuje się tak samo. Niżej znajdziesz zestawienie z wartościami jakie wyszukać i na jakie zamienić dla wszystkich gier (są tak długie aby wykluczyć pomyłki).
- wszystkie gry karciane: 3BC60F4CCE3BCD0F, zamień na 39C00F4CCE3BCD0F
- Saper i Mahjong: 3BC70F4CCF3BCE0F, zamień na 39C00F4CCF3BCE0F
- Szachy: 3BC60F4CD68BCE41, zamień na 39C00F4CD68BCE41
Do pełni szczęścia pozostaje jeszcze tylko jedna biblioteka DLL, ale tym razem nie wyjęta z trzewi systemu, a samodzielnie spreparowana (na Windows 7 niepotrzebna, na XP nie sprawdzałem). Plik "slc.dll" należy wrzucić do wszystkich katalogów z grami – NIE zastępuj go obecnymi w "C:\Windows\System32" i "SysWOW64"! Jego autor, niejaki msftguy, oprócz binarek zamieścił także kod źródłowy. Osobiście nie kompilowałem, poszedłem na łatwiznę, zawierzając skan już skompilowanej wersji VirusTotal (co rzecz jasna odradzam).
Czy od tej pory Pasjans i pozostałe gry stały się przenośne? Nie, tak całkowicie przenośne nie będą ze względu na hardkodowane ścieżki bezwzględne do pakietów językowych, więc choć można go przenieść na innego Windowsa (również na Windowsa 7 z wyłączonymi grami) to *.mui trzeba wrzucić dokładnie w to samo miejsce w którym jest preinstalowany, czyli w przypadku Solitaire: "C:\Program Files\Microsoft Games\Solitaire\pl-PL\" (w przeciwnym razie będzie brakować menu, komunikatów etc.). A skoro MUI to i cała struktura katalogów musi być odwzorowana, tym bardziej więc nie ma sensu przechowywać tych programów gdziekolwiek indziej. Nie sprawdzałem czy linki symboliczne lub junkcje rozwiążą problem – teoretycznie powinny.
Edycja menu
Microsoft schował przed nami niektóre opcje dostępne zapewne w buildach debugowych, które zdradza plik językowy. Jednakże edytując zwykłe menu można nie tylko poprzestawiać sobie różne opcje, ale także podpiąć te ukryte (zapisywanie/wczytywanie save’a nie działa, a samograj po chwili wpada w pętlę).
Przed i po edycji. Między innymi zmieniłem nazwę menu "Gra" po prostu na "Menu" i przeniosłem do niego "Pomoc".
Struktura menu znajduje się w pliku *.exe.mui, który najłatwiej jest edytować za pomocą programu Resource Hacker. Po wczytaniu pliku, użytkownikowi przedstawiona zostanie drzewiasta struktura. Rozwiń więc gałąź "Menu" i wybierz "102 : 1045". Aplikacja przedstawia użytkownikowi zasób w czytelnej formie, przypominającej budową np. CSS. Szybki rzut okiem pozwala zorientować się, że "SEPARATOR" separuje, "MENUITEM" odpowiada pojedynczej opcji, "POPUP" rozwijanemu menu, każde musi zaczynać się i kończyć klamrą, w cudzysłowie zamknięte są ich wyświetlane nazwy (wraz ze znacznikami, te pozostaw bez zmian), a po przecinku „skok” (także zostaw oryginalne).
Menu "103" i "122" to wspomniane ukryte (nieużywane) menu. Jednak z powodzeniem można je przeszczepić do "102" i nawet większość opcji będzie działać poprawnie. ;)
W przykładzie, który za chwilę podam, wszystko wcisnąłem do jednego „wszechmenu”, ale nic nie stoi na przeszkodzie aby rozplanować je inaczej. Na przykład pomiędzy "Grą", a "Pomocą" można wstawić zmianę talii czy tła (co jest szybsze niż czekanie na F7 lub buszowanie po rozwijanych opcjach).
Kiedy już satysfakcjonują ciebie wszystkie modyfikacje, kliknij w zieloną strzałkę "Complie Script". W przeciwnym razie menu niezostanie przebudowane i de facto żadne zmiany w pliku nie zostaną dokonane. Dopiero potem kliknij w "Save".
Program zrobi też automatycznie kopię oryginalnego pliku w miejscu nadpisania starego, pod nazwą "Solitaire.exe_original.mui".
Wymiana bitmap
Skoro już buszujesz po zasobach to równie dobrze można dodatkowo pokusić się o podmianę grafiki np. zastępując nudne i niskiej jakości tła, lepszymi. Do tego celu także polecam wspomniany wcześniej program, czyli Resource Hacker.
Otwórz w nim plik "C:\Program Files\Microsoft Games\Solitaire\CardGames.dll", (domyślnie znajduje się w "C:\Windows\System32\", ale jak mniemam pracujesz już na wersji spreparowanej wg pierwszego rozdziału ;)).
Wystarczy, że wskażesz dowolny plik i z menu kontekstowego pod prawym przyciskiem myszy, wybierzesz "Replace Resource …".
Następnie kliknij w przycisk "Select File …" i wybierz plik, który zastąpi ten wewnątrz DLL (rozmiar nie ma znaczenia, może być nawet większy niż oryginalny). Na koniec kliknij w "Replace" i gotowe. Wystarczy teraz zapisać zmiany.
Jak pewnie zauważyłeś, sam Pasjans używa niewielu z tych plików. Wszystkie akceptowane *.jpg muszą być pozbawione zbędnych meta danych takich jak np. EXIF, zaś wszystkie *.png muszą być 32 bitowe (te już mogą zawierać dowolne dane). Niestety biblioteka graficzna nie obsługuje poprawnie kanału alfa, często wyświetlając dziwne artefakty (najlepiej unikać jasnych wykończeń każdej z bitmap).
Używane tła pod kartami to "BACKGROUNDS/*.JPG" (np. NATURE.JPG) i "BACKGROUNDS/*X2.JPG" (np. NATUREX2.JPG). Pierwszy odpowiada tłom dla niskich rozdzielczości, drugi dla wyższych (w 2017 roku wstyd napisać: wysokich ;]). Pomijając już sam bezsens używania JPEG jako bitmap (podła jakość), Microsoft nie mógł się zdecydować na konkretną specyfikację, więc w obrębie całego zasobu jest mnóstwo niekonsekwencji, a nawet bałagan w atlasach (czy naprawdę nie dało się tego zrobić profesjonalnie i wydajnie, nawet w Pasjansie?). Jedną z nich jest brak określonej rozdzielczości dla owych wirtualnych stołów. Jedne są 800x600, inne 2048x1024, a jeszcze inne w 800x496, mimo że i tak używane jest tylko 1600x992… Z jakiegoś tajemniczego powodu, najlepsze rezultaty w skalowaniu (adekwatnie do aktualnie używanego rozmiaru okna) dają tła w rozdzielczościach 800x496 i 1600x992.
"BACKGROUNDS/*THUMB.PNG" to miniatury stołu w menu pod F7. Każda 94x98 z kilku pikselowym marginesem dla cienia.
"SHEETS/HIGHLIGHTSHEET1.JPG" i "SHEETS/HIGHLIGHTSHEET1X**.JPG" to pliki między innymi z taliami kart (dla niskich i wyższych rozdzielczości). Także kiepsko rozplanowane, z tzw. bleedingiem, czyli powieleniem ostatniego piksela każdej z krawędzi, z których składany był atlas…
"DECKS/*THUMB*.PNG" to miniatury zestawu talii kart w menu pod F7. Każda 130x104.
Cóż… i to w zasadzie tyle. Miłego hackowania.