int game_is_lost() { if (can_move_left(&grid) || can_move_right(&grid) || can_move_up(&grid) || can_move_down(&grid)) { return 0; } else { return 1; } }
void Piece::move_down() { if(can_move_down()) { if(pos_y <= 0) offset_y = PIECE_WIDTH; pos_y += offset_y; } }
int how_far_down(OBJp objp,int n) { register int i; register int temp; temp = objp->y; /* save the current position */ /* increment the position until you can't move right any further */ for (i = 0; i < n; i++) { objp->y++; if (!can_move_down(objp)) { objp->y = temp; return(i); } } objp->y = temp; /* restore the current position */ return(n); /* return how far right */ }
void player_system::handle_state_falling(void) { //maybe move below <= 0.0 ? if (!player->fast_drop && player->timer < 0.20) { if (can_move_down()) current_pos->origin.y -= current_dt * (1.0/0.20) * 32.0; } player->timer -= current_dt; // printf("%.2f\n", player->timer); // printf("fall time: %f\n", player->fall_time); // printf("diff: %i\n",global::g_state.difficulty); if (player->timer <= 0.0) { switch (global::g_state.difficulty) { case global::difficulty_easy: player->timer = 2.0; break; case global::difficulty_medium: player->timer = 1.5; break; case global::difficulty_hard: player->timer = 1.0; break; default: break; } // player->timer = player->fall_time * global::g_state.difficulty; if (player->fast_drop) player->timer = 0.1; if (!can_move_down()) { current_entity->add<hs::comp::mark_of_death>(); current_pos->origin = pixel_for_colrow(player->center_col, player->center_row); hs::entity *center = factory::create_pill(em, player->center_col, player->center_row, player->double_pill_type, factory::left); hs::entity *aux = factory::create_pill(em, player->aux_col, player->aux_row, player->double_pill_type, factory::right); center->get<game_board_element>()->connected_to_guid = aux->guid; aux->get<game_board_element>()->connected_to_guid = center->guid; center->get<hs::comp::position>()->rot = current_pos->rot; aux->get<hs::comp::position>()->rot = current_pos->rot; hs::entity *shading_center = hs::factory::create_atlas_sprite(em, "game_sheet.png", pixel_for_colrow(player->center_col, player->center_row), hs::rect_make(0, 416, 32, 32)); // shading_center->get<hs::comp::renderable>()->alpha = 0.9; shading_center->get<hs::comp::position>()->origin.z = defs::board_z+0.5; center->get<game_board_element>()->shading_guid = shading_center->guid; hs::entity *shading_aux = hs::factory::create_atlas_sprite(em, "game_sheet.png", pixel_for_colrow(player->center_col, player->center_row), hs::rect_make(32, 416, 32, 32)); // shading_aux->get<hs::comp::renderable>()->alpha = 0.9; shading_aux->get<hs::comp::position>()->origin.z = defs::board_z+0.5; aux->get<game_board_element>()->shading_guid = shading_aux->guid; if ((int)current_pos->rot == 0 || (int)current_pos->rot == 360) { shading_center->get<hs::comp::position>()->origin.x = current_pos->origin.x; shading_center->get<hs::comp::position>()->origin.y = current_pos->origin.y; shading_aux->get<hs::comp::position>()->origin.x = current_pos->origin.x + 32; shading_aux->get<hs::comp::position>()->origin.y = current_pos->origin.y; shading_center->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(0, 416, 32, 32); shading_aux->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(32, 416, 32, 32); } if ((int)current_pos->rot == 90) { shading_center->get<hs::comp::position>()->origin.x = current_pos->origin.x; shading_center->get<hs::comp::position>()->origin.y = current_pos->origin.y; shading_aux->get<hs::comp::position>()->origin.x = current_pos->origin.x; shading_aux->get<hs::comp::position>()->origin.y = current_pos->origin.y+32; shading_center->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(64, 448, 32, 32); shading_aux->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(64, 416, 32, 32); } if ((int)current_pos->rot == 180) { shading_center->get<hs::comp::position>()->origin.x = current_pos->origin.x+2; shading_center->get<hs::comp::position>()->origin.y = current_pos->origin.y; shading_aux->get<hs::comp::position>()->origin.x = current_pos->origin.x-30; shading_aux->get<hs::comp::position>()->origin.y = current_pos->origin.y; shading_center->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(32, 416, 32, 32); shading_aux->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(0, 416, 32, 32); } if ((int)current_pos->rot == 270) { shading_center->get<hs::comp::position>()->origin.x = current_pos->origin.x; shading_center->get<hs::comp::position>()->origin.y = current_pos->origin.y+2; shading_aux->get<hs::comp::position>()->origin.x = current_pos->origin.x; shading_aux->get<hs::comp::position>()->origin.y = current_pos->origin.y-30; shading_center->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(64, 416, 32, 32); shading_aux->get<hs::comp::atlas_sprite>()->src_rect = hs::rect_make(64, 448, 32, 32); } em->get_entity_by_guid(player->shading_guid)->add<hs::comp::mark_of_death>(); //em->remove_entity(em->get_entity_by_guid(player->shading_guid)->manager_id); if (player->center_row < defs::player_spawn_row && player->aux_row < defs::player_spawn_row) global::g_state.current_state = global::e_gs_player_landed; else global::g_state.current_state = global::e_gs_player_landed_ontop; hs::audio_system::play_sound("pill_land.m4a"); return; } hs::audio_system::play_sound("pill_move.m4a"); player->center_row--; player->aux_row--; current_pos->origin = pixel_for_colrow(player->center_col, player->center_row); update_shading(); return; } current_pos->origin.x = pixel_for_colrow(player->center_col, player->center_row).x; update_shading(); }
void play_game() { board *b = &grid; do { switch (os_wait_for_key()) { case ESC_KEY: return; case UP_KEY: if (can_move_up(b)) { shift_up(b); merge_up(b); shift_up(b); add_big_int(&score, &merge_score); break; } else { continue; } case DOWN_KEY: if (can_move_down(b)) { shift_down(b); merge_down(b); shift_down(b); add_big_int(&score, &merge_score); break; } else { continue; } case LEFT_KEY: if (can_move_left(b)) { shift_left(b); merge_left(b); shift_left(b); add_big_int(&score, &merge_score); break; } else { continue; } case RIGHT_KEY: if (can_move_right(b)) { shift_right(b); merge_right(b); shift_right(b); add_big_int(&score, &merge_score); break; } else { continue; } default: continue; } add_tile(b); display_board(b); } while (!game_is_lost()); }