- 기타게임 기타
마지막왕국 클라이언트 해상도 변경 작업된 클라 파일(1080p)
원본 클라이언트(Client2.exe, 640x480)를 1920x1080으로 띄울 수 있도록 수정하였습니다.
원본 소스가 없는 관계로, 실행 파일을 직접 고치는 바이너리 패치 방식으로 처리하였습니다.
패치는 tools/widepatch/widepatch.py로 원본 백업에서 매번 새로 만들도록 구성하여, 해상도나 UI 배율을 바꿔 다시 만들 수 있게 하였습니다.
창 모드에서는 DirectDraw로 직접 출력하지 않고, 640x360 크기의 백버퍼 서피스(TBackScreen)를 GDI로 화면 캔버스에 복사하는 구조입니다.
이에 백버퍼 서피스 크기를 목표 해상도로 키우는 방식으로 처리하였습니다.
화면 중심과 마우스 좌표 변환은 서피스 크기를 기준으로 동적으로 계산되는 관계로, 별도 수정 없이 그대로 동작합니다.
맵을 그리는 범위는 코드에 상수(가로 ±12칸, 세로 −9~+7칸)로 박혀 있는 관계로, 해당 값을 늘려 넓어진 화면 전체에 타일이 그려지도록 하였습니다.
UI 창들은 Delphi 폼 리소스(DFM)로 정의되어 있어, 리소스를 직접 수정하는 방식으로 처리하였습니다.
- 하단 바, 능력치 창, HP 창 등은 위치와 크기를 UI 배율만큼 키웠습니다.
- 일부 창은 위치를 코드에서 정하는 관계로, 해당 상수(하단 바 위치, 로그인 창 중앙 정렬용 640/480)를 함께 수정하였습니다.
- 크기를 바꾼 폼은 글꼴 높이 차이 때문에 자식 컨트롤이 두 번 확대되는 문제가 있어,
Scaled=False를 추가하여 처리하였습니다. - 리소스 교체는 Windows
UpdateResourceWAPI로 처리하였습니다. 폼 파서(dfmtool.py)는 11개 폼 모두 원본과 바이트 단위로 같게 왕복되는 것을 확인하였습니다.
팝업 창의 슬롯 칸은 리소스가 아니라 실행 중에 코드로 만들어지는 관계로, 리소스 수정만으로는 커지지 않았습니다. 이에 다음과 같이 처리하였습니다.
- 실행 파일 안에서 쓰이지 않던 재배치 섹션(
.reloc, ASLR 미사용)을.lkui로 바꿔 추가 코드를 넣었습니다. - 창 생성 함수(FormCreate)를 감싸는 래퍼를 연결하여, 슬롯 칸 크기를 UI 배율만큼 키우도록 하였습니다.
- 아이콘 그리기 호출을
StretchDIBits로 바꿔 아이콘도 함께 확대되도록 하였습니다. - 추가 코드는 keystone 어셈블러로 생성하였습니다.
해당 파일은 기본적으로 로컬호스트를 인자로 받고 있습니다. 이에 따라 추후 운영 시 필요한 경우 접속할 서버를 IP,포트 인자로 넘겨야 함을 알려드립니다.

Repi 님의 최근 댓글
ㄳㄳ 2018 06.20 ㄳㄳ 2018 06.20 감사합니다 2018 06.19 감사합니다! 2018 06.18