Exemplo n.º 1
0
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;
	}
}
Exemplo n.º 2
0
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);
	}
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 6
0
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;
	}
}