?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download

  1. #include "../_sdk/evo.h"
  2. #include "resources.h"
  3. #include "functions.h"
  4. #include "intro.h"
  5.  
  6. #define HIGH_MAP        11      // высота матрицы стакана
  7. #define WIDTH_MAP       5       // ширина матрицы стакана
  8.  
  9. #define LEFT_LIMIT      60      // левая граница стакана
  10. #define RIGHT_LIMIT 92  // правая граница стакана
  11. #define TOP_LIMIT       16      // верхняя точка стакана
  12. #define DOWN_LIMIT      160 // нижняя граница стакана
  13. #define X_SCORE         34
  14. #define Y_SCORE         7
  15. #define X_BESTSCORE     34
  16. #define Y_BESTSCORE     17
  17. #define X_NEXT          24
  18. #define Y_NEXT          56
  19. #define X_ROTATE        7
  20. #define Y_ROTATE        15
  21.  
  22.  
  23. //структура списка лидеров
  24. static struct
  25. {
  26.         u16 scoreboard;
  27.         u8 name[9];
  28. }best[8];
  29.  
  30.  
  31. static u16 score=0; // общие набранные очки
  32. static u16 rotate=0; // замены кубика
  33. static u16 score_rotate=0;
  34. static u8 map[HIGH_MAP][WIDTH_MAP]; // матрица игрового поля
  35. static u8 gN=0;
  36. static u8 yLimit=0;             //расстояние до дна
  37. static u8 boxReel=0;    //варианты возможных кубиков
  38. static u8 i, j;
  39.  
  40.  
  41.  
  42. //структура спрайта
  43. static struct
  44. {
  45.         u16 x,y;        //координаты
  46.         u8 variant;     //вид кубика
  47.         u8 variantNext; //следующий кубик
  48.         u8 str,col;     //координаты кубика в матрице
  49. }box;
  50.  
  51.  
  52.  
  53.  
  54. #include "saveload.h"
  55.  
  56. // инициализация списка лидеров
  57. void BestInit()
  58. {
  59.         for (i=0;i<8;i++)
  60.         {
  61.                 best[i].scoreboard=0;
  62.                 for (j=0;j<8;j++)
  63.                         best[i].name[j]='.';
  64.         }
  65. }
  66.  
  67.  
  68.  
  69. //stop spacebar
  70. void Stop()
  71. {
  72.         u8 done=FALSE;
  73.         while(!done)
  74.         {
  75.                 vsync();
  76.                 if(joystick()&JOY_FIRE) done=TRUE;
  77.         }
  78. }
  79.  
  80.  
  81.  
  82. // вывод bestscore
  83. void put_best_score()
  84. {
  85.         u16 bestscore=0;
  86.        
  87.         select_image(IMG_FONT);// выбор изображения для тайлов
  88.         color_key(15);
  89.        
  90.         for (i=0;i<8;i++)
  91.                 if (best[i].scoreboard>bestscore) bestscore=best[i].scoreboard;
  92.        
  93.         for (i=0;i<=3;i++)
  94.         {
  95.                 draw_tile(X_BESTSCORE-i,Y_BESTSCORE,16+(bestscore%10));
  96.                 bestscore/=10;
  97.         }
  98. }
  99.  
  100.  
  101.  
  102. // вывод score и rotate на экран
  103. void put_score(u16 score, u16 rotate)
  104. {
  105.         select_image(IMG_FONT);// выбор изображения для тайлов
  106.         color_key(15);
  107.        
  108.         for (i=0;i<=3;i++)
  109.         {
  110.                 draw_tile(X_SCORE-i,Y_SCORE,16+(score%10));
  111.                 score/=10;
  112.         }
  113.         if (rotate==0) draw_image(5,13,IMG_ROTOR_DIS);
  114.         else
  115.         {
  116.                 draw_image(5,13,IMG_ROTOR_EN);
  117.                 for (i=0;i<=1;i++)
  118.                 {
  119.                         draw_tile(X_ROTATE-i,Y_ROTATE,16+(rotate%10));
  120.                         rotate/=10;
  121.                 }
  122.         }
  123. }
  124.  
  125.  
  126.  
  127.  
  128. // вывод строк по координатам
  129. void put_string(u8 output_x, u8 output_y, u8* str)
  130. {
  131.         u8 n;
  132.         while(1)
  133.         {
  134.                 n=*str++;
  135.                 if(!n) break;
  136.                 draw_tile(output_x,output_y,n-' ');
  137.                 ++output_x;
  138.         }
  139. }
  140.  
  141.  
  142.  
  143. // ввод имени в таблицу лидеров
  144. void PutName(u8 output_x, u8 output_y)
  145. {
  146.         u32 n=time();
  147.         u8 key;
  148.         u8 keys[40];
  149.  
  150.         select_image(IMG_FONT);//выбор изображения для вывода тайлов
  151.  
  152.         while(1)
  153.         {
  154.                 //получение состояния клавиш
  155.                 keyboard(keys);
  156.  
  157.                 key=255;
  158.  
  159.                 if(keys[KEY_0]&KEY_PRESS) key='0';
  160.                 if(keys[KEY_1]&KEY_PRESS) key='1';
  161.                 if(keys[KEY_2]&KEY_PRESS) key='2';
  162.                 if(keys[KEY_3]&KEY_PRESS) key='3';
  163.                 if(keys[KEY_4]&KEY_PRESS) key='4';
  164.                 if(keys[KEY_5]&KEY_PRESS) key='5';
  165.                 if(keys[KEY_6]&KEY_PRESS) key='6';
  166.                 if(keys[KEY_7]&KEY_PRESS) key='7';
  167.                 if(keys[KEY_8]&KEY_PRESS) key='8';
  168.                 if(keys[KEY_9]&KEY_PRESS) key='9';
  169.  
  170.                 if(keys[KEY_A]&KEY_PRESS) key='A';
  171.                 if(keys[KEY_B]&KEY_PRESS) key='B';
  172.                 if(keys[KEY_C]&KEY_PRESS) key='C';
  173.                 if(keys[KEY_D]&KEY_PRESS) key='D';
  174.                 if(keys[KEY_E]&KEY_PRESS) key='E';
  175.                 if(keys[KEY_F]&KEY_PRESS) key='F';
  176.                 if(keys[KEY_G]&KEY_PRESS) key='G';
  177.                 if(keys[KEY_H]&KEY_PRESS) key='H';
  178.                 if(keys[KEY_I]&KEY_PRESS) key='I';
  179.                 if(keys[KEY_J]&KEY_PRESS) key='J';
  180.                 if(keys[KEY_K]&KEY_PRESS) key='K';
  181.                 if(keys[KEY_L]&KEY_PRESS) key='L';
  182.                 if(keys[KEY_M]&KEY_PRESS) key='M';
  183.                 if(keys[KEY_N]&KEY_PRESS) key='N';
  184.                 if(keys[KEY_O]&KEY_PRESS) key='O';
  185.                 if(keys[KEY_P]&KEY_PRESS) key='P';
  186.                 if(keys[KEY_Q]&KEY_PRESS) key='Q';
  187.                 if(keys[KEY_R]&KEY_PRESS) key='R';
  188.                 if(keys[KEY_S]&KEY_PRESS) key='S';
  189.                 if(keys[KEY_T]&KEY_PRESS) key='T';
  190.                 if(keys[KEY_U]&KEY_PRESS) key='U';
  191.                 if(keys[KEY_V]&KEY_PRESS) key='V';
  192.                 if(keys[KEY_W]&KEY_PRESS) key='W';
  193.                 if(keys[KEY_X]&KEY_PRESS) key='X';
  194.                 if(keys[KEY_Y]&KEY_PRESS) key='Y';
  195.                 if(keys[KEY_Z]&KEY_PRESS) key='Z';
  196.  
  197.                 if(keys[KEY_SPACE]&KEY_PRESS) key=' ';
  198.                 if(keys[KEY_ENTER]&KEY_PRESS) key='\n';
  199.  
  200.                 //если была нажата клавиша, вывести ее
  201.                 if(key!=255)
  202.                 {
  203.                         if(key>=' '&&key<='Z')
  204.                         {
  205.                                 draw_tile(output_x,output_y,key-' ');
  206.                         }
  207.                         if(output_x==22)
  208.                         {
  209.                                 output_x=21;
  210.                         }
  211.                         if(key=='\n')
  212.                         {
  213.                                 swap_screen();
  214.                                 set_sprite(0,output_x*4,output_y*8-5,SPRITE_END);
  215.                                 swap_screen();
  216.                                 set_sprite(0,output_x*4,output_y*8-5,SPRITE_END);
  217.                                
  218.                                 sprites_stop();
  219.        
  220.                                 return;
  221.                         }
  222.                         if(key=='0'||joystick()&JOY_LEFT)
  223.                         {
  224.                                 for (i=0;i<8;i++) best[((output_y-5)/2)].name[i]='.';
  225.                                 put_string (14,output_y,best[((output_y-5)/2)].name);
  226.                                 output_x=13;
  227.                         }
  228.                         best[((output_y-5)/2)].name[(output_x-14)]=key;
  229.                         output_x++;
  230.                         if(output_x==22)
  231.                         {
  232.                                 output_x=21;
  233.                         }
  234.                 }
  235.                
  236.                
  237.                 if (n+25>time()) // мигающий курсор
  238.                 {
  239.                         set_sprite(0,output_x*4,output_y*8-5,11);
  240.                         swap_screen();
  241.                 }
  242.                 else if (n+50>time())
  243.                 {
  244.                         set_sprite(0,output_x*4,output_y*8-5,10);
  245.                         swap_screen();
  246.                 }
  247.                 else n=time();
  248.         }
  249.        
  250.        
  251. }
  252.  
  253.  
  254.  
  255.  
  256. // конец игры и вывод лучших результатов
  257. void GameOver()
  258. {
  259.         u8 n, m;
  260.         u16 b;
  261.         u8 output_y=3;
  262.         u8 output_yy=5;
  263.        
  264.        
  265.         draw_image(14,11,IMG_GAMEOVER);
  266.         swap_screen();
  267.        
  268.         Stop();
  269.        
  270.         sprites_stop();
  271.         clear_screen(0);
  272.         swap_screen();
  273.         clear_screen(0);
  274.         swap_screen();
  275.         sprites_start();
  276.         draw_image(0,0,IMG_BEST);
  277.        
  278.         for (j=0;j<8;j++) //проверка на лидерство
  279.         {
  280.                 if (score>best[j].scoreboard)
  281.                 {
  282.                         for (i=8;i>j;i--)
  283.                         {
  284.                                 best[i].scoreboard=best[i-1].scoreboard;
  285.                                 for (n=0;n<8;n++) best[i].name[n]=best[i-1].name[n];
  286.                         }
  287.                         best[j].scoreboard=score;
  288.                         for (i=0;i<8;i++) best[j].name[i]='.';
  289.                         score=0;
  290.                         output_yy+=(2*j);
  291.                 }
  292.         }
  293.        
  294.         select_image(IMG_FONT);// выбор изображения для шрифта
  295.         for (j=0;j<8;j++) // вывод списка лидеров
  296.         {
  297.                 output_y+=2;
  298.                 b=best[j].scoreboard;
  299.                 for (i=0;i<=3;i++)
  300.                 {
  301.                         draw_tile(27-i,output_y,16+(b%10));
  302.                         b/=10;
  303.                 }
  304.                 put_string (14,output_y,best[j].name);
  305.         }
  306.        
  307.         swap_screen();
  308.        
  309.         if (score==0)PutName(14,output_yy);
  310.                
  311.        
  312.         SaveBest();
  313.        
  314.         save_to_file("savelist.bin");
  315.        
  316.         new_exit();
  317. }
  318.  
  319.  
  320.  
  321. // подготовка игрового экрана
  322. void InitScreen()
  323. {
  324.         //обнуление матрицы стакана
  325.         for(i=0;i<HIGH_MAP;++i)
  326.                 for(j=0;j<WIDTH_MAP;++j) map[i][j]=0;
  327.        
  328.         // обнуление замен кубика
  329.         rotate=0;
  330.         score_rotate=0;
  331.        
  332.         //обнуление вариантов кубика
  333.         boxReel=0;
  334.        
  335.         box.variantNext=0;
  336.        
  337.         //черный экран на время подготовки
  338.         //pal_bright(BRIGHT_MIN);
  339.  
  340.         //установка палитры
  341.         pal_select(PAL_BOX);
  342.        
  343.         //запуск спрайтов
  344.         sprites_start();
  345.        
  346.         //очистка теневого экрана нужным цветом 0..15
  347.         border(0);
  348.         clear_screen(0);
  349.        
  350.         //вывод фона на теневой экран
  351.         draw_image(0,0,IMG_BACK);
  352.  
  353.         //вывод строки очков
  354.         put_score(0,0);
  355.        
  356.         //вывод строки лидера
  357.         put_best_score();
  358.        
  359.         //установка нормальной яркости
  360.         pal_bright(BRIGHT_MID);
  361.        
  362. }
  363.  
  364.  
  365.  
  366. // обновление спрайта
  367. void Update()
  368. {
  369.         set_sprite(0,box.x,box.y,box.variant);
  370.         set_sprite(1,X_NEXT,Y_NEXT,box.variantNext);
  371.         swap_screen();
  372. }
  373.  
  374.  
  375.  
  376. // отрисовка кубика тайлом
  377. void DrawTileBox(u8 str, u8 col, u8 variant)
  378. {
  379.         select_image(IMG_BOX);  // выбор изображения для тайлов
  380.         color_key(15);
  381.        
  382.         draw_tile_key(15+col*2,2+str*2,4*variant);
  383.         draw_tile_key(16+col*2,2+str*2,4*variant+1);
  384.         draw_tile_key(15+col*2,3+str*2,4*variant+2);
  385.         draw_tile_key(16+col*2,3+str*2,4*variant+3);   
  386.  
  387.         //set_sprite(0,LEFT_LIMIT+col*8,TOP_LIMIT+str*16,SPRITE_END);
  388.         swap_screen();
  389. }
  390.  
  391.  
  392.  
  393. // инициализация нового кубика
  394. void InitNewBox()
  395. {
  396.         u8 n;
  397.        
  398.         box.x=LEFT_LIMIT+16;
  399.         box.y=TOP_LIMIT;
  400.         box.col=2;
  401.         box.str=0;
  402.         box.variant=box.variantNext;
  403.        
  404.         n=rand16()%100;
  405.         switch (boxReel)
  406.         {
  407.                 case 0: box.variantNext=0;
  408.                 break;
  409.  
  410.                 case 1:
  411.                 if (n<30) box.variantNext=0;            // 30%-2  70%-4
  412.                 else box.variantNext=1;
  413.                 break;
  414.                
  415.                 case 2:
  416.                 if (n<40) box.variantNext=0;            // 40%-2  40%-4  20%-8
  417.                 else if (n<80) box.variantNext=1;
  418.                 else box.variantNext=2;
  419.                 break;
  420.                
  421.                 case 3:
  422.                 if (n<40) box.variantNext=0;            // 40%-2  30%-4  20%-8  10%-16
  423.                 else if (n<70) box.variantNext=1;
  424.                 else if (n<90) box.variantNext=2;
  425.                 else box.variantNext=3;
  426.                 break;
  427.                
  428.                 case 4:
  429.                 if (n<30) box.variantNext=0;            // 30%-2  25%-4  20%-8  15%-16  10%-32
  430.                 else if (n<55) box.variantNext=1;
  431.                 else if (n<75) box.variantNext=2;
  432.                 else if (n<90) box.variantNext=3;
  433.                 else box.variantNext=4;
  434.                 break;
  435.                
  436.                 case 5:
  437.                 if (n<30) box.variantNext=0;            // 30%-2  25%-4  20%-8  10%-16  10%-32  5%-64
  438.                 else if (n<55) box.variantNext=1;
  439.                 else if (n<75) box.variantNext=2;
  440.                 else if (n<85) box.variantNext=3;
  441.                 else if (n<95) box.variantNext=4;
  442.                 else box.variantNext=5;
  443.                 break;
  444.                
  445.                 case 6:
  446.                 if (n<25) box.variantNext=0;            // 25%-2  25%-4  20%-8  10%-16  10%-32  5%-64  5%-128
  447.                 else if (n<50) box.variantNext=1;
  448.                 else if (n<70) box.variantNext=2;
  449.                 else if (n<80) box.variantNext=3;
  450.                 else if (n<90) box.variantNext=4;
  451.                 else if (n<95) box.variantNext=5;
  452.                 else box.variantNext=6;
  453.                 break;
  454.                
  455.                 case 7:
  456.                 if (n<20) box.variantNext=0;            // 20%-2  20%-4  20%-8  15%-16  10%-32  10%-64  3%-128  2%-256
  457.                 else if (n<40) box.variantNext=1;
  458.                 else if (n<60) box.variantNext=2;
  459.                 else if (n<75) box.variantNext=3;
  460.                 else if (n<85) box.variantNext=4;
  461.                 else if (n<95) box.variantNext=5;
  462.                 else if (n<98) box.variantNext=6;
  463.                 else box.variantNext=7;
  464.                 break;
  465.                
  466.                 case 8:
  467.                 if (n<20) box.variantNext=0;            // 20%-2  20%-4  20%-8  15%-16  10%-32  5%-64  5%-128  3%-256 2%-512
  468.                 else if (n<40) box.variantNext=1;
  469.                 else if (n<60) box.variantNext=2;
  470.                 else if (n<75) box.variantNext=3;
  471.                 else if (n<85) box.variantNext=4;
  472.                 else if (n<90) box.variantNext=5;
  473.                 else if (n<95) box.variantNext=6;
  474.                 else if (n<98) box.variantNext=7;
  475.                 else box.variantNext=8;
  476.                 break;
  477.         }
  478. }
  479.  
  480.  
  481.  
  482. // проверка пространства снизу
  483. u8 CheckDown()
  484. {
  485.         for(i=1;i<=HIGH_MAP-1;++i)
  486.                 {
  487.                         if (map[i][box.col]!=0)
  488.                         {
  489.                                 yLimit=i-1;
  490.                                 break;
  491.                         }
  492.                         else yLimit=HIGH_MAP-2;
  493.                 }
  494.         return yLimit;
  495. }
  496.  
  497.  
  498.  
  499. // проверка на коллизии
  500. void Collision(u8 str, u8 col)
  501. {
  502.        
  503.         if (map[str][col]!=map[str+1][col])
  504.         {
  505.                 DrawTileBox(box.str,box.col,box.variant);
  506.                 if (gN==0) sfx_play(SFX_DEFINE,8);
  507.                 gN=0;
  508.                
  509.                 if (str==1) // конец игры
  510.                 {
  511.                         sfx_play(SFX_GAMEOVER,8);
  512.                         vsync();
  513.                         GameOver();
  514.                         InitScreen(); // новая игра
  515.                         return;
  516.                 }
  517.         }
  518.  
  519.         if (map[str][col]==map[str+1][col])
  520.         {
  521.                 switch (gN)
  522.                 {
  523.                         case 0:
  524.                         sfx_play(SFX_BELL5,8);
  525.                         break;
  526.                         case 1:
  527.                         sfx_play(SFX_BELL4,8);
  528.                         break;
  529.                         case 2:
  530.                         sfx_play(SFX_BELL3,8);
  531.                         break;
  532.                         case 3:
  533.                         sfx_play(SFX_BELL2,8);
  534.                         break;
  535.                         case 4:
  536.                         sfx_play(SFX_BELL1,8);
  537.                         break;
  538.                         default:
  539.                         sfx_play(SFX_BELL0,8);
  540.                 }
  541.                 map[str+1][col]+=1;
  542.                 map[str][col]=0;
  543.                 if (gN>0) DrawTileBox(box.str,box.col,10);
  544.                 for (i=0;i<8;++i)
  545.                 {
  546.                         box.y+=2;
  547.                         Update();
  548.                 }
  549.                 box.str++;
  550.                 box.variant++;
  551.                 gN++;
  552.                 score+=box.variant;
  553.                 if (score>=score_rotate+100) //начисление rotate за 100 score
  554.                 {
  555.                         rotate++;
  556.                         score_rotate+=100;
  557.                 }
  558.                 put_score(score, rotate);
  559.                 if (box.variant==10)
  560.                 {
  561.                         map[box.str][box.col]=0;
  562.                         DrawTileBox(box.str,box.col,10);
  563.                         sfx_play(SFX_1024,8);
  564.                         gN=0;
  565.                 }                      
  566.         }
  567.         if (gN>0)
  568.         {
  569.                 Collision(box.str,box.col);
  570.         }
  571.         if (boxReel<(map[box.str][box.col]-1)&&boxReel<8) boxReel++;
  572.         gN=0;
  573. }
  574.  
  575.  
  576. // обмен кубиков
  577. void Substitution()
  578. {
  579.         sfx_play(SFX_SUB,8);
  580.         for (i=0;i<=40;i+=8)
  581.         {
  582.                 set_sprite(0,box.x,box.y+i,box.variant);
  583.                 set_sprite(1,X_NEXT,Y_NEXT-i,box.variantNext);
  584.                 swap_screen();
  585.         }
  586.         for (i=0;i<=box.x-24;i+=4)
  587.         {
  588.                 set_sprite(0,box.x-i,box.y+40,box.variant);
  589.                 set_sprite(1,X_NEXT+i,Y_NEXT-40,box.variantNext);
  590.                 swap_screen();
  591.         }
  592.                                
  593.         j=box.variant;
  594.         box.variant=box.variantNext;
  595.         box.variantNext=j;
  596. }
  597.  
  598. // главный цикл
  599. void main(void)
  600. {
  601.         u8 k;
  602.  
  603.         Intro();
  604.         Bright();
  605.         BestInit();
  606.         SaveBest();
  607.        
  608.         load_from_file("savelist.bin");
  609.         LoadBest();
  610.         InitScreen();
  611.         InitNewBox();
  612.         Update();
  613.        
  614.         while(1)
  615.         {
  616.                 vsync();
  617.                 k=joystick();
  618.                 if(k&JOY_UP)
  619.                 {
  620.                         if (rotate>0)
  621.                         {
  622.                                 rotate-=1;
  623.                                 put_score(score,rotate);
  624.                                 Substitution();
  625.                         }
  626.                 }
  627.                 if(k&JOY_RIGHT&&box.col<4)
  628.                 {
  629.                         sfx_play(SFX_SWIPE,4);
  630.                         for (i=0;i<8;i++)
  631.                         {
  632.                                 box.x++;
  633.                                 Update();
  634.                         }
  635.                         box.col++;
  636.                        
  637.                        
  638.                 }
  639.                 if(k&JOY_LEFT&&box.col>0)
  640.                 {
  641.                         sfx_play(SFX_SWIPE,4);
  642.                         for (i=0;i<8;i++)
  643.                         {
  644.                                 box.x--;
  645.                                 Update();
  646.                         }
  647.                         box.col--;
  648.                        
  649.                 }
  650.                 if(k&JOY_DOWN)
  651.                 {
  652.                         CheckDown();
  653.                        
  654.                         while (box.str<yLimit) // движение вниз
  655.                         {
  656.                                 for (i=0;i<2;i++)
  657.                                 {
  658.                                         box.y+=8;
  659.                                         Update();
  660.                                 }
  661.                                 box.str++;
  662.                         }
  663.                         map[box.str][box.col]=(box.variant+1);
  664.                         Collision(box.str, box.col);
  665.                         InitNewBox();
  666.                         Update();
  667.                         while (joystick());
  668.                 }
  669.         }
  670. }