static cell_t *get_cell(char *cell_id) { char row_str[3]; char col_str[3]; int row_idx = 0, col_idx = 0; int i, len; if (get_rowcol(cell_id, row_str, col_str, '\0') == -1) return NULL; len = cgc_strlen(row_str); for (i = 0; i < len; i++) row_idx += ((row_str[i] - 64) * pow(26, len - i - 1)); --row_idx; col_idx = strtol(col_str, NULL, 10); return &g_sheet[row_idx][col_idx]; }
static void fire_update() { int i = 0; int rowhit, colhit; while(i < me_firing) { myfire[i].posy += myfire[i].dir; /* test if hit something */ if(get_rowcol(myfire[i].posx, myfire[i].posy, &rowhit, &colhit)) { if(alien_status[rowhit + colhit * aliens_rows] > 0) { /* when hit, fire out, destroy it * (for now not animation) */ myfire_delete(i); GrSetGCForeground(invaders_gc, GR_RGB(255,255,255)); draw_alien(colhit,rowhit,itest); Dprintf("hit %d,%d,%d\n", colhit,rowhit,itest); Dprintf(" %d,%d\n",alien_maxx-alien_minx, cell_maxx - cell_minx); GrSetGCForeground(invaders_gc, GR_RGB(0,0,0)); alien_status[rowhit + colhit * aliens_rows] = 0; score += colhit * 2; update_score(); aliens_left -= 1; if(aliens_left <= 0) { level++; invaders_create_board(level); draw_first(); return; } continue; } } /* test if out board */ if(myfire[i].posy < board_top) { myfire_delete(i); i--; } i++; } i = 0; while(i < alien_firing) { alienfire[i].posy += alienfire[i].dir; Dprintf("alienfire pos %d\n", alienfire[i].posy); /* test if hit me */ if(alienfire[i].posy < (me_posy + ME_HEIGHT) && alienfire[i].posy >= me_posy && alienfire[i].posx >= me_posx && alienfire[i].posx <= me_posx + ME_WIDTH) { /* End of game */ game_status = GAME_STATUS_END; return; } /* test if out board */ if(alienfire[i].posy >= board_bottom) { alienfire_delete(i); i--; } i++; } }