동방크롤 잡설 - 몬스터 ai
2018.06.08 00:21
동방크롤을 만들면서 여러가지 기술적인 문제나 아이디어 정리잡담
로그라이크 전반에 통용되는 이야기도 많을듯
구현할때 상당히 적당히 만들었기때문에 반성회같은 느낌으로 진행 예정
-----------------------------------------------------------------------------------
동방크롤의 몬스터 ai는 유한 상태 기계(FSM)를 이용하여 만들어져있다.
유한상태기계라는것은 간단하게 설명하면 몬스터가 하나의 상태를 가질 수 있으며 특정한 전이에 대해서 상태가 변하게 될 수 있다는 모델이다.
동방크롤에 존재하는 상태는 다음과 같다.
노말: 딱히 목표 없이 돌아다니는 상태
수면: 가만히 서서 자는 상태
공격: 목표가 정해져서 공격하러 가는 상태
휴식: 수치상으로만 있고 현재 쓰고있지않음
추종: 자신의 주인에게 따르는 상태
탐색: 한 곳을 지키는 몬스터(주로 룬 네임드)가 원래 자리로 돌아올때 상태
위의 5개의 상태가 전이(소음, 공격받음, 적을 발견, 적을 놓침)라고 불리는 외부 개입에 따라 상태가 변할 수 있다는건데
이론적으론 그렇지만 구현되면서 좀 잡다하게 섞였기때문에 사실 그렇게 큰 의미는 없다.
기본적으로 몹은 자고 있는 상태로 젠되며 자는 동안 시야에 들어오거나, 공격받거나, 소음을 듣거나하는 외부 요소에 따라 공격상태로 변한다.
공격 상태에서는 해당 좌표로 이동을 하게되는데 이 부분에서는 약간 멍청하게 이동하도록 되어있다.
간단히 말하면 해당 좌표로 무식하게 일직선으로 쭉 이동한다. 그러다 벽을 만나면 살짝 빗겨가는 식으로 행동한다.
동방크롤에선 길 찾기 알고리즘으로 A*를 쓰긴하는데 이걸 이용하면 완벽한 경로를 찾아서 이동할 수 있지만 몬스터의 알고리즘같은 경우는 보통 너무 똑똑하면 오히려 어색함을 줄 수 있기도하고 모든 몬스터가 A*알고리즘으로 동작하면 꽤 계산량이 많아지기도 한다. (물론 이런 멍청한 움직임때문에 가끔 벽에 막혀서 비비적거리기도 한다.)
대상이 시야에 사라질 경우 가장 마지막에 발견된 장소로 움직이는 식으로 하면 적당히 인간다운 움직임을 보여줄 수 있다.
<솔직히 심하게 멍청한거같다.>
일정시간동안 적을 쫓다가 놓칠 경우가 생기는데 이 경우엔 노말 상태로 돌아온다.
동방크롤의 무작위 이동은 그렇게 상세히 만들어지진않고 일정텀으로 무작위 방향으로 직진운동 하는 수준이다.
참고로 몇몇 네임드 몬스터 같은 경우는 노말상태에서 자리를 지킬 수 있도록 일정 범위를 벗어나면 탐색상태가 되어 항상 원래 위치를 돌아오도록 되어있기도 하다.
<무작위 이동에 그렇게 특색은 없다.>
추종은 말그대로 아군 소환물에 해당하는 상태로 플레이어를 따라오는 상태인데 버그가 좀 많다...
사실 동방크롤의 몬스터 ai자체는 너무 심플하다 못해 멍청하긴하다.
심플한데 비해서 코드자체는 덕지덕지 붙은게 많아서 엄청 지저분하다.
그리고 결정적으로 버그가 많다. (특히 아군)
반성하자.