sr2lua/bh01.lua

  1. -- bh01.lua 
  2. -- SR2 mission script 
  3. -- 03/11/08 
  4.  
  5. -- Navpoints -- 
  6. NAVPOINT_START						= "bh01_$player_start" 
  7. NAVPOINT_REMOTE_START			= "bh01_$remote_start" 
  8. NAVPOINT_GIFT_SHOP_EXIT			= "bh01_$gift_shop_exit" 
  9. NAVPOINT_POLICE_BOAT_1_DEST	= "bh01_$police_boat_1_destination" 
  10. NAVPOINT_POLICE_BOAT_2_DEST	= "bh01_$police_boat_2_destination" 
  11. NAVPOINT_HELI_ATTACK				= "bh01_$heli_attack_location" 
  12. NAVPOINT_MAIN_BRIDGE				= "bh01_$main_bridge" 
  13. NAVPOINT_FLASHBANG_1				= "bh01_$flashbang_1" 
  14. NAVPOINT_FLASHBANG_2				= "bh01_$flashbang_2" 
  15. NAVPOINT_FLASHBANG_THROW_POS  = "bh01_$flashbang_throw_pos" 
  16. NAVPOINT_AMBUSH					= {"bh01_$Waypoint08", "bh01_$n000"} 
  17. NAVPOINT_BACK_ROUTE				= "bh01_$n001" 
  18. NAVPOINT_BOAT_FINISH_LOCAL		= "bh01_$local_finish" 
  19. NAVPOINT_BOAT_FINISH_REMOTE	= "bh01_$remote_finish" 
  20.  
  21. CAVERN_WAYPOINTS					= {"bh01_$Waypoint01", "bh01_$n004", "bh01_$Waypoint02", "bh01_$Waypoint03",  
  22. 											"bh01_$Waypoint04", "bh01_$Waypoint05", "bh01_$Waypoint06", "bh01_$Waypoint07",  
  23. 											"bh01_$Waypoint08"} 
  24. NUM_WAYPOINTS						= sizeof_table(CAVERN_WAYPOINTS) 
  25.  
  26. CHAR_MAERO							= "bh01_$maero" 
  27. CHAR_CARLOS							= "bh01_$carlos" 
  28. CHAR_POLICE_BOAT_DRIVER_1		= "bh01_$police_boat_driver_1" 
  29. CHAR_POLICE_BOAT_DRIVER_2		= "bh01_$police_boat_driver_2" 
  30. CHAR_POLICE_HELI_PILOT			= "bh01_$police_heli_pilot" 
  31. CHAR_POLICE_HELI_PILOT_2		= "bh01_$police_heli_pilot_2" 
  32. CHAR_POLICE_HELI_PILOT_3		= "bh01_$police_heli_pilot_3" 
  33. CHAR_LEASHED_COP_1				= "bh01_$c006" 
  34. CHAR_LEASHED_COP_2				= "bh01_$c007" 
  35. CHAR_LEASHED_COP_3				= "bh01_$c012" 
  36. CHAR_LEASHED_COP_4				= "bh01_$c013" 
  37. CHAR_LEASHED_COP_5				= "bh01_$c014" 
  38. CHAR_LEASHED_COP_6				= "bh01_$c015" 
  39. CHAR_FLASHBANG_COP				= "bh01_$cavern_police_4" 
  40. CHAR_WATERCRAFT_DRIVER_1		= "bh01_$c016" 
  41. CHAR_WATERCRAFT_DRIVER_2		= "bh01_$c017" 
  42. CHAR_COP_AMBUSH					= {{"bh01_$c013", "bh01_$c012 (0)"},  
  43. 											{"bh01_$c012", "bh01_$c012 (1)"}} 
  44.  
  45. TABLE_COPS_FIRST_WAVE			= {"bh01_$cavern_police_1", "bh01_$cavern_police_2", "bh01_$cavern_police_3",  
  46. 											"bh01_$cavern_police_4", "bh01_$cavern_police_5", "bh01_$c009", "bh01_$c010",} 
  47.  
  48. POLICE_BOAT_1						= "bh01_$police_boat_1" 
  49. POLICE_BOAT_2						= "bh01_$police_boat_2" 
  50. POLICE_HELI							= "bh01_$v0003" 
  51. SPEEDBOAT							= "bh01_$speedboat" 
  52. SPEEDBOAT_2							= "bh01_$speedboat_2" 
  53. WATERCRAFT_1						= "bh01_$v004" 
  54. WATERCRAFT_2						= "bh01_$v005" 
  55.  
  56. TABLE_GETAWAY_CARS				= {"bh01_$getaway_car", "bh01_$getaway_car (0)", "bh01_$getaway_car (1)"} 
  57. TABLE_ALL_BOATS					= {POLICE_BOAT_1, POLICE_BOAT_2, SPEEDBOAT, SPEEDBOAT_2, WATERCRAFT_1, WATERCRAFT_2} 
  58.  
  59. -- Groups -- 
  60. GROUP_ALLIES						= "bh01_$allies" 
  61. GROUP_BOATS							= "bh01_$boats" 
  62. GROUP_CAVERN_POLICE				= "bh01_$cavern_police" 
  63. GROUP_POLICE_BOATS				= "bh01_$police_boats" 
  64. GROUP_POLICE_BOAT_DRIVERS		= "bh01_$police_boat_drivers" 
  65. GROUP_POLICE_HELI					= "bh01_$police_heli" 
  66. GROUP_ROADBLOCKS					= "bh01_$roadblocks" 
  67. GROUP_GETAWAY_CAR					= "bh01_$getaway_car" 
  68. GROUP_CAVERN_POLICE_2			= "bh01_$cavern_police_2" 
  69. GROUP_WATER_GETAWAY_POLICE		= "bh01_$water_getaway_police" 
  70. GROUP_BACK_ROUTE_POLICE			= "bh01_$back_route_police" 
  71.  
  72. -- Cutscenes -- 
  73.    CT_INTRO = "br01-01" 
  74.    CT_OUTRO = "br01-02" 
  75.  
  76. -- Personas -- 
  77.    CARLOS_PERSONA_OVERRIDES = 
  78.    { 
  79.    { "hostage - barters", "CARLOS_BR01_BARTER" }, 
  80.    { "misc - respond to player taunt w/taunt", "CARLOS_BR01_TAUNT" }, 
  81.    { "observe - praised by pc", "CARLOS_BR01_PRAISED" }, 
  82.    { "combat - congratulate player", "CARLOS_BR01_GRATSPLAYER" }, 
  83.    { "observe - passenger when driver hits cars", "CARLOS_BR01_HITCAR" }, 
  84.    { "observe - passenger when driver hits object", "CARLOS_BR01_HITOBJ" }, 
  85.    { "observe - passenger when driver hits peds", "CARLOS_BR01_HITPED" }, 
  86.    { "threat - alert (group attack)", "CARLOS_BR01_ATTACK" }, 
  87.    { "threat - alert (solo attack)", "CARLOS_BR01_ATTACK" }, 
  88.    { "threat - damage received (firearm)", "CARLOS_BR01_TAKEDAM" }, 
  89.    { "threat - damage received (melee)", "CARLOS_BR01_TAKEDAM" } 
  90.    } 
  91.  
  92.    MAERO_PERSONA_OVERRIDES = 
  93.    { 
  94.    { "hostage - barters", "MAERO_BR01_HOSTAGE" }, 
  95.    { "misc - respond to player taunt w/taunt", "MAERO_BR01_TAUNT" }, 
  96.    { "observe - praised by pc", "MAERO_BR01_PRAISED" }, 
  97.    { "combat - congratulate player", "MAERO_BR01_GRATSPLAYER" }, 
  98.    { "combat - congratulate self", "MAERO_BR01_GRATSSELF" }, 
  99.    { "observe - passenger when driver hits cars", "MAERO_BR01_HITCAR" }, 
  100.    { "observe - passenger when driver hits object", "MAERO_BR01_HITOBJ" }, 
  101.    { "observe - passenger when driver hits peds", "MAERO_BR01_HITPED" }, 
  102.    { "threat - alert (group attack)", "MAERO_BR01_ATTACK" }, 
  103.    { "threat - alert (solo attack)", "MAERO_BR01_ATTACK" }, 
  104.    { "threat - damage received (firearm)", "MAERO_BR01_TAKEDAM" }, 
  105.    { "threat - damage received (melee)", "MAERO_BR01_TAKEDAM" } 
  106.    } 
  107.  
  108. -- Others -- 
  109. Taking_back_route					= false 
  110.  
  111. -- Checkpoints -- 
  112. CHECKPOINT_TWO_PATHS				= "bh01_checkpoint_two_paths" 
  113.  
  114. -- Triggers -- 
  115. TRIGGER_TRIBAL_HQ					= "bh01_$tribal_hq" 
  116. TRIGGER_TRIBAL_HQ_DOCK			= "bh01_$tribal_hq_dock" 
  117. TRIGGER_GIFT_SHOP					= "bh01_$gift_shop_exit_point" 
  118. TRIGGER_CAVE						= "bh01_$cave_exit_point" 
  119.  
  120. -- Booleans -- 
  121. Player_begun_exiting_caverns	= false 
  122. Player_has_exited_caverns		= false 
  123. TABLE_WAYPOINT_BYPASSED			= {false, false, false, false, false, false, false} 
  124. Player_taking_land_getaway		= false 
  125. Mission_won                   = false 
  126.  
  127. -- Threads -- 
  128. THREAD_NPC_FLEE					= -1 
  129. THREAD_GETAWAY						= -1 
  130. THREAD_FLASHBANG					= -1 
  131. THREAD_ESCAPE_CAVERNS			= -1 
  132. THREAD_NOTORIETY					= -1 
  133. THREAD_WAYPOINT_2					= -1 
  134. THREAD_BRIDGE						= -1 
  135. THREAD_BACK_ROUTE					= -1 
  136. THREAD_WAYPOINT					= {-1, -1, -1, -1, -1, -1, -1} 
  137. THREAD_AMBUSH						= {-1, -1, -1, -1} 
  138. THREAD_POLICE_BOAT				= {-1, -1} 
  139. THREAD_POLICE_HELI				= -1 
  140. THREAD_WATERCRAFT_PROXIMITY	= -1 
  141. THREAD_WATERCRAFT					= {-1, -1} 
  142. THREAD_POLICE_BOATS				= -1 
  143. ALL_CAVERN_THREADS				= {THREAD_FLASHBANG, THREAD_ESCAPE_CAVERNS, THREAD_WAYPOINT_2, THREAD_BRIDGE, THREAD_BACK_ROUTE, 
  144. 											THREAD_WAYPOINT[1], THREAD_WAYPOINT[2], THREAD_WAYPOINT[3], THREAD_WAYPOINT[4], THREAD_WAYPOINT[5],  
  145. 											THREAD_WAYPOINT[6], THREAD_WAYPOINT[7], THREAD_AMBUSH[1], THREAD_AMBUSH[2], THREAD_AMBUSH[3],  
  146. 											THREAD_AMBUSH[4], THREAD_NPC_FLEE} 
  147. ALL_THREADS							= {THREAD_GETAWAY, THREAD_FLASHBANG, THREAD_ESCAPE_CAVERNS, THREAD_NOTORIETY, THREAD_WAYPOINT_2, 
  148. 											THREAD_BRIDGE, THREAD_BACK_ROUTE, THREAD_WAYPOINT[1], THREAD_WAYPOINT[2], THREAD_WAYPOINT[3],  
  149. 											THREAD_WAYPOINT[4], THREAD_WAYPOINT[5], THREAD_WAYPOINT[6], THREAD_WAYPOINT[7], THREAD_AMBUSH[1], 
  150. 											THREAD_AMBUSH[2], THREAD_AMBUSH[3], THREAD_AMBUSH[4], THREAD_POLICE_BOAT[1], THREAD_POLICE_BOAT[2], 
  151. 											THREAD_POLICE_HELI, THREAD_WATERCRAFT_PROXIMITY, THREAD_WATERCRAFT[1], THREAD_WATERCRAFT[2], 
  152. 											THREAD_POLICE_BOATS, THREAD_NPC_FLEE} 
  153.  
  154. -- Distances 
  155. WIN_DISTANCE_METERS = 10 
  156.  
  157.  
  158. function bh01_start(checkpoint, is_restart) 
  159. 	-- Start trigger is hit...the activate button was hit 
  160. --	set_mission_author("Aaron Hanson") 
  161. 	set_mission_author("Ryan Spencer") 
  162.    mission_start_fade_out() 
  163.  
  164. 	ambient_gang_spawn_enable(false) 
  165.  
  166. 	-- Play the intro cutscene 
  167.    if ( checkpoint == MISSION_START_CHECKPOINT ) then 
  168.  
  169. 		-- Determine the starting groups 
  170. 		local starting_groups = { GROUP_ALLIES , GROUP_CAVERN_POLICE, GROUP_BACK_ROUTE_POLICE} 
  171.  
  172. 		if (not is_restart) then 
  173. 			cutscene_play( CT_INTRO, starting_groups, { NAVPOINT_START, NAVPOINT_REMOTE_START }, false ) 
  174. 			for i,group in pairs(starting_groups) do 
  175. 				group_show(group) 
  176. 			end 
  177. 		else 
  178. 			teleport_coop( NAVPOINT_START, NAVPOINT_REMOTE_START, true )	 
  179. 			for i,group in pairs(starting_groups) do 
  180. 				group_create(group, true) 
  181. 			end 
  182. 		end 
  183.    end 
  184.  
  185.    party_allow_max_followers( true ) 
  186. 	ambient_gang_spawn_enable(false) 
  187.  
  188. 	-- Bring both players to the mission start location	 
  189.  
  190. 	if (checkpoint == CHECKPOINT_TWO_PATHS) then 
  191. 		-- A checkpoint was hit so take that path... 
  192. 		THREAD_NOTORIETY = thread_new("bh01_watch_brotherhood_notoriety") 
  193. 		 
  194. 		character_set_cannot_be_grabbed(CHAR_MAERO, true) 
  195. 		character_set_cannot_be_grabbed(CHAR_CARLOS, true) 
  196. 		 
  197. 		ambient_gang_spawn_enable(false) 
  198.  
  199. 		group_create(GROUP_BOATS, true) 
  200. 		group_create(GROUP_GETAWAY_CAR, true) 
  201. 		group_create(GROUP_CAVERN_POLICE_2, true) 
  202.  
  203. 		on_death("failure_maero_death", CHAR_MAERO) 
  204. 		on_dismiss("failure_maero_dismiss", CHAR_MAERO) 
  205. 		on_death("failure_carlos_death", CHAR_CARLOS) 
  206. 		on_dismiss("failure_carlos_dismiss", CHAR_CARLOS) 
  207. 		 
  208. 		notoriety_set("police", 2)  
  209. 		notoriety_set_min("police", 2) 
  210. 		notoriety_set_max("police", 2) 
  211. 		notoriety_force_no_spawn("police", true) 
  212. 		notoriety_force_no_spawn("ultor", true) 
  213. 		 
  214. 		npc_weapon_pickup_override(CHAR_MAERO, false)  
  215. 		npc_weapon_pickup_override(CHAR_CARLOS, false)  
  216. 		 
  217. 		turn_invulnerable(SPEEDBOAT) 
  218.  
  219. 		inv_item_add("twelve_gauge", 1, CHAR_MAERO) 
  220. 		inv_item_add("glock", 1, CHAR_CARLOS) 
  221. 		inv_item_equip("twelve_gauge", CHAR_MAERO) 
  222. 		inv_item_equip("glock", CHAR_CARLOS) 
  223.    else 
  224. 		bh01_setup_cavern_start() 
  225. 	end 
  226.  
  227.    mission_start_fade_in() 
  228.  
  229.    if ( checkpoint == MISSION_START_CHECKPOINT ) then 
  230.    else 
  231. 		bh01_two_escape_paths() 
  232.    end 
  233. end 
  234.  
  235. function bh01_setup_cavern_start() 
  236. 	party_add(CHAR_MAERO, LOCAL_PLAYER) 
  237.  
  238. 	if ( coop_is_active() ) then 
  239. 		party_add(CHAR_CARLOS, REMOTE_PLAYER) 
  240. 	else 
  241. 		party_add(CHAR_CARLOS, LOCAL_PLAYER) 
  242. 	end 
  243.  
  244.    for index, override in pairs( CARLOS_PERSONA_OVERRIDES ) do 
  245.       persona_override_character_start( CHAR_CARLOS, override[1], override[2] ) 
  246.    end 
  247.    for index, override in pairs( MAERO_PERSONA_OVERRIDES ) do 
  248.       persona_override_character_start( CHAR_MAERO, override[1], override[2] ) 
  249.    end 
  250.  
  251. 	character_set_cannot_be_grabbed(CHAR_MAERO, true) 
  252. 	character_set_cannot_be_grabbed(CHAR_CARLOS, true) 
  253. 	 
  254. 	set_force_combat_ready_team( "Police" ) 
  255.  
  256. 	for i, npc in pairs(TABLE_COPS_FIRST_WAVE) do 
  257. 		npc_weapon_pickup_override(npc, false)  
  258. 		inv_item_remove_all(npc) 
  259. 		 
  260. 		local choice = rand_int(0, 2) 
  261. 		 
  262. 		if (npc == CHAR_FLASHBANG_COP) then 
  263. 			choice = 3 
  264. 		end 
  265.  
  266. 		if (choice == 0) then 
  267. 			inv_item_add("nightstick", 1, npc) 
  268. 			inv_item_equip("nightstick", npc) 
  269. 		elseif (choice == 1) then 
  270. 			inv_item_add("pepper_spray", 1, npc) 
  271. 			inv_item_equip("pepper_spray", npc) 
  272. 		elseif (choice == 2) then 
  273. 			inv_item_add("stun_gun", 1, npc) 
  274. 			inv_item_equip("stun_gun", npc) 
  275. 		else 
  276. 			inv_item_add("flashbang", 5, npc) 
  277. 			inv_item_equip("flashbang", npc) 
  278. 		end 
  279. 	end 
  280.  
  281. 	group_create(GROUP_BOATS, false) 
  282. 	group_create(GROUP_GETAWAY_CAR, false) 
  283. 	group_create_hidden(GROUP_CAVERN_POLICE_2) 
  284. 	turn_invulnerable(SPEEDBOAT) 
  285. 	npc_leash_to_nav(CHAR_LEASHED_COP_1, CHAR_LEASHED_COP_1, 4) 
  286. 	npc_leash_to_nav(CHAR_LEASHED_COP_2, CHAR_LEASHED_COP_1, 4) 
  287. 	npc_leash_to_nav(CHAR_LEASHED_COP_3, CHAR_LEASHED_COP_3, 4) 
  288. 	npc_leash_to_nav(CHAR_LEASHED_COP_4, CHAR_LEASHED_COP_4, 4) 
  289. 	npc_leash_to_nav(CHAR_LEASHED_COP_5, CHAR_LEASHED_COP_5, 4) 
  290. 	npc_leash_to_nav(CHAR_LEASHED_COP_6, CHAR_LEASHED_COP_6, 4) 
  291.  
  292. 	for i, set in pairs(CHAR_COP_AMBUSH) do 
  293. 		for j, npc in pairs(set) do 
  294. 			set_ignore_ai_flag(npc, true) 
  295. 		end 
  296. 	end 
  297.  
  298. 	THREAD_FLASHBANG = thread_new("bh01_cop_fire_flashbang") 
  299. 	THREAD_NPC_FLEE = thread_new("bh01_ambient_npcs_flee") 
  300.  
  301. 	notoriety_set("police", 2)  
  302. 	notoriety_set_min("police", 2) 
  303. 	notoriety_set_max("police", 2) 
  304. 	notoriety_force_no_spawn("police", true) 
  305. 	notoriety_force_no_spawn("ultor", true) 
  306.  
  307. 	npc_weapon_pickup_override(CHAR_MAERO, false)  
  308. 	npc_weapon_pickup_override(CHAR_CARLOS, false)  
  309. 	 
  310. 	inv_item_add("twelve_gauge", 1, CHAR_MAERO) 
  311. 	inv_item_add("glock", 1, CHAR_CARLOS) 
  312. 	inv_item_equip("twelve_gauge", CHAR_MAERO) 
  313. 	inv_item_equip("glock", CHAR_CARLOS) 
  314.  
  315. 	-- Setup callback for Maero's death 
  316. 	on_death("failure_maero_death", CHAR_MAERO) 
  317. 	on_dismiss("failure_maero_dismiss", CHAR_MAERO) 
  318. 	on_death("failure_carlos_death", CHAR_CARLOS) 
  319. 	on_dismiss("failure_carlos_dismiss", CHAR_CARLOS) 
  320.  
  321. 	THREAD_ESCAPE_CAVERNS = thread_new("bh01_escape_caverns") 
  322. 	THREAD_NOTORIETY = thread_new("bh01_watch_brotherhood_notoriety") 
  323. 	THREAD_WAYPOINT_2 = thread_new("bh01_watch_waypoint_2_proximity") 
  324. 	--THREAD_BRIDGE = thread_new("bh01_watch_main_bridge") 
  325.  
  326. 	for j = 1, (NUM_WAYPOINTS - 1), 1 do 
  327. 		THREAD_WAYPOINT[j] = thread_new("bh01_watch_waypoint_bypass", j) 
  328. 	end 
  329. 	THREAD_BACK_ROUTE = thread_new("bh01_watch_back_route") 
  330. end 
  331.  
  332. function bh01_ambient_npcs_flee() 
  333. 	delay(1) 
  334.  
  335. 	while (1) do 
  336. 		character_set_all_civilians_fleeing(LOCAL_PLAYER, 50) 
  337. 		delay(1) 
  338. 	end 
  339. end 
  340.  
  341. function bh01_watch_hood() 
  342. 	while (1) do 
  343. 		mission_help_table(get_current_hood_by_position("#PLAYER#")) 
  344. 		thread_yield() 
  345. 	end 
  346. end 
  347.  
  348. function bh01_player_is_on_land() 
  349. 	return get_current_hood_by_position("#PLAYER#") ~= 'No Hood' 
  350. end 
  351.  
  352. function bh01_cop_fire_flashbang() 
  353. 	delay(4) 
  354.    move_to_safe( CHAR_FLASHBANG_COP, NAVPOINT_FLASHBANG_THROW_POS, 1, false, false ) 
  355. 	force_throw(CHAR_FLASHBANG_COP, NAVPOINT_FLASHBANG_1, 23) 
  356. end 
  357.  
  358. function bh01_dialogue(char, dialogue) 
  359. 	while ( character_is_dead(char) or character_is_ragdolled(char) or character_is_on_fire(char) ) do 
  360. 		thread_yield() 
  361. 	end 
  362.  
  363.    audio_play_for_character( dialogue, char, "voice", false, true ) 
  364. end 
  365.  
  366. function bh01_watch_main_bridge() 
  367. 	while(1) do 
  368. 		if ( bh01_either_player_near( NAVPOINT_MAIN_BRIDGE, 8 ) and (not Taking_back_route) and (not Player_has_exited_caverns) ) then 
  369. 			bh01_dialogue(CHAR_CARLOS, "bh01_not_that_way") 
  370. 			delay(15) 
  371. 		end 
  372. 		thread_yield() 
  373. 	end 
  374. end 
  375.  
  376. function bh01_watch_waypoint_2_proximity() 
  377. 	while ( ( not bh01_either_player_near( CAVERN_WAYPOINTS[3], 40 ) ) and (not Taking_back_route) and (not Player_has_exited_caverns) ) do 
  378. 		thread_yield() 
  379. 	end 
  380. 	group_show(GROUP_CAVERN_POLICE_2) 
  381. end 
  382.  
  383. function bh01_watch_back_route() 
  384. 	while(not Taking_back_route) do 
  385. 		thread_yield() 
  386. 		if ( bh01_either_player_near( NAVPOINT_BACK_ROUTE, 20 ) ) then 
  387. 			Taking_back_route = true 
  388. 			TABLE_WAYPOINT_BYPASSED[1] = true 
  389. 			TABLE_WAYPOINT_BYPASSED[2] = true 
  390. 			TABLE_WAYPOINT_BYPASSED[3] = true 
  391. 		end 
  392. 	end 
  393. end 
  394.  
  395. function bh01_watch_waypoint_bypass(waypoint_id) 
  396. 	while(not Player_begun_exiting_caverns and not TABLE_WAYPOINT_BYPASSED[waypoint_id]) do 
  397. 		if bh01_either_player_near( CAVERN_WAYPOINTS[waypoint_id], 10 ) then 
  398. 			for i = 1, waypoint_id, 1 do 
  399. 				TABLE_WAYPOINT_BYPASSED[i] = true 
  400. 			end 
  401. 		end 
  402. 		thread_yield() 
  403. 	end 
  404. end 
  405.  
  406. function bh01_watch_brotherhood_notoriety() 
  407. 	while(notoriety_get("brotherhood") < 2) do 
  408. 		thread_yield() 
  409. 	end 
  410. 	failure_brotherhood_notoriety() 
  411. end 
  412.  
  413.  
  414. function bh01_escape_caverns() 
  415. 	bh01_dialogue(CHAR_MAERO, "MAERO_BR01_COPSATTACK_1") 
  416. 	bh01_dialogue(CHAR_CARLOS, "CARLOS_BR01_GETOUT") 
  417. 	mission_help_table("bh01_escape_caverns") 
  418. 	delay(3) 
  419.  
  420. 	bh01_navigate_cavern_waypoints() 
  421.  
  422. 	thread_yield() 
  423. end 
  424.  
  425. function bh01_navigate_cavern_waypoints() 
  426. 	Player_begun_exiting_caverns = true 
  427.  
  428. 	for i = 1, NUM_WAYPOINTS, 1 do 
  429. 		while i < NUM_WAYPOINTS and TABLE_WAYPOINT_BYPASSED[i] do 
  430. 			i = i + 1 
  431. 			thread_yield() 
  432. 		end 
  433.  
  434. 		if (i <= NUM_WAYPOINTS) and (not TABLE_WAYPOINT_BYPASSED[i]) then 
  435. 			marker_add_navpoint(CAVERN_WAYPOINTS[i], MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  436. 			while ( ( not bh01_either_player_near( CAVERN_WAYPOINTS[i], 10 ) ) and (not Player_has_exited_caverns) ) do 
  437. 				thread_yield() 
  438. 				if TABLE_WAYPOINT_BYPASSED[i] then 
  439. 					break 
  440. 				end 
  441. 			end 
  442. 			marker_remove_navpoint(CAVERN_WAYPOINTS[i]) 
  443.  
  444. 			if Player_has_exited_caverns then 
  445. 				i = NUM_WAYPOINTS 
  446. 			end 
  447. 			thread_yield() 
  448. 		end 
  449. 	end 
  450.  
  451. 	mission_set_checkpoint(CHECKPOINT_TWO_PATHS) 
  452.  
  453. 	bh01_two_escape_paths() 
  454. end 
  455.  
  456.  
  457. function bh01_two_escape_paths_msg() 
  458. 	mission_help_table("bh01_getaway_choices") 
  459. end 
  460.  
  461. function bh01_two_escape_paths() 
  462. 	trigger_enable(TRIGGER_CAVE, true) 
  463. 	marker_add_trigger(TRIGGER_CAVE, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  464. 	on_trigger("bh01_get_to_tribal_hq_by_water", TRIGGER_CAVE) 
  465.  
  466. 	trigger_enable(TRIGGER_GIFT_SHOP, true) 
  467. 	marker_add_trigger(TRIGGER_GIFT_SHOP, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  468. 	on_trigger("bh01_get_to_tribal_hq_by_land", TRIGGER_GIFT_SHOP) 
  469.  
  470. 	bh01_cop_ambush() 
  471.    bh01_dialogue( CHAR_CARLOS, "CARLOS_BR01_MISSION_FORK" ) 
  472. 	thread_new("bh01_two_escape_paths_msg") 
  473. end 
  474.  
  475. function bh01_cop_ambush() 
  476. 	for i, set in pairs(CHAR_COP_AMBUSH) do 
  477. 		for j, npc in pairs(set) do 
  478. 			THREAD_AMBUSH[j + ((i-1)*2)] = thread_new("bh01_ambush_path", npc, NAVPOINT_AMBUSH[i]) 
  479. 		end 
  480. 	end 
  481. end 
  482.  
  483. function bh01_ambush_path(npc, nav) 
  484. 	set_ignore_ai_flag(npc, true) 
  485. 	move_to(npc, nav, 2, true, true) 
  486. 	set_ignore_ai_flag(npc, false) 
  487. 	turn_to_char(npc, LOCAL_PLAYER) 
  488. end 
  489.  
  490. function bh01_spawn_police_boat() 
  491. 	group_create(GROUP_POLICE_HELI, true) 
  492. 	group_create(GROUP_POLICE_BOATS, true) 
  493. 	group_create(GROUP_POLICE_BOAT_DRIVERS, true) 
  494.  
  495. 	set_cops_shooting_from_vehicles(true) 
  496. 	vehicle_suppress_npc_exit(POLICE_HELI, true) 
  497. 	vehicle_enter_teleport(CHAR_POLICE_HELI_PILOT, POLICE_HELI, 0) 
  498. 	vehicle_enter_teleport(CHAR_POLICE_HELI_PILOT_2, POLICE_HELI, 3) 
  499. 	vehicle_enter_teleport(CHAR_POLICE_HELI_PILOT_3, POLICE_HELI, 2) 
  500.  
  501. 	npc_combat_enable(CHAR_POLICE_BOAT_DRIVER_1, true) 
  502. 	npc_combat_enable(CHAR_POLICE_BOAT_DRIVER_2, true) 
  503. 	vehicle_enter_teleport(CHAR_POLICE_BOAT_DRIVER_1, POLICE_BOAT_1) 
  504. 	vehicle_enter_teleport(CHAR_POLICE_BOAT_DRIVER_2, POLICE_BOAT_2) 
  505.  
  506. 	THREAD_POLICE_BOAT[1] = thread_new("bh01_police_boat_1") 
  507. 	THREAD_POLICE_BOAT[2] = thread_new("bh01_police_boat_2") 
  508. 	THREAD_POLICE_HELI = thread_new("bh01_police_heli") 
  509.  
  510. 	THREAD_WATERCRAFT_PROXIMITY = thread_new("bh01_spawn_watercraft_on_proximity") 
  511. end 
  512.  
  513. function bh01_spawn_watercraft_on_proximity() 
  514. 	group_create_hidden(GROUP_WATER_GETAWAY_POLICE) 
  515. 	vehicle_enter_teleport(CHAR_WATERCRAFT_DRIVER_1, WATERCRAFT_1, 0) 
  516. 	vehicle_enter_teleport(CHAR_WATERCRAFT_DRIVER_2, WATERCRAFT_2, 0) 
  517. 	group_show(GROUP_WATER_GETAWAY_POLICE) 
  518.  
  519. 	while get_dist_char_to_nav(LOCAL_PLAYER, WATERCRAFT_1) > 150 do 
  520. 		thread_yield() 
  521. 	end 
  522.  
  523. 	THREAD_WATERCRAFT[1] = thread_new("bh01_watercraft_1") 
  524. 	THREAD_WATERCRAFT[2] = thread_new("bh01_watercraft_2") 
  525. end 
  526.  
  527. function bh01_watercraft_1() 
  528. 	vehicle_chase(WATERCRAFT_1, LOCAL_PLAYER, false, true, true) 
  529. end 
  530.  
  531. function bh01_watercraft_2() 
  532. 	vehicle_chase(WATERCRAFT_2, LOCAL_PLAYER, false, true, true) 
  533. end 
  534.  
  535. function bh01_police_heli() 
  536. 	vehicle_chase(POLICE_HELI, LOCAL_PLAYER) 
  537. end 
  538.  
  539. function bh01_police_boat_1() 
  540. 	vehicle_chase(POLICE_BOAT_1, LOCAL_PLAYER, false, true, true) 
  541. end 
  542.  
  543. function bh01_police_boat_2() 
  544. 	if ( coop_is_active() ) then 
  545. 		vehicle_chase(POLICE_BOAT_2, REMOTE_PLAYER, false, true, true) 
  546. 	else 
  547. 		vehicle_chase(POLICE_BOAT_2, LOCAL_PLAYER, false, true, true) 
  548. 	end 
  549. end 
  550.  
  551. function bh01_get_to_tribal_hq_by_land() 
  552. 	Player_has_exited_caverns = true 
  553. 	Player_taking_land_getaway = true 
  554.  
  555. 	notoriety_force_no_spawn("police", false) 
  556. 	notoriety_force_no_spawn("ultor", false) 
  557.  
  558. 	-- Display checkpoint message 
  559. 	mission_help_table("bh01_take_maero_to_hq") 
  560.  
  561. 	on_trigger("", TRIGGER_CAVE) 
  562. 	trigger_enable(TRIGGER_CAVE, false) 
  563. 	marker_remove_trigger(TRIGGER_CAVE, SYNC_ALL) 
  564. 	mission_waypoint_remove() 
  565.  
  566. 	on_trigger("", TRIGGER_GIFT_SHOP) 
  567. 	trigger_enable(TRIGGER_GIFT_SHOP, false) 
  568. 	marker_remove_trigger(TRIGGER_GIFT_SHOP, SYNC_ALL) 
  569. 	mission_waypoint_remove() 
  570.  
  571. 	group_create(GROUP_ROADBLOCKS, true) 
  572.  
  573. 	--trigger_enable(TRIGGER_TRIBAL_HQ, true) 
  574. 	marker_add_navpoint(TRIGGER_TRIBAL_HQ, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  575. 	--on_trigger("Ttribal_hq_reached", TRIGGER_TRIBAL_HQ) 
  576. 	mission_waypoint_add(TRIGGER_TRIBAL_HQ, SYNC_ALL) 
  577.  
  578. 	bh01_kill_cavern_threads() 
  579.  
  580. 	THREAD_GETAWAY = thread_new("bh01_handle_getaway_choice") 
  581. end 
  582.  
  583. function bh01_get_to_tribal_hq_by_water()  
  584. 	Player_has_exited_caverns = true 
  585. 	Player_taking_land_getaway = false 
  586.  
  587. 	-- Fade out and wait for the fade to complete 
  588. 	follower_make_independent( CHAR_CARLOS, true ) 
  589. 	follower_make_independent( CHAR_MAERO, true ) 
  590. 	fade_out(1.0) 
  591. 	while (fade_get_percent() < 1.0) do 
  592. 		thread_yield() 
  593. 	end 
  594.  
  595. 	-- Teleport the player(s) into the vehicle 
  596. 	vehicle_enter_teleport(LOCAL_PLAYER, "bh01_$speedboat", 0) 
  597. 	turn_vulnerable(SPEEDBOAT) 
  598.  
  599. 	if ( coop_is_active() ) then 
  600. 		vehicle_enter_teleport(REMOTE_PLAYER, "bh01_$speedboat", 2) 
  601.  
  602. 		vehicle_enter_teleport(CHAR_MAERO, "bh01_$speedboat", 1) 
  603. 		vehicle_enter_teleport(CHAR_CARLOS, "bh01_$speedboat", 3) 
  604. 	else 
  605. 		vehicle_enter_teleport(CHAR_MAERO, "bh01_$speedboat", 1) 
  606. 		vehicle_enter_teleport(CHAR_CARLOS, "bh01_$speedboat", 2) 
  607. 	end 
  608.  
  609. 	follower_make_independent( CHAR_CARLOS, false ) 
  610. 	follower_make_independent( CHAR_MAERO, false ) 
  611.  
  612. 	-- Fade in and wait for the fade to complete roughly 50% 
  613. 	fade_in(1.0) 
  614. 	while (fade_get_percent() > 0.5) do 
  615. 		thread_yield() 
  616. 	end 
  617.  
  618. 	notoriety_force_no_spawn("police", false) 
  619. 	notoriety_force_no_spawn("ultor", false) 
  620.  
  621. 	THREAD_POLICE_BOATS = thread_new("bh01_spawn_police_boat") 
  622. 	 
  623. 	-- Display checkpoint message 
  624. 	mission_help_table("bh01_take_maero_to_hq") 
  625.  
  626. 	on_trigger("", TRIGGER_CAVE) 
  627. 	trigger_enable(TRIGGER_CAVE, false) 
  628. 	marker_remove_trigger(TRIGGER_CAVE, SYNC_ALL) 
  629. 	mission_waypoint_remove() 
  630.  
  631. 	on_trigger("", TRIGGER_GIFT_SHOP) 
  632. 	trigger_enable(TRIGGER_GIFT_SHOP, false) 
  633. 	marker_remove_trigger(TRIGGER_GIFT_SHOP, SYNC_ALL) 
  634. 	mission_waypoint_remove() 
  635.  
  636. 	--trigger_enable(TRIGGER_TRIBAL_HQ_DOCK, true) 
  637. 	marker_add_navpoint(TRIGGER_TRIBAL_HQ_DOCK, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  638. 	mission_waypoint_add(TRIGGER_TRIBAL_HQ_DOCK, SYNC_ALL) 
  639.  
  640. 	bh01_kill_cavern_threads() 
  641.  
  642. 	THREAD_GETAWAY = thread_new("bh01_handle_getaway_choice") 
  643. end 
  644.  
  645. function bh01_kill_cavern_threads() 
  646. 	for i, thread in pairs(ALL_CAVERN_THREADS) do 
  647. 		if thread ~= -1 then 
  648. 			thread_kill(thread) 
  649. 		end 
  650. 	end 
  651. end 
  652.  
  653. function bh01_switch_to_land_getaway() 
  654. 	Player_taking_land_getaway = true 
  655.  
  656. 	--on_trigger("",TRIGGER_TRIBAL_HQ_DOCK) 
  657. 	--trigger_enable(TRIGGER_TRIBAL_HQ_DOCK,false) 
  658. 	marker_remove_navpoint(TRIGGER_TRIBAL_HQ_DOCK,SYNC_ALL) 
  659. 	mission_waypoint_remove() 
  660.  
  661. 	--trigger_enable(TRIGGER_TRIBAL_HQ, true) 
  662. 	marker_add_navpoint(TRIGGER_TRIBAL_HQ, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  663. 	--on_trigger("Ttribal_hq_reached", TRIGGER_TRIBAL_HQ) 
  664. 	mission_waypoint_add( TRIGGER_TRIBAL_HQ, SYNC_ALL ) 
  665. end 
  666.  
  667. function bh01_switch_to_water_getaway() 
  668. 	Player_taking_land_getaway = false 
  669.  
  670. 	--on_trigger("",TRIGGER_TRIBAL_HQ) 
  671. 	--trigger_enable(TRIGGER_TRIBAL_HQ,false) 
  672. 	marker_remove_navpoint(TRIGGER_TRIBAL_HQ,SYNC_ALL) 
  673. 	mission_waypoint_remove() 
  674.  
  675. 	--trigger_enable(TRIGGER_TRIBAL_HQ_DOCK, true) 
  676. 	marker_add_navpoint(TRIGGER_TRIBAL_HQ_DOCK, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_LOCATION, SYNC_ALL) 
  677. 	mission_waypoint_add(TRIGGER_TRIBAL_HQ_DOCK, SYNC_ALL) 
  678. end 
  679.  
  680. function bh01_handle_getaway_choice() 
  681. 	while not (bh01_tribal_hq_dock_reached() or bh01_tribal_hq_land_reached()) do 
  682. 		if Player_taking_land_getaway then 
  683. 			if bh01_player_is_in_boat() then 
  684. 				bh01_switch_to_water_getaway() 
  685. 			end 
  686. 		else 
  687. 			if (bh01_player_is_on_land() and not bh01_player_is_in_boat()) or bh01_player_is_in_car() then 
  688. 				bh01_switch_to_land_getaway() 
  689. 			end 
  690. 		end 
  691. 		thread_yield() 
  692. 	end 
  693.  
  694. 	bh01_tribal_hq_reached() 
  695. end 
  696.  
  697. function bh01_player_is_in_boat() 
  698. 	return get_char_vehicle_type(LOCAL_PLAYER) == 4 
  699. end 
  700.  
  701. function bh01_player_is_in_car() 
  702. 	return get_char_vehicle_type(LOCAL_PLAYER) < 2 
  703. end 
  704.  
  705. function bh01_local_player_near( navpoint_name, distance ) 
  706.    if ( get_dist_char_to_nav( LOCAL_PLAYER, navpoint_name ) < distance ) then 
  707.       return true 
  708.    end 
  709.  
  710.    return false 
  711. end 
  712.  
  713. function bh01_either_player_near( navpoint_name, distance ) 
  714.    if ( bh01_local_player_near( navpoint_name, distance ) ) then 
  715.       return true 
  716.    end 
  717.    if ( coop_is_active() and get_dist_char_to_nav( REMOTE_PLAYER, navpoint_name ) < distance ) then 
  718.       return true 
  719.    end 
  720.  
  721.    return false 
  722. end 
  723.  
  724. function bh01_tribal_hq_dock_reached() 
  725.    return ( bh01_local_player_near( TRIGGER_TRIBAL_HQ_DOCK, WIN_DISTANCE_METERS ) and (not Player_taking_land_getaway ) ) 
  726. end 
  727.  
  728. function bh01_tribal_hq_land_reached() 
  729.    return ( bh01_local_player_near( TRIGGER_TRIBAL_HQ, WIN_DISTANCE_METERS ) and Player_taking_land_getaway ) 
  730. end 
  731.  
  732. function bh01_tribal_hq_reached() 
  733. 	for i, thread in pairs(ALL_THREADS) do 
  734. 		if thread ~= -1 then 
  735. 			thread_kill(thread) 
  736. 		end 
  737. 	end 
  738.  
  739. 	if Player_taking_land_getaway then 
  740. 		marker_remove_navpoint(TRIGGER_TRIBAL_HQ, SYNC_ALL) 
  741. 	else  
  742. 		marker_remove_navpoint(TRIGGER_TRIBAL_HQ_DOCK, SYNC_ALL) 
  743. 	end 
  744. 	 
  745. 	mission_waypoint_remove() 
  746.  
  747.    -- Stop the players' vehicles when they reach the HQ trigger 
  748.    if ( get_dist( LOCAL_PLAYER, TRIGGER_TRIBAL_HQ_DOCK ) < WIN_DISTANCE_METERS or 
  749.         get_dist( LOCAL_PLAYER, TRIGGER_TRIBAL_HQ ) < WIN_DISTANCE_METERS ) then 
  750.       if ( character_is_in_vehicle( LOCAL_PLAYER ) ) then 
  751.          player_controls_disable( LOCAL_PLAYER ) 
  752.          vehicle_stop_do( LOCAL_PLAYER ) 
  753.       end 
  754.    end 
  755.    if ( coop_is_active() ) then 
  756.       if ( get_dist( REMOTE_PLAYER, TRIGGER_TRIBAL_HQ_DOCK ) < WIN_DISTANCE_METERS or 
  757.            get_dist( REMOTE_PLAYER, TRIGGER_TRIBAL_HQ ) < WIN_DISTANCE_METERS ) then 
  758.          if ( character_is_in_vehicle( REMOTE_PLAYER ) ) then 
  759.             player_controls_disable( REMOTE_PLAYER ) 
  760.             vehicle_stop_do( REMOTE_PLAYER ) 
  761.          end 
  762.       end 
  763.    end 
  764.  
  765. 	bh01_success_tribal_hq_reached() 
  766. end 
  767.  
  768. function bh01_success_tribal_hq_reached() 
  769.    Mission_won = true 
  770. 	mission_end_success( "bh01", CT_OUTRO, { NAVPOINT_BOAT_FINISH_LOCAL, NAVPOINT_BOAT_FINISH_REMOTE } ) 
  771. end 
  772.  
  773. function failure_maero_death() 
  774. 	mission_end_failure("bh01", "bh01_maero_died") 
  775. end 
  776.  
  777. function failure_maero_dismiss() 
  778. 	mission_end_failure("bh01", "bh01_maero_dismissed") 
  779. end 
  780.  
  781. function failure_carlos_death() 
  782. 	mission_end_failure("bh01", "bh01_carlos_died") 
  783. end 
  784.  
  785. function failure_carlos_dismiss() 
  786. 	mission_end_failure("bh01", "bh01_carlos_dismissed") 
  787. end 
  788.  
  789. function failure_brotherhood_notoriety() 
  790. 	mission_end_failure("bh01", "bh01_brotherhood_notoriety") 
  791. end 
  792.  
  793.  
  794. function bh01_cleanup() 
  795. 	-- Cleanup mission here 
  796. 	for i, thread in pairs(ALL_THREADS) do 
  797. 		if thread ~= -1 then 
  798. 			thread_kill(thread) 
  799. 		end 
  800. 	end 
  801.  
  802. 	on_death("", CHAR_MAERO) 
  803. 	on_dismiss("", CHAR_MAERO) 
  804. 	on_death("", CHAR_CARLOS) 
  805. 	on_dismiss("", CHAR_CARLOS) 
  806. 	on_notoriety_event("") 
  807. 	notoriety_reset("police")  
  808. 	ambient_gang_spawn_enable(true) 
  809. 	group_destroy(GROUP_ALLIES) 
  810. 	release_to_world(GROUP_GETAWAY_CAR) 
  811. 	release_to_world(GROUP_BOATS) 
  812. 	release_to_world(GROUP_POLICE_BOATS) 
  813. 	release_to_world(GROUP_WATER_GETAWAY_POLICE) 
  814. 	ambient_gang_spawn_enable(true) 
  815.    party_allow_max_followers( false ) 
  816.  
  817. 	-- Clean up all navpoints 
  818. 	for index, name in pairs( CAVERN_WAYPOINTS ) do 
  819. 		marker_remove_navpoint( name ) 
  820. 	end 
  821. 	marker_remove_trigger(TRIGGER_CAVE) 
  822. 	marker_remove_trigger(TRIGGER_GIFT_SHOP) 
  823.  
  824. 	marker_remove_navpoint(TRIGGER_TRIBAL_HQ) 
  825. 	marker_remove_navpoint(TRIGGER_TRIBAL_HQ_DOCK) 
  826.  
  827. 	if ( Mission_won ) then 
  828.       if( coop_is_active() ) then 
  829.          character_evacuate_from_all_vehicles(REMOTE_PLAYER) 
  830.          teleport( REMOTE_PLAYER, NAVPOINT_BOAT_FINISH_REMOTE ) 
  831.       end 
  832.       character_evacuate_from_all_vehicles(LOCAL_PLAYER) 
  833.       teleport( LOCAL_PLAYER, NAVPOINT_BOAT_FINISH_LOCAL ) 
  834.    end 
  835.  
  836. end 
  837.  
  838. function bh01_success() 
  839. end