/
tgpub/area/notes/
tgpub/doc/
tgpub/player/
tgpub/player/backup/
tgpub/player/store/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael          *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  In order to use any part of this Merc Diku Mud, you must comply with   *
 *  both the original Diku license in 'license.doc' as well the Merc       *
 *  license in 'license.txt'.  In particular, you may not remove either of *
 *  these copyright notices.                                               *
 *                                                                         *
 *  Much time and thought has gone into this software and you are          *
 *  benefitting.  We hope that you share your changes too.  What goes      *
 *  around, comes around.                                                  *
 ***************************************************************************/

#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"

void do_highlander (CHAR_DATA *ch, char *argument)
{

    if (IS_NPC(ch)) return;

    if ( !IS_SET(ch->immune, IMM_HIGHLANDER) )
    {
	SET_BIT(ch->immune, IMM_HIGHLANDER);
	if ( IS_CLASS(ch, CLASS_HIGHLANDER) )
	    send_to_char("You will now allow other clans to hire you as a mercenary.\r\n", ch);
	else
	    send_to_char("You now have the chance to become a highlander.\r\n", ch);
    }
    else
    {
	REMOVE_BIT(ch->immune, IMM_HIGHLANDER);
	if ( IS_CLASS(ch, CLASS_HIGHLANDER) )
	    send_to_char("You are no longer available as a mercenary.\r\n", ch);
	else
	    send_to_char("You don't want the chance to become a highlander.\r\n", ch);
    }

    return;
}

void create_highlander( CHAR_DATA *victim )
{
    int rolled, chance;
    char buf[MAX_STRING_LENGTH];
    char log_buf[MAX_STRING_LENGTH];
    OBJ_DATA *obj;

    if (IS_NPC(victim)) 			return;
    if (IS_CLASS(victim, CLASS_HIGHLANDER) )	return;
    if (!IS_IMMUNE(victim, IMM_HIGHLANDER) ) 	return;
    if (victim->pcdata->timer[TIMER_DEATH] > 0) return;
    if (victim->level >= LEVEL_ARCHMAGE) 	return;
    if (victim->trust >= LEVEL_ARCHMAGE)	return;
    if ((IS_CLASS(victim, CLASS_VAMPIRE) || IS_CLASS(victim, CLASS_WEREWOLF)
	|| IS_CLASS(victim, CLASS_DEMON) ) 
	&& victim->pcdata->stats[UNI_GEN] < 3)	return;

    rolled = number_percent();

    /* Change the chance calculation to your liking... */
    chance = UMAX(1, number_range(1,60));
    chance = UMIN ( chance, 45 );

/*    sprintf(buf, "Chance: %d, Rolled: %d", chance, rolled);
    log_string(buf, 0); */
    
    if ( rolled < chance)
    {
	save_char_obj_backup(victim); 
	clear_stats(victim);
	unclass(victim);
	victim->class = CLASS_HIGHLANDER;
	victim->level = LEVEL_AVATAR;
	victim->trust = 0;

        sprintf(buf,"Fate rescues %s from mortal death!",victim->name);
        sprintf(log_buf, "%s becomes highlanderrific.", victim->name);

        send_to_char("Fate rescues you from mortality, you are a highlander!\n\r", victim);
        log_string(log_buf, victim->in_room->vnum);
        do_info(victim, buf);

        obj = create_object( get_obj_index( OBJ_VNUM_KATANA ), 0 );
        free_string(obj->name);
        sprintf(buf, "%s highlander katana", victim->name);
        obj->name = str_dup(buf);
        free_string(obj->short_descr);
        sprintf(buf,"%s's gleaming katana",victim->name);
        obj->short_descr = str_dup(buf);
	free_string(obj->questowner);
        sprintf(buf, "%s", victim->name);
        obj->questowner = str_dup(buf);
        obj_to_char(obj, victim);

	save_char_obj(victim);

    } 


}

void highlander_regen( CHAR_DATA *ch, int heal_factor )
{

    int level = 23 - ch->pcdata->powers[HPOWER_TRAINED] - heal_factor;

    if (!IS_HERO(ch))
    {
	return;
    }

    if ( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana &&
	 ch->move >= ch->max_move )
	return;
  
    if ( ch->hit < 1 )
    {
	ch->hit = ch->hit + number_range(2,4);
	update_pos(ch);
    }
    else if (ch->position == POS_SLEEPING)
    {
	ch->hit = UMIN ( ch->hit + (ch->max_hit - ch->hit) / level, 
	    ch->max_hit);

	ch->mana = UMIN (ch->mana + (ch->max_mana - ch->mana) / level,
	    ch->max_mana);

	ch->move = UMIN (ch->move + (ch->max_move - ch->move) / level, 
	    ch->max_move);

	if ( ch->hit >= ch->max_hit && ch->mana >= ch->max_mana && ch->move >= ch->max_move )
	    send_to_char("Your body has completely regenerated itself.\n\r",ch);
    }
    else if ( (ch->hit / ch->max_hit) < 0.15 )
    {
	werewolf_regen(ch, 3);
    }
    else
	werewolf_regen(ch, 2);
 
    return;

}

void do_hire ( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *victim;
    bool can_hire = FALSE;
    char arg[MAX_INPUT_LENGTH];

    if (IS_NPC(ch)) return;

    if ( ch->pcdata->stats[UNI_GEN] == 2 ) 	can_hire = TRUE;
    else if ( IS_SET(ch->special, SPC_PRINCE) )	can_hire = TRUE;
    else if ( IS_CLASS(ch, CLASS_DEMON) &&
	( ch->pcdata->stats[UNI_GEN] == 3 ) )	can_hire = TRUE;

    if ( strlen(ch->clan) < 2 )			can_hire = FALSE;

    if (!can_hire)
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }

    one_argument(argument, arg);

    if (arg[0] == '\0')
    {
	send_to_char("Whom do you wish to hire?\r\n", ch);
	return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( !IS_CLASS(victim, CLASS_HIGHLANDER) )
    {
	send_to_char( "You can only hire highlanders as mercenaries.\r\n", ch);
	return;

    }

    if ( strlen(victim->clan) > 1 )
    {
	send_to_char( "They appear to be employed already.\r\n", ch);
	return;
    }

    if ( !IS_IMMUNE(victim, IMM_HIGHLANDER) )
    {
	send_to_char( "They are not available for employment.\r\n", ch);
	return;
    }

    free_string(victim->clan);
    victim->clan = str_dup (ch->clan);

    act("$N hires you as a mercenary for $s clan.", ch, NULL, victim, TO_VICT);
    act("You hire $N as a mercenary for your clan.", ch, NULL, victim, TO_CHAR);

    return;
}

void do_fire ( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];
    CHAR_DATA *victim;

    if (IS_CLASS(ch, CLASS_HIGHLANDER) )
    {
	send_to_char("Use RETIRE to leave your clan.\r\n", ch);
	return;
    }

    if (IS_CLASS(ch, CLASS_VAMPIRE) && (ch->pcdata->stats[UNI_GEN] > 2 ||
	!IS_SET(ch->special, SPC_PRINCE) ) )
    {
	send_to_char("Only clan leaders can fire mercenaries.\r\n", ch);
	return;
    }

    if (IS_CLASS(ch, CLASS_WEREWOLF) && (ch->pcdata->stats[UNI_GEN] > 2 ||
	!IS_SET(ch->special, SPC_PRINCE) ) )
    {
	send_to_char("Only clan leaders can fire mercenaries.\r\n", ch);
	return;
    }

    if (IS_CLASS(ch, CLASS_DEMON) && ch->pcdata->stats[UNI_GEN] > 3)
    {
	send_to_char("Only clan leaders can fire mercenaries.\r\n", ch);
	return;
    }

    one_argument(argument, arg);

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if (str_cmp(ch->clan, victim->clan))
    {
	send_to_char("You can only fire your clan's mercenaries.\r\n", ch);
	return;
    }

    free_string(victim->clan);
    victim->clan = str_dup("");

    act("$N fires you from your mercenary duties.", ch, NULL, victim, TO_VICT);
    act("You fire $n from their mercenary duties.", ch, NULL, victim, TO_CHAR);

    if ( get_room_index(victim->home) == NULL ||
        get_room_index(victim->home)->sector_type == SECT_HQ )
        victim->home = ROOM_VNUM_TEMPLE;

    if (victim->in_room->sector_type == SECT_HQ)
	do_recall(victim, "");

    return;
}

void do_retire ( CHAR_DATA *ch, char *argument )
{
    char arg[MAX_INPUT_LENGTH];

    if (!IS_CLASS(ch, CLASS_HIGHLANDER))
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }

    if (ch->clan[0] == '\0')
    {
	send_to_char("You aren't even a mercenary!\r\n", ch);
	return;
    }

    one_argument(argument, arg);

    if (str_cmp(ch->clan, arg) || arg[0] == '\0')
    {
	send_to_char("Syntax is: retire <clan>\r\n", ch);
	return;
    }

    free_string(ch->clan);
    ch->clan = str_dup("");

    act("You retire from your mercenary duties.", ch, NULL, NULL, TO_CHAR);

    if ( get_room_index(ch->home) == NULL ||
        get_room_index(ch->home)->sector_type == SECT_HQ )
        ch->home = ROOM_VNUM_TEMPLE;

    if (ch->in_room->sector_type == SECT_HQ)
	do_recall(ch, "");

    return;
}

void do_highskills ( CHAR_DATA *ch, char *argument )
{
    char buf [MAX_STRING_LENGTH];
    char arg [MAX_INPUT_LENGTH];

    if (IS_NPC(ch)) return;

    if (!IS_CLASS(ch, CLASS_HIGHLANDER) )
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }

    one_argument(argument, arg);

    if (!str_cmp(arg,"improve"))
    {
	if (ch->practice < 100)
 	{
	    send_to_char("It costs 100 primal to improve your skills.\r\n", ch);
	    return;
	}

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 
	    ch->pcdata->powers[HPOWER_MASTERED] )
	{
	    send_to_char("You are not ready to advance your training.\r\n", ch);
	    return;
	}
	
	ch->pcdata->powers[HPOWER_TRAINED]++;
	ch->practice -= 100;
	send_to_char("Ok.\r\n", ch);	
	return;
    }
    else
    {
	send_to_char("		-= Highlander Skills =-\r\n", ch);
	send_to_char("Type \"highskills improve\" to advance.\r\n", ch);

	sprintf(buf, "Magical resistance: %d\r\n", char_save(ch) );
	send_to_char(buf, ch);

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 1)
	{
	    send_to_char("TRUESIGHT: Your vision is greatly enhanced.\r\n", ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 1)
 	{
	    send_to_char("Truesight.\r\n", ch);
	}

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 2)
	{
	    send_to_char("TRUESENSE: You can sense the presence of nearby immortals.\r\n", ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 2)
	{
	    send_to_char("Truesense.\r\n", ch);
	}

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 3)
	{
	    send_to_char("STRENGTH: Your skill enables you to hit with deadly accuracy.\r\n", ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 3)
	{
	    send_to_char("Strength.\r\n", ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 4)
	{
	    send_to_char("ONENESS: You feel a oneness with all life, soothing their hostility.\r\n", ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 4)
	{
	    send_to_char(" Oneness.\r\n", ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 5)
	{
	    send_to_char("FORGE: Weapons of any type can become powerful in your hands.\r\n", ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 5)
	{
	    send_to_char("Forge.\r\n", ch);
	}

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 6)
	{
	    send_to_char("DISARM: You can disarm opponents even if they are immune.\r\n", ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 6)
	{
	    send_to_char("Disarm.\r\n", ch);
	}

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 7)
	{
	    send_to_char("AGILITY: Increased ability to dodge blows and kicks.\r\n",ch);
	}
	else if (ch->pcdata->powers[HPOWER_MASTERED] >= 7)
	{
	    send_to_char("Agility.\r\n", ch);
	}

	if (ch->pcdata->powers[HPOWER_TRAINED] >= 8)
	{
	    send_to_char("Under construction.\r\n", ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 9)
	{
	    sprintf(buf,"Under construction.\r\n");
	    send_to_char(buf, ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 10)
	{
	    sprintf(buf,"Under construction.\r\n");
	    send_to_char(buf, ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 11)
	{
	    sprintf(buf,"Under construction.\r\n");
	    send_to_char(buf, ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 12)
	{
	    sprintf(buf,"Under construction.\r\n");
	    send_to_char(buf, ch);
	}
	if (ch->pcdata->powers[HPOWER_TRAINED] >= 13)
	{
	    sprintf(buf,"Under construction.\r\n");
	    send_to_char(buf, ch);
	}

    }

    return;
}


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

    one_argument(argument, arg);

    if (!IS_CLASS(ch, CLASS_HIGHLANDER) )
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }


    if (ch->pcdata->powers[HPOWER_TRAINED] < 5)
    {
	send_to_char("You are not that skilled.\r\n", ch);
	return;
    }

    if (!IS_HERO(ch))
    {
	send_to_char("Huh?\r\n", ch);
	return;
    }

    if ( (obj = get_obj_carry(ch, arg) ) == NULL )
    {
	send_to_char("You aren't carrying that.\r\n", ch);
	return;
    }

    if ( obj->item_type != ITEM_WEAPON )
    {
	send_to_char("You can only forge your soul into weapons.\r\n", ch);
	return;
    }

    if ( IS_SET(obj->spectype, SITEM_HIGHLANDER) )
    {
	send_to_char("A part of someone's soul is already forged into it.\r\n", ch);
	return;
    }

    if ( str_cmp(ch->name, obj->questowner) )
    {
	send_to_char("Only on something you own.\r\n", ch);
	return;
    }

    SET_BIT(obj->spectype, SITEM_HIGHLANDER);
    send_to_char("Ok.\r\n", ch);
    return;
}