I originally wrote this for the DOT code base, but believe I've got it converted to ROM well.
You will need to make a game specific object, called a 'gemstone' (if you're going to have
players be able to find gemstones) , an object type 'pick' and and object type 'ore'.  You
will also need to create a sector type 'mine'. 

The basic concept of this snippet is that a
character who walks into a room of sector type 'mine' and holds a pick in his hands will
be able to mine any ore that is located in the room.  If there is no ore, the room isn't a
mine, or he isn't carrying a pick, he's told why he can't mine.  You can make the ore
objects invisible if you'd like, so that the player has to try to mine and then finds out
that there isn't any ore in that room.  If ore is set to reset in a room, once the room
resets, players will be able to mine again.  This prevents a player from simply botting in
a mine and getting a fortune within half an hour.  You could also have mobiles that are
miners and sometimes act out that they're mining and purge an ore item in the room.

Basically, there wasn't anything out there in the public forums that was like this, so even
though it is very simple (My first full snippet), it should be easy to add in features and
make this activity unique for your mud.  It's a starting point anyways.

-Hera


/*
mine.cpp
Upon not being able to find a snippet being publicly shared to do this,
I decided to try to write something simple myself.
- Hera, of Athens - The Mud athens.boue.ca port 9000 
  hera_of_athens@yahoo.com
*/
 
#include "include.h" 

void do_mine( CHAR_DATA *ch, char * )
{ 
   OBJ_DATA *obj;
   OBJ_DATA *gemstone;
   int mineevent;

	if(!IS_SET(ch->in_room->room2_flags, ROOM2_MINE))
	{
        	send_to_char("You are not in a mine.");
        	return;
	}

 	if (!IS_NPC(ch)) 
 	{ 
		for ( obj = ch->carrying; obj; obj = obj->next_content )
    		{
        	if ( obj->item_type == ITEM_PICK && obj->wear_loc == WEAR_HOLD )
            break;
    		}
    
		if ( !obj )
    		{
        		send_to_char("You are not holding a pick.");
        		return;
    		}else{ 

			for ( obj = ch->in_room->contents; obj; obj = obj->next_content )
			{
				if ( obj->item_type == ITEM_ORE )
				extract_obj( obj );
				break;
			}
		
			if ( obj == NULL )
			{
				send_to_char( "This is not a suitable place to mine." );
				return;
			}


   			mineevent = dice(1,9); 
   			switch(mineevent) 
				{
				case 1:
	    			send_to_char("Your pick strikes a soft ore.  It is gold!\n\r"); 
				ch->gold=ch->gold+1;
				break;
    					
				case 2:
	    			send_to_char("Your pick strikes a soft ore.  It is silver!\n\r"); 
				ch->silver=ch->silver+50;
				break; 
   
                                case 3:
                                send_to_char("Your pick strikes a soft ore.  It is gold!\n\r");
                                ch->gold=ch->gold+2;
                                break;

                                case 4:
                                send_to_char("Your pick strikes a soft ore.  It is silver!\n\r");
                                ch->silver=ch->silver+25;
                                break;

                                case 5:
                                send_to_char("Your pick strikes a soft ore.  It is gold!\n\r");
                                ch->gold=ch->gold+3;
                                break;

                                case 6:
                                send_to_char("Your pick strikes a soft ore.  It is silver!\n\r");
                                ch->silver=ch->silver+75;
                                break;

                                case 7:
                                send_to_char("Your pick strikes a soft stone.  It contains nothing of value.\n\r");
                                break;

                                case 8:
                                send_to_char("Your pick strikes a hard stone.  It contains nothing of value.\n\r");
                                break;
	
				case 9:
	    			if (get_obj_index(OBJ_VNUM_GEMSTONE)) {
					gemstone = create_object(get_obj_index(OBJ_VNUM_GEMSTONE));
					send_to_char("Your pick strikes a very hard stone.  It is a gem!\n\r");
					obj_to_char(gemstone,ch);
				}else{
        			send_to_char( "BUG: No available gemstone object for mining - please report!" );
				return;
				}



				
				}
   		}
	}
	else
		send_to_char( "Mobiles don't need to mine." );

}