제 머릿속에서는 막
시작할 때 애니메이션으로 바람이 불어오면서 푸른 하늘이 노랗게 되고
성 그림도 그냥 네모가 아니고 더 예쁘고
성 누르면 마을 이미지가 위에서 뚝 떨어지고 시장, 농장, 병영 표시가 달려있고 막
업그레이드되면 모습도 변하고
그렇지만 사실 UI는 안 만들었습니다.
세력도 성도 3개만 넣었습니다.
전체적인 웹게임 클라이언트-서버 시스템을 어떻게 구현하는지에 집중했어요.
UI는 초 단순하게 텍스트 + 버튼 뿐입니다.
사실 더 단순하게 이렇게 만들까도 싶었습니다.
[마을(1203)🔽] 🏰6⚖️4👨🏿🌾5🧱3 🗡️7800🏇4500 💰3200🌾2300 🎚️🔼
아무튼
침하하에 웹게임을 고려하는 침착맨님께, 만들어본 결과 든 생각을 먼저 말씀드리자면,
1. 웹게임 만드는 것은 간단하다.
2. 침하하에 비하면 서버비 부담은 무시해도 될 수준일 것이다.
아래는 장문의 게임에 대한 글입니다.
목차
1. 게임에 대해
2. 시스템 구조
3. 침하하에 웹게임 가능한가?
4. 이 버전에 대하여
5. 추가해 볼 만한 것들
1. 게임에 대해
기본적으로 오게임, 부족전쟁 라이크입니다.
조금 더 최신으로는 클래시오브클랜, 라이즈오브킹덤즈, 마피아시티, 삼국지전략판 등이 있습니다.
혹은 룰더스카이 처럼 더 소셜게임에 가까운 경우도 있습니다.
잘 모르시는 분들을 위해 설명하자면,
게임 내용
1. 시장, 농장의 레벨을 높이면 금, 쌀 생산량이 많아집니다.
2. 마을회관의 레벨을 먼저 올려야 합니다.
3. 병사를 모아서 다른 마을을 점령할 수 있습니다.
4. 마을마다 좌표가 있습니다.
=> 저는 조금 다른 선택을 했어요. 지역들이 있고, 지역 내에 마을 수는 한도 없이.
왜냐면, 대륙 크기는 정해져있는데 유저가 생각보다 많으면 자리가 없고, 유저가 생각보다 적으면 황량할 수 있어서 이런 선택을 했습니다.
더 구체적인 규칙은 글이 길어지니 생략하겠습니다.
2. 시스템 구조
유저가 웹에서 html의 버튼을 누르면
javascript가 서버로 POST 보냄.
python 서버에서 (서버가 자고 있다면 깨운 뒤 DB들 다시 열어서)
1. 업데이트 DB의 내용을 현 시각까지 적용 후
2. 해당 POST가 적법한지 확인하고
3. 업데이트 DB에 추가
일부 정보는 유저에게 전송
유저 데이터베이스 (DB): 유저 ID, 유저 비번, 유저의 마을 목록
마을 DB: 마을 ID, 소유 유저 ID, 건물들 lv, 자원, 병사
업데이트 DB: 명령한 유저 ID, 목표 마을 ID, 행동, 완료 시간
3. 침하하에 웹게임 가능한가?
서버에 관해 고려해야 할 사항은 두 가지입니다.
A. 서버의 대역폭
유저에게 얼마만큼의 정보를 보내줄 것인가의 문제입니다.
유저 한 명에게 한 마을의 정보를 준다면, 건물들 레벨, 건설 완료 시간 정도니까, 잘 압축하면 30바이트면 충분합니다.
10,000 명이 10초당 한 번씩 요청을 해도, 30kb/s입니다.
참고로 jpg 짤 하나가 보통 100kb 정도 합니다.
더 중요한 문제는 유저에게 다른 마을의 정보를 주는 부분입니다.
만 명에게 만 명의 정보를 주면 1억 개가 되어버리죠.
제가 택한 방식은
a. 다른 마을은 소속 지역과 소속 세력 정보만 전달 => 한 마을당 2바이트. 만 개의 마을이면 20kb
b. 메인 서버와 별개인, 조회가 더 용이한 곳에 이 정보를 저장해두고 거기서 전달
B. 서버의 연산량
장부를 열람하고 그걸 바탕으로 더하기 빼기를 해서 다시 기록하는 것이 전부입니다.
열람은 마을 번호, 유저 번호를 찾는 거라 log(유저수)로 무시해도 되겠습니다.
더하기 빼기의 경우, 가장 복잡한 경우가 전투 결과를 계산하는 함수인데, 그래봤자 수십 번의 더하기 빼기 혹은 대소 비교뿐입니다.
업데이트 DB에는 기록할 때 완료 시간 순으로 기록할 것이라 log(예약된 업데이트 수) 정도입니다.
결론적으로 분 당 수십만 개의 요청이 들어와도 일반적인 CPU와 메모리에게는 일도 아닙니다.
(오게임, 부족전쟁이 2000년대 중후반의 옛날 하드웨어와 외국의 열악했던 인터넷 상황에서도 운영되었다는 점.)
저는 무료 서버를 써서 버벅일 수도 있지만 (CPU도 느리고, 무엇보다 평소에 자고 있어요. 그러다 구몬 선생님 맞이하는 아이처럼 됨),
침하하의 기준에서는 무시해도 될 정도의 부담일 거라고 생각합니다.
4. 이 버전에 대해
이 알파? 프리알파? 아무튼 이 견본 버전은 전체적인 시스템을 어떻게 구현하는지를 보는 것을 중점으로 했습니다.
1. 자원 생산량, 건축비, 모병비 등의 구체적인 숫자의 밸런스는 맞추지 않은 상태임.
2. 지역의 수는 3개만 했음.
3. 엣지 케이스들 고려안함.
- 예를 들어, 적 세력 마을에 공격을 보냈는데, 그 사이에 우리 세력의 다른 사람이 점령했다? -> 현재는 회군 없이 그대로 흡수됨.
- 징병을 했는데, 적군에 먹힌 뒤 징병이 완료되면? -> 현재는 징병된 군대가 공격을 함.
- 징병을 했는데, 적군에 먹힌 뒤, 다른 아군 유저가 다시 점령한다면? -> 징병된 군대가 다른 유저에게 합류함.
등등 끝도 없음.
사실 생각지도 못한 시나리오 터지면 서버 코드가 오류로 정지될 수도 있음.
(예전에 카드 게임 만든 것은 무한 루프가 도는 경우가 있었음. 치료와 공격이 밸런스를 맞춰서 무한히 돌아감.)
4. 악의적인 유저에 대한 대비 안 함.
- 예를 들어, 아이디 무한 생성. (네이버 메일로만 아이디 만들 수 있게 하는 게 제일 쉬운 해결책일 듯)
- 매크로로 무한히 POST 요청 (사실상 디도스. 이건 시도가 너무 잦으면 IP밴 하는 식으로?)
- 새로 생긴 마을을 바로 급습하는 경우 (이건 보호 시간 걸면 바로 해결됨)
등등
간단히 몇 분 코드짜면 해결 가능한 것들도 있지만, 안 한 이유는 2가지임.
A. 하기 시작하면 머리 속의 쉐도우 복싱이 시작되고 끝도 없이 이런 경우는? 이런 경우는? 하면서 시간이 훌쩍감.
B. 하나씩은 금방하지만 이런게 너무 많음.
5. 추가해 볼 만한 것들
일단 최대한 단순하게 만들었습니다.
사실 더 단순하면 좋겠다 싶음.
바둑이나 체스 보면 규칙은 단순한데 양상은 복잡하고 흥미롭잖아요? 콘웨이 게임 오브 라이프 멋있잖아요
다만 더 고민되는 부분은 사람들이 pk를 싫어한다는 점입니다.
(매칭시스템이 있고 매판 제로에서 시작하는 경우는 여전히 aos나 fps나 인기지만.)
당하는 것은 재미가 없고, 애당초 공격적인 걸 싫어하는 사람도 많고.
(그런데 또 타르코프는 인기가 많고...)
아무튼 추가적으로 구현하면 재밌을 것들
1. 장수. (출진 수, 승패에 영향, 자원 생산에 영향)
2. 착용 아이템
3. 신규 마을 보호 시간
4. 더 많은 지역들. 근처 지역으로만 출진 가능하게. 관에서 막기 가능하게.
5. 지역별 특수 병종들 (남만병, 청주병, ...), 더 복잡한 전투 계산
6. 확장. (현재는 새 아이디 만들어서 그 마을 점령하면 됨)
7. 그래픽. 소리 효과.
8. 점령 기록을 남기게 했는데, 재생해서 볼 수 있으면 좋을 듯.
9. 계략, 정찰 등등 더 다양한 옵션들.
10. 다른마을 정보 마을lv이나 성벽lv정도 더 볼 수 있게.
11. 자원, 병사 단위를 100배 1000배 뻥튀기
혹은 도파민 전문가들의 오랜 연구의 결정체인
일일접속보상, 배틀패스식 보상, 업적, 칭호, 테크트리를 통한 건물 해제 등등도 넣어볼 수 있겠죠.
설계하는 데 시간이 걸리지 코딩은 하루이틀이면 할 수 있겠네요.
그 밖에 재밌을만한 것들 있으면 이야기 나눠봐요.
특히 가끔씩이라도 계속 생각을 해보셨을 침방장의 아이디어들도 궁금합니다.
재밌게 만들어져서 침하하의 한 귀퉁이에 자리 잡을 수 있다면 최고의 성공이겠쥬.
(혹은 모멘텀을 잃는다면 그대로 좌초…)