long explosion_iuse::use(player *p, item *it, bool t) const { // This ise used for active items, their charges are autmatically // decremented, therfor this function always returns 0. const point pos = g->find_item(it); if (pos.x == -999 || pos.y == -999) { return 0; } if (t) { if (sound_volume >= 0) { g->sound(pos.x, pos.y, sound_volume, sound_msg); } return 0; } if (it->charges > 0) { if (no_deactivate_msg.empty()) { p->add_msg_if_player(m_warning, _("You've already set the %s's timer you might want to get away from it."), it->tname().c_str()); } else { p->add_msg_if_player(m_info, no_deactivate_msg.c_str(), it->tname().c_str()); } return 0; } if (explosion_power >= 0) { g->explosion(pos.x, pos.y, explosion_power, explosion_shrapnel, explosion_fire, explosion_blast); } if (draw_explosion_radius >= 0) { g->draw_explosion(pos.x, pos.y, draw_explosion_radius, draw_explosion_color); } if (do_flashbang) { g->flashbang(pos.x, pos.y, flashbang_player_immune); } if (fields_radius >= 0 && fields_type != fd_null) { std::vector<point> gas_sources = points_for_gas_cloud(pos, fields_radius); for(size_t i = 0; i < gas_sources.size(); i++) { const point &p = gas_sources[i]; const int dens = rng(fields_min_density, fields_max_density); g->m.add_field(p.x, p.y, fields_type, dens); } } if (scrambler_blast_radius >= 0) { for (int x = pos.x - scrambler_blast_radius; x <= pos.x + scrambler_blast_radius; x++) { for (int y = pos.y - scrambler_blast_radius; y <= pos.y + scrambler_blast_radius; y++) { g->scrambler_blast(x, y); } } } if (emp_blast_radius >= 0) { for (int x = pos.x - emp_blast_radius; x <= pos.x + emp_blast_radius; x++) { for (int y = pos.y - emp_blast_radius; y <= pos.y + emp_blast_radius; y++) { g->emp_blast(x, y); } } } return 0; }
long explosion_iuse::use(player *p, item *it, bool t, point pos) const { if (t) { if (sound_volume >= 0) { sounds::sound(pos.x, pos.y, sound_volume, sound_msg); } return 0; } if (it->charges > 0) { if (no_deactivate_msg.empty()) { p->add_msg_if_player(m_warning, _("You've already set the %s's timer you might want to get away from it."), it->tname().c_str()); } else { p->add_msg_if_player(m_info, _( no_deactivate_msg.c_str() ), it->tname().c_str()); } return 0; } if (explosion_power >= 0) { g->explosion(pos.x, pos.y, explosion_power, explosion_shrapnel, explosion_fire, explosion_blast); } if (draw_explosion_radius >= 0) { g->draw_explosion(pos.x, pos.y, draw_explosion_radius, draw_explosion_color); } if (do_flashbang) { g->flashbang(pos.x, pos.y, flashbang_player_immune); } if (fields_radius >= 0 && fields_type != fd_null) { std::vector<point> gas_sources = points_for_gas_cloud(pos, fields_radius); for( auto &gas_source : gas_sources ) { const point &p = gas_source; const int dens = rng(fields_min_density, fields_max_density); g->m.add_field(p.x, p.y, fields_type, dens); } } if (scrambler_blast_radius >= 0) { for (int x = pos.x - scrambler_blast_radius; x <= pos.x + scrambler_blast_radius; x++) { for (int y = pos.y - scrambler_blast_radius; y <= pos.y + scrambler_blast_radius; y++) { g->scrambler_blast(x, y); } } } if (emp_blast_radius >= 0) { for (int x = pos.x - emp_blast_radius; x <= pos.x + emp_blast_radius; x++) { for (int y = pos.y - emp_blast_radius; y <= pos.y + emp_blast_radius; y++) { g->emp_blast(x, y); } } } return 1; }