/*************************************************************************** * 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); } } } } }