#include <cmr.h> #include <colour.h> #include <library.h> #define SAVE_FILE "/save/cmr_handler" inherit OBJECT_OBJ; /** * This handler deals with identifying materials and colours. Your skill and * experience are used to determine if you can successfully identify a * particular material or colour. * * @author Deutha */ string *colour_names; mapping colour_details; string *material_names; mapping material_details; void load_cmr_handler(); void save_cmr_handler(); void create(); string add_colour( string word, int fine, int crude, int qp_thresh, int sp_thresh ); int *query_colour_details( string word ); int delete_colour( string word ); string *query_colour_names(); string identify_colour( string word, object player ); string add_material( string word, int colour, int type, int skill_reqd, int skill_thresh ); int *query_material_details( string word ); int delete_material( string word ); string *query_material_names(); string identify_material( string word, object player, int article ); string query_material_adjective( string word ); /** * @ignore yes */ void load_cmr_handler() { if ( file_size( SAVE_FILE +".o" ) > 0 ) unguarded((: restore_object, SAVE_FILE :)); } /* load_cmr_handler() */ /** * @ignore yes */ void save_cmr_handler() { unguarded((: save_object, SAVE_FILE :)); } /* save_cmr_handler() */ /** * @ignore yes */ void create() { colour_names = ({ }); colour_details = ([ ]); material_names = ({ }); material_details = ([ ]); ::create(); load_cmr_handler(); } /* create() */ /** * This function is used to add a known colour to the handler. * * @param word The name of the colour * @param fine Not sure * @param crude Not sure * @param qp_thresh Quest points required to help identify this colour * @param sp_thresh Social points required to help identify this colour */ string add_colour( string word, int fine, int crude, int qp_thresh, int sp_thresh ) { int temp; temp = member_array( word, colour_names ); if ( temp != -1 ) return "colour already exists"; colour_names += ({ word }); colour_details += ([ word : ({ fine, crude, qp_thresh, sp_thresh }) ]); save_cmr_handler(); return "the colour "+ word +", a shade of "+ ( ( fine == crude )? "pure ":MODIFIERS[fine] ) + COLOURS[crude] +", with thresholds of "+ qp_thresh +" xp and "+ sp_thresh +" sp"; } /* add_colour() */ /** * Returns the array of information stored about a particular colour. The * array is setup using add_colour. * * @param word The colour in question * @see add_colour */ int *query_colour_details( string word ) { int temp; temp = member_array( word, colour_names ); if ( temp == -1 ) return ({ -1 }); return colour_details[word]; } /* query_colour_details() */ /** * Remove a colour from the handler. * * @param word The colour to remove. */ int delete_colour( string word ) { int temp; temp = member_array( word, colour_names ); if ( temp == -1 ) return 0; colour_names -= ({ word }); map_delete( colour_details, word ); save_cmr_handler(); return 1; } /* delete_colour() */ /** * List all the known colours in the handler. * * @return An array of strings of colour names. */ string *query_colour_names() { return colour_names + ({ }); } /** * Used to determine if a player can identify a particular colour. The * function returns the colours name or a string giving a rough description * if they're unable to identify it. * * @param word The colour they're trying to identify. * @param player The player trying to identify the colour. * @return Description. */ string identify_colour( string word, object player ) { int temp, *args; temp = member_array( word, colour_names ); if ( temp == -1 ) return "unknown colour"; args = allocate( 4 ); args = colour_details[word]; if ( !player ) return word; switch ( ( ( LIBRARY->query_quest_points(player->query_name()) ) > args[2] )+ ( ( player->query_max_gp() ) > args[3] ) ) { case 0: return COLOURS[args[1]]; case 1: return ( ( ( args[0] == args[1] )?"pure ":MODIFIERS[args[0]] ) + COLOURS[args[1]] ); default: return word; } } /* identify_colour() */ /** * Add a new material to the handler. * The colour of the material is an index into the COLOUR array defined in * colour.h. The type of material is an index into the MATERIALS array defined * in cmr.h. skill_reqd is an index into the SKILLS array defined in cmr.h but * can also take the special value of 99 to indicate that the material can only * be identified if someone has told the person what the material is or 0 to * indicate that everyone knows what the material is. * If the skill_reqd is a skill the skill_thresh is the bonus needed in that * skill to identify the material. * * @param word The name of the material * @param colour The index into the colour array for the colour of the material. (see colour.h) * @param type Type of material * @param skill_reqd Index into the array of skills (see cmr_handler.h) * @param skill_thresh The bonus required in the appropriate skill. */ string add_material( string word, int colour, int type, int skill_reqd, int skill_thresh ) { int temp; string text; temp = member_array( word, material_names ); if ( temp != -1 ) return "material already exists"; material_names += ({ word }); material_details += ([ word : ({ colour, type, skill_reqd, skill_thresh }) ]); save_cmr_handler(); if ( !skill_reqd ) text = " that is always recognised"; else if ( skill_reqd == LEARNT ) text = " that is recognised through knowledge"; else text = " that has a threshold of "+ skill_thresh +" in "+ SKILLS[skill_reqd]; return word +", a"+ ( ( colour == COL_ORANGE )?"n ":" " ) + COLOURS[colour] +" "+ MATERIALS[type] + text; } /* add_material() */ /** * Return the details of a material set with add_material * * @param word The material in question * @return An integer array of material details. */ int *query_material_details( string word ) { int temp; temp = member_array( word, material_names ); if ( temp == -1 ) return ({ -1 }); return material_details[word]; } /* query_material_details() */ /** * Remove a material from the handler. * * @param word The name of the material to remove. */ int delete_material( string word ) { int temp; temp = member_array( word, material_names ); if ( temp == -1 ) return 0; material_names -= ({ word }); map_delete( material_details, word ); save_cmr_handler(); return 1; } /* delete_material() */ /** * List all the known materials by name. */ string *query_material_names() { return material_names + ({ }); } /** * Used to determine if a player can identify a particular material. * The function returns the materials name or a string giving a rough * description if they're unable to identify it. * * Some materials can be identified by being high enough at a particular skill * (defined in cmr.h) while others are only learned by being taught and others * are known to everyone. * * @param word The name of the material * @param player The player trying to identify it. * @param article Definite or indefinite article. * @return Description. * * @see cmr_library * @see cmr */ string identify_material( string word, object player, int article ) { int temp, *args; string prefix; temp = member_array( word, material_names ); if ( temp == -1 ) return "unknown material"; args = allocate( 4 ); args = material_details[word]; prefix = ( ( article )?"a"+ ( ( args[0] == COL_ORANGE )?"n ":" " ):"" ); if ( !args[ 2 ] || !player ) return word; if ( args[2] == LEARNT ) if ( member_array( word, (string *)CMR_LIBRARY->query_known_materials( player->query_name() ) ) == -1 ) return prefix + COLOURS[ args[ 0 ] ] +" "+ MATERIALS[ args[ 1 ] ]; else return word; if ( ( player->query_skill_bonus( SKILLS[args[2]] ) ) > args[3] ) return word; else return prefix + COLOURS[args[0]] +" "+ MATERIALS[args[1]]; } /* identify_material() */ /** * Not sure about this. Seems to return a colour and adjective for a material. * eg. slate returns 'grey mineral'. * @param The name of the material. * @return A description. */ string query_material_adjective( string word ) { int temp, *args; temp = member_array( word, material_names ); if ( temp == -1 ) return "an unknown material"; args = allocate( 4 ); args = material_details[word]; return COLOURS[args[0]] +" "+ MATERIAL_ADJECTIVES[args[1]]; } /* query_material_adjective() */ /** * Returns the ansi colour associated with the material eg. yellow for gold, * red for a red mineral pebble etc. * @param word the material's name. * @return ansi colour sequence for that colour. */ string query_material_ansi_colour( string word ) { int temp, *args; temp = member_array( word, material_names ); if ( temp == -1 ) return ""; args = allocate( 4 ); args = material_details[word]; return ANSI_COLOURS[args[0]]; } /* query_material_ansi_colour() */