Skip to content

Commit 8c76186

Browse files
authored
Merge pull request #79457 from PatrikLundell/vehicle
Start to make vehicle coordinates make sense
2 parents d83e9c6 + e64cd5b commit 8c76186

17 files changed

+152
-122
lines changed

src/activity_item_handling.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -589,8 +589,8 @@ static bool vehicle_activity( Character &you, const tripoint_bub_ms &src_loc, in
589589
// so , NPCs can remove the last part on a position, then there is no vehicle there anymore,
590590
// for someone else who stored that position at the start of their activity.
591591
// so we may need to go looking a bit further afield to find it , at activities end.
592-
for( const tripoint_bub_ms &pt : veh->get_points( true ) ) {
593-
you.activity.coord_set.insert( here.get_abs( pt ) );
592+
for( const tripoint_abs_ms &pt : veh->get_points( true ) ) {
593+
you.activity.coord_set.insert( pt );
594594
}
595595
// values[0]
596596
you.activity.values.push_back( here.get_abs( src_loc ).x() );

src/avatar.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -688,11 +688,11 @@ void avatar::grab( object_type grab_type_new, const tripoint_rel_ms &grab_point_
688688
map &m = get_map();
689689
if( gtype == object_type::VEHICLE ) {
690690
if( const optional_vpart_position ovp = m.veh_at( pos_bub() + gpoint ) ) {
691-
for( const tripoint_bub_ms &target : ovp->vehicle().get_points() ) {
691+
for( const tripoint_abs_ms &target : ovp->vehicle().get_points() ) {
692692
if( erase ) {
693-
memorize_clear_decoration( m.get_abs( target ), /* prefix = */ "vp_" );
693+
memorize_clear_decoration( target, /* prefix = */ "vp_" );
694694
}
695-
m.memory_cache_dec_set_dirty( target, true );
695+
m.memory_cache_dec_set_dirty( m.get_bub( target ), true );
696696
}
697697
}
698698
} else if( gtype != object_type::NONE ) {

src/cata_tiles.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3936,7 +3936,7 @@ bool cata_tiles::draw_vpart( const tripoint_bub_ms &p, lit_level ll, int &height
39363936
avatar &you = get_avatar();
39373937
if( !veh.forward_velocity() && !veh.player_in_control( you )
39383938
&& !( you.get_grab_type() == object_type::VEHICLE
3939-
&& veh.get_points().count( ( you.pos_bub() + you.grab_point ) ) )
3939+
&& veh.get_points().count( ( you.pos_abs() + you.grab_point ) ) )
39403940
&& here.memory_cache_dec_is_dirty( p ) ) {
39413941
you.memorize_decoration( here.get_abs( p ), vd.get_tileset_id(), subtile, rotation );
39423942
}

src/creature.cpp

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,16 @@ void Creature::setpos( map *here, const tripoint_bub_ms &p, bool check_gravity/*
228228
}
229229
}
230230

231+
void Creature::setpos( const tripoint_abs_ms &p, bool check_gravity/* = true*/ )
232+
{
233+
const tripoint_abs_ms old_loc = pos_abs();
234+
set_pos_abs_only( p );
235+
on_move( old_loc );
236+
if( check_gravity ) {
237+
gravity_check();
238+
}
239+
}
240+
231241
bool Creature::will_be_cramped_in_vehicle_tile( const tripoint_abs_ms &loc ) const
232242
{
233243
map &here = get_map();
@@ -668,10 +678,10 @@ bool Creature::sees( const tripoint_bub_ms &t, bool is_avatar, int range_mod ) c
668678

669679
// Helper function to check if potential area of effect of a weapon overlaps vehicle
670680
// Maybe TODO: If this is too slow, precalculate a bounding box and clip the tested area to it
671-
static bool overlaps_vehicle( const std::set<tripoint_bub_ms> &veh_area, const tripoint_bub_ms &pos,
681+
static bool overlaps_vehicle( const std::set<tripoint_abs_ms> &veh_area, const tripoint_abs_ms &pos,
672682
const int area )
673683
{
674-
for( const tripoint_bub_ms &tmp : tripoint_range<tripoint_bub_ms>( pos - tripoint( area, area, 0 ),
684+
for( const tripoint_abs_ms &tmp : tripoint_range<tripoint_abs_ms>( pos - tripoint( area, area, 0 ),
675685
pos + tripoint( area - 1, area - 1, 0 ) ) ) {
676686
if( veh_area.count( tmp ) > 0 ) {
677687
return true;
@@ -813,7 +823,7 @@ Creature *Creature::auto_find_hostile_target( int range, int &boo_hoo, int area
813823
continue; // Handle this late so that boo_hoo++ can happen
814824
}
815825
// Expensive check for proximity to vehicle
816-
if( self_area_iff && overlaps_vehicle( in_veh->get_points(), m->pos_bub(), area ) ) {
826+
if( self_area_iff && overlaps_vehicle( in_veh->get_points(), m->pos_abs(), area ) ) {
817827
continue;
818828
}
819829

src/creature.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,7 @@ class Creature : public viewer
319319
virtual void gravity_check( map *here );
320320
void setpos( const tripoint_bub_ms &p, bool check_gravity = true );
321321
void setpos( map *here, const tripoint_bub_ms &p, bool check_gravity = true );
322+
void setpos( const tripoint_abs_ms &p, bool check_gravity = true );
322323

323324
/** Checks if the creature fits confortably into a given tile. */
324325
bool will_be_cramped_in_vehicle_tile( const tripoint_abs_ms &loc ) const;

src/game.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5912,9 +5912,9 @@ void game::control_vehicle()
59125912
if( veh ) {
59135913
// If we reached here, we gained control of a vehicle.
59145914
// Clear the map memory for the area covered by the vehicle to eliminate ghost vehicles.
5915-
for( const tripoint_bub_ms &target : veh->get_points() ) {
5916-
u.memorize_clear_decoration( m.get_abs( target ), "vp_" );
5917-
m.memory_cache_dec_set_dirty( target, true );
5915+
for( const tripoint_abs_ms &target : veh->get_points() ) {
5916+
u.memorize_clear_decoration( target, "vp_" );
5917+
m.memory_cache_dec_set_dirty( m.get_bub( target ), true );
59185918
}
59195919
veh->is_following = false;
59205920
veh->is_patrolling = false;

src/handle_action.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,6 @@ static void grab()
760760
//solid vehicles can't be grabbed while boarded
761761
const optional_vpart_position vp_boarded = here.veh_at( you.pos_bub() );
762762
if( vp_boarded ) {
763-
const std::set<tripoint_bub_ms> grabbed_veh_points = vp->vehicle().get_points();
764763
if( &vp_boarded->vehicle() == &vp->vehicle() &&
765764
!empty( vp->vehicle().get_avail_parts( VPFLAG_OBSTACLE ) ) ) {
766765
add_msg( m_info, _( "You can't move the %s while you're boarding it." ), veh_name );

src/map.cpp

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -375,12 +375,12 @@ void map::memory_cache_ter_set_dirty( const tripoint_bub_ms &p, bool value ) con
375375
void map::memory_clear_vehicle_points( const vehicle &veh ) const
376376
{
377377
avatar &player_character = get_avatar();
378-
for( const tripoint_bub_ms &p : veh.get_points() ) {
378+
for( const tripoint_abs_ms &p : veh.get_points() ) {
379379
if( !inbounds( p ) ) {
380380
continue;
381381
}
382-
memory_cache_dec_set_dirty( p, true );
383-
player_character.memorize_clear_decoration( get_abs( p ), "vp_" );
382+
memory_cache_dec_set_dirty( get_bub( p ), true );
383+
player_character.memorize_clear_decoration( p, "vp_" );
384384
}
385385
}
386386

@@ -602,11 +602,11 @@ std::unique_ptr<vehicle> map::detach_vehicle( vehicle *veh )
602602
level_cache &ch = get_cache( z );
603603
for( size_t i = 0; i < current_submap->vehicles.size(); i++ ) {
604604
if( current_submap->vehicles[i].get() == veh ) {
605-
for( const tripoint_bub_ms &pt : veh->get_points() ) {
605+
for( const tripoint_abs_ms &pt : veh->get_points() ) {
606606
if( inbounds( pt ) ) {
607-
memory_cache_dec_set_dirty( pt, true );
607+
memory_cache_dec_set_dirty( get_bub( pt ), true );
608608
}
609-
get_avatar().memorize_clear_decoration( get_abs( pt ), "vp_" );
609+
get_avatar().memorize_clear_decoration( pt, "vp_" );
610610
}
611611
ch.vehicle_list.erase( veh );
612612
ch.zone_vehicles.erase( veh );
@@ -744,11 +744,12 @@ bool map::vehproceed( VehicleList &vehicle_list )
744744
return true;
745745
}
746746

747+
// TODO: Make reality bubble independent.
747748
static bool sees_veh( const Creature &c, vehicle &veh, bool force_recalc )
748749
{
749-
const auto &veh_points = veh.get_points( force_recalc );
750-
return std::any_of( veh_points.begin(), veh_points.end(), [&c]( const tripoint_bub_ms & pt ) {
751-
return c.sees( pt );
750+
const std::set<tripoint_abs_ms> &veh_points = veh.get_points( force_recalc );
751+
return std::any_of( veh_points.begin(), veh_points.end(), [&c]( const tripoint_abs_ms & pt ) {
752+
return c.sees( get_map().get_bub( pt ) );
752753
} );
753754
}
754755

@@ -886,10 +887,11 @@ vehicle *map::move_vehicle( vehicle &veh, const tripoint_rel_ms &dp, const tiler
886887
if( !vertical && !veh.valid_wheel_config() && !( veh.is_watercraft() && veh.can_float() ) &&
887888
!veh.is_flying_in_air() && dp.z() == 0 ) {
888889
veh.velocity -= std::clamp( veh.velocity, -2000, 2000 ); // extra drag
889-
for( const tripoint_bub_ms &p : veh.get_points() ) {
890-
const ter_id &pter = ter( p );
890+
for( const tripoint_abs_ms &p : veh.get_points() ) {
891+
const tripoint_bub_ms pos = get_bub( p );
892+
const ter_id &pter = ter( pos );
891893
if( pter == ter_t_dirt || pter == ter_t_grass ) {
892-
ter_set( p, ter_t_dirtmound );
894+
ter_set( pos, ter_t_dirtmound );
893895
}
894896
}
895897
}
@@ -7136,7 +7138,7 @@ bool map::draw_maptile( const catacurses::window &w, const tripoint_bub_ms &p,
71367138

71377139
if( !veh->forward_velocity() && !veh->player_in_control( player_character )
71387140
&& !( player_character.get_grab_type() == object_type::VEHICLE
7139-
&& veh->get_points().count( ( player_character.pos_bub() +
7141+
&& veh->get_points().count( ( player_character.pos_abs() +
71407142
player_character.grab_point ) ) ) ) {
71417143
memory_sym = sym;
71427144
}

src/mapgen.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7002,13 +7002,14 @@ std::unique_ptr<vehicle> map::add_vehicle_to_map(
70027002
*/
70037003
std::unique_ptr<RemovePartHandler> handler_ptr;
70047004
bool did_merge = false;
7005-
for( const tripoint_bub_ms &map_pos : first_veh->get_points( true ) ) {
7006-
std::vector<vehicle_part *> parts_to_move = veh_to_add->get_parts_at( map_pos, "",
7005+
for( const tripoint_abs_ms &map_pos : first_veh->get_points( true ) ) {
7006+
const tripoint_bub_ms map_bub_pos = get_bub( map_pos ); // TODO: Make usages use this map.
7007+
std::vector<vehicle_part *> parts_to_move = veh_to_add->get_parts_at( map_bub_pos, "",
70077008
part_status_flag::any );
70087009
if( !parts_to_move.empty() ) {
70097010
// Store target_point by value because first_veh->parts may reallocate
70107011
// to a different address after install_part()
7011-
std::vector<vehicle_part *> first_veh_parts = first_veh->get_parts_at( map_pos, "",
7012+
std::vector<vehicle_part *> first_veh_parts = first_veh->get_parts_at( map_bub_pos, "",
70127013
part_status_flag:: any );
70137014
// This happens if this location is occupied by a fake part.
70147015
if( first_veh_parts.empty() || first_veh_parts.front()->is_fake ) {
@@ -7024,7 +7025,7 @@ std::unique_ptr<vehicle> map::add_vehicle_to_map(
70247025
veh_to_add->name, veh_to_add->type.str(),
70257026
veh_to_add->pos_abs().to_string(),
70267027
to_degrees( veh_to_add->turn_dir ),
7027-
map_pos.to_string() );
7028+
map_bub_pos.to_string() );
70287029
}
70297030
did_merge = true;
70307031
const point_rel_ms target_point = first_veh_parts.front()->mount;

src/veh_appliance.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -406,12 +406,11 @@ void veh_app_interact::refill()
406406
act.targets.push_back( target );
407407
act.str_values.push_back( pt->info().id.str() );
408408
const point_rel_ms q = veh->coord_translate( pt->mount );
409-
map &here = get_map();
410-
for( const tripoint_bub_ms &p : veh->get_points( true ) ) {
411-
act.coord_set.insert( here.get_abs( p ) );
409+
for( const tripoint_abs_ms &p : veh->get_points( true ) ) {
410+
act.coord_set.insert( p );
412411
}
413-
act.values.push_back( here.get_abs( veh->pos_bub() ).x() + q.x() );
414-
act.values.push_back( here.get_abs( veh->pos_bub() ).y() + q.y() );
412+
act.values.push_back( veh->pos_abs().x() + q.x() );
413+
act.values.push_back( veh->pos_abs().y() + q.y() );
415414
act.values.push_back( a_point.x() );
416415
act.values.push_back( a_point.y() );
417416
act.values.push_back( -a_point.x() );
@@ -496,8 +495,8 @@ void veh_app_interact::remove()
496495
} else if( query_yn( _( "Are you sure you want to take down the %s?" ), veh->name ) ) {
497496
act = player_activity( ACT_VEHICLE, to_moves<int>( time ), static_cast<int>( 'O' ) );
498497
act.str_values.push_back( vpinfo.id.str() );
499-
for( const tripoint_bub_ms &p : veh->get_points( true ) ) {
500-
act.coord_set.insert( here.get_abs( p ) );
498+
for( const tripoint_abs_ms &p : veh->get_points( true ) ) {
499+
act.coord_set.insert( p );
501500
}
502501
const tripoint_abs_ms a_point_abs( here.get_abs( a_point_bub ) );
503502
act.values.push_back( a_point_abs.x() );

src/veh_interact.cpp

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -176,12 +176,11 @@ player_activity veh_interact::serialize_activity()
176176
// otherwise (e.g. installing a new frame), just use part 0
177177
const point_rel_ms q = veh->coord_translate( pt ? pt->mount : veh->part( 0 ).mount );
178178
const vehicle_part *vpt = pt ? pt : &veh->part( 0 );
179-
map &here = get_map();
180-
for( const tripoint_bub_ms &p : veh->get_points( true ) ) {
181-
res.coord_set.insert( here.get_abs( p ) );
179+
for( const tripoint_abs_ms &p : veh->get_points( true ) ) {
180+
res.coord_set.insert( p );
182181
}
183-
res.values.push_back( here.get_abs( veh->pos_bub() ).x() + q.x() ); // values[0]
184-
res.values.push_back( here.get_abs( veh->pos_bub() ).y() + q.y() ); // values[1]
182+
res.values.push_back( veh->pos_abs().x() + q.x() ); // values[0]
183+
res.values.push_back( veh->pos_abs().y() + q.y() ); // values[1]
185184
res.values.push_back( dd.x() ); // values[2]
186185
res.values.push_back( dd.y() ); // values[3]
187186
res.values.push_back( -dd.x() ); // values[4]

src/vehicle.cpp

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3522,6 +3522,16 @@ tripoint_bub_ms vehicle::bub_part_pos( const vehicle_part &pt ) const
35223522
return pos_bub() + pt.precalc[ 0 ];
35233523
}
35243524

3525+
tripoint_abs_ms vehicle::abs_part_pos( const int index ) const
3526+
{
3527+
return abs_part_pos( parts[index] );
3528+
}
3529+
3530+
tripoint_abs_ms vehicle::abs_part_pos( const vehicle_part &pt ) const
3531+
{
3532+
return pos_abs() + pt.precalc[0];
3533+
}
3534+
35253535
void vehicle::set_submap_moved( const tripoint_bub_sm &p )
35263536
{
35273537
const point_abs_ms old_msp = pos_abs().xy();
@@ -6613,7 +6623,7 @@ void vehicle::refresh( const bool remove_fakes )
66136623
zones_dirty = true;
66146624
coeff_air_dirty = true;
66156625
invalidate_mass();
6616-
occupied_cache_pos = { -1, -1, -1 };
6626+
occupied_cache_pos = tripoint_abs_ms::invalid;
66176627
refresh_active_item_cache();
66186628
}
66196629

@@ -7877,19 +7887,19 @@ bool vehicle::restore_folded_parts( const item &it )
78777887
return true;
78787888
}
78797889

7880-
const std::set<tripoint_bub_ms> &vehicle::get_points( const bool force_refresh,
7890+
const std::set<tripoint_abs_ms> &vehicle::get_points( const bool force_refresh,
78817891
const bool no_fake ) const
78827892
{
7883-
if( force_refresh || occupied_cache_pos != pos_bub() ||
7893+
if( force_refresh || occupied_cache_pos != pos_abs() ||
78847894
occupied_cache_direction != face.dir() ) {
7885-
occupied_cache_pos = pos_bub();
7895+
occupied_cache_pos = pos_abs();
78867896
occupied_cache_direction = face.dir();
78877897
occupied_points.clear();
78887898
for( const std::pair<const point_rel_ms, std::vector<int>> &part_location : relative_parts ) {
78897899
if( no_fake && part( part_location.second.front() ).is_fake ) {
78907900
continue;
78917901
}
7892-
occupied_points.insert( bub_part_pos( part_location.second.front() ) );
7902+
occupied_points.insert( abs_part_pos( part_location.second.front() ) );
78937903
}
78947904
}
78957905

@@ -7910,13 +7920,13 @@ void vehicle::part_project_points( const tripoint_rel_ms &dp )
79107920
}
79117921
// Coordinates of where part will go due to movement (dx/dy/dz)
79127922
// and turning (precalc[1])
7913-
vp.next_pos = pos_bub() + dp + vp.precalc[1];
7923+
vp.next_pos = pos_abs() + dp + vp.precalc[1];
79147924
}
79157925
}
79167926

7917-
std::set<tripoint_bub_ms> vehicle::get_projected_part_points() const
7927+
std::set<tripoint_abs_ms> vehicle::get_projected_part_points() const
79187928
{
7919-
std::set<tripoint_bub_ms> projected_points;
7929+
std::set<tripoint_abs_ms> projected_points;
79207930

79217931
for( int p = 0; p < part_count(); p++ ) {
79227932
const vehicle_part &vp = parts.at( p );
@@ -8242,18 +8252,21 @@ bounding_box vehicle::get_bounding_box( bool use_precalc, bool no_fake )
82428252

82438253
precalc_mounts( 0, turn_dir, point_rel_ms::zero );
82448254

8245-
for( const tripoint_bub_ms &p : get_points( true, no_fake ) ) {
8255+
for( const tripoint_abs_ms &p : get_points( true, no_fake ) ) {
82468256
point_rel_ms pt;
82478257
if( use_precalc ) {
82488258
const int i_use = 0;
82498259
// TODO: Check if this is correct. part_at takes a vehicle relative position, not a bub one...
8250-
int part_idx = part_at( rebase_rel( p.xy() ) );
8260+
// int part_idx = part_at((p - pos_abs()).xy()); // Suggested correction.
8261+
int part_idx = part_at( rebase_rel( get_map().get_bub( p ).xy() ) );
82518262
if( part_idx < 0 ) {
82528263
continue;
82538264
}
82548265
pt = parts[part_idx].precalc[i_use].xy();
82558266
} else {
8256-
pt = rebase_rel( p.xy() );
8267+
// TODO: Check if this is correct. part_at takes a vehicle relative position, not a bub one...
8268+
// pt = (p - pos_abs()).xy(); // Suggested correction.
8269+
pt = rebase_rel( get_map().get_bub( p ).xy() );
82578270
}
82588271
if( pt.x() < min_x ) {
82598272
min_x = pt.x();
@@ -8391,7 +8404,7 @@ std::set<int> vehicle::advance_precalc_mounts( const point_sm_ms &new_pos,
83918404
}
83928405
pos = new_pos;
83938406
}
8394-
occupied_cache_pos = { -1, -1, -1 };
8407+
occupied_cache_pos = tripoint_abs_ms::invalid;
83958408
return smzs;
83968409
}
83978410

0 commit comments

Comments
 (0)