sr2lua/bh09.lua

  1. -- bh09.lua 
  2. -- SR2 mission script 
  3. -- 3/28/07 
  4.  
  5. -- Groups -- 
  6. 	GROUP_ULTOR =						"bh09_$ultor" 
  7. 	GROUP_WAVE1 =						"bh09_$wave1" 
  8. 	GROUP_WAVE2 =						"bh09_$wave2" 
  9. 	GROUP_WAVE3 =						"bh09_$wave3" 
  10.    GROUPS_WAVES = { GROUP_WAVE1, GROUP_WAVE2, GROUP_WAVE3 } 
  11. 	GROUP_START =						"bh09_$start" 
  12.    GROUP_START_COOP =            "bh09_$start_coop" 
  13. 	GROUP_SAINTS =						"bh09_$saints" 
  14. 	GROUP_COURTESY_HELI =			"bh09_$courtesy_heli" 
  15.    GROUP_HELI_DESTROYERS =       "bh09_$Heli_Destroyers" 
  16.  
  17. -- Navpoints -- 
  18. 	NAV_LOCAL_START =					"bh09_$n010" 
  19. 	NAV_REMOTE_START =				"bh09_$n011" 
  20. 	NAV_SHIP =							"bh09_$n000" 
  21.  
  22. 	NAV_HELI_PATHS =					{ "bh09_$heli_path_01", "bh09_$heli_path_02", "bh09_$heli_path_03", 
  23.                                    "bh09_$heli_path_04", "bh09_$heli_path_05", "bh09_$heli_path_06" } 
  24.    NAV_HELI_DROPOFFS =           { "bh09_$heli_dropoff_01", "bh09_$heli_dropoff_02", "bh09_$heli_dropoff_03", 
  25.                                    "bh09_$heli_dropoff_04", "bh09_$heli_dropoff_05", "bh09_$heli_dropoff_06" } 
  26.  
  27.    NAV_BOAT_LEFT_GOAL =          "bh09_$boat_left_goal" 
  28.    NAV_BOAT_RIGHT_GOAL =          "bh09_$boat_right_goal" 
  29. 	NAV_BOAT_PATH_LEFT =				"bh09_$boat_path_left" 
  30. 	NAV_BOAT_PATH_RIGHT =			"bh09_$boat_path_right" 
  31.  
  32.    NAV_BOAT_LEAVE_PATH_LEFT =    "bh09_$boat_leave_path_left" 
  33.    NAV_BOAT_LEAVE_PATH_RIGHT =   "bh09_$boat_leave_path_right" 
  34.  
  35. 	NAV_CHECKPOINT_LOCAL =			"bh09_$nav_checkpoint_local" 
  36. 	NAV_CHECKPOINT_REMOTE =			"bh09_$nav_checkpoint_remote" 
  37.  
  38.    NAV_STAIRS_LEFT_PATH_STARTS = { "bh09_$stairs_left_path_start_01", "bh09_$stairs_left_path_start_02", "bh09_$stairs_left_path_start_03" } 
  39.    NUM_LEFT_PATH_STARTS = sizeof_table( NAV_STAIRS_LEFT_PATH_STARTS ) 
  40.    NAV_STAIRS_RIGHT_PATH_STARTS = { "bh09_$stairs_right_path_start_01", "bh09_$stairs_right_path_start_02", "bh09_$stairs_right_path_start_03" } 
  41.    NUM_RIGHT_PATH_STARTS = sizeof_table( NAV_STAIRS_RIGHT_PATH_STARTS ) 
  42.  
  43. 	NAV_STAIRS_LEFT_PATH =					"bh09_$stairs_left" 
  44. 	NAV_STAIRS_RIGHT_PATH =				"bh09_$stairs_right" 
  45.  
  46. -- Characters -- 
  47. 	TABLE_ULTOR_RPG =					{"bh09_$UAD_RPG01", "bh09_$UAD_RPG02", "bh09_$UAD_RPG03", "bh09_$UAD_RPG04"} 
  48.  
  49.    TABLE_ULTOR_ABOVEDECKS = { "bh09_$UAD_M01", "bh09_$UAD_M02", "bh09_$UAD_M03", "bh09_$UAD_M04", "bh09_$UAD_M05", 
  50.                               "bh09_$UAD_M06", "bh09_$UAD_M07", "bh09_$UAD_M08", "bh09_$UAD_M09", 
  51.                               TABLE_ULTOR_RPG[1], TABLE_ULTOR_RPG[2], TABLE_ULTOR_RPG[3], TABLE_ULTOR_RPG[4], 
  52.                               TABLE_ULTOR_RPG[5] } 
  53.  
  54.    TABLE_ULTOR_BELOWDECKS = { "bh09_$UBD_M01", "bh09_$UBD_M02", "bh09_$UBD_M03", "bh09_$UBD_M04", "bh09_$UBD_M05" } 
  55.  
  56. 	TABLE_ULTOR_STD = { "bh09_$UAD_M01", "bh09_$UAD_M02", "bh09_$UAD_M03", "bh09_$UAD_M04", "bh09_$UAD_M05", 
  57.                        "bh09_$UAD_M06", "bh09_$UAD_M07", "bh09_$UAD_M08", "bh09_$UAD_M09", 
  58.                        "bh09_$UBD_M01", "bh09_$UBD_M02", "bh09_$UBD_M03", "bh09_$UBD_M04", "bh09_$UBD_M05" } 
  59.  
  60.    TABLE_ALL_ULTOR = { "bh09_$UAD_M01", "bh09_$UAD_M02", "bh09_$UAD_M03", "bh09_$UAD_M04", "bh09_$UAD_M05", 
  61.                        "bh09_$UAD_M06", "bh09_$UAD_M07", "bh09_$UAD_M08", "bh09_$UAD_M09", 
  62.                        TABLE_ULTOR_RPG[1], TABLE_ULTOR_RPG[2], TABLE_ULTOR_RPG[3], TABLE_ULTOR_RPG[4], 
  63.                        TABLE_ULTOR_RPG[5], 
  64.                        "bh09_$UBD_M01", "bh09_$UBD_M02", "bh09_$UBD_M03", "bh09_$UBD_M04", "bh09_$UBD_M05" } 
  65.  
  66.    TABLE_HELI_DESTROYERS = { "bh09_$HD1", "bh09_$HD2", "bh09_$HD3" } 
  67.  
  68. 	CHARS_WAVE1_HELIS =				{ { "bh09_$w1_h1_m1", "bh09_$w1_h1_m2" }, 
  69. 											  { "bh09_$w1_h2_m1", "bh09_$w1_h2_m2" } } 
  70.  
  71. 	CHARS_WAVE2_HELIS =				{ { "bh09_$w2_h1_m1", "bh09_$w2_h1_m2" }, 
  72. 											  { "bh09_$w2_h2_m1", "bh09_$w2_h2_m2" }, 
  73. 											  { "bh09_$w2_h3_m1", "bh09_$w2_h3_m2" } } 
  74.  
  75. 	CHARS_WAVE3_HELIS =				{ { "bh09_$w3_h1_m1", "bh09_$w3_h1_m2" }, 
  76. 										     { "bh09_$w3_h2_m1", "bh09_$w3_h2_m2" }, 
  77. 										     { "bh09_$w3_h3_m1", "bh09_$w3_h3_m2" }, 
  78. 										     { "bh09_$w3_h4_m1", "bh09_$w3_h4_m2" }, 
  79. 										     { "bh09_$w3_h5_m1", "bh09_$w3_h5_m2" }, 
  80. 										     { "bh09_$w3_h6_m1", "bh09_$w3_h6_m2" } } 
  81.  
  82. 	CHARS_WAVES_HELIS = { CHARS_WAVE1_HELIS, CHARS_WAVE2_HELIS, CHARS_WAVE3_HELIS } 
  83.  
  84. 	CHARS_WAVE1_BOATS =				{ { "bh09_$w1_b1_m1", "bh09_$w1_b1_m2", "bh09_$w1_b1_m3" }, 
  85. 										     { "bh09_$w1_b2_m1", "bh09_$w1_b2_m2" }, 
  86. 										     { "bh09_$w1_b3_m1", "bh09_$w1_b3_m2", "bh09_$w1_b3_m3" }, 
  87. 										     { "bh09_$w1_b4_m1", "bh09_$w1_b4_m2", "bh09_$w1_b4_m3" }, 
  88. 										     { "bh09_$w1_b5_m1", "bh09_$w1_b5_m2", "bh09_$w1_b5_m3" } } 
  89.  
  90. 	CHARS_WAVE2_BOATS =				{ { "bh09_$w2_b1_m1", "bh09_$w2_b1_m2" }, 
  91. 										     { "bh09_$w2_b2_m1", "bh09_$w2_b2_m2", "bh09_$w2_b2_m3" }, 
  92. 										     { "bh09_$w2_b3_m1", "bh09_$w2_b3_m2", "bh09_$w2_b3_m3" }, 
  93. 										     { "bh09_$w2_b4_m1", "bh09_$w2_b4_m2", "bh09_$w2_b4_m3" }, 
  94. 										     { "bh09_$w2_b5_m1", "bh09_$w2_b5_m2", "bh09_$w2_b5_m3" }, 
  95. 										     { "bh09_$w2_b6_m1", "bh09_$w2_b6_m2" } } 
  96.  
  97. 	CHARS_WAVE3_BOATS =				{ { "bh09_$w3_b1_m1", "bh09_$w3_b1_m2", "bh09_$w3_b1_m3" }, 
  98. 										     { "bh09_$w3_b2_m1", "bh09_$w3_b2_m2", "bh09_$w3_b2_m3" }, 
  99. 										     { "bh09_$w3_b3_m1", "bh09_$w3_b3_m2" }, 
  100. 										     { "bh09_$w3_b4_m1", "bh09_$w3_b4_m2", "bh09_$w3_b4_m3" }, 
  101. 										     { "bh09_$w3_b5_m1", "bh09_$w3_b5_m2", "bh09_$w3_b5_m3" }, 
  102. 										     { "bh09_$w3_b6_m1", "bh09_$w3_b6_m2" }, 
  103.                                    { "bh09_$w3_b7_m1", "bh09_$w3_b7_m2" }, 
  104.                                    { "bh09_$w3_b8_m1", "bh09_$w3_b8_m2", "bh09_$w3_b8_m3" } } 
  105.  
  106. 	CHARS_WAVES_BOATS = { CHARS_WAVE1_BOATS, CHARS_WAVE2_BOATS, CHARS_WAVE3_BOATS } 
  107.  
  108.    BOAT_DRIVER_COUNT = 1 
  109.    BOAT_DRIVER_INDEX = 1 
  110.  
  111. 	CHARS_SAINTS =						{"bh09_$c062", "bh09_$c063"}	 
  112.  
  113. -- Vehicles -- 
  114. 	VEH_START =							{ "bh09_$v022", "bh09_$v023", "bh09_$v024" } 
  115.  
  116.  
  117. 	VEH_WAVE1_HELIS =					{ "bh09_$w1_heli1", "bh09_$w1_heli2" } 
  118. 	VEH_WAVE1_BOATS =					{ "bh09_$w1_boat1", "bh09_$w1_boat2", "bh09_$w1_boat3", 
  119.                                    "bh09_$w1_boat4", "bh09_$w1_boat5" } 
  120.  
  121. 	VEH_WAVE1_BOATS_LEFT =			{ VEH_WAVE1_BOATS[1], VEH_WAVE1_BOATS[2] } 
  122. 	VEH_WAVE1_BOATS_RIGHT =			{ VEH_WAVE1_BOATS[3], VEH_WAVE1_BOATS[4], VEH_WAVE1_BOATS[5] } 
  123.  
  124.    VEH_WAVE2_HELIS =					{ "bh09_$w2_heli1", "bh09_$w2_heli2", "bh09_$w2_heli3" } 
  125. 	VEH_WAVE2_BOATS =					{ "bh09_$w2_boat1", "bh09_$w2_boat2", "bh09_$w2_boat3", 
  126.                                    "bh09_$w2_boat4", "bh09_$w2_boat5", "bh09_$w2_boat6" } 
  127.  
  128. 	VEH_WAVE2_BOATS_LEFT =			{ VEH_WAVE2_BOATS[4], VEH_WAVE2_BOATS[5], VEH_WAVE2_BOATS[6] } 
  129. 	VEH_WAVE2_BOATS_RIGHT =			{ VEH_WAVE2_BOATS[1], VEH_WAVE2_BOATS[2], VEH_WAVE2_BOATS[3] } 
  130.  
  131. 	VEH_WAVE3_HELIS =					{ "bh09_$w3_heli1", "bh09_$w3_heli2", "bh09_$w3_heli3", 
  132.                                    "bh09_$w3_heli4", "bh09_$w3_heli5", "bh09_$w3_heli6" } 
  133.  
  134. 	VEH_WAVE3_BOATS =					{ "bh09_$w3_boat1", "bh09_$w3_boat2", "bh09_$w3_boat3", 
  135.                                    "bh09_$w3_boat4", "bh09_$w3_boat5", "bh09_$w3_boat6", 
  136.                                    "bh09_$w3_boat7", "bh09_$w3_boat8" } 
  137.  
  138. 	VEH_WAVE3_BOATS_LEFT =			{ VEH_WAVE3_BOATS[1], VEH_WAVE3_BOATS[2], VEH_WAVE3_BOATS[3], 
  139.                                    VEH_WAVE3_BOATS[4] } 
  140. 	VEH_WAVE3_BOATS_RIGHT =			{ VEH_WAVE3_BOATS[5], VEH_WAVE3_BOATS[6], VEH_WAVE3_BOATS[7], 
  141.                                    VEH_WAVE3_BOATS[8] } 
  142. 	VEH_SAINTS =						"bh09_$v025" 
  143.  
  144.    VEH_WAVES_HELIS = { VEH_WAVE1_HELIS, VEH_WAVE2_HELIS, VEH_WAVE3_HELIS } 
  145.    VEH_WAVES_BOATS = { VEH_WAVE1_BOATS, VEH_WAVE2_BOATS, VEH_WAVE3_BOATS } 
  146.    VEH_WAVES_BOATS_LEFT = { VEH_WAVE1_BOATS_LEFT, VEH_WAVE2_BOATS_LEFT, VEH_WAVE3_BOATS_LEFT } 
  147.    VEH_WAVES_BOATS_RIGHT = { VEH_WAVE1_BOATS_RIGHT, VEH_WAVE2_BOATS_RIGHT, VEH_WAVE3_BOATS_RIGHT } 
  148.  
  149.    WAVE_BOAT_IS_TWO_SEATER =     { { false, true, false, false, false }, 
  150.                                    { true, false, false, false, false, true }, 
  151.                                    { false, false, true, false, false, true, true, false } } 
  152. 	COURTESY_HELI =					"bh09_$v001" 
  153.  
  154. -- Text -- 
  155. 	TEXT_BOARD_THE_SHIP =			"bh09_board_the_ship" 
  156. 	TEXT_ELIMINATE_GANG =			"bh09_eliminate_gang" 
  157. 	TEXT_30_SECONDS =					"bh09_30_seconds" 
  158. 	TEXT_NEXT_WAVE =					"bh09_next_wave" 
  159. 	TEXT_FIRST_WAVE =					"bh09_first_wave" 
  160. 	TEXT_SECOND_WAVE =				"bh09_second_wave" 
  161. 	TEXT_THIRD_WAVE =					"bh09_third_wave" 
  162.    TEXTS_WAVES = { TEXT_FIRST_WAVE, TEXT_SECOND_WAVE, TEXT_THIRD_WAVE } 
  163. 	TEXT_SHIP_ABANDONED =			"bh09_ship_abandoned" 
  164. 	TEXT_ULTOR_KILLED =				"bh09_ultor_killed" 
  165.  
  166. -- Triggers -- 
  167. 	TRIGGER_AK47_AMMO =				"bh09_$t000" 
  168. 	TRIGGER_RPG_AMMO =				"bh09_$t002" 
  169.    TRIGGER_HOTEL_ELEVATOR = "airport_$AI_crib_elevator_up" 
  170.    TRIGGER_BELOWDECKS = "bh09_$belowdecks" 
  171.    MISSION_ELEVATOR_TRIGGER = "bh09_$Hotel_Elevator" 
  172.    MISSION_ELEVATOR_DOWN_TRIGGER = "bh09_$Hotel_Elevator_Down" 
  173.  
  174.    HELIPAD_UP_ELEVATOR_DESTINATION = "bh09_$Hotel_Elevator_Down" 
  175.    HELIPAD_DOWN_ELEVATOR_DESTINATION = "bh09_$Hotel_Elevator" 
  176.  
  177.  
  178. -- Threads -- 
  179. 	THREAD_STAY_ON_SHIP =			-1 
  180. 	THREAD_WAVE1_BOATS =				{} 
  181. 	THREAD_WAVE2_BOATS =				{} 
  182. 	THREAD_WAVE3_BOATS =				{} 
  183. 	THREAD_WAVE1_HELIS =				{} 
  184. 	THREAD_WAVE2_HELIS =				{} 
  185. 	THREAD_WAVE3_HELIS =				{} 
  186. 	THREAD_BOARDING =					{} 
  187.  
  188.    THREAD_WAVES_BOATS = { THREAD_WAVE1_BOATS, THREAD_WAVE2_BOATS, THREAD_WAVE3_BOATS } 
  189.    THREAD_WAVES_HELIS = { THREAD_WAVE1_HELIS, THREAD_WAVE2_HELIS, THREAD_WAVE3_HELIS } 
  190.  
  191. -- Voice -- 
  192. 	VOICE_INTRO_PHONECALL =			{{"BR09_INTRO_L1", CELLPHONE_CHARACTER, 0}, 
  193. 											 {"PLAYER_BR09_INTRO_L2", LOCAL_PLAYER, 0}, 
  194. 											 {"BR09_INTRO_L3", CELLPHONE_CHARACTER, .25}, 
  195. 											 {"PLAYER_BR09_INTRO_L4", LOCAL_PLAYER, .25}, 
  196. 											 {"BR09_INTRO_L5", CELLPHONE_CHARACTER, .25}, 
  197. 											 {"PLAYER_BR09_INTRO_L6", LOCAL_PLAYER, .25}, 
  198. 											 {"BR09_INTRO_L7", CELLPHONE_CHARACTER, .25}, 
  199. 											 {"BR09_INTRO_L8", CELLPHONE_CHARACTER, 0}, 
  200. 											 {"PLAYER_BR09_INTRO_L9", LOCAL_PLAYER, .25}, 
  201. 											 {"BR09_INTRO_L10", CELLPHONE_CHARACTER, 0}, 
  202. 											 {"PLAYER_BR09_INTRO_L11", LOCAL_PLAYER, .25}} 
  203. 	VOICE_OUTRO_PHONECALL =			{{"PLAYER_BR09_OUTRO_L1", LOCAL_PLAYER, .25},  
  204. 											 {"BR09_OUTRO_L2", nil, 1}} 
  205.  
  206. -- Checkpoints -- 
  207. 	CHECKPOINT_BOAT =					"bh09_checkpoint_boat" 
  208.  
  209. -- Cutscenes -- 
  210. 	CUTSCENE_IN =						"br09-01" 
  211. 	CUTSCENE_ATTACK =				   "br09-02" 
  212.  
  213. -- Other -- 
  214.    SHIP_BELOWDECKS_DOOR = "bh09_$Ship_Belowdecks_Entrance" 
  215.    AIRPORT_CRIB_NAME = "AI_Hotel_Crib" 
  216.    ATTACK_HELICOPTER_INDEX = 2 
  217.  
  218.    BETWEEN_WAVES_DELAY_SECONDS = 10 
  219.  
  220.    BOAT_HIT_POINTS_PERCENT_OF_NORMAL = 0.75 
  221.    HELI_MEMBER_TO_SEAT_INDEX_MAPPING = { 0, 5, 4, 1 } 
  222.    HELI_ATTACKER_WEAPON = "ak47" 
  223.    HELI_ATTACKER_WEAPON_AMMO_COUNT = 1000 
  224. 	IN_COOP =							false 
  225. 	Last_wave_completed =			0 
  226. 	Ultor_killed =						0 
  227. 	INITIAL_NUM_ULTOR =				18 
  228. 	SHIP_DISTANCE =					50 
  229. 	SHIP_ABANDON_DISTANCE =			100 
  230.    INITIAL_SHIP_ABANDON_DISTANCE_METERS = 500 
  231.    Num_abovedecks_remaining = sizeof_table( TABLE_ULTOR_ABOVEDECKS ) 
  232.  
  233.    Players_out_of_current_boat_range = { [LOCAL_PLAYER] = true, [REMOTE_PLAYER] = true } 
  234.  
  235.    Wave_members_remaining = { 0, 0, 0 } 
  236.  
  237.    Cur_left_path_start_index = 0 
  238.    Cur_right_path_start_index = 0 
  239.    Mission_won = false 
  240.  
  241. function bh09_all_players_in_boat_range() 
  242.    if ( Players_out_of_current_boat_range[LOCAL_PLAYER] == false ) then 
  243.       if ( coop_is_active() ) then 
  244.          if ( Players_out_of_current_boat_range[REMOTE_PLAYER] == false ) then 
  245.             return true 
  246.          end 
  247.       else 
  248.          return true 
  249.       end 
  250.    end 
  251.  
  252.    return false 
  253. end 
  254.  
  255. function bh09_start(bh09_checkpoint, is_restart) 
  256. 	-- Start trigger is hit...the activate button was hit 
  257. 	set_mission_author("Aaron Hanson (aka Father Zucosos)") 
  258.  
  259. 	if coop_is_active() then 
  260. 		IN_COOP = true 
  261. 	end 
  262.  
  263.    -- interior = false, blocking = true, temporary = true 
  264.    city_chunk_swap("sr2_chunk012", "ship", false, true, true ) 
  265.    mission_start_fade_out() 
  266.  
  267. 	notoriety_force_no_spawn("police", true) 
  268. 	notoriety_force_no_spawn("ultor", true) 
  269. 	notoriety_force_no_spawn("brotherhood", true) 
  270.    --group_create_hidden( GROUP_HELI_DESTROYERS, true ) 
  271.  
  272.    --disable warping to shore. 
  273.    player_warp_to_shore_disable(LOCAL_PLAYER) 
  274.    if IN_COOP then 
  275.       player_warp_to_shore_disable(REMOTE_PLAYER) 
  276.    end 
  277.  
  278.    -- TEMP 
  279.    --bh09_checkpoint = "blarg!" 
  280.    --teleport_coop( TRIGGER_AK47_AMMO, TRIGGER_AK47_AMMO ) 
  281.    -- END TEMP 
  282.  
  283. 	if bh09_checkpoint == MISSION_START_CHECKPOINT then 
  284.       door_lock( SHIP_BELOWDECKS_DOOR, true ) 
  285. 	  if (not is_restart) then 
  286. 		cutscene_play( CUTSCENE_IN, "", "", false ) 
  287. 	  end 
  288.  
  289.       mission_debug( "teleport coop started.", 60, 1 ) 
  290.  
  291.       teleport_coop( NAV_LOCAL_START, NAV_REMOTE_START ) 
  292.  
  293.       mission_debug( "teleport coop finished, group create started.", 60, 2 ) 
  294.  
  295.       if IN_COOP then 
  296.    		group_create(GROUP_START_COOP, true) 
  297. 		end 
  298. 		group_create(GROUP_START, true) 
  299.  
  300.       mission_debug( "group create finished.", 60, 3 ) 
  301.  
  302.       bh09_notoriety_force_no_spawn() 
  303.  
  304.       mission_start_fade_in() 
  305.  
  306. 		bh09_get_to_the_ship() 
  307.  
  308. 	else--if ( bh09_checkpoint == CHECKPOINT_BOAT ) then 
  309.  
  310. 		teleport( LOCAL_PLAYER, NAV_CHECKPOINT_LOCAL ) 
  311. 		if ( coop_is_active() ) then 
  312. 			teleport( REMOTE_PLAYER, NAV_CHECKPOINT_REMOTE ) 
  313. 		end 
  314.  
  315.       if ( group_is_loaded( GROUP_START ) == false ) then 
  316.    		group_create(GROUP_START, true) 
  317.       end 
  318.       if ( IN_COOP and group_is_loaded( GROUP_START_COOP ) == false ) then 
  319.          group_create( GROUP_START_COOP, true ) 
  320.       end 
  321.       bh09_notoriety_force_no_spawn() 
  322.  
  323. 		trigger_enable(TRIGGER_AK47_AMMO, true) 
  324. 		marker_add_trigger(TRIGGER_AK47_AMMO, "", INGAME_EFFECT_LOCATION, SYNC_ALL) 
  325. 		on_trigger("bh09_give_ak47_ammo", TRIGGER_AK47_AMMO) 
  326.  
  327. 		trigger_enable(TRIGGER_RPG_AMMO, true) 
  328. 		marker_add_trigger(TRIGGER_RPG_AMMO, "", INGAME_EFFECT_LOCATION, SYNC_ALL) 
  329. 		on_trigger("bh09_give_rpg_ammo", TRIGGER_RPG_AMMO) 
  330.  
  331.       --thread_new( "bh09_destroy_helicopter" ) 
  332.  
  333.       mission_start_fade_in() 
  334.       door_open( SHIP_BELOWDECKS_DOOR ) 
  335.  
  336.       -- Update the "players near ship" stuff 
  337.       bh09_update_player_locations( INITIAL_SHIP_ABANDON_DISTANCE_METERS ) 
  338.  
  339.       bh09_do_waves_attack() 
  340. 		--bh09_first_wave() 
  341. 	end 
  342.  
  343. end 
  344.  
  345. function bh09_update_player_locations( distance_meters ) 
  346.    if get_dist_char_to_nav(LOCAL_PLAYER, NAV_SHIP) < distance_meters then 
  347.       Players_out_of_current_boat_range[LOCAL_PLAYER] = false 
  348.    end 
  349.    if ( IN_COOP and get_dist_char_to_nav(REMOTE_PLAYER, NAV_SHIP) < distance_meters ) then 
  350.       Players_out_of_current_boat_range[REMOTE_PLAYER] = false 
  351.    end 
  352. end 
  353.  
  354. function bh09_went_down_hotel_elevator( triggerer_name, trigger_name ) 
  355.    teleport( triggerer_name, HELIPAD_DOWN_ELEVATOR_DESTINATION ) 
  356. end 
  357.  
  358. function bh09_went_up_hotel_elevator_initial( triggerer_name, trigger_name ) 
  359.    -- Remove the marker and guidance 
  360.    marker_remove_trigger( trigger_name, SYNC_ALL ) 
  361. 	mission_waypoint_remove( SYNC_ALL ) 
  362.  
  363.    -- Give the up trigger a normal "this can be used" effect 
  364.    marker_add_trigger( trigger_name, "", INGAME_EFFECT_LOCATION, SYNC_ALL ) 
  365.  
  366.    -- Mark the vehicle 
  367.    marker_add_vehicle( VEH_START[ATTACK_HELICOPTER_INDEX], 
  368.                        MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_INTERACT, SYNC_ALL ) 
  369.  
  370.    bh09_went_up_hotel_elevator( triggerer_name, trigger_name ) 
  371.  
  372.    on_trigger( "bh09_went_up_hotel_elevator", trigger_name ) 
  373. end 
  374.  
  375. function bh09_went_up_hotel_elevator( triggerer_name, trigger_name ) 
  376.    teleport( triggerer_name, HELIPAD_UP_ELEVATOR_DESTINATION ) 
  377. end 
  378.  
  379. function bh09_get_to_the_ship() 
  380.    -- For the attack helicopter, disable the elevator's original trigger and enable the 
  381.    -- mission's trigger 
  382.    if ( crib_is_unlocked( AIRPORT_CRIB_NAME ) ) then 
  383.       trigger_enable( TRIGGER_HOTEL_ELEVATOR, false ) 
  384.    end 
  385.    trigger_enable( MISSION_ELEVATOR_TRIGGER, true ) 
  386.    trigger_enable( MISSION_ELEVATOR_DOWN_TRIGGER, true ) 
  387.    on_trigger( "bh09_went_down_hotel_elevator", MISSION_ELEVATOR_DOWN_TRIGGER ) 
  388.    on_trigger( "bh09_went_up_hotel_elevator_initial", MISSION_ELEVATOR_TRIGGER ) 
  389.  
  390.    -- Add guidance to the mission's trigger 
  391.    marker_add_trigger( MISSION_ELEVATOR_TRIGGER, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  392.    mission_waypoint_add( MISSION_ELEVATOR_TRIGGER, SYNC_ALL ) 
  393.    -- Add marker for the "elevator down" trigger 
  394.    marker_add_trigger( MISSION_ELEVATOR_DOWN_TRIGGER, "", INGAME_EFFECT_LOCATION, SYNC_ALL) 
  395.  
  396.    thread_new( "bh09_phone_conversation" ) 
  397.    delay ( 3.0 ) 
  398.  
  399. 	group_create(GROUP_ULTOR, true) 
  400. 	for i, npc in pairs(TABLE_ALL_ULTOR) do 
  401. 		on_death("bh09_ultor_killed", npc) 
  402. 	end 
  403.  
  404.    for i, npc in pairs(TABLE_ULTOR_ABOVEDECKS) do 
  405.       on_death( "bh09_ultor_abovedecks_killed", npc ) 
  406.    end 
  407.  
  408. 	for i, veh in pairs(VEH_START) do 
  409. 		if i == ATTACK_HELICOPTER_INDEX then 
  410.          -- Don't add anything - yet 
  411. 		else 
  412. 			marker_add_vehicle(veh, MINIMAP_ICON_LOCATION, INGAME_EFFECT_VEHICLE_INTERACT, SYNC_ALL) 
  413. 		end 
  414. 	end 
  415.  
  416. 	mission_help_table(TEXT_BOARD_THE_SHIP) 
  417.  
  418.  
  419. 	while (get_char_vehicle_type(LOCAL_PLAYER) ~= VT_AIRPLANE) and 
  420. 			(get_char_vehicle_type(LOCAL_PLAYER) ~= VT_HELICOPTER) and 
  421. 			(get_char_vehicle_type(LOCAL_PLAYER) ~= VT_WATERCRAFT) and 
  422. 			(get_dist_char_to_nav(LOCAL_PLAYER, NAV_SHIP) > SHIP_DISTANCE) do 
  423. 		thread_yield() 
  424. 	end 
  425.  
  426. 	mission_waypoint_remove(SYNC_ALL) 
  427.  
  428. 	for i, veh in pairs(VEH_START) do 
  429.       marker_remove_vehicle(veh, SYNC_ALL) 
  430. 	end 
  431.    if ( crib_is_unlocked( AIRPORT_CRIB_NAME ) ) then 
  432.       trigger_enable( TRIGGER_HOTEL_ELEVATOR, true ) 
  433.    end 
  434.    trigger_enable( MISSION_ELEVATOR_TRIGGER, false ) 
  435.  
  436. 	marker_add_navpoint(NAV_SHIP, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  437. 	mission_waypoint_add(NAV_SHIP, SYNC_ALL) 
  438.  
  439. 	while (Ultor_killed == 0) and (get_dist_char_to_nav(LOCAL_PLAYER, NAV_SHIP) > SHIP_DISTANCE)  
  440. 			 and (not IN_COOP or (IN_COOP and get_dist_char_to_nav(REMOTE_PLAYER, NAV_SHIP) > SHIP_DISTANCE)) do 
  441. 		thread_yield() 
  442. 	end 
  443.  
  444.    -- Make sure the players don't completely abandon the ship 
  445.    Players_out_of_current_boat_range[LOCAL_PLAYER] = false 
  446.    Players_out_of_current_boat_range[REMOTE_PLAYER] = false 
  447.    THREAD_STAY_ON_SHIP = thread_new( "bh09_stay_on_ship", INITIAL_SHIP_ABANDON_DISTANCE_METERS ) 
  448.  
  449. 	if (get_char_vehicle_type(LOCAL_PLAYER) == VT_WATERCRAFT) then 
  450. 		bh09_less_rpgs() 
  451. 	end 
  452.  
  453. 	marker_remove_navpoint(NAV_SHIP, SYNC_ALL) 
  454. 	mission_waypoint_remove(SYNC_ALL) 
  455.  
  456. 	bh09_eliminate_ultor() 
  457. end 
  458.  
  459. function bh09_phone_conversation() 
  460. 	audio_play_conversation(VOICE_INTRO_PHONECALL, INCOMING_CALL) 
  461. end 
  462.  
  463. function bh09_eliminate_ultor() 
  464. 	bh09_show_ultor_counter() 
  465. 	mission_help_table(TEXT_ELIMINATE_GANG) 
  466.  
  467. 	for i, npc in pairs( TABLE_ULTOR_ABOVEDECKS ) do 
  468. 		npc_combat_enable(npc, true) 
  469. 		if not character_is_dead(npc) then 
  470. 			marker_add_npc(npc, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL) 
  471. 		end 
  472. 	end 
  473.  
  474. 	while bh09_not_done_killing_ultor() do 
  475. 		thread_yield() 
  476. 	end 
  477.  
  478.    -- Disable boat spawning - it gets in the way of the waves 
  479.    spawning_boats( false ) 
  480.  
  481.    fade_out( 0 ) 
  482.    character_evacuate_from_all_vehicles( LOCAL_PLAYER ) 
  483.    if ( coop_is_active() ) then 
  484.       character_evacuate_from_all_vehicles( REMOTE_PLAYER ) 
  485.    end 
  486.    cutscene_play( CUTSCENE_ATTACK ) 
  487.    door_open( SHIP_BELOWDECKS_DOOR ) 
  488.  
  489.    -- Now that the player knows about the ammo, add the triggers for it 
  490.    trigger_enable(TRIGGER_AK47_AMMO, true) 
  491. 	ingame_effect_add_trigger(TRIGGER_AK47_AMMO, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  492. 	on_trigger("bh09_give_ak47_ammo", TRIGGER_AK47_AMMO) 
  493.  
  494. 	trigger_enable(TRIGGER_RPG_AMMO, true) 
  495. 	ingame_effect_add_trigger(TRIGGER_RPG_AMMO, INGAME_EFFECT_LOCATION, SYNC_ALL) 
  496. 	on_trigger("bh09_give_rpg_ammo", TRIGGER_RPG_AMMO) 
  497.  
  498. 	objective_text_clear(0) 
  499.  
  500.    --thread_new( "bh09_destroy_helicopter" ) 
  501.  
  502. 	--vehicle_detonate(VEH_START[2]) 
  503. 	delay(2) 
  504. 	mission_set_checkpoint(CHECKPOINT_BOAT) 
  505.  
  506. 	release_to_world(GROUP_ULTOR) 
  507.  
  508.    bh09_do_waves_attack() 
  509. 	--bh09_first_wave() 
  510. end 
  511.  
  512. function bh09_destroy_helicopter() 
  513.    group_show( GROUP_HELI_DESTROYERS ) 
  514.  
  515.    local helicopter_was_attacked = false 
  516.  
  517.    --  
  518.    local attack_heli = VEH_START[ATTACK_HELICOPTER_INDEX] 
  519.    for index, member_name in pairs( TABLE_HELI_DESTROYERS ) do 
  520.  
  521.       -- Mark and set up these people as if they're members of the first wave 
  522.       marker_add_npc( member_name, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL ) 
  523. 		Wave_members_remaining[1] = Wave_members_remaining[1] + 1 
  524. 		on_death( "bh09_wave_member_died_wave1", member_name ) 
  525.  
  526.       -- Have them attack the helicopter if it's close enough 
  527.       if ( vehicle_is_destroyed( attack_heli ) == false ) then 
  528.          local dist_to_heli = get_dist_char_to_vehicle( member_name, attack_heli ) 
  529.          if ( dist_to_heli < 125 ) then 
  530.             -- fire_once = false 
  531.             force_fire_object_position( member_name, attack_heli, false ) 
  532.             helicopter_was_attacked = true 
  533.          end 
  534.       end 
  535.    end 
  536.  
  537.    -- If the attackers attacked the helicopter, destroy it 
  538.    if ( helicopter_was_attacked ) then 
  539.       -- Have the helicopter detonate 
  540.       delay( 3.0 ) 
  541.       -- smoke = true, fire = true 
  542.       vehicle_set_smoke_and_fire_state( attack_heli, true, true ) 
  543.       delay( 15.0 ) 
  544.       vehicle_detonate( attack_heli ) 
  545.    end 
  546.  
  547.    for index, member_name in pairs( TABLE_HELI_DESTROYERS ) do 
  548.       if ( character_is_dead( member_name ) == false ) then 
  549.          attack_closest_player( member_name ) 
  550.       end 
  551.    end 
  552. end 
  553.  
  554. function bh09_less_rpgs() 
  555. 	for i, npc in pairs(TABLE_ULTOR_RPG) do 
  556. 		if (i ~= 1) then 
  557. 			inv_item_remove_all(npc) 
  558. 			inv_item_add("ak47", 1, npc) 
  559. 			inv_item_equip("ak47", npc) 
  560. 		end 
  561. 	end 
  562. end 
  563.  
  564. function bh09_not_done_killing_ultor() 
  565. 	return (Ultor_killed < INITIAL_NUM_ULTOR) 
  566. end 
  567.  
  568. function bh09_give_ak47_ammo( triggerer_name, trigger_name ) 
  569.    bh09_maybe_cleanup_vehicles() 
  570.  
  571.    local rifle_slot_weapon = inv_item_in_slot( triggerer_name, "rifle" ) 
  572.    if ( rifle_slot_weapon == "none" ) then 
  573.       inv_item_add( "ak47", 1, triggerer_name ) 
  574.       inv_item_equip( "ak47", triggerer_name ) 
  575.    else 
  576.       inv_item_add_ammo( triggerer_name, rifle_slot_weapon, 30 ) 
  577.    end 
  578. end 
  579.  
  580. function bh09_weapon_is_not_rocket_launcher( weapon_name ) 
  581.    if ( weapon_name == "rpg_launcher" or weapon_name == "rpg_annihilator" ) then 
  582.       return false 
  583.    end 
  584.    return true 
  585. end 
  586.  
  587. function bh09_give_rpg_ammo( triggerer_name, trigger_name ) 
  588.    bh09_maybe_cleanup_vehicles() 
  589.  
  590.    local rpg_slot_weapon = inv_item_in_slot( triggerer_name, "launcher" ) 
  591.    if ( rpg_slot_weapon == "none" or bh09_weapon_is_not_rocket_launcher( rpg_slot_weapon ) ) then 
  592.       inv_item_add( "rpg_launcher", 1, triggerer_name ) 
  593.       inv_item_equip( "rpg_launcher", triggerer_name ) 
  594.    else 
  595.       inv_item_add_ammo( triggerer_name, rpg_slot_weapon, 5 ) 
  596.    end 
  597. end 
  598.  
  599. function bh09_maybe_cleanup_vehicles() 
  600. 	if (Last_wave_completed == 1) then 
  601. 		Last_wave_completed = 0 
  602. 		for i, veh in pairs(VEH_WAVE1_BOATS) do 
  603. 			object_destroy(veh) 
  604. 		end 
  605. 		for i, veh in pairs(VEH_WAVE1_HELIS) do 
  606. 			object_destroy(veh) 
  607. 		end 
  608. 	elseif (Last_wave_completed == 2) then 
  609. 		Last_wave_completed = 0 
  610. 		for i, veh in pairs(VEH_WAVE2_BOATS) do 
  611. 			object_destroy(veh) 
  612. 		end 
  613. 		for i, veh in pairs(VEH_WAVE2_HELIS) do 
  614. 			object_destroy(veh) 
  615. 		end 
  616. 	end 
  617. end 
  618.  
  619. function bh09_ak47_ammo_trigger_watch() 
  620. 	while(1) do 
  621. 		thread_yield() 
  622. 		if (get_dist_char_to_nav(LOCAL_PLAYER, TRIGGER_AK47_AMMO) < 3) and player_button_just_pressed(3) then 
  623. 			local equipped_item = inv_item_get_equipped_item(LOCAL_PLAYER) 
  624. 			inv_item_add("ak47", 1, LOCAL_PLAYER) 
  625. 			if (equipped_item ~= nil) and (equipped_item ~= "") and (inv_has_item(equipped_item, LOCAL_PLAYER)) then 
  626. 				inv_item_equip(equipped_item, LOCAL_PLAYER) 
  627. 			else 
  628. 				inv_item_equip("ak47", LOCAL_PLAYER) 
  629. 			end 
  630. 		end 
  631. 	end 
  632. end 
  633.  
  634. function bh09_rpg_ammo_trigger_watch() 
  635. 	while(1) do 
  636. 		thread_yield() 
  637. 		if (get_dist_char_to_nav(LOCAL_PLAYER, TRIGGER_RPG_AMMO) < 3) and player_button_just_pressed(3) then 
  638. 			local equipped_item = inv_item_get_equipped_item(LOCAL_PLAYER) 
  639. 			inv_item_add("rpg_launcher", 1, LOCAL_PLAYER) 
  640. 			if (equipped_item ~= nil) and (equipped_item ~= "") and (inv_has_item(equipped_item, LOCAL_PLAYER)) then 
  641. 				inv_item_equip(equipped_item, LOCAL_PLAYER) 
  642. 			else 
  643. 				inv_item_equip("rpg_launcher", LOCAL_PLAYER) 
  644. 			end 
  645. 		end 
  646. 	end 
  647. end 
  648.  
  649. function bh09_wave_member_died_wave1( member_name ) 
  650. 	bh09_wave_member_died( member_name, 1 ) 
  651. end 
  652.  
  653. function bh09_wave_member_died_wave2( member_name ) 
  654. 	bh09_wave_member_died( member_name, 2 ) 
  655. end 
  656.  
  657. function bh09_wave_member_died_wave3( member_name ) 
  658. 	bh09_wave_member_died( member_name, 3 ) 
  659. end 
  660.  
  661. function bh09_wave_member_died( member_name, wave_index ) 
  662. 	-- Decrement the number of wave members left in this wave 
  663. 	Wave_members_remaining[wave_index] = Wave_members_remaining[wave_index] - 1 
  664. 	mission_debug( Wave_members_remaining[wave_index].." members remaining in wave "..wave_index..".", 10 ) 
  665. 	bh09_soldier_died( member_name ) 
  666. end 
  667.  
  668. -- Sets up completion tracking for a wave. 
  669. -- 
  670. function bh09_setup_wave_completion_tracking_and_mark_attackers( wave_index ) 
  671.    -- Add the heli destroyers for the first wave 
  672.    if ( wave_index == 1 ) then 
  673.       -- ( They're marked/tracked on spawn, so no need to mark or track them here. ) 
  674. 		Wave_members_remaining[wave_index] = Wave_members_remaining[wave_index] + sizeof_table( TABLE_HELI_DESTROYERS ) 
  675.    end 
  676.  
  677. 	for index, heli_group in pairs( CHARS_WAVES_HELIS[wave_index] ) do 
  678. 		Wave_members_remaining[wave_index] = Wave_members_remaining[wave_index] + sizeof_table( heli_group ) 
  679. 		for member_index, member_name in pairs( heli_group ) do 
  680. 			on_death( "bh09_wave_member_died_wave"..wave_index, member_name ) 
  681. 		   marker_add_npc( member_name, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL ) 
  682. 		end 
  683. 	end 
  684. 	for index, boat_group in pairs( CHARS_WAVES_BOATS[wave_index] ) do 
  685.  
  686.       local cur_boat_two_seater = WAVE_BOAT_IS_TWO_SEATER[wave_index][index] 
  687. 		for member_index, member_name in pairs( boat_group ) do 
  688.          -- Only include drivers as required kills if the boat is a two-seater. Otherwise the driver will drive away 
  689.          -- after dropping off the other members 
  690.          if ( member_index ~= BOAT_DRIVER_INDEX or cur_boat_two_seater ) then 
  691.             Wave_members_remaining[wave_index] = Wave_members_remaining[wave_index] + 1 
  692.             on_death( "bh09_wave_member_died_wave"..wave_index, member_name ) 
  693.             marker_add_npc( member_name, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL ) 
  694.          end 
  695. 		end 
  696. 	end 
  697. end 
  698.  
  699. function bh09_do_waves_attack() 
  700.    -- Don't start the attack until all players are in range of the boat 
  701.    repeat 
  702.       thread_yield() 
  703.    until ( bh09_all_players_in_boat_range() ) 
  704.  
  705.    -- Make sure the players stay near the ship - closer, now that they're defending it 
  706.    thread_kill( THREAD_STAY_ON_SHIP ) 
  707. 	THREAD_STAY_ON_SHIP = thread_new( "bh09_stay_on_ship", SHIP_ABANDON_DISTANCE ) 
  708.  
  709.    -- Before we attack, delay for a few seconds 
  710.    delay(3) 
  711.    -- Setup notoriety 
  712. 	notoriety_set("Brotherhood", 2) 
  713. 	notoriety_set_min("Brotherhood", 2) 
  714.  
  715.    -- Don't actually start the attack until both players are close enough 
  716. 	while (get_dist_char_to_nav(LOCAL_PLAYER, NAV_SHIP) > SHIP_DISTANCE)  
  717. 			 and (not IN_COOP or (IN_COOP and get_dist_char_to_nav(REMOTE_PLAYER, NAV_SHIP) > SHIP_DISTANCE)) do 
  718. 		thread_yield() 
  719. 	end 
  720.  
  721.  
  722.    -- ( Note that these wave functions yield until the respective waves are defeated ) 
  723.    -- First wave and intermission 
  724.    bh09_do_wave( 1 ) 
  725.    bh09_do_intermission_and_prev_wave_cleanup( 1 ) 
  726.  
  727.    -- Second wave and intermission 
  728.    bh09_do_wave( 2 ) 
  729.    bh09_do_intermission_and_prev_wave_cleanup( 2 ) 
  730.  
  731.    -- Third wave 
  732.    bh09_do_wave( 3 ) 
  733.    bh09_waves_final_cleanup() 
  734.  
  735.    bh09_success_all_waves_defeated() 
  736. end 
  737.  
  738. function bh09_any_wave_member_alive( wave_index ) 
  739.    if ( wave_index == 1 ) then 
  740.       for member_index, member_name in pairs( TABLE_HELI_DESTROYERS ) do 
  741.          if ( character_is_released( member_name ) == false ) then 
  742.             if ( character_is_dead( member_name ) == false ) then 
  743.                return true 
  744.             else 
  745.                marker_remove_npc( member_name, SYNC_ALL ) 
  746.             end 
  747.          end 
  748.       end 
  749.    end 
  750.  
  751.    for heli_group_index, heli_group_name in pairs( CHARS_WAVES_HELIS[wave_index] ) do 
  752.       for member_index, member_name in pairs( heli_group_name ) do 
  753.          if ( character_is_released( member_name ) == false ) then 
  754.             if ( character_is_dead( member_name ) == false ) then 
  755.                return true 
  756.             else 
  757.                marker_remove_npc( member_name, SYNC_ALL ) 
  758.             end 
  759.          end 
  760.       end 
  761.    end 
  762.  
  763.    for boat_group_index, boat_group_name in pairs( CHARS_WAVES_BOATS[wave_index] ) do 
  764.       for member_index, member_name in pairs( boat_group_name ) do 
  765.          if ( member_index ~= BOAT_DRIVER_INDEX ) then 
  766.             if ( character_is_released( member_name ) == false ) then 
  767.                if ( character_is_dead( member_name ) == false ) then 
  768.                   return true 
  769.                else 
  770.                   marker_remove_npc( member_name, SYNC_ALL ) 
  771.                end 
  772.             end 
  773.          end 
  774.       end 
  775.    end 
  776.  
  777.    return false 
  778. end 
  779.  
  780. function bh09_do_wave( wave_index ) 
  781.    -- Inform the player of the incoming wave 
  782.    mission_help_table( TEXTS_WAVES[wave_index] ) 
  783.  
  784.    -- Create the wave and setup tracking for it so that we'll 
  785.    -- know when it's dead 
  786.    group_create( GROUPS_WAVES[wave_index], true ) 
  787.    bh09_setup_wave_completion_tracking_and_mark_attackers( wave_index ) 
  788.  
  789.    -- Go through all of the vehicles and have them attack 
  790.    -- Helicopters 
  791.    for heli_index, heli in pairs(VEH_WAVES_HELIS[wave_index]) do 
  792. 		THREAD_WAVES_HELIS[wave_index][heli_index] = thread_new( "bh09_heli", heli, 
  793.                                                                CHARS_WAVES_HELIS[wave_index][heli_index], 
  794.                                                                heli_index ) 
  795. 	end 
  796.    -- Boats 
  797. 	for boat_index, boat in pairs(VEH_WAVES_BOATS[wave_index]) do 
  798. 		--marker_add_vehicle( boat, MINIMAP_ICON_KILL, INGAME_EFFECT_VEHICLE_KILL, SYNC_ALL ) 
  799. 		vehicle_enter_group_teleport( CHARS_WAVES_BOATS[wave_index][boat_index], boat ) 
  800. 		on_vehicle_destroyed( "bh09_boat_destroyed", boat ) 
  801.  
  802.       -- Set the boat's HP to a new, lower, value 
  803.       local cur_max_boat_hp = get_max_hit_points( boat ) 
  804.       local new_max_boat_hp = cur_max_boat_hp * BOAT_HIT_POINTS_PERCENT_OF_NORMAL 
  805.       set_current_hit_points( boat, new_max_boat_hp ) 
  806.       set_max_hit_points( boat, new_max_boat_hp ) 
  807. 	end 
  808.  
  809.    -- Have the left-hand boats take the left paths, and the right-hand boats take the right-hand paths 
  810. 	for left_index, boat in pairs(VEH_WAVES_BOATS_LEFT[wave_index]) do 
  811.       local _wave_index, boat_index = bh09_get_boat_wave_index_and_boat_index( boat ) 
  812.  
  813. 		THREAD_WAVES_BOATS[wave_index][boat_index] = thread_new( "bh09_boat", boat, left_index, 
  814.                                                                NAV_BOAT_PATH_LEFT, NAV_STAIRS_LEFT_PATH, CHARS_WAVES_BOATS[wave_index][boat_index] ) 
  815. 	end 
  816. 	for right_index, boat in pairs(VEH_WAVES_BOATS_RIGHT[wave_index]) do 
  817.       local _wave_index, boat_index = bh09_get_boat_wave_index_and_boat_index( boat ) 
  818.  
  819. 		THREAD_WAVES_BOATS[wave_index][boat_index] = thread_new( "bh09_boat", boat, right_index, 
  820.                                                                NAV_BOAT_PATH_RIGHT, NAV_STAIRS_RIGHT_PATH, CHARS_WAVES_BOATS[wave_index][boat_index] ) 
  821. 	end 
  822.  
  823.    -- Yield until this wave is killed 
  824. 	while bh09_any_wave_member_alive(wave_index) do--Wave_members_remaining[wave_index] > 0 do 
  825. 		thread_yield() 
  826. 	end 
  827.    Last_wave_completed = wave_index 
  828. end 
  829.  
  830. function bh09_do_intermission_and_prev_wave_cleanup( last_wave_index ) 
  831. 	delay(3) 
  832. 	mission_help_table_nag( TEXT_NEXT_WAVE, BETWEEN_WAVES_DELAY_SECONDS ) 
  833. 	hud_timer_set(0, BETWEEN_WAVES_DELAY_SECONDS * 1000, "", false) 
  834.  
  835. 	minimap_icon_add_trigger( TRIGGER_AK47_AMMO, MINIMAP_ICON_PROTECT_ACQUIRE ) 
  836. 	minimap_icon_add_trigger( TRIGGER_RPG_AMMO, MINIMAP_ICON_PROTECT_ACQUIRE ) 
  837.  
  838. 	for i, thread in pairs(THREAD_WAVES_HELIS[last_wave_index]) do 
  839. 		if thread ~= -1 then 
  840. 			thread_kill(thread) 
  841. 		end 
  842. 	end 
  843.  
  844. 	for i, thread in pairs(THREAD_WAVES_BOATS[last_wave_index]) do 
  845. 		if thread ~= -1 then 
  846. 			thread_kill(thread) 
  847. 		end 
  848. 	end 
  849.  
  850. 	while(hud_timer_get_remainder(0) > 0) do 
  851. 		thread_yield() 
  852. 	end 
  853.  
  854. 	hud_timer_stop(0) 
  855.  
  856. 	minimap_icon_remove_trigger(TRIGGER_AK47_AMMO, SYNC_ALL) 
  857. 	minimap_icon_remove_trigger(TRIGGER_RPG_AMMO, SYNC_ALL) 
  858.  
  859.    release_to_world( GROUPS_WAVES[last_wave_index] ) 
  860. end 
  861.  
  862. function bh09_waves_final_cleanup() 
  863. 	for i, thread in pairs(THREAD_BOARDING) do 
  864. 		if thread ~= -1 then 
  865. 			thread_kill(thread) 
  866. 		end 
  867. 	end 
  868. end 
  869.  
  870. function bh09_wave_complete(chars, helis) 
  871. 	for i, set in pairs(chars) do 
  872. 		for j, npc in pairs(set) do 
  873. 			if not character_is_dead(npc) then 
  874. 				return false 
  875. 			end 
  876. 		end 
  877. 	end 
  878. 	for i, heli in pairs(helis) do 
  879. 		if not vehicle_is_destroyed(heli) then 
  880. 			return false 
  881. 		end 
  882. 	end 
  883. 	return true 
  884. end 
  885.  
  886. function bh09_get_boat_path_goal( boat_path_name ) 
  887.    if ( boat_path_name == NAV_BOAT_PATH_LEFT ) then 
  888.       return NAV_BOAT_LEFT_GOAL 
  889.    else--if ( boat_path_name == NAV_BOAT_PATH_RIGHT ) then 
  890.       return NAV_BOAT_RIGHT_GOAL 
  891.    end 
  892. end 
  893.  
  894. function bh09_get_boat_leave_path( boat_path_name ) 
  895.    if ( boat_path_name == NAV_BOAT_PATH_LEFT ) then 
  896.       return NAV_BOAT_LEAVE_PATH_LEFT 
  897.    else--if ( boat_path_name == NAV_BOAT_PATH_RIGHT ) then 
  898.       return NAV_BOAT_LEAVE_PATH_RIGHT 
  899.    end 
  900. end 
  901.  
  902. function bh09_get_boat_wave_index_and_boat_index( boat_name ) 
  903.    for wave_index, boat_group in pairs( VEH_WAVES_BOATS ) do 
  904.       for boat_index, boat in pairs( boat_group ) do 
  905.          if ( boat_name == boat ) then 
  906.             return wave_index, boat_index 
  907.          end 
  908.       end 
  909.    end 
  910.    script_assert( false, "Boat with name "..boat_name.." not found." ) 
  911. end 
  912.  
  913. function bh09_is_boat_two_seater( boat_name ) 
  914.    local wave_index, boat_index = bh09_get_boat_wave_index_and_boat_index( boat_name ) 
  915.  
  916.    return WAVE_BOAT_IS_TWO_SEATER[wave_index][boat_index] 
  917. end 
  918.  
  919. function bh09_boat(boat, delay_factor, boat_path, stairs_path, passengers ) 
  920.    vehicle_disable_chase( boat, true ) 
  921.    vehicle_disable_flee( boat, true ) 
  922.  
  923. 	delay(6 * delay_factor) 
  924. 	local THREAD_PATHFIND = thread_new("bh09_boat_pathfind", boat, boat_path) 
  925.  
  926.    local goal = bh09_get_boat_path_goal( boat_path ) 
  927.  
  928.    local boat_two_seater = bh09_is_boat_two_seater( boat ) 
  929.  
  930. 	while (get_dist_vehicle_to_nav(boat, goal) > 10) do 
  931. 		thread_yield() 
  932. 	end 
  933. 	thread_kill(THREAD_PATHFIND) 
  934. 	delay(2) 
  935.    for index, name in pairs( passengers ) do 
  936.       -- Everyone in a two-seat boat gets off, but drivers of four-seat boats need to drive the boat 
  937.       -- back so they don't get off 
  938.       if ( index ~= BOAT_DRIVER_INDEX or boat_two_seater ) then 
  939.          if ( not character_is_dead( name ) and character_is_in_vehicle( name ) ) then 
  940.             mission_debug( "telling character "..name.." in boat "..boat.." to board.", 15 ) 
  941.             THREAD_BOARDING[name] = thread_new("bh09_boarding", name, stairs_path, index * 2 ) 
  942.          end 
  943.       end 
  944.    end 
  945. 	marker_remove_vehicle(boat, SYNC_ALL) 
  946.  
  947.    vehicle_stop( boat ) 
  948.    delay( 1.0 ) 
  949.  
  950.    -- Boats with more than two seats pathfind back to their origin after making a dropoff. 
  951.    if ( boat_two_seater == false ) then 
  952.       local departure_path = bh09_get_boat_leave_path( boat_path ) 
  953.       if ( vehicle_is_destroyed( boat ) == false and vehicle_get_driver( boat ) ~= nil ) then 
  954.          vehicle_pathfind_to(boat, departure_path, true, true) 
  955.       end 
  956.  
  957.       if ( vehicle_is_destroyed( boat ) == false ) then 
  958.          vehicle_exit( passengers[BOAT_DRIVER_INDEX] ) 
  959.          release_to_world( passengers[BOAT_DRIVER_INDEX] ) 
  960.       end 
  961.    end 
  962.    release_to_world( boat ) 
  963. end 
  964.  
  965. function bh09_boat_pathfind(boat, boat_path) 
  966. 	while not vehicle_is_destroyed(boat) do 
  967. 		thread_yield() 
  968. 		vehicle_pathfind_to(boat, boat_path, true, true) 
  969. 	end 
  970. end 
  971.  
  972. function bh09_get_stairs_path_start( stairs_path ) 
  973.    if ( stairs_path == NAV_STAIRS_LEFT_PATH ) then 
  974.       Cur_left_path_start_index = Cur_left_path_start_index + 1 
  975.       if ( Cur_left_path_start_index > NUM_LEFT_PATH_STARTS ) then 
  976.          Cur_left_path_start_index = 1 
  977.       end 
  978.       return NAV_STAIRS_LEFT_PATH_STARTS[Cur_left_path_start_index] 
  979.    else--if ( stairs_path == NAV_STAIRS_RIGHT_PATH ) then 
  980.       Cur_right_path_start_index = Cur_right_path_start_index + 1 
  981.       if ( Cur_right_path_start_index > NUM_RIGHT_PATH_STARTS ) then 
  982.          Cur_right_path_start_index = 1 
  983.       end 
  984. 		return NAV_STAIRS_RIGHT_PATH_STARTS[Cur_right_path_start_index] 
  985.    end 
  986. end 
  987.  
  988. function bh09_boarding(npc, nav_stairs, delay_amount) 
  989. 	vehicle_exit_teleport(npc) 
  990. 	delay(delay_amount) 
  991.  
  992.    local stairs_path_start = bh09_get_stairs_path_start( nav_stairs ) 
  993.    teleport( npc, stairs_path_start ) 
  994.  
  995. 	attack_closest_player(npc) 
  996.    move_to_safe( npc, nav_stairs, 2, false, true ) 
  997.    if ( character_is_dead( npc ) ) then 
  998.       return 
  999.    end 
  1000. 	attack_closest_player(npc) 
  1001. 	while not character_is_dead(npc) do 
  1002. 		thread_yield() 
  1003. 		delay(1) 
  1004. 		if (not character_is_dead(npc)) and character_is_swimming(npc) then 
  1005. 			delay(2) 
  1006.          teleport( npc, stairs_path_start ) 
  1007.          attack_closest_player(npc) 
  1008.          move_to_safe( npc, nav_stairs, 2, false, true ) 
  1009.          if ( character_is_dead( npc ) ) then 
  1010.             return 
  1011.          end 
  1012.          attack_closest_player(npc) 
  1013. 		end 
  1014. 	end 
  1015. end 
  1016.  
  1017. function bh09_soldier_died(npc) 
  1018. 	on_death("", npc) 
  1019. 	if ( THREAD_BOARDING[npc] ~= INVALID_THREAD_HANDLE and 
  1020. 		  THREAD_BOARDING[npc] ~= nil ) then 
  1021. 		thread_kill(THREAD_BOARDING[npc]) 
  1022. 	end 
  1023. 	marker_remove_npc(npc, SYNC_ALL) 
  1024. end 
  1025.  
  1026. function bh09_boat_destroyed(boat) 
  1027. 	on_vehicle_destroyed("", boat) 
  1028. 	marker_remove_vehicle(boat, SYNC_ALL) 
  1029. end 
  1030.  
  1031. function bh09_heli(heli, chars, i) 
  1032. 	--marker_add_vehicle(heli, MINIMAP_ICON_KILL, INGAME_EFFECT_VEHICLE_KILL, SYNC_ALL) 
  1033. 	for member_index, member_name in pairs( chars ) do 
  1034.       inv_item_remove_all( member_name ) 
  1035.       inv_item_add( HELI_ATTACKER_WEAPON, 1, member_name ) 
  1036.       inv_item_add_ammo( member_name, HELI_ATTACKER_WEAPON, HELI_ATTACKER_WEAPON_AMMO_COUNT ) 
  1037.       vehicle_enter_teleport( member_name, heli, HELI_MEMBER_TO_SEAT_INDEX_MAPPING[member_index] ) 
  1038. 	end 
  1039. 	delay((i-1) * 4) 
  1040. 	--local THREAD_TEMP_CHASE = thread_new("vehicle_chase", heli, LOCAL_PLAYER) 
  1041. 	--delay(8) 
  1042. 	--thread_kill(THREAD_TEMP_CHASE) 
  1043.  
  1044.    helicopter_fly_to_direct( heli, 20, NAV_HELI_DROPOFFS[i] ) 
  1045.    vehicle_exit( chars[2] ) 
  1046.    delay( 2.0 ) 
  1047.  
  1048.    if ( i == 1 ) then 
  1049.       helicopter_fly_to_direct( heli, 20, "bh09_$To_Path1_Start" ) 
  1050.    end 
  1051.  
  1052. 	while not vehicle_is_destroyed(heli) do 
  1053. 		helicopter_fly_to_direct(heli, 20, NAV_HELI_PATHS[i]) 
  1054. 		thread_yield() 
  1055. 	end 
  1056. 	marker_remove_vehicle(heli, SYNC_ALL) 
  1057. end 
  1058.  
  1059. function bh09_stay_on_ship( distance_meters ) 
  1060. 	while 1 do 
  1061. 		thread_yield() 
  1062. 		if get_dist_char_to_nav(LOCAL_PLAYER, NAV_SHIP) > distance_meters then 
  1063. 			mission_help_table_nag(TEXT_30_SECONDS, SYNC_LOCAL) 
  1064. 			hud_timer_set(1, 30000, "bh09_failure_abandoned_ship", true) 
  1065.  
  1066.          minimap_icon_add_navpoint_radius( NAV_SHIP, MINIMAP_ICON_LOCATION, distance_meters, nil, SYNC_LOCAL ) 
  1067.  
  1068.          Players_out_of_current_boat_range[LOCAL_PLAYER] = true 
  1069.  
  1070. 			while get_dist_char_to_nav(LOCAL_PLAYER, NAV_SHIP) > distance_meters do 
  1071. 				thread_yield() 
  1072. 			end 
  1073.  
  1074.          Players_out_of_current_boat_range[LOCAL_PLAYER] = false 
  1075.          minimap_icon_remove_navpoint( NAV_SHIP, SYNC_LOCAL ) 
  1076.          hud_timer_stop(1) 
  1077. 		end 
  1078. 		if IN_COOP and get_dist_char_to_nav(REMOTE_PLAYER, NAV_SHIP) > distance_meters then 
  1079. 			mission_help_table_nag(TEXT_30_SECONDS, SYNC_REMOTE) 
  1080. 			hud_timer_set(1, 30000, "bh09_failure_abandoned_ship", true) 
  1081.  
  1082.          minimap_icon_add_navpoint_radius( NAV_SHIP, MINIMAP_ICON_LOCATION, distance_meters, nil, SYNC_REMOTE ) 
  1083.  
  1084.          Players_out_of_current_boat_range[REMOTE_PLAYER] = true 
  1085.  
  1086.          while get_dist_char_to_nav(REMOTE_PLAYER, NAV_SHIP) > distance_meters do 
  1087. 				thread_yield() 
  1088. 			end 
  1089.  
  1090.          Players_out_of_current_boat_range[REMOTE_PLAYER] = false 
  1091.          minimap_icon_remove_navpoint( NAV_SHIP, SYNC_REMOTE ) 
  1092. 			hud_timer_stop(1) 
  1093. 		end 
  1094. 	end 
  1095. end 
  1096.  
  1097. function bh09_ultor_abovedecks_killed( npc ) 
  1098.    Num_abovedecks_remaining = Num_abovedecks_remaining - 1 
  1099.  
  1100.    if ( Num_abovedecks_remaining == 0 ) then 
  1101.       trigger_enable( TRIGGER_BELOWDECKS, true ) 
  1102.       on_trigger( "bh09_reached_belowdecks_door", TRIGGER_BELOWDECKS ) 
  1103.       marker_add_trigger( TRIGGER_BELOWDECKS, MINIMAP_ICON_LOCATION, INGAME_EFFECT_LOCATION, SYNC_ALL ) 
  1104.  
  1105.       for i, npc in pairs( TABLE_ULTOR_BELOWDECKS ) do 
  1106.          npc_combat_enable(npc, true) 
  1107.          if not character_is_dead(npc) then 
  1108.             marker_add_npc(npc, MINIMAP_ICON_KILL, INGAME_EFFECT_KILL, SYNC_ALL) 
  1109.          end 
  1110.       end 
  1111.  
  1112.       door_lock( SHIP_BELOWDECKS_DOOR, false ) 
  1113.       door_open( SHIP_BELOWDECKS_DOOR ) 
  1114.    end 
  1115.  
  1116.    bh09_ultor_killed( npc ) 
  1117. end 
  1118.  
  1119. function bh09_reached_belowdecks_door( triggerer_name, trigger_name ) 
  1120.    marker_remove_trigger( trigger_name, SYNC_ALL ) 
  1121.    trigger_enable( trigger_name, false ) 
  1122. end 
  1123.  
  1124. function bh09_ultor_killed(npc) 
  1125. 	on_death("", npc) 
  1126. 	marker_remove_npc(npc, SYNC_ALL) 
  1127. 	Ultor_killed = Ultor_killed + 1 
  1128. 	bh09_show_ultor_counter() 
  1129. end 
  1130.  
  1131. function bh09_show_ultor_counter() 
  1132. 	objective_text(0, TEXT_ULTOR_KILLED, Ultor_killed, INITIAL_NUM_ULTOR) 
  1133. end 
  1134.  
  1135. function bh09_failure_abandoned_ship() 
  1136. 	delay(3) 
  1137. 	mission_end_failure("bh09", TEXT_SHIP_ABANDONED) 
  1138. end 
  1139.  
  1140. function bh09_success_all_waves_defeated() 
  1141.    audio_play_conversation(VOICE_OUTRO_PHONECALL, INCOMING_CALL) 
  1142.  
  1143. 	delay(3) 
  1144.  
  1145.    Mission_won = true 
  1146.  
  1147. 	mission_end_success("bh09") 
  1148. end 
  1149.  
  1150. function bh09_cleanup() 
  1151. 	-- Cleanup mission here 
  1152.    -- Revert boat spawning 
  1153.    spawning_boats( true ) 
  1154.  
  1155.    character_evacuate_from_all_vehicles( LOCAL_PLAYER ) 
  1156.    if ( coop_is_active() ) then 
  1157.       character_evacuate_from_all_vehicles( REMOTE_PLAYER ) 
  1158.    end 
  1159.  
  1160.    -- Swap the chunks back to their permanent state 
  1161.    -- interior = false, blocking = false, temporary = false 
  1162.    city_chunk_swap("sr2_chunk012", "normal", false, false, false ) 
  1163.  
  1164. 	minimap_icon_remove_trigger( TRIGGER_AK47_AMMO, SYNC_ALL ) 
  1165. 	ingame_effect_remove_trigger(TRIGGER_AK47_AMMO, SYNC_ALL) 
  1166. 	on_trigger("", TRIGGER_AK47_AMMO) 
  1167. 	minimap_icon_remove_trigger( TRIGGER_RPG_AMMO, SYNC_ALL ) 
  1168. 	ingame_effect_remove_trigger(TRIGGER_RPG_AMMO, SYNC_ALL) 
  1169. 	on_trigger("", TRIGGER_RPG_AMMO) 
  1170.  
  1171.    if ( crib_is_unlocked( AIRPORT_CRIB_NAME ) ) then 
  1172.       trigger_enable( TRIGGER_HOTEL_ELEVATOR, true ) 
  1173.    end 
  1174.  
  1175. 	for i, set in pairs(CHARS_WAVE1_BOATS) do 
  1176. 		for j, npc in pairs(set) do 
  1177. 			marker_remove_npc(npc, SYNC_ALL) 
  1178. 		end 
  1179. 	end 
  1180.  
  1181. 	for i, set in pairs(CHARS_WAVE2_BOATS) do 
  1182. 		for j, npc in pairs(set) do 
  1183. 			marker_remove_npc(npc, SYNC_ALL) 
  1184. 		end 
  1185. 	end 
  1186.  
  1187. 	for i, set in pairs(CHARS_WAVE3_BOATS) do 
  1188. 		for j, npc in pairs(set) do 
  1189. 			marker_remove_npc(npc, SYNC_ALL) 
  1190. 		end 
  1191. 	end 
  1192.  
  1193. 	for i, thread in pairs(THREAD_WAVE1_BOATS) do 
  1194. 		if thread ~= -1 then 
  1195. 			thread_kill(thread) 
  1196. 		end 
  1197. 	end 
  1198.  
  1199. 	for i, thread in pairs(THREAD_WAVE2_BOATS) do 
  1200. 		if thread ~= -1 then 
  1201. 			thread_kill(thread) 
  1202. 		end 
  1203. 	end 
  1204.  
  1205. 	for i, thread in pairs(THREAD_WAVE3_BOATS) do 
  1206. 		if thread ~= -1 then 
  1207. 			thread_kill(thread) 
  1208. 		end 
  1209. 	end 
  1210.  
  1211. 	for i, thread in pairs(THREAD_WAVE1_HELIS) do 
  1212. 		if thread ~= -1 then 
  1213. 			thread_kill(thread) 
  1214. 		end 
  1215. 	end 
  1216.  
  1217. 	for i, thread in pairs(THREAD_WAVE2_HELIS) do 
  1218. 		if thread ~= -1 then 
  1219. 			thread_kill(thread) 
  1220. 		end 
  1221. 	end 
  1222.  
  1223. 	for i, thread in pairs(THREAD_WAVE3_HELIS) do 
  1224. 		if thread ~= -1 then 
  1225. 			thread_kill(thread) 
  1226. 		end 
  1227. 	end 
  1228. 	if THREAD_STAY_ON_SHIP ~= -1 then 
  1229. 		thread_kill(THREAD_STAY_ON_SHIP) 
  1230. 	end 
  1231.  
  1232. 	if group_is_loaded(GROUP_SAINTS) then 
  1233. 		group_show(GROUP_SAINTS) 
  1234. 	end 
  1235. 	notoriety_set_min("Brotherhood", 0) 
  1236.  
  1237. 	--re enable warping to shore. 
  1238. 	player_warp_to_shore_enable(LOCAL_PLAYER) 
  1239. 	if IN_COOP then 
  1240. 		player_warp_to_shore_enable(REMOTE_PLAYER) 
  1241. 	end 
  1242.  
  1243.    if ( Mission_won == false ) then 
  1244.      teleport( LOCAL_PLAYER, NAV_LOCAL_START ) 
  1245.      if ( coop_is_active() ) then 
  1246.         teleport( REMOTE_PLAYER, NAV_REMOTE_START ) 
  1247.      end 
  1248.    end 
  1249.  
  1250.    bh09_notoriety_force_no_spawn( false ) 
  1251. end 
  1252.  
  1253. -- Disables or enables notoriety spawning for all teams for which 
  1254. -- it should be disabled for during this mission. 
  1255. -- 
  1256. -- no_spawning: True to disable ( defaults to true. ) False to enable. 
  1257. -- 
  1258. function bh09_notoriety_force_no_spawn( no_spawning ) 
  1259.    if ( no_spawning == nil ) then 
  1260.       no_spawning = true 
  1261.    end 
  1262.  
  1263.    notoriety_force_no_spawn( "samedi", no_spawning ) 
  1264. 	notoriety_force_no_spawn( "brotherhood", no_spawning ) 
  1265. 	notoriety_force_no_spawn( "ronin", no_spawning ) 
  1266. 	notoriety_force_no_spawn( "police", no_spawning ) 
  1267. 	notoriety_force_no_spawn( "ultor", no_spawning ) 
  1268. end 
  1269.  
  1270. function bh09_success() 
  1271. 	-- Called when the mission has ended with success 
  1272. 	group_create(GROUP_COURTESY_HELI, true) 
  1273. 	release_to_world(COURTESY_HELI) 
  1274. end 
  1275.