void move_block(nstate *state, int direction) { if(direction == 0) { if(!state->current_shape.x) return; else { if(!will_collide(state, (state->current_shape.x - 1), state->current_shape.y, state->current_shape.orientation)) { draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.x--; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); } } } else { if(!will_collide(state, (state->current_shape.x + 1), state->current_shape.y, state->current_shape.orientation)) { draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.x++; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); } } }
void new_game(nstate *state) { clear_well(state); if(state->score > state->hiscore) state->hiscore = state->score; state->score = 0; state->level = 0; draw_score(state); choose_new_shape(state); draw_next_shape(state); draw_well(state, 1); if(state->state == STATE_NEWGAME) state->state = STATE_RUNNING; }
void delete_line(nstate *state, int line) { int x, y; if(line < WELL_NOTVISIBLE) return; for(y = line - 1; y; y--) for(x = WELL_WIDTH; x; x--) state->blocks[0][y + 1][x] = state->blocks[0][y][x]; draw_well(state, 0); }
int drop_block_1(nstate *state) { if(will_collide(state, state->current_shape.x, (state->current_shape.y + 1), state->current_shape.orientation)) { block_reached_bottom(state); return 1; } draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.y++; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); return 0; }
void handle_exposure_event(nstate *state) { GR_EVENT_EXPOSURE *event = &state->event.exposure; if(event->wid == state->score_window) { draw_score(state); return; } if(event->wid == state->next_shape_window) { draw_next_shape(state); return; } if(event->wid == state->new_game_button) { draw_new_game_button(state); return; } if(event->wid == state->pause_continue_button) { draw_pause_continue_button(state); return; } if(event->wid == state->anticlockwise_button) { draw_anticlockwise_button(state); return; } if(event->wid == state->clockwise_button) { draw_clockwise_button(state); return; } if(event->wid == state->left_button) { draw_left_button(state); return; } if(event->wid == state->right_button) { draw_right_button(state); return; } if(event->wid == state->drop_button) { draw_drop_button(state); return; } if(event->wid == state->well_window) { draw_well(state, 1); return; } }
void rotate_block(nstate *state, int direction) { int neworientation = 0; if(direction == 0) { if(!state->current_shape.orientation) neworientation = MAXORIENTATIONS - 1; else neworientation = state->current_shape.orientation - 1; } else { neworientation = state->current_shape.orientation + 1; if(neworientation == MAXORIENTATIONS) neworientation = 0; } if(!will_collide(state, state->current_shape.x, state->current_shape.y, neworientation)) { draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.orientation = neworientation; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); } }
void block_reached_bottom(nstate *state) { int x, y; if(!block_is_all_in_well(state)) { state->state = STATE_STOPPED; return; } for(y = WELL_HEIGHT - 1; y; y--) { for(x = 0; x < WELL_WIDTH; x++) if(!state->blocks[0][y][x]) goto nr; msleep(DELETE_LINE_DELAY); delete_line(state, y); state->score += SCORE_INCREMENT; if((LEVELS > (state->level + 1)) && (((state->level + 1) * LEVEL_DIVISOR) <= state->score)) state->level++; draw_score(state); y++; nr: } choose_new_shape(state); draw_next_shape(state); } void move_block(nstate *state, int direction) { if(direction == 0) { if(!state->current_shape.x) return; else { if(!will_collide(state, (state->current_shape.x - 1), state->current_shape.y, state->current_shape.orientation)) { draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.x--; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); } } } else { if(!will_collide(state, (state->current_shape.x + 1), state->current_shape.y, state->current_shape.orientation)) { draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.x++; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); } } } void rotate_block(nstate *state, int direction) { int neworientation = 0; if(direction == 0) { if(!state->current_shape.orientation) neworientation = MAXORIENTATIONS - 1; else neworientation = state->current_shape.orientation - 1; } else { neworientation = state->current_shape.orientation + 1; if(neworientation == MAXORIENTATIONS) neworientation = 0; } if(!will_collide(state, state->current_shape.x, state->current_shape.y, neworientation)) { draw_shape(state, state->current_shape.x, state->current_shape.y, 1); state->current_shape.orientation = neworientation; draw_shape(state, state->current_shape.x, state->current_shape.y, 0); draw_well(state, 0); } }