Re: Consent Command

From: Deidril (F.Manisse@cryo-networks.fr)
Date: 04/10/02


Dave Wrote:

>>     /* i add the victim to the list */
>>     f = new struct consent_type ;
>I don't quite understand the above. Mind exsplaining it too me? :)

Sorry, i'm kinda tired today :)

You must allocate a new struct and i wrote it using C++.
Try instead  CREATE ( f , struct consent_type , 1 ) ;

That should give :

else {
    vict->consenter = ch;

    /* i add the victim to the list */
   CREATE ( f , struct consent_type , 1 ) ;
    f->next = ch->consented ;
    f->consented = vict ;
    ch->consented = f ;

    act("You give your consent to $N.", FALSE, ch, 0, vict, TO_CHAR);
    act("$n has given you $s consent.", FALSE, ch, 0, vict, TO_VICT);
  }


But it'll still not work because you mistaken the victim and the actor
several time

The right way should be :

ch->consented : the list of people that has consented you
ch->consenter : the character you have consented :

Also it seems you want to have only one consenter from the consent code ,
but several from
the view consent functions. I assume you want only one 'cause ch->conseter
is a char_data.


So:

/* we put remove the consent external 'cause we'll use it twice */
/* this function clear the consent on a character */

void clear_consent ( struct char_data * ch )
{
struct char_data * victim ;

    victim = ch->consenter ;

    if (!victim) return ;

     for (f = victim->consented; f; f = f->next)
     {
        if (f->consented == ch )
        /* this is the character that want to remove the consent */
        {
              sprintf(buf2, "%s stops consenting you.\r\n", GET_NAME(ch));
                send_to_char (buf2,victim) ;
              act("You stop consenting: $N.", FALSE, ch, 0, victim, TO_CHAR);
            REMOVE_FROM_LIST(f,ch->consented,next);
            break ;
        }
     }

     ch->consenter = NULL ;

}

ACMD(do_consent)
{
struct char_data *vict;
struct consent_type *f, *next_fol;

  one_argument(argument, buf);

  if (!*buf) PrintConsent(ch);
  else if (!(vict = get_char_vis(ch, buf, NULL, FIND_CHAR_WORLD)))
send_to_char(NOPERSON, ch);
  else if (IS_NPC(vict)) send_to_char(NOPERSON, ch);
  else if (ch->consenter == vict) act("You have already given your consent
to $M.", FALSE, ch, 0, vict, TO_CHAR)

  /* until here no problem */

  /* here you forgot to desalloc memory and you must look into the VICTIM
list instead of the actor */
  /* i guess you use consent 'myself' to say : i don't want to consent
anyone now */

  else if (vict == ch)
  {
        /* we clear the consent on the character */
      clear_consent ( ch ) ;
      send_to_char ("You consent only to yourself.\n\r",ch);
  }


  /* now we take care of the case you want to change the consent victim */
  else
  {

        /* first we clear any existing consenter */
        clear_consent ( ch ) ;

        /* second we put the consenter on the character */
        ch->consenter = vict ;

        /* third we add the character to the consented list of the victim */
        /* i add the victim to the list */
        CREATE ( f , struct consent_type , 1 ) ;
        f->next = vict->consented ;
        f->consented = ch ;
        vict->consented = f ;

    }
}




My function should work with your PrintConsent code.

FreD.

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   | Newbie List:  http://groups.yahoo.com/group/circle-newbies/   |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 06/25/03 PDT