tmw/
tmw/data/
tmw/help/
tmw/player/
tmw/player/f/
tmw/player/i/
tmw/player/o/
tmw/player/q/
tmw/player/u/
tmw/player/y/
/*****************************************************

                                     FuBaR 1.3.1X

alpha version cyborg code
by: kjodo
ok this is a hack of wear locations, i just added a new
field to obj_data much like wear_loc, called bionic_loc
cyborgs will be the only class to utilize this

*****************************************************/

#define unix 1
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"

/* locals */
bool remove_bionic args(( CHAR_DATA *ch, int iWear, bool fReplace ));
void wear_bionic   args(( CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace ));
void do_addbionic  args(( CHAR_DATA *ch, char *argument ));
void do_rembionic  args(( CHAR_DATA *ch, char *argument ));
OBJ_DATA * get_bionic_char args(( CHAR_DATA *ch, int iWear ));
void equip_bionic  args(( CHAR_DATA *ch, OBJ_DATA *obj, int iWear ));
void unequip_bionic args(( CHAR_DATA *ch, OBJ_DATA *obj ));
OBJ_DATA * get_bionic_wear args(( CHAR_DATA *ch, char *argument ));
void affect_modify args(( CHAR_DATA *ch, AFFECT_DATA *paf, bool fAdd ));

bool remove_bionic( CHAR_DATA *ch, int iWear, bool fReplace )
{
    OBJ_DATA *obj;

    if ( !( obj = get_bionic_char( ch, iWear ) ) )
	return TRUE;

    if ( !fReplace )
	return FALSE;

    act(AT_WHITE, "$n stops using $p.", ch, obj, NULL, TO_ROOM );
    act(AT_WHITE, "You stop using $p.", ch, obj, NULL, TO_CHAR );

    unequip_bionic( ch, obj );

    return TRUE;
}



/*
 * Wear one object.
 * Optional replacement of existing objects.
 * Big repetitive code, ick.
 */
void wear_bionic( CHAR_DATA *ch, OBJ_DATA *obj, bool fReplace )
{
    char buf [ MAX_STRING_LENGTH ];

    if ( ch->level < obj->level )
    {
	sprintf( buf, "You cannot implant this until level %d.\n\r",
	    obj->level );
	send_to_char(AT_BLUE, buf, ch );
	act(AT_BLUE, "$n tries to implant $p, but is too inexperienced.",
	    ch, obj, NULL, TO_ROOM );
	return;
    }

    if ( CAN_ADDBIONIC( obj, ITEM_BIONIC_EYE ) )
    {
	if ( get_bionic_char( ch, BIONIC_EYE_L )
	&&   get_bionic_char( ch, BIONIC_EYE_R )
	&&   !remove_bionic( ch, BIONIC_EYE_L, fReplace )
	&&   !remove_bionic( ch, BIONIC_EYE_R, fReplace ) )
	    return;

	if ( !get_bionic_char( ch, BIONIC_EYE_L ) )
	{
	    act(AT_BLUE, "A $p is implanted in your left eye socket.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s left eye socket.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_EYE_L );
	    return;
	}

	if ( !get_bionic_char( ch, BIONIC_EYE_R ) )
	{
	    act(AT_BLUE, "A $p is implanted in your right eye socket.", ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s right eye socket.",   ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_EYE_R );
	    return;
	}

	bug( "Wear_bionic: no free eye socket.", 0 );
	send_to_char(AT_BLUE, "You already have two bionic eyes.\n\r", ch );
	return;
    }


    if ( CAN_ADDBIONIC( obj, ITEM_BIONIC_BODY ) )
    {
	if ( !remove_bionic( ch, BIONIC_BODY, fReplace ) )
	    return;
	act(AT_BLUE, "A $p is implanted as your body.", ch, obj, NULL, TO_CHAR );
	act(AT_BLUE, "$n gets $p implanted as $s body.",   ch, obj, NULL, TO_ROOM );
	equip_bionic( ch, obj, BIONIC_BODY );
	return;
    }

    if ( CAN_ADDBIONIC( obj, ITEM_BIONIC_ARM ) )
    {
	if ( get_bionic_char( ch, BIONIC_ARM_L )
	&&   get_bionic_char( ch, BIONIC_ARM_R )
	&&   !remove_bionic( ch, BIONIC_ARM_L, fReplace )
	&&   !remove_bionic( ch, BIONIC_ARM_R, fReplace ) )
	    return;

	if ( !get_eq_char( ch, BIONIC_ARM_L ) )
	{
	    act(AT_BLUE, "A $p is implanted in your left arm socket.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s left arm socket.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_ARM_L );
	    return;
	}

	if ( !get_bionic_char( ch, BIONIC_ARM_R ) )
	{
	    act(AT_BLUE, "A $p is implanted in your right arm socket.", ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s right arm socket.",   ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_ARM_R );
	    return;
	}

	bug( "Wear_bionic: no free arm socket.", 0 );
	send_to_char(AT_BLUE, "You already have two bionic arms.\n\r", ch );
	return;
    }

    if ( CAN_ADDBIONIC( obj, ITEM_BIONIC_HAND ) )
    {
	if ( get_bionic_char( ch, BIONIC_HAND_L )
	&&   get_bionic_char( ch, BIONIC_HAND_R )
	&&   !remove_bionic( ch, BIONIC_HAND_L, fReplace )
	&&   !remove_bionic( ch, BIONIC_HAND_R, fReplace ) )
	    return;

	if ( !get_eq_char( ch, BIONIC_HAND_L ) )
	{
	    act(AT_BLUE, "A $p is implanted in your left hand socket.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s left hand socket.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_HAND_L );
	    return;
	}

	if ( !get_bionic_char( ch, BIONIC_HAND_R ) )
	{
	    act(AT_BLUE, "A $p is implanted in your right hand socket.", ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s right hand socket.",   ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_HAND_R );
	    return;
	}

	bug( "Wear_bionic: no free hand socket.", 0 );
	send_to_char(AT_BLUE, "You already have two bionic hands.\n\r", ch );
	return;
    }

    if ( CAN_ADDBIONIC( obj, ITEM_BIONIC_LEG ) )
    {
	if ( get_bionic_char( ch, BIONIC_LEG_L )
	&&   get_bionic_char( ch, BIONIC_LEG_R )
	&&   !remove_bionic( ch, BIONIC_LEG_L, fReplace )
	&&   !remove_bionic( ch, BIONIC_LEG_R, fReplace ) )
	    return;

	if ( !get_eq_char( ch, BIONIC_LEG_L ) )
	{
	    act(AT_BLUE, "A $p is implanted in your left leg socket.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s left leg socket.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_LEG_L );
	    return;
	}

	if ( !get_bionic_char( ch, BIONIC_LEG_R ) )
	{
	    act(AT_BLUE, "A $p is implanted in your right leg socket.", ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted in $s right leg socket.",   ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_LEG_R );
	    return;
	}

	bug( "Wear_bionic: no free leg socket.", 0 );
	send_to_char(AT_BLUE, "You already have two bionic legs.\n\r", ch );
	return;
    }

    if ( CAN_ADDBIONIC( obj, ITEM_BIONIC_IMPLANT ) )
    {
	if ( get_bionic_char( ch, BIONIC_IMPLANT1 )
	&&   get_bionic_char( ch, BIONIC_IMPLANT2)
	&&   get_bionic_char( ch, BIONIC_IMPLANT3)
	&&   get_bionic_char( ch, BIONIC_IMPLANT4)
	&&   get_bionic_char( ch, BIONIC_IMPLANT5)
	&&   get_bionic_char( ch, BIONIC_IMPLANT6)
	&&   get_bionic_char( ch, BIONIC_IMPLANT7)
	&&   get_bionic_char( ch, BIONIC_IMPLANT8)
	&&   get_bionic_char( ch, BIONIC_IMPLANT9)
	&&   get_bionic_char( ch, BIONIC_IMPLANT10)
	&&   !remove_bionic( ch, BIONIC_IMPLANT1, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT2, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT3, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT4, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT5, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT6, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT7, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT8, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT9, fReplace )
	&&   !remove_bionic( ch, BIONIC_IMPLANT10, fReplace ))
	    return;

	if ( !get_bionic_char( ch, BIONIC_IMPLANT1 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT1 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT2 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT2 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT3 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT3 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT4 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT4 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT5 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT5 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT6 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT6 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT7 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT7 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT8 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT8 );
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT9 ) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT9);
	    return;
	}
	if ( !get_bionic_char( ch, BIONIC_IMPLANT10) )
	{
	    act(AT_BLUE, "A $p is implanted.",  ch, obj, NULL, TO_CHAR );
	    act(AT_BLUE, "$n gets $p implanted.",    ch, obj, NULL, TO_ROOM );
	    equip_bionic( ch, obj, BIONIC_IMPLANT10);
	    return;
	}


	bug( "Wear_bionic: no free implant", 0 );
	send_to_char(AT_BLUE, "You already have ten bionic implants.\n\r", ch );
	return;
    }


    if ( fReplace )
	send_to_char(AT_BLUE, "You cannot bionically implant that.\n\r", ch );

    return;
}

void do_addbionic( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    char      arg [ MAX_INPUT_LENGTH ];
    one_argument( argument, arg );


    if ( arg[0] == '\0' )
    {
	send_to_char(AT_BLUE, "What would you like bionically implanted?\n\r", ch );
	return;
    }

    if ( !str_cmp( arg, "all" ) )
    {
        OBJ_DATA *obj_next;

        for ( obj = ch->carrying; obj; obj = obj_next )
	{
	    obj_next = obj->next_content;

	    if ( obj->bionic_loc == BIONIC_NONE && can_see_obj( ch, obj ) )
		wear_bionic( ch, obj, FALSE );
	}
	return;
    }
    else
    {
	if ( !( obj = get_obj_carry( ch, arg ) ) )
	{
	    send_to_char(AT_BLUE, "You do not have that item.\n\r", ch );
	    return;
	}
	wear_bionic( ch, obj, TRUE );
    }

    return;
}



void do_rembionic( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    char      arg [ MAX_INPUT_LENGTH ];
    one_argument( argument, arg );

    if ( arg[0] == '\0' )
    {
	send_to_char(AT_BLUE, "Which bionic would you like removed?\n\r", ch );
	return;
    }

    if ( !str_cmp( arg, "all" ) )
    {
	OBJ_DATA *obj_next;
	for ( obj = ch->carrying; obj != NULL; obj = obj_next )
	{
	    obj_next = obj->next_content;
	    if ( obj->bionic_loc != BIONIC_NONE && can_see_obj( ch, obj ) )
	        remove_bionic( ch, obj->bionic_loc, TRUE );
	}
	return;
    }
    if ( !( obj = get_bionic_wear( ch, arg ) ) )
    {
	send_to_char(AT_BLUE, "You do not have that item.\n\r", ch );
	return;
    }

    remove_bionic( ch, obj->bionic_loc, TRUE );
    return;
}
OBJ_DATA *get_bionic_char( CHAR_DATA *ch, int iWear )
{
    OBJ_DATA *obj;

    for ( obj = ch->carrying; obj; obj = obj->next_content )
    {
        if ( obj->deleted )
	    continue;
	if ( obj->bionic_loc == iWear )
	    return obj;
    }

    return NULL;
}



/*
 * Equip a char with an obj.
 */
void equip_bionic( CHAR_DATA *ch, OBJ_DATA *obj, int iWear )
{
    AFFECT_DATA *paf;
    char         buf [ MAX_STRING_LENGTH ];

    if ( get_bionic_char( ch, iWear ) )
    {
        sprintf( buf, "Equip_bionic: %s already equipped at %d.",
		ch->name, iWear );
	bug( buf, 0 );
	return;
    }

    ch->armor      	-= apply_ac( obj, iWear );
    obj->bionic_loc	 = iWear;
    SET_BIT( obj->extra_flags, ITEM_BIONIC_EQPD );

    for ( paf = obj->pIndexData->affected; paf; paf = paf->next )
	affect_modify( ch, paf, TRUE );
    for ( paf = obj->affected; paf; paf = paf->next )
	affect_modify( ch, paf, TRUE );

    ch->carry_number -= get_obj_number( obj );
    oprog_wear_trigger( obj, ch );
    return;
}



/*
 * Unequip a char with an obj.
 */
void unequip_bionic( CHAR_DATA *ch, OBJ_DATA *obj )
{
    AFFECT_DATA *paf;
    char         buf [ MAX_STRING_LENGTH ];

    if ( obj->bionic_loc == BIONIC_NONE )
    {
        sprintf( buf, "Unequip_bioinic: %s already unequipped with %d.",
		ch->name, obj->pIndexData->vnum );
	bug( buf, 0 );
	return;
    }

    ch->armor		+= apply_ac( obj, obj->bionic_loc );
    obj->bionic_loc	 = -1;
	REMOVE_BIT( obj->extra_flags, ITEM_BIONIC_EQPD );

    for ( paf = obj->pIndexData->affected; paf; paf = paf->next )
	affect_modify( ch, paf, FALSE );
    for ( paf = obj->affected; paf; paf = paf->next )
	affect_modify( ch, paf, FALSE );

    ch->carry_number += get_obj_number( obj );
    return;
}

OBJ_DATA *get_bionic_wear( CHAR_DATA *ch, char *argument )
{
    OBJ_DATA *obj;
    char      arg [ MAX_INPUT_LENGTH ];
    int       number;
    int       count;

    number = number_argument( argument, arg );
    count  = 0;
    for ( obj = ch->carrying; obj; obj = obj->next_content )
    {
	if ( obj->bionic_loc != BIONIC_NONE
	    && can_see_obj( ch, obj )
	    && is_name( ch, arg, obj->name ) )
	{
	    if ( ++count == number )
		return obj;
	}
    }

    return NULL;
}