Vsmj.c
上传用户:lqx1163
上传日期:2014-08-13
资源大小:9183k
文件大小:150k
源码类别:

MTK

开发平台:

C/C++

  1. /*****************************************************************************
  2. *  Copyright Statement:
  3. *  --------------------
  4. *  This software is protected by Copyright and the information contained
  5. *  herein is confidential. The software may not be copied and the information
  6. *  contained herein may not be used or disclosed except with the written
  7. *  permission of MediaTek Inc. (C) 2002
  8. *
  9. *****************************************************************************/
  10. /*****************************************************************************
  11.  * Filename:
  12.  * ---------
  13.  * vsmj.c
  14.  *
  15.  * Project:
  16.  * --------
  17.  *   Maui
  18.  *
  19.  * Description:
  20.  * ------------
  21.  *  Game 
  22.  *
  23.  * Author:
  24.  * -------
  25.  * -------
  26.  * -------
  27.  *
  28.  ****************************************************************************/
  29. #include "MMI_features.h"
  30. #include "GameDefs.h"
  31. #ifdef IS_VSMJ_BASE_GAME
  32. #include "GameInc.h"
  33. #include "VsmjProts.h"
  34. #include "VsmjDefs.h"
  35. /* gdi */
  36. #include "lcd_sw_rnd.h"
  37. #include "gdi_include.h"
  38. #include "gd_primitive.h"
  39. /* gdi */
  40. #ifdef __MMI_TVOUT__
  41. #include "mdi_datatype.h"
  42. #include "mdi_tv.h"
  43. #endif /* __MMI_TVOUT__ */
  44. #ifdef __MMI_TOUCH_SCREEN__
  45. #include "wgui_touch_screen.h"
  46. #endif
  47. /* debug term */
  48. //#define VSMJ_DEBUG_ON
  49. /* debug term */
  50. /***************************************************************************** 
  51. * Define // 2players
  52. *****************************************************************************/
  53. #define TABLE_NUM (144)
  54. #define NUM_PLAYER (2)
  55. /* render part,frame */
  56. #define SCORE_POS_X (30)
  57. #define SCORE_POS_Y (30)
  58. #define SCORE_UNIT_HEIGHT (30)
  59. #define SCORE_FRAME (5)
  60. #define SCORE_WIDTH (200)
  61. #define SCORE_HEIGHT (270)
  62. #define USER_TILE_WIDTH (18)
  63. #define USER_TILE_HEIGHT (25)
  64. #define TABLE_TILE_WIDTH (7)
  65. #define TABLE_TILE_HEIGHT (10)
  66. #define TABLE_UPDOWN_POS_X (280)
  67. #define TABLE_UP_POS_Y (50)
  68. #define TABLE_DOWN_POS_Y (200)
  69. #define TABLE_LEFTRIGHT_POS_Y (180)
  70. #define TABLE_LEFT_POS_X (40)
  71. #define TABLE_RIGHT_POS_X (195)
  72. #define GRAVE_POS_X (7)
  73. #define GRAVE_POS_Y (53)
  74. const S16 USER_LOCK_POS_X[2]={1,301};
  75. const S16 USER_LOCK_POS_Y[2]={215,1};
  76. const S16 USER_FLOWER_POS_X[2]={1,175};
  77. const S16 USER_FLOWER_POS_Y[2]={179,27};
  78. const S16 USER_OWN_POS_X[2]={1,31};
  79. const S16 USER_OWN_POS_Y[2]={215,1};
  80. const S16 USER_HIGHLIGHT_POS_X[2]={301,1};
  81. const S16 USER_HIGHLIGHT_POS_Y[2]={215,1};
  82. #define MMI_GX_VSMJ_NUM_POSITION_X (188)
  83. #define MMI_GX_VSMJ_NUM_POSITION_Y (181)
  84. #define MMI_GX_VSMJ_RECT_POS_X1 (144)
  85. #define MMI_GX_VSMJ_RECT_POS_Y1 (172)
  86. #define MMI_GX_VSMJ_RECT_POS_X2 (201)
  87. #define MMI_GX_VSMJ_RECT_POS_Y2 (205)
  88. #define MMI_GX_VSMJ_LEFT_BRICK_POS_X (148)
  89. #define MMI_GX_VSMJ_LEFT_BRICK_POS_Y (176)
  90. #define SIGN_POS_X (10)
  91. #define SIGN_POS_Y (110)
  92. #define PLAYER_SPECIAL_POS_X (40)
  93. #define PLAYER_SPECIAL_POS_Y (70)
  94. #define PLAYER_SPECIAL_UNIT_WIDTH (30)
  95. #define PLAYER_SPECIAL_UNIT_HEIGHT (30)
  96. const S16 HIGHLIGHT_FREE_POS_X[2]={301,1};
  97. const S16 HIGHLIGHT_FREE_POS_Y[2]= {185,27};
  98. #define DICES13_OFFSET 27  //KP Jerry add for 13dices on 2007-3-22
  99. /***************************************************************************** 
  100. * Typedef 
  101. *****************************************************************************/
  102. /* enum */
  103. typedef enum{
  104. MOVE_PICK_TILE=0,
  105. MOVE_PICK_CHECK,
  106. MOVE_PICK_SPECIAL,
  107. MOVE_REPLENISH_TILE,
  108. MOVE_DISCARD_TILE,
  109. MOVE_DISCARD_CHECK_START,
  110. MOVE_DISCARD_CHECK_CONTINUE,
  111. MOVE_DISCARD_SPECIAL,
  112. MOVE_DECLARE_HOU,
  113. MOVE_RESULT,
  114. MOVE_LIOU_GU
  115. } gx_vsmj_gamemove_enum;
  116. typedef enum{
  117. PLAYER_1=0,
  118. COM_1,
  119. COM_2,
  120. COM_3
  121. } gx_vsmj_user_id_enum;
  122. typedef enum{
  123. PP_OWN_0=0,
  124. PP_OWN_1,
  125. PP_OWN_2,
  126. PP_OWN_3,
  127. PP_OWN_4,
  128. PP_OWN_5,
  129. PP_OWN_6,
  130. PP_OWN_7,
  131. PP_OWN_8,
  132. PP_OWN_9,
  133. PP_OWN_10,
  134. PP_OWN_11,
  135. PP_OWN_12,
  136. PP_OWN_13,
  137. PP_OWN_14,
  138. PP_OWN_15,
  139. PP_OWN_16,
  140. PP_HIGHLIGHT,
  141. PP_SPECIAL_HOU,
  142. PP_SPECIAL_PON,
  143. PP_SPECIAL_EAT_0,
  144. PP_SPECIAL_EAT_1,
  145. PP_SPECIAL_EAT_2,
  146. PP_SPECIAL_BUGUN,
  147. PP_SPECIAL_HANDGUN_0,
  148. PP_SPECIAL_HANDGUN_1,
  149. PP_SPECIAL_HANDGUN_2,
  150. PP_SPECIAL_HANDGUN_3,
  151. PP_SPECIAL_CANCEL,
  152. PP_ELSE,
  153. PP_PENNOTDOWN
  154. } gx_vsmj_pen_pos_enum;
  155. typedef enum{
  156. TE_EAST=0,
  157. TE_WEST,
  158. TE_SOUTH,
  159. TE_NORTH,
  160. TE_CHUNG,
  161. TE_FA,
  162. TE_BAI,
  163. NU_1W,
  164. NU_2W,
  165. NU_3W,
  166. NU_4W,
  167. NU_5W,
  168. NU_6W,
  169. NU_7W,
  170. NU_8W,
  171. NU_9W,
  172. NU_1S,
  173. NU_2S,
  174. NU_3S,
  175. NU_4S,
  176. NU_5S,
  177. NU_6S,
  178. NU_7S,
  179. NU_8S,
  180. NU_9S,
  181. NU_1T,
  182. NU_2T,
  183. NU_3T,
  184. NU_4T,
  185. NU_5T,
  186. NU_6T,
  187. NU_7T,
  188. NU_8T,
  189. NU_9T,
  190. FL_SPRING,
  191. FL_SUMMER,
  192. FL_AUTUMN,
  193. FL_WINTER,
  194. FL_M,
  195. FL_L,
  196. FL_Z,
  197. FL_J,
  198. TILE_TOTALID,
  199. TILE_EMPTY,
  200. WALL_EAT,
  201. WALL_PON,
  202. WALL_GUNSHOW,
  203. WALL_GUNHIDE,
  204. WALL_END
  205. } gx_vsmj_tile_id_enum;
  206. typedef enum{
  207. CHK_NOTUSED=0,
  208. CHK_USED,
  209. CHK_QUAD,
  210. CHK_TRIPLE,
  211. CHK_LINE_L,
  212. CHK_LINE_M,
  213. CHK_LINE_R,
  214. CHK_PAIR,
  215. CHK_INHLINE_L,
  216. CHK_INHLINE_R,
  217. CHK_OUTHLINE_L,
  218. CHK_OUTHLINE_R,
  219. CHK_SINGLE,
  220. CHK_MISSION_OCCUPY,
  221. CHK_END,
  222. POS_DESK,
  223. POS_GRAVE,
  224. POS_HAND,
  225. POS_HIGH,
  226. POS_LOCK
  227. } gx_vsmj_chk_status_enum;
  228. typedef enum{
  229. SIGN_OFF=0,
  230. SIGN_EAT,
  231. SIGN_PON,
  232. SIGN_GUN,
  233. SIGN_HOU,
  234. SIGN_LIOU_GU
  235. } gx_vsmj_sign_enum;
  236. typedef enum{
  237. SCORE_8_FLOWER=0,
  238. SCORE_7_1_FLOWER,
  239. SCORE_PICK_BY_OWN,
  240. SCORE_PICK_BY_REPLENISH,
  241. SCORE_MEN_CHIN,
  242. SCORE_MEN_CHIN_ZE_MO,
  243. SCORE_FLOWER_SEASON_SET,
  244. SCORE_FLOWER_PLANT_SET,
  245. SCORE_SEA_MOON,
  246. SCORE_CHUAN_CHIO,
  247. SCORE_BIG_3_YUANG,
  248. SCORE_SMALL_3_YUANG,
  249. SCORE_3_YUANG_CHUNG,
  250. SCORE_3_YUANG_FA,
  251. SCORE_3_YUANG_BAI,
  252. SCORE_BIG_4_WIND,
  253. SCORE_SMALL_4_WIND,
  254. SCORE_3_ENKE,
  255. SCORE_4_ENKE,
  256. SCORE_5_ENKE,
  257. SCORE_NUM_1_COLOR,
  258. SCORE_MIX_1_COLOR,
  259. SCORE_PAIR_PAIR_HOU,
  260. SCORE_TOTALNUM
  261. } gx_vsmj_score_enum;
  262. typedef enum{
  263. COM_STRATEGY_1,
  264. COM_STRATEGY_2
  265. } gx_vsmj_com_strategy_enum;
  266. /* basic game variable struct */
  267. typedef struct{
  268. BOOL is_gameover;
  269. BOOL is_new_game;
  270. U8 game_level;
  271. U8 game_type;     //KP Jerry add on 2007-3-23
  272. S16 game_grade;
  273. U16 timer_elapse;
  274. } gx_vsmj_context_struct;
  275. /* struct */
  276. typedef struct{
  277. gx_vsmj_tile_id_enum id;
  278. gx_vsmj_chk_status_enum pos;
  279. } gx_vsmj_tile_struct;
  280. typedef struct{
  281. gx_vsmj_tile_struct *hand[18];
  282. gx_vsmj_tile_struct *flower[9];
  283. gx_vsmj_tile_struct *lock[26];
  284. gx_vsmj_user_id_enum id;
  285. BOOL can_hou;
  286. BOOL can_bugun;
  287. BOOL can_handgun[4];
  288. BOOL can_pon;
  289. BOOL can_eat[3];
  290. gx_vsmj_tile_id_enum handgun_id[4];
  291. U16  start_pos_x;
  292. U16  hand_left;
  293. } gx_vsmj_user_struct;
  294. /***************************************************************************** 
  295. * Local Function
  296. *****************************************************************************/
  297. void mmi_gx_vsmj_enter_game(void); /* entry function of the game */
  298. void mmi_gx_vsmj_init_game(void);
  299. void mmi_gx_vsmj_exit_game(void);
  300. void mmi_gx_vsmj_render(void);
  301. void mmi_gx_vsmj_framemove(void);
  302. void mmi_gx_vsmj_draw_gameover(void);
  303. void mmi_gx_vsmj_gameover(void);
  304. S16 mmi_gx_vsmj_calc_best_grade(S16 old_grade, S16 new_grade);
  305. void mmi_gx_vsmj_cyclic_timer(void);
  306. BOOL mmi_gx_vsmj_check_eat(gx_vsmj_user_struct *user_ptr,U8 type);
  307. BOOL mmi_gx_vsmj_check_pon(gx_vsmj_user_struct *user_ptr);
  308. BOOL mmi_gx_vsmj_check_bugun(gx_vsmj_user_struct *user_ptr);
  309. BOOL mmi_gx_vsmj_check_handgun(gx_vsmj_user_struct *user_ptr);
  310. BOOL mmi_gx_vsmj_check_hou(gx_vsmj_user_struct *user_ptr);
  311. BOOL mmi_gx_vsmj_check_multi(U8 multi_time,gx_vsmj_tile_id_enum target_id,gx_vsmj_tile_struct* tile_set_ptr[]);
  312. BOOL mmi_gx_vsmj_check_link(U8 link_time,gx_vsmj_tile_id_enum target_id, gx_vsmj_tile_struct* tile_set_ptr[]);
  313. void mmi_gx_vsmj_player_move(gx_vsmj_user_struct *user_ptr);
  314. void mmi_gx_vsmj_com_move(gx_vsmj_user_struct *user_ptr);
  315. void mmi_gx_vsmj_com_think_count_value(gx_vsmj_chk_status_enum status,S16 *value);
  316. void mmi_gx_vsmj_stagegen(void);
  317. void mmi_gx_vsmj_throwdice(void);
  318. void mmi_gx_vsmj_sendtile(void); /* send tiles to player and com at game start */
  319. void mmi_gx_vsmj_render_table(void);
  320. void mmi_gx_vsmj_render_user(gx_vsmj_user_struct *user_ptr);
  321. void mmi_gx_vsmj_render_highlight(void);
  322. void mmi_gx_vsmj_render_special_bar(void);
  323. void mmi_gx_vsmj_render_sign(void);
  324. void mmi_gx_vsmj_render_pen_cursor(void);
  325. void mmi_gx_vsmj_render_scorescreen(void);
  326. void mmi_gx_vsmj_discard_tile(gx_vsmj_tile_id_enum target_id,gx_vsmj_user_struct *user_ptr);
  327. void mmi_gx_vsmj_pick_tile(gx_vsmj_user_struct *user_ptr);
  328. void mmi_gx_vsmj_replenish_tile(gx_vsmj_user_struct *user_ptr);
  329. void mmi_gx_vsmj_handgun(gx_vsmj_tile_id_enum target_id,gx_vsmj_user_struct *user_ptr);
  330. void mmi_gx_vsmj_pon(gx_vsmj_user_struct *user_ptr);
  331. void mmi_gx_vsmj_eat(gx_vsmj_user_struct *user_ptr,U8 type);
  332. void mmi_gx_vsmj_bugun(gx_vsmj_user_struct *user_ptr);
  333. void mmi_gx_vsmj_declare_hou(gx_vsmj_user_struct *user_ptr);
  334. void mmi_gx_vsmj_count_score(gx_vsmj_user_struct *user_ptr);
  335. void mmi_gx_vsmj_com_think_st_1(gx_vsmj_user_struct *user_ptr);
  336. void mmi_gx_vsmj_com_think_st_2(gx_vsmj_user_struct *user_ptr);
  337. S16 mmi_gx_vsmj_find_no_with_tile_id(gx_vsmj_tile_id_enum target_id,gx_vsmj_tile_struct* tile_set_ptr[]);
  338. void mmi_gx_vsmj_insert_tile(gx_vsmj_tile_struct *tile_target_ptr,gx_vsmj_tile_struct *tile_set_ptr[]);
  339. BOOL mmi_gx_vsmj_eliminate_tile(gx_vsmj_tile_id_enum target_id ,gx_vsmj_tile_struct* tile_set_ptr[]);
  340. void mmi_gx_vsmj_sort_tile(gx_vsmj_tile_struct* tile_set_ptr[]);
  341. void mmi_gx_vsmj_pick_tile(gx_vsmj_user_struct *user_ptr);
  342. BOOL mmi_gx_vsmj_hou_trial(gx_vsmj_tile_struct *tile_set_ptr[],BOOL pair_used);
  343. BOOL mmi_gx_vsmj_set_chk(gx_vsmj_tile_id_enum target_id, gx_vsmj_chk_status_enum original_status,
  344. gx_vsmj_chk_status_enum to_status,gx_vsmj_tile_struct *tile_set_ptr[]);
  345. S16 mmi_gx_vsmj_com_think_check_ting_num(gx_vsmj_tile_struct *tile_set[]);
  346. void mmi_gx_vsmj_check_connection(gx_vsmj_tile_struct *tile_set_ptr[], gx_vsmj_chk_status_enum *temp_ptr);
  347. void mmi_gx_vsmj_com_think_count_value(gx_vsmj_chk_status_enum status,S16 *value);
  348. void mmi_gx_vsmj_reset_chk_all_stat_only(gx_vsmj_chk_status_enum *chk_set_ptr);
  349. void mmi_gx_vsmj_reset_chk(gx_vsmj_tile_struct *tile_set_ptr[]);
  350. void mmi_gx_vsmj_reset_chk_all(gx_vsmj_tile_struct *tile_set_ptr[]);
  351. #ifdef VSMJ_DEBUG_ON
  352. void mmi_gx_vsmj_debug(void);
  353. #endif
  354. /* Game play functions */
  355. /* key functions */
  356. #ifdef __MMI_TOUCH_SCREEN__
  357. void mmi_gx_vsmj_pen_down_hdlr(mmi_pen_point_struct pos);
  358. void mmi_gx_vsmj_pen_up_hdlr(mmi_pen_point_struct pos);
  359. #endif
  360. /* key functions */
  361. /***************************************************************************** 
  362. * Local Variable
  363. *****************************************************************************/
  364. static gx_vsmj_context_struct g_gx_vsmj_context =
  365. {
  366. FALSE, /* is_gameover */
  367. TRUE, /* is_new_game */
  368. 0, /* game_level */
  369. 0, /* game_type */     //KP Jerry add on 2007-3-23
  370. 0, /* game_grade */
  371. 200 /* timer_elapse */
  372. };
  373. gx_vsmj_tile_struct tile_table[TABLE_NUM];
  374. gx_vsmj_tile_struct wall_eat =
  375. {
  376. WALL_EAT,
  377. POS_HAND
  378. };
  379. gx_vsmj_tile_struct wall_pon =
  380. {
  381. WALL_PON,
  382. POS_HAND
  383. };
  384. gx_vsmj_tile_struct wall_gunshow =
  385. {
  386. WALL_GUNSHOW,
  387. POS_HAND
  388. };
  389. gx_vsmj_tile_struct wall_gunhide =
  390. {
  391. WALL_GUNHIDE,
  392. POS_HAND
  393. };
  394. gx_vsmj_tile_struct wall_end =
  395. {
  396. WALL_END,
  397. CHK_END
  398. };
  399. gx_vsmj_tile_struct tile_empty =
  400. {
  401. TILE_EMPTY,
  402. POS_HAND
  403. };
  404. gx_vsmj_user_struct user[NUM_PLAYER];
  405. gx_vsmj_com_strategy_enum com_strategy[NUM_PLAYER];
  406. gx_vsmj_user_struct *last_user= &user[0];
  407. gx_vsmj_user_struct *current_user = &user[0];
  408. gx_vsmj_tile_struct *highlight = &wall_end;
  409. gx_vsmj_tile_struct *grave[96]; /*at most 144-16-16-2*8(liou gu) =96 */
  410. S16 start_index=0; /* save the position of table to pick (num acc. to scr) */
  411. S16 end_index=TABLE_NUM-1; /* save the position of table to replenish (num acc. to scr )*/
  412. S16 grave_index=0;
  413. S16 table_offset=0;
  414. S16 gun_times=0; /* used to determine how many tiles left on table => liou gu */
  415. S16 game_delay=0;
  416. gx_vsmj_gamemove_enum game_move;
  417. gx_vsmj_pen_pos_enum pen_pos=PP_PENNOTDOWN;
  418. gx_vsmj_sign_enum sign;
  419. U8 sign_delay=0;
  420. S16 pen_last_x=0;
  421. S16 pen_last_y=0;
  422. /*score relative */ /*haven't put in init!!!!!!!!*/
  423. BOOL score_8_flower;
  424. BOOL score_7_1_flower;
  425. BOOL score_last_by_own;
  426. BOOL score_hou_by_replenish;
  427. BOOL bonus_hou[SCORE_TOTALNUM];
  428. /*score relative */ /*haven't put in init!!!!!!!!*/
  429. #ifdef VSMJ_DEBUG_ON
  430. S16 gx_vsmj_debug[40];
  431. #endif
  432. //KP Jerry add for avoid screen-display-error when vsmj is playing on 2007-3-24 start
  433. BOOL VsmjPlayFlag = 0;
  434. BOOL mmi_gx_vsmj_getplaystate(void)
  435. {
  436. //return ((!g_gx_vsmj_context.is_gameover)&&(*(GFX.game_data.is_new_game)));
  437. return VsmjPlayFlag;
  438. }
  439. void mmi_gx_vsmj_setplaystate(void)
  440. {
  441. VsmjPlayFlag = 1;
  442. }
  443. void mmi_gx_vsmj_clearplaystate(void)
  444. {
  445. VsmjPlayFlag = 0;
  446. }
  447. //KP Jerry add for avoid screen-display-error when vsmj is playing on 2007-3-24 end
  448. /**************************************************************
  449. FUNCTION NAME : mmi_gx_vsmj_enter_gfx()
  450.    PURPOSE : Set Game Framework (GFX) Parameter
  451. INPUT PARAMETERS : nil
  452. OUTPUT PARAMETERS : nil
  453. RETURNS : void
  454. REMARKS : nil
  455. ***************************************************************/
  456. void mmi_gx_vsmj_enter_gfx(void)
  457. {
  458. /* Game menu */
  459. GFX.game_data.game_img_id = IMG_ID_GX_VSMJ_GAME_ICON; /* game icon img ID */
  460. GFX.game_data.game_str_id = STR_ID_GX_VSMJ_GAME_NAME; /* game name string ID */
  461. GFX.game_data.menu_resume_str_id = STR_GAME_RESUME; /* "Resume" string ID */
  462. GFX.game_data.menu_new_str_id = STR_GAME_NEW; /* "New Game" string ID */
  463. GFX.game_data.menu_level_str_id = STR_GAME_LEVEL; /* "Game Level" string ID */
  464. GFX.game_data.menu_grade_str_id = STR_GAME_GRADE; /* "Best Grade" string ID */
  465. GFX.game_data.menu_help_str_id = STR_GAME_HELP; /* "Game Help" string ID */
  466. //KP Jerry add for vsmj type 2007-3-21 start
  467. GFX.game_data.menu_type_str_id = STR_GAME_TYPE; /* "Game type" string ID */
  468. GFX.game_data.type_count                            = 2;
  469. GFX.game_data.type_str_id_list[0] = STR_ID_GX_VSMJ_TYPE_13DICES;          /* type string ID */
  470. GFX.game_data.type_str_id_list[1] = STR_ID_GX_VSMJ_TYPE_16DICES; /* type string ID */
  471. //GFX.game_data.type_nvram_id = NVRAM_GX_VSMJ_TYPE; /* current lvl idnex  in NVRAM (byte) */
  472. GFX.game_data.type_index_ptr = (U8*)(&g_gx_vsmj_context.game_type); /* ptr to current type index (U8*) */
  473. //KP Jerry add for vsmj type 2007-3-21 end
  474. /* level / grade */
  475. GFX.game_data.level_count = 2; /* how many levels */
  476. GFX.game_data.level_str_id_list[0] = STR_ID_GX_VSMJ_LEVEL_NORMAL; /* level string ID */
  477. GFX.game_data.level_str_id_list[1] = STR_ID_GX_VSMJ_LEVEL_CPUVSCPU; /* level string ID */
  478. /* add slot in NVRAMEnum.h */
  479. GFX.game_data.grade_nvram_id_list[0] = NVRAM_GX_VSMJ_NORMAL_SCORE; /* grade slot in NVRAM (short)*/
  480. GFX.game_data.grade_nvram_id_list[1] = NVRAM_GX_VSMJ_CPUVSCPU_SCORE; /* grade slot in NVRAM */
  481. GFX.game_data.level_nvram_id = NVRAM_GX_VSMJ_LEVEL; /* current lvl idnex  in NVRAM (byte) */
  482. /* help */
  483. GFX.game_data.help_str_id = STR_ID_GX_VSMJ_HELP_DESCRIPTION; /* help description string id */
  484. /* misc */
  485. GFX.game_data.grade_value_ptr = (S16*)(&g_gx_vsmj_context.game_grade); /* current level's grade (S16*) */
  486. GFX.game_data.level_index_ptr = (U8*)(&g_gx_vsmj_context.game_level); /* ptr to current level index (U8*) */
  487. GFX.game_data.is_new_game = (BOOL*)(&g_gx_vsmj_context.is_new_game); /* ptr to new game flag (BOOL*) */ 
  488. /* function ptr */
  489. GFX.game_data.best_grade_func_ptr = mmi_gx_vsmj_calc_best_grade; /* function to calculate best grade */
  490. GFX.game_data.enter_game_func_ptr = mmi_gx_vsmj_enter_game; /* function to enter new game */
  491. GFX.game_data.exit_game_func_ptr = mmi_gx_vsmj_exit_game; /* function to exit game */
  492. GFX.game_data.draw_gameover_func_ptr = mmi_gx_vsmj_draw_gameover; /* function to draw gameover screen */
  493. /* some flags */
  494. GFX.game_data.is_keypad_audio_enable = FALSE; /* play keypad tone or not */
  495. mmi_gfx_entry_menu_screen();
  496. }
  497. /**************************************************************
  498. FUNCTION NAME : mmi_gx_vsmj_calc_best_grade()
  499.    PURPOSE : Calculate new best grade [Callback required by GFX]
  500. INPUT PARAMETERS : S32 old_grade
  501.   S32 new_grade 
  502. OUTPUT PARAMETERS : nil
  503. RETURNS : void
  504. REMARKS : nil
  505. ***************************************************************/
  506. S16 mmi_gx_vsmj_calc_best_grade(S16 old_grade, S16 new_grade)
  507. {
  508. return (old_grade+new_grade);
  509. }
  510. /**************************************************************
  511. FUNCTION NAME : mmi_gx_vsmj_gameover()
  512.    PURPOSE : Draw Gameover Screen [Callback required by GFX]
  513. INPUT PARAMETERS : nil
  514.  
  515. OUTPUT PARAMETERS : nil
  516. RETURNS : void
  517. REMARKS : nil
  518. ***************************************************************/
  519. void mmi_gx_vsmj_gameover(void)
  520. {
  521. g_gx_vsmj_context.is_gameover = TRUE;
  522. g_gx_vsmj_context.is_new_game = TRUE;
  523. /* call this function to draw gameover screen */
  524. // gui_cancel_timer(mmi_gx_vsmj_cyclic_timer); /* cancle the looping timer */
  525. // gdi_draw_solid_rect(0,0,240,320,GDI_COLOR_WHITE);
  526. mmi_gfx_entry_gameover_screen();
  527. }
  528. /**************************************************************
  529. FUNCTION NAME : mmi_gx_vsmj_draw_gameover()
  530.    PURPOSE : Draw Gameover Screen [Callback required by GFX]
  531. INPUT PARAMETERS : nil
  532.  
  533. OUTPUT PARAMETERS : nil
  534. RETURNS : void
  535. REMARKS : nil
  536. ***************************************************************/
  537. void mmi_gx_vsmj_draw_gameover(void)
  538. {
  539. /* put gameover sound here*/
  540. mmi_gfx_draw_gameover_screen(IMG_ID_GX_VSMJ_GOTEXT, IMG_ID_GX_VSMJ_GRADESMAP, IMG_ID_GX_VSMJ_GOPIC, g_gx_vsmj_context.game_grade);
  541. }
  542. /**************************************************************
  543. FUNCTION NAME : mmi_gx_vsmj_enter_game()
  544.    PURPOSE : Enter Game [Callback required by GFX]
  545. INPUT PARAMETERS : nil
  546.  
  547. OUTPUT PARAMETERS : nil
  548. RETURNS : void
  549. REMARKS : nil
  550. ***************************************************************/
  551. void mmi_gx_vsmj_enter_game(void)
  552. {
  553. gdi_layer_set_rotate(1); /* dont write 1 !! use enum  */
  554. gdi_layer_resize(LCD_HEIGHT,LCD_WIDTH);
  555. mmi_gx_vsmj_setplaystate();     //KP Jerry add for avoid screen-display-error when vsmj is playing on 2007-3-24
  556. #ifdef __MMI_TVOUT__
  557. if(mdi_tvout_is_enable())
  558. {
  559. mdi_tvout_set_owner(MDI_TV_OWNER_MMI); 
  560. mdi_tvout_set_mode(MDI_TV_MODE_OWNER_DRAW, LCD_HEIGHT, LCD_WIDTH);
  561. }
  562. #endif
  563. if(g_gx_vsmj_context.is_new_game == TRUE )
  564. mmi_gx_vsmj_init_game(); /* is new game, otherwise resume game */
  565. g_gx_vsmj_context.is_new_game = FALSE;
  566. g_gx_vsmj_context.is_gameover = FALSE;
  567. /* keyhandler */
  568. #ifdef __MMI_TOUCH_SCREEN__
  569. wgui_register_pen_down_handler(mmi_gx_vsmj_pen_down_hdlr);
  570. wgui_register_pen_up_handler(mmi_gx_vsmj_pen_up_hdlr);
  571. #endif
  572. /* keyhandler */
  573. //KP Jerry add for vsmj type 2007-3-21 start
  574. if( *GFX.game_data.type_index_ptr == 0) ////13dices
  575. g_gx_vsmj_context.timer_elapse = 400;
  576. else
  577. g_gx_vsmj_context.timer_elapse = 200;
  578. //KP Jerry add for vsmj type 2007-3-21 end
  579. mmi_gx_vsmj_cyclic_timer();
  580. }
  581. /**************************************************************
  582. FUNCTION NAME : mmi_gx_vsmj_exit_game()
  583.    PURPOSE : Exit Game [Callback required by GFX]
  584. INPUT PARAMETERS : nil
  585.  
  586. OUTPUT PARAMETERS : nil
  587. RETURNS : void
  588. REMARKS : nil
  589. ***************************************************************/
  590. void mmi_gx_vsmj_exit_game(void)
  591. {
  592. gdi_layer_set_rotate(0);
  593. gdi_layer_resize(LCD_WIDTH,LCD_HEIGHT);
  594. mmi_gx_vsmj_clearplaystate();     //KP Jerry add for avoid screen-display-error when vsmj is playing on 2007-3-24
  595. #ifdef __MMI_TVOUT__
  596. mdi_tvout_set_owner(MDI_TV_OWNER_GDI); 
  597. mdi_tvout_set_mode(MDI_TV_MODE_LCD_SCREEN, 0, 0);
  598. #endif
  599. gui_cancel_timer(mmi_gx_vsmj_cyclic_timer); /* cancle the looping timer */
  600. }
  601. /**************************************************************
  602. FUNCTION NAME : mmi_gx_vsmj_init_game()
  603.    PURPOSE : Game initilization
  604. INPUT PARAMETERS : nil
  605.  
  606. OUTPUT PARAMETERS : nil
  607. RETURNS : void
  608. REMARKS : nil
  609. ***************************************************************/
  610. void mmi_gx_vsmj_init_game(void)
  611. {
  612. S16 i;
  613. /* basic game variable */
  614. g_gx_vsmj_context.is_new_game = FALSE;
  615. g_gx_vsmj_context.is_gameover = FALSE;
  616. g_gx_vsmj_context.game_grade = 0;
  617. /* basic game variable */
  618. /* set id*/
  619. user[0].id = PLAYER_1;
  620. user[1].id = COM_1;
  621. /* set id*/
  622. for (i=0 ; i<NUM_PLAYER ; i++)
  623. {
  624. user[i].flower[0] = &wall_end;
  625. user[i].hand[0] = &wall_end;
  626. user[i].lock[0]=&wall_end;
  627. user[i].can_hou=FALSE;
  628. user[i].can_bugun=FALSE;
  629. user[i].can_handgun[0]=FALSE;
  630. user[i].can_handgun[1]=FALSE;
  631. user[i].can_handgun[2]=FALSE;
  632. user[i].can_handgun[3]=FALSE;
  633. user[i].can_pon=FALSE;
  634. user[i].can_eat[0]=FALSE;
  635. user[i].can_eat[1]=FALSE;
  636. user[i].can_eat[2]=FALSE;
  637. user[i].handgun_id[0]=TILE_EMPTY;
  638. user[i].handgun_id[1]=TILE_EMPTY;
  639. user[i].handgun_id[2]=TILE_EMPTY;
  640. user[i].handgun_id[3]=TILE_EMPTY;
  641. user[i].start_pos_x = 0;
  642. user[i].hand_left = 17;
  643. }
  644. for (i=0 ; i<NUM_PLAYER ; i++)
  645. {
  646. com_strategy[i]=COM_STRATEGY_1;
  647. }
  648. start_index=0;
  649. end_index=TABLE_NUM-1;
  650. grave_index=0;
  651. grave[grave_index] = &wall_end;
  652. table_offset=0;
  653. gun_times=0;
  654. highlight = &wall_end;
  655. mmi_gx_vsmj_stagegen();
  656. mmi_gx_vsmj_throwdice();
  657. mmi_gx_vsmj_sendtile();
  658. game_move = MOVE_PICK_CHECK;
  659. current_user= &user[0];
  660. pen_last_x=100;
  661. pen_last_y=200;
  662. sign_delay=0;
  663. sign=SIGN_OFF;
  664. game_delay=0;
  665. }
  666. /**************************************************************
  667. FUNCTION NAME : mmi_gx_vsmj_render()
  668.    PURPOSE : Render the game images
  669. INPUT PARAMETERS : nil
  670.  
  671. OUTPUT PARAMETERS : nil
  672. RETURNS : void
  673. REMARKS : nil
  674. ***************************************************************/
  675. void mmi_gx_vsmj_render(void)
  676. {
  677. #ifdef __MMI_TVOUT__
  678. GDI_HANDLE layer_handle;
  679. GDI_HANDLE base_layer;
  680. #endif 
  681. // gdi_draw_solid_rect(0,0,LCD_WIDTH-1,LCD_HEIGHT-1,gd_color_from_rgb_24(0,59,169,25));
  682. switch (game_move)
  683. {
  684. case MOVE_RESULT:
  685. gdi_draw_solid_rect(0,0,LCD_HEIGHT-1,LCD_WIDTH-1,GDI_COLOR_BLUE);
  686. mmi_gx_vsmj_render_scorescreen();
  687. break;
  688. default:
  689. gdi_draw_solid_rect(0,0,LCD_HEIGHT-1,LCD_WIDTH-1,gd_color_from_rgb_24(0,59,169,25));
  690. mmi_gx_vsmj_render_table();
  691. /* render all user */
  692. mmi_gx_vsmj_render_user(&user[0]);
  693. mmi_gx_vsmj_render_user(&user[1]);
  694. /* render all user */
  695. mmi_gx_vsmj_render_highlight();
  696. mmi_gx_vsmj_render_special_bar();
  697. mmi_gx_vsmj_render_sign();
  698. // mmi_gx_vsmj_render_pen_cursor(); /* 0913 David: disable cursor (annoying)*/
  699. break;
  700. }
  701. gui_BLT_double_buffer(0,0,UI_device_width-1,UI_device_height-1);
  702. #ifdef __MMI_TVOUT__
  703. if(mdi_tvout_is_enable())
  704. {
  705. layer_handle = mdi_tvout_get_active_layer();
  706. gdi_layer_get_base_handle(&base_layer);
  707. gdi_layer_push_and_set_active(layer_handle);
  708. gdi_layer_flatten(base_layer, 0,0,0);
  709. gdi_layer_pop_and_restore_active();
  710. mdi_tvout_blt();
  711. }
  712. #endif
  713. }
  714. /**************************************************************
  715. FUNCTION NAME : mmi_gx_vsmj_render_highlight()
  716.    PURPOSE : Render the table images
  717. INPUT PARAMETERS : nil
  718.  
  719. OUTPUT PARAMETERS : nil
  720. RETURNS : void
  721. REMARKS : nil
  722. ***************************************************************/
  723. void mmi_gx_vsmj_render_highlight(void)
  724. {
  725. switch (game_move)
  726. {
  727. case MOVE_DISCARD_CHECK_CONTINUE:
  728. case MOVE_DISCARD_CHECK_START:
  729. case MOVE_DISCARD_SPECIAL:
  730. gdi_image_draw_id(HIGHLIGHT_FREE_POS_X[last_user->id],HIGHLIGHT_FREE_POS_Y[last_user->id],
  731. (U16)(IMG_ID_GX_VSMJ_BRICK_EAST+highlight->id ));
  732. break;
  733. case MOVE_PICK_TILE:
  734. case MOVE_REPLENISH_TILE:
  735. gdi_image_draw_id(USER_HIGHLIGHT_POS_X[current_user->id],USER_HIGHLIGHT_POS_Y[current_user->id],
  736. IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  737. break;
  738. case MOVE_PICK_CHECK:
  739. case MOVE_PICK_SPECIAL:
  740. case MOVE_DISCARD_TILE:
  741. case MOVE_DECLARE_HOU:
  742. if (highlight->id != WALL_END)
  743. {
  744. if (current_user->id == PLAYER_1 || game_move == MOVE_DECLARE_HOU)
  745. {
  746. gdi_image_draw_id(USER_HIGHLIGHT_POS_X[current_user->id],USER_HIGHLIGHT_POS_Y[current_user->id],
  747.   (U16)(IMG_ID_GX_VSMJ_BRICK_EAST+highlight->id));
  748. }
  749. else
  750. {
  751. gdi_image_draw_id(USER_HIGHLIGHT_POS_X[current_user->id],USER_HIGHLIGHT_POS_Y[current_user->id],
  752. IMG_ID_GX_VSMJ_BRICK_USER_UP_BACK);
  753. }
  754. }
  755. break;
  756.   default:
  757. break;
  758. }
  759. }
  760. /**************************************************************
  761. FUNCTION NAME : mmi_gx_vsmj_render_showtable()
  762.    PURPOSE : Render the table images
  763. INPUT PARAMETERS : nil
  764.  
  765. OUTPUT PARAMETERS : nil
  766. RETURNS : void
  767. REMARKS : nil
  768. ***************************************************************/
  769. void mmi_gx_vsmj_render_table(void)
  770. {
  771. /* to be refined later */
  772. S16 i;
  773. S16 tile_pos_x;
  774. S16 tile_pos_y;
  775. S16 dx;
  776. S16 dy;
  777. S16 pile_dx;
  778. S16 pile_dy;
  779. S16 num_of_available_brick;
  780. S16 position_shift;
  781. U16 image_id;
  782. /* draw the number of available brick */
  783. //KP Jerry modify for vsmj type on 2007-3-21 start
  784. /*Old:
  785. gdi_draw_rect(MMI_GX_VSMJ_RECT_POS_X1 ,MMI_GX_VSMJ_RECT_POS_Y1 ,MMI_GX_VSMJ_RECT_POS_X2 ,MMI_GX_VSMJ_RECT_POS_Y2 ,GDI_COLOR_WHITE);
  786. gdi_image_draw_id(MMI_GX_VSMJ_LEFT_BRICK_POS_X ,MMI_GX_VSMJ_LEFT_BRICK_POS_Y ,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  787. num_of_available_brick = end_index - start_index;
  788. position_shift = MMI_GX_VSMJ_NUM_POSITION_X + 0 ;
  789. */
  790. if( *GFX.game_data.type_index_ptr == 0)//13dices
  791. {
  792. gdi_draw_rect(MMI_GX_VSMJ_RECT_POS_X1 -DICES13_OFFSET ,MMI_GX_VSMJ_RECT_POS_Y1 ,MMI_GX_VSMJ_RECT_POS_X2 -DICES13_OFFSET,MMI_GX_VSMJ_RECT_POS_Y2 ,GDI_COLOR_WHITE);
  793. gdi_image_draw_id(MMI_GX_VSMJ_LEFT_BRICK_POS_X -DICES13_OFFSET ,MMI_GX_VSMJ_LEFT_BRICK_POS_Y ,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  794. position_shift = MMI_GX_VSMJ_NUM_POSITION_X + 0 -DICES13_OFFSET;
  795. }
  796. else
  797. {
  798. gdi_draw_rect(MMI_GX_VSMJ_RECT_POS_X1 ,MMI_GX_VSMJ_RECT_POS_Y1 ,MMI_GX_VSMJ_RECT_POS_X2 ,MMI_GX_VSMJ_RECT_POS_Y2 ,GDI_COLOR_WHITE);
  799. gdi_image_draw_id(MMI_GX_VSMJ_LEFT_BRICK_POS_X ,MMI_GX_VSMJ_LEFT_BRICK_POS_Y ,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  800. position_shift = MMI_GX_VSMJ_NUM_POSITION_X + 0 ;
  801. }
  802. num_of_available_brick = end_index - start_index;
  803. //KP Jerry modify for vsmj type on 2007-3-21 end
  804. do
  805. {
  806. image_id = IMG_ID_GX_VSMJ_NUMBER_0 + (num_of_available_brick % 10);
  807. num_of_available_brick = num_of_available_brick / 10;
  808. gdi_image_draw_id(position_shift,
  809. MMI_GX_VSMJ_NUM_POSITION_Y, 
  810. (U16)image_id);
  811. position_shift = position_shift - 9;
  812. } while (num_of_available_brick != 0);
  813. #if 0
  814. /* under construction !*/
  815. /* under construction !*/
  816. /* under construction !*/
  817. /* under construction !*/
  818. /* under construction !*/
  819. /* under construction !*/
  820. /* under construction !*/
  821. /* under construction !*/
  822. /* under construction !*/
  823. /* under construction !*/
  824. /* under construction !*/
  825. /* under construction !*/
  826. /* under construction !*/
  827. /* under construction !*/
  828. /* under construction !*/
  829. /* under construction !*/
  830. /* under construction !*/
  831. /* under construction !*/
  832. /* under construction !*/
  833. /* under construction !*/
  834. /* under construction !*/
  835. /* under construction !*/
  836. /* under construction !*/
  837. /* under construction !*/
  838. /* under construction !*/
  839. /* under construction !*/
  840. /* under construction !*/
  841. /* under construction !*/
  842. /* under construction !*/
  843. /* under construction !*/
  844. /* under construction !*/
  845. /* under construction !*/
  846. /* under construction !*/
  847. /* under construction !*/
  848. /* under construction !*/
  849. /* under construction !*/
  850. /* under construction !*/
  851. /* under construction !*/
  852. /* under construction !*/
  853. /* under construction !*/
  854. /* under construction !*/
  855. /* under construction !*/
  856. /* under construction !*/
  857. /* under construction !*/
  858. /* under construction !*/
  859. /* under construction !*/
  860. /* under construction !*/
  861. /* under construction !*/
  862. /* under construction !*/
  863. /* under construction !*/
  864. /* under construction !*/
  865. /* under construction !*/
  866. /* under construction !*/
  867. /* under construction !*/
  868. /* under construction !*/
  869. /* under construction !*/
  870. /* under construction !*/
  871. /* under construction !*/
  872. /* under construction !*/
  873. /* under construction !*/
  874. /* under construction !*/
  875. /* under construction !*/
  876. /* under construction !*/
  877. /* under construction !*/
  878. /* under construction !*/
  879. /* under construction !*/
  880. /* under construction !*/
  881. /* under construction !*/
  882. /* under construction !*/
  883. /* under construction !*/
  884. /* under construction !*/
  885. /* under construction !*/
  886. /* under construction !*/
  887. /* under construction !*/
  888. /* under construction !*/
  889. /* under construction !*/
  890. /* under construction !*/
  891. /* under construction !*/
  892. /* under construction !*/
  893. /* under construction !*/
  894. /* under construction !*/
  895. /* under construction !*/
  896. /* under construction !*/
  897. /* under construction !*/
  898. /* under construction !*/
  899. /* under construction !*/
  900. /* under construction !*/
  901. /* under construction !*/
  902. /* under construction !*/
  903. /* under construction !*/
  904. /* under construction !*/
  905. /* under construction !*/
  906. /* under construction !*/
  907. /* under construction !*/
  908. /* under construction !*/
  909. /* under construction !*/
  910. /* under construction !*/
  911. /* under construction !*/
  912. /* under construction !*/
  913. /* under construction !*/
  914. /* under construction !*/
  915. /* under construction !*/
  916. /* under construction !*/
  917. /* under construction !*/
  918. /* under construction !*/
  919. /* under construction !*/
  920. /* under construction !*/
  921. /* under construction !*/
  922. /* under construction !*/
  923. /* under construction !*/
  924. /* under construction !*/
  925. /* under construction !*/
  926. /* under construction !*/
  927. /* under construction !*/
  928. /* under construction !*/
  929. /* under construction !*/
  930. /* under construction !*/
  931. /* under construction !*/
  932. /* under construction !*/
  933. /* under construction !*/
  934. /* under construction !*/
  935. /* under construction !*/
  936. /* under construction !*/
  937. /* under construction !*/
  938. /* under construction !*/
  939. /* under construction !*/
  940. /* under construction !*/
  941. /* under construction !*/
  942. /* under construction !*/
  943. /* under construction !*/
  944. /* under construction !*/
  945. /* under construction !*/
  946. /* under construction !*/
  947. /* under construction !*/
  948. /* under construction !*/
  949. /* under construction !*/
  950. /* under construction !*/
  951. /* under construction !*/
  952. /* under construction !*/
  953. /* under construction !*/
  954. /* under construction !*/
  955. /* under construction !*/
  956. /* under construction !*/
  957. /* under construction !*/
  958. /* under construction !*/
  959. /* under construction !*/
  960. /* under construction !*/
  961. /* under construction !*/
  962. #endif
  963. /* draw grave */
  964. tile_pos_x = GRAVE_POS_X;
  965. tile_pos_y = GRAVE_POS_Y;
  966. dx = USER_TILE_WIDTH;
  967. for (i=0 ; i<grave_index; i++)
  968. {
  969. gdi_image_draw_id(tile_pos_x,tile_pos_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST + grave[i]->id));
  970. tile_pos_x = tile_pos_x + dx;
  971. if ( i%17 == 16)
  972. {
  973. tile_pos_y = tile_pos_y + USER_TILE_HEIGHT;
  974. tile_pos_x = GRAVE_POS_X;
  975. }
  976. }
  977. /* draw grave */
  978. }
  979. /**************************************************************
  980. FUNCTION NAME : mmi_gx_vsmj_render_user
  981.    PURPOSE :Timer trigger function - looping
  982. INPUT PARAMETERS : nil
  983.  
  984. OUTPUT PARAMETERS : nil
  985. RETURNS : void
  986. REMARKS : nil
  987. ***************************************************************/
  988. void mmi_gx_vsmj_render_user(gx_vsmj_user_struct *user_ptr)
  989. {
  990. S16 i,j;
  991. S16 draw_x;
  992. S16 draw_y;
  993. BOOL highlight_is_skipped = TRUE;
  994. S16 shift_x,shift_x_count;
  995. S16 tile_width;
  996. /* draw flower */
  997. draw_x=USER_FLOWER_POS_X[user_ptr->id];
  998. draw_y=USER_FLOWER_POS_Y[user_ptr->id];
  999. i=0;
  1000. while (user_ptr->flower[i]->id != WALL_END)
  1001. {
  1002. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->flower[i]->id) );
  1003. draw_x += USER_TILE_WIDTH;
  1004. i++;
  1005. }
  1006. /* draw flower */
  1007. /* draw lock*/
  1008. shift_x_count = 0;
  1009. if(user_ptr->id == COM_1)
  1010.   {
  1011.   shift_x = -1;
  1012. tile_width = -1*USER_TILE_WIDTH;
  1013. }
  1014. else
  1015. {
  1016.   shift_x = 1;
  1017. tile_width = USER_TILE_WIDTH;
  1018. }
  1019. draw_x=USER_LOCK_POS_X[user_ptr->id];
  1020. draw_y=USER_LOCK_POS_Y[user_ptr->id];
  1021. i=0;
  1022. while (user_ptr->lock[i]->id != WALL_END)
  1023. {
  1024. switch (user_ptr->lock[i]->id)
  1025. {
  1026. case WALL_END:
  1027. case WALL_PON:
  1028. case WALL_EAT:
  1029. case TILE_EMPTY:
  1030. i++;
  1031. draw_x += shift_x;
  1032. shift_x_count++;
  1033. break;
  1034. case WALL_GUNSHOW:
  1035. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->lock[i]->id));
  1036. draw_x += tile_width;
  1037. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->lock[i]->id));
  1038. gdi_image_draw_id(draw_x,draw_y-(shift_x*5),(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->lock[i]->id));
  1039. draw_x += tile_width;
  1040. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->lock[i]->id));
  1041. draw_x += tile_width;
  1042. i+=5;
  1043. break;
  1044. case WALL_GUNHIDE: /* 2ppl: user id 0,1 up / down need one image */
  1045. /* 4ppl: user id 0,2 up/down one image,  1,3 need one image */
  1046. /* currently only ver image */
  1047. if (game_move != MOVE_DECLARE_HOU)
  1048. {
  1049. gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  1050. draw_x += tile_width;
  1051. gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  1052. gdi_image_draw_id(draw_x,draw_y-(shift_x*5),IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  1053. draw_x += tile_width;
  1054. gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  1055. draw_x += tile_width;
  1056. i = i+5; /*pass the gun tile ,to the next wall */
  1057. }
  1058. else
  1059. {
  1060. i++;
  1061. }
  1062. break;
  1063. default:
  1064. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->lock[i]->id));
  1065. draw_x += tile_width;
  1066. i++;
  1067. break;
  1068. }
  1069. }
  1070. /*draw lock*/
  1071. /* draw own */
  1072. if(user_ptr->id==COM_1)
  1073. {  
  1074. draw_x=USER_OWN_POS_X[user_ptr->id]-shift_x_count;
  1075. // draw_y=USER_OWN_POS_Y[user_ptr->id];
  1076. }
  1077. user_ptr->start_pos_x = draw_x;
  1078. // user_ptr->start_pos_y = draw_y;
  1079. if (user_ptr->id == current_user->id)
  1080. if (game_move != MOVE_DISCARD_CHECK_START
  1081. && game_move != MOVE_DISCARD_CHECK_CONTINUE)
  1082. if (highlight->id != WALL_END)
  1083. {
  1084. highlight_is_skipped=FALSE;
  1085. }
  1086. if (user_ptr->id == PLAYER_1 || game_move== MOVE_DECLARE_HOU)
  1087. {
  1088. j=0;
  1089. while (user_ptr->hand[j]->id != WALL_END)
  1090. {
  1091. if (highlight_is_skipped)
  1092. {
  1093. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->hand[j]->id));
  1094. draw_x += USER_TILE_WIDTH;
  1095. j++;
  1096. }
  1097. else
  1098. {
  1099. if (user_ptr->hand[j]->id == highlight->id )
  1100. {
  1101. /* skip once to pass highlight offset*/
  1102. highlight_is_skipped=TRUE;
  1103. j++;
  1104. }
  1105. else
  1106. {
  1107. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST+user_ptr->hand[j]->id));
  1108. draw_x += USER_TILE_WIDTH;
  1109. j++;
  1110. }
  1111. }
  1112. }
  1113. }
  1114. else
  1115. {
  1116. j=0;
  1117. while (user_ptr->hand[j]->id != WALL_END)
  1118. {
  1119. if (highlight_is_skipped)
  1120. {
  1121. //gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UP_BACK);
  1122. gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  1123. draw_x += USER_TILE_WIDTH;
  1124. j++;
  1125. }
  1126. else
  1127. {
  1128. if (user_ptr->hand[j]->id == highlight->id )
  1129. {
  1130. /* skip once to pass highlight offset*/
  1131. highlight_is_skipped=TRUE;
  1132. j++;
  1133. }
  1134. else
  1135. {
  1136. //gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UP_BACK);
  1137. gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_BRICK_USER_UD_HIDE_BACK);
  1138. draw_x += USER_TILE_WIDTH;
  1139. j++;
  1140. }
  1141. }
  1142. }
  1143. user_ptr->hand_left= j;
  1144. }
  1145. /* draw own */
  1146. }
  1147. /**************************************************************
  1148. FUNCTION NAME : mmi_gx_vsmj_render_special_bar
  1149.    PURPOSE :Timer trigger function - looping
  1150. INPUT PARAMETERS : nil
  1151.  
  1152. OUTPUT PARAMETERS : nil
  1153. RETURNS : void
  1154. REMARKS : nil
  1155. ***************************************************************/
  1156. void mmi_gx_vsmj_render_special_bar(void)
  1157. {
  1158. if (game_move == MOVE_PICK_SPECIAL || game_move == MOVE_DISCARD_SPECIAL )
  1159. if (current_user->id == PLAYER_1) 
  1160. {
  1161. //eat base
  1162. gdi_image_draw_id(PLAYER_SPECIAL_POS_X,PLAYER_SPECIAL_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_EAT_BASE);
  1163. //eat 0~2
  1164. if (current_user->can_eat[0])
  1165. {
  1166. gdi_image_draw_id(PLAYER_SPECIAL_POS_X,PLAYER_SPECIAL_POS_Y + PLAYER_SPECIAL_UNIT_HEIGHT
  1167. ,IMG_ID_GX_VSMJ_SPECIAL_EAT_0);
  1168. }
  1169. if (current_user->can_eat[1])
  1170. {
  1171. gdi_image_draw_id(PLAYER_SPECIAL_POS_X,PLAYER_SPECIAL_POS_Y + 2*PLAYER_SPECIAL_UNIT_HEIGHT
  1172. ,IMG_ID_GX_VSMJ_SPECIAL_EAT_1);
  1173. }
  1174. if (current_user->can_eat[2])
  1175. {
  1176. gdi_image_draw_id(PLAYER_SPECIAL_POS_X,PLAYER_SPECIAL_POS_Y + 3*PLAYER_SPECIAL_UNIT_HEIGHT
  1177. ,IMG_ID_GX_VSMJ_SPECIAL_EAT_2 );
  1178. }
  1179. //pon
  1180. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +PLAYER_SPECIAL_UNIT_WIDTH
  1181. ,PLAYER_SPECIAL_POS_Y,(U16)(IMG_ID_GX_VSMJ_SPECIAL_PON_OFF + current_user->can_pon));
  1182. //gun base
  1183. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1184. ,PLAYER_SPECIAL_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_GUN_BASE);
  1185. //bugun
  1186. if (current_user->can_bugun)
  1187. {
  1188. gdi_draw_solid_rect(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1189. ,PLAYER_SPECIAL_POS_Y - PLAYER_SPECIAL_UNIT_HEIGHT
  1190. ,PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1191. ,PLAYER_SPECIAL_POS_Y
  1192. ,GDI_COLOR_BLACK);
  1193. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1194. ,PLAYER_SPECIAL_POS_Y - PLAYER_SPECIAL_UNIT_HEIGHT
  1195. ,(U16)(IMG_ID_GX_VSMJ_BRICK_EAST + highlight->id));
  1196. }
  1197. //gun 0~3
  1198. if (current_user->can_handgun[0])
  1199. {
  1200. gdi_draw_solid_rect(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1201. ,PLAYER_SPECIAL_POS_Y + PLAYER_SPECIAL_UNIT_HEIGHT
  1202. ,PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1203. ,PLAYER_SPECIAL_POS_Y + 2*PLAYER_SPECIAL_UNIT_HEIGHT
  1204. ,GDI_COLOR_BLACK);
  1205. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1206. ,PLAYER_SPECIAL_POS_Y + PLAYER_SPECIAL_UNIT_HEIGHT,
  1207. (U16)(IMG_ID_GX_VSMJ_BRICK_EAST + current_user->handgun_id[0]) );
  1208. }
  1209. if (current_user->can_handgun[1])
  1210. {
  1211. gdi_draw_solid_rect(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1212. ,PLAYER_SPECIAL_POS_Y + 2*PLAYER_SPECIAL_UNIT_HEIGHT
  1213. ,PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1214. ,PLAYER_SPECIAL_POS_Y + 3*PLAYER_SPECIAL_UNIT_HEIGHT
  1215. ,GDI_COLOR_BLACK);
  1216. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1217. ,PLAYER_SPECIAL_POS_Y + 2*PLAYER_SPECIAL_UNIT_HEIGHT,
  1218. (U16)(IMG_ID_GX_VSMJ_BRICK_EAST + current_user->handgun_id[1])  );
  1219. }
  1220. if (current_user->can_handgun[2])
  1221. {
  1222. gdi_draw_solid_rect(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1223. ,PLAYER_SPECIAL_POS_Y + 3*PLAYER_SPECIAL_UNIT_HEIGHT
  1224. ,PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1225. ,PLAYER_SPECIAL_POS_Y + 4*PLAYER_SPECIAL_UNIT_HEIGHT
  1226. ,GDI_COLOR_BLACK);
  1227. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1228. ,PLAYER_SPECIAL_POS_Y + 3*PLAYER_SPECIAL_UNIT_HEIGHT,
  1229. (U16)(IMG_ID_GX_VSMJ_BRICK_EAST + current_user->handgun_id[2]) );
  1230. }
  1231. if (current_user->can_handgun[3])
  1232. {
  1233. gdi_draw_solid_rect(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1234. ,PLAYER_SPECIAL_POS_Y + 4*PLAYER_SPECIAL_UNIT_HEIGHT
  1235. ,PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1236. ,PLAYER_SPECIAL_POS_Y +5*PLAYER_SPECIAL_UNIT_HEIGHT
  1237. ,GDI_COLOR_BLACK);
  1238. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1239. ,PLAYER_SPECIAL_POS_Y + 4*PLAYER_SPECIAL_UNIT_HEIGHT,
  1240. (U16)(IMG_ID_GX_VSMJ_BRICK_EAST + current_user->handgun_id[3]) );
  1241. }
  1242. //hou
  1243. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1244. ,PLAYER_SPECIAL_POS_Y,(U16)(IMG_ID_GX_VSMJ_SPECIAL_HOU_OFF + current_user->can_hou) );
  1245. //cancel
  1246. gdi_image_draw_id(PLAYER_SPECIAL_POS_X +4*PLAYER_SPECIAL_UNIT_WIDTH
  1247. ,PLAYER_SPECIAL_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_CANCEL);
  1248. }
  1249. }
  1250. /**************************************************************
  1251. FUNCTION NAME : mmi_gx_vsmj_render_sign
  1252.    PURPOSE :Timer trigger function - looping
  1253. INPUT PARAMETERS : nil
  1254.  
  1255. OUTPUT PARAMETERS : nil
  1256. RETURNS : void
  1257. REMARKS : nil
  1258. ***************************************************************/
  1259. void mmi_gx_vsmj_render_sign(void)
  1260. {
  1261. S16 dx=0;
  1262. if (sign_delay>15)
  1263. {
  1264. dx = 0 - 8*(sign_delay-16);
  1265. }
  1266. else if (sign_delay <9)
  1267. {
  1268. dx = 0 - 5*(9-sign_delay);
  1269. }
  1270. if (sign_delay !=0)
  1271. {
  1272. switch (sign)
  1273. {
  1274. case SIGN_OFF:
  1275. break;
  1276. case SIGN_EAT:
  1277. gdi_image_draw_id(SIGN_POS_X+dx,SIGN_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_EAT_BASE);
  1278. break;
  1279. case SIGN_PON:
  1280. gdi_image_draw_id(SIGN_POS_X+dx,SIGN_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_PON_ON);
  1281. break;
  1282. case SIGN_GUN:
  1283. gdi_image_draw_id(SIGN_POS_X+dx,SIGN_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_GUN_BASE);
  1284. break;
  1285. case SIGN_HOU: /*fix one*/
  1286. gdi_image_draw_id(SIGN_POS_X,SIGN_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_HOU_ON);
  1287. break;
  1288. case SIGN_LIOU_GU: /*fix one*/
  1289. gdi_image_draw_id(SIGN_POS_X,SIGN_POS_Y,IMG_ID_GX_VSMJ_SPECIAL_LIOU_GU);
  1290. break;
  1291. }
  1292. /* sign_delay will -- in framemove */
  1293. }
  1294. else
  1295. {
  1296. sign=SIGN_OFF;
  1297. }
  1298. }
  1299. /**************************************************************
  1300. FUNCTION NAME : mmi_gx_vsmj_render_pen_cursor
  1301.    PURPOSE :Timer trigger function - looping
  1302. INPUT PARAMETERS : nil
  1303.  
  1304. OUTPUT PARAMETERS : nil
  1305. RETURNS : void
  1306. REMARKS : nil
  1307. ***************************************************************/
  1308. void mmi_gx_vsmj_render_pen_cursor(void)
  1309. {
  1310. if (current_user->id == PLAYER_1)
  1311. {
  1312. gdi_image_draw_id(pen_last_x,pen_last_y,IMG_ID_GX_VSMJ_PEN_CURSOR_OFF);
  1313. }
  1314. else
  1315. {
  1316. gdi_image_draw_id(pen_last_x,pen_last_y,IMG_ID_GX_VSMJ_PEN_CURSOR_ON);
  1317. }
  1318. }
  1319. /**************************************************************
  1320. FUNCTION NAME : mmi_gx_vsmj_render_scorescreen
  1321.    PURPOSE :Timer trigger function - looping
  1322. INPUT PARAMETERS : nil
  1323.  
  1324. OUTPUT PARAMETERS : nil
  1325. RETURNS : void
  1326. REMARKS : nil
  1327. ***************************************************************/
  1328. void mmi_gx_vsmj_render_scorescreen(void)
  1329. {
  1330. U8 i;
  1331. S16 draw_y,draw_x;
  1332. mmi_gx_vsmj_count_score(current_user);
  1333. gdi_draw_solid_rect(0,0,240,320,GDI_COLOR_WHITE);
  1334. gdi_draw_frame_rect(SCORE_POS_X-SCORE_FRAME,SCORE_POS_Y-SCORE_FRAME,
  1335. SCORE_WIDTH, SCORE_HEIGHT, GDI_COLOR_GREEN,GDI_COLOR_GRAY,SCORE_FRAME);
  1336. draw_y=SCORE_POS_Y;
  1337. draw_x=SCORE_POS_X;
  1338. for (i=0 ; i<SCORE_TOTALNUM ; i++)
  1339. {
  1340. if (bonus_hou[i])
  1341. {
  1342. gdi_image_draw_id(draw_x,draw_y,(U16)(IMG_ID_GX_VSMJ_SCORE_8_FLOWER+i));
  1343. /* draw text image and tai number all in one */ 
  1344. draw_y += SCORE_UNIT_HEIGHT;
  1345. if (i % 8 ==0)
  1346. draw_x = draw_x + 100;
  1347. }
  1348. }
  1349. if (draw_y == SCORE_POS_Y && draw_x == SCORE_POS_X) /* none special */
  1350. {
  1351. gdi_image_draw_id(draw_x,draw_y,IMG_ID_GX_VSMJ_SCORE_NOTHING);
  1352. }
  1353. /* add draw tai num image code here */
  1354. /* another way:use the gameover screen to show current score at hand : use title "current score" blahblah
  1355. with game grade box showing total score,gameover scr used as a  game set screen */
  1356. /* 0829 : realize upper solution,will need a gameover screen with "current score" title */
  1357. }
  1358. /**************************************************************
  1359. FUNCTION NAME : mmi_gx_vsmj_cyclic_timer()
  1360.    PURPOSE :Timer trigger function - looping
  1361. INPUT PARAMETERS : nil
  1362.  
  1363. OUTPUT PARAMETERS : nil
  1364. RETURNS : void
  1365. REMARKS : nil
  1366. ***************************************************************/
  1367. void mmi_gx_vsmj_cyclic_timer(void)
  1368. {
  1369. if (sign_delay > 0)
  1370. {
  1371. sign_delay--;
  1372. }
  1373. if (game_delay > 0)
  1374. {
  1375. game_delay--;
  1376. }
  1377. if(g_gx_vsmj_context.is_gameover == FALSE)
  1378. {
  1379. if (game_delay ==0)
  1380. {
  1381. mmi_gx_vsmj_framemove();
  1382. mmi_gx_vsmj_render();
  1383. }
  1384. }
  1385. else
  1386. {
  1387. mmi_gx_vsmj_gameover();
  1388. return;
  1389. }
  1390. gui_start_timer(g_gx_vsmj_context.timer_elapse, mmi_gx_vsmj_cyclic_timer);
  1391. }
  1392. /************************************************************** 
  1393. FUNCTION NAME : mmi_gx_vsmj_pen_down_hdlr
  1394. PURPOSE :
  1395. INPUT PARAMETERS : S16
  1396. OUTPUT PARAMETERS : nil 
  1397. RETURNS : void 
  1398. REMARKS : nil 
  1399. ***************************************************************/ 
  1400. #ifdef __MMI_TOUCH_SCREEN__
  1401. void mmi_gx_vsmj_pen_down_hdlr(mmi_pen_point_struct pos) /*all done */
  1402. {
  1403. S32 tmp;
  1404. tmp = pos.x;
  1405. pos.x= pos.y;
  1406. pos.y = (LCD_WIDTH-1) - tmp;
  1407. pen_last_x=pos.x;
  1408. pen_last_y=pos.y;
  1409. if (pos.x > USER_HIGHLIGHT_POS_X[current_user->id] 
  1410. && pos.x < USER_HIGHLIGHT_POS_X[current_user->id] + USER_TILE_WIDTH
  1411. && pos.y > USER_HIGHLIGHT_POS_Y[current_user->id] 
  1412. && pos.y < USER_HIGHLIGHT_POS_Y[current_user->id] + USER_TILE_HEIGHT)
  1413. {
  1414. pen_pos = PP_HIGHLIGHT;
  1415. }
  1416. else if (pos.x > PLAYER_SPECIAL_POS_X +PLAYER_SPECIAL_UNIT_WIDTH
  1417. && pos.x < PLAYER_SPECIAL_POS_X + 2*PLAYER_SPECIAL_UNIT_WIDTH
  1418. && pos.y > PLAYER_SPECIAL_POS_Y 
  1419. && pos.y < PLAYER_SPECIAL_POS_Y+ PLAYER_SPECIAL_UNIT_HEIGHT)
  1420. {
  1421. pen_pos = PP_SPECIAL_PON;
  1422. }
  1423. else if (pos.x > PLAYER_SPECIAL_POS_X +3*PLAYER_SPECIAL_UNIT_WIDTH
  1424. && pos.x < PLAYER_SPECIAL_POS_X +4*PLAYER_SPECIAL_UNIT_WIDTH
  1425. && pos.y > PLAYER_SPECIAL_POS_Y
  1426. && pos.y < PLAYER_SPECIAL_POS_Y + PLAYER_SPECIAL_UNIT_HEIGHT)
  1427. {
  1428. pen_pos = PP_SPECIAL_HOU;
  1429. }
  1430. else if (pos.x > PLAYER_SPECIAL_POS_X +4*PLAYER_SPECIAL_UNIT_WIDTH
  1431. && pos.x < PLAYER_SPECIAL_POS_X +5*PLAYER_SPECIAL_UNIT_WIDTH
  1432. && pos.y > PLAYER_SPECIAL_POS_Y
  1433. && pos.y < PLAYER_SPECIAL_POS_Y+ PLAYER_SPECIAL_UNIT_HEIGHT)
  1434. {
  1435. pen_pos = PP_SPECIAL_CANCEL;
  1436. }
  1437. else if (pos.x > PLAYER_SPECIAL_POS_X 
  1438. && pos.x < PLAYER_SPECIAL_POS_X + PLAYER_SPECIAL_UNIT_WIDTH
  1439. && pos.y > PLAYER_SPECIAL_POS_Y + PLAYER_SPECIAL_UNIT_HEIGHT 
  1440. && pos.y < PLAYER_SPECIAL_POS_Y+2*PLAYER_SPECIAL_UNIT_HEIGHT )
  1441. {
  1442. pen_pos = PP_SPECIAL_EAT_0;
  1443. }
  1444. else if (pos.x > PLAYER_SPECIAL_POS_X 
  1445. && pos.x < PLAYER_SPECIAL_POS_X + PLAYER_SPECIAL_UNIT_WIDTH
  1446. && pos.y > PLAYER_SPECIAL_POS_Y + 2*PLAYER_SPECIAL_UNIT_HEIGHT 
  1447. && pos.y < PLAYER_SPECIAL_POS_Y +3*PLAYER_SPECIAL_UNIT_HEIGHT)
  1448. {
  1449. pen_pos= PP_SPECIAL_EAT_1;
  1450. }
  1451. else if (pos.x > PLAYER_SPECIAL_POS_X 
  1452. && pos.x < PLAYER_SPECIAL_POS_X + PLAYER_SPECIAL_UNIT_WIDTH
  1453. && pos.y > PLAYER_SPECIAL_POS_Y + 3*PLAYER_SPECIAL_UNIT_HEIGHT 
  1454. && pos.y < PLAYER_SPECIAL_POS_Y + 4*PLAYER_SPECIAL_UNIT_HEIGHT)
  1455. {
  1456. pen_pos= PP_SPECIAL_EAT_2;
  1457. }
  1458. else if (pos.x > PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1459. && pos.x < PLAYER_SPECIAL_POS_X + 3*PLAYER_SPECIAL_UNIT_WIDTH
  1460. && pos.y > PLAYER_SPECIAL_POS_Y -PLAYER_SPECIAL_UNIT_HEIGHT 
  1461. && pos.y < PLAYER_SPECIAL_POS_Y)
  1462. {
  1463. pen_pos = PP_SPECIAL_BUGUN;
  1464. }
  1465. else if (pos.x > PLAYER_SPECIAL_POS_X +2*PLAYER_SPECIAL_UNIT_WIDTH
  1466. && pos.x < PLAYER_SPECIAL_POS_X + 3*PLAYER_SPECIAL_UNIT_WIDTH
  1467. && pos.y > PLAYER_SPECIAL_POS_Y + PLAYER_SPECIAL_UNIT_HEIGHT
  1468. && pos.y < PLAYER_SPECIAL_POS_Y + 5*PLAYER_SPECIAL_UNIT_HEIGHT)
  1469. {
  1470. pen_pos = (gx_vsmj_pen_pos_enum)(PP_SPECIAL_HANDGUN_0 + 
  1471. (pos.y - PLAYER_SPECIAL_POS_Y - PLAYER_SPECIAL_UNIT_HEIGHT)/PLAYER_SPECIAL_UNIT_HEIGHT);
  1472. } /* up to down :handgun0~3 */
  1473. else if (pos.x > current_user->start_pos_x && pos.x < current_user->start_pos_x + current_user->hand_left*USER_TILE_WIDTH
  1474. && pos.y > USER_OWN_POS_Y[current_user->id] && pos.y < USER_OWN_POS_Y[current_user->id] + USER_TILE_HEIGHT)
  1475. {
  1476. pen_pos = (gx_vsmj_pen_pos_enum)(PP_OWN_0 + (pos.x - current_user->start_pos_x) / USER_TILE_WIDTH);
  1477. }
  1478. else
  1479. {
  1480. pen_pos = PP_ELSE;
  1481. }
  1482. }
  1483. #endif
  1484. /************************************************************** 
  1485. FUNCTION NAME : mmi_gx_vsmj_pen_up_hdlr
  1486. PURPOSE :
  1487. INPUT PARAMETERS : S16
  1488. OUTPUT PARAMETERS : nil 
  1489. RETURNS : void 
  1490. REMARKS : nil 
  1491. ***************************************************************/ 
  1492. #ifdef __MMI_TOUCH_SCREEN__
  1493. void mmi_gx_vsmj_pen_up_hdlr(mmi_pen_point_struct pos)
  1494. {
  1495. }
  1496. #endif
  1497. /************************************************************** 
  1498. FUNCTION NAME : mmi_gx_vsmj_debug
  1499. PURPOSE : Debug use
  1500. INPUT PARAMETERS : S16
  1501. OUTPUT PARAMETERS : nil 
  1502. RETURNS : void 
  1503. REMARKS : nil 
  1504. ***************************************************************/ 
  1505. #ifdef VSMJ_DEBUG_ON
  1506. void mmi_gx_vsmj_debug(void)
  1507. {
  1508. S16 buf[20];
  1509. S16 buf_USC2[40];
  1510. S32 str_width;
  1511. S32   str_height;
  1512. S16  x=0;
  1513. S16  y=0;
  1514. S16  i=0;
  1515. for (i=0 ; i<40 ; i++)
  1516. {
  1517. y+=12;
  1518. if (i%10==0)
  1519. {
  1520. y=0;
  1521. x+=30;
  1522. }
  1523. gui_set_font(&MMI_medium_font);
  1524. gui_set_text_color(gui_color(200,63,40));
  1525. gui_set_text_border_color(gui_color(0,0,0));
  1526. sprintf(buf, "%d", gx_vsmj_debug[i]);
  1527. AnsiiToUnicodeString(buf_USC2, buf);
  1528. gui_measure_string((UI_string_type)buf_USC2, &str_width, &str_height);
  1529. gui_move_text_cursor(x,y);
  1530. gui_print_bordered_text((UI_string_type)buf_USC2);
  1531. }
  1532. }
  1533. #endif /*VSMJ_DEBUG_ON*/
  1534. /**************************************************************
  1535. FUNCTION NAME : mmi_gx_vsmj_find_no_with_tile_id
  1536.    PURPOSE :check eat 
  1537. INPUT PARAMETERS : ptr array
  1538.  
  1539. OUTPUT PARAMETERS : nil
  1540. RETURNS : void
  1541. REMARKS : nil
  1542. ***************************************************************/
  1543. S16 mmi_gx_vsmj_find_no_with_tile_id(gx_vsmj_tile_id_enum target_id, gx_vsmj_tile_struct* tile_set_ptr[])
  1544. {
  1545. S16 i;
  1546. i=0;
  1547. while (1)
  1548. {
  1549. if (tile_set_ptr[i]->id == target_id)
  1550. return i;
  1551. if (tile_set_ptr[i]->id == WALL_END)
  1552. return -1;
  1553. i++;
  1554. }
  1555. }
  1556. /**************************************************************
  1557. FUNCTION NAME : mmi_gx_vsmj_insert_tile()
  1558.    PURPOSE : 
  1559.   
  1560. INPUT PARAMETERS : nil
  1561.  
  1562. OUTPUT PARAMETERS : nil
  1563. RETURNS : void
  1564. REMARKS : nil
  1565. ***************************************************************/
  1566. void mmi_gx_vsmj_insert_tile(gx_vsmj_tile_struct *tile_target_ptr,gx_vsmj_tile_struct *tile_set_ptr[])
  1567. {
  1568. /* for later usage, must make highlight one be the first in array relative to other same id tile */
  1569. S16 i;
  1570. gx_vsmj_tile_struct *tile_ptr=tile_target_ptr; /* so insert wont change highlight's value*/
  1571. i=0;
  1572. while (1)
  1573. {
  1574. if (tile_set_ptr[i]->id == TILE_EMPTY)
  1575. {
  1576. tile_set_ptr[i] = tile_ptr;
  1577. return;
  1578. }
  1579. else if (tile_set_ptr[i]->id == tile_target_ptr->id)
  1580. {
  1581. gx_vsmj_tile_struct *tile_ptr_temp = tile_set_ptr[i];
  1582. tile_set_ptr[i] = tile_ptr;
  1583. tile_ptr = tile_ptr_temp;
  1584. }
  1585. else if (tile_set_ptr[i]->id == WALL_END) /*didnt find a hole, so put it at the end*/
  1586. {
  1587. tile_set_ptr[i] = tile_ptr;
  1588. tile_set_ptr[i+1]= &wall_end;
  1589. return;
  1590. }
  1591. i++;
  1592. }
  1593. }
  1594. /**************************************************************
  1595. FUNCTION NAME : mmi_gx_vsmj_eliminate_tile()
  1596.    PURPOSE : 
  1597.   
  1598. INPUT PARAMETERS : nil
  1599.  
  1600. OUTPUT PARAMETERS : nil
  1601. RETURNS : void
  1602. REMARKS : nil
  1603. ***************************************************************/
  1604. /* return true when found one and eliminate it*/
  1605. /* false when didnt find any*/
  1606. BOOL mmi_gx_vsmj_eliminate_tile(gx_vsmj_tile_id_enum target_id ,gx_vsmj_tile_struct *tile_set_ptr[])
  1607. {
  1608. S16 i;
  1609. i=0;
  1610. while (tile_set_ptr[i]->id != WALL_END)
  1611. {
  1612. if (tile_set_ptr[i]->id == target_id)
  1613. {
  1614. tile_set_ptr[i] = &tile_empty;
  1615. return TRUE;
  1616. }
  1617. i++;
  1618. }
  1619. /* didn't find any */
  1620. return FALSE;
  1621. }
  1622. /**************************************************************
  1623. FUNCTION NAME : mmi_gx_vsmj_sort_tile
  1624.    PURPOSE :check eat 
  1625. INPUT PARAMETERS : ptr array
  1626.  
  1627. OUTPUT PARAMETERS : nil
  1628. RETURNS : void
  1629. REMARKS : nil
  1630. ***************************************************************/
  1631. void mmi_gx_vsmj_sort_tile(gx_vsmj_tile_struct *tile_set_ptr[])
  1632. {
  1633. S16 i,j;
  1634. gx_vsmj_tile_struct *tile_temp_ptr;
  1635. i=0;
  1636. /* sort order */
  1637. while (tile_set_ptr[i]->id != WALL_END)
  1638. {
  1639. j=0;
  1640. while (tile_set_ptr[j+1]->id != WALL_END)
  1641. {
  1642. if (tile_set_ptr[j]->id > tile_set_ptr[j+1]->id)
  1643. {
  1644. tile_temp_ptr = tile_set_ptr[j];
  1645. tile_set_ptr[j] = tile_set_ptr[j+1];
  1646. tile_set_ptr[j+1] = tile_temp_ptr;
  1647. }
  1648. j++;
  1649. }
  1650. i++;
  1651. }
  1652. /* clear empty and move wall back */
  1653. i=0;
  1654. while (1)
  1655. {
  1656. if (tile_set_ptr[i]->id ==TILE_EMPTY)
  1657. {
  1658. tile_set_ptr[i]=&wall_end;
  1659. break;
  1660. }
  1661. else if (tile_set_ptr[i]->id == WALL_END)
  1662. {
  1663. break;;
  1664. }
  1665. i++;
  1666. }
  1667. }
  1668. /************************************************************** 
  1669. FUNCTION NAME : mmi_gx_vsmj_pick_tile
  1670. PURPOSE :
  1671. INPUT PARAMETERS : S16
  1672. OUTPUT PARAMETERS : nil 
  1673. RETURNS : void 
  1674. REMARKS : nil 
  1675. ***************************************************************/ 
  1676. void mmi_gx_vsmj_pick_tile(gx_vsmj_user_struct *user_ptr) /*all done */
  1677. {
  1678. highlight = &tile_table[start_index++];
  1679. highlight->pos = POS_HIGH;
  1680. /*clear special hou parameter , player give up so he can come here */
  1681. score_7_1_flower=FALSE;
  1682. score_8_flower=FALSE;
  1683. score_last_by_own=TRUE;
  1684. score_hou_by_replenish=FALSE;
  1685. /*clear special hou parameter ,player give up so he can come here */
  1686. if (highlight->id < FL_SPRING)
  1687. {
  1688. mmi_gx_vsmj_insert_tile(highlight,user_ptr->hand);
  1689. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1690. game_move = MOVE_PICK_CHECK;
  1691. }
  1692. else
  1693. {
  1694. mmi_gx_vsmj_insert_tile(highlight,user_ptr->flower);
  1695. highlight= &wall_end;
  1696. /* flower has its stack order, no need to sort,and simple insert wont make any empty block*/
  1697. game_move = MOVE_REPLENISH_TILE;
  1698. }
  1699. }
  1700. /************************************************************** 
  1701. FUNCTION NAME : mmi_gx_vsmj_replenish_tile
  1702. PURPOSE : Debug use
  1703. INPUT PARAMETERS : S16
  1704. OUTPUT PARAMETERS : nil 
  1705. RETURNS : void 
  1706. REMARKS : nil 
  1707. ***************************************************************/ 
  1708. void mmi_gx_vsmj_replenish_tile(gx_vsmj_user_struct *user_ptr)
  1709. {
  1710. highlight = &tile_table[end_index--];
  1711. highlight->pos = POS_HIGH;
  1712. /*clear special hou parameter , player give up so he can come here */
  1713. score_7_1_flower=FALSE;
  1714. score_8_flower=FALSE;
  1715. score_last_by_own=TRUE;
  1716. score_hou_by_replenish=FALSE;
  1717. /*clear special hou parameter ,player give up so he can come here */
  1718. if (highlight->id < FL_SPRING)
  1719. {
  1720. mmi_gx_vsmj_insert_tile(highlight,user_ptr->hand);
  1721. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1722. game_move = MOVE_PICK_CHECK;
  1723. }
  1724. else 
  1725. {
  1726. mmi_gx_vsmj_insert_tile(highlight,user_ptr->flower);
  1727. highlight= &wall_end;
  1728. /* flower has its stack order, no need to sort,and simple insert wont make any empty block*/
  1729. game_move = MOVE_REPLENISH_TILE;
  1730. }
  1731. }
  1732. /************************************************************** 
  1733. FUNCTION NAME : mmi_gx_vsmj_discard_tile
  1734. PURPOSE :
  1735. INPUT PARAMETERS : S16
  1736. OUTPUT PARAMETERS : nil 
  1737. RETURNS : void 
  1738. REMARKS : nil 
  1739. ***************************************************************/ 
  1740. void mmi_gx_vsmj_discard_tile(gx_vsmj_tile_id_enum target_id,gx_vsmj_user_struct *user_ptr)
  1741. {
  1742. /*clear special hou parameter , player give up so he can come here */
  1743. score_7_1_flower=FALSE;
  1744. score_8_flower=FALSE;
  1745. score_hou_by_replenish=FALSE;
  1746. score_last_by_own=FALSE;
  1747. /*clear special hou parameter ,player give up so he can come here */
  1748. highlight = user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(target_id,user_ptr->hand)];
  1749. mmi_gx_vsmj_eliminate_tile(target_id,user_ptr->hand);
  1750. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1751. last_user=user_ptr;
  1752. game_move=MOVE_DISCARD_CHECK_START;
  1753. }
  1754. /************************************************************** 
  1755. FUNCTION NAME : mmi_gx_vsmj_gun
  1756. PURPOSE : Debug use
  1757. INPUT PARAMETERS : S16
  1758. OUTPUT PARAMETERS : nil 
  1759. RETURNS : void 
  1760. REMARKS : nil 
  1761. ***************************************************************/ 
  1762. void mmi_gx_vsmj_handgun(gx_vsmj_tile_id_enum target_id,gx_vsmj_user_struct *user_ptr)
  1763. {
  1764. S16 i,j;
  1765. gun_times++; /*count total gun_times for liou_gu */
  1766. i = mmi_gx_vsmj_find_no_with_tile_id(WALL_END,user_ptr->lock);
  1767. if (game_move == MOVE_DISCARD_SPECIAL)
  1768. user_ptr->lock[i]= &wall_gunshow;
  1769. else if (game_move == MOVE_PICK_SPECIAL || game_move == MOVE_DISCARD_TILE)
  1770. user_ptr->lock[i]=&wall_gunhide;
  1771. i++;
  1772. for (j=0; j<4 ; j++)
  1773. {
  1774. user_ptr->lock[i] = user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(target_id,user_ptr->hand)];
  1775. mmi_gx_vsmj_eliminate_tile(target_id,user_ptr->hand);
  1776. i++;
  1777. }
  1778. user_ptr->lock[i] = &wall_end;
  1779. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1780. highlight=&wall_end;
  1781. game_move= MOVE_REPLENISH_TILE;
  1782. // current_user = user_ptr; /*not necessary*/
  1783. sign_delay=20;
  1784. sign=SIGN_GUN;
  1785. }
  1786. /************************************************************** 
  1787. FUNCTION NAME : mmi_gx_vsmj_bugon
  1788. PURPOSE : Debug use
  1789. INPUT PARAMETERS : S16
  1790. OUTPUT PARAMETERS : nil 
  1791. RETURNS : void 
  1792. REMARKS : nil 
  1793. ***************************************************************/ 
  1794. void mmi_gx_vsmj_bugun(gx_vsmj_user_struct *user_ptr)
  1795. {
  1796. S16 i;
  1797. gun_times++;
  1798. i=mmi_gx_vsmj_find_no_with_tile_id(highlight->id,user_ptr->lock);
  1799. user_ptr->lock[i-1] = &wall_gunshow;
  1800. user_ptr->lock[i+3] = highlight;
  1801. mmi_gx_vsmj_eliminate_tile(highlight->id,user_ptr->hand);
  1802. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1803. highlight = &wall_end;
  1804. game_move= MOVE_REPLENISH_TILE;
  1805. // current_user = user_ptr; /*not necessary*/
  1806. sign_delay=20;
  1807. sign=SIGN_GUN;
  1808. }
  1809. /************************************************************** 
  1810. FUNCTION NAME : mmi_gx_vsmj_pon
  1811. PURPOSE : Debug use
  1812. INPUT PARAMETERS : S16
  1813. OUTPUT PARAMETERS : nil 
  1814. RETURNS : void 
  1815. REMARKS : nil 
  1816. ***************************************************************/ 
  1817. void mmi_gx_vsmj_pon(gx_vsmj_user_struct *user_ptr)
  1818. {
  1819. S16 i;
  1820. i = mmi_gx_vsmj_find_no_with_tile_id(WALL_END,user_ptr->lock);
  1821. user_ptr->lock[i] = &wall_pon;
  1822. user_ptr->lock[i+1]= user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(highlight->id,user_ptr->hand)];
  1823. mmi_gx_vsmj_eliminate_tile(highlight->id,user_ptr->hand);
  1824. user_ptr->lock[i+2]= user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(highlight->id,user_ptr->hand)];
  1825. mmi_gx_vsmj_eliminate_tile(highlight->id,user_ptr->hand);
  1826. user_ptr->lock[i+3]= user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(highlight->id,user_ptr->hand)];
  1827. mmi_gx_vsmj_eliminate_tile(highlight->id,user_ptr->hand);
  1828. user_ptr->lock[i+4]= &tile_empty;
  1829. user_ptr->lock[i+5] = &wall_end;
  1830. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1831. highlight = &wall_end;
  1832. game_move= MOVE_DISCARD_TILE;
  1833. // current_user = user_ptr;  /* not necessary */
  1834. sign_delay=20;
  1835. sign=SIGN_PON;
  1836. }
  1837. /************************************************************** 
  1838. FUNCTION NAME : mmi_gx_vsmj_eat
  1839. PURPOSE : Debug use
  1840. INPUT PARAMETERS : S16
  1841. OUTPUT PARAMETERS : nil 
  1842. RETURNS : void 
  1843. REMARKS : nil 
  1844. ***************************************************************/ 
  1845. void mmi_gx_vsmj_eat(gx_vsmj_user_struct *user_ptr,U8 type)
  1846. {
  1847. S16 i;
  1848. S16 d1,d2;
  1849. switch (type)
  1850. {
  1851. case 0:
  1852. d1=-2;
  1853. d2=-1;
  1854. break;
  1855. case 1:
  1856. d1=-1;
  1857. d2=1;
  1858. break;
  1859. case 2:
  1860. d1=1;
  1861. d2=2;
  1862. break;
  1863. }
  1864. i=mmi_gx_vsmj_find_no_with_tile_id(WALL_END,user_ptr->lock);
  1865. user_ptr->lock[i] = &wall_eat;
  1866. user_ptr->lock[i+1] = user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(highlight->id +d1,user_ptr->hand)];
  1867. mmi_gx_vsmj_eliminate_tile(highlight->id +d1, user_ptr->hand);
  1868. user_ptr->lock[i+2] = user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(highlight->id ,user_ptr->hand)];
  1869. mmi_gx_vsmj_eliminate_tile(highlight->id, user_ptr->hand);
  1870. user_ptr->lock[i+3] = user_ptr->hand[mmi_gx_vsmj_find_no_with_tile_id(highlight->id +d2,user_ptr->hand)];
  1871. mmi_gx_vsmj_eliminate_tile(highlight->id +d2, user_ptr->hand);
  1872. user_ptr->lock[i+4]= &tile_empty;
  1873. user_ptr->lock[i+5]= &wall_end; 
  1874. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  1875. highlight= &wall_end;
  1876. game_move= MOVE_DISCARD_TILE;
  1877. // current_user = user_ptr; /*not necessary */
  1878. sign_delay=20;
  1879. sign=SIGN_EAT;
  1880. }
  1881. /**************************************************************
  1882. FUNCTION NAME : mmi_gx_vsmj_check_hou
  1883.    PURPOSE :check eat 
  1884. INPUT PARAMETERS : ptr array
  1885.  
  1886. OUTPUT PARAMETERS : nil
  1887. RETURNS : void
  1888. REMARKS : nil
  1889. ***************************************************************/
  1890. BOOL mmi_gx_vsmj_check_hou(gx_vsmj_user_struct *user_ptr)
  1891. {
  1892. gx_vsmj_tile_struct tile_set[18];
  1893. gx_vsmj_tile_struct *tile_set_ptr[18];
  1894. S16 i;
  1895. /*initialize*/
  1896. i=0;
  1897. while (user_ptr->hand[i]->id !=WALL_END)
  1898. {
  1899. tile_set_ptr[i] = &tile_set[i];
  1900. tile_set[i].id = user_ptr->hand[i]->id;
  1901. tile_set[i].pos = CHK_NOTUSED;
  1902. i++;
  1903. }
  1904. tile_set[i].id = WALL_END;
  1905. tile_set[i].pos = CHK_END;
  1906. tile_set_ptr[i] = &tile_set[i];
  1907. /*initialize*/
  1908. return mmi_gx_vsmj_hou_trial(tile_set_ptr , FALSE);
  1909. }
  1910. /**************************************************************
  1911. FUNCTION NAME : mmi_gx_vsmj_check_eat()
  1912.    PURPOSE :check eat 
  1913. INPUT PARAMETERS : ptr array
  1914.  
  1915. OUTPUT PARAMETERS : nil
  1916. RETURNS : void
  1917. REMARKS : nil
  1918. ***************************************************************/
  1919. BOOL mmi_gx_vsmj_check_eat(gx_vsmj_user_struct *user_ptr,U8 type)
  1920. {
  1921. S16 d1,d2;
  1922. /* skip loop for never work case */
  1923. if (highlight->id <= TE_BAI)
  1924. return FALSE;
  1925. /* skip loop for never work case */
  1926. switch (type)
  1927. {
  1928. case 0: /* xxo */
  1929. /* skip loop for never work case */
  1930. switch (highlight->id)
  1931. {
  1932. case NU_1S:
  1933. case NU_2S:
  1934. case NU_1T:
  1935. case NU_2T:
  1936. case NU_1W:
  1937. case NU_2W:
  1938. return FALSE;
  1939. break;
  1940. }
  1941. /* skip loop for never work case */
  1942. d1=-2;
  1943. d2=-1;
  1944. break;
  1945. case 1: /* xox */
  1946. /* skip loop for never work case */
  1947. switch (highlight->id)
  1948. {
  1949. case NU_1S:
  1950. case NU_9S:
  1951. case NU_1T:
  1952. case NU_9T:
  1953. case NU_1W:
  1954. case NU_9W:
  1955. user_ptr->can_eat[1]=FALSE;
  1956. return FALSE;
  1957. break;
  1958. }
  1959. /* skip loop for never work case */
  1960. d1=-1;
  1961. d2=1;
  1962. break;
  1963. case 2: /* oxx*/
  1964. /* skip loop for never work case */
  1965. switch (highlight->id)
  1966. {
  1967. case NU_8S:
  1968. case NU_9S:
  1969. case NU_8T:
  1970. case NU_9T:
  1971. case NU_8W:
  1972. case NU_9W:
  1973. user_ptr->can_eat[2]=FALSE;
  1974. return FALSE;
  1975. break;
  1976. }
  1977. /* skip loop for never work case */
  1978. d1=1;
  1979. d2=2;
  1980. break;
  1981. }
  1982. if (mmi_gx_vsmj_find_no_with_tile_id(highlight->id +d1,user_ptr->hand) != -1)
  1983. if (mmi_gx_vsmj_find_no_with_tile_id(highlight->id +d2,user_ptr->hand) != -1)
  1984. return TRUE;
  1985. /*fail*/
  1986. return FALSE;
  1987. }
  1988. /**************************************************************
  1989. FUNCTION NAME : mmi_gx_vsmj_check_pon()
  1990.    PURPOSE :check pon
  1991. INPUT PARAMETERS : ptr array
  1992.  
  1993. OUTPUT PARAMETERS : nil
  1994. RETURNS : void
  1995. REMARKS : nil
  1996. ***************************************************************/
  1997. BOOL mmi_gx_vsmj_check_pon(gx_vsmj_user_struct *user_ptr)
  1998. {
  1999. S16 i;
  2000. U8 num_found=0;
  2001. i=0;
  2002. while (user_ptr->hand[i]->id != WALL_END)
  2003. {
  2004. if (user_ptr->hand[i]->id == highlight->id)
  2005. {
  2006. num_found++;
  2007. }
  2008. i++;
  2009. }
  2010. if (num_found>=3) /* have 2 in hand already and include the one from highlight */
  2011. return TRUE;
  2012. else
  2013. return FALSE;
  2014. }
  2015. /**************************************************************
  2016. FUNCTION NAME : mmi_gx_vsmj_check_handgun()
  2017.    PURPOSE :check gun
  2018. INPUT PARAMETERS : ptr array
  2019.  
  2020. OUTPUT PARAMETERS : nil
  2021. RETURNS : void
  2022. REMARKS : nil
  2023. ***************************************************************/
  2024. BOOL mmi_gx_vsmj_check_bugun(gx_vsmj_user_struct *user_ptr)
  2025. {
  2026. S16 i;
  2027. if (highlight->id != WALL_END)
  2028. {
  2029. i=mmi_gx_vsmj_find_no_with_tile_id(highlight->id,user_ptr->lock); /*no of first tile with highlight id*/
  2030. if (i!=-1) /*tile exist*/
  2031. if (user_ptr->lock[i+1]->id == highlight->id)
  2032. if (user_ptr->lock[i+2]->id == highlight->id)
  2033. return TRUE;
  2034. }
  2035. /*fail*/
  2036. return FALSE;
  2037. }
  2038. /**************************************************************
  2039. FUNCTION NAME : mmi_gx_vsmj_check_handgun
  2040.    PURPOSE :check gun
  2041. INPUT PARAMETERS : ptr array
  2042.  
  2043. OUTPUT PARAMETERS : nil
  2044. RETURNS : void
  2045. REMARKS : nil
  2046. ***************************************************************/
  2047. BOOL mmi_gx_vsmj_check_handgun(gx_vsmj_user_struct *user_ptr)
  2048. {
  2049. /*all in hand cases*/
  2050. S16 i;
  2051. gx_vsmj_tile_id_enum temp_tile_id;
  2052. U8 num_found_set=0;
  2053. i=0;
  2054. while (user_ptr->hand[i]->id !=WALL_END)
  2055. {
  2056. user_ptr->hand[i]->pos = CHK_NOTUSED;
  2057. i++;
  2058. }
  2059. for (temp_tile_id=TE_EAST ; temp_tile_id <= NU_9T ; temp_tile_id++)
  2060. {
  2061. if (mmi_gx_vsmj_check_multi(4,temp_tile_id,user_ptr->hand))
  2062. {
  2063. user_ptr->can_handgun[num_found_set]=TRUE;
  2064. user_ptr->handgun_id[num_found_set]= temp_tile_id;
  2065. num_found_set++;
  2066. }
  2067. }
  2068. if (num_found_set >0)
  2069. return TRUE;
  2070. else
  2071. return FALSE;
  2072. }
  2073. /**************************************************************
  2074. FUNCTION NAME : mmi_gx_vsmj_check_multi
  2075.    PURPOSE :check eat 
  2076. INPUT PARAMETERS : ptr array
  2077.  
  2078. OUTPUT PARAMETERS : nil
  2079. RETURNS : void
  2080. REMARKS : nil
  2081. ***************************************************************/
  2082. BOOL mmi_gx_vsmj_check_multi(U8 multi_time,gx_vsmj_tile_id_enum target_id,gx_vsmj_tile_struct *tile_set_ptr[])
  2083. {
  2084. S16 i;
  2085. U8 temp_multi_time=0;
  2086. i=0;
  2087. while (tile_set_ptr[i]->id != WALL_END)
  2088. {
  2089. if (tile_set_ptr[i]->id == target_id)
  2090. if (tile_set_ptr[i]->pos == CHK_NOTUSED)
  2091. {
  2092. temp_multi_time++;
  2093. if (temp_multi_time == multi_time)
  2094. {
  2095. return TRUE;
  2096. }
  2097. }
  2098. i++;
  2099. }
  2100. /*didnt' get in return true=>fail*/
  2101. return FALSE;
  2102. }
  2103. /**************************************************************
  2104. FUNCTION NAME : mmi_gx_vsmj_check_link
  2105.    PURPOSE :check eat 
  2106. INPUT PARAMETERS : ptr array
  2107.  
  2108. OUTPUT PARAMETERS : nil
  2109. RETURNS : void
  2110. REMARKS : nil
  2111. ***************************************************************/
  2112. BOOL mmi_gx_vsmj_check_link(U8 link_time,gx_vsmj_tile_id_enum target_id, 
  2113. gx_vsmj_tile_struct *tile_set_ptr[])
  2114. {
  2115. /* basically for 2 and 3 node link check only*/
  2116. S16 i;
  2117. U8 num_link_found=0;
  2118. /* skip loop for never work case */
  2119. if (target_id >= TE_EAST && target_id <=TE_BAI)
  2120. return FALSE;
  2121. if (target_id == NU_9S || target_id == NU_9W || target_id == NU_9T) 
  2122. return FALSE;
  2123. if (link_time == 3)
  2124. if (target_id == NU_8S || target_id == NU_8W || target_id == NU_8T) 
  2125. return FALSE;
  2126. /* skip loop for never work case */
  2127. i=0;
  2128. while (tile_set_ptr[i]->id != WALL_END)
  2129. {
  2130. if (tile_set_ptr[i]->id == target_id + num_link_found)
  2131. if (tile_set_ptr[i]->pos == CHK_NOTUSED)
  2132. {
  2133. num_link_found++;
  2134. if (num_link_found == link_time)
  2135. return TRUE;
  2136. }
  2137. i++;
  2138. }
  2139. /* didnt get in return true =>fail*/
  2140. return FALSE;
  2141. }
  2142. /**************************************************************
  2143. FUNCTION NAME : mmi_gx_vsmj_framemove()
  2144.    PURPOSE : 
  2145.   
  2146. INPUT PARAMETERS : nil
  2147.  
  2148. OUTPUT PARAMETERS : nil
  2149. RETURNS : void
  2150. REMARKS : nil
  2151. ***************************************************************/
  2152. void mmi_gx_vsmj_framemove(void)
  2153. {
  2154. S16 i;
  2155. gx_vsmj_user_id_enum target_id;
  2156. switch (game_move)
  2157. {
  2158. case MOVE_DISCARD_CHECK_START:
  2159. /* check special move possibility */
  2160. for (i=0; i < NUM_PLAYER ; i++)
  2161. {
  2162. /*reset */
  2163. user[i].can_hou=FALSE;
  2164. user[i].can_bugun=FALSE;
  2165. user[i].can_handgun[0]=FALSE;
  2166. user[i].can_handgun[1]=FALSE;
  2167. user[i].can_handgun[2]=FALSE;
  2168. user[i].can_handgun[3]=FALSE;
  2169. user[i].can_pon=FALSE;
  2170. user[i].can_eat[0]=FALSE;
  2171. user[i].can_eat[1]=FALSE;
  2172. user[i].can_eat[2]=FALSE;
  2173. /*reset*/
  2174. if (user[i].id != last_user->id) /*not the one just discarded highlight tile */
  2175. {
  2176. /*initialize*/
  2177. mmi_gx_vsmj_insert_tile(highlight,user[i].hand);
  2178. mmi_gx_vsmj_sort_tile(user[i].hand);
  2179. /*initialize*/
  2180. /* check if the next player can eat */
  2181. if ( user[i].id == last_user->id +1  || (user[i].id==0 && last_user->id == NUM_PLAYER-1))
  2182. {
  2183. user[i].can_eat[0]=mmi_gx_vsmj_check_eat(&user[i],0);
  2184. user[i].can_eat[1]=mmi_gx_vsmj_check_eat(&user[i],1);
  2185. user[i].can_eat[2]=mmi_gx_vsmj_check_eat(&user[i],2);
  2186. }
  2187. user[i].can_hou = mmi_gx_vsmj_check_hou(&user[i]);
  2188. user[i].can_pon = mmi_gx_vsmj_check_pon(&user[i]);
  2189. mmi_gx_vsmj_check_handgun(&user[i]);
  2190. /* move temp highlight out*/
  2191. mmi_gx_vsmj_eliminate_tile(highlight->id,user[i].hand);
  2192. mmi_gx_vsmj_sort_tile(user[i].hand);
  2193. /* move temp highlight out*/
  2194. }
  2195. else
  2196. {
  2197. user[i].can_hou=FALSE;
  2198. user[i].can_bugun=FALSE;
  2199. user[i].can_handgun[0]=FALSE;
  2200. user[i].can_handgun[1]=FALSE;
  2201. user[i].can_handgun[2]=FALSE;
  2202. user[i].can_handgun[3]=FALSE;
  2203. user[i].can_pon=FALSE;
  2204. user[i].can_eat[0]=FALSE;
  2205. user[i].can_eat[1]=FALSE;
  2206. user[i].can_eat[2]=FALSE;
  2207. }
  2208. }
  2209. game_move = MOVE_DISCARD_CHECK_CONTINUE;
  2210. break;
  2211. case MOVE_DISCARD_CHECK_CONTINUE:
  2212. target_id = last_user->id;
  2213. for (i=0 ; i< NUM_PLAYER ; i++)
  2214. {
  2215. if (user[i].can_hou)
  2216. target_id = user[i].id;
  2217. }
  2218. for (i=0 ; i<NUM_PLAYER ; i++)
  2219. {
  2220. if (user[i].can_pon || user[i].can_handgun[0])
  2221. target_id = user[i].id;
  2222. }
  2223. for (i=0 ; i < NUM_PLAYER ; i++)
  2224. {
  2225. if (user[i].can_eat[0] ||user[i].can_eat[1] ||user[i].can_eat[2])
  2226. target_id = user[i].id;
  2227. }
  2228. if (target_id != last_user->id) /* someone else have a special move to choice */
  2229. {
  2230. mmi_gx_vsmj_insert_tile(highlight,user[target_id].hand);
  2231. mmi_gx_vsmj_sort_tile(user[target_id].hand);
  2232. current_user = &user[target_id];
  2233. game_move = MOVE_DISCARD_SPECIAL;
  2234. }
  2235. else
  2236. {
  2237. /* drop to grave */
  2238. highlight->pos=POS_GRAVE;
  2239. grave[grave_index++]=highlight;
  2240. highlight=&wall_end;
  2241. /* drop to grave */
  2242. if (last_user->id != NUM_PLAYER-1)
  2243. target_id=last_user->id+1;
  2244. else
  2245. target_id=0;
  2246. current_user = &user[target_id];
  2247. game_move = MOVE_PICK_TILE;
  2248. }
  2249. break;
  2250. case MOVE_DECLARE_HOU:
  2251. game_delay= 50;
  2252. game_move = MOVE_RESULT;
  2253. break;
  2254. case MOVE_RESULT:
  2255. g_gx_vsmj_context.is_gameover=TRUE;
  2256. break;
  2257. case MOVE_LIOU_GU:
  2258. g_gx_vsmj_context.is_gameover=TRUE;
  2259. break;
  2260. default:
  2261. if (g_gx_vsmj_context.game_level ==0) /* normal play mode */
  2262. {
  2263. if (current_user->id == PLAYER_1)
  2264. {
  2265.   mmi_gx_vsmj_player_move(current_user);
  2266. }
  2267. else /* computer move */
  2268. {
  2269. mmi_gx_vsmj_com_move(current_user);
  2270. }
  2271. break;
  2272. }
  2273. else if (g_gx_vsmj_context.game_level ==1) /*cpu paly mode */
  2274. {
  2275. mmi_gx_vsmj_com_move(current_user);
  2276. }
  2277. }
  2278. pen_pos = PP_PENNOTDOWN;
  2279. }
  2280. /************************************************************** 
  2281. FUNCTION NAME : mmi_gx_vsmj_player_move
  2282. PURPOSE : Debug use
  2283. INPUT PARAMETERS : S16
  2284. OUTPUT PARAMETERS : nil 
  2285. RETURNS : void 
  2286. REMARKS : nil 
  2287. ***************************************************************/ 
  2288. void mmi_gx_vsmj_player_move(gx_vsmj_user_struct *user_ptr)
  2289. {
  2290. S16 choice;
  2291. S16 i;
  2292. switch (game_move)
  2293. {
  2294. case MOVE_PICK_TILE: /*full done */
  2295. if (end_index-start_index+gun_times <16) /* 瑈Ы*/
  2296. {
  2297. /* pop out liou gu sign for some ticks and gameover */
  2298. g_gx_vsmj_context.game_grade=0;
  2299. sign = SIGN_LIOU_GU;
  2300. game_delay=50;
  2301. sign_delay=20;
  2302. game_move=MOVE_LIOU_GU;
  2303. return;
  2304. }
  2305. switch (pen_pos)
  2306. {
  2307. case PP_PENNOTDOWN:
  2308. break;
  2309. default:
  2310. mmi_gx_vsmj_pick_tile(user_ptr);
  2311. break;
  2312. }
  2313. break;
  2314. case MOVE_PICK_CHECK: /* full done */
  2315. user_ptr->can_pon = FALSE;
  2316. user_ptr->can_bugun=FALSE;
  2317. user_ptr->can_hou = FALSE;
  2318. user_ptr->can_eat[0]=FALSE;
  2319. user_ptr->can_eat[1]=FALSE;
  2320. user_ptr->can_eat[2]=FALSE;
  2321. user_ptr->can_handgun[0]=FALSE;
  2322. user_ptr->can_handgun[1]=FALSE;
  2323. user_ptr->can_handgun[2]=FALSE;
  2324. user_ptr->can_handgun[3]=FALSE;
  2325. user_ptr->can_hou=mmi_gx_vsmj_check_hou(user_ptr);
  2326. user_ptr->can_bugun=mmi_gx_vsmj_check_bugun(user_ptr);
  2327. mmi_gx_vsmj_check_handgun(user_ptr);
  2328. if (user_ptr->can_hou || user_ptr->can_handgun[0] || user_ptr->can_bugun)
  2329. game_move = MOVE_PICK_SPECIAL;
  2330. else
  2331. game_move = MOVE_DISCARD_TILE;
  2332. break;
  2333. case MOVE_PICK_SPECIAL: /*full done */
  2334. switch (pen_pos)
  2335. {
  2336. case PP_SPECIAL_HOU:
  2337. if (user_ptr->can_hou)
  2338. {
  2339. mmi_gx_vsmj_declare_hou(user_ptr);
  2340. }
  2341. break;
  2342. case PP_SPECIAL_BUGUN:
  2343. if (user_ptr->can_bugun)
  2344. {
  2345. mmi_gx_vsmj_bugun(user_ptr);
  2346. }
  2347. break;
  2348. case PP_SPECIAL_HANDGUN_0:
  2349. if (user_ptr->can_handgun[0])
  2350. {
  2351. mmi_gx_vsmj_handgun(user_ptr->handgun_id[0],user_ptr);
  2352. }
  2353. break;
  2354. case PP_SPECIAL_HANDGUN_1:
  2355. if (user_ptr->can_handgun[1])
  2356. {
  2357. mmi_gx_vsmj_handgun(user_ptr->handgun_id[1],user_ptr);
  2358. }
  2359. break;
  2360. case PP_SPECIAL_HANDGUN_2:
  2361. if (user_ptr->can_handgun[2])
  2362. {
  2363. mmi_gx_vsmj_handgun(user_ptr->handgun_id[2],user_ptr);
  2364. }
  2365. break;
  2366. case PP_SPECIAL_HANDGUN_3:
  2367. if (user_ptr->can_handgun[3])
  2368. {
  2369. mmi_gx_vsmj_handgun(user_ptr->handgun_id[3],user_ptr);
  2370. }
  2371. break;
  2372. case PP_SPECIAL_CANCEL:
  2373. game_move = MOVE_DISCARD_TILE;
  2374. break;
  2375. default:
  2376. break;
  2377. }
  2378. if (game_move != MOVE_PICK_SPECIAL) /*have made a choice so move changed*/
  2379. {
  2380. user_ptr->can_pon = FALSE;
  2381. user_ptr->can_bugun=FALSE;
  2382. user_ptr->can_hou = FALSE;
  2383. user_ptr->can_eat[0]=FALSE;
  2384. user_ptr->can_eat[1]=FALSE;
  2385. user_ptr->can_eat[2]=FALSE;
  2386. user_ptr->can_handgun[0]=FALSE;
  2387. user_ptr->can_handgun[1]=FALSE;
  2388. user_ptr->can_handgun[2]=FALSE;
  2389. user_ptr->can_handgun[3]=FALSE;
  2390. }
  2391. break;
  2392. case MOVE_REPLENISH_TILE: /*full done*/
  2393. if (end_index-start_index+gun_times <16) /* 瑈Ы*/
  2394. {
  2395. /* pop out liou gu sign for some ticks and gameover */
  2396. g_gx_vsmj_context.game_grade=0;
  2397. sign = SIGN_LIOU_GU;
  2398. game_delay=50;
  2399. sign_delay=20;
  2400. game_move=MOVE_LIOU_GU;
  2401. return;
  2402. }
  2403. switch (pen_pos)
  2404. {
  2405. case PP_PENNOTDOWN:
  2406. break;
  2407. default:
  2408. mmi_gx_vsmj_replenish_tile(user_ptr);
  2409. break;
  2410. }
  2411. break;
  2412. case MOVE_DISCARD_TILE: /*full done */
  2413. switch (pen_pos)
  2414. {
  2415. case PP_OWN_0:
  2416. case PP_OWN_1:
  2417. case PP_OWN_2:
  2418. case PP_OWN_3:
  2419. case PP_OWN_4:
  2420. case PP_OWN_5:
  2421. case PP_OWN_6:
  2422. case PP_OWN_7:
  2423. case PP_OWN_8:
  2424. case PP_OWN_9:
  2425. case PP_OWN_10:
  2426. case PP_OWN_11:
  2427. case PP_OWN_12:
  2428. case PP_OWN_13:
  2429. case PP_OWN_14:
  2430. case PP_OWN_15:
  2431. case PP_OWN_16:
  2432. choice = pen_pos;
  2433. if (user_ptr->hand[choice]->id >= highlight->id)
  2434. choice++; /*skip highlight one */
  2435. i=0;
  2436. while (user_ptr->hand[i]->id != WALL_END)
  2437. {
  2438. if (i==choice)
  2439. {
  2440. mmi_gx_vsmj_discard_tile(user_ptr->hand[choice]->id, user_ptr);
  2441. break;
  2442. }
  2443. i++;
  2444. }
  2445. break;
  2446. case PP_HIGHLIGHT:
  2447. if (highlight->id != WALL_END)
  2448. mmi_gx_vsmj_discard_tile(highlight->id, user_ptr);
  2449. break;
  2450. default:
  2451. break;
  2452. }
  2453. break;
  2454. case MOVE_DISCARD_SPECIAL: /*full done */
  2455. switch(pen_pos)
  2456. {
  2457. case PP_SPECIAL_HOU:
  2458. if (user_ptr->can_hou)
  2459. mmi_gx_vsmj_declare_hou(user_ptr);
  2460. break;
  2461. case PP_SPECIAL_BUGUN:
  2462. if (user_ptr->can_bugun)
  2463. {
  2464. mmi_gx_vsmj_bugun(user_ptr);
  2465. }
  2466. break;
  2467. case PP_SPECIAL_HANDGUN_0:
  2468. if (user_ptr->can_handgun[0])
  2469. {
  2470. mmi_gx_vsmj_handgun(user_ptr->handgun_id[0],user_ptr);
  2471. }
  2472. break;
  2473. case PP_SPECIAL_HANDGUN_1:
  2474. if (user_ptr->can_handgun[1])
  2475. {
  2476. mmi_gx_vsmj_handgun(user_ptr->handgun_id[1],user_ptr);
  2477. }
  2478. break;
  2479. case PP_SPECIAL_HANDGUN_2:
  2480. if (user_ptr->can_handgun[2])
  2481. {
  2482. mmi_gx_vsmj_handgun(user_ptr->handgun_id[2],user_ptr);
  2483. }
  2484. break;
  2485. case PP_SPECIAL_HANDGUN_3:
  2486. if (user_ptr->can_handgun[3])
  2487. {
  2488. mmi_gx_vsmj_handgun(user_ptr->handgun_id[3],user_ptr);
  2489. }
  2490. break;
  2491. case PP_SPECIAL_PON:
  2492. if (user_ptr->can_pon)
  2493. mmi_gx_vsmj_pon(user_ptr);
  2494. break;
  2495. case PP_SPECIAL_EAT_0:
  2496. if (user_ptr->can_eat[0])
  2497. {
  2498. mmi_gx_vsmj_eat(user_ptr,0);
  2499. }
  2500. break;
  2501. case PP_SPECIAL_EAT_1:
  2502. if (user_ptr->can_eat[1])
  2503. {
  2504. mmi_gx_vsmj_eat(user_ptr,1);
  2505. }
  2506. break;
  2507. case PP_SPECIAL_EAT_2:
  2508. if (user_ptr->can_eat[2])
  2509. {
  2510. mmi_gx_vsmj_eat(user_ptr,2);
  2511. }
  2512. break;
  2513. case PP_SPECIAL_CANCEL:
  2514. /*clean all*/
  2515. user_ptr->can_pon = FALSE;
  2516. user_ptr->can_bugun=FALSE;
  2517. user_ptr->can_hou = FALSE;
  2518. user_ptr->can_eat[0]=FALSE;
  2519. user_ptr->can_eat[1]=FALSE;
  2520. user_ptr->can_eat[2]=FALSE;
  2521. user_ptr->can_handgun[0]=FALSE;
  2522. user_ptr->can_handgun[1]=FALSE;
  2523. user_ptr->can_handgun[2]=FALSE;
  2524. user_ptr->can_handgun[3]=FALSE;
  2525. /* remove the highlight added for checkment */
  2526. mmi_gx_vsmj_eliminate_tile(highlight->id,user_ptr->hand);
  2527. mmi_gx_vsmj_sort_tile(user_ptr->hand);
  2528. game_move = MOVE_DISCARD_CHECK_CONTINUE;
  2529. break;
  2530. }
  2531. break;
  2532. case MOVE_DECLARE_HOU: /*shouldn't  come here */
  2533. break;
  2534. }
  2535. }
  2536. /************************************************************** 
  2537. FUNCTION NAME : mmi_gx_vsmj_com_think
  2538. PURPOSE : Debug use
  2539. INPUT PARAMETERS : S16
  2540. OUTPUT PARAMETERS : nil 
  2541. RETURNS : void 
  2542. REMARKS : nil 
  2543. ***************************************************************/ 
  2544. void mmi_gx_vsmj_com_move(gx_vsmj_user_struct *user_ptr)
  2545. {
  2546. switch (game_move)
  2547. {
  2548. case MOVE_PICK_TILE: /*full done */
  2549. if (end_index-start_index+gun_times <16) /* 瑈Ы*/
  2550. {
  2551. /* pop out liou gu sign for some ticks and gameover */
  2552. g_gx_vsmj_context.game_grade=0;
  2553. sign = SIGN_LIOU_GU;
  2554. game_delay=50;
  2555. sign_delay=20;
  2556. game_move=MOVE_LIOU_GU;
  2557. return;
  2558. }
  2559. mmi_gx_vsmj_pick_tile(user_ptr);
  2560. break;
  2561. case MOVE_PICK_CHECK: /* full done */
  2562. user_ptr->can_pon = FALSE;
  2563. user_ptr->can_bugun= FALSE;
  2564. user_ptr->can_hou = FALSE;
  2565. user_ptr->can_eat[0]=FALSE;
  2566. user_ptr->can_eat[1]=FALSE;
  2567. user_ptr->can_eat[2]=FALSE;
  2568. user_ptr->can_handgun[0]=FALSE;
  2569. user_ptr->can_handgun[1]=FALSE;
  2570. user_ptr->can_handgun[2]=FALSE;
  2571. user_ptr->can_handgun[3]=FALSE;
  2572. user_ptr->can_bugun=mmi_gx_vsmj_check_bugun(user_ptr);
  2573. mmi_gx_vsmj_check_bugun(user_ptr);
  2574. user_ptr->can_hou=mmi_gx_vsmj_check_hou(user_ptr);
  2575. if (user_ptr->can_hou)
  2576. {
  2577. mmi_gx_vsmj_declare_hou(user_ptr);
  2578. }
  2579. else
  2580. {
  2581. game_move = MOVE_DISCARD_TILE;
  2582. }
  2583. break;
  2584. case MOVE_PICK_SPECIAL:
  2585. break;
  2586. case MOVE_REPLENISH_TILE: /*full done*/
  2587. if (end_index-start_index+gun_times <16) /* 瑈Ы*/
  2588. {
  2589. /* pop out liou gu sign for some ticks and gameover */
  2590. g_gx_vsmj_context.game_grade=0;
  2591. sign = SIGN_LIOU_GU;
  2592. game_delay=50;
  2593. sign_delay=20;
  2594. game_move=MOVE_LIOU_GU;
  2595. return;
  2596. }
  2597. mmi_gx_vsmj_replenish_tile(user_ptr);
  2598. break;
  2599. case MOVE_DISCARD_TILE: /*full done */
  2600. if (com_strategy[user_ptr->id]==COM_STRATEGY_1)
  2601. mmi_gx_vsmj_com_think_st_1(user_ptr);
  2602. else if (com_strategy[user_ptr->id]==COM_STRATEGY_2)
  2603. mmi_gx_vsmj_com_think_st_2(user_ptr);
  2604. break;
  2605. case MOVE_DISCARD_SPECIAL: /*full done */
  2606. if (user_ptr->can_hou)
  2607. {
  2608. mmi_gx_vsmj_declare_hou(user_ptr);
  2609. }
  2610. else
  2611. {
  2612. if (com_strategy[user_ptr->id]==COM_STRATEGY_1)
  2613. mmi_gx_vsmj_com_think_st_1(user_ptr);
  2614. else if (com_strategy[user_ptr->id]==COM_STRATEGY_2)
  2615. mmi_gx_vsmj_com_think_st_2(user_ptr);
  2616. }
  2617. break;
  2618. case MOVE_DECLARE_HOU:
  2619. /*shouldn't  come here */
  2620. break;
  2621. }
  2622. }
  2623. /************************************************************** 
  2624. FUNCTION NAME : mmi_gx_vsmj_declare_hou
  2625. PURPOSE :
  2626. INPUT PARAMETERS : S16
  2627. OUTPUT PARAMETERS : nil 
  2628. RETURNS : void 
  2629. REMARKS : nil 
  2630. ***************************************************************/ 
  2631. void mmi_gx_vsmj_declare_hou(gx_vsmj_user_struct *user_ptr)
  2632. {
  2633. game_move=MOVE_DECLARE_HOU;
  2634. game_delay=50;
  2635. sign_delay=20;
  2636. sign=SIGN_HOU;
  2637. }
  2638. /************************************************************** 
  2639. FUNCTION NAME : mmi_gx_vsmj_count_score
  2640. PURPOSE :
  2641. INPUT PARAMETERS : S16
  2642. OUTPUT PARAMETERS : nil 
  2643. RETURNS : void 
  2644. REMARKS : nil 
  2645. ***************************************************************/
  2646. void mmi_gx_vsmj_count_score(gx_vsmj_user_struct *user_ptr)
  2647. {
  2648. U8 i,j;
  2649. /*for check hou set */
  2650. /* for check hou set */
  2651. U8 temp_flower[2]={0,0};
  2652. U8 temp_3yuang[3]={0,0,0};
  2653. U8 temp_4wind[4]={0,0,0,0};
  2654. U8 temp_W=0;
  2655. U8 temp_T=0;
  2656. U8 temp_S=0;
  2657. U8 temp_TEXT=0;
  2658. U8 temp_num_pon_gun_atlock=0;
  2659. U8 temp_num_pon_gun_athand=0;
  2660. BOOL temp_link_exist = FALSE;
  2661. S16 temp_score=0;
  2662. for (i=0 ; i<SCORE_TOTALNUM ; i++)
  2663. {
  2664. bonus_hou[i]= FALSE;
  2665. }
  2666. bonus_hou[SCORE_8_FLOWER]=score_8_flower;
  2667. bonus_hou[SCORE_7_1_FLOWER]=score_7_1_flower;
  2668. bonus_hou[SCORE_PICK_BY_OWN]=score_last_by_own;
  2669. bonus_hou[SCORE_PICK_BY_REPLENISH]=score_hou_by_replenish;
  2670. /* men-chin */
  2671. if (user_ptr->lock[0]->id==WALL_END) /*16 tiles at hand ,1 highlight,and no tile at lock */
  2672. bonus_hou[SCORE_MEN_CHIN]=TRUE;
  2673. /* men_chin ze mo */
  2674. if (bonus_hou[SCORE_MEN_CHIN] && bonus_hou[SCORE_PICK_BY_OWN])
  2675. {
  2676. bonus_hou[SCORE_MEN_CHIN] =FALSE;
  2677. bonus_hou[SCORE_PICK_BY_OWN]=FALSE;
  2678. bonus_hou[SCORE_MEN_CHIN_ZE_MO]=TRUE;
  2679. }
  2680. /* men_chin ze mo */
  2681. /*flower gun */
  2682. for (i=0; user_ptr->flower[i]->id !=WALL_END ; i++)
  2683. {
  2684. if (user_ptr->flower[i]->id >=FL_SPRING && user_ptr->flower[i]->id <= FL_WINTER)
  2685. temp_flower[0]++;
  2686. else if (user_ptr->flower[i]->id >=FL_M && user_ptr->flower[i]->id <= FL_J)
  2687. temp_flower[1]++;
  2688. }
  2689. if (temp_flower[0]==4)
  2690. bonus_hou[SCORE_FLOWER_SEASON_SET]=TRUE;
  2691. if (temp_flower[1]==4)
  2692. bonus_hou[SCORE_FLOWER_PLANT_SET]=TRUE;
  2693. /*flower gun */
  2694. /*big small 3 yuang, 3-yuang-pai */
  2695. for (i=0 ; user_ptr->hand[i]->id != WALL_END ; i++)
  2696. {
  2697. if (user_ptr->hand[i]->id == TE_CHUNG)
  2698. temp_3yuang[0]++;
  2699. else if (user_ptr->hand[i]->id == TE_FA)
  2700. temp_3yuang[1]++;
  2701. else if (user_ptr->hand[i]->id == TE_BAI)
  2702. temp_3yuang[2]++;
  2703. }
  2704. for (i=0 ; user_ptr->lock[i]->id != WALL_END ; i++)
  2705. {
  2706. if (user_ptr->lock[i]->id == TE_CHUNG)
  2707. temp_3yuang[0]++;
  2708. else if (user_ptr->lock[i]->id == TE_FA)
  2709. temp_3yuang[1]++;
  2710. else if (user_ptr->lock[i]->id == TE_BAI)
  2711. temp_3yuang[2]++;
  2712. }
  2713. if (temp_3yuang[0]>=3 &&  temp_3yuang[1]>=3 && temp_3yuang[2]>=3)
  2714. bonus_hou[SCORE_BIG_3_YUANG]=TRUE;
  2715. else if ( (temp_3yuang[0]==2 && temp_3yuang[1]>=3 && temp_3yuang[2]>=3)
  2716. || (temp_3yuang[0]>=3 && temp_3yuang[1]==2 && temp_3yuang[2]>=3)
  2717. ||(temp_3yuang[0]>=3 && temp_3yuang[1]>=3 && temp_3yuang[2]==2) )
  2718. bonus_hou[SCORE_SMALL_3_YUANG]=TRUE;
  2719. else
  2720. {
  2721. if (temp_3yuang[0]>=3)
  2722. bonus_hou[SCORE_3_YUANG_CHUNG]=TRUE;
  2723. if (temp_3yuang[1]>=3)
  2724. bonus_hou[SCORE_3_YUANG_FA]=TRUE;
  2725. if (temp_3yuang[2]>=3)
  2726. bonus_hou[SCORE_3_YUANG_BAI]=TRUE;
  2727. }
  2728. /*big small 3 yuang , 3-yuang-pai */
  2729. /*big small 4 shi */
  2730. for (i=0 ; user_ptr->hand[i]->id != WALL_END ; i++)
  2731. {
  2732. if (user_ptr->hand[i]->id == TE_EAST)
  2733. temp_4wind[0]++;
  2734. else if (user_ptr->hand[i]->id == TE_WEST)
  2735. temp_4wind[1]++;
  2736. else if (user_ptr->hand[i]->id == TE_SOUTH)
  2737. temp_4wind[2]++;
  2738. else if (user_ptr->hand[i]->id == TE_NORTH)
  2739. temp_4wind[3]++;
  2740. }
  2741. for (i=0 ; user_ptr->lock[i]->id != WALL_END ; i++)
  2742. {
  2743. if (user_ptr->lock[i]->id == TE_EAST)
  2744. temp_4wind[0]++;
  2745. else if (user_ptr->lock[i]->id == TE_WEST)
  2746. temp_4wind[1]++;
  2747. else if (user_ptr->lock[i]->id == TE_SOUTH)
  2748. temp_4wind[2]++;
  2749. else if (user_ptr->lock[i]->id == TE_NORTH)
  2750. temp_4wind[3]++;
  2751. }
  2752. if (temp_4wind[0]>=3 && temp_4wind[1]>=3 && temp_4wind[2]>=3 && temp_4wind[3]>=3)
  2753. bonus_hou[SCORE_BIG_4_WIND]=TRUE;
  2754. else if ( (temp_4wind[0]==2 && temp_4wind[1]>=3 && temp_4wind[2]>=3 && temp_4wind[3]>=3)
  2755. || (temp_4wind[0]>=3 && temp_4wind[1]==2 && temp_4wind[2]>=3 && temp_4wind[3]>=3)
  2756. ||(temp_4wind[0]>=3 && temp_4wind[1]>=3 && temp_4wind[2]==2 && temp_4wind[3]>=3)
  2757. ||(temp_4wind[0]>=3 && temp_4wind[1]>=3 && temp_4wind[2]>=3 && temp_4wind[3]==2) )
  2758. bonus_hou[SCORE_SMALL_4_WIND]=TRUE;
  2759. /*big small 4 shi */
  2760. /* else
  2761. {
  2762. if (temp_4wind[0]>=3)
  2763. bonus_hou[SCORE_4_WIND_EAST]=TRUE;
  2764. if (temp_4wind[1]>=3)
  2765. bonus_hou[SCORE_4_WIND_WEST]=TRUE;
  2766. if (temp_4wind[2]>=3)
  2767. bonus_hou[SCORE_4_WIND_SOUTH]=TRUE;
  2768. if (temp_4wind[3]>=3)
  2769. bonus_hou[SCORE_4_WIND_NORTH]=TRUE;
  2770. }
  2771. */      /* no boarder => nowind score */
  2772. /* sea_moon */
  2773. if (end_index - start_index +gun_times == 16)
  2774. {
  2775. if (score_last_by_own)
  2776. bonus_hou[SCORE_SEA_MOON]=TRUE;
  2777. }
  2778. /* sea_moon , sea_fish */
  2779. /* chuan chio */
  2780. if (user_ptr->hand[1]->id == WALL_END && score_last_by_own == FALSE) /* so only 1 hand tile not in lock */
  2781. bonus_hou[SCORE_CHUAN_CHIO]=TRUE; /* rule: cant count together with ze-mo*/
  2782. /* chuan chio */
  2783. /*the one-color s */
  2784. for (i=0 ; user_ptr->hand[i]->id != WALL_END ; i++)
  2785. {
  2786. if (user_ptr->hand[i]->id >= NU_1W && user_ptr->hand[i]->id <= NU_9W)
  2787. temp_W++;
  2788. else if (user_ptr->hand[i]->id >= NU_1T && user_ptr->hand[i]->id <= NU_9T)
  2789. temp_T++;
  2790. else if (user_ptr->hand[i]->id >= NU_1S && user_ptr->hand[i]->id <= NU_9S)
  2791. temp_S++;
  2792. else if (user_ptr->hand[i]->id >= TE_EAST && user_ptr->hand[i]->id <= TE_BAI)
  2793. temp_TEXT++;
  2794. }
  2795. for (i=0 ; user_ptr->lock[i]->id != WALL_END ; i++)
  2796. {
  2797. if (user_ptr->lock[i]->id >= NU_1W && user_ptr->lock[i]->id <= NU_9W)
  2798. temp_W++;
  2799. else if (user_ptr->lock[i]->id >= NU_1T && user_ptr->lock[i]->id <= NU_9T)
  2800. temp_T++;
  2801. else if (user_ptr->lock[i]->id >= NU_1S && user_ptr->lock[i]->id <= NU_9S)
  2802. temp_S++;
  2803. else if (user_ptr->lock[i]->id >= TE_EAST && user_ptr->lock[i]->id <= TE_BAI)
  2804. temp_TEXT++;
  2805. }
  2806. if (temp_W==0 && temp_T==0 && temp_S ==0 && temp_TEXT>0)
  2807. {
  2808. // cancel text_1_color , rarely used
  2809. // bonus_hou[SCORE_TEXT_1_COLOR]=TRUE;
  2810. }
  2811. else if (  (temp_W>0 && temp_T==0 && temp_S ==0 && temp_TEXT==0)
  2812. || (temp_W==0 && temp_T>0 && temp_S ==0 && temp_TEXT==0)
  2813. || (temp_W==0 && temp_T==0 && temp_S >0 && temp_TEXT==0)
  2814. || (temp_W==0 && temp_T==0 && temp_S ==0 && temp_TEXT>0) )
  2815. bonus_hou[SCORE_NUM_1_COLOR]=TRUE;
  2816. else if (  (temp_W>0 && temp_T==0 && temp_S ==0 && temp_TEXT >0)
  2817. || (temp_W==0 && temp_T>0 && temp_S ==0 && temp_TEXT >0)
  2818. || (temp_W==0 && temp_T==0 && temp_S > 0 && temp_TEXT>0) )
  2819. bonus_hou[SCORE_MIX_1_COLOR]=TRUE;
  2820. /*the one-color s */
  2821. /* get hou set info */
  2822. mmi_gx_vsmj_reset_chk_all(user_ptr->hand);
  2823. mmi_gx_vsmj_hou_trial(user_ptr->hand,FALSE);
  2824. /* get hou set info */
  2825. /*3,4,5 en ke */
  2826. i=0;
  2827. while (user_ptr->lock[i]->id != WALL_END)
  2828. {
  2829. if (user_ptr->lock[i]->id == WALL_GUNHIDE)
  2830. temp_num_pon_gun_atlock++;
  2831. i++;
  2832. }
  2833. i=0;
  2834. j=0;
  2835. while (user_ptr->hand[i]->id != WALL_END)
  2836. {
  2837. if (user_ptr->hand[i]->pos==CHK_TRIPLE)
  2838. j++;
  2839. i++;
  2840. }
  2841. temp_num_pon_gun_athand= j / 3;
  2842. switch (temp_num_pon_gun_athand + temp_num_pon_gun_atlock)
  2843. {
  2844. case 3:
  2845. bonus_hou[SCORE_3_ENKE]=TRUE;
  2846. break;
  2847. case 4:
  2848. bonus_hou[SCORE_4_ENKE]=TRUE;
  2849. break;
  2850. case 5:
  2851. bonus_hou[SCORE_5_ENKE]=TRUE;
  2852. break;
  2853. default:
  2854. break;
  2855. }
  2856. /*3,4,5 en ke */
  2857. /*duei duei hou */
  2858. i=0;
  2859. while (user_ptr->lock[i]->id != WALL_END)
  2860. {
  2861. if (user_ptr->lock[i]->id == WALL_EAT)
  2862. {
  2863. temp_link_exist=TRUE;
  2864. break;
  2865. }
  2866. i++;
  2867. }
  2868. i=0;
  2869. while (user_ptr->hand[i]->id != WALL_END)
  2870. {
  2871. if (user_ptr->hand[i]->pos == CHK_LINE_R )
  2872. {
  2873. temp_link_exist=TRUE;
  2874. break;
  2875. }
  2876. i++;
  2877. }
  2878. if (temp_link_exist ==FALSE)
  2879. {
  2880. bonus_hou[SCORE_PAIR_PAIR_HOU]=TRUE;
  2881. }
  2882. /*duei duei hou */
  2883. /***********send score*************/
  2884. if (bonus_hou[SCORE_8_FLOWER])
  2885. temp_score += 8;
  2886. if (bonus_hou[SCORE_7_1_FLOWER])
  2887. temp_score += 8;
  2888. /* hou by 8_flower and 7_1_flower have no chance of the following bonus */
  2889. if (bonus_hou[SCORE_8_FLOWER] ||bonus_hou[SCORE_7_1_FLOWER])
  2890. {
  2891. if (user_ptr->id ==PLAYER_1) /*win*/
  2892. g_gx_vsmj_context.game_grade=temp_score;
  2893. else /*lose */
  2894. g_gx_vsmj_context.game_grade= 0 - temp_score;
  2895. return;
  2896. }
  2897. if (bonus_hou[SCORE_PICK_BY_OWN])
  2898. temp_score += 1;
  2899. if (bonus_hou[SCORE_PICK_BY_REPLENISH])
  2900. temp_score += 1;
  2901. if (bonus_hou[SCORE_MEN_CHIN])
  2902. temp_score += 1;
  2903. if (bonus_hou[SCORE_MEN_CHIN_ZE_MO])
  2904. temp_score += 3;
  2905. if (bonus_hou[SCORE_FLOWER_SEASON_SET])
  2906. temp_score += 1;
  2907. if (bonus_hou[SCORE_FLOWER_PLANT_SET])
  2908. temp_score += 1;
  2909. if (bonus_hou[SCORE_SEA_MOON])
  2910. temp_score += 1;
  2911. /*
  2912. if (bonus_hou[SCORE_SEA_FISH])
  2913. temp_score += 1;
  2914. */
  2915. if (bonus_hou[SCORE_CHUAN_CHIO])
  2916. temp_score += 2;
  2917. if (bonus_hou[SCORE_BIG_3_YUANG])
  2918. temp_score += 8;
  2919. if (bonus_hou[SCORE_SMALL_3_YUANG])
  2920. temp_score += 4;
  2921. if (bonus_hou[SCORE_3_YUANG_CHUNG])
  2922. temp_score += 1;
  2923. if (bonus_hou[SCORE_3_YUANG_FA])
  2924. temp_score += 1;
  2925. if (bonus_hou[SCORE_3_YUANG_BAI])
  2926. temp_score += 1;
  2927. if (bonus_hou[SCORE_BIG_4_WIND])
  2928. temp_score += 16;
  2929. if (bonus_hou[SCORE_SMALL_4_WIND])
  2930. temp_score += 8;
  2931. if (bonus_hou[SCORE_3_ENKE])
  2932. temp_score += 2;
  2933. if (bonus_hou[SCORE_4_ENKE])
  2934. temp_score += 5;
  2935. if (bonus_hou[SCORE_5_ENKE])
  2936. temp_score += 8;
  2937. /*
  2938. if (bonus_hou[SCORE_TEXT_1_COLOR])
  2939. temp_score += 8;
  2940. */
  2941. if (bonus_hou[SCORE_NUM_1_COLOR])
  2942. temp_score += 8;
  2943. if (bonus_hou[SCORE_MIX_1_COLOR])
  2944. temp_score += 4;
  2945. if (bonus_hou[SCORE_PAIR_PAIR_HOU])
  2946. temp_score += 4;
  2947. if (user_ptr->id ==PLAYER_1) /*win*/
  2948. g_gx_vsmj_context.game_grade=100+temp_score*30; /*┏+score per tai*