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

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.  * MagicSushi.c
  14.  *
  15.  * Project:
  16.  * --------
  17.  *   Maui
  18.  *
  19.  * Description:
  20.  * ------------
  21.  *  Game 
  22.  *
  23.  * Author:
  24.  * -------
  25.  * -------
  26.  *
  27.  ****************************************************************************/
  28. #ifndef _MMI_GX_MAGICSUSHI_C
  29. #define _MMI_GX_MAGICSUSHI_C
  30. #include "MMI_features.h"
  31. #ifdef __MMI_GAME_MAGICSUSHI__
  32. #include "GameInc.h"
  33. #include "MagicsushiProts.h"
  34. #include "MagicsushiDefs.h"
  35. #ifdef __MMI_TOUCH_SCREEN__
  36. /* under construction !*/
  37. #endif
  38. /***************************************************************************** 
  39. * Define
  40. *****************************************************************************/
  41. #define MMI_GX_MAGICSUSHI_LCD_HEIGHT (320)
  42. #define MMI_GX_MAGICSUSHI_LCD_WIDTH (240)
  43. #define MMI_GX_MAGICSUSHI_ORIGIN_X (8)
  44. #define MMI_GX_MAGICSUSHI_ORIGIN_Y (43)
  45. #define MMI_GX_MAGICSUSHI_SIZE (28)
  46. #define MMI_GX_MAGICSUSHI_ANIMATION_STEP (3)
  47. /* BACKBROUND 2 */
  48. #define MMI_GX_MAGICSUSHI_TIME_POSITION_X (75)
  49. #define MMI_GX_MAGICSUSHI_TIME_POSITION_Y (276)
  50. #define MMI_GX_MAGICSUSHI_REMAINDER_POSITION_X (75)
  51. #define MMI_GX_MAGICSUSHI_REMAINDER_POSITION_Y (291)
  52. #define MMI_GX_MAGICSUSHI_BACKGROUND2_X1 (70)
  53. #define MMI_GX_MAGICSUSHI_BACKGROUND2_Y1 (270)
  54. #define MMI_GX_MAGICSUSHI_BACKGROUND2_X2 (230)
  55. #define MMI_GX_MAGICSUSHI_BACKGROUND2_Y2 (300)
  56. #define MMI_GX_MAGICSUSHI_SOFTKEY_X (190)
  57. #define MMI_GX_MAGICSUSHI_SOFTKEY_Y (299)
  58. #define MMI_GX_MAGICSUSHI_SOFTKEY_WIDTH (40)
  59. #define MMI_GX_MAGICSUSHI_SOFTKEY_HEIGHT (20)
  60. /* END OF BACKGROUND 2*/
  61. /* BACKBROUND 1 */
  62. #define MMI_GX_MAGICSUSHI_SCORE_POSITION_X (105)
  63. #define MMI_GX_MAGICSUSHI_SCORE_POSITION_Y (26)
  64. #define MMI_GX_MAGICSUSHI_LEVEL_POSITION_X (105)
  65. #define MMI_GX_MAGICSUSHI_LEVEL_POSITION_Y (8)
  66. #define MMI_GX_MAGICSUSHI_BACKGROUND1_X1 (50)
  67. #define MMI_GX_MAGICSUSHI_BACKGROUND1_Y1 (4)
  68. #define MMI_GX_MAGICSUSHI_BACKGROUND1_X2 (120)
  69. #define MMI_GX_MAGICSUSHI_BACKGROUND1_Y2 (40)
  70. /* END OF BACKGROUND 1 */
  71. #define MMI_GX_MAGICSUSHI_DIGIT_WIDTH (10)
  72. #define MMI_GX_MAGICSUSHI_LEFT_WIDTH (8)
  73. #define MMI_GX_MAGICSUSHI_RIGHT_WIDTH (8)
  74. #define MMI_GX_MAGICSUSHI_TOP_WIDTH (43)
  75. #define CHECK_VERTICAL(x,start_y,end_y,length,iNum,flag)
  76. {
  77. length=1; 
  78. for(++start_y; start_y <= end_y; start_y++)
  79. {
  80. if( g_gx_magicsushi_context.map[x][start_y] == g_gx_magicsushi_context.map[x][start_y -1])
  81. length++;
  82. else
  83. {
  84. if(length > 2)
  85. {
  86. g_gx_magicsushi_context.solution_start_vertical[x][iNum] = start_y - length;
  87. g_gx_magicsushi_context.solution_end_vertical[x][iNum] = start_y - 1;
  88. g_gx_magicsushi_context.solution_start_vertical[x][++iNum] = -1;
  89. flag =1;
  90. }
  91. length = 1;
  92. }
  93. }
  94. if(length > 2)
  95. {
  96. g_gx_magicsushi_context.solution_start_vertical[x][iNum] = start_y - length;
  97. g_gx_magicsushi_context.solution_end_vertical[x][iNum] = start_y - 1;
  98. g_gx_magicsushi_context.solution_start_vertical[x][++iNum] = -1;
  99. flag =1;
  100. }
  101. g_gx_magicsushi_context.solution_start_vertical[x][iNum] = -1;
  102. }
  103. #define CHECK_HORIZONTAL(y,start_x,end_x,length,iNum,flag)
  104. {
  105. length=1;
  106. for(++start_x; start_x <= end_x; start_x++)
  107. {
  108. if( g_gx_magicsushi_context.map[start_x][y] == g_gx_magicsushi_context.map[start_x -1][y])
  109. length++;
  110. else
  111. {
  112. if(length > 2)
  113. {
  114. g_gx_magicsushi_context.solution_start_horizontal[y][iNum] = start_x - length ;
  115. g_gx_magicsushi_context.solution_end_horizontal[y][iNum] = start_x - 1;
  116. g_gx_magicsushi_context.solution_start_horizontal[y][++iNum] = -1;
  117. flag =1;
  118. }
  119. length = 1;
  120. }
  121. }
  122. if(length > 2)
  123. {
  124. g_gx_magicsushi_context.solution_start_horizontal[y][iNum] = start_x - length;
  125. g_gx_magicsushi_context.solution_end_horizontal[y][iNum] = start_x - 1;
  126. g_gx_magicsushi_context.solution_start_horizontal[y][++iNum] = -1;
  127. flag =1;
  128. }
  129. g_gx_magicsushi_context.solution_start_horizontal[y][iNum] = -1;
  130. }
  131. #define RAND_ITEM(i,j,item)
  132. {
  133. item =rand()%1000;
  134. if (item <5 && !g_gx_magicsushi_context.special)
  135. {g_gx_magicsushi_context.map[i][j] = 8;g_gx_magicsushi_context.special=TRUE;}
  136. else if (item <10 && !g_gx_magicsushi_context.special)
  137. {g_gx_magicsushi_context.map[i][j] = 9;g_gx_magicsushi_context.special=TRUE;}
  138. else if (item <15 && !g_gx_magicsushi_context.special)
  139. {g_gx_magicsushi_context.map[i][j] = 10;g_gx_magicsushi_context.special=TRUE;}
  140. else
  141. g_gx_magicsushi_context.map[i][j] = item%g_gx_magicsushi_context.type_num;
  142. g_gx_magicsushi_context.i_map[i][j] = 8;
  143. }
  144. /************************************************************************/
  145. /* Audio [Const] */
  146. /************************************************************************/
  147. #define MAGICSUSHIMOVE 138
  148. #define MAGICSUSHISELECT 890
  149. #define MAGICSUSHIBACKGROUND 2479
  150.  __align(2) const U8 MAGICSUSHIBackground[2479] = {
  151.  0x4D, 0x54, 0x68, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x03, 0xC0, 0x4D, 0x54, 0x72, 
  152.  0x6B, 0x00, 0x00, 0x09, 0x99, 0x00, 0xFF, 0x03, 0x08, 0x75, 0x6E, 0x74, 0x69, 0x74, 0x6C, 0x65, 
  153.  0x64, 0x00, 0xFF, 0x02, 0x16, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x63, 
  154.  0x20, 0x32, 0x30, 0x30, 0x33, 0x20, 0x62, 0x79, 0x20, 0x43, 0x43, 0x00, 0xFF, 0x01, 0x03, 0x43, 
  155.  0x43, 0x0A, 0x00, 0xFF, 0x58, 0x04, 0x04, 0x02, 0x18, 0x08, 0x00, 0xFF, 0x59, 0x02, 0x00, 0x00, 
  156.  0x00, 0xFF, 0x51, 0x03, 0x07, 0x44, 0x1E, 0x00, 0xC0, 0x54, 0x00, 0xB0, 0x07, 0x62, 0x00, 0x90, 
  157.  0x48, 0x6F, 0x00, 0xC1, 0x0B, 0x00, 0xB1, 0x07, 0x64, 0x00, 0x91, 0x48, 0x67, 0x00, 0xC2, 0x01, 
  158.  0x00, 0xB2, 0x07, 0x6A, 0x00, 0x92, 0x47, 0x7C, 0x00, 0x43, 0x7E, 0x00, 0x3C, 0x7F, 0x00, 0x40, 
  159.  0x7C, 0x81, 0x70, 0x40, 0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x3C, 
  160.  0x50, 0x00, 0x47, 0x51, 0x00, 0x43, 0x5A, 0x00, 0x40, 0x53, 0x50, 0x91, 0x48, 0x00, 0x00, 0x49, 
  161.  0x67, 0x81, 0x20, 0x92, 0x3C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x90, 0x48, 0x00, 
  162.  0x00, 0x92, 0x40, 0x00, 0x00, 0x90, 0x4C, 0x7C, 0x00, 0x92, 0x3C, 0x50, 0x00, 0x47, 0x50, 0x00, 
  163.  0x43, 0x5A, 0x00, 0x40, 0x5A, 0x81, 0x20, 0x91, 0x49, 0x00, 0x00, 0x4A, 0x51, 0x50, 0x92, 0x3C, 
  164.  0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x40, 0x00, 0x00, 0x3C, 0x51, 0x00, 0x43, 0x5A, 
  165.  0x00, 0x47, 0x51, 0x00, 0x40, 0x53, 0x81, 0x70, 0x40, 0x00, 0x00, 0x90, 0x4C, 0x00, 0x00, 0x92, 
  166.  0x3C, 0x00, 0x00, 0x91, 0x4A, 0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x43, 0x00, 0x00, 0x90, 0x4F, 
  167.  0x7C, 0x00, 0x91, 0x4B, 0x7D, 0x00, 0x92, 0x3C, 0x50, 0x00, 0x43, 0x53, 0x00, 0x47, 0x49, 0x00, 
  168.  0x40, 0x51, 0x81, 0x70, 0x40, 0x00, 0x00, 0x43, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x47, 0x00, 0x00, 
  169.  0x3C, 0x51, 0x00, 0x47, 0x51, 0x00, 0x43, 0x53, 0x00, 0x40, 0x53, 0x50, 0x91, 0x4B, 0x00, 0x00, 
  170.  0x4A, 0x51, 0x81, 0x20, 0x92, 0x3C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x90, 0x4F, 
  171.  0x00, 0x00, 0x92, 0x40, 0x00, 0x00, 0x90, 0x48, 0x67, 0x00, 0x92, 0x47, 0x52, 0x00, 0x43, 0x5A, 
  172.  0x00, 0x3C, 0x49, 0x00, 0x40, 0x5A, 0x81, 0x20, 0x91, 0x4A, 0x00, 0x00, 0x49, 0x53, 0x50, 0x92, 
  173.  0x47, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x90, 0x48, 0x00, 0x00, 0x92, 0x40, 0x00, 
  174.  0x00, 0x90, 0x4C, 0x7C, 0x00, 0x92, 0x47, 0x53, 0x00, 0x3C, 0x51, 0x00, 0x43, 0x5A, 0x00, 0x40, 
  175.  0x5A, 0x81, 0x70, 0x40, 0x00, 0x00, 0x91, 0x49, 0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x3C, 0x00, 
  176.  0x00, 0x43, 0x00, 0x00, 0x91, 0x48, 0x7C, 0x00, 0x92, 0x47, 0x67, 0x00, 0x43, 0x6C, 0x00, 0x40, 
  177.  0x6E, 0x00, 0x3C, 0x6E, 0x81, 0x70, 0x3C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x40, 
  178.  0x00, 0x00, 0x47, 0x51, 0x00, 0x3C, 0x50, 0x00, 0x43, 0x5A, 0x00, 0x40, 0x5A, 0x81, 0x69, 0x90, 
  179.  0x4C, 0x00, 0x07, 0x92, 0x47, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x91, 0x48, 0x00, 0x00, 0x92, 0x40, 
  180.  0x00, 0x00, 0x43, 0x00, 0x00, 0x90, 0x4F, 0x7C, 0x00, 0x91, 0x4C, 0x7D, 0x00, 0x92, 0x47, 0x52, 
  181.  0x00, 0x43, 0x53, 0x00, 0x3C, 0x49, 0x00, 0x40, 0x5A, 0x81, 0x70, 0x40, 0x00, 0x00, 0x91, 0x4C, 
  182.  0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x43, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x91, 0x4D, 0x7C, 0x00, 
  183.  0x92, 0x47, 0x52, 0x00, 0x3C, 0x50, 0x00, 0x43, 0x52, 0x00, 0x40, 0x5A, 0x81, 0x70, 0x40, 0x00, 
  184.  0x00, 0x91, 0x4D, 0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x90, 0x4F, 0x00, 0x00, 0x92, 0x43, 0x00, 
  185.  0x00, 0x3C, 0x00, 0x00, 0x90, 0x48, 0x67, 0x00, 0x91, 0x4F, 0x7C, 0x00, 0x92, 0x3C, 0x51, 0x00, 
  186.  0x47, 0x53, 0x00, 0x43, 0x5A, 0x00, 0x40, 0x67, 0x81, 0x70, 0x40, 0x00, 0x00, 0x91, 0x4F, 0x00, 
  187.  0x00, 0x92, 0x3C, 0x00, 0x00, 0x47, 0x00, 0x00, 0x43, 0x00, 0x00, 0x91, 0x4D, 0x7D, 0x00, 0x92, 
  188.  0x47, 0x52, 0x00, 0x3C, 0x51, 0x00, 0x43, 0x53, 0x00, 0x40, 0x5A, 0x81, 0x70, 0x40, 0x00, 0x00, 
  189.  0x91, 0x4D, 0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x90, 0x48, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 
  190.  0x3C, 0x00, 0x00, 0x90, 0x4C, 0x6F, 0x00, 0x91, 0x4C, 0x7D, 0x00, 0x92, 0x47, 0x52, 0x00, 0x43, 
  191.  0x53, 0x00, 0x40, 0x53, 0x00, 0x3C, 0x48, 0x81, 0x70, 0x3C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 
  192.  0x00, 0x00, 0x40, 0x00, 0x00, 0x47, 0x51, 0x00, 0x43, 0x5A, 0x00, 0x40, 0x67, 0x00, 0x3C, 0x50, 
  193.  0x81, 0x70, 0x3C, 0x00, 0x00, 0x90, 0x4C, 0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x91, 0x4C, 0x00, 
  194.  0x00, 0x92, 0x40, 0x00, 0x00, 0x43, 0x00, 0x00, 0x90, 0x4D, 0x7C, 0x00, 0x91, 0x4D, 0x7D, 0x00, 
  195.  0x92, 0x48, 0x78, 0x00, 0x45, 0x70, 0x00, 0x41, 0x72, 0x00, 0x3E, 0x7C, 0x81, 0x70, 0x3E, 0x00, 
  196.  0x00, 0x45, 0x00, 0x00, 0x48, 0x00, 0x00, 0x41, 0x00, 0x00, 0x48, 0x50, 0x00, 0x45, 0x52, 0x00, 
  197.  0x41, 0x53, 0x00, 0x3E, 0x51, 0x50, 0x91, 0x4D, 0x00, 0x00, 0x4E, 0x6F, 0x81, 0x20, 0x92, 0x48, 
  198.  0x00, 0x00, 0x41, 0x00, 0x00, 0x45, 0x00, 0x00, 0x90, 0x4D, 0x00, 0x00, 0x92, 0x3E, 0x00, 0x00, 
  199.  0x90, 0x51, 0x7C, 0x00, 0x92, 0x48, 0x42, 0x00, 0x45, 0x50, 0x00, 0x41, 0x52, 0x00, 0x3E, 0x49, 
  200.  0x81, 0x20, 0x91, 0x4E, 0x00, 0x00, 0x4F, 0x5A, 0x50, 0x92, 0x48, 0x00, 0x00, 0x41, 0x00, 0x00, 
  201.  0x45, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x48, 0x3F, 0x00, 0x45, 0x51, 0x00, 0x41, 0x51, 0x00, 0x3E, 
  202.  0x42, 0x81, 0x70, 0x3E, 0x00, 0x00, 0x90, 0x51, 0x00, 0x00, 0x92, 0x48, 0x00, 0x00, 0x91, 0x4F, 
  203.  0x00, 0x00, 0x92, 0x41, 0x00, 0x00, 0x45, 0x00, 0x00, 0x90, 0x54, 0x7C, 0x00, 0x91, 0x50, 0x7C, 
  204.  0x00, 0x92, 0x45, 0x53, 0x00, 0x48, 0x49, 0x00, 0x41, 0x53, 0x00, 0x3E, 0x49, 0x81, 0x70, 0x3E, 
  205.  0x00, 0x00, 0x48, 0x00, 0x00, 0x45, 0x00, 0x00, 0x41, 0x00, 0x00, 0x48, 0x49, 0x00, 0x45, 0x52, 
  206.  0x00, 0x41, 0x52, 0x00, 0x3E, 0x51, 0x50, 0x91, 0x50, 0x00, 0x00, 0x4F, 0x53, 0x81, 0x20, 0x92, 
  207.  0x48, 0x00, 0x00, 0x41, 0x00, 0x00, 0x45, 0x00, 0x00, 0x90, 0x54, 0x00, 0x00, 0x92, 0x3E, 0x00, 
  208.  0x00, 0x90, 0x4D, 0x7C, 0x00, 0x92, 0x45, 0x52, 0x00, 0x3E, 0x50, 0x00, 0x48, 0x42, 0x00, 0x41, 
  209.  0x52, 0x81, 0x20, 0x91, 0x4F, 0x00, 0x00, 0x4E, 0x7C, 0x50, 0x92, 0x45, 0x00, 0x00, 0x48, 0x00, 
  210.  0x00, 0x3E, 0x00, 0x00, 0x90, 0x4D, 0x00, 0x00, 0x92, 0x41, 0x00, 0x00, 0x90, 0x51, 0x7C, 0x00, 
  211.  0x92, 0x3E, 0x52, 0x00, 0x48, 0x48, 0x00, 0x45, 0x52, 0x00, 0x41, 0x53, 0x81, 0x70, 0x41, 0x00, 
  212.  0x00, 0x91, 0x4E, 0x00, 0x00, 0x92, 0x3E, 0x00, 0x00, 0x48, 0x00, 0x00, 0x45, 0x00, 0x00, 0x91, 
  213.  0x4D, 0x7C, 0x00, 0x92, 0x48, 0x64, 0x00, 0x45, 0x6C, 0x00, 0x3E, 0x6E, 0x00, 0x41, 0x6A, 0x81, 
  214.  0x70, 0x41, 0x00, 0x00, 0x45, 0x00, 0x00, 0x48, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x48, 0x48, 0x00, 
  215.  0x3E, 0x50, 0x00, 0x45, 0x53, 0x00, 0x41, 0x53, 0x81, 0x70, 0x41, 0x00, 0x00, 0x91, 0x4D, 0x00, 
  216.  0x00, 0x92, 0x48, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x45, 0x00, 0x00, 0x90, 0x54, 0x7C, 0x00, 0x91, 
  217.  0x51, 0x7D, 0x00, 0x92, 0x48, 0x49, 0x00, 0x45, 0x53, 0x00, 0x3E, 0x51, 0x00, 0x41, 0x53, 0x06, 
  218.  0x90, 0x51, 0x00, 0x81, 0x6A, 0x92, 0x3E, 0x00, 0x00, 0x91, 0x51, 0x00, 0x00, 0x92, 0x48, 0x00, 
  219.  0x00, 0x45, 0x00, 0x00, 0x41, 0x00, 0x00, 0x91, 0x53, 0x7C, 0x00, 0x92, 0x48, 0x49, 0x00, 0x45, 
  220.  0x53, 0x00, 0x3E, 0x49, 0x00, 0x41, 0x53, 0x81, 0x70, 0x41, 0x00, 0x00, 0x91, 0x53, 0x00, 0x00, 
  221.  0x92, 0x48, 0x00, 0x00, 0x90, 0x54, 0x00, 0x00, 0x92, 0x3E, 0x00, 0x00, 0x45, 0x00, 0x00, 0x90, 
  222.  0x4D, 0x7D, 0x00, 0x91, 0x54, 0x6F, 0x00, 0x92, 0x48, 0x50, 0x00, 0x3E, 0x52, 0x00, 0x45, 0x53, 
  223.  0x00, 0x41, 0x5A, 0x81, 0x70, 0x41, 0x00, 0x00, 0x91, 0x54, 0x00, 0x00, 0x92, 0x48, 0x00, 0x00, 
  224.  0x3E, 0x00, 0x00, 0x45, 0x00, 0x00, 0x91, 0x53, 0x7C, 0x00, 0x92, 0x48, 0x52, 0x00, 0x45, 0x53, 
  225.  0x00, 0x41, 0x67, 0x00, 0x3E, 0x50, 0x81, 0x70, 0x3E, 0x00, 0x00, 0x91, 0x53, 0x00, 0x00, 0x92, 
  226.  0x48, 0x00, 0x00, 0x90, 0x4D, 0x00, 0x00, 0x92, 0x41, 0x00, 0x00, 0x45, 0x00, 0x00, 0x90, 0x51, 
  227.  0x7C, 0x00, 0x91, 0x51, 0x7C, 0x00, 0x92, 0x3E, 0x52, 0x00, 0x48, 0x51, 0x00, 0x45, 0x53, 0x00, 
  228.  0x41, 0x67, 0x81, 0x70, 0x41, 0x00, 0x00, 0x48, 0x00, 0x00, 0x3E, 0x00, 0x00, 0x45, 0x00, 0x00, 
  229.  0x48, 0x50, 0x00, 0x45, 0x52, 0x00, 0x41, 0x5A, 0x00, 0x3E, 0x52, 0x81, 0x70, 0x3E, 0x00, 0x00, 
  230.  0x90, 0x51, 0x00, 0x00, 0x92, 0x48, 0x00, 0x00, 0x91, 0x51, 0x00, 0x00, 0x92, 0x41, 0x00, 0x00, 
  231.  0x45, 0x00, 0x00, 0x90, 0x4F, 0x7C, 0x00, 0x91, 0x4F, 0x67, 0x00, 0x92, 0x4A, 0x78, 0x00, 0x47, 
  232.  0x78, 0x00, 0x43, 0x78, 0x00, 0x40, 0x7A, 0x81, 0x70, 0x40, 0x00, 0x00, 0x47, 0x00, 0x00, 0x4A, 
  233.  0x00, 0x00, 0x43, 0x00, 0x00, 0x4A, 0x41, 0x00, 0x47, 0x49, 0x00, 0x40, 0x48, 0x00, 0x43, 0x50, 
  234.  0x50, 0x91, 0x4F, 0x00, 0x00, 0x50, 0x7D, 0x81, 0x20, 0x92, 0x4A, 0x00, 0x00, 0x40, 0x00, 0x00, 
  235.  0x47, 0x00, 0x00, 0x90, 0x4F, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x90, 0x53, 0x5A, 0x00, 0x92, 
  236.  0x4A, 0x49, 0x00, 0x47, 0x49, 0x00, 0x40, 0x50, 0x00, 0x43, 0x51, 0x81, 0x20, 0x91, 0x50, 0x00, 
  237.  0x00, 0x51, 0x5A, 0x50, 0x92, 0x4A, 0x00, 0x00, 0x40, 0x00, 0x00, 0x47, 0x00, 0x00, 0x43, 0x00, 
  238.  0x00, 0x4A, 0x49, 0x00, 0x40, 0x49, 0x00, 0x47, 0x51, 0x00, 0x43, 0x51, 0x81, 0x70, 0x43, 0x00, 
  239.  0x00, 0x90, 0x53, 0x00, 0x00, 0x92, 0x4A, 0x00, 0x00, 0x91, 0x51, 0x00, 0x00, 0x92, 0x47, 0x00, 
  240.  0x00, 0x40, 0x00, 0x00, 0x90, 0x56, 0x7C, 0x00, 0x91, 0x52, 0x7C, 0x00, 0x92, 0x4A, 0x49, 0x00, 
  241.  0x47, 0x51, 0x00, 0x43, 0x52, 0x00, 0x40, 0x48, 0x00, 0x4A, 0x42, 0x00, 0x40, 0x51, 0x00, 0x43, 
  242.  0x52, 0x81, 0x70, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x40, 0x00, 0x00, 0x43, 0x00, 0x00, 0x4A, 
  243.  0x00, 0x00, 0x4A, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x50, 0x00, 0x4A, 0x50, 0x00, 0x47, 0x53, 
  244.  0x00, 0x43, 0x5A, 0x50, 0x91, 0x52, 0x00, 0x00, 0x51, 0x52, 0x81, 0x20, 0x92, 0x40, 0x00, 0x00, 
  245.  0x47, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x90, 0x56, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x90, 0x4F, 
  246.  0x6F, 0x00, 0x92, 0x40, 0x13, 0x00, 0x4A, 0x38, 0x00, 0x47, 0x50, 0x00, 0x43, 0x34, 0x81, 0x20, 
  247.  0x91, 0x51, 0x00, 0x00, 0x50, 0x7C, 0x50, 0x92, 0x40, 0x00, 0x00, 0x47, 0x00, 0x00, 0x4A, 0x00, 
  248.  0x00, 0x90, 0x4F, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x90, 0x53, 0x7C, 0x00, 0x92, 0x4A, 0x7C, 
  249.  0x00, 0x47, 0x6F, 0x00, 0x43, 0x7C, 0x00, 0x40, 0x6F, 0x81, 0x70, 0x40, 0x00, 0x00, 0x91, 0x50, 
  250.  0x00, 0x00, 0x92, 0x4A, 0x00, 0x00, 0x47, 0x00, 0x00, 0x43, 0x00, 0x00, 0x91, 0x4F, 0x7D, 0x00, 
  251.  0x92, 0x4A, 0x41, 0x00, 0x47, 0x51, 0x00, 0x43, 0x51, 0x00, 0x40, 0x49, 0x81, 0x70, 0x40, 0x00, 
  252.  0x00, 0x47, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x43, 0x00, 0x00, 0x4A, 0x64, 0x00, 0x47, 0x68, 0x00, 
  253.  0x41, 0x72, 0x00, 0x43, 0x64, 0x81, 0x70, 0x43, 0x00, 0x00, 0x91, 0x4F, 0x00, 0x00, 0x92, 0x4A, 
  254.  0x00, 0x00, 0x47, 0x00, 0x00, 0x41, 0x00, 0x00, 0x90, 0x59, 0x7C, 0x00, 0x91, 0x53, 0x7C, 0x00, 
  255.  0x92, 0x4A, 0x41, 0x00, 0x47, 0x50, 0x00, 0x43, 0x53, 0x00, 0x41, 0x49, 0x0E, 0x90, 0x53, 0x00, 
  256.  0x81, 0x62, 0x92, 0x43, 0x00, 0x00, 0x91, 0x53, 0x00, 0x00, 0x92, 0x4A, 0x00, 0x00, 0x47, 0x00, 
  257.  0x00, 0x41, 0x00, 0x00, 0x91, 0x54, 0x7C, 0x00, 0x92, 0x4A, 0x51, 0x00, 0x47, 0x52, 0x00, 0x43, 
  258.  0x52, 0x00, 0x41, 0x50, 0x81, 0x70, 0x41, 0x00, 0x00, 0x91, 0x54, 0x00, 0x00, 0x92, 0x4A, 0x00, 
  259.  0x00, 0x90, 0x59, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x90, 0x4F, 0x7C, 0x00, 
  260.  0x91, 0x56, 0x7C, 0x00, 0x92, 0x4A, 0x50, 0x00, 0x47, 0x50, 0x00, 0x41, 0x50, 0x00, 0x43, 0x53, 
  261.  0x81, 0x70, 0x43, 0x00, 0x00, 0x91, 0x56, 0x00, 0x00, 0x92, 0x4A, 0x00, 0x00, 0x47, 0x00, 0x00, 
  262.  0x41, 0x00, 0x00, 0x91, 0x54, 0x7C, 0x00, 0x92, 0x4A, 0x50, 0x00, 0x47, 0x52, 0x00, 0x43, 0x53, 
  263.  0x00, 0x41, 0x52, 0x81, 0x70, 0x41, 0x00, 0x00, 0x91, 0x54, 0x00, 0x00, 0x92, 0x4A, 0x00, 0x00, 
  264.  0x90, 0x4F, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x90, 0x53, 0x7C, 0x00, 0x91, 
  265.  0x53, 0x7C, 0x00, 0x92, 0x4A, 0x48, 0x00, 0x47, 0x52, 0x00, 0x41, 0x3F, 0x00, 0x43, 0x50, 0x81, 
  266.  0x70, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x41, 0x00, 0x00, 0x4A, 0x5A, 0x00, 
  267.  0x47, 0x58, 0x00, 0x43, 0x56, 0x00, 0x41, 0x60, 0x81, 0x70, 0x41, 0x00, 0x00, 0x90, 0x53, 0x00, 
  268.  0x00, 0x92, 0x4A, 0x00, 0x00, 0x91, 0x53, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 
  269.  0x90, 0x54, 0x7C, 0x00, 0x91, 0x54, 0x6F, 0x00, 0x92, 0x4C, 0x78, 0x00, 0x47, 0x78, 0x00, 0x43, 
  270.  0x78, 0x00, 0x48, 0x78, 0x81, 0x70, 0x48, 0x00, 0x00, 0x47, 0x00, 0x00, 0x4C, 0x00, 0x00, 0x43, 
  271.  0x00, 0x00, 0x4C, 0x42, 0x00, 0x48, 0x51, 0x00, 0x47, 0x41, 0x00, 0x43, 0x41, 0x50, 0x91, 0x54, 
  272.  0x00, 0x00, 0x55, 0x5A, 0x81, 0x20, 0x92, 0x4C, 0x00, 0x00, 0x47, 0x00, 0x00, 0x48, 0x00, 0x00, 
  273.  0x90, 0x54, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x90, 0x58, 0x67, 0x00, 0x92, 0x4C, 0x3F, 0x00, 
  274.  0x47, 0x42, 0x00, 0x43, 0x41, 0x00, 0x48, 0x52, 0x81, 0x20, 0x91, 0x55, 0x00, 0x00, 0x56, 0x53, 
  275.  0x50, 0x92, 0x4C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x48, 0x00, 0x00, 0x47, 0x51, 
  276.  0x00, 0x4C, 0x50, 0x00, 0x48, 0x42, 0x00, 0x43, 0x52, 0x81, 0x70, 0x43, 0x00, 0x00, 0x90, 0x58, 
  277.  0x00, 0x00, 0x92, 0x47, 0x00, 0x00, 0x91, 0x56, 0x00, 0x00, 0x92, 0x48, 0x00, 0x00, 0x4C, 0x00, 
  278.  0x00, 0x90, 0x5B, 0x7C, 0x00, 0x91, 0x57, 0x7C, 0x00, 0x92, 0x4C, 0x50, 0x00, 0x48, 0x42, 0x00, 
  279.  0x47, 0x49, 0x00, 0x43, 0x49, 0x81, 0x70, 0x43, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4C, 0x00, 0x00, 
  280.  0x47, 0x00, 0x00, 0x4C, 0x50, 0x00, 0x48, 0x50, 0x00, 0x47, 0x52, 0x00, 0x43, 0x52, 0x50, 0x91, 
  281.  0x57, 0x00, 0x00, 0x56, 0x6F, 0x81, 0x20, 0x92, 0x4C, 0x00, 0x00, 0x47, 0x00, 0x00, 0x48, 0x00, 
  282.  0x00, 0x90, 0x5B, 0x00, 0x00, 0x92, 0x43, 0x00, 0x00, 0x90, 0x54, 0x6F, 0x00, 0x92, 0x4C, 0x51, 
  283.  0x00, 0x48, 0x50, 0x00, 0x47, 0x52, 0x00, 0x43, 0x53, 0x81, 0x20, 0x91, 0x56, 0x00, 0x00, 0x55, 
  284.  0x5A, 0x50, 0x92, 0x4C, 0x00, 0x00, 0x47, 0x00, 0x00, 0x48, 0x00, 0x00, 0x90, 0x54, 0x00, 0x00, 
  285.  0x92, 0x43, 0x00, 0x00, 0x90, 0x58, 0x7C, 0x00, 0x92, 0x4C, 0x5A, 0x00, 0x48, 0x5A, 0x00, 0x47, 
  286.  0x6F, 0x00, 0x43, 0x6F, 0x81, 0x70, 0x43, 0x00, 0x00, 0x91, 0x55, 0x00, 0x00, 0x92, 0x4C, 0x00, 
  287.  0x00, 0x48, 0x00, 0x00, 0x47, 0x00, 0x00, 0x91, 0x54, 0x67, 0x00, 0x92, 0x4C, 0x6E, 0x00, 0x48, 
  288.  0x65, 0x00, 0x47, 0x70, 0x00, 0x43, 0x6C, 0x81, 0x70, 0x43, 0x00, 0x00, 0x48, 0x00, 0x00, 0x4C, 
  289.  0x00, 0x00, 0x47, 0x00, 0x00, 0x4C, 0x4A, 0x00, 0x48, 0x4A, 0x00, 0x47, 0x48, 0x00, 0x43, 0x47, 
  290.  0x81, 0x48, 0x90, 0x58, 0x00, 0x28, 0x92, 0x4C, 0x00, 0x00, 0x48, 0x00, 0x00, 0x91, 0x54, 0x00, 
  291.  0x00, 0x92, 0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x90, 0x5B, 0x6F, 0x00, 0x91, 0x4F, 0x7C, 0x00, 
  292.  0x92, 0x4C, 0x50, 0x00, 0x48, 0x50, 0x00, 0x47, 0x50, 0x00, 0x43, 0x54, 0x81, 0x70, 0x43, 0x00, 
  293.  0x00, 0x91, 0x4F, 0x00, 0x00, 0x92, 0x4C, 0x00, 0x00, 0x48, 0x00, 0x00, 0x47, 0x00, 0x00, 0x91, 
  294.  0x4D, 0x7C, 0x00, 0x92, 0x4C, 0x46, 0x00, 0x48, 0x48, 0x00, 0x47, 0x46, 0x00, 0x43, 0x49, 0x81, 
  295.  0x70, 0x43, 0x00, 0x00, 0x91, 0x4D, 0x00, 0x00, 0x92, 0x4C, 0x00, 0x00, 0x90, 0x5B, 0x00, 0x00, 
  296.  0x92, 0x47, 0x00, 0x00, 0x48, 0x00, 0x00, 0x90, 0x54, 0x6F, 0x00, 0x91, 0x4C, 0x7C, 0x00, 0x92, 
  297.  0x4C, 0x51, 0x00, 0x48, 0x4B, 0x00, 0x47, 0x27, 0x00, 0x43, 0x52, 0x81, 0x70, 0x43, 0x00, 0x00, 
  298.  0x91, 0x4C, 0x00, 0x00, 0x92, 0x4C, 0x00, 0x00, 0x48, 0x00, 0x00, 0x47, 0x00, 0x00, 0x91, 0x4B, 
  299.  0x7D, 0x00, 0x92, 0x4C, 0x50, 0x00, 0x47, 0x4E, 0x00, 0x43, 0x50, 0x00, 0x48, 0x52, 0x81, 0x70, 
  300.  0x48, 0x00, 0x00, 0x91, 0x4B, 0x00, 0x00, 0x92, 0x4C, 0x00, 0x00, 0x90, 0x54, 0x00, 0x00, 0x92, 
  301.  0x43, 0x00, 0x00, 0x47, 0x00, 0x00, 0x90, 0x58, 0x7C, 0x00, 0x91, 0x4A, 0x7C, 0x00, 0x92, 0x4C, 
  302.  0x51, 0x00, 0x47, 0x50, 0x00, 0x43, 0x52, 0x00, 0x48, 0x52, 0x81, 0x70, 0x48, 0x00, 0x00, 0x47, 
  303.  0x00, 0x00, 0x4C, 0x00, 0x00, 0x43, 0x00, 0x00, 0x4C, 0x53, 0x00, 0x47, 0x52, 0x00, 0x48, 0x51, 
  304.  0x00, 0x43, 0x52, 0x81, 0x70, 0x43, 0x00, 0x00, 0x90, 0x58, 0x00, 0x00, 0x92, 0x4C, 0x00, 0x00, 
  305.  0x91, 0x4A, 0x00, 0x00, 0x92, 0x48, 0x00, 0x00, 0x47, 0x00, 0x00, 0xFF, 0x2F, 0x00
  306.  };
  307.  __align(2) const U8 MAGICSUSHIMove[138] = {
  308.  0x4D, 0x54, 0x68, 0x64, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x01, 0x03, 0xC0, 0x4D, 0x54, 0x72, 
  309.  0x6B, 0x00, 0x00, 0x00, 0x74, 0x00, 0xFF, 0x02, 0x16, 0x43, 0x6F, 0x70, 0x79, 0x72, 0x69, 0x67, 
  310.  0x68, 0x74, 0x20, 0x63, 0x20, 0x32, 0x30, 0x30, 0x33, 0x20, 0x62, 0x79, 0x20, 0x43, 0x43, 0x00, 
  311.  0xFF, 0x01, 0x02, 0x43, 0x43, 0x00, 0xFF, 0x58, 0x04, 0x04, 0x02, 0x18, 0x08, 0x00, 0xFF, 0x59, 
  312.  0x02, 0x00, 0x00, 0x00, 0xFF, 0x51, 0x03, 0x05, 0x24, 0xB7, 0x00, 0xC0, 0x0A, 0x00, 0xB0, 0x07, 
  313.  0x60, 0x00, 0x90, 0x48, 0x64, 0x00, 0xC1, 0x61, 0x00, 0xB1, 0x07, 0x7C, 0x00, 0x91, 0x48, 0x64, 
  314.  0x81, 0x70, 0x90, 0x48, 0x00, 0x00, 0x4A, 0x64, 0x81, 0x70, 0x4A, 0x00, 0x00, 0x4C, 0x64, 0x81, 
  315.  0x70, 0x4C, 0x00, 0x00, 0x4F, 0x64, 0x81, 0x70, 0x4F, 0x00, 0x00, 0x54, 0x64, 0x81, 0x70, 0x54, 
  316.  0x00, 0x00, 0x91, 0x48, 0x00, 0x00, 0xFF, 0x2F, 0x00
  317.  };
  318. __align(2) const U8 MAGICSUSHISelect[890] = {
  319.    0x77,0xD7,0x77,0x77,0x0E,0x08,0xB7,0xB7,0x08,0x17,0x8C,0x10,0x88,0xA8,0x89,0x18,
  320.    0x32,0x02,0xB8,0xAD,0x8A,0x42,0x33,0x92,0xCC,0xAB,0x28,0x44,0x13,0xB8,0xBD,0x9A,
  321.    0x42,0x34,0x81,0xDA,0xBB,0x18,0x44,0x13,0xA0,0xDC,0x8A,0x30,0x53,0x82,0xC9,0xBB,
  322.    0x09,0x53,0x24,0xA0,0xDA,0xAA,0x20,0x34,0x23,0xC9,0xAD,0x8A,0x41,0x24,0x81,0xC9,
  323.    0xAC,0x19,0x52,0x13,0x90,0xDB,0xAA,0x18,0x54,0x12,0xA8,0xBC,0x9A,0x30,0x25,0x23,
  324.    0xA9,0xCD,0x8B,0x30,0x35,0x02,0xB8,0xAD,0x9B,0x30,0x35,0x04,0xA8,0xCC,0xA9,0x30,
  325.    0x53,0x13,0x99,0xCC,0xAA,0x28,0x44,0x13,0x90,0xBC,0xCB,0x19,0x72,0x22,0x90,0xBA,
  326.    0xCB,0x89,0x52,0x34,0x80,0xC9,0xBB,0x0B,0x51,0x24,0x03,0xB9,0xAE,0x9A,0x21,0x34,
  327.    0x33,0xA8,0xBF,0x9A,0x10,0x43,0x34,0x98,0xBD,0xAA,0x08,0x34,0x25,0x00,0xAC,0xAC,
  328.    0x09,0x32,0x26,0x82,0xCA,0xBB,0x98,0x40,0x45,0x00,0x99,0xBB,0x8D,0x48,0x42,0x11,
  329.    0x98,0xBC,0xAB,0x38,0x54,0x12,0x80,0xEB,0x9B,0x10,0x31,0x35,0x91,0xBC,0xBA,0x8A,
  330.    0x44,0x24,0x82,0xCA,0xCB,0x8A,0x61,0x22,0x11,0xB8,0xBE,0x88,0x10,0x44,0x02,0xA8,
  331.    0xDB,0xAA,0x20,0x44,0x03,0x80,0xDC,0x8B,0x00,0x42,0x15,0x98,0xA9,0xBC,0x08,0x43,
  332.    0x24,0x00,0xD9,0xAC,0x80,0x30,0x26,0x80,0xA8,0xBC,0x0A,0x21,0x26,0x12,0xC9,0xAB,
  333.    0xAB,0x68,0x14,0x21,0xB0,0xAD,0xA9,0x28,0x44,0x12,0x90,0xEB,0x9B,0x01,0x51,0x14,
  334.    0x88,0xC9,0x9C,0x08,0x42,0x32,0x91,0xBB,0xDC,0x19,0x12,0x54,0x91,0x99,0xBC,0x89,
  335.    0x41,0x33,0x13,0xBC,0xDA,0x8C,0x12,0x62,0x82,0x98,0xCB,0x9A,0x40,0x22,0x16,0x9A,
  336.    0xC8,0x8C,0x00,0x43,0x12,0xA0,0xCA,0x9D,0x10,0x50,0x03,0x10,0xCC,0xA9,0x08,0x42,
  337.    0x14,0x00,0xF9,0x89,0x8A,0x33,0x41,0x81,0xC9,0xAB,0x8B,0x25,0x61,0x91,0x98,0xBC,
  338.    0x88,0x30,0x44,0x81,0xB1,0x9F,0xA8,0x31,0x22,0x14,0xA9,0x9D,0xAB,0x22,0x71,0x93,
  339.    0x81,0xAD,0xA9,0x10,0x34,0x21,0xE3,0x8A,0x9D,0x01,0x41,0x12,0x90,0xE9,0x0A,0x1B,
  340.    0x05,0x32,0x98,0xC9,0xBB,0x38,0x68,0x85,0x01,0xAB,0xCA,0x08,0x32,0x63,0x90,0xC0,
  341.    0x8C,0x8A,0x14,0x32,0x82,0x9C,0xFB,0x00,0x59,0x01,0x82,0xB8,0xAA,0x1D,0x81,0x07,
  342.    0x20,0x9A,0xAA,0x9A,0x23,0x72,0x00,0xD1,0xA8,0x8A,0x30,0x52,0x92,0xA1,0x0F,0x8B,
  343.    0x01,0x33,0x84,0x08,0x9F,0xB8,0x02,0x52,0x01,0x88,0x9D,0xC8,0x02,0x51,0x10,0x88,
  344.    0xAC,0xC8,0x02,0x61,0x00,0xA1,0xAA,0xD9,0x82,0x62,0x28,0x98,0xB9,0xBA,0xA3,0x36,
  345.    0x58,0x89,0xC9,0x99,0x80,0x86,0x13,0x2A,0xAC,0xA9,0x29,0x13,0x87,0x93,0x8C,0x8C,
  346.    0x18,0x60,0x10,0xB1,0xD1,0x99,0x08,0x23,0x62,0x2A,0xAC,0xB8,0x18,0x22,0x97,0xA4,
  347.    0xA8,0x8B,0x19,0x52,0x50,0x1A,0xBA,0xC8,0x00,0x31,0x96,0xB4,0xA0,0x9B,0x09,0x15,
  348.    0x42,0x3A,0x8E,0x9A,0x08,0x70,0x28,0x90,0xD0,0x98,0x08,0x02,0x97,0xB3,0xB0,0xA9,
  349.    0x90,0x87,0x83,0x81,0xAA,0xCA,0xA2,0x15,0x32,0x1A,0xBC,0xCA,0x81,0x72,0x30,0x89,
  350.    0xD9,0xA8,0x18,0x70,0x20,0x98,0xC8,0x99,0x39,0x78,0x10,0xA0,0xC8,0x89,0x39,0x78,
  351.    0x10,0xA0,0xC8,0x99,0x38,0x60,0x20,0xA8,0xD9,0xA8,0x20,0x71,0x28,0x89,0xCA,0xA8,
  352.    0x02,0x34,0x30,0x0B,0x9F,0x9A,0x02,0x06,0x02,0x89,0x8D,0x1C,0x28,0x13,0x93,0xD0,
  353.    0xBA,0x09,0x70,0x40,0x08,0xA9,0xBB,0xA0,0x15,0x15,0x00,0x9B,0x0F,0x1A,0x40,0x21,
  354.    0x90,0xE8,0xB8,0x00,0x32,0x43,0x08,0x9E,0x0C,0x29,0x31,0x23,0xB1,0xFA,0xBA,0x01,
  355.    0x24,0x23,0x88,0x9E,0x0C,0x4A,0x40,0x20,0x89,0xBB,0xBA,0x12,0x07,0x84,0xB0,0xD8,
  356.    0x98,0x11,0x23,0x02,0x9A,0x8F,0x2B,0x59,0x40,0x28,0x0C,0x0D,0x2A,0x38,0x40,0x08,
  357.    0x9B,0x9C,0x08,0x33,0x04,0xB1,0xDA,0xA9,0x81,0x06,0x83,0xC2,0xC8,0xA8,0x03,0x06,
  358.    0xA2,0xD8,0xB9,0x80,0x24,0x04,0xA2,0xE9,0xB9,0x00,0x34,0x15,0x91,0xEA,0xAA,0x80,
  359.    0x23,0x25,0x91,0xDA,0xAA,0x08,0x23,0x15,0xA1,0xCA,0x99,0x11,0x24,0x83,0xC9,0xAC,
  360.    0x89,0x25,0x24,0x91,0xEB,0xAA,0x08,0x42,0x25,0x91,0xDA,0xBB,0x38,0x35,0x14,0x90,
  361.    0xDC,0xAA,0x18,0x34,0x24,0x90,0xCC,0xAA,0x18,0x53,0x23,0x91,0xDB,0xAC,0x08,0x52,
  362.    0x32,0x80,0xDA,0xAA,0x0A,0x42,0x24,0x82,0xCA,0xBB,0x8A,0x42,0x44,0x12,0xA8,0xDB,
  363.    0xAB,0x18,0x53,0x23,0x81,0xDB,0xCB,0x88,0x31,0x34,0x03,0xC9,0xDB,0x89,0x20,0x33,
  364.    0x10,0xB9,0xBB,0xAB,0x38,0x34,0x27,0x81,0xA8,0xEB,0xAA,0x09,0x73,0x33,0x93,0xDB,
  365.    0xAD,0x88,0x32,0x43,0x23,0xD9,0xCD,0x89,0x22,0x34,0x03,0xC8,0xDB,0x9B,0x20,0x44,
  366.    0x23,0xA0,0xBE,0x9A,0x00,0x33,0x25,0xA2,0xCB,0xAC,0x08,0x62,0x32,0x80,0xCB,0xCB,
  367.    0x9A,0x63,0x24,0x81,0xBA,0xBC,0x0B,0x51,0x25,0x01,0xB8,0xAE,0x8A,0x41,0x33,0x13,
  368.    0xDA,0xCC,0x89,0x32,0x25,0x82,0xC9,0xBD,0x09,0x43,0x33,0x81,0xEA,0xAC,0x08,0x43,
  369.    0x32,0x81,0xDC,0xAA,0x19,0x44,0x13,0x90,0xCC,0x9B,0x28,0x35,0x03,0xB8,0xBD,0x8B,
  370.    0x42,0x34,0x82,0xCB,0xBC,0x18,0x43,0x33,0xB1,0xCD,0x9A,0x20,0x44,0x02,0xAA,0xBC,
  371.    0x89,0x42,0x24,0x81,0xDB,0x9B,0x20,0x43,0x84,0xA9,0xBC,0x0A,0x43,0x24,0x80,0xCC,
  372.    0x9A,0x20,0x35,0x82,0xB9,0xBD,0x19,0x33,0x34,0x90,0xBD,0xAB,0x40,0x25,0x11,0xD9,
  373.    0x8C,0x88,0x42,0x02,0x90,0xCB,0x9A,0x41,0x43,0x81,0xD9,0xAB,0x18,0x53,0x13,0xA8,
  374.    0xBC,0xAB,0x52,0x23,0x13,0xCC,0xBA,0x1B,0x25,0x34
  375. };
  376. /***************************************************************************** 
  377. * Typedef 
  378. *****************************************************************************/
  379. /* game context */
  380. typedef struct{
  381. BOOL is_gameover;
  382. BOOL is_new_game;
  383. U8 game_level;
  384. U16 game_grade;
  385. U8 timer_elapse;
  386. U8 click_mode;
  387. U8 selected;
  388. U8 level;
  389. U8 bonus;
  390. BOOL special;
  391. U8 special_x;
  392. U8 special_y;
  393. U8 old_x;
  394. U8 old_y;
  395. S16 remainder;
  396. U8 check;           
  397. U8 total_time;
  398. U8 remain_time;
  399. U16 tick;
  400. U8 animation_step;
  401. U8 animation_mode;
  402. U8  moving;
  403. U8 last_key;
  404. U8  cursor_x;
  405. U8 cursor_y;
  406. U8  softkey_state;
  407. gdi_handle background;
  408. gdi_handle foreground;
  409. U8    map[8][8];
  410. U8 i_map[8][8];
  411. U8 type_num;
  412. S16 solution_start_vertical[8][4];
  413. S16 solution_end_vertical[8][4];
  414. S16 solution_start_horizontal[8][4];
  415. S16 solution_end_horizontal[8][4];
  416. #if defined (__MMI_GAME_MULTICHANNEL_SOUND__)
  417. S32 background_midi;
  418. S32  move_midi;
  419. S32  select_midi;
  420. #endif
  421. } gx_magicsushi_context_struct;
  422. /***************************************************************************** 
  423. * Local Variable
  424. *****************************************************************************/
  425. gx_magicsushi_context_struct g_gx_magicsushi_context =
  426. {
  427. FALSE, /* is_gameover */
  428. TRUE, /* is_new_game */
  429. 0, /* game_level */
  430. 0, /* game_grade */
  431. 1, /* timer_elapse */
  432. 0, /* click_mode */
  433. 0, /* selected */
  434. 1, /* level */
  435. 0, /* bonus */
  436. 0, /* special */
  437. 0, /* special x */
  438. 0, /* special y */
  439. 0, /* old x */
  440. 0, /* old x */
  441. 15, /* remainder */
  442. 0, /* check */
  443. 50, /* total time */
  444. 25, /* remain time */
  445. 0, /* tick */
  446. 0, /* animation_step */
  447. 0, /* animation_mode */
  448. 0, /* moving */
  449. 0, /* last key */
  450. 0, /* cursorx */
  451. 0, /* cursory */
  452. 0 /* SOFTKEY STATE*/
  453. };
  454. /***************************************************************************** 
  455. * Local Function
  456. *****************************************************************************/
  457. /* Game framework related functions */
  458. S16 mmi_gx_magicsushi_calc_best_grade(S16 old_grade, S16 new_grade); /* descide which is best grade */
  459. void mmi_gx_magicsushi_enter_game(void); /* entry function of the game */
  460. void mmi_gx_magicsushi_exit_game(void); /* exit function - usually will stop timer and release buffer */
  461. void mmi_gx_magicsushi_draw_gameover(void); /* draw gameover screen */
  462. /* Game play functions */
  463. void mmi_gx_magicsushi_framemove(void);
  464. void mmi_gx_magicsushi_render(void);
  465. void mmi_gx_magicsushi_gameover(void);
  466. void mmi_gx_magicsushi_cyclic_timer(void);
  467. void mmi_gx_magicsushi_init_game(void); /* draw gameover screen */
  468. U8 mmi_gx_magicsushi_check_pair(U8 x1,U8 y1, U8 x2,U8 y2,U8 horizontal);
  469. U8 mmi_gx_magicsushi_check_all(void);
  470. void mmi_gx_magicsushi_gen_map(void);
  471. void mmi_gx_magicsushi_update_game_data(void);
  472. void mmi_gx_magicsushi_update_map(void);  // slow version  
  473. U8 mmi_gx_magicsushi_is_moremove(void);
  474. void  mmi_gx_magicsushi_show_magicsushi(void);
  475. void mmi_gx_magicsushi_draw_dynamic_background(void);
  476. void mmi_gx_magicsushi_pen_down_hdlr(mmi_pen_point_struct pos);
  477. void  mmi_gx_magicsushi_pen_up_hdlr(mmi_pen_point_struct pos);
  478. void  mmi_gx_magicsushi_key_2_release(void);
  479. void  mmi_gx_magicsushi_key_4_release(void);
  480. void  mmi_gx_magicsushi_key_5_release(void);
  481. void  mmi_gx_magicsushi_key_6_release(void);
  482. void  mmi_gx_magicsushi_key_8_release(void);
  483. /*****************************************************************************
  484. * FUNCTION
  485. * mmi_gx_magicsushi_enter_gfx()
  486. * DESCRIPTION
  487. * Set Game Framework (GFX) Parameter
  488. * PARAMETERS
  489. * void
  490. * RETURNS
  491. * void
  492. * GLOBALS AFFECTED
  493. *
  494. *****************************************************************************/
  495. void mmi_gx_magicsushi_enter_gfx(void)
  496. {
  497. /* Game menu */
  498. GFX.game_data.game_img_id = IMG_ID_GX_MAGICSUSHI_GAME_ICON; /* game icon img ID */
  499. GFX.game_data.game_str_id = STR_ID_GX_MAGICSUSHI_GAME_NAME; /* game name string ID */
  500. GFX.game_data.menu_resume_str_id = STR_GAME_RESUME; /* "Resume" string ID */
  501. GFX.game_data.menu_new_str_id = STR_GAME_NEW; /* "New Game" string ID */
  502. GFX.game_data.menu_level_str_id = 0; /* "Game Level" string ID */
  503. GFX.game_data.menu_grade_str_id = STR_GAME_GRADE; /* "Best Grade" string ID */
  504. GFX.game_data.menu_help_str_id = STR_GAME_HELP; /* "Game Help" string ID */
  505. /* level / grade */
  506. GFX.game_data.level_count = 1; /* how many levels */
  507. /* add slot in NVRAMEnum.h */
  508. GFX.game_data.grade_nvram_id_list[0] = NVRAM_GX_MAGICSUSHI_SCORE; /* grade slot in NVRAM (short) */
  509. //GFX.game_data.grade_nvram_id_list[1] = DUMMY_NVRAM_ID; /* grade slot in NVRAM */
  510. //GFX.game_data.grade_nvram_id_list[2] = DUMMY_NVRAM_ID; /* grade slot in NVRAM */
  511. //GFX.game_data.level_nvram_id = DUMMY_NVRAM_ID; /* current lvl idnex  in NVRAM (byte) */
  512. /* help */
  513. GFX.game_data.help_str_id = STR_ID_GX_MAGICSUSHI_HELP_DESCRIPTION; /* help desciption string id */
  514. /* misc */
  515. GFX.game_data.grade_value_ptr = (S16*)(&g_gx_magicsushi_context.game_grade); /* current level's grade (S16*) */
  516. GFX.game_data.level_index_ptr = (U8*)(&g_gx_magicsushi_context.game_level); /* ptr to current level index (U8*) */
  517. GFX.game_data.is_new_game = (BOOL*)(&g_gx_magicsushi_context.is_new_game); /* ptr to new game flag (BOOL*) */ 
  518. /* function ptr */
  519. GFX.game_data.best_grade_func_ptr = mmi_gx_magicsushi_calc_best_grade; /* function to calculate best grade */
  520. GFX.game_data.enter_game_func_ptr = mmi_gx_magicsushi_enter_game; /* function to enter new game */
  521. GFX.game_data.exit_game_func_ptr = mmi_gx_magicsushi_exit_game; /* function to exit game */
  522. GFX.game_data.draw_gameover_func_ptr = mmi_gx_magicsushi_draw_gameover; /* function to draw gameover screen */
  523. /* some flags */
  524. GFX.game_data.is_keypad_audio_enable = FALSE; /* play keypad tone or not */
  525. mmi_gfx_entry_menu_screen();
  526. }
  527. /*****************************************************************************
  528. * FUNCTION
  529. * mmi_gx_magicsushi_draw_dynamic_background
  530. * DESCRIPTION
  531. * draw dynamic background 
  532. * PARAMETERS
  533. * void
  534. * RETURNS
  535. * void
  536. * GLOBALS AFFECTED
  537. *
  538. *****************************************************************************/
  539. void mmi_gx_magicsushi_draw_dynamic_background(void)
  540. {
  541. S16 tmp_digit;
  542. S16 tmp_grade;
  543. S16 position_x;
  544. float32 tmp;
  545. float32 tmpfloat;
  546. gdi_layer_push_clip();
  547. gdi_layer_set_clip(MMI_GX_MAGICSUSHI_BACKGROUND1_X1,MMI_GX_MAGICSUSHI_BACKGROUND1_Y1,MMI_GX_MAGICSUSHI_BACKGROUND1_X2,MMI_GX_MAGICSUSHI_BACKGROUND1_Y2);
  548. gdi_draw_solid_rect(MMI_GX_MAGICSUSHI_BACKGROUND1_X1,MMI_GX_MAGICSUSHI_BACKGROUND1_Y1,MMI_GX_MAGICSUSHI_BACKGROUND1_X2,MMI_GX_MAGICSUSHI_BACKGROUND1_Y2,GDI_COLOR_TRANSPARENT) ;
  549. /* draw score */
  550. position_x = MMI_GX_MAGICSUSHI_SCORE_POSITION_X;
  551. tmp_grade = g_gx_magicsushi_context.game_grade;
  552. do {
  553. tmp_digit = tmp_grade % 10;
  554. tmp_grade = tmp_grade / 10;
  555. gdi_image_draw_id(position_x, MMI_GX_MAGICSUSHI_SCORE_POSITION_Y, (U16)(IMG_ID_GX_MAGICSUSHI_NUMBER_0 + tmp_digit));
  556. position_x = position_x - MMI_GX_MAGICSUSHI_DIGIT_WIDTH ;
  557. }while(tmp_grade>0);
  558. /* draw_level */
  559. position_x = MMI_GX_MAGICSUSHI_LEVEL_POSITION_X;
  560. tmp_grade = g_gx_magicsushi_context.level;
  561. do {
  562. tmp_digit = tmp_grade % 10;
  563. tmp_grade = tmp_grade / 10;
  564.  
  565. gdi_image_draw_id(position_x, MMI_GX_MAGICSUSHI_LEVEL_POSITION_Y, (U16)(IMG_ID_GX_MAGICSUSHI_NUMBER_0 + tmp_digit));
  566. position_x = position_x - MMI_GX_MAGICSUSHI_DIGIT_WIDTH ;
  567. }while(tmp_grade>0);
  568. gdi_layer_pop_clip();
  569. gdi_layer_push_clip();
  570. gdi_layer_set_clip(MMI_GX_MAGICSUSHI_BACKGROUND2_X1,MMI_GX_MAGICSUSHI_BACKGROUND2_Y1,MMI_GX_MAGICSUSHI_BACKGROUND2_X2,MMI_GX_MAGICSUSHI_BACKGROUND2_Y2);
  571. /* draw left time */
  572. position_x = MMI_GX_MAGICSUSHI_TIME_POSITION_X;
  573. if(g_gx_magicsushi_context.remain_time>g_gx_magicsushi_context.total_time)
  574. g_gx_magicsushi_context.remain_time=g_gx_magicsushi_context.total_time;
  575. tmp = g_gx_magicsushi_context.remain_time;
  576. tmpfloat =tmp/ g_gx_magicsushi_context.total_time;
  577. tmp = 157 * tmpfloat;
  578. gdi_draw_solid_rect(position_x, MMI_GX_MAGICSUSHI_TIME_POSITION_Y,position_x+157 , MMI_GX_MAGICSUSHI_TIME_POSITION_Y+4,GDI_COLOR_TRANSPARENT);
  579. gdi_draw_solid_rect(position_x, MMI_GX_MAGICSUSHI_TIME_POSITION_Y,position_x+tmp , MMI_GX_MAGICSUSHI_TIME_POSITION_Y+4,GDI_COLOR_GREEN);
  580. /* draw remainder */
  581. position_x = MMI_GX_MAGICSUSHI_REMAINDER_POSITION_X;
  582. if(g_gx_magicsushi_context.remainder <= 0)
  583. g_gx_magicsushi_context.remainder = 0;
  584. tmp = 50 - g_gx_magicsushi_context.remainder;
  585. tmpfloat =tmp/ 50;
  586. tmp = 157 * tmpfloat;
  587. gdi_draw_solid_rect(position_x, MMI_GX_MAGICSUSHI_REMAINDER_POSITION_Y,position_x+157 , MMI_GX_MAGICSUSHI_REMAINDER_POSITION_Y+4,GDI_COLOR_TRANSPARENT);
  588. gdi_draw_solid_rect(position_x, MMI_GX_MAGICSUSHI_REMAINDER_POSITION_Y,position_x+tmp , MMI_GX_MAGICSUSHI_REMAINDER_POSITION_Y+4,GDI_COLOR_RED);
  589. gdi_layer_pop_clip();
  590. }
  591. /*****************************************************************************
  592. * FUNCTION
  593. * mmi_gx_magicsushi_calc_best_grade
  594. * DESCRIPTION
  595. * Calculate new best grade [Callback required by GFX]
  596. * PARAMETERS
  597. * void
  598. * RETURNS
  599. * void
  600. * GLOBALS AFFECTED
  601. *
  602. *****************************************************************************/
  603. S16 mmi_gx_magicsushi_calc_best_grade(S16 old_grade, S16 new_grade)
  604. {
  605. if (old_grade == 0)
  606. return new_grade;
  607. if (new_grade < old_grade)
  608. {
  609. return new_grade;
  610. }
  611. else
  612. {
  613. return old_grade;
  614. }
  615. }
  616. /*****************************************************************************
  617. * FUNCTION
  618. * mmi_gx_magicsushi_render
  619. * DESCRIPTION
  620. * Render the game images
  621. * PARAMETERS
  622. * void
  623. * RETURNS
  624. * void
  625. * GLOBALS AFFECTED
  626. *
  627. *****************************************************************************/
  628. void mmi_gx_magicsushi_render(void)
  629. {
  630. /* add drawing code here */
  631. U8 i,j,k,item;
  632. S16  x,y;
  633. U8 count;
  634. float32 tmp;
  635. float32 tmpfloat;
  636. float32 tmpfloat2;
  637. gdi_layer_set_active(g_gx_magicsushi_context.foreground);
  638. gdi_layer_push_clip();
  639. gdi_layer_set_clip(MMI_GX_MAGICSUSHI_ORIGIN_X, MMI_GX_MAGICSUSHI_ORIGIN_Y, MMI_GX_MAGICSUSHI_LCD_WIDTH - 1, MMI_GX_MAGICSUSHI_LCD_HEIGHT - 1);
  640. /* softkey */
  641. if(g_gx_magicsushi_context.softkey_state == 1)
  642. {
  643. gdi_draw_solid_rect(MMI_GX_MAGICSUSHI_SOFTKEY_X,MMI_GX_MAGICSUSHI_SOFTKEY_Y,MMI_GX_MAGICSUSHI_SOFTKEY_X+MMI_GX_MAGICSUSHI_SOFTKEY_WIDTH,MMI_GX_MAGICSUSHI_SOFTKEY_Y+MMI_GX_MAGICSUSHI_SOFTKEY_HEIGHT,GDI_COLOR_TRANSPARENT);
  644. gdi_image_draw_id(MMI_GX_MAGICSUSHI_SOFTKEY_X,MMI_GX_MAGICSUSHI_SOFTKEY_Y,IMG_ID_GX_MAGICSUSHI_DOWN);
  645. g_gx_magicsushi_context.softkey_state = 0;
  646. }
  647. else if (g_gx_magicsushi_context.softkey_state == 2)
  648. {
  649. gdi_draw_solid_rect(MMI_GX_MAGICSUSHI_SOFTKEY_X,MMI_GX_MAGICSUSHI_SOFTKEY_Y,MMI_GX_MAGICSUSHI_SOFTKEY_X+MMI_GX_MAGICSUSHI_SOFTKEY_WIDTH,MMI_GX_MAGICSUSHI_SOFTKEY_Y+MMI_GX_MAGICSUSHI_SOFTKEY_HEIGHT,GDI_COLOR_TRANSPARENT);
  650. gdi_image_draw_id(MMI_GX_MAGICSUSHI_SOFTKEY_X,MMI_GX_MAGICSUSHI_SOFTKEY_Y,IMG_ID_GX_MAGICSUSHI_UP);
  651. g_gx_magicsushi_context.softkey_state = 0;
  652. }
  653. /* draw cursor x y */
  654. if(g_gx_magicsushi_context.last_key!=0)
  655. {
  656. switch(g_gx_magicsushi_context.last_key)
  657. {
  658. case 1:
  659. i = g_gx_magicsushi_context.special_x;
  660. j = g_gx_magicsushi_context.special_y;
  661. break;
  662. case 2:
  663. i = g_gx_magicsushi_context.cursor_x ;
  664. j = g_gx_magicsushi_context.cursor_y - 1;
  665. break;
  666. case 4:
  667. i = g_gx_magicsushi_context.cursor_x + 1 ;
  668. j = g_gx_magicsushi_context.cursor_y;
  669. break;
  670. case 6:
  671. i = g_gx_magicsushi_context.cursor_x - 1;
  672. j = g_gx_magicsushi_context.cursor_y;
  673. break;
  674. case 8:
  675. i = g_gx_magicsushi_context.cursor_x ;
  676. j = g_gx_magicsushi_context.cursor_y + 1;
  677. break;
  678. }
  679. y = (7 - j) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  680. x = i * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  681. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT);
  682. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[i][j]);
  683. g_gx_magicsushi_context.last_key = 0;
  684. }
  685. y = (7 - g_gx_magicsushi_context.cursor_y) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  686. x = g_gx_magicsushi_context.cursor_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  687. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_CURSOR);
  688. /* draw selected item */
  689. if(g_gx_magicsushi_context.selected==1)
  690. {
  691. y = (7 - g_gx_magicsushi_context.old_y) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  692. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  693. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_SELECTED);
  694. }
  695. else if (g_gx_magicsushi_context.selected==2)
  696. {
  697. g_gx_magicsushi_context.selected=0;
  698. y = (7 - g_gx_magicsushi_context.old_y) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  699. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  700. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  701. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0+g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x ][g_gx_magicsushi_context.old_y]);
  702. }
  703. /* handling animation */
  704. switch(g_gx_magicsushi_context.animation_mode)
  705. {
  706. case 0:
  707. /* do nothing */
  708. break;
  709. case 1:
  710. /* do nothnig */
  711. break;
  712. case 2:
  713. /* magic1: delete random selected type item */
  714. g_gx_magicsushi_context.animation_step--;
  715. count=0;
  716. y = (7 - g_gx_magicsushi_context.old_y) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  717. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  718. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT);
  719. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y]);
  720. item =  g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y];
  721. if(g_gx_magicsushi_context.animation_step==0)
  722. for(i=0;i<8;i++)
  723. for(j=0;j<8;j++)
  724. if(g_gx_magicsushi_context.map[i][j]== item)
  725. {
  726. count++;
  727. y = (7 - j) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  728. x = i * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  729. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_SELECTED);
  730. g_gx_magicsushi_context.map[i][j]=255;
  731. }
  732. g_gx_magicsushi_context.game_grade += 10*count*g_gx_magicsushi_context.level;
  733. count /= 3;
  734. g_gx_magicsushi_context.remainder -= count;
  735. g_gx_magicsushi_context.remain_time += 3;
  736. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  737. g_gx_magicsushi_context.animation_mode = 8;
  738. }
  739. break;
  740. case 3:
  741. /* magic2: delete items by 3x3 matrix */
  742. g_gx_magicsushi_context.animation_step--;
  743. if(g_gx_magicsushi_context.animation_step == 0)
  744. {
  745. for(i=0;i<=2;i++)
  746. {
  747. if(g_gx_magicsushi_context.old_x+i-1 <0 || g_gx_magicsushi_context.old_x+i-1 >7)
  748. continue;
  749. else 
  750. x =(g_gx_magicsushi_context.old_x+i-1) * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  751. for(j=0;j<=2;j++)
  752. {
  753. if(g_gx_magicsushi_context.old_y+j-1 <0 || g_gx_magicsushi_context.old_y+j-1 >7)
  754. continue;
  755. else 
  756. {
  757. y = (8 - g_gx_magicsushi_context.old_y-j) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  758. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_SELECTED);
  759. g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x+i-1][g_gx_magicsushi_context.old_y+j-1]=255;
  760. }
  761. }
  762. }
  763. count = 3;
  764. g_gx_magicsushi_context.game_grade += 10*g_gx_magicsushi_context.level*count;
  765. g_gx_magicsushi_context.remainder -= count;
  766. g_gx_magicsushi_context.remain_time += 3;
  767. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  768. g_gx_magicsushi_context.animation_mode = 8;
  769. }
  770. break;
  771. case 4:
  772. /* magic3: delete items by cross deletion */
  773. g_gx_magicsushi_context.animation_step--;
  774. if(g_gx_magicsushi_context.animation_step == 0)
  775. {
  776. x =(g_gx_magicsushi_context.old_x) * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  777. for(i=0;i<8;i++)
  778. {
  779. y = (7-i) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  780. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_SELECTED);
  781. g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][i]=255;
  782. }
  783. y = (7 - g_gx_magicsushi_context.old_y)* MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;
  784. for(i=0;i<8;i++)
  785. {
  786. x = (i) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  787. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_SELECTED);
  788. g_gx_magicsushi_context.map[i][g_gx_magicsushi_context.old_y]=255;
  789. }
  790. g_gx_magicsushi_context.game_grade += 5*10*g_gx_magicsushi_context.level;
  791. g_gx_magicsushi_context.remainder -= 5;
  792. g_gx_magicsushi_context.remain_time += 3;
  793. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  794. g_gx_magicsushi_context.animation_mode = 8;
  795. }
  796. break;
  797. case 5:
  798. /* up-down switch */
  799. g_gx_magicsushi_context.animation_step--;
  800. tmp = MMI_GX_MAGICSUSHI_ANIMATION_STEP - g_gx_magicsushi_context.animation_step % MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  801. tmpfloat = tmp/MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  802. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  803. y = (7 - g_gx_magicsushi_context.old_y )*MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  804. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  805. y = (7 - g_gx_magicsushi_context.special_y )*MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;
  806. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  807. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  808. y = (7 - g_gx_magicsushi_context.old_y )*MMI_GX_MAGICSUSHI_SIZE 
  809.  + tmpfloat * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;
  810. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y]);
  811. y = (7 - g_gx_magicsushi_context.special_y )*MMI_GX_MAGICSUSHI_SIZE 
  812.  - tmpfloat * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH ;
  813. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[g_gx_magicsushi_context.special_x][g_gx_magicsushi_context.special_y]);
  814. if(g_gx_magicsushi_context.animation_step == 0)
  815. {
  816. tmp = g_gx_magicsushi_context.map[g_gx_magicsushi_context.special_x][g_gx_magicsushi_context.special_y];
  817. g_gx_magicsushi_context.map [g_gx_magicsushi_context.special_x][g_gx_magicsushi_context.special_y] = g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y];
  818. g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y] = tmp;
  819. if(g_gx_magicsushi_context.check && !mmi_gx_magicsushi_check_pair(g_gx_magicsushi_context.old_x,g_gx_magicsushi_context.old_y,g_gx_magicsushi_context.special_x,g_gx_magicsushi_context.special_y,0))
  820. {
  821. g_gx_magicsushi_context.check  =  0;
  822. g_gx_magicsushi_context.animation_step =3;
  823. g_gx_magicsushi_context.animation_mode =5;
  824. g_gx_magicsushi_context.click_mode = 0;
  825. }
  826. else if (g_gx_magicsushi_context.check)
  827. {
  828. mmi_gx_magicsushi_update_game_data();  
  829. g_gx_magicsushi_context.click_mode = 0;
  830. g_gx_magicsushi_context.check  =  0;
  831. }
  832. else 
  833. {
  834. g_gx_magicsushi_context.animation_mode = 0;
  835. g_gx_magicsushi_context.moving = 0;
  836. g_gx_magicsushi_context.click_mode = 0;
  837. g_gx_magicsushi_context.check  =  0;
  838. }
  839. }
  840. break;
  841. case 7:
  842. /* left-right switch */
  843. g_gx_magicsushi_context.animation_step--;
  844. tmp = MMI_GX_MAGICSUSHI_ANIMATION_STEP - g_gx_magicsushi_context.animation_step % MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  845. tmpfloat = tmp/MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  846. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  847. y = (7 - g_gx_magicsushi_context.old_y )*MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;  
  848. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  849. x = g_gx_magicsushi_context.special_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH ;
  850. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  851. x = g_gx_magicsushi_context.old_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH- tmpfloat * MMI_GX_MAGICSUSHI_SIZE ;
  852. y = (7 - g_gx_magicsushi_context.old_y )*MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;  
  853. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y]);
  854. x = g_gx_magicsushi_context.special_x * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH + tmpfloat * MMI_GX_MAGICSUSHI_SIZE ;
  855. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[g_gx_magicsushi_context.special_x][g_gx_magicsushi_context.special_y]);
  856. if(g_gx_magicsushi_context.animation_step == 0)
  857. {
  858. tmp = g_gx_magicsushi_context.map[g_gx_magicsushi_context.special_x][g_gx_magicsushi_context.special_y];
  859. g_gx_magicsushi_context.map [g_gx_magicsushi_context.special_x][g_gx_magicsushi_context.special_y] = g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y];
  860. g_gx_magicsushi_context.map[g_gx_magicsushi_context.old_x][g_gx_magicsushi_context.old_y] = tmp;
  861. if(g_gx_magicsushi_context.check && !mmi_gx_magicsushi_check_pair(g_gx_magicsushi_context.old_x,g_gx_magicsushi_context.old_y,g_gx_magicsushi_context.special_x,g_gx_magicsushi_context.special_y,1))
  862. {
  863. g_gx_magicsushi_context.check  =  0;
  864. g_gx_magicsushi_context.animation_step =3;
  865. g_gx_magicsushi_context.animation_mode =7;
  866. g_gx_magicsushi_context.click_mode = 0;
  867. }
  868. else if (g_gx_magicsushi_context.check)
  869. {
  870. mmi_gx_magicsushi_update_game_data();
  871. g_gx_magicsushi_context.click_mode = 0;
  872. g_gx_magicsushi_context.check  =  0;
  873. }else 
  874. {
  875. g_gx_magicsushi_context.animation_mode = 0;
  876. g_gx_magicsushi_context.moving = 0;
  877. g_gx_magicsushi_context.click_mode = 0;
  878. g_gx_magicsushi_context.check  =  0;
  879. }
  880. }
  881. break;
  882. case 6:
  883. /* dropping */
  884. g_gx_magicsushi_context.animation_step--;
  885. g_gx_magicsushi_context.tick=0;
  886. tmp = g_gx_magicsushi_context.animation_step % MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  887. tmpfloat = tmp/MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  888. tmpfloat2 = (tmp+1) /MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  889. for (i=0;i<8;i++)
  890. {
  891. k=0;
  892. tmp = g_gx_magicsushi_context.animation_step % MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  893. for(j=0;j<8;j++)
  894. {
  895. if(j!=g_gx_magicsushi_context.i_map[i][j])
  896. {
  897. x = i * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  898. y = (8 - g_gx_magicsushi_context.i_map[i][j])*MMI_GX_MAGICSUSHI_SIZE 
  899. + MMI_GX_MAGICSUSHI_TOP_WIDTH - tmpfloat2 * MMI_GX_MAGICSUSHI_SIZE ;
  900. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT);
  901. y = (8 - g_gx_magicsushi_context.i_map[i][j])*MMI_GX_MAGICSUSHI_SIZE 
  902. + MMI_GX_MAGICSUSHI_TOP_WIDTH - tmpfloat * MMI_GX_MAGICSUSHI_SIZE ;
  903. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[i][j]);
  904. if(k!=0 && (g_gx_magicsushi_context.i_map[i][j]-k)>1)
  905. {
  906. x = i * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  907. y = (7 - k)*MMI_GX_MAGICSUSHI_SIZE 
  908. + MMI_GX_MAGICSUSHI_TOP_WIDTH - tmpfloat * MMI_GX_MAGICSUSHI_SIZE ;
  909. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  910. }
  911. k = g_gx_magicsushi_context.i_map[i][j];
  912. if(tmp == 0)
  913. {
  914. g_gx_magicsushi_context.i_map[i][j]--;
  915. if(g_gx_magicsushi_context.i_map[i][j]==7)
  916. break;
  917. }
  918. if(g_gx_magicsushi_context.i_map[i][j]==8)
  919. break;
  920. }
  921. }
  922. }
  923. if(g_gx_magicsushi_context.animation_step == 0 )
  924. {
  925. if(mmi_gx_magicsushi_check_all())
  926. mmi_gx_magicsushi_update_game_data();
  927. else if ( g_gx_magicsushi_context.remainder <= 0 )
  928. {
  929. g_gx_magicsushi_context.bonus = 1;
  930. g_gx_magicsushi_context.total_time -= 5;
  931. g_gx_magicsushi_context.remain_time=g_gx_magicsushi_context.total_time/2;
  932. g_gx_magicsushi_context.remainder = 50;
  933. g_gx_magicsushi_context.level++;
  934. g_gx_magicsushi_context.animation_step = 6;
  935. g_gx_magicsushi_context.animation_mode = 11;
  936. g_gx_magicsushi_context.special = 0;
  937. if(g_gx_magicsushi_context.level>4)
  938. g_gx_magicsushi_context.type_num=8;
  939. }
  940. else if(!mmi_gx_magicsushi_is_moremove())
  941. {
  942. g_gx_magicsushi_context.bonus = 1;
  943. g_gx_magicsushi_context.animation_step = 6;
  944. g_gx_magicsushi_context.animation_mode = 10;
  945. g_gx_magicsushi_context.special = 0;
  946. }
  947. else
  948. {
  949. g_gx_magicsushi_context.click_mode= 0;
  950. g_gx_magicsushi_context.animation_mode = 0;
  951. g_gx_magicsushi_context.moving = 0;
  952. g_gx_magicsushi_context.bonus = 1;
  953.   }
  954. }
  955. break;
  956. case 8:
  957. /* update image for items being removed */
  958. for (i=0;i<8;i++)
  959. {
  960. for(j=0;j<8;j++)
  961. {
  962. if(g_gx_magicsushi_context.map[i][j]==255)
  963. {
  964. x = i * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  965. y = (7-j) * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;
  966. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_NULL);
  967. }
  968. }
  969. }
  970. #ifdef __MMI_GAME_MULTICHANNEL_SOUND__
  971. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  972. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  973. GFX_PLAY_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  974. #else //__MMI_GAME_MULTICHANNEL_SOUND__
  975. GFX_PLAY_AUDIO_MIDI(MAGICSUSHIMove, MAGICSUSHIMOVE, DEVICE_AUDIO_PLAY_ONCE);
  976. #endif //__MMI_GAME_MULTICHANNEL_SOUND__
  977. g_gx_magicsushi_context.animation_mode = 9;
  978. break;
  979. case 9:
  980. /* clear image for items being removed */
  981. for (i=0;i<8;i++)
  982. {
  983. for(j=0;j<8;j++)
  984. {
  985. if(g_gx_magicsushi_context.map[i][j]==255)
  986. {
  987. x = i * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  988. y = (7-j) * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_TOP_WIDTH;
  989. gdi_draw_solid_rect(x,y,x+MMI_GX_MAGICSUSHI_SIZE,y+MMI_GX_MAGICSUSHI_SIZE,GDI_COLOR_TRANSPARENT) ;
  990. }
  991. }
  992. }
  993. mmi_gx_magicsushi_update_map();
  994. break;
  995. case 10:
  996. /* show no more move */
  997. g_gx_magicsushi_context.animation_step--;
  998. gdi_image_draw_id(20, 80, IMG_ID_GX_MAGICSUSHI_NOMOREMOVE);
  999. if(g_gx_magicsushi_context.animation_step == 0)
  1000. {
  1001. gdi_draw_solid_rect(MMI_GX_MAGICSUSHI_ORIGIN_X, MMI_GX_MAGICSUSHI_ORIGIN_Y,MMI_GX_MAGICSUSHI_ORIGIN_X+232 ,MMI_GX_MAGICSUSHI_ORIGIN_Y+232 , GDI_COLOR_TRANSPARENT );
  1002. mmi_gx_magicsushi_gen_map();
  1003. }
  1004. break;
  1005. case 11:
  1006. /* show uplevel */
  1007. g_gx_magicsushi_context.animation_step--;
  1008. gdi_image_draw_id(20, 80, IMG_ID_GX_MAGICSUSHI_UPLEVEL);
  1009. if(g_gx_magicsushi_context.animation_step == 0)
  1010. {
  1011. gdi_draw_solid_rect(MMI_GX_MAGICSUSHI_ORIGIN_X, MMI_GX_MAGICSUSHI_ORIGIN_Y,MMI_GX_MAGICSUSHI_ORIGIN_X+224 ,MMI_GX_MAGICSUSHI_ORIGIN_Y+224 , GDI_COLOR_TRANSPARENT );
  1012. mmi_gx_magicsushi_gen_map();
  1013. }
  1014. break;
  1015. }
  1016. mmi_gx_magicsushi_draw_dynamic_background();
  1017. gdi_layer_blt( g_gx_magicsushi_context.background, /* layer 0 */
  1018. g_gx_magicsushi_context.foreground, /* layer 1 */
  1019. 0, /* layer 2 */
  1020. 0, /* layer 3 */
  1021. 0, /* offset x */
  1022. 0, /* offset y */
  1023. MMI_GX_MAGICSUSHI_LCD_WIDTH - 1, /* width */
  1024. MMI_GX_MAGICSUSHI_LCD_HEIGHT - 1); /* height */
  1025. gdi_layer_pop_clip();
  1026. gdi_layer_set_active(g_gx_magicsushi_context.background);
  1027. }
  1028. /*****************************************************************************
  1029. * FUNCTION
  1030. * mmi_gx_magicsushi_pen_up_hdlr
  1031. * DESCRIPTION
  1032. * pen up event handler
  1033. * PARAMETERS
  1034. * pos IN position of pen
  1035. * RETURNS
  1036. * void
  1037. * GLOBALS AFFECTED
  1038. *
  1039. *****************************************************************************/
  1040. void mmi_gx_magicsushi_pen_up_hdlr(mmi_pen_point_struct pos)
  1041. {
  1042. S32 pos_x=pos.x,pos_y=pos.y;
  1043. g_gx_magicsushi_context.softkey_state=2;
  1044. if( pos_x > MMI_GX_MAGICSUSHI_SOFTKEY_X && pos_x < MMI_GX_MAGICSUSHI_SOFTKEY_X + MMI_GX_MAGICSUSHI_SOFTKEY_WIDTH 
  1045.   && pos_y > MMI_GX_MAGICSUSHI_SOFTKEY_Y && pos_y <MMI_GX_MAGICSUSHI_SOFTKEY_Y + MMI_GX_MAGICSUSHI_SOFTKEY_HEIGHT)
  1046. {
  1047. GoBackHistory();
  1048. }
  1049. }
  1050. /*****************************************************************************
  1051. * FUNCTION
  1052. * mmi_gx_magicsushi_pen_down_hdlr
  1053. * DESCRIPTION
  1054. * pen down event handler
  1055. * PARAMETERS
  1056. * pos IN position of pen
  1057. * RETURNS
  1058. * void
  1059. * GLOBALS AFFECTED
  1060. *
  1061. *****************************************************************************/
  1062. void mmi_gx_magicsushi_pen_down_hdlr(mmi_pen_point_struct pos)
  1063. {
  1064. S32 pos_x=pos.x,pos_y=pos.y;
  1065. S32 coord_x=0,coord_y=0;
  1066. if( pos_x > MMI_GX_MAGICSUSHI_SOFTKEY_X && pos_x < MMI_GX_MAGICSUSHI_SOFTKEY_X + MMI_GX_MAGICSUSHI_SOFTKEY_WIDTH 
  1067.   && pos_y > MMI_GX_MAGICSUSHI_SOFTKEY_Y && pos_y <MMI_GX_MAGICSUSHI_SOFTKEY_Y + MMI_GX_MAGICSUSHI_SOFTKEY_HEIGHT)
  1068. {
  1069. g_gx_magicsushi_context.softkey_state=1;
  1070. }
  1071. if(!g_gx_magicsushi_context.moving)
  1072. {
  1073. coord_x=(pos_x-MMI_GX_MAGICSUSHI_ORIGIN_X)/MMI_GX_MAGICSUSHI_SIZE;
  1074. coord_y= 7 - (pos_y-MMI_GX_MAGICSUSHI_ORIGIN_Y)/MMI_GX_MAGICSUSHI_SIZE;
  1075. if(coord_x<8 && coord_x>=0 &&coord_y<8 && coord_y>=0 )
  1076. {
  1077. if (g_gx_magicsushi_context.click_mode==0) 
  1078. {
  1079. #ifdef __MMI_GAME_MULTICHANNEL_SOUND__
  1080. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  1081. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1082. GFX_PLAY_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1083. #else //__MMI_GAME_MULTICHANNEL_SOUND__
  1084. GFX_PLAY_AUDIO_MIDI(MAGICSUSHISelect, MAGICSUSHISELECT, DEVICE_AUDIO_PLAY_ONCE);
  1085. #endif //__MMI_GAME_MULTICHANNEL_SOUND__
  1086. g_gx_magicsushi_context.old_x = coord_x;
  1087. g_gx_magicsushi_context.old_y = coord_y;
  1088. g_gx_magicsushi_context.last_key = 1;
  1089. g_gx_magicsushi_context.special_x = g_gx_magicsushi_context.cursor_x; 
  1090. g_gx_magicsushi_context.special_y = g_gx_magicsushi_context.cursor_y;
  1091. g_gx_magicsushi_context.cursor_x = coord_x;
  1092. g_gx_magicsushi_context.cursor_y = coord_y;
  1093. g_gx_magicsushi_context.click_mode = 1;
  1094. switch ( g_gx_magicsushi_context.map[coord_x][coord_y] )
  1095. {
  1096. case 8: 
  1097. g_gx_magicsushi_context.map[coord_x][coord_y] = rand()%g_gx_magicsushi_context.type_num;
  1098. g_gx_magicsushi_context.animation_mode = 2;
  1099. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1100. g_gx_magicsushi_context.moving = 1;
  1101. g_gx_magicsushi_context.special = 0;
  1102. break;
  1103. case 9:
  1104. g_gx_magicsushi_context.moving = 1;
  1105. g_gx_magicsushi_context.animation_mode = 3;
  1106. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1107. g_gx_magicsushi_context.special = 0;
  1108. break;
  1109. case 10:
  1110. g_gx_magicsushi_context.moving = 1;
  1111. g_gx_magicsushi_context.animation_mode = 4;
  1112. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1113. g_gx_magicsushi_context.special = 0;
  1114. break;
  1115. default:
  1116. g_gx_magicsushi_context.selected = 1;
  1117. break;
  1118. }
  1119. }
  1120. else if(g_gx_magicsushi_context.click_mode==1)
  1121. {
  1122. g_gx_magicsushi_context.click_mode=1;
  1123. if (abs(g_gx_magicsushi_context.old_x-coord_x)+abs(g_gx_magicsushi_context.old_y-coord_y)== 1)
  1124. {
  1125. g_gx_magicsushi_context.moving = 1;
  1126. g_gx_magicsushi_context.check = 1;
  1127. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1128. g_gx_magicsushi_context.selected = 0;
  1129. g_gx_magicsushi_context.cursor_x = coord_x;
  1130. g_gx_magicsushi_context.cursor_y = coord_y;
  1131. /* up-down switch */
  1132. if (abs(g_gx_magicsushi_context.old_x-coord_x)==0) 
  1133. {
  1134. g_gx_magicsushi_context.animation_mode = 5;
  1135. if(g_gx_magicsushi_context.old_y > coord_y)
  1136. {
  1137. g_gx_magicsushi_context.special_y = coord_y;
  1138. g_gx_magicsushi_context.special_x = coord_x;
  1139. }
  1140. else
  1141. {
  1142. g_gx_magicsushi_context.special_x = g_gx_magicsushi_context.old_x;
  1143. g_gx_magicsushi_context.special_y = g_gx_magicsushi_context.old_y;
  1144. g_gx_magicsushi_context.old_x= coord_x;
  1145. g_gx_magicsushi_context.old_y= coord_y;
  1146. }
  1147. }
  1148. /* left-right switch */
  1149. else  
  1150. {
  1151. g_gx_magicsushi_context.animation_mode = 7;
  1152. if(g_gx_magicsushi_context.old_x > coord_x)
  1153. {
  1154. g_gx_magicsushi_context.special_y = coord_y;
  1155. g_gx_magicsushi_context.special_x = coord_x;
  1156. }
  1157. else
  1158. {
  1159. g_gx_magicsushi_context.special_x = g_gx_magicsushi_context.old_x;
  1160. g_gx_magicsushi_context.special_y = g_gx_magicsushi_context.old_y;
  1161. g_gx_magicsushi_context.old_x= coord_x;
  1162. g_gx_magicsushi_context.old_y= coord_y;
  1163. }
  1164. }
  1165. }
  1166. else if (abs(g_gx_magicsushi_context.old_x-coord_x)+abs(g_gx_magicsushi_context.old_y-coord_y)== 0)
  1167. {
  1168. g_gx_magicsushi_context.selected = 2;
  1169. g_gx_magicsushi_context.click_mode= 0;
  1170. g_gx_magicsushi_context.moving = 0;
  1171. }else {
  1172. /* click others */
  1173. #ifdef __MMI_GAME_MULTICHANNEL_SOUND__
  1174. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  1175. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1176. GFX_PLAY_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1177. #else //__MMI_GAME_MULTICHANNEL_SOUND__
  1178. GFX_PLAY_AUDIO_MIDI(MAGICSUSHISelect, MAGICSUSHISELECT, DEVICE_AUDIO_PLAY_ONCE);
  1179. #endif //__MMI_GAME_MULTICHANNEL_SOUND__
  1180. g_gx_magicsushi_context.old_x = coord_x;
  1181. g_gx_magicsushi_context.old_y = coord_y;
  1182. g_gx_magicsushi_context.last_key = 1;
  1183. g_gx_magicsushi_context.special_x = g_gx_magicsushi_context.cursor_x; 
  1184. g_gx_magicsushi_context.special_y = g_gx_magicsushi_context.cursor_y;
  1185. g_gx_magicsushi_context.cursor_x = coord_x;
  1186. g_gx_magicsushi_context.cursor_y = coord_y;
  1187. g_gx_magicsushi_context.click_mode = 1;
  1188. switch ( g_gx_magicsushi_context.map[coord_x][coord_y] )
  1189. {
  1190. case 8: 
  1191. g_gx_magicsushi_context.map[coord_x][coord_y] = rand()%g_gx_magicsushi_context.type_num;
  1192. g_gx_magicsushi_context.animation_mode = 2;
  1193. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1194. g_gx_magicsushi_context.moving = 1;
  1195. g_gx_magicsushi_context.special = 0;
  1196. break;
  1197. case 9:
  1198. g_gx_magicsushi_context.moving = 1;
  1199. g_gx_magicsushi_context.animation_mode = 3;
  1200. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1201. g_gx_magicsushi_context.special = 0;
  1202. break;
  1203. case 10:
  1204. g_gx_magicsushi_context.moving = 1;
  1205. g_gx_magicsushi_context.animation_mode = 4;
  1206. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1207. g_gx_magicsushi_context.special = 0;
  1208. break;
  1209. default:
  1210. g_gx_magicsushi_context.selected = 1;
  1211. break;
  1212. }
  1213. }
  1214. }
  1215. }
  1216. }
  1217. }
  1218. /*****************************************************************************
  1219. * FUNCTION
  1220. * mmi_gx_magicsushi_draw_gameover
  1221. * DESCRIPTION
  1222. * Draw Gameover Screen [Callback required by GFX]
  1223. * PARAMETERS
  1224. * void 
  1225. * RETURNS
  1226. * void
  1227. * GLOBALS AFFECTED
  1228. *
  1229. *****************************************************************************/
  1230. void mmi_gx_magicsushi_draw_gameover(void)
  1231. {
  1232. S16 tmp_digit;
  1233. S16 tmp_grade;
  1234. S16 position_x;
  1235. GFX_PLAY_AUDIO_COMPLETE();
  1236. /* call this function to draw standard gameover screen */
  1237. gdi_layer_set_active(g_gx_magicsushi_context.background);
  1238. gdi_layer_push_clip();
  1239. gdi_layer_set_clip(0, 0, MMI_GX_MAGICSUSHI_LCD_WIDTH - 1, MMI_GX_MAGICSUSHI_LCD_HEIGHT - 1);
  1240. gdi_image_draw_id( 0,0,IMG_ID_GX_MAGICSUSHI_GAMEOVER);
  1241. /* draw score */
  1242. position_x = 130;
  1243. tmp_grade = g_gx_magicsushi_context.game_grade;
  1244. do {
  1245. tmp_digit = tmp_grade % 10;
  1246. tmp_grade = tmp_grade / 10;
  1247. gdi_image_draw_id(position_x, 130, (U16)(IMG_ID_GX_MAGICSUSHI_NUMBER_0 + tmp_digit));
  1248. position_x = position_x - MMI_GX_MAGICSUSHI_DIGIT_WIDTH ;
  1249. }while(tmp_grade>0);
  1250. gdi_layer_blt( g_gx_magicsushi_context.background, /* layer 0 */
  1251. 0, /* layer 1 */
  1252. 0, /* layer 2 */
  1253. 0, /* layer 3 */
  1254. 0, /* offset x */
  1255. 0, /* offset y */
  1256. MMI_GX_MAGICSUSHI_LCD_WIDTH - 1, /* width */
  1257. MMI_GX_MAGICSUSHI_LCD_HEIGHT - 1); /* height */
  1258. gdi_layer_pop_clip();
  1259. }
  1260. /*****************************************************************************
  1261. * FUNCTION
  1262. * mmi_gx_magicsushi_enter_game
  1263. * DESCRIPTION
  1264. * Enter Game [Callback required by GFX]
  1265. * PARAMETERS
  1266. * void 
  1267. * RETURNS
  1268. * void
  1269. * GLOBALS AFFECTED
  1270. *
  1271. *****************************************************************************/
  1272. void mmi_gx_magicsushi_enter_game(void)
  1273. {
  1274. gdi_layer_multi_layer_enable();
  1275. gdi_layer_get_base_handle(&g_gx_magicsushi_context.background);
  1276. gdi_layer_create(0, 0, MMI_GX_MAGICSUSHI_LCD_WIDTH, MMI_GX_MAGICSUSHI_LCD_HEIGHT, &g_gx_magicsushi_context.foreground);
  1277. gdi_layer_set_active(g_gx_magicsushi_context.foreground);
  1278. gdi_layer_set_source_key(TRUE, GDI_COLOR_BLUE); /* set pure-blue as the transparent color in foreground */
  1279. gdi_layer_clear_background(GDI_COLOR_BLUE); /* clean foreground layer */
  1280. if(g_gx_magicsushi_context.is_new_game == TRUE )
  1281. mmi_gx_magicsushi_init_game(); /* is new game, otherwise resume game */
  1282. else 
  1283. mmi_gx_magicsushi_show_magicsushi();
  1284. g_gx_magicsushi_context.is_new_game = FALSE;
  1285. g_gx_magicsushi_context.is_gameover = FALSE;
  1286. gdi_layer_set_active(g_gx_magicsushi_context.background);
  1287. gdi_image_draw_id(0,0,IMG_ID_GX_MAGICSUSHI_GAME_BACKGROUND);
  1288. /* draw softkay image */
  1289. gdi_image_draw_id(MMI_GX_MAGICSUSHI_SOFTKEY_X,MMI_GX_MAGICSUSHI_SOFTKEY_Y,IMG_ID_GX_MAGICSUSHI_UP);
  1290. #ifdef __MMI_TOUCH_SCREEN__
  1291. /* under construction !*/
  1292. /* under construction !*/
  1293. /* under construction !*/
  1294. #endif /* __MMI_TOUCH_SCREEN__ */
  1295. SetKeyHandler(mmi_gx_magicsushi_key_5_release, KEY_5, KEY_EVENT_DOWN);
  1296. SetKeyHandler(mmi_gx_magicsushi_key_2_release, KEY_2, KEY_EVENT_UP);
  1297. SetKeyHandler(mmi_gx_magicsushi_key_2_release, KEY_UP_ARROW, KEY_EVENT_UP);
  1298. SetKeyHandler(mmi_gx_magicsushi_key_4_release, KEY_4, KEY_EVENT_UP);
  1299. SetKeyHandler(mmi_gx_magicsushi_key_4_release, KEY_LEFT_ARROW, KEY_EVENT_UP);
  1300. SetKeyHandler(mmi_gx_magicsushi_key_6_release, KEY_6, KEY_EVENT_UP);
  1301. SetKeyHandler(mmi_gx_magicsushi_key_6_release, KEY_RIGHT_ARROW, KEY_EVENT_UP);
  1302. SetKeyHandler(mmi_gx_magicsushi_key_8_release, KEY_8, KEY_EVENT_UP);
  1303. SetKeyHandler(mmi_gx_magicsushi_key_8_release, KEY_DOWN_ARROW, KEY_EVENT_UP);
  1304. #ifdef __MMI_GAME_MULTICHANNEL_SOUND__
  1305. GFX_OPEN_BACKGROUND_SOUND(MAGICSUSHIBackground,MAGICSUSHIBACKGROUND,g_gx_magicsushi_context.background_midi);
  1306. GFX_PLAY_BACKGROUND_SOUND(g_gx_magicsushi_context.background_midi);
  1307. GFX_OPEN_DUMMY_BACKGROUND_SOUND();
  1308. GFX_PLAY_DUMMY_BACKGROUND_SOUND();
  1309. GFX_OPEN_SOUND_EFFECTS_MIDI(MAGICSUSHIMove,MAGICSUSHIMOVE,1,g_gx_magicsushi_context.move_midi);
  1310. GFX_OPEN_SOUND_EFFECTS_MIDI(MAGICSUSHISelect,MAGICSUSHISELECT,1,g_gx_magicsushi_context.select_midi);
  1311. #endif
  1312. /* start game loop */
  1313. mmi_gx_magicsushi_cyclic_timer();
  1314. }
  1315. /*****************************************************************************
  1316. * FUNCTION
  1317. * mmi_gx_magicsushi_key_2_release
  1318. * DESCRIPTION
  1319. * key 2 handling
  1320. * PARAMETERS
  1321. * void 
  1322. * RETURNS
  1323. * void
  1324. * GLOBALS AFFECTED
  1325. *
  1326. *****************************************************************************/
  1327. void mmi_gx_magicsushi_key_2_release(void)
  1328. {
  1329. if(g_gx_magicsushi_context.cursor_y<7)
  1330. {
  1331. g_gx_magicsushi_context.cursor_y++;
  1332. g_gx_magicsushi_context.last_key = 2;
  1333. }
  1334. }
  1335. /*****************************************************************************
  1336. * FUNCTION
  1337. * mmi_gx_magicsushi_key_4_release
  1338. * DESCRIPTION
  1339. * key 2 handling
  1340. * PARAMETERS
  1341. * void 
  1342. * RETURNS
  1343. * void
  1344. * GLOBALS AFFECTED
  1345. *
  1346. *****************************************************************************/
  1347. void mmi_gx_magicsushi_key_4_release(void)
  1348. {
  1349. if(g_gx_magicsushi_context.cursor_x>0)
  1350. {
  1351. g_gx_magicsushi_context.cursor_x--;
  1352. g_gx_magicsushi_context.last_key = 4;
  1353. }
  1354. }
  1355. /*****************************************************************************
  1356. * FUNCTION
  1357. * mmi_gx_magicsushi_key_6_release
  1358. * DESCRIPTION
  1359. * key 2 handling
  1360. * PARAMETERS
  1361. * void 
  1362. * RETURNS
  1363. * void
  1364. * GLOBALS AFFECTED
  1365. *
  1366. *****************************************************************************/
  1367. void mmi_gx_magicsushi_key_6_release(void)
  1368. {
  1369. if(g_gx_magicsushi_context.cursor_x<7)
  1370. {
  1371. g_gx_magicsushi_context.cursor_x++;
  1372. g_gx_magicsushi_context.last_key = 6;
  1373. }
  1374. }
  1375. /*****************************************************************************
  1376. * FUNCTION
  1377. * mmi_gx_magicsushi_key_8_release
  1378. * DESCRIPTION
  1379. * key 2 handling
  1380. * PARAMETERS
  1381. * void 
  1382. * RETURNS
  1383. * void
  1384. * GLOBALS AFFECTED
  1385. *
  1386. *****************************************************************************/
  1387. void mmi_gx_magicsushi_key_8_release(void)
  1388. {
  1389. if(g_gx_magicsushi_context.cursor_y>0)
  1390. {
  1391. g_gx_magicsushi_context.cursor_y--;
  1392. g_gx_magicsushi_context.last_key = 8;
  1393. }
  1394. }
  1395. /*****************************************************************************
  1396. * FUNCTION
  1397. * mmi_gx_magicsushi_key_5_release
  1398. * DESCRIPTION
  1399. * key 2 handling
  1400. * PARAMETERS
  1401. * void 
  1402. * RETURNS
  1403. * void
  1404. * GLOBALS AFFECTED
  1405. *
  1406. *****************************************************************************/
  1407. void mmi_gx_magicsushi_key_5_release(void)
  1408. {
  1409. S32 coord_x=0,coord_y=0;
  1410. if(!g_gx_magicsushi_context.moving)
  1411. {
  1412. coord_x = g_gx_magicsushi_context.cursor_x;
  1413. coord_y=g_gx_magicsushi_context.cursor_y;
  1414. if (g_gx_magicsushi_context.click_mode==0) 
  1415. {
  1416. #ifdef __MMI_GAME_MULTICHANNEL_SOUND__
  1417. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  1418. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1419. GFX_PLAY_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1420. #else
  1421. GFX_PLAY_AUDIO_MIDI(MAGICSUSHISelect, MAGICSUSHISELECT, DEVICE_AUDIO_PLAY_ONCE);
  1422. #endif
  1423. g_gx_magicsushi_context.old_x = coord_x;
  1424. g_gx_magicsushi_context.old_y = coord_y;
  1425. g_gx_magicsushi_context.click_mode = 1;
  1426. switch ( g_gx_magicsushi_context.map[coord_x][coord_y] )
  1427. {
  1428. case 8: 
  1429. g_gx_magicsushi_context.map[coord_x][coord_y] = rand()%g_gx_magicsushi_context.type_num;
  1430. g_gx_magicsushi_context.animation_mode = 2;
  1431. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1432. g_gx_magicsushi_context.moving = 1;
  1433. g_gx_magicsushi_context.special = 0;
  1434. break;
  1435. case 9:
  1436. g_gx_magicsushi_context.moving = 1;
  1437. g_gx_magicsushi_context.animation_mode = 3;
  1438. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1439. g_gx_magicsushi_context.special = 0;
  1440. break;
  1441. case 10:
  1442. g_gx_magicsushi_context.moving = 1;
  1443. g_gx_magicsushi_context.animation_mode = 4;
  1444. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1445. g_gx_magicsushi_context.special = 0;
  1446. break;
  1447. default:
  1448. g_gx_magicsushi_context.selected = 1;
  1449. break;
  1450. }
  1451. }
  1452. else if(g_gx_magicsushi_context.click_mode==1)
  1453. {
  1454. g_gx_magicsushi_context.click_mode=1;
  1455. if (abs(g_gx_magicsushi_context.old_x-coord_x)+abs(g_gx_magicsushi_context.old_y-coord_y)== 1)
  1456. {
  1457. g_gx_magicsushi_context.moving = 1;
  1458. g_gx_magicsushi_context.check = 1;
  1459. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1460. g_gx_magicsushi_context.selected = 0;
  1461. /* up-down switch */
  1462. if (abs(g_gx_magicsushi_context.old_x-coord_x)==0) 
  1463. {
  1464. g_gx_magicsushi_context.animation_mode = 5;
  1465. if(g_gx_magicsushi_context.old_y > coord_y)
  1466. {
  1467. g_gx_magicsushi_context.special_y = coord_y;
  1468. g_gx_magicsushi_context.special_x = coord_x;
  1469. }
  1470. else
  1471. {
  1472. g_gx_magicsushi_context.special_x = g_gx_magicsushi_context.old_x;
  1473. g_gx_magicsushi_context.special_y = g_gx_magicsushi_context.old_y;
  1474. g_gx_magicsushi_context.old_x= coord_x;
  1475. g_gx_magicsushi_context.old_y= coord_y;
  1476. }
  1477. }
  1478. /* left-right switch */
  1479. else  
  1480. {
  1481. g_gx_magicsushi_context.animation_mode = 7;
  1482. if(g_gx_magicsushi_context.old_x > coord_x)
  1483. {
  1484. g_gx_magicsushi_context.special_y = coord_y;
  1485. g_gx_magicsushi_context.special_x = coord_x;
  1486. }
  1487. else
  1488. {
  1489. g_gx_magicsushi_context.special_x = g_gx_magicsushi_context.old_x;
  1490. g_gx_magicsushi_context.special_y = g_gx_magicsushi_context.old_y;
  1491. g_gx_magicsushi_context.old_x= coord_x;
  1492. g_gx_magicsushi_context.old_y= coord_y;
  1493. }
  1494. }
  1495. }
  1496. else if (abs(g_gx_magicsushi_context.old_x-coord_x)+abs(g_gx_magicsushi_context.old_y-coord_y)== 0)
  1497. {
  1498. g_gx_magicsushi_context.selected = 2;
  1499. g_gx_magicsushi_context.click_mode= 0;
  1500. g_gx_magicsushi_context.moving = 0;
  1501. }
  1502. }
  1503. }
  1504. }
  1505. /*****************************************************************************
  1506. * FUNCTION
  1507. * mmi_gx_magicsushi_show_magicsushi
  1508. * DESCRIPTION
  1509. * Draw the magicsushi
  1510. * PARAMETERS
  1511. * void 
  1512. * RETURNS
  1513. * void
  1514. * GLOBALS AFFECTED
  1515. *
  1516. *****************************************************************************/
  1517. void mmi_gx_magicsushi_show_magicsushi()
  1518. {
  1519. int i,j,x,y;
  1520. for (i=0;i<8;i++)
  1521. {
  1522. y = (7 - i) * MMI_GX_MAGICSUSHI_SIZE+ MMI_GX_MAGICSUSHI_TOP_WIDTH;
  1523. for(j=0;j<8;j++)
  1524. {
  1525. if(i == g_gx_magicsushi_context.i_map[j][i] )
  1526. {
  1527. x = j * MMI_GX_MAGICSUSHI_SIZE + MMI_GX_MAGICSUSHI_LEFT_WIDTH;
  1528. gdi_image_draw_id(x,y,IMG_ID_GX_MAGICSUSHI_TYPE_0 + g_gx_magicsushi_context.map[j][i]);
  1529. }
  1530. }
  1531. }
  1532. }
  1533. /*****************************************************************************
  1534. * FUNCTION
  1535. * mmi_gx_magicsushi_exit_game
  1536. * DESCRIPTION
  1537. * Exit Game [Callback required by GFX]
  1538. * PARAMETERS
  1539. * void 
  1540. * RETURNS
  1541. * void
  1542. * GLOBALS AFFECTED
  1543. *
  1544. *****************************************************************************/
  1545. void mmi_gx_magicsushi_exit_game(void)
  1546. {
  1547. gui_cancel_timer(mmi_gx_magicsushi_cyclic_timer); /* cancle the looping timer */
  1548. #ifdef __MMI_GAME_MULTICHANNEL_SOUND__
  1549. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  1550. GFX_STOP_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1551. GFX_CLOSE_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.move_midi);
  1552. GFX_CLOSE_SOUND_EFFECTS_MIDI(g_gx_magicsushi_context.select_midi);
  1553. GFX_STOP_DUMMY_BACKGROUND_SOUND();
  1554. GFX_CLOSE_DUMMY_BACKGROUND_SOUND();
  1555. GFX_STOP_BACKGROUND_SOUND(g_gx_magicsushi_context.background_midi);
  1556.    GFX_CLOSE_BACKGROUND_SOUND(g_gx_magicsushi_context.background_midi);   
  1557. #endif
  1558. gdi_layer_multi_layer_disable();
  1559. gdi_layer_free(g_gx_magicsushi_context.foreground);
  1560. }
  1561. /*****************************************************************************
  1562. * FUNCTION
  1563. * mmi_gx_magicsushi_init_game
  1564. * DESCRIPTION
  1565. * Game initilization
  1566. * PARAMETERS
  1567. * void 
  1568. * RETURNS
  1569. * void
  1570. * GLOBALS AFFECTED
  1571. *
  1572. *****************************************************************************/
  1573. void mmi_gx_magicsushi_init_game(void)
  1574. {
  1575. /* init game here */
  1576. U8 i;
  1577. g_gx_magicsushi_context.click_mode = 0;
  1578. g_gx_magicsushi_context.level = 1;
  1579. g_gx_magicsushi_context.bonus = 1;
  1580. g_gx_magicsushi_context.remainder = 50;
  1581. g_gx_magicsushi_context.total_time = 50;
  1582. g_gx_magicsushi_context.remain_time = 25;
  1583. g_gx_magicsushi_context.tick = 0;
  1584. g_gx_magicsushi_context.type_num = 7;
  1585. g_gx_magicsushi_context.animation_step = 0;
  1586. g_gx_magicsushi_context.selected = 0;
  1587. g_gx_magicsushi_context.moving = 1;
  1588. g_gx_magicsushi_context.special = 0;
  1589. g_gx_magicsushi_context.game_grade= 0;
  1590. g_gx_magicsushi_context.check = 0;           
  1591. g_gx_magicsushi_context.cursor_x = 0;           
  1592. g_gx_magicsushi_context.cursor_y = 0;           
  1593. for(i=0;i<8;i++)
  1594. {
  1595. g_gx_magicsushi_context.solution_start_horizontal[i][0]=-1;
  1596. g_gx_magicsushi_context.solution_start_vertical[i][0]=-1;
  1597. }
  1598. mmi_gx_magicsushi_gen_map();
  1599. }
  1600. /*****************************************************************************
  1601. * FUNCTION
  1602. * mmi_gx_magicsushi_framemove
  1603. * DESCRIPTION
  1604. * Framemove - process the game logic
  1605. * PARAMETERS
  1606. * void 
  1607. * RETURNS
  1608. * void
  1609. * GLOBALS AFFECTED
  1610. *
  1611. *****************************************************************************/
  1612. void mmi_gx_magicsushi_framemove(void)
  1613. {
  1614. /* add logic code here */
  1615. }
  1616. /*****************************************************************************
  1617. * FUNCTION
  1618. * mmi_gx_magicsushi_gameover
  1619. * DESCRIPTION
  1620. * Gameover function
  1621. * PARAMETERS
  1622. * void 
  1623. * RETURNS
  1624. * void
  1625. * GLOBALS AFFECTED
  1626. *
  1627. *****************************************************************************/
  1628. void mmi_gx_magicsushi_gameover(void)
  1629. {
  1630. g_gx_magicsushi_context.is_gameover = TRUE;
  1631. g_gx_magicsushi_context.is_new_game = TRUE;
  1632. /* call this function to draw gameover screen */
  1633. mmi_gfx_entry_gameover_screen();
  1634. }
  1635. /*****************************************************************************
  1636. * FUNCTION
  1637. * mmi_gx_magicsushi_cyclic_timer
  1638. * DESCRIPTION
  1639. * Timer trigger function - looping
  1640. * PARAMETERS
  1641. * void 
  1642. * RETURNS
  1643. * void
  1644. * GLOBALS AFFECTED
  1645. *
  1646. *****************************************************************************/
  1647. void mmi_gx_magicsushi_cyclic_timer(void) /* done */
  1648. {
  1649. g_gx_magicsushi_context.tick++;
  1650. if (g_gx_magicsushi_context.tick > 65530)
  1651. g_gx_magicsushi_context.tick = 0;
  1652. gui_start_timer(g_gx_magicsushi_context.timer_elapse, mmi_gx_magicsushi_cyclic_timer);
  1653. /* update TIME every 1 second */
  1654. if (g_gx_magicsushi_context.tick % 5 == 0)
  1655. {
  1656. --g_gx_magicsushi_context.remain_time;
  1657. if(g_gx_magicsushi_context.remain_time == 0)
  1658. mmi_gx_magicsushi_gameover();
  1659. }
  1660. if(g_gx_magicsushi_context.is_gameover == FALSE)
  1661. {
  1662. mmi_gx_magicsushi_framemove();
  1663. mmi_gx_magicsushi_render();
  1664. }
  1665. }
  1666. /*****************************************************************************
  1667. * FUNCTION
  1668. * mmi_gx_mgacisushi_check_pair
  1669. * DESCRIPTION
  1670. * check if any match around the pair (x1,y1) (x2,y2)
  1671. * PARAMETERS
  1672. * x1 : x_cord array index of point1
  1673. * y1 : y_cord array index of point1
  1674. * x2 : x_cord array index of point2
  1675. * y2 : y_cord array index of point2
  1676. * horizontal : horizontal or not
  1677. * RETURNS
  1678. * S16
  1679. * GLOBALS AFFECTED
  1680. * NIL
  1681. *****************************************************************************/
  1682. U8 mmi_gx_magicsushi_check_pair(U8 x1,U8 y1,U8 x2,U8 y2,U8 horizontal) /* done */
  1683. {
  1684. U8 flag=0, length=1, iNum=0;
  1685. S16 dx1,dx2,dy1,dy2;
  1686. if (horizontal)
  1687. {
  1688. dy1 = y1-2;
  1689. dy2 = y1+2;
  1690. dx1 = x2-2;
  1691. dx2 = x1+2;
  1692. if(dy1<0)
  1693. dy1 = 0;
  1694. if(dy2 >7)
  1695. dy2 = 7;
  1696. if(dx1<0)
  1697. dx1 = 0;
  1698. if(dx2>7)
  1699. dx2 = 7;
  1700. CHECK_HORIZONTAL(y1,dx1,dx2,length,iNum,flag);
  1701. iNum=0;
  1702. length = 1;
  1703. CHECK_VERTICAL(x1,dy1,dy2,length,iNum,flag);
  1704. dy1 = y1-2;
  1705. if(dy1<0)
  1706. dy1 = 0;
  1707. iNum=0;
  1708. length = 1;
  1709. CHECK_VERTICAL(x2,dy1,dy2,length,iNum,flag);
  1710. }
  1711. else
  1712. {
  1713. dy1 = y2-2;
  1714. dy2 = y1+2;
  1715. dx1 = x1-2;
  1716. dx2 = x1+2;
  1717. if(dy1<0)
  1718. dy1 = 0;
  1719. if(dy2 >7)
  1720. dy2 = 7;
  1721. if(dx1<0)
  1722. dx1 = 0;
  1723. if(dx2>7)
  1724. dx2 = 7;
  1725. CHECK_VERTICAL(x1,dy1,dy2,length,iNum,flag);
  1726. iNum=0;
  1727. length = 1;
  1728. CHECK_HORIZONTAL(y1,dx1,dx2,length,iNum,flag);
  1729. dx1 = x1-2;
  1730. if(dx1<0)
  1731. dx1 = 0;
  1732. iNum=0;
  1733. length = 1;
  1734. CHECK_HORIZONTAL(y2,dx1,dx2,length,iNum,flag);
  1735. }
  1736. return flag;
  1737. }
  1738. /*****************************************************************************
  1739. * FUNCTION
  1740. * mmi_gx_magicsushi_check_all
  1741. * DESCRIPTION
  1742. * check if any match on the map
  1743. * PARAMETERS
  1744. * void
  1745. * RETURNS
  1746. * void
  1747. * GLOBALS AFFECTED
  1748. * NIL
  1749. *****************************************************************************/
  1750. U8 mmi_gx_magicsushi_check_all() /* done */
  1751. {
  1752. S16 i;
  1753. U8 flag=0, length, iNum;
  1754. S8 x,y;
  1755. x = 0;
  1756. y = 7;
  1757. for(i=0;i<8;i++)
  1758. {
  1759. iNum=0;
  1760. length = 1;
  1761. x=0;
  1762. CHECK_VERTICAL(i,x,y,length,iNum,flag);
  1763. iNum=0;
  1764. length = 1;
  1765. x=0;
  1766. CHECK_HORIZONTAL(i,x,y,length,iNum,flag);
  1767. }
  1768. return flag;
  1769. }
  1770. /*****************************************************************************
  1771. * FUNCTION
  1772. * mmi_gx_magicsushi_gen_map
  1773. * DESCRIPTION
  1774. * Generate the whole map
  1775. * PARAMETERS
  1776. * void 
  1777. * RETURNS
  1778. * void
  1779. * GLOBALS AFFECTED
  1780. *
  1781. *****************************************************************************/
  1782. void mmi_gx_magicsushi_gen_map() /* done */
  1783. {
  1784. U16 i,j,item;
  1785. for (j=0;j<8;j++)
  1786. for (i=0;i<8;i++)
  1787. {
  1788. RAND_ITEM(i,j,item);
  1789. }
  1790. g_gx_magicsushi_context.animation_step = 8 * MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1791. g_gx_magicsushi_context.animation_mode = 6;
  1792. }
  1793. /*****************************************************************************
  1794. * FUNCTION
  1795. * mmi_gx_magicsushi_update_game_data
  1796. * DESCRIPTION
  1797. * Update game data (grade, map)
  1798. * PARAMETERS
  1799. * void 
  1800. * RETURNS
  1801. * void
  1802. * GLOBALS AFFECTED
  1803. *
  1804. *****************************************************************************/
  1805. void mmi_gx_magicsushi_update_game_data() /* doen */
  1806. {
  1807. U8 iNum=0;
  1808. U8 count,i;
  1809. U8 time = g_gx_magicsushi_context.total_time/10;
  1810. U8 j;
  1811. for(i=0;i<8;i++)
  1812. {
  1813. while(g_gx_magicsushi_context.solution_start_vertical[i][iNum]!=-1)
  1814. {
  1815. count = g_gx_magicsushi_context.solution_end_vertical[i][iNum]-g_gx_magicsushi_context.solution_start_vertical[i][iNum]+1;
  1816. g_gx_magicsushi_context.game_grade += 10*g_gx_magicsushi_context.level*g_gx_magicsushi_context.bonus;
  1817. g_gx_magicsushi_context.remainder -= 1;
  1818. g_gx_magicsushi_context.remain_time += time;
  1819. j = g_gx_magicsushi_context.solution_start_vertical[i][iNum];
  1820. while(j <= g_gx_magicsushi_context.solution_end_vertical[i][iNum])
  1821. {
  1822. g_gx_magicsushi_context.map[i][j]=255;
  1823. j++;
  1824. }
  1825. iNum++;
  1826. }
  1827. g_gx_magicsushi_context.solution_start_vertical[i][0]=-1;
  1828. iNum = 0;
  1829. while(g_gx_magicsushi_context.solution_start_horizontal[i][iNum]!=-1)
  1830. {
  1831. count = g_gx_magicsushi_context.solution_end_horizontal[i][iNum]-g_gx_magicsushi_context.solution_start_horizontal[i][iNum]+1;
  1832. g_gx_magicsushi_context.game_grade += 10*g_gx_magicsushi_context.level*g_gx_magicsushi_context.bonus;
  1833. g_gx_magicsushi_context.remainder -= 1;
  1834. g_gx_magicsushi_context.remain_time += time;
  1835. j = g_gx_magicsushi_context.solution_start_horizontal[i][iNum];
  1836. while(j <= g_gx_magicsushi_context.solution_end_horizontal[i][iNum])
  1837. {
  1838. g_gx_magicsushi_context.map[j][i]=255;
  1839. j++;
  1840. }
  1841. iNum++;
  1842. }
  1843. iNum = 0;
  1844. g_gx_magicsushi_context.solution_start_horizontal[i][0]=-1;
  1845. }
  1846. g_gx_magicsushi_context.animation_step = MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1847. g_gx_magicsushi_context.animation_mode = 8;
  1848. g_gx_magicsushi_context.bonus++;
  1849. }
  1850. /*****************************************************************************
  1851. * FUNCTION
  1852. * mmi_gx_magicsushi_update_map
  1853. * DESCRIPTION
  1854. * Update map
  1855. * PARAMETERS
  1856. * void 
  1857. * RETURNS
  1858. * void
  1859. * GLOBALS AFFECTED
  1860. *
  1861. *****************************************************************************/
  1862. void mmi_gx_magicsushi_update_map()  /* done */
  1863. {
  1864. U8 item; /* for RAND_ITEM() */
  1865. U8 i,j,movesteps,max_move=0;
  1866. for (i=0;i<8;i++)
  1867. {
  1868. movesteps = 0;
  1869. for (j=0;j<8;j++)
  1870. {
  1871. if(g_gx_magicsushi_context.map[i][j]==255)
  1872. movesteps++;
  1873. else if(movesteps>0)
  1874. {
  1875. g_gx_magicsushi_context.map[i][j-movesteps]=g_gx_magicsushi_context.map[i][j];
  1876. g_gx_magicsushi_context.i_map[i][j-movesteps]=g_gx_magicsushi_context.i_map[i][j];
  1877. }
  1878. }
  1879. for (j = 8-movesteps;j<8;j++)
  1880. {
  1881. RAND_ITEM(i,j,item);
  1882. }
  1883. if(movesteps > max_move)
  1884. max_move = movesteps;
  1885. }
  1886. g_gx_magicsushi_context.animation_step = max_move * MMI_GX_MAGICSUSHI_ANIMATION_STEP;
  1887. g_gx_magicsushi_context.animation_mode = 6;
  1888. }
  1889. /*****************************************************************************
  1890. * FUNCTION
  1891. * mmi_gx_magicsushi_is_moremove
  1892. * DESCRIPTION
  1893. * check if the map has solution
  1894. * PARAMETERS
  1895. * void 
  1896. * RETURNS
  1897. * S16 Flag
  1898. * GLOBALS AFFECTED
  1899. *
  1900. *****************************************************************************/
  1901. U8 mmi_gx_magicsushi_is_moremove() /* done */
  1902. {
  1903. U8 item,i,j,scase,index;
  1904. if(g_gx_magicsushi_context.special == 1)
  1905. return 1;
  1906. for(i=1;i<7;i++)
  1907. {
  1908. for(j=1;j<7;j++)
  1909. {
  1910. scase = 0;
  1911. index = 1;
  1912. item = g_gx_magicsushi_context.map[i][j];
  1913. if(g_gx_magicsushi_context.map[i-1][j+1]==item)
  1914. scase += index;
  1915. index = index<<1;
  1916. if(g_gx_magicsushi_context.map[i+1][j+1]==item)
  1917. scase += index;
  1918. index = index<<1;
  1919. if(g_gx_magicsushi_context.map[i-1][j-1]==item)
  1920. scase += index;
  1921. index = index<<1;
  1922. if(g_gx_magicsushi_context.map[i+1][j-1]==item)
  1923. scase += index;
  1924. switch(scase)
  1925. {
  1926. case 0:
  1927. break;
  1928. case 1:
  1929. if (g_gx_magicsushi_context.map[i+1][j]==item||g_gx_magicsushi_context.map[i][j-1]==item)
  1930. return 1;
  1931. break;
  1932. case 2:
  1933. if (g_gx_magicsushi_context.map[i-1][j]==item||g_gx_magicsushi_context.map[i][j-1]==item)
  1934. return 1;
  1935. break;
  1936. case 4:
  1937. if (g_gx_magicsushi_context.map[i][j+1]==item||g_gx_magicsushi_context.map[i+1][j]==item)
  1938. return 1;
  1939. break;
  1940. case 8:
  1941. if (g_gx_magicsushi_context.map[i][j+1]==item||g_gx_magicsushi_context.map[i-1][j]==item)
  1942. return 1;
  1943. break;
  1944. case 6:
  1945. case 9:
  1946. if (g_gx_magicsushi_context.map[i+1][j]==item||g_gx_magicsushi_context.map[i][j-1]==item||g_gx_magicsushi_context.map[i-1][j]==item||g_gx_magicsushi_context.map[i][j+1]==item)
  1947. return 1;
  1948. break;
  1949. default:
  1950. return 1;
  1951. break;
  1952. }
  1953. /*
  1954. if(i>1 && j>1 && i <6 && j<6)
  1955. {
  1956. if(g_gx_magicsushi_context.map[i][j+1]==item)
  1957. if(g_gx_magicsushi_context.map[i][j-2]==item)
  1958. return 1;
  1959. if(g_gx_magicsushi_context.map[i+1][j]==item)
  1960. if(g_gx_magicsushi_context.map[i-2][j]==item)
  1961. return 1;
  1962. if(g_gx_magicsushi_context.map[i][j-1]==item)
  1963. if(g_gx_magicsushi_context.map[i][j+2]==item)
  1964. return 1;
  1965. if(g_gx_magicsushi_context.map[i-1][j]==item)
  1966. if(g_gx_magicsushi_context.map[i+2][j]==item)
  1967. return 1;
  1968. }
  1969. */
  1970. }
  1971. }
  1972. for (i=0;i<8;i++)
  1973. {
  1974. for(j=0;j<8;j++)
  1975. {
  1976. /* horizontal check xX x| x Xx */
  1977. if(j>1)
  1978. if(g_gx_magicsushi_context.map[i][j+1]==item)
  1979. if(g_gx_magicsushi_context.map[i][j-2]==item)
  1980. return 1;
  1981. if(j<6)
  1982. if(g_gx_magicsushi_context.map[i][j-1]==item)
  1983. if(g_gx_magicsushi_context.map[i][j+2]==item)
  1984. return 1;
  1985. /* vertical check */
  1986. if(i>1)
  1987. if(g_gx_magicsushi_context.map[i+1][j]==item)
  1988. if(g_gx_magicsushi_context.map[i-2][j]==item)
  1989. return 1;
  1990. if(i<6)
  1991. if(g_gx_magicsushi_context.map[i-1][j]==item)
  1992. if(g_gx_magicsushi_context.map[i+2][j]==item)
  1993. return 1;
  1994. }
  1995. }
  1996. return 0;
  1997. }
  1998. #endif /* __MMI_GAME_MAGICSUSHI__ */
  1999. #endif /* _MMI_GX_MAGICSUSHI_C */