[code] My Push command :)

From: Leonardo Herrera (leherrer@ENTELCHILE.NET)
Date: 07/26/97


Hum... here is my first contribution. I apologize for my english (I
think that I said that before :) ).

There is a push command. Please, somebody correct the messages, I wrote
this command in spanish... :)

(I used this in a circle bpl8, but just today I compiled a circle under
Windows 95, so I test this and... well, is just a beta version :) )

Push command - beta version 0.000000000000001
by Leonardo Herrera -
If you use this code, or find it useful, please drop me a mail.

(I put these in the act.offensive.c... and, how somebody here says,
Banzai!)

-------------------------------------
void log_push_to_death( struct char_data * ch, struct char_data
*attacker)
{
  extern struct room_data *world;
  sprintf( buf, "%s pushed to Death Trap #%d (%s)", GET_NAME(ch),
           world[ch->in_room].number, world[ch->in_room].name);
  mudlog(buf, BRF, LVL_IMMORT, TRUE);
  sprintf(buf, "Pushed by %s", GET_NAME(attacker) );
  mudlog(buf, BRF, LVL_IMMORT, TRUE);
}

int perform_push(struct char_data *ch, int dir, int need_specials_check,
            struct char_data *attacker )
{
  extern char *dirs[];
  int was_in;
  int House_can_enter(struct char_data * ch, sh_int house);
  void death_cry(struct char_data * ch);
  int special(struct char_data *ch, int cmd, char *arg);

  if (need_specials_check && special(ch, dir + 1, ""))
    return 0;

  /* charmed? */
  if (IS_AFFECTED(ch, AFF_CHARM) && ch->master && ch->in_room ==
ch->master->in_room) {
    send_to_char("The thought of leaving your master makes you
weep.\r\n.\r\n", ch);
    act("$n burst into tears.", FALSE, ch, 0, 0, TO_ROOM);
    return 0;
  }

  if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_ATRIUM)) {
    if (!House_can_enter(ch, world[EXIT(ch, dir)->to_room].number)) {
      send_to_char("You are pushed, but you can't tresspassing!\r\n",
       ch);
      return 0;
    }
  }
  if (IS_SET(ROOM_FLAGS(EXIT(ch, dir)->to_room), ROOM_TUNNEL) &&
      world[EXIT(ch, dir)->to_room].people != NULL) {
    send_to_char("You are pushed, but there isn't enough room\r\n", ch);
    return 0;
  }
  sprintf(buf2, "$n is pushed to the %s by $N .",
          dirs[dir] );
  act(buf2, TRUE, ch, 0, attacker, TO_NOTVICT);
  was_in = ch->in_room;
  char_from_room(ch);
  char_to_room(ch, world[was_in].dir_option[dir]->to_room);

  if (!IS_AFFECTED(ch, AFF_SNEAK))
    act("$n fall rolling on the ground", TRUE, ch, 0, 0, TO_ROOM);

  if (ch->desc != NULL)
    look_at_room(ch, 0);

  if (IS_SET(ROOM_FLAGS(ch->in_room), ROOM_DEATH) && GET_LEVEL(ch) <
LVL_IMMORT)
  {
    log_push_to_death(ch, attacker);
    death_cry(ch);
    extract_char(ch);
    return 0;
  }
  return 1;
}


ACMD(do_push)
{
  char name[100], todir[256];
  int to;
  struct char_data *victim=NULL;
  extern char *dirs[];

  half_chop(argument, name, todir);
  if (!*name || !*todir)
    send_to_char("Push whom where?\r\n", ch);
  else if (!(victim = get_char_room_vis(ch, name)) )
    send_to_char("Nowhere by that name here.\r\n", ch);
  else if (ch == victim)
    send_to_char("But... can you walk?\r\n", ch);
  else if (IS_AFFECTED(ch, AFF_CHARM))
    send_to_char("No, no....\r\n", ch);
  else if ((to = search_block(todir, dirs, FALSE)) < 0) {
    send_to_char( "That is not a direction.\r\n", ch );
    return;
  } else {
    strcpy( todir, dirs[to] );
    if (GET_POS(victim) <= POS_SITTING ) {
      send_to_char( "You can't push anybody while is lying on the
ground", ch );
      return;
    }
    if (GET_POS(victim) == POS_FIGHTING) {
      sprintf( buf, "No! you can't push %s while fighting!\r\n",
HSSH(ch) );
      send_to_char( buf, ch );
      return;
    }
    sprintf(buf, "$n is trying to push you to the %s!", todir);
    act( buf, FALSE, ch, 0, victim, TO_VICT );
    act( "$n is trying to push $N", FALSE, ch, 0, victim, TO_NOTVICT);
    if (!CAN_GO( victim, to)) {
      sprintf( buf, "Can't push %s there\r\n", HSSH(ch) );
      send_to_char( buf, ch );
    } else if ( GET_LEVEL(victim) >= LVL_IMMORT && GET_LEVEL(ch) !=
LVL_IMPL ) {
      send_to_char( "Oh, no, no, no.\r\n", ch );
      send_to_char( "Is trying to push you... what a mistake!\r\n",
victim);
    } else if ( GET_LEVEL(victim) - GET_LEVEL(ch) > 4 ) {
      sprintf( buf, "You can't push %s.\r\n", HMHR(victim) );
      send_to_char( buf, ch );
      sprintf( buf, "%s can't push you.\r\n", GET_NAME(ch) );
      send_to_char( buf, victim );
    } else if ( MOB_FLAGGED(victim, MOB_NOBASH)) {
      send_to_char( "Ouch! Is too big for you!\r\n", ch );
    } else if ((dice(1,20)+3)-(GET_STR(ch)-GET_STR(victim)) <
GET_STR(ch)) {
     /* You can balance the check above, this works fine for me */
      if (perform_push(victim, to, TRUE, ch)) {
        send_to_char( "Ciao, ciao!\r\n", ch);
        sprintf( buf, "%s has pushed you!", GET_NAME(ch) );
        send_to_char( buf, victim );
      }
    } else {
      send_to_char( "Oops... you fail.", ch );
      sprintf( buf, "%s fail.\r\n", HSSH(ch) );
      *buf = UPPER(*buf);
      send_to_char( buf, victim );
    }
  }
}


     +------------------------------------------------------------+
     | Ensure that you have read the CircleMUD Mailing List FAQ:  |
     | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html |
     +------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/08/00 PST