기본 콘텐츠로 건너뛰기

추천 가젯

Tmux 환경에서 Vim 컴파일 시 발생하는 termio/termios 감지 오류 해결 방법

 리눅스 환경에서 소스코드를 직접 빌드하다 보면 의외의 환경 변수나 터미널 세션 설정 때문에 엉뚱한 빌드 에러를 마주할 때가 있습니다. 대표적인 예로 Tmux 세션 내부에서 Vim 소스를 컴파일할 때 발생하는 termio/termios 감지 오류 가 있습니다. 이번 글에서는 해당 에러가 발생하는 원인과, 단순한 clean 으로는 해결되지 않는 이유 및 올바른 해결 방법을 정리합니다. 1. 문제 원인 Vim의 소스 코드 빌드 과정( configure )은 시스템이 System V 계열인지 Linux 계열인지 판별하기 위해 termio.h 와 termios.h 헤더 파일 및 터미널 인터페이스를 검사(Probe)합니다. 하지만 Tmux 내부(세션 안)에서 컴파일을 진행할 경우 , Tmux가 제공하는 PTY(Pseudo-Terminal) 환경과 TERM=screen 등의 특수한 환경 변수 영향으로 인해 Autoconf가 터미널 인터페이스를 검출하는 과정에서 오동작을 일으킵니다. 그 결과, 실제 시스템 조건과 무관하게 설정 에러를 발생시키게 됩니다. 2. 왜 make clean 으로는 해결되지 않을까? 일반적인 개발 과정에서는 빌드가 꼬였을 때 make clean 을 실행하곤 합니다. 하지만 make clean 은 컴파일된 오브젝트 파일이나 바이너리( .o 파일 등)만 삭제할 뿐, Autotools가 시스템 환경을 탐색한 결과로 남긴 캐시( config.cache 또는 내부 매크로 변수)나 설정 파일들은 그대로 유지 합니다. 일반적인 상황에서는 시스템의 하드웨어/OS 정보가 바뀌지 않기 때문에 이 잔여물이 문제가 되지 않습니다. 그러나 Tmux나 Screen 같은 터미널 멀티플렉서 환경에서 탐색된 왜곡된 정보가 캐시에 박혀버리면, 나중에 Tmux 외부(일반 터미널)로 나와서 빌드를 시도해도 이전의 오염된 캐시 때문에 계속해서 오류가 발생하게 됩니다. 3. 해결 방법 이 문제를 해결하기 위해서는 반드시 Tmux 외부 환경 에서 기존의 오염된 설정 파일을 ...

[리버싱 일기/리메이크] 랑그릿사 2 PC판 마법 메커니즘 분석 (데미지 및 지형 파괴)

필자가 직접 기드라(Ghidra)를 통해 랑그릿사 2 PC판의 바이너리를 헤쳐나가며 정리한 두 번째 리메이크 원고입니다. 이번 편은 게임의 핵심인 마법 데미지 산출 공식과 지형 파괴 로직을 중심으로 다룹니다.


[리버싱 일기/리메이크] 랑그릿사 2 PC판 마법 메커니즘 분석 (데미지 및 지형 파괴)

랑그릿사 2의 마법 시스템은 겉보기보다 단순하면서도, 포팅 과정에서 발생한 것으로 보이는 기묘한 수치 불균형이 존재합니다. 오프셋 0041012c와 0040ffd3를 중심으로 그 내부를 들여다보았습니다.

1. 마법 적용 전처리: 마법 방어력(MDF)의 확정

데미지를 계산하기 전, 유닛의 최종 마방을 결정하는 전처리 단계가 선행됩니다.

  • 레지스트(Resist) 체크: 마법 플래그가 활성화되어 있으면 MDF 기본값을 50으로, 없으면 0으로 설정합니다.

  • 지휘관: 착용 아이템의 마방 효과 합계를 구하여 기본값에 더합니다. (슬롯 제한을 무시한 강제 착용 시에도 로직은 작동합니다.)

  • 부대원: 클래스별 고정 MDF에 아뮬렛 착용 여부(+15)를 더합니다.

  • 디클레인(Decline): 해당 마법이 걸려 있다면 MDF에서 15를 감산합니다.

  • 고정(Clamping): 최종 수치가 99를 넘어가면 100으로 고정하여 마법 면역 상태를 만듭니다.

2. 공격 마법의 데미지 공식 (MLv와 SP)

랑그릿사 2의 데미지 공식에는 시전자의 레벨을 2로 나눈 **MLv(Lv >> 1)**와 클래스 티어에 따른 **SP(Spell Power)**가 핵심 변수로 사용됩니다.

주요 마법별 기본 데미지(Damage) 산출

마법명공식 (기초 데미지)특이 사항
매직 에로우SP + (MLv * 2)가장 기본적인 단일 공격
파이어볼MLv + SP마법의 표준 수치
블라스트18 + MLv + SP고위력 단일 마법
메테오6 + MLv + SP범위 마법의 표준
썬더1 + MLv + SP수중 타일 대상 시 보너스 데미지 +1
토네이도(MLv + SP) * 2비병 대상 시 방어 무시 데미지 +1 (버그성 강력함)

분석 결과, 토네이도, 블리자드, 어스퀘이크는 모두 파이어볼의 2배 공식을 공유하는 동일 코드로 확인되었습니다. 특히 토네이도는 배우기 어려운 대신 비병 특효까지 겹쳐 유닛 중심 마법 중 가장 파괴적인 위력을 발휘합니다.

3. 지형 파괴 로직: 메테오와 어스퀘이크

마법 번호(메테오: 0x4, 어스퀘이크: 0x8)를 비교하여 지형 변조 함수를 호출합니다.

  • 메테오 (오프셋 00411cee): 마법 시전 좌표의 지형 속성이 '파괴 금지(0xff)'가 아닐 경우, 지형 1(스프라이트)과 지형 2(원본 데이터)를 교체하여 지형 붕괴를 표현합니다.

  • 어스퀘이크: 맵 전체를 스캔하여 범위 내 지형의 1/4 갯수만큼 랜덤하게 파괴합니다. 동일 장소가 중복 선택될 수 있는 구조라, 실제 파괴 효율은 기대값보다 낮게 나타납니다.

4. 힐(Heal) 마법의 메커니즘

힐은 공격 마법보다 단순하게 작동하지만, 경험치 획득 방식에서 특징이 보입니다.

  • 힐 1: (10 - 현재 HP)로 회복량을 구하며, 최대 3까지만 회복 가능하도록 하한선(Bound)이 설정되어 있습니다. (힐 2는 이 제한이 없습니다.)

  • 경험치: 회복량과 상관없이 함수 호출 시마다 전역 변수를 조작하여 경험치를 1씩 증가시킵니다. 즉, 적은 양을 자주 채우는 것이 레벨업에 유리한 구조입니다.

5. 리버싱의 핵심: 랜덤 함수(RNG)의 발견

분석 중 0x41C64E6D와 같은 거대한 상수를 사용하는 루틴을 발견했습니다. 이는 전형적인 선형 합동 생성기(LCG) 방식의 랜덤 함수입니다. 유저의 조작이 개입하지 않는 '확률의 영역'을 추적하기 위해서는 이 RNG 호출지를 쫓는 것이 향후 리버싱의 핵심 이정표가 될 것입니다.

댓글