| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 웹 호스팅
- AWS
- ecs
- CI/CD
- ubuntu #ubuntu14 #서비스등록 #dev-ops #service #init.d
- dev-ops #rockylinux #rocky #docker #linux
- Jenkins #Dev Ops
- 서바이벌 프로젝트
- ec2
- docker #도커 #도커 이미지 #도커이미지 #도커 이미지 저장
- 삽질
- cloud front
- s3
- 리버스 엔지니어링
- 게임서버
- Actions
- igw
- 캐시 정책
- ubuntu #java #dev-ops
- CloudFront
- git actions
- Web Hostring
- CloudFront proxy
- 정적 웹 호스팅
- 게임 서버
- docker
- ECR
- docker #도커 #도커이미지 #도커 이미지 옮기기
- CRA
- AI멍청이
- Today
- Total
코딩 범고래의 해저동굴
내가 좋아했던 게임을 위한 파반느 (1) ~서바이벌 프로젝트를 내 로컬에서~ 본문
그럭 저럭 이직을 한 뒤에 어느덧 기존에 느끼지 못했던 다양한 압박감에 무기력해지는 나 자신을 발견하게 됐다.
단순 개발만 하는게 아니라, 회의, 협업, 그리고 뭔가 매니징으로서 성장하길 원하는 팀장의 압박, 해결되지 않는 문제들,
운영 반영시 영향도가 커서 하기 싫은 공통 개발건, 실적에 안잡히는 문의 대응이나 역시나 실적에 안잡히는 취약점 조치를 하라는 정보보호 부서의 압박..
이전 개발을 하며 느끼지 못했던 다양한 스트레스로에 계속 노출되자 무기력해진 나는 기존 개발자로서의 열정을 차츰 잃어가고 있었다. 새로운걸 피해가고 있는 날 곱씹으며, 내가 그토록 싫어하던 코더가 될까 두려웠다.
그럴 때 언뜻 생각난 옛날에 좋아했던 게임, 서바이벌 프로젝트가 생각났고, 유튜브 영상을 우연히 봤는데 개인이 로컬에서 돌리는 것 같았다.
우선 영어로 구글링을 해서 실마리를 찾아보고자 했고, 깃헙에서 누군가 서버 소스를 올려놓은 걸 발견했다. wiz라는 분이 리버스엔지니어링으로 복원해놓은 C++ 소스코드였다. 이걸 보는 순간 "아 나도 로컬에서 돌려볼 수 있겠는데?" 하는 생각이 들었고... 그렇게 삽질이 시작됐다.
무적의 클로드 코드와 함께라면 금방 할 수 있을 것 같았다. 게임 개발, 게임 서버개발 C++은 하나도 모르지만, 뭔가 AI의 발전으로
나도 해볼 수 있지 않을까...
뭐가 필요한가
일단 모을 수 있는 파일들을 다 모았다. 사설서버에 가입해서 클라이언트도 어찌 저찌 구했다.
- sp_server-master.zip — 서버 C++ 소스 (wiz 작성)
- SPGame-master.zip — 클라이언트 리버스엔지니어링 자료
- spgame.zip — 사설서버용 클라이언트
- sp.exe — 게임 본체
환경 세팅
서버는 윈도우에서 돌릴 거라 아래 두 가지를 설치했다.
- XAMPP (MySQL, 포트 3306)
- Visual Studio 2022 Community
- 설치할 때 “C++를 사용한 데스크톱 개발” 워크로드를 꼭 체크해야 한다. 이거 빠뜨리면 컴파일러가 없어서 아무것도 못 한다.
DB 세팅
XAMPP MySQL에 접속해서 DB랑 유저를 만들어줬다. 이렇게 직접 DATABASE 부터 만들고 테이블을 만드는게 도대체 얼마만인가..
CREATE DATABASE sp_db;
CREATE USER 'sp'@'localhost' IDENTIFIED BY 'sp1234';
GRANT ALL PRIVILEGES ON sp_db.* TO 'sp'@'localhost';
그 다음 서버 소스에 있는 스키마 SQL 파일을 import 해줘야 한다. 테이블이 없으면 서버 시작 자체가 안 된다. 처음에 이걸 빠뜨려서 한참 헤맸다.
config.ini 설정
서버 설정 파일은 이렇게 맞췄다.
[LOGIN]
port=21000
[DB]
ip=127.0.0.1
port=3306
user=sp
pw=sp1234
db=sp_db
[CHANNELSERVER]
port=9303
[CHANNEL1]
ip=127.0.0.1
port=9303
name=Test ChannelX1
이렇게 서버의 핵심 config 정보를 로컬에 맞게 바꾸어주고 딸깍 했더니...
에러가 폭발했다.
아니 이게 되는 소스 맞나? 싶었는데, 생각해보면 당연하다. 2000년대 초 코드를 2022년 Visual Studio에서 그냥 열었으니까. 하나씩 잡아보기로 했다.
에러 1: 헤더에 using namespace std
shared/typedefs.h 최상단에 떡하니 using namespace std;가 있었다. 헤더에 이게 있으면 이 헤더를 include하는 모든 파일에 namespace가 오염된다. 옛날에는 이렇게 짜는 게 흔했나보다.
그냥 지웠다. 그리고 Windows.h include 순서도 꼬여있어서 같이 정리했다.
에러 2: 클라이언트 하나 이상하면 서버 전체가 죽는다
Login32/LoginServer.cpp에서 accept가 실패하면 return false로 루프 자체가 종료됐다. 클라이언트 하나가 비정상적으로 접속해도 서버가 통째로 내려가는 구조였던 것이다.
// 원본: accept 실패 시 서버 종료
if (accept(...) == INVALID_SOCKET) return false;
// 수정: 그냥 다음 accept 대기
if (accept(...) == INVALID_SOCKET) continue;
로컬에서 혼자 쓸 거라 크게 문제는 안 되지만, 어쨌든 이래선 안 되니까 수정했다.
에러 3: 패킷 크기를 엉뚱한 타이밍에 읽는다
send() 할 때 패킷 크기를 ServerResponse() 호출 전에 읽고 있었다. 당연히 버퍼에 아무것도 안 들어있을 때 크기를 읽으니까 이상한 값이 나온다.
// 잘못된 순서
int pktsize = buffer[0]; // 아직 버퍼 비어있음
int pkts = PackHandle.ServerResponse(buffer); // 여기서 채워짐
// 올바른 순서
int pkts = PackHandle.ServerResponse(buffer); // 먼저 채우고
int pktsize = buffer[0]; // 그 다음 읽기
이런 거 클로드한테 물어보면서 잡았는데, 사실 이런 순서 버그는 컴파일 에러도 안 나고 그냥 이상하게 동작하기만 해서 찾기 더 빡세다.
에러 4: 구버전 MySQL 함수
mysql_use_result() 대신 mysql_store_result()를 써야 한다. 결과를 서버에서 한 번에 다 가져오냐, 한 줄씩 가져오냐의 차이인데 옛날 코드라 구버전 함수를 쓰고 있었다.
그리고 로그 메시지들이 한국어로 돼있어서 콘솔에서 다 깨져 나왔다. 그냥 영어로 바꿔버렸다.
빌드 성공! 무야호~
Login32.exe → bin\Login32_Release\
Channl32.exe → bin\Channl32_Release\
에러 0개를 보는 순간의 쾌감은 이루 말할 수 없었다.
그런데 실행해보니 또 다른 문제가 기다리고 있었다. iosocketdll.dll을 찾을 수 없다는 에러. 이건 다음 편에서 다룬다.
여튼.. 클로드의 은총으로 이렇게 내가 밑도 끝도 없는 도전을 할 수 있게 되었다.. 아무도 안보고 아무도 관심없겠지만
그래도 나는 틈날 때 마다 나만의 무언가를 만들어가도록 다시 시작해 봐야겠다.
'Game' 카테고리의 다른 글
| 내가 좋아했던 게임을 위한 파반느 (4) ~ 서바이벌 프로젝트를 내 로컬에서 ~ (0) | 2026.10.16 |
|---|---|
| 내가 좋아했던 게임을 위한 파반느 (2) ~ 서바이벌 프로젝트를 내 로컬에서 ~ (0) | 2026.10.16 |