diff --git a/data/json/npcs/factions.json b/data/json/npcs/factions.json index f545e00befff4..a6db1f630c07f 100644 --- a/data/json/npcs/factions.json +++ b/data/json/npcs/factions.json @@ -23,7 +23,33 @@ } }, "mon_faction": "player", - "epilogues": [ { "power_min": 0, "power_max": 149, "id": "epilogue_faction_your_followers_0" } ], + "epilogues": [ + { "power_min": 0, "power_max": 149, "id": "epilogue_faction_your_followers_0" }, + { "power_min": 150, "id": "epilogue_faction_your_followers_150" }, + { + "power_min": 150, + "dynamic": [ + { "faction": "free_merchants", "power_min": 150 }, + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 } + ], + "id": "epilogue_faction_your_followers_FM" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "free_merchants", "power_max": 150 }, { "faction": "tacoma_commune", "power_min": 150 } ], + "id": "epilogue_faction_your_followers_revolt" + }, + { + "power_min": 150, + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "robofac", "power_min": 150 } + ], + "id": "epilogue_faction_your_followers_OG" + } + ], "description": "The survivors who have entrusted you with their well-being. If morale drops, poor performance and mutiny may become issues." }, { @@ -82,7 +108,36 @@ }, "epilogues": [ { "power_min": 0, "power_max": 149, "id": "epilogue_faction_robofac_0" }, - { "power_min": 150, "power_max": 299, "id": "epilogue_faction_robofac_150" } + { + "power_min": 150, + "dynamic": [ { "faction": "exodii", "power_max": 150 }, { "faction": "the_great_library", "power_max": 150 } ], + "id": "epilogue_faction_robofac_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "exodii", "power_min": 150 }, { "faction": "the_great_library", "power_max": 150 } ], + "id": "epilogue_faction_robofac_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "exodii", "power_max": 150 }, { "faction": "the_great_library", "power_min": 150 } ], + "id": "epilogue_faction_robofac_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "exodii", "power_min": 150 }, { "faction": "the_great_library", "power_min": 150 } ], + "id": "epilogue_faction_robofac_thrive" + }, + { + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "robofac", "power_min": 150 }, + { "faction": "exodii", "power_min": 150 }, + { "faction": "the_great_library", "power_min": 150 } + ], + "id": "epilogue_faction_robofac_thrive_OG" + } ], "description": "The surviving staff of Hub 01, a pre-Cataclysm research lab. They rarely leave their lab, if at all, and rely on their robots and advanced technology to survive." }, @@ -147,8 +202,27 @@ "hells_raiders": { "kill on sight": true } }, "epilogues": [ - { "power_min": 0, "id": "epilogue_faction_old_guard_0" }, - { "power_min": 150, "id": "epilogue_faction_old_guard_150" } + { "power_min": 0, "power_max": 149, "id": "epilogue_faction_old_guard_0" }, + { + "power_min": 150, + "dynamic": [ { "faction": "tacoma_commune", "power_max": 150 }, { "faction": "robofac", "power_min": 150 } ], + "id": "epilogue_faction_old_guard_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "tacoma_commune", "power_min": 150 }, { "faction": "robofac", "power_max": 150 } ], + "id": "epilogue_faction_old_guard_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "tacoma_commune", "power_max": 150 }, { "faction": "robofac", "power_max": 150 } ], + "id": "epilogue_faction_old_guard_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "tacoma_commune", "power_min": 150 }, { "faction": "robofac", "power_min": 150 } ], + "id": "epilogue_faction_old_guard_thrive" + } ], "description": "The remains of the federal government. The extent of their strength is unknown but squads of patrolling soldiers have been seen under their banner." }, @@ -237,7 +311,26 @@ }, "epilogues": [ { "power_min": 0, "power_max": 149, "id": "epilogue_faction_free_merchants_0" }, - { "power_min": 150, "id": "epilogue_faction_free_merchants_150" } + { + "power_min": 150, + "dynamic": [ { "faction": "old_guard", "power_max": 150 }, { "faction": "tacoma_commune", "power_min": 150 } ], + "id": "epilogue_faction_free_merchants_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "old_guard", "power_min": 150 }, { "faction": "tacoma_commune", "power_max": 150 } ], + "id": "epilogue_faction_free_merchants_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "old_guard", "power_max": 150 }, { "faction": "tacoma_commune", "power_max": 150 } ], + "id": "epilogue_faction_free_merchants_150" + }, + { + "power_min": 150, + "dynamic": [ { "faction": "old_guard", "power_min": 150 }, { "faction": "tacoma_commune", "power_min": 150 } ], + "id": "epilogue_faction_free_merchants_thrive" + } ], "description": "A conglomeration of entrepreneurs and businessmen that stand together to hammer-out an existence through trade and industry." }, @@ -328,7 +421,33 @@ }, "epilogues": [ { "power_min": 0, "power_max": 149, "id": "epilogue_faction_tacoma_commune_0" }, - { "power_min": 150, "id": "epilogue_faction_tacoma_commune_150" } + { + "power_min": 150, + "dynamic": [ { "faction": "tacoma_commune", "power_min": 150 }, { "faction": "free_merchants", "power_min": 150 } ], + "id": "epilogue_faction_tacoma_commune_150" + }, + { + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "free_merchants", "power_min": 150 }, + { "faction": "robofac", "power_min": 150 } + ], + "id": "epilogue_faction_tacoma_commune_150_OG" + }, + { + "dynamic": [ { "faction": "tacoma_commune", "power_min": 150 }, { "faction": "free_merchants", "power_max": 150 } ], + "id": "epilogue_faction_tacoma_commune_revolt" + }, + { + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "free_merchants", "power_max": 150 }, + { "faction": "robofac", "power_min": 150 } + ], + "id": "epilogue_faction_tacoma_commune_revolt_OG" + } ], "description": "An outpost started by the Free Merchants to provide a source of food and raw materials." }, @@ -469,8 +588,32 @@ "your_followers": { "kill on sight": true } }, "epilogues": [ - { "power_min": 0, "power_max": 149, "id": "epilogue_faction_hells_raiders_0" }, - { "power_min": 150, "id": "epilogue_faction_hells_raiders_150" } + { + "dynamic": [ { "faction": "old_guard", "power_max": 150 }, { "faction": "hells_raiders", "power_max": 150 } ], + "id": "epilogue_faction_hells_raiders_0" + }, + { + "dynamic": [ { "faction": "old_guard", "power_max": 150 }, { "faction": "hells_raiders", "power_min": 150 } ], + "id": "epilogue_faction_hells_raiders_150" + }, + { + "dynamic": [ { "faction": "old_guard", "power_min": 150 }, { "faction": "hells_raiders", "power_max": 150 } ], + "id": "epilogue_faction_hells_raiders_stalemate" + }, + { + "dynamic": [ { "faction": "old_guard", "power_min": 150 }, { "faction": "hells_raiders", "power_min": 150 } ], + "id": "epilogue_faction_hells_raiders_stalemate" + }, + { + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "robofac", "power_min": 150 }, + { "faction": "exodii", "power_min": 150 }, + { "faction": "the_great_library", "power_min": 150 } + ], + "id": "epilogue_faction_hells_raiders_collapse" + } ], "description": "The largest gang of hooligans and bandits that preys upon other survivors. Even if you have no gear, there is always a need for slaves and fresh meat." }, @@ -608,6 +751,26 @@ }, "epilogues": [ { "power_min": 0, "power_max": 149, "id": "epilogue_faction_isherwoods_0" }, + { + "power_min": 150, + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "free_merchants", "power_min": 150 }, + { "faction": "robofac", "power_min": 150 } + ], + "id": "epilogue_faction_isherwoods_OG_FM" + }, + { + "power_min": 150, + "dynamic": [ + { "faction": "old_guard", "power_min": 150 }, + { "faction": "tacoma_commune", "power_min": 150 }, + { "faction": "free_merchants", "power_max": 150 }, + { "faction": "robofac", "power_min": 150 } + ], + "id": "epilogue_faction_isherwoods_OG" + }, { "power_min": 150, "id": "epilogue_faction_isherwoods_150" } ], "description": "A small family surviving on their generational land." diff --git a/data/json/snippets/epilogue_factions.json b/data/json/snippets/epilogue_factions.json index ebda5fde9e544..37c0e5ead4e98 100644 --- a/data/json/snippets/epilogue_factions.json +++ b/data/json/snippets/epilogue_factions.json @@ -11,6 +11,22 @@ "id": "epilogue_faction_your_followers_0", "text": " You and everyone who followed you are forgotten among the billions lost in the Cataclysm…" }, + { + "id": "epilogue_faction_your_followers_150", + "text": " Your followers will not forget you. Through years of struggle, they survive the terrors of the Cataclysm. For this, the legacy of your deeds will live on in the generations your efforts gave a fighting chance…" + }, + { + "id": "epilogue_faction_your_followers_FM", + "text": " The Free Merchants will not forget you. For your support in their time of need, they contribute greatly to the development of the community established by you and your followers…" + }, + { + "id": "epilogue_faction_your_followers_revolt", + "text": " The people of Tacoma will not forget you. As you helped them develop the facilities needed to survive the apocalypse, they too help your followers harness the means of production…" + }, + { + "id": "epilogue_faction_your_followers_OG", + "text": " The soldiers of the Old Guard will not forget you. In bringing together the survivors of the Cataclysm, you have sown the seeds for a new birth of Freedom. For this, your legend will survive as long as the Old Guard does…" + }, { "id": "epilogue_faction_old_guard_0", "text": " Locked in an endless battle, the Old Guard was forced to consolidate their resources in a handful of fortified bases along the coast. Without the men or material to rebuild, the soldiers that remained lost all hope…" @@ -19,6 +35,10 @@ "id": "epilogue_faction_old_guard_150", "text": " The steadfastness of individual survivors after the Cataclysm impressed the tattered remains of the once glorious union. Spurred on by small successes, a number of operations to re-secure facilities met with limited success. Forced to eventually consolidate to large bases, the Old Guard left these facilities in the hands of the few survivors that remained. As the years passed, little materialized from the hopes of rebuilding civilization…" }, + { + "id": "epilogue_faction_old_guard_thrive", + "text": " The steadfastness of individual survivors after the Cataclysm impressed the tattered remains of the once glorious union. Spurred on by numerous strategic successes, a number of operations to re-secure facilities succeeded thanks to the support of various surviving communities. While some remained cautious of submitting themselves to the Old Guard's authority, nostalgia for the old world and the promise of security from the new rallied many more to their flag.." + }, { "id": "epilogue_faction_free_merchants_0", "text": " Life in the refugee shelter deteriorated as food shortages and disease destroyed any hope of maintaining a civilized enclave. The merchants and craftsmen dispersed to found new colonies but most became victims of marauding bandits. Those who survived never found a place to call home…" @@ -27,6 +47,10 @@ "id": "epilogue_faction_free_merchants_150", "text": " The Free Merchants struggled for years to keep themselves fed but their once profitable trade routes were plundered by bandits and thugs. In squalor and filth the first generations born after the Cataclysm are told stories of the old days when food was abundant and the children were allowed to play in the sun…" }, + { + "id": "epilogue_faction_free_merchants_thrive", + "text": " With the success of Tacoma and the return of the Old Guard, the Free Merchants were able to expand their reach throughout the region. In every settlement they had a partner, and in every venture they had a stake. In the safety of their gilded compounds, food was abundant, and the first children born after the Cataclysm were free to play in the sun…" + }, { "id": "epilogue_faction_tacoma_commune_0", "text": " The fledgling outpost was abandoned a few months later. The external threats combined with low crop yields caused the Free Merchants to withdraw their support. When the exhausted migrants returned to the refugee center they were turned away to face the world on their own." @@ -35,6 +59,18 @@ "id": "epilogue_faction_tacoma_commune_150", "text": " The commune continued to grow rapidly through the years despite constant external threat. While maintaining a reputation as a haven for all law-abiding citizens, the commune's leadership remained loyal to the interests of the Free Merchants. Hard labor for little reward remained the price to be paid for those who sought the safety of the community." }, + { + "id": "epilogue_faction_tacoma_commune_revolt", + "text": " Through the years, the commune would continue to rapidly grow despite constant external threats. In a surprising twist then, the greatest threat would turn out to be an internal one. The collapse of the Free Merchant traders plunged the Commune's leadership into a period of significant infighting, and seeing an opportunity, the survivors of the Commune quickly moved to oust them. Afterwards, the settlement was re-organized under a democratically elected council and the resources of Tacoma were distributed by need and popular vote. The Commune would soon earn a reputation as a place where the struggles of the wasteland were shared, and where the horrors of the world were faced together." + }, + { + "id": "epilogue_faction_tacoma_commune_150_OG", + "text": " When the Old Guard came for their support, the Commune's leadership was happy to accept, though not without conditions. Lucrative contracts and the exclusive rights to inter-settlement trade routes made the Free Merchants virtual merchant royalty overnight. While many survivors would grumble, none could deny that wherever the Old Guard went, the Free Merchants would bring their prosperity with them, for a price of course." + }, + { + "id": "epilogue_faction_tacoma_commune_revolt_OG", + "text": " When the Old Guard came for their support, the citizens of the Commune were extremely resistant to surrendering their autonomy to this 'new' power. However, the Old Guard, desperate to find footholds in the region, proved more amicable to their demands than they expected. In exchange for representation in the Provisional Congress on Nantucket island, and the Old Guard's support in organizing other settlements like Tacoma in their territory, the Tacoma Commune would surprise many by voting to join the new union. When asked for a comment on the vote, the First Speaker of the Tacoma Council simply said, 'out of many, one.'" + }, { "id": "epilogue_faction_isolated_road_0", "text": " The artisans continued to work for a time. However a lack of trade and connection left them doomed from the beginning. At some point the properties became abandoned with no signs of the former inhabitants." @@ -59,13 +95,29 @@ "id": "epilogue_faction_hells_raiders_150", "text": " Fueled by drugs and rage, the Hell's Raiders fought tooth and nail to overthrow the last strongholds of the Old Guard. The costly victories brought the warlords abundant territory and slaves but little in the way of stability. Within weeks, infighting led to civil war as tribes vied for leadership of the faction. When only one warlord finally secured control, there was nothing left to fight for… just endless cities full of the dead." }, + { + "id": "epilogue_faction_hells_raiders_stalemate", + "text": " Unable to overcome the forces of the Old Guard, the Hell's Raiders found themselves trapped in a grueling war of attrition…" + }, + { + "id": "epilogue_faction_hells_raiders_collapse", + "text": " …though in the end, they simply couldn't keep up. With the survivors of the wasteland becoming more organized by the day, the Hell's Raiders found it more and more difficult to find easy prey to loot and pillage. Before long, the once feared raiders found themselves on the defensive as the resurgent Old Guard began to assault their outposts and dismantle their hierarchy of command. Those that weren't killed were forced to flee into the untamed west, the memory of their terror slowly fading like a bad dream." + }, { "id": "epilogue_faction_robofac_0", "text": " Despite Melchior's enlightened leadership, shortages and crises plagued Hub-01 from the first day of the Cataclysm. The researchers and administrators among the surviving staff lacked the practical skills to survive in the savage new world. As Hub-01's systems collapsed from a lack of maintenance, the few survivors fled the building to be killed by the zombies and bandits." }, { "id": "epilogue_faction_robofac_150", - "text": " Melchior's enlightened leadership, combined with practical skills provided by mercenary survivors, allowed Hub-01 to flourish briefly. It became a mecca for advanced technology, selling off devices and equipment that could no longer be reproduced. Despite this, Hub-01 was never able to expand sufficiently to renew its own population, nor was it able to unite with any other prosperous community, nor could enough trustworthy mercenaries (or staff) be recruited to replace those who died in its defense. Hub-01 fell into disrepair and ruin. After the air processing facility was overtaken by mold, the remaining staff of Hub-01 fled the building and were killed by zombies and bandits. Melchior's drones - possibly by design - were incapable of maintaining themselves without human hands, and stopped working a few months later. Without regular maintenance, Melchior's own systems also fell to ruin, and less than a decade after the Cataclysm, humanity's first AI powered down and was forgotten." + "text": " Melchior's enlightened leadership, combined with practical skills provided by mercenary survivors, allowed Hub-01 to flourish briefly. It became a mecca for advanced technology, selling off devices and equipment that could no longer be reproduced. Despite this, Hub-01 was never able to expand sufficiently to renew its own population, nor was it able to unite with any other prosperous community, nor could enough trustworthy mercenaries (or staff) be recruited to replace those who died in its defense. Hub-01 fell into disrepair and ruin. After the air processing facility was overtaken by mold, the remaining staff of Hub-01 fled the building and were killed by zombies and bandits. Melchior's drones - possibly by design - were incapable of maintaining themselves without human hands, and stopped working a few months later. Without regular maintenance, Melchior's own systems also fell to ruin, and less than a decade after the Cataclysm, humanity's first AI powered down and was forgotten." + }, + { + "id": "epilogue_faction_robofac_thrive", + "text": " Melchior's enlightened leadership, backed-up with the muscle of numerous mercenary survivors, allowed Hub-01 to flourish on its' own for a time. However, while the staff of Hub-01 preferred to ignore the people of the region, the looming shortages of advanced resources and personnel forced them to expand their search for resources. By prying the secrets of CBMs from the Exodii, Hub01 was able to recruit and retain an enhanced mercenary force which proved capable of protecting them for years after the Cataclysm." + }, + { + "id": "epilogue_faction_robofac_thrive_OG", + "text": " While still technically being employees (or property, in Melchior's case) of the federal government, the staff of Hub-01 were initially very reluctant to have anything to do with the Old Guard. However, the connections and resources of the Old Guard gave them significant leverage in negotiations between the two factions. After much debate, Hub-01 would eventually vote to rejoin the government in exchange for its' support of the Hub's research." }, { "id": "epilogue_faction_isherwoods_0", @@ -75,6 +127,14 @@ "id": "epilogue_faction_isherwoods_150", "text": " The generational land of the Isherwoods came to flourish following , helping to feed nearby settlements. Survivors flocked to learn botany, animal handling, and backwoods remedies, eventually forming a small community…" }, + { + "id": "epilogue_faction_isherwoods_OG_FM", + "text": " After they shot an Old Guard envoy to the farm, a bounty was placed on the Isherwood family. With the Isherwoods forced from their home, the farm was quickly purchased by the Free Merchants and converted into a very profitable plantation…" + }, + { + "id": "epilogue_faction_isherwoods_OG", + "text": " After they shot an Old Guard envoy to the farm, a bounty was placed on the Isherwood family. When the father pleaded guilty to killing the man, the remaining Isherwoods were allowed to return to their farm, albeit with planners from Tacoma…" + }, { "id": "epilogue_faction_lapin_0", "text": " Mr. Lapin continued his remote life in the wilderness, teaching whoever would visit. The survivors who came slowly dwindled, until they stopped entirely. Mr. Lapin was found dead several years later following a heart attack. His body had decomposed to skeletal remains…" diff --git a/src/faction.cpp b/src/faction.cpp index ebe431d5be72e..337a90b00c327 100644 --- a/src/faction.cpp +++ b/src/faction.cpp @@ -84,9 +84,9 @@ void faction_template::load( const JsonObject &jsobj ) void faction_template::check_consistency() { for( const faction_template &fac : npc_factions::all_templates ) { - for( const auto &epi : fac.epilogue_data ) { - if( !std::get<2>( epi ).is_valid() ) { - debugmsg( "There's no snippet with id %s", std::get<2>( epi ).str() ); + for( const faction_epilogue_data &epi : fac.epilogue_data ) { + if( !epi.epilogue.is_valid() ) { + debugmsg( "There's no snippet with id %s", epi.epilogue.str() ); } } } @@ -144,11 +144,7 @@ faction_template::faction_template( const JsonObject &jsobj ) lone_wolf_faction = jsobj.get_bool( "lone_wolf_faction", false ); load_relations( jsobj ); mon_faction = mfaction_str_id( jsobj.get_string( "mon_faction", "human" ) ); - for( const JsonObject jao : jsobj.get_array( "epilogues" ) ) { - epilogue_data.emplace( jao.get_int( "power_min", std::numeric_limits::min() ), - jao.get_int( "power_max", std::numeric_limits::max() ), - snippet_id( jao.get_string( "id", "epilogue_faction_default" ) ) ); - } + optional( jsobj, false, "epilogues", epilogue_data ); } std::string faction::describe() const @@ -157,12 +153,56 @@ std::string faction::describe() const return ret; } +void faction_power_spec::deserialize( const JsonObject &jo ) +{ + mandatory( jo, false, "faction", faction ); + optional( jo, false, "power_min", power_min ); + optional( jo, false, "power_max", power_max ); + + if( !power_min.has_value() && !power_max.has_value() ) { + jo.throw_error( "Must have either a power_min or a power_max" ); + } +} + +void faction_epilogue_data::deserialize( const JsonObject &jo ) +{ + optional( jo, false, "power_min", power_min ); + optional( jo, false, "power_max", power_max ); + optional( jo, false, "dynamic", dynamic_conditions ); + mandatory( jo, false, "id", epilogue ); +} + + +bool faction::check_relations( const std::vector &faction_power_specs ) const +{ + if( faction_power_specs.empty() ) { + return true; + } + for( const faction_power_spec &spec : faction_power_specs ) { + if( spec.power_min.has_value() ) { + if( spec.faction->power < spec.power_min.value() ) { + return false; + } + } + if( spec.power_max.has_value() ) { + if( spec.faction->power >= spec.power_max.value() ) { + return false; + } + } + } + return true; +} + + std::vector faction::epilogue() const { std::vector ret; - for( const std::tuple &epilogue_entry : epilogue_data ) { - if( power >= std::get<0>( epilogue_entry ) && power < std::get<1>( epilogue_entry ) ) { - ret.emplace_back( std::get<2>( epilogue_entry )->translated() ); + for( const faction_epilogue_data &epi : epilogue_data ) { + if( ( !epi.power_min.has_value() || power >= epi.power_min ) && ( !epi.power_max.has_value() || + power < epi.power_max ) ) { + if( check_relations( epi.dynamic_conditions ) ) { + ret.emplace_back( epi.epilogue->translated() ); + } } } return ret; diff --git a/src/faction.h b/src/faction.h index 5d99dbd5d4350..25c3ee5f8c515 100644 --- a/src/faction.h +++ b/src/faction.h @@ -92,6 +92,28 @@ class faction_price_rules_reader : public generic_typed_reader power_min; + std::optional power_max; + + void deserialize( const JsonObject &jo ); +}; + + +struct faction_epilogue_data { + std::optional power_min; + std::optional power_max; + + std::vector dynamic_conditions; + + snippet_id epilogue; + + void deserialize( const JsonObject &jo ); +}; + + class faction_template { protected: @@ -101,6 +123,7 @@ class faction_template private: explicit faction_template( const JsonObject &jsobj ); + public: static void load( const JsonObject &jsobj ); static void check_consistency(); @@ -123,7 +146,7 @@ class faction_template std::vector price_rules; // additional pricing rules std::map> relations; mfaction_str_id mon_faction; // mon_faction_id of the monster faction; defaults to human - std::set> epilogue_data; + std::vector epilogue_data; }; class faction : public faction_template @@ -136,7 +159,9 @@ class faction : public faction_template void serialize( JsonOut &json ) const; void faction_display( const catacurses::window &fac_w, int width ) const; + std::string describe() const; + bool check_relations( const std::vector &faction_power_specs ) const; std::vector epilogue() const; std::string food_supply_text();