GTA Vice City: Vigilante Anywhere With Fixed Criminal Spawning Mod



by Viper187



Release Date: February 14th, 2004

Purpose:
Allows you to start/stop Vigilante missions anywhere (including on foot), except in other sub-mission vehicles (Taxis, Ambulance, Firetruck, Pizza Boy, Whoopee); However, You can still end Vigilante while in the other sub-mission vehicles. This also fixes the lame ass criminal spawning after level 12. Instead of spawning the 3rd car somewhere it'll kill itself half the time, it keeps all 3 cars together like missions 8-12. They should also keep spawning in different places instead of being stuck at the same spawn point like they normally are (I think).

Installation:
Copy the main.scm to the Data folder in your GTA Vice directory, or use the mission builder to make the changes yourself (described below).

Notes:
I used Demarest's GTA3 mod as a guide when I started looking at this, and I probably would've spent a lot longer getting started if it weren't for his work. In doing this, I noticed that only the FBI Washington and the Hunter are checked. The other law enforcement vehicles must've been hardcoded because I can't find anywhere the SCM checks if you're driving them.

Changing the SCM yourself:

I used Barton's builder v1.3 for this. It may look different in other builders/versions. Obviously, my way isn't the only way to do this. It could also be done more thoroughly. I didn't bother with the vehicle health restoration part in my SCM, but I'll tell you where it is.

First, we want to be able to start Vigilante anywhere except in another sub-mission vehicle. Find the label where it displays the Vigilante mission text if you enter a law enforcement vehicle. It looks like this:

:Label00F3CE
0001: wait 0? ms
00D6: if 0?
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Label00F662
00D6: if 22?
056C: $PLAYER_ACTOR
00DE: player $PLAYER_CHAR driving_vehicle_type #HUNTER
00DE: player $PLAYER_CHAR driving_vehicle_type #FBICAR
004D: jump_if_false ££Label00F647
00D6: if 0?
0038: $ONMISSION == 0? \\ integer values
004D: jump_if_false ££Label00F640
0293: 72?? = current_controls
00D6: if 0?
0038: 100?? == 1? \\ integer values
004D: jump_if_false ££Label00F471
00D6: if 0?
0038: 1288?? == 0? \\ integer values
004D: jump_if_false ££Label00F471
00D6: if 0?
8038: NOT 72?? == 3? \\ integer values
004D: jump_if_false ££Label00F460
03E5: text_box "CTUTOR" \\ Press the ~h~~k~~TOGGLE_SUBMISSIONS~ button~w~ to toggle Vigilante missions on or off.
0002: jump ££Label00F46A


You can pretty much discard that crap entirely and put in this:

:Label00F3CE
0001: wait 0? ms
00D6: if 0?
0256: player $PLAYER_CHAR defined
004D: jump_if_false ££Label00F662
00D6: if 6
0038: $ONMISSION == 0 ;; integer values
00E1: key_pressed 0 19
82DE: NOT player $PLAYER_CHAR driving taxi vehicle
80DE: NOT player $PLAYER_CHAR driving vehicle type #AMBULAN
80DE: NOT player $PLAYER_CHAR driving vehicle type #FIRETRUK
80DE: NOT player $PLAYER_CHAR driving vehicle type #MRWHOOP
80DE: NOT player $PLAYER_CHAR driving vehicle type #PIZZABOY
004D: jump_if_false ££Label00F662
0002: jump ££Label00F4EE


Note that you're jumping to the label where it sets up for Vigilante, NOT where it jumped before. This:

:Label00F4EE
00D6: if 0
00DE: player $PLAYER_CHAR driving_vehicle_type #HUNTER
004D: jump_if_false ££Label00F517
00BA: text_styled "COP_M3" 6000 ms 5 ;; 'BROWN THUNDER'
0002: jump ££Label00F54F


That's where it checks if you're in a Hunter or a Vice Cheetah and displays the Vigilante starting message accordingly and starts the mission immediately after.

Now, down in the Vigilante mission coding, there are 2 places where it checks if you're in a vehicle to see if it needs to display that annoying secondary (out of car) timer.

here's 1:

:Label10BCE6
00D6: if 2
856C: NOT $PLAYER_ACTOR
80DE: NOT player $PLAYER_CHAR driving_vehicle_type #HUNTER
80DE: NOT player $PLAYER_CHAR driving_vehicle_type #FBICAR
004D: jump_if_false £Label10BE04
00D6: if 0
0038: $1AF5 == 0 ;; integer values
004D: jump_if_false £Label10BD52
01BD: $1AF0 = current_time_in_ms
00D6: if 0
0018: $1AF4 > 60000 ;; integer values
004D: jump_if_false £Label10BD43
0004: $1AF3 = 60000 ;; integer values
0002: jump £Label10BD4B


here's the other:

:Label10D0A6
00D6: if 2
856C: NOT $PLAYER_ACTOR
80DE: NOT player $PLAYER_CHAR driving_vehicle_type #HUNTER
80DE: NOT player $PLAYER_CHAR driving_vehicle_type #FBICAR
004D: jump_if_false £Label10D1B8
0396: 0 (clear) useless_flag
00D6: if 0
0038: $1AF5 == 0 ;; integer values
004D: jump_if_false £Label10D116
01BD: $1AF0 = current_time_in_ms
00D6: if 0
0018: $1AF4 > 60000 ;; integer values
004D: jump_if_false £Label10D107
0004: $1AF3 = 60000 ;; integer values
0002: jump £Label10D10F


Now, since we don't care if Tommy is in a Hunter or an FBI car, make it always go where we want it to. Like this:

The first one:

:Label10BCE6
0002: jump £Label10BE04


and:

:Label10D0A6
0002: jump £Label10D1B8


Then, find where it checks for #FBICAR and #HUNTER again. There are at least 2 other places it does this. The one we're concerned with is this:

:Label10ED62
0293: $12 = current_controls
00D6: if 22
056C: $PLAYER_ACTOR
00DE: player $PLAYER_CHAR driving_vehicle_type #HUNTER
00DE: player $PLAYER_CHAR driving_vehicle_type #FBICAR
004D: jump_if_false £Label10EE4A
03C1: $1ADB = player $PLAYER_CHAR car
053F: set_car $1ADB tires_vulnerable 0
00D6: if 0
8038: NOT $12 == 3 ;; integer values
004D: jump_if_false £Label10EDF9
00D6: if 0
00E1: key_pressed 0 19
004D: jump_if_false £Label10EDD9
00D6: if 0
0038: $1AFA == 1 ;; integer values
004D: jump_if_false £Label10EDD2
0004: $1AFA = 2 ;; integer values


Remove the first "if" check there entirely, as well as the 2 lines below it. This will allow you to end Vigilante from anywhere.

So you're left with this:

:Label10ED62
0293: $12 = current_controls
00D6: if 0
8038: NOT $12 == 3 ;; integer values
004D: jump_if_false £Label10EDF9
00D6: if 0
00E1: key_pressed 0 19
004D: jump_if_false £Label10EDD9
00D6: if 0
0038: $1AFA == 1 ;; integer values
004D: jump_if_false £Label10EDD2
0004: $1AFA = 2 ;; integer values


Last but not least...

We want to fix the annoying criminal spawning after level 12. Find this piece of code and change the check.

:Label109611
00D6: if 1
0018: $1AEC > 7 ;; integer values
001A: 12 > $1AEC ;; integer values
004D: jump_if_false £Label109802
04B9: unknown_stuff $1B1E $1B1F $1B20 13.0 500.0 $1B1E $1B1F $1B20 $1B24 $1B25 $1B26 $1B27
00D6: if 3
0042: $1B1E == 0.0 ;; floating-point values
0042: $1B1F == 0.0 ;; floating-point values
0042: $1B24 == 0.0 ;; floating-point values
0042: $1B25 == 0.0 ;; floating-point values
004D: jump_if_false £Label109692
0001: wait 0 ms
0002: jump £Label109385


The check would become:

00D6: if 0
0018: $1AEC > 7 ;; integer values
004D: jump_if_false £Label109802


That should do it. You should now have Vigilante anywhere. If you want, you can also find the following piece of code and change it accordingly:

:Label10BBBF
0578: $1B1A
0008: $1AEC += 1 ;; integer values
00D6: if 22
056C: $PLAYER_ACTOR
00DE: player $PLAYER_CHAR driving_vehicle_type #HUNTER
00DE: player $PLAYER_CHAR driving_vehicle_type #FBICAR
004D: jump_if_false £Label10BC11
03C1: $1ADB = player $PLAYER_CHAR car
053F: set_car $1ADB tires_vulnerable 0
0227: $1AFC = car $1ADB health
0008: $1AFC += 100 ;; integer values
0224: set_car $1ADB health_to $1AFC