FF11 LSB 개발일지 2 — Yagudo Avatar와 Tzee Xicu the Manifest 구현 기록
어느덧 FF11 LSB 개발을 시작한지도 4개월째에 접어들고 있다.
처음에는 단순히 “조금만 손보면 되겠지”라는 생각으로 시작했지만, 막상 작업을 이어가다 보니 손봐야 할 부분이 정말 많았다. 그동안 NM, HNM, 헌트 시스템, 타이머, 팝 조건, 전투 기믹 등 여러 부분을 수정하고 구현해왔다.
오늘은 그중에서도 Yagudo Avatar와 Tzee Xicu the Manifest에 대해 이야기해볼까 한다.
LSB에서 NM/HNM 기믹은 직접 구현해야 하는 경우가 많다
LSB는 기본적인 일반 몬스터의 전투 로직이나 공용 시스템은 꽤 잘 갖춰져 있다.
하지만 NM이나 HNM처럼 리테일에서 특수한 조건과 연출, 전용 행동 패턴을 가진 몬스터들은 미완성으로 남아 있는 경우가 많다.
특히 75레벨 시대의 NM/HNM들은 단순히 강한 몬스터가 아니라, 각각 고유한 전투 흐름과 기믹을 가지고 있다. 이런 부분은 서버 관리자가 직접 Lua 스크립트와 DB를 확인하면서 구현해야 한다.
이번에 작업한 Yagudo Avatar와 Tzee Xicu the Manifest도 그런 케이스였다.
단순한 소환사처럼 보이지만, 실제로는 다르다
겉으로 보면 두 몬스터는 단순한 야그도 소환사 계열처럼 보인다.
하지만 일반 소환사 몬스터와 다른 중요한 특징이 있다.
바로 엘리멘탈 펫을 유지한 상태에서 Astral Flow를 사용한다는 점이다.
일반적인 소환사 몬스터라면 소환수를 데리고 있고, 특정 타이밍에 Astral Flow를 사용하는 식으로 생각하기 쉽다. 하지만 이 두 몬스터는 평상시에는 엘리멘탈을 유지하면서 전투하다가, HP가 일정 이하로 내려가면 Astral Flow를 사용하고, 그 순간 랜덤한 소환수 형태로 바뀐 아바타가 등장해 그에 맞는 필살기를 사용한다.
리테일 기준으로는 이런 흐름이다.
| 평상시: 엘리멘탈 펫 유지 HP 50% 이하: 본체가 Astral Flow 사용 AF 발동 시: 랜덤 소환수 등장 소환수 모델에 맞는 필살기 사용 전투 후 소환수 정리 |
말로만 보면 단순하다.
하지만 실제 구현은 전혀 단순하지 않았다.
가장 중요했던 조건 — 본체 2H 모션 유지
처음부터 가장 중요하게 본 부분은 본체의 2H 모션이었다.
Astral Flow는 단순히 데미지를 주는 기술이 아니라, 소환사 계열 몬스터의 상징적인 필살기다. 그런데 본체가 Astral Flow 모션을 취하지 않고, 뒤에서 스크립트로만 소환수를 강제로 띄워 데미지를 주면 “필살기” 느낌이 전혀 나지 않는다.
그래서 최종적으로는 본체가 직접 mob:useMobAbility(734)를 사용하도록 했다.
LSB 기준으로 Astral Flow는 mobskill 734이며, 본체가 이 스킬을 사용해야 2H 모션이 나온다. 이 부분은 절대 포기할 수 없는 조건이었다.
엘리멘탈 펫과 AF 전용 아바타를 분리
두 몬스터는 평상시에는 엘리멘탈을 유지해야 한다.
그래서 기본 펫은 +1 위치의 엘리멘탈로 유지했다.
반면 Astral Flow 전용 아바타는 +2 위치를 사용하도록 구성했다.
| Yagudo Avatar +0 본체 +1 Yagudos_Elemental +2 Yagudos_Avatar Tzee Xicu the Manifest +0 본체 +1 Tzee_Xicu_Elemental +2 Tzee_Xicu_Avatar_Pet |
이 구조 덕분에 평상시 전투에서는 엘리멘탈을 유지하고, Astral Flow 시점에는 별도의 아바타를 불러오는 방식이 가능해졌다.
처음에는 일반 소환사 몬스터처럼 job_special mixin만으로 처리할 수 있지 않을까 생각했다. 하지만 엘리멘탈 펫을 유지한 상태에서 AF 전용 아바타를 정확히 제어해야 했기 때문에, 결국 본체 쪽에서 HP 조건을 직접 체크하고 734를 호출하는 방식으로 정리했다.
랜덤 소환수와 필살기 매칭
리테일에서는 Astral Flow 사용 시 랜덤한 소환수가 등장하고, 그 소환수에 맞는 필살기를 사용한다.
예를 들면 이런 식이다.
| Carbuncle → Searing Light Fenrir → Howling Moon Ifrit → Inferno Titan → Earthen Fury Leviathan → Tidal Wave Garuda → Aerial Blast Shiva → Diamond Dust Ramuh → Judgment Bolt |
이 부분은 Yagudos_Avatar.lua 쪽에서 랜덤 테이블을 만들어 처리했다.
소환수 모델과 필살기가 서로 어긋나면 안 되기 때문에, 모델 ID와 스킬 ID를 한 쌍으로 묶어서 관리했다. 테스트 중에는 카벙클 모델이 다른 소환수의 필살기를 쓰는 상황도 있었고, 라무가 정상적으로 나왔지만 실제 사용 기술이 엉뚱하게 출력되는 경우도 있었다.
결국 모델과 필살기 매칭을 강제하는 방식으로 정리했다.
중복 사용 문제
또 하나 골치 아팠던 부분은 필살기가 두 번 나가는 문제였다.
처음에는 아바타가 필살기를 사용한 뒤 일정 시간 후에 AI를 끄는 방식으로 처리했다. 하지만 그 짧은 시간 동안 엔진 AI가 다시 한 번 같은 스킬을 사용하는 경우가 있었다.
그래서 최종적으로는 필살기 사용 직후 즉시 AI를 잠그는 방식으로 바꿨다.
| 필살기 사용 → 즉시 mobAbility OFF → AutoAttack OFF → MagicCasting OFF → TP 0 |
이렇게 처리하니 중복 사용 문제는 해결됐다.
가장 큰 난관 — 데미지 처리와 전투 로그
이번 작업에서 가장 힘들었던 부분은 데미지 처리였다.
공용 Astral Flow 스킬은 겉으로는 광역기처럼 보이지만, 실제 Lua 처리에서는 주 대상 중심으로 데미지가 들어가는 구조였다. 그래서 트러스트나 파티 멤버에게 데미지가 제대로 들어가지 않는 문제가 있었다.
처음에는 takeDamage()를 이용해 보정 데미지를 넣는 방식으로 해결했다.
이 방식으로 실제 HP는 정상적으로 감소했다.
하지만 문제가 하나 남았다.
전투 로그에는 데미지가 표시되지 않았다.
서버 로그상으로는 HP가 감소하는 것이 확인되지만, 클라이언트 전투 로그에는 자연스럽게 “누구에게 몇 데미지” 형태로 출력되지 않았다. messageBasic()도 테스트해봤지만, 호출 자체는 성공해도 실제 전투 로그에 기대한 형태로 나오지는 않았다.
즉 현재 구조는 다음과 같다.
| 실제 HP 감소: 정상 전투 로그 표시: 한계 있음 |
이 부분은 LSB의 액션 패킷 처리와 mobskill 처리 구조의 한계에 가까웠다.
0 데미지 로그 문제
또 다른 문제는 0 데미지 로그였다.
공용 AF 스킬을 그대로 사용하면, DB상 AoE 스킬로 잡혀 있기 때문에 주변 대상에게 0 데미지 로그가 먼저 출력되는 경우가 있었다.
화면상으로는 마치 필살기를 맞기 전에 0 데미지가 먼저 뜨는 것처럼 보여서 매우 어색했다.
이 문제를 완전히 깔끔하게 해결하려면, 결국 Yagudos 전용 mobskill을 따로 만들고, 그 안에서 대상별 데미지와 액션 로그를 제대로 처리해야 할 가능성이 높다.
하지만 그렇게 하면 작업 범위가 커진다. 공용 mobskill을 건드리면 다른 몬스터나 소환수에 영향을 줄 수 있기 때문에, 현 단계에서는 무리하게 확장하지 않기로 했다.
Dagourmarche에서 얻은 힌트
이번 작업에서 큰 힌트를 준 것은 이전에 구현했던 Dagourmarche였다.
Dagourmarche도 Astral Flow와 아바타 연출을 사용하는 몬스터였기 때문에, 본체가 2H를 사용하고, 이후 아바타가 필살기를 사용하는 흐름을 참고할 수 있었다.
물론 구조가 완전히 같지는 않았다.
하지만 “본체 2H 모션을 유지하면서 아바타를 제어해야 한다”는 방향을 잡는 데 큰 도움이 됐다.
기존에 작업해둔 기믹이 다음 작업의 힌트가 되는 걸 보면, 서버 개발은 확실히 하나씩 쌓아가는 작업이라는 생각이 든다.
현재 마무리 상태
현재까지 정리된 상태는 다음과 같다.
| Yagudo Avatar - 엘리멘탈 유지 - HP 50% 이하 Astral Flow 사용 - 본체 2H 모션 유지 - 랜덤 아바타 등장 - 모델과 필살기 매칭 - 중복 사용 방지 - 소환수 cleanup 처리 - 실제 파티/트러스트 데미지 적용 Tzee Xicu the Manifest - Yagudo Avatar와 동일한 구조로 정리 - 엘리멘탈 유지 - Astral Flow 전용 아바타 처리 - 사망 시 타이틀 지급 및 NextPop 갱신 |
아쉬운 점은 데미지 로그 처리다.
현재 상태에서 전투 흐름과 연출은 리테일에 상당히 가까워졌지만, 데미지 로그까지 완벽하게 맞추려면 전용 mobskill 액션 처리가 필요해 보인다. 이 부분은 나중에 여유가 생기면 다시 도전해볼 생각이다.
마무리
이번 작업은 정말 단순해 보였지만 생각보다 훨씬 까다로웠다.
처음에는 “엘리멘탈 유지하고, HP 50%에서 Astral Flow 쓰게 하면 끝 아니냐?” 정도로 생각했다. 하지만 실제로는 본체 2H 모션, 소환수 모델, 필살기 매칭, 중복 사용 방지, 데미지 대상 처리, 전투 로그, cleanup까지 모두 신경 써야 했다.
FF11의 NM/HNM 기믹은 겉으로는 단순해 보여도, 실제로는 꽤 섬세하게 짜여 있다는 걸 다시 느꼈다.
요즘은 FF11 서버 개발에 대부분의 시간을 쓰고 있어서 다른 게임은 거의 손을 대지 못하고 있다.
쌓여 있는 게임들도 플레이해야 하는데, 서버 작업을 하다 보면 하루가 금방 지나간다.
그래도 이런 기믹이 하나씩 구현될 때마다 서버가 조금씩 리테일에 가까워지는 느낌이 들어서, 힘들어도 계속 손을 대게 된다.
