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 level_change_map(struct game* game, struct player* player, struct map* map, unsigned char num) { struct level* level = game_get_curr_level(game); struct list* bList = map_get_bombs(map); assert(game); assert(player); assert(map); if(num < level->nb_maps) { while(bList != NULL) { map_set_cell_type(map, list_get_x(bList), list_get_y(bList), CELL_EMPTY); bList = list_cut_head(bList); player_inc_nb_bomb(player); } map_set_bombs(map, NULL); player_reset_way_mov(player); level->cur_map = num; //printf("Next map\n"); int x = player_get_x(player); int y = player_get_y(player); players_from_map(game, level->maps[level->cur_map]); if(player_get_x(player) == 0 && player_get_y(player) == 0) { player_set_x(player, x); player_set_x(player, y); } map_load_monsters(level->maps[level->cur_map], game); window_resize(map_get_width(level_get_curr_map(level)) * SIZE_BLOC, map_get_height(level_get_curr_map(level)) * SIZE_BLOC + BANNER_HEIGHT + LINE_HEIGHT); } }
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); } }
int monster_move(struct monster* monster, struct map* map) { int x = monster->x; int y = monster->y; int move = 0; if (!map_is_inside(map, x, y)) return 0; switch (monster->current_direction) { case NORTH: if (monster_move_aux(monster, map, x, y - 1)) { map_set_cell_type(map,x,y,CELL_EMPTY); monster->y--; map_set_cell_type(map,monster_get_x(monster),monster_get_y(monster),CELL_MONSTER); move = 1; } break; case SOUTH: if (monster_move_aux(monster, map, x, y + 1)) { map_set_cell_type(map,x,y,CELL_EMPTY); monster->y++; map_set_cell_type(map,monster_get_x(monster),monster_get_y(monster),CELL_MONSTER); move = 1; } break; case WEST: if (monster_move_aux(monster, map, x - 1, y)) { map_set_cell_type(map,x,y,CELL_EMPTY); monster->x--; map_set_cell_type(map,monster_get_x(monster),monster_get_y(monster),CELL_MONSTER); move = 1; } break; case EAST: if (monster_move_aux(monster, map, x + 1, y)) { map_set_cell_type(map,x,y,CELL_EMPTY); monster->x++; map_set_cell_type(map,monster_get_x(monster),monster_get_y(monster),CELL_MONSTER); move = 1; } break; } return move; }
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; }
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; } }