Skip to content

Commit

Permalink
Prevent segfault when deconstructing improvised shelter
Browse files Browse the repository at this point in the history
Previous segfault happened when trying to display the list of items that
deconstruction would yield, but this terrain has no `deconstruct` json.

This commit also adds a check with `debugmsg` for future such cases
during the game startup validation.

Previous crash being fixed:
```
Thread 1 "cataclysm-tiles" received signal SIGSEGV, Segmentation fault.
0x0000555555cb9602 in operator() (drop_group=..., __closure=<optimized out>) at src/construction.cpp:2049
2049                            item_group::spawn_data_from_group( drop_group )->every_item_min_max();
(gdb) bt
 #0  0x0000555555cb9602 in operator() (drop_group=..., __closure=<optimized out>) at src/construction.cpp:2049
 #1  0x0000555555cb9af2 in construct::do_turn_deconstruct (p=..., who=...) at src/construction.cpp:2086
 #2  0x0000555555a32fad in activity_handlers::build_do_turn (act=0x5555583e4338, you=0x5555583e3c70) at src/activity_handlers.cpp:3424
 #3  0x0000555555a6b7de in std::function<void(player_activity*, Character*)>::operator() (this=<optimized out>, __args#0=<optimized out>, __args#0@entry=0x5555583e4338, __args#1=<optimized out>, __args#1@entry=0x5555583e3c70) at /usr/include/c++/14/bits/std_function.h:591
 #4  0x0000555555a69647 in activity_type::call_do_turn (this=<optimized out>, act=act@entry=0x5555583e4338, you=you@entry=0x5555583e3c70) at src/activity_type.cpp:160
 #5  0x00005555566d3a1c in player_activity::do_turn (this=0x5555583e4338, you=...) at src/player_activity.cpp:320
 #6  0x0000555555dcef82 in do_turn () at src/do_turn.cpp:592
 #7  0x00005555557a1217 in main (argc=<optimized out>, argv=<optimized out>) at src/main.cpp:873
```
  • Loading branch information
inogenous committed Aug 15, 2024
1 parent 238454f commit 9e20c24
Show file tree
Hide file tree
Showing 4 changed files with 16 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"light_emitted": 120,
"looks_like": "t_carpet_green",
"connect_groups": "INDOORFLOOR",
"flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG", "EASY_DECONSTRUCT" ],
"flags": [ "TRANSPARENT", "FLAMMABLE_HARD", "SUPPORTS_ROOF", "COLLAPSES", "INDOORS", "FLAT", "RUG" ],
"bash": {
"str_min": 4,
"str_max": 12,
Expand Down
6 changes: 6 additions & 0 deletions data/json/furniture_and_terrain/terrain-manufactured.json
Original file line number Diff line number Diff line change
Expand Up @@ -1376,6 +1376,7 @@
"sound_fail": "whump!",
"items": [ { "item": "rock_large", "count": [ 0, 20 ] }, { "item": "sharp_rock", "count": [ 0, 16 ] } ]
},
"deconstruct": { "ter_set": "t_dirt", "items": [ { "item": "rock_large", "count": 22 } ] },
"flags": [ "TRANSPARENT", "THIN_OBSTACLE", "SHORT", "ROUGH", "UNSTABLE", "PERMEABLE", "EASY_DECONSTRUCT" ]
},
{
Expand Down Expand Up @@ -1494,6 +1495,7 @@
"HIDE_PLACE",
"EASY_DECONSTRUCT"
],
"deconstruct": { "ter_set": "t_pit_shallow", "items": [ { "item": "stick", "count": 12 }, { "item": "pine_bough", "count": 24 } ] },
"bash": {
"str_min": 4,
"str_max": 60,
Expand Down Expand Up @@ -1526,6 +1528,10 @@
"HIDE_PLACE",
"EASY_DECONSTRUCT"
],
"deconstruct": {
"ter_set": "t_pit_shallow",
"items": [ { "item": "stick", "count": 12 }, { "item": "pine_bough", "count": 24 }, { "item": "withered", "count": 80 } ]
},
"bash": {
"str_min": 4,
"str_max": 60,
Expand Down
6 changes: 5 additions & 1 deletion src/construction.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2045,8 +2045,12 @@ void construct::do_turn_deconstruct( const tripoint_bub_ms &p, Character &who )

auto deconstruct_items = []( const item_group_id & drop_group ) {
std::string ret;
const Item_spawn_data *spawn_data = item_group::spawn_data_from_group( drop_group );
if( spawn_data == nullptr ) {
return ret;
}
const std::map<const itype *, std::pair<int, int>> deconstruct_items =
item_group::spawn_data_from_group( drop_group )->every_item_min_max();
spawn_data->every_item_min_max();
for( const auto &deconstruct_item : deconstruct_items ) {
const int &min = deconstruct_item.second.first;
const int &max = deconstruct_item.second.second;
Expand Down
4 changes: 4 additions & 0 deletions src/mapdata.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1039,6 +1039,10 @@ void ter_t::check() const
debugmsg( "ter %s has invalid emission %s set", id.c_str(), e.str().c_str() );
}
}
if( has_flag( ter_furn_flag::TFLAG_EASY_DECONSTRUCT ) && !deconstruct.can_do ) {
debugmsg( "ter %s has EASY_DECONSTRUCT flag but cannot be deconstructed",
id.c_str(), deconstruct.drop_group.c_str() );
}
}

furn_t::furn_t() : open( furn_str_id::NULL_ID() ), close( furn_str_id::NULL_ID() ) {}
Expand Down

0 comments on commit 9e20c24

Please sign in to comment.