sr2lua/gmb_blackjack.lua

  1. Gmb_blackjack = {} 
  2.  
  3.  
  4. Gmb_blackjack.card_twns = {} 
  5. Gmb_blackjack_thread = -1 
  6.  
  7. --Card Enums 
  8. GMB_SUIT_ENUMS = { 
  9. 	BLANK = -1, 
  10. 	SPADE = 0, 
  11. 	CLUB = 1, 
  12. 	DIAMOND = 2, 
  13. 	HEART = 3, 
  14. } 
  15.  
  16. GMB_CARD_ENUMS = { 
  17. 	[1] = "A", 
  18. 	[11] = "J", 
  19. 	[12] = "Q", 
  20. 	[13] = "K", 
  21. } 
  22.  
  23. GMB_PLAYER_ENUMS = { 
  24. 	DEALER_HAND = 0, 
  25. 	PLAYER_HAND = 1, 
  26. 	SPLIT_HAND = 2 
  27. } 
  28.  
  29. GMB_HAND_VALUES = { 
  30. 	[0] = "0", 
  31. 	[1] = "WIN", 
  32. 	[2] = "LOSE", 
  33. 	[3] = "DIVERSION_BLACKJACK_BUST", 
  34. 	[4] = "DIVERSION_BLACKJACK_BLACKJACK", 
  35. 	[5] = "DIVERSION_BLACKJACK_PUSH", 
  36. 	[6] = "DIVERSION_BLACKJACK_DEALER_BLACKJACK", 
  37. 	[7] = "DIVERSION_BLACKJACK_DEALER_BUST" 
  38. } 
  39.  
  40. --Input/Screen states 
  41. --All input states have a respresenting screenstate that is managed together in a sloppy way. 
  42. GMB_INPUT_STATES = { 
  43. 	BET = 0, 
  44. 	CONTINUE = 10, 
  45. 	CONTINUE_SPLIT = 30, 
  46. 	CONTINUE_DOUBLEDOWN = 40, 
  47. 	FINISHED = 50, 
  48. } 
  49.  
  50. --Initialize sound 
  51. GMB_BLACKJACK_AUDIO = {} 
  52. GMB_BLACKJACK_AUDIO.THEME 		= audio_get_audio_id("SYS_VPOKER_POKERTHEME") 
  53. GMB_BLACKJACK_AUDIO.NAV 			= audio_get_audio_id("SYS_VPOKER_UDLR") 
  54. GMB_BLACKJACK_AUDIO.SELECT 		= audio_get_audio_id("SYS_VPOKER_SELECT") 
  55. GMB_BLACKJACK_AUDIO.DEAL_CARD 	= audio_get_audio_id("SYS_VPOKER_DEALCARD") 
  56. GMB_BLACKJACK_AUDIO.WIN 			= audio_get_audio_id("SYS_VPOKER_WIN") 
  57. GMB_BLACKJACK_AUDIO.LOSE 		= audio_get_audio_id("SYS_VPOKER_LOSE") 
  58.  
  59. function gmb_blackjack_init() 
  60.  
  61. 	local h, x, y  
  62. 	--Load Bitmaps 
  63. 	peg_load("ui_gambling") 
  64. 	 
  65. 	--Handles 
  66. 	Gmb_blackjack.handles = {} 
  67. 	 
  68. 	--Bet button 
  69. 	Gmb_blackjack.handles.btn_bet 				= vint_object_find("btn_bet") --Bet Button 
  70. 	Gmb_blackjack.handles.btn_bet_arrow_left  = vint_object_find("arrow_left", Gmb_blackjack.handles.btn_bet) 
  71. 	Gmb_blackjack.handles.btn_bet_arrow_right = vint_object_find("arrow_right", Gmb_blackjack.handles.btn_bet) 
  72. 	Gmb_blackjack.handles.btn_bet_cash 			= vint_object_find("cash", Gmb_blackjack.handles.btn_bet) 
  73. 	 
  74. 	 
  75. 	local confirm_button_h = vint_object_find("btn_a") 
  76. 	vint_set_property(confirm_button_h, "image", get_a_button()) 
  77. 	 
  78. 	local back_button_h = vint_object_find("btn_b") 
  79. 	vint_set_property(back_button_h, "image", get_b_button()) 
  80. 	 
  81. 	Gmb_blackjack.handles.cash = vint_object_find("player_cash") --Cash 
  82. 	 
  83. 	--Winnings 
  84. 	Gmb_blackjack.handles.winnings 			= vint_object_find("winnings_grp") -- Winnings 
  85. 	Gmb_blackjack.handles.winnings_type 	= vint_object_find("hand_type_txt", Gmb_blackjack.handles.winnings) -- Winnings 
  86. 	Gmb_blackjack.handles.winnings_cash		= vint_object_find("cash_winnings_txt", Gmb_blackjack.handles.winnings) -- Cash Winnings	 
  87. 	Gmb_blackjack.handles.winnings_box_nw 	= vint_object_find("nw", Gmb_blackjack.handles.winnings) 
  88. 	Gmb_blackjack.handles.winnings_box_n 	= vint_object_find("n",  Gmb_blackjack.handles.winnings) 
  89. 	Gmb_blackjack.handles.winnings_box_ne 	= vint_object_find("ne", Gmb_blackjack.handles.winnings) 
  90. 	Gmb_blackjack.handles.winnings_box_w 	= vint_object_find("w",  Gmb_blackjack.handles.winnings) 
  91. 	Gmb_blackjack.handles.winnings_box_c 	= vint_object_find("c",  Gmb_blackjack.handles.winnings) 
  92. 	Gmb_blackjack.handles.winnings_box_e 	= vint_object_find("e",  Gmb_blackjack.handles.winnings) 
  93. 	Gmb_blackjack.handles.winnings_box_sw 	= vint_object_find("sw", Gmb_blackjack.handles.winnings) 
  94. 	Gmb_blackjack.handles.winnings_box_s 	= vint_object_find("s",  Gmb_blackjack.handles.winnings) 
  95. 	Gmb_blackjack.handles.winnings_box_se	= vint_object_find("se", Gmb_blackjack.handles.winnings) 
  96. 	 
  97. 	--Cards 
  98. 	Gmb_blackjack.handles.cards = {} 
  99. 	Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.BLANK] = vint_object_find("card_back") 
  100. 	Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.SPADE] = vint_object_find("card_spade") 
  101. 	Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.CLUB] = vint_object_find("card_club") 
  102. 	Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.DIAMOND] = vint_object_find("card_diamond") 
  103. 	Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.HEART] = vint_object_find("card_heart") 
  104. 	 
  105. 	--Card Sets 
  106. 	Gmb_blackjack.handles.card_sets = {} 
  107. 	Gmb_blackjack.handles.card_sets[GMB_PLAYER_ENUMS.DEALER_HAND] = vint_object_find("cards_dealer_1") 
  108. 	Gmb_blackjack.handles.card_sets[GMB_PLAYER_ENUMS.PLAYER_HAND] = vint_object_find("cards_player_1") 
  109. 	Gmb_blackjack.handles.card_sets[GMB_PLAYER_ENUMS.SPLIT_HAND]  = vint_object_find("cards_player_2") 
  110. 	 
  111. 	--Card Values 
  112. 	h = vint_object_find("hand_value_grp") 
  113. 	Gmb_blackjack.handles.hand_values = {} 
  114. 	Gmb_blackjack.handles.hand_values[GMB_PLAYER_ENUMS.DEALER_HAND] = vint_object_clone(h) 
  115. 	Gmb_blackjack.handles.hand_values[GMB_PLAYER_ENUMS.PLAYER_HAND] = vint_object_clone(h) 
  116. 	Gmb_blackjack.handles.hand_values[GMB_PLAYER_ENUMS.SPLIT_HAND] = vint_object_clone(h) 
  117. 	 
  118. 	 
  119. 	x, y = vint_get_property(Gmb_blackjack.handles.card_sets[GMB_PLAYER_ENUMS.DEALER_HAND], "anchor") 
  120. 	vint_set_property(Gmb_blackjack.handles.hand_values[GMB_PLAYER_ENUMS.DEALER_HAND], "anchor", x, y) 
  121. 	 
  122. 	x, y = vint_get_property(Gmb_blackjack.handles.card_sets[GMB_PLAYER_ENUMS.PLAYER_HAND], "anchor") 
  123. 	vint_set_property(Gmb_blackjack.handles.hand_values[GMB_PLAYER_ENUMS.PLAYER_HAND], "anchor", x, y) 
  124. 	 
  125. 	x, y = vint_get_property(Gmb_blackjack.handles.card_sets[GMB_PLAYER_ENUMS.SPLIT_HAND], "anchor") 
  126. 	vint_set_property(Gmb_blackjack.handles.hand_values[GMB_PLAYER_ENUMS.SPLIT_HAND], "anchor", x, y) 
  127. 	 
  128. 	Gmb_blackjack.handles.hand_value_y = y 
  129. 	 
  130. 	--Split indicator 
  131. 	Gmb_blackjack.handles.split_ind = vint_object_find("card_split") 
  132. 	Gmb_blackjack.handles.card_select = vint_object_find("card_select_blink") 
  133. 	 
  134. 	--Cards fade in 
  135. 	Gmb_blackjack.anims = {} 
  136. 	Gmb_blackjack.anims.cards_fade  = vint_object_find("cards_fade_in")  
  137. 	Gmb_blackjack.anims.card_twn_fade_in  = vint_object_find("card_twn_fade_in")  
  138. 	vint_set_property(Gmb_blackjack.anims.cards_fade, "is_paused", true)  
  139. 	 
  140. 	--Align button Tips 
  141. 	gmb_blackjack_btntips_align() 
  142. 	 
  143. 	--Initilize Globals 
  144. 	Gmb_blackjack.current_bet = 0 
  145. 	Gmb_blackjack.cash = 0 
  146. 	 
  147. 	Gmb_blackjack.cur_idx = 0			--Where the cursor is 
  148. 	 
  149. 	--Glowing Button Animation 
  150. 	Gmb_blackjack.handles.glow_btn_anim = vint_object_find("btn_glow_anim") 
  151. 	Gmb_blackjack.handles.glow_btn_twn = vint_object_find("btn_glow_twn", Gmb_blackjack.handles.glow_btn_anim) 
  152. 	 
  153. 	 
  154. 	--Result blink anim 
  155. 	Gmb_blackjack.handles.results_anim = vint_object_find("t_cash_blink") 
  156. 	local twn_h = vint_object_find("t_cash_tint_twn_2") 
  157. 	vint_set_property(twn_h, "end_event", "gmb_blackjack_loop_cash_anim") 
  158. 	 
  159. 	--Initialize functions and subscribe to events 
  160. 	 
  161. 		 
  162. 	--Subscribe to cash data 
  163. 	vint_dataitem_add_subscription("sr2_local_player_status_infrequent", "update", "gmb_blackjack_cash_update") 
  164. 	 
  165. 	--Cash process 
  166. 	Gmb_blackjack_thread = thread_new("gmb_blackjack_process") 
  167.  
  168. 	--Initialize table by faking a new game... 
  169. 	gmb_blackjack_table_init() 
  170. 	gmb_blackjack_newgame_cb() 
  171. 	 
  172. 	--Subscribe to inputs 
  173. 	gmb_blackjack_input_subscribe() 
  174. 	 
  175. 	--Event Tracking 
  176. 	event_tracking_interface_enter("Gambling: Blackjack") 
  177. end 
  178.  
  179. function gmb_blackjack_cleanup() 
  180. 	 
  181. 	--UnLoad Bitmaps 
  182. 	peg_unload("ui_gambling") 
  183. 	 
  184.  
  185. 	gmb_blackjack_input_desubscribe() 
  186. 	 
  187. 	if Gmb_blackjack_thread ~= -1 then 
  188. 		thread_kill(Gmb_blackjack_thread) 
  189. 	end 
  190. 	 
  191. 	--Event Tracking (Exit gambling) 
  192. 	event_tracking_interface_exit() 
  193. end 
  194.  
  195.  
  196. function gmb_blackjack_input_subscribe() 
  197. 	--Subscribe to input 
  198. 	local g = Gmb_blackjack 
  199. 	 
  200. --	-vint_set_input_params(subscription_handle, repeat_time, acceleration_factor, acceleration_limit, smooth_accelleration) 
  201. 	g.input_subs = {	 
  202. 		vint_subscribe_to_input_event(nil, "nav_up",				"gmb_blackjack_input_event", 50),  
  203. 		vint_subscribe_to_input_event(nil, "nav_down",			"gmb_blackjack_input_event", 50), 
  204. 		vint_subscribe_to_input_event(nil, "nav_right",			"gmb_blackjack_input_event", 50), 
  205. 		vint_subscribe_to_input_event(nil, "nav_left",			"gmb_blackjack_input_event", 50), 
  206. 		vint_subscribe_to_input_event(nil, "select",				"gmb_blackjack_input_event", 50), --5 
  207. 		vint_subscribe_to_input_event(nil, "pause",				"gmb_blackjack_input_event", 50), --6 
  208. 		vint_subscribe_to_input_event(nil, "back",				"gmb_blackjack_input_event", 100), --7 
  209. 		vint_subscribe_to_input_event(nil, "map",					"gmb_blackjack_input_event", 100), --7 
  210. 	} 
  211. 	 
  212. 	vint_set_input_params(g.input_subs[5], 120, nil, nil, nil) 
  213. 	vint_set_input_params(g.input_subs[6], 120, nil, nil, nil) 
  214. 	vint_set_input_params(g.input_subs[7], 120, nil, nil, nil) 
  215. end 
  216.  
  217. function gmb_blackjack_input_desubscribe() 
  218. 	--	Unsubscribe to input 
  219. 	local g = Gmb_blackjack 
  220. 	for idx, val in g.input_subs do 
  221. 		vint_unsubscribe_to_input_event(val) 
  222. 	end 
  223. 	g.input_subs = nil 
  224. end 
  225.  
  226. function gmb_blackjack_input_event(target, event, accelleration) 
  227.  
  228. 	--Is input blocked? 
  229. 	if gmb_blackjack_input_is_bocked() then 
  230. 		return 
  231. 	end 
  232. 	 
  233. 	if Gmb_blackjack.input_state == GMB_INPUT_STATES.BET then 
  234. 		--Bet Mode 
  235. 		if event == "nav_left" then 
  236. 			--Bet Decrease 
  237. 			vint_dataresponder_request("blackjack_responder", "gmb_blackjack_bet_change_cb", 0, 1) 
  238. 			audio_play(GMB_BLACKJACK_AUDIO.NAV) 
  239. 		elseif event == "nav_right" then 
  240. 			--Bet Increase 
  241. 			vint_dataresponder_request("blackjack_responder", "gmb_blackjack_bet_change_cb", 0, 0) 
  242. 			audio_play(GMB_BLACKJACK_AUDIO.NAV) 
  243. 		elseif event == "select" then 
  244. 				--Check to make sure the player has enough cash to make current bet 
  245. 			if Gmb_blackjack.current_bet > Gmb_blackjack.cash then 
  246. 				gmb_blackjack_not_enough_cash_dialog() 
  247. 				return 
  248. 			end 
  249. 		 
  250. 			--Deal it 
  251. 			gmb_blackjack_deal_first() 
  252. 			audio_play(GMB_BLACKJACK_AUDIO.SELECT) 
  253. 			 
  254. 			gmb_blackjack_input_block(true) 
  255. 		end 
  256. 	elseif Gmb_blackjack.input_state > GMB_INPUT_STATES.BET then 
  257. 		if event == "nav_up" then 
  258. 			--Switch cursor 
  259. 			local new_idx = Gmb_blackjack.cur_idx - 1 
  260. 			if new_idx < 0 then 
  261. 				new_idx = Gmb_blackjack.num_btns - 1 
  262. 			end 
  263. 			gmb_blackjack_btn_highlight(new_idx) 
  264. 			Gmb_blackjack.cur_idx = new_idx 
  265. 			audio_play(GMB_BLACKJACK_AUDIO.NAV) 
  266. 		elseif event == "nav_down" then 
  267. 			--Switch Cursor 
  268. 			local new_idx = Gmb_blackjack.cur_idx + 1 
  269. 			if new_idx > Gmb_blackjack.num_btns - 1 then 
  270. 				new_idx = 0 
  271. 			end 
  272. 			gmb_blackjack_btn_highlight(new_idx) 
  273. 			Gmb_blackjack.cur_idx = new_idx 
  274. 			audio_play(GMB_BLACKJACK_AUDIO.NAV) 
  275. 		elseif event == "select" then 
  276. 			--Do the button action 
  277. 			gmb_blackjack_btn_action(Gmb_blackjack.cur_idx) 
  278. 			audio_play(GMB_BLACKJACK_AUDIO.SELECT) 
  279. 		end 
  280. 	end 
  281. 	 
  282. 	if event == "back" then 
  283. 		gmb_blackjack_action_quit() 
  284. 	end 
  285. 	 
  286. 	--No where to pause 
  287. 	if event == "pause" then  
  288. 		dialog_open_pause_display() 
  289. 	end 
  290. 	 
  291. end 
  292.  
  293. Gmb_blackjack.deal_queue = {} 
  294. Gmb_blackjack.hands = {} 
  295.  
  296. --================================= 
  297. --Initializes table 
  298. --================================== 
  299. function gmb_blackjack_table_init() 
  300. 	gmb_blackjack_clear_deal_queue() 
  301. 	gmb_blackjack_hand_init() 
  302. 	gmb_blackjack_hand_info_update(0, 0) 
  303. 	gmb_blackjack_hand_info_update(1, 0) 
  304. 	gmb_blackjack_hand_info_update(2, 0) 
  305. 	 
  306. 	vint_set_property(Gmb_blackjack.handles.winnings, "visible", false) 
  307. end 
  308.  
  309. --================================== 
  310. --Deal First 
  311. --================================== 
  312. function gmb_blackjack_deal_first() 
  313. 	gmb_blackjack_clear_deal_queue() 
  314. 	gmb_blackjack_hand_init()	--Initialize Hand data 
  315. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_deal_cb", 0, 2) 
  316. 	Gmb_blackjack.first_deal = true 
  317. 	gmb_blackjack_process_deal() 
  318. end 
  319.  
  320. function gmb_blackjack_clear_deal_queue() 
  321. 	--Clear Deal queue 
  322. 	Gmb_blackjack.deal_queue = {} 
  323. 	Gmb_blackjack.deal_queue.cards_to_deal = 0 
  324. end 
  325.  
  326. function gmb_blackjack_hand_init() 
  327. 	--Clear and initialize hand data 
  328. 	Gmb_blackjack.hands = {} 
  329. 	Gmb_blackjack.hands[0] = {} 
  330. 	Gmb_blackjack.hands[1] = {} 
  331. 	Gmb_blackjack.hands[2] = {} 
  332. 	Gmb_blackjack.hands[0].cur_card_idx = 0 
  333. 	Gmb_blackjack.hands[1].cur_card_idx = 0 
  334. 	Gmb_blackjack.hands[2].cur_card_idx = 0 
  335. 	Gmb_blackjack.hands[0].cards = {} 
  336. 	Gmb_blackjack.hands[1].cards = {} 
  337. 	Gmb_blackjack.hands[2].cards = {} 
  338. 	 
  339. 	--Remove cards from hands 
  340. 	local has_children = true  
  341. 	local child_h 
  342. 	for i = 0, 2 do 
  343. 		while has_children do 
  344. 			--Find first child of hand elements 
  345. 			child_h = vint_object_first_child(Gmb_blackjack.handles.card_sets[i]) 
  346. 			if child_h ~= nil then 
  347. 				--Still has a child so destroy it 
  348. 				vint_object_destroy(child_h) 
  349. 			else 
  350. 				has_children = false 
  351. 			end 
  352. 		end 
  353. 		has_children = true 
  354. 	end 
  355. 	 
  356. 	--clear out hand selector info 
  357. 	if Gmb_blackjack.handles.split_ind_clone ~= nil then 
  358. 		vint_object_destroy(Gmb_blackjack.handles.split_ind_clone) 
  359. 	end 
  360. 	 
  361. 	if Gmb_blackjack.handles.split_anim_clone ~= nil then 
  362. 		vint_object_destroy(Gmb_blackjack.handles.split_anim_clone) 
  363. 	end 
  364. end 
  365.  
  366. function gmb_blackjack_deal_cb(cb_type, param1, param2, param3, param4, param5) 
  367. 	--This function basically queues up all the data for processing and displaying later 
  368. 	 
  369. 	if cb_type == 0 then 
  370. 		--Store hand info for processing 
  371. 		local hand_owner = param1 
  372. 		Gmb_blackjack.deal_queue[hand_owner] = {} 
  373. 		Gmb_blackjack.deal_queue[hand_owner].hand_result = param2 
  374. 		Gmb_blackjack.deal_queue[hand_owner].value_of_hand = param3 
  375. 		Gmb_blackjack.deal_queue[hand_owner].num_cards = param4 
  376. 		Gmb_blackjack.deal_queue[hand_owner].is_active = param5 
  377. 		Gmb_blackjack.deal_queue[hand_owner].cards = {} 
  378. 		--[[ 
  379. 		--Debug spew 
  380. 		debug_print("vint", "HAND DATA\n") 
  381. 		debug_print("vint", " hand_owner" .. var_to_string(hand_owner) .. "\n") 
  382. 		debug_print("vint", " Hand hand_result" .. var_to_string(param2) .. "\n") 
  383. 		debug_print("vint", " value_of_hand" .. var_to_string(param3) .. "\n") 
  384. 		debug_print("vint", " num_cards" .. var_to_string(param4) .. "\n") 
  385. 		debug_print("vint", " is_active" .. var_to_string(param5) .. "\n") 
  386. 		]] 
  387. 	elseif cb_type == 1 then 
  388. 		--Card Info 
  389. 		local hand_owner = param1 
  390. 		local card_index = param2 
  391. 		 
  392. 		--Store Cards Into player Info 
  393. 		Gmb_blackjack.deal_queue[hand_owner].cards[card_index] = {} 
  394. 		Gmb_blackjack.deal_queue[hand_owner].cards[card_index].card_value = param3 
  395. 		Gmb_blackjack.deal_queue[hand_owner].cards[card_index].card_suit = param4 
  396. 		Gmb_blackjack.deal_queue[hand_owner].cards[card_index].face_down = param5 
  397. 		 
  398. 		--Increment the amount of cards we have to deal 
  399. 		Gmb_blackjack.deal_queue.cards_to_deal = Gmb_blackjack.deal_queue.cards_to_deal + 1 
  400. 		 
  401. 		--[[ 
  402. 		debug_print("vint", "CARD DATA\n") 
  403. 		debug_print("vint", " Hand owner" .. var_to_string(hand_owner) .. "\n") 
  404. 		debug_print("vint", " Card_index" .. var_to_string(card_index) .. "\n") 
  405. 		debug_print("vint", " Card_value" .. var_to_string(param3) .. "\n") 
  406. 		debug_print("vint", " Card_suit" .. var_to_string(param4) .. "\n") 
  407. 		debug_print("vint", " Face_down" .. var_to_string(param5) .. "\n") 
  408. 		]] 
  409. 		 
  410. 	elseif cb_type == 2 then 
  411. 	 
  412. 		--Game Status 
  413. 		Gmb_blackjack.deal_queue.game_status = {} 
  414. 		Gmb_blackjack.deal_queue.game_status.game_status = param1 
  415. 		Gmb_blackjack.deal_queue.game_status.winning_type = param2 
  416. 		Gmb_blackjack.deal_queue.game_status.winnings = param3 
  417. 		Gmb_blackjack.deal_queue.game_status.bet = param4 
  418. 		--[[ 
  419. 		debug_print("vint", "Game_status: " .. var_to_string(Gmb_blackjack.deal_queue.game_status.game_status) .. "\n") 
  420. 		debug_print("vint", " Winning_type: " .. var_to_string(Gmb_blackjack.deal_queue.game_status.winning_type) .. "\n") 
  421. 		debug_print("vint", " Winnings: " .. var_to_string(Gmb_blackjack.deal_queue.game_status.winnings)  .. "\n") 
  422. 		]] 
  423. 	end 
  424. end 
  425.  
  426.  
  427. function gmb_blackjack_process_deal() 
  428.  
  429. 	--Deal cards first?  
  430. 	 
  431. 	--Need to go back and forth between the player and the dealer 
  432. 	local cur_card_set = 0  
  433. 	 
  434. 	--calculate how many cards to deal? 
  435. 	local cards_to_deal 
  436.  
  437. 	--Destroy all buttons 
  438. 	gmb_blackjack_btns_clear() 
  439. 	 
  440. 	--Display the cards on the table 
  441. 	local card_x_offset = 28 
  442. 	local current_hand = GMB_PLAYER_ENUMS.PLAYER_HAND 
  443. 	local card_h 
  444. 	local card_value, card_suit, face_down, card_number 
  445. 	local cur_card 
  446. 	local is_split = false 		--Is the current set a split hand? 
  447. 	 
  448. 	local hands_to_deal = 2 
  449. 	if Gmb_blackjack.deal_queue[GMB_PLAYER_ENUMS.SPLIT_HAND] ~= nil then 
  450. 		is_split = true 
  451. 		hands_to_deal = 3 
  452. 	end 
  453. 	 
  454. 	for i = 0, hands_to_deal - 1 do 
  455. 		current_hand = i 
  456. 		local card_num = 0 
  457. 		 
  458. 		--Clear out old cards 
  459. 		if Gmb_blackjack.hands[current_hand].cards ~= nil then 
  460. 			for idx, val in Gmb_blackjack.hands[current_hand].cards do 
  461. 				vint_object_destroy(val) 
  462. 				--Store previous card data for display information 
  463. 				Gmb_blackjack.hands[current_hand].prev_card_idx = Gmb_blackjack.hands[current_hand].cur_card_idx  
  464. 			end 
  465. 			Gmb_blackjack.hands[current_hand].cards = {} 
  466. 		end 
  467.  
  468. 		for idx, val in Gmb_blackjack.deal_queue[current_hand].cards do 
  469. 			card_value = val.card_value 
  470. 			card_suit = val.card_suit 
  471. 			face_down = val.face_down 
  472.  
  473. 			--Clone proper card and set it in the right hand 
  474. 			if face_down == true then 
  475. 				card_h = vint_object_clone(Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.BLANK]) 
  476. 			else 
  477. 				card_h = vint_object_clone(Gmb_blackjack.handles.cards[card_suit]) 
  478. 			end 
  479. 			 
  480. 			vint_object_set_parent(card_h, Gmb_blackjack.handles.card_sets[current_hand]) 
  481. 			vint_set_property(card_h, "depth", idx * -1) 
  482. 					 
  483. 			--Resolve the card number for the card 
  484. 			if GMB_CARD_ENUMS[card_value] ~= nil then 
  485. 				--Use specified string for the enum 
  486. 				card_number = GMB_CARD_ENUMS[card_value]  
  487. 			else 
  488. 				--Use normal number 
  489. 				card_number = card_value 
  490. 			end 
  491. 			 
  492. 			if face_down == false then 
  493. 				--Only set the card information if the card is face down 
  494. 				local card_num_1_h = vint_object_find("card_num_1", card_h) 
  495. 				local card_num_2_h = vint_object_find("card_num_2", card_h) 
  496. 				vint_set_property(card_num_1_h, "text_tag", card_number) 
  497. 				vint_set_property(card_num_2_h, "text_tag", card_number) 
  498. 			end 
  499. 			 
  500. 			--Set positions 
  501. 			vint_set_property(card_h, "anchor", idx * card_x_offset, 0) 
  502. 					 
  503. 			card_num = card_num + 1 
  504. 			Gmb_blackjack.hands[current_hand].cards[idx] = card_h 
  505. 			Gmb_blackjack.hands[current_hand].cur_card_idx = Gmb_blackjack.hands[current_hand].cur_card_idx + 1 
  506. 		end 
  507. 		 
  508. 		--If there is a split hand draw the highligh indicator and add it to the card pile. 
  509. 		if is_split == true then 
  510. 			if Gmb_blackjack.deal_queue[current_hand].is_active == true then 
  511. 				 
  512. 				debug_print("vint", "ACTIVE HAND: " .. current_hand .. "\n") 
  513. 				debug_print("vint", "card_num: " .. card_num .. "\n") 
  514. 				 
  515. 				 
  516. 				local split_ind_h = vint_object_clone(Gmb_blackjack.handles.split_ind ) 
  517. 				local split_anim_h = vint_object_clone(Gmb_blackjack.handles.card_select) 
  518. 				 
  519. 				vint_object_set_parent(split_ind_h, Gmb_blackjack.handles.card_sets[current_hand]) 
  520. 				vint_set_property(split_ind_h, "depth", card_num * -1) 
  521. 				vint_set_property(split_anim_h, "target_handle", split_ind_h) 
  522. 						 
  523. 				--Set positions 
  524. 				vint_set_property(split_ind_h, "anchor", card_num * card_x_offset, 0) 
  525. 				vint_set_property(split_ind_h, "visible", true) 
  526. 				 
  527. 				Gmb_blackjack.handles.split_ind_clone = split_ind_h 
  528. 				Gmb_blackjack.handles.split_anim_clone = split_anim_h 
  529. 				 
  530. 				Gmb_blackjack.hands[current_hand].cards[card_num] = split_ind_h 
  531. 				Gmb_blackjack.hands[current_hand].cards[card_num + 1] = split_anim_h 
  532. 				card_num = card_num + 1 
  533. 			end 
  534. 		end 
  535. 	end 
  536. 	 
  537. 	--Animate cards in:**HACKED** 
  538. 	if Gmb_blackjack.first_deal == true then 
  539. 	 
  540. 		--hide hand info of the first player 
  541. 		gmb_blackjack_hand_info_visible(1, false) 
  542. 		 
  543. 		--dealer card 1 
  544. 		gmb_blackjack_card_set_fade(0, Gmb_blackjack.hands[1].cards[0]) 
  545. 		 
  546. 		--player card 1 
  547. 		gmb_blackjack_card_set_fade(1, Gmb_blackjack.hands[0].cards[0]) 
  548. 		 
  549. 		--Dealer card 2 
  550. 		gmb_blackjack_card_set_fade(2, Gmb_blackjack.hands[1].cards[1]) 
  551. 		 
  552. 		--Player card 2 
  553. 		gmb_blackjack_card_set_fade(3, Gmb_blackjack.hands[0].cards[1]) 
  554. 	 
  555. 		--Set callback of master tween 
  556. 		vint_set_property(Gmb_blackjack.anims.card_twn_fade_in, "end_event", "gmb_blackjack_cards_complete") 
  557. 	 
  558. 		--Set callback of master tween ot fire after last tween 
  559. 		vint_set_property(Gmb_blackjack.anims.card_twn_fade_in, "start_time", 4 * .2) 
  560. 		 
  561. 		--Fade in cards 
  562. 		lua_play_anim(Gmb_blackjack.anims.cards_fade, 0) 
  563. 		 
  564. 		Gmb_blackjack.first_deal = false 
  565. 	else 
  566. 		--Update hand info immediatly 
  567. 		gmb_blackjack_hand_info_update_all() 
  568. 		 
  569. 		--Update gamestatus 
  570. 		gmb_blackjack_game_status_update() 
  571. 		--Just play sound of card poping in. 
  572. 		audio_play(GMB_BLACKJACK_AUDIO.DEAL_CARD) 
  573. 	end 
  574.  
  575.  
  576. 	--Update Bet 
  577. 	 gmb_blackjack_bet_update(Gmb_blackjack.deal_queue.game_status.bet)  
  578. end 
  579.  
  580. --================================= 
  581. -- 
  582. --================================= 
  583.  
  584. function gmb_blackjack_game_status_update() 
  585. 		--TODO: This might need to happen after the animations fly in... 
  586. 	--Set button state 
  587. 	local game_status = Gmb_blackjack.deal_queue.game_status.game_status 
  588. 	if	game_status == 0 then 
  589. 		--Continue playing  
  590. 		gmb_blackjack_screen_state_set(GMB_INPUT_STATES.CONTINUE) 
  591. 	elseif game_status == 1 then 
  592. 		--Can split 
  593. 		gmb_blackjack_screen_state_set(GMB_INPUT_STATES.CONTINUE_SPLIT) 
  594. 	elseif game_status == 2 then 
  595. 		--Can double down 
  596. 		gmb_blackjack_screen_state_set(GMB_INPUT_STATES.CONTINUE_DOUBLEDOWN) 
  597. 	elseif game_status == 3 then 
  598. 		--Game Over man 
  599. 		gmb_blackjack_screen_state_set(GMB_INPUT_STATES.FINISHED) 
  600. 	end 
  601. 	 
  602. 	--Update Round status only if game is over 
  603. 	if Gmb_blackjack.deal_queue.game_status.game_status == 3 then 
  604. 		gmb_blackjack_winnings_payouts(Gmb_blackjack.deal_queue.game_status.winning_type, Gmb_blackjack.deal_queue.game_status.winnings) 
  605. 		 
  606. 		--Hide split control 
  607. 		vint_set_property(Gmb_blackjack.handles.cards[GMB_SUIT_ENUMS.SPLIT], "visible", false) 
  608. 	end 
  609.  
  610. end 
  611.  
  612.  
  613.  
  614. --================================== 
  615. --Betting 
  616. --================================== 
  617. function gmb_blackjack_bet_change_cb(callback_num, new_bet) 
  618. 	--Update betting string in button 
  619. 	gmb_blackjack_bet_update(new_bet) 
  620. end 
  621.  
  622. function gmb_blackjack_bet_update(bet) 
  623. 	vint_set_property(Gmb_blackjack.handles.btn_bet_cash, "text_tag", "$" .. format_cash(bet)) 
  624. 	Gmb_blackjack.current_bet = bet 
  625. 	 
  626. 	--adjust arrows 
  627. 	local x, y = vint_get_property(Gmb_blackjack.handles.btn_bet_arrow_left, "anchor") 
  628. 	local width, height = element_get_actual_size(Gmb_blackjack.handles.btn_bet_cash) 
  629. 	local cash_x, cash_y = vint_get_property(Gmb_blackjack.handles.btn_bet_cash, "anchor") 
  630. 	local half_width = width/2 + 5 
  631. 	 
  632. 	local left_x = cash_x - half_width + 5 
  633. 	local right_x = cash_x + half_width 
  634. 	 
  635. 	vint_set_property(Gmb_blackjack.handles.btn_bet_arrow_left, "anchor", left_x, y) 
  636. 	vint_set_property(Gmb_blackjack.handles.btn_bet_arrow_right, "anchor", right_x, y) 
  637. end 
  638.  
  639. function gmb_blackjack_bet_show_arrows(visible) 
  640. 	if visible == true then 
  641. 		vint_set_property(Gmb_blackjack.handles.btn_bet_arrow_right, "visible", true) 
  642. 		vint_set_property(Gmb_blackjack.handles.btn_bet_arrow_left, "visible", true) 
  643. 		vint_set_property(Gmb_blackjack.handles.btn_bet_cash, "tint", 0.7725, 0.7961, 0.814)	 
  644. 	else 
  645. 		vint_set_property(Gmb_blackjack.handles.btn_bet_arrow_right, "visible", false) 
  646. 		vint_set_property(Gmb_blackjack.handles.btn_bet_arrow_left, "visible", false) 
  647. 		vint_set_property(Gmb_blackjack.handles.btn_bet_cash, "tint", 0.6235, 0.6353, 0.644) 
  648. 	end 
  649. end 
  650.  
  651. --================================= 
  652. --Screenstate Set 
  653. --================================= 
  654. function gmb_blackjack_screen_state_set(state) 
  655. 	 
  656. 	--Make sure the buttons are initialized/cleared 
  657. 	gmb_blackjack_btns_clear() 
  658. 	 
  659. 	--Reset cursor index 
  660. 	Gmb_blackjack.cur_idx = 0 
  661. 		 
  662. 	--Hide betting arrows if we aren't in bet mode 
  663. 	if state ~= GMB_INPUT_STATES.BET then 
  664. 		 
  665. 		gmb_blackjack_bet_show_arrows(false) 
  666. 	end 
  667. 	 
  668. 	if state == GMB_INPUT_STATES.BET then	 
  669. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_DEAL", nil, gmb_blackjack_action_deal) 
  670. 		gmb_blackjack_btn_highlight(Gmb_blackjack.cur_idx) 
  671. 		 
  672. 		--Show betting arrows 
  673. 		gmb_blackjack_bet_show_arrows(true) 
  674. 			 
  675. 	elseif state == GMB_INPUT_STATES.CONTINUE then 
  676. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_HIT", nil, gmb_blackjack_action_hit) 
  677. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_STAND", nil, gmb_blackjack_action_stand) 
  678. 		gmb_blackjack_btn_highlight(Gmb_blackjack.cur_idx) 
  679.  
  680. 	elseif state == GMB_INPUT_STATES.CONTINUE_SPLIT then 
  681. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_HIT", nil, gmb_blackjack_action_hit) 
  682. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_SPLIT", nil, gmb_blackjack_action_split) 
  683. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_STAND", nil, gmb_blackjack_action_stand) 
  684. 		gmb_blackjack_btn_highlight(Gmb_blackjack.cur_idx) 
  685. 	 
  686. 	elseif state == GMB_INPUT_STATES.CONTINUE_DOUBLEDOWN then 
  687. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_HIT", nil, gmb_blackjack_action_hit) 
  688. 		gmb_blackjack_btn_create(true, "DIVERSION_BLACKJACK_DOUBLEDOWN_LINE1", "DIVERSION_BLACKJACK_DOUBLEDOWN_LINE2", gmb_blackjack_action_doubledown) 
  689. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_STAND", nil, gmb_blackjack_action_stand) 
  690. 		gmb_blackjack_btn_highlight(Gmb_blackjack.cur_idx) 
  691. 	 
  692. 	elseif state == GMB_INPUT_STATES.FINISHED then 
  693. 		gmb_blackjack_btn_create(true, "DIVERSION_BLACKJACK_NEWGAME_LINE1", "DIVERSION_BLACKJACK_NEWGAME_LINE2", gmb_blackjack_action_newgame) 
  694. 		gmb_blackjack_btn_create(false, "DIVERSION_BLACKJACK_QUIT", nil, gmb_blackjack_action_quit) 
  695. 		gmb_blackjack_btn_highlight(Gmb_blackjack.cur_idx) 
  696. 	end 
  697. 	 
  698. 	--Set input state 
  699. 	Gmb_blackjack.input_state = state 
  700. end 
  701.  
  702.  
  703. Gmb_blackjack.btns = {} 
  704. --================================= 
  705. --Setting up buttons/Controls 
  706. --================================= 
  707. function gmb_blackjack_btn_create(is_double_btn, text1, text2, action)  
  708. 	local base_btn 
  709. 	local btn_height 
  710.  
  711. 	if is_double_btn then 
  712. 		base_btn = vint_object_find("btn_2_line") 
  713. 		btn_height = 80 
  714. 	else 
  715. 		base_btn = vint_object_find("btn_1_line") 
  716. 		btn_height = 52 
  717. 	end 
  718. 	 
  719. 	local h = vint_object_clone(base_btn) 
  720. 	local highlight_h = vint_object_find("highlight", h) 
  721.  
  722. 	--Position button 
  723. 	local x = 0 
  724. 	local y = 0 
  725. 	if Gmb_blackjack.num_btns > 0 then 
  726. 		y = Gmb_blackjack.btns[Gmb_blackjack.num_btns - 1].y + Gmb_blackjack.btns[Gmb_blackjack.num_btns - 1].height + 5 
  727. 	end 
  728. 	vint_set_property(h, "anchor", x, y) 
  729. 	 
  730. 	--Set Text and resize if text is too big. 
  731. 	local text_1_h, text_2_h, width, height 
  732. 	local max_text_width = 150 
  733. 	if is_double_btn then 
  734. 		text_1_h = vint_object_find("text_1", h) 
  735. 		vint_set_property(text_1_h, "text_tag", text1) 
  736. 		text_2_h = vint_object_find("text_2", h) 
  737. 		vint_set_property(text_2_h, "text_tag", text2) 
  738. 		 
  739. 		--Reset Text Sizes 
  740. 		gmb_blackjack_btn_text_size(text_1_h, max_text_width) 
  741. 		gmb_blackjack_btn_text_size(text_2_h, max_text_width) 
  742. 	else 
  743. 		text_1_h = vint_object_find("text_1", h) 
  744. 		vint_set_property(text_1_h, "text_tag", text1) 
  745. 		--Reset Text Sizes 
  746. 		gmb_blackjack_btn_text_size(text_1_h, max_text_width) 
  747. 	end 
  748.  
  749. 	--Store data 
  750. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns] = {} 
  751. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].btn_h = h 
  752. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].highlight_h = highlight_h  
  753. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].height = btn_height 
  754. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].y = y 
  755. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].action = action 
  756. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].text_1_h = text_1_h 
  757. 	Gmb_blackjack.btns[Gmb_blackjack.num_btns].text_2_h = text_2_h 
  758. 	Gmb_blackjack.num_btns = Gmb_blackjack.num_btns + 1 
  759. end 
  760.  
  761. function gmb_blackjack_btn_text_size(text_h, max_text_width) 
  762. 	--Resizes text if we are over a max length 
  763. 	local width, height = element_get_actual_size(text_h) 
  764. 	 
  765. 	if width > max_text_width then 
  766. 		local scale_x, scale_y = vint_get_property(text_h, "scale") 
  767. 		local scale =  max_text_width / width  
  768. 		vint_set_property(text_h, "scale", scale , scale ) 
  769. 		 
  770. 		debug_print("vint", "scale: " .. scale .. "\n") 
  771. 	end 
  772. end 
  773.  
  774.  
  775. function gmb_blackjack_btn_highlight(idx) 
  776. 	vint_set_property(Gmb_blackjack.handles.glow_btn_twn, "target_handle", Gmb_blackjack.btns[idx].highlight_h) 
  777. 	--change the animation target, then change the buttons back to normal 
  778. 	for idx, val in Gmb_blackjack.btns do 
  779. 		vint_set_property(val.highlight_h, "visible", false) 
  780. 		vint_set_property(val.text_1_h, "tint", .77, .8, .81) 
  781. 		vint_set_property(val.text_2_h, "tint", .77, .8, .81) 
  782. 		vint_set_property(val.btn_h, "tint", 1, 1, 1) 
  783. 	end 
  784. 	--highlight the correct button 
  785. 	vint_set_property(Gmb_blackjack.btns[idx].highlight_h, "visible", true) 
  786. 	vint_set_property(Gmb_blackjack.btns[idx].text_1_h, "tint", .9, .74, .05) 
  787. 	vint_set_property(Gmb_blackjack.btns[idx].text_2_h, "tint", .9, .74, .05) 
  788. 	 
  789. end 
  790.  
  791. function gmb_blackjack_btns_clear() 
  792. 	--Clear out actual buttons 
  793. 	for idx, val in Gmb_blackjack.btns do 
  794. 		vint_object_destroy(val.btn_h) 
  795. 	end 
  796. 	 
  797. 	--Reset data 
  798. 	Gmb_blackjack.btns = {} 
  799. 	Gmb_blackjack.num_btns = 0 
  800. end 
  801.  
  802. function gmb_blackjack_btn_action(idx) 
  803. 	local action = Gmb_blackjack.btns[idx].action 
  804. 	action() 
  805. end 
  806.  
  807. --================================= 
  808. --Button actions 
  809. --================================= 
  810. function gmb_blackjack_action_deal() 
  811. 		 
  812. 	--Deal CB 
  813. 	gmb_blackjack_clear_deal_queue() 
  814. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_deal_cb", 0, 2) 
  815. 	gmb_blackjack_process_deal() 
  816. end 
  817.  
  818. function gmb_blackjack_action_hit() 
  819. 	--Hit CB 
  820. 	gmb_blackjack_clear_deal_queue() 
  821. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_deal_cb", 0, 3) 
  822. 	gmb_blackjack_process_deal() 
  823. end 
  824.  
  825. function gmb_blackjack_action_stand()	 
  826. 	--Stand CB 
  827. 	gmb_blackjack_clear_deal_queue() 
  828. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_deal_cb", 0, 4) 
  829. 	gmb_blackjack_process_deal() 
  830. end 
  831.  
  832. function gmb_blackjack_action_doubledown() 
  833. 	--Double Down CB 
  834. 	gmb_blackjack_clear_deal_queue() 
  835. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_deal_cb", 0, 5) 
  836. 	gmb_blackjack_process_deal() 
  837. end 
  838.  
  839. function gmb_blackjack_action_split() 
  840. 	--Split CB 
  841. 	gmb_blackjack_clear_deal_queue() 
  842. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_deal_cb", 0, 6) 
  843. 	gmb_blackjack_process_deal() 
  844. end 
  845.  
  846. function gmb_blackjack_action_newgame() 
  847. 	gmb_blackjack_table_init() 
  848. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_newgame_cb", 0, 7) 
  849. end 
  850.  
  851. function gmb_blackjack_action_quit() 
  852. 	--quit game dialog 
  853. 	dialog_box_confirmation("DIVERSION_BLACKJACK_DIALOG_QUIT_HEADER", "DIVERSION_BLACKJACK_DIALOG_QUIT_BODY", "gmb_blackjack_quit_dialog_cb") 
  854. end 
  855.  
  856.  
  857. --================================= 
  858. --New Game Updates 
  859. --====================== 
  860.  
  861. function gmb_blackjack_newgame_cb() 
  862. 	debug_print("vint", "gmb_blackjack_newgame_cb()\n") 
  863. 	--Increment and decrement bet to reset the bet 
  864. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_bet_change_cb", 0, 1) 
  865. 	vint_dataresponder_request("blackjack_responder", "gmb_blackjack_bet_change_cb", 0, 0) 
  866. 	gmb_blackjack_screen_state_set(GMB_INPUT_STATES.BET) 
  867. end 
  868.  
  869. --================================ 
  870. --DIALOG BOXES 
  871. --================================ 
  872. function gmb_blackjack_quit_dialog_cb(result, action) 
  873. 	if action ~= DIALOG_ACTION_CLOSE then 
  874. 		return 
  875. 	end 
  876. 	if result == 0 then 
  877. 	 
  878. 		vint_document_unload(vint_document_find("gmb_blackjack")) 
  879. 		--Quit Request to game 
  880. 		vint_dataresponder_request("blackjack_responder", "gmb_blackjack_quit_confirm", 0, 8) 
  881. 	else 
  882. 		--do nothing 
  883. 	end 
  884. end 
  885.  
  886. function gmb_blackjack_quit_confirm() 
  887. end 
  888.  
  889. function gmb_blackjack_not_enough_cash_dialog() 
  890. 	dialog_box_message("GAMBLING_POKER_DIALOG_NO_CASH_HEADER","GAMBLING_POKER_DIALOG_NO_CASH_BODY") 
  891. end 
  892.  
  893. function gmb_poker_quit_dialog_cb(result, action) 
  894. 	 
  895. end 
  896.  
  897.  
  898. --================================= 
  899. --Hand Info Updates 
  900. --================================= 
  901. function gmb_blackjack_hand_info_update_all() 
  902. 	--Can only be called during a deal queue 
  903. 	--UPDATE HAND INFO 
  904. 	for i = 0, 2 do 
  905. 		if Gmb_blackjack.deal_queue[i] ~= nil then 
  906. 		 
  907. 			local value_of_hand = Gmb_blackjack.deal_queue[i].value_of_hand 
  908. 			local hand_result = Gmb_blackjack.deal_queue[i].hand_result 
  909. 			local hand_string = value_of_hand 
  910. 			 
  911. 			--If the hand values are within a certain range then set the value  
  912. 			--to a specified string defined by an enum in C 
  913. 			if hand_result > 2 then 
  914. 				hand_string  = GMB_HAND_VALUES[hand_result] 
  915. 			end 
  916.  
  917. 			--Update value of each hand 
  918. 			gmb_blackjack_hand_info_update(i, hand_string)	 
  919. 		end 
  920. 	end 
  921. end 
  922.  
  923. function gmb_blackjack_hand_info_update(hand_enum, value) 
  924. 	local box_h = Gmb_blackjack.handles.hand_values[hand_enum] 
  925. 	local text_h = vint_object_find("card_value_txt", box_h) 
  926. 	 
  927. 	local offset_x, offset_y = vint_get_property(box_h, "anchor") 
  928. 	 
  929. 	local height = -1 
  930. 	 
  931. 	local str = "" .. value 
  932. 	if value ~= 0 then 
  933. 		vint_set_property(box_h, "visible", true)  
  934. 		vint_set_property(text_h, "text_tag", "" .. str) 
  935. 		 
  936. 		--update parts of box 
  937. 		local width, height = element_get_actual_size(text_h) 
  938. 		 
  939. 		local m_h = vint_object_find("mid", box_h) 
  940. 		local e_h = vint_object_find("e", box_h) 
  941. 		local ne_h = vint_object_find("ne", box_h) 
  942. 		local se_h = vint_object_find("se", box_h) 
  943. 		local n_h = vint_object_find("n", box_h) 
  944. 		local s_h = vint_object_find("s", box_h) 
  945. 		local sw_h = vint_object_find("sw", box_h) 
  946. 		local w_h = vint_object_find("w", box_h) 
  947. 		 
  948. 		--mid 
  949. 		local m_width, m_height = element_get_actual_size(m_h) 
  950. 		local se_x, se_y = vint_get_property(n_h, "source_se") 
  951. 		 
  952. 		--Floor & Cheat Width/Height Values 
  953. 		m_width = floor(m_width) 
  954. 		m_height = floor(m_height) 
  955. 		width = floor(width) - 9 
  956. 		height = floor(height)  
  957.  
  958. 		element_set_actual_size(m_h, width, height - 18) 
  959. 				 
  960. 		--North 
  961. 		vint_set_property(n_h, "source_se", width, se_y) 
  962. 		 
  963. 		--South 
  964. 		local se_x, se_y = vint_get_property(s_h, "source_se") 
  965. 		vint_set_property(s_h, "source_se", width, se_y) 
  966. 		 
  967. 		--North East 
  968. 		local x, y = vint_get_property(n_h, "anchor") 
  969. 		vint_set_property(ne_h, "anchor", x + width, y) 
  970. 		 
  971. 		--East 
  972. 		x, y = vint_get_property(m_h, "anchor")  
  973. 		vint_set_property(e_h, "anchor", x + width, y) 
  974. 		 
  975. 		--East + West Anchors 
  976. 		vint_set_property(e_h, "source_se", 24, height - 18) 
  977. 		vint_set_property(w_h, "source_se", 24, height - 18) 
  978. 		 
  979. 		--South East 
  980. 		x, y = vint_get_property(s_h, "anchor")  
  981. 		vint_set_property(se_h, "anchor", x + width, floor(height)) 
  982. 		vint_set_property(s_h, "anchor", x, floor(height)) 
  983. 		vint_set_property(sw_h, "anchor", -6, floor(height)) 
  984. 		 
  985. 		if height > 36 then 
  986. 			vint_set_property(box_h, "anchor", offset_x, offset_y - 35) 
  987. 		end 
  988. 		 
  989. 	else 
  990. 		debug_print("vint", "false, dont show hand info \n") 
  991. 		vint_set_property(box_h, "visible", false) 
  992. 	end	 
  993.  
  994. end 
  995.  
  996. function gmb_blackjack_hand_info_visible(hand_enum, is_visible) 
  997. 	debug_print("vint", "gmb_blackjack_hand_info_visible \n") 
  998. 	local box_h = Gmb_blackjack.handles.hand_values[hand_enum] 
  999. 	vint_set_property(box_h, "visible", false)  
  1000. 	 
  1001. 	local text_h = vint_object_find("card_value_txt", box_h) 
  1002. 	local width, height = element_get_actual_size(text_h) 
  1003. 	 
  1004. 	local offset_x, offset_y = vint_get_property(box_h, "anchor") 
  1005. 	 
  1006. 	if height > 36 then 
  1007. 		vint_set_property(box_h, "anchor", offset_x, offset_y + 35) 
  1008. 	end 
  1009. end	 
  1010.  
  1011. --================================= 
  1012. --Winning Payouts 
  1013. --================================== 
  1014. function gmb_blackjack_winnings_payouts(game_state_enum, dollars_winnings) 
  1015.  
  1016. 	local winning_str 
  1017.  
  1018. 	--Game is over so we need to display round status. 
  1019. 	if game_state_enum == 0 then 
  1020. 		winning_str = "DIVERSION_BLACKJACK_LOSE" 
  1021. 	elseif game_state_enum == 1 then 
  1022. 		winning_str = "DIVERSION_BLACKJACK_WIN" 
  1023. 	elseif game_state_enum == 2 then 
  1024. 		winning_str = "DIVERSION_BLACKJACK_PUSH" 
  1025. 	end 
  1026. 	 
  1027. 	--Set text of winnings payout 
  1028. 	vint_set_property(Gmb_blackjack.handles.winnings_type, "text_tag", winning_str) 
  1029. 	vint_set_property(Gmb_blackjack.handles.winnings_cash, "text_tag", "$" .. format_cash(dollars_winnings)) 
  1030. 		 
  1031. 	local t_width, t_height = element_get_actual_size(Gmb_blackjack.handles.winnings_type) 
  1032. 	local c_width, c_height = element_get_actual_size(Gmb_blackjack.handles.winnings_cash) 
  1033. 	local width, height 
  1034. 	if t_width > c_width then 
  1035. 		width = t_width 
  1036. 		height = t_height 
  1037. 	else 
  1038. 		width = c_width 
  1039. 		height = c_height 
  1040. 	end 
  1041. 	 
  1042. 	--Width calculations for setting the background box 
  1043. 	width = floor(width) 
  1044. 	height = floor(height) 
  1045. 	local x = floor(width/2) 
  1046. 	local y = floor(height/2) 
  1047. 	local box_shrink = 36 
  1048. 	 
  1049. 	local x_minus, y_minus 
  1050. 	x_minus = x * -1 
  1051. 	y_minus = y * -1 
  1052. 	 
  1053. 	local source_se_width, source_se_height 
  1054. 	 
  1055. 	--Set box background based on center 
  1056. 	element_set_actual_size(Gmb_blackjack.handles.winnings_box_c, width, height) 
  1057. 	 
  1058. 	vint_set_property(Gmb_blackjack.handles.winnings_box_nw, "anchor", x_minus, y_minus) 
  1059. 	vint_set_property(Gmb_blackjack.handles.winnings_box_n, "anchor", x_minus, y_minus) 
  1060. 	 
  1061. 	source_se_width, source_se_height = vint_get_property(Gmb_blackjack.handles.winnings_box_n, "source_se") 
  1062. 	 
  1063. 	if dollars_winnings == 0 then 
  1064. 		vint_set_property(Gmb_blackjack.handles.winnings_cash, "visible", false) 
  1065. 		vint_set_property(Gmb_blackjack.handles.winnings_box_c, "source_se", source_se_width, 8) 
  1066. 	else 
  1067. 		vint_set_property(Gmb_blackjack.handles.winnings_cash, "visible", true) 
  1068. 		vint_set_property(Gmb_blackjack.handles.winnings_box_c, "source_se", source_se_width, height) 
  1069. 		box_shrink = 0 
  1070. 	end 
  1071. 	 
  1072. 	vint_set_property(Gmb_blackjack.handles.winnings_box_n, "source_se", width, source_se_height) 
  1073. 	vint_set_property(Gmb_blackjack.handles.winnings_box_ne, "anchor", x, y_minus) 
  1074. 	 
  1075. 	vint_set_property(Gmb_blackjack.handles.winnings_box_w, "anchor", x_minus, y_minus) 
  1076. 	vint_set_property(Gmb_blackjack.handles.winnings_box_w, "source_se", width, height - box_shrink) 
  1077. 	vint_set_property(Gmb_blackjack.handles.winnings_box_e, "anchor", x, y_minus) 
  1078. 	vint_set_property(Gmb_blackjack.handles.winnings_box_e, "source_se", width, height - box_shrink) 
  1079. 	 
  1080. 	vint_set_property(Gmb_blackjack.handles.winnings_box_sw, "anchor", x_minus, y - box_shrink) 
  1081. 	vint_set_property(Gmb_blackjack.handles.winnings_box_s, "anchor", x_minus, y - box_shrink) 
  1082. 	vint_set_property(Gmb_blackjack.handles.winnings_box_s, "source_se", width, height - box_shrink) 
  1083. 	vint_set_property(Gmb_blackjack.handles.winnings_box_se, "anchor", x, y - box_shrink) 
  1084. 	 
  1085. 	if game_state_enum > 0 then 
  1086. 		--Win 
  1087. 		audio_play(GMB_BLACKJACK_AUDIO.WIN) 
  1088. 	else 
  1089. 		--lose 
  1090. 		audio_play(GMB_BLACKJACK_AUDIO.LOSE) 
  1091. 	end 
  1092. 	 
  1093. 	--Show box 
  1094. 	vint_set_property(Gmb_blackjack.handles.winnings, "visible", true) 
  1095. end 
  1096.  
  1097.  
  1098. --================================= 
  1099. --INPUT BLOCK 
  1100. --================================= 
  1101. Gmb_blackjack_input_blocked = 0 
  1102. function gmb_blackjack_input_block(block) 
  1103. 	if block == true then 
  1104. 		Gmb_blackjack_input_blocked = Gmb_blackjack_input_blocked + 1 
  1105. 	else 
  1106. 		Gmb_blackjack_input_blocked = Gmb_blackjack_input_blocked - 1 
  1107. 	end 
  1108. end 
  1109.  
  1110. function gmb_blackjack_input_is_bocked() 
  1111. 	if Gmb_blackjack_input_blocked > 0 then 
  1112. 		return true 
  1113. 	else 
  1114. 		return false 
  1115. 	end 
  1116. end 
  1117.  
  1118.  
  1119. --================================= 
  1120. --Animation Loop Callbacks 
  1121. --================================= 
  1122.  
  1123. function gmb_blackjack_loop_cash_anim() 
  1124. 	--Looping callback 
  1125. 	lua_play_anim(Gmb_blackjack.handles.results_anim) 
  1126. end 
  1127.  
  1128. --================================= 
  1129. --CASH UPDATES 
  1130. --================================= 
  1131. function gmb_blackjack_cash_update(di_h) 
  1132. 	local cash = vint_dataitem_get(di_h) 
  1133. 	Gmb_blackjack.cash = floor(cash) 
  1134. end 
  1135.  
  1136. function gmb_blackjack_process() 
  1137. 	local display_cash = Gmb_blackjack.cash - 1 --Subtract one so it gets formatted in the loop. 
  1138. 	while true do 
  1139. 		thread_yield() 
  1140. 		-- Animate Cash 
  1141. 		if display_cash ~= Gmb_blackjack.cash  then 
  1142. 			local diff_cash = Gmb_blackjack.cash  - display_cash 
  1143. 			 
  1144. 			if diff_cash > 5 or diff_cash < -5 then 
  1145. 				diff_cash = floor(diff_cash * 0.5) 
  1146. 			end 
  1147. 			 
  1148. 			display_cash = display_cash + diff_cash 
  1149. 			vint_set_property(Gmb_blackjack.handles.cash, "text_tag", "$" .. format_cash(display_cash)) 
  1150. 		end 
  1151. 	end 
  1152. end 
  1153.  
  1154. --================================= 
  1155. --Build fade events for cards) 
  1156. --================================= 
  1157. function gmb_blackjack_card_set_fade(card_index, card_h) 
  1158. 	--Create a tween for the card 
  1159. 	local twn_h = vint_object_clone(Gmb_blackjack.anims.card_twn_fade_in) 
  1160. 	 
  1161. 	--Offset time based on how many cards are delt this round 
  1162. 	vint_set_property(twn_h, "start_time", .2 * card_index) 
  1163. 	 
  1164. 	--Retarget 
  1165. 	vint_set_property(twn_h, "target_handle", card_h) 
  1166. 	 
  1167. 	--Hide object 
  1168. 	vint_set_property(card_h, "alpha", 0) 
  1169. 	vint_set_property(twn_h, "start_event", "gmb_blackjack_sound_dead_card") 
  1170.  
  1171. 	Gmb_blackjack.card_twns[twn_h] = true 
  1172. end 
  1173.  
  1174.  
  1175.  
  1176. function gmb_blackjack_sound_dead_card() 
  1177. 	audio_play(GMB_BLACKJACK_AUDIO.DEAL_CARD) 
  1178. end 
  1179.  
  1180. function gmb_blackjack_cards_complete() 
  1181. 	--clear all the tweens 
  1182. 	for idx, val in Gmb_blackjack.card_twns do 
  1183. 		vint_object_destroy(idx) 
  1184. 	end 
  1185. 	Gmb_blackjack.card_twns = {} 
  1186. 	 
  1187. 	--Unblock inputs 
  1188. 	gmb_blackjack_input_block(false) 
  1189. 	 
  1190. 	--show hand info of the first player 
  1191. 	gmb_blackjack_hand_info_update_all() 
  1192. 	 
  1193. 	--Update game status 
  1194. 	gmb_blackjack_game_status_update() 
  1195. end 
  1196.  
  1197. --================================= 
  1198. --ALIGN BUTTONS 
  1199. --================================= 
  1200. function gmb_blackjack_btntips_align() 
  1201. 	local btn_spacing = 1 
  1202. 	local grp_spacing = 30 
  1203. 	local h = vint_object_find("btn_tips") 
  1204. 	local btn_b_h = vint_object_find("btn_b", h) 
  1205. 	local text_b_h = vint_object_find("b_text", h) 
  1206. 	local a_text_h = vint_object_find("a_text", h) 
  1207. 	local a_text_width, a_text_height = element_get_actual_size(a_text_h) 
  1208. 	local btn_b_width, btn_b_height = element_get_actual_size(btn_b_h) 
  1209. 	local a_text_x, a_text_y = vint_get_property(a_text_h, "anchor") 
  1210. 	 
  1211. 	--B Btn  
  1212. 	local x = a_text_x + a_text_width + grp_spacing 
  1213. 	local y = a_text_y 
  1214. 	vint_set_property(btn_b_h, "anchor", x, y) 
  1215. 	 
  1216. 	--B Text 
  1217. 	local x = x + btn_b_width/2 + btn_spacing 
  1218. 	vint_set_property(text_b_h, "anchor", x, y) 
  1219. 	debug_print("vint", "btn tips\n") 
  1220. end 
  1221.  
  1222. --================================== 
  1223. -- 
  1224. --================================== 
  1225.