/**************************************************************************
* Circle Area Export - Will save Dawn/DOT Area Files to Circle Format     *
* Copyright (c) 2006 by Brad Wilson (Ixliam)                              *
* To use this code, you must follow all relavent licences below and leave *
* this credit intact. If you find this useful, please let me know.        *                                     
***************************************************************************
* >> DikuMUD (GAMMA 0.0) copyright (c)1990, 1991 by Sebastian Hammer,     *
*    Michael Seifert, Hans Henrik Staerfeldt, Tom Madsen, & Katja Nyboe.  *
* >> CircleMUD 3.1 Created by Jeremy Elson, copyright (C) 1993, 94 by     *
*    the Trustees of the Johns Hopkins University                         *
***************************************************************************/

/**************************************************************************
 This small piece of code is usefull to drop into the end of obdb.cpp. Just
 add the command do_circleexport to your interp.h and interp.cpp files, and
 you can export your areas out to circle. You will need to fix up once they
 export, as item resets and shops do not seem to come in quite right, but
 this beats having to do it manually. If you like this code or improve it,
 please drop me a line at ixliam <AT> wotl <DOT> org.
***************************************************************************/
void save_circle_zone ( FILE * fp, AREA_DATA * pArea )
{
    RESET_DATA *pReset;
    MOB_INDEX_DATA *pLastMob = NULL;
    OBJ_INDEX_DATA *pLastObj;
    ROOM_INDEX_DATA *pRoom;
    EXIT_DATA *pExit;
    int door;
    char buf[MSL];
    int iHash;

    fprintf ( fp, "#%d\n", pArea->min_vnum/100 ); 	// Assign Zone Number
    fprintf ( fp, "None.~\n");			 	// no clue
    fprintf ( fp, "%s~\n", pArea->name);		// area name
    fprintf ( fp, "%d %d 30 2\n", pArea->min_vnum, pArea->max_vnum ); // vnums and reset time

    for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
    {
        for ( pRoom = room_index_hash[iHash]; pRoom; pRoom = pRoom->next )
        {
            if ( pRoom->area == pArea )
            {
                for ( pReset = pRoom->reset_first; pReset;
                      pReset = pReset->next )
                {
                    switch ( pReset->command )
                    {
                        default:
                            bug ( "Save_resets: bad command." );
                            break;
                        case 'M':
                            pLastMob = get_mob_index ( pReset->arg1 );
                            fprintf ( fp, "M 0 %d %d %d %d\n", pReset->arg1,
                                      pReset->arg2, pReset->arg3,
                                      pReset->arg4 );
                            break;

                        case 'O':
                            pLastObj = get_obj_index ( pReset->arg1 );
                            pRoom = get_room_index ( pReset->arg3 );
                            fprintf ( fp, "O 0 %d 0 %d\n", pReset->arg1,
                                      pReset->arg3 );
                            break;

                        case 'P':
                            pLastObj = get_obj_index ( pReset->arg1 );
                            fprintf ( fp, "P 0 %d %d %d %d\n", pReset->arg1,
                                      pReset->arg2, pReset->arg3,
                                      pReset->arg4 );
                            break;

                        case 'G':
                            fprintf ( fp, "G 1 %d 100 -1\n", pReset->arg1 );
                            if ( !pLastMob )
                            {
                                sprintf ( buf,
                                          "Save_resets: !NO_MOB! in [%s]",
                                          pArea->file_name );
                                bug ( buf );
                            }
                            break;

                        case 'E':
                            fprintf ( fp, "E 0 %d 0 %d\n", pReset->arg1,
                                      pReset->arg3 );
                            if ( !pLastMob )
                            {
                                sprintf ( buf,
                                          "Save_resets: !NO_MOB! in [%s]",
                                          pArea->file_name );
                                bug ( buf );
                            }
                            break;

                        case 'D':

                            	break;

                        case 'R':
                            pRoom = get_room_index ( pReset->arg1 );
                            fprintf ( fp, "R 0 %d %d\n", pReset->arg1,
                                      pReset->arg2 );
                            break;
                    }
                }
            }                   /* End if correct area */
        }                       /* End for pRoom */
    }                           /* End for iHash */


    for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
    {
        for ( pRoom = room_index_hash[iHash]; pRoom; pRoom = pRoom->next )
        {
            if ( pRoom->area == pArea )
            {
	       		for ( door = 0; door < MAX_DIR; door++ )
               		{
       				if ( ( pExit = pRoom->exit[door] ) && pExit->u1.to_room )
               			{
                       			int locks = 0;
                       			if ( IS_SET ( pExit->rs_flags, EX_ISDOOR ) &&
                         			( IS_SET ( pExit->rs_flags, EX_CLOSED ) ) &&
                       				( !IS_SET ( pExit->rs_flags, EX_LOCKED ) ) )
                           			locks = 1;
                       			if ( IS_SET ( pExit->rs_flags, EX_ISDOOR ) &&
                             			( IS_SET ( pExit->rs_flags, EX_CLOSED ) ) &&
                             			( IS_SET ( pExit->rs_flags, EX_LOCKED ) ) )
                            			locks = 2;
					if(locks != 0)
               					fprintf ( fp, "D 0 %d %d %d\n", pRoom->vnum, door, locks);
	              		}
                	}
            }                   /* End if correct area */
        }                       /* End for pRoom */
    }                           /* End for iHash */
	






    fprintf ( fp, "S\n" );
    return;
}
/**************************************************************************/
void save_circle_rooms ( FILE * fp, AREA_DATA * pArea )
{
    ROOM_INDEX_DATA *pRoomIndex;
    EXTRA_DESCR_DATA *pEd;
    EXIT_DATA *pExit;
    int iHash;
    int door, sector;
    char flags[MSL];

    flags[0] = '\0';

    for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
    {
        for ( pRoomIndex = room_index_hash[iHash]; pRoomIndex;
              pRoomIndex = pRoomIndex->next )
        {
            if ( pRoomIndex->area == pArea )
            {
                fprintf ( fp, "#%d\n", pRoomIndex->vnum );
                fprintf ( fp, "%s~\n", pRoomIndex->name );
                fprintf ( fp, "%s\n~\n", 
				fix_string (pRoomIndex->description ) );

		fprintf ( fp, "%d ", pArea->min_vnum/100);

		if(IS_SET(pRoomIndex->room_flags, ROOM_DARK))
			fprintf(fp, "a");
		if(IS_SET(pRoomIndex->room_flags, ROOM_NO_MOB))
			fprintf(fp, "c");
		if(IS_SET(pRoomIndex->room_flags, ROOM_INDOORS))
			fprintf(fp, "d");
		if(IS_SET(pRoomIndex->room_flags, ROOM_SAFE))
			fprintf(fp, "e");
		if(IS_SET(pRoomIndex->room_flags, ROOM_ANTIMAGIC))
			fprintf(fp, "h");
		if (pRoomIndex->sector_type == 11)  // cave to mountain
		{
			fprintf(fp, "i"); // tunnel
			sector = 5;
		}
		if(IS_SET(pRoomIndex->room_flags, ROOM_PRIVATE))
			fprintf(fp, "j");
		if(IS_SET(pRoomIndex->room_flags, ROOM_GODS_ONLY))
			fprintf(fp, "k");
		if(IS_SET(pRoomIndex->room_flags, ROOM_OOC))
			fprintf(fp, "o"); // OOC to OLC
		if (pRoomIndex->sector_type == 11)  // cave to mountain
		{
			fprintf(fp, "r"); // underground
			sector = 5;
		}
		if(!pRoomIndex->room_flags)
			fprintf(fp, "0");
		int sector = pRoomIndex->sector_type;
		if (pRoomIndex->sector_type == 12) // underwater
			sector = 9;
		if (pRoomIndex->sector_type == 8) // swamp to hills
			sector = 12;
		if (pRoomIndex->sector_type == 10) // desert to field
			sector = 2;
		if (pRoomIndex->sector_type == 9)  // air to flying
			sector = 8;
		if (pRoomIndex->sector_type == 11)  // cave to mountain
		{
			sector = 5;
		}
		if (pRoomIndex->sector_type == 13)  // snow to field
			sector = 2;
		if (pRoomIndex->sector_type == 14)  // ice to field
			sector = 2;
		if (pRoomIndex->sector_type == 15)  // trail to field
			sector = 2;
		if (pRoomIndex->sector_type == 16)  // lava to field
			sector = 2;
		if (pRoomIndex->sector_type == 17)  // gateway to field
			sector = 2;

		fprintf ( fp, " %d\n", sector);

                for ( pEd = pRoomIndex->extra_descr; pEd; pEd = pEd->next )
                {
                    fprintf ( fp, "E\n%s~\n%s~\n", pEd->keyword, fix_string ( pEd->description ) );
                }
                for ( door = 0; door < MAX_DIR; door++ )    /* I hate this! */
                {
                    if ( ( pExit = pRoomIndex->exit[door] ) &&
                         pExit->u1.to_room )
                    {
                        int locks = 0;
                        if ( IS_SET ( pExit->rs_flags, EX_ISDOOR ) &&
                             ( !IS_SET ( pExit->rs_flags, EX_PICKPROOF ) ) &&
                             ( !IS_SET ( pExit->rs_flags, EX_NOPASS ) ) )
                            locks = 1;
                        if ( IS_SET ( pExit->rs_flags, EX_ISDOOR ) &&
                             ( IS_SET ( pExit->rs_flags, EX_PICKPROOF ) ) &&
                             ( !IS_SET ( pExit->rs_flags, EX_NOPASS ) ) )
                            locks = 2;
                        if ( IS_SET ( pExit->rs_flags, EX_ISDOOR ) &&
                             ( !IS_SET ( pExit->rs_flags, EX_PICKPROOF ) ) &&
                             ( IS_SET ( pExit->rs_flags, EX_NOPASS ) ) )
                            locks = 2;
                        if ( IS_SET ( pExit->rs_flags, EX_ISDOOR ) &&
                             ( IS_SET ( pExit->rs_flags, EX_PICKPROOF ) ) &&
                             ( IS_SET ( pExit->rs_flags, EX_NOPASS ) ) )
                            locks = 2;

                        fprintf ( fp, "D%d\n", door );
                        fprintf ( fp, "%s~\n",
                                  fix_string ( pExit->description ) );
                        fprintf ( fp, "%s~\n", pExit->keyword );
                        fprintf ( fp, "%d %d %d\n", locks, pExit->key,
                                  pExit->u1.to_room->vnum );
                    }
                }
                fprintf ( fp, "S\n" );
            }
        }
    }
    return;
}
/**************************************************************************/
void savecircle_mobile(FILE *fp, MOB_INDEX_DATA *pMobIndex)
{
	int align = 0;
    	char flags1[MSL];
    	char flags2[MSL];
	bool flag = false;

    	flags1[0] = '\0';
    	flags2[0] = '\0';

	fprintf(fp, "#%d\n", pMobIndex->vnum);
	fprintf(fp, "%s~\n", pMobIndex->player_name);
	fprintf(fp, "%s~\n", pMobIndex->short_descr);
	fprintf(fp, "%s\n~\n", fix_string(pMobIndex->long_descr));
	fprintf(fp, "%s\n~\n", fix_string(pMobIndex->description));


	if(IS_SET(pMobIndex->act, ACT_DONT_WANDER) || IS_SET(pMobIndex->act, ACT_SENTINEL) )
		fprintf(fp, "b");
	if(IS_SET(pMobIndex->act, ACT_SCAVENGER))
		fprintf(fp, "c");
	fprintf(fp, "d");
	if(IS_SET(pMobIndex->act, ACT_AGGRESSIVE))
		fprintf(fp, "f");
	if(IS_SET(pMobIndex->act, ACT_STAY_AREA))
		fprintf(fp, "g");
	if(IS_SET(pMobIndex->act, ACT_WIMPY))
		fprintf(fp, "h");
	if(IS_SET(pMobIndex->act, ACT_AGGRESSIVE))
		fprintf(fp, "f");
	if(IS_SET(pMobIndex->act, ACT_AGGRESSIVE))
		fprintf(fp, "f");
		fprintf(fp, " 0 0 0 ");

	if(IS_SET(pMobIndex->affected_by, AFF_BLIND)){
		fprintf(fp, "a");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_INVISIBLE)){
		fprintf(fp, "b");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_DETECT_EVIL)){
		fprintf(fp, "c");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_DETECT_GOOD)){
		fprintf(fp, "c");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_DETECT_INVIS)){
		fprintf(fp, "d");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_DETECT_MAGIC)){
		fprintf(fp, "e");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_DETECT_HIDDEN)){
		fprintf(fp, "f");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_OTTERLUNGS)){
		fprintf(fp, "g");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_SANCTUARY)){
		fprintf(fp, "h");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_CURSE)){
		fprintf(fp, "j");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_INFRARED) || IS_SET(pMobIndex->affected_by, AFF_DARK_VISION)){
		fprintf(fp, "k");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_POISON)){
		fprintf(fp, "l");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_PROTECT_EVIL)){
		fprintf(fp, "m");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_PROTECT_GOOD)){
		fprintf(fp, "n");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_SLEEP)){
		fprintf(fp, "o");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_SNEAK)){
		fprintf(fp, "s");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_HIDE)){
		fprintf(fp, "t");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_CHARM)){
		fprintf(fp, "v");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_FLYING)){
		fprintf(fp, "w");
		flag = true;
    	}
	if(IS_SET(pMobIndex->affected_by, AFF_OTTERLUNGS)){
		fprintf(fp, "x");
		flag = true;
    	}
    	if(flag == false)
		fprintf ( fp, "0");

    	switch(pMobIndex->alliance)
    	{
		case 3:
			align = 1000;
			break;
		case 2:
			align = 700;
			break;
		case 1:
			align = 325;
			break;
		case 0:
			align = 0;
			break;
		case -1:
			align = -325;
			break;
		case -2:
			align = -700;
			break;
		case -3:
			align = -1000;
			break;
	}
	fprintf(fp, " 0 0 0 %d E\n", align);

	int thac0_00 = 20;
	int thac0_32 = -4;   /* as good as a thief */
	if (IS_SET(pMobIndex->act,ACT_WARRIOR))
		thac0_32 = -10;
	else if (IS_SET(pMobIndex->act,ACT_THIEF))
		thac0_32 = -4;
	else if (IS_SET(pMobIndex->act,ACT_CLERIC))
		thac0_32 = 2;
	else if (IS_SET(pMobIndex->act,ACT_MAGE))
		thac0_32 = 6;
	int thac0  = interpolate( pMobIndex->level, thac0_00, thac0_32 );
	if (thac0 < 0)
		thac0 = thac0/2;
	if (thac0 < -5)
		thac0 = -5 + (thac0 + 5) / 2;

	fprintf(fp, "%d %d %d ", pMobIndex->level, thac0, pMobIndex->ac[AC_PIERCE]/100);
	fprintf(fp, "%dd%d+%d ", pMobIndex->hit[DICE_NUMBER],
			         pMobIndex->hit[DICE_TYPE], 
				 pMobIndex->hit[DICE_BONUS]);
	fprintf(fp, "%dd%d+%d\n", pMobIndex->damage[DICE_NUMBER],
			         pMobIndex->damage[DICE_TYPE], 
				 pMobIndex->damage[DICE_BONUS]);
	fprintf(fp, "%ld 100 1 ", pMobIndex->wealth/100);
	
	if (IS_SET(pMobIndex->act,ACT_WARRIOR))
		fprintf( fp, "3\n");
	else if (IS_SET(pMobIndex->act,ACT_THIEF))
		fprintf( fp, "2\n");
	else if (IS_SET(pMobIndex->act,ACT_CLERIC))
		fprintf( fp, "1\n");
	else if (IS_SET(pMobIndex->act,ACT_MAGE))
		fprintf( fp, "0\n");
	else fprintf( fp, "3\n");


   	fprintf( fp, "%d %d %d\nE\n",	pMobIndex->start_pos - 1,
					pMobIndex->default_pos - 1,
					pMobIndex->sex);

	return;
}
/**************************************************************************/
void save_circle_mobiles(FILE * fp, AREA_DATA * pArea)
{
    	int i;
    	MOB_INDEX_DATA *pMob;

	for (i = pArea->min_vnum; i <= pArea->max_vnum; i++)
	{
		if ((pMob = get_mob_index(i)))
			savecircle_mobile(fp, pMob);
	}
	return;
}
/**************************************************************************/
void save_circle_object ( FILE * fp, OBJ_INDEX_DATA * pObjIndex )
{
    EXTRA_DESCR_DATA *pEd;
    bool flag = false;

    fprintf ( fp, "#%d\n", pObjIndex->vnum );
    fprintf ( fp, "%s~\n", pObjIndex->name );
    fprintf ( fp, "%s~\n", pObjIndex->short_descr );
    fprintf ( fp, "%s~\n~\n", fix_string ( pObjIndex->description ) );

    switch ( pObjIndex->item_type )
    {
	case ITEM_ROOM_KEY:
	    fprintf ( fp, "18 " ); // key
	    break;
	case ITEM_COMPONENT:
	    fprintf ( fp, "13 " ); // trash
	    break;
	case ITEM_RP:
	case ITEM_RESOURCE:
	case ITEM_ORE:
	case ITEM_STARGATE:
	case ITEM_FIREARM:
	case ITEM_AMMO:
	case ITEM_RUNE:
	case ITEM_HIDE:
	case ITEM_PARCHMENT:
	case ITEM_HERB:
	case ITEM_CORPSE_NPC:
	case ITEM_CORPSE_PC:
	case ITEM_PILL:
	case ITEM_PROTECT:
	case ITEM_MAP:
	case ITEM_PORTAL:
	case ITEM_WARP_STONE:
	case ITEM_GEM:
	case ITEM_JEWELRY:
	case ITEM_JUKEBOX:
	case ITEM_TOKEN:
	case ITEM_POULTICE:
	case ITEM_MORTAR:
	case ITEM_CAULDRON:
	case ITEM_FLASK:
	case ITEM_MATERIAL:
	case ITEM_SLOTMACHINE:
	case ITEM_TABAC_PIPE:
	case ITEM_POLE:
	case ITEM_PROJECTILE:
	case ITEM_QUIVER:
	    fprintf ( fp, "12 " ); // other
	    break;
	case ITEM_VEHICLE_CONTROLS:
	    fprintf ( fp, "27 " ); // vehicle control
	    break;
	case ITEM_VEHICLE:
	    fprintf ( fp, "24 " ); // vehicle
	    break;
	case ITEM_VEHICLE_WINDOW:
	    fprintf ( fp, "26 " ); // vehicle window
	    break;
	case ITEM_VEHICLE_EXIT:
	    fprintf ( fp, "25 " ); // vehicle exit
	    break;
        default:
	    fprintf ( fp, "%d ", pObjIndex->item_type );
	    break;
    }

    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_GLOW)){
	fprintf ( fp, "a");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_HUM)){
	fprintf ( fp, "b");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_INVIS)){
	fprintf ( fp, "e");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_MAGIC)){
	fprintf ( fp, "g");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_NODROP)){
	fprintf ( fp, "h");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_BLESS)){
	fprintf ( fp, "i");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_ANTI_GOOD)){
	fprintf ( fp, "j");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_ANTI_EVIL)){
	fprintf ( fp, "k");
	flag = true;
    }
    if(IS_SET(pObjIndex->extra_flags, OBJEXTRA_ANTI_NEUTRAL)){
	fprintf ( fp, "l");
	flag = true;
    }	
    if(flag == false)
	fprintf ( fp, "0");
    fprintf ( fp, " ");
    flag = false;
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_TAKE)){
	fprintf ( fp, "a");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_FINGER)){
	fprintf ( fp, "b");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_NECK)){
	fprintf ( fp, "c");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_TORSO)){
	fprintf ( fp, "d");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_HEAD)){
	fprintf ( fp, "e");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_LEGS)){
	fprintf ( fp, "f");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_FEET)){
	fprintf ( fp, "g");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_HANDS)){
	fprintf ( fp, "h");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_ARMS)){
	fprintf ( fp, "i");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_SHIELD)){
	fprintf ( fp, "j");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_ABOUT)){
	fprintf ( fp, "k");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_WAIST)){
	fprintf ( fp, "l");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_WRIST)){
	fprintf ( fp, "m");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_WIELD)){
	fprintf ( fp, "n");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_HOLD)){
	fprintf ( fp, "o");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_BACK)){
	fprintf ( fp, "p");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_EAR)){
	fprintf ( fp, "q");
	flag = true;
    }
    if(IS_SET(pObjIndex->wear_flags, OBJWEAR_FACE)){
	fprintf ( fp, "s");
	flag = true;
    }
    if(flag == false)
	fprintf ( fp, "0");
    fprintf ( fp, "\n");

    switch ( pObjIndex->item_type )
    {
        default:
            fprintf ( fp, "%d ", pObjIndex->value[0]);
            fprintf ( fp, "%d ", pObjIndex->value[1]);
            fprintf ( fp, "%d ", pObjIndex->value[2]);
            fprintf ( fp, "%d\n", pObjIndex->value[3]);
            break;

        case ITEM_WEAPON:
            fprintf ( fp, "0 %d %d %d\n",
                      pObjIndex->value[1], pObjIndex->value[2],
                      pObjIndex->value[3] );
            break;
    }
    fprintf ( fp, "%d ", pObjIndex->weight );
    fprintf ( fp, "%d 0\n", pObjIndex->cost );

    for( pEd = pObjIndex->extra_descr; pEd; pEd = pEd->next )
    {
        if (is_space(pEd->description[0]))
        {
            fprintf( fp, "E\n%s~\n.%s\n~\n", pEd->keyword,
             fix_string( pEd->description ) );
        }
        else
        {   
            fprintf( fp, "E\n%s~\n%s\n~\n", pEd->keyword,
             fix_string( pEd->description ) );
        }
    }

    return;
}
/**************************************************************************/
void save_circle_objects ( FILE * fp, AREA_DATA * pArea )
{
    int i;
    OBJ_INDEX_DATA *pObj;

    for ( i = pArea->min_vnum; i <= pArea->max_vnum; i++ )
    {
        if ( ( pObj = get_obj_index ( i ) ) )
            save_circle_object ( fp, pObj );
    }
    return;
}
/**************************************************************************/
void save_circle_shops ( FILE * fp, AREA_DATA * pArea )
{
    SHOP_DATA *pShopIndex;
    MOB_INDEX_DATA *pMobIndex;
    int iTrade;
    int iHash;

    fprintf( fp, "CircleMUD v3.0 Shop File~\n");

    for ( iHash = 0; iHash < MAX_KEY_HASH; iHash++ )
    {
        for ( pMobIndex = mob_index_hash[iHash]; pMobIndex;
              pMobIndex = pMobIndex->next )
        {
            if ( pMobIndex && pMobIndex->area == pArea && pMobIndex->pShop )
            {
                pShopIndex = pMobIndex->pShop;

                fprintf ( fp, "#%d~\n", pShopIndex->keeper );
                fprintf ( fp, "3031\n");
                fprintf ( fp, "3108\n");
                fprintf ( fp, "3107\n");
                fprintf ( fp, "-1\n");
                fprintf ( fp, "1.1\n");
                fprintf ( fp, "0.%d\n", pShopIndex->profit_sell);

                for ( iTrade = 0; iTrade < MAX_TRADE; iTrade++ )
                {
                    if ( pShopIndex->buy_type[iTrade] != 0 )
                    {
                        fprintf ( fp, "%d\n", pShopIndex->buy_type[iTrade] );
                    }
                }
                fprintf ( fp, "-1\n");
                fprintf ( fp, "%s Sorry, just what I've got. No special orders.~\n", "%s");
                fprintf ( fp, "%s But ya haven't that item!~\n", "%s");
                fprintf ( fp, "%s Nope, don't have much use for them.~\n", "%s");
                fprintf ( fp, "%s I'm sorry, but I cannot afford such a treasure.~\n", "%s");
                fprintf ( fp, "%s Come back when you've got the coins. I'll wait.~\n", "%s");
                fprintf ( fp, "%s That'll be %s coins, and what a bargin too!~\n", "%s", "%d");
                fprintf ( fp, "%s I can give ya %s coins, that's the best offer you'll get around here.~\n", "%s", "%d");
                fprintf ( fp, "-1\n");
                fprintf ( fp, "0\n");
                fprintf ( fp, "%d\n", pShopIndex->keeper);
                fprintf ( fp, "0\n");
                fprintf ( fp, "%d\n", pShopIndex->keeper); // Hope the keeper & rooms vnums are the same
                fprintf ( fp, "-1\n");
                fprintf ( fp, "0\n");
                fprintf ( fp, "28\n");
                fprintf ( fp, "0\n");
                fprintf ( fp, "0\n");
            }
        }
    }
    return;
}
/**************************************************************************/
void savecircle ( AREA_DATA * pArea )
{
    FILE *fp=NULL;
    char write_filename[MIL];

    sprintf(write_filename, "/home/yourmudhere/world/zon/%d.zon", pArea->min_vnum/100);
    if ( !( fp = fopen ( write_filename, "w" ) ) )
    {
        bug ( "Open_area: fopen" );
        perror ( pArea->file_name );
    }
    save_circle_zone ( fp, pArea );
    fprintf ( fp, "$\n" );
    fclose ( fp );

    sprintf(write_filename, "/home/yourmudhere/world/wld/%d.wld", pArea->min_vnum/100);
    if ( !( fp = fopen ( write_filename, "w" ) ) )
    {
        bug ( "Open_area: fopen" );
        perror ( pArea->file_name );
    }
    save_circle_rooms ( fp, pArea );
    fprintf ( fp, "$\n" );
    fclose ( fp );

    sprintf(write_filename, "/home/yourmudhere/world/mob/%d.mob", pArea->min_vnum/100);
    if ( !( fp = fopen ( write_filename, "w" ) ) )
    {
        bug ( "Open_area: fopen" );
        perror ( pArea->file_name );
    }
    save_circle_mobiles ( fp, pArea );
    fprintf ( fp, "$\n" );
    fclose ( fp );

    sprintf(write_filename, "/home/yourmudhere/world/obj/%d.obj", pArea->min_vnum/100);
    if ( !( fp = fopen ( write_filename, "w" ) ) )
    {
        bug ( "Open_area: fopen" );
        perror ( pArea->file_name );
    }
    save_circle_objects ( fp, pArea );
    fprintf ( fp, "$\n" );
    fclose ( fp );

    sprintf(write_filename, "/home/yourmudhere/world/shp/%d.shp", pArea->min_vnum/100);
    if ( !( fp = fopen ( write_filename, "w" ) ) )
    {
        bug ( "Open_area: fopen" );
        perror ( pArea->file_name );
    }
    save_circle_shops ( fp, pArea );
    fprintf ( fp, "$\n" );
    fclose ( fp );

    return;
}
/**************************************************************************/
void do_circleexport( char_data *ch, char *argument )
{
    	AREA_DATA *pArea;
	ch->printlnf("Saving the world into CIRCLE format....");
	for( pArea = area_first; pArea; pArea = pArea->next )
	{
		ch->printlnf("Saving %s into zone %d.", pArea->file_name, pArea->min_vnum/10);
		savecircle( pArea );
	}
	ch->printlnf("CIRCLE EXPORT COMPLETE.");
	return;
}
/**************************************************************************/
/**************************************************************************/