sr2lua/rn02.lua

  1. -- rn02.lua 
  2. -- SR2 mission script 
  3. -- 3/28/07 
  4.  
  5. 	-- KNOBS_TO_TURN -- 
  6.  
  7.  
  8. 			--[[ *** READ ME *** 
  9. 			 
  10. 				Whenever a script function looks up a wave parameter, a naming convention is used to select the appropriate value. 
  11. 				Parameter values for single player missions can use any name, say "PARAMETER_1" for example. If you wish to have 
  12. 				a different value for that parameter in coop, then prepend "COOP" to the parameter name. In this case, we get 
  13. 				"COOP_PARAMETER_1". 
  14.  
  15. 				When a mission function needs to access "PARAMETER_1", it will search for the appropriate overloaded values first: 
  16.  
  17. 					*	Single player will use the value stored in "PARAMETER_1". 
  18. 				 
  19. 					*	Coop will use the value stored in "COOP_PARAMETER_1", if it exists. Otherwise it will use the 
  20. 						default single player value stored in "PARAMETER_1". 
  21. 			 ]] 
  22.  
  23. 			-- Mission parameters 
  24. 			RN02_PARAMETERS	=  
  25. 				{						 
  26. 						-- single-player values 
  27. 							["BIKE_CHASE_SPEED"]				= 75,		-- Speed of Ronin chasing the players on bikes 
  28. 							["CAR_CHASE_SPEED"]				= 75,		-- Speed of Ronin chasing the players in cars 
  29. 							["BIKE_CHASE_HP"]					= 800,	-- HP of Ronin chasing the players on bikes 
  30. 							["CAR_CHASE_HP"]					= 1600,	-- HP of Ronin chasing the players in cars 
  31. 							["MAX_CHASE_VEHICLES"]			= 5,		-- Limits # vehicles chasing players at any time 
  32. 							["CHASE_TRAFFIC_DENSITY"]		= .40,	-- Traffic desnity during the chase 
  33.  
  34. 						-- coop values 
  35. 							["COOP_BIKE_CHASE_HP"]			= 1200,	-- HP of Ronin chasing the players on bikes 
  36. 							["COOP_CAR_CHASE_HP"]			= 2400,	-- HP of Ronin chasing the players in cars 
  37. 							["COOP_MAX_CHASE_VEHICLES"]	= 8, 
  38. 				} 
  39.  
  40. -- Global constants (All caps == GLOBAL CONSTANT) 
  41. --[[	In general, shouldn't be modified in running code, except for maybe in the setup function ) 
  42.  
  43. ]] 
  44. 	-- Coop mission? 
  45. 	IN_COOP	= false 
  46.  
  47. 	-- GROUPS -- 
  48. 		GROUP_START_CAR			= "rn02_$Gstart_car" 
  49. 		GROUP_START_CAR_COOP		= "rn02_$Gstart_car_coop" 
  50. 		GROUP_PLAYER_CAR			= "rn02_$Gplayer_car" 
  51. 		GROUP_CAR_DEALER			= "rn02_$Gcar_dealer" 
  52. 		GROUP_CLOTHING_DEALER	= "rn02_$Gclothing_dealer" 
  53. 		GROUP_WEAPON_DEALER		= "rn02_$Gweapon_dealer" 
  54. 		GROUP_FENCE					= "rn02_$Gfence" 
  55. 		GROUP_CHASE_1				= "rn02_$Gchase_1" 
  56. 		GROUP_ROADBLOCK_1			= "rn02_$Groadblock_1" 
  57. 		GROUP_TURRET				= "rn02_$Gturret" 
  58. 	 
  59. 	-- GROUP MEMBER TABLES --  
  60.  
  61. 	-- TRIGGERS --  
  62. 		TRIGGER_CAR_DEALER			= "rn02_$Tcar_dealer" 
  63. 		TRIGGER_CLOTHING_DEALER		= "rn02_$Tclothing_dealer" 
  64. 		TRIGGER_WEAPON_DEALER		= "rn02_$Tweapon_dealer" 
  65. 		TRIGGER_FENCE					= "rn02_$Tfence" 
  66. 		TRIGGER_SAFE_HOUSE			= "rn02_$Tsafe_house" 
  67. 		TRIGGER_CHASE_1				= "rn02_$t000" 
  68. 		TRIGGER_ROADBLOCK_1			= "rn02_$t001" 
  69.  
  70. 		-- List of all triggers, makes cleaning up more convenient 
  71. 		TABLE_ALL_TRIGGERS		= {	TRIGGER_CAR_DEALER, TRIGGER_CLOTHING_DEALER, TRIGGER_WEAPON_DEALER, TRIGGER_FENCE}		 
  72.  
  73. 	-- VEHICLES -- 
  74. 		VEHICLE_PLAYER_CAR			= "rn02_$Vplayer_car" 
  75. 		VEHICLE_CLOTHING_DEALER		= "rn02_$Vclothing_dealer" 
  76. 		VEHICLE_WEAPON_DEALER		= "rn02_$Vweapon_dealer" 
  77. 		VEHICLE_TURRET					= "rn02_$Vturret" 
  78.  
  79. 	-- CHARACTERS -- 
  80. 		CHARACTER_CAR_DEALER			= "rn02_$Ccar_dealer" 
  81. 		CHARACTER_CLOTHING_DEALER	= "rn02_$Cclothing_dealer" 
  82. 		CHARACTER_WEAPON_DEALER		= "rn02_$Cweapon_dealer" 
  83. 		CHARACTER_FENCE				= "rn02_$Cfence" 
  84.  
  85.  
  86. 	-- CONVERSATIONS 
  87. 	   INTRO_CONVERSATION = 
  88. 		{ 
  89. 			{ "RON2_INTRO_L1", nil, 0.5 }, 
  90. 			{ "PLAYER_RON2_INTRO_L2", LOCAL_PLAYER, 0.5 }, 
  91. 			{ "RON2_INTRO_L3", nil, 0.5 }, 
  92. 			{ "PLAYER_RON2_INTRO_L4", LOCAL_PLAYER, 0.5 }, 
  93. 		} 
  94. 		 
  95. 		WARNING_CONVERSATION = 
  96. 		{ 
  97. 			{ "RON2_WARNING_L1", nil, 0.5 }, 
  98. 			{ "PLAYER_RON2_WARNING_L2", LOCAL_PLAYER, 0.5 }, 
  99. 		} 
  100.  
  101. 		FENCE_PISSMOAN_CONVERSATION = 
  102. 		{ 
  103. 			{ "RON2_FENCE_PISSMOAN_L1", CHARACTER_FENCE, 0.5 }, 
  104. 			{ "PLAYER_RON2_FENCE_PISSMOAN_L2", LOCAL_PLAYER, 0.5 }, 
  105. 		} 
  106.  
  107. 		FENCE_BITCHMOAN_CONVERSATION = 
  108. 		{ 
  109. 			{ "RON2_FENCE_BITCHMOAN_L1", CHARACTER_FENCE, 0.5 }, 
  110. 			{ "PLAYER_RON2_FENCE_BITCHMOAN_L2", LOCAL_PLAYER, 0.5 }, 
  111. 		} 
  112.  
  113. 		FENCE_FINAL_CONVERSATION = 
  114. 		{ 
  115. 			{ "FENCE_RON2_REINFORCEMENTS_01", CHARACTER_FENCE, 0.5}, 
  116. 		} 
  117.  
  118. 	-- CHECKPOINTS -- 
  119. 		CHECKPOINT_START				= MISSION_START_CHECKPOINT		-- defined in ug_lib.lua 
  120. 		CHECKPOINT_WEAPON_DEALER	= "rn01_checkpoint_weapon_dealer"	-- Just before the player is sent to the arms dealer. 
  121. 		CHECKPOINT_DRIVE				= "rn02_checkpoint_drive" -- The start of the turret sequence 
  122.  
  123. 	-- NAVPOINTS 
  124.  
  125. 		-- the start location for Player 1 
  126. 		NAVPOINT_LOCAL_PLAYER_START		= "mission_start_sr2_city_$rn02" 
  127.  
  128. 		-- the start location for Player 2		 
  129. 		NAVPOINT_REMOTE_PLAYER_START		= "rn02_$Nremote_player_start" 
  130. 		 
  131. 		NAVPOINT_SAFE_HOUSE_CAR_START		= "rn02_$n000" 
  132.  
  133. 		-- Navpoints used when staging players before teleporting them into the convertible 
  134. 		NAVPOINT_LOCAL_CONVERTIBLE_STAGING		= "rn02_$n006" 
  135. 		NAVPOINT_REMOTE_CONVERTIBLE_STAGING		= "rn02_$n007" 
  136. 		 
  137. 		NAVPOINT_LOCAL_SUCCESS				= "rn02_$Nlocal_player_finish" -- teleport nav for the end of the mission 
  138. 		NAVPOINT_REMOTE_SUCCESS				= "rn02_$Nremote_player_finish" -- teleport nav for the end of the mission 
  139.  
  140. 	-- MOVERS 
  141.  
  142. 	-- localized helptext messages 
  143. 		HELPTEXT_FAILURE_CONVERTIBLE		= "rn02_failure_convertible" 
  144. 		HELPTEXT_FAILURE_DEALER_DIED		= "rn02_failure_dealer_died" 
  145. 		HELPTEXT_FAILURE_FENCE				= "rn02_failure_fence" 
  146.  
  147. 		HELPTEXT_PROMPT_CAR_DEALERSHIP	= "rn02_prompt_car_dealership" 
  148. 		HELPTEXT_PROMPT_CLOTHING_DEALER  = "rn02_prompt_clothing_dealer" 
  149. 		HELPTEXT_PROMPT_FENCE				= "rn02_prompt_fence" 
  150. 		HELPTEXT_PROMPT_PROTECT_FENCE		= "rn02_prompt_protect_fence" 
  151. 		HELPTEXT_PROMPT_REENTER_CAR		= "rn02_prompt_reenter_car" 
  152. 		HELPTEXT_PROMPT_WEAPON_DEALER		= "rn02_prompt_weapons_dealer" 
  153. 		HELPTEXT_PROMPT_ENTER_CAR			= "rn02_prompt_enter_car"			-- Take the fence’s car. 
  154. 		HELPTEXT_PROMPT_RONIN_ENFORCERS	= "rn02_prompt_ronin_enforcers"	-- Watch out for Ronin enforcers!" 
  155. 		HELPTEXT_PROMPT_WRONG_CAR			= "rn02_prompt_wrong_car" 
  156. 		HELPTEXT_PROMPT_REPAIR_CAR			= "rn02_prompt_repair_car"			-- Have the car repaired before visiting the fence. 
  157.  
  158. 	-- CHASE / AMBUSHES 
  159.  
  160. 		CHASES_AND_AMBUSHES =  
  161. 		{		 
  162. 			["chase_1"]	=	 
  163. 				{	["type"]			=	"chase", 
  164. 					["group"]		=	GROUP_CHASE_1, 
  165. 					["vehicles"]	=	{	["rn02_$v000"]		=	{	["passengers"]	= {	"rn02_$c000", "rn02_$c001"},  
  166. 																				["type"]			= "car", 
  167. 																				["jump"]			= true, 
  168. 																			}, 
  169. 												["rn02_$v001"]		=	{	["passengers"]	= {	"rn02_$c002"},  
  170. 																				["type"]			= "bike", 
  171. 																				["jump"]			= true, 
  172. 																			}, 
  173. 											}, 
  174. 					["on_foot"]		= {	}, 
  175. 					["trigger"]		= TRIGGER_CHASE_1, 
  176. 				}, 
  177.  
  178. 			["roadblock_1"]	=	 
  179. 				{	["type"]			=	"roadblock", 
  180. 					["group"]		=	GROUP_ROADBLOCK_1, 
  181. 					["vehicles"]	=	{	["rn02_$v002"]	=	{	["passengers"]	= {	"rn02_$c008", "rn02_$c009"},  
  182. 																			["type"]			= "car", 
  183. 																		}, 
  184. 												["rn02_$v003"] =	{	["passengers"]	= {	"rn02_$c006", "rn02_$c007"},  
  185. 																			["type"]			= "car", 
  186. 																		}, 
  187. 												["rn02_$v004"] =	{	["passengers"]	= {	"rn02_$c005"},  
  188. 																			["type"]			= "bike", 
  189. 																		}, 
  190. 											}, 
  191. 					["on_foot"]		=	{	"rn02_$c003", "rn02_$c004" 
  192. 											}, 
  193. 					["trigger"]		=	TRIGGER_ROADBLOCK_1, 
  194. 				}, 
  195. 		} 
  196.  
  197. 	-- MISC CONSTANTS 
  198. 		PLAYER_VEHICLE_HEALTH_MULTIPLIER = 2 
  199. 		FENCE_PROTECT_TIME_S					= 180 
  200. 		PROXIMITY_THRESHOLD					= 50.0 
  201. 		FREE_WEAPON_GUN						= "AR50_launcher" 
  202. 		FREE_WEAPON_THROWN					= "grenade" 
  203. 		FREE_CLOTHING_NAME					= "parachute suit" 
  204. 		FREE_CLOTHING_WEAR_OPTION			= "cmSui_uJumpSui01.cmeshx" 
  205. 		FREE_CLOTHING_VARIANT_NAME			= "07 - Default" 
  206. 		CONVERTIBLE_MAX_SPEED				= 65 -- Max speed of the fleeing convertible 
  207. 		DEALER_INTERACT_DISTANCE			= 5 -- How close a player needs to be to the dealer for the interact message to play. 
  208. 		PLAYER_SYNC								= 
  209. 			{ 
  210. 				[LOCAL_PLAYER]					= SYNC_LOCAL, 
  211. 				[REMOTE_PLAYER]				= SYNC_REMOTE, 
  212. 			} 
  213. 		OTHER_PLAYER							= 
  214. 			{ 
  215. 				[LOCAL_PLAYER]					= REMOTE_PLAYER, 
  216. 				[REMOTE_PLAYER]				= LOCAL_PLAYER, 
  217. 			} 
  218. 		MECHANIC_INFINITE_MASS_DIST		= 20 -- When player is < this distance from a mechanic, give the vehicle infinite mass. 
  219.  
  220. -- Global Variables (First letter caps == Global Variable) 
  221. 	Current_dealer_complete					= false 
  222. 	Current_dealer_helptext					= "" 
  223. 	Current_dealer								= "" 
  224. 	Player_in_convertible					=  
  225. 		{ 
  226. 			[LOCAL_PLAYER] = false, 
  227. 			[REMOTE_PLAYER] = false, 
  228. 		} 
  229. 	Clothing_dealer_player					= "" 
  230.  
  231. 	Min_notoriety_cell						= 2	-- Min notoriety set after cell call received 
  232. 	Max_notoriety_cell						= 2	-- Max notoriety set after cell call received 
  233. 	Min_notoriety_fence						= 2	-- Min notoriety set after fence picked up 
  234. 	Max_notoriety_fence						= 2	-- Max notoriety set after fence picked up 
  235. 	Chase_or_ambush_sent						= 0 
  236. 	Vehicles_attacking						= 0 
  237. 	Last_complication							= "" 
  238. 	Weapons_received							= false 
  239.  
  240. 	-- THREADS 
  241. 	Thread_dealer						= INVALID_THREAD_HANDLE 
  242. 	Thread_prompt_tracking			= INVALID_THREAD_HANDLE 
  243. 	Thread_delayed_release			= INVALID_THREAD_HANDLE 
  244. 	Thread_vehicle_infinite_mass	= INVALID_THREAD_HANDLE 
  245. 	Table_all_threads					= {	Thread_dealer,Thread_prompt_tracking,Thread_delayed_release} 
  246.  
  247. -- REQUIRED MISSION FUNCTIONS ------------------------------- 
  248.  
  249. -- The main function/thread. Called when the mission starts. 
  250. function rn02_start(rn02_checkpoint, is_restart) 
  251.  
  252. 	mission_start_fade_out() 
  253.  
  254. 	if (rn02_checkpoint == CHECKPOINT_START) then 
  255.  
  256. 		local start_groups = {GROUP_START_CAR, GROUP_CAR_DEALER, GROUP_PLAYER_CAR} 
  257. 		if (coop_is_active()) then 
  258. 			start_groups = {GROUP_START_CAR, GROUP_START_CAR_COOP, GROUP_CAR_DEALER, GROUP_PLAYER_CAR} 
  259. 		end 
  260.  
  261. 		if (is_restart) then 
  262.  
  263. 			-- Load starting groups 
  264. 			for i,group in pairs(start_groups) do 
  265. 				group_create(group, true) 
  266. 			end 
  267.  
  268. 			-- Teleport players to the start location 
  269. 			teleport_coop(NAVPOINT_LOCAL_PLAYER_START, NAVPOINT_REMOTE_PLAYER_START) 
  270.  
  271. 		else 
  272.  
  273. 			-- Play the intro cutscene 
  274. 			cutscene_play("RO02-01", start_groups, {NAVPOINT_LOCAL_PLAYER_START, NAVPOINT_REMOTE_PLAYER_START}, false) 
  275. 			for i,group in pairs(start_groups) do 
  276. 				group_show(group) 
  277. 			end 
  278.  
  279. 		end 
  280. 	end 
  281.  
  282. 	rn02_initialize(rn02_checkpoint) 
  283.  
  284. 	if(rn02_checkpoint == CHECKPOINT_START) then 
  285.  
  286. 		-- Intro phone call. 
  287. 		rn02_incoming_phone_call(INTRO_CONVERSATION) 
  288.  
  289. 		-- Now that the player(s) know that the dealer is critical, let the players damage him 
  290. 		turn_vulnerable(CHARACTER_CAR_DEALER) 
  291. 		turn_invulnerable(CHARACTER_CAR_DEALER, true) 
  292.  
  293. 		-- Tell the players to head to the car dealership 
  294. 		mission_help_table(HELPTEXT_PROMPT_CAR_DEALERSHIP) 
  295.  
  296. 		-- Pickup the convertible from the car dealer 
  297. 		rn02_car_dealer() 
  298.  
  299. 		-- CHECKPOINT!	 
  300. 		while( not (Player_in_convertible[LOCAL_PLAYER] or Player_in_convertible[REMOTE_PLAYER]) ) do 
  301. 			thread_yield() 
  302. 		end 
  303. 		mission_set_checkpoint(CHECKPOINT_WEAPON_DEALER) 
  304. 		rn02_checkpoint = CHECKPOINT_WEAPON_DEALER 
  305.  
  306. 	end 
  307. 	 
  308. 	if (rn02_checkpoint == CHECKPOINT_WEAPON_DEALER) then 
  309.  
  310. 		-- Send players to the weapon dealer. 
  311. 		rn02_weapon_dealer() 
  312.  
  313. 		-- Send players to the fence. 
  314. 		rn02_fence() 
  315.  
  316. 		-- Fadeout and prepare for the turret portion of the mission 
  317. 		rn02_transition_to_turret() 
  318. 		rn02_checkpoint = CHECKPOINT_DRIVE 
  319. 	end 
  320.  
  321. 	if (rn02_checkpoint == CHECKPOINT_DRIVE) then 
  322.  
  323. 		-- If the vehicle teleport failed to place the vehicle on the road, do normal pathfinding to  
  324. 		-- the path's start 
  325. 		local dist = get_dist(VEHICLE_PLAYER_CAR, NAVPOINT_SAFE_HOUSE_CAR_START) 
  326. 		if ( (dist > 5) and (dist < 50) ) then 
  327.  
  328. 			vehicle_ignore_repulsors(VEHICLE_PLAYER_CAR, true) 
  329.  
  330. 			-- Use navmesh pathfinding to get to the turret path's start 
  331. 			vehicle_pathfind_to(VEHICLE_PLAYER_CAR,NAVPOINT_SAFE_HOUSE_CAR_START, true, true) 
  332.  
  333. 			vehicle_ignore_repulsors(VEHICLE_PLAYER_CAR, false) 
  334. 		end 
  335.  
  336.  
  337. 		-- Fence drives to his safe house while the players defend. 
  338. 		rn02_safe_house()	 
  339.  
  340. 		if (	(not vehicle_is_destroyed(VEHICLE_PLAYER_CAR)) and  
  341. 				(get_dist(VEHICLE_PLAYER_CAR, TRIGGER_SAFE_HOUSE) < 80) ) then 
  342. 			-- Players win! 
  343. 			rn02_complete() 
  344. 		else 
  345. 			-- Something bad happened, fail the mission 
  346. 			rn02_vehicle_destroyed_failure() 
  347. 		end 
  348.  
  349. 	end 
  350.  
  351. end 
  352.  
  353. function rn02_transition_to_turret() 
  354.  
  355. 	-- Don't do anything while either player is dead 
  356. 	while( character_is_dead(LOCAL_PLAYER) or (IN_COOP and character_is_dead(REMOTE_PLAYER)) ) do 
  357. 		thread_yield() 
  358. 	end 
  359.  
  360. 	-- Fade out and disable player controls 
  361. 	fade_out(1.0,{0,0,0}, SYNC_ALL) 
  362. 	fade_out_block() 
  363.  
  364. 	player_controls_disable(LOCAL_PLAYER) 
  365. 	if (IN_COOP) then 
  366. 		player_controls_disable(REMOTE_PLAYER) 
  367. 	end 
  368.  
  369. 	-- Get rid of the old vehicle and create the new one 
  370. 	rn02_swap_vehicles() 
  371.  
  372. 	-- CHECKPOINT! (ignore vehicle seating) 
  373. 	delay(1.0) 
  374. 	mission_set_checkpoint(CHECKPOINT_DRIVE, true) 
  375.  
  376. 	-- Place the correct people in the vehicle 
  377. 	rn02_setup_convertible_occupants() 
  378.  
  379. 	-- Prepare the car for the drive 
  380. 	rn02_setup_convertible_for_turret() 
  381.  
  382. 	-- Start the chases and ambushes 
  383. 	rn02_setup_chases_and_ambushes() 
  384.  
  385. 	-- Fade into the game 
  386. 	fade_in(1.0, SYNC_ALL) 
  387. 	fade_in_block() 
  388.  
  389. 	-- Reenable player controls 
  390. 	player_controls_enable(LOCAL_PLAYER) 
  391. 	if (IN_COOP) then 
  392. 		player_controls_enable(REMOTE_PLAYER) 
  393. 	end 
  394.  
  395. end 
  396.  
  397. function rn02_swap_vehicles() 
  398.  
  399. 	-- Make sure that the players aren't in a vehicle 
  400. 	character_evacuate_from_all_vehicles(LOCAL_PLAYER) 
  401. 	if IN_COOP then 
  402. 		character_evacuate_from_all_vehicles(REMOTE_PLAYER) 
  403. 		while(character_is_in_vehicle(REMOTE_PLAYER)) do 
  404. 			thread_yield() 
  405. 		end 
  406. 	end 
  407.  
  408. 	-- Destroy the old vehicle 
  409. 	if (vehicle_exists(VEHICLE_PLAYER_CAR)) then 
  410. 		vehicle_evacuate(VEHICLE_PLAYER_CAR) 
  411. 	end 
  412. 	group_hide(GROUP_PLAYER_CAR) 
  413. 	group_destroy(GROUP_PLAYER_CAR) 
  414.  
  415. 	-- Make sure that the client knows that it is deleted 
  416. 	delay(0.5) 
  417.  
  418. 	-- Create the new car 
  419. 	group_create(GROUP_TURRET, true) 
  420.  
  421. 	-- Record the name of the new vehicle 
  422. 	VEHICLE_PLAYER_CAR = VEHICLE_TURRET 
  423.  
  424. end 
  425.  
  426. Rn02_call_received = false 
  427. function rn02_call_received() 
  428. 	Rn02_call_received = true 
  429. end 
  430.  
  431. function rn02_incoming_phone_call(conversation) 
  432. 	Rn02_call_received = false 
  433. 	mid_mission_phonecall("rn02_call_received") 
  434. 	while( not Rn02_call_received ) do 
  435. 		thread_yield() 
  436. 	end 
  437. 	audio_play_conversation( conversation, INCOMING_CALL) 
  438. end 
  439.  
  440. function rn02_initialize(rn02_checkpoint) 
  441.  
  442. 	rn02_initialize_common() 
  443.  
  444. 	rn02_initialize_checkpoint(rn02_checkpoint) 
  445.  
  446. 	mission_start_fade_in() 
  447.  
  448. end 
  449.  
  450. -- Initialization code shared by all checkpoints. 
  451. function rn02_initialize_common() 
  452.  
  453. 	-- Start trigger is hit...the activate button was hit 
  454. 	set_mission_author("Phillip Alexander") 
  455.  
  456. 	if coop_is_active() then 
  457. 		IN_COOP = true 
  458. 	end 
  459.  
  460. 	notoriety_set_max("Ronin",Max_notoriety_cell) 
  461. 	notoriety_set_max("Police", Max_notoriety_cell) 
  462.  
  463. 	Thread_vehicle_infinite_mass = thread_new("rn02_vehicle_infinite_mass") 
  464.  
  465. end 
  466.  
  467. -- Initialization code specific to the checkpoint. 
  468. function rn02_initialize_checkpoint(checkpoint) 
  469.  
  470. 	if (checkpoint == CHECKPOINT_START) then 
  471.  
  472. 		-- Setup the car dealer 
  473. 		turn_invulnerable(CHARACTER_CAR_DEALER, false) 
  474. 		on_death("rn02_dealer_died_failure", CHARACTER_CAR_DEALER) 
  475.  
  476. 		-- Setup the convertible that the player(s) will obtain from the car dealership. 
  477. 		set_unjackable_flag(VEHICLE_PLAYER_CAR, true) 
  478. 		set_max_hit_points(VEHICLE_PLAYER_CAR, get_max_hit_points(VEHICLE_PLAYER_CAR)*PLAYER_VEHICLE_HEALTH_MULTIPLIER) 
  479. 		on_vehicle_destroyed("rn02_vehicle_destroyed_failure",VEHICLE_PLAYER_CAR) 
  480. 		vehicle_never_flatten_tires(VEHICLE_PLAYER_CAR, true) 
  481.  
  482. 	elseif (checkpoint == CHECKPOINT_WEAPON_DEALER) then 
  483.  
  484. 		vehicle_never_flatten_tires(VEHICLE_PLAYER_CAR, true) 
  485.  
  486. 		-- Add convertible callbacks 
  487. 		on_vehicle_enter("rn02_convertible_entered", VEHICLE_PLAYER_CAR) 
  488. 		on_vehicle_exit("rn02_convertible_exited", VEHICLE_PLAYER_CAR) 
  489. 		on_vehicle_destroyed("rn02_vehicle_destroyed_failure",VEHICLE_PLAYER_CAR) 
  490.  
  491. 		-- Tell players to get in convertible if not already in it. 
  492. 		if	( character_is_in_vehicle(LOCAL_PLAYER, VEHICLE_PLAYER_CAR) ) then 
  493. 			Player_in_convertible[LOCAL_PLAYER] = true 
  494. 		else 
  495. 			local sync = SYNC_LOCAL 
  496. 			mission_help_table(HELPTEXT_PROMPT_ENTER_CAR, "", "", sync) 
  497. 			marker_add_vehicle(VEHICLE_PLAYER_CAR,MINIMAP_ICON_PROTECT_ACQUIRE,INGAME_EFFECT_VEHICLE_PROTECT_ACQUIRE,sync) 
  498. 		end 
  499. 		if (IN_COOP) then 
  500. 			if	( character_is_in_vehicle(REMOTE_PLAYER, VEHICLE_PLAYER_CAR) ) then 
  501. 				Player_in_convertible[REMOTE_PLAYER] = true 
  502. 			else 
  503. 				local sync = SYNC_REMOTE 
  504. 				mission_help_table(HELPTEXT_PROMPT_ENTER_CAR, "", "", sync) 
  505. 				marker_add_vehicle(VEHICLE_PLAYER_CAR,MINIMAP_ICON_PROTECT_ACQUIRE,INGAME_EFFECT_VEHICLE_PROTECT_ACQUIRE,sync) 
  506. 			end 
  507. 		end 
  508.  
  509. 		-- Make sure that prompt thread doesn't try to spit out any dealer prompts until 
  510. 		-- we actually send the players to the next dealer. 
  511. 		Current_dealer_complete = true 
  512.  
  513. 		-- Start prompt tracking 
  514. 		Thread_prompt_tracking = thread_new("rn02_prompt_tracking") 
  515.  
  516. 	elseif (checkpoint == CHECKPOINT_DRIVE) then 
  517.  
  518. 		group_hide(GROUP_PLAYER_CAR) 
  519. 		group_destroy(GROUP_PLAYER_CAR) 
  520.  
  521. 		-- Give the players the weapons that they received from the arms dealer 
  522. 		inv_weapon_add_temporary(LOCAL_PLAYER, FREE_WEAPON_GUN, 1, true) 
  523. 		inv_weapon_add_temporary(LOCAL_PLAYER, FREE_WEAPON_THROWN, 1, true) 
  524. 		if (IN_COOP) then 
  525. 			inv_weapon_add_temporary(REMOTE_PLAYER, FREE_WEAPON_GUN, 1, true) 
  526. 			inv_weapon_add_temporary(REMOTE_PLAYER, FREE_WEAPON_THROWN, 1, true) 
  527. 		end 
  528. 		Weapons_received	= true 
  529.  
  530. 		rn02_swap_vehicles() 
  531.  
  532. 		-- Place the correct people in the vehicle 
  533. 		rn02_setup_convertible_occupants() 
  534.  
  535. 		-- Prepare the convertible 
  536. 		rn02_setup_convertible_for_turret() 
  537.  
  538. 		-- Start the chase and ambush threads 
  539. 		rn02_setup_chases_and_ambushes() 
  540. 	end 
  541.  
  542. end 
  543.  
  544. function rn02_car_dealer() 
  545.  
  546. 	-- spawn the vehicle dealer, send the player his way 
  547. 	Thread_dealer = thread_new("rn02_setup_and_process_dealer_thread", CHARACTER_CAR_DEALER, nil,  
  548. 										HELPTEXT_PROMPT_CAR_DEALERSHIP) 
  549. 	 
  550. 	-- add a minimap icon and in game effect for the dealer trigger 
  551. 	marker_add_npc(CHARACTER_CAR_DEALER,MINIMAP_ICON_LOCATION,INGAME_EFFECT_NPC_INTERACT,SYNC_ALL) 
  552. 	mission_waypoint_add( CHARACTER_CAR_DEALER, SYNC_ALL) 
  553.  
  554. 	-- make the convertible invulnerable until the dealer's trigger is hit 
  555. 	turn_invulnerable(VEHICLE_PLAYER_CAR, false) 
  556. 	vehicle_prevent_explosion_fling(VEHICLE_PLAYER_CAR, true)  
  557.  
  558. 	while (not Current_dealer_complete) do 
  559. 		thread_yield() 
  560. 	end 
  561. 	thread_kill(Thread_dealer) 
  562.  
  563. 	-- make the dealer vulnerable 
  564. 	turn_vulnerable(CHARACTER_CAR_DEALER) 
  565.  
  566. 	-- make the convertible invulnerable until the dealer's trigger is hit 
  567. 	turn_vulnerable(VEHICLE_PLAYER_CAR) 
  568. 	vehicle_prevent_explosion_fling(VEHICLE_PLAYER_CAR, false)  
  569.  
  570. 	on_vehicle_enter("rn02_convertible_entered", VEHICLE_PLAYER_CAR) 
  571. 	on_vehicle_exit("rn02_convertible_exited", VEHICLE_PLAYER_CAR) 
  572.  
  573. 	-- Tell the player(s) to get in the convertible 
  574. 	mission_help_table(HELPTEXT_PROMPT_ENTER_CAR) 
  575. 	marker_add_vehicle(VEHICLE_PLAYER_CAR,MINIMAP_ICON_PROTECT_ACQUIRE,INGAME_EFFECT_VEHICLE_PROTECT_ACQUIRE,SYNC_ALL) 
  576. 	set_unjackable_flag(VEHICLE_PLAYER_CAR, false) 
  577.  
  578. 	-- Start prompt tracking 
  579. 	Thread_prompt_tracking = thread_new("rn02_prompt_tracking") 
  580. 	if IN_COOP then 
  581. 		Thread_delayed_release = thread_new("rn02_delayed_release_to_world", GROUP_CAR_DEALER, GROUP_START_CAR, GROUP_START_CAR_COOP) 
  582. 	else 
  583. 		Thread_delayed_release = thread_new("rn02_delayed_release_to_world", GROUP_CAR_DEALER, GROUP_START_CAR) 
  584. 	end 
  585.  
  586. end 
  587.  
  588. -- The current repair trigger 
  589. Current_repair_trigger = {[LOCAL_PLAYER] = "", [REMOTE_PLAYER] = ""} 
  590. Current_repair_waypoint_suppressed = {[LOCAL_PLAYER] = false, [REMOTE_PLAYER] = false} 
  591.  
  592. -- The current prompt mode 
  593. PROMPT_MODE_NONE = 0 
  594. PROMPT_MODE_CONVERTIBLE = 1 
  595. PROMPT_MODE_REPAIR = 2 
  596. PROMPT_MODE_DEALER = 3 
  597. Current_prompt_mode = {	[LOCAL_PLAYER] = PROMPT_MODE_CONVERTIBLE, [REMOTE_PLAYER] = PROMPT_MODE_CONVERTIBLE, } 
  598.  
  599. Last_displayed_dealer_helptext = "" 
  600. function rn02_prompt_tracking() 
  601.  
  602. 	-- Does the convertible need to be repaired? 
  603. 	local function rn02_should_repair_convertible() 
  604. 		if(Current_dealer == CHARACTER_FENCE) then 
  605. 			if (vehicle_is_destroyed(VEHICLE_PLAYER_CAR)) then 
  606. 				return false 
  607. 			end 
  608. 			if (get_current_hit_points(VEHICLE_PLAYER_CAR)/get_max_hit_points(VEHICLE_PLAYER_CAR) < .8) then 
  609. 				return true 
  610. 			end 
  611. 		end 
  612. 	end 
  613.  
  614. 	-- Get the new prompt mode for a player 
  615. 	local function rn02_get_new_prompt_mode(player) 
  616.  
  617. 		if (Current_dealer_complete == true) then 
  618. 			return PROMPT_MODE_NONE 
  619. 		end 
  620.  
  621.  
  622. 		-- For most dealers, we only care that the player is close to the dealer 
  623. 		local dist_to_dealer = get_dist(player, Current_dealer) 
  624.  
  625. 		-- For the fence, we also care that the car is close to the dealer 
  626. 		if ( (not vehicle_is_destroyed(VEHICLE_PLAYER_CAR)) and (Current_dealer == CHARACTER_FENCE)) then 
  627. 			dist_to_dealer = max(dist_to_dealer, get_dist(VEHICLE_PLAYER_CAR, Current_dealer)) 
  628. 		end 
  629. 		local close_to_dealer = (dist_to_dealer < PROXIMITY_THRESHOLD) 
  630. 		local should_repair = rn02_should_repair_convertible() 
  631.  
  632. 		if ( not Player_in_convertible[player] ) then 
  633. 			if ( should_repair or (not close_to_dealer) ) then 
  634. 				return PROMPT_MODE_CONVERTIBLE 
  635. 			end 
  636. 		end 
  637.  
  638. 		if (should_repair) then			 
  639. 			return PROMPT_MODE_REPAIR 
  640. 		end 
  641.  
  642. 		return PROMPT_MODE_DEALER 
  643.  
  644. 	end 
  645.  
  646. 	local wrong_car_threads =  
  647. 		{	[LOCAL_PLAYER] = -1,	[REMOTE_PLAYER] = -1,} 
  648.  
  649. 	wrong_car_threads[LOCAL_PLAYER] = thread_new("rn02_wrong_car_message", LOCAL_PLAYER) 
  650. 	if(IN_COOP) then 
  651. 		wrong_car_threads[REMOTE_PLAYER] = thread_new("rn02_wrong_car_message", REMOTE_PLAYER) 
  652. 	end 
  653.  
  654. 	-- Store previous dealer helptext so that we can switch prompts if the player 
  655. 	-- talks to the dealer from inside of the convertible. 
  656. 	local previous_dealer_helptext = Current_dealer_helptext 
  657. 	local previous_dealer = Current_dealer 
  658.  
  659. 	-- Remove prompt mode's indicators 
  660. 	local function rn02_remove_prompts(player, current_prompt_mode) 
  661.  
  662. 		local sync = PLAYER_SYNC[player] 
  663. 		 
  664. 		if(current_prompt_mode == PROMPT_MODE_REPAIR) then 
  665. 			if(Current_repair_trigger[player] ~= "") then 
  666. 				marker_remove_navpoint(Current_repair_trigger[player], sync) 
  667. 				mission_waypoint_remove(sync) 
  668. 				Current_repair_trigger[player] = "" 
  669. 			end 
  670. 		elseif(current_prompt_mode == PROMPT_MODE_CONVERTIBLE) then 
  671.  
  672. 			-- Stop warning player if they enter the wrong vehilce 
  673. 			if(wrong_car_threads[player] ~= -1) then 
  674. 				thread_kill(wrong_car_threads[player]) 
  675. 				wrong_car_threads[player] = -1 
  676. 			end 
  677.  
  678. 			-- remove existing waypoint, marker 
  679. 			marker_remove_vehicle(VEHICLE_PLAYER_CAR,sync) 
  680. 			mission_waypoint_remove(sync) 
  681.  
  682. 		else -- PROMPT_MODE_DEALER 
  683. 			marker_remove_npc(Current_dealer,sync) 
  684. 			mission_waypoint_remove(sync)		 
  685. 		end 
  686. 	end 
  687.  
  688. 	-- Add prompts for a new mode 
  689. 	local function rn02_add_prompts(player, new_prompt_mode) 
  690.  
  691. 		local sync = PLAYER_SYNC[player] 
  692.  
  693. 		if(new_prompt_mode == PROMPT_MODE_REPAIR) then 
  694.  
  695. 			Current_repair_trigger[player] = "" 
  696. 			Current_repair_waypoint_suppressed[player] = false 
  697.  
  698. 			-- All indicators are added in the mode's update function 
  699. 			mission_help_table_nag(HELPTEXT_PROMPT_REPAIR_CAR) 
  700.  
  701. 		elseif(new_prompt_mode == PROMPT_MODE_CONVERTIBLE) then 
  702. 			-- Tell the player to get in the car 
  703. 			mission_help_table_nag(HELPTEXT_PROMPT_REENTER_CAR, "", "", sync) 
  704.  
  705. 			-- Warn them if they get in the wrong car 
  706. 			wrong_car_threads[player] = thread_new("rn02_wrong_car_message", player) 
  707.  
  708. 			-- Add markers to the car 
  709. 			marker_add_vehicle(VEHICLE_PLAYER_CAR,MINIMAP_ICON_PROTECT_ACQUIRE,INGAME_EFFECT_VEHICLE_PROTECT_ACQUIRE,sync) 
  710. 			mission_waypoint_add(VEHICLE_PLAYER_CAR, sync ) 
  711.  
  712. 		else -- PROMPT_MODE_DEALER 
  713.  
  714. 			-- add a minimap icon and in-game effect for the dealer trigger 
  715. 			marker_add_npc(Current_dealer,MINIMAP_ICON_LOCATION,INGAME_EFFECT_NPC_INTERACT,sync) 
  716. 			mission_waypoint_add(Current_dealer, sync ) 
  717.  
  718. 			-- Tell the player what to do next 
  719. 			if (Last_displayed_dealer_helptext == Current_dealer_helptext) then 
  720. 				mission_help_table_nag(Current_dealer_helptext, "", "", sync) 
  721. 			else 
  722. 				mission_help_table(Current_dealer_helptext, "", "", sync) 
  723. 				Last_displayed_dealer_helptext = Current_dealer_helptext 
  724. 			end 
  725. 		end		 
  726.  
  727. 	end 
  728.  
  729. 	local function rn02_update_mode(player, prompt_mode) 
  730.  
  731. 		local sync = PLAYER_SYNC[player] 
  732.  
  733. 		if(prompt_mode == PROMPT_MODE_REPAIR) then 
  734.  
  735. 			local new_repair_trigger = player_get_nearest_trigger_of_type("car mechanic", player, false) 
  736.  
  737. 			-- The closest repair trigger changed. 
  738. 			if (new_repair_trigger ~= Current_repair_trigger[player]) then 
  739.  
  740. 				-- Remove old indicators 
  741. 				if(Current_repair_trigger[player] ~= "") then 
  742. 					marker_remove_navpoint(Current_repair_trigger[player], sync) 
  743. 					mission_waypoint_remove(sync) 
  744. 				end 
  745.  
  746. 				-- Add new indicators 
  747. 				if(new_repair_trigger ~= "") then 
  748. 					marker_add_navpoint(new_repair_trigger, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, sync) 
  749. 					if (get_dist(new_repair_trigger, player) < 50) then 
  750. 						mission_waypoint_add(new_repair_trigger, sync) 
  751. 						Current_repair_waypoint_suppressed[player] = false 
  752. 					else 
  753. 						Current_repair_waypoint_suppressed[player] = true 
  754. 					end 
  755. 				end 
  756. 				Current_repair_trigger[player] = new_repair_trigger 
  757.  
  758. 			-- The closest trigger didn't change, see if we need to start/stop suppressing the repair trigger 
  759. 			-- waypoints. 
  760. 			elseif(Current_repair_trigger[player] ~= "") then 
  761.  
  762. 				local should_suppress_waypoint = (get_dist(new_repair_trigger, player) < 50) 
  763.  
  764. 				if (should_suppress_waypoint ~= Current_repair_waypoint_suppressed[player]) then 
  765.  
  766. 					if (should_suppress_waypoint) then 
  767. 						mission_waypoint_remove(sync) 
  768. 					else 
  769. 						mission_waypoint_add(new_repair_trigger, sync) 
  770. 					end 
  771.  
  772. 					Current_repair_waypoint_suppressed[player] = should_suppress_waypoint 
  773. 				end 
  774.  
  775. 			end 
  776.  
  777. 		elseif(prompt_mode == PROMPT_MODE_CONVERTIBLE) then 
  778. 		else -- PROMPT_MODE_DEALER 
  779.  
  780. 			if (previous_dealer_helptext ~= Current_dealer_helptext) then 
  781. 				-- add a minimap icon and in game effect for the dealer trigger 
  782. 				marker_add_npc(Current_dealer,MINIMAP_ICON_LOCATION,INGAME_EFFECT_NPC_INTERACT,sync) 
  783. 				mission_waypoint_add(Current_dealer, sync ) 
  784.  
  785. 				-- Tell the player what to do next 
  786. 				if (Last_displayed_dealer_helptext == Current_dealer_helptext) then 
  787. 					mission_help_table_nag(Current_dealer_helptext, "", "", sync) 
  788. 				else 
  789. 					mission_help_table(Current_dealer_helptext, "", "", sync) 
  790. 					Last_displayed_dealer_helptext = Current_dealer_helptext 
  791. 				end 
  792.  
  793. 			end 
  794.  
  795. 		end	 
  796.  
  797. 	end 
  798.  
  799. 	local function rn02_update_player_prompts(player) 
  800.  
  801. 		local sync = PLAYER_SYNC[player] 
  802. 		local new_prompt_mode = rn02_get_new_prompt_mode(player) 
  803. 	 
  804. 		-- If the prompt mode has changed, remove the old prompts and add new ones 
  805. 		if (new_prompt_mode ~= Current_prompt_mode[player]) then 
  806. 			rn02_remove_prompts(player, Current_prompt_mode[player]) 
  807. 			rn02_add_prompts(player, new_prompt_mode) 
  808. 			Current_prompt_mode[player] = new_prompt_mode 
  809.  
  810. 		-- If we were in dealer prompt mode and the dealer changes, then update prompts 
  811. 		else 
  812. 			rn02_update_mode(player, Current_prompt_mode[player]) 
  813. 		end 
  814. 	 
  815. 	end -- local function rn02_update_player_prompts(player) 
  816.  
  817. 	while (true) do 
  818.  
  819. 		if (Current_dealer_complete ~= true) then 
  820.  
  821. 			rn02_update_player_prompts(LOCAL_PLAYER) 
  822. 			if (IN_COOP) then 
  823. 				rn02_update_player_prompts(REMOTE_PLAYER) 
  824. 			end 
  825.  
  826. 			previous_dealer_helptext = Current_dealer_helptext 
  827. 			previous_dealer = Current_dealer 
  828.  
  829. 		end 
  830.  
  831. 		thread_yield() 
  832. 	end 
  833. end 
  834.  
  835. -- This function is started whenever the Convertible prompt is displayed. 
  836. function rn02_wrong_car_message(player) 
  837.  
  838. 	local previous_car = "" 
  839.  
  840. 	while(true) do 
  841.  
  842. 		-- Warn the player if they've entered a new incorrect vehicle. 
  843. 		local current_car = get_char_vehicle_name(player) 
  844.  
  845. 		-- Don't tell the player that they're in the wrong vehicle if they're in the convertible!. 
  846. 		if(current_car == VEHICLE_PLAYER_CAR) then 
  847. 			previous_car = "" 
  848. 		elseif (current_car ~= previous_car) then 
  849. 			previous_car = current_car 
  850. 			if(current_car ~= "") then 
  851. 				mission_help_table_nag(HELPTEXT_PROMPT_WRONG_CAR, "", "", PLAYER_SYNC[player]) 
  852. 			end 
  853. 		end		 
  854.  
  855. 		thread_yield() 
  856.  
  857. 	end 
  858. end 
  859.  
  860. function rn02_convertible_entered(player) 
  861. 	Player_in_convertible[player] = true 
  862. end 
  863.  
  864. function rn02_convertible_exited(player) 
  865. 	Player_in_convertible[player] = false 
  866. end 
  867.  
  868. function rn02_clothing_dealer() 
  869. 	-- spawn the vehicle dealer, send the player his way 
  870. 	Thread_dealer = thread_new("rn02_setup_and_process_dealer_thread", CHARACTER_CLOTHING_DEALER, GROUP_CLOTHING_DEALER,  
  871. 										HELPTEXT_PROMPT_CLOTHING_DEALER) 
  872.  
  873. 	thread_new("rn02_warning_call") 
  874. 	thread_new("rn02_bump_notoriety") 
  875.  
  876. 	delay(15) 
  877.  
  878. 	audio_play_conversation( WARNING_CONVERSATION, INCOMING_CALL)	 
  879.  
  880. 	notoriety_set("Ronin", Min_notoriety_cell) 
  881. 	notoriety_set_min("Ronin",Min_notoriety_cell) 
  882. 	notoriety_set_max("Ronin",Max_notoriety_cell) 
  883.  
  884. 	while (not Current_dealer_complete) do 
  885. 		thread_yield() 
  886. 	end 
  887.  
  888. 	-- don the outfit 
  889. 	local dist, player = get_dist_closest_player_to_object(CHARACTER_CLOTHING_DEALER) 
  890. 	Clothing_dealer_player = player 
  891.  
  892. 	turn_invulnerable(Clothing_dealer_player) 
  893. 	player_controls_disable(Clothing_dealer_player) 
  894.  
  895. 	fade_out(0.0,{0,0,0}, SYNC_ALL) 
  896.  
  897. 	customization_item_wear(FREE_CLOTHING_NAME,FREE_CLOTHING_WEAR_OPTION,FREE_CLOTHING_VARIANT_NAME, PLAYER_SYNC[player]) 
  898. 	audio_play_conversation( CLOTHING_CONVERSATION)	 
  899.  
  900. 	turn_vulnerable(Clothing_dealer_player) 
  901. 	player_controls_enable(Clothing_dealer_player) 
  902.  
  903. 	fade_in(1.0, SYNC_ALL) 
  904.  
  905. 	-- make the dealer vulnerable 
  906. 	turn_vulnerable(CHARACTER_CLOTHING_DEALER) 
  907. 	release_to_world(GROUP_CLOTHING_DEALER) 
  908.  
  909. 	thread_kill(Thread_dealer) 
  910. end 
  911.  
  912. function rn02_weapon_dealer() 
  913. 	 
  914. 	-- spawn the vehicle dealer, send the player his way 
  915. 	Thread_dealer = thread_new("rn02_setup_and_process_dealer_thread", CHARACTER_WEAPON_DEALER, GROUP_WEAPON_DEALER,  
  916. 										HELPTEXT_PROMPT_WEAPON_DEALER) 
  917.  
  918. 	thread_new("rn02_warning_call") 
  919. 	thread_new("rn02_bump_notoriety") 
  920.  
  921. 	while (not Current_dealer_complete) do 
  922. 		thread_yield() 
  923. 	end 
  924.  
  925. 	-- Give the players the temp. weapons 
  926. 	inv_weapon_add_temporary(LOCAL_PLAYER, FREE_WEAPON_GUN, 1, true) 
  927. 	inv_weapon_add_temporary(LOCAL_PLAYER, FREE_WEAPON_THROWN, 1, true) 
  928. 	if (not character_is_in_a_driver_seat(LOCAL_PLAYER)) then 
  929. 		inv_item_equip(FREE_WEAPON_GUN,LOCAL_PLAYER) 
  930. 	end 
  931. 	if (IN_COOP) then 
  932. 		inv_weapon_add_temporary(REMOTE_PLAYER, FREE_WEAPON_GUN, 1, true) 
  933. 		inv_weapon_add_temporary(REMOTE_PLAYER, FREE_WEAPON_THROWN, 1, true) 
  934. 		if (not character_is_in_a_driver_seat(REMOTE_PLAYER)) then 
  935. 			inv_item_equip(FREE_WEAPON_GUN,REMOTE_PLAYER) 
  936. 		end		 
  937. 	end 
  938. 	Weapons_received	= true 
  939.  
  940. 	-- make the dealer vulnerable 
  941. 	turn_vulnerable(CHARACTER_WEAPON_DEALER) 
  942. 	release_to_world(GROUP_WEAPON_DEALER) 
  943.  
  944. 	--action_play(CHARACTER_WEAPON_DEALER, "compliment C", nil, true, 0.5, true) 
  945. 	--thread_new("rn02_weapon_dealer_leave_and_release") 
  946.  
  947. 	thread_kill(Thread_dealer) 
  948. end 
  949.  
  950. function rn02_warning_call() 
  951. 	delay(10) 
  952. 	rn02_incoming_phone_call( WARNING_CONVERSATION) 
  953.  
  954. end 
  955.  
  956. function rn02_bump_notoriety() 
  957. 	delay(25) 
  958.  
  959. 	notoriety_set_min("Ronin",Min_notoriety_cell) 
  960. 	notoriety_set_max("Ronin",Max_notoriety_cell) 
  961.  
  962. end 
  963.  
  964.  
  965. function rn02_weapon_dealer_leave_and_release() 
  966. 	vehicle_enter(CHARACTER_WEAPON_DEALER, VEHICLE_WEAPON_DEALER) 
  967.  
  968. 	local dist, player = get_dist_closest_player_to_object(VEHICLE_WEAPON_DEALER) 
  969. 	vehicle_flee(VEHICLE_WEAPON_DEALER, player) 
  970.  
  971. 	delay(10) 
  972.  
  973. 	release_to_world(GROUP_WEAPON_DEALER) 
  974. end 
  975.  
  976. function rn02_fence() 
  977. 	 
  978. 	-- spawn the vehicle dealer, send the player on his way 
  979. 	Thread_dealer = thread_new("rn02_setup_and_process_dealer_thread", CHARACTER_FENCE, GROUP_FENCE,  
  980. 										HELPTEXT_PROMPT_FENCE) 
  981.  
  982. 	while (not Current_dealer_complete) do 
  983. 		thread_yield() 
  984. 	end 
  985. 	 
  986. 	party_dismiss_all() 
  987. 		 
  988. 	-- make the fence part of the player's party 
  989. 	party_add(CHARACTER_FENCE,LOCAL_PLAYER) 
  990. 	turn_vulnerable(CHARACTER_FENCE) 
  991.  
  992. 	thread_kill(Thread_dealer) 
  993.  
  994. end 
  995.  
  996. function rn02_setup_convertible_occupants() 
  997.  
  998. 	-- Make sure that no random ped or vehicle spawns obstruct our vehicle 
  999. 	spawning_pedestrians(false, true) 
  1000. 	spawning_vehicles(false) 
  1001.  
  1002. 	thread_kill(Thread_vehicle_infinite_mass) 
  1003.  
  1004. 	-- Teleport the players to a staging area, removing them from vehicles along the way. 
  1005. 	teleport_coop(NAVPOINT_LOCAL_CONVERTIBLE_STAGING, NAVPOINT_REMOTE_CONVERTIBLE_STAGING, true) 
  1006.  
  1007. 	-- Dismiss any extra followers and put Johnny Gat and the homie in the player's party 
  1008. 	party_dismiss_all()  
  1009. 	party_add(CHARACTER_FENCE,LOCAL_PLAYER) 
  1010.  
  1011. 	set_unjackable_flag(VEHICLE_PLAYER_CAR, false) 
  1012. 	follower_make_independent(CHARACTER_FENCE, true) 
  1013.  
  1014. 	vehicle_enter_teleport(CHARACTER_FENCE,VEHICLE_PLAYER_CAR,0) 
  1015. 	vehicle_enter_teleport(LOCAL_PLAYER,VEHICLE_PLAYER_CAR,1) 
  1016. 	if IN_COOP then 
  1017. 		vehicle_enter_teleport(REMOTE_PLAYER,VEHICLE_PLAYER_CAR,2) 
  1018. 	end 
  1019.  
  1020. 	rn02_wait_for_vehicle_entry(CHARACTER_FENCE, VEHICLE_PLAYER_CAR, 0) 
  1021. 	rn02_wait_for_vehicle_entry(LOCAL_PLAYER, VEHICLE_PLAYER_CAR, 1) 
  1022.  
  1023. 	if (IN_COOP) then 
  1024. 		rn02_wait_for_vehicle_entry(REMOTE_PLAYER, VEHICLE_PLAYER_CAR, 2) 
  1025. 		delay(1.0) 
  1026. 	end 
  1027.  
  1028. 	-- Reenable ped and vehicle spawning 
  1029. 	spawning_pedestrians(true, true) 
  1030. 	spawning_vehicles(true)	 
  1031.  
  1032. end 
  1033.  
  1034.  
  1035. -- Wait for a character to enter a vehicle. Blocks  
  1036. function rn02_wait_for_vehicle_entry(character, vehicle, seat_index) 
  1037.  
  1038. 	local delay_length = 0.25 
  1039. 	if (character == REMOTE_PLAYER) then 
  1040. 		delay_length = 0.5 
  1041. 	end 
  1042.  
  1043. 	local teleport_attempts = 1 
  1044. 	while( (not character_is_in_vehicle(character, vehicle)) and (teleport_attempts < 5) ) do 
  1045. 		teleport_attempts = teleport_attempts + 1 
  1046. 		vehicle_enter_teleport(character, vehicle, seat_index) 
  1047. 		delay(delay_length) 
  1048. 	end 
  1049.  
  1050. end 
  1051.  
  1052. function rn02_setup_convertible_for_turret() 
  1053.  
  1054. 	-- Make sure that the on_destroyed callback is still active 
  1055. 	on_vehicle_destroyed("rn02_vehicle_destroyed_failure",VEHICLE_PLAYER_CAR) 
  1056.  
  1057. 	-- Prepare the vehicle for turreting 
  1058. 	vehicle_set_torque_multiplier(VEHICLE_PLAYER_CAR, 1.2) 
  1059. 	vehicle_prevent_explosion_fling(VEHICLE_PLAYER_CAR,true) 
  1060. 	vehicle_set_allow_ram_ped(VEHICLE_PLAYER_CAR,true) 
  1061. 	vehicle_set_crazy(VEHICLE_PLAYER_CAR,true) 
  1062. 	--vehicle_set_use_short_cuts(VEHICLE_PLAYER_CAR, true) 
  1063. 	vehicle_infinite_mass(VEHICLE_PLAYER_CAR, true) 
  1064. 	vehicle_disable_flee(VEHICLE_PLAYER_CAR, true) 
  1065. 	vehicle_disable_chase(VEHICLE_PLAYER_CAR, true) 
  1066. 	vehicle_never_flatten_tires(VEHICLE_PLAYER_CAR, true) 
  1067. 	set_unjackable_flag(VEHICLE_PLAYER_CAR, true) 
  1068.  
  1069. 	-- make sure the fence doesn't get out of the car 
  1070. 	vehicle_suppress_npc_exit(VEHICLE_PLAYER_CAR,true) 
  1071. 	set_seatbelt_flag(CHARACTER_FENCE,true) 
  1072.  
  1073. 	-- Player(s) can not enter/exit vehicles 
  1074. 	set_player_can_enter_exit_vehicles(LOCAL_PLAYER, false) 
  1075. 	if (IN_COOP) then 
  1076. 		set_player_can_enter_exit_vehicles(REMOTE_PLAYER, false) 
  1077. 	end 
  1078.  
  1079. 	inv_item_equip(FREE_WEAPON_GUN,LOCAL_PLAYER) 
  1080. 	if (IN_COOP) then 
  1081. 		inv_item_equip(FREE_WEAPON_GUN,REMOTE_PLAYER) 
  1082. 	end 
  1083.  
  1084. end 
  1085.  
  1086. function rn02_safe_house() 
  1087.  
  1088. 	-- Start a thread to handle the fence's dialogue during the drive. 
  1089. 	thread_new("rn02_fence_drive_dialogue") 
  1090.  
  1091. 	-- tell the player to protect the fence	 
  1092. 	mission_help_table(HELPTEXT_PROMPT_PROTECT_FENCE) 
  1093.  
  1094. 	-- Set notoriety levels 
  1095. 	notoriety_set_max("Ronin",Max_notoriety_fence) 
  1096. 	notoriety_set_min("Ronin",Min_notoriety_fence) 
  1097. 	notoriety_set("Ronin", Min_notoriety_fence) 
  1098. 	 
  1099. 	marker_add_navpoint(TRIGGER_SAFE_HOUSE, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  1100.  
  1101. 	-- increase the speed of the convertible 
  1102. 	vehicle_speed_override(VEHICLE_PLAYER_CAR, CONVERTIBLE_MAX_SPEED) 
  1103.  
  1104. 	-- drive to just before the first roadblock in turret mode 
  1105. 	vehicle_turret_base_to(VEHICLE_PLAYER_CAR, "rn02_$n001",false) 
  1106.  
  1107. 	-- Blast through the roadblock 
  1108. 	local normal_max_speed = vehicle_get_max_speed(VEHICLE_PLAYER_CAR) 
  1109. 	vehicle_max_speed(VEHICLE_PLAYER_CAR, 80) 
  1110. 	vehicle_speed_override(VEHICLE_PLAYER_CAR, 80) 
  1111. 	vehicle_ignore_repulsors(VEHICLE_PLAYER_CAR, true) 
  1112.  
  1113. 	vehicle_turret_base_to(VEHICLE_PLAYER_CAR, "rn02_$n002", false) 
  1114.  
  1115. 	-- Return to somewhat normal driving 
  1116. 	vehicle_speed_cancel(VEHICLE_PLAYER_CAR) 
  1117. 	vehicle_max_speed(VEHICLE_PLAYER_CAR, normal_max_speed) 
  1118.  
  1119. 	-- Use navmesh pathfinding to drive on grass while cutting a corner 
  1120. 	vehicle_pathfind_to(VEHICLE_PLAYER_CAR,"rn02_$n009", true, false) 
  1121.  
  1122. 	-- Stop ignoring repulsors now 
  1123. 	vehicle_ignore_repulsors(VEHICLE_PLAYER_CAR, false) 
  1124.  
  1125. 	-- drive to the safe house in turret mode 
  1126. 	vehicle_turret_base_to(VEHICLE_PLAYER_CAR, TRIGGER_SAFE_HOUSE,true) 
  1127.  
  1128. end 
  1129.  
  1130. function rn02_fence_drive_dialogue() 
  1131.  
  1132. 	local dialogue_info =	 
  1133. 		{	 
  1134. 			[.70] = FENCE_PISSMOAN_CONVERSATION, 
  1135. 			[.40] = FENCE_BITCHMOAN_CONVERSATION, 
  1136. 			[.20] = FENCE_FINAL_CONVERSATION, 
  1137. 		} 
  1138.  
  1139. 	local total_dist = get_dist(CHARACTER_FENCE, TRIGGER_SAFE_HOUSE) 
  1140. 	local current_dist = total_dist 
  1141.  
  1142. 	for dist_ratio, conversation in pairs(dialogue_info) do 
  1143.  
  1144. 		local dialogue_dist = current_dist * dist_ratio 
  1145.  
  1146. 		while(current_dist > dialogue_dist) do 
  1147.  
  1148. 			-- Don't want to measure the distance to a dead dude. 
  1149. 			if ( character_is_dead(CHARACTER_FENCE) ) then 
  1150. 				return 
  1151. 			end 
  1152.  
  1153. 			current_dist = get_dist(CHARACTER_FENCE, TRIGGER_SAFE_HOUSE) 
  1154. 			thread_yield() 
  1155. 		end 
  1156.  
  1157. 		audio_play_conversation(conversation) 
  1158.  
  1159. 	end 
  1160.  
  1161. end 
  1162.  
  1163. -- Cleanup mission 
  1164. function rn02_cleanup() 
  1165.  
  1166. 	IN_COOP = coop_is_active() 
  1167.  
  1168. 	-- remove vehicle callbacks 
  1169. 	on_vehicle_destroyed("",VEHICLE_PLAYER_CAR) 
  1170. 	on_vehicle_enter("", VEHICLE_PLAYER_CAR) 
  1171. 	on_vehicle_exit("", VEHICLE_PLAYER_CAR) 
  1172.  
  1173. 	group_destroy(GROUP_PLAYER_CAR) 
  1174. 	group_destroy(GROUP_TURRET) 
  1175.  
  1176. 	mid_mission_phonecall_reset() 
  1177.  
  1178. 	-- remove minimap icons and ingame effects from dealers 
  1179. 	marker_remove_npc(CHARACTER_CAR_DEALER) 
  1180. 	marker_remove_npc(CHARACTER_CLOTHING_DEALER) 
  1181. 	marker_remove_npc(CHARACTER_WEAPON_DEALER) 
  1182. 	marker_remove_npc(CHARACTER_FENCE) 
  1183.  
  1184. 	-- remove minimap icon from final destination 
  1185. 	marker_remove_navpoint(TRIGGER_SAFE_HOUSE) 
  1186.  
  1187. 	if (Current_repair_trigger[LOCAL_PLAYER] ~= "") then 
  1188. 		marker_remove_navpoint(Current_repair_trigger[LOCAL_PLAYER], SYNC_LOCAL) 
  1189. 	end 
  1190.  
  1191. 	if (Current_repair_trigger[REMOTE_PLAYER] ~= "") then 
  1192. 		marker_remove_navpoint(Current_repair_trigger[REMOTE_PLAYER], SYNC_REMOTE) 
  1193. 	end 
  1194.  
  1195. 	mission_waypoint_remove(SYNC_ALL) 
  1196.  
  1197. 	-- remover dealer callbacks 
  1198. 	on_death("", CHARACTER_FENCE) 
  1199. 	on_death("", CHARACTER_CAR_DEALER) 
  1200. 	on_death("", CHARACTER_CLOTHING_DEALER) 
  1201. 	on_death("", CHARACTER_WEAPON_DEALER) 
  1202.  
  1203. 	-- Kill all secondary threads 
  1204. 	for i, thread in pairs(Table_all_threads) do 
  1205. 		thread_kill(thread) 
  1206. 	end 
  1207.  
  1208. 	if (npc_is_in_party(CHARACTER_FENCE)) then 
  1209. 		npc_stop_following(CHARACTER_FENCE) 
  1210. 	end 
  1211.  
  1212. 	-- put the player's regular clothes back on 
  1213. 	customization_item_revert(SYNC_LOCAL) 
  1214. 	if(IN_COOP) then 
  1215. 		customization_item_revert(SYNC_REMOTE) 
  1216. 	end 
  1217.  
  1218. 	-- revert the player's weapons 
  1219. 	if (Weapons_received) then 
  1220. 		inv_weapon_remove_temporary(LOCAL_PLAYER, FREE_WEAPON_GUN) 
  1221. 		inv_weapon_remove_temporary(LOCAL_PLAYER, FREE_WEAPON_THROWN) 
  1222. 		if ( IN_COOP ) then 
  1223. 			inv_weapon_remove_temporary(REMOTE_PLAYER, FREE_WEAPON_GUN) 
  1224. 			inv_weapon_remove_temporary(REMOTE_PLAYER, FREE_WEAPON_THROWN) 
  1225. 		end 
  1226. 	end 
  1227.  
  1228. 	-- disable all triggers, remove callbacks 
  1229. 	for i, trigger in pairs(TABLE_ALL_TRIGGERS) do 
  1230. 		on_trigger("",trigger) 
  1231. 		trigger_enable(trigger,false) 
  1232. 	end 
  1233.  
  1234. 	-- Player(s) can enter/exit vehicles 
  1235. 	set_player_can_enter_exit_vehicles(LOCAL_PLAYER, true) 
  1236. 	if (IN_COOP) then 
  1237. 		set_player_can_enter_exit_vehicles(REMOTE_PLAYER, true) 
  1238. 	end 
  1239.  
  1240. 	-- Reenable ped and vehicle spawning 
  1241. 	spawning_pedestrians(true) 
  1242. 	spawning_vehicles(true)	 
  1243.  
  1244. end 
  1245.  
  1246. function rn02_success() 
  1247. 	-- Called when the mission has ended with success 
  1248. end 
  1249.  
  1250. function rn02_complete() 
  1251.  
  1252. 	-- Make sure that the mid-mission phonecall is reset before the story cutscene plays. 
  1253. 	mid_mission_phonecall_reset() 
  1254. 	 
  1255.  
  1256. 	-- End the mission with success 
  1257. 	mission_end_success("rn02", "ro02-02", {NAVPOINT_LOCAL_SUCCESS, NAVPOINT_REMOTE_SUCCESS}) 
  1258. end 
  1259.  
  1260. -- MISSION FUNCTIONS ---------------------------------------- 
  1261. function rn02_setup_and_process_dealer_thread(character_dealer,group_dealer, helptext_prompt, helptext_dialogue) 
  1262.  
  1263. 	-- Store current dealer, helptext for prompt tracking 
  1264. 	Current_dealer = character_dealer 
  1265. 	Current_dealer_helptext = helptext_prompt 
  1266.  
  1267. 	-- haven't reached the dealer yet 
  1268. 	Current_dealer_complete = false 
  1269. 	 
  1270. 	-- create the dealer's group 
  1271. 	if (group_dealer ~= nil) then 
  1272. 		group_create(group_dealer, true) 
  1273. 	end 
  1274.  
  1275. 	-- Add the failure function, set some flags 
  1276. 	if (Current_dealer == CHARACTER_FENCE) then 
  1277. 		on_death("rn02_fence_died_failure", Current_dealer) 
  1278. 	else 
  1279. 		on_death("rn02_dealer_died_failure", Current_dealer) 
  1280. 	end 
  1281. 	set_unrecruitable_flag(character_dealer, true) 
  1282. 	set_cant_flee_flag(Current_dealer, true) 
  1283. 	turn_invulnerable(Current_dealer, true) 
  1284.  
  1285. 	local function player_triggered_dealer(player) 
  1286.  
  1287. 		if ( (player == REMOTE_PLAYER) and (not IN_COOP) ) then 
  1288. 			return false 
  1289. 		end 
  1290.  
  1291. 		local dist = get_dist(player, character_dealer) 
  1292. 		if (	(dist < DEALER_INTERACT_DISTANCE) and  
  1293. 				( (Current_prompt_mode[player] == PROMPT_MODE_DEALER) or (Current_dealer == CHARACTER_CAR_DEALER) ) 
  1294. 			) then 
  1295. 			return true 
  1296. 		else 
  1297. 			return false 
  1298. 		end 
  1299. 		 
  1300. 	end 
  1301.  
  1302. 	-- wait for one of the players to get close to the dealer 
  1303. 	while ( (not player_triggered_dealer(LOCAL_PLAYER)) and (not player_triggered_dealer(REMOTE_PLAYER)) ) do 
  1304. 		thread_yield() 
  1305. 	end 
  1306.  
  1307. 	marker_remove_npc(character_dealer) 
  1308. 	mission_waypoint_remove() 
  1309. 	 
  1310. 	if(helptext_dialogue) then 
  1311. 		mission_help_table_nag(helptext_dialogue) 
  1312. 		delay(3.0) 
  1313. 	end 
  1314. 		 
  1315. 	local dist,player = get_dist_closest_player_to_object(Current_dealer) 
  1316. 	turn_to(Current_dealer, player) 
  1317.  
  1318. 	local conversation = {} 
  1319.  
  1320. 	if (Current_dealer == CHARACTER_CAR_DEALER) then 
  1321. 		conversation = 
  1322. 			{ 
  1323. 				{ "PLAYER_RON2_CAR_L1", player, 0.5, "talk to drugdealer"}, 
  1324. 				{ "RON2_CAR_L2", CHARACTER_CAR_DEALER, 0.5, "talk to drugdealer"}, 
  1325. 				{ "PLAYER_RON2_CAR_L3", player, 0.5, "talk to drugdealer"}, 
  1326. 			} 
  1327. 	elseif(Current_dealer == CHARACTER_WEAPON_DEALER) then 
  1328. 		conversation = 
  1329. 			{ 
  1330. 				{ "PLAYER_RON2_ARMS_L1", player, 0.5, "talk to drugdealer" }, 
  1331. 				{ "RON2_ARMS_L2", CHARACTER_WEAPON_DEALER, 0.5, "talk to drugdealer" }, 
  1332. 			} 
  1333. 	else 
  1334. 		conversation =  
  1335. 			{ 
  1336. 				{ "PLAYER_RON2_FENCE_L1", player, 0.5, "talk to drugdealer"}, 
  1337. 				{ "RON2_FENCE_L2", CHARACTER_FENCE, 0.5, "talk to drugdealer" }, 
  1338. 			} 
  1339. 	end 
  1340.  
  1341. 	audio_play_conversation( conversation) 
  1342.  
  1343. 	if (Current_dealer ~= CHARACTER_FENCE) then 
  1344. 		on_death("", Current_dealer) 
  1345. 		set_cant_flee_flag(character_dealer, false) 
  1346. 	end 
  1347.  
  1348. 	Current_dealer_complete = true 
  1349.  
  1350. end 
  1351.  
  1352. function rn02_setup_chases_and_ambushes() 
  1353.  
  1354. 	rn02_create_chase_and_ambush_groups() 
  1355.  
  1356. 	thread_new("rn02_complication", "chase_1", 1) 
  1357. 	thread_new("rn02_complication", "roadblock_1", 2) 
  1358.  
  1359. end 
  1360.  
  1361. function rn02_create_chase_and_ambush_groups() 
  1362.  
  1363. 	for complication_name, complication_info in pairs(CHASES_AND_AMBUSHES) do 
  1364. 		group_create(complication_info["group"])		 
  1365. 	end 
  1366.  
  1367. end 
  1368.  
  1369. function rn02_complication(complication_name, index) 
  1370.  
  1371. 	local complication = CHASES_AND_AMBUSHES[complication_name] 
  1372. 	local complication_type = complication["type"] 
  1373.  
  1374. 	-- complication-type-specific preparation 
  1375. 	if (complication_type == "chase") then 
  1376. 		rn02_chase_prepare(complication_name) 
  1377. 	elseif (complication_type == "roadblock") then 
  1378. 		rn02_roadblock_prepare(complication_name) 
  1379. 	end 
  1380.  
  1381. 	-- Wait for the previous trigger to be hit 
  1382. 	while (Chase_or_ambush_sent ~= (index - 1)) do 
  1383. 		thread_yield() 
  1384. 	end 
  1385.  
  1386. 	-- Arm the trigger if it exists, otherwise we'll call the on_trigger_hit function immediately 
  1387. 	if(complication["trigger"]) then 
  1388. 		trigger_enable(complication["trigger"],true) 
  1389. 		on_trigger("rn02_chase_or_ambush_location_reached",complication["trigger"]) 
  1390. 	else 
  1391. 		Chase_or_ambush_sent = Chase_or_ambush_sent + 1 
  1392. 	end 
  1393.  
  1394. 	-- wait for the appropriate trigger to be hit 
  1395. 	while (Chase_or_ambush_sent ~= index) do 
  1396. 		thread_yield() 
  1397. 	end 
  1398.  
  1399. 	-- Reset the trigger 
  1400. 	if (complication["trigger"]) then 
  1401. 		trigger_enable(complication["trigger"],false) 
  1402. 		on_trigger("",complication["trigger"]) 
  1403. 	end 
  1404.  
  1405. 	-- complication-type-specific trigger-hit function 
  1406. 	if (complication_type == "chase") then 
  1407. 		rn02_chase_trigger_hit(complication_name) 
  1408. 	elseif (complication_type == "roadblock") then 
  1409. 		rn02_roadblock_trigger_hit(complication_name) 
  1410. 	end 
  1411.  
  1412. 	-- complication-type-specific cleanup for the last complication 
  1413. 	-- Release the on_foot Ronin from the last group 
  1414. 	if (Last_complication ~= "") then 
  1415. 		local last_complication_type = CHASES_AND_AMBUSHES[Last_complication] 
  1416. 		if (last_complication_type == "chase") then 
  1417. 			rn02_chase_cleanup(Last_complication) 
  1418. 		elseif (last_complication_type == "roadblock") then 
  1419. 			rn02_roadblock_cleanup(Last_complication) 
  1420. 		end 
  1421. 	end 
  1422.  
  1423. 	Last_complication = complication_name 
  1424. end 
  1425.  
  1426. function rn02_chase_prepare(chase_name) 
  1427. 	local chase = CHASES_AND_AMBUSHES[chase_name] 
  1428.  
  1429. 		-- prepare vehicles 
  1430. 	for vehicle,vehicle_data in pairs(chase["vehicles"]) do 
  1431.  
  1432. 		-- place driver/passengers in the vehicle 
  1433. 		for i,passenger in pairs(vehicle_data["passengers"]) do 
  1434. 			vehicle_enter_teleport(passenger,vehicle,i-1) 
  1435. 			set_seatbelt_flag(passenger,true) 
  1436. 		end 
  1437.  
  1438. 		-- get ready to chase 
  1439. 		vehicle_suppress_npc_exit(vehicle, true) 
  1440. 		vehicle_set_allow_ram_ped(vehicle,true) 
  1441. 		vehicle_set_crazy(vehicle,true) 
  1442. 		vehicle_set_use_short_cuts(vehicle,true) 
  1443.  
  1444. 		-- Set vehicle class specific parameters 
  1445. 		-- (speed override is set later or vehicles will begin driving immediately) 
  1446. 		if (vehicle_data["type"] == "car") then 
  1447. 			set_max_hit_points(vehicle, 	rn02_get_parameter_value("CAR_CHASE_HP")) 
  1448.  
  1449. 		elseif (vehicle_data["type"] == "bike") then 
  1450. 			set_max_hit_points(vehicle, 	rn02_get_parameter_value("BIKE_CHASE_HP")) 
  1451. 		end 
  1452.  
  1453. 		-- add callback to update count of vehicles attacking 
  1454. 		on_vehicle_destroyed("rn02_chase_vehicle_destroyed", vehicle) 
  1455.  
  1456. 	end 
  1457. end 
  1458.  
  1459. -- Vehicles attack if doing so won't cause us to excede the threshold, otherwise they are destroyed 
  1460. -- peds attack 
  1461. function rn02_chase_trigger_hit(chase_name) 
  1462. 	 
  1463. 	local chase = CHASES_AND_AMBUSHES[chase_name] 
  1464.  
  1465. 	-- Have vehicles enter chase mode 
  1466. 	for vehicle,vehicle_data in pairs(chase["vehicles"]) do 
  1467.  
  1468. 		-- get the maximum number of vehicles that can chasing the players 
  1469. 		local max_vehicles	= rn02_get_parameter_value("MAX_CHASE_VEHICLES") 
  1470.  
  1471. 		-- have the vehicle attack if we won't excede the max 
  1472. 		if (Vehicles_attacking < max_vehicles and not vehicle_is_destroyed(vehicle)) then 
  1473.  
  1474. 			-- Set vehicle class specific parameters 
  1475. 			-- (speed override is set later or vehicles will begin driving immediately) 
  1476. 			if (vehicle_data["type"] == "car") then 
  1477. 				vehicle_max_speed(vehicle, rn02_get_parameter_value("CAR_CHASE_SPEED")) 
  1478. 			elseif (vehicle_data["type"] == "bike") then 
  1479. 				vehicle_max_speed(vehicle, rn02_get_parameter_value("BIKE_CHASE_SPEED")) 
  1480. 			end 
  1481. 			 
  1482. 			thread_new("rn02_vehicle_chase_maybe_jump",vehicle,vehicle_data["jump"]) 
  1483. 	 
  1484. 			-- Set vehicle class specific parameters 
  1485. 			if (vehicle_data["type"] == "car") then 
  1486. 				vehicle_speed_override(vehicle, rn02_get_parameter_value("CAR_CHASE_SPEED")) 
  1487. 			elseif (vehicle_data["type"] == "bike") then 
  1488. 				vehicle_speed_override(vehicle, rn02_get_parameter_value("BIKE_CHASE_SPEED")) 
  1489. 			end 
  1490.  
  1491. 			-- increment attacking count 
  1492. 			Vehicles_attacking = Vehicles_attacking + 1 
  1493. 		else 
  1494.  
  1495. 			-- release vehicles that we can't have attack 
  1496. 			if (vehicle_exists(vehicle)) then 
  1497. 				on_vehicle_destroyed("", vehicle) 
  1498. 				release_to_world(vehicle) 
  1499. 			end 
  1500. 			 
  1501. 		end 
  1502.  
  1503. 	end 
  1504.  
  1505. 	-- Have npcs attack 
  1506. 	for i,npc in pairs(chase["on_foot"]) do 
  1507. 		attack(npc,LOCAL_PLAYER,true) 
  1508. 	end 
  1509. end 
  1510.  
  1511. -- Have a vehicle possibly delay a bit and then enter chase mode 
  1512. function rn02_vehicle_chase_maybe_jump(vehicle,jump) 
  1513.  
  1514. 	-- If jumping, wait for the vehicle to become airborn and then land 
  1515. 	if(jump) then 
  1516. 		vehicle_speed_override(vehicle, vehicle_get_max_speed(vehicle)) 
  1517. 		while( not vehicle_in_air(vehicle) ) do 
  1518. 			thread_yield() 
  1519. 		end 
  1520. 		delay(0.5) 
  1521. 		while( vehicle_in_air(vehicle) ) do 
  1522. 			thread_yield() 
  1523. 		end 
  1524. 		vehicle_speed_cancel(vehicle) 
  1525. 	end 
  1526. 	vehicle_chase(vehicle, LOCAL_PLAYER, true, true, true) 
  1527. end 
  1528.  
  1529. -- Tidy up a chase complication by releasing the on-foot attackers 
  1530. -- vehicles and their passengers are cleaned up as the vehicles are destroyed 
  1531. function rn02_chase_cleanup(chase_name) 
  1532. 	for i,npc in pairs(CHASES_AND_AMBUSHES[chase_name]["on_foot"]) do 
  1533. 		release_to_world(npc) 
  1534. 	end 
  1535. end 
  1536.  
  1537. function rn02_chase_vehicle_destroyed(vehicle) 
  1538. 	Vehicles_attacking = Vehicles_attacking - 1 
  1539. 	on_vehicle_destroyed("",vehicle) 
  1540. 	local num_seats = vehicle_get_num_seats(vehicle) 
  1541. 	for i=1, num_seats, 1 do 
  1542. 		local passenger = get_char_in_vehicle(vehicle,i) 
  1543. 		if (passenger) then 
  1544. 			release_to_world(passenger) 
  1545. 		end 
  1546. 	end 
  1547. 	release_to_world(vehicle) 
  1548. end 
  1549.  
  1550. -- Peds attack, vehicles prepared in case they'll have to attack 
  1551. function rn02_roadblock_prepare(roadblock_name) 
  1552.  
  1553. 	local roadblock = CHASES_AND_AMBUSHES[roadblock_name] 
  1554.  
  1555. 	for vehicle,vehicle_data in pairs(roadblock["vehicles"]) do 
  1556.  
  1557. 		-- set potential passengers to use their seat belts 
  1558. 		for i,passenger in pairs(vehicle_data["passengers"]) do 
  1559. 			set_seatbelt_flag(passenger,true) 
  1560. 		end 
  1561.  
  1562. 		-- prepare vehicle for chase 
  1563. 		vehicle_suppress_npc_exit(vehicle, true) 
  1564. 		vehicle_set_allow_ram_ped(vehicle,true) 
  1565. 		vehicle_set_crazy(vehicle,true) 
  1566. 		vehicle_set_use_short_cuts(vehicle,true) 
  1567.  
  1568. 		-- Set hit points 
  1569. 		if (vehicle_data["type"] == "car") then 
  1570. 			set_max_hit_points(vehicle, 	rn02_get_parameter_value("CAR_CHASE_HP")) 
  1571. 		elseif (vehicle_data["type"] == "bike") then 
  1572. 			set_max_hit_points(vehicle, 	rn02_get_parameter_value("BIKE_CHASE_HP")) 
  1573. 		end 
  1574.  
  1575. 	end 
  1576.  
  1577. 	-- Guys on foot can start attacking 
  1578. 	local check_misfires = roadblock["misfire"] ~= nil 
  1579. 	for i,npc in pairs(roadblock["on_foot"]) do 
  1580. 		-- Check if this npc should misfire 
  1581. 		local target = nil 
  1582. 		if(check_misfires) then 
  1583. 			local target = roadblock["misfire"][npc] 
  1584. 		end 
  1585. 		if (target) then 
  1586. 			patrol("rn02_npc_misfire",npc,target) 
  1587. 		else 
  1588. 			attack(npc,LOCAL_PLAYER,true) 
  1589. 		end 
  1590. 	end 
  1591. end 
  1592.  
  1593. function rn02_npc_misfire(npc,target) 
  1594. 	local dist = 	get_dist(npc,VEHICLE_PLAYER_CAR) 
  1595. 	while(dist > 60) do 
  1596. 		dist = 	get_dist(npc,VEHICLE_PLAYER_CAR) 
  1597. 		thread_yield() 
  1598. 	end	 
  1599. 	force_fire(npc, target, true)  
  1600. 	attack(npc,LOCAL_PLAYER,true) 
  1601. end 
  1602.  
  1603. -- Roadblock triggers are placed after the roadblock. When they are hit, the roadblockers 
  1604. -- realize that their trap failed. Those that are still alive get in their vehicles and 
  1605. -- join the chase. Npcs and vehicles which can't join the chase are released because 
  1606. -- the player may not be that far away. 
  1607. function rn02_roadblock_trigger_hit(roadblock_name) 
  1608. 	 
  1609. 	local roadblock = CHASES_AND_AMBUSHES[roadblock_name] 
  1610.  
  1611. 	-- Have vehicles enter chase mode 
  1612. 	for vehicle,vehicle_data in pairs(roadblock["vehicles"]) do 
  1613.  
  1614. 		-- get the maximum number of vehicles that can chasing the players 
  1615. 		local max_vehicles	= rn02_get_parameter_value("MAX_CHASE_VEHICLES") 
  1616.  
  1617. 		-- have the vehicle attack if we won't excede the max 
  1618. 		if ( (Vehicles_attacking < max_vehicles) and (not vehicle_is_destroyed(vehicle)) ) then 
  1619.  
  1620. 			-- Set vehicle class specific parameters 
  1621. 			-- (speed override is set later or vehicles will begin driving immediately) 
  1622. 			if (vehicle_data["type"] == "car") then 
  1623. 				vehicle_max_speed(vehicle, rn02_get_parameter_value("CAR_CHASE_SPEED")) 
  1624. 			elseif (vehicle_data["type"] == "bike") then 
  1625. 				vehicle_max_speed(vehicle, rn02_get_parameter_value("BIKE_CHASE_SPEED")) 
  1626. 			end 
  1627.  
  1628. 			thread_new("rn02_roadblock_vehicle_attack",roadblock_name,vehicle) 
  1629.  
  1630. 		else 
  1631.  
  1632. 			-- If a vehicle can't attack, release it and its potentail passengers. 
  1633. 			on_vehicle_destroyed("", vehicle) 
  1634. 			release_to_world(vehicle) 
  1635. 			for i,passenger in pairs(vehicle_data["passengers"]) do 
  1636. 				if (not character_is_dead(passenger)) then 
  1637. 					release_to_world(passenger) 
  1638. 				end 
  1639. 			end 
  1640. 							 
  1641. 		end 
  1642.  
  1643. 	end 
  1644.  
  1645. end 
  1646.  
  1647. function rn02_roadblock_vehicle_attack(roadblock_name, vehicle) 
  1648. 	 
  1649. 	local vehicle_data = CHASES_AND_AMBUSHES[roadblock_name]["vehicles"][vehicle] 
  1650.  
  1651. 	-- See which of the potential passengers are still alive 
  1652. 	local passengers = {} 
  1653. 	local next_seat = 1 
  1654. 	for i,passenger in pairs(vehicle_data["passengers"]) do 
  1655. 		if (not character_is_dead(passenger)) then 
  1656. 			passengers[next_seat] = passenger 
  1657. 			next_seat = next_seat +1 
  1658. 		end 
  1659. 	end 
  1660.  
  1661. 	-- If someone was alive to enter the vehicle, have it attack 
  1662. 	if (next_seat ~= 1) then 
  1663.  
  1664. 		-- tell everyone to get in the vehicle 
  1665. 		vehicle_enter_group(passengers, vehicle) 
  1666.  
  1667. 		-- set some flags 
  1668. 		vehicle_set_crazy(vehicle,true) 
  1669. 		vehicle_set_use_short_cuts(vehicle, true) 
  1670.  
  1671. 		-- vroom vroom vroom 
  1672. 		vehicle_chase(vehicle, LOCAL_PLAYER, true, true, true) 
  1673.  
  1674. 		-- add callback to update count of vehicles attacking 
  1675. 		on_vehicle_destroyed("rn02_chase_vehicle_destroyed", vehicle) 
  1676.  
  1677. 		-- increment attacking count 
  1678. 		Vehicles_attacking = Vehicles_attacking + 1 
  1679. 	 
  1680. 	else 
  1681. 		 
  1682. 		-- If none of the potential passengers are alive, then release the vehicle 
  1683. 		release_to_world(vehicle) 
  1684.  
  1685. 	end 
  1686.  
  1687. end 
  1688.  
  1689. -- Tidy up a roadblock complication. 
  1690. -- Releases npcs which aren't in a vehicle, and are far from the player(s) they were probably left behind. 
  1691. function rn02_roadblock_cleanup(roadblock_name) 
  1692. 	for i,npc in pairs(CHASES_AND_AMBUSHES[roadblock_name]["on_foot"]) do 
  1693. 		if (not character_is_in_vehicle(npc)) then 
  1694. 			release_to_world(npc) 
  1695. 		end 
  1696. 	end 
  1697. end 
  1698.  
  1699. function rn02_chase_or_ambush_location_reached() 
  1700. 	Chase_or_ambush_sent = Chase_or_ambush_sent + 1 
  1701. end 
  1702.  
  1703. -- UTILITY FUNCTIONS ---------------------------------------- 
  1704.  
  1705. -- Get the value of the mission parameter. 
  1706. -- 
  1707. -- parameter	Mission parameter whose value the function should return 
  1708. --	i				If the parameter is a table, then i indexes the entry that should be returned 
  1709. -- 
  1710. -- Returns mission paramater value. 
  1711. function rn02_get_parameter_value(parameter, i) 
  1712.  
  1713. 	local return_val = nil 
  1714.  
  1715. 	-- Check for an overloaded value for coop missions. 
  1716. 	if (IN_COOP and return_val == nil) then 
  1717. 		if (i) then 
  1718. 			if (RN02_PARAMETERS["COOP_" .. parameter] ~= nil) then 
  1719. 				return_val = RN02_PARAMETERS["COOP_" .. parameter][i] 
  1720. 			end 
  1721. 		else 
  1722. 			return_val = RN02_PARAMETERS["COOP_" .. parameter] 
  1723. 		end 
  1724. 	end 
  1725.  
  1726. 	-- Get the standard value 
  1727. 	if (return_val == nil) then 
  1728. 		if (i) then 
  1729. 			if (RN02_PARAMETERS[parameter] ~= nil) then 
  1730. 				return_val = RN02_PARAMETERS[parameter][i] 
  1731. 			end 
  1732. 		else 
  1733. 			return_val = RN02_PARAMETERS[parameter] 
  1734. 		end 
  1735. 	end 
  1736.  
  1737. 	return return_val 
  1738. end 
  1739.  
  1740. -- release a script group after a brief delay 
  1741. function rn02_delayed_release_to_world(...) 
  1742. 	delay(5) 
  1743.  
  1744. 	for i=1, arg.n, 1 do 
  1745. 		release_to_world(arg[i]) 
  1746. 	end 
  1747. end 
  1748.  
  1749. -- add all entries of the tail table onto the end of the head table 
  1750. function rn02_table_concat(head_table, tail_table) 
  1751. 	local offset = sizeof_table(head_table) 
  1752. 	for i, tail_entry_i in pairs(tail_table) do 
  1753. 		head_table[offset+i] = tail_entry_i 
  1754. 	end 
  1755. end 
  1756.  
  1757. function rn02_group_create_maybe_coop(group_always,group_coop, blocking) 
  1758. 	group_create(group_always, blocking) 
  1759. 	if (IN_COOP) then 
  1760. 		group_create(group_coop, blocking) 
  1761. 	end 
  1762. end 
  1763.  
  1764. function rn02_group_destroy_maybe_coop(group_always, group_coop) 
  1765. 	group_destroy(group_always) 
  1766. 	if (IN_COOP) then 
  1767. 		group_destroy(group_coop) 
  1768. 	end 
  1769. end 
  1770.  
  1771. function rn02_vehicle_infinite_mass() 
  1772.  
  1773. 	local car_has_infinite_mass = false 
  1774.  
  1775. 	-- The convertible should have infinite mass if the player is in the vehicle and it is 
  1776. 	-- near a mechanic. 
  1777. 	local function should_give_infinite_mass(player) 
  1778. 		if (not Player_in_convertible[player]) then 
  1779. 			return false 
  1780. 		end 
  1781. 		local new_repair_trigger = player_get_nearest_trigger_of_type("car mechanic", player, false) 
  1782. 		if (get_dist(player, new_repair_trigger) < MECHANIC_INFINITE_MASS_DIST) then 
  1783. 			return true 
  1784. 		end	 
  1785. 	end 
  1786.  
  1787. 	while(true) do 
  1788.  
  1789. 		thread_yield() 
  1790.  
  1791. 		local car_needs_infinite_mass = ( should_give_infinite_mass(LOCAL_PLAYER) or (IN_COOP and should_give_infinite_mass(REMOTE_PLAYER)) ) 
  1792.  
  1793. 		if (car_needs_infinite_mass and (not car_has_infinite_mass)) then 
  1794. 			if(vehicle_exists(VEHICLE_PLAYER_CAR) and (not vehicle_is_destroyed(VEHICLE_PLAYER_CAR))) then 
  1795. 				vehicle_infinite_mass(VEHICLE_PLAYER_CAR, true)	 
  1796. 				car_has_infinite_mass = true 
  1797. 			end 
  1798. 		end 
  1799.  
  1800. 		if ( (not car_needs_infinite_mass) and car_has_infinite_mass) then 
  1801. 			if(vehicle_exists(VEHICLE_PLAYER_CAR) and (not vehicle_is_destroyed(VEHICLE_PLAYER_CAR))) then 
  1802. 				vehicle_infinite_mass(VEHICLE_PLAYER_CAR, false)	 
  1803. 				car_has_infinite_mass = false 
  1804. 			end 
  1805. 		end 
  1806.  
  1807. 	end 
  1808.  
  1809. end 
  1810.  
  1811. -- MISSION FAILURE FUNCTIONS -------------------------------- 
  1812.  
  1813. function rn02_vehicle_destroyed_failure() 
  1814. 	-- End the mission, convertible destroyed 
  1815. 	mission_end_failure("rn02", HELPTEXT_FAILURE_CONVERTIBLE) 
  1816. end 
  1817.  
  1818. function rn02_dealer_died_failure() 
  1819. 	mission_end_failure("rn02", HELPTEXT_FAILURE_DEALER_DIED) 
  1820. end	 
  1821.  
  1822. function rn02_fence_died_failure() 
  1823. 	-- End the mission, fence died 
  1824. 	mission_end_failure("rn02", HELPTEXT_FAILURE_FENCE) 
  1825. end 
  1826.