Death Rally Launcher first release!

Here is the first release of the Death Rally Launcher!,

It allow us to modifiy the Easy Race laps, up to 9 laps!. This can be very fun.

The version 0.1.0.0 have this funcionalities:

 

  • Easy race laps modification

 

Requirements:

  • Death Rally windows version.
  • Install the executable in the same directory of the game.

Links:

 

I hope you use this utility and feel free to request new functionalities!

Fight against Adversary at Rock Zone in one lap

Hi,

Today, I show to you another video of my improvements, with my

 

Destruction Derby race in Death Rally

Hi,

As my investigations continue, i’m testing things that I want to incorporate to the future Death Rally launcher. In this case this post it’s about a race I called «Destruction Derby Race!», in honor of the classic game probably most of us played, Destruction Derby.

The main idea is to play a race with a lot of laps, in this case the race laps are 255, so, the race is too long to finish it normally and the best way to end this race is destroying all rivals!.

Here is a sample video of this kind of race:

Game launcher

Hi,

I’m introducing to you the work I’ve doing last weeks. It a Death Rally game launcher that allow us to select the number of laps for the easy race!.

This a earlier version, so functionality is very limited.

I hope you like it a please, post your comments and your ideas for this launcher I’ll release in few days.

Adversary mod explanation

Hi,

In this post I try to explain how we can use the adversary car in one race!,

The main idea is making the game believes that we are the driver with more points to make the game set the first driver as the Adversary. In this case we need to be the first driver, so, we can play with the adversary car.

The savegame I’ve created it’s very simple. We are the second driver with more points adn out rank is 0 (this is basic to use the adversary car). Rank positions are between 1 and 19, so, position 0 is a shortcut to achieve our objetive. Also, a drivre like Farmed Ted have more point than anyone and rank equals to 1. Later we’ll see why I’ve selected Farmed Ted with rank 1.

Now, I will show up, the decompilated code when you press the continue button in the black market:

case CONTINUE:
 
 if ( drivers[driverId].damage != 100 || useWeapons )
 {
    if ( isMultiplayerGame )
    {
       selectedRace_462CE8 = 0;
       v91 = setUndergroundMarketPrices();
       undergroundPricesSet_456B84 = v91;
       if (useWeapons && v91 )
       {
          enterBlackMarketScreen();
          dword_456B58 = 1;
       }
       else
       {
          loadMenuSoundEffect(1u, 24, 0, configuration.musicVolume, dword_445190);
          previewRaceScreen(raceDrivers_456758);
          dword_456B58 = 1;
       }
   }
   else
  {
       v92 = setUndergroundMarketPrices();
       undergroundPricesSet_456B84 = v92;
       if (useWeapons && v92 )
       {
          enterBlackMarketScreen();
       }
       else
       {
          loadMenuSoundEffect(1u, 24, 0, configuration.musicVolume, dword_445190);
          v93 = 0;
          v94 = 2;
          v95 = (int)dword_4608F0;
          do
          {
              if ( *(_DWORD *)(v95 - 108) > v93 )
              {
                   v5 = v94 - 2;
                   if ( v94 - 2 != driverId )
                       v93 = *(_DWORD *)(v95 - 108);
               }
               if ( *(_DWORD *)v95 > v93 )
               {
                    v5 = v94 - 1;
                    if ( v94 - 1 != driverId )
                    v93 = *(_DWORD *)v95;
               }
               if ( *(_DWORD *)(v95 + 108) > v93 && v94 != driverId )
                    v93 = *(_DWORD *)(v95 + 108);
               if ( *(_DWORD *)(v95 + 216) > v93 )
              {
                    v5 = v94 + 1;
                    if ( v94 + 1 != driverId )
                        v93 = *(_DWORD *)(v95 + 216);
              }
              if ( *(_DWORD *)(v95 + 324) > v93 )
              {
                    v5 = v94 + 2;
                    if ( v94 + 2 != driverId )
                    v93 = *(_DWORD *)(v95 + 324);
              }
              v94 += 5;
              v95 += 540;
          }
          while ( v94 - 2 < 20 );
          if ( drivers[ driverId].points <= v93 )
               selectRaceScreen();
          else
               adversaryPreviewScreen((const char **)v5);
      }
   }
   else
   {
         createPopup(144, 114, 384, 119, 1);
         writeTextInScreen("[Repair your car first.", 79530);
         writeTextInScreen((const char *)&unk_444160, 89770);
         writeTextInScreen("What'cha gonna do with that pile of", 100010);
         writeTextInScreen("junk, carry it around? Let me spell", 110250);
         writeTextInScreen("this out for you: R-E-P-A-I-R.", 120490);
         refreshAllScreen();
        loadMenuSoundEffect(2u, 23, 0, configuration.musicVolume, dword_44518C);
   }

 

Firstable, when you click in the continue button, the program checks if your car is not totally damaged, in this case, the program shows a popup noticing that you have your car broken and you need to repair it.

Next the program checks if you are in the black market or in the shop screen. If you are in the shop screen, the black market prices are recalculated and the screen is refreshed. In case that you are in the black market screen, the program calculates if you are the driver with more points (with the adversary savegame, Farmed Ted is the driver with more points 🙂 ). Depending on the result of this condition the program shows the selectRaceScreen (where you can select easy, medium or hard race) or the adversaryPreviewScreen (no circuit seleccion, and only two drivers in the race).

Well, this case is not new, normally we are not the driver with more points!, but all is based on this condition.

Now, we can are going to see in depth the code that sets the firsts driver as the adversary:

 

 maxPoints = 0;
 v119 = 0;
 if (numberOfParticipants > 0 )
 {
      int driverIndex = 0;
      do
      {
           if (drivers[driverIndex].points > maxPoints && v119 != v96 )
               maxPoints = drivers[driverIndex].points;
           ++v119;
           driverIndex = driverIndex + 1;
      }
      while ( v119 < numberOfParticipants);
 }
 v121 = v96;
 userPoints = drivers[v121].points;
 if (userPoints > maxPoints && !isMultiplayerGame )
   { 
        strcpy(raceParticipant[0].name, "Adversary");
        raceParticipant[0].difficulty = configuration.difficulty;
        raceParticipant[0].damage = 0;
        raceParticipant[0].rocket = 0;
        raceParticipant[0].carType = 6;
        raceParticipant[0].spikes = 1;
        raceParticipant[0].useWeapons = useWeapons;
        raceParticipant[0].mines = useWeapons != 0 ? 8 : 0;
        raceParticipant[2].r = *((byte *)v112 + 30);
        raceParticipant[2].g = *((byte *)v112 + 31);
        raceParticipant[2].b = *((byte *)v112 + 32);
        raceParticipant[3].r = *((byte *)v112 + 30);
        raceParticipant[3].g = *((byte *)v112 + 31);
        raceParticipant[3].b = *((byte *)v112 + 32);
 }

This code obtains if we are the driver with more points (note that only checks the first numberOfParticipants, normally 4, so only checks Duke Nukem, Jane Honda, Nasty Nick and Motor Mary)  and in this case sets the first participan name as Adversary, sets the carType as Adversary Car!, add spikes to this car (althouhg we can’t see it), and if we are using weapons, our car will contain 8 mines  :).

Also the program sets the 3th and 4th car color to grey, this is the reason because we see this cars with this colour.

 

In conclusion, since I’ve decompiled the code, I can test some cases and find out this kind of behaviour.  Probably, when I implement a Death Rally launcher, this program can change the oponents colours from grey to their original colour, and add rocket the adversary car.

 

 

Final race with 4 contenders

Hi adversary!,

What do you feel fighting against 3 cars?

At this moment the rivals are very easy, but the idea is to allow to modify this cars with the launcher I’m developing. I hope we can see a final race with 3 deliverators, it can be awesome!

F1 2018 mod video

Here are a video of the F1 2018 mod:

 

It’s very hard to win races in this mod!

 

I hope you enjoy it.

Death Rally in-game images modifications by Simo

Hi to all,

User Simo continues his great work and now shows us a few images of his Death Rally image modifications.

At this moments Simo is be able to extract images (bpk files)from bpa files, modify it, and store in the bpa file. The results are shown in the nexts images:

image 1

image 2

image3

My expectations are very hight about Simo’s work because he is doing a great work in this hard hard work of modifing Death Rally image files.

Also you can follow Simo’s updates on

Death Rally Shareware/Full version savegame in detail

Hi to all,

As user Simo develops a savegame editor (great utility!) based on my investigations of the Death Rally executable I want to publish the format of the savegames in the full and shareware version.

Savegame files are crypted using the first byte of the file.

The file structure is:

Offset (byte) Size (bytes) Information
0 1 Crypt key
1 1 Driver id
2 1 Use weapons (true-false)
3 1 Dificulty (1-3)
4 15 Savegame name
19 108*20 Drivers’s data

Driver’s data is as follows:

Offset (byte) Size (bytes) Information
0 12 Name
12 4 Damage
16 4 Engine upgrade (0-4)
20 4 Tyre upgrade (0-4)
24 4 Armour upgrade (0-4)
28 4 Car type(0-5)
32 4 ?
36 4 ?
40 4 ?
44 4 Colour
48 4 Money
52 4 Loan Type
56 4 Loan races left
60 4 Actual car value
64 4 Face id
68 4 Points
72 4 Rank
76 4 Races won
80 4 Total races
84 4 Last race income
88 4 Total income
92 4 Mines purchased (number of mines)
96 4 Spikes purchased
100 4 Rocket purchased
104 4 Sabotage purchased

The main diference between shareware and full version it is that full version savegame is a 2179 bytes file while shareware savegame occupies 2195 bytes. The only difference are the extra bytes that the shareware version has.

To know how to decrypt the full version file see https://github.com/enriquesomolinos/DreeRally/blob/master/tools/savegameDecrypt.py

In order to crypt the full version file you can use: https://github.com/enriquesomolinos/DreeRally/blob/master/tools/savegameCrypt.py

To know how to decrypt the shareware file see Shareware savegame decryptor

In order to crypt the shareware file you can use: Sahreware savegame crypt

 

Marathon Race in Death Rally!

Hi to all,

Due to the decompilation phase of the Death Rally executable I modified few thing to allow us to play a marathon race in Death Rally!. This race have 20 laps and is very interesting because one fail doesn’t destroy your race. Be carefull of enemy weapons because 20 laps can be endless.

Here is the video that demostrates it:

In few weeks I will publish a game launcher that allow us to modify race laps and more!.

 

Polls
Sorry, there are no polls available at the moment.
Donate

Help us to mantain this web and develop DreeRally