@@ -441,6 +441,43 @@ auto picked_facts_for_role( const proc::schema &sch, const std::vector<proc::par
441441 return ret;
442442}
443443
444+ struct sword_variant_data {
445+ std::string name;
446+ itype_id result = itype_id::NULL_ID();
447+ };
448+
449+ auto sword_variant ( const proc::schema &sch, const std::vector<proc::part_fact> &facts,
450+ const std::vector<proc::craft_pick> &picks ) -> sword_variant_data
451+ {
452+ const auto blade_facts = picked_facts_for_role ( sch, facts, picks, " blade" );
453+ const auto reinforcement_facts = picked_facts_for_role ( sch, facts, picks, " reinforcement" );
454+
455+ if ( has_itype ( reinforcement_facts, itype_id ( " nail" ) ) ) {
456+ return { .name = " nail sword" , .result = itype_id ( " sword_nail" ) };
457+ }
458+ if ( has_itype ( reinforcement_facts, itype_id ( " scrap" ) ) ||
459+ has_itype ( blade_facts, itype_id ( " scrap" ) ) ) {
460+ return { .name = " crude sword" , .result = itype_id ( " sword_crude" ) };
461+ }
462+ if ( std::ranges::any_of ( blade_facts, [&]( const proc::part_fact & fact ) {
463+ return has_material ( fact, material_id ( " steel" ) ) || has_material ( fact,
464+ material_id ( " iron" ) );
465+ } ) ) {
466+ return { .name = " hand-forged sword" , .result = itype_id ( " sword_metal" ) };
467+ }
468+ if ( std::ranges::any_of ( blade_facts, [&]( const proc::part_fact & fact ) {
469+ return has_material ( fact, material_id ( " bone" ) );
470+ } ) ) {
471+ return { .name = " bone sword" , .result = itype_id ( " sword_bone" ) };
472+ }
473+ if ( std::ranges::any_of ( blade_facts, [&]( const proc::part_fact & fact ) {
474+ return has_material ( fact, material_id ( " wood" ) );
475+ } ) ) {
476+ return { .name = " 2-by-sword" , .result = itype_id ( " sword_wood" ) };
477+ }
478+ return { .name = " sword" , .result = itype_id ( " proc_sword_generic" ) };
479+ }
480+
444481auto sandwich_condiment_name ( const std::vector<proc::part_fact> &facts ) -> std::string
445482{
446483 if ( !facts_have_tag ( facts, " cond" ) ) {
@@ -520,32 +557,7 @@ auto sandwich_vegetable_name( const std::vector<proc::part_fact> &facts ) -> std
520557auto sword_name ( const proc::schema &sch, const std::vector<proc::part_fact> &facts,
521558 const std::vector<proc::craft_pick> &picks ) -> std::string
522559{
523- const auto blade_facts = picked_facts_for_role ( sch, facts, picks, " blade" );
524- const auto reinforcement_facts = picked_facts_for_role ( sch, facts, picks, " reinforcement" );
525-
526- if ( has_itype ( reinforcement_facts, itype_id ( " nail" ) ) ) {
527- return " nail sword" ;
528- }
529- if ( has_itype ( reinforcement_facts, itype_id ( " scrap" ) ) ||
530- has_itype ( blade_facts, itype_id ( " scrap" ) ) ) {
531- return " crude sword" ;
532- }
533- if ( std::ranges::any_of ( blade_facts, [&]( const proc::part_fact & fact ) {
534- return has_material ( fact, material_id ( " steel" ) ) || has_material ( fact, material_id ( " iron" ) );
535- } ) ) {
536- return " hand-forged sword" ;
537- }
538- if ( std::ranges::any_of ( blade_facts, [&]( const proc::part_fact & fact ) {
539- return has_material ( fact, material_id ( " bone" ) );
540- } ) ) {
541- return " bone sword" ;
542- }
543- if ( std::ranges::any_of ( blade_facts, [&]( const proc::part_fact & fact ) {
544- return has_material ( fact, material_id ( " wood" ) );
545- } ) ) {
546- return " 2-by-sword" ;
547- }
548- return " sword" ;
560+ return sword_variant ( sch, facts, picks ).name ;
549561}
550562
551563auto sword_description ( const proc::schema &sch, const std::vector<proc::part_fact> &facts,
@@ -915,6 +927,15 @@ auto proc::rebuild_fast( const builder_state &state ) -> fast_blob
915927 return preview_blob ( state.sch , facts, selected_picks ( state, state.sch ) );
916928}
917929
930+ auto proc::preview_result_override ( const schema &sch, const std::vector<part_fact> &facts,
931+ const std::vector<craft_pick> &picks ) -> std::optional<itype_id>
932+ {
933+ if ( sch.id != schema_id ( " sword" ) ) {
934+ return std::nullopt ;
935+ }
936+ return sword_variant ( sch, facts, picks ).result ;
937+ }
938+
918939auto proc::debug_part_fact ( const schema &sch, const item &it,
919940 const part_ix ix ) -> std::optional<part_fact>
920941{
0 commit comments