#include "bunker.h" #include "stdlib.h" #include "xintc_l.h" // Provides handy macros for the interrupt controller. int x_y[4] = {BUNKER1_X, BUNKER2_X, BUNKER3_X, BUNKER4_X}; int initial_x = 70; int initial_y = 300; int tank_y_position = 420; void renderBunker(unsigned int* framePointer) { // draw for the first time short x=0, y=0; int i,j; for(j = 0; j < 4; j++) { initial_x = x_y[j]; for(i=0; i<10; i++){ switch(i){ case 0: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_left0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x)*640 + initial_x+y] = 0x0000FF00; } else { framePointer[(initial_y+x)*640 + initial_x+y] = 0x00000000; } } } break; case 1: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_normal0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x)*640 + initial_x+y+BLOCK_WIDTH] = 0x0000FF00; } else { framePointer[(initial_y+x)*640 + initial_x+y+BLOCK_WIDTH] = 0x00000000; } } } break; case 2: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_normal0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x)*640 + initial_x+y+BLOCK_WIDTH*2] = 0x0000FF00; } else { framePointer[(initial_y+x)*640 + initial_x+y+BLOCK_WIDTH*2] = 0x00000000; } } } break; case 3: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_right0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x)*640 + initial_x+y+BLOCK_WIDTH*3] = 0x0000FF00; } else { framePointer[(initial_y+x)*640 + initial_x+y+BLOCK_WIDTH*3] = 0x00000000; } } } break; case 4: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_normal0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y] = 0x0000FF00; } else { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y] = 0x00000000; } } } break; case 5: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_center_left0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y+BLOCK_WIDTH] = 0x0000FF00; } else { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y+BLOCK_WIDTH] = 0x00000000; } } } break; case 6: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_center_right0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y+BLOCK_WIDTH*2] = 0x0000FF00; } else { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y+BLOCK_WIDTH*2] = 0x00000000; } } } break; case 7: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_normal0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y+BLOCK_WIDTH*3] = 0x0000FF00; } else { framePointer[(initial_y+x+BLOCK_HEIGHT)*640 + initial_x+y+BLOCK_WIDTH*3] = 0x00000000; } } } break; case 8: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_normal0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x+BLOCK_HEIGHT*2)*640 + initial_x+y] = 0x0000FF00; } else { framePointer[(initial_y+x+BLOCK_HEIGHT*2)*640 + initial_x+y] = 0x00000000; } } } break; case 9: for(x = 0; x < BLOCK_HEIGHT; x++) { for(y = 0; y < BLOCK_WIDTH; y++){ if ((block_normal0[x%16] & (1<<(BLOCK_WIDTH-1-y)))) { framePointer[(initial_y+x+BLOCK_HEIGHT*2)*640 + initial_x+y+BLOCK_WIDTH*3] = 0x0000FF00; } else { framePointer[(initial_y+x+BLOCK_HEIGHT*2)*640 + initial_x+y+BLOCK_WIDTH*3] = 0x00000000; } } } break; default : break; } } } } void erodeBunker(unsigned int* framePointer, int which_bunker, int which_block){ // int which_block = rand()%10; short* bunker; int i, j; int block_row, block_col; switch(which_bunker){ // select a bunker that I want to erode case 0: bunker = getBunker1(); break; case 1: bunker = getBunker2(); break; case 2: bunker = getBunker3(); break; case 3: bunker = getBunker4(); break; default : break; } switch(which_block){ // 'block_row, block_col' are used to calculate to find out the position of framePointer case 0: block_row = 0; block_col = 0; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 1: block_row = 0; block_col = 1; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 2: block_row = 0; block_col = 2; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 3: block_row = 0; block_col = 3; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 4: block_row = 1; block_col = 0; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 5: block_row = 1; block_col = 1; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 6: block_row = 1; block_col = 2; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 7: block_row = 1; block_col = 3; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 8: block_row = 2; block_col = 0; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; case 9: block_row = 2; block_col = 3; blankBlock(framePointer, which_bunker, which_block, block_row, block_col); updateBlock(framePointer, which_bunker, which_block, block_row, block_col, bunker); break; default : break; } } // This function runs first to make a block empty, and then draw an eroded block by 'updateBlock()' function void blankBlock(unsigned int* framePointer, int which_bunker, int which_block, int block_row, int block_col){ int i, j; initial_x = x_y[which_bunker]; for(i = 0; i < BLOCK_HEIGHT; i++){ for(j = 0; j < BLOCK_WIDTH; j++){ framePointer[(initial_y+i+BLOCK_HEIGHT*block_row)*640 + initial_x+j+BLOCK_WIDTH*block_col] = 0x00000000; } } } void updateBlock(unsigned int* framePointer, int which_bunker, int which_block, int block_row, int block_col, short* bunker){ int i, j; initial_x = x_y[which_bunker]; int* which_state; if(bunker[which_block]==0){ // depending on the block selected and bunker status, 'which_state' points to a pre-defined eroded block bunker[which_block] = 1; if(which_block == 0){ which_state = block_left1; } else if(which_block == 1 || which_block == 2 || which_block == 4 || which_block == 7 || which_block == 8 || which_block == 9){ which_state = block_normal1; } else if(which_block == 3){ which_state = block_right1; } else if(which_block == 5){ which_state = block_center_left1; } else if(which_block == 6){ which_state = block_center_right1; } } else if(bunker[which_block]==1){ bunker[which_block] = 2; if(which_block == 0){ which_state = block_left2; } else if(which_block == 1 || which_block == 2 || which_block == 4 || which_block == 7 || which_block == 8 || which_block == 9){ which_state = block_normal2; } else if(which_block == 3){ which_state = block_right2; } else if(which_block == 5){ which_state = block_center_left2; } else if(which_block == 6){ which_state = block_center_right2; } } else if(bunker[which_block]==2){ bunker[which_block] = 3; if(which_block == 0){ which_state = block_left3; } else if(which_block == 1 || which_block == 2 || which_block == 4 || which_block == 7 || which_block == 8 || which_block == 9){ which_state = block_normal3; } else if(which_block == 3){ which_state = block_right3; } else if(which_block == 5){ which_state = block_center_left3; } else if(which_block == 6){ which_state = block_center_right3; } } else{ bunker[which_block] = 4; which_state = empty; } for(i = 0; i < BLOCK_HEIGHT; i++){ for(j = 0; j < BLOCK_WIDTH; j++){ if ((which_state[i%16] & (1<<(BLOCK_WIDTH-1-j)))) { framePointer[(initial_y+i+BLOCK_HEIGHT*block_row)*640 + initial_x+j+BLOCK_WIDTH*block_col] = 0x0000FF00; } else { framePointer[(initial_y+i+BLOCK_HEIGHT*block_row)*640 + initial_x+j+BLOCK_WIDTH*block_col] = 0x00000000; } } } } void selectBlock(unsigned int* framePointer, int bullet){ int bullet_x; int bullet_y; short hit = 0; short* bunker; int counter=0; short dying = 0; int gameover = 0; switch(bullet){ case 1: bullet_x = getAlien1BulletPositionX()+3; bullet_y = getAlien1BulletPositionY()+10; break; case 2: bullet_x = getAlien2BulletPositionX()+3; bullet_y = getAlien2BulletPositionY()+10; break; case 3: bullet_x = getAlien3BulletPositionX()+3; bullet_y = getAlien3BulletPositionY()+10; break; case 4: bullet_x = getAlien4BulletPositionX()+3; bullet_y = getAlien4BulletPositionY()+10; break; case 5: bullet_x = getTankBulletPositionX()+3; bullet_y = getTankBulletPositionY(); default: break; } if(bullet_x >= BUNKER1_X-3 && bullet_x < BUNKER1_X+64+3){ bunker = getBunker1(); if(bullet_y > initial_y && bullet_y < initial_y+16){ if(bullet_x >= BUNKER1_X-3 && bullet_x < BUNKER1_X+16 && bunker[0] != 4){ erodeBunker(framePointer, 0, 0); hit = 1; } if(bullet_x >= BUNKER1_X+16 && bullet_x < BUNKER1_X+32 && bunker[1] != 4){ erodeBunker(framePointer, 0, 1); hit = 1; } if(bullet_x >= BUNKER1_X+32 && bullet_x < BUNKER1_X+48 && bunker[2] != 4){ erodeBunker(framePointer, 0, 2); hit = 1; } if(bullet_x >= BUNKER1_X+48 && bullet_x < BUNKER1_X+64+3 && bunker[3] != 4){ erodeBunker(framePointer, 0, 3); hit = 1; } } if(bullet_y>initial_y+16 && bullet_y= BUNKER1_X-3 && bullet_x < BUNKER1_X+16 && bunker[4] != 4){ erodeBunker(framePointer, 0, 4); hit = 1; } if(bullet_x >= BUNKER1_X+16 && bullet_x < BUNKER1_X+32 && bunker[5] != 4){ erodeBunker(framePointer, 0, 5); hit = 1; } if(bullet_x >= BUNKER1_X+32 && bullet_x < BUNKER1_X+48 && bunker[6] != 4){ erodeBunker(framePointer, 0, 6); hit = 1; } if(bullet_x >= BUNKER1_X+48 && bullet_x < BUNKER1_X+64+3 && bunker[7] != 4){ erodeBunker(framePointer, 0, 7); hit = 1; } } if(bullet_y>initial_y+32 && bullet_y= BUNKER1_X-3 && bullet_x= BUNKER1_X+48 && bullet_x BUNKER2_X-3 && bullet_x < BUNKER2_X+64+3){ bunker = getBunker2(); if(bullet_y>initial_y && bullet_y= BUNKER2_X-3 && bullet_x= BUNKER2_X+16 && bullet_x= BUNKER2_X+32 && bullet_x= BUNKER2_X+48 && bullet_xinitial_y+16 && bullet_y= BUNKER2_X-3 && bullet_x= BUNKER2_X+16 && bullet_x= BUNKER2_X+32 && bullet_x= BUNKER2_X+48 && bullet_xinitial_y+32 && bullet_y= BUNKER2_X-3 && bullet_x= BUNKER2_X+48 && bullet_x BUNKER3_X-3 && bullet_x < BUNKER3_X+64+3){ bunker = getBunker3(); if(bullet_y>initial_y && bullet_y= BUNKER3_X-3 && bullet_x= BUNKER3_X+16 && bullet_x= BUNKER3_X+32 && bullet_x= BUNKER3_X+48 && bullet_xinitial_y+16 && bullet_y= BUNKER3_X-3 && bullet_x= BUNKER3_X+16 && bullet_x= BUNKER3_X+32 && bullet_x= BUNKER3_X+48 && bullet_xinitial_y+32 && bullet_y= BUNKER3_X-3 && bullet_x= BUNKER3_X+48 && bullet_x BUNKER4_X-3 && bullet_x < BUNKER4_X+64+3){ bunker = getBunker4(); if(bullet_y>initial_y && bullet_y= BUNKER4_X-3 && bullet_x= BUNKER4_X+16 && bullet_x= BUNKER4_X+32 && bullet_x= BUNKER4_X+48 && bullet_xinitial_y+16 && bullet_y= BUNKER4_X-3 && bullet_x= BUNKER4_X+16 && bullet_x= BUNKER4_X+32 && bullet_x= BUNKER4_X+48 && bullet_xinitial_y+32 && bullet_y= BUNKER4_X-3 && bullet_x= BUNKER4_X+48 && bullet_x tank_y_position && bullet_y < tank_y_position+16){ if(bullet_x >= getTankPositionX()-3 && bullet_x < getTankPositionX()+32+3){ setHaveTankDeathSound(1); counter = 0; // xil_printf("tank dies\r\n"); // disable interrupt to stop the whole game for little bit // XIntc_MasterDisable(XPAR_INTC_0_BASEADDR); setAlien1BulletState(0); blankAlienBullet(framePointer, getAlien1BulletPositionX(), getAlien1BulletPositionY()); setAlien2BulletState(0); blankAlienBullet(framePointer, getAlien2BulletPositionX(), getAlien2BulletPositionY()); setAlien3BulletState(0); blankAlienBullet(framePointer, getAlien3BulletPositionX(), getAlien3BulletPositionY()); setAlien4BulletState(0); blankAlienBullet(framePointer, getAlien4BulletPositionX(), getAlien4BulletPositionY()); setTankBulletState(0); blankTankBullet(framePointer, getTankBulletPositionX(), getTankBulletPositionY()); gameover = tankDied(framePointer); if(!gameover){ // for tank dying animation while(counter < 1000){ // if(counter%250){ if(dying == 0){ dying = 1; blankTank(framePointer); renderDying1(framePointer); } else{ dying = 0; blankTank(framePointer); renderDying2(framePointer); } // } counter++; } // reenable interrupt // XIntc_MasterEnable(XPAR_INTC_0_BASEADDR); renderTank(framePointer); } } } if(hit){ switch(bullet){ case 1: setAlien1BulletState(0); blankAlienBullet(framePointer, bullet_x-3, bullet_y-10); break; case 2: setAlien2BulletState(0); blankAlienBullet(framePointer, bullet_x-3, bullet_y-10); break; case 3: setAlien3BulletState(0); blankAlienBullet(framePointer, bullet_x-3, bullet_y-10); break; case 4: setAlien4BulletState(0); blankAlienBullet(framePointer, bullet_x-3, bullet_y-10); break; case 5: setTankBulletState(0); blankTankBullet(framePointer, bullet_x, bullet_y); break; default: break; } } }