상세 컨텐츠

본문 제목

tomenet 4.4.2 제노사이드 코드 분석

TomeNet 한글판

by 넷핵감자 2009. 8. 24. 16:17

본문

여기서 빨강 테두리 된 부분이 시전자에게 주어지는 데미지 이다. 그리고 데미지를 먹는 부분이 for 문 속에 들어있으므로 제노사이드 되는 몹의 갯수 만큼 데미지를 받는다. 그리고 그 후에 주황색 테두리로 된 부분의 데미지를 더 받는다.
따라서 데미지를 계산하면
제노시킨 몬스터의 레벨을 lev 라고 한다면
각 몬스터 마다 1d(2+lev/8) 만큼의 누적 데미지를 받은 후에 (맥스 피 아닌) 현재 피의 1/2 만큼의 피해를 더받는다.
만약 제노시킨 몬스터가 50랩이고 100마리 였다면 대략
100*(3.5) 정도의 데미지. 350 데미지를 받고 살아 있다면 남은 피의 반만큼 더 데미지가 들어온다.

/*

 * Delete all nearby (non-unique) monsters

 */

bool mass_genocide(int Ind)

{

        player_type *p_ptr = Players[Ind];

 

        int            i, tmp;

 

        bool    result = FALSE;

 

        worldpos *wpos=&p_ptr->wpos;

        dun_level              *l_ptr = getfloor(wpos);

        cave_type **zcave;

        if(!(zcave=getcave(wpos))) return(FALSE);

        if(l_ptr && l_ptr->flags1 & LF1_NO_GENO) return(FALSE);

 

        bypass_invuln = TRUE;

 

        /* Delete the (nearby) monsters */

        for (i = 1; i < m_max; i++)

        {

               monster_type   *m_ptr = &m_list[i];

                monster_race    *r_ptr = race_inf(m_ptr);

 

               /* Paranoia -- Skip dead monsters */

               if (!m_ptr->r_idx) continue;

 

               /* Skip monsters not on this depth */

               if(!inarea(&p_ptr->wpos, &m_ptr->wpos)) continue;

 

               /* Hack -- Skip unique monsters */

               if (r_ptr->flags1 & RF1_UNIQUE) continue;

 

               /* Skip distant monsters */

               if(distance(p_ptr->py, p_ptr->px, m_ptr->fy, m_ptr->fx)>MAX_SIGHT)

#if 0

               if (m_ptr->cdis > MAX_SIGHT)

#endif

                       continue;

 

               /* Skip those immune */

               if (r_ptr->flags9 & RF9_IM_TELE) continue;

 

               /* Roll for resistance */

               tmp = r_ptr->level;

#ifdef RESIST_GENO

               if (randint(RESIST_GENO) < tmp) continue;

#endif  // RESIST_GENO

 

#ifdef NO_GENO_ON_ICKY

               /* Not valid inside a vault */

               if (zcave[m_ptr->fy][m_ptr->fx].info & CAVE_ICKY && !p_ptr->admin_dm)

                       continue;

#endif  // NO_GENO_ON_ICKY

 

               /* Delete the monster */

               delete_monster_idx(i, TRUE);

 

               /* Hack -- visual feedback */

 
               /* does not effect the dungeon master, because it disturbs his movement

                */

               if (!p_ptr->admin_dm)

                       take_hit(Ind, randint(3 + (tmp >> 3)), "the strain of casting Genocide", 0);


               /* Redraw */

               p_ptr->redraw |= (PR_HP);

 

               /* Window stuff */

               /* p_ptr->window |= (PW_PLAYER); */

 

               /* Handle */

               handle_stuff(Ind);

 

               /* Delay */

//             Send_flush(Ind); /* I don't think a delay is really necessary - mikaelh */

 

               /* Note effect */

               result = TRUE;

        }

#ifdef SEVERE_GENO

        if (!p_ptr->death && result && !p_ptr->admin_dm)

                       take_hit(Ind, p_ptr->chp >> 1, "the strain of casting Genocide", 0);

 

        /* Redraw */

        p_ptr->redraw |= (PR_HP);

#endif


        bypass_invuln = FALSE;

 

        /* Window stuff */

        p_ptr->window |= (PW_PLAYER);

 

        /* Handle */

        handle_stuff(Ind);

 

        return (result);

}

 

관련글 더보기