From 8bc13fbb388c9e376a510849b30284f8208056b4 Mon Sep 17 00:00:00 2001 From: PatrikLundell Date: Wed, 5 Feb 2025 15:23:17 +0100 Subject: [PATCH] made more vehicle stuff map aware --- src/activity_actor.cpp | 10 +- src/activity_item_handling.cpp | 4 +- src/cata_tiles.cpp | 2 +- src/creature.cpp | 2 +- src/debug_menu.cpp | 4 +- src/game.cpp | 18 +- src/grab.cpp | 2 +- src/iexamine.cpp | 8 +- src/item.cpp | 4 +- src/item_location.cpp | 2 +- src/iuse.cpp | 13 +- src/lightmap.cpp | 6 +- src/line.cpp | 9 + src/line.h | 1 + src/map.cpp | 30 +-- src/map_extras.cpp | 12 +- src/mapgen.cpp | 9 +- src/ranged.cpp | 4 +- src/savegame_json.cpp | 2 +- src/sounds.cpp | 15 +- src/turret.cpp | 20 +- src/veh_appliance.cpp | 11 +- src/veh_interact.cpp | 16 +- src/veh_shape.cpp | 2 +- src/veh_utils.cpp | 2 +- src/vehicle.cpp | 252 +++++++++++++------------- src/vehicle.h | 36 ++-- src/vehicle_autodrive.cpp | 4 +- src/vehicle_move.cpp | 28 +-- src/vehicle_use.cpp | 77 ++++---- src/vpart_position.h | 10 +- tests/mapgen_remove_vehicles_test.cpp | 8 +- tests/npc_behavior_rules_test.cpp | 4 +- tests/vehicle_efficiency_test.cpp | 8 +- tests/vehicle_export_test.cpp | 2 +- tests/vehicle_fake_part_test.cpp | 18 +- tests/vehicle_interact_test.cpp | 10 +- tests/vehicle_part_test.cpp | 11 +- tests/vehicle_power_test.cpp | 2 +- tests/vehicle_ramp_test.cpp | 8 +- tests/vehicle_split_test.cpp | 4 +- tests/vehicle_test.cpp | 40 ++-- tests/vision_test.cpp | 20 +- 43 files changed, 386 insertions(+), 364 deletions(-) diff --git a/src/activity_actor.cpp b/src/activity_actor.cpp index 8f41775aca1c0..c486828573130 100644 --- a/src/activity_actor.cpp +++ b/src/activity_actor.cpp @@ -1218,7 +1218,7 @@ void hacksaw_activity_actor::do_turn( player_activity &/*act*/, Character &who ) return; } vehicle &veh = vp->vehicle(); - if( vehicle::use_vehicle_tool( veh, veh_pos.value(), type.value(), true ) ) { + if( vehicle::use_vehicle_tool( veh, &here, veh_pos.value(), type.value(), true ) ) { sfx::play_activity_sound( "tool", "hacksaw", sfx::get_heard_volume( target ) ); if( calendar::once_every( 1_minutes ) ) { //~ Sound of a metal sawing tool at work! @@ -2597,7 +2597,7 @@ void lockpick_activity_actor::finish( player_activity &act, Character &who ) if( veh ) { std::vector parts_at_target = veh->vehicle().get_parts_at( - target, "LOCKABLE_DOOR", part_status_flag::available ); + &here, target, "LOCKABLE_DOOR", part_status_flag::available ); if( !parts_at_target.empty() ) { locked_part = veh->vehicle().next_part_to_unlock( veh->vehicle().index_of_part( parts_at_target.front() ) ); @@ -8025,14 +8025,14 @@ bool vehicle_folding_activity_actor::fold_vehicle( Character &p, bool check_only for( const vpart_reference &vpr : veh.get_any_parts( VPFLAG_CARGO ) ) { vehicle_stack cargo = vpr.items(); for( const item &elem : cargo ) { - here.add_item_or_charges( veh.pos_bub(), elem ); + here.add_item_or_charges( veh.pos_bub( &here ), elem ); } cargo.clear(); } veh.unboard_all(); p.add_msg_if_player( _( "You fold the %s." ), veh.name ); - here.add_item_or_charges( veh.pos_bub(), veh.get_folded_item() ); + here.add_item_or_charges( veh.pos_bub( &here ), veh.get_folded_item() ); here.destroy_vehicle( &veh ); return true; @@ -8127,7 +8127,7 @@ bool vehicle_unfolding_activity_actor::unfold_vehicle( Character &p, bool check_ if( vp.info().location != "structure" ) { continue; } - if( invalid_pos( vp.pos_bub() ) ) { + if( invalid_pos( vp.pos_bub( &here ) ) ) { p.add_msg_if_player( m_info, _( "There's no room to unfold the %s." ), it.tname() ); here.destroy_vehicle( veh ); return false; diff --git a/src/activity_item_handling.cpp b/src/activity_item_handling.cpp index 6162ca18d3035..6a2cb27b66145 100644 --- a/src/activity_item_handling.cpp +++ b/src/activity_item_handling.cpp @@ -1058,7 +1058,7 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara if( act == ACT_VEHICLE_DECONSTRUCTION ) { // find out if there is a vehicle part here we can remove. std::vector parts = - veh->get_parts_at( src_loc, "", part_status_flag::any ); + veh->get_parts_at( &here, src_loc, "", part_status_flag::any ); for( vehicle_part *part_elem : parts ) { const int vpindex = veh->index_of_part( part_elem, true ); // if part is not on this vehicle, or if its attached to another part that needs to be removed first. @@ -1101,7 +1101,7 @@ static activity_reason_info can_do_activity_there( const activity_id &act, Chara } } else if( act == ACT_VEHICLE_REPAIR ) { // find out if there is a vehicle part here we can repair. - std::vector parts = veh->get_parts_at( src_loc, "", part_status_flag::any ); + std::vector parts = veh->get_parts_at( &here, src_loc, "", part_status_flag::any ); for( vehicle_part *part_elem : parts ) { const vpart_info &vpinfo = part_elem->info(); int vpindex = veh->index_of_part( part_elem, true ); diff --git a/src/cata_tiles.cpp b/src/cata_tiles.cpp index 47fa2193e9771..93063cc038a1e 100644 --- a/src/cata_tiles.cpp +++ b/src/cata_tiles.cpp @@ -1473,7 +1473,7 @@ void cata_tiles::draw( const point &dest, const tripoint_bub_ms ¢er, int wid if( g->display_overlay_state( ACTION_DISPLAY_VEHICLE_AI ) ) { for( const wrapped_vehicle &elem : here.get_vehicles() ) { const vehicle &veh = *elem.v; - const point_bub_ms veh_pos = veh.pos_bub().xy(); + const point_bub_ms veh_pos = veh.pos_bub( &here ).xy(); for( const auto &overlay_data : veh.get_debug_overlay_data() ) { const point_bub_ms pt = veh_pos + std::get<0>( overlay_data ); const int color = std::get<1>( overlay_data ); diff --git a/src/creature.cpp b/src/creature.cpp index af9db2fdeedd6..d3502a1f1c6bc 100644 --- a/src/creature.cpp +++ b/src/creature.cpp @@ -256,7 +256,7 @@ bool Creature::will_be_cramped_in_vehicle_tile( const tripoint_abs_ms &loc ) con vehicle &veh = vp_there->vehicle(); std::vector cargo_parts; - cargo_parts = veh.get_parts_at( here.get_bub( loc ), "CARGO", part_status_flag::any ); + cargo_parts = veh.get_parts_at( loc, "CARGO", part_status_flag::any ); units::volume capacity = 0_ml; units::volume free_cargo = 0_ml; diff --git a/src/debug_menu.cpp b/src/debug_menu.cpp index 94e1287d67697..a6c946481f35b 100644 --- a/src/debug_menu.cpp +++ b/src/debug_menu.cpp @@ -3733,7 +3733,7 @@ static void vehicle_export() { map &here = get_map(); - if( optional_vpart_position ovp = get_map().veh_at( get_avatar().pos_bub() ) ) { + if( optional_vpart_position ovp = here.veh_at( get_avatar().pos_abs() ) ) { cata_path export_dir{ cata_path::root_path::user, "export_dir" }; assure_dir_exist( export_dir ); const std::string text = string_input_popup() @@ -3744,7 +3744,7 @@ static void vehicle_export() try { write_to_file( veh_path, [&]( std::ostream & fout ) { JsonOut jsout( fout ); - ovp->vehicle().refresh( &here ); + ovp->vehicle().refresh( ); vehicle_prototype::save_vehicle_as_prototype( ovp->vehicle(), jsout ); } ); } catch( const std::exception &err ) { diff --git a/src/game.cpp b/src/game.cpp index f0c5a5cf5ad37..d79465a11430a 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -1058,7 +1058,7 @@ bool game::start_game() std::string search = std::string( "helicopter" ); if( name.find( search ) != std::string::npos ) { for( const vpart_reference &vp : v.v->get_any_parts( VPFLAG_CONTROLS ) ) { - const tripoint_bub_ms pos = vp.pos_bub(); + const tripoint_abs_ms pos = vp.pos_abs(); u.setpos( pos ); // Delete the items that would have spawned here from a "corpse" @@ -2831,6 +2831,8 @@ vehicle *game::remoteveh() void game::setremoteveh( vehicle *veh ) { + map &here = get_map(); + remoteveh_cache_time = calendar::turn; remoteveh_cache = veh; if( veh != nullptr && !u.has_active_bionic( bio_remote ) && @@ -2845,7 +2847,7 @@ void game::setremoteveh( vehicle *veh ) } std::stringstream remote_veh_string; - const tripoint_bub_ms vehpos = veh->pos_bub(); + const tripoint_bub_ms vehpos = veh->pos_bub( &here ); remote_veh_string << vehpos.x() << ' ' << vehpos.y() << ' ' << vehpos.z(); u.set_value( "remote_controlling_vehicle", remote_veh_string.str() ); } @@ -5822,9 +5824,11 @@ void game::moving_vehicle_dismount( const tripoint_bub_ms &dest_loc ) void game::control_vehicle() { + map &here = get_map(); + if( vehicle *remote_veh = remoteveh() ) { // remote controls have priority for( const vpart_reference &vpr : remote_veh->get_avail_parts( "REMOTE_CONTROLS" ) ) { - remote_veh->interact_with( vpr.pos_bub() ); + remote_veh->interact_with( vpr.pos_bub( &here ) ); return; } } @@ -10314,6 +10318,8 @@ void game::reload_wielded( bool prompt ) void game::reload_weapon( bool try_everything ) { + map &here = get_map(); + // As a special streamlined activity, hitting reload repeatedly should: // Reload wielded gun // First reload a magazine if necessary. @@ -10368,9 +10374,9 @@ void game::reload_weapon( bool try_everything ) return; } // If we make it here and haven't found anything to reload, start looking elsewhere. - const optional_vpart_position ovp = m.veh_at( u.pos_bub() ); + const optional_vpart_position ovp = m.veh_at( u.pos_abs() ); if( ovp ) { - const turret_data turret = ovp->vehicle().turret_query( ovp->pos_bub() ); + const turret_data turret = ovp->vehicle().turret_query( ovp->pos_bub( &here ) ); if( turret.can_reload() ) { item::reload_option opt = u.select_ammo( turret.base(), true ); if( opt ) { @@ -11154,7 +11160,7 @@ bool game::walk_move( const tripoint_bub_ms &dest_loc, const bool via_ramp, if( grabbed_vehicle ) { // Vehicle might be at different z level than the grabbed part. - u.grab_point.z() = vp_grab->pos_bub().z() - u.posz(); + u.grab_point.z() = vp_grab->pos_abs().z() - u.posz(); } if( pulling ) { diff --git a/src/grab.cpp b/src/grab.cpp index 48fca6c58aa7c..7a3d2b9b63d28 100644 --- a/src/grab.cpp +++ b/src/grab.cpp @@ -309,7 +309,7 @@ bool game::grabbed_veh_move( const tripoint_rel_ms &dp ) if( one_in( 2 ) ) { vehicle_part &vp_wheel = grabbed_vehicle->part( p ); tripoint_bub_ms wheel_p = grabbed_vehicle->bub_part_pos( &here, vp_wheel ); - grabbed_vehicle->handle_trap( wheel_p, vp_wheel ); + grabbed_vehicle->handle_trap( &m, wheel_p, vp_wheel ); } } diff --git a/src/iexamine.cpp b/src/iexamine.cpp index 79a7825236cc3..112fed9a54516 100644 --- a/src/iexamine.cpp +++ b/src/iexamine.cpp @@ -1565,10 +1565,10 @@ void iexamine::elevator( Character &you, const tripoint_bub_ms &examp ) } for( vehicle *v : vehs.v ) { - tripoint_bub_ms const p = _rotate_point_sm( { v->pos_bub().xy(), movez}, + tripoint_bub_ms const p = _rotate_point_sm( { v->pos_bub( &here ).xy(), movez}, erot, sm_orig ); - here.displace_vehicle( *v, p - v->pos_bub() ); + here.displace_vehicle( *v, p - v->pos_bub( &here ) ); v->turn( erot * 90_degrees ); v->face = tileray( v->turn_dir ); v->precalc_mounts( 0, v->turn_dir, v->pivot_anchor[0] ); @@ -2064,7 +2064,7 @@ void iexamine::locked_object( Character &you, const tripoint_bub_ms &examp ) // Check if the locked thing is a lockable door part. if( veh ) { std::vector parts_at_target = veh->vehicle().get_parts_at( - examp, "LOCKABLE_DOOR", part_status_flag::available ); + &here, examp, "LOCKABLE_DOOR", part_status_flag::available ); if( !parts_at_target.empty() ) { locked_part = veh->vehicle().next_part_to_unlock( veh->vehicle().index_of_part( parts_at_target.front() ) ); @@ -2133,7 +2133,7 @@ void iexamine::locked_object_pickable( Character &you, const tripoint_bub_ms &ex if( veh ) { const std::vector parts_at_target = veh->vehicle().get_parts_at( - examp, "LOCKABLE_DOOR", part_status_flag::available ); + &here, examp, "LOCKABLE_DOOR", part_status_flag::available ); if( !parts_at_target.empty() ) { locked_part = veh->vehicle().next_part_to_unlock( veh->vehicle().index_of_part( parts_at_target.front() ) ); diff --git a/src/item.cpp b/src/item.cpp index 92c4433067cf0..82c5482704420 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -14426,8 +14426,8 @@ bool item::process_link( map &here, Character *carrier, const tripoint_bub_ms &p link().last_processed = calendar::turn; // Set the new absolute position to the vehicle's origin. - tripoint_bub_ms t_veh_bub_pos = t_veh->pos_bub(); - tripoint_abs_ms new_t_abs_pos = here.get_abs( t_veh_bub_pos ); + tripoint_abs_ms new_t_abs_pos = t_veh->pos_abs();; + tripoint_bub_ms t_veh_bub_pos = here.get_bub( new_t_abs_pos );; if( link().t_abs_pos != new_t_abs_pos ) { link().t_abs_pos = new_t_abs_pos; length_check_needed = true; diff --git a/src/item_location.cpp b/src/item_location.cpp index bdb6fafd67482..378d94e2aa611 100644 --- a/src/item_location.cpp +++ b/src/item_location.cpp @@ -509,7 +509,7 @@ class item_location::impl::item_on_vehicle : public item_location::impl debugmsg( "item in vehicle part without cargo storage" ); } if( ch ) { - res += " " + direction_suffix( ch->pos_bub(), part_pos.pos_bub() ); + res += " " + direction_suffix( ch->pos_abs(), part_pos.pos_abs() ); } return res; } diff --git a/src/iuse.cpp b/src/iuse.cpp index 3395ec5196d96..4e2a3c2e77f7b 100644 --- a/src/iuse.cpp +++ b/src/iuse.cpp @@ -7306,15 +7306,16 @@ static bool hackveh( Character &p, item &it, vehicle &veh ) static vehicle *pickveh( const tripoint_bub_ms ¢er, bool advanced ) { + map &here = get_map(); static const std::string ctrl = "CTRL_ELECTRONIC"; static const std::string advctrl = "REMOTE_CONTROLS"; uilist pmenu; pmenu.title = _( "Select vehicle to access" ); std::vector< vehicle * > vehs; - for( wrapped_vehicle &veh : get_map().get_vehicles() ) { + for( wrapped_vehicle &veh : here.get_vehicles() ) { vehicle *&v = veh.v; - if( rl_dist( center, v->pos_bub() ) < 40 && + if( rl_dist( center, v->pos_bub( &here ) ) < 40 && v->fuel_left( itype_battery ) > 0 && ( !empty( v->get_avail_parts( advctrl ) ) || ( !advanced && !empty( v->get_avail_parts( ctrl ) ) ) ) ) { @@ -7324,7 +7325,7 @@ static vehicle *pickveh( const tripoint_bub_ms ¢er, bool advanced ) std::vector locations; for( int i = 0; i < static_cast( vehs.size() ); i++ ) { vehicle *veh = vehs[i]; - locations.push_back( veh->pos_bub() ); + locations.push_back( veh->pos_bub( &here ) ); pmenu.addentry( i, true, MENU_AUTOASSIGN, veh->name ); } @@ -7371,6 +7372,8 @@ std::optional iuse::remoteveh_tick( Character *p, item *it, const tripoint_ std::optional iuse::remoteveh( Character *p, item *it, const tripoint_bub_ms &pos ) { + map &here = get_map(); + vehicle *remote = g->remoteveh(); bool controlling = it->active && remote != nullptr; @@ -7419,9 +7422,9 @@ std::optional iuse::remoteveh( Character *p, item *it, const tripoint_bub_m const auto electronics_parts = veh->get_avail_parts( "CTRL_ELECTRONIC" ); // Revert to original behavior if we can't find remote controls. if( empty( rctrl_parts ) ) { - veh->interact_with( electronics_parts.begin()->pos_bub() ); + veh->interact_with( electronics_parts.begin()->pos_bub( &here ) ); } else { - veh->interact_with( rctrl_parts.begin()->pos_bub() ); + veh->interact_with( rctrl_parts.begin()->pos_bub( &here ) ); } } diff --git a/src/lightmap.cpp b/src/lightmap.cpp index 7ae38b722bdc3..ae3a16218daf4 100644 --- a/src/lightmap.cpp +++ b/src/lightmap.cpp @@ -638,7 +638,7 @@ void map::generate_lightmap( const int zlev ) } for( const vpart_reference &vpr : v->get_any_parts( VPFLAG_CARGO ) ) { - const tripoint_bub_ms pos = vpr.pos_bub(); + const tripoint_bub_ms pos = vpr.pos_bub( this ); if( !inbounds( pos ) || vpr.info().has_flag( "COVERED" ) ) { continue; } @@ -1097,8 +1097,8 @@ void map::build_seen_cache( const tripoint_bub_ms &origin, const int target_z, i if( vp.part().removed || vp.part().is_broken() || !vp.info().has_flag( VPFLAG_EXTENDS_VISION ) ) { continue; } - const tripoint_bub_ms mirror_pos = vp.pos_bub(); - if( rl_dist( origin, vp.pos_bub() ) > extension_range ) { + const tripoint_bub_ms mirror_pos = vp.pos_bub( this ); + if( rl_dist( origin, vp.pos_bub( this ) ) > extension_range ) { continue; } // We can utilize the current state of the seen cache to determine diff --git a/src/line.cpp b/src/line.cpp index 8017f0eb282ad..83503d1a815ef 100644 --- a/src/line.cpp +++ b/src/line.cpp @@ -682,6 +682,15 @@ std::string direction_suffix( const tripoint_bub_ms &p, const tripoint_bub_ms &q return string_format( "%d%s", dist, trim( direction_name_short( direction_from( p, q ) ) ) ); } +std::string direction_suffix( const tripoint_abs_ms &p, const tripoint_abs_ms &q ) +{ + int dist = square_dist( p, q ); + if( dist <= 0 ) { + return std::string(); + } + return string_format( "%d%s", dist, trim( direction_name_short( direction_from( p, q ) ) ) ); +} + // Cardinals are cardinals. Result is cardinal and adjacent sub-cardinals. // Sub-Cardinals are sub-cardinals && abs(x) == abs(y). Result is sub-cardinal and adjacent cardinals. // Sub-sub-cardinals are direction && abs(x) > abs(y) or vice versa. diff --git a/src/line.h b/src/line.h index 6b67e45984ac4..c02ce12a39cd8 100644 --- a/src/line.h +++ b/src/line.h @@ -137,6 +137,7 @@ std::string direction_arrow( direction dir ); /* Get suffix describing vector from p to q (e.g. 1NW, 2SE) or empty string if p == q */ std::string direction_suffix( const tripoint_bub_ms &p, const tripoint_bub_ms &q ); +std::string direction_suffix( const tripoint_abs_ms &p, const tripoint_abs_ms &q ); /** * The actual Bresenham algorithm in 2D and 3D, everything else should call these diff --git a/src/map.cpp b/src/map.cpp index f81ca7a04062e..b2f311842b04a 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -875,7 +875,7 @@ vehicle *map::move_vehicle( vehicle &veh, const tripoint_rel_ms &dp, const tiler veh.stop_autodriving(); const int volume = std::min( 100, std::sqrt( impulse ) ); // TODO: Center the sound at weighted (by impulse) average of collisions - sounds::sound( veh.pos_bub(), volume, sounds::sound_t::combat, _( "crash!" ), + sounds::sound( veh.pos_bub( this ), volume, sounds::sound_t::combat, _( "crash!" ), false, "smash_success", "hit_vehicle" ); } @@ -963,7 +963,7 @@ vehicle *map::move_vehicle( vehicle &veh, const tripoint_rel_ms &dp, const tiler "environment", "splash" ); } - veh.handle_trap( wheel_p, vp_wheel ); + veh.handle_trap( this, wheel_p, vp_wheel ); // dont use vp_wheel or vp_wheel_idx below this - handle_trap might've removed it from parts if( !has_flag( ter_furn_flag::TFLAG_SEALED, wheel_p ) ) { @@ -1064,8 +1064,10 @@ float map::vehicle_vehicle_collision( vehicle &veh, vehicle &veh2, int &y_cof2 = cof2.y(); rl_vec2d collision_axis_y; - collision_axis_y.x = ( veh.pos_bub().x() + x_cof1 ) - ( veh2.pos_bub().x() + x_cof2 ); - collision_axis_y.y = ( veh.pos_bub().y() + y_cof1 ) - ( veh2.pos_bub().y() + y_cof2 ); + const tripoint_bub_ms veh_pos = veh.pos_bub( this ); + const tripoint_bub_ms veh2_pos = veh2.pos_bub( this ); + collision_axis_y.x = ( veh_pos.x() + x_cof1 ) - ( veh2_pos.x() + x_cof2 ); + collision_axis_y.y = ( veh_pos.y() + y_cof1 ) - ( veh2_pos.y() + y_cof2 ); collision_axis_y = collision_axis_y.normalized(); rl_vec2d collision_axis_x = collision_axis_y.rotated( M_PI / 2 ); // imp? & delta? & final? reworked: @@ -1260,7 +1262,7 @@ std::set map::get_moving_vehicle_targets( const Creature &z, in continue; // coarse distance filter, 40 = ~24 * sqrt(2) - rough max diameter of a vehicle } for( const vpart_reference &vpr : v.v->get_all_parts() ) { - const tripoint_bub_ms vppos = vpr.pos_bub(); + const tripoint_bub_ms vppos = vpr.pos_bub( this ); if( rl_dist( zpos, vppos ) > max_range ) { continue; } @@ -1436,7 +1438,7 @@ void map::unboard_vehicle( const tripoint_bub_ms &p, bool dead_passenger ) bool map::displace_vehicle( vehicle &veh, const tripoint_rel_ms &dp, const bool adjust_pos, const std::set &parts_to_move ) { - const tripoint_bub_ms src = veh.pos_bub(); + const tripoint_bub_ms src = veh.pos_bub( this ); // handle vehicle ramps int ramp_offset = 0; if( adjust_pos ) { @@ -1576,7 +1578,7 @@ bool map::displace_vehicle( vehicle &veh, const tripoint_rel_ms &dp, const bool } } - veh.shed_loose_parts( trinary::SOME, &dst ); + veh.shed_loose_parts( trinary::SOME, this, &dst ); smzs = veh.advance_precalc_mounts( dst_offset, src, dp, ramp_offset, adjust_pos, parts_to_move ); veh.update_active_fakes(); @@ -5547,7 +5549,7 @@ void map::process_items() level_cache &cache = access_cache( gz ); std::set submaps_with_vehicles; for( vehicle *this_vehicle : cache.vehicle_list ) { - tripoint_bub_ms pos = this_vehicle->pos_bub(); + tripoint_bub_ms pos = this_vehicle->pos_bub( this ); submaps_with_vehicles.emplace( pos.x() / SEEX, pos.y() / SEEY, pos.z() ); } for( const tripoint &pos : submaps_with_vehicles ) { @@ -5645,7 +5647,7 @@ std::vector map::item_network_connections( vehicle *power_grid ) if( active_item_ref.item_ref->has_link_data() && active_item_ref.item_ref->link().t_veh && - active_item_ref.item_ref->link().t_veh->pos_bub() == power_grid->pos_bub() ) { + active_item_ref.item_ref->link().t_veh->pos_abs() == power_grid->pos_abs() ) { result.emplace_back( active_item_ref ); } } @@ -5680,7 +5682,7 @@ void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap ) { const bool engine_heater_is_on = cur_veh.has_part( "E_HEATER", true ) && cur_veh.engine_on; for( const vpart_reference &vp : cur_veh.get_any_parts( VPFLAG_FLUIDTANK ) ) { - vp.part().process_contents( *this, vp.pos_bub(), engine_heater_is_on ); + vp.part().process_contents( *this, vp.pos_bub( this ), engine_heater_is_on ); } auto cargo_parts = cur_veh.get_parts_including_carried( VPFLAG_CARGO ); @@ -5706,7 +5708,7 @@ void map::process_items_in_vehicle( vehicle &cur_veh, submap ¤t_submap ) const item &target = *active_item_ref.item_ref; // Find the cargo part and coordinates corresponding to the current active item. const vehicle_part &pt = it->part(); - const tripoint_bub_ms item_loc = it->pos_bub(); + const tripoint_bub_ms item_loc = it->pos_bub( this ); vehicle_stack items = cur_veh.get_items( pt ); float it_insulation = 1.0f; temperature_flag flag = temperature_flag::NORMAL; @@ -8589,9 +8591,9 @@ void map::actualize( const tripoint_rel_sm &grid ) // spill out items too large, MIGRATION pockets etc from vehicle parts for( const vpart_reference &vp : veh->get_all_parts() ) { const item &base_const = vp.part().get_base(); - const_cast( base_const ).overflow( vp.pos_bub() ); + const_cast( base_const ).overflow( vp.pos_bub( this ) ); } - veh->refresh( this ); + veh->refresh( ); } const time_duration time_since_last_actualize = calendar::turn - tmpsub->last_touched; @@ -10150,7 +10152,7 @@ void map::scent_blockers( std::array, MAPSIZE_Y> &bl ( !vp.has_feature( VPFLAG_OPENABLE ) || !vp.part().open ) ) { continue; } - const tripoint_bub_ms part_pos = vp.pos_bub(); + const tripoint_bub_ms part_pos = vp.pos_bub( this ); if( local_bounds.contains( part_pos.xy() ) ) { reduces_scent[part_pos.x()][part_pos.y()] = true; } diff --git a/src/map_extras.cpp b/src/map_extras.cpp index 5544b9f4867f6..ef2a474d27829 100644 --- a/src/map_extras.cpp +++ b/src/map_extras.cpp @@ -387,9 +387,9 @@ static bool mx_helicopter( map &m, const tripoint_abs_sm &abs_sub ) vehicle *wreckage = m.add_vehicle( crashed_hull, wreckage_pos, dir1, rng( 1, 33 ), 1 ); - const auto controls_at = []( vehicle * wreckage, const tripoint_bub_ms & pos ) { - return !wreckage->get_parts_at( pos, "CONTROLS", part_status_flag::any ).empty() || - !wreckage->get_parts_at( pos, "CTRL_ELECTRONIC", part_status_flag::any ).empty(); + const auto controls_at = [&m]( vehicle * wreckage, const tripoint_bub_ms & pos ) { + return !wreckage->get_parts_at( &m, pos, "CONTROLS", part_status_flag::any ).empty() || + !wreckage->get_parts_at( &m, pos, "CTRL_ELECTRONIC", part_status_flag::any ).empty(); }; if( wreckage != nullptr ) { @@ -401,7 +401,7 @@ static bool mx_helicopter( map &m, const tripoint_abs_sm &abs_sub ) case 3: // Full clown car for( const vpart_reference &vp : wreckage->get_any_parts( VPFLAG_SEATBELT ) ) { - const tripoint_bub_ms pos = vp.pos_bub(); + const tripoint_bub_ms pos = vp.pos_bub( &m ); // Spawn pilots in seats with controls.CTRL_ELECTRONIC if( controls_at( wreckage, pos ) ) { m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); @@ -415,7 +415,7 @@ static bool mx_helicopter( map &m, const tripoint_abs_sm &abs_sub ) case 5: // 2/3rds clown car for( const vpart_reference &vp : wreckage->get_any_parts( VPFLAG_SEATBELT ) ) { - const tripoint_bub_ms pos = vp.pos_bub(); + const tripoint_bub_ms pos = vp.pos_bub( &m ); // Spawn pilots in seats with controls. if( controls_at( wreckage, pos ) ) { m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); @@ -428,7 +428,7 @@ static bool mx_helicopter( map &m, const tripoint_abs_sm &abs_sub ) case 6: // Just pilots for( const vpart_reference &vp : wreckage->get_any_parts( VPFLAG_CONTROLS ) ) { - const tripoint_bub_ms pos = vp.pos_bub(); + const tripoint_bub_ms pos = vp.pos_bub( &m ); m.place_spawns( GROUP_MIL_PILOT, 1, pos.xy(), pos.xy(), pos.z(), 1, true ); delete_items_at_mount( *wreckage, vp.mount_pos() ); // delete corpse items } diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 75900ee6b039a..c2971d9708f0c 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -7016,13 +7016,12 @@ std::unique_ptr map::add_vehicle_to_map( std::unique_ptr handler_ptr; bool did_merge = false; for( const tripoint_abs_ms &map_pos : first_veh->get_points( true ) ) { - const tripoint_bub_ms map_bub_pos = get_bub( map_pos ); - std::vector parts_to_move = veh_to_add->get_parts_at( this, map_bub_pos, "", + std::vector parts_to_move = veh_to_add->get_parts_at( map_pos, "", part_status_flag::any ); if( !parts_to_move.empty() ) { // Store target_point by value because first_veh->parts may reallocate // to a different address after install_part() - std::vector first_veh_parts = first_veh->get_parts_at( this, map_bub_pos, "", + std::vector first_veh_parts = first_veh->get_parts_at( map_pos, "", part_status_flag:: any ); // This happens if this location is occupied by a fake part. if( first_veh_parts.empty() || first_veh_parts.front()->is_fake ) { @@ -7038,7 +7037,7 @@ std::unique_ptr map::add_vehicle_to_map( veh_to_add->name, veh_to_add->type.str(), veh_to_add->pos_abs().to_string(), to_degrees( veh_to_add->turn_dir ), - map_bub_pos.to_string() ); + get_bub( map_pos ).to_string() ); } did_merge = true; const point_rel_ms target_point = first_veh_parts.front()->mount; @@ -7112,7 +7111,7 @@ std::unique_ptr map::add_vehicle_to_map( veh_to_add->smash( *this ); } - veh_to_add->refresh( this ); + veh_to_add->refresh( ); return veh_to_add; } diff --git a/src/ranged.cpp b/src/ranged.cpp index 2aaa530bd961d..f182f5ec62448 100644 --- a/src/ranged.cpp +++ b/src/ranged.cpp @@ -1000,8 +1000,8 @@ int Character::fire_gun( map *here, const tripoint_bub_ms &target, int shots, it bool bipod = here->has_flag_ter_or_furn( ter_furn_flag::TFLAG_MOUNTABLE, pos_bub( here ) ) || is_prone(); if( !bipod ) { - if( const optional_vpart_position vp = here->veh_at( pos_bub( here ) ) ) { - bipod = vp->vehicle().has_part( pos_bub( here ), "MOUNTABLE" ); + if( const optional_vpart_position vp = here->veh_at( pos_abs( ) ) ) { + bipod = vp->vehicle().has_part( pos_abs( ), "MOUNTABLE" ); } } diff --git a/src/savegame_json.cpp b/src/savegame_json.cpp index 52285cc556dea..6e5c1749bd72a 100644 --- a/src/savegame_json.cpp +++ b/src/savegame_json.cpp @@ -3498,7 +3498,7 @@ void vehicle::deserialize( const JsonObject &data ) data.read( "fuel_remainder", fuel_remainder ); data.read( "fuel_used_last_turn", fuel_used_last_turn ); - refresh( &here ); + refresh( ); point p; zone_data zd; diff --git a/src/sounds.cpp b/src/sounds.cpp index 9eaf679f26b9c..787b385407e3e 100644 --- a/src/sounds.cpp +++ b/src/sounds.cpp @@ -1017,6 +1017,7 @@ void sfx::do_vehicle_engine_sfx() void sfx::do_vehicle_exterior_engine_sfx() { + map &here = get_map(); if( test_mode ) { return; } @@ -1038,7 +1039,7 @@ void sfx::do_vehicle_exterior_engine_sfx() return; } - VehicleList vehs = get_map().get_vehicles(); + VehicleList vehs = here.get_vehicles(); unsigned char noise_factor = 0; unsigned char vol = 0; vehicle *veh = nullptr; @@ -1046,10 +1047,10 @@ void sfx::do_vehicle_exterior_engine_sfx() for( wrapped_vehicle vehicle : vehs ) { if( vehicle.v->vehicle_noise > 0 && vehicle.v->vehicle_noise - - sound_distance( player_character.pos_bub(), vehicle.v->pos_bub() ) > noise_factor ) { + sound_distance( player_character.pos_bub( &here ), vehicle.v->pos_bub( &here ) ) > noise_factor ) { - noise_factor = vehicle.v->vehicle_noise - sound_distance( player_character.pos_bub(), - vehicle.v->pos_bub() ); + noise_factor = vehicle.v->vehicle_noise - sound_distance( player_character.pos_bub( &here ), + vehicle.v->pos_bub( &here ) ); veh = vehicle.v; } } @@ -1088,7 +1089,7 @@ void sfx::do_vehicle_exterior_engine_sfx() if( is_channel_playing( ch ) ) { if( engine_external_id_and_variant == id_and_variant ) { - Mix_SetPosition( ch_int, to_degrees( get_heard_angle( veh->pos_bub() ) ), 0 ); + Mix_SetPosition( ch_int, to_degrees( get_heard_angle( veh->pos_bub( &here ) ) ), 0 ); set_channel_volume( ch, vol ); add_msg_debug( debugmode::DF_SOUND, "PLAYING exterior_engine_sound, vol: ex:%d true:%d", vol, Mix_Volume( ch_int, -1 ) ); @@ -1098,7 +1099,7 @@ void sfx::do_vehicle_exterior_engine_sfx() add_msg_debug( debugmode::DF_SOUND, "STOP exterior_engine_sound, change id/var" ); play_ambient_variant_sound( id_and_variant.first, id_and_variant.second, seas_str, indoors, night, 128, ch, 0 ); - Mix_SetPosition( ch_int, to_degrees( get_heard_angle( veh->pos_bub() ) ), 0 ); + Mix_SetPosition( ch_int, to_degrees( get_heard_angle( veh->pos_bub( &here ) ) ), 0 ); set_channel_volume( ch, vol ); add_msg_debug( debugmode::DF_SOUND, "START exterior_engine_sound %s %s vol: %d", id_and_variant.first, @@ -1109,7 +1110,7 @@ void sfx::do_vehicle_exterior_engine_sfx() play_ambient_variant_sound( id_and_variant.first, id_and_variant.second, seas_str, indoors, night, 128, ch, 0 ); add_msg_debug( debugmode::DF_SOUND, "Vol: %d %d", vol, Mix_Volume( ch_int, -1 ) ); - Mix_SetPosition( ch_int, to_degrees( get_heard_angle( veh->pos_bub() ) ), 0 ); + Mix_SetPosition( ch_int, to_degrees( get_heard_angle( veh->pos_bub( &here ) ) ), 0 ); add_msg_debug( debugmode::DF_SOUND, "Vol: %d %d", vol, Mix_Volume( ch_int, -1 ) ); set_channel_volume( ch, vol ); add_msg_debug( debugmode::DF_SOUND, "START exterior_engine_sound NEW %s %s vol: ex:%d true:%d", diff --git a/src/turret.cpp b/src/turret.cpp index cd63bf7479e55..fa26f2f54b53e 100644 --- a/src/turret.cpp +++ b/src/turret.cpp @@ -48,18 +48,6 @@ std::vector vehicle::turrets() return res; } -std::vector vehicle::turrets( const tripoint_bub_ms &target ) -{ - map &here = get_map(); - std::vector res = turrets(); - // exclude turrets not ready to fire or where target is out of range - res.erase( std::remove_if( res.begin(), res.end(), [&]( vehicle_part * e ) { - return turret_query( *e ).query() != turret_data::status::ready || - rl_dist( bub_part_pos( &here, *e ), target ) > e->base.gun_range(); - } ), res.end() ); - return res; -} - turret_data vehicle::turret_query( vehicle_part &pt ) { if( !pt.is_turret() || pt.removed || pt.is_broken() ) { @@ -70,7 +58,7 @@ turret_data vehicle::turret_query( vehicle_part &pt ) turret_data vehicle::turret_query( const tripoint_bub_ms &pos ) { - auto res = get_parts_at( pos, "TURRET", part_status_flag::any ); + auto res = get_parts_at( &get_map(), pos, "TURRET", part_status_flag::any ); return !res.empty() ? turret_query( *res.front() ) : turret_data(); } @@ -489,9 +477,9 @@ void vehicle::turrets_set_targeting() menu.fselected = sel; for( vehicle_part *&p : turrets ) { - menu.addentry( -1, has_part( bub_part_pos( &here, *p ), "TURRET_CONTROLS" ), MENU_AUTOASSIGN, + menu.addentry( -1, has_part( abs_part_pos( *p ), "TURRET_CONTROLS" ), MENU_AUTOASSIGN, "%s [%s]", p->name(), p->enabled ? - _( "auto -> manual" ) : has_part( bub_part_pos( &here, *p ), "TURRET_CONTROLS" ) ? + _( "auto -> manual" ) : has_part( abs_part_pos( *p ), "TURRET_CONTROLS" ) ? _( "manual -> auto" ) : _( "manual (turret control unit required for auto mode)" ) ); } @@ -502,7 +490,7 @@ void vehicle::turrets_set_targeting() } sel = menu.ret; - if( has_part( locations[ sel ], "TURRET_CONTROLS" ) ) { + if( has_part( &here, locations[ sel ], "TURRET_CONTROLS" ) ) { turrets[sel]->enabled = !turrets[sel]->enabled; } else { turrets[sel]->enabled = false; diff --git a/src/veh_appliance.cpp b/src/veh_appliance.cpp index 819e7bfb1dd09..f1362061b6ec5 100644 --- a/src/veh_appliance.cpp +++ b/src/veh_appliance.cpp @@ -463,10 +463,10 @@ void veh_app_interact::rename() void veh_app_interact::remove() { map &here = get_map(); - const tripoint_bub_ms a_point_bub( veh->mount_to_tripoint( a_point ) ); + const tripoint_abs_ms a_point_abs( veh->mount_to_tripoint_abs( a_point ) ); vehicle_part *vp; - if( auto sel_part = here.veh_at( a_point_bub ).part_with_feature( VPFLAG_APPLIANCE, false ) ) { + if( auto sel_part = here.veh_at( a_point_abs ).part_with_feature( VPFLAG_APPLIANCE, false ) ) { vp = &sel_part->part(); } else { int const part = veh->part_at( veh->coord_translate( a_point ) ); @@ -498,7 +498,6 @@ void veh_app_interact::remove() for( const tripoint_abs_ms &p : veh->get_points( true ) ) { act.coord_set.insert( p ); } - const tripoint_abs_ms a_point_abs( here.get_abs( a_point_bub ) ); act.values.push_back( a_point_abs.x() ); act.values.push_back( a_point_abs.y() ); act.values.push_back( a_point.x() ); @@ -549,8 +548,8 @@ void veh_app_interact::populate_app_actions() { map &here = get_map(); vehicle_part *vp; - const tripoint_bub_ms a_point_bub( veh->mount_to_tripoint( a_point ) ); - if( auto sel_part = here.veh_at( a_point_bub ).part_with_feature( VPFLAG_APPLIANCE, false ) ) { + const tripoint_abs_ms a_point_abs( veh->mount_to_tripoint_abs( a_point ) ); + if( auto sel_part = here.veh_at( a_point_abs ).part_with_feature( VPFLAG_APPLIANCE, false ) ) { vp = &sel_part->part(); } else { const int part = veh->part_at( veh->coord_translate( a_point ) ); @@ -617,7 +616,7 @@ void veh_app_interact::populate_app_actions() /*************** Get part-specific actions ***************/ veh_menu menu( veh, "IF YOU SEE THIS IT IS A BUG" ); - veh->build_interact_menu( menu, veh->mount_to_tripoint( a_point ), false ); + veh->build_interact_menu( menu, veh->mount_to_tripoint( &here, a_point ), false ); const std::vector items = menu.get_items(); for( size_t i = 0; i < items.size(); i++ ) { const veh_menu_item &it = items[i]; diff --git a/src/veh_interact.cpp b/src/veh_interact.cpp index ed73215c613d4..47af97d0f7b53 100644 --- a/src/veh_interact.cpp +++ b/src/veh_interact.cpp @@ -130,6 +130,8 @@ static void act_vehicle_unload_fuel( vehicle *veh ); player_activity veh_interact::serialize_activity() { + map &here = get_map(); + const vehicle_part *pt = sel_vehicle_part; const vpart_info *vp = sel_vpart_info; @@ -137,7 +139,7 @@ player_activity veh_interact::serialize_activity() if( !parts_here.empty() ) { const vpart_reference part_here( *veh, parts_here[0] ); const vpart_reference displayed_part( *veh, veh->part_displayed_at( part_here.mount_pos() ) ); - return veh_shape( *veh ).start( displayed_part.pos_bub() ); + return veh_shape( *veh ).start( displayed_part.pos_bub( &here ) ); } return player_activity(); } @@ -196,12 +198,13 @@ player_activity veh_interact::serialize_activity() void orient_part( vehicle *veh, const vpart_info &vpinfo, int partnum, const std::optional &part_placement ) { + map &here = get_map(); avatar &player_character = get_avatar(); // Stash offset and set it to the location of the part so look_around will // start there. const tripoint_rel_ms old_view_offset = player_character.view_offset; - tripoint_bub_ms offset = veh->pos_bub(); + tripoint_bub_ms offset = veh->pos_bub( &here ); // Appliances are one tile so the part placement there is always point::zero if( part_placement ) { point_rel_ms copied_placement = *part_placement; @@ -2191,6 +2194,8 @@ bool veh_interact::can_potentially_install( const vpart_info &vpart ) */ void veh_interact::move_cursor( const point_rel_ms &d, int dstart_at ) { + map &here = get_map(); + dd += d.rotate( 3 ); if( d != point_rel_ms::zero ) { start_limit = 0; @@ -2202,9 +2207,8 @@ void veh_interact::move_cursor( const point_rel_ms &d, int dstart_at ) cpart = part_at( point_rel_ms::zero ); const point_rel_ms vd = -dd; const point_rel_ms q = veh->coord_translate( vd ); - const tripoint_bub_ms vehp = veh->pos_bub() + q; + const tripoint_bub_ms vehp = veh->pos_bub( &here ) + q; const bool has_critter = get_creature_tracker().creature_at( vehp ); - map &here = get_map(); terrain_here = here.ter( vehp ).obj(); bool obstruct = here.impassable_ter_furn( vehp ); const optional_vpart_position ovp = here.veh_at( vehp ); @@ -2354,7 +2358,7 @@ void veh_interact::display_veh() } const point pt_disp( getmaxx( w_disp ) / 2, getmaxy( w_disp ) / 2 ); - const tripoint_bub_ms pos_at_cursor = veh->pos_bub() + veh->coord_translate( -dd ); + const tripoint_bub_ms pos_at_cursor = veh->pos_bub( &here ) + veh->coord_translate( -dd ); const optional_vpart_position ovp = here.veh_at( pos_at_cursor ); col_at_cursor = hilite( col_at_cursor ); if( here.impassable_ter_furn( pos_at_cursor ) || ( ovp && &ovp->vehicle() != veh ) ) { @@ -3132,7 +3136,7 @@ void veh_interact::complete_vehicle( Character &you ) orient_part( &veh, vpinfo, partnum, q ); } - const tripoint_bub_ms vehp = veh.pos_bub() + tripoint_rel_ms( q, 0 ); + const tripoint_bub_ms vehp = veh.pos_bub( &here ) + tripoint_rel_ms( q, 0 ); // TODO: allow boarding for non-players as well. Character *const pl = get_creature_tracker().creature_at( vehp ); if( vpinfo.has_flag( VPFLAG_BOARDABLE ) && pl ) { diff --git a/src/veh_shape.cpp b/src/veh_shape.cpp index 5db9e88dfbdc4..da38cece8d40a 100644 --- a/src/veh_shape.cpp +++ b/src/veh_shape.cpp @@ -24,7 +24,7 @@ player_activity veh_shape::start( const tripoint_bub_ms &pos ) cursor_allowed.clear(); for( const vpart_reference &part : veh.get_all_parts() ) { - cursor_allowed.insert( part.pos_bub() ); + cursor_allowed.insert( part.pos_bub( &here ) ); } if( !set_cursor_pos( pos ) ) { diff --git a/src/veh_utils.cpp b/src/veh_utils.cpp index fb41434490f34..2b7c75abebd49 100644 --- a/src/veh_utils.cpp +++ b/src/veh_utils.cpp @@ -484,7 +484,7 @@ bool veh_menu::query() chosen._on_submit(); map &m = get_map(); - veh.refresh( &m ); + veh.refresh( ); m.invalidate_visibility_cache(); m.invalidate_map_cache( m.get_abs_sub().z() ); diff --git a/src/vehicle.cpp b/src/vehicle.cpp index 7952fba46e987..03a28c5810c53 100644 --- a/src/vehicle.cpp +++ b/src/vehicle.cpp @@ -216,12 +216,11 @@ units::volume vehicle_stack::max_volume() const vehicle::vehicle( const vproto_id &proto_id ) { - map &here = get_map(); face.init( 0_degrees ); move.init( 0_degrees ); if( proto_id.is_empty() ) { - refresh( &here ); // we're not using any blueprint, just return an empty initialized vehicle + refresh( ); // we're not using any blueprint, just return an empty initialized vehicle } else if( !proto_id.is_valid() ) { debugmsg( "trying to construct vehicle from invalid prototype '%s'", proto_id.str() ); } else { @@ -233,7 +232,7 @@ vehicle::vehicle( const vproto_id &proto_id ) // The game language may have changed after the blueprint was created, // so translated the prototype name again. name = proto.name.translated(); - refresh( &here ); + refresh( ); } } @@ -297,7 +296,7 @@ bool vehicle::remote_controlled( const Character &p ) const } for( const vpart_reference &vp : get_avail_parts( "REMOTE_CONTROLS" ) ) { - if( rl_dist( p.pos_bub(), vp.pos_bub() ) <= 40 ) { + if( rl_dist( p.pos_abs(), vp.pos_abs() ) <= 40 ) { return true; } } @@ -597,13 +596,11 @@ void vehicle::init_state( map &placed_on, int init_veh_fuel, int init_veh_status auto_select_fuel( parts[p] ); } - refresh( &placed_on ); + refresh( ); } void vehicle::activate_magical_follow() { - map &here = get_map(); - for( vehicle_part &vp : parts ) { if( vp.info().fuel_type == fuel_type_mana ) { vp.enabled = true; @@ -613,13 +610,10 @@ void vehicle::activate_magical_follow() vp.enabled = true; } } - refresh( &here ); } void vehicle::activate_animal_follow() { - map &here = get_map(); - for( size_t e = 0; e < parts.size(); e++ ) { vehicle_part &vp = parts[ e ]; if( vp.info().fuel_type == fuel_type_animal ) { @@ -633,7 +627,6 @@ void vehicle::activate_animal_follow() vp.enabled = true; } } - refresh( &here ); } void vehicle::autopilot_patrol() @@ -713,8 +706,8 @@ std::set vehicle::immediate_path( const units::angle &rotate ) tileray collision_vector; collision_vector.init( adjusted_angle ); map &here = get_map(); - point_bub_ms top_left_actual = pos_bub().xy() + coord_translate( front_left ); - point_bub_ms top_right_actual = pos_bub().xy() + coord_translate( front_right ); + point_bub_ms top_left_actual = pos_bub( &here ).xy() + coord_translate( front_left ); + point_bub_ms top_right_actual = pos_bub( &here ).xy() + coord_translate( front_right ); std::vector front_row = line_to( here.get_abs( tripoint_bub_ms{top_left_actual.x(), top_left_actual.y(), here.get_abs_sub().z()} ).xy(), here.get_abs( tripoint_bub_ms{ top_right_actual.x(), top_right_actual.y(), here.get_abs_sub().z()} ).xy() ); for( const point_abs_ms &elem : front_row ) { @@ -762,14 +755,14 @@ void vehicle::drive_to_local_target( const tripoint_abs_ms &target, bool follow_ stop_autodriving(); return; } - refresh( &here ); + refresh( ); tripoint_abs_ms vehpos = pos_abs(); units::angle angle = get_angle_from_targ( target ); bool stop = precollision_check( angle, here, follow_protocol ); if( stop ) { if( autopilot_on ) { - sounds::sound( pos_bub(), 30, sounds::sound_t::alert, + sounds::sound( pos_bub( &here ), 30, sounds::sound_t::alert, string_format( _( "the %s emitting a beep and saying \"Obstacle detected!\"" ), name ) ); } @@ -1492,7 +1485,6 @@ int vehicle::install_part( const point_rel_ms &dp, const vpart_id &type, item && int vehicle::install_part( const point_rel_ms &dp, vehicle_part &&vp ) { - map &here = get_map(); const vpart_info &vpi = vp.info(); const ret_val valid_mount = can_mount( dp, vpi ); if( !valid_mount.success() ) { @@ -1548,7 +1540,7 @@ int vehicle::install_part( const point_rel_ms &dp, vehicle_part &&vp ) vp_installed.enabled = enable; vp_installed.mount = dp; const int vp_installed_index = parts.size() - 1; - refresh( &here ); + refresh( ); coeff_air_changed = true; return vp_installed_index; } @@ -1583,7 +1575,7 @@ std::vector vehicle::find_vehicles_to_rack( int rack std::set test_veh_points; for( const vpart_reference &vpr : test_veh->get_all_parts() ) { if( !vpr.part().removed && !vpr.part().is_fake ) { - test_veh_points.insert( vpr.pos_bub() ); + test_veh_points.insert( vpr.pos_bub( &here ) ); } } @@ -1744,7 +1736,7 @@ bool vehicle::merge_rackable_vehicle( vehicle *carry_veh, const std::vector for( const int &carry_part : carry_veh_structs ) { // The current position on the original vehicle for this part - tripoint_bub_ms carry_pos = carry_veh->bub_part_pos( &here, carry_part ); + tripoint_abs_ms carry_pos = carry_veh->abs_part_pos( carry_part ); bool merged_part = false; for( int rack_part : rack_parts ) { @@ -1754,7 +1746,7 @@ bool vehicle::merge_rackable_vehicle( vehicle *carry_veh, const std::vector point_rel_ms carry_mount; for( const point &offset : four_cardinal_directions ) { carry_mount = parts[ rack_part ].mount + offset; - tripoint_bub_ms possible_pos = mount_to_tripoint( carry_mount ); + tripoint_abs_ms possible_pos = mount_to_tripoint_abs( carry_mount ); if( possible_pos == carry_pos ) { break; } @@ -1831,7 +1823,7 @@ bool vehicle::merge_rackable_vehicle( vehicle *carry_veh, const std::vector // update when we next interact with them zones_dirty = true; remove_fake_parts( /* cleanup = */ true ); - refresh( &here ); + refresh( ); //~ %1$s is the vehicle being loaded onto the bicycle rack add_msg( _( "You load the %1$s on the rack." ), carry_veh->name ); @@ -1869,14 +1861,14 @@ bool vehicle::merge_vehicle_parts( vehicle *veh ) continue; } } - point_bub_ms part_loc = veh->mount_to_tripoint( part.mount ).xy(); + point_abs_ms part_loc = veh->mount_to_tripoint_abs( part.mount ).xy(); remove_fake_parts(); parts.push_back( part ); vehicle_part &copied_part = parts.back(); - copied_part.mount = part_loc - pos_bub().xy(); + copied_part.mount = part_loc - pos_abs().xy(); - refresh( &here ); + refresh( ); } here.destroy_vehicle( veh ); @@ -1886,13 +1878,15 @@ bool vehicle::merge_vehicle_parts( vehicle *veh ) bool vehicle::merge_appliance_into_grid( vehicle &veh_target ) { + map &here = get_map(); + if( &veh_target == this ) { return false; } // Release grab if player is dragging either appliance if( get_avatar().get_grab_type() == object_type::VEHICLE ) { - const tripoint_bub_ms grab_point = get_avatar().pos_bub() + get_avatar().grab_point; - const optional_vpart_position grabbed_veh = get_map().veh_at( grab_point ); + const tripoint_bub_ms grab_point = get_avatar().pos_bub( &here ) + get_avatar().grab_point; + const optional_vpart_position grabbed_veh = here.veh_at( grab_point ); if( grabbed_veh && ( &grabbed_veh->vehicle() == this || &grabbed_veh->vehicle() == &veh_target ) ) { add_msg( _( "You release the %s." ), grabbed_veh->vehicle().name ); get_avatar().grab( object_type::NONE ); @@ -1903,18 +1897,20 @@ bool vehicle::merge_appliance_into_grid( vehicle &veh_target ) veh_target.turn_dir = 0_degrees; // Ensure both vehicles have the correct position and a part at 0,0. get_bounding_box will update precalcs. - shift_if_needed( get_map() ); + shift_if_needed( here ); pos -= pivot_anchor[0]; - veh_target.shift_if_needed( get_map() ); + veh_target.shift_if_needed( here ); veh_target.pos -= veh_target.pivot_anchor[0]; bounding_box vehicle_box = get_bounding_box( false, true ); bounding_box target_vehicle_box = veh_target.get_bounding_box( false, true ); - const point_bub_ms min = { std::min( pos_bub().x() + vehicle_box.p1.x(), veh_target.pos_bub().x() + target_vehicle_box.p1.x() ), - std::min( pos_bub().y() + vehicle_box.p1.y(), veh_target.pos_bub().y() + target_vehicle_box.p1.y() ) + const tripoint_bub_ms veh_pos = pos_bub( &here ); + const tripoint_bub_ms target_pos = veh_target.pos_bub( &here ); + const point_bub_ms min = { std::min( veh_pos.x() + vehicle_box.p1.x(), target_pos.x() + target_vehicle_box.p1.x() ), + std::min( veh_pos.y() + vehicle_box.p1.y(), target_pos.y() + target_vehicle_box.p1.y() ) }; - const point_bub_ms max = { std::max( pos_bub().x() + vehicle_box.p1.x(), veh_target.pos_bub().x() + target_vehicle_box.p1.x() ), - std::max( pos_bub().y() + vehicle_box.p1.y(), veh_target.pos_bub().y() + target_vehicle_box.p1.y() ) + const point_bub_ms max = { std::max( veh_pos.x() + vehicle_box.p1.x(), target_pos.x() + target_vehicle_box.p1.x() ), + std::max( veh_pos.y() + vehicle_box.p1.y(), target_pos.y() + target_vehicle_box.p1.y() ) }; point_rel_ms size; size.x() = std::abs( ( max - min ).x() ) + 1; @@ -1923,14 +1919,14 @@ bool vehicle::merge_appliance_into_grid( vehicle &veh_target ) //Make sure the resulting vehicle would not be too large if( size.x() <= MAX_WIRE_VEHICLE_SIZE && size.y() <= MAX_WIRE_VEHICLE_SIZE ) { // Find all item connections to the merging network so they can be updated after merge. - std::vector network_connections = get_map().item_network_connections( &veh_target ); - tripoint_bub_ms old_grid_reference{veh_target.pos_bub()}; + std::vector network_connections = here.item_network_connections( &veh_target ); + tripoint_bub_ms old_grid_reference{veh_target.pos_bub( &here )}; if( !merge_vehicle_parts( &veh_target ) ) { debugmsg( "failed to merge vehicle parts" ); } else { // Adjust the connections after the change of the power_grid origo. for( const item_reference &item_ref : network_connections ) { - item_ref.item_ref->link().t_mount += ( old_grid_reference - this->pos_bub() ).xy(); + item_ref.item_ref->link().t_mount += ( old_grid_reference - this->pos_bub( &here ) ).xy(); } //Keep wall wiring sections from losing their flag @@ -2134,7 +2130,7 @@ bool vehicle::remove_part( vehicle_part &vp, RemovePartHandler &handler ) handler.add_item_or_charges( dest, i, true ); } } - refresh( &handler.get_map_ref(), false ); + refresh( false ); coeff_air_changed = true; return shift_if_needed( handler.get_map_ref() ); } @@ -2173,7 +2169,7 @@ void vehicle::part_removal_cleanup() remove_fake_parts( false ); const bool changed = do_remove_part_actual(); if( changed || parts.empty() ) { - refresh( &here ); + refresh( ); if( parts.empty() ) { here.destroy_vehicle( this ); return; @@ -2186,7 +2182,7 @@ void vehicle::part_removal_cleanup() if( is_powergrid() && name == power_grid_name.translated() && part_count() == 1 ) { name = parts[0].info().name(); } - refresh( &here, false ); // Rebuild cached indices + refresh( false ); // Rebuild cached indices coeff_air_dirty = coeff_air_changed; coeff_air_changed = false; } @@ -2405,7 +2401,7 @@ void vehicle::relocate_passengers( const std::vector &passengers ) for( Character *passenger : passengers ) { for( const vpart_reference &vp : boardables ) { if( vp.part().passenger_id == passenger->getID() ) { - passenger->setpos( vp.pos_bub() ); + passenger->setpos( vp.pos_abs() ); } } } @@ -2572,7 +2568,7 @@ bool vehicle::split_vehicles( map &here, } if( split_mounts.empty() ) { - new_vehicle->refresh( &here ); + new_vehicle->refresh( ); } else { // include refresh new_vehicle->shift_parts( here, - mnt_offset ); @@ -2909,9 +2905,15 @@ tiny_bitset vehicle::has_parts( const std::vector &flags, bool enab return ret; } -bool vehicle::has_part( const tripoint_bub_ms &pos, const std::string &flag, bool enabled ) const +bool vehicle::has_part( map *here, const tripoint_bub_ms &pos, const std::string &flag, + bool enabled ) const { - const tripoint_rel_ms relative_pos = pos - pos_bub(); + return vehicle::has_part( here->get_abs( pos ), flag, enabled ); +} + +bool vehicle::has_part( const tripoint_abs_ms &pos, const std::string &flag, bool enabled ) const +{ + const tripoint_rel_ms relative_pos = pos - pos_abs(); for( const vpart_reference &vpr : get_all_parts() ) { if( vpr.part().precalc[0] != relative_pos ) { @@ -2926,34 +2928,20 @@ bool vehicle::has_part( const tripoint_bub_ms &pos, const std::string &flag, boo } // NOLINTNEXTLINE(readability-make-member-function-const) -std::vector vehicle::get_parts_at( const tripoint_bub_ms &pos, +std::vector vehicle::get_parts_at( map *here, const tripoint_bub_ms &pos, const std::string &flag, const part_status_flag condition ) { - // TODO: provide access to fake parts via argument ? - const tripoint_rel_ms relative_pos = pos - pos_bub(); - std::vector res; - for( const vpart_reference &vpr : get_all_parts() ) { - if( vpr.part().precalc[0] != relative_pos ) { - continue; - } - if( !vpr.part().removed && - ( flag.empty() || vpr.part().info().has_flag( flag ) ) && - ( !( condition & part_status_flag::enabled ) || vpr.part().enabled ) && - ( !( condition & part_status_flag::working ) || !vpr.part().is_broken() ) ) { - res.push_back( &vpr.part() ); - } - } - return res; + return vehicle::get_parts_at( here->get_abs( pos ), flag, condition ); } // NOLINTNEXTLINE(readability-make-member-function-const) -std::vector vehicle::get_parts_at( map *here, const tripoint_bub_ms &pos, +std::vector vehicle::get_parts_at( const tripoint_abs_ms &pos, const std::string &flag, const part_status_flag condition ) { // TODO: provide access to fake parts via argument ? - const tripoint_rel_ms relative_pos = pos - pos_bub( here ); + const tripoint_rel_ms relative_pos = pos - pos_abs(); std::vector res; for( const vpart_reference &vpr : get_all_parts() ) { if( vpr.part().precalc[0] != relative_pos ) { @@ -2969,26 +2957,6 @@ std::vector vehicle::get_parts_at( map *here, const tripoint_bub return res; } -std::vector vehicle::get_parts_at( const tripoint_bub_ms &pos, - const std::string &flag, - const part_status_flag condition ) const -{ - const tripoint_rel_ms relative_pos = pos - pos_bub(); - std::vector res; - for( const vpart_reference &vpr : get_all_parts() ) { - if( vpr.part().precalc[ 0 ] != relative_pos ) { - continue; - } - if( !vpr.part().removed && - ( flag.empty() || vpr.part().info().has_flag( flag ) ) && - ( !( condition & part_status_flag::enabled ) || vpr.part().enabled ) && - ( !( condition & part_status_flag::working ) || !vpr.part().is_broken() ) ) { - res.push_back( &vpr.part() ); - } - } - return res; -} - std::optional vpart_position::get_label() const { const auto it = vehicle().labels.find( label( mount_pos() ) ); @@ -3416,17 +3384,30 @@ void vehicle::coord_translate( tileray tdir, const point_rel_ms &pivot, const po q.y() = tdir.dy() + tdir.ortho_dy( p.y() - pivot.y() ); } -tripoint_bub_ms vehicle::mount_to_tripoint( const point_rel_ms &mount ) const +tripoint_bub_ms vehicle::mount_to_tripoint( map *here, const point_rel_ms &mount ) const { - return mount_to_tripoint( mount, point_rel_ms::zero ); + return mount_to_tripoint( here, mount, point_rel_ms::zero ); } -tripoint_bub_ms vehicle::mount_to_tripoint( const point_rel_ms &mount, +tripoint_abs_ms vehicle::mount_to_tripoint_abs( const point_rel_ms &mount ) const +{ + return mount_to_tripoint_abs( mount, point_rel_ms::zero ); +} + +tripoint_bub_ms vehicle::mount_to_tripoint( map *here, const point_rel_ms &mount, const point_rel_ms &offset ) const { tripoint_rel_ms mnt_translated; coord_translate( pivot_rotation[0], pivot_anchor[0], mount + offset, mnt_translated ); - return pos_bub() + mnt_translated; + return pos_bub( here ) + mnt_translated; +} + +tripoint_abs_ms vehicle::mount_to_tripoint_abs( const point_rel_ms &mount, + const point_rel_ms &offset ) const +{ + tripoint_rel_ms mnt_translated; + coord_translate( pivot_rotation[0], pivot_anchor[0], mount + offset, mnt_translated ); + return pos_abs() + mnt_translated; } void vehicle::precalc_mounts( int idir, const units::angle &dir, @@ -3469,7 +3450,7 @@ std::vector vehicle::get_riders() const std::vector res; creature_tracker &creatures = get_creature_tracker(); for( const vpart_reference &vp : get_avail_parts( VPFLAG_BOARDABLE ) ) { - Creature *rider = creatures.creature_at( vp.pos_bub() ); + Creature *rider = creatures.creature_at( vp.pos_abs() ); if( rider ) { rider_data r; r.prt = vp.part_index(); @@ -3531,7 +3512,7 @@ monster *vehicle::get_monster( int p ) const tripoint_abs_ms vehicle::pos_abs() const { - return get_map().get_abs( pos_bub() ); + return coords::project_to( sm_pos ) + rebase_rel( pos ); } tripoint_abs_omt vehicle::pos_abs_omt() const @@ -3539,15 +3520,9 @@ tripoint_abs_omt vehicle::pos_abs_omt() const return project_to( pos_abs() ); } -tripoint_bub_ms vehicle::pos_bub() const -{ - return vehicle::pos_bub( &get_map() ); -} - tripoint_bub_ms vehicle::pos_bub( map *here ) const { - return coords::project_to( rebase_bub( sm_pos - here->get_abs_sub().xy() ) ) + - rebase_rel( pos ); + return here->get_bub( pos_abs() ); } tripoint_bub_ms vehicle::bub_part_pos( map *here, const int index ) const @@ -4128,7 +4103,7 @@ bool vehicle::do_environmental_effects() const /* Only lower blood level if: * - The part is outside. * - The weather is any effect that would cause the player to be wet. */ - if( vp.part().blood > 0 && here.is_outside( vp.pos_bub() ) ) { + if( vp.part().blood > 0 && here.is_outside( vp.pos_bub( &here ) ) ) { needed = true; if( get_weather().weather_id->rains && get_weather().weather_id->precip != precip_class::very_light ) { @@ -4156,6 +4131,8 @@ void vehicle::spew_field( double joules, int part, field_type_id type, int inten */ void vehicle::noise_and_smoke( int load, time_duration time ) { + map &here = get_map(); + static const std::array, 8> sounds = { { { translate_marker( "hmm" ), 0 }, { translate_marker( "hummm!" ), 15 }, { translate_marker( "whirrr!" ), 30 }, { translate_marker( "vroom!" ), 60 }, @@ -4237,7 +4214,7 @@ void vehicle::noise_and_smoke( int load, time_duration time ) } add_msg_debug( debugmode::DF_VEHICLE, "VEH NOISE final: %d", static_cast( noise ) ); vehicle_noise = static_cast( noise ); - sounds::sound( pos_bub(), noise, sounds::sound_t::movement, + sounds::sound( pos_bub( &here ), noise, sounds::sound_t::movement, _( is_rotorcraft() ? heli_noise : sounds[lvl].first ), true ); } @@ -5443,7 +5420,7 @@ void vehicle::power_parts() for( int elem : reactors ) { parts[ elem ].enabled = false; } - if( player_is_driving_this_veh() || player_character.sees( pos_bub() ) ) { + if( player_is_driving_this_veh() || player_character.sees( pos_bub( &here ) ) ) { add_msg( _( "The %s's reactor dies!" ), name ); } } @@ -5478,13 +5455,13 @@ void vehicle::power_parts() is_alarm_on = false; camera_on = false; - if( player_is_driving_this_veh() || player_character.sees( pos_bub() ) ) { + if( player_is_driving_this_veh() || player_character.sees( pos_bub( &here ) ) ) { add_msg( _( "The %s's battery dies!" ), name ); } if( engine_epower < 0_W ) { // Not enough epower to run gas engine ignition system engine_on = false; - if( player_is_driving_this_veh() || player_character.sees( pos_bub() ) ) { + if( player_is_driving_this_veh() || player_character.sees( pos_bub( &here ) ) ) { add_msg( _( "The %s's engine dies!" ), name ); } } @@ -5538,7 +5515,7 @@ vehicle *vehicle::find_vehicle_using_parts( const tripoint_abs_ms &where ) for( const vpart_reference &vp : found_veh->get_all_parts() ) { point_sm_ms_ib vp_in_sm; tripoint_bub_sm vp_sm; - std::tie( vp_sm, vp_in_sm ) = project_remain( vp.pos_bub() ); + std::tie( vp_sm, vp_in_sm ) = project_remain( vp.pos_bub( &here ) ); if( vp_in_sm == veh_in_sm ) { return found_veh; } @@ -5816,6 +5793,8 @@ void vehicle::do_engine_damage( vehicle_part &vp, int strain ) void vehicle::idle( bool on_map ) { + map &here = get_map(); + avg_velocity = ( velocity + avg_velocity ) / 2; power_parts(); @@ -5841,16 +5820,16 @@ void vehicle::idle( bool on_map ) if( engine_on && ( has_engine_type_not( fuel_type_muscle, true ) && has_engine_type_not( fuel_type_animal, true ) && has_engine_type_not( fuel_type_wind, true ) && has_engine_type_not( fuel_type_mana, true ) ) ) { - add_msg_if_player_sees( pos_bub(), _( "The %s's engine dies!" ), name ); + add_msg_if_player_sees( pos_bub( &here ), _( "The %s's engine dies!" ), name ); } engine_on = false; } - if( !warm_enough_to_plant( player_character.pos_bub() ) ) { + if( !warm_enough_to_plant( player_character.pos_bub( &here ) ) ) { for( int i : planters ) { vehicle_part &vp = parts[ i ]; if( vp.enabled ) { - add_msg_if_player_sees( pos_bub(), _( "The %s's planter turns off due to low temperature." ), + add_msg_if_player_sees( pos_bub( &here ), _( "The %s's planter turns off due to low temperature." ), name ); vp.enabled = false; } @@ -5867,7 +5846,6 @@ void vehicle::idle( bool on_map ) update_time( calendar::turn ); } - map &here = get_map(); // Parts emitting fields const std::pair exhaust_and_muffle = get_exhaust_part(); for( const int emitter_idx : emitters ) { @@ -5906,13 +5884,13 @@ void vehicle::idle( bool on_map ) } // Notify player about status of all turrets if they're at controls - bool player_at_controls = !get_parts_at( player_character.pos_bub(), "CONTROLS", + bool player_at_controls = !get_parts_at( player_character.pos_abs(), "CONTROLS", part_status_flag::working ).empty(); for( vehicle_part *turret : turrets() ) { item_location base = turret_query( *turret ).base(); // Notify player about status of a turret if they're on the same tile - if( player_at_controls || player_character.pos_bub() == base.pos_bub() ) { + if( player_at_controls || player_character.pos_bub( &here ) == base.pos_bub() ) { base->process( here, &player_character, base.pos_bub() ); } else { base->process( here, nullptr, base.pos_bub() ); @@ -5960,7 +5938,7 @@ void vehicle::slow_leak() itype_id fuel = p.ammo_current(); int qty = std::max( ( 0.5 - health ) * ( 0.5 - health ) * p.ammo_remaining() / 10, 1.0 ); point_rel_ms q = coord_translate( p.mount ); - const tripoint_bub_ms dest = pos_bub() + tripoint_rel_ms( q, 0 ); + const tripoint_bub_ms dest = pos_bub( &here ) + tripoint_rel_ms( q, 0 ); // damaged batteries self-discharge without leaking, plutonium leaks slurry if( fuel != fuel_type_battery && fuel != fuel_type_plutonium_cell ) { @@ -6023,8 +6001,9 @@ void vehicle::disable_smart_controller_if_needed() void vehicle::make_active( item_location &loc ) { + map &here = get_map(); item &target = *loc; - auto cargo_parts = get_parts_at( loc.pos_bub(), "CARGO", part_status_flag::any ); + auto cargo_parts = get_parts_at( &here, loc.pos_bub(), "CARGO", part_status_flag::any ); if( cargo_parts.empty() ) { return; } @@ -6324,7 +6303,7 @@ bool vehicle::decrement_summon_timer() } vp.items.clear(); } - add_msg_if_player_sees( pos_bub(), m_info, _( "Your %s winks out of existence." ), name ); + add_msg_if_player_sees( pos_bub( &here ), m_info, _( "Your %s winks out of existence." ), name ); get_map().destroy_vehicle( this ); return true; } else { @@ -6348,7 +6327,6 @@ void vehicle::suspend_refresh() void vehicle::enable_refresh() { - map &here = get_map(); // force all caches to recalculate no_refresh = false; mass_dirty = true; @@ -6358,7 +6336,7 @@ void vehicle::enable_refresh() coeff_air_dirty = true; coeff_water_dirty = true; coeff_air_changed = true; - refresh( &here ); + refresh( ); } void vehicle::refresh_active_item_cache() @@ -6378,7 +6356,7 @@ void vehicle::refresh_active_item_cache() * Refreshes all caches and refinds all parts. Used after the vehicle has had a part added or removed. * Makes indices of different part types so they're easy to find. Also calculates power drain. */ -void vehicle::refresh( map *here, const bool remove_fakes ) +void vehicle::refresh( const bool remove_fakes ) { if( no_refresh ) { return; @@ -6554,7 +6532,7 @@ void vehicle::refresh( map *here, const bool remove_fakes ) } else if( !camera_on && vpi.has_flag( "CAMERA" ) ) { vp.part().enabled = false; } - if( vpi.has_flag( "TURRET" ) && !has_part( bub_part_pos( here, vp.part() ), "TURRET_CONTROLS" ) ) { + if( vpi.has_flag( "TURRET" ) && !has_part( abs_part_pos( vp.part() ), "TURRET_CONTROLS" ) ) { vp.part().enabled = false; } if( vpi.has_flag( "MUFFLER" ) ) { @@ -6924,7 +6902,7 @@ void vehicle::do_towing_move() } const tripoint_rel_ms destination_delta( here.get_bub( tower_tow_point ).xy() - nearby_destination.xy() + - tripoint_rel_ms( 0, 0, towed_veh->pos_bub().z() ) ); + tripoint_rel_ms( 0, 0, towed_veh->pos_abs().z() ) ); const tripoint_rel_ms move_destination( clamp( destination_delta.x(), -1, 1 ), clamp( destination_delta.y(), -1, 1 ), clamp( destination_delta.z(), -1, 1 ) ); @@ -7185,9 +7163,13 @@ void vehicle::remove_remote_part( const vehicle_part &vp_local ) const } } -void vehicle::shed_loose_parts( const trinary shed_cables, const tripoint_bub_ms *dst ) +void vehicle::shed_loose_parts( const trinary shed_cables, map *here, const tripoint_bub_ms *dst ) { - map &here = get_map(); + if( ( here == nullptr && dst != nullptr ) || ( ( here != nullptr && dst == nullptr ) ) ) { + debugmsg( "map and dst have to both be nullptr or both refer to a value" ); + return; + } + // remove_part rebuilds the loose_parts vector, so iterate over a copy to preserve // power transfer lines that still have some slack to them std::vector lp = loose_parts; @@ -7204,13 +7186,13 @@ void vehicle::shed_loose_parts( const trinary shed_cables, const tripoint_bub_ms // Skip cables if we're only calling shed_loose_parts to remove parts with UNMOUNT_ON_MOVE. continue; } - tripoint_abs_ms vp_loose_dst = dst ? here.get_abs( *dst + vp_loose.precalc[1] ) : abs_part_pos( + tripoint_abs_ms vp_loose_dst = dst ? here->get_abs( *dst + vp_loose.precalc[1] ) : abs_part_pos( vp_loose ); const int distance = rl_dist( vp_loose_dst, vp_loose.target.first ); const int max_dist = vp_loose.get_base().max_link_length(); if( distance > max_dist || shed_cables == trinary::ALL ) { - add_msg_if_player_sees( bub_part_pos( &here, vp_loose ), m_warning, + add_msg_if_player_sees( bub_part_pos( here, vp_loose ), m_warning, _( "The %s's %s was detached!" ), name, vp_loose.name( false ) ); remove_remote = true; } else { @@ -7218,14 +7200,14 @@ void vehicle::shed_loose_parts( const trinary shed_cables, const tripoint_bub_ms const auto remote = get_remote_part( vp_loose ); if( remote ) { remote->part().target.first = vp_loose_dst; - remote->part().target.second = here.get_abs( dst ? *dst : pos_bub() ); + remote->part().target.second = dst ? here->get_abs( *dst ) : pos_abs(); } continue; } } const item drop = part_to_item( vp_loose ); if( !magic ) { - here.add_item_or_charges( bub_part_pos( &here, vp_loose ), drop ); + here->add_item_or_charges( bub_part_pos( here, vp_loose ), drop ); } if( remove_remote ) { @@ -7279,8 +7261,9 @@ void vehicle::unlink_cables( const point_rel_ms &mount, Character &remover, bool vehicle::enclosed_at( const tripoint_bub_ms &pos ) { + map &here = get_map(); refresh_insides(); - std::vector parts_here = get_parts_at( pos, "BOARDABLE", + std::vector parts_here = get_parts_at( &here, pos, "BOARDABLE", part_status_flag::working ); if( !parts_here.empty() ) { return parts_here.front()->inside; @@ -7484,7 +7467,7 @@ void vehicle::shift_parts( map &here, const point_rel_ms &delta ) loot_zones = new_zones; pivot_anchor[0] -= delta.raw(); - refresh( &here ); + refresh( ); //Need to also update the map after this here.rebuild_vehicle_level_caches(); } @@ -7507,7 +7490,7 @@ bool vehicle::shift_if_needed( map &here ) && !vp.has_feature( "PROTRUSION" ) && !vp.part().removed ) { shift_parts( here, vp.mount_pos() ); - refresh( &here ); + refresh( ); return true; } } @@ -7515,7 +7498,7 @@ bool vehicle::shift_if_needed( map &here ) for( const vpart_reference &vp : get_all_parts() ) { if( !vp.part().removed ) { shift_parts( here, vp.mount_pos() ); - refresh( &here ); + refresh( ); return true; } } @@ -7730,7 +7713,7 @@ int vehicle::damage_direct( map &here, vehicle_part &vp, int dmg, const damage_t } // refresh cache in case the broken part has changed the status // do not remove fakes parts in case external vehicle part references get invalidated - refresh( &here, false ); + refresh( false ); } if( vp.is_fuel_store() ) { @@ -7899,7 +7882,6 @@ item vehicle::get_folded_item() const bool vehicle::restore_folded_parts( const item &it ) { - map &here = get_map(); const JsonValue jv_parts = json_loader::from_string( it.get_var( "folded_parts" ) ); deserialize_parts( static_cast( jv_parts ) ); @@ -7941,7 +7923,7 @@ bool vehicle::restore_folded_parts( const item &it ) } } - refresh( &here ); + refresh( ); face.init( 0_degrees ); turn_dir = 0_degrees; turn( 0_degrees ); @@ -8002,6 +7984,8 @@ std::set vehicle::get_projected_part_points() const std::list vehicle::use_charges( const vpart_position &vp, const itype_id &type, int &quantity, const std::function &filter, bool in_tools ) { + map &here = get_map(); + std::list ret; // HACK: water_faucet pseudo tool gives access to liquids in tanks const itype_id veh_tool_type = type.obj().phase > phase_id::SOLID @@ -8026,7 +8010,7 @@ std::list vehicle::use_charges( const vpart_position &vp, const itype_id & } if( const std::optional cargo_vp = vp.cargo() ) { - std::list tmp = cargo_vp->items().use_charges( type, quantity, vp.pos_bub(), filter, + std::list tmp = cargo_vp->items().use_charges( type, quantity, vp.pos_bub( &here ), filter, in_tools ); ret.splice( ret.end(), tmp ); if( quantity <= 0 ) { @@ -8070,10 +8054,14 @@ point_rel_ms vpart_position::mount_pos() const return vehicle().part( part_index() ).mount; } -tripoint_bub_ms vpart_position::pos_bub() const +tripoint_bub_ms vpart_position::pos_bub( map *here ) const { - map &here = get_map(); - return vehicle().bub_part_pos( &here, part_index() ); + return vehicle().bub_part_pos( here, part_index() ); +} + +tripoint_abs_ms vpart_position::pos_abs() const +{ + return vehicle().abs_part_pos( part_index() ); } bool vpart_reference::has_feature( const std::string &f ) const @@ -8559,13 +8547,15 @@ std::pair vehicle::get_exhaust_part() const tripoint_bub_ms vehicle::exhaust_dest( int part ) const { + map &here = get_map(); + point_rel_ms p = parts[part].mount; // Move back from engine/muffler until we find an open space while( relative_parts.find( p ) != relative_parts.end() ) { p.x() += ( velocity < 0 ? 1 : -1 ); } point_rel_ms q = coord_translate( p ); - return pos_bub() + tripoint_rel_ms( q, 0 ); + return pos_bub( &here ) + tripoint_rel_ms( q, 0 ); } void vehicle::add_tag( const std::string &tag ) diff --git a/src/vehicle.h b/src/vehicle.h index 7be077b321f1f..559e66b7cc81c 100644 --- a/src/vehicle.h +++ b/src/vehicle.h @@ -911,7 +911,7 @@ class vehicle void suspend_refresh(); void enable_refresh(); //Refresh all caches and re-locate all parts - void refresh( map *here, bool remove_fakes = true ); + void refresh( bool remove_fakes = true ); // Refresh active_item cache for vehicle parts void refresh_active_item_cache(); @@ -1268,7 +1268,9 @@ class vehicle * @param flag The specified flag * @param enabled if set part must also be enabled to be considered */ - bool has_part( const tripoint_bub_ms &pos, const std::string &flag, bool enabled = false ) const; + bool has_part( map *here, const tripoint_bub_ms &pos, const std::string &flag, + bool enabled = false ) const; + bool has_part( const tripoint_abs_ms &pos, const std::string &flag, bool enabled = false ) const; /** * Check if vehicle has at least one unbroken part with each of the specified flags @@ -1289,14 +1291,12 @@ class vehicle * @param flag if set only flags with this part will be considered * @param condition enum to include unabled, unavailable, and broken parts */ - // TODO: Get rid of map less overload. - std::vector get_parts_at( const tripoint_bub_ms &pos, const std::string &flag, - part_status_flag condition ); std::vector get_parts_at( map *here, const tripoint_bub_ms &pos, const std::string &flag, part_status_flag condition ); - std::vector get_parts_at( const tripoint_bub_ms &pos, - const std::string &flag, part_status_flag condition ) const; + std::vector get_parts_at( const tripoint_abs_ms &pos, + const std::string &flag, + part_status_flag condition ); /** Test if part can be enabled (unbroken, sufficient fuel etc), optionally displaying failures to user */ bool can_enable( const vehicle_part &pt, bool alert = false ) const; @@ -1368,8 +1368,12 @@ class vehicle void coord_translate( tileray tdir, const point_rel_ms &pivot, const point_rel_ms &p, tripoint_rel_ms &q ) const; - tripoint_bub_ms mount_to_tripoint( const point_rel_ms &mount ) const; - tripoint_bub_ms mount_to_tripoint( const point_rel_ms &mount, const point_rel_ms &offset ) const; + tripoint_bub_ms mount_to_tripoint( map *here, const point_rel_ms &mount ) const; + tripoint_abs_ms mount_to_tripoint_abs( const point_rel_ms &mount ) const; + tripoint_bub_ms mount_to_tripoint( map *here, const point_rel_ms &mount, + const point_rel_ms &offset ) const; + tripoint_abs_ms mount_to_tripoint_abs( const point_rel_ms &mount, + const point_rel_ms &offset ) const; // Seek a vehicle part which obstructs tile with given coordinates relative to vehicle position int part_at( const point_rel_ms &dp ) const; @@ -1438,8 +1442,6 @@ class vehicle tripoint_abs_omt pos_abs_omt() const; // Returns the coordinates (in map squares) of the vehicle relative to the local map. // Warning: Don't assume this position contains a vehicle part - // TODO: Replace usage of map less version. - tripoint_bub_ms pos_bub() const; tripoint_bub_ms pos_bub( map *here ) const; /** * Get the coordinates of the studied part of the vehicle @@ -1810,7 +1812,7 @@ class vehicle bool just_detect, bool bash_floor ); // Process the trap beneath - void handle_trap( const tripoint_bub_ms &p, vehicle_part &vp_wheel ); + void handle_trap( map *here, const tripoint_bub_ms &p, vehicle_part &vp_wheel ); void activate_magical_follow(); void activate_animal_follow(); /** @@ -1839,7 +1841,7 @@ class vehicle * @return amount of ammo in the `pseudo_magazine` or 0 */ int prepare_tool( item &tool ) const; - static bool use_vehicle_tool( vehicle &veh, const tripoint_bub_ms &vp_pos, + static bool use_vehicle_tool( vehicle &veh, map *here, const tripoint_bub_ms &vp_pos, const itype_id &tool_type, bool no_invoke = false ); /** @@ -1922,9 +1924,12 @@ class vehicle * @param - If set to trinary::NONE, the default, don't drop any cables. * @param - If set to trinary::SOME, calculate cable length, updating remote parts, and drop if it's too long. * @param - If set to trinary::ALL, drop all cables. + * @param here Future position map reference. * @param dst Future vehicle position, used for calculating cable length when shed_cables == trinary::SOME. + * here and dst have to either both be non null or both null. */ - void shed_loose_parts( trinary shed_cables = trinary::NONE, const tripoint_bub_ms *dst = nullptr ); + void shed_loose_parts( trinary shed_cables = trinary::NONE, map *here = nullptr, + const tripoint_bub_ms *dst = nullptr ); /** * Disconnect cables attached to the specified mount point. * @param mount The mount point to detach cables from. @@ -1944,9 +1949,6 @@ class vehicle /** Get all vehicle turrets (excluding any that are destroyed) */ std::vector turrets(); - /** Get all vehicle turrets loaded and ready to fire at target */ - std::vector turrets( const tripoint_bub_ms &target ); - /** Get firing data for a turret */ turret_data turret_query( vehicle_part &pt ); turret_data turret_query( const tripoint_bub_ms &pos ); diff --git a/src/vehicle_autodrive.cpp b/src/vehicle_autodrive.cpp index e2b83f43391e0..9be109b90fade 100644 --- a/src/vehicle_autodrive.cpp +++ b/src/vehicle_autodrive.cpp @@ -1151,7 +1151,9 @@ void vehicle::autodrive_controller::check_safe_speed() collision_check_result vehicle::autodrive_controller::check_collision_zone( orientation turn_dir ) { - const tripoint_bub_ms veh_pos = driven_veh.pos_bub(); + map &here = get_map(); + + const tripoint_bub_ms veh_pos = driven_veh.pos_bub( &here ); // first check if we have any visibility in front, to prevent blind driving tileray face_dir = driven_veh.face; diff --git a/src/vehicle_move.cpp b/src/vehicle_move.cpp index bfe529416149d..e4b251a57dad1 100644 --- a/src/vehicle_move.cpp +++ b/src/vehicle_move.cpp @@ -1228,14 +1228,13 @@ veh_collision vehicle::part_collision( int part, const tripoint_abs_ms &p, return ret; } -void vehicle::handle_trap( const tripoint_bub_ms &p, vehicle_part &vp_wheel ) +void vehicle::handle_trap( map *here, const tripoint_bub_ms &p, vehicle_part &vp_wheel ) { if( !vp_wheel.info().has_flag( VPFLAG_WHEEL ) ) { debugmsg( "vehicle::handle_trap called on non-WHEEL part" ); return; } - map &here = get_map(); - const trap &tr = here.tr_at( p ); + const trap &tr = here->tr_at( p ); if( tr.is_null() ) { // If the trap doesn't exist, we can't interact with it, so just return @@ -1271,25 +1270,25 @@ void vehicle::handle_trap( const tripoint_bub_ms &p, vehicle_part &vp_wheel ) // Don't damage wheels with very high durability, such as roller drums or rail wheels } else if( damage_done ) { // Hit the wheel directly since it ran right over the trap. - damage_direct( here, vp_wheel, veh_data.damage ); + damage_direct( *here, vp_wheel, veh_data.damage ); } bool still_has_trap = true; if( veh_data.remove_trap || veh_data.do_explosion ) { - here.remove_trap( p ); + here->remove_trap( p ); still_has_trap = false; } for( const auto &it : veh_data.spawn_items ) { int cnt = roll_remainder( it.second ); if( cnt > 0 ) { - here.spawn_item( p, it.first, cnt ); + here->spawn_item( p, it.first, cnt ); } } if( veh_data.set_trap ) { - here.trap_set( p, veh_data.set_trap.id() ); + here->trap_set( p, veh_data.set_trap.id() ); still_has_trap = true; } if( still_has_trap && player_is_driving_this_veh() ) { - const trap &tr = here.tr_at( p ); + const trap &tr = here->tr_at( p ); if( seen || known ) { // known status has been reset by map::trap_set() player_character.add_known_trap( p, tr ); @@ -1350,10 +1349,12 @@ void vehicle::selfdrive( const int trn, const int acceleration ) bool vehicle::check_is_heli_landed() { + map &here = get_map(); + // @TODO - when there are chasms that extend below z-level 0 - perhaps the heli // will be able to descend into them but for now, assume z-level-0 == the ground. - if( pos_bub().z() == 0 || - !get_map().has_flag_ter_or_furn( ter_furn_flag::TFLAG_NO_FLOOR, pos_bub() ) ) { + if( pos_abs().z() == 0 || + !here.has_flag_ter_or_furn( ter_furn_flag::TFLAG_NO_FLOOR, pos_bub( &here ) ) ) { is_flying = false; return true; } @@ -1681,7 +1682,7 @@ void vehicle::precalculate_vehicle_turning( units::angle new_turn_dir, bool chec coord_translate( mdir.dir(), this->pivot_point(), wheel.mount, wheel_point ); - tripoint_bub_ms wheel_tripoint = pos_bub() + wheel_point; + tripoint_bub_ms wheel_tripoint = pos_bub( &here ) + wheel_point; // maximum number of incorrect tiles for this type of turn(diagonal or not) const int allowed_incorrect_tiles_diagonal = 1; @@ -1828,8 +1829,9 @@ bool vehicle::is_wheel_state_correct_to_turn_on_rails( int wheels_on_rail, int w vehicle *vehicle::act_on_map() { - const tripoint_bub_ms pt = pos_bub(); map &here = get_map(); + + const tripoint_bub_ms pt = pos_bub( &here ); if( !here.inbounds( pt ) ) { dbg( D_INFO ) << "stopping out-of-map vehicle. (x,y,z)=(" << pt.x() << "," << pt.y() << "," << pt.z() << @@ -2039,7 +2041,7 @@ bool vehicle::level_vehicle() if( no_support.find( zlevel ) == no_support.end() || !no_support[zlevel] ) { continue; } - center_drop |= pos_bub().z() == zlevel; + center_drop |= pos_abs().z() == zlevel; adjust_level = true; // drop unsupported parts 1 zlevel for( size_t prt = 0; prt < parts.size(); prt++ ) { diff --git a/src/vehicle_use.cpp b/src/vehicle_use.cpp index ea16813ba92dc..b1331b9ba8cff 100644 --- a/src/vehicle_use.cpp +++ b/src/vehicle_use.cpp @@ -660,16 +660,16 @@ bool vehicle::start_engine( vehicle_part &vp ) } } - if( has_part( player_character.pos_bub(), "NEED_LEG" ) && + if( has_part( player_character.pos_abs(), "NEED_LEG" ) && player_character.get_working_leg_count() < 1 && - !has_part( player_character.pos_bub(), "IGNORE_LEG_REQUIREMENT" ) ) { + !has_part( player_character.pos_abs(), "IGNORE_LEG_REQUIREMENT" ) ) { add_msg( _( "You need at least one leg to control the %s." ), vp.name() ); return false; } - if( has_part( player_character.pos_bub(), "INOPERABLE_SMALL" ) && + if( has_part( player_character.pos_abs(), "INOPERABLE_SMALL" ) && ( player_character.get_size() == creature_size::small || player_character.get_size() == creature_size::tiny ) && - !has_part( player_character.pos_bub(), "IGNORE_HEIGHT_REQUIREMENT" ) ) { + !has_part( player_character.pos_abs(), "IGNORE_HEIGHT_REQUIREMENT" ) ) { add_msg( _( "You are too short to reach the pedals!" ) ); return false; } @@ -782,7 +782,7 @@ void vehicle::stop_engines() sfx::play_variant_sound( "engine_stop", variant, vp.info().engine_info->noise_factor ); } sfx::do_vehicle_engine_sfx(); - refresh( &here ); + refresh( ); } void vehicle::start_engines( Character *driver, const bool take_control, const bool autodrive ) @@ -821,7 +821,7 @@ void vehicle::start_engines( Character *driver, const bool take_control, const b if( !has_engine ) { add_msg( m_info, _( "The %s doesn't have an engine!" ), name ); - refresh( &here ); + refresh( ); return; } @@ -834,7 +834,7 @@ void vehicle::start_engines( Character *driver, const bool take_control, const b driver->activity.relative_placement = starting_engine_position - driver->pos_bub(); driver->activity.values.push_back( take_control ); } - refresh( &here ); + refresh( ); } void vehicle::enable_patrol() @@ -849,6 +849,8 @@ void vehicle::enable_patrol() void vehicle::honk_horn() const { + map &here = get_map(); + const bool no_power = !fuel_left( fuel_type_battery ); bool honked = false; @@ -863,7 +865,7 @@ void vehicle::honk_horn() const honked = true; } //Get global position of horn - const tripoint_bub_ms horn_pos = vp.pos_bub(); + const tripoint_bub_ms horn_pos = vp.pos_bub( &here ); //Determine sound if( horn_type.bonus >= 110 ) { //~ Loud horn sound @@ -925,6 +927,8 @@ void vehicle::reload_seeds( const tripoint_bub_ms &pos ) void vehicle::beeper_sound() const { + map &here = get_map(); + // No power = no sound if( fuel_left( fuel_type_battery ) == 0 ) { return; @@ -938,7 +942,7 @@ void vehicle::beeper_sound() const } //~ Beeper sound - sounds::sound( vp.pos_bub(), vp.info().bonus, sounds::sound_t::alarm, _( "beep!" ), false, + sounds::sound( vp.pos_bub( &here ), vp.info().bonus, sounds::sound_t::alarm, _( "beep!" ), false, "vehicle", "rear_beeper" ); } @@ -946,20 +950,24 @@ void vehicle::beeper_sound() const void vehicle::play_music() const { + map &here = get_map(); + Character &player_character = get_player_character(); for( const vpart_reference &vp : get_enabled_parts( "STEREO" ) ) { - iuse::play_music( &player_character, vp.pos_bub(), 15, 30 ); + iuse::play_music( &player_character, vp.pos_bub( &here ), 15, 30 ); } } void vehicle::play_chimes() const { + map &here = get_map(); + if( !one_in( 3 ) ) { return; } for( const vpart_reference &vp : get_enabled_parts( "CHIMES" ) ) { - sounds::sound( vp.pos_bub(), 40, sounds::sound_t::music, + sounds::sound( vp.pos_bub( &here ), 40, sounds::sound_t::music, _( "a simple melody blaring from the loudspeakers." ), false, "vehicle", "chimes" ); } } @@ -972,14 +980,14 @@ void vehicle::crash_terrain_around() map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "CRASH_TERRAIN_AROUND" ) ) { tripoint_bub_ms crush_target( 0, 0, -OVERMAP_LAYERS ); - const tripoint_bub_ms start_pos = vp.pos_bub(); + const tripoint_bub_ms start_pos = vp.pos_bub( &here ); const vpslot_terrain_transform &ttd = *vp.info().transform_terrain_info; for( size_t i = 0; i < eight_horizontal_neighbors.size() && crush_target.z() == -OVERMAP_LAYERS; i++ ) { tripoint_bub_ms cur_pos = start_pos + eight_horizontal_neighbors[i]; bool busy_pos = false; for( const vpart_reference &vp_tmp : get_all_parts() ) { - busy_pos |= vp_tmp.pos_bub() == cur_pos; + busy_pos |= vp_tmp.pos_bub( &here ) == cur_pos; } for( const std::string &flag : ttd.pre_flags ) { if( here.has_flag( flag, cur_pos ) && !busy_pos ) { @@ -1003,7 +1011,7 @@ void vehicle::transform_terrain() { map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "TRANSFORM_TERRAIN" ) ) { - const tripoint_bub_ms start_pos = vp.pos_bub(); + const tripoint_bub_ms start_pos = vp.pos_bub( &here ); const vpslot_terrain_transform &ttd = *vp.info().transform_terrain_info; bool prereq_fulfilled = false; for( const std::string &flag : ttd.pre_flags ) { @@ -1036,7 +1044,7 @@ void vehicle::operate_reaper() { map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "REAPER" ) ) { - const tripoint_bub_ms reaper_pos = vp.pos_bub(); + const tripoint_bub_ms reaper_pos = vp.pos_bub( &here ); const int plant_produced = rng( 1, vp.info().bonus ); const int seed_produced = rng( 1, 3 ); const units::volume max_pickup_volume = vp.info().size / 20; @@ -1081,7 +1089,7 @@ void vehicle::operate_planter() map &here = get_map(); for( const vpart_reference &vp : get_enabled_parts( "PLANTER" ) ) { const size_t planter_id = vp.part_index(); - const tripoint_bub_ms loc = vp.pos_bub(); + const tripoint_bub_ms loc = vp.pos_bub( &here ); vehicle_stack v = get_items( vp.part() ); for( auto i = v.begin(); i != v.end(); i++ ) { if( i->is_seed() ) { @@ -1174,6 +1182,8 @@ void vehicle::operate_scoop() void vehicle::alarm() { + map &here = get_map(); + if( one_in( 4 ) ) { //first check if the alarm is still installed bool found_alarm = has_security_working(); @@ -1184,7 +1194,7 @@ void vehicle::alarm() _( "WHOOP WHOOP" ), _( "NEEeu NEEeu NEEeu" ), _( "BLEEEEEEP" ), _( "WREEP" ) } }; - sounds::sound( pos_bub(), static_cast( rng( 45, 80 ) ), + sounds::sound( pos_bub( &here ), static_cast( rng( 45, 80 ) ), sounds::sound_t::alarm, random_entry_ref( sound_msgs ), false, "vehicle", "car_alarm" ); if( one_in( 1000 ) ) { is_alarm_on = false; @@ -1314,6 +1324,8 @@ void vehicle::open_all_at( int p ) */ void vehicle::open_or_close( const int part_index, const bool opening ) { + map &here = get_map(); + const auto part_open_or_close = [&]( const int parti, const bool opening ) { vehicle_part &prt = parts.at( parti ); // Open doors should never be locked. @@ -1330,11 +1342,10 @@ void vehicle::open_or_close( const int part_index, const bool opening ) //find_lines_of_parts() doesn't return the part_index we passed, so we set it on its own part_open_or_close( part_index, opening ); insides_dirty = true; - map &here = get_map(); here.set_transparency_cache_dirty( sm_pos.z() ); - const tripoint_bub_ms part_location = mount_to_tripoint( parts[part_index].mount ); - here.set_seen_cache_dirty( part_location ); - const int dist = rl_dist( get_player_character().pos_bub(), part_location ); + const tripoint_abs_ms part_location = mount_to_tripoint_abs( parts[part_index].mount ); + here.set_seen_cache_dirty( here.get_bub( part_location ) ); + const int dist = rl_dist( get_player_character().pos_abs(), part_location ); if( dist < 20 ) { sfx::play_variant_sound( opening ? "vehicle_open" : "vehicle_close", parts[ part_index ].info().id.str(), 100 - dist * 3 ); @@ -1787,7 +1798,7 @@ int vehicle::prepare_tool( item &tool ) const return ammo_count; } -bool vehicle::use_vehicle_tool( vehicle &veh, const tripoint_bub_ms &vp_pos, +bool vehicle::use_vehicle_tool( vehicle &veh, map *here, const tripoint_bub_ms &vp_pos, const itype_id &tool_type, bool no_invoke ) { @@ -1799,6 +1810,7 @@ bool vehicle::use_vehicle_tool( vehicle &veh, const tripoint_bub_ms &vp_pos, return false; } if( !no_invoke ) { + // TODO: pass map or go abs get_player_character().invoke_item( &tool, vp_pos ); } @@ -1813,13 +1825,13 @@ bool vehicle::use_vehicle_tool( vehicle &veh, const tripoint_bub_ms &vp_pos, tool_type == itype_large_repairkit ) ) { act.index = INT_MIN; // tell activity the item doesn't really exist - act.coords.push_back( get_map().get_abs( vp_pos ) ); // tell it to search for the tool on `pos` + act.coords.push_back( here->get_abs( vp_pos ) ); // tell it to search for the tool on `pos` act.str_values.push_back( tool_type.str() ); // specific tool on the rig } //Hack for heat_activity_actor. if( act.id() == ACT_HEATING ) { - act.coords.push_back( get_map().get_abs( vp_pos ) ); + act.coords.push_back( here->get_abs( vp_pos ) ); } const int used_charges = ammo_in_tool - tool.ammo_remaining(); @@ -1836,15 +1848,16 @@ bool vehicle::use_vehicle_tool( vehicle &veh, const tripoint_bub_ms &vp_pos, void vehicle::build_interact_menu( veh_menu &menu, const tripoint_bub_ms &p, bool with_pickup ) { - const optional_vpart_position ovp = get_map().veh_at( p ); + map &here = get_map(); + const optional_vpart_position ovp = here.veh_at( p ); if( !ovp ) { debugmsg( "vehicle::build_interact_menu couldn't find vehicle at %s", p.to_string() ); return; } const vpart_position vp = *ovp; - const tripoint_bub_ms vppos = vp.pos_bub(); + const tripoint_bub_ms vppos = vp.pos_bub( &here ); - std::vector vp_parts = get_parts_at( vppos, "", part_status_flag::working ); + std::vector vp_parts = get_parts_at( &here, vppos, "", part_status_flag::working ); // @returns true if pos contains available part with a flag const auto has_part_here = [vp_parts]( const std::string & flag ) { @@ -1859,8 +1872,8 @@ void vehicle::build_interact_menu( veh_menu &menu, const tripoint_bub_ms &p, boo : has_part_here( "CTRL_ELECTRONIC" ); const bool controls_here = has_part_here( "CONTROLS" ); const bool player_is_driving = get_player_character().controlling_vehicle; - const bool player_inside = get_map().veh_at( get_player_character().pos_bub() ) ? - &get_map().veh_at( get_player_character().pos_bub() )->vehicle() == this : + const bool player_inside = here.veh_at( get_player_character().pos_abs() ) ? + &here.veh_at( get_player_character().pos_abs() )->vehicle() == this : false; bool power_linked = false; bool item_linked = false; @@ -2030,7 +2043,7 @@ void vehicle::build_interact_menu( veh_menu &menu, const tripoint_bub_ms &p, boo } ); } - const turret_data turret = turret_query( vp.pos_bub() ); + const turret_data turret = turret_query( vp.pos_bub( &here ) ); if( turret.can_unload() ) { menu.add( string_format( _( "Unload %s" ), turret.name() ) ) @@ -2175,7 +2188,7 @@ void vehicle::build_interact_menu( veh_menu &menu, const tripoint_bub_ms &p, boo .enable( ammo_amount >= tool_item.typeId()->charges_to_use() ) .hotkey( hk ) .skip_locked_check( tool_ammo.is_null() || tool_ammo->ammo->type != ammo_battery ) - .on_submit( [this, vppos, tool_type] { use_vehicle_tool( *this, vppos, tool_type ); } ); + .on_submit( [this, vppos, tool_type, &here] { use_vehicle_tool( *this, &here, vppos, tool_type ); } ); } const std::optional vp_autoclave = vp.avail_part_with_feature( "AUTOCLAVE" ); @@ -2212,7 +2225,7 @@ void vehicle::build_interact_menu( veh_menu &menu, const tripoint_bub_ms &p, boo const std::optional vp_cargo = vp.cargo(); // Whether vehicle part (cargo) contains items, and whether map tile (ground) has items if( with_pickup && ( - get_map().has_items( vp.pos_bub() ) || + here.has_items( vp.pos_bub( &here ) ) || ( vp_cargo && !vp_cargo->items().empty() ) ) ) { menu.add( _( "Get items" ) ) .hotkey( "GET_ITEMS" ) diff --git a/src/vpart_position.h b/src/vpart_position.h index e6b5e4f255408..2cd94ede7195f 100644 --- a/src/vpart_position.h +++ b/src/vpart_position.h @@ -97,14 +97,8 @@ class vpart_position // Forms inventory for inventory::form_from_map void form_inventory( inventory &inv ) const; - /** - * Returns the position of this part in the coordinates system that @ref game::m uses. - * Postcondition (if the vehicle cache of the map is correct and if there are un-removed - * parts at this positions): - * `g->m.veh_at( this->pos() )` (there is a vehicle there) - * `g->m.veh_at( this->pos() )->vehicle() == this->vehicle()` (it's this one) - */ - tripoint_bub_ms pos_bub() const; + tripoint_bub_ms pos_bub( map *here ) const; + tripoint_abs_ms pos_abs() const; /** * Returns the mount point: the point in the vehicles own coordinate system. * This system is independent of movement / rotation. diff --git a/tests/mapgen_remove_vehicles_test.cpp b/tests/mapgen_remove_vehicles_test.cpp index 793a708f47db0..bb43a27ce2903 100644 --- a/tests/mapgen_remove_vehicles_test.cpp +++ b/tests/mapgen_remove_vehicles_test.cpp @@ -27,11 +27,11 @@ void check_vehicle_still_works( vehicle &veh ) veh.engine_on = true; veh.velocity = 1000; veh.cruise_velocity = veh.velocity; - tripoint_bub_ms const startp = veh.pos_bub(); + tripoint_bub_ms const startp = veh.pos_bub( &here ); here.vehmove(); - REQUIRE( veh.pos_bub() != startp ); + REQUIRE( veh.pos_bub( &here ) != startp ); - here.displace_vehicle( veh, startp - veh.pos_bub() ); + here.displace_vehicle( veh, startp - veh.pos_bub( &here ) ); } vehicle *add_test_vehicle( map &m, tripoint_bub_ms loc ) @@ -59,7 +59,7 @@ void local_test( vehicle *veh, tripoint_bub_ms const &test_loc, F const &fmg, ID vehicle *const veh2 = add_test_vehicle( here, this_test_loc ); REQUIRE( here.veh_at( this_test_loc ).has_value() ); REQUIRE( here.get_vehicles().size() == 2 ); - REQUIRE( veh->pos_bub() == veh2->pos_bub() - point::east ); + REQUIRE( veh->pos_abs() == veh2->pos_abs() - point::east ); REQUIRE( veh->sm_pos == veh2->sm_pos ); manual_mapgen( this_test_omt, fmg, id ); diff --git a/tests/npc_behavior_rules_test.cpp b/tests/npc_behavior_rules_test.cpp index a3526db110f8f..a6de07d3d132b 100644 --- a/tests/npc_behavior_rules_test.cpp +++ b/tests/npc_behavior_rules_test.cpp @@ -232,7 +232,7 @@ TEST_CASE( "NPC-rules-avoid-locks", "[npc_rules]" ) // vehicle is a 5x5 grid, car_door_pos is the only door/exit std::vector door_parts_at_target = test_vehicle->get_parts_at( - car_door_pos, "LOCKABLE_DOOR", part_status_flag::available ); + &here, car_door_pos, "LOCKABLE_DOOR", part_status_flag::available ); REQUIRE( !door_parts_at_target.empty() ); vehicle_part *door = door_parts_at_target.front(); // The door must be closed for the lock to be effective. @@ -242,7 +242,7 @@ TEST_CASE( "NPC-rules-avoid-locks", "[npc_rules]" ) // NOTE: The door lock is a separate part. We must ensure both the door exists and the door lock exists for this test. std::vector door_lock_parts_at_target = test_vehicle->get_parts_at( - car_door_pos, "DOOR_LOCKING", part_status_flag::available ); + &here, car_door_pos, "DOOR_LOCKING", part_status_flag::available ); REQUIRE( !door_lock_parts_at_target.empty() ); vehicle_part *door_lock = door_lock_parts_at_target.front(); door_lock->locked = true; diff --git a/tests/vehicle_efficiency_test.cpp b/tests/vehicle_efficiency_test.cpp index 4b3b1878d6fca..6e7a5cab710a3 100644 --- a/tests/vehicle_efficiency_test.cpp +++ b/tests/vehicle_efficiency_test.cpp @@ -188,7 +188,7 @@ static int test_efficiency( const vproto_id &veh_id, int &expected_mass, // Remove all items from cargo to normalize weight. for( const vpart_reference &vp : veh.get_all_parts() ) { veh_ptr->get_items( vp.part() ).clear(); - vp.part().ammo_consume( vp.part().ammo_remaining(), &here, vp.pos_bub() ); + vp.part().ammo_consume( vp.part().ammo_remaining(), &here, vp.pos_bub( &here ) ); } for( const vpart_reference &vp : veh.get_avail_parts( "OPENABLE" ) ) { veh.close( vp.part_index() ); @@ -208,7 +208,7 @@ static int test_efficiency( const vproto_id &veh_id, int &expected_mass, const float starting_fuel_per = fuel_percentage_left( veh, starting_fuel ); REQUIRE( std::abs( starting_fuel_per - 1.0f ) < 0.001f ); - const tripoint_bub_ms starting_point = veh.pos_bub(); + const tripoint_bub_ms starting_point = veh.pos_bub( &here ); veh.tags.insert( "IN_CONTROL_OVERRIDE" ); veh.engine_on = true; @@ -235,9 +235,9 @@ static int test_efficiency( const vproto_id &veh_id, int &expected_mass, REQUIRE( here.ter( here.get_bub( pos ) ) ); } // How much it moved - tiles_travelled += square_dist( starting_point, veh.pos_bub() ); + tiles_travelled += square_dist( starting_point, veh.pos_bub( &here ) ); // Bring it back to starting point to prevent it from leaving the map - const tripoint_rel_ms displacement = starting_point - veh.pos_bub(); + const tripoint_rel_ms displacement = starting_point - veh.pos_bub( &here ); here.displace_vehicle( veh, displacement ); if( reset_velocity_turn < 0 ) { continue; diff --git a/tests/vehicle_export_test.cpp b/tests/vehicle_export_test.cpp index d8a9f5521450b..c978980b28a2c 100644 --- a/tests/vehicle_export_test.cpp +++ b/tests/vehicle_export_test.cpp @@ -42,7 +42,7 @@ TEST_CASE( "export_vehicle_test" ) // To ensure the zones get placed. veh_ptr->set_owner( get_player_character() ); veh_ptr->place_zones( here ); - veh_ptr->refresh( &here ); + veh_ptr->refresh( ); veh_ptr->refresh_zones(); std::ostringstream os; diff --git a/tests/vehicle_fake_part_test.cpp b/tests/vehicle_fake_part_test.cpp index a451251f43889..f0b733e43ccf2 100644 --- a/tests/vehicle_fake_part_test.cpp +++ b/tests/vehicle_fake_part_test.cpp @@ -212,7 +212,7 @@ TEST_CASE( "vehicle_collision_applies_damage_to_fake_parent", "[vehicle] [vehicl // we know the mount point of the front right headlight is 2,2 // that places it's fake mirror at 2,3 const point_rel_ms fake_r_hl( 2, 3 ); - tripoint_bub_ms fake_front_right_headlight = veh->mount_to_tripoint( fake_r_hl ); + tripoint_bub_ms fake_front_right_headlight = veh->mount_to_tripoint( &here, fake_r_hl ); // we're travelling south east, so placing it SE of the fake headlight mirror // will impact it on next move tripoint_bub_ms obstacle_point = fake_front_right_headlight + tripoint::south_east; @@ -258,7 +258,7 @@ TEST_CASE( "vehicle_to_vehicle_collision", "[vehicle] [vehicle_fake]" ) const tripoint_bub_ms test_origin( 30, 30, 0 ); vehicle *veh = here.add_vehicle( vehicle_prototype_test_van, test_origin, 30_degrees, 100, 0 ); REQUIRE( veh != nullptr ); - const tripoint_bub_ms global_origin = veh->pos_bub(); + const tripoint_bub_ms global_origin = veh->pos_bub( &here ); veh->tags.insert( "IN_CONTROL_OVERRIDE" ); veh->engine_on = true; @@ -266,7 +266,7 @@ TEST_CASE( "vehicle_to_vehicle_collision", "[vehicle] [vehicle_fake]" ) veh->cruise_velocity = target_velocity; veh->velocity = veh->cruise_velocity; here.vehmove(); - const tripoint_bub_ms global_move = veh->pos_bub(); + const tripoint_bub_ms global_move = veh->pos_bub( &here ); const tripoint_bub_ms obstacle_point = test_origin + 2 * ( global_move - global_origin ); vehicle *trg = here.add_vehicle( vehicle_prototype_schoolbus, obstacle_point, 90_degrees, 100, 0 ); REQUIRE( trg != nullptr ); @@ -333,7 +333,7 @@ TEST_CASE( "vehicle_with_fake_obstacle_parts_block_movement", "[vehicle][vehicle vehicle *veh = here.add_vehicle( vehicle_prototype_obstacle_test, test_origin, 315_degrees, 100, 0 ); REQUIRE( veh != nullptr ); - veh->refresh( &here ); + veh->refresh( ); here.set_seen_cache_dirty( 0 ); here.build_map_cache( 0 ); validate_part_count( *veh, 0, 315_degrees, 11, 6, 5 ); @@ -386,7 +386,7 @@ TEST_CASE( "open_and_close_fake_doors", "[vehicle][vehicle_fake]" ) if( vp.info().has_flag( "OPENABLE" ) && vp.part().is_fake ) { fakes_tested++; REQUIRE( !vp.part().open ); - CHECK( can_interact_at( ACTION_OPEN, vp.pos_bub() ) ); + CHECK( can_interact_at( ACTION_OPEN, vp.pos_bub( &here ) ) ); int part_to_open = veh->next_part_to_open( vp.part_index() ); // This should be the same part for this use case since there are no curtains etc. REQUIRE( part_to_open == static_cast( vp.part_index() ) ); @@ -415,12 +415,12 @@ TEST_CASE( "open_and_close_fake_doors", "[vehicle][vehicle_fake]" ) CAPTURE( you.pos_bub() ); REQUIRE( veh->can_close( vp.part_index(), you ) ); REQUIRE( veh->can_close( fake_door.part_index(), you ) ); - you.setpos( vp.pos_bub() ); + you.setpos( vp.pos_abs() ); CHECK( !veh->can_close( vp.part_index(), you ) ); CHECK( !veh->can_close( fake_door.part_index(), you ) ); // Move to the location of the fake part and repeat the assetion - you.setpos( fake_door.pos_bub() ); - you.setpos( fake_door.pos_bub() ); + you.setpos( fake_door.pos_abs() ); + you.setpos( fake_door.pos_abs() ); CHECK( !veh->can_close( vp.part_index(), you ) ); CHECK( !veh->can_close( fake_door.part_index(), you ) ); you.setpos( prev_player_pos ); @@ -432,7 +432,7 @@ TEST_CASE( "open_and_close_fake_doors", "[vehicle][vehicle_fake]" ) if( vp.info().has_flag( "OPENABLE" ) && vp.part().is_fake ) { fakes_tested++; CHECK( vp.part().open ); - CHECK( can_interact_at( ACTION_CLOSE, vp.pos_bub() ) ); + CHECK( can_interact_at( ACTION_CLOSE, vp.pos_bub( &here ) ) ); int part_to_close = veh->next_part_to_close( vp.part_index() ); // This should be the same part for this use case since there are no curtains etc. REQUIRE( part_to_close == static_cast( vp.part_index() ) ); diff --git a/tests/vehicle_interact_test.cpp b/tests/vehicle_interact_test.cpp index 3d00cc59593b5..e8293b014be74 100644 --- a/tests/vehicle_interact_test.cpp +++ b/tests/vehicle_interact_test.cpp @@ -39,6 +39,7 @@ static const vproto_id vehicle_prototype_car( "car" ); static void test_repair( const std::vector &tools, bool plug_in_tools, bool expect_craftable ) { + map &here = get_map(); clear_avatar(); clear_map(); @@ -55,7 +56,7 @@ static void test_repair( const std::vector &tools, bool plug_in_tools, boo for( const item &gear : tools ) { item_location added_tool = player_character.i_add( gear ); if( plug_in_tools && added_tool->can_link_up() ) { - added_tool->link_to( get_map().veh_at( player_character.pos_bub() + tripoint::north_west ), + added_tool->link_to( here.veh_at( player_character.pos_bub() + tripoint::north_west ), link_state::automatic ); REQUIRE( added_tool->link().t_veh ); } @@ -63,13 +64,14 @@ static void test_repair( const std::vector &tools, bool plug_in_tools, boo player_character.set_skill_level( skill_mechanics, 10 ); const tripoint_bub_ms vehicle_origin = test_origin + tripoint::south_east; - vehicle *veh_ptr = get_map().add_vehicle( vehicle_prototype_car, vehicle_origin, -90_degrees, 0, - 0 ); + vehicle *veh_ptr = here.add_vehicle( vehicle_prototype_car, vehicle_origin, -90_degrees, 0, + 0 ); REQUIRE( veh_ptr != nullptr ); // Find the frame at the origin. vehicle_part *origin_frame = nullptr; - for( vehicle_part *part : veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::any ) ) { + for( vehicle_part *part : veh_ptr->get_parts_at( &here, vehicle_origin, "", + part_status_flag::any ) ) { if( part->info().location == "structure" ) { origin_frame = part; break; diff --git a/tests/vehicle_part_test.cpp b/tests/vehicle_part_test.cpp index b3916b51e38f0..ef5b77a69c944 100644 --- a/tests/vehicle_part_test.cpp +++ b/tests/vehicle_part_test.cpp @@ -205,14 +205,15 @@ TEST_CASE( "faucet_offers_cold_water", "[vehicle][vehicle_parts]" ) clear_map(); clear_vehicles(); set_time( midday ); + map &here = get_map(); const tripoint_bub_ms test_origin( 60, 60, 0 ); const int water_charges = 8; Character &character = get_player_character(); const item backpack( itype_backpack ); character.wear_item( backpack ); - get_map().add_vehicle( vehicle_prototype_test_rv, test_origin, -90_degrees, 0, 0 ); - const optional_vpart_position ovp = get_map().veh_at( test_origin ); + here.add_vehicle( vehicle_prototype_test_rv, test_origin, -90_degrees, 0, 0 ); + const optional_vpart_position ovp = here.veh_at( test_origin ); REQUIRE( ovp.has_value() ); vehicle &veh = ovp->vehicle(); @@ -235,12 +236,12 @@ TEST_CASE( "faucet_offers_cold_water", "[vehicle][vehicle_parts]" ) } } REQUIRE( faucet.has_value() ); - get_map().board_vehicle( faucet->pos_bub() + tripoint::east, &character ); + here.board_vehicle( faucet->pos_bub( &here ) + tripoint::east, &character ); veh_menu menu( veh, "TEST" ); for( int i = 0; i < water_charges; i++ ) { CAPTURE( i, veh.fuel_left( itype_water_clean ) ); menu.reset(); - veh.build_interact_menu( menu, faucet->pos_bub(), false ); + veh.build_interact_menu( menu, faucet->pos_bub( &here ), false ); const std::vector items = menu.get_items(); const bool stomach_should_be_full = i == water_charges - 1; const auto drink_item_it = std::find_if( items.begin(), items.end(), @@ -261,7 +262,7 @@ TEST_CASE( "faucet_offers_cold_water", "[vehicle][vehicle_parts]" ) } REQUIRE( veh.fuel_left( itype_water_clean ) == 0 ); REQUIRE( tank_it->empty_container() ); - get_map().destroy_vehicle( &veh ); + here.destroy_vehicle( &veh ); } TEST_CASE( "craft_available_via_vehicle_rig", "[vehicle][vehicle_craft]" ) diff --git a/tests/vehicle_power_test.cpp b/tests/vehicle_power_test.cpp index 9d96b1fa153b4..33aed834d0ab2 100644 --- a/tests/vehicle_power_test.cpp +++ b/tests/vehicle_power_test.cpp @@ -95,7 +95,7 @@ TEST_CASE( "power_loss_to_cables", "[vehicle][power]" ) REQUIRE( frame_part_idx != -1 ); const int bat_part_idx = veh->install_part( point_rel_ms::zero, vpart_small_storage_battery ); REQUIRE( bat_part_idx != -1 ); - veh->refresh( &here ); + veh->refresh( ); here.add_vehicle_to_cache( veh ); batteries.emplace_back( *veh, bat_part_idx ); } diff --git a/tests/vehicle_ramp_test.cpp b/tests/vehicle_ramp_test.cpp index 2447a5cc68665..ffe71edcdb288 100644 --- a/tests/vehicle_ramp_test.cpp +++ b/tests/vehicle_ramp_test.cpp @@ -139,7 +139,7 @@ static void ramp_transition_angled( const vproto_id &veh_id, const units::angle for( const tripoint_abs_ms &checkpt : vpts ) { int partnum = 0; vehicle *check_veh = here.veh_at_internal( here.get_bub( checkpt ), partnum ); - CAPTURE( veh_ptr->pos_bub() ); + CAPTURE( veh_ptr->pos_bub( &here ) ); CAPTURE( veh_ptr->face.dir() ); CAPTURE( checkpt ); CHECK( check_veh == veh_ptr ); @@ -158,7 +158,7 @@ static void ramp_transition_angled( const vproto_id &veh_id, const units::angle } const point_rel_ms &pmount = vp.mount_pos(); CAPTURE( pmount ); - const tripoint_bub_ms &ppos = vp.pos_bub(); + const tripoint_bub_ms &ppos = vp.pos_bub( &here ); CAPTURE( ppos ); if( cycles > ( transition_cycle - pmount.x() ) ) { CHECK( ppos.z() == target_z ); @@ -267,7 +267,7 @@ static void level_out( const vproto_id &veh_id, const bool drop_pos ) std::vector all_parts; for( const tripoint_abs_ms &pos : veh.get_points() ) { - for( vehicle_part *prt : veh.get_parts_at( here.get_bub( pos ), "", part_status_flag::any ) ) { + for( vehicle_part *prt : veh.get_parts_at( pos, "", part_status_flag::any ) ) { all_parts.push_back( prt ); if( drop_pos && prt->mount.x() < 0 ) { prt->precalc[0].z() = -1; @@ -309,7 +309,7 @@ static void level_out( const vproto_id &veh_id, const bool drop_pos ) CHECK( veh.abs_part_pos( *prt ).z() == 0 ); } CHECK( dmon.posz() == 0 ); - CHECK( veh.pos_bub().z() == 0 ); + CHECK( veh.pos_abs().z() == 0 ); } static void test_leveling( const std::string &type ) diff --git a/tests/vehicle_split_test.cpp b/tests/vehicle_split_test.cpp index fa45cd04aff56..e7b45af552126 100644 --- a/tests/vehicle_split_test.cpp +++ b/tests/vehicle_split_test.cpp @@ -35,7 +35,7 @@ TEST_CASE( "vehicle_split_section", "[vehicle]" ) here.destroy_vehicle( vehicle_origin ); veh_ptr->part_removal_cleanup(); - REQUIRE( veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::available ).empty() ); + REQUIRE( veh_ptr->get_parts_at( &here, vehicle_origin, "", part_status_flag::available ).empty() ); vehs = here.get_vehicles(); // destroying the center frame results in 4 new vehicles CHECK( vehs.size() == 4 ); @@ -75,7 +75,7 @@ TEST_CASE( "vehicle_split_section", "[vehicle]" ) REQUIRE( veh_ptr != nullptr ); here.destroy_vehicle( vehicle_origin ); veh_ptr->part_removal_cleanup(); - REQUIRE( veh_ptr->get_parts_at( vehicle_origin, "", part_status_flag::available ).empty() ); + REQUIRE( veh_ptr->get_parts_at( &here, vehicle_origin, "", part_status_flag::available ).empty() ); vehs = here.get_vehicles(); CHECK( vehs.size() == 1 ); if( vehs.size() == 1 ) { diff --git a/tests/vehicle_test.cpp b/tests/vehicle_test.cpp index f27e1018b731f..2ff2664749a19 100644 --- a/tests/vehicle_test.cpp +++ b/tests/vehicle_test.cpp @@ -72,7 +72,7 @@ TEST_CASE( "destroy_grabbed_vehicle_section", "[vehicle]" ) REQUIRE( player_character.grab_point == tripoint_rel_ms::east ); WHEN( "The vehicle section grabbed by the player is destroyed" ) { here.destroy( grab_point ); - REQUIRE( veh_ptr->get_parts_at( grab_point, "", part_status_flag::available ).empty() ); + REQUIRE( veh_ptr->get_parts_at( &here, grab_point, "", part_status_flag::available ).empty() ); THEN( "The player's grab is released" ) { CHECK( player_character.get_grab_type() == object_type::NONE ); CHECK( player_character.grab_point == tripoint_rel_ms::zero ); @@ -477,7 +477,7 @@ TEST_CASE( "power_cable_stretch_disconnect" ) WHEN( "displacing first appliance to the left" ) { for( int i = 0; - rl_dist( m.get_abs( app1.pos_bub() ), m.get_abs( app2.pos_bub() ) ) <= max_dist && + rl_dist( app1.pos_abs(), app2.pos_abs() ) <= max_dist && i < max_displacement; i++ ) { CHECK( app1.part_count() == 2 ); CHECK( app2.part_count() == 2 ); @@ -485,15 +485,15 @@ TEST_CASE( "power_cable_stretch_disconnect" ) app1.part_removal_cleanup(); app2.part_removal_cleanup(); } - CAPTURE( m.get_abs( app1.pos_bub() ) ); - CAPTURE( m.get_abs( app2.pos_bub() ) ); + CAPTURE( app1.pos_abs() ); + CAPTURE( app2.pos_abs() ); CHECK( app1.part_count() == 1 ); CHECK( app2.part_count() == 1 ); } WHEN( "displacing second appliance to the right" ) { for( int i = 0; - rl_dist( m.get_abs( app1.pos_bub() ), m.get_abs( app2.pos_bub() ) ) <= max_dist && + rl_dist( app1.pos_abs(), app2.pos_abs() ) <= max_dist && i < max_displacement; i++ ) { CHECK( app1.part_count() == 2 ); CHECK( app2.part_count() == 2 ); @@ -501,8 +501,8 @@ TEST_CASE( "power_cable_stretch_disconnect" ) app1.part_removal_cleanup(); app2.part_removal_cleanup(); } - CAPTURE( m.get_abs( app1.pos_bub() ) ); - CAPTURE( m.get_abs( app2.pos_bub() ) ); + CAPTURE( app1.pos_abs() ); + CAPTURE( app2.pos_abs() ); CHECK( app1.part_count() == 1 ); CHECK( app2.part_count() == 1 ); } @@ -520,7 +520,7 @@ TEST_CASE( "power_cable_stretch_disconnect" ) WHEN( "displacing first appliance to the left" ) { for( int i = 0; - rl_dist( m.get_abs( app1.pos_bub() ), m.get_abs( app2.pos_bub() ) ) <= max_dist && + rl_dist( app1.pos_abs(), app2.pos_abs() ) <= max_dist && i < max_displacement; i++ ) { CHECK( app1.part_count() == 2 ); CHECK( app2.part_count() == 2 ); @@ -528,15 +528,15 @@ TEST_CASE( "power_cable_stretch_disconnect" ) app1.part_removal_cleanup(); app2.part_removal_cleanup(); } - CAPTURE( m.get_abs( app1.pos_bub() ) ); - CAPTURE( m.get_abs( app2.pos_bub() ) ); + CAPTURE( app1.pos_abs() ); + CAPTURE( app2.pos_abs() ); CHECK( app1.part_count() == 1 ); CHECK( app2.part_count() == 1 ); } WHEN( "displacing second appliance to the right" ) { for( int i = 0; - rl_dist( m.get_abs( app1.pos_bub() ), m.get_abs( app2.pos_bub() ) ) <= max_dist && + rl_dist( app1.pos_abs(), app2.pos_abs() ) <= max_dist && i < max_displacement; i++ ) { CHECK( app1.part_count() == 2 ); CHECK( app2.part_count() == 2 ); @@ -544,8 +544,8 @@ TEST_CASE( "power_cable_stretch_disconnect" ) app1.part_removal_cleanup(); app2.part_removal_cleanup(); } - CAPTURE( m.get_abs( app1.pos_bub() ) ); - CAPTURE( m.get_abs( app2.pos_bub() ) ); + CAPTURE( app1.pos_abs() ); + CAPTURE( app2.pos_abs() ); CHECK( app1.part_count() == 1 ); CHECK( app2.part_count() == 1 ); } @@ -591,7 +591,7 @@ static void rack_check( const rack_preset &preset ) vehicle *veh_ptr = m.add_vehicle( preset.vehicles[i], preset.positions[i], preset.facings[i], 0, 0 ); REQUIRE( veh_ptr != nullptr ); - veh_ptr->refresh( &m ); + veh_ptr->refresh( ); vehs.push_back( veh_ptr ); veh_names.push_back( veh_ptr->name ); } @@ -606,7 +606,7 @@ static void rack_check( const rack_preset &preset ) vehicle &racking_veh = *vehs[rack_act.racking_vehicle_index]; vehicle &racked_veh = *vehs[rack_act.racked_vehicle_index]; - const std::vector rack_parts = racking_veh.get_parts_at( rack_act.rack_pos, + const std::vector rack_parts = racking_veh.get_parts_at( &m, rack_act.rack_pos, "BIKE_RACK_VEH", part_status_flag::available ); REQUIRE( rack_parts.size() == 1 ); @@ -654,7 +654,7 @@ static void rack_check( const rack_preset &preset ) const optional_vpart_position ovp_racked = m.veh_at( rack_act.rack_pos ); REQUIRE( ovp_racked.has_value() ); - const auto rack_parts = ovp_racked->vehicle().get_parts_at( rack_act.rack_pos, + const auto rack_parts = ovp_racked->vehicle().get_parts_at( &m, rack_act.rack_pos, "BIKE_RACK_VEH", part_status_flag::available ); REQUIRE( rack_parts.size() == 1 ); const int rack_idx = ovp_racked->vehicle().index_of_part( rack_parts[0] ); @@ -765,19 +765,19 @@ static int test_autopilot_moving( const vproto_id &veh_id, const vpart_id &extra veh.is_following = true; veh.is_patrolling = false; veh.engine_on = true; - veh.refresh( &here ); + veh.refresh( ); int turns_left = 10; int tiles_travelled = 0; - const tripoint_bub_ms starting_point = veh.pos_bub(); + const tripoint_bub_ms starting_point = veh.pos_bub( &here ); while( veh.engine_on && turns_left > 0 ) { turns_left--; here.vehmove(); veh.idle( true ); // How much it moved - tiles_travelled += square_dist( starting_point, veh.pos_bub() ); + tiles_travelled += square_dist( starting_point, veh.pos_bub( &here ) ); // Bring it back to starting point to prevent it from leaving the map - const tripoint_rel_ms displacement = starting_point - veh.pos_bub(); + const tripoint_rel_ms displacement = starting_point - veh.pos_bub( &here ); here.displace_vehicle( veh, displacement ); } return tiles_travelled; diff --git a/tests/vision_test.cpp b/tests/vision_test.cpp index 79b98cf6314d4..53e8142291c59 100644 --- a/tests/vision_test.cpp +++ b/tests/vision_test.cpp @@ -886,6 +886,8 @@ TEST_CASE( "vision_vehicle_camera", "[shadowcasting][vision][vehicle]" ) TEST_CASE( "vision_vehicle_camera_skew", "[shadowcasting][vision][vehicle][vehicle_fake]" ) { + map &here = get_map(); + clear_vehicles(); bool const camera_on = GENERATE( true, false ); int const fiddle = GENERATE( 0, 1, 2 ); @@ -920,8 +922,8 @@ TEST_CASE( "vision_vehicle_camera_skew", "[shadowcasting][vision][vehicle][vehic std::optional const dir = testcase_veh_dir( { 4, 0 }, t, tile ); if( dir ) { units::angle const skew = *dir + 45_degrees; - v = get_map().add_vehicle( vehicle_prototype_vehicle_camera_test, tile.p, skew, 0, - 0 ); + v = here.add_vehicle( vehicle_prototype_vehicle_camera_test, tile.p, skew, 0, + 0 ); v->camera_on = camera_on; } return true; @@ -929,16 +931,16 @@ TEST_CASE( "vision_vehicle_camera_skew", "[shadowcasting][vision][vehicle][vehic auto const fiddle_parts = [&]() { if( fiddle > 0 ) { - std::vector const horns = v->get_parts_at( v->pos_bub(), "HORN", {} ); + std::vector const horns = v->get_parts_at( v->pos_abs(), "HORN", {} ); v->remove_part( *horns.front() ); } if( fiddle > 1 ) { REQUIRE( v->install_part( point_rel_ms::zero, vpart_inboard_mirror ) != -1 ); } if( fiddle > 0 ) { - get_map().add_vehicle_to_cache( v ); - get_map().invalidate_map_cache( get_avatar().posz() ); - get_map().build_map_cache( get_avatar().posz() ); + here.add_vehicle_to_cache( v ); + here.invalidate_map_cache( get_avatar().posz() ); + here.build_map_cache( get_avatar().posz() ); } }; @@ -1041,6 +1043,8 @@ TEST_CASE( "vision_bright_source", "[vision]" ) TEST_CASE( "vision_inside_meth_lab", "[shadowcasting][vision][moncam]" ) { + map &here = get_map(); + clear_vehicles(); bool door_open = GENERATE( false, true ); @@ -1118,7 +1122,7 @@ TEST_CASE( "vision_inside_meth_lab", "[shadowcasting][vision][moncam]" ) return; } // open door at `door` location - for( const vehicle_part *vp : v->get_parts_at( *door, "OPENABLE", part_status_flag::any ) ) { + for( const vehicle_part *vp : v->get_parts_at( &here, *door, "OPENABLE", part_status_flag::any ) ) { v -> open( v->index_of_part( vp ) ); } }; @@ -1141,7 +1145,7 @@ TEST_CASE( "vision_inside_meth_lab", "[shadowcasting][vision][moncam]" ) dir = 0_degrees; } if( dir ) { - v = get_map().add_vehicle( vehicle_prototype_meth_lab, tile.p, *dir, 0, 0 ); + v = here.add_vehicle( vehicle_prototype_meth_lab, tile.p, *dir, 0, 0 ); for( const vpart_reference &vp : v->get_avail_parts( "OPENABLE" ) ) { v -> close( vp.part_index() ); }