Above is correct but a couple of notes to add:
make_item_list is read in from a XML file (see craft.c):
/*
|<CRAFT>
| <ITEM>
| <NAME> </NAME>
| <DESC> </DESC>
| <FROM> </FROM>
| <INTO_SUCCESS> </INTO_SUCCESS>
| <INTO_FAIL> </INTO_FAIL>
| <SKILL> </SKILL> <- skill used
| <PERC_MIN> </PERC_MIN> <- minimum skill required
| <PERC_MOD> </PERC_MOD> <- ups the random die roll making it harder to succeed
| <DELAY_MIN> </DELAY_MIN>
| <DELAY_MAX> </DELAY_MAX>
| <TO_CHAR_SUCCESS> </TO_CHAR_SUCCESS>
| <TO_ROOM_SUCCESS> </TO_CHAR_SUCCESS> <- obviously the comment is wrong here
| <TO_CHAR_FAIL> </TO_CHAR_FAIL>
| <TO_ROOM_FAIL> </TO_ROOM_FAIL>
| <ONLY_TRIBE> </ONLY_TRIBE>
| <REQUIRE_FIRE> </REQUIRE_FIRE>
| <TOOL_TYPE> </TOOL_TYPE>
| <TOOL_QUALITY> </TOOL_QUALITY>
| </ITEM>
|</CRAFT>
*/
When you equip a tool (or any object) it can modify your skill level. That happens before you craft.
handler.c
function equip_char calls affect_modify function
Listing available recipes depends on:
in object.c
if ((ch->skills[make_item_list.skill])
&& (ch->skills[make_item_list.skill]->learned >= make_item_list.percentage_min)
&& ((make_item_list.only_tribe == TRIBE_ANY)
|| (IS_TRIBE(ch, make_item_list.only_tribe))))
//no random numbers above, "->learned" is your skill modified by equipped items (maybe your stats? would have to do more digging), percentage_min is from the recipe definition
bonus = get_room_skill_bonus(ch->in_room, make_item_list[recipe_index].skill);
//gets an EDESC value from the room labeled: "[SKILL_BONUS_MSG_%s]", skill_name[skillno]
worked = ((make_item_list[recipe_index].percentage_mod + die_roll) < (ch->skills[make_item_list[recipe_index].skill]->learned + bonus));
// percent_mod is from the xml file, die_roll is random number from 1 to 100
// those go against your learned skill (with affects) + room bonus
This type message is not in the code dump:
You could make...
1) a split logs from that. [cooking, easy]
Code dump is the old style, a list of :
snprintf(buf, sizeof(buf), "You could make %s%s from that.\n\r", indefinite_article(make_item_list.name), make_item_list.name);
example from an old game log file:
You could make a long bone jambiya from that.
You could make a pair of small bone pieces from that.
You could make a bone shortsword from that.
You could make a tapered bone shortsword from that.
You could make a single-edged bone shortsword from that.
You could make a serrated bone shortsword from that.
You could make a double-edged bone shortsword from that.
You could make a leaf-carved bone shortsword from that.
My best guess is the change is taking
(make_item_list[recipe_index].percentage_mod < (ch->skills[make_item_list[recipe_index].skill]->learned + bonus));
and spitting out the skill and difficulty. (2-3 lines of code to change + the difficulty messages constants)
Might or might not be taking the room bonus into consideration when printing out the difficulty, don't play anymore so not going to test it out.
One more note, failure as of the code dump always goes up 2:
gain_skill(ch, make_item_list[recipe_index].skill, 2);
So if you are timing failures correctly it should take only 10 failures to go from journeyman to advanced
More than 10 failures and you are being inefficient with your time.
And finally, the player level check is to give more information to imms.
from core_structs.h
/* levels */
#define MORTAL 0
#define LEGEND 1
#define BUILDER 2
#define CREATOR 3
#define QUESTMASTER 3
#define STORYTELLER 3
#define DIRECTOR 4
#define HIGHLORD 4
#define OVERLORD 5