[리버싱 일기/리메이크] 랑그릿사 2 PC판 마법 적용 방식 (디버프 자가 회복 로직)

오프셋 0041729e를 중심으로, 턴을 넘겨받을 때 실행되는 자가 회복 및 상태 이상 해제 코드를 분석한 기록입니다. 모든 지휘관에 대해 루프를 돌며 진행되는 이 과정은 고전 게임 특유의 설계와 뜻밖의 계산 버그를 동시에 보여줍니다.

1. 자가 회복의 선결 조건과 탐색

가장 먼저 해당 부대가 실제 존재하는지, 그리고 회복이 가능한 상태인지를 체크합니다. 지휘관의 classNum이 0xffff이면 존재하지 않는 부대로 간주합니다. 이어서 armyFlag와 forceFlag의 특정 비트(0x80)를 확인하는데, 필자는 이를 임시로 MayBeDie와 NoSelfHealState로 명명했습니다. 이 플래그가 하나라도 활성화되어 있으면 해당 포스는 회복 로직에서 제외됩니다.

조건을 통과하면 지휘관 인접 유닛을 체크하여 회복을 시도하는 heal_nearMyArmy()가 호출됩니다. 이 함수 내부에서는 유닛의 서수(지휘관 0, 부대원 1~6, 소환물 7)에 따라 HP를 채워주는 healStack() 함수를 부릅니다. 흥미롭게도 오프셋 00417061에서도 이 healStack이 호출되는데, 여기서는 매 턴 마나를 2씩 회복시키는 코드가 포함되어 있습니다.

2. 마법 방어력(MDF)의 산출

디버프 해제 확률을 결정하는 마법 방어력 계산은 다음 순서를 따릅니다.

  • 착용 아이템의 마방 수치를 가져옵니다.

  • 레지스트(Resist) 마법 적용 여부를 체크하여 합산합니다.

  • 최종 합산값이 100을 넘으면 100으로 고정(Clamping)합니다. (단, 디클레인은 이 계산식에 포함되지 않습니다.)

3. 부대 단위 마법의 해제: 참(Charm)과 존(Zone)

부대 전체에 영향을 주는 마법들은 위에서 구한 지휘관의 마방 수치를 확률 삼아 해제를 시도합니다.

  • 참(Charm): 복잡한 진영 판정 플래그를 모두 통과하면 랜덤 함수를 호출하여 마방% 확률로 해제합니다.

  • 존(Zone): 존 플래그 활성 여부를 확인하고 역시 마방% 확률로 비트를 제거합니다.

  • 버프/디버프 강제 초기화: 어택, 프로텍트, 퀵, 레지스트, 디클레인 등 능력치에 영향을 주는 마법들은 매 턴 시작 시 비트 연산(& 0xe1f8)을 통해 확률과 상관없이 강제로 해제됩니다.

4. 부대원 단위 마법의 해제와 마방 합산 버그

부대원(0~7 루프)별로 슬립(Sleep)과 뮤트(Mute) 상태를 체크합니다. 이 과정에서 밸런스에 영향을 주는 중요한 설계상의 특징 혹은 버그가 발견됩니다.

지휘관이 아닌 일반 용병의 마방을 계산할 때, 기존 마방 변수(지휘관의 마방이 합산된 상태)에 부대원의 클래스 테이블 마방값을 한 번 더 더하는 구조입니다. 즉, 용병의 해제 확률에 지휘관의 마방이 뻥튀기되어 반영됩니다. 이 때문에 발리스타처럼 마방이 낮은 유닛도 지휘관이 강력하면 슬립에서 비정상적으로 빨리 깨어나는 현상이 발생합니다.

계산된 값은 Int(4byte) 공간에 저장되므로 100을 초과해도 데이터가 소실되지는 않지만, 확률 판정 시에는 100일 때와 동일한 결과를 낳습니다. 이 수치를 바탕으로 슬립과 뮤트 플래그를 마방% 확률로 해제하며 루틴이 종료됩니다.

결론

  • 부대 단위 자가 회복: 레지스트 + 아이템 + 지휘관 자체 마방을 사용하며, 참과 존 마법이 이에 해당합니다.

  • 부대원 단위 자가 회복: 지휘관은 본인 마방을 사용하지만, 용병과 소환물은 지휘관 마방이 합산된 수치를 사용하여 슬립과 뮤트를 해제합니다.

  • 강제 해제: 공, 방, 마방, 속도에 영향을 주는 대부분의 수치 변경 마법은 턴 시작 시 확률 없이 모두 초기화됩니다.

댓글

가장 많이 본 글