void bomb_event(struct game* game, struct map* map, struct bomb* bomb, int x, int y) { struct player** players = game_get_players(game); struct player* player = NULL; struct bomb* sbomb = NULL; for(int i = 0; i < game_get_nb_player(game); i++) { player = players[i]; if((x == player_get_x(player) && y == player_get_y(player))) player_hit(player, 3*DEFAULT_GAME_FPS); } int cellType = map_get_cell_type(map, x, y); switch(cellType & 15){ case CELL_BONUS : // Case map_set_cell_type(map, x, y, CELL_EMPTY); break; case CELL_MONSTER : // Monster map_set_monsters( map, monster_hit(map_get_monsters(map), x, y, game) ); break; case CELL_CASE : // Case if(bomb->anim >= DEFAULT_GAME_FPS) map_case_destroyed(game, map, x, y); break; case CELL_BOMB : // Bomb if((sbomb = search_bomb(map, x, y, 0)) != NULL) sbomb->anim = 4 * DEFAULT_GAME_FPS; break; default: // Everything else break; } }
void bomb_plant(struct game* game, struct map* map, struct player* player) { int x = player_get_x(player); int y = player_get_y(player); if(player_get_nb_life(player) && player_get_nb_bomb(player) && map_get_cell_type(map, x, y) != CELL_BOMB && map_get_cell_type(map, x, y) != CELL_DOOR) { // if player has at least one bomb and he is not on a bomb bomb_init(game, map, x, y, BOMB_NORMAL, player_get_nb_range(player), player); map_set_cell_type(map, x, y, CELL_BOMB); player_dec_nb_bomb(player); } }
void bomb_explo_init(struct map* map, struct list* bList){ // When the bomb explode, used once per bomb assert(bList); struct bomb* bomb = list_get_data(bList); int cellType = 0; int rt = 0; int x; int y; if(map_get_cell_type(map, list_get_x(bList), list_get_y(bList)) == CELL_BOMB) map_set_cell_type(map, list_get_x(bList), list_get_y(bList), CELL_EMPTY); for(int d = 0; d < 4; d++){ // 0: NORTH, 1: SOUTH, 2: WEST, 3: EAST for(int r = 1; r <= bomb->range; r++){ x = list_get_x(bList) + r * ((d / 2) * ((d * 2) - 5)); // + r * dx y = list_get_y(bList) + r * ((d - 3) / 2 * ((d * 2) - 1)); // + r * dy //printf("\nd: %d, x: %d, y: %d, dx: %d, dy: %d", d, x, y, ((d - 3) / 2 * ((d * 2) - 1)), ((d / 2) * ((d * 2) - 5))); if(0 <= x && x < map_get_width(map) && 0 <= y && y < map_get_height(map)) { // if in map rt = r; cellType = map_get_cell_type(map, x, y); switch(cellType){ // Looking for something stopping the fire case CELL_GOAL: case CELL_SCENERY: case CELL_KEY: rt--; /* no break */ case CELL_CASE: case CELL_BONUS: case CELL_BOMB: r = bomb->range + 1; break; default: break; } // end switch } // end if in map } // end range // Set range_dir bomb->range_dir[d]= rt; rt = 0; } }
static int monster_move_aux(struct monster* monster, struct map* map, int x, int y) { if (!map_is_inside(map, x, y)){ return 0; } switch (map_get_cell_type(map, x, y)) { case CELL_SCENERY: return 0; break; case CELL_CASE: return 0; break; case CELL_BONUS: break; case CELL_GOAL: return 0; break; case CELL_MONSTER: return 0; break; case CELL_PLAYER: return 0; break; case CELL_BOMB: monster_die(monster); map_set_cell_type(map,x,y,CELL_EMPTY); return 0; break; default: break; } // Monster has moved return 1; }
struct list_monster* monster_create(struct list_monster *monster_list,struct map* map) { assert(map); int i, j; for (i = 0; i < map_get_width(map); i++) { for (j = 0; j < map_get_height(map); j++) { if (map_get_cell_type(map, i, j) == CELL_MONSTER) { struct monster* monster = malloc(sizeof(*monster)); monster->x = i; monster->y = j; monster->current_direction=SOUTH; monster->timer = SDL_GetTicks(); monster_list = add_monster_to_the_list_monster(monster_list, monster); } } } return monster_list; }