summaryrefslogtreecommitdiff
path: root/0.E.3.patch
diff options
context:
space:
mode:
Diffstat (limited to '0.E.3.patch')
-rw-r--r--0.E.3.patch367
1 files changed, 367 insertions, 0 deletions
diff --git a/0.E.3.patch b/0.E.3.patch
new file mode 100644
index 0000000..32ad0f0
--- /dev/null
+++ b/0.E.3.patch
@@ -0,0 +1,367 @@
+From 767d9c26e9a9b42c8a86ae23e6b930c627df1831 Mon Sep 17 00:00:00 2001
+From: Serhiy Zahoriya <serhiy.int@gmail.com>
+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 <serhiy.int@gmail.com>
+Date: Mon, 15 Jun 2020 15:59:53 +0300
+Subject: [PATCH 2/5] Backported fixes for ice lab spoiling #39813
+
+Co-authored-by: Hirmuolio <hirmuolio@gmail.com>
+---
+ 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 <typename Container>
+ 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 <serhiy.int@gmail.com>
+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 <qrox@sina.com>
+---
+ 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_failure_type> {
+
+ 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<computer_action>( "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<computer_option> options;
+ std::vector<computer_failure> 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 <serhiy.int@gmail.com>
+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 <qrox@sina.com>
+---
+ 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<Creature>( const tripoint &, bool ) co
+ template<typename T>
+ shared_ptr_fast<T> game::shared_from( const T &critter )
+ {
+- if( const shared_ptr_fast<monster> mon_ptr = critter_tracker->find( critter.pos() ) ) {
+- return std::dynamic_pointer_cast<T>( mon_ptr );
+- }
+ if( static_cast<const Creature *>( &critter ) == static_cast<const Creature *>( &u ) ) {
+ // u is not stored in a shared_ptr, but it won't go out of scope anyway
+ return std::dynamic_pointer_cast<T>( u_shared_ptr );
+ }
+- for( auto &cur_npc : active_npc ) {
+- if( static_cast<const Creature *>( cur_npc.get() ) == static_cast<const Creature *>( &critter ) ) {
+- return std::dynamic_pointer_cast<T>( cur_npc );
++ if( critter.is_monster() ) {
++ if( const shared_ptr_fast<monster> mon_ptr = critter_tracker->find( critter.pos() ) ) {
++ if( static_cast<const Creature *>( mon_ptr.get() ) == static_cast<const Creature *>( &critter ) ) {
++ return std::dynamic_pointer_cast<T>( mon_ptr );
++ }
++ }
++ }
++ if( critter.is_npc() ) {
++ for( auto &cur_npc : active_npc ) {
++ if( static_cast<const Creature *>( cur_npc.get() ) == static_cast<const Creature *>( &critter ) ) {
++ return std::dynamic_pointer_cast<T>( 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<player *>( 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<player *>( 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<int>( path.size() ) <= follow_distance() &&
+--
+2.29.2
+
+From 61c109645a63f1bafbcaeded9da50b564e983077 Mon Sep 17 00:00:00 2001
+From: Serhiy Zahoriya <serhiy.int@gmail.com>
+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 <hirmuolio@gmail.com>
+---
+ 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 <typename Container>
+ 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
+