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

Star Wars Life 3.0a
Diplomatic Skills

For credits see 'help credits' in game

(c) 2001, 2002 FRPG Inc.
All Rights Reserved

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

#include <math.h> 
#include <sys/types.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "mud.h"


void do_smalltalk ( CHAR_DATA *ch , char *argument )
{
    char buf  [MAX_STRING_LENGTH];
    char arg1 [MAX_INPUT_LENGTH];
    CHAR_DATA *victim = NULL;
    PLANET_DATA *planet = NULL;
    CLAN_DATA   *clan = NULL;
    int percent, xp;
    
    if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
    {
        send_to_char( "What would be the point of that.\n\r", ch );
        return;
    }
    
    argument = one_argument( argument, arg1 );

    if ( ch->mount )
    {
	send_to_char( "You can't do that while mounted.\n\r", ch );
	return;
    }

    if ( arg1[0] == '\0' )
    {
	send_to_char( "Create smalltalk with whom?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char( "That's pointless.\n\r", ch );
	return;
    }

    if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
    {
	set_char_color( AT_MAGIC, ch );
	send_to_char( "This isn't a good place to do that.\n\r", ch );
	return;
    }

    if ( ch->position == POS_FIGHTING )
    {
        send_to_char( "Interesting combat technique.\n\r" , ch );
        return;
    }
    
    if ( victim->position == POS_FIGHTING )
    {
        send_to_char( "They're a little busy right now.\n\r" , ch );
        return;
    }
    

    if ( !IS_NPC(victim) || victim->vip_flags == 0 )
    {
        send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
        return;
    }
    
    if ( ch->position <= POS_SLEEPING )
    {
        send_to_char( "In your dreams or what?\n\r" , ch );
        return;
    }
    
    if ( victim->position <= POS_SLEEPING )
    {
        send_to_char( "You might want to wake them first...\n\r" , ch );
        return;
    }

    WAIT_STATE( ch, skill_table[gsn_smalltalk]->beats );

    if ( percent - ch->skill_level[DIPLOMACY_ABILITY] + victim->top_level > ch->pcdata->learned[gsn_smalltalk]  ) 
    {
	/*
	 * Failure.
	 */
	send_to_char( "You attempt to make smalltalk with them.. but are ignored.\n\r", ch );
	act( AT_ACTION, "$n is really getting on your nerves with all this chatter!\n\r", ch, NULL, victim, TO_VICT    );
	act( AT_ACTION, "$n asks $N about the weather but is ignored.\n\r",  ch, NULL, victim, TO_NOTVICT );

        if ( victim->alignment < -500 && victim->top_level >= ch->top_level+5 )
	{
	  sprintf( buf, "SHUT UP %s!", ch->name );
	  do_yell( victim, buf );
          global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
	}
	
	return;
    }
    
    send_to_char( "You strike up a short conversation with them.\n\r", ch );
    act( AT_ACTION, "$n smiles at you and says, 'hello'.\n\r", ch, NULL, victim, TO_VICT    );
    act( AT_ACTION, "$n chats briefly with $N.\n\r",  ch, NULL, victim, TO_NOTVICT );
    
    if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
      return;
    
    if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
       clan = ch->pcdata->clan;
       
    planet = ch->in_room->area->planet;
    
    if ( clan != planet->governed_by )
       return;
       
    planet->pop_support += 0.2;
    send_to_char( "Popular support for your organization increases slightly.\n\r", ch );
    xp = 1000 + victim->top_level * 50, DIPLOMACY_ABILITY;
    xp = UMIN(xp, exp_level(ch->skill_level[DIPLOMACY_ABILITY]+1) - exp_level(ch->skill_level[DIPLOMACY_ABILITY]));         
    gain_exp(ch, xp, DIPLOMACY_ABILITY);
    ch_printf( ch , "You gain %d diplomacy experience.\n\r", xp );
    
    learn_from_success( ch, gsn_smalltalk );
        
    if ( planet->pop_support > 100 )
        planet->pop_support = 100;
}

void do_propeganda ( CHAR_DATA *ch , char *argument )
{
    char buf  [MAX_STRING_LENGTH];
    char arg1 [MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    PLANET_DATA *planet;
    CLAN_DATA   *clan;
    int percent, xp;
    
   if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
   {
       send_to_char( "What would be the point of that.\n\r", ch );
       return;
   }
    
    argument = one_argument( argument, arg1 );

    if ( ch->mount )
    {
	send_to_char( "You can't do that while mounted.\n\r", ch );
	return;
    }

    if ( arg1[0] == '\0' )
    {
	send_to_char( "Spread propeganda to who?\n\r", ch );
	return;
    }

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

    if ( victim == ch )
    {
	send_to_char( "That's pointless.\n\r", ch );
	return;
    }

    if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
    {
	set_char_color( AT_MAGIC, ch );
	send_to_char( "This isn't a good place to do that.\n\r", ch );
	return;
    }

    if ( ch->position == POS_FIGHTING )
    {
        send_to_char( "Interesting combat technique.\n\r" , ch );
        return;
    }
    
    if ( victim->position == POS_FIGHTING )
    {
        send_to_char( "They're a little busy right now.\n\r" , ch );
        return;
    }
    

    if ( victim->vip_flags == 0 )
    {
        send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
        return;
    }
    
    if ( ch->position <= POS_SLEEPING )
    {
        send_to_char( "In your dreams or what?\n\r" , ch );
        return;
    }
    
    if ( victim->position <= POS_SLEEPING )
    {
        send_to_char( "You might want to wake them first...\n\r" , ch );
        return;
    }

    if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
       clan = ch->pcdata->clan;
       
    planet = ch->in_room->area->planet;
        
    sprintf( buf, ", and the evils of %s" , planet->governed_by ? planet->governed_by->name : "their current leaders" );
    ch_printf( ch, "You speak to them about the benifits of the %s%s.\n\r", ch->pcdata->clan->name,
        planet->governed_by == clan ? "" : buf );
    act( AT_ACTION, "$n speaks about his organization.\n\r", ch, NULL, victim, TO_VICT    );
    act( AT_ACTION, "$n tells $N about their organization.\n\r",  ch, NULL, victim, TO_NOTVICT );

    WAIT_STATE( ch, skill_table[gsn_propeganda]->beats );

    if ( percent - get_curr_cha(ch) + victim->top_level > ch->pcdata->learned[gsn_propeganda]  ) 
    {

        if ( planet->governed_by != clan )
	{
	  sprintf( buf, "%s is a traitor!" , ch->name);
	  do_yell( victim, buf );
          global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
	}
	
	return;
    }
    
    if ( planet->governed_by == clan )
    { 
	if (ch->subclass == SUBCLASS_SENATOR)
       planet->pop_support += .5 + ch->top_level/50 * 2 ;
	else
       planet->pop_support += .5 + ch->top_level/50;
       send_to_char( "Popular support for your organization increases.\n\r", ch );
    }     
    else
    {
	if (ch->subclass == SUBCLASS_SENATOR)
       planet->pop_support -= .5 + ch->top_level/50 * 2 ;
	else
       planet->pop_support -= .5 + ch->top_level/50;
       send_to_char( "Popular support for the current government decreases.\n\r", ch );
    }

    xp = 2500 + victim->top_level * 100;
    xp = UMIN(xp, exp_level(ch->skill_level[DIPLOMACY_ABILITY]+1) - exp_level(ch->skill_level[DIPLOMACY_ABILITY]));    
    gain_exp(ch, xp, DIPLOMACY_ABILITY);
    ch_printf( ch , "You gain %d diplomacy experience.\n\r", xp );
    
    learn_from_success( ch, gsn_propeganda );
        
    if ( planet->pop_support > 100 )
        planet->pop_support = 100;
    if ( planet->pop_support < -100 )
        planet->pop_support = -100;

}

void do_bribe ( CHAR_DATA *ch , char *argument )
{
    char arg1 [MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    PLANET_DATA *planet;
    CLAN_DATA   *clan;
    int percent, amount;
    
    if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
    {
      send_to_char( "What would be the point of that.\n\r", ch );
      return;
    }
    
    argument = one_argument( argument, arg1 );

    if ( ch->mount )
    {
	send_to_char( "You can't do that while mounted.\n\r", ch );
	return;
    }

    if ( argument[0] == '\0' )
    {
	send_to_char( "Bribe who how much?\n\r", ch );
	return;
    }

    amount = atoi( argument );
    
    if(amount > ch->gold)
    {
       send_to_char("You don't have that much to bribe with.\n\r", ch);
       return;
    }
    if ( ( victim = get_char_room( ch, arg1 ) ) == NULL )
    {
	send_to_char( "They aren't here.\n\r", ch );
	return;
    }

    if ( victim == ch )
    {
	send_to_char( "That's pointless.\n\r", ch );
	return;
    }

    if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
    {
	set_char_color( AT_MAGIC, ch );
	send_to_char( "This isn't a good place to do that.\n\r", ch );
	return;
    }

    if ( amount <= 0 )
    {
       	send_to_char( "A little bit more money would be a good plan.\n\r", ch );
	return;
    }
    
    if ( ch->position == POS_FIGHTING )
    {
        send_to_char( "Interesting combat technique.\n\r" , ch );
        return;
    }
    
    if ( victim->position == POS_FIGHTING )
    {
        send_to_char( "They're a little busy right now.\n\r" , ch );
        return;
    }
    
    if ( ch->position <= POS_SLEEPING )
    {
        send_to_char( "In your dreams or what?\n\r" , ch );
        return;
    }
    
    if ( victim->position <= POS_SLEEPING )
    {
        send_to_char( "You might want to wake them first...\n\r" , ch );
        return;
    }

    if ( victim->vip_flags == 0 )
    {
        send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
        return;
    }
    
    ch->gold -= amount;
/* Old version, players shouldn't get money back by killing 
    victim->gold += amount; 
    Give it to the economy instead. */ 
    boost_economy(ch->in_room->area, amount);

	ch_printf( ch, "You give them a small gift on behalf of %s.\n\r", ch->pcdata->clan->name );
	act( AT_ACTION, "$n offers you a small bribe.\n\r", ch, NULL, victim, TO_VICT    );
	act( AT_ACTION, "$n gives $N some money.\n\r",  ch, NULL, victim, TO_NOTVICT );

    if ( !IS_NPC( victim ) )
	return;
    
    WAIT_STATE( ch, skill_table[gsn_bribe]->beats );

    if ( percent - amount + victim->top_level > ch->pcdata->learned[gsn_bribe]  ) 
    {
       learn_from_failure(ch, gsn_bribe);
       return;
    }       
    if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
       clan = ch->pcdata->clan;
       
    planet = ch->in_room->area->planet;
        
    if ( clan == planet->governed_by )
    {
      planet->pop_support += URANGE( 0.1 , amount/1000 , 2 );
      send_to_char( "Popular support for your organization increases slightly.\n\r", ch );
      if ( planet->pop_support > 100 )
        planet->pop_support = 100;
    }
    else
    {
      planet->pop_support -= URANGE( 0.1, amount/1000 , 2 );
      send_to_char( "Popular support for the current government decreases slightly.\n\r", ch);
      if ( planet->pop_support < -100)
         planet->pop_support = -100;
    }
    amount = UMIN(amount, exp_level(ch->skill_level[DIPLOMACY_ABILITY]+1) - exp_level(ch->skill_level[DIPLOMACY_ABILITY]));
    gain_exp(ch, amount , DIPLOMACY_ABILITY);
    ch_printf( ch , "You gain %d diplomacy experience.\n\r", amount );
    learn_from_success( ch, gsn_bribe );
    return;
}

void do_seduce ( CHAR_DATA *ch , char *argument )
{
    send_to_char( "This command does not work, please do NOT use it!!!!\n\r", ch);
    return;
}

void do_mass_propeganda ( CHAR_DATA *ch , char *argument )
{
    char buf [MAX_STRING_LENGTH];
    char arg1 [MAX_INPUT_LENGTH];
    CHAR_DATA *victim;
    PLANET_DATA *planet;
    CLAN_DATA   *clan;
    int percent, xp;

   if ( IS_NPC(ch) || !ch->pcdata || !ch->pcdata->clan || !ch->in_room->area || !ch->in_room->area->planet )
   {
      send_to_char( "What would be the point of that?\n\r", ch );
      return;
   }

    argument = one_argument( argument, arg1 );

    if ( ch->mount )
    {
      send_to_char( "You can't do that while mounted.\n\r", ch );
      return;
    }

    if ( arg1[0] == '\0' )
    {
      send_to_char( "Spread mass propeganda to whom?\n\r", ch );
      return;
    }

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

    if ( victim == ch )
    {
      send_to_char( "That's pointless.\n\r", ch );
      return;
    }

    if ( IS_SET( ch->in_room->room_flags, ROOM_SAFE ) )
    {
      set_char_color( AT_MAGIC, ch );
      send_to_char( "This isn't a good place to do that.\n\r", ch );
      return;
    }

    if ( ch->position == POS_FIGHTING )
    {
      send_to_char( "Interesting combat technique.\n\r", ch );
      return;
    }

    if ( victim->position == POS_FIGHTING )
    {
       send_to_char( "They're a little busy right now.\n\r" , ch );
       return;
    }

    if ( victim->vip_flags == 0 )
    {
       send_to_char( "Diplomacy would be wasted on them.\n\r" , ch );
       return;
    }

    if ( ch->position <= POS_SLEEPING )
    {
       send_to_char( "In your dreams or what?\n\r" , ch );
       return;
    }

    if ( victim->position <= POS_SLEEPING )
    {
       send_to_char( "You might want to wake them first...\n\r" , ch );
       return;
    }

    if ( ( clan = ch->pcdata->clan->mainclan ) == NULL )
       clan = ch->pcdata->clan;

    planet = ch->in_room->area->planet;

    sprintf( buf, ", and the evils of %s" , planet->governed_by ? planet->governed_by->name : "their current leaders" );
    ch_printf( ch, "You speak to them about the benifits of the %s%s.\n\r", ch->pcdata->clan->name,
        planet->governed_by == clan ? "" : buf );
    act( AT_ACTION, "$n speaks about his organization.\n\r", ch, NULL, victim, TO_VICT    );
    act( AT_ACTION, "$n tells $N about their organization.\n\r",  ch, NULL, victim, TO_NOTVICT );

    WAIT_STATE( ch, skill_table[gsn_masspropeganda]->beats );

    if ( percent - get_curr_cha(ch) + victim->top_level > ch->pcdata->learned[gsn_masspropeganda]   )
    {

	if ( planet->governed_by != clan )
       {
	sprintf( buf, "%s is a traitor!" , ch->name);
	do_yell( victim, buf );
	  global_retcode = multi_hit( victim, ch, TYPE_UNDEFINED );
       }

       return;
    }

    if ( planet->governed_by == clan )
    {
	if (ch->subclass == SUBCLASS_SENATOR)
      planet->pop_support += 5 + ch->top_level/50 * 2;
	else
      planet->pop_support += 5 + ch->top_level/50;
      send_to_char( "Popular support for your organization increases.\n\r", ch );
    }
    else
    {
	if (ch->subclass == SUBCLASS_SENATOR)
      planet->pop_support -= 5 + ch->top_level/50 * 2;
	else
      planet->pop_support -= 5 - ch->top_level/50;
      send_to_char( "Popular support for the current government decreases.\n\r", ch );
    }

    xp = 5000 + victim->top_level * 200;
    xp = UMIN(xp, exp_level(ch->skill_level[DIPLOMACY_ABILITY]+1) - exp_level(ch->skill_level[DIPLOMACY_ABILITY]));
    gain_exp(ch, xp, DIPLOMACY_ABILITY);    
    ch_printf( ch , "You gain %d diplomacy experience.\n\r", xp );

    learn_from_success( ch, gsn_masspropeganda );

    if ( planet->pop_support > 100 )
	planet->pop_support = 100;
    if ( planet->pop_support < -100 )
	planet->pop_support = -100;
}

void do_negotiate( CHAR_DATA *ch, char *argument ) /* Made by Charles July '02 */
{
    CHAR_DATA *victim;
    AFFECT_DATA *paf;
    SKILLTYPE *skill;
    int credits;

    if ( ( victim = who_fighting( ch ) ) == NULL )
    {
        send_to_char( "&c&CYou aren't fighting anyone.\n\r", ch );
        return;
    }
    if ( IS_AFFECTED(victim, AFF_BERSERK) )
    {
       send_to_char( "&c&CYou cannot persuade them, they are in a berserking rage", ch );
       return;
    }
    if ( !IS_NPC( victim ) )
    {
       credits = victim->skill_level[COMBAT_ABILITY] * 1500;  //1.5k per combat level.//
    }
    if ( IS_NPC( victim ) )
    {
       credits = 10000; //mobs u pay 10k//
    }
    if ( ch->gold < credits )
    {
       send_to_char( "&c&CYou think smiling will make him stop fighting?", ch );
       return;
    }
    for (paf = victim->first_affect; paf; paf = paf->next)
    {
       if ( (skill=get_skilltype(paf->type)) != NULL )
       {
         if ( !str_cmp( skill->name, "rage" ) )
           send_to_char( "&c&CThey are In a rage of fury! They won't bend to your negotiations", ch );
           return;
       }
    }
    WAIT_STATE( ch, skill_table[gsn_negotiate]->beats );
    if ( IS_NPC(ch) || number_percent( ) < ch->pcdata->learned[gsn_negotiate] )
    {
        stop_fighting( victim, TRUE );
        act( AT_LBLUE, "You negotiate with $N, with credits.",  ch, NULL, victim, TO_CHAR    );
        act( AT_LBLUE, "$n negotiates with you, with credits.", ch, NULL, victim, TO_VICT    );
        act( AT_LBLUE, "$n negotiates with $N.",  ch, NULL, victim, TO_NOTVICT );
        ch->gold -= credits;
        victim->gold += credits;
        gain_exp(ch, victim->top_level * 150, DIPLOMACY_ABILITY);
        ch_printf( ch , "You gain %d diplomacy experience.\n\r", victim->top_level*150);   
        learn_from_success( ch, gsn_negotiate );
        stop_hating( victim );
        stop_hunting( victim );
        stop_fearing( victim );
    }
    else
    {
        act( AT_LBLUE, "You failed the negotiations with $N.",  ch, NULL, victim, TO_CHAR    );
        act( AT_LBLUE, "$n negotiate with you but does it poorly don't you think?", ch, NULL, victim, TO_VICT    );
        act( AT_LBLUE, "$n fails the negotiations with $N.",  ch, NULL, victim, TO_NOTVICT );
        learn_from_failure( ch, gsn_negotiate );
    }
    return;
}

void do_gather_intelligence(CHAR_DATA *ch, char *argument)
{
    AFFECT_DATA af;
    CHAR_DATA *victim;
    int level, chance;
    if( argument[0] == '\0')
    {
       send_to_char("You need to choose a target.\n\r", ch);
       return;
    }
    if ( ( victim = get_char_world( ch, argument ) ) == NULL
    ||   victim == ch
    ||   !victim->in_room
    ||  (IS_NPC(victim)) )
    {
        send_to_char( "Your target cannot be found.\n\r", ch );
        return;
    }
    if(IS_NPC(victim))
    {
        send_to_char("This skill doesn't work on NPCs.\n\r", ch);
        return;
    }
    chance = IS_NPC(ch) ? ch->top_level
           : (int) (ch->pcdata->learned[gsn_gather_intelligence]);
    WAIT_STATE(ch, PULSE_VIOLENCE);
    if (  number_percent() >= chance )
    {
        ch_printf(ch, "You fail to gather intelligence on %s.\n\r", NAME(victim) );
        learn_from_failure(ch, gsn_gather_intelligence);
        return;
    }

    if ( victim->subclass == SUBCLASS_STEALTH_HUNT || victim->subclass == SUBCLASS_SNEAK )
    {
        ch_printf(ch, "It is impossible gather intelligence on %s.\n\r", NAME(victim));
        learn_from_success(ch, gsn_gather_intelligence);
        return;
    }
    if ( IS_IMMORTAL(victim) && (victim->top_level > ch->top_level ) )
    {
       af.type      = gsn_gather_intelligence;
       af.location  = APPLY_HITROLL;
       af.modifier  = -666;
       af.duration  = 32000;
       af.bitvector = AFF_BLIND;
       affect_to_char( ch, &af );
       set_char_color( AT_MAGIC, victim );
       send_to_char( "You are blinded by your target's immortal aura!\n\r", ch );
       return;
    }
    ch_printf(ch, "&wYour intelligence sources have reported the following information:\n\r");
    ch_printf(ch, "&wTitle: %0.74s&w\n\r", victim->pcdata->title);
    ch_printf(ch, "&wRace: %0.20s Class: %0.20s Subclass: %0.20s\n\r", npc_race[victim->race], 
ability_name[victim->main_ability], subclasses[victim->subclass]);
    if(victim->pcdata->clan)
        ch_printf(ch, "Affiliation: %0.20s\n\r", victim->pcdata->clan_name);
    ch_printf(ch, "Hitpoints: %5.5d/%5.5d Movement: %5.5d/%5.5d\n\r", victim->hit, victim->max_hit, victim->move, 
victim->max_move);
    ch_printf(ch, "Armor: %4.4d Hitroll: %5.5d Damroll: %5.5d Alignment: %4.4d", GET_AC(victim), GET_HITROLL(victim),
        GET_DAMROLL(victim), victim->alignment);
    learn_from_success(ch, gsn_gather_intelligence);
    return;
}