From 767d9c26e9a9b42c8a86ae23e6b930c627df1831 Mon Sep 17 00:00:00 2001 From: Serhiy Zahoriya Date: Mon, 15 Jun 2020 15:43:42 +0300 Subject: [PATCH 1/5] Skip unnecessary weather calculations for root cellar #41324 --- src/item.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/item.cpp b/src/item.cpp index 635b56c921..9dc9048a4b 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -8510,7 +8510,7 @@ void item::process_temperature_rot( float insulation, const tripoint &pos, //Use weather if above ground, use map temp if below double env_temperature = 0; - if( pos.z >= 0 ) { + if( pos.z >= 0 && flag != TEMP_ROOT_CELLAR ) { double weather_temperature = wgen.get_weather_temperature( pos, time, seed ); env_temperature = weather_temperature + enviroment_mod + local_mod; } else { -- 2.29.2 From 2a6ac5bcc085f54a4e483c31f463f0e15d8abe18 Mon Sep 17 00:00:00 2001 From: Serhiy Zahoriya Date: Mon, 15 Jun 2020 15:59:53 +0300 Subject: [PATCH 2/5] Backported fixes for ice lab spoiling #39813 Co-authored-by: Hirmuolio --- src/item.cpp | 3 +-- src/map.cpp | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/item.cpp b/src/item.cpp index 9dc9048a4b..2dcc09858e 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -8486,8 +8486,7 @@ void item::process_temperature_rot( float insulation, const tripoint &pos, const weather_generator &wgen = g->weather.get_cur_weather_gen(); const unsigned int seed = g->get_seed(); - const tripoint &local = g->m.getlocal( pos ); - int local_mod = g->new_game ? 0 : g->m.get_temperature( local ); + int local_mod = g->new_game ? 0 : g->m.get_temperature( pos ); int enviroment_mod; // Toilets and vending machines will try to get the heat radiation and convection during mapgen and segfault. diff --git a/src/map.cpp b/src/map.cpp index 8a13124b4d..9cc45a6ea6 100755 --- a/src/map.cpp +++ b/src/map.cpp @@ -6723,9 +6723,8 @@ bool map::has_rotten_away( item &itm, const tripoint &pnt ) const template void map::remove_rotten_items( Container &items, const tripoint &pnt ) { - const tripoint abs_pnt = getabs( pnt ); for( auto it = items.begin(); it != items.end(); ) { - if( has_rotten_away( *it, abs_pnt ) ) { + if( has_rotten_away( *it, pnt ) ) { if( it->is_comestible() ) { rotten_item_spawn( *it, pnt ); } -- 2.29.2 From ef29ca7c4bc6b9c3278e2bbca1598bdd15572d66 Mon Sep 17 00:00:00 2001 From: Serhiy Zahoriya Date: Mon, 15 Jun 2020 16:15:15 +0300 Subject: [PATCH 3/5] Backported #39405: Update string extraction script and fix computer translation Co-authored-by: Qrox --- lang/extract_json_strings.py | 18 ++++++++++++++---- src/computer.cpp | 5 +++-- src/mapgen.cpp | 7 ++++--- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/lang/extract_json_strings.py b/lang/extract_json_strings.py index 92cb76fb0d..f36f705aeb 100755 --- a/lang/extract_json_strings.py +++ b/lang/extract_json_strings.py @@ -64,8 +64,10 @@ ignore_files = {os.path.normpath(i) for i in { ignorable = { "ammo_effect", "behavior", + "charge_removal_blacklist", "city_building", "colordef", + "disease_type", "emit", "enchantment", "event_transformation", @@ -93,6 +95,7 @@ ignorable = { "region_settings", "requirement", "rotatable_symbol", + "SCENARIO_BLACKLIST", "scent_type", "skill_boost", "TRAIT_BLACKLIST", @@ -247,6 +250,9 @@ def extract_martial_art(item): if "description" in item: writestr(outfile, item["description"], comment="Description for martial art '{}'".format(name)) + if "initiate" in item: + writestr(outfile, item["initiate"], format_strings=True, + comment="initiate message for martial art '{}'".format(name)) onhit_buffs = item.get("onhit_buffs", list()) static_buffs = item.get("static_buffs", list()) onmove_buffs = item.get("onmove_buffs", list()) @@ -641,10 +647,14 @@ def extract_missiondef(item): def extract_mutation(item): outfile = get_outfile("mutation") - item_name = found = item.get("name") + item_name_or_id = found = item.get("name") if found is None: - raise WrongJSONItem("JSON item don't contain 'name' field", item) - writestr(outfile, found) + if "copy-from" in item: + item_name_or_id = item["id"] + else: + raise WrongJSONItem("JSON item don't contain 'name' field", item) + else: + writestr(outfile, found) simple_fields = [ "description" ] @@ -652,7 +662,7 @@ def extract_mutation(item): found = item.get(f) # Need that check due format string argument if found is not None: - writestr(outfile, found, comment="Description for {}".format(item_name)) + writestr(outfile, found, comment="Description for {}".format(item_name_or_id)) if "attacks" in item: attacks = item.get("attacks") diff --git a/src/computer.cpp b/src/computer.cpp index f11ce32832..b98d2f98c9 100644 --- a/src/computer.cpp +++ b/src/computer.cpp @@ -377,10 +377,11 @@ struct enum_traits { computer_option computer_option::from_json( const JsonObject &jo ) { - const std::string name = jo.get_string( "name" ); + translation name; + jo.read( "name", name ); const computer_action action = jo.get_enum_value( "action" ); const int sec = jo.get_int( "security", 0 ); - return computer_option( name, action, sec ); + return computer_option( name.translated(), action, sec ); } computer_failure computer_failure::from_json( const JsonObject &jo ) diff --git a/src/mapgen.cpp b/src/mapgen.cpp index 0d0e8f5043..0da25ea2fb 100644 --- a/src/mapgen.cpp +++ b/src/mapgen.cpp @@ -1439,14 +1439,14 @@ class jmapgen_make_rubble : public jmapgen_piece class jmapgen_computer : public jmapgen_piece { public: - std::string name; + translation name; translation access_denied; int security; std::vector options; std::vector failures; bool target; jmapgen_computer( const JsonObject &jsi ) { - name = jsi.get_string( "name" ); + jsi.read( "name", name ); jsi.read( "access_denied", access_denied ); security = jsi.get_int( "security", 0 ); target = jsi.get_bool( "target", false ); @@ -1466,7 +1466,8 @@ class jmapgen_computer : public jmapgen_piece const int ry = y.get(); dat.m.ter_set( point( rx, ry ), t_console ); dat.m.furn_set( point( rx, ry ), f_null ); - computer *cpu = dat.m.add_computer( tripoint( rx, ry, dat.m.get_abs_sub().z ), name, security ); + computer *cpu = dat.m.add_computer( tripoint( rx, ry, dat.m.get_abs_sub().z ), name.translated(), + security ); for( const auto &opt : options ) { cpu->add_option( opt ); } -- 2.29.2 From 3dd040eed275303c8588bb0809e738e9d327cf0a Mon Sep 17 00:00:00 2001 From: Serhiy Zahoriya Date: Mon, 15 Jun 2020 16:20:42 +0300 Subject: [PATCH 4/5] Backported #40025: Fix a crash when npc tries to heal horse-mounted player Co-authored-by: Qrox --- src/game.cpp | 18 ++++++++++++------ src/npcmove.cpp | 24 +++++++++++++----------- 2 files changed, 25 insertions(+), 17 deletions(-) diff --git a/src/game.cpp b/src/game.cpp index 71772ae859..0b218184fe 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -4538,16 +4538,22 @@ template const Creature *game::critter_at( const tripoint &, bool ) co template shared_ptr_fast game::shared_from( const T &critter ) { - if( const shared_ptr_fast mon_ptr = critter_tracker->find( critter.pos() ) ) { - return std::dynamic_pointer_cast( mon_ptr ); - } if( static_cast( &critter ) == static_cast( &u ) ) { // u is not stored in a shared_ptr, but it won't go out of scope anyway return std::dynamic_pointer_cast( u_shared_ptr ); } - for( auto &cur_npc : active_npc ) { - if( static_cast( cur_npc.get() ) == static_cast( &critter ) ) { - return std::dynamic_pointer_cast( cur_npc ); + if( critter.is_monster() ) { + if( const shared_ptr_fast mon_ptr = critter_tracker->find( critter.pos() ) ) { + if( static_cast( mon_ptr.get() ) == static_cast( &critter ) ) { + return std::dynamic_pointer_cast( mon_ptr ); + } + } + } + if( critter.is_npc() ) { + for( auto &cur_npc : active_npc ) { + if( static_cast( cur_npc.get() ) == static_cast( &critter ) ) { + return std::dynamic_pointer_cast( cur_npc ); + } } } return nullptr; diff --git a/src/npcmove.cpp b/src/npcmove.cpp index 822fc10a72..0a486dbe18 100644 --- a/src/npcmove.cpp +++ b/src/npcmove.cpp @@ -916,7 +916,6 @@ void npc::execute_action( npc_action action ) int oldmoves = moves; tripoint tar = pos(); Creature *cur = current_target(); - player *patient = dynamic_cast( current_ally() ); if( action == npc_flee ) { tar = good_escape_direction( false ); } else if( cur != nullptr ) { @@ -1082,18 +1081,21 @@ void npc::execute_action( npc_action action ) } break; - case npc_heal_player: - update_path( patient->pos() ); - if( path.size() == 1 ) { // We're adjacent to u, and thus can heal u - heal_player( *patient ); - } else if( !path.empty() ) { - say( _( "Hold still %s, I'm coming to help you." ), patient->disp_name() ); - move_to_next(); - } else { - move_pause(); + case npc_heal_player: { + player *patient = dynamic_cast( current_ally() ); + if( patient ) { + update_path( patient->pos() ); + if( path.size() == 1 ) { // We're adjacent to u, and thus can heal u + heal_player( *patient ); + } else if( !path.empty() ) { + say( _( "Hold still %s, I'm coming to help you." ), patient->disp_name() ); + move_to_next(); + } else { + move_pause(); + } } break; - + } case npc_follow_player: update_path( g->u.pos() ); if( static_cast( path.size() ) <= follow_distance() && -- 2.29.2 From 61c109645a63f1bafbcaeded9da50b564e983077 Mon Sep 17 00:00:00 2001 From: Serhiy Zahoriya Date: Tue, 16 Jun 2020 10:45:42 +0300 Subject: [PATCH 5/5] Backported #41346: fix root cellars on map load Co-authored-by: Hirmuolio --- src/map.cpp | 18 ++++++++++++------ src/map.h | 2 +- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/src/map.cpp b/src/map.cpp index 9cc45a6ea6..e789bbcff5 100755 --- a/src/map.cpp +++ b/src/map.cpp @@ -6687,13 +6687,13 @@ void map::loadn( const tripoint &grid, const bool update_vehicles ) abs_sub.z = old_abs_z; } -bool map::has_rotten_away( item &itm, const tripoint &pnt ) const +bool map::has_rotten_away( item &itm, const tripoint &pnt, const temperature_flag flag ) const { if( itm.is_corpse() && itm.goes_bad() ) { - itm.process_temperature_rot( 1, pnt, nullptr ); + itm.process_temperature_rot( 1, pnt, nullptr, flag ); return itm.get_rot() > 10_days && !itm.can_revive(); } else if( itm.goes_bad() ) { - itm.process_temperature_rot( 1, pnt, nullptr ); + itm.process_temperature_rot( 1, pnt, nullptr, flag ); return itm.has_rotten_away(); } else if( itm.type->container && itm.type->container->preserves ) { // Containers like tin cans preserves all items inside, they do not rot at all. @@ -6702,14 +6702,14 @@ bool map::has_rotten_away( item &itm, const tripoint &pnt ) const // Items inside rot but do not vanish as the container seals them in. for( auto &c : itm.contents ) { if( c.goes_bad() ) { - c.process_temperature_rot( 1, pnt, nullptr ); + c.process_temperature_rot( 1, pnt, nullptr, flag ); } } return false; } else { // Check and remove rotten contents, but always keep the container. for( auto it = itm.contents.begin(); it != itm.contents.end(); ) { - if( has_rotten_away( *it, pnt ) ) { + if( has_rotten_away( *it, pnt, flag ) ) { it = itm.contents.erase( it ); } else { ++it; @@ -6723,8 +6723,14 @@ bool map::has_rotten_away( item &itm, const tripoint &pnt ) const template void map::remove_rotten_items( Container &items, const tripoint &pnt ) { + temperature_flag flag; + if( ter( pnt ) == t_rootcellar ) { + flag = TEMP_ROOT_CELLAR; + } else { + flag = TEMP_NORMAL; + } for( auto it = items.begin(); it != items.end(); ) { - if( has_rotten_away( *it, pnt ) ) { + if( has_rotten_away( *it, pnt, flag ) ) { if( it->is_comestible() ) { rotten_item_spawn( *it, pnt ); } diff --git a/src/map.h b/src/map.h index 7cdb3dcb50..48ab479d88 100644 --- a/src/map.h +++ b/src/map.h @@ -1488,7 +1488,7 @@ class map * used for rot calculation. * @return true if the item has rotten away and should be removed, false otherwise. */ - bool has_rotten_away( item &itm, const tripoint &pnt ) const; + bool has_rotten_away( item &itm, const tripoint &pnt, temperature_flag flag = TEMP_NORMAL ) const; /** * Go through the list of items, update their rotten status and remove items * that have rotten away completely. -- 2.29.2