Zmiana wartości w pliku EXE za pomocą HEX Edytora

Witam wszystkich

Chciałem sobie dla własnych potrzeb zmodyfikować plik EXE z modyfikacji do gry Jagged Alliance 2. Cały kod źródłowy do JA2 jest od dawna dostępny w wersji Freeware i w nim wszystkie zmiany bez problemu wykonuje, a później wszystko kompiluje i gra działa bez żadnych problemów. Problem zaczyna się gdy chce się dostosować plik EXE z modyfikacji do tej gry. Z reguły moderzy udostępniają samą modyfikację do JA2, a o kodzie źródłowym już niestety zapominają, dlatego czasami trzeba się posłużyć HEX Editorem.

Chciałbym za pomocą HEX Edytora zmienić w pliku EXE tylko dwie rzeczy, które tak naprawdę są tylko dwoma cyframi i do Was kieruję pytanie czy jest to możliwe.

Tak to wygląda w kodzie źródłowym: to jest w pliku “ja2 / build / tactical / weapons.c” w linijce 2644 (Notepad ++)

if ( Item[usInHand].usItemClass == IC_GUN )

	{

		bAttachPos = FindAttachment( pInHand, GUN_BARREL_EXTENDER );

		if ( bAttachPos != ITEM_NOT_FOUND )

		{

			// reduce status and see if it falls off

			pInHand->bAttachStatus[bAttachPos] -= (INT8) Random( 2 );


			if ( pInHand->bAttachStatus[bAttachPos] - Random( 35 ) - Random( 35 ) < USABLE )

			{

				// barrel extender falls off!

				OBJECTTYPE Temp;


				// since barrel extenders are not removable we cannot call RemoveAttachment here

				// and must create the item by hand

				CreateItem( GUN_BARREL_EXTENDER, pInHand->bAttachStatus[bAttachPos], &Temp );

				pInHand->usAttachItem[bAttachPos] = NOTHING;

				pInHand->bAttachStatus[bAttachPos] = 0;


				// drop it to ground

				AddItemToPool( pSoldier->sGridNo, &Temp, 1, pSoldier->bLevel, 0, -1 );


				// big penalty to hit

				iChance -= 30;


				// curse!

				if ( pSoldier->bTeam == OUR_TEAM )

				{

					DoMercBattleSound( pSoldier, BATTLE_SOUND_CURSE1 );


					ScreenMsg( FONT_MCOLOR_LTYELLOW, MSG_INTERFACE, gzLateLocalizedString[46], pSoldier->name );

				}

			}

		}


		iMaxRange = GunRange( pInHand );

	}

	else

	{

		iMaxRange = CELL_X_SIZE; // one tile

	}

Bardzo mi zależy aby zamiast po “Random” nie było 2 tylko 1

// reduce status and see if it falls off

       pInHand->bAttachStatus[bAttachPos] -= (INT8) Random( 2 );

oraz aby po “iChance” nie było 30 tylko 1

// big penalty to hit

	iChance -= 30;

Niestety akurat do tej modyfikacji (na której mi najbardziej zależy) autor zapomniał udostępnić kod dlatego pozostaje mi tylko HEX. Sprawa się tyczy przedłużki do lufy, która w domyślnym ustawieniu jest do niczego, a wystarczy tylko zmienić te dwie cyfry i staje się ona bardzo pożyteczna. Hex nie jest moją mocną stroną, dlatego z góry dziękuje za jakiekolwiek informacje.

Jeśli ktoś by chciał spróbować, to tu jest cały kod źródłowy razem z plikiem EXE, który chcę zmienić. Obydwa pliki są na licencji Freeware z pozwoleniem na dowolne zmiany.

Link

No to otwórz plik Hex edytorem przeszukaj np pod kątem występowania ciągu znaków w tym wypadku Random( 2 ) sprawdź czy to o to Random ci chodzi gdyż ciąg może występować kilka razy zmień i zapisz

Może coś znajdziesz pod tym linkiem