?login_element?

Subversion Repositories NedoOS

Rev

Blame | Last modification | View Log | Download | RSS feed

  1. #include "../_sdk/evo.h"
  2. #include "resources.h"
  3. #include "functions.h"
  4. #include "mouse.h"
  5.  
  6. #define SIZE_EASY_LEVEL         3
  7. #define SIZE_MEDIUM_LEVEL       4
  8. #define SIZE_HARD_LEVEL         5
  9.  
  10. #define TIME_EASY_LEVEL         6000
  11. #define TIME_MEDIUM_LEVEL       12000
  12. #define TIME_HARD_LEVEL         24000
  13.  
  14. #define OFFSET_EASY_X           60
  15. #define OFFSET_EASY_Y           56
  16.  
  17. #define OFFSET_MEDIUM_X         52
  18. #define OFFSET_MEDIUM_Y         40
  19.  
  20. #define OFFSET_HARD_X           44
  21. #define OFFSET_HARD_Y           24
  22.  
  23. static u32 t, t_old, t_level, t_total;
  24.  
  25. static i8 level;
  26.  
  27. static u16 summ_score=0;
  28.  
  29. static i8 map_x,map_y;
  30.  
  31. static i8 size_level;
  32.  
  33. static u8 offset_x,offset_y;
  34.  
  35. static u8 scr_map[SIZE_HARD_LEVEL][SIZE_HARD_LEVEL];
  36.  
  37. static u8 dot_map[SIZE_HARD_LEVEL][SIZE_HARD_LEVEL];
  38.  
  39. static u8 num_map[SIZE_HARD_LEVEL-1][SIZE_HARD_LEVEL-1];
  40.  
  41.  
  42. //experts list
  43. static struct
  44. {
  45.         u16 scoreboard;
  46.         u8 name[9];
  47. }       bestlist[9];
  48.  
  49. #include "saveload.h"
  50.  
  51. // reset experts list
  52. void bestlist_init()
  53. {
  54.         u8 i,j;
  55.        
  56.         for (i=0;i<9;i++)
  57.         {
  58.                 bestlist[i].scoreboard=0;
  59.                 for (j=0;j<8;j++)
  60.                         bestlist[i].name[j]='.';
  61.         }
  62. }
  63.  
  64. //exit to os
  65. void quit()__naked
  66. {
  67. __asm
  68.         jp _EXIT_TO_OS
  69. __endasm;
  70. }
  71.  
  72. // output score on screen
  73. void output_score()
  74. {
  75.         u8 i;
  76.         u16 score;
  77.        
  78.         score=summ_score;
  79.        
  80.         select_image(IMG_FONT);
  81.         color_key(15);
  82.        
  83.         for (i=0;i<=4;i++)
  84.         {
  85.                 draw_tile(36-i,15,16+(score%10));
  86.                 score/=10;
  87.         }
  88. }
  89.  
  90.  
  91. // output strings on coord
  92. void put_string(u8 output_x, u8 output_y, u8* str)
  93. {
  94.         u8 n;
  95.         while(1)
  96.         {
  97.                 n=*str++;
  98.                 if(!n) break;
  99.                 draw_tile(output_x,output_y,n-' ');
  100.                 ++output_x;
  101.         }
  102. }
  103.  
  104. // waiting for a key
  105. void press_start()
  106. {
  107.         while (TRUE)
  108.         {
  109.                 if(joystick()||mouse_position()==MOUSE_LBTN)
  110.                 {
  111.                         sfx_play(SFX_DOTDEL,8);
  112.                         return;
  113.                 }
  114.         }
  115. }
  116.  
  117. // increasing screen brightness
  118. void bright_up()
  119. {
  120.         u8 i;
  121.         for (i=BRIGHT_MIN;i<=BRIGHT_MID;i++)
  122.         {
  123.                 pal_bright(i);
  124.                 delay(3);
  125.         }
  126. }
  127.  
  128. // decreased screen brightness
  129. void bright_down()
  130. {
  131.         i8 i;
  132.         for (i=BRIGHT_MID;i>=BRIGHT_MIN;i--)
  133.         {
  134.                 pal_bright(i);
  135.                 delay(3);
  136.         }
  137.         clear_screen(0);
  138.         swap_screen();
  139. }
  140.  
  141. // intro
  142. void start_screen()
  143. {
  144.         pal_bright(BRIGHT_MIN);
  145.  
  146.         pal_select(PAL_PIPBOY);
  147.        
  148.         border(0);
  149.         clear_screen(0);
  150.        
  151.         draw_image(0,0,IMG_PIPBOY);
  152.        
  153.         swap_screen();
  154.        
  155.         bright_up();
  156.        
  157.         sample_play(SMP_START);
  158.        
  159.         press_start();
  160.        
  161.         bright_down();
  162. }
  163.  
  164. // output list of experts
  165. void output_expertlist()
  166. {
  167.         u8 output_name_x=17;
  168.         u8 output_score_x=30;
  169.         u8 output_y=5;
  170.         u16 tmp;
  171.         u8 i, j;
  172.        
  173.        
  174.         draw_image(0,0,IMG_LIST_EXPERTS);
  175.        
  176.         select_image(IMG_FONT);
  177.         color_key (15);
  178.        
  179.         for (i=0;i<9;i++)
  180.         {
  181.                 tmp=bestlist[i].scoreboard;
  182.                 for (j=0;j<=4;j++)
  183.                 {
  184.                         draw_tile(output_score_x-j,output_y,16+(tmp%10));
  185.                         tmp/=10;
  186.                 }
  187.                 put_string (output_name_x,output_y,bestlist[i].name);
  188.                 output_y+=2;
  189.         }
  190.         swap_screen();
  191.         bright_up();
  192.         press_start();
  193.         bright_down();
  194. }
  195.  
  196. // menu switch lewel
  197. void switch_level()
  198. {
  199.         switch (level)
  200.                 {
  201.                         case 1:
  202.                         draw_image(17,4,IMG_EASY_ENABLE);
  203.                         draw_image(17,8,IMG_MEDIUM_DISABLE);
  204.                         draw_image(17,12,IMG_HARD_DISABLE);
  205.                         draw_image(14,16,IMG_LIST_DISABLE);
  206.                         draw_image(17,20,IMG_EXIT_DISABLE);
  207.                         t_level=TIME_EASY_LEVEL;
  208.                         break;
  209.                         case 2:
  210.                         draw_image(17,4,IMG_EASY_DISABLE);
  211.                         draw_image(17,8,IMG_MEDIUM_ENABLE);
  212.                         draw_image(17,12,IMG_HARD_DISABLE);
  213.                         draw_image(14,16,IMG_LIST_DISABLE);
  214.                         draw_image(17,20,IMG_EXIT_DISABLE);
  215.                         t_level=TIME_MEDIUM_LEVEL;
  216.                         break;
  217.                         case 3:
  218.                         draw_image(17,4,IMG_EASY_DISABLE);
  219.                         draw_image(17,8,IMG_MEDIUM_DISABLE);
  220.                         draw_image(17,12,IMG_HARD_ENABLE);
  221.                         draw_image(14,16,IMG_LIST_DISABLE);
  222.                         draw_image(17,20,IMG_EXIT_DISABLE);
  223.                         t_level=TIME_HARD_LEVEL;
  224.                         break;
  225.                         case 4:
  226.                         draw_image(17,4,IMG_EASY_DISABLE);
  227.                         draw_image(17,8,IMG_MEDIUM_DISABLE);
  228.                         draw_image(17,12,IMG_HARD_DISABLE);
  229.                         draw_image(14,16,IMG_LIST_ENABLE);
  230.                         draw_image(17,20,IMG_EXIT_DISABLE);
  231.                         break;
  232.                         case 5:
  233.                         draw_image(17,4,IMG_EASY_DISABLE);
  234.                         draw_image(17,8,IMG_MEDIUM_DISABLE);
  235.                         draw_image(17,12,IMG_HARD_DISABLE);
  236.                         draw_image(14,16,IMG_LIST_DISABLE);
  237.                         draw_image(17,20,IMG_EXIT_ENABLE);
  238.                         break;
  239.                 }
  240.         swap_screen();
  241.         sfx_play(SFX_MOVE,8);
  242. }
  243.  
  244. // menu
  245. void menu_screen()
  246. {
  247.         u8 key, i;
  248.         i8 level_temp;
  249.        
  250.         level=1;
  251.         t_level=TIME_EASY_LEVEL;
  252.        
  253.         clear_screen(0);
  254.        
  255.         draw_image(0,0,IMG_MENU);
  256.         draw_image(17,4,IMG_EASY_ENABLE);
  257.        
  258.         swap_screen();
  259.         bright_up();
  260.        
  261.         while (TRUE)
  262.         {
  263.                
  264.                 //mouse
  265.                 i=mouse_position();
  266.                 if (i==MOUSE_LBTN)
  267.                 {
  268.                         sfx_play(SFX_DOTDEL,8);
  269.                         if (level==5) quit();
  270.                         if (level==4)
  271.                         {
  272.                                 bright_down();
  273.                                 set_sprite(0,0,0,SPRITE_END);
  274.                                 swap_screen();
  275.                                 set_sprite(0,0,0,SPRITE_END);
  276.                                 output_expertlist();
  277.                                 menu_screen();
  278.                         }
  279.                         summ_score=0;
  280.                         while(mouse_position()==MOUSE_LBTN);
  281.                         return;
  282.                 }
  283.                 mouse_setup(mouse_x,mouse_y);
  284.                 set_sprite(0,mouse_x,mouse_y,6);
  285.                
  286.                 level_temp=level;
  287.                 if (mouse_x>56&&mouse_x<108)
  288.                 {
  289.                         if(mouse_y>24&&mouse_y<48) level=1;
  290.                         if(mouse_y>56&&mouse_y<80) level=2;
  291.                         if(mouse_y>88&&mouse_y<112) level=3;
  292.                         if(mouse_y>120&&mouse_y<144) level=4;
  293.                         if(mouse_y>152&&mouse_y<176) level=5;
  294.                 }
  295.                 if (level_temp!=level) switch_level();
  296.                 swap_screen();
  297.                
  298.                
  299.                 //keyboard
  300.                 key=joystick();
  301.                
  302.                 if(key!=FALSE)
  303.                 {
  304.                         mouse_x=152;
  305.                         mouse_y=184;
  306.                         mouse_setup(152,184);
  307.                        
  308.                         if(key&JOY_FIRE)
  309.                         {
  310.                                 sfx_play(SFX_DOTDEL,8);
  311.                                 if (level==5) quit();
  312.                                 if (level==4)
  313.                                 {
  314.                                         bright_down();
  315.                                         output_expertlist();
  316.                                         menu_screen();
  317.                                 }
  318.                                 summ_score=0;
  319.                                 return;
  320.                         }
  321.                        
  322.                         if(key&JOY_UP)
  323.                         {
  324.                                 level_temp=level;
  325.                                 level--;
  326.                                 if (level<1) level=1;
  327.                                 if (level_temp!=level) switch_level();
  328.                         }
  329.                        
  330.                         if(key&JOY_DOWN)
  331.                         {
  332.                                 level_temp=level;
  333.                                 level++;
  334.                                 if (level>5) level=5;
  335.                                 if (level_temp!=level) switch_level();
  336.                         }
  337.                         while (joystick());
  338.                 }
  339.                 t=t_level;
  340.         }
  341. }
  342.  
  343. // level generation
  344. void level_gen()
  345. {
  346.         u8 n;
  347.         u8 summ_dot=0;
  348.        
  349.         switch (level)
  350.         {
  351.                 case 1:
  352.                 draw_image(0,0,IMG_EASY);
  353.                 swap_screen();
  354.        
  355.                 size_level=SIZE_EASY_LEVEL;
  356.                 offset_x=OFFSET_EASY_X;
  357.                 offset_y=OFFSET_EASY_Y;
  358.                 break;
  359.  
  360.                 case 2:
  361.                 draw_image(0,0,IMG_MEDIUM);
  362.                 swap_screen();
  363.        
  364.                 size_level=SIZE_MEDIUM_LEVEL;
  365.                 offset_x=OFFSET_MEDIUM_X;
  366.                 offset_y=OFFSET_MEDIUM_Y;
  367.                 break;
  368.  
  369.                 case 3:
  370.                 draw_image(0,0,IMG_HARD);
  371.                 swap_screen();
  372.        
  373.                 size_level=SIZE_HARD_LEVEL;
  374.                 offset_x=OFFSET_HARD_X;
  375.                 offset_y=OFFSET_HARD_Y;
  376.                 break;
  377.         }
  378.        
  379.         for (map_y=0;map_y<size_level;map_y++)
  380.                 for (map_x=0;map_x<size_level;map_x++)
  381.                 {
  382.                         n=rand16()%100;
  383.                         if (n<45) dot_map[map_x][map_y]=0; // balance
  384.                         else
  385.                         {
  386.                                 dot_map[map_x][map_y]=1;
  387.                         }
  388.                         summ_dot+=dot_map[map_x][map_y];
  389.                         scr_map[map_x][map_y]=0;
  390.                 }
  391.                
  392.         if (level==1&&summ_dot==9||level==2&&summ_dot==16||summ_dot==25) level_gen();
  393.        
  394.         output_score();
  395.        
  396.         select_image(IMG_NUM);
  397.         color_key(15);
  398.        
  399.         for (map_y=0;map_y<size_level-1;map_y++)
  400.                 for (map_x=0;map_x<size_level-1;map_x++)
  401.                 {
  402.                         num_map[map_x][map_y]=dot_map[map_x][map_y]+dot_map[map_x+1][map_y]+dot_map[map_x][map_y+1]+dot_map[map_x+1][map_y+1];
  403.                         draw_tile_key(map_x*4+(offset_x/4+2),map_y*4+(offset_y/8+2),num_map[map_x][map_y]*4);
  404.                         draw_tile_key(map_x*4+(offset_x/4+3),map_y*4+(offset_y/8+2),num_map[map_x][map_y]*4+1);
  405.                         draw_tile_key(map_x*4+(offset_x/4+2),map_y*4+(offset_y/8+3),num_map[map_x][map_y]*4+2);
  406.                         draw_tile_key(map_x*4+(offset_x/4+3),map_y*4+(offset_y/8+3),num_map[map_x][map_y]*4+3);
  407.                 }
  408.         swap_screen();
  409.         map_x=0;
  410.         map_y=0;
  411.        
  412.         t_old=time();
  413. }
  414.  
  415.  
  416. // init new game
  417. void new_game()
  418. {
  419.         menu_screen();
  420.        
  421.         level_gen();
  422. }
  423.  
  424. //checking leader and input name
  425. void enter_name()
  426. {
  427.         u8 i,j,n;
  428.         u8 n_list=0;
  429.        
  430.         u8 input_x=25;
  431.         u8 input_y=19;
  432.        
  433.         u32 t=time();
  434.         u8 key;
  435.         u8 keys[40];
  436.        
  437.         u8 check=FALSE;
  438.        
  439.         for (j=0;j<9;j++)
  440.         {
  441.                 if (summ_score>bestlist[j].scoreboard)
  442.                 {
  443.                         for (i=8;i>j;i--)
  444.                         {
  445.                                 bestlist[i].scoreboard=bestlist[i-1].scoreboard;
  446.                                 for (n=0;n<8;n++) bestlist[i].name[n]=bestlist[i-1].name[n];
  447.                         }
  448.                         bestlist[j].scoreboard=summ_score;
  449.                         for (i=0;i<8;i++) bestlist[j].name[i]='.';
  450.                         check=TRUE;
  451.                         n_list=j;
  452.                         break;
  453.                 }
  454.         }
  455.         if (check==FALSE) return;
  456.        
  457.         draw_image(0,0,IMG_ENTER_NAME);
  458.         swap_screen();
  459.         bright_up();
  460.         sfx_play(SFX_WIN,8);
  461.         vsync();
  462.  
  463.         select_image(IMG_FONT);
  464.  
  465.         while(1)
  466.         {
  467.                 keyboard(keys);
  468.  
  469.                 key=255;
  470.  
  471.                 if(keys[KEY_0]&KEY_PRESS) key='0';
  472.                 if(keys[KEY_1]&KEY_PRESS) key='1';
  473.                 if(keys[KEY_2]&KEY_PRESS) key='2';
  474.                 if(keys[KEY_3]&KEY_PRESS) key='3';
  475.                 if(keys[KEY_4]&KEY_PRESS) key='4';
  476.                 if(keys[KEY_5]&KEY_PRESS) key='5';
  477.                 if(keys[KEY_6]&KEY_PRESS) key='6';
  478.                 if(keys[KEY_7]&KEY_PRESS) key='7';
  479.                 if(keys[KEY_8]&KEY_PRESS) key='8';
  480.                 if(keys[KEY_9]&KEY_PRESS) key='9';
  481.  
  482.                 if(keys[KEY_A]&KEY_PRESS) key='A';
  483.                 if(keys[KEY_B]&KEY_PRESS) key='B';
  484.                 if(keys[KEY_C]&KEY_PRESS) key='C';
  485.                 if(keys[KEY_D]&KEY_PRESS) key='D';
  486.                 if(keys[KEY_E]&KEY_PRESS) key='E';
  487.                 if(keys[KEY_F]&KEY_PRESS) key='F';
  488.                 if(keys[KEY_G]&KEY_PRESS) key='G';
  489.                 if(keys[KEY_H]&KEY_PRESS) key='H';
  490.                 if(keys[KEY_I]&KEY_PRESS) key='I';
  491.                 if(keys[KEY_J]&KEY_PRESS) key='J';
  492.                 if(keys[KEY_K]&KEY_PRESS) key='K';
  493.                 if(keys[KEY_L]&KEY_PRESS) key='L';
  494.                 if(keys[KEY_M]&KEY_PRESS) key='M';
  495.                 if(keys[KEY_N]&KEY_PRESS) key='N';
  496.                 if(keys[KEY_O]&KEY_PRESS) key='O';
  497.                 if(keys[KEY_P]&KEY_PRESS) key='P';
  498.                 if(keys[KEY_Q]&KEY_PRESS) key='Q';
  499.                 if(keys[KEY_R]&KEY_PRESS) key='R';
  500.                 if(keys[KEY_S]&KEY_PRESS) key='S';
  501.                 if(keys[KEY_T]&KEY_PRESS) key='T';
  502.                 if(keys[KEY_U]&KEY_PRESS) key='U';
  503.                 if(keys[KEY_V]&KEY_PRESS) key='V';
  504.                 if(keys[KEY_W]&KEY_PRESS) key='W';
  505.                 if(keys[KEY_X]&KEY_PRESS) key='X';
  506.                 if(keys[KEY_Y]&KEY_PRESS) key='Y';
  507.                 if(keys[KEY_Z]&KEY_PRESS) key='Z';
  508.  
  509.                 if(keys[KEY_SPACE]&KEY_PRESS) key=' ';
  510.                 if(keys[KEY_ENTER]&KEY_PRESS) key='\n';
  511.  
  512.                 if(key!=255)
  513.                 {
  514.                         if(key>=' '&&key<='Z')
  515.                         {
  516.                                 draw_tile(input_x,input_y,key-' ');
  517.                         }
  518.                         if(input_x==33)
  519.                         {
  520.                                 input_x=32;
  521.                         }
  522.                         if(key=='\n')
  523.                         {
  524.                                 swap_screen();
  525.                                 set_sprite(0,input_x*4,input_y*8-5,SPRITE_END);
  526.                                 swap_screen();
  527.                                 set_sprite(0,input_x*4,input_y*8-5,SPRITE_END);
  528.                                 bright_down();
  529.                                 save_best();
  530.                                 save_to_file("savelist.bin");
  531.                                 output_expertlist();
  532.                                 return;
  533.                         }
  534.                         if(key=='0'||joystick()&JOY_LEFT)
  535.                         {
  536.                                 for (i=0;i<8;i++) bestlist[n_list].name[i]='.';
  537.                                 put_string (25,input_y,bestlist[n_list].name);
  538.                                 input_x=24;
  539.                         }
  540.                         bestlist[n_list].name[(input_x-25)]=key;
  541.                         input_x++;
  542.                         if(input_x==33)
  543.                         {
  544.                                 input_x=32;
  545.                         }
  546.                 }
  547.                
  548.                 // cursor
  549.                 if (t+25>time())
  550.                 {
  551.                         set_sprite(0,input_x*4,input_y*8-5,5);
  552.                         swap_screen();
  553.                 }
  554.                 else if (t+50>time())
  555.                 {
  556.                         set_sprite(0,input_x*4,input_y*8-5,4);
  557.                         swap_screen();
  558.                 }
  559.                 else
  560.                 {
  561.                         t=time();
  562.                         sfx_play(SFX_MOVE,8);
  563.                 }
  564.         }
  565. }
  566.  
  567. // game over
  568. void time_over()
  569. {
  570.         sfx_play(SFX_TIMEOVER,8);
  571.         bright_down();
  572.        
  573.         set_sprite(0,0,0,SPRITE_END);
  574.         set_sprite(1,0,0,SPRITE_END);
  575.         swap_screen();
  576.         set_sprite(0,0,0,SPRITE_END);
  577.         set_sprite(1,0,0,SPRITE_END);
  578.        
  579.        
  580.         draw_image(0,0,IMG_TIME_OVER);
  581.         swap_screen();
  582.         bright_up();
  583.        
  584.         press_start();
  585.         bright_down();
  586.        
  587.         enter_name();
  588.         new_game();
  589. }
  590.  
  591. // output time on screen
  592. void output_time()
  593. {
  594.         u8 i;
  595.         u8 sec, min;
  596.         select_image(IMG_FONT);
  597.         color_key(15);
  598.        
  599.         t_total=t-(time()-t_old);
  600.        
  601.         min=(t_total/50)/60;
  602.         sec=(t_total/50)%60;
  603.         for (i=0;i<=1;i++)
  604.         {
  605.                 draw_tile_key(4-i,15,16+(min%10));
  606.                 min/=10;
  607.                 draw_tile_key(6-i,15,16+(sec%10));
  608.                 sec/=10;
  609.         }
  610.        
  611.         if (t_total<=0) time_over();
  612. }
  613.  
  614. // setup dot
  615. void dot_set()
  616. {
  617.         select_image(IMG_TILES);
  618.         color_key(15);
  619.        
  620.         if (scr_map[map_x][map_y]==0)
  621.         {
  622.                 sfx_play(SFX_DOTSET,8);
  623.                 scr_map[map_x][map_y]=1;
  624.                 draw_tile_key(map_x*4+(offset_x/4),map_y*4+(offset_y/8),12);
  625.                 draw_tile_key(map_x*4+(offset_x/4+1),map_y*4+(offset_y/8),13);
  626.                 draw_tile_key(map_x*4+(offset_x/4),map_y*4+(offset_y/8+1),14);
  627.                 draw_tile_key(map_x*4+(offset_x/4+1),map_y*4+(offset_y/8+1),15);
  628.                 swap_screen();
  629.         }
  630.         else
  631.         {
  632.                 sfx_play(SFX_DOTDEL,8);
  633.                 scr_map[map_x][map_y]=0;
  634.                 draw_tile_key(map_x*4+(offset_x/4),map_y*4+(offset_y/8),4);
  635.                 draw_tile_key(map_x*4+(offset_x/4+1),map_y*4+(offset_y/8),5);
  636.                 draw_tile_key(map_x*4+(offset_x/4),map_y*4+(offset_y/8+1),6);
  637.                 draw_tile_key(map_x*4+(offset_x/4+1),map_y*4+(offset_y/8+1),7);
  638.                 swap_screen();
  639.         }
  640. }
  641.  
  642. //calculation score
  643. void win()
  644. {
  645.         u16 score=0;
  646.         u16 time_bonus;
  647.         u8 multiplier=0;
  648.        
  649.         u8 i;
  650.         u8 sec, min;
  651.        
  652.         switch (level)
  653.         {
  654.                 case 2:
  655.                 multiplier=5;
  656.                 break;
  657.                
  658.                 case 3:
  659.                 multiplier=10;
  660.                 break;
  661.         }
  662.        
  663.         if ((time()-t_old)<t_level/20)
  664.         {
  665.                 score=10*multiplier;
  666.                 time_bonus=t_level/10;
  667.                 t=t_total+time_bonus;
  668.         }
  669.         else if ((time()-t_old)<t_level/10)
  670.         {
  671.                 score=5*multiplier;
  672.                 time_bonus=t_level/20;
  673.                 t=t_total+time_bonus;
  674.         }
  675.         else if ((time()-t_old)<t_level/5)
  676.         {
  677.                 score=2*multiplier;
  678.                 time_bonus=50;
  679.                 t=t_total+time_bonus;
  680.         }
  681.         else
  682.         {
  683.                 score=1*multiplier;
  684.                 time_bonus=0;
  685.                 t=t_total;
  686.         }
  687.  
  688.         if (score==0) score=1;
  689.        
  690.         summ_score+=score;
  691.        
  692.         sfx_play(SFX_COMPLETED,8);
  693.        
  694.         while(joystick()||mouse_position()==MOUSE_LBTN);
  695.        
  696.         set_sprite(0,0,0,SPRITE_END);
  697.         set_sprite(1,0,0,SPRITE_END);
  698.         swap_screen();
  699.         set_sprite(0,0,0,SPRITE_END);
  700.         set_sprite(1,0,0,SPRITE_END);
  701.         draw_image(11,9,IMG_LEVEL_COMPLETED);
  702.  
  703.         select_image(IMG_FONT);
  704.         color_key(15);
  705.         min=(time_bonus/50)/60;
  706.         sec=(time_bonus/50)%60;
  707.         for (i=0;i<=1;i++)
  708.         {
  709.                 draw_tile_key(24-i,13,16+(min%10));
  710.                 min/=10;
  711.                 draw_tile_key(26-i,13,16+(sec%10));
  712.                 sec/=10;
  713.         }
  714.         swap_screen();
  715.         press_start();
  716.        
  717.         level_gen();
  718. }
  719.  
  720. // checking map
  721. void checking()
  722. {
  723.         i8 x,y;
  724.         u8 chk=TRUE;
  725.        
  726.         for (y=0;y<size_level-1;y++)
  727.                 for (x=0;x<size_level-1;x++)
  728.                 {
  729.                         if(num_map[x][y]!=scr_map[x][y]+scr_map[x+1][y]+scr_map[x][y+1]+scr_map[x+1][y+1]) chk=FALSE;
  730.                 }
  731.         if (chk==TRUE) win();
  732. }
  733.  
  734. // update screen cursor sprites
  735. void animation()
  736. {
  737.         set_sprite(0,map_x*16+offset_x,map_y*32+offset_y,1);
  738.         set_sprite(1,mouse_x,mouse_y,6);
  739.         swap_screen();
  740. }
  741.  
  742. ////////////////////////////////////////////////////////////
  743. void main(void)
  744. {
  745.         u8 key,i;
  746.         u8 mouse_en=TRUE;
  747.        
  748.         sprites_start();
  749.         start_screen();
  750.        
  751.         bestlist_init();
  752.         save_best();
  753.        
  754.         load_from_file("savelist.bin");
  755.         load_best();
  756.        
  757.        
  758.        
  759.         mouse_clipping(4,8,152,184);
  760.         //mouse_setup(152,184);
  761.        
  762.         new_game();
  763.        
  764.         while (TRUE)
  765.         {
  766.                 output_time();
  767.                
  768.                 mouse_position();
  769.                
  770.                 key=joystick();
  771.                
  772.                 // keyboard control
  773.                 if(key!=FALSE)
  774.                 {
  775.                         mouse_en=FALSE;
  776.                         mouse_x=152;
  777.                         mouse_y=184;
  778.                         mouse_setup(152,184);
  779.                        
  780.                         if(key&JOY_FIRE)
  781.                         {
  782.                                 dot_set();
  783.                                 checking();
  784.                         }
  785.                         if(key&JOY_UP)
  786.                         {
  787.                                 map_y--;
  788.                                 if (map_y<0) map_y=0;
  789.                         }
  790.                         if(key&JOY_DOWN)
  791.                         {
  792.                                 map_y++;
  793.                                 if (map_y>size_level-1) map_y=size_level-1;
  794.                         }
  795.                         if(key&JOY_LEFT)
  796.                         {
  797.                                 map_x--;
  798.                                 if (map_x<0) map_x=0;
  799.                         }
  800.                         if(key&JOY_RIGHT)
  801.                         {
  802.                                 map_x++;
  803.                                 if (map_x>size_level-1)
  804.                                 {
  805.                                         while (TRUE)
  806.                                         {
  807.                                                
  808.                                                 output_time();
  809.                                                 set_sprite(0,132,32,0);
  810.                                                 set_sprite(1,mouse_x,mouse_y,6);
  811.                                                 swap_screen();
  812.                                                
  813.                                                 if(joystick()&JOY_LEFT)
  814.                                                 {
  815.                                                         map_x=size_level-1;
  816.                                                         break;
  817.                                                 }
  818.                                                 if(joystick()&JOY_FIRE)
  819.                                                 {
  820.                                                         sfx_play(SFX_DOTDEL,8);
  821.                                                         bright_down();
  822.                                                        
  823.                                                         set_sprite(0,0,0,SPRITE_END);
  824.                                                         set_sprite(1,0,0,SPRITE_END);
  825.                                                         swap_screen();
  826.                                                         set_sprite(0,0,0,SPRITE_END);
  827.                                                         set_sprite(1,0,0,SPRITE_END);
  828.                                                        
  829.                                                         enter_name();
  830.                                                         new_game();
  831.                                                         break;
  832.                                                 }
  833.                                         }
  834.                                 }
  835.                         }
  836.                         while (joystick())
  837.                         {
  838.                                 output_time();
  839.                                 animation();
  840.                         }
  841.                 }
  842.                
  843.                 // mouse control
  844.                 if (mouse_x<150 || mouse_y<180) mouse_en=TRUE;
  845.                 if (mouse_en==TRUE)
  846.                 {
  847.                         mouse_setup(mouse_x,mouse_y);
  848.                        
  849.                         map_x=(mouse_x-offset_x+4)/16;
  850.                         if (map_x<0) map_x=0;
  851.                         if (map_x>size_level-1) map_x=size_level-1;
  852.                        
  853.                         map_y=(mouse_y-offset_y+8)/32;
  854.                         if (map_y<0) map_y=0;
  855.                         if (map_y>size_level-1) map_y=size_level-1;
  856.                        
  857.                        
  858.                         if (mouse_x>128&&mouse_y<56)
  859.                         {
  860.                                 while (mouse_x>128&&mouse_y<56)
  861.                                 {
  862.                                         i=mouse_position();
  863.                                        
  864.                                         output_time();
  865.                                         set_sprite(0,132,32,0);
  866.                                         set_sprite(1,mouse_x,mouse_y,6);
  867.                                         swap_screen();
  868.                                        
  869.                                         if(i==MOUSE_LBTN)
  870.                                         {
  871.                                                 sfx_play(SFX_DOTDEL,8);
  872.                                                 bright_down();
  873.                                                
  874.                                                 set_sprite(0,0,0,SPRITE_END);
  875.                                                 set_sprite(1,0,0,SPRITE_END);
  876.                                                 swap_screen();
  877.                                                 set_sprite(0,0,0,SPRITE_END);
  878.                                                 set_sprite(1,0,0,SPRITE_END);
  879.                                                
  880.                                                 enter_name();
  881.                                                 new_game();
  882.                                                 break;
  883.                                         }
  884.                                 }
  885.                         }                      
  886.                        
  887.                         i=mouse_position();
  888.                         if (i==MOUSE_LBTN)
  889.                         {
  890.                                 dot_set();
  891.                                 checking();
  892.                                 while(mouse_position()==MOUSE_LBTN)
  893.                                 {
  894.                                         output_time();
  895.                                         animation();
  896.                                 }
  897.                         }
  898.                 }
  899.                 animation();
  900.         }
  901. }