Hakowanie Contry
*

Offline Mejs

  • *
  • 249
  • # Joint ROM System #
Hakowanie Contry
« dnia: Lipca 19, 2023, 21:10:14 »
Cześć kochani!

Tydzień przed zlotem, wróciłem do cybeprzestrzeni i po kilku dniach wyplułem tego potworka.

Wprowadzone zmiany to układ pierwszego poziomu, zmniejszona wysokość skoku na chamską, zmodyfikowane bronie i kilka pomniejszych detali. Grzebiąc w kodzie znalazłem tę dwukolorową paletę i bardzo mi się spodobała. Zielona też jest świetna, planuje wsadzić ją do trzeciego poziomu.

Użyte narzędzia to głównie Red Falcon (układ poziomu i przeciwników) oraz hex edytor zawarty w FCEUX.  Na romhacking.net jest sporo materiałów. Zdecydowanie najbardziej przydatny był sam rozkodowany plik:

https://github.com/vermiceli/nes-contra-us

Niestety nie udało mi się skompilować, nie wiem czy to kwestia mojej durnoty, czy systemu operacyjnego (Mac OS/X), jednakże sam dokument i tak był kluczowy w poszukiwaniu adresów.

Kolejnym narzędziem, którego nie udało mi się uruchomić, to narzędzie do dekompresji grafiki w Contrze. Niestety Konami zaimplikowało swoją własną kompresję, która nie pozwala na zwyczajną edycję grafiki.  Tutaj kompresor/dekompresor:

https://github.com/hansbonini/rle_konami

Graliście w to coś chłopy? Czy za trudne, za nudne? Jakieś propozycje? Planuję jeszcze trochę się tym pobawić, chciałbym móc wsadzać całe linie kodu, zamiast zmieniać pojedyncze wartości, do tego jest jednak potrzebna dekompilacja lub mozolny proces tłumaczenie assemblera na hex.



smash
« Ostatnia zmiana: Sierpnia 30, 2023, 18:06:56 wysłana przez Mejs »

*

Offline Krisuroku

  • *
  • 562
  • くりすろく
    • Krisuroku Twitch
Odp: CONTRA ZERO
« Odpowiedź #1 dnia: Lipca 21, 2023, 15:51:10 »
Przetestuję w weekend i dam znać. :)
Nie w tym roku! XD

Odp: CONTRA ZERO
« Odpowiedź #2 dnia: Lipca 21, 2023, 16:49:50 »
Dzięki za linki do narzędzi, nie miałem pojęcia że ludzie takie rzeczy robią. Uważałem edytor Red Falcon za szczyt możliwości romhackingu na temat Contry heh.

Może spojrzę w przyszłości na te dwa narzędzia żeby rozpracować jak to działa, tyle że ja używam Windows / Linux (tu już bliżej do OS/X).

Na szybko:
- przy kompilacji na Macu jest potrzebny program shasum
- apka do dekompresji grafiki używa Pythona, pytanie czy to wersja 2.x czy 3.x

Jak podasz szczegóły z czym masz problem to będzie prościej.


Hack dla mnie niegrywalny ze względu na nieczytelną grafikę, nie wiadomo co jest platformą a co elementem tła. Tyle co widziałem pierwszego poziomu na zlocie to sympatyczny pomysł z "wybuchającym obrazem".

*

Offline Mcin

  • ***
  • 813
  • أَلْقُنْتْرابَنْديطا
Odp: CONTRA ZERO
« Odpowiedź #3 dnia: Lipca 21, 2023, 18:09:18 »
Ależ to hack w duchu Elektronekromancji - sztuka ekstremalna, trudna w odbiorze, wymagająca odpowiedniego nastawienia i okoliczności, żeby ją zrozumieć i docenić :P A serio, grane było na rzutniku na zlocie i jeśli to nie jest wersja finalna, to ja poczekam z dalszym graniem na wersję kompletną. Lubię hacki z absurdalnym poziomem trudności, także i tu będę się dobrze bawił.

*

Offline Mejs

  • *
  • 249
  • # Joint ROM System #
Odp: CONTRA ZERO
« Odpowiedź #4 dnia: Lipca 22, 2023, 04:41:50 »
@ Verteks mam system operacyjny Ventura 13.4.1 na którym, z tego co mi wiadomo Python 3.5 nie chodzi, więc dekompresja grafiki odpada, jeśli wierzyć temu panu: https://www.reddit.com/r/romhacking/comments/sii3re/working_with_nes_contra_us_tile_data_any_tips/


Co do kompilacji i dekompilacji, przeprowadziłem cały proces zaprezentowany w tutorialu dwukrotnie, sprawdziłem hash romu, zgadzał się, kompiler odpalał się jednak wypluwał tylko błędy. Kilka dni nad tym siedziałem, reinstalowałem, w końcu się poddałem i ograniczyłem się do hexów.


@Mcin ten pierwszy poziom jest w pełni kompletny i grywalny, wydaję mi się, że chciałbym popchnąć projekt w innym kierunku, zapraszam więc do spróbowania. Pozostanę przy dwukolorowej palecie, jednak planuję ograniczyć elementy tła, tak żeby nie tracić na czytelności, przyznając Verteksowi rację. Był to krok częsciowo zamierzony, chciałem zwrócić się do starych elementów rozgrywki (precyzyjne skoki, wyuczanie się gry na pamięć), stąd też tytuł Zero. Teraz planuję zrobić coś zupełnie odwrotnego i dodać nowe elementy mechaniki aby podkręcić całą rozgrywkę.


Mimo braku możliwości dekompilacji, udało mi się niedawno wcisnąć kilka linijek kodu, używając samych hexów. Prcoes jest żmudny, jednak satysfakcjonujący i pozwala mi na lepsze zrozumienie gry i assemblera. Udało mi się spowodować, że przycisk skoku, odpowiada również za strzał, pozwalając na maszowanie oboma guzikami gdy postać jest w powietrzu ( japoński pazur ).

Odp: CONTRA ZERO
« Odpowiedź #5 dnia: Sierpnia 10, 2023, 14:34:26 »
nes-contra-us kompiluje prawidłowo, Mesen ładnie wyświetla symbole do debugowania. Readme ode mnie:

Cytuj
0. ROM - sprawdzenie czy właściwy
echo "7BDAD8B4A7A56A634C9649D20BD3011B baserom.nes" | md5sum -c -
Oczekiwany wynik:
Cytuj
baserom.nes: OK

baserom.nes - ścieżka do ROM / nazwa pliku ROM Contra US.


1. Mesen - https://www.mesen.ca/

Pobrać Linux (dev), rozpakować.
Plik oznaczyć jako uruchamialny we właściwości -> prawa dostępu

1.1 Instalacja .NET 6.0 - !dla tych co wiedzą co robią! to najpierw usunąć wszystko .NET co jest w systemie
sudo apt remove dotnet*
sudo apt remove aspnetcore*
sudo apt remove netstandard*

1.2 może wystarczy zrobić to:
sudo touch /etc/apt/preferences.d/99microsoft-dotnet.pref
1.3 w pliku 99microsoft-dotnet.pref:
Package: *
Pin: origin "packages.microsoft.com"
Pin-Priority: 1001

1.4
sudo apt install dotnet-sdk-6.0

2. cc65
2.1
sudo apt-get install cc65
2.2
dpkg -L cc65dostajemy ścieżki do wszystkich plików związanych z cc65

2.3
Na Linuxie dodać do zmiennych środowiskowych:
export PATH="$PATH:/usr/bin/cc65"
2.4
Test czy działa ok:
cc65Oczekiwany wynik:
cc65: No input files
ca65Oczekiwany wynik:
ca65: No input files
ld65Oczekiwany wynik:
ld65: Error: No object files to link

3. nes-contra-us
Pobrać z Git:
mkdir nes-contra-us
cd nes-contra-us
git clone https://github.com/vermiceli/nes-contra-us.git .

3.1
Oznaczyć build.sh jako wykonywalny, potem:
./build.sh
Oczekiwany wynik (uwaga długie!):
Sorry but you are not allowed to view spoiler contents.


EDIT: Nie miałem pomysłu co zmodyfikować w kodzie to popsułem jakieś dane od układu pierwszego poziomu, zrzut ekranu w załączniku.


EDIT2: Narzędzie do dekompresji wymaga pythona3.

Uruchomiłem je tak:
python3 main.py D ../baserom.nes test.bin 116963baserom.nes to ROM z Contra US. Test.bin to plik wynikowy.
Pythona3 mam w wersji 3.10.12.
Nie jestem w stanie sprawdzić wersji starszych niż Python 3.7, za nowy OS (Ubuntu 22.04). Python 3.7 też działa ok ze skryptem.

Wynik:
Sorry but you are not allowed to view spoiler contents.

Nie wiem pod jakim offsetem jest grafika w Contrze, Trax w swoim Hacking Guide pisał że to adres 0x1c8e3 czyli 116963 dziesiętnie. Co z tym dalej zrobić - nie mam NESowej wiedzy.


EDIT 3: niczym zaniedbany, pryszczaty nerd-fanboj Linuxa skompilowałem Pythona 3.4 i to narzędzie do dekompresji / kompresji działa prawidłowo. Musi być jakieś inny powód że u Ciebie @Mejs nie działa.


To by było na tyle, nie wiem co z tym dalej mogę podziałać, jakieś pytania / problemy?
« Ostatnia zmiana: Sierpnia 10, 2023, 15:31:11 wysłana przez Verteks »

*

Offline Mejs

  • *
  • 249
  • # Joint ROM System #
Odp: CONTRA ZERO
« Odpowiedź #6 dnia: Sierpnia 30, 2023, 05:34:32 »
Bardzo, ale to bardzo Ci dziękuję Verteks, że się tym zainteresowałeś, powoli poddawałem się jeśli chodzi o plany modyfikacji grafiki. 0x12a3f to adres który wskazał gość na reddicie (https://www.reddit.com/r/romhacking/comments/sii3re/working_with_nes_contra_us_tile_data_any_tips/), któremu ostatecznie udało się to zrobić. Efektem ma być plik .nes  który otwarty w tile edytorze wyświetla się poprawnie, po naniesieniu zmian, zapisaniu i ponownej rekompresji (???) mamy zmienioną grafikę w Contrze. Powiedz czy udało Ci się to zrobić i czy byłbyś skłonny powtórzyć ten proces w przyszłości?. Co do samej kompilacji i dekompilacji kodu, pracuje obecnie wyłącznie używając hex edytora i już się do tego przyzwyczaiłem. 

Czy ktoś wie, kto zrobił Contre z ograniczoną amunicje, lub ma dostęp do ROMu? Nie potrafię wykminić, jak wyświetlać litery na górze ekranu, a pozwoliłoby to na indykatory broni, życia, power upów itd.

Załączam najnowszą wersje modyfikacji nad którymi pracuje, obecnie wszyscy przeciwnicy wyrzucają apgrejdy i podwójne wciśnięcie przycisku w prawo powoduje dash. Chce zmienić bronie i power upy, tak żeby poziom trudności zmieniał się płynnie (np. zmiany w liczniku loopów wprowadzane są w czasie rzeczywistym) ala Zanac., zmienianie broni, zmniejszanie cooldownu dasha, zwiększanie skoku i double jump - dużo nowych mechanik przy jednoczesnym zwiększeniu tempa i trudności rozgrywki.

*

Offline Krisuroku

  • *
  • 562
  • くりすろく
    • Krisuroku Twitch
Odp: CONTRA ZERO
« Odpowiedź #7 dnia: Sierpnia 30, 2023, 06:14:16 »
Contrę z ograniczoną amunicją/ przeładowaniem zrobił Dizzy9. Mam gdzieś rom ale zacji, że już jestem w pracy i wrócę dopiero po 18:00 to pewnie ze trzy razy zapomnę o tym romie. Ciśnij mnie Mejs na messku to podeślę wieczorkiem.
Nie w tym roku! XD

*

Offline daf

  • *****
  • 1743
Odp: CONTRA ZERO
« Odpowiedź #8 dnia: Sierpnia 30, 2023, 08:00:56 »

Odp: CONTRA ZERO
« Odpowiedź #9 dnia: Sierpnia 30, 2023, 10:28:48 »
@Mejs
Udało się.

Po kolei:

Cytuj
Najpierw dekompresja pliku ROM z grą:
python3 main.py D ../baserom.nes test.nes 0x00012A3fNie spodziewałem się, że wartości szesnastkowe działają.


Plik test.nes otwieramy w edytorze kafelków ale nie takim zwykłym pod NES jak na przykład NES Screen Tool od Shiru ale w takim, co ogarnia edycję grafiki bezpośrednio w ROM.


Na Windows najsensowniejszy jest YY-CHR ale on tylko pod Windows... Na Linux / Mac działa TileMolester, bo jest napisany w Javie.
Pobieramy program z neta, odpalamy plik JAR przez terminal:
java -jar tm.jarW TileMolester robimy File -> Open, wybieramy test.nes.
Wczyta się zdekompresowany bank grafiki, wygląda na to, iż adres 0x00012A3f jest od ekranu głównego.
Edytujemy grafikę według upodobania, zapisujemy zmiany.


Potem kompresja grafiki:
python3 main.py C ../baserommod.nes testmod.nes 0x00012A3fPodanie tej samej nazwy pliku z grą co przy dekompresji - nadpisze oryginalny ROM, dlatego tu użyłem innych nazw.


Efekt końcowy widoczny na zrzucie ekranu numer trzy - "poszarzyłem" fragment logo gry.

Zostaje rozkminić jakie są offsety do kolejnych banków z grafikami, chyba że te dane gdzieś ktoś opisał @Mejs?
« Ostatnia zmiana: Sierpnia 30, 2023, 10:33:57 wysłana przez Verteks »

*

Offline Mejs

  • *
  • 249
  • # Joint ROM System #
Odp: CONTRA ZERO
« Odpowiedź #10 dnia: Sierpnia 30, 2023, 17:08:01 »
Chlop nie wymienia innych adresow, jak wroce do domu to poszukam i sprobuje znowu to odpalic na mojej maszynie. Daje to nadzieje, na kompletny overhaul grafiki! Zamiast zjebanych ograniczonych palet, bedziemy mieli zupelnie nowe sprajty. Sam fakt, ze title screen moze juz zostac zmieniony - podnieca mnie.


Dziekuje za podeslanie Contry Reload, sprobuje przeanalizowac zmiany i moze uda mi sie rozkminic wyswietlanie liczb i liter podczas rozgrywki. W najgorszym wypadku napisze do Jaja.

*

Offline Mcin

  • ***
  • 813
  • أَلْقُنْتْرابَنْديطا
Odp: CONTRA ZERO
« Odpowiedź #11 dnia: Sierpnia 30, 2023, 17:30:53 »
Czy ktoś wie, kto zrobił Contre z ograniczoną amunicje, lub ma dostęp do ROMu? Nie potrafię wykminić, jak wyświetlać litery na górze ekranu, a pozwoliłoby to na indykatory broni, życia, power upów itd.

hm, chyba już było :D http://forum.contrabanda.eu/index.php?topic=575.0

*

Offline Mejs

  • *
  • 249
  • # Joint ROM System #
Odp: CONTRA ZERO
« Odpowiedź #12 dnia: Sierpnia 30, 2023, 18:06:28 »
Wiem, ze bylo, daf juz podeslal ROMa. Jedyne co potrzebuje z tego haka, to wyswietlanie liczb i liter na gorze ekranu.


Zmienilem nazwe tematu, na bardziej ogolna.

@Verteks - załączam plik z dokumentacją grafiki.  Zdaje mi się że w tym schemacie zawarte są wszystkie adresy grafiki:

Cytuj
| Label Name        | Bank | Label In-Memory Address | PRG ROM Address | Graphics Data                           | PPU Addresses                                              | Comments                                                                                                                               |
|-------------------|------|-------------------------|-----------------|-----------------------------------------|------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------|
| `graphic_data_00` | 7    | $cb36                   | $1cb36          | Both nametables + Both Attribute tables | [$2000-$2800)                                              | Sets all Nametable + Attribute table data to #$00                                                                                      |
| `graphic_data_01` | 4    | $aa2d                   | $12a2d          | Left and Right Pattern tables           | [$0ce0-$1f80)                                              | Used for intro screen, level title screens, and game over screens                                                                      |
| `graphic_data_02` | 2    | $9097                   | $9097           | Nametable 0 + Attribute table 0         | [$2000-$2400)                                              | Used for intro screen                                                                                                                  |
| `graphic_data_03` | 4    | $8001                   | $10001          | Left Pattern table                      | [$0000-$0680)                                              | Used in every level. Contains Bill and Lance blocks, game over letters, lives medals, power-ups (SBFLRM), and explosions               |
| `graphic_data_04` | 4    | $85ae                   | $105ae          | Left Pattern table                      | [$0680-$08c0)                                              |                                                                                                                                        |
| `graphic_data_05` | 5    | $8001                   | $14001          | Left and Right Pattern tables           | [$09a0-$0a80), [$0dc0-$1200), [$1320-$1600), [$1bd0-$2000) | Character when immobile, and prone. Also has weapon zeppelin.  writes to same PPU addresses as `graphic_data_07` and `graphic_data_0b` |
| `graphic_data_06` | 4    | $99fc                   | $119fc          | Left and Right Pattern tables           | [$08c0-$1100)                                              | Most Base graphics                                                                                                                     |
| `graphic_data_07` | 5    | $8a61                   | $14a61          | Left and Right Pattern tables           | [$09a0-$0a80), [$0dc0-$1200), [$1320-$1600), [$1bd0-$2000) | Writes to same PPU addresses as `graphic_data_05` and `graphic_data_0b`                                                                |
| `graphic_data_08` | 4    | $886c                   | $1086c          | Left and Right Pattern tables           | [$09a0-$2000)                                              |                                                                                                                                        |
| `graphic_data_09` | 4    | $99cd                   | $119cd          | Left Pattern table                      | [$0b00-$0b40)                                              |                                                                                                                                        |
| `graphic_data_0a` | 4    | $a005                   | $12005          | Right Pattern table                     | [$1100-$1520)                                              |                                                                                                                                        |
| `graphic_data_0b` | 5    | $93e0                   | $153e0          | Left and Right Pattern tables           | [$09a0-$0a80), [$0dc0-$1200), [$1320-$1600), [$1bd0-$2000) | Writes to same PPU addresses as `graphic_data_05` and `graphic_data_07`                                                                |
| `graphic_data_0c` | 6    | $8001                   | $18001          | Left and Right Pattern tables           | [$09a0-$0a80), [$0dc0-$0ee0), [$0fc0-$1200), [$1320-$2000) |                                                                                                                                        |
| `graphic_data_0d` | 6    | $8cdc                   | $18cdc          | Left and Right Pattern tables           | [$09a0-$0a80), [$0dc0-$0ee0), [$0fc0-$1200), [$1320-$2000) |                                                                                                                                        |
| `graphic_data_0e` | 6    | $9bd6                   | $19bd6          | Left and Right Pattern tables           | [$09a0-$2000)                                              |                                                                                                                                        |
| `graphic_data_0f` | 4    | $a346                   | $12346          | Right Pattern table                     | [$1520-$1600)                                              |                                                                                                                                        |
| `graphic_data_10` | 4    | $a003                   | $12003          | Right Pattern table                     | [$1a20-$2000)                                              | Same as `graphic_data_11`, but horizontally flipped                                                                                    |
| `graphic_data_11` | 4    | $a3e7                   | $123e7          | Right Pattern table                     | [$1a20-$2000)                                              |                                                                                                                                        |
| `graphic_data_12` | 4    | $a940                   | $12940          | Right Pattern table                     | [$1b90-$1ca0)                                              |                                                                                                                                        |
| `graphic_data_13` | 4    | $87a1                   | $107a1          | Left Pattern table                      | [$08c0-$09a0)                                              |                                                                                                                                        |
| `graphic_data_14` | 5    | $a814                   | $16814          | Right Pattern table                     | [$1600-$1bd0)                                              |                                                                                                                                        |
| `graphic_data_15` | 6    | $b07a                   | $1b07a          | Left Pattern table                      | [$0ee0-$0fc0)                                              |                                                                                                                                        |
| `graphic_data_16` | 6    | $b15c                   | $1b15c          | Right Pattern table                     | [$1200-$1320)                                              |                                                                                                                                        |
| `graphic_data_17` | 5    | $addf                   | $16ddf          | Left and Right Pattern tables           | [$0a60-$0fe0), [$15b0-$18a0)                               |                                                                                                                                        |
| `graphic_data_18` | 5    | $b30d                   | $1730d          | Nametable 0 + Attribute table 0         | [$2000-$2400)                                              | Used in ending scene                                                                                                                   |
| `graphic_data_19` | 5    | $a31b                   | $1631b          | Left Pattern table                      | [$0680-$08c0)                                              |                                                                                                                                        |
| `graphic_data_1a` | 5    | $a500                   | $16500          | Left Pattern table                      | [$0a80-$0dc0)                                              |                                                                                                                                        |
« Ostatnia zmiana: Sierpnia 31, 2023, 06:12:41 wysłana przez Mejs »

Odp: Hakowanie Contry
« Odpowiedź #13 dnia: Września 25, 2023, 20:30:40 »
@Mejs Nie widziałem aktualizacji posta, jak znajdę wolny czas to sprawdzę na ile ta tablica jest przydatna.

*

Offline Mcin

  • ***
  • 813
  • أَلْقُنْتْرابَنْديطا
Odp: Hakowanie Contry
« Odpowiedź #14 dnia: Stycznia 16, 2024, 21:12:45 »
Cześć równikowy koderze, jak tam postępy? ja właśnie zmęczyłem oba buildy, na dowód screeny.

Zacznijmy od buildu 2, bo jest bliższy oryginałowi. Dash działa, ale tylko w jedna stronę. przeciwnicy rzucają bonusy, które znikają po wejściu w ziemie. odkryłem, że czasem nie trzeba strzelać w przeciwnika, tylko wejść w niego - czy to kwestia, która kolizja - z bonusem czy z wrogiem - będzie pierwsza? Poziom 1 przerobiony z contry zero, poziom 2 nie Rożni się niczym, poza paletą, na poziomie 3 trafiłem na miejsce, gdzie nie da się iść dalej. Bronie, zachowania wrogów, niezmienione. Widoczność na poziomie 2 jest do kitu, na 4 ekranie nie widać w ogóle pocisków przeciwników. tutaj barwy są albo mniej rozróżnialne niż w zerze, albo faktycznie dałeś tylko czarny i jeden odcień zielonego.

Wersja Zero. Mamy hardkorowy skok, mocno przeorane audio, bardzo osłabioną broń startową, ale za to wzmocnione S i M. Działka mają o wiele więcej życia. Tutaj widoczność jest problemem, bo o ile nie mam problemu z tym, że grafiki poziomu są mocno pozmieniane, po prostu nie idzie się domyślić po widoku gdzie jest woda, gdzie jest krawędź a gdzie dół, co przy mikroskokach odpowiada za 3/4 skuch. widzę też problem z widocznością pocisków, można było skorzystać z wariantu w poziomie 5, gdzie składają się chyba z 2 barw, wtedy można by już je wypatrzeć na jednolitym tle, ale wciąż byłoby hardkorowo. Generalnie paleta gry, jak już wiecie, to czarny i czerwony, jak wspomniałem w dwóch odcieniach, do tego ten brudny fiolet i występuje też biały, w miejscu, gdzie uchowały się gwiazdki na niebie z oryginału. Super psychodelicznie wypadają scena z obrazem, oraz koniec poziomu, gdzie podmieniają się kafle, chyba w celu wczytania grafiki z bossem. PS pozdro dla cwaniaka, co przejdzie bossa bez skuchy, ja na ledwości dotarłem do końca, bo załapałem się na bonusowe życie. Banderowska paleta barw pasuje mi bardziej od radioaktywnej. Podoba mi się niepokojąca muza z poziomu, oraz zmieniony dźwięk Ski - daje moc!  Gra zawiesiła się na początku poziomu 2, ale jak mniemam, tak jak w dashu byłby niezmieniony?
Grałem na 1 gracza, na dwóch pytanie, czy jakby dwóch graczy miało S to czy gra nie straciłaby ramu całego i nie zawiesiła o.O.

Ogólnie chyba zero podobało mi się bardziej, ale to przez trudność - dash przeszedłem za pierwszym podejściem, po hardkorze to jak spacerek był.

Ogólnie mam nadzieję że cisza oznacza ciężkie prace i że nie straciłeś zapału do swojego Opus Magnum.