Pisanie modów do gier typu:Rome Total war i Tzar w C++

Siema powiedźcie jak pisać mody do gier wymienionych w tytule w języku C++

Najpierw, to należałoby zaznajomić się z tym językiem, uprzedzam, że na to potrzebujesz minimum roku. Inna sprawa to to, że nie widzę najmniejszego sensu tworzyć do tych gier modyfikacje w C++, bo po co one niby miały by być, ale nie wnikam.

Sprawa wygląda ta:

  1. Najpierw uczysz się programować w C++

  2. Uczysz się programować gry.

  3. Podejmujesz decyzję, czy piszesz mody do Total War czy coś zupełnie innego.

Ja w C++ programuje już 2 rok ,ale z pisaniem modów nie miałem stycznośći.

2 lata w C++ programujesz i nie wiesz, że żeby napisać jakiegoś moda wypadałoby się najpierw zapoznać z API do obsługi modów?

A jeżeli takiego nie ma, to zostaje ręczne grzebanie w plikach i inżynieria wsteczna.

Do tych gier właśnie nie ma API, więc jeżeli chcieć by pisać mod w C++ (tylko po co?), należałoby się zaznajomić z programami debuggującymi, dekompilatorami itd. Swoją drogą, gdy patrzę na nick autora, od razu odnoszę wrażenie, że ma 12 lat, a raczej od 10 roku życia nie uczy się C++, nie ogarnąłby tego. Ale to już tylko taka moja wredność.

kijek no właśnie zacząłem się uczyć jak miałem 10 lat

Ta… i bez wątpienia ogarnąłeś funkcje, algorytmy i ich implementację, klasy i znasz parę użytecznych bibliotek. Sorki, ale na bajki na dobranoc jest już trochę późno.

Poza tym następujący temat wskazuje tylko, że twoja znajomość C++ jest ehm… jak ty się tego uczyłeś przez dwa lata, to chyba pisałeś tylko jeden znak w kodzie dziennie.

Ale ja jestem wredny…

Zależy jaki mod chcesz stworzyć. Wiele gier zawiera skompilowany plik z poleceniami dla parsera.

Np. GTA od III do San Andreas zawiera plik main.scm.

Taki plik kontroluje kolejne polecenia, które będą wykonywany. Zawiera thready. Pierwsz sekcja pliku wygląda tak:

00 00 00 00 49 4E 46 4F 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 4B 45 59 43 41 52 44 00 00 00 00 00 00 00 00 00 00 00 00 00

czyli …KEYCARD…’ To definiuje objekt KEYCARD z ID -2.

01 00 05 B8 0B

To opcode 0001, który pozwala przejść do następnego threada i ustawia czas oczekiwania za ile gra ma wznowić obecny thread. wait 3000 Po za tym, aby odkryć strukture takiego pliku, potrzeba ASM reverse engineering, IDA. Działanie opcodów tak samo, aby stworzyć ludzkie opisy opcodów po zdekompilowaniu. Tak aby te 0001: miało sens. I tak z każdym opcodem. Nadal do GTA nie zostało odkryte działanie wszystkich opcodów, są niektóre unknown. Następnie gdy się zna strukture, trzeba napisać edytor takiego pliku ( do GTA jest Sanny Builder ), bo przecież za trudno edytowac w hex edytorze oraz możliwośc kompilowania. Potem programowanie w takim edytorze może wyglądać tak:

:IS_STILL_OUT_CAR

wait 0       

if

Actor.Driving($PLAYER_ACTOR) // Maybe we are in car?

else_jump @LOCK_DOOR_OF_LAST_CAR 

if // Are we in right type of vehicle?

84C8: not actor $PLAYER_ACTOR driving_flying_vehicle 

else_jump @RESET_CAR

gosub @DISABLE_MARKER_OF_LAST_CAR

Z edytorem łatwiej niż w hex? Tylko trzeba go napisać. Po za tym w memory jest dużo ciekawych możliwości jak:

03C0: 0@ = actor $PLAYER_ACTOR car


0A97: 1@ = car 0@ struct


1@ += 1120


0A8D: 1@ = read_memory 1@ size 4 virtual_protect 0 // Our driver memory pointer

0AEA: 1@ = actor_struct 1@ handle // Our driver handle