백두산(넥슨) - 마비노기 브랜치 관리 전략과 도구 ¶
- 브랜치 관리는 힘들다. (Alienbrain 사용하는 듯?)
- 개선 방향
- Feature 단위로 변경점 검색
- Feature(피처) : 기능. ex) 스킬랭크, 자동생산, ...
- 피처로 묶기. 방법?
- 통행료처럼 소스 컨트롤로 가기 위해 반드시 거쳐야 하는 과정
- 체크인 순간을 hooking 하는 plug-in 을 통해서 관련피처 400개(헉..) 중에서 하나를 선택하게 한다.
- 피처별로 폴더 생성하고, feature.xml 에 다음과 같이 정리
- 이름, 키워드, 설명, 활성화시즌, 비활성화 시즌
- feature.xml 을 .h 로 사용자 지정 빌드해서 소스 코드 중에서 특정 코드의 활성화 여부를 결정.
- #define 과 비슷한 용도 enum _EGameFeature ...
- 개발 편의성 & 서비스 안정성 두 마리 토끼를 노렸음
- Q/A
- 콤보박스 뜰 때 XML를 get latest 하게 했다(Alienbrain get 이 느려다는 불만 있음)
- 애매한 피처를 구현, 수정했다면?
- '피처에 관계없음; 선택항목이 있다. 체크인할 때 팀장 확인을 받는다. 서비스 초기에는 피처에 관련없는 항목이 좀 있었을지 몰라도, 지금은 거의 해당 피처가 있다.
- enum 은 define 은 아니다. 그러면 그냥 xml 를 그대로 읽는게 더 낫지 않느냐
- runtime 비교하는 게 싫어서 그렇게 만들었다고...
- 마비노기 국가 브랜치 같은 경우 code 에 define 이 들어있기도 하고, data 스크립트로 나누기도 한다.
- 국가별 데이터 관리는?
- 텍스트는 따로 파일이 있다. 번역된 text 를 국가별로 따로 배포
- 이런 부분은 feature 로 안 한다.
조국현(넥스토릭) - 바람의 나라 타겟팅 시스템 개선 ¶
- 타겟팅이란? 마법 적용될 대상 선택하는 방법
- 서버에서 할 일 : 마법 사용될 때 대상 클래스, 파티 등을 보고 마법 걸릴 대상 골라내어 마법 적용하기
- 마법 data : 마법명, 클래스, 이펙트, 타겟팅 방법
- 옛날 타겟팅 방법
- 2번 : 지정된 타겟 주변 1칸
- 3번 : 클라 시야 전체
- 6번 : 캐스터 전방 3칸
- n : 시야에서 그룹원 제외
- n+1 : 시야에서 그룹원, 유저, 몬스터 제외
- 기획자가 처음 제안한 방식 : DCBAA / arg
- D 값은 지정된 타겟에 관련, C 는 속성, ...
- 의도는 좋지만, 좀 더 좋게 만들 수 있겠다.
- 프로그램적으로 나온 결과
- composite pattern 으로 여러 조합 가능한 타겟팅 시스템 제작
- 먼저 기존 코드에서 부품으로 사용할 수 있는 단위를 찾아 부품클래스로 구현
- 유저, 몬스터, 펫 체크(클래스)
- 전후좌우(방향)
- 범위, 위치, 상태, 제한...
- 부품 클래스 심볼을 테이블로 선언
- dia : TargetExtDiamond
- tri, rect, dan...
- *(And), +(OR), !(NOT)
- 예 : front1 + rear1 + left1 + right1 (십자가 모양), dia1 * !offset0, dia3 * !dia2
- 변환 후 결과
- 방법2 -> front1 + rear1 + left1 + right1
- 방법3 -> C
- 방법6 -> front3# (#는 캐스터 전방을 의미)
- 방법n -> C*!group
- 방법n+1 -> C*!(group+user+monster)
- 결론
- 전체 마법수 : 5300개 중에서 시스템 도입 후 1500 개 추가
- 타겟팅 조합 방법 : 28종 -> 96개 (사실 조합 방법은 무한)
- 타겟 시스템 메모리는 2MB 미만
- 프로그래머는 타겟팅 클래스 2개 추가를 위해 12줄 작성만 하면 되었음
- 기획자는 다양한 시도를 해 볼 수 있어서 좋아함
- 바람의 나라 서버는 Objective-C 를 사용한다. 써 보면 꽤 좋은 언어라고 함.