/
/***************************************************************************
 *  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
 *  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
 *                                                                         *
 *  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
 *  Chastain, Michael Quan, and Mitchell Tse.                              *
 *                                                                         *
 *  Envy Diku Mud improvements copyright (C) 1994 by Michael Quan, David   *
 *  Love, Guilherme 'Willie' Arnold, and Mitchell Tse.                     *
 *                                                                         *
 *  EnvyMud 2.0 improvements copyright (C) 1995 by Michael Quan and        *
 *  Mitchell Tse.                                                          *
 *                                                                         *
 *  In order to use any part of this Envy Diku Mud, you must comply with   *
 *  the original Diku license in 'license.doc', the Merc license in        *
 *  'license.txt', as well as the Envy license in 'license.nvy'.           *
 *  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.                                                  *
 ***************************************************************************/

/*
 * This code is (C) 1996 The Maniac,
 * Do whatever you want with it, but keep my name in it,
 * and mention that this code is written by me somewhere in
 * your mud...		-=Greetz The Maniac=-
 */

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

/*
 * Lookup a language by name.
 */
int lang_lookup( const char *name )
{
    int ln;

    for ( ln = 0; ln < MAX_LANGUAGE; ln++ )
    {
        if ( !lang_table[ln].name )
            break;
        if ( LOWER( name[0] ) == LOWER( lang_table[ln].name[0] )
            && !str_prefix( name, lang_table[ln].name ) )
            return ln;
    }

    return -1;
}

void do_speak( CHAR_DATA *ch, char *argument )
{
	char	arg [ MAX_INPUT_LENGTH ];
	char	buf [ MAX_STRING_LENGTH];
	int	speaking;
	int	canspeak;

	argument = one_argument(argument, arg);

	buf[0] = '\0';

	if (IS_NPC(ch))
	{
		send_to_char ("Mobiles can't speak !\n\r", ch);
		return;
	}

	if (arg[0] == '\0')
	{
		sprintf (buf, "You currently speak %s.\n\r", lang_table[ch->pcdata->speaking].name);
		send_to_char (buf, ch);
	}
	else
	{
		if ((speaking = lang_lookup(arg)) != -1)
		{
			if ((canspeak = ch->pcdata->language[speaking]) == 0)
			{
				sprintf (buf, "But you don't know how to speak %s.\n\r", lang_table[speaking].name);
				send_to_char(buf, ch);
			}
			else
			{
				ch->pcdata->speaking = speaking;
				sprintf (buf, "You will speak %s from now on.\n\r", lang_table[ch->pcdata->speaking].name);
				send_to_char(buf, ch);
			}
		}
		else
		{
			sprintf (buf, "%s is not a valid language!\n\r", arg);
			send_to_char( buf, ch);
		}
	}
}
		
void do_lset( CHAR_DATA *ch, char *argument )
{
    CHAR_DATA *rch;
    CHAR_DATA *victim;
    char       arg1  [ MAX_INPUT_LENGTH ];
    char       arg2  [ MAX_INPUT_LENGTH ];
    char       arg3  [ MAX_INPUT_LENGTH ];
    int        value;
    int        ln;
    bool       fAll;
/*
    rch = get_char( ch );
*/

    rch = ch; 
/*
    if ( !authorized( rch, "lset" ) )
        return;
*/
    argument = one_argument( argument, arg1 );
    argument = one_argument( argument, arg2 );
    one_argument( argument, arg3 );

    if ( arg1[0] == '\0' || arg2[0] == '\0' || arg3[0] == '\0' )
    {
        send_to_char( "Syntax: lset <victim> <lang> <value>\n\r",	ch );
        send_to_char( "or:     lset <victim> all    <value>\n\r",	ch );
        send_to_char( "Lang being any language.\n\r",			ch );
        return;
    }

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

    if ( IS_NPC( victim ) )
    {
        send_to_char( "Not on NPC's.\n\r", ch );
        return;
    }

    if ( ch->level <= victim->level && ch != victim )
    {
        send_to_char( "You may not lset your peer nor your superior.\n\r", ch );
        return;
    }

    fAll = !str_cmp( arg2, "all" );
    ln   = 0;
    if ( !fAll && ( ln = lang_lookup( arg2 ) ) < 0 )
    {
        send_to_char( "No such language.\n\r", ch );
        return;
    }

    /*
     * Snarf the value.
     */
    if ( !is_number( arg3 ) )
    {
        send_to_char( "Value must be numeric.\n\r", ch );
        return;
    }

    value = atoi( arg3 );
    if ( value < 0 || value > 100 )
    {
        send_to_char( "Value range is 0 to 100.\n\r", ch );
        return;
    }

    if ( fAll )
    {
		/* L_SEN before*/
        if ( get_trust( ch ) < 50 )
        {
            send_to_char( "Only Seniors may lset all.\n\r", ch );
            return;
        }
        for ( ln = 0; ln < MAX_LANGUAGE; ln++ )
            if ( lang_table[ln].name )
                victim->pcdata->language[ln] = value;
    }
    else
    {
        victim->pcdata->language[ln] = value;
    }
    return;
}

void do_lstat( CHAR_DATA *ch, char *argument )
/* lstat by Maniac && Canth */
{
    CHAR_DATA *victim;
    char arg[MAX_INPUT_LENGTH];
    char buf1[MAX_STRING_LENGTH];
    char buf2[MAX_STRING_LENGTH];
    int ln;
    int col;

    one_argument( argument, arg );
    col = 0;

    if ( arg[0] == '\0' )
    {
        send_to_char("lstat whom\n\r?", ch);
        return;
    }

    if ( ( victim = get_char_world( ch, arg ) ) == NULL )
    {
        send_to_char("That person isn't logged on.\n\r", ch);
        return;
    }

    if ( IS_NPC( victim ) )
    {
        send_to_char("Not on NPC's.\n\r", ch);
        return;
    }

    buf2[0] = '\0';

    for ( ln = 0; ln < MAX_LANGUAGE ; ln++ )
    {
        if ( lang_table[ln].name == NULL )
            break;
        sprintf( buf1, "%18s %3d %% ", lang_table[ln].name,
                victim->pcdata->language[ln] );
        strcat( buf2, buf1 );
        if ( ++col %3 == 0 )
            strcat( buf2, "\n\r" );
    }
    if ( col % 3 != 0 )
         strcat( buf2, "\n\r" );
    sprintf( buf1, "%s has %d learning sessions left.\n\r", victim->name,
                victim->pcdata->learn );
    strcat( buf2, buf1 );

    send_to_char( buf2, ch );
    return;

}

void do_learn( CHAR_DATA *ch, char *argument )
{
    char buf  [ MAX_STRING_LENGTH   ];
    char buf1 [ MAX_STRING_LENGTH*2 ];
    int  ln;
    int  money = ch->level * ch->level * 20;

    if ( IS_NPC( ch ) )
        return;

    buf1[0] = '\0';

    if ( ch->level < 3 )
    {
        send_to_char(
            "You must be third level to learn languages.\n\r",
            ch );
        return;
    }

    if ( argument[0] == '\0' )
    {
        CHAR_DATA *mob;
        int        col;

        for ( mob = ch->in_room->people; mob; mob = mob->next_in_room )
        {
/*	COMMENTED OUT WHO KNOWS

            if ( mob->deleted )
                continue;
*/
            if ( IS_NPC( mob ) && IS_SET( mob->act, ACT_GAIN ) )
                break;
        }

        col    = 0;
        for ( ln = 0; ln < MAX_LANGUAGE; ln++ )
        {
            if ( !lang_table[ln].name )
                break;

            if ( ( mob ) || ( ch->pcdata->language[ln] > 0 ) )
            {
                sprintf( buf, "%18s %3d%%  ",
                        lang_table[ln].name, ch->pcdata->language[ln] );
                strcat( buf1, buf );
                if ( ++col % 3 == 0 )
                    strcat( buf1, "\n\r" );
            }
        }

        if ( col % 3 != 0 )
            strcat( buf1, "\n\r" );

        sprintf( buf, "You have %d learning sessions left.\n\r",
                ch->pcdata->learn);
        strcat( buf1, buf );
        sprintf( buf, "Cost of lessons is %d gold coins.\n\r", money );
        strcat( buf1, buf );
        send_to_char( buf1, ch );
    }
    else
    {
        CHAR_DATA *mob;
        int        adept=0;

        if ( !IS_AWAKE( ch ) )
        {
            send_to_char( "In your dreams, or what?\n\r", ch );
            return;
        }

        for ( mob = ch->in_room->people; mob; mob = mob->next_in_room )
        {
/*         
            if ( mob->deleted )
                continue;
*/            
            if ( IS_NPC( mob ) && IS_SET( mob->act, ACT_GAIN ) )
                break;
        }

        if ( !mob )
        {
            send_to_char( "You can't do that here.\n\r", ch );
            return;
        }

        if ( ch->pcdata->learn <= 0 )
        {
            send_to_char( "You have no lessons left.\n\r", ch );
            return;
        }
        else if ( money > ch->gold )
        {
            send_to_char( "You don't have enough money to take lessons.\n\r", ch );
            return;
        }

        if (( ln = lang_lookup( argument ) ) < 0)
        {
            send_to_char( "You can't practice that.\n\r", ch );
            return;
        }

/* Max learned = int*5 */
/*
        adept = (get_curr_int(ch) * 5);		
*/
        if ( ch->pcdata->language[ln] >= adept )
        {
            sprintf( buf, "You are already fluent in %s.\n\r",
                lang_table[ln].name );
            send_to_char( buf, ch );
        }
        else
        {
            ch->pcdata->learn--;
            ch->gold                -= money;
/*
            ch->pcdata->language[ln] += int_app[get_curr_int( ch )].learn;
*/
            if ( ch->pcdata->language[ln] < adept )
            {
                act( "You take lessons in $T.",
                    ch, NULL, lang_table[ln].name, TO_CHAR );
                act( "$n practices $T.",
                    ch, NULL, lang_table[ln].name, TO_ROOM );
            }
            else
            {
                ch->pcdata->language[ln] = adept;
                act( "You are now fluent in $T.",
                    ch, NULL, lang_table[ln].name, TO_CHAR );
                act( "$n is now fluent in $T.",
                    ch, NULL, lang_table[ln].name, TO_ROOM );
            }
        }
    }
    return;
}

void do_common( CHAR_DATA *ch, char *argument)
{
	do_language(ch, argument, COMMON);
}

void do_human( CHAR_DATA *ch, char *argument)
{
	do_language(ch,argument, HUMAN);
}

void do_dwarvish( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, DWARVISH);
}

void do_elvish( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, ELVISH);
}

void do_gnomish( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, GNOMISH);
}

void do_goblin( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, GOBLIN);
}

void do_orcish( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, ORCISH);
}

void do_ogre( CHAR_DATA *ch, char *argument)
{
	do_language(ch,argument, OGRE);
}

void do_drow( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, DROW);
}

void do_kobold( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, KOBOLD);
}

void do_trollish( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, TROLLISH);
}

void do_hobbit( CHAR_DATA *ch, char *argument)
{
        do_language(ch,argument, HOBBIT);
}

/* ========== Language ======================== */
void do_language( CHAR_DATA *ch, char *argument, int language)
{
	CHAR_DATA	*och;
	int		chance;
	int		chance2;
	char		*lan_str;
	char		buf	[ 256 ];

	lan_str = lang_table[language].name;

	buf[0] = '\0';
	/* Now find out if we can speak it... */
	if((chance = ch->pcdata->language[language]) == 0)
	{
		sprintf(buf, "You don't know how to speak %s.\n\r", lan_str);
		send_to_char(buf ,ch);
		return;
	}

	if(argument[0] == '\0')
	{
		buf[0] = '\0';
		sprintf(buf, "Say WHAT in %s ??\n\r", lan_str);
		send_to_char(buf ,ch);
		return;
	}

	if (!IS_NPC(ch))

/*
		argument = makedrunk(argument,ch);
*/
	if(number_percent( ) <= chance )
	{
	   buf[0] = '\0';
	   sprintf (buf,"In %s, you say '%s'\n\r", lan_str, argument);
	   send_to_char(buf, ch);
	   for(och = ch->in_room->people; och != NULL; och = och->next_in_room )
	   {
            if(!IS_NPC(och) && (och != ch))
	    {
	    if((chance2 = och->pcdata->language[language]) == 0)
	      act("$n says something in a strange tongue.",ch,NULL,och,TO_VICT);
	    else
		if(number_percent( ) <= chance2)
		{
		   buf[0] = '\0';
		   sprintf (buf, "In %s, %s says, '%s'\n\r", lan_str, ch->name, argument);
		   send_to_char(buf, och);
		}
		else
		{
		   buf[0] = '\0';
		   sprintf (buf, "In %s, %s says something you can't understand.\n\r", lan_str, ch->name);
		   send_to_char(buf, och);
		}
             }
	   }
	}
	else
	{
	   buf[0] = '\0';
	   sprintf (buf, "In %s, you try to say '%s', but it doesn't sound correct.\n\r", lan_str, argument);
	   send_to_char(buf, ch);
           for(och = ch->in_room->people; och != NULL; och = och->next_in_room )
           {
            if(!IS_NPC(och) && (och != ch))
            {
            if((chance2 = och->pcdata->language[language]) == 0)
              act("$n says something in a strange tongue.",ch,NULL,och,TO_VICT);
	    else
                if(number_percent( ) <= chance2)
		{
		   buf[0] = '\0';
		   sprintf (buf, "In a weird form of %s, %s says something uncomprehensible.\n\r", lan_str, ch->name);
                   send_to_char(buf, och);
		}
                else
		{
		   buf[0] = '\0';
		   sprintf (buf, "In %s, %s says something you can't understand.\n\r", lan_str, ch->name);
		   send_to_char(buf, och);
		}
             }
           }
	}
}