프로그래밍 언어 입문서가 아닌 프로그래밍 기초 개념 입문서
문과생, 비전공자를 위한 프로그래밍 입문책입니다.
jobGuid 꽃미남 프로그래머 "Pope Kim"님의 이론이나 수학에 치우치지 않고 실무에 곧바로 쓸 수 있는 실용적인 셰이더 프로그래밍 입문서 #겁나친절 jobGuid "1판의내용"에 "새로바뀐북미게임업계분위기"와 "비자관련정보", "1판을 기반으로 북미취업에 성공하신 분들의 생생한 경험담"을 담았습니다.
Posted by 주 민석

안녕하세요. 게임기획자 주민석 입니다.

캐릭터 파라미터, 몬스터 파라미터, 퀘스트 파라미터 등 DB에 저장할 필요 없고, 값이 고정적인 파라미터(일시적으로 변동 되긴 하지만 DB에 저장 될 필요 없는)를 FDB(Fixed Data Base)라고 부르고 있습니다. 보통 이런 FDB를 게임에 적용하는 방법은 기획에서 엑셀로 데이터를 작성하고, 규약 된 XML로 추출하여 파싱하거나, CSV 파일 형태로 사용하는 방법도 있죠. 보통 FDB의 작성과 관리는 리드 프로그래머의 취향에 따라 결정 되는 것 같습니다.

오늘 말씀 드릴 내용은 제가 두개의 MMORPG를 개발하면서 사용했던 FDB의 작성 방법에 대해서 입니다. 보편적으론 XML을 많이 사용하는 것으로 알고 있는데, 저는 Config 라고 부르는 형태의 파서를 통해 작업 하였습니다.

제가 초짜 기획팀장으로 MMORPG를 개발할 때 서버 엔진이 Config라는 형태로 데이터를 파싱하도록 구현 되었고, 저는 그 뒤로 10년을 같은 서버, 클라이언트 프로그래머 분들과 함께 해왔기 때문에 선택의 여지 없이 Config라는 형태로 데이터를 작성하게 되었습니다.

지금은 XML을 사용해서 작업하고 있는데 Config와 비교해서 무엇이 좋다. 어렇게 해야한다. 하는 내용은 아닙니다. 

'아~ 이렇게 개발하는 사람도 있었구나' 정도로 봐주세요.

 

1. Config의 기본 형태

제일 간단한 형태부터 예를 들어 설명 하자면

힘 : 50 / 민첩 : 25 / 지능 : 15 / 체력 : 80 / 마력 : 40 의 파라미터를 가진 인덱스 1번의 몬스터가 있습니다.

이 것을 보통 XML로 표현하면

<mob>

<index>1</index> 

<str>50</str>

<dex>25</dex>

<int>15</int>

<hea>80</hea>

<mana>40</mana>

</mob>

이렇습니다. 이 것을 Config는 이렇게 표현 합니다.

( inxdex 1 (str 50) (dex 25) (int 15) (hea 80) (mana : 40) )

(필드명 필드값) 이 기본 구조입니다. 괄호는 시작과 끝을 알려주는 중요한 구분입니다.

하나의 몬스터의 파라미터임을 정의해주기 위해 ( index 값 (필드명 필드값) ... ) 이렇게 대괄호로 묶어주었습니다.

괄호 열기와 괄호 닫기는 파싱의 기준이 되므로 꼭 쌍이 맞아야 합니다.

 

2. Config의 응용 형태

Config의 기본 형태는 (필드명 필드값) 이지만 (필드명 필드값 필드값) (필드명 (필드값) (필드값)) 등으로 상황에 맞춰 응용하여 사용할 수 있습니다. 물론 프로그래머와 값 입력 방식을 사전에 규약해야 합니다.

예를 들어 최소공격력 40, 최대공격력 50 인 몬스터를 표현하면

(minattack 40) (maxattack 50) 이렇게 할 수도 있지만,

(attack 40 50) 또는 (attack (min 40) (max 50)) 등으로도 작성할 수 있습니다.

규약의 기준은 어떤 방법으로 작성하는 것이 개발하기 편리하고 추후 가독성이 높은지를 고려하여 결정하였습니다.

 

3. Config 작성 및 추출 방법

마찬가지로 엑셀을 사용합니다. 

기본적으로 두개의 시트를 사용하는데, 첫번째 시트는 기획자들이 데이터를 입력하는 시트 입니다. 이 시트의 구성은 기획자들이 보기 편하고, 입력하기 편하게 구성 합니다. 두번째 시트는 첫번째 시트에서 입력 된 값을 합수를 이용해 ( 필드 값 (필드명 값) (필드명 값) (필드명 값 값) (필드명 (값) (값) ) 형식의 Config로 전환해 주는 시트 입니다. 서버 혹은 클라이언트로 Config를 넘길 때는 두번째 시트를 전체복사 하여 txt 파일에 붙여넣기 한 뒤 전달하는게 제가 그동안 사용한 FDB 제작 공정 입니다.

순서대로 스샷과 함께 다시 정리 해보겠습니다.

a. 엑셀에서 데이터를 입력 

위 스크린샷과 같이 데이터를 입력합니다. 이 시트는 기획자가 수치를 입력하기 편리하게 제작했습니다. 시트에 밸런스를 확인하기 위해 최종 Config로 뽑지 않아도 되는 값, 기획적 분류를 위한 값들을 포함하고 있어도 무관합니다.

b. 액셀에서 수식을 이용 Config 형태로 변환

선택 된 셀을 보시면 IF, ISBLANK 함수를 활용하여 (sta 46)의 필드와 필드값을 가진 Config로 변환 된 것을 보실 수 있습니다. 이렇게 첫번째 시트의 값을 함수를 이용하여 두번째 시트에서 Config에 정의 된 패턴으로 변환 합니다.

아래 시트명을 보시면 'Parameter'가 기획자들이 작업하는 시트입니다. initnpc는 parameter에서 npc 능력치 및 파라미터 정보와 관련 된 값들을 Config로 전환한 것입니다. TW_initnpc는 parameter에서 대만에 서비스 될 npc의 능력치 및 파라미터 정보를 Config로 전환한 것입니다. NPCname은 parameter에서 npc의 이름과 설명에 관한 정보만 별도의 Config로 전환한 것입니다.

보시다시피 기획자가 하나의 시트에서 통합적으로 관리하여 여러 종류의 Config로 출력할 수 있도록 하였습니다.

c. txt 파일로 저장

엑셀의 Config 시트를 전체복사+카피 하여 txt 파일에 전체 붙여넣기 하고 txt 파일로 저장한 뒤에 서버/클라이언트에 전송하면 끝.


4. Config 제작에 사용 된 엑셀 함수

위에 보여진 Config에는 엑셀의 IF 함수와 ISBLANK 함수를 동시에 사용하였습니다.

보통 =IF(ISBLANK(Parameter!A2), "", "("&Parameter$A$1&" "&ParameterA2&")" ) 형태의 함수인데 ISBLANK는 괄호 안에 지정 된 셀이 공백인지 확인하는 함수 입니다. 만약 공백이라면 IF에서 참으로 "", 즉 공백을 현재 셀에 반환할 것이고 지정 된 셀에 값이 있다면 거짓으로 (필드명 필드값) 형태로 값을 반환하여 현재 셀에 입력하라는 내용입니다.

Parameter 시트에서는 한글 혹은 영문으로 표기해야 하고 Config에서는 숫자로 출력해야 하는 경우가 있습니다. 예를 들어 NPC의 종족 구분 같은 경우인데 Parameter 에서는 기획자들이 확인하기 쉽게 사람, 동물, 귀신 등으로 작성하고 싶지만 Config에서는 (species 1), (species  2) 등으로 규약 된 경우 입니다. 이 때는 vlookup 을 이용해 간단히 해결할 수 있습니다.

 

5. 마치며

Config에 대한 장단점은 언급하지 않겠습니다. 제가 이 방식을 10년 고수해왔기 때문에 다른 방법보다 Config가 익숙하고 편하기 때문에 장단점을 비교하기는 어려울 것 같습니다. 어느덧 100라인이 넘는 Config를 엑셀 도움 없이 text 편집기로 바로 작업해도 괄호 열고 닫고 짝 맞춤도 틀리지 않고, 1000라인 넘어가는 Config도 뻑이나면 눈대중으로 훑어 보고 오류 지점을 찾아내는 생활의 달인급 경지에 올랐거든요. ㅡ,.ㅡ;;;

죽 써놓고 보니 오늘 내용은 참 별거 없네요. ㅎㅎㅎ

 

** 위 문서 스크린샷은 현재 국내 서비스가 종료 된 SP1 Online의 실무에 사용 되었던 데이터 입니다. SP1 Online 국내 서비스가 종료 되었고, 창업 멤버로 참여했던 실버포션도 폐업 하였기에 데이터 일부를 지식 공유 차원에서 공개하였습니다. 속쓰리네요. T,.T

댓글을 달아 주세요

  1. Favicon of http://lunapiece.net Lyn 2012.04.20 09:44  댓글주소  수정/삭제  댓글쓰기

    오히려 json 에 가까워보이는 문법이군요

    • Favicon of https://gamedevforever.com 주 민석 2012.04.20 12:22 신고  댓글주소  수정/삭제

      웹서버 패킷 전송에 json을 쓰는구나 정도만 알지 json 문법은 몰라서 비슷한가 찾아 봤습니다. 괄호 열고 닫고 하는 부분이 비슷하군요.

  2. C17 2012.04.20 09:51  댓글주소  수정/삭제  댓글쓰기

    괄호들을 보니 lisp이 생각나네요ㅎㅎ

  3. Favicon of http://bluekms21.blog.me 크로스 2012.04.20 11:40  댓글주소  수정/삭제  댓글쓰기

    내용은 그렇구나.. 하고 읽었는데
    마지막 두줄이 정말.. 크으.. ㅠㅠ;;

  4. 잠자는양 2012.04.20 15:04  댓글주소  수정/삭제  댓글쓰기

    언차티드2 state script의 변수 선언과 비슷한 것이 많네요.

    :declarations(decl-list
    (var "num-attempts" :type int32)
    (var "is-locked" :boolean :default #t)
    )

    그리고 이것 역시 lisp의 영향을 받아서 괄호가 많아요^^

    자세한 것은 gdc2009년 너트독 발표자료에 있어요.

    • Favicon of https://gamedevforever.com 주 민석 2012.04.20 17:08 신고  댓글주소  수정/삭제

      출력 되어야 할 문자나 가져와야 할 문자 정보(아이콘의 파일명, 애니메이션 파일명 등)는 (icon "icon1.bmp";) 이런식으로 따옴표 처리해서 사용하는 것도 비슷하네요.