방전체 공격루틴 #2

2007.04.12 13:09

그리움 조회 수:287 추천:59

Ultra BBS

무한 강좌 (fmz13a2) [담당자:작은용 님] ( 4/ 29)
───────────────────────────────────────
제목 : ##방전체 공격 루틴입니다... 줄수 : 0/103
번호 : 4 [12/04-07:31] 조회 : 64
------------------------------------------------------------------------------
저희 머드에서도 사용해본 것입니다..


int room_attack(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
  room *rom_ptr;
  int fd, m, n, mpdown;
  ctag *cp, *ctemp;
  long i, t;

  fd = ply_ptr->fd;
  rom_ptr = ply_ptr->parent_rom;

  /* 직업 체크 */
  if(ply_ptr->class < CARETAKER) {
    print(fd, "이건 초인만 쓸수 있어요!!!");
    return(0);
  }

  /* 실명 상태인지 체크. 벙어리 상태인지 체크등 추가하면 됨. */
  if(F_ISSET(ply_ptr, PBLIND)) {
    print(fd, "아무것도 보이지 않습니다.");
    return(0);
  }

  /* 도력 소모량 : 최대 도력의 20%를 사용 */
  /* mpdown = 100; 등과 같이 사용하면 됨. */
  mpdown = (ply_ptr->mpmax) * 2 /10;

  if(ply_ptr->mpcur < mpdown) {
    print(fd, "당신의 도력이 부족합니다.");
    return(0);
  }

  /* 딜레이의 체크 */
  /* 먼저 mtype.h 에서 LT_RATTCK 이라는 것을 정의해둬야 함 */
  i = LT(ply_ptr, LT_RATTCK);
  t = time(0);
  if(i > t) {
    please_wait(fd, i-t);
    return(0);
  }

  ply_ptr->lasttime[LT_RATTCK].ltime = t;
  ply_ptr->lasttime[LT_RATTCK].interval = 20L; /* 딜레이가 20초임 */
  ply_ptr->mpcur -= mpdown;

  F_CLR(ply_ptr, PHIDDN); /* 은신 상태 해제 */
  if(F_ISSET(ply_ptr, PINVIS)) { /* 은둔법 걸고 있을 경우 */
    F_CLR(ply_ptr, PINVIS);
    print(fd, "당신의 모습이 서서히 드러납니다.\n");
    broadcast_rom(fd, ply_ptr->rom_num
      , "\n%M의 모습이 서서히 드러납니다.", ply_ptr);
  }

  print(fd, "당신은 어쩌구저쩌구 하여서 방전체 공격을 합니다.");
  broadcast_rom(fd, ply_ptr->rom_num
    , "\n%M%j 어쩌구저쩌구 하여서 방전체 공격을 합니다.", ply_ptr, "1");

  /* 여기서부터가 실제 공격을 들어가는 부분 */
  n = mdice(ply_ptr) + mpdown/5;

  /* 공격의 타격치 계산 : 아래 while 문에서 중간에 넣어도 관계없음 */
  cp = rom_ptr->first_mon;

  while(cp) {
    ctemp = cp->next_tag; /* ctemp를 사용하는 이유는, 공격으로 인해
                              몹이 죽을 경우를 대비해서 사용
                              사용하지 않으면, 버그 생김 -.- */
    /* 공격할수 없는 몹 체크 */
    if(F_ISSET(cp->crt, MUNKIL)) {
      cp = ctemp;
      continue;
    }
    if(cp->crt == ply_ptr) {
      cp = ctemp;
      continue;
    } /* 몹이 이 기술을 사용할 경우를 대비해서 넣어둠.
           그럴 가능성은 없으므로 빼도 됨. --; */
    m = MIN(cp->crt->hpcur, n);
    add_enm_crt(ply_ptr->name, cp->crt);
    add_enm_dmg(ply_ptr->name, cp->crt, m);
    cp->crt->hpcur -= n;

    printa(fd, "\n%M%j 어쩌구하면서 기술에 맞았습니다.", cp->crt, "1");
    broadcast_rom(fd, rom_ptr->rom_num
      , "\n%M%j 어쩌구하면서 기술에 맞았습니다.", cp->crt, "1");

    if(cp->crt->hpcur < 1) { /* 죽였을 경우 */
      printa(fd, "\n당신은 %M%j 죽였습니다.", cp->crt,"3");
      broadcast_rom(fd, cp->crt->rom_num
        , "\n%M%j %M%j 죽였습니다.", ply_ptr,"1", cp->crt, "3");
      die(cp->crt, ply_ptr);
    }
    else /* 자동 도망 체크 */
      check_for_flee(ply_ptr, cp->crt);

    cp = ctemp;
  }
  return(0);
}


XE Login