git.y1.nz

gbdk-2020

GameBoy Development Kit
download: https://git.y1.nz/archives/gbdk.tar.gz
README | Files | Log | Refs | LICENSE

gbdk-lib/examples/gb/dscan/dscan.c

      1 /********************************************************************
      2  * Color Deep Scan                                                  *
      3  *  by                                                              *
      4  * Mr. N.U. of TeamKNOx                                             *
      5  ********************************************************************/
      6 
      7 #include <gb/gb.h>
      8 #include <gb/cgb.h>
      9 #include <stdint.h>
     10 #include <stdlib.h>
     11 #include <rand.h>
     12 
     13 /* bitmaps */
     14 #include "bkg.h"
     15 #include "bkg.c"
     16 #include "bkg_m.c"
     17 #include "bkg_c.c"
     18 #include "fore.h"
     19 #include "fore.c"
     20 
     21 /* ************************************************************ */
     22 
     23 const uint16_t bkg_p[] =
     24 {
     25   bkgCGBPal0c0,bkgCGBPal0c1,bkgCGBPal0c2,bkgCGBPal0c3,
     26   bkgCGBPal1c0,bkgCGBPal1c1,bkgCGBPal1c2,bkgCGBPal1c3,
     27   bkgCGBPal2c0,bkgCGBPal2c1,bkgCGBPal2c2,bkgCGBPal2c3,
     28   bkgCGBPal3c0,bkgCGBPal3c1,bkgCGBPal3c2,bkgCGBPal3c3,
     29   bkgCGBPal4c0,bkgCGBPal4c1,bkgCGBPal4c2,bkgCGBPal4c3,
     30   bkgCGBPal5c0,bkgCGBPal5c1,bkgCGBPal5c2,bkgCGBPal5c3,
     31   bkgCGBPal6c0,bkgCGBPal6c1,bkgCGBPal6c2,bkgCGBPal6c3,
     32   bkgCGBPal7c0,bkgCGBPal7c1,bkgCGBPal7c2,bkgCGBPal7c3
     33 };
     34 
     35 const uint16_t obj_p[] =
     36 {
     37   foreCGBPal0c0,foreCGBPal0c1,foreCGBPal0c2,foreCGBPal0c3,
     38   foreCGBPal1c0,foreCGBPal1c1,foreCGBPal1c2,foreCGBPal1c3,
     39   foreCGBPal2c0,foreCGBPal2c1,foreCGBPal2c2,foreCGBPal2c3,
     40   foreCGBPal3c0,foreCGBPal3c1,foreCGBPal3c2,foreCGBPal3c3,
     41   foreCGBPal4c0,foreCGBPal4c1,foreCGBPal4c2,foreCGBPal4c3,
     42   foreCGBPal5c0,foreCGBPal5c1,foreCGBPal5c2,foreCGBPal5c3,
     43   foreCGBPal6c0,foreCGBPal6c1,foreCGBPal6c2,foreCGBPal6c3,
     44   foreCGBPal7c0,foreCGBPal7c1,foreCGBPal7c2,foreCGBPal7c3
     45 };
     46 
     47 /* screen size */
     48 #define MIN_SX		5U		/* min x (char) */
     49 #define MAX_SX		(20U-MIN_SX)    /* max x (char) */
     50 #define MIN_SY		5U		/* min y (char) */
     51 #define MAX_SY		(MIN_SY+13U)	/* max y (char) */
     52 
     53 #define DEF_SP		30U		/* sprite null char code */	
     54 
     55 /* player */
     56 #define MIN_PX		(MIN_SX*8U+8U)	/* min x (dot) */
     57 #define MAX_PX		(MAX_SX*8U-8U)	/* max x (dot) */
     58 #define DEF_PX		80U		/* ship x pos (dot) */
     59 #define DEF_PY		(MIN_SY*8U)	/* ship y pos (dot) */
     60 #define DEF_PC0		14U
     61 #define DEF_PC1		15U
     62 #define DEF_PF		8U
     63 
     64 /* bomb */
     65 #define MAX_TT		6U		/* number */
     66 #define DEF_TS		2U		/* sprite tile id */
     67 #define DEF_TC		2U		/* sprite data id */
     68 #define DEF_TX		(80U-6U)	/* bomb x pos (dot) */
     69 #define DEF_TY		(DEF_PY-14U)	/* bomb y pos (dot) */
     70 #define MAX_TY		(MAX_SY*8U)	/* max y pos (dot) */
     71 
     72 /* enemy */
     73 #define MAX_ET		10U		/* number */
     74 #define DEF_ES0		(DEF_TS+MAX_TT) /* sprite tile id */
     75 #define DEF_ES1		(DEF_ES0+1U)
     76 #define DEF_1EC0	32U
     77 #define DEF_1EC1	48U
     78 #define DEF_2EC0	64U
     79 #define DEF_2EC1	80U
     80 #define DEF_XEC0	96U		/* sprite data(X) id */
     81 #define DEF_XEC1	112U		/* sprite data(X) id */
     82 #define DEF_EY		(DEF_PY+12U)
     83 #define DEF_EH		10U
     84 #define SUB_EX0		20U
     85 #define SUB_EX1		(SUB_EX0-8U)
     86 #define MIN_EX		(SUB_EX0-16U)
     87 #define MAX_EX		(SUB_EX0+180U)
     88 #define SPEED_EY	(DEF_EY+DEF_EH*3U)
     89 #define DEF_BC1		4U
     90 #define DEF_BC2		5U
     91 
     92 /* kirai */
     93 #define MAX_KT		12U
     94 #define DEF_KS		(DEF_ES0+MAX_ET*2U)	/* sprite tile id */
     95 #define DEF_KC		4U		/* sprite data id */
     96 #define DEF_KX		0U		/* bomb x pos (default_dot) */
     97 #define DEF_KY		0U		/* bomb y pos (default_dot) */
     98 #define MIN_KY		(DEF_PY+1U)	/* min y pos (dot) */
     99 
    100 unsigned char msg_tile[64];
    101 
    102 const unsigned char * const msg_1up   = "1UP";
    103 const unsigned char * const msg_lv    = "LV";
    104 
    105 const unsigned char * const msg_gover = "GAMEOVER";
    106 const unsigned char * const msg_pause = " PAUSE! ";
    107 const unsigned char * const msg_start = "        ";
    108 
    109 uint8_t pf, px, pp, pl;
    110 uint16_t pw;
    111 uint16_t ps;
    112 uint8_t tf[MAX_TT];
    113 uint8_t tx[MAX_TT], ty[MAX_TT];
    114 uint8_t ef[MAX_ET], ex[MAX_ET], ey[MAX_ET];
    115 uint8_t kf[MAX_KT], kx[MAX_KT], ky[MAX_KT];
    116 uint8_t rnd_enemy, rnd_kirai;
    117 uint8_t k_right, k_left;
    118 
    119 void set_sprite_attrb( uint8_t nb, uint8_t tile )
    120 {
    121   if(DEVICE_SUPPORTS_COLOR) {
    122     set_sprite_prop( nb, tile );
    123   }
    124 }
    125 
    126 
    127 void set_bkg_attr( uint8_t x, uint8_t y, uint8_t sx, uint8_t sy, unsigned char *d )
    128 {
    129   uint8_t xx, yy;
    130 
    131   VBK_REG = VBK_ATTRIBUTES;	/* select palette bank */
    132   for( yy=0; yy<sy; yy++ ) {
    133     for( xx=0; xx<sx; xx++ ) {
    134       msg_tile[xx] = bkgCGB[(unsigned int)*d];
    135       d++;
    136     }
    137     set_bkg_tiles( x, y+yy, sx, 1, msg_tile );
    138   }
    139   VBK_REG = VBK_TILES;		/* select data bank */
    140 }
    141 
    142 uint8_t make_rnd( uint8_t i )
    143 {
    144   return( arand()%(i+1) );
    145 }
    146 
    147 void show_score( uint16_t s )
    148 {
    149   uint16_t m;
    150   uint8_t i, n, f;
    151   unsigned char score[6];
    152 
    153   f = 0; m = 10000;
    154   for( i=0; i<5; i++ ) {
    155     n = s/m; s = s%m; m = m/10;
    156     if( (n==0)&&(f==0) ) {
    157       score[i] = 0x20;      /* ' ' */
    158     } else {
    159       f = 1;
    160       score[i] = 0x30+n;    /* '0' - '9' */
    161     }
    162   }
    163   score[5] = 0x30;      /* '0' */
    164   set_bkg_tiles( 4, 0, 6, 1, score );
    165 }
    166 
    167 void set_level( uint8_t i )
    168 {
    169   /* level */
    170   if( i < 9 ) {
    171     rnd_enemy = 100-(i*12); /*  1% - */
    172     rnd_kirai = 50-(i*6);   /*  2% - */
    173   } else {
    174     rnd_enemy = 0;      /* 100 % */
    175     rnd_kirai = 0;      /* 100 % */
    176   }
    177 }
    178 
    179 void show_level( uint8_t i )
    180 {
    181   unsigned char level[2];
    182 
    183   if( i < 9 ) {
    184     level[0] = 0x31+i;
    185   } else {
    186     level[0] = 0x41+i-9;
    187   }
    188   set_bkg_tiles( 19, 0, 1, 1, level );
    189   set_level( i );
    190 }
    191 
    192 void show_gover(void)
    193 {
    194   set_bkg_tiles(  6, 9, 8, 1, (unsigned char *)msg_gover );
    195   pf = DEF_PF;
    196 }
    197 
    198 void show_pause(void)
    199 {
    200   set_bkg_tiles(  6, 9, 8, 1, (unsigned char *)msg_pause );
    201 }
    202 
    203 void hide_msg(void)
    204 {
    205   set_bkg_tiles(  6, 9, 8, 1, (unsigned char *)msg_start );
    206 }
    207 
    208 void init_score(void)
    209 {
    210   ps = 0;
    211   show_score( ps );
    212   pp = 0; pl = 0;
    213   show_level( pl );
    214 }
    215 
    216 void init_screen(void)
    217 {
    218   uint8_t n;
    219 
    220   if(DEVICE_SUPPORTS_COLOR) {
    221     /* Transfer color palette */
    222     set_bkg_palette( BKGF_CGB_PAL0, 1, &bkg_p[0] );
    223     set_bkg_palette( BKGF_CGB_PAL1, 1, &bkg_p[4] );
    224     set_bkg_palette( BKGF_CGB_PAL2, 1, &bkg_p[8] );
    225     set_bkg_palette( BKGF_CGB_PAL3, 1, &bkg_p[12] );
    226     set_bkg_palette( BKGF_CGB_PAL4, 1, &bkg_p[16] );
    227     set_bkg_palette( BKGF_CGB_PAL5, 1, &bkg_p[20] );
    228     set_bkg_palette( BKGF_CGB_PAL6, 1, &bkg_p[24] );
    229     set_bkg_palette( BKGF_CGB_PAL7, 1, &bkg_p[28] );
    230     set_sprite_palette( OAMF_CGB_PAL0, 1, &obj_p[0] );
    231     set_sprite_palette( OAMF_CGB_PAL1, 1, &obj_p[4] );
    232     set_sprite_palette( OAMF_CGB_PAL2, 1, &obj_p[8] );
    233     set_sprite_palette( OAMF_CGB_PAL3, 1, &obj_p[12] );
    234     set_sprite_palette( OAMF_CGB_PAL4, 1, &obj_p[16] );
    235     set_sprite_palette( OAMF_CGB_PAL5, 1, &obj_p[20] );
    236     set_sprite_palette( OAMF_CGB_PAL6, 1, &obj_p[24] );
    237     set_sprite_palette( OAMF_CGB_PAL7, 1, &obj_p[28] );
    238 
    239     /* set attributes */
    240     set_bkg_attr( 0, 0, 20, 18, bkg_c );
    241     set_bkg_tiles(  0, 0, 20, 18, bkg_c );
    242   } else {
    243     set_bkg_tiles(  0, 0, 20, 18, bkg_m );
    244   }
    245 
    246   pw = 50;
    247   set_bkg_data(  0, 96, bkg );
    248   set_bkg_tiles(  0, 0, 3, 1, (unsigned char *)msg_1up );
    249   set_bkg_tiles( 16, 0, 2, 1, (unsigned char *)msg_lv );
    250   SHOW_BKG;
    251   SPRITES_8x8;
    252   set_sprite_data( 0, 128, fore );
    253   SHOW_SPRITES;
    254   for( n=0; n<40; n++ ) {
    255     set_sprite_tile( n, DEF_SP );
    256     move_sprite( n, 0, 0 );
    257   }
    258 }
    259 
    260 void init_player(void)
    261 {
    262   pf = 0; px = DEF_PX;
    263   set_sprite_tile( 0, 0 );
    264   set_sprite_attrb( 0, foreCGB[0] );
    265   move_sprite( 0, px, DEF_PY );
    266   set_sprite_tile( 1, 1 );
    267   set_sprite_attrb( 1, foreCGB[1] );
    268   move_sprite( 1, px+8, DEF_PY );
    269 }
    270 
    271 void init_tama(void)
    272 {
    273   uint8_t i;
    274 
    275   for( i=0; i<MAX_TT; i++ ) {
    276     tf[i] = 0;
    277     tx[i] = i*4+DEF_TX;
    278     ty[i] = DEF_TY;
    279     set_sprite_tile( i+DEF_TS, tf[i]+DEF_TC );
    280     set_sprite_attrb( i+DEF_TS, foreCGB[tf[i]+DEF_TC] );
    281     move_sprite( i+DEF_TS, tx[i], ty[i] );
    282   }
    283 }
    284 
    285 void init_enemy(void)
    286 {
    287   uint8_t i;
    288 
    289   for( i=0; i<MAX_ET; i++ ) {
    290     ef[i] = 0;
    291     ex[i] = 0;
    292     ey[i] = 0;
    293     set_sprite_tile( i*2+DEF_ES0, DEF_SP );
    294     set_sprite_tile( i*2+DEF_ES1, DEF_SP );
    295     move_sprite( i*2+DEF_ES0, ex[i], ey[i] );
    296     move_sprite( i*2+DEF_ES1, ex[i], ey[i] );
    297   }
    298 }
    299 
    300 void init_kirai(void)
    301 {
    302   uint8_t i;
    303 
    304   for( i=0; i<MAX_KT; i++ ) {
    305     kf[i] = 0;
    306     kx[i] = DEF_KX;
    307     ky[i] = DEF_KY;
    308     set_sprite_tile( i+DEF_KS, DEF_SP );
    309     move_sprite( i+DEF_KS, kx[i], ky[i] );
    310   }
    311 }
    312 
    313 /* player */
    314 void player(void)
    315 {
    316   uint8_t key;
    317   uint8_t i;
    318   uint16_t seed;
    319 
    320   key = joypad();
    321   /* pause */
    322   if( key & J_START ) {
    323     if( pf == DEF_PF ) {
    324       /* Initialize the random number generator */
    325       seed = DIV_REG;
    326       waitpadup();
    327       seed |= ((uint16_t)DIV_REG << 8);
    328       initarand(seed);
    329       hide_msg();
    330       init_score();
    331       init_player();
    332       init_tama();
    333       init_enemy();
    334       init_kirai();
    335       delay( 500 );
    336     } else {
    337       show_pause();
    338       waitpadup();
    339       key = joypad();
    340       while( !(key & J_START) ) {
    341         key = joypad();
    342         if( key & J_DOWN ) {
    343           if(pl > 0)
    344             pl--;
    345           show_level( pl );
    346           waitpadup();
    347         } else if( key & J_UP ) {
    348           if(pl < 8)
    349             pl++;
    350           show_level( pl );
    351           waitpadup();
    352         } else if( key & J_LEFT ) {
    353           while( joypad() & J_LEFT ) {
    354             if(pw > 0)
    355               pw--;
    356             show_score( pw );
    357             delay( 250 );
    358           }
    359           show_score( ps );
    360         } else if( key & J_RIGHT ) {
    361           while( joypad() & J_RIGHT ) {
    362             if(pw < 99)
    363               pw++;
    364             show_score( pw );
    365             delay( 250 );
    366           }
    367           show_score( ps );
    368         } else if( key & J_SELECT ) {
    369           i = k_right;
    370           k_right = k_left;
    371           k_left  = i;
    372           waitpadup();
    373         }
    374       }
    375       waitpadup();
    376       hide_msg();
    377       delay( 500 );
    378     }
    379     return;
    380   }
    381 
    382   /* dead */
    383   if( pf > 1 ) {
    384     if( pf < DEF_PF ) {
    385       set_sprite_tile( 0, pf*2+DEF_PC0 );
    386       set_sprite_attrb( 0, foreCGB[pf*2+DEF_PC0] );
    387       set_sprite_tile( 1, pf*2+DEF_PC1 );
    388       set_sprite_attrb( 1, foreCGB[pf*2+DEF_PC1] );
    389       pf++;
    390     } else {
    391       set_sprite_tile( 0, DEF_SP );
    392       set_sprite_tile( 1, DEF_SP );
    393       show_gover();
    394     }
    395     return;
    396   }
    397 
    398   /* move */
    399   if( (key&J_LEFT)&&(px>MIN_PX) ) {
    400     px--;
    401     move_sprite( 0, px, DEF_PY ); move_sprite( 1, px+8, DEF_PY );
    402   } else if( (key&J_RIGHT)&&(px<MAX_PX) ) {
    403     px++;
    404     move_sprite( 0, px, DEF_PY ); move_sprite( 1, px+8, DEF_PY );
    405   }
    406   /* shot */
    407   if( key & k_left ) {  /* change J_B to J_A */
    408     if( pf == 0 ) {
    409       pf = 1;
    410       for( i=0; i<MAX_TT; i++ ) {
    411         if( tf[i] == 0 ) {
    412           tf[i] = 1; tx[i] = px-4; ty[i] = DEF_PY;
    413           break;
    414         }
    415       }
    416     }
    417   } else if( key & k_right ) {  /* change J_A to J_B */
    418     if( pf == 0 ) {
    419       pf = 1;
    420       for( i=0; i<MAX_TT; i++ ) {
    421         if( tf[i] == 0 ) {
    422           tf[i] = 1; tx[i] = px+12; ty[i] = DEF_PY;
    423           break;
    424         }
    425       }
    426     }
    427   } else if( pf == 1 ) {
    428     pf = 0;
    429   }
    430 }
    431 
    432 /* bombs */
    433 void bombs(void)
    434 {
    435    uint8_t i;
    436 
    437    for( i=0; i<MAX_TT; i++ ) {
    438     if( tf[i] != 0 ) {
    439       ty[i]++;
    440       if( ty[i] > MAX_TY ) {
    441         tf[i] = 0; tx[i] = i*4+DEF_TX; ty[i] = DEF_TY;
    442       } else {
    443         tf[i] = 3-tf[i];
    444       }
    445       set_sprite_tile( i+DEF_TS, tf[i]+DEF_TC );
    446       set_sprite_attrb( i+DEF_TS, foreCGB[tf[i]+DEF_TC] );
    447       move_sprite( i+DEF_TS, tx[i], ty[i] );
    448     }
    449   }
    450 }
    451 
    452 /* enemys */
    453 void enemys(void)
    454 {
    455   uint8_t i, j;
    456 
    457   for( i=0; i<MAX_ET; i++ ) {
    458     if( ef[i] == 1 ) {
    459       /* move right to left */
    460       ex[i]--;
    461       if( (pl>0)&&(ey[i]<SPEED_EY) )  ex[i]--;
    462       if( ex[i] <= MIN_EX ) {
    463         ef[i] = 0;
    464         set_sprite_tile( i*2+DEF_ES0, DEF_SP );
    465         set_sprite_tile( i*2+DEF_ES1, DEF_SP );
    466       } else {
    467         /* new */
    468         if( ex[i]<MIN_SX*8+13 ) {
    469           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
    470           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
    471         } else if( ex[i]<MIN_SX*8+20 ) {
    472           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
    473           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+(ex[i]-MIN_SX*8-13) );
    474         } else if( ex[i]<MIN_SX*8+28 ) {
    475           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+(ex[i]-MIN_SX*8-20) );
    476           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+8 );
    477         } else if( ex[i]<MAX_SX*8+13 ) {
    478           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+8 );
    479           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+8 );
    480         } else if( ex[i]<MAX_SX*8+20 ) {
    481           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+8 );
    482           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1+(ex[i]-MAX_SX*8-12)+7 );
    483         } else if( ex[i]<MAX_SX*8+28 ) {
    484           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0+(ex[i]-MAX_SX*8-20)+8 );
    485           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
    486         } else {
    487           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
    488           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
    489         }
    490         /* new */
    491         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
    492         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
    493         /* check bomb */
    494         for( j=0; j<MAX_TT; j++ ) {
    495           if( tf[j] != 0 ) {
    496             if( (ty[j]>ey[i]-2)&&(ty[j]<ey[i]+2) ) {
    497               if( (tx[j]>(ex[i]-SUB_EX0-5))&&(tx[j]<(ex[i]-SUB_EX1+5)) ) {
    498                 /* hit */
    499                 tf[j] = 0; tx[j] = j*4+DEF_TX; ty[j] = DEF_TY;
    500                 set_sprite_tile( j+DEF_TS, tf[j]+DEF_TC );
    501                 set_sprite_attrb( j+DEF_TS, foreCGB[tf[j]+DEF_TC] );
    502                 move_sprite( j+DEF_TS, tx[j], ty[j] );
    503                 ef[i] = 3;
    504                 set_sprite_tile( i*2+DEF_ES0, ef[i]*2+DEF_BC1 );
    505                 set_sprite_attrb( i*2+DEF_ES0, foreCGB[ef[i]*2+DEF_BC1] );
    506                 set_sprite_tile( i*2+DEF_ES1, ef[i]*2+DEF_BC2 );
    507                 set_sprite_attrb( i*2+DEF_ES1, foreCGB[ef[i]*2+DEF_BC2] );
    508               }
    509             }
    510           }
    511         }
    512         if( make_rnd(rnd_kirai) == 0 ) {
    513           if( ((ex[i]-SUB_EX0)>MIN_PX)&&((ex[i]-SUB_EX0)<MAX_PX) ) {
    514             if( kf[i] == 0 ) {
    515               /* shot kirai */
    516               kf[i] = 1;
    517               kx[i] = ex[i]-SUB_EX0+4;
    518               ky[i] = ey[i]-4;
    519             } else if( kf[i+1] == 0 ) {
    520               /* shot kirai */
    521               kf[i+1] = 1;
    522               kx[i+1] = ex[i]-SUB_EX0+4;
    523               ky[i+1] = ey[i]-4;
    524             } else if( kf[i+2] == 0 ) {
    525               /* shot kirai */
    526               kf[i+2] = 1;
    527               kx[i+2] = ex[i]-SUB_EX0+4;
    528               ky[i+2] = ey[i]-4;
    529             }
    530           }
    531         }
    532       }
    533     } else if( ef[i] == 2 ) {
    534       /* move left to right */
    535       ex[i]++;
    536       if( (pl>0)&&(ey[i]<SPEED_EY) )  ex[i]++;
    537       if( ex[i] >= MAX_EX ) {
    538         ef[i] = 0;
    539         set_sprite_tile( i*2+DEF_ES0, DEF_SP );
    540         set_sprite_tile( i*2+DEF_ES1, DEF_SP );
    541       } else {
    542         /* new */
    543         if( i==9 ) {
    544           if( ex[i]<MIN_SX*8+13 ) {
    545             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
    546             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
    547           } else if( ex[i]<MIN_SX*8+20 ) {
    548             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
    549             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+(ex[i]-MIN_SX*8-13) );
    550           } else if( ex[i]<MIN_SX*8+28 ) {
    551             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+(ex[i]-MIN_SX*8-20) );
    552             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+8 );
    553           } else if( ex[i]<MAX_SX*8+13 ) {
    554             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+8 );
    555             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+8 );
    556           } else if( ex[i]<MAX_SX*8+20 ) {
    557             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+8 );
    558             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1+(ex[i]-MAX_SX*8-12)+7 );
    559           } else if( ex[i]<MAX_SX*8+28 ) {
    560             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0+(ex[i]-MAX_SX*8-20)+8 );
    561             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
    562           } else {
    563             set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
    564             set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
    565           }
    566         } else {
    567           if( ex[i]<MIN_SX*8+13 ) {
    568             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
    569             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
    570           } else if( ex[i]<MIN_SX*8+20 ) {
    571             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
    572             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+(ex[i]-MIN_SX*8-13) );
    573           } else if( ex[i]<MIN_SX*8+28 ) {
    574             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+(ex[i]-MIN_SX*8-20) );
    575             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+8 );
    576           } else if( ex[i]<MAX_SX*8+13 ) {
    577             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+8 );
    578             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+8 );
    579           } else if( ex[i]<MAX_SX*8+20 ) {
    580             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+8 );
    581             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1+(ex[i]-MAX_SX*8-12)+7 );
    582           } else if( ex[i]<MAX_SX*8+28 ) {
    583             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0+(ex[i]-MAX_SX*8-20)+8 );
    584             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
    585           } else {
    586             set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
    587             set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
    588           }
    589         }
    590         /* new */
    591         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
    592         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
    593         /* check bomb */
    594         for( j=0; j<MAX_TT; j++ ) {
    595           if( tf[j] != 0 ) {
    596             if( (ty[j]>ey[i]-2)&&(ty[j]<ey[i]+2) ) {
    597               if( (tx[j]>(ex[i]-SUB_EX0-5))&&(tx[j]<(ex[i]-SUB_EX1+5)) ) {
    598                 /* hit */
    599                 tf[j] = 0; tx[j] = j*4+DEF_TX; ty[j] = DEF_TY;
    600                 set_sprite_tile( j+DEF_TS, tf[j]+DEF_TC );
    601                 set_sprite_attrb( j+DEF_TS, foreCGB[tf[j]+DEF_TC] );
    602                 move_sprite( j+DEF_TS, tx[j], ty[j] );
    603                 ef[i] = 3;
    604                 set_sprite_tile( i*2+DEF_ES0, ef[i]*2+DEF_BC1 );
    605                 set_sprite_attrb( i*2+DEF_ES0, foreCGB[ef[i]*2+DEF_BC1] );
    606                 set_sprite_tile( i*2+DEF_ES1, ef[i]*2+DEF_BC2 );
    607                 set_sprite_attrb( i*2+DEF_ES1, foreCGB[ef[i]*2+DEF_BC2] );
    608               }
    609             }
    610           }
    611         }
    612         if( make_rnd(rnd_kirai) == 0 ) {
    613           if( ((ex[i]-SUB_EX0)>MIN_PX)&&((ex[i]-SUB_EX0)<MAX_PX) ) {
    614             if( kf[i] == 0 ) {
    615               /* shot kirai */
    616               kf[i] = 1;
    617               kx[i] = ex[i]-SUB_EX0+4;
    618               ky[i] = ey[i]-4;
    619             } else if( kf[i+1] == 0 ) {
    620               /* shot kirai */
    621               kf[i+1] = 1;
    622               kx[i+1] = ex[i]-SUB_EX0+4;
    623               ky[i+1] = ey[i]-4;
    624             } else if( kf[i+2] == 0 ) {
    625               /* shot kirai */
    626               kf[i+2] = 1;
    627               kx[i+2] = ex[i]-SUB_EX0+4;
    628               ky[i+2] = ey[i]-4;
    629             }
    630           }
    631         }
    632       }
    633     } else if( ef[i] >= 3 ) {
    634       if( ef[i] > 4 ) {
    635         ef[i] = 0;
    636         set_sprite_tile( i*2+DEF_ES0, DEF_SP );
    637         set_sprite_tile( i*2+DEF_ES1, DEF_SP );
    638         if( i == 9 ) {
    639           ps += 100; show_score( ps ); pp++;
    640           set_level( pl-1 );
    641         } else {
    642           ps += (i+1); show_score( ps ); pp++;
    643         }
    644       } else {
    645         set_sprite_tile( i*2+DEF_ES0, ef[i]*2+DEF_BC1 );
    646         set_sprite_attrb( i*2+DEF_ES0, foreCGB[ef[i]*2+DEF_BC1] );
    647         set_sprite_tile( i*2+DEF_ES1, ef[i]*2+DEF_BC2 );
    648         set_sprite_attrb( i*2+DEF_ES1, foreCGB[ef[i]*2+DEF_BC2] );
    649         ef[i]++;
    650       }
    651     } else if( i == 9 ) {
    652       if( pp > 20 ) {
    653         pp = 0;
    654         pl++; show_level( pl );
    655         /* X */
    656         ey[i] = i*DEF_EH+DEF_EY;
    657         ef[i] = i%2+1;
    658         ex[i] = MIN_EX;
    659         set_sprite_tile( i*2+DEF_ES0, DEF_XEC0 );
    660         set_sprite_attrb( i*2+DEF_ES0, foreCGB[DEF_XEC0] );
    661         set_sprite_tile( i*2+DEF_ES1, DEF_XEC1 );
    662         set_sprite_attrb( i*2+DEF_ES1, foreCGB[DEF_XEC1] );
    663         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
    664         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
    665       }
    666     } else if( make_rnd(rnd_enemy) == 0 ) {
    667       if( !((pl<4)&&(i==0)) ) {
    668         /* create */
    669         ey[i] = i*DEF_EH+DEF_EY;
    670         ef[i] = i%2+1;
    671         if( ef[i] == 1 ) {
    672           ex[i] = MAX_EX;
    673           set_sprite_tile( i*2+DEF_ES0, DEF_1EC0 );
    674           set_sprite_attrb( i*2+DEF_ES0, foreCGB[DEF_1EC0] );
    675           set_sprite_tile( i*2+DEF_ES1, DEF_1EC1 );
    676           set_sprite_attrb( i*2+DEF_ES1, foreCGB[DEF_1EC1] );
    677         } else {
    678           ex[i] = MIN_EX;
    679           set_sprite_tile( i*2+DEF_ES0, DEF_2EC0 );
    680           set_sprite_attrb( i*2+DEF_ES0, foreCGB[DEF_2EC0] );
    681           set_sprite_tile( i*2+DEF_ES1, DEF_2EC1 );
    682           set_sprite_attrb( i*2+DEF_ES1, foreCGB[DEF_2EC1] );
    683         }
    684         move_sprite( i*2+DEF_ES0, ex[i]-SUB_EX0, ey[i] );
    685         move_sprite( i*2+DEF_ES1, ex[i]-SUB_EX1, ey[i] );
    686       }
    687     }
    688   }
    689 }
    690 
    691 /* kirai */
    692 void kirai(void)
    693 {
    694   uint8_t i;
    695 
    696   for( i=0; i<MAX_KT; i++ ) {
    697     if( kf[i] != 0 ) {
    698       ky[i]--;
    699       if( kf[i] >=3 ) {
    700         kf[i]++;
    701         if( (kx[i]>(px-5))&&(kx[i]<(px+12)) ) {
    702           if( pf < 2 ) {
    703             /* out!! */
    704             pf = 2;
    705           }
    706         }
    707         if( kf[i] >= 6 ) {
    708           kf[i] = 0; kx[i] = DEF_KX; ky[i] = DEF_KY;
    709         }
    710       } else if( ky[i] <= MIN_KY ) {
    711         kf[i] = 3;
    712       } else {
    713         kf[i] = 3-kf[i];
    714       }
    715       set_sprite_tile( i+DEF_KS, kf[i]+DEF_KC );
    716       set_sprite_attrb( i+DEF_KS, foreCGB[kf[i]+DEF_KC] );
    717       move_sprite( i+DEF_KS, kx[i], ky[i] );
    718     }
    719   }
    720 }
    721 
    722 /*--------------------------------------------------------------------------*
    723  | main program                                                             |
    724  *--------------------------------------------------------------------------*/
    725 void main(void)
    726 {
    727   disable_interrupts();
    728   DISPLAY_OFF;
    729 
    730   initarand(((uint16_t)DIV_REG << 8));
    731 
    732   init_screen();
    733   init_score();
    734   init_player();
    735   init_tama();
    736   init_enemy();
    737   init_kirai();
    738   show_gover();
    739   k_right = J_A;
    740   k_left = J_B;
    741   DISPLAY_ON;
    742   enable_interrupts();
    743 
    744   while(1) {
    745     delay( pw );
    746     player();
    747     bombs();
    748     enemys();
    749     kirai();
    750   }
    751 }

This webpage is intended to be an accessible preview of this repository. To get a fuller picture, clone it and use the git CLI.