/* NOTICE: The use of all information in this file is limited by the following
   rules: 
   1: You must comply with all DIKU/Merc/ROM licensing as this is a work
      based off of it.
   2: I request that I be given credit in a comment or header or something in
      the source code.
   3: You may not, in any way, use this code for financial gain. By this I mean
      you cannot accept money in any way, shape, or form, for anything using
	  or derived from this code.
   See, wasn't that much.*/
/*Coded by Samual, inspired by XaosMUD, a project of Ragnar. Note that I never
  did see his way of coding this... which is likely a lot cleaner. I'm an amature
  at this, so, be ware of bugs! :-) */
/*Ok, this is going to be a bunch of code and where-to-put it/change what's 
  there to it guide to make all objects to be weapons and/or furniture. I
  suggest that you 1: Back up EVERYTHING first. 2: Make sure you either have
  method of version control or that you implement all the 'save' functions
  first, compile, load, asave world, shutdown, then take care of all the load
  functions. Also, note that you might want to update any form of identification
  spells/skills.*/

/*First Step: In merc.h, inside of obj_index_data, add the following after wear_flags,
as well as in obj_data after wear_loc*/

/*Weapon Furniture stats to all items, Coded by Samual (webtv_1@yahoo.com).*/
	int						weapon_class;
	int						attack_type;
	int						weapon_type2;
	int						damdice_number;
	int						damdice_size;
	int						furniture_flags;
	int						max_people;
	int						max_weight;
	int						healrate;
	int						manarate;
  
 /*Ok, the prototypes now have the data structures we need. Now for the headache
   of dealing with OLC. Note I did this without version controls, if you have them,
   I DO advise using them. :-P
   The next edits occur in olc.h, olc.c, olc_act.c, and olc_save.c Note that order
   is incredibly important in olc_save.c, because we'll be loading the files back in
   that it saves.*/
/*Weapon Furniture To All Changes by Samual (webtv_1@yahoo.com). These belong in olc.h,
  inside of the oedit command delcaring statements.*/
DECLARE_OLC_FUN( oedit_wclass	); 
DECLARE_OLC_FUN( oedit_wflag	); 
DECLARE_OLC_FUN( oedit_dtype	); 
DECLARE_OLC_FUN( oedit_furniture); 
DECLARE_OLC_FUN( oedit_damdice);
DECLARE_OLC_FUN( oedit_maxpeople);
DECLARE_OLC_FUN( oedit_maxweight);
DECLARE_OLC_FUN( oedit_mana);
DECLARE_OLC_FUN( oedit_heal);
/*Now to olc.c, in the oedit_table, add the following*/
	{"wtype", oedit_wclass}, 
	{"dtype", oedit_dtype}, 
	{"wflag", oedit_wflag}, 
	{"damdice", oedit_damdice},
	{"furniture", oedit_furniture},		
	{"maxpeople", oedit_maxpeople},
	{"maxweight", oedit_maxweight},
	{"heal", oedit_heal},
	{"mana", oedit_mana},
/*olc_act.c: in oedit_show, add the following, preferably after the extra flags are printed*/
send_to_char ("\n\r", ch);
	sprintf (buf, "Weapon Class: [%s]\n\r",
				flag_string (weapon_class, pObj->weapon_class));
	send_to_char (buf, ch);
	sprintf (buf, "Damage Type: [%s]\n\r",
				 attack_table[pObj->attack_type].name);;
	send_to_char (buf, ch);
	sprintf (buf, "Weapon Flags: [%s]\n\r", flag_string (weapon_type2, pObj->weapon_type2));
	send_to_char (buf, ch);
	sprintf (buf, "Damage Dice: [%1dD%d]\n\r", pObj->damdice_number, pObj->damdice_size);
	send_to_char (buf, ch);
	send_to_char ("\n\r", ch);
	sprintf (buf, "Furniture Flags: [%s]\n\r",
				flag_string (furniture_flags, pObj->furniture_flags));
	send_to_char (buf, ch);
	sprintf (buf, "Max People [%d] Heal Rate [%d] \n\r", pObj->max_people, pObj->healrate);
	send_to_char (buf, ch);
	sprintf (buf, "Max Weight [%d] Mana Rate [%d]\n\r", pObj->max_weight, pObj->manarate);
	send_to_char (buf, ch);
	send_to_char ("\n\r", ch);
/*olc_act.c: Put these after oedit_wear*/
OEDIT (oedit_wclass)
{                                
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);

        if ((value = flag_value (weapon_class, argument)) != NO_FLAG)
        {
            pObj->weapon_class = value;

            send_to_char ("Weapon type toggled.\n\r", ch);
            return TRUE;
        }
    }

    send_to_char ("Syntax:  wtype [type]\n\r"
                  "Type '? weapon' for a list of flags.\n\r", ch);
    return FALSE;
}
OEDIT (oedit_dtype)
{                                
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);

        if ((value = attack_lookup (argument) != NULL))
        {
            pObj->attack_type = attack_lookup (argument);

            send_to_char ("damage type toggled.\n\r", ch);
            return TRUE;
        }
    }

    send_to_char ("Syntax:  dtype [type]\n\r"
                  "Type '? damtype' for a list of flags.\n\r", ch);
    return FALSE;
}
OEDIT (oedit_wflag)
{                                
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);

        if ((value = flag_value (weapon_type2, argument)) != NO_FLAG)
        {
            TOGGLE_BIT (pObj->weapon_type2, value);

            send_to_char ("Weapon flag toggled.\n\r", ch);
            return TRUE;
        }
    }

    send_to_char ("Syntax:  wflag [flag]\n\r"
                  "Type '? wtype' for a list of flags.\n\r", ch);
    return FALSE;
}
OEDIT (oedit_damdice)
{
	OBJ_INDEX_DATA *pObj;
	char arg1[MIL];
	char arg2[MIL];
	int value1;
	int value2;
	if (argument[0] != '\0')
	{
		EDIT_OBJ (ch, pObj);
		value1 = atoi (one_argument(argument, arg1));
		value2 = atoi (one_argument(argument, arg2));
		if (value1 == 0)
		{
			value1 = pObj->damdice_number;
		}
		if (value2 == 0)
		{
			value2 = pObj->damdice_size;
		}
		pObj->damdice_number = value1;
		pObj->damdice_size = value2;
		send_to_char ("All set!\n\r", ch);
		return TRUE;
	}
	send_to_char ("Syntax: Damdice <Number> <size>/n/r", ch);
	return FALSE;
}
OEDIT (oedit_furniture)
{                         
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);

        if ((value = flag_value (furniture_flags, argument)) != NO_FLAG)
        {
            TOGGLE_BIT (pObj->furniture_flags, value);

            send_to_char ("Furniture flag toggled.\n\r", ch);
            return TRUE;
        }
    }

    send_to_char ("Syntax:  Furniture [flag]\n\r"
                  "Type '? Furniture' for a list of flags.\n\r", ch);
    return FALSE;
}
OEDIT (oedit_maxpeople)
{                         
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);
		value = atoi (argument);
        if (value == 0)
        {
			value = -1;
        }
		pObj->max_people = value;
		return TRUE;
	}

    send_to_char ("Syntax:  maxpeople [number]\n\r", ch);
    return FALSE;
}
OEDIT (oedit_maxweight)
{                         
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);
		value = atoi (argument);
        if (value == 0)
        {
			value = -1;
        }
		pObj->max_weight = value;
		return TRUE;
	}

    send_to_char ("Syntax:  maxweight [number]\n\r", ch);
    return FALSE;
}
OEDIT (oedit_mana)
{                         
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);
		value = atoi (argument);
        if (value == 0)
        {
			value = -1;
        }
		pObj->manarate = value;
		return TRUE;
	}

    send_to_char ("Syntax:  mana [number]\n\r", ch);
    return FALSE;
}
OEDIT (oedit_heal)
{                         
    OBJ_INDEX_DATA *pObj;
    int value;

    if (argument[0] != '\0')
    {
        EDIT_OBJ (ch, pObj);
		value = atoi (argument);
        if (value == 0)
        {
			value = -1;
        }
		pObj->healrate = value;
		return TRUE;
	}

    send_to_char ("Syntax:  heal [number]\n\r", ch);
    return FALSE;
}
/*ok, now I'm going to include some of the surrounding lines so you can see where
  to put these lines into olc_save.c, which will be between a line saying start here, 
  end here in comments.*/
  fprintf (fp, "%s~\n", pObjIndex->material);
    fprintf (fp, "%s ", item_name (pObjIndex->item_type));
    fprintf (fp, "%s ", fwrite_flag (pObjIndex->extra_flags, buf));
    fprintf (fp, "%s\n", fwrite_flag (pObjIndex->wear_flags, buf));
	/*start here*/
	fprintf (fp, "%s\n", fwrite_flag (pObjIndex->weapon_class, buf));
	fprintf (fp, "%s\n", fwrite_flag (pObjIndex->weapon_type2, buf));
	fprintf (fp, "%d\n", pObjIndex->damdice_number);
	fprintf (fp, "%d\n", pObjIndex->damdice_size);
	fprintf (fp, "%s\n",  attack_table[pObjIndex->attack_type].name, buf);
	fprintf (fp, "%s\n", fwrite_flag (pObjIndex->furniture_flags, buf));
	fprintf (fp, "%d\n", pObjIndex->max_people);
	fprintf (fp, "%d\n", pObjIndex->max_weight);
	fprintf (fp, "%d\n", pObjIndex->healrate);
	fprintf (fp, "%d\n", pObjIndex->manarate);
	/*end here*/
/*
 *  Using fwrite_flag to write most values gives a strange
 *  looking area file, consider making a case for each
 *  item type later.
 */

    switch (pObjIndex->item_type)
/* now, if you DON'T have version control, I highly suggest compiling NOW, then
   saving all your area files with asave world, then shutdown while you do the
   following changes to db.c and/or db2.c*/
 
 /*db.c: in *create_object*/
 obj->weapon_class = pObjIndex->furniture_flags;
	obj->weapon_type2 = pObjIndex->weapon_type2;
	obj->attack_type = pObjIndex->attack_type;
	obj->damdice_number = pObjIndex->damdice_number;
	obj->damdice_size = pObjIndex->damdice_size;
	obj->furniture_flags = pObjIndex->furniture_flags;
	obj->max_people = pObjIndex->max_people;
	obj->max_weight = pObjIndex->max_weight;
	obj->healrate = pObjIndex->healrate;
	obj->manarate = pObjIndex->manarate;
/*db2.c: in load_objects, add the part between start here and end here*/
	pObjIndex->extra_flags = fread_flag (fp);
	pObjIndex->wear_flags = fread_flag (fp);
	/*start here!*/
	pObjIndex->weapon_class = fread_flag (fp);
	pObjIndex->weapon_type2 = fread_flag (fp);
	pObjIndex->damdice_number = fread_number (fp);
	pObjIndex->damdice_size = fread_number (fp);
	CHECK_POS (pObjIndex->attack_type, attack_lookup (fread_word (fp)), "attack_type");
	pObjIndex->furniture_flags = fread_flag (fp);
	pObjIndex->max_people = fread_number (fp);
	pObjIndex->max_weight = fread_number (fp);
	pObjIndex->healrate = fread_number (fp);
	pObjIndex->manarate = fread_number (fp);
	/*end here!*/

/*ok, so now all of them have the flags, they save, they load, and are OLCable...
  Now to change the other bits of code that need altering. we'll start with fight.c.*/
 
 /*fight.c: one_hit: find these lines:
     wield = get_eq_char (ch, WEAR_WIELD);

    if (dt == TYPE_UNDEFINED)
    {
        dt = TYPE_HIT;
        if (wield != NULL && wield->item_type == ITEM_WEAPON)
            dt += wield->value[3];
        else
            dt += ch->dam_type;
    }

    if (dt < TYPE_HIT)
        if (wield != NULL)
            dam_type = attack_table[wield->value[3]].damage;
        else
            dam_type = attack_table[ch->dam_type].damage;
    else
        dam_type = attack_table[dt - TYPE_HIT].damage;
and replace with:*/
wield = get_eq_char (ch, WEAR_WIELD);

    if (dt == TYPE_UNDEFINED)
    {
        dt = TYPE_HIT;
        if (wield != NULL)
            dt += wield->attack_type;
        else
            dt += ch->dam_type;
    }

    if (dt < TYPE_HIT)
        if (wield != NULL)
            dam_type = attack_table[wield->attack_type].damage;
        else
            dam_type = attack_table[ch->dam_type].damage;
    else
        dam_type = attack_table[dt - TYPE_HIT].damage;

/*now find this set of lines:
else
    {
        if (sn != -1)
            check_improve (ch, sn, TRUE, 5);
        if (wield != NULL)
        {
            if (wield->pIndexData->new_format)
                dam = dice (wield->value[1], wield->value[2]) * skill / 100;
            else
                dam = number_range (wield->value[1] * skill / 100,
                                    wield->value[2] * skill / 100);

and replace with:*/
else
    {
        if (sn != -1)
            check_improve (ch, sn, TRUE, 5);
        if (wield != NULL)
        {
            if (wield->pIndexData->new_format)
                dam = dice (wield->damdice_number, wield->damdice_size) * skill / 100;
            else
                dam = number_range (wield->value[1] * skill / 100,
                                    wield->value[2] * skill / 100);
/*ok, fight.c is done. Now for act_move.c, which I'm simply going to explain
  what you need to change. For all of the 'do_stand/rest/sit/sleep' commands,
  find the if statement that says "if ( ITEM_TYPE != ITEM_FURNITURE || ..."
  and remove everything up to the ||, then check your bracketing. I'm likey missing
  some things, but that is the majority of what I have worked out needing so far.
  :-P If I had a connection able to support it, I'd play test it to death, but
  dialup is dialup, and any bug fixes or things I missed would be apprecited.*/