sr2lua/pcr01.lua

  1. -- Player creation interface 
  2.  
  3. Pcr01_building_menu = 0 
  4.  
  5. Pcr01_current_makeup_area = -1 
  6. Pcr01_current_makeup_item = -1 
  7. Pcr01_current_makeup_variant = -1 
  8. Pcr01_current_makeup_primary_color = -1 
  9. Pcr01_current_makeup_secondary_color = -1 
  10. Pcr01_makeup_color_is_primary = true 
  11.  
  12. INVALID_MAKEUP_VARIANT = -1 
  13. INVALID_COLOR 	= -1 
  14. INVALID_MAKEUP_INDEX = -1 
  15.  
  16. Pcr01_saved_makeup = {	[0] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR}, 
  17. 							[1] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR}, 
  18. 							[2] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR}, 
  19. 							[3] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR}, 
  20. 							[4] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR}} 
  21.  
  22. INVALID_HAIR_STYLE = -1 
  23. INVALID_HAIR_COLOR = -1 
  24. 							 
  25. Pcr01_saved_hair = { 	[0] = {style = INVALID_HAIR_STYLE, primary_color = INVALID_HAIR_COLOR, secondary_color = INVALID_HAIR_COLOR}, 
  26. 						[1] = {style = INVALID_HAIR_STYLE, primary_color = INVALID_HAIR_COLOR, secondary_color = INVALID_HAIR_COLOR}, 
  27. 						[2] = {style = INVALID_HAIR_STYLE, primary_color = INVALID_HAIR_COLOR, secondary_color = INVALID_HAIR_COLOR}, 
  28. 						[3] = {style = INVALID_HAIR_STYLE, primary_color = INVALID_HAIR_COLOR, secondary_color = INVALID_HAIR_COLOR}, 
  29. 						[4] = {style = INVALID_HAIR_STYLE, primary_color = INVALID_HAIR_COLOR, secondary_color = INVALID_HAIR_COLOR}} 
  30.  
  31. -- used for delayed updates 
  32. Pcr01_nav_value = -1 
  33. Pcr01_nav_thread = -1 
  34.  
  35. -- stores values for rollback 
  36. Pcr01_original_values = { } 
  37.  
  38. Pcr01_current_preset_gender = -1 
  39. Pcr01_current_preset_race = -1 
  40. Pcr01_current_preset_figure = -1 
  41.  
  42. PCR01_MALE_GENDER_NAME 			=	"male" 
  43. PCR01_FEMALE_GENDER_NAME		=	"female" 
  44.  
  45. PCR01_DEFAULT_MALE_FIGURE		=	"bodybuilder" 
  46. PCR01_DEFAULT_FEMALE_FIGURE	=	"slender" 
  47.  
  48. -- -1 == uninitialized, becomes 2 in plastic surgeon and 0 in player creation 
  49. -- 0 == nothing has been changed on player 
  50. -- 1 == player has randomized values, but not customized any 
  51. -- 2 == player has customized values 
  52. Pcr01_player_tweaked = -1 
  53. Pcr01_dialog = { } 
  54.  
  55. PCR01_YOUNG_AGE_THRESHOLD 		= 0.33 
  56. PCR01_MIDDLE_AGE_THRESHOLD		= 0.66 
  57.  
  58. PCR01_HAIR_AREA_HEAD			= 0 
  59. PCR01_HAIR_AREA_MUSTACHE	= 1 
  60. PCR01_HAIR_AREA_BEARD		= 2 
  61. PCR01_HAIR_AREA_SIDEBURNS	= 3 
  62. PCR01_HAIR_AREA_EYEBROWS	= 4 
  63.  
  64. PCR01_CHEEK_MAKEUP_INDEX		 = 1 
  65. PCR01_ENTIRE_FACE_MAKEUP_INDEX	 = 3 
  66.  
  67. PCR01_FACIAL_EXPRESSIONS_INDEX = 1 
  68.  
  69. Pcr01_hair_colors = { 
  70. 	[PCR01_HAIR_AREA_HEAD] = { primary = -1, secondary = -1 }, 
  71. 	[PCR01_HAIR_AREA_BEARD] = { primary = -1, secondary = -1 }, 
  72. } 
  73.  
  74. Pcr01_hair_preview_area = -1 
  75. Pcr01_hair_preview_item = -1 
  76. Pcr01_hair_preview_color = { primary = -1, secondary = -1 } 
  77.  
  78. Pcr01_hair_color_ref = { 
  79. 	[PCR01_HAIR_AREA_HEAD]			= PCR01_HAIR_AREA_HEAD, 
  80. 	[PCR01_HAIR_AREA_MUSTACHE]		= PCR01_HAIR_AREA_BEARD, 
  81. 	[PCR01_HAIR_AREA_BEARD]			= PCR01_HAIR_AREA_BEARD, 
  82. 	[PCR01_HAIR_AREA_SIDEBURNS]	= PCR01_HAIR_AREA_HEAD, 
  83. 	[PCR01_HAIR_AREA_EYEBROWS]		= PCR01_HAIR_AREA_HEAD, 
  84. } 
  85.  
  86. Pcr01_current_swatch_peg = -1 
  87.  
  88. function pcr01_spew_hair_info() 
  89. 	debug_print("vint", "Pcr01_saved_hair[0].style: "..var_to_string(Pcr01_saved_hair[0].style).."\n") 
  90. 	debug_print("vint", "Pcr01_saved_hair[0].primary_color: "..var_to_string(Pcr01_saved_hair[0].primary_color).."\n") 
  91. 	debug_print("vint", "Pcr01_saved_hair[0].secondary_color: "..var_to_string(Pcr01_saved_hair[0].secondary_color).."\n") 
  92. 	debug_print("vint", "Pcr01_saved_hair[1].style: "..var_to_string(Pcr01_saved_hair[1].style).."\n") 
  93. 	debug_print("vint", "Pcr01_saved_hair[1].primary_color: "..var_to_string(Pcr01_saved_hair[1].primary_color).."\n") 
  94. 	debug_print("vint", "Pcr01_saved_hair[1].secondary_color: "..var_to_string(Pcr01_saved_hair[1].secondary_color).."\n") 
  95. 	debug_print("vint", "Pcr01_saved_hair[2].style: "..var_to_string(Pcr01_saved_hair[2].style).."\n") 
  96. 	debug_print("vint", "Pcr01_saved_hair[2].primary_color: "..var_to_string(Pcr01_saved_hair[2].primary_color).."\n") 
  97. 	debug_print("vint", "Pcr01_saved_hair[2].secondary_color: "..var_to_string(Pcr01_saved_hair[2].secondary_color).."\n") 
  98. 	debug_print("vint", "Pcr01_saved_hair[3].style: "..var_to_string(Pcr01_saved_hair[3].style).."\n") 
  99. 	debug_print("vint", "Pcr01_saved_hair[3].primary_color: "..var_to_string(Pcr01_saved_hair[3].primary_color).."\n") 
  100. 	debug_print("vint", "Pcr01_saved_hair[3].secondary_color: "..var_to_string(Pcr01_saved_hair[3].secondary_color).."\n") 
  101. 	debug_print("vint", "Pcr01_saved_hair[4].style: "..var_to_string(Pcr01_saved_hair[4].style).."\n") 
  102. 	debug_print("vint", "Pcr01_saved_hair[4].primary_color: "..var_to_string(Pcr01_saved_hair[4].primary_color).."\n") 
  103. 	debug_print("vint", "Pcr01_saved_hair[4].secondary_color: "..var_to_string(Pcr01_saved_hair[4].secondary_color).."\n") 
  104.  
  105. 	debug_print("vint", "Pcr01_hair_colors[PCR01_HAIR_AREA_HEAD].primary: "..var_to_string(Pcr01_hair_colors[PCR01_HAIR_AREA_HEAD].primary).."\n") 
  106. 	debug_print("vint", "Pcr01_hair_colors[PCR01_HAIR_AREA_HEAD].secondary: "..var_to_string(Pcr01_hair_colors[PCR01_HAIR_AREA_HEAD].secondary).."\n") 
  107. 	debug_print("vint", "Pcr01_hair_colors[PCR01_HAIR_AREA_BEARD].primary: "..var_to_string(Pcr01_hair_colors[PCR01_HAIR_AREA_BEARD].primary).."\n") 
  108. 	debug_print("vint", "Pcr01_hair_colors[PCR01_HAIR_AREA_BEARD].secondary: "..var_to_string(Pcr01_hair_colors[PCR01_HAIR_AREA_BEARD].secondary).."\n") 
  109. 	 
  110. 	debug_print("vint", "Pcr01_hair_preview_area: "..var_to_string(Pcr01_hair_preview_area).."\n") 
  111. 	debug_print("vint", "Pcr01_hair_preview_item: "..var_to_string(Pcr01_hair_preview_item).."\n") 
  112. 	debug_print("vint", "Pcr01_hair_preview_color.primary: "..var_to_string(Pcr01_hair_preview_color.primary).."\n") 
  113. 	debug_print("vint", "Pcr01_hair_preview_color.secondary: "..var_to_string(Pcr01_hair_preview_color.secondary).."\n") 
  114.  
  115. end 
  116. 	 
  117. function pcr01_init() 
  118. 	-- this is just here until adjusted for std res 
  119. 	if vint_hack_is_std_res() == true then 
  120. 		--vint_set_property(vint_object_find("safe_frame"), "scale", 0.66666, 0.66666) 
  121. 	end 
  122.  
  123. 	--interface_effect_begin("store", 1, 2) 
  124. 	 
  125. 	local event_tracking_name = "Plastic Surgeon" 
  126. 	 
  127. 	menu_init() 
  128. 	local is_plastic_surgeon = pcr_is_plastic_surgeon() 
  129. 	if is_plastic_surgeon == false and mp_is_enabled() == false then 
  130. 		Pcr01_horz_menu = { 
  131. 			num_items = 7, 
  132. 			current_selection = 0, 
  133. 			[0] = { label = "CUST_MENU_PRESETS", sub_menu = Pcr01_presets_menu }, 
  134. 			[1] = { label = "CUST_MENU_GLOBAL", sub_menu = Pcr01_globals_menu }, 
  135. 			[2] = { label = "CUST_MENU_FINE_TUNING", sub_menu = Pcr01_fine_tuning_menu }, 
  136. 			[3] = { label = "CUST_MENU_HAIR", sub_menu = Pcr01_hair_areas_menu }, 
  137. 			[4] = { label = "CUST_MENU_MAKEUP", sub_menu = Pcr01_makeup_areas_menu }, 
  138. 			[5] = { label = "CUST_MENU_MOVEMENT", sub_menu = Pcr01_movement_menu }, 
  139. 			[6] = { label = "CUST_MENU_EXIT", sub_menu = Pcr01_exit_menu } 
  140. 		} 
  141. 		event_tracking_name = "Player Creation" 
  142. 	else 
  143. 		Pcr01_horz_menu = { 
  144. 			num_items = 6, 
  145. 			current_selection = 0, 
  146. 			[0] = { label = "CUST_MENU_PRESETS", sub_menu = Pcr01_presets_menu }, 
  147. 			[1] = { label = "CUST_MENU_GLOBAL", sub_menu = Pcr01_globals_menu }, 
  148. 			[2] = { label = "CUST_MENU_FINE_TUNING", sub_menu = Pcr01_fine_tuning_menu }, 
  149. 			[3] = { label = "CUST_MENU_HAIR", sub_menu = Pcr01_hair_areas_menu }, 
  150. 			[4] = { label = "CUST_MENU_MAKEUP", sub_menu = Pcr01_makeup_areas_menu }, 
  151. 			[5] = { label = "CUST_MENU_MOVEMENT", sub_menu = Pcr01_movement_menu }, 
  152. 		}		 
  153. 		event_tracking_name = "MP: Player Creation" 
  154. 	end 
  155. 	if mp_is_enabled() == true then 
  156. 		Pcr01_top_btn_tips.b_button = { label = "COMPLETION_EXIT", 	enabled = btn_tips_default_b, } 
  157. 		Pcr01_untop_btn_tips.b_button = { label = "MENU_BACK",						enabled = btn_tips_default_b, } 
  158. 	else 
  159. 		if pcr_is_plastic_surgeon() == false then 
  160. 			Pcr01_top_btn_tips.b_button = { label = "CUST_MENU_EXIT", 			enabled = btn_tips_default_b, } 
  161. 		else 
  162. 			Pcr01_top_btn_tips.b_button = { label = "CONTROL_RESUME", 			enabled = btn_tips_default_b, } 
  163. 		end 
  164. 		Pcr01_untop_btn_tips.b_button = { label = "MENU_BACK",						enabled = btn_tips_default_b, } 
  165. 	end  
  166. 	 
  167. 	--Event Tracking 
  168. 	event_tracking_interface_enter(event_tracking_name) 
  169. 	 
  170. 	--Initialize Horz Menu 
  171. 	menu_horz_init(Pcr01_horz_menu) 
  172. 	 
  173. 	if mp_is_enabled() then 
  174. 		-- Make sure we back out by fading to black when viewing this in multiplayer mode 
  175. 		Menu_fade_to_black = true 
  176. 		 
  177. 		-- Hide the hud for the duration 
  178. 		hud_fade_out() 
  179. 	end 
  180. 	pcr01_store_current_makeup() 
  181. 	pcr01_store_hair_values() 
  182. end 
  183.  
  184. function pcr01_store_current_makeup(area_to_store) 
  185. 	debug_print("vint", "saving current makeup\n") 
  186. 	 
  187. 	Pcr01_original_values.makeup_variant = Pcr01_current_makeup_variant 
  188. 	if area_to_store ~= nil and type(area_to_store) ~= "table" then  --the table here is because this function is occasionally passed menu_data when it's called from an on_exit 
  189. 		Pcr01_saved_makeup[area_to_store].item					= Pcr01_current_makeup_item 
  190. 		Pcr01_saved_makeup[area_to_store].variant				= Pcr01_current_makeup_variant 
  191. 		Pcr01_saved_makeup[area_to_store].primary_color			= Pcr01_current_makeup_primary_color 
  192. 		Pcr01_saved_makeup[area_to_store].secondary_color		= Pcr01_current_makeup_secondary_color 
  193. 	else 
  194. 		for area = 0,4 do 
  195. 			Pcr01_current_makeup_item, Pcr01_current_makeup_variant, Pcr01_current_makeup_primary_color, Pcr01_current_makeup_secondary_color = pcr_get_makeup_info(area) 
  196. 			 
  197. 			Pcr01_saved_makeup[area].item					= Pcr01_current_makeup_item 
  198. 			Pcr01_saved_makeup[area].variant				= Pcr01_current_makeup_variant 
  199. 			Pcr01_saved_makeup[area].primary_color		= Pcr01_current_makeup_primary_color 
  200. 			Pcr01_saved_makeup[area].secondary_color	= Pcr01_current_makeup_secondary_color 
  201. 		end 
  202. 	end 
  203. end 
  204.  
  205. function pcr01_cleanup() 
  206. 	-- make sure pegs are unloaded 
  207. 	peg_unload("ui_pcr_skin") 
  208. 	peg_unload("ui_pcr_eyes") 
  209. 	peg_unload("ui_pc_hair") 
  210. end 
  211.  
  212. function pcr01_load_swatch_peg(peg_name) 
  213. 	if Pcr01_current_swatch_peg ~= peg_name then 
  214. 		if Pcr01_current_swatch_peg ~= -1 then 
  215. 			peg_unload(Pcr01_current_swatch_peg) 
  216. 		end 
  217. 		 
  218. 		peg_load(peg_name) 
  219. 		Pcr01_current_swatch_peg = peg_name 
  220. 	end 
  221. end 
  222.  
  223. -- morph support 
  224. function pcr01_change_morph(menu_label, menu_data) 
  225. 	if menu_label.control.prev_displayed ~= menu_data.cur_value then 
  226. 		local h = vint_object_find("value_text", menu_label.control.grp_h) 
  227. 		local new_display = "" 
  228.  
  229. 		if menu_data.is_gender == true then 
  230. 			new_display = ""..(floor(menu_data.cur_value * 100) - 50) 
  231. 		else 
  232. 			new_display = ""..(floor(menu_data.cur_value * 100)) 
  233. 		end 
  234.  
  235. 		vint_set_property(h, "text_tag", new_display) 
  236. 		menu_label.control.prev_displayed = menu_data.cur_value 
  237. 	end 
  238. 	 
  239. 	if menu_data.prev_value ~= menu_data.cur_value then 
  240. 		pcr_apply_morph_value(menu_data.morph_set, menu_data.morph_id, menu_data.cur_value) 
  241. 		pcr_mark_changed() 
  242. 		menu_data.prev_value = menu_data.cur_value 
  243. 		Pcr01_player_tweaked = 2 
  244. 	end 
  245. end 
  246.  
  247. function pcr01_build_morph_menu(menu_data) 
  248. 	Pcr01_building_menu = menu_data 
  249.  
  250. 	menu_data.num_items = 0 
  251. 	pcr_report_avail_morphs(menu_data.morph_set, "pcr01_add_morph") 
  252. 	Pcr01_building_menu = 0 
  253. 	 
  254. 	if menu_data.camera ~= nil then 
  255. 		store_set_camera_pos(menu_data.camera) 
  256. 	end 
  257. end 
  258.  
  259. function pcr01_hair_preview_cat_color(cat, pcolor, scolor) 
  260.  
  261. 	if pcolor == nil then 
  262. 		pcolor = -1 
  263. 	end 
  264. 	if scolor == nil then 
  265. 		scolor = -1 
  266. 	end 
  267. 	-- look for area in the same category and make same color 
  268. 	local item_id 
  269. 	for key, value in Pcr01_hair_color_ref do 
  270. 		if value == cat then 
  271. 			item_id = pcr_get_hair_info(key) 
  272. 			 
  273. 			if item_id >= 0 then 
  274. 				pcr_change_hair(key, item_id, pcolor, scolor) 
  275. 			end 
  276. 		end 
  277. 	end 
  278. end 
  279.  
  280. function pcr01_hair_update_top_colors() 
  281. 	local color_cat_area = Pcr01_hair_color_ref[Pcr01_hair_preview_area] 
  282. 	local color_lookup = Pcr01_hair_colors[color_cat_area] 
  283. 	 
  284. 	-- save the colors - need to copy, no refs allowed 
  285. 	if Pcr01_hair_preview_color.primary == -1 then 
  286. 		color_lookup.primary = Pcr01_saved_hair[Pcr01_hair_preview_area].primary_color 
  287. 	else 
  288. 		color_lookup.primary = Pcr01_hair_preview_color.primary 
  289. 	end 
  290. 	if Pcr01_hair_preview_color.secondary == -1 then 
  291. 		color_lookup.secondary = Pcr01_saved_hair[Pcr01_hair_preview_area].secondary_color 
  292. 	else 
  293. 		color_lookup.secondary = Pcr01_hair_preview_color.secondary 
  294. 	end 
  295. 	 
  296. 	pcr01_hair_preview_cat_color(color_cat_area, color_lookup.primary, color_lookup.secondary) 
  297. end 
  298.  
  299. function pcr01_hair_preview() 
  300. 	local color_cat = Pcr01_hair_color_ref[Pcr01_hair_preview_area] 
  301. 	local pcolor = Pcr01_hair_preview_color.primary 
  302. 	local scolor = Pcr01_hair_preview_color.secondary 
  303. 	 
  304. 	pcr_change_hair(Pcr01_hair_preview_area, Pcr01_hair_preview_item, pcolor, scolor) 
  305.  
  306. 	pcr01_hair_preview_cat_color(color_cat, pcolor, scolor) 
  307. end 
  308.  
  309. function pcr01_hair_randomize_secondary_color() 
  310. 	local item, primary_color, secondary_color = pcr_hair_randomize(Pcr01_hair_preview_area, Pcr01_hair_preview_item, 
  311. 		Pcr01_hair_preview_color.primary, -1) 
  312. 	 
  313. 	if item > -2 then 
  314. 		Pcr01_hair_preview_color.secondary = secondary_color 
  315. 		pcr01_hair_preview() 
  316. 		pcr01_hair_update_top_colors() 
  317. 		 
  318. 		-- update menu yay! 
  319. 		local swatch_idx = -1 
  320. 		local swatches = Menu_active[0].swatches 
  321. 		 
  322. 		for i = 0, swatches.num_swatches - 1 do 
  323. 			if swatches[i].id == secondary_color then 
  324. 				swatch_idx = i 
  325. 				break 
  326. 			end 
  327. 		end 
  328.  
  329. 		if swatch_idx > -1 then 
  330. 			local menu_data = Menu_active[0] 
  331. 			local row = floor(swatch_idx / menu_data.num_cols) 
  332. 			local col = swatch_idx - (row * menu_data.num_cols) 
  333.  
  334. 			menu_grid_update_swatches(menu_data, row) 
  335. 			menu_grid_update_highlighted(menu_data, col, row) 
  336.  
  337. 			if menu_data.on_nav ~= nil then 
  338. 				menu_data.on_nav(nil, menu_data) 
  339. 			end 
  340. 		end 
  341. 	end 
  342.  
  343. 	pcr_mark_changed() 
  344. 	Pcr01_player_tweaked = 1 
  345. end 
  346.  
  347. function pcr01_hair_randomize_primary_color() 
  348. 	local item, primary_color, secondary_color = pcr_hair_randomize(Pcr01_hair_preview_area, Pcr01_hair_preview_item, 
  349. 		-1, -1) 
  350. 	 
  351. 	if item > -2 then 
  352. 		Pcr01_hair_preview_color.primary = primary_color 
  353. 		Pcr01_hair_preview_color.secondary = secondary_color 
  354. 		pcr01_hair_preview() 
  355. 		pcr01_hair_update_top_colors() 
  356. 		 
  357. 		-- update menu yay! 
  358. 		local swatch_idx = -1 
  359. 		local swatches = Menu_active[0].swatches 
  360. 		 
  361. 		for i = 0, swatches.num_swatches - 1 do 
  362. 			if swatches[i].id == primary_color then 
  363. 				swatch_idx = i 
  364. 				break 
  365. 			end 
  366. 		end 
  367.  
  368. 		if swatch_idx > -1 then 
  369. 			local menu_data = Menu_active[0] 
  370. 			local row = floor(swatch_idx / menu_data.num_cols) 
  371. 			local col = swatch_idx - (row * menu_data.num_cols) 
  372.  
  373. 			menu_grid_update_swatches(menu_data, row) 
  374. 			menu_grid_update_highlighted(menu_data, col, row) 
  375.  
  376. 			if menu_data.on_nav ~= nil then 
  377. 				menu_data.on_nav(nil, menu_data) 
  378. 			end 
  379. 		end 
  380. 	end 
  381.  
  382. 	pcr_mark_changed() 
  383. 	Pcr01_player_tweaked = 1 
  384. end 
  385.  
  386. function pcr01_hair_randomize_area() 
  387. 	local item, primary_color, secondary_color = pcr_hair_randomize(Pcr01_hair_preview_area, -2, -1, -1) 
  388. 	 
  389. 	if item > -2 then 
  390. 		Pcr01_hair_preview_item = item 
  391. 		Pcr01_hair_preview_color.primary = primary_color 
  392. 		Pcr01_hair_preview_color.secondary = secondary_color 
  393. 		pcr01_hair_preview() 
  394. 		pcr01_hair_update_top_colors() 
  395. 		 
  396. 		-- update menu 
  397. 		local menu_item_index = -1 
  398. 		for i = 0, Menu_active.num_items - 1 do 
  399. 			if Menu_active[i].hair_item == item then 
  400. 				menu_item_index = i 
  401. 				break 
  402. 			end 
  403. 		end 
  404. 		 
  405. 		if menu_item_index > -1 then 
  406. 			menu_update_nav_bar(menu_item_index) 
  407. 			audio_play(Menu_sound_item_nav) 
  408. 			 
  409. 			if Menu_active.on_nav ~= nil then 
  410. 				Menu_active.on_nav(Menu_active) 
  411. 			end 
  412. 		end 
  413. 	end 
  414.  
  415. 	pcr_mark_changed() 
  416. 	Pcr01_player_tweaked = 1 
  417. end 
  418.  
  419. function pcr01_hair_randomize_all_areas(result, action) 
  420. 	if action ~= DIALOG_ACTION_CLOSE then 
  421. 		return 
  422. 	end 
  423. 	 
  424. 	if result == 0 then 
  425. 		pcr_hair_randomize_all() 
  426. 		pcr_mark_changed() 
  427. 		 
  428. 		Pcr01_player_tweaked = 1 
  429. 			 
  430. 		menu_input_block(true) 
  431. 		thread_new("delayed_hair_store") --menu input is reenabled here 
  432. 		--pcr01_spew_hair_info() 
  433. 	end 
  434. end 
  435.  
  436. function delayed_hair_store() 
  437. 	while (pcu_is_streaming_done() == false) do  
  438. 		thread_yield() 
  439. 	end --we won't have valid values to store until the streaming is done 
  440. 	pcr01_hair_color_get_from_player() 
  441. 	pcr01_store_hair_values() 
  442. 	pcr01_hair_color_get_from_player() 
  443. 	menu_input_block(false) 
  444. 	 
  445. end 
  446. 	 
  447.  
  448. function pcr01_morph_accept() 
  449. 	Pcr01_player_tweaked = 2 
  450. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_LEFT) 
  451. end 
  452.  
  453. function pcr01_add_morph(id, name_crc, name_str, value, gender) 
  454. 	local item = { 
  455. 		type = MENU_ITEM_TYPE_NUM_SLIDER, morph_id = id, morph_set = Pcr01_building_menu.morph_set, 
  456. 		is_gender = gender, cur_value = value, prev_value = value, orig_value = value, thumb_width = 55, 
  457. 		on_value_update = pcr01_change_morph, on_select = pcr01_morph_accept 
  458. 	} 
  459. 	 
  460. 	if name_crc ~= nil then 
  461. 		item.label_crc = name_crc 
  462. 	else 
  463. 		item.label = name_str 
  464. 	end 
  465.  
  466. 	Pcr01_building_menu[Pcr01_building_menu.num_items] = item 
  467. 	Pcr01_building_menu.num_items = Pcr01_building_menu.num_items + 1 
  468. end 
  469.  
  470. function pcr01_preset_show(result, action) 
  471. 	if action ~= DIALOG_ACTION_CLOSE then 
  472. 		return 
  473. 	end 
  474. 	 
  475. 	if result == 1 then 
  476. 		menu_show(Pcr01_dialog.cancel_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  477. 		return 
  478. 	end 
  479. 	 
  480. 	if Pcr01_current_preset_gender == -1 then 
  481. 		Pcr01_current_preset_gender, Pcr01_current_preset_race, Pcr01_current_preset_figure = pcr_get_player_preset() 
  482. 	end 
  483. 	 
  484. 	Pcr01_player_tweaked = 0  
  485. 	menu_show(Pcr01_dialog.yes_menu, MENU_TRANSITION_SWEEP_LEFT) 
  486. end 
  487.  
  488. function pcr01_randomize_confirm(menu_label, menu_data) 
  489. 	if pcr_is_streaming() == true then 
  490. 		return 
  491. 	end 
  492. 	 
  493. 	if Pcr01_player_tweaked == -1 then 
  494. 		if pcr_is_plastic_surgeon() == true then 
  495. 			Pcr01_player_tweaked = 2 
  496. 		else 
  497. 			Pcr01_player_tweaked = 0 
  498. 		end 
  499. 	end 
  500. 	if Pcr01_player_tweaked < 2 then 
  501. 		Menu_active.rand_func(0, DIALOG_ACTION_CLOSE) 
  502. 		return 
  503. 	end 
  504.  
  505. 	local body = "RANDOM_WARNING_BODY" 
  506. 	local heading = "RANDOM_WARNING_HEADING" 
  507. 	dialog_box_confirmation(heading, body, Menu_active.rand_func_name) 
  508. end 
  509.  
  510. function pcr01_enter_preset(menu_label, menu_data) 
  511. 	menu_data.sub_menu.parent_menu = Pcr01_presets_menu 
  512. 	 
  513. 	Pcr01_dialog.yes_menu = menu_data.sub_menu 
  514. 	Pcr01_dialog.cancel_menu = Pcr01_presets_menu 
  515.  
  516. 	debug_print("vint", "tweaked status is"..var_to_string(Pcr01_player_tweaked).."\n") 
  517. 	 
  518. 	if Pcr01_player_tweaked == -1 then 
  519. 		if pcr_is_plastic_surgeon() == true then 
  520. 			Pcr01_player_tweaked = 2 
  521. 		else 
  522. 			Pcr01_player_tweaked = 0; 
  523. 		end 
  524. 	end 
  525. 	if Pcr01_player_tweaked == 0 then 
  526. 		pcr01_preset_show(0, DIALOG_ACTION_CLOSE) 
  527. 		return 
  528. 	end 
  529.  
  530. 	local body 
  531. 	if Pcr01_current_preset_gender == -1 then 
  532. 		body = "PRESET_WARNING_BODY1" 
  533. 	else 
  534. 		body = "PRESET_WARNING_BODY2" 
  535. 	end 
  536. 	 
  537. 	local heading = "PRESET_WARNING_HEADING" 
  538. 	dialog_box_confirmation(heading, body, "pcr01_preset_show") 
  539. end 
  540.  
  541. -- presets support 
  542. function pcr01_select_preset(menu_label, menu_data) 
  543. 	local update_preset = false 
  544. 	local update_regional_preset = false 
  545. 	 
  546. 	if menu_data.preset_gender ~= nil and menu_data.preset_gender ~= Pcr01_current_preset_gender then 
  547. 		Pcr01_current_preset_gender = menu_data.preset_gender 
  548. 		update_preset = true 
  549. 		if Pcr01_current_preset_gender == PCR01_FEMALE_GENDER_NAME then 
  550. 			Pcr01_current_preset_figure = PCR01_DEFAULT_FEMALE_FIGURE 
  551. 		else 
  552. 			Pcr01_current_preset_figure = PCR01_DEFAULT_MALE_FIGURE 
  553. 		end 
  554. 	end 
  555. 	 
  556. 	if menu_data.preset_race ~= nil and menu_data.preset_race ~= Pcr01_current_preset_race then 
  557. 		Pcr01_current_preset_race = menu_data.preset_race 
  558. 		update_preset = true 
  559. 	end 
  560. 	 
  561. 	if menu_data.preset_figure ~= nil and menu_data.preset_figure ~= Pcr01_current_preset_figure then 
  562. 		Pcr01_current_preset_figure = menu_data.preset_figure 
  563. 		update_regional_preset = true; 
  564. 	end 
  565. 		 
  566. 	if update_preset == true then 
  567. 		local preset_name = Pcr01_current_preset_gender .. "_" .. Pcr01_current_preset_race 
  568. -- JNW 6.22.08: Apply both presets before components start to stream in. 
  569. 		local regional_preset_name = Pcr01_current_preset_gender .. "_" .. Pcr01_current_preset_figure; 
  570. 		pcr_apply_preset(preset_name, "figure", regional_preset_name) 
  571. 		pcr_mark_changed() 
  572. 		pcr01_store_hair_values() 
  573. 		Pcr01_player_tweaked = 0 
  574. 	else 
  575. 		if update_regional_preset == true then 
  576. 			pcr_apply_regional_preset("figure", Pcr01_current_preset_gender .. "_" .. Pcr01_current_preset_figure) 
  577. 			pcr_mark_changed() 
  578. 			pcr01_store_hair_values() 
  579. 			Pcr01_player_tweaked = 0 
  580. 		end 
  581. 	end 
  582. 	 
  583. 	menu_show(Pcr01_presets_menu, MENU_TRANSITION_SWEEP_LEFT) 
  584. end 
  585.  
  586. function pcr01_clear_saved_makeup() 
  587.  
  588. 	Pcr01_current_makeup_area = -1 
  589. 	Pcr01_current_makeup_item = -1 
  590. 	Pcr01_current_makeup_variant = -1 
  591. 	Pcr01_current_makeup_primary_color = -1 
  592. 	Pcr01_current_makeup_secondary_color = -1 
  593. 	Pcr01_makeup_color_is_primary = true 
  594. 	Pcr01_saved_makeup[0] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR} 
  595. 	Pcr01_saved_makeup[1] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR} 
  596. 	Pcr01_saved_makeup[2] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR} 
  597. 	Pcr01_saved_makeup[3] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR} 
  598. 	Pcr01_saved_makeup[4] = {item = INVALID_MAKEUP_INDEX, variant = INVALID_MAKEUP_VARIANT, primary_color = INVALID_COLOR, secondary_color = INVALID_COLOR} 
  599. end 
  600.  
  601. function pcr01_load_saved_character(result, action) 
  602. 	if action ~= DIALOG_ACTION_CLOSE then 
  603. 		return 
  604. 	end 
  605. 	 
  606. 	if result == 1 then 
  607. 		--do nothing, we canceled 
  608. 		return 
  609. 	end 
  610. 	--DO IT!! 
  611. 	debug_print("vint","pcr: actually load saved game character\n") 
  612. 	pcr01_clear_saved_makeup() 
  613. 	pcr01_store_current_makeup() 
  614. 	 
  615. 	multi_load_saved_character() 
  616. 	 
  617. 	--save the makeup it could have changed 
  618. 	pcr01_store_current_makeup() 
  619. 	 
  620. 	pcr_mark_changed() 
  621. end 
  622.  
  623. function pcr01_load_saved_confirm() 
  624. 	local options = { [0] = "CONTROL_OKAY", [1] = "CONTROL_CANCEL" } 
  625. 	dialog_box_open("PLAYER_CREATION_IMPORT", "SAVELOAD_IMPORT_GAME_CONFIRM_EXPOSITION", options, "pcr01_load_saved_character", 0, DIALOG_PRIORITY_ACTION) 
  626. end 
  627.  
  628. function pcr01_preset_menu_show(menu_label, menu_data) 
  629. 	if mp_is_enabled() then 
  630. 		--add a button tip and set a function for the x button 
  631. 		Pcr01_presets_menu.btn_tips = Pcr01_mp_preset_btn_tips 
  632. 		Pcr01_presets_menu.on_alt_select = pcr01_load_saved_confirm 
  633. 	end 
  634. 	--what the old on show did 
  635. 	pcr01_camera_body_pos() 
  636. end 
  637. ---------------- 
  638. -- START HAIR -- 
  639. ---------------- 
  640.  
  641. function pcr01_hair_color_get_from_player() 
  642. 	local item, pcv, pcn, scv, scn 
  643.  
  644. 	-- get the current colors for hair and beard 
  645. 	local color_cat = Pcr01_hair_colors[PCR01_HAIR_AREA_HEAD] 
  646. 	color_cat.primary = -1 
  647. 	color_cat.secondary = -1 
  648. 	color_cat.primary_name = "" 
  649. 	color_cat.secondary_name = "" 
  650. 	 
  651. 	for key, val in Pcr01_hair_color_ref do 
  652. 		if val == PCR01_HAIR_AREA_HEAD then 
  653. 			item, pcv, scv, pcn, scn = pcr_get_hair_info(key) 
  654. 			 
  655. 			if item >= 0 then 
  656. 				color_cat.primary = pcv 
  657. 				color_cat.secondary = scv 
  658. 				color_cat.primary_name = pcn 
  659. 				color_cat.secondary_name = scn 
  660. 				break 
  661. 			end 
  662. 		end 
  663. 	end 
  664. 	 
  665. 	color_cat = Pcr01_hair_colors[PCR01_HAIR_AREA_BEARD] 
  666. 	color_cat.primary = -1 
  667. 	color_cat.secondary = -1 
  668. 	color_cat.primary_name = "" 
  669. 	color_cat.secondary_name = "" 
  670.  
  671. 	for key, val in Pcr01_hair_color_ref do 
  672. 		if val == PCR01_HAIR_AREA_BEARD then 
  673. 			item, pcv, scv, pcn, scn = pcr_get_hair_info(key) 
  674. 			 
  675. 			if item >= 0 then 
  676. 				color_cat.primary = pcv 
  677. 				color_cat.secondary = scv 
  678. 				color_cat.primary_name = pcn 
  679. 				color_cat.secondary_name = scn 
  680. 				break 
  681. 			end 
  682. 		end 
  683. 	end 
  684. end 
  685.  
  686. function pcr01_hair_item_select(menu_label, menu_data) 
  687. 	if Pcr01_nav_thread ~= -1 then 
  688. 		thread_kill(Pcr01_nav_thread) 
  689. 		Pcr01_nav_thread = -1 
  690. 	end 
  691. 	Pcr01_hair_preview_item = menu_data.hair_item 
  692. 	local color_cat_area = Pcr01_hair_color_ref[Pcr01_hair_preview_area] 
  693. 	local color_lookup = Pcr01_hair_colors[color_cat_area] 
  694. 	 
  695. 	Pcr01_hair_preview_color.primary = color_lookup.primary 
  696. 	Pcr01_hair_preview_color.secondary = color_lookup.secondary 
  697. 	 
  698. 	pcr01_hair_preview() 
  699. 	pcr_mark_changed() 
  700. 	Pcr01_player_tweaked = 2 
  701. 	 
  702. 	if menu_data == Pcr01_hair_style_menu[0] then 
  703. 		-- selected no hair so back up to areas 
  704. 		menu_show(Pcr01_hair_areas_menu, MENU_TRANSITION_SWEEP_LEFT) 
  705. 	elseif Pcr01_hair_preview_color.primary == -1 then 
  706. 		-- only show secondary color if it's a head color area 
  707. 		Pcr01_hair_primary_color_menu.show_secondary = (color_cat_area == PCR01_HAIR_AREA_HEAD) 
  708. 		Pcr01_hair_primary_color_menu.parent_menu = Menu_active 
  709. 		Pcr01_hair_secondary_color_menu.parent_menu = Pcr01_hair_primary_color_menu 
  710. 		menu_show(Pcr01_hair_primary_color_menu, MENU_TRANSITION_SWEEP_LEFT) 
  711. 	else 
  712. 		menu_show(Pcr01_hair_areas_menu, MENU_TRANSITION_SWEEP_LEFT) 
  713. 	end 
  714. end 
  715.  
  716. function pcr01_globals_show(menu_data) 
  717. 	pcr01_camera_body_pos() 
  718. 	 
  719. 	-- set the initial value of sliders 
  720. 	 
  721. 	for i = 0, 3 do 
  722. 		local slider = menu_data[i] 
  723. 		local val = pcr_get_morph_value(slider.morph_set, slider.morph_id) 
  724. 		slider.cur_value = val 
  725. 		slider.prev_value = val 
  726. 		slider.orig_value = val 
  727. 	end 
  728. end 
  729.  
  730. function pcr01_hair_areas_show(menu_data) 
  731. 	pcr01_camera_head_pos() 
  732. 	pcr01_hair_color_get_from_player() 
  733. 	pcr01_store_hair_values() 
  734. 	pcr01_restore_makeup() --when the player uses shoulder buttons to navigate away from the menu, makeup needs to be reset 
  735. 	--and the only way to do this was putting it in the on_show of adjacent menues 
  736. end 
  737.  
  738. function pcr01_hair_style_nav(menu_data) 
  739. 	if Pcr01_nav_thread ~= -1 then 
  740. 		thread_kill(Pcr01_nav_thread) 
  741. 		Pcr01_nav_thread = -1 
  742. 	end 
  743. 	 
  744. 	Pcr01_nav_value = menu_data[menu_data.highlighted_item].hair_item 
  745. 	Pcr01_nav_thread = thread_new("pcr01_delayed_set_hair_item") 
  746. end 
  747.  
  748. function pcr01_hair_style_show(menu_data) 
  749. 	if Pcr01_nav_thread > -1 then 
  750. 		thread_kill(Pcr01_nav_thread) 
  751. 		Pcr01_nav_thread = -1 
  752. 	end 
  753.  
  754. 	local hair_area = Pcr01_hair_areas_menu[Pcr01_hair_areas_menu.highlighted_item].hair_area 
  755. 	Pcr01_hair_preview_area = hair_area 
  756. 	Pcr01_hair_preview_item = pcr_get_hair_info(hair_area) 
  757. 	 
  758. 	local color_set = Pcr01_hair_colors[Pcr01_hair_color_ref[hair_area]] 
  759. 	Pcr01_hair_preview_color.primary = color_set.primary 
  760. 	Pcr01_hair_preview_color.secondary = color_set.secondary 
  761. 	 
  762. 	Pcr01_building_menu = menu_data 
  763. 	 
  764. 	menu_data.header_label_str = Pcr01_hair_areas_menu[Pcr01_hair_areas_menu.highlighted_item].header_label_str 
  765.  
  766. 	menu_data[0] = { 
  767. 		label = "HAIR_CAT_NONE", type = MENU_ITEM_TYPE_SELECTABLE, hair_area = hair_area, 
  768. 		hair_item = -1, on_select = pcr01_hair_item_select } 
  769.  
  770. 	menu_data.hair_area = hair_area 
  771. 	menu_data.highlighted_item = 0 
  772. 	Pcr01_building_menu = menu_data 
  773. 	menu_data.num_items = 1 
  774. 	pcr_report_hair_items(hair_area, "pcr01_add_hair_item") 
  775. 	Pcr01_building_menu = 0 
  776. 	pcr01_camera_head_pos() 
  777. end 
  778.  
  779. function pcr01_highlight_random_swatch(result, action) 
  780. 	if action ~= DIALOG_ACTION_CLOSE then 
  781. 		return 
  782. 	end 
  783. 	 
  784. 	if result == 0 then 
  785. 		local swatches = Menu_active[0].swatches 
  786. 		local new_swatch_idx = rand_int(0, swatches.num_swatches - 1) 
  787. 		local menu_data = Menu_active[0] 
  788. 		 
  789. 		local row = floor(new_swatch_idx / menu_data.num_cols) 
  790. 		local col = new_swatch_idx - (row * menu_data.num_cols) 
  791.  
  792. 		menu_grid_update_swatches(menu_data, row) 
  793. 		menu_grid_update_highlighted(menu_data, col, row) 
  794.  
  795. 		if menu_data.on_nav ~= nil then 
  796. 			menu_data.on_nav(nil, menu_data) 
  797. 		end 
  798. 		 
  799. 		if Pcr01_player_tweaked == 2 then 
  800. 			Pcr01_player_tweaked = 1 
  801. 		end 
  802. 	end 
  803. end 
  804.  
  805. function pcr01_highlight_random_item() 
  806. 	local new_item = rand_int(0, Menu_active.num_items - 1) 
  807. 	 
  808. 	menu_update_nav_bar(new_item) 
  809. 	audio_play(Menu_sound_item_nav) 
  810. 	 
  811. 	if Menu_active.on_nav ~= nil then 
  812. 		Menu_active.on_nav(Menu_active) 
  813. 	end 
  814. end 
  815.  
  816. function pcr01_add_hair_item(hair_item, label_crc, label_str, is_current) 
  817. 	Pcr01_building_menu[Pcr01_building_menu.num_items] = { 
  818. 		type = MENU_ITEM_TYPE_SELECTABLE, hair_area = Pcr01_building_menu.hair_area, 
  819. 		hair_item = hair_item, on_select = pcr01_hair_item_select, label = label_str, label_crc = label_crc 
  820. 	} 
  821.  
  822. 	if is_current == true then 
  823. 		 
  824. 		Pcr01_building_menu.highlighted_item = Pcr01_building_menu.num_items 
  825. 	end 
  826. 	 
  827. 	Pcr01_building_menu.num_items = Pcr01_building_menu.num_items + 1 
  828. end 
  829.  
  830. function pcr01_hair_style_back() 
  831. 	if pcu_is_streaming_done() then  --make sure hair doesn't update as we back out 
  832. 		if Pcr01_nav_thread ~= -1 then 
  833. 			thread_kill(Pcr01_nav_thread) 
  834. 			Pcr01_nav_thread = -1 
  835. 		end 
  836. 		debug_print("vint", "backing out of hair with"..var_to_string(Pcr01_saved_hair[Pcr01_hair_preview_area].style).."\n") 
  837. 		if Pcr01_saved_hair[Pcr01_hair_preview_area].style ~= nil then 
  838. 			Pcr01_hair_preview_item = Pcr01_saved_hair[Pcr01_hair_preview_area].style 
  839. 			pcr01_hair_preview() 
  840. 		end 
  841. 		 
  842. 		audio_play(Menu_sound_back) 
  843.  
  844. 		menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  845. 	end 
  846. end 
  847.  
  848. function pcr01_hair_color_grid_show(menu_data) 
  849. 	local menu_item = menu_data[0] 
  850.  
  851. 	Pcr01_original_values.skin_color = nil 
  852. 	menu_item.swatches = { num_swatches = 0 } 
  853. 	Pcr01_building_menu = menu_data 
  854. 	pcr_report_hair_colors(Pcr01_hair_preview_area, menu_data.is_primary, "pcr01_add_hair_color") 
  855. 	pcr01_load_swatch_peg("ui_pc_hair") 
  856. 	 
  857. 	menu_grid_show(menu_data, menu_item, vint_object_find("swatch_hair")) 
  858. end 
  859.  
  860. function pcr01_add_hair_color(id, swatch_crc, label_crc, label_str, current, swatch_label) 
  861. 	local swatches = Pcr01_building_menu[0].swatches 
  862. 	swatches[swatches.num_swatches] = { 
  863. 		id = id, swatch_crc = swatch_crc, label_crc = label_crc, label_str = label_str, swatch_label = swatch_label 
  864. 	} 
  865.  
  866. 	if current == true then 
  867. 		 
  868. 		Pcr01_building_menu[0].cur_idx = swatches.num_swatches 
  869. 	end 
  870.  
  871. 	swatches.num_swatches = swatches.num_swatches + 1 
  872. end 
  873.  
  874. function pcr01_delayed_set_hair_item() 
  875. 	delay(0.8) 
  876.  
  877. 	Pcr01_hair_preview_item = Pcr01_nav_value 
  878. 	pcr01_hair_preview() 
  879. 	Pcr01_nav_value = -1 
  880.  
  881. 	Pcr01_nav_thread = -1 
  882. end 
  883.  
  884. function pcr01_hair_color_delayed_set() 
  885. 	delay(0.8) 
  886.  
  887. 	if Pcr01_nav_value > -1 then 
  888. 		if Menu_active.is_primary == true then 
  889. 			Pcr01_hair_preview_color.primary = Pcr01_nav_value 
  890. 		else 
  891. 			Pcr01_hair_preview_color.secondary = Pcr01_nav_value 
  892. 		end 
  893. 		pcr01_hair_preview() 
  894. 		Pcr01_nav_value = -1 
  895. 	end 
  896.  
  897. 	Pcr01_nav_thread = -1 
  898. end 
  899.  
  900. function pcr01_hair_color_nav(menu_option, menu_data) 
  901. 	if Pcr01_nav_thread > -1 then 
  902. 		thread_kill(Pcr01_nav_thread) 
  903. 		Pcr01_nav_thread = -1 
  904. 	end 
  905.  
  906. 	local swatches = menu_data.swatches 
  907. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  908.  
  909. 	if idx < swatches.num_swatches then 
  910. 		Pcr01_nav_value = swatches[idx].id 
  911. 		Pcr01_nav_thread = thread_new("pcr01_hair_color_delayed_set") 
  912. 	end 
  913. end 
  914.  
  915. function pcr01_store_hair_values() 
  916. 	 
  917. 	debug_print("vint", "about to store hair values\n") 
  918. 	for hair_area_iter = 0, 4 do	 
  919. 		Pcr01_saved_hair[hair_area_iter].style, Pcr01_saved_hair[hair_area_iter].primary_color, 
  920. 		Pcr01_saved_hair[hair_area_iter].secondary_color = pcr_get_hair_info(hair_area_iter) 
  921. 		debug_print("vint", "area: "..var_to_string(hair_area_iter).." style: "..var_to_string(Pcr01_saved_hair[hair_area_iter].style).. 
  922. 			" primary color: "..var_to_string(Pcr01_saved_hair[hair_area_iter].primary_color).. 
  923. 			" secondary color: "..var_to_string(Pcr01_saved_hair[hair_area_iter].secondary_color).."\n") 
  924. 		 
  925. 	end 
  926. end 
  927.  
  928. function pcr01_restore_primary_hair_values() 
  929. 	if Pcr01_nav_thread ~= -1 then 
  930. 		thread_kill(Pcr01_nav_thread) 
  931. 		Pcr01_nav_thread = -1 
  932. 	end 
  933. 	for hair_area_iter = 0, 4 do 
  934. 		if Pcr01_saved_hair[hair_area_iter].primary_color ~= nil then 
  935. 			Pcr01_hair_preview_color.primary = Pcr01_saved_hair[hair_area_iter].primary_color 
  936. 			Pcr01_hair_preview_color.secondary = -1 
  937. 			Pcr01_hair_preview_area = hair_area_iter 
  938. 			pcr01_hair_update_top_colors() 
  939. 		end 
  940. 	end 
  941. end 
  942.  
  943. function pcr01_restore_secondary_hair_values()  
  944. 	if Pcr01_nav_thread ~= -1 then 
  945. 		thread_kill(Pcr01_nav_thread) 
  946. 		Pcr01_nav_thread = -1 
  947. 	end 
  948. 	for hair_area_iter = 0, 4 do 
  949. 		if Pcr01_saved_hair[hair_area_iter].secondary_color ~= nil then 
  950. 			Pcr01_hair_preview_color.primary = -1 
  951. 			Pcr01_hair_preview_color.secondary = Pcr01_saved_hair[hair_area_iter].secondary_color 
  952. 			debug_print("vint", "SC: "..var_to_string(Pcr01_saved_hair[hair_area_iter].secondary_color).."\n") 
  953. 			Pcr01_hair_preview_area = hair_area_iter 
  954. 			pcr01_hair_update_top_colors() 
  955. 		end 
  956. 	end 
  957. end 
  958.  
  959. function pcr01_restore_hair_values() 
  960.  
  961. 	if Pcr01_nav_thread ~= -1 then 
  962. 		thread_kill(Pcr01_nav_thread) 
  963. 		Pcr01_nav_thread = -1 
  964. 	end 
  965. 	debug_print("vint", "About to restore hair\n") 
  966. 	for hair_area_iter = 0, 4 do 
  967. 		local preview_needed = false 
  968. 		if Pcr01_saved_hair[hair_area_iter].style ~= nil then 
  969. 			Pcr01_hair_preview_item = Pcr01_saved_hair[hair_area_iter].style 
  970. 			preview_needed = true; 
  971. 			debug_print("vint", "The new hair style is "..var_to_string(hair_area_iter).."\n"); 
  972. 		end	 
  973. 		if Pcr01_saved_hair[hair_area_iter].primary_color ~= nil then 
  974. 			Pcr01_hair_preview_color.primary = Pcr01_saved_hair[hair_area_iter].primary_color 
  975. 			preview_needed = true; 
  976. 			Pcr01_hair_preview_area = hair_area_iter 
  977. 			pcr01_hair_update_top_colors() 
  978. 			debug_print("vint", "The new hair primary color is "..var_to_string(hair_area_iter).."\n"); 
  979. 		end 
  980. 		if Pcr01_saved_hair[hair_area_iter].secondary_color ~= nil then 
  981. 			Pcr01_hair_preview_color.secondary = Pcr01_saved_hair[hair_area_iter].secondary_color 
  982. 			preview_needed = true; 
  983. 			Pcr01_hair_preview_area = hair_area_iter 
  984. 			pcr01_hair_update_top_colors() 
  985. 			debug_print("vint", "The new hair style is "..var_to_string(hair_area_iter).."\n"); 
  986. 		end 
  987. 		if preview_needed == true then 
  988. 			Pcr01_hair_preview_area = hair_area_iter 
  989. 			pcr01_hair_preview() 
  990. 		end 
  991. 	end 
  992. 	 
  993. end 
  994.  
  995.  
  996. function pcr01_hair_color_category_select(menu_label, menu_item) 
  997. 	Pcr01_hair_preview_area  = menu_item.hair_area 
  998. 	Pcr01_hair_preview_item, Pcr01_hair_preview_color.primary, Pcr01_hair_preview_color.secondary = pcr_get_hair_info(Pcr01_hair_preview_area) 
  999. 	local menu = nil 
  1000. 	 
  1001. 	if menu_item.is_primary == false then 
  1002. 		menu = Pcr01_hair_secondary_color_menu 
  1003. 	else 
  1004. 		menu = Pcr01_hair_primary_color_menu 
  1005. 	end 
  1006.  
  1007. 	menu.show_secondary = false 
  1008. 	menu.parent_menu = Menu_active 
  1009. 	menu_show(menu, MENU_TRANSITION_SWEEP_LEFT) 
  1010. end 
  1011.  
  1012. function pcr01_hair_color_select(menu_option, menu_data) 
  1013. 	if Pcr01_nav_thread > -1 then 
  1014. 		thread_kill(Pcr01_nav_thread) 
  1015. 		Pcr01_nav_thread = -1 
  1016. 	end 
  1017. 	local swatches = menu_data.swatches 
  1018. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1019.  
  1020. 	if idx < swatches.num_swatches then 
  1021. 		if Menu_active.is_primary == true then 
  1022. 			Pcr01_hair_preview_color.primary = swatches[idx].id 
  1023. 		else 
  1024. 			Pcr01_hair_preview_color.secondary = swatches[idx].id 
  1025. 		end 
  1026. 		pcr01_hair_preview() 
  1027. 		pcr01_hair_update_top_colors() 
  1028. 		pcr_mark_changed() 
  1029. 		Pcr01_player_tweaked = 2 
  1030. 	end 
  1031. --	pcr01_spew_hair_info() 
  1032. 	if Menu_active.is_primary == true and Menu_active.show_secondary == true then 
  1033. 		menu_show(Pcr01_hair_secondary_color_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1034. 	else 
  1035. 		menu_show(Pcr01_hair_areas_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1036. 	end 
  1037. end 
  1038.  
  1039. function pcr01_hair_color_grid_back(menu_option, menu_data) 
  1040. 	if Pcr01_nav_thread > -1 then 
  1041. 		thread_kill(Pcr01_nav_thread) 
  1042. 		Pcr01_nav_thread = -1 
  1043. 	end 
  1044. 	 
  1045. 	debug_print("vint", "the area we're backing out of is: "..var_to_string(Pcr01_hair_preview_area).."\n") 
  1046. 	if Menu_active.is_primary == true then 
  1047. 		debug_print("vint", "primary\n") 
  1048. 		pcr01_restore_primary_hair_values() 
  1049. 	else  
  1050. 		debug_print("vint", "secondary\n") 
  1051. 		pcr01_restore_secondary_hair_values() 
  1052. 	end 
  1053. 	 
  1054. 	audio_play(Menu_sound_back) 
  1055. 	 
  1056. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1057. end 
  1058.  
  1059. function pcr01_hair_color_grid_release(menu) 
  1060. 	menu_grid_release(menu[0]) 
  1061. end 
  1062.  
  1063. function pcr01_hair_color_update_swatch(swatch) 
  1064. 	local label = vint_object_find("label_text", swatch.swatch_h) 
  1065. 	vint_set_property(label, "text_tag", swatch.swatch_label) 
  1066. end 
  1067.  
  1068. -- voice 
  1069. function pcr01_set_voice(menu_label, menu_data) 
  1070. 	pcr_set_voice(menu_data.voice, false) 
  1071. 	pcr_mark_changed() 
  1072. 	Pcr01_player_tweaked = 2 
  1073. 	menu_show(Pcr01_movement_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1074. end 
  1075.  
  1076. function pcr01_nav_voice(menu_data) 
  1077. 	pcr_set_voice(menu_data[menu_data.highlighted_item].voice) 
  1078. end 
  1079.  
  1080. function pcr01_voice_menu_show(menu_data) 
  1081. 	pcr_set_voice("play_current") 
  1082. 	menu_data.highlighted_item = pcr_get_current_voice_number() 
  1083. 	pcr01_camera_head_pos() 
  1084. end 
  1085.  
  1086. -- makeup 
  1087. function pcr01_makeup_area_list_show() 
  1088. 	Pcr01_current_makeup_variant = 0 
  1089. 	Pcr01_current_makeup_primary_color = -1 
  1090. 	Pcr01_current_makeup_secondary_color = -1 
  1091. 	 
  1092. 	pcr01_restore_hair_values() 
  1093. 	pcr01_store_current_makeup() 
  1094. 	 
  1095. 	pcr01_camera_head_pos() 
  1096. end 
  1097.  
  1098. function pcr01_set_makeup_item(menu_label, menu_data) 
  1099. 	Pcr01_current_makeup_item = menu_data.makeup_item 
  1100. 	pcr01_makeup_update() 
  1101.  
  1102. 	if Menu_active.highlighted_item == 0 then 
  1103. 		pcr_mark_changed()	-- Removal is permanent 
  1104. 		Pcr01_player_tweaked = 2 
  1105. 		menu_show(Pcr01_makeup_areas_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1106. 		return 
  1107. 	end 
  1108. 	Pcr01_makeup_variations_menu.num_items = 0 
  1109. 	pcr_report_makeup_variants(Pcr01_current_makeup_item, "pcr01_makeup_variation_add_item") 
  1110. 	Pcr01_current_makeup_variant = 0 
  1111. 	 
  1112. 	if Pcr01_makeup_variations_menu.num_items < 2 then 
  1113. 		Pcr01_makeup_primary_color_menu.parent_menu = Menu_active 
  1114. 		menu_show(Pcr01_makeup_primary_color_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1115. 	else 
  1116. 		Pcr01_makeup_variations_menu.parent_menu = Menu_active 
  1117. 		menu_show(Pcr01_makeup_variations_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1118. 	end 
  1119. end 
  1120.  
  1121. function pcr01_makeup_item_delayed_set() 
  1122. 	delay(0.8) 
  1123. 	 
  1124. 	pcr01_makeup_update() 
  1125. 	 
  1126. 	Pcr01_nav_thread = -1 
  1127. end 
  1128.  
  1129. function pcr01_makeup_item_nav() 
  1130. 	if Pcr01_nav_thread ~= -1 then 
  1131. 		thread_kill(Pcr01_nav_thread) 
  1132. 		Pcr01_nav_thread = -1 
  1133. 	end 
  1134.  
  1135. 	if Menu_active == Pcr01_makeup_variations_menu then 
  1136. 		Pcr01_current_makeup_variant = Menu_active[Menu_active.highlighted_item].makeup_variant 
  1137. 	else 
  1138. 		Pcr01_current_makeup_variant = 0 
  1139. 		Pcr01_current_makeup_item = Menu_active[Menu_active.highlighted_item].makeup_item 
  1140. 	end 
  1141. 	 
  1142. 	Pcr01_nav_thread = thread_new("pcr01_makeup_item_delayed_set") 
  1143. end 
  1144.  
  1145. function prc01_makeup_variant_show() 
  1146. 	if Menu_active == Pcr01_makeup_variations_menu then 
  1147. 		Pcr01_current_makeup_variant = Menu_active[Menu_active.highlighted_item].makeup_variant 
  1148. 	else 
  1149. 		Pcr01_current_makeup_variant = 0 
  1150. 		if Menu_active[Menu_active.highlighted_item].makeup_item ~= nil then 
  1151. 			Pcr01_current_makeup_item = Menu_active[Menu_active.highlighted_item].makeup_item 
  1152. 		end 
  1153. 	end 
  1154. end 
  1155.  
  1156. function pcr01_build_makeup_menu(menu_data) 
  1157. 	if Menu_active[Menu_active.highlighted_item].makeup_area ~= nil then 
  1158. 		Pcr01_current_makeup_area = Menu_active[Menu_active.highlighted_item].makeup_area 
  1159. 	end 
  1160.  
  1161. 	Pcr01_building_menu = menu_data 
  1162. 	Pcr01_building_menu.num_items = 1 
  1163. 	Pcr01_building_menu[0] = { 
  1164. 		label = "CUST_ITEM_NOTHING", type = MENU_ITEM_TYPE_SELECTABLE, makeup_item = -1, on_select = pcr01_set_makeup_item } 
  1165. 	Pcr01_building_menu.highlighted_item = 0 --default the first item to be highlighted, 
  1166. 														--add_make_up_item will change this to currently worn item 
  1167. 	pcr_report_makeup_items(Pcr01_current_makeup_area, "pcr01_add_makeup_item") 
  1168. 	 
  1169. end 
  1170.  
  1171. function pcr01_add_makeup_item(makeup_index, name_crc, name_str, current) 
  1172. 	local item = { 
  1173. 		type = MENU_ITEM_TYPE_SELECTABLE, makeup_item = makeup_index, on_select = pcr01_set_makeup_item 
  1174. 	} 
  1175.  
  1176. 	if name_crc == nil then 
  1177. 		item.label = name_str 
  1178. 	else 
  1179. 		item.label_crc = name_crc 
  1180. 	end 
  1181.  
  1182. 	if current == true then 
  1183. 		Pcr01_building_menu.highlighted_item = Pcr01_building_menu.num_items 
  1184. 		 
  1185. 		if Pcr01_original_values.makeup_item == nil then 
  1186. 			Pcr01_original_values.makeup_item = makeup_index 
  1187. 		end 
  1188. 	end 
  1189.  
  1190. 	Pcr01_building_menu[Pcr01_building_menu.num_items] = item 
  1191. 	Pcr01_building_menu.num_items = Pcr01_building_menu.num_items + 1 
  1192. end 
  1193.  
  1194. function pcr01_makeup_color_grid_show(menu_data) 
  1195. 	local menu_item = menu_data[0] 
  1196.  
  1197. 	menu_item.swatches = { num_swatches = 0 } 
  1198. 	Pcr01_building_menu = menu_data 
  1199. 	Pcr01_makeup_color_is_primary = menu_data.is_primary 
  1200. 	pcr_report_makeup_colors(Pcr01_current_makeup_area, Pcr01_makeup_color_is_primary, "pcr01_makeup_add_color") 
  1201. 	 
  1202. 	local swatch_template = vint_object_find("swatch_color", nil, MENU_BASE_DOC_HANDLE) 
  1203. 	menu_grid_show(menu_data, menu_item, swatch_template) 
  1204. end 
  1205.  
  1206. function pcr01_makeup_add_color(color_index, label_crc, label_str, red, green, blue, max_colors, is_current) 
  1207. 	local item = { 
  1208. 		type = MENU_ITEM_TYPE_SELECTABLE, color_index = color_index, on_select = pcr01_select_makeup_color, 
  1209. 		red = red, green = green, blue = blue, max_colors = max_colors, 
  1210. 	} 
  1211. 	 
  1212. 	if label_crc == nil then 
  1213. 		item.label_str = label_str 
  1214. 	else 
  1215. 		item.label_crc = label_crc 
  1216. 	end 
  1217.  
  1218. 	local swatches = Pcr01_building_menu[0].swatches 
  1219. 	swatches[swatches.num_swatches] = item 
  1220. 	 
  1221. 	if is_current == true then 
  1222. 		Pcr01_building_menu[0].cur_idx = swatches.num_swatches 
  1223. 	end 
  1224. 	 
  1225. 	swatches.num_swatches = swatches.num_swatches + 1 
  1226. end 
  1227.  
  1228. function pcr01_delayed_set_makeup_color() 
  1229. 	delay(0.8) 
  1230.  
  1231. 	if Pcr01_nav_value > -1 then 
  1232. 		if Menu_active.is_primary == true then 
  1233. 			Pcr01_current_makeup_primary_color = Pcr01_nav_value 
  1234. 		else 
  1235. 			Pcr01_current_makeup_secondary_color = Pcr01_nav_value 
  1236. 		end 
  1237. 		pcr01_makeup_update() 
  1238. 	end 
  1239.  
  1240. 	Pcr01_nav_thread = -1 
  1241. end 
  1242.  
  1243. function pcr01_nav_makeup_color(menu_option, menu_data) 
  1244. 	if Pcr01_nav_thread > -1 then 
  1245. 		thread_kill(Pcr01_nav_thread) 
  1246. 		Pcr01_nav_thread = -1 
  1247. 	end 
  1248.  
  1249. 	local swatches = menu_data.swatches 
  1250. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1251.  
  1252. 	if idx < swatches.num_swatches then 
  1253. 		Pcr01_nav_value = swatches[idx].color_index 
  1254. 		Pcr01_nav_thread = thread_new("pcr01_delayed_set_makeup_color") 
  1255. 	end 
  1256. end 
  1257.  
  1258. function pcr01_select_makeup_color(menu_option, menu_data) 
  1259. 	if Pcr01_nav_thread > -1 then 
  1260. 		thread_kill(Pcr01_nav_thread) 
  1261. 		Pcr01_nav_thread = -1 
  1262. 	end 
  1263. 	 
  1264. 	local swatch_idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1265. 	local color_index = menu_data.swatches[swatch_idx].color_index 
  1266. 	 
  1267. 	if Menu_active.is_primary == true then 
  1268. 		Pcr01_current_makeup_primary_color = color_index 
  1269. 	else 
  1270. 		Pcr01_current_makeup_secondary_color = color_index 
  1271. 	end 
  1272.  
  1273. 	pcr01_makeup_update() 
  1274. 	 
  1275. 	--cheek makeup only has a primary color 
  1276. 	if Menu_active.is_primary == true and Pcr01_current_makeup_area ~= PCR01_CHEEK_MAKEUP_INDEX then 
  1277. 		menu_show(Pcr01_makeup_secondary_color_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1278. 	else 
  1279. 		pcr_mark_changed()	-- Okay, *now* it's permanent 
  1280. 		Pcr01_player_tweaked = 2 
  1281. 		menu_show(Pcr01_makeup_areas_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1282. 	end 
  1283. end 
  1284.  
  1285. function pcr01_makeup_color_grid_back(menu_option, menu_data) 
  1286. 	if Pcr01_nav_thread > -1 then 
  1287. 		thread_kill(Pcr01_nav_thread) 
  1288. 		Pcr01_nav_thread = -1 
  1289. 	end 
  1290. 	 
  1291. 	if Menu_active.is_primary == true then 
  1292. 		if Pcr01_original_values.makeup_primary_color ~= nil then 
  1293. 			Pcr01_current_makeup_primary_color = Pcr01_original_values.makeup_primary_color 
  1294. 			pcr01_makeup_update() 
  1295. 		end 
  1296. 	else  
  1297. 		if Pcr01_original_values.makeup_secondary_color ~= nil then 
  1298. 			Pcr01_current_makeup_secondary_color = Pcr01_original_values.makeup_secondary_color 
  1299. 			pcr01_makeup_update() 
  1300. 		end 
  1301. 		 
  1302. 		Menu_active.parent_menu = Pcr01_makeup_primary_color_menu 
  1303. 	end 
  1304. 	 
  1305. 	audio_play(Menu_sound_back) 
  1306. 	 
  1307. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1308. end 
  1309.  
  1310. function pcr01_makeup_color_grid_release(menu) 
  1311. 	menu_grid_release(menu[0]) 
  1312. end 
  1313.  
  1314. function pcr01_makeup_color_update_swatch(swatch) 
  1315. 	local fill = vint_object_find("fill", swatch.swatch_h) 
  1316. 	vint_set_property(fill, "tint", swatch.red, swatch.green, swatch.blue) 
  1317. end 
  1318.  
  1319. function pcr01_makeup_item_back() 
  1320. 	if Pcr01_nav_thread ~= -1 then 
  1321. 		thread_kill(Pcr01_nav_thread) 
  1322. 		Pcr01_nav_thread = -1 
  1323. 	end 
  1324.  
  1325. 	pcr01_restore_makeup() 
  1326. 	 
  1327. 	audio_play(Menu_sound_back) 
  1328. 	 
  1329. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1330. end 
  1331.  
  1332. function pcr01_makeup_variant_back() 
  1333. 	if Pcr01_nav_thread ~= -1 then 
  1334. 		thread_kill(Pcr01_nav_thread) 
  1335. 		Pcr01_nav_thread = -1 
  1336. 	end 
  1337.  
  1338. 	if Pcr01_original_values.makeup_variant ~= nil then 
  1339. 		Pcr01_current_makeup_variant = Pcr01_original_values.makeup_variant 
  1340. 		pcr01_makeup_update() 
  1341. 	end 
  1342.  
  1343. 	audio_play(Menu_sound_back) 
  1344. 	 
  1345. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1346. end 
  1347.  
  1348.  
  1349. function pcr01_restore_makeup() 
  1350. 	debug_print("vint", "trying to restore makeup\n") 
  1351. 	for area = 0, 4 do 
  1352. 		pcr_change_makeup(area, 
  1353. 								Pcr01_saved_makeup[area].item, 
  1354. 								Pcr01_saved_makeup[area].variant, 
  1355. 								Pcr01_saved_makeup[area].primary_color, 
  1356. 								Pcr01_saved_makeup[area].secondary_color) 
  1357. 								 
  1358. 	end 
  1359. end 
  1360.  
  1361. function pcr01_makeup_update() 
  1362. 	pcr_change_makeup(Pcr01_current_makeup_area, 
  1363. 							Pcr01_current_makeup_item, 
  1364. 							Pcr01_current_makeup_variant, 
  1365. 							Pcr01_current_makeup_primary_color, 
  1366. 							Pcr01_current_makeup_secondary_color) 
  1367. end 
  1368.  
  1369. function pcr01_makeup_set_variant(menu_label, menu_data) 
  1370. 	Pcr01_current_makeup_variant = menu_data.makeup_variant 
  1371. 	pcr01_makeup_update()		-- Not permanent until you choose a color 
  1372. 	 
  1373. 	Pcr01_makeup_primary_color_menu.parent_menu = Menu_active 
  1374. 	 
  1375. 	menu_show(Pcr01_makeup_primary_color_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1376. end 
  1377.  
  1378. function pcr01_makeup_variation_add_item(variant, name_crc, name_str, max_colors, current) 
  1379. 	local item = { 
  1380. 		type = MENU_ITEM_TYPE_SELECTABLE, makeup_variant = variant, on_select = pcr01_makeup_set_variant, max_colors = max_colors 
  1381. 	} 
  1382.  
  1383. 	if name_crc ~= nil then 
  1384. 		item.label_crc = name_crc 
  1385. 	else 
  1386. 		item.label = name_str 
  1387. 	end 
  1388.  
  1389. 	if current == true then 
  1390. 		Pcr01_makeup_variations_menu.highlighted_item = Pcr01_makeup_variations_menu.num_items 
  1391. 		 
  1392. 		if Pcr01_original_values.makeup_variant == nil then 
  1393. 			Pcr01_original_values.makeup_variant = variant 
  1394. 		end 
  1395. 	end 
  1396.  
  1397. 	Pcr01_makeup_variations_menu[Pcr01_makeup_variations_menu.num_items] = item 
  1398. 	Pcr01_makeup_variations_menu.num_items = Pcr01_makeup_variations_menu.num_items + 1 
  1399. end 
  1400.  
  1401. function pcr01_makeup_randomize_variant(result, action) 
  1402. 	if action ~= DIALOG_ACTION_CLOSE then 
  1403. 		return 
  1404. 	end 
  1405. 	if result == 0 then 
  1406. 		local item, variant, primary_color, secondary_color = pcr_makeup_randomize(Pcr01_current_makeup_area, Pcr01_current_makeup_item, -1, -1, -1) 
  1407. 		item = Pcr01_current_makeup_item 
  1408. 		 
  1409. 		if item > -2 then 
  1410. 						 
  1411. 			-- update menu 
  1412. 			local menu_item_index = -1 
  1413. 			for i = 0, Menu_active.num_items - 1 do 
  1414. 				if Menu_active[i].makeup_variant == variant then 
  1415. 					menu_item_index = i 
  1416. 					break 
  1417. 				end 
  1418. 			end 
  1419. 			 
  1420. 			if menu_item_index > -1 then 
  1421. 				menu_update_nav_bar(menu_item_index) 
  1422. 				audio_play(Menu_sound_item_nav) 
  1423. 				 
  1424. 				if Menu_active.on_nav ~= nil then 
  1425. 					Menu_active.on_nav(Menu_active) 
  1426. 				end 
  1427. 			end 
  1428. 			 
  1429. 		end 
  1430. 		 
  1431. 		Pcr01_current_makeup_variant = variant 
  1432. 		Pcr01_current_makeup_primary_color = primary_color 
  1433. 		Pcr01_current_makeup_secondary_color = secondary_color 
  1434. 			 
  1435. 		pcr01_store_current_makeup(Pcr01_current_makeup_area) 
  1436. 		pcr_mark_changed() 
  1437. 		 
  1438. 		Pcr01_player_tweaked = 1                                                                                                                                                                                                                                                    
  1439. 	end 
  1440. end 
  1441.  
  1442. function pcr01_makeup_randomize_primary_color(result, action) 
  1443. 	if action ~= DIALOG_ACTION_CLOSE then 
  1444. 		return 
  1445. 	end 
  1446. 	 
  1447. 	if result == 0 then 
  1448. 		local item, variant, primary_color, secondary_color = pcr_makeup_randomize(Pcr01_current_makeup_area, Pcr01_current_makeup_item, 
  1449. 			Pcr01_current_makeup_variant, -1, -1) 
  1450. 		 
  1451. 		if item > -2 then 
  1452. 								 
  1453. 			-- update menu yay! 
  1454. 			local swatch_idx = -1 
  1455. 			local swatches = Menu_active[0].swatches 
  1456. 			 
  1457. 			for i = 0, swatches.num_swatches - 1 do 
  1458. 				if swatches[i].color_index == primary_color then 
  1459. 					swatch_idx = i 
  1460. 					break 
  1461. 				end 
  1462. 			end 
  1463.  
  1464. 			if swatch_idx > -1 then 
  1465. 				local menu_data = Menu_active[0] 
  1466. 				local row = floor(swatch_idx / menu_data.num_cols) 
  1467. 				local col = swatch_idx - (row * menu_data.num_cols) 
  1468.  
  1469. 				menu_grid_update_swatches(menu_data, row) 
  1470. 				menu_grid_update_highlighted(menu_data, col, row) 
  1471.  
  1472. 				if menu_data.on_nav ~= nil then 
  1473. 					menu_data.on_nav(nil, menu_data) 
  1474. 				end 
  1475. 			end 
  1476. 			 
  1477. 		end 
  1478. 		 
  1479. 		Pcr01_current_makeup_primary_color = primary_color 
  1480. 		Pcr01_current_makeup_secondary_color = secondary_color 
  1481. 			 
  1482. 		pcr_change_makeup(Pcr01_current_makeup_area, item, variant, primary_color, secondary_color) 
  1483. 		pcr01_store_current_makeup(Pcr01_current_makeup_area) 
  1484. 		pcr_mark_changed() 
  1485. 		 
  1486. 		Pcr01_player_tweaked = 1 
  1487. 	end 
  1488. end 
  1489.  
  1490. function pcr01_makeup_randomize_secondary_color(result, action) 
  1491. 	if action ~= DIALOG_ACTION_CLOSE then 
  1492. 		return 
  1493. 	end 
  1494. 	 
  1495. 	if result == 0 then 
  1496. 		local item, variant, primary_color, secondary_color = pcr_makeup_randomize(Pcr01_current_makeup_area, Pcr01_current_makeup_item, 
  1497. 			Pcr01_current_makeup_variant, Pcr01_current_makeup_primary_color, -1) 
  1498. 		 
  1499. 		if item > -2 then 
  1500. 						 
  1501. 			-- update menu yay! 
  1502. 			local swatch_idx = -1 
  1503. 			local swatches = Menu_active[0].swatches 
  1504. 			 
  1505. 			for i = 0, swatches.num_swatches - 1 do 
  1506. 				if swatches[i].color_index == secondary_color then 
  1507. 					swatch_idx = i 
  1508. 					break 
  1509. 				end 
  1510. 			end 
  1511.  
  1512. 			if swatch_idx > -1 then 
  1513. 				local menu_data = Menu_active[0] 
  1514. 				local row = floor(swatch_idx / menu_data.num_cols) 
  1515. 				local col = swatch_idx - (row * menu_data.num_cols) 
  1516.  
  1517. 				menu_grid_update_swatches(menu_data, row) 
  1518. 				menu_grid_update_highlighted(menu_data, col, row) 
  1519.  
  1520. 				if menu_data.on_nav ~= nil then 
  1521. 					menu_data.on_nav(nil, menu_data) 
  1522. 				end 
  1523. 			end 
  1524. 		end 
  1525. 		Pcr01_current_makeup_secondary_color = secondary_color 
  1526. 			 
  1527. 		pcr_change_makeup(Pcr01_current_makeup_area, item, variant, primary_color, secondary_color) 
  1528. 		pcr01_store_current_makeup(Pcr01_current_makeup_area) 
  1529. 		pcr_mark_changed() 
  1530.  
  1531. 		Pcr01_player_tweaked = 1 
  1532. 	end 
  1533. end 
  1534.  
  1535. function pcr01_makeup_randomize_area(result, action) 
  1536. 	if action ~= DIALOG_ACTION_CLOSE then 
  1537. 		return 
  1538. 	end 
  1539. 	 
  1540. 	if result == 0 then 
  1541. 		local item, variant, primary_color, secondary_color = pcr_makeup_randomize(Pcr01_current_makeup_area, -2, -1, -1, -1) 
  1542. 			 
  1543. 		if item > -2 then 
  1544. 					 
  1545. 			-- update menu 
  1546. 			local menu_item_index = -1 
  1547. 			for i = 0, Menu_active.num_items - 1 do 
  1548. 				if Menu_active[i].makeup_item == item then 
  1549. 					menu_item_index = i 
  1550. 					break 
  1551. 				end 
  1552. 			end 
  1553. 			 
  1554. 			if menu_item_index > -1 then 
  1555. 				menu_update_nav_bar(menu_item_index) 
  1556. 				audio_play(Menu_sound_item_nav) 
  1557. 				 
  1558. 				if Menu_active.on_nav ~= nil then 
  1559. 					Menu_active.on_nav(Menu_active) 
  1560. 				end 
  1561. 			end 
  1562. 			 
  1563. 		end 
  1564. 		 
  1565. 		Pcr01_current_makeup_item = item 
  1566. 		Pcr01_current_makeup_variant = variant 
  1567. 		Pcr01_current_makeup_primary_color = primary_color 
  1568. 		Pcr01_current_makeup_secondary_color = secondary_color 
  1569. 			 
  1570. 		pcr_change_makeup(Pcr01_current_makeup_area, item, variant, primary_color, secondary_color) 
  1571. 		pcr01_store_current_makeup(Pcr01_current_makeup_area) 
  1572. 		pcr_mark_changed() 
  1573.  
  1574. 		Pcr01_player_tweaked = 1 
  1575. 	end 
  1576. end 
  1577.  
  1578. function pcr01_makeup_randomize_all_areas(result, action) 
  1579. 	if action ~= DIALOG_ACTION_CLOSE then 
  1580. 		return 
  1581. 	end 
  1582. 	if pcu_is_streaming_done() == false then 
  1583. 		return 
  1584. 	end 
  1585. 	 
  1586. 	if result == 0 then  
  1587. 		local item, variant, primary_color, secondary_color 
  1588. 		 
  1589. 		for area = 0, 4 do 
  1590. 			if area ~= PCR01_ENTIRE_FACE_MAKEUP_INDEX then 
  1591. 				item, variant, primary_color, secondary_color = pcr_makeup_randomize(area, -2, -1, -1, -1) 
  1592. 				if item > -2 then 
  1593. 					pcr_change_makeup(area, item, variant, primary_color, secondary_color) 
  1594. 				end 
  1595. 			end 
  1596. 		end 
  1597.  
  1598. 		pcr_mark_changed() 
  1599. 		Pcr01_player_tweaked = 1 
  1600. 	end 
  1601. 	pcr01_store_current_makeup() 
  1602. end 
  1603.  
  1604. function pcr01_morph_set_accept() 
  1605. 	Pcr01_player_tweaked = 2 
  1606. 	menu_show(Pcr01_fine_tuning_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1607. end 
  1608.  
  1609. function pcr01_morph_set_revert_confirm(result, action) 
  1610. 	if action ~= DIALOG_ACTION_CLOSE or (result ~= 0 and result ~= 1) then 
  1611. 		return 
  1612. 	end 
  1613. 	if result == 0 then 
  1614. 		pcr01_morph_set_accept() 
  1615. 	else  
  1616. 		for i = 0, Menu_active.num_items - 1 do 
  1617. 			local m = Menu_active[i] 
  1618. 			if m.morph_id ~= nil then 
  1619. 				pcr_apply_morph_value(m.morph_set, m.morph_id, m.orig_value) 
  1620. 			end 
  1621. 		end 
  1622. 		audio_play(Menu_sound_back)	 
  1623. 		menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1624. 	end 
  1625. end 
  1626.  
  1627. function pcr01_morph_set_revert() 
  1628. 	local options = { [0] = "PAUSE_MENU_ACCEPT", [1] = "PAUSE_MENU_REVERT", [2] = "CONTROL_CANCEL" } 
  1629. 	dialog_box_open( "STORE_EXIT_WARNING_HEADER", "PLAYER_CREATION_ABOUT_TO_REVERT", options, "pcr01_morph_set_revert_confirm", 0, DIALOG_PRIORITY_ACTION ) 
  1630. end 
  1631.  
  1632. ---------------------- 
  1633. -- START SKIN COLOR -- 
  1634. ---------------------- 
  1635. function pcr01_skin_grid_show(menu_data) 
  1636. 	local menu_item = menu_data[0] 
  1637.  
  1638. 	Pcr01_original_values.skin_color = nil 
  1639. 	menu_item.swatches = { num_swatches = 0 } 
  1640. 	pcr_report_skin_colors("pcr01_add_skin_color") 
  1641.  
  1642. 	pcr01_load_swatch_peg("ui_pcr_skin") 
  1643.  
  1644. 	local master_swatch = vint_object_find("swatch_skin", nil, MENU_BASE_DOC_HANDLE) 
  1645. 	menu_grid_show(menu_data, menu_item, master_swatch) 
  1646. 	pcr01_camera_body_pos() 
  1647. end 
  1648.  
  1649. function pcr01_add_skin_color(id, swatch_crc, label_crc, label_str, current) 
  1650. 	local swatches = Pcr01_global_skin_menu[0].swatches 
  1651. 	swatches[swatches.num_swatches] = { 
  1652. 		id = id, swatch_crc = swatch_crc, label_crc = label_crc, label_str = label_str 
  1653. 	} 
  1654.  
  1655. 	if current == true then 
  1656. 		Pcr01_original_values.skin_color = id 
  1657. 		Pcr01_global_skin_menu[0].cur_idx = swatches.num_swatches 
  1658. 	end 
  1659.  
  1660. 	swatches.num_swatches = swatches.num_swatches + 1 
  1661. end 
  1662.  
  1663. function pcr01_delayed_set_skin_color() 
  1664. 	delay(0.8) 
  1665.  
  1666. 	if Pcr01_nav_value > -1 then 
  1667. 		pcr_change_skin_color(Pcr01_nav_value) 
  1668. 		Pcr01_nav_value = -1 
  1669. 	end 
  1670.  
  1671. 	Pcr01_nav_thread = -1 
  1672. end 
  1673.  
  1674. function pcr01_nav_skin_color(menu_option, menu_data) 
  1675. 	if Pcr01_nav_thread > -1 then 
  1676. 		thread_kill(Pcr01_nav_thread) 
  1677. 		Pcr01_nav_thread = -1 
  1678. 	end 
  1679.  
  1680. 	local swatches = menu_data.swatches 
  1681. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1682.  
  1683. 	if idx < swatches.num_swatches then 
  1684. 		Pcr01_nav_value = swatches[idx].id 
  1685. 		Pcr01_nav_thread = thread_new("pcr01_delayed_set_skin_color") 
  1686. 	end 
  1687. end 
  1688.  
  1689. function pcr01_select_skin_color(menu_option, menu_data) 
  1690. 	local swatches = menu_data.swatches 
  1691. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1692.  
  1693. 	if idx < swatches.num_swatches then 
  1694. 		pcr_change_skin_color(swatches[idx].id) 
  1695. 		pcr_mark_changed() 
  1696. 		Pcr01_player_tweaked = 2 
  1697. 		Pcr01_original_values.skin_color = nil; 
  1698. 	end 
  1699.  
  1700. 	menu_show(Pcr01_globals_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1701. end 
  1702.  
  1703. function pcr01_skin_grid_back(menu_option, menu_data) 
  1704. 	if Pcr01_nav_thread > -1 then 
  1705. 		thread_kill(Pcr01_nav_thread) 
  1706. 		Pcr01_nav_thread = -1 
  1707. 	end 
  1708. 	 
  1709. 	audio_play(Menu_sound_back) 
  1710. 	 
  1711. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1712. end 
  1713.  
  1714. function pcr01_skin_grid_release() 
  1715. 	 
  1716. 	if Pcr01_nav_thread ~= -1 then 
  1717. 		thread_kill(Pcr01_nav_thread) 
  1718. 		Pcr01_nav_thread = -1 
  1719. 	end 
  1720.  
  1721. 	if Pcr01_original_values.skin_color ~= nil then 
  1722. 		pcr_change_skin_color(Pcr01_original_values.skin_color) 
  1723. 		Pcr01_original_values.skin_color = nil 
  1724. 	end 
  1725.  
  1726. 	menu_grid_release(Pcr01_global_skin_menu[0]) 
  1727. end 
  1728.  
  1729. ---------------------- 
  1730. -- START EYE COLOR -- 
  1731. ---------------------- 
  1732. function pcr01_eye_grid_show(menu_data) 
  1733. 	local menu_item = menu_data[0] 
  1734.  
  1735. 	Pcr01_original_values.eye_color = nil 
  1736. 	menu_item.swatches = { num_swatches = 0 } 
  1737. 	pcr_report_eye_colors("pcr01_add_eye_color") 
  1738.  
  1739. 	pcr01_load_swatch_peg("ui_pcr_eyes") 
  1740.  
  1741. 	menu_grid_show(menu_data, menu_item, vint_object_find("swatch_eye")) 
  1742. 	pcr01_camera_eyes_pos() 
  1743. end 
  1744.  
  1745. function pcr01_add_eye_color(id, swatch_crc, label_crc, label_str, current) 
  1746. 	local swatches = Pcr01_global_eye_menu[0].swatches 
  1747. 	swatches[swatches.num_swatches] = { 
  1748. 		id = id, swatch_crc = swatch_crc, label_crc = label_crc, label_str = label_str 
  1749. 	} 
  1750.  
  1751. 	if current == true then 
  1752. 		Pcr01_original_values.eye_color = id 
  1753. 		Pcr01_global_eye_menu[0].cur_idx = swatches.num_swatches 
  1754. 	end 
  1755.  
  1756. 	swatches.num_swatches = swatches.num_swatches + 1 
  1757. end 
  1758.  
  1759. function pcr01_delayed_set_eye_color() 
  1760. 	delay(0.8) 
  1761.  
  1762. 	if Pcr01_nav_value > -1 then 
  1763. 		pcr_change_eye_color(Pcr01_nav_value) 
  1764. 		Pcr01_nav_value = -1 
  1765. 	end 
  1766.  
  1767. 	Pcr01_nav_thread = -1 
  1768. end 
  1769.  
  1770. function pcr01_nav_eye_color(menu_option, menu_data) 
  1771. 	if Pcr01_nav_thread ~= -1 then 
  1772. 		thread_kill(Pcr01_nav_thread) 
  1773. 		Pcr01_nav_thread = -1 
  1774. 	end 
  1775.  
  1776. 	local swatches = menu_data.swatches 
  1777. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1778.  
  1779. 	if idx < swatches.num_swatches then 
  1780. 		Pcr01_nav_value = swatches[idx].id 
  1781. 		Pcr01_nav_thread = thread_new("pcr01_delayed_set_eye_color") 
  1782. 	end 
  1783. end 
  1784.  
  1785. function pcr01_select_eye_color(menu_option, menu_data) 
  1786. 	local swatches = menu_data.swatches 
  1787. 	local idx = menu_data.cur_row * menu_data.num_cols + menu_data.cur_col 
  1788.  
  1789. 	if idx < swatches.num_swatches then 
  1790. 		pcr_change_eye_color(swatches[idx].id) 
  1791. 		pcr_mark_changed() 
  1792. 		Pcr01_player_tweaked = 2 
  1793. 	end 
  1794.  
  1795. 	menu_show(Pcr01_fine_tuning_menu, MENU_TRANSITION_SWEEP_LEFT) 
  1796. end 
  1797.  
  1798. function pcr01_eye_grid_back(menu_option, menu_data) 
  1799. 	if Pcr01_nav_thread > -1 then 
  1800. 		thread_kill(Pcr01_nav_thread) 
  1801. 		Pcr01_nav_thread = -1 
  1802. 	end 
  1803.  
  1804. 	if Pcr01_original_values.eye_color ~= nil then 
  1805. 		pcr_change_eye_color(Pcr01_original_values.eye_color) 
  1806. 		Pcr01_original_values.eye_color = nil 
  1807. 	end 
  1808. 	 
  1809. 	audio_play(Menu_sound_back) 
  1810. 	 
  1811. 	menu_show(Menu_active.parent_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  1812. end 
  1813.  
  1814. function pcr01_eye_grid_release(menu) 
  1815. 	menu_grid_release(menu[0]) 
  1816. end 
  1817.  
  1818. ------------------------- 
  1819. -- START RANDOMIZATION -- 
  1820. ------------------------- 
  1821. Pcr01_randomizing_morph_set = -1 
  1822.  
  1823. function pcr01_randomize_one_morph(id, name_crc, name_str, value, gender) 
  1824. 	pcr_apply_morph_value(Pcr01_randomizing_morph_set, id, rand_float(0.35, 0.65)) 
  1825. 	pcr_mark_changed() 
  1826. end 
  1827.  
  1828. --function pcr01_randomize_all_morphs(menu_option, menu_data) 
  1829. function pcr01_randomize_all_morphs(result, action) 
  1830. 	if action ~= DIALOG_ACTION_CLOSE then 
  1831. 		return 
  1832. 	end 
  1833. 	 
  1834. 	if result == 0 then 
  1835. 		local morph_sets = {"Brow", "Crown", "Forehead", "Eyes", "Nose", "Cheekbones", "Ears", "Chin", "Mouth", "Jaw"} 
  1836. 		 
  1837. 		for index, morph_set_id in morph_sets do 
  1838. 			Pcr01_randomizing_morph_set = morph_set_id 
  1839. 			pcr_report_avail_morphs(morph_set_id, "pcr01_randomize_one_morph") 
  1840. 		end 
  1841. 		 
  1842. 		Pcr01_randomizing_morph_set = -1 
  1843. 		Pcr01_player_tweaked = 1 
  1844. 	end 
  1845. end 
  1846.  
  1847. function pcr01_randomize_morph_set(result, action) 
  1848. 	if action ~= DIALOG_ACTION_CLOSE then 
  1849. 		return 
  1850. 	end 
  1851. 	 
  1852. 	if result == 0 then 
  1853. 		local option_index, v 
  1854. 		for i = 0, Menu_active.num_items - 1 do 
  1855. 			v = rand_float(0.35, 0.65) 
  1856. 			Menu_active[i].cur_value = v 
  1857. 			pcr_apply_morph_value(Menu_active.morph_set, Menu_active[i].morph_id, v) 
  1858. 			 
  1859. 			option_index = i - Menu_active.first_vis_item 
  1860. 			if option_index >= 0 and option_index < Menu_option_labels.max_rows then 
  1861. 				menu_num_slider_update_value(Menu_option_labels[option_index], Menu_active[i]) 
  1862. 			end 
  1863. 		end 
  1864. 		 
  1865. 		pcr_mark_changed() 
  1866. 		Pcr01_player_tweaked = 1 
  1867. 	end 
  1868. end 
  1869.  
  1870. function pcr01_camera_body_pos() 
  1871. 	store_set_camera_pos("body") 
  1872. end 
  1873.  
  1874. function pcr01_camera_head_pos() 
  1875. 	store_set_camera_pos("head") 
  1876. end 
  1877.  
  1878. function pcr01_camera_eyes_pos() 
  1879. 	store_set_camera_pos("eyes") 
  1880. end 
  1881.  
  1882. function pcr01_exit_final() 
  1883. 	vint_document_unload(vint_document_find("pcr01")) 
  1884. 	if mp_is_enabled() == true or pcr_about_to_do_intro_sequence() then 
  1885. 		--fade out 
  1886. 		screen_fx_fadeout(0.5) 
  1887. 		--delay(0.5) 
  1888. 	end 
  1889. 	 
  1890. 	if pcr_is_plastic_surgeon() == false and mp_is_enabled() == false then 
  1891. 		pcr_add_default_clothing() 
  1892. 	end 
  1893. end 
  1894.  
  1895. function pcr01_exit_confirm(result, action) 
  1896. 	if action ~= DIALOG_ACTION_CLOSE then 
  1897. 		return 
  1898. 	end 
  1899. 	 
  1900. 	if result == DIALOG_RESULT_YES then 
  1901. 		pcr_release_camera() 
  1902. 		menu_close(pcr01_exit_final) 
  1903. 	end 
  1904. end 
  1905.  
  1906. function pcr01_mp_exit_confirm(result, action) 
  1907. 	if action ~= DIALOG_ACTION_CLOSE then 
  1908. 		return 
  1909. 	end 
  1910. 	 
  1911. 	if result == 0 then 
  1912. 		pcr_save_to_mp_storage(true) 
  1913. 		pcr01_exit_confirm(DIALOG_RESULT_YES, DIALOG_ACTION_CLOSE) 
  1914. 	end 
  1915. end 
  1916.  
  1917. function pcr01_mp_exit_with_revert_confirm(result, action) 
  1918. 	if action ~= DIALOG_ACTION_CLOSE then 
  1919. 		return 
  1920. 	end 
  1921. 	 
  1922. 	if result == 0 then 
  1923. 		pcr_save_to_mp_storage(true) 
  1924. 		pcr01_exit_confirm(DIALOG_RESULT_YES, DIALOG_ACTION_CLOSE) 
  1925. 	elseif result == 1 then 
  1926. 		pcr_save_to_mp_storage(false) 
  1927. 		pcr01_exit_confirm(DIALOG_RESULT_YES, DIALOG_ACTION_CLOSE) 
  1928. 	end 
  1929. end 
  1930.  
  1931. function pcr01_exit(menu_data) 
  1932. 	if mp_is_enabled() == true then 
  1933. 		if pcr_avatar_is_blank() then 
  1934. 			local options = { [0] = "PAUSE_MENU_ACCEPT", [1] = "CONTROL_CANCEL" } 
  1935. 			dialog_box_open( "STORE_EXIT_WARNING_HEADER", "PLAYER_CREATION_SAVE_CHANGES", options, "pcr01_mp_exit_confirm", 0, DIALOG_PRIORITY_ACTION ) 
  1936. 			 
  1937. 		elseif pcr_avatar_changed() then 
  1938. 			local options = { [0] = "PAUSE_MENU_ACCEPT", [1] = "PAUSE_MENU_REVERT", [2] = "CONTROL_CANCEL" } 
  1939. 			dialog_box_open( "STORE_EXIT_WARNING_HEADER", "PLAYER_CREATION_SAVE_CHANGES", options, "pcr01_mp_exit_with_revert_confirm", 0, DIALOG_PRIORITY_ACTION ) 
  1940. 			 
  1941. 		else 
  1942. 			dialog_box_confirmation( "STORE_EXIT_WARNING_HEADER", "CUST_EXIT_WARNING_BODY", "pcr01_exit_confirm", true, true ) 
  1943. 		end 
  1944.  
  1945. 	else 
  1946. 		local body 
  1947. 		local heading = "MENU_TITLE_WARNING" 
  1948. 		 
  1949. 		if pcr_is_plastic_surgeon() == true then 
  1950. 			body = "SURGEON_FINISHED_FULL" 
  1951. 		else 
  1952. 			body = "CUST_EXIT_WARNING_BODY" 
  1953. 		end 
  1954. 		 
  1955. 		dialog_box_confirmation(heading, body, "pcr01_exit_confirm", true, true) 
  1956. 	end 
  1957. end 
  1958.  
  1959. function pcr01_change_identity(menu_label, menu_data) 
  1960. 	pcr_change_identity(menu_data.text_slider_values.cur_value) 
  1961. end 
  1962.  
  1963. function pcr01_preset_age_show(menu_data) 
  1964. 	Pcr01_original_values.age_morph = pcr_get_morph_value("global body", "old") 
  1965. 	if Pcr01_original_values.age_morph < PCR01_YOUNG_AGE_THRESHOLD then 
  1966. 		menu_data.highlighted_item = 0 
  1967. 	else  
  1968. 		if Pcr01_original_values.age_morph < PCR01_MIDDLE_AGE_THRESHOLD then 
  1969. 				menu_data.highlighted_item = 1 
  1970. 		else 
  1971. 			menu_data.highlighted_item = 2 
  1972. 		end 
  1973. 	end 
  1974. end 
  1975.  
  1976. function pcr01_preset_age_nav(menu_data) 
  1977. 	if Pcr01_nav_thread ~= -1 then 
  1978. 		thread_kill(Pcr01_nav_thread) 
  1979. 	end 
  1980. 	 
  1981. 	Pcr01_nav_value = menu_data[menu_data.highlighted_item].preset_age 
  1982. 	Pcr01_nav_thread = thread_new("pcr01_preset_age_preview") 
  1983. end 
  1984.  
  1985. function pcr01_preset_age_preview() 
  1986. 	delay(1) 
  1987. 	pcr_apply_morph_value("global body", "old", Pcr01_nav_value) 
  1988. 	Pcr01_nav_thread = -1 
  1989. end 
  1990.  
  1991. function pcr01_preset_age_back() 
  1992. 	if Pcr01_nav_thread ~= -1 then 
  1993. 		thread_kill(Pcr01_nav_thread) 
  1994. 		Pcr01_nav_thread = -1 
  1995. 	end 
  1996. 	 
  1997. 	if Pcr01_original_values.age_morph ~= nil then 
  1998. 		pcr_apply_morph_value("global body", "old", Pcr01_original_values.age_morph) 
  1999. 	end 
  2000. 	audio_play(Menu_sound_back) 
  2001. 	 
  2002. 	menu_show(Pcr01_presets_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  2003. end 
  2004.  
  2005. function pcr01_preset_age_select(menu_label, menu_item) 
  2006. 	if Pcr01_nav_thread ~= -1 then 
  2007. 		thread_kill(Pcr01_nav_thread) 
  2008. 		Pcr01_nav_thread = -1 
  2009. 	end 
  2010. 	 
  2011. 	pcr_apply_morph_value("global body", "old", menu_item.preset_age) 
  2012. 	pcr_mark_changed() 
  2013. 	menu_show(Pcr01_presets_menu, MENU_TRANSITION_SWEEP_LEFT) 
  2014. end 
  2015.  
  2016. function fine_tuning_menu_show() 
  2017. 	pcr01_camera_head_pos() 
  2018. 	pcr01_restore_hair_values() 
  2019. end 
  2020.  
  2021. -----[ MOVEMENT SUBMENUS ]----- 
  2022.  
  2023. function pcr01_movement_show(menu_data) 
  2024. 	Pcr01_original_values.anim_id = nil 
  2025. 	Pcr01_original_values.anim_grp = menu_data.anim_group 
  2026. 	Pcr01_building_menu = menu_data 
  2027. 	menu_data.num_items = 0 
  2028. 	menu_data.saved = false 
  2029. 	pcr_report_anims(menu_data.anim_group, "pcr01_movement_add_item") 
  2030. 	if menu_data.num_items == 0 then 
  2031. 		menu_data[0] = { label = "NO_OPTIONS_RIGHT_NOW", type = MENU_ITEM_TYPE_SELECTABLE } 
  2032. 		menu_data.num_items = 1 
  2033. 	else 
  2034. 		if menu_data.highlighted_item == nil then 
  2035. 			menu_data.highlighted_item = 0 
  2036. 		end 
  2037. 		 
  2038. 		pcr01_movement_nav(menu_data) 
  2039. 	end 
  2040. end 
  2041.  
  2042. function prc01_movement_custom_camera(menu_data) 
  2043. 	 
  2044. 	if menu_data.highlighted_item == PCR01_FACIAL_EXPRESSIONS_INDEX then 
  2045. 		pcr01_camera_head_pos() 
  2046. 	else 
  2047. 		pcr01_camera_body_pos() 
  2048. 	end 
  2049. 	 
  2050. end 
  2051.  
  2052. function prc01_movement_list_show(menu_data) 
  2053. 	prc01_movement_custom_camera(menu_data) 
  2054. 	pcr01_restore_makeup() --when the player uses shoulder buttons to navigate away from the menu, makeup needs to be reset 
  2055. 	--and the only way to do this was putting it in the on_show of adjacent menues 
  2056. end 
  2057.  
  2058. function pcr01_movement_add_item(display_name, id, current) 
  2059. 	local i = Pcr01_building_menu.num_items 
  2060. 	 
  2061. 	Pcr01_building_menu[i] = { label = display_name, type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_movement_select, anim_id = id } 
  2062. 	 
  2063. 	if current == true then 
  2064. 		Pcr01_original_values.anim_id = id 
  2065. 		 
  2066. 		Pcr01_building_menu.highlighted_item = i 
  2067. 	end 
  2068. 	 
  2069. 	i = i + 1 
  2070. 	Pcr01_building_menu.num_items = i 
  2071. end 
  2072.  
  2073. function pcr01_movement_nav(menu_data) 
  2074. 	if Pcr01_nav_thread ~= -1 then 
  2075. 		thread_kill(Pcr01_nav_thread) 
  2076. 	end 
  2077. 	 
  2078. 	Pcr01_nav_value = { grp = menu_data.anim_group, id = menu_data[menu_data.highlighted_item].anim_id } 
  2079. 	Pcr01_nav_thread = thread_new("pcr01_movement_preview") 
  2080. end 
  2081.  
  2082. function pcr01_movement_preview() 
  2083. 	pcr_preview_anim(Pcr01_nav_value.grp) 
  2084. 	pcr_set_anim(Pcr01_nav_value.grp, Pcr01_nav_value.id) 
  2085. 	Pcr01_nav_thread = -1 
  2086. end 
  2087.  
  2088. function pcr01_movement_select(menu_label, menu_item) 
  2089. 	if Pcr01_nav_thread ~= -1 then 
  2090. 		thread_kill(Pcr01_nav_thread) 
  2091. 		Pcr01_nav_thread = -1 
  2092. 	end 
  2093. 	pcr_set_anim(Pcr01_nav_value.grp, Pcr01_nav_value.id) 
  2094. 	pcr_mark_changed() 
  2095. 	pcr_preview_anim() 
  2096. 	Menu_active.saved = true 
  2097.  
  2098. 	menu_show(Pcr01_movement_menu, MENU_TRANSITION_SWEEP_LEFT) 
  2099. end 
  2100.  
  2101. function pcr01_movement_exit(menu_data) 
  2102. 	if Pcr01_nav_thread ~= -1 then 
  2103. 		thread_kill(Pcr01_nav_thread) 
  2104. 		Pcr01_nav_thread = -1 
  2105. 	end 
  2106.  
  2107. 	if menu_data.saved == false and Pcr01_original_values.anim_id ~= nil then 
  2108. 		pcr_set_anim(Pcr01_original_values.anim_grp, Pcr01_original_values.anim_id) 
  2109. 	end 
  2110. 	 
  2111. 	pcr_preview_anim() 
  2112. 	pcr_stop_anim() 
  2113. end 
  2114.  
  2115. function pcr01_movement_back(menu_data) 
  2116. 	pcr01_movement_exit(menu_data) 
  2117. 	audio_play(Menu_sound_back) 
  2118. 	menu_show(Pcr01_movement_menu, MENU_TRANSITION_SWEEP_RIGHT) 
  2119. end 
  2120.  
  2121. function pcr01_preset_sex_show(menu_data) 
  2122. 	menu_data.highlighted_item = 0 
  2123. 	 
  2124. 	for i = 0, menu_data.num_items do 
  2125. 		if menu_data[i].preset_gender == Pcr01_current_preset_gender then 
  2126. 			menu_data.highlighted_item = i 
  2127. 			break 
  2128. 		end 
  2129. 	end 
  2130. end 
  2131.  
  2132. function pcr01_preset_race_show(menu_data) 
  2133. 	menu_data.highlighted_item = 0 
  2134. 	 
  2135. 	for i = 0, menu_data.num_items do 
  2136. 		if menu_data[i].preset_race == Pcr01_current_preset_race then 
  2137. 			menu_data.highlighted_item = i 
  2138. 			break 
  2139. 		end 
  2140. 	end 
  2141. end 
  2142.  
  2143. function pcr01_preset_figure_show(menu_data) 
  2144. 	menu_data.highlighted_item = 0 
  2145. 	 
  2146. 	for i = 0, menu_data.num_items do 
  2147. 		if menu_data[i].preset_figure == Pcr01_current_preset_figure then 
  2148. 			menu_data.highlighted_item = i 
  2149. 			break 
  2150. 		end 
  2151. 	end 
  2152. end 
  2153.  
  2154. --------------------[ MENU DATA ]---------------------- 
  2155.  
  2156. --since the text on the B button is variable depending on game mode, it is added dynamically 
  2157. Pcr01_top_btn_tips = { 
  2158. 	a_button = { label = "CONTROL_SELECT",					enabled = btn_tips_default_a, }, 
  2159. 	x_button = { label = "PLAYER_CREATION_RANDOMIZE",	enabled = btn_tips_default_x, }, 
  2160. 	right_stick =  	{ label = "CONTROL_ZOOM_AND_ROTATE", 	enabled = true }, 
  2161. } 
  2162.  
  2163. Pcr01_untop_btn_tips = { 
  2164. 	a_button = { label = "CONTROL_SELECT",					enabled = btn_tips_default_a, }, 
  2165. 	x_button = { label = "PLAYER_CREATION_RANDOMIZE",	enabled = btn_tips_default_x, }, 
  2166. 	right_stick =  	{ label = "CONTROL_ZOOM_AND_ROTATE", 	enabled = true }, 
  2167. } 
  2168.  
  2169. Pcr01_mp_preset_btn_tips = { 
  2170. 	a_button = { label = "CONTROL_SELECT", 				enabled = btn_tips_default_a, }, 
  2171. 	x_button = { label = "PLAYER_CREATION_IMPORT",		enabled = btn_tips_default_x, }, 
  2172. 	b_button = { label = "COMPLETION_EXIT",				enabled = btn_tips_default_b, }, 
  2173. 	right_stick =  	{ label = "CONTROL_ZOOM_AND_ROTATE", 	enabled = true }, 
  2174. } 
  2175.  
  2176. Pcr01_presets_sex_menu = { 
  2177. 	header_label_str = "CUST_MENU_SEX_PRESETS", 
  2178. 	num_items = 2, 
  2179. 	on_exit = pcr01_store_current_makeup, --the male and female presets load makeup so we need to save 
  2180. 	btn_tips = Pcr01_untop_btn_tips, 
  2181. 	on_show = pcr01_preset_sex_show, 
  2182. 	[0] = { label = "PLAYER_CREATION_PRESET_MALE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_gender = "male" }, 
  2183. 	[1] = { label = "PLAYER_CREATION_PRESET_FEMALE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_gender = "female" }, 
  2184. } 
  2185.  
  2186. Pcr01_presets_race_menu = { 
  2187. 	header_label_str = "CUST_MENU_RACE_PRESETS", 
  2188. 	num_items = 4, 
  2189. 	btn_tips = Pcr01_untop_btn_tips, 
  2190. 	on_show = pcr01_preset_race_show, 
  2191. 	[0] = { label = "RACE_AFRICAN", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_race = "black" }, 
  2192. 	[1] = { label = "RACE_ASIAN", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_race = "asian" }, 
  2193. 	[2] = { label = "RACE_CAUCASIAN", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_race = "white" }, 
  2194. 	[3] = { label = "RACE_HISPANIC", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_race = "hispanic" }, 
  2195. } 
  2196.  
  2197. Pcr01_presets_figure_menu = { 
  2198. 	header_label_str = "CUST_MENU_FIGURE_PRESETS", 
  2199. 	num_items = 8, 
  2200. 	btn_tips = Pcr01_untop_btn_tips, 
  2201. 	on_show = pcr01_preset_figure_show, 
  2202. 	[0] = { label = "PLAYER_CREATION_FIGURE_AVERAGE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "average" }, 
  2203. 	[1] = { label = "PLAYER_CREATION_FIGURE_SLENDER", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "slender" }, 
  2204. 	[2] = { label = "PLAYER_CREATION_FIGURE_OVERWEIGHT", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "overweight" }, 
  2205. 	[3] = { label = "PLAYER_CREATION_FIGURE_ATHLETIC", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "athletic" }, 
  2206. 	[4] = { label = "PLAYER_CREATION_FIGURE_EMACIATED", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "emaciated" }, 
  2207. 	[5] = { label = "PLAYER_CREATION_FIGURE_OBESE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "obese" }, 
  2208. 	[6] = { label = "PLAYER_CREATION_FIGURE_BODYBUILDER", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "bodybuilder" }, 
  2209. 	[7] = { label = "PLAYER_CREATION_FIGURE_HUGE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_select_preset, preset_figure = "huge" }, 
  2210. } 
  2211.  
  2212. Pcr01_presets_age_menu = { 
  2213. 	header_label_str = "PLAYER_MORPH_OLD_TEXT", 
  2214. 	num_items = 3, 
  2215. 	btn_tips = Pcr01_untop_btn_tips, 
  2216. 	on_show = pcr01_preset_age_show, 
  2217. 	on_nav = pcr01_preset_age_nav, 
  2218. 	on_back = pcr01_preset_age_back, 
  2219. 	[0] = { label = "PLAYER_CREATION_AGE_YOUNG", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_preset_age_select, preset_age = 0.1 }, 
  2220. 	[1] = { label = "PLAYER_CREATION_AGE_MIDDLE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_preset_age_select, preset_age = 0.5 }, 
  2221. 	[2] = { label = "PLAYER_CREATION_AGE_OLD", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_preset_age_select, preset_age = 0.8 }, 
  2222. } 
  2223.  
  2224. Pcr01_presets_voice_menu = { 
  2225. 	header_label_str = "CUST_VOICE", 
  2226. 	num_items = 6, 
  2227. 	btn_tips = Pcr01_untop_btn_tips, 
  2228. 	on_show = pcr01_voice_menu_show, 
  2229. 	on_nav = pcr01_nav_voice, 
  2230. 	--on_alt_select = pcr01_highlight_random_item, 
  2231. 	[0] = { label = "CUST_VOICE_MALE_WHITE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_set_voice, voice = "MALE_WHITE" }, 
  2232. 	[1] = { label = "CUST_VOICE_MALE_BLACK", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_set_voice, voice = "MALE_BLACK" }, 
  2233. 	[2] = { label = "CUST_VOICE_MALE_LATINO", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_set_voice, voice = "MALE_LATINO" }, 
  2234. 	[3] = { label = "CUST_VOICE_FEMALE_WHITE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_set_voice, voice = "FEMALE_WHITE" }, 
  2235. 	[4] = { label = "CUST_VOICE_FEMALE_BLACK", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_set_voice, voice = "FEMALE_BLACK" }, 
  2236. 	[5] = { label = "CUST_VOICE_FEMALE_LATINO", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_set_voice, voice = "FEMALE_LATINO" }, 
  2237. } 
  2238.  
  2239. Pcr01_presets_menu = { 
  2240. 	header_label_str = "CUST_MENU_PRESETS", 
  2241. 	num_items = 4, 
  2242. 	btn_tips = Pcr01_top_btn_tips, 
  2243. 	on_back = pcr01_exit, 
  2244. 	on_show = pcr01_preset_menu_show, 
  2245. 	[0] = { label = "CUST_PRESET_SEX", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_enter_preset, sub_menu = Pcr01_presets_sex_menu }, 
  2246. 	[1] = { label = "CUST_PRESET_RACE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_enter_preset, sub_menu = Pcr01_presets_race_menu }, 
  2247. 	[2] = { label = "CUST_PRESET_FIGURE", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_enter_preset, sub_menu = Pcr01_presets_figure_menu }, 
  2248. 	[3] = { label = "CUST_PRESET_AGE", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_presets_age_menu }, 
  2249.  
  2250. } 
  2251.  
  2252. Pcr01_global_skin_menu = { 
  2253. 	header_label_str = "CUST_SKIN", 
  2254. 	btn_tips = Pcr01_untop_btn_tips, 
  2255. 	on_show = pcr01_skin_grid_show, 
  2256. 	on_release = pcr01_skin_grid_release, 
  2257. 	on_back = pcr01_skin_grid_back, 
  2258. 	--on_alt_select = pcr01_randomize_confirm, 
  2259. 	rand_func = pcr01_highlight_random_swatch, 
  2260. 	rand_func_name = "pcr01_highlight_random_swatch", 
  2261. 	footer_height = nil, 
  2262. 	num_items = 1, 
  2263. 	[0] = { label = "", type = MENU_ITEM_TYPE_GRID, on_select = pcr01_select_skin_color, on_nav = pcr01_nav_skin_color, 
  2264. 		row_height = MENU_SWATCH_DEFAULT_ROW_HEIGHT, num_cols = 6, col_width = MENU_SWATCH_DEFAULT_COL_WIDTH, highlight_scale = 1, unhighlight_scale = 0.8}, 
  2265. } 
  2266.  
  2267. Pcr01_global_eye_menu = { 
  2268. 	header_label_str = "CUST_EYE_COLOR", 
  2269. 	btn_tips = Pcr01_untop_btn_tips, 
  2270. 	on_show = pcr01_eye_grid_show, 
  2271. 	on_release = pcr01_eye_grid_release, 
  2272. 	on_back = pcr01_eye_grid_back, 
  2273. 	on_alt_select = pcr01_randomize_confirm, 
  2274. 	rand_func = pcr01_highlight_random_swatch, 
  2275. 	rand_func_name = "pcr01_highlight_random_swatch", 
  2276. 	footer_height = nil, 
  2277. 	num_items = 1, 
  2278. 	[0] = { label = "", type = MENU_ITEM_TYPE_GRID, on_select = pcr01_select_eye_color, on_nav = pcr01_nav_eye_color, 
  2279. 		row_height = 72, num_cols = 4, col_width = 83, highlight_scale = 1, unhighlight_scale = 0.8}, 
  2280. } 
  2281.  
  2282. Pcr01_identity_values = { 
  2283. 	num_values = 2, 
  2284. 	btn_tips = Pcr01_untop_btn_tips, 
  2285. 	[0] = { label = "Male", value = 0 }, 
  2286. 	[1] = { label = "Female", value = 1 }, 
  2287. } 
  2288.  
  2289. Pcr01_globals_menu = { 
  2290. 	header_label_str = "CUST_MENU_GLOBAL", 
  2291. 	num_items = 5, 
  2292. 	btn_tips = Pcr01_top_btn_tips, 
  2293. 	on_back = pcr01_exit, 
  2294. 	on_show = pcr01_globals_show, 
  2295. 	[0] = { label = "PLAYER_GENDER_TEXT", type = MENU_ITEM_TYPE_NUM_SLIDER, morph_id = "body gender", morph_set = "global gender", 
  2296. 		is_gender = true, thumb_width = 55, on_value_update = pcr01_change_morph }, 
  2297. 	[1] = { label = "PLAYER_MORPH_MUSCLE_TEXT", type = MENU_ITEM_TYPE_NUM_SLIDER, morph_id = "body muscle", morph_set = "Global Body", 
  2298. 		thumb_width = 55, on_value_update = pcr01_change_morph }, 
  2299. 	[2] = { label = "PLAYER_MORPH_BODY_FAT_TEXT", type = MENU_ITEM_TYPE_NUM_SLIDER, morph_id = "body fat", morph_set = "Global Body", 
  2300. 		thumb_width = 55, on_value_update = pcr01_change_morph }, 
  2301. 	[3] = { label = "CUST_PRESET_AGE", type = MENU_ITEM_TYPE_NUM_SLIDER, morph_id = "old", morph_set = "Global Body", 
  2302. 		thumb_width = 55, on_value_update = pcr01_change_morph }, 
  2303. 	[4] = { label = "CUST_SKIN",	type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_global_skin_menu}, 
  2304. } 
  2305.  
  2306. Pcr01_hair_primary_color_menu = { 
  2307. 	header_label_str = "CUST_PRIMARY_COLOR", 
  2308. 	btn_tips = Pcr01_untop_btn_tips, 
  2309. 	on_show = pcr01_hair_color_grid_show, 
  2310. 	on_release = pcr01_hair_color_grid_release, 
  2311. 	on_back = pcr01_hair_color_grid_back, 
  2312. 	on_alt_select = pcr01_hair_randomize_primary_color, 
  2313. 	num_items = 1, 
  2314. 	is_primary = true, 
  2315. 	[0] = { label = "", type = MENU_ITEM_TYPE_GRID, on_select = pcr01_hair_color_select, on_nav = pcr01_hair_color_nav, 
  2316. 		row_height = 72, num_cols = 5, col_width = 83, highlight_scale = 1, unhighlight_scale = 0.8, 
  2317. 		update_swatch = pcr01_hair_color_update_swatch 
  2318. 	}, 
  2319. } 
  2320.  
  2321. Pcr01_hair_secondary_color_menu = { 
  2322. 	header_label_str = "CUST_SECONDARY_COLOR", 
  2323. 	btn_tips = Pcr01_untop_btn_tips, 
  2324. 	on_show = pcr01_hair_color_grid_show, 
  2325. 	on_release = pcr01_hair_color_grid_release, 
  2326. 	on_back = pcr01_hair_color_grid_back, 
  2327. 	on_alt_select = pcr01_hair_randomize_secondary_color, 
  2328. 	num_items = 1, 
  2329. 	is_primary = false, 
  2330. 	[0] = { label = "", type = MENU_ITEM_TYPE_GRID, on_select = pcr01_hair_color_select, on_nav = pcr01_hair_color_nav, 
  2331. 		row_height = 72, num_cols = 5, col_width = 83, highlight_scale = 1, unhighlight_scale = 0.8, 
  2332. 		update_swatch = pcr01_hair_color_update_swatch 
  2333. 	} 
  2334. } 
  2335.  
  2336. Pcr01_hair_style_menu = { 
  2337. 	header_label_str = "CUST_MENU_HAIR", 
  2338. 	num_items = 0, 
  2339. 	btn_tips = Pcr01_untop_btn_tips, 
  2340. 	on_show = pcr01_hair_style_show, 
  2341. 	on_nav = pcr01_hair_style_nav, 
  2342. 	on_back = pcr01_hair_style_back, 
  2343. 	on_alt_select = pcr01_hair_randomize_area, 
  2344. } 
  2345.  
  2346. Pcr01_hair_areas_menu = { 
  2347. 	header_label_str = "CUST_CAT_HAIR", 
  2348. 	num_items = 8, 
  2349. 	btn_tips = Pcr01_top_btn_tips, 
  2350. 	on_show = pcr01_hair_areas_show, 
  2351. 	on_back = pcr01_exit, 
  2352. 	on_alt_select = pcr01_randomize_confirm, 
  2353. 	rand_func = pcr01_hair_randomize_all_areas, 
  2354. 	rand_func_name = "pcr01_hair_randomize_all_areas", 
  2355. 	[0] = { label = "CUST_CAT_HAIR_COLOR_PRIMARY", type = MENU_ITEM_TYPE_SUB_MENU, on_select = pcr01_hair_color_category_select, hair_area = PCR01_HAIR_AREA_HEAD }, 
  2356. 	[1] = { label = "CUST_CAT_HAIR_COLOR_SECONDARY", type = MENU_ITEM_TYPE_SUB_MENU, on_select = pcr01_hair_color_category_select, hair_area = PCR01_HAIR_AREA_HEAD, is_primary = false }, 
  2357. 	[2] = { label = "CUST_CAT_HAIR_COLOR_FACE", type = MENU_ITEM_TYPE_SUB_MENU, on_select = pcr01_hair_color_category_select, hair_area = PCR01_HAIR_AREA_BEARD }, 
  2358. 	[3] = { label = "CUST_CAT_HAIR_HEAD", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_hair_style_menu, hair_area = 0, header_label_str = "CUST_CAT_HAIR_HEAD" }, 
  2359. 	[4] = { label = "CUST_CAT_HAIR_MUSTACHE", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_hair_style_menu, hair_area = 1, header_label_str = "CUST_CAT_HAIR_MUSTACHE" }, 
  2360. 	[5] = { label = "CUST_CAT_HAIR_BEARD", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_hair_style_menu, hair_area = 2, header_label_str = "CUST_CAT_HAIR_BEARD" }, 
  2361. 	[6] = { label = "CUST_CAT_HAIR_SIDEBURNS", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_hair_style_menu, hair_area = 3, header_label_str = "CUST_CAT_HAIR_SIDEBURNS" }, 
  2362. 	[7] = { label = "CUST_CAT_HAIR_EYEBROWS", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_hair_style_menu, hair_area = 4, header_label_str = "CUST_CAT_HAIR_EYEBROWS" }, 
  2363. } 
  2364.  
  2365. Pcr01_tuning_crown_menu = { 
  2366. 	header_label_str = "CUST_MORPH_CAT_CROWN", 
  2367. 	num_items = 0, 
  2368. 	morph_set = "crown", 
  2369. 	btn_tips = Pcr01_untop_btn_tips, 
  2370. 	on_show = pcr01_build_morph_menu, 
  2371. 	on_select = pcr01_morph_set_accept, 
  2372. 	on_back = pcr01_morph_set_revert, 
  2373. 	on_alt_select = pcr01_randomize_confirm, 
  2374. 	rand_func = pcr01_randomize_morph_set, 
  2375. 	rand_func_name = "pcr01_randomize_morph_set", 
  2376. } 
  2377.  
  2378. Pcr01_tuning_forehead_menu = { 
  2379. 	header_label_str = "CUST_MORPH_CAT_FOREHEAD", 
  2380. 	num_items = 0, 
  2381. 	morph_set = "forehead", 
  2382. 	btn_tips = Pcr01_untop_btn_tips, 
  2383. 	on_show = pcr01_build_morph_menu, 
  2384. 	on_select = pcr01_morph_set_accept, 
  2385. 	on_back = pcr01_morph_set_revert, 
  2386. 	on_alt_select = pcr01_randomize_confirm, 
  2387. 	rand_func = pcr01_randomize_morph_set, 
  2388. 	rand_func_name = "pcr01_randomize_morph_set", 
  2389. } 
  2390.  
  2391. Pcr01_tuning_brow_menu = { 
  2392. 	header_label_str = "CUST_MORPH_CAT_BROW", 
  2393. 	num_items = 0, 
  2394. 	morph_set = "brow", 
  2395. 	btn_tips = Pcr01_untop_btn_tips, 
  2396. 	on_show = pcr01_build_morph_menu, 
  2397. 	on_select = pcr01_morph_set_accept, 
  2398. 	on_back = pcr01_morph_set_revert, 
  2399. 	on_alt_select = pcr01_randomize_confirm, 
  2400. 	rand_func = pcr01_randomize_morph_set, 
  2401. 	rand_func_name = "pcr01_randomize_morph_set", 
  2402. } 
  2403.  
  2404. Pcr01_tuning_eyes_menu = { 
  2405. 	header_label_str = "CUST_MORPH_CAT_EYES", 
  2406. 	num_items = 0, 
  2407. 	morph_set = "eyes", 
  2408. 	btn_tips = Pcr01_untop_btn_tips, 
  2409. 	on_show = pcr01_build_morph_menu, 
  2410. 	on_select = pcr01_morph_set_accept, 
  2411. 	on_back = pcr01_morph_set_revert, 
  2412. 	on_alt_select = pcr01_randomize_confirm, 
  2413. 	rand_func = pcr01_randomize_morph_set, 
  2414. 	rand_func_name = "pcr01_randomize_morph_set", 
  2415. } 
  2416.  
  2417. Pcr01_tuning_nose_menu = { 
  2418. 	header_label_str = "CUST_MORPH_CAT_NOSE", 
  2419. 	num_items = 0, 
  2420. 	morph_set = "nose", 
  2421. 	btn_tips = Pcr01_untop_btn_tips, 
  2422. 	on_show = pcr01_build_morph_menu, 
  2423. 	on_select = pcr01_morph_set_accept, 
  2424. 	on_back = pcr01_morph_set_revert, 
  2425. 	on_alt_select = pcr01_randomize_confirm, 
  2426. 	rand_func = pcr01_randomize_morph_set, 
  2427. 	rand_func_name = "pcr01_randomize_morph_set", 
  2428. } 
  2429.  
  2430. Pcr01_tuning_cheekbones_menu = { 
  2431. 	header_label_str = "CUST_MORPH_CAT_CHEEKBONES", 
  2432. 	num_items = 0, 
  2433. 	morph_set = "cheekbones", 
  2434. 	btn_tips = Pcr01_untop_btn_tips, 
  2435. 	on_show = pcr01_build_morph_menu, 
  2436. 	on_select = pcr01_morph_set_accept, 
  2437. 	on_back = pcr01_morph_set_revert, 
  2438. 	on_alt_select = pcr01_randomize_confirm, 
  2439. 	rand_func = pcr01_randomize_morph_set, 
  2440. 	rand_func_name = "pcr01_randomize_morph_set", 
  2441. } 
  2442.  
  2443. Pcr01_tuning_ears_menu = { 
  2444. 	header_label_str = "CUST_MORPH_CAT_EARS", 
  2445. 	num_items = 0, 
  2446. 	morph_set = "ears", 
  2447. 	btn_tips = Pcr01_untop_btn_tips, 
  2448. 	on_show = pcr01_build_morph_menu, 
  2449. 	on_select = pcr01_morph_set_accept, 
  2450. 	on_back = pcr01_morph_set_revert, 
  2451. 	on_alt_select = pcr01_randomize_confirm, 
  2452. 	rand_func = pcr01_randomize_morph_set, 
  2453. 	rand_func_name = "pcr01_randomize_morph_set", 
  2454. } 
  2455.  
  2456. Pcr01_tuning_chin_menu = { 
  2457. 	header_label_str = "CUST_MORPH_CAT_CHIN", 
  2458. 	num_items = 0, 
  2459. 	morph_set = "chin", 
  2460. 	btn_tips = Pcr01_untop_btn_tips, 
  2461. 	on_show = pcr01_build_morph_menu, 
  2462. 	on_select = pcr01_morph_set_accept, 
  2463. 	on_back = pcr01_morph_set_revert, 
  2464. 	on_alt_select = pcr01_randomize_confirm, 
  2465. 	rand_func = pcr01_randomize_morph_set, 
  2466. 	rand_func_name = "pcr01_randomize_morph_set", 
  2467. } 
  2468.  
  2469. Pcr01_tuning_mouth_menu = { 
  2470. 	header_label_str = "CUST_MORPH_CAT_MOUTH", 
  2471. 	num_items = 0, 
  2472. 	morph_set = "mouth", 
  2473. 	btn_tips = Pcr01_untop_btn_tips, 
  2474. 	on_show = pcr01_build_morph_menu, 
  2475. 	on_select = pcr01_morph_set_accept, 
  2476. 	on_back = pcr01_morph_set_revert, 
  2477. 	on_alt_select = pcr01_randomize_confirm, 
  2478. 	rand_func = pcr01_randomize_morph_set, 
  2479. 	rand_func_name = "pcr01_randomize_morph_set", 
  2480. } 
  2481.  
  2482. Pcr01_tuning_jaw_menu = { 
  2483. 	header_label_str = "CUST_MORPH_CAT_JAW", 
  2484. 	num_items = 0, 
  2485. 	morph_set = "jaw", 
  2486. 	btn_tips = Pcr01_untop_btn_tips, 
  2487. 	on_show = pcr01_build_morph_menu, 
  2488. 	on_select = pcr01_morph_set_accept, 
  2489. 	on_back = pcr01_morph_set_revert, 
  2490. 	on_alt_select = pcr01_randomize_confirm, 
  2491. 	rand_func = pcr01_randomize_morph_set, 
  2492. 	rand_func_name = "pcr01_randomize_morph_set", 
  2493. } 
  2494.  
  2495. Pcr01_fine_tuning_menu = { 
  2496. 	header_label_str = "CUST_FINE_TUNING", 
  2497. 	num_items = 11, 
  2498. 	btn_tips = Pcr01_top_btn_tips, 
  2499. 	on_back = pcr01_exit, 
  2500. 	on_alt_select = pcr01_randomize_confirm, 
  2501. 	rand_func = pcr01_randomize_all_morphs, 
  2502. 	rand_func_name = "pcr01_randomize_all_morphs", 
  2503. 	on_show = fine_tuning_menu_show, 
  2504. 	[0] = { label = "cust_morph_cat_crown", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_crown_menu }, 
  2505. 	[1] = { label = "cust_morph_cat_forehead", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_forehead_menu }, 
  2506. 	[2] = { label = "cust_morph_cat_brow", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_brow_menu }, 
  2507. 	[3] = { label = "cust_morph_cat_eyes", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_eyes_menu }, 
  2508. 	[4] = { label = "CUST_EYE_COLOR",			type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_global_eye_menu }, 
  2509. 	[5] = { label = "cust_morph_cat_ears", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_ears_menu }, 
  2510. 	[6] = { label = "cust_morph_cat_cheekbones", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_cheekbones_menu }, 
  2511. 	[7] = { label = "cust_morph_cat_nose", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_nose_menu }, 
  2512. 	[8] = { label = "cust_morph_cat_mouth", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_mouth_menu }, 
  2513. 	[9] = { label = "cust_morph_cat_chin", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_chin_menu }, 
  2514. 	[10] = { label = "cust_morph_cat_jaw", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_tuning_jaw_menu }, 
  2515. } 
  2516.  
  2517. Pcr01_makeup_secondary_color_menu = { 
  2518. 	header_label_str = "CUST_SECONDARY_COLOR", 
  2519. 	btn_tips = Pcr01_untop_btn_tips, 
  2520. 	on_show = pcr01_makeup_color_grid_show, 
  2521. 	on_release = pcr01_makeup_color_grid_release, 
  2522. 	on_back = pcr01_makeup_color_grid_back, 
  2523. 	on_alt_select = pcr01_randomize_confirm, 
  2524. 	rand_func = pcr01_makeup_randomize_secondary_color, 
  2525. 	rand_func_name = "pcr01_makeup_randomize_secondary_color", 
  2526. 	num_items = 1, 
  2527. 	is_primary = false, 
  2528. 	[0] = { label = "", type = MENU_ITEM_TYPE_GRID, on_select = pcr01_select_makeup_color, on_nav = pcr01_nav_makeup_color, 
  2529. 		row_height = 41, num_cols = 6, col_width = 65, highlight_scale = 1, unhighlight_scale = 0.8, 
  2530. 		update_swatch = pcr01_makeup_color_update_swatch 
  2531. 	} 
  2532. } 
  2533.  
  2534. Pcr01_makeup_primary_color_menu = { 
  2535. 	header_label_str = "CUST_PRIMARY_COLOR", 
  2536. 	btn_tips = Pcr01_untop_btn_tips, 
  2537. 	on_show = pcr01_makeup_color_grid_show, 
  2538. 	on_release = pcr01_makeup_color_grid_release, 
  2539. 	on_back = pcr01_makeup_color_grid_back, 
  2540. 	on_alt_select = pcr01_randomize_confirm, 
  2541. 	rand_func = pcr01_makeup_randomize_primary_color, 
  2542. 	rand_func_name = "pcr01_makeup_randomize_primary_color", 
  2543. 	num_items = 1, 
  2544. 	is_primary = true, 
  2545. 	[0] = { label = "", type = MENU_ITEM_TYPE_GRID, on_select = pcr01_select_makeup_color, on_nav = pcr01_nav_makeup_color, 
  2546. 		row_height = 41, num_cols = 6, col_width = 65, highlight_scale = 1, unhighlight_scale = 0.8, 
  2547. 		update_swatch = pcr01_makeup_color_update_swatch 
  2548. 	} 
  2549. } 
  2550.  
  2551. Pcr01_makeup_variations_menu = { 
  2552. 	header_label_str = "CUST_MAKEUP_VARIATION", 
  2553. 	num_items = 0, 
  2554. 	btn_tips = Pcr01_untop_btn_tips, 
  2555. 	on_back = pcr01_makeup_variant_back, 
  2556. 	on_nav = pcr01_makeup_item_nav, 
  2557. 	on_show = prc01_makeup_variant_show, 
  2558. 	on_alt_select = pcr01_randomize_confirm, 
  2559. 	rand_func = pcr01_makeup_randomize_variant, 
  2560. 	rand_func_name = "pcr01_makeup_randomize_variant", 
  2561. } 
  2562.  
  2563. Pcr01_makeup_forehead = { 
  2564. 	header_label_str = "CUST_CAT_MAKEUP_FOREHEAD", 
  2565. 	num_items = 0, 
  2566. 	btn_tips = Pcr01_untop_btn_tips, 
  2567. 	on_show = pcr01_build_makeup_menu, 
  2568. 	on_back = pcr01_makeup_item_back, 
  2569. 	on_nav = pcr01_makeup_item_nav, 
  2570. 	on_alt_select = pcr01_randomize_confirm, 
  2571. 	rand_func = pcr01_makeup_randomize_area, 
  2572. 	rand_func_name = "pcr01_makeup_randomize_area", 
  2573. } 
  2574.  
  2575. Pcr01_makeup_cheeks = { 
  2576. 	header_label_str = "CUST_CAT_MAKEUP_CHEEKS", 
  2577. 	num_items = 0, 
  2578. 	btn_tips = Pcr01_untop_btn_tips, 
  2579. 	on_show = pcr01_build_makeup_menu, 
  2580. 	on_back = pcr01_makeup_item_back, 
  2581. 	on_nav = pcr01_makeup_item_nav, 
  2582. 	on_alt_select = pcr01_randomize_confirm, 
  2583. 	rand_func = pcr01_makeup_randomize_area, 
  2584. 	rand_func_name = "pcr01_makeup_randomize_area", 
  2585. } 
  2586.  
  2587. Pcr01_makeup_mouth = { 
  2588. 	header_label_str = "CUST_CAT_MAKEUP_MOUTH", 
  2589. 	num_items = 0, 
  2590. 	btn_tips = Pcr01_untop_btn_tips, 
  2591. 	on_show = pcr01_build_makeup_menu, 
  2592. 	on_back = pcr01_makeup_item_back, 
  2593. 	on_nav = pcr01_makeup_item_nav, 
  2594. 	on_alt_select = pcr01_randomize_confirm, 
  2595. 	rand_func = pcr01_makeup_randomize_area, 
  2596. 	rand_func_name = "pcr01_makeup_randomize_area", 
  2597. } 
  2598.  
  2599. Pcr01_makeup_face = { 
  2600. 	header_label_str = "CUST_CAT_MAKEUP_ENTIRE_FACE", 
  2601. 	num_items = 0, 
  2602. 	btn_tips = Pcr01_untop_btn_tips, 
  2603. 	on_show = pcr01_build_makeup_menu, 
  2604. 	on_back = pcr01_makeup_item_back, 
  2605. 	on_nav = pcr01_makeup_item_nav, 
  2606. 	on_alt_select = pcr01_randomize_confirm, 
  2607. 	rand_func = pcr01_makeup_randomize_area, 
  2608. 	rand_func_name = "pcr01_makeup_randomize_area", 
  2609. } 
  2610.  
  2611. Pcr01_makeup_eyes = { 
  2612. 	header_label_str = "CUST_CAT_MAKEUP_AROUND_EYES", 
  2613. 	num_items = 0, 
  2614. 	btn_tips = Pcr01_untop_btn_tips, 
  2615. 	on_show = pcr01_build_makeup_menu, 
  2616. 	on_back = pcr01_makeup_item_back, 
  2617. 	on_nav = pcr01_makeup_item_nav, 
  2618. 	on_alt_select = pcr01_randomize_confirm, 
  2619. 	rand_func = pcr01_makeup_randomize_area, 
  2620. 	rand_func_name = "pcr01_makeup_randomize_area", 
  2621. } 
  2622.  
  2623. Pcr01_makeup_areas_menu = { 
  2624. 	header_label_str = "CUST_MENU_MAKEUP", 
  2625. 	num_items = 4, 
  2626. 	btn_tips = Pcr01_top_btn_tips, 
  2627. 	on_show = pcr01_makeup_area_list_show, 
  2628. 	on_back = pcr01_exit, 
  2629. 	on_alt_select = pcr01_randomize_confirm, 
  2630. 	rand_func = pcr01_makeup_randomize_all_areas, 
  2631. 	rand_func_name = "pcr01_makeup_randomize_all_areas", 
  2632. 	[0] = { label = "CUST_CAT_MAKEUP_AROUND_EYES", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_makeup_eyes, makeup_area = 4 }, 
  2633. 	[1] = { label = "CUST_CAT_MAKEUP_CHEEKS", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_makeup_cheeks, makeup_area = 1 }, 
  2634. 	[2] = { label = "CUST_CAT_MAKEUP_MOUTH", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_makeup_mouth, makeup_area = 2 }, 
  2635. 	[3] = { label = "CUST_CAT_MAKEUP_ENTIRE_FACE", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_makeup_face, makeup_area = 3 }, 
  2636. } 
  2637.  
  2638. Pcr01_movement_walk_menu = { 
  2639. 	header_label_str = "CUST_MOVEMENT_WALK", 
  2640. 	num_items = 0, 
  2641. 	btn_tips = Pcr01_untop_btn_tips, 
  2642. 	on_show = pcr01_movement_show, 
  2643. 	on_nav = pcr01_movement_nav, 
  2644. 	on_back = pcr01_movement_back, 
  2645. 	on_exit = pcr01_movement_exit, 
  2646. 	anim_group = "walk_style" 
  2647. } 
  2648.  
  2649. Pcr01_movement_melee_menu = { 
  2650. 	header_label_str = "CUST_MOVEMENT_MELEE", 
  2651. 	num_items = 0, 
  2652. 	btn_tips = Pcr01_untop_btn_tips, 
  2653. 	on_show = pcr01_movement_show, 
  2654. 	on_nav = pcr01_movement_nav, 
  2655. 	on_back = pcr01_movement_back, 
  2656. 	on_exit = pcr01_movement_exit, 
  2657. 	anim_group = "melee_combat_style" 
  2658. } 
  2659.  
  2660. Pcr01_movement_taunt_menu = { 
  2661. 	header_label_str = "CUST_MOVEMENT_TAUNT", 
  2662. 	num_items = 0, 
  2663. 	btn_tips = Pcr01_untop_btn_tips, 
  2664. 	on_show = pcr01_movement_show, 
  2665. 	on_nav = pcr01_movement_nav, 
  2666. 	on_back = pcr01_movement_back, 
  2667. 	on_exit = pcr01_movement_exit, 
  2668. 	anim_group = "taunt_style" 
  2669. } 
  2670.  
  2671. Pcr01_movement_compliment_menu = { 
  2672. 	header_label_str = "CUST_MOVEMENT_COMPLIMENT", 
  2673. 	num_items = 0, 
  2674. 	btn_tips = Pcr01_untop_btn_tips, 
  2675. 	on_show = pcr01_movement_show, 
  2676. 	on_nav = pcr01_movement_nav, 
  2677. 	on_back = pcr01_movement_back, 
  2678. 	on_exit = pcr01_movement_exit, 
  2679. 	anim_group = "compliment_style" 
  2680. } 
  2681.  
  2682. Pcr01_movement_facial_expression_menu = { 
  2683. 	header_label_str = "CUST_MOVEMENT_FACE", 
  2684. 	num_items = 0, 
  2685. 	btn_tips = Pcr01_untop_btn_tips, 
  2686. 	on_show = pcr01_movement_show, 
  2687. 	on_nav = pcr01_movement_nav, 
  2688. 	on_back = pcr01_movement_back, 
  2689. 	on_exit = pcr01_movement_exit, 
  2690. 	anim_group = "facial_expression_style" 
  2691. } 
  2692.  
  2693. Pcr01_movement_menu = { 
  2694. 	header_label_str = "CUST_MENU_MOVEMENT", 
  2695. 	num_items = 6, 
  2696. 	on_show = prc01_movement_list_show, 
  2697. 	on_back = pcr01_exit, 
  2698. 	on_nav = prc01_movement_custom_camera, 
  2699. 	btn_tips = Pcr01_top_btn_tips, 
  2700. 	[0] = { label = "CUST_VOICE", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_presets_voice_menu }, 
  2701. 	[1] = { label = "CUST_MOVEMENT_FACIAL_EXPRESSION", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_movement_facial_expression_menu}, 
  2702. 	[2] = { label = "CUST_MOVEMENT_WALK", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_movement_walk_menu }, 
  2703. 	[3] = { label = "CUST_MOVEMENT_MELEE", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_movement_melee_menu }, 
  2704. 	[4] = { label = "CUST_MOVEMENT_COMPLIMENT", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_movement_compliment_menu }, 
  2705. 	[5] = { label = "CUST_MOVEMENT_TAUNT", type = MENU_ITEM_TYPE_SUB_MENU, sub_menu = Pcr01_movement_taunt_menu },	 
  2706. } 
  2707.  
  2708. function pcr01_do_nothing() 
  2709.  
  2710. end 
  2711.  
  2712. Pcr01_exit_menu = { 
  2713.    header_label_str = "CUST_MENU_EXIT", 
  2714.    num_items = 1, 
  2715. 	btn_tips = Pcr01_top_btn_tips, 
  2716. 	on_back = pcr01_exit, 
  2717.    [0] = { label = "CUST_MENU_EXIT", type = MENU_ITEM_TYPE_SELECTABLE, on_select = pcr01_exit }, 
  2718. } 
  2719.  
  2720. Pcr01_horz_menu = { 
  2721. 	num_items = 7, 
  2722. 	btn_tips = Pcr01_top_btn_tips, 
  2723. 	current_selection = 0, 
  2724. 	[0] = { label = "CUST_MENU_PRESETS", sub_menu = Pcr01_presets_menu }, 
  2725. 	[1] = { label = "CUST_MENU_GLOBAL", sub_menu = Pcr01_globals_menu }, 
  2726. 	[2] = { label = "CUST_MENU_FINE_TUNING", sub_menu = Pcr01_fine_tuning_menu }, 
  2727. 	[3] = { label = "CUST_MENU_HAIR", sub_menu = Pcr01_hair_areas_menu }, 
  2728. 	[4] = { label = "CUST_MENU_MAKEUP", sub_menu = Pcr01_makeup_areas_menu }, 
  2729. 	[5] = { label = "CUST_MENU_MOVEMENT", sub_menu = Pcr01_movement_menu }, 
  2730. 	[6] = { label = "CUST_MENU_EXIT", sub_menu = Pcr01_exit_menu } 
  2731. }