Game Dev/Article 59

VS2013에 TortiseGitBlame 연결하기

VS2013에 MACRO Manager가 사라졌기 때문에 기존에 사용했던 Blame Macro를 사용할 수 없게 되었는데 이를 해결하기 위해 External Tool을 사용하는 방법을 정리한다. Tools > External Tools 이동Blame 관련 Command 추가하기Arguments : "/command:blame /path:"$(ItemPath)" /line:$(CurLine) /startrev:1 /endrev:-1"추가된 Command가 몇 번째 위치인지 확인하기Tools > Options > Envirionment > Keyboard 이동"Tools.ExternalCommand" 검색3번에서 확인한 번호의 ExternalCommand에 원하는 키 매핑 참고http://msdn.micro..

Game Dev/Article 2014.07.09

에밀레종을 만들지 말자.

종소리가 나지 않아, 갓난 아이를 쇳물에 넣었다는 에밀레종 전설. 불행인지 다행인지 아이를 시주한 뒤 종은 완성되었다. 그것도 아주 아름다운 소리를 내는 종으로 오늘날까지 보존되고 있다. 하지만 이와 같은 방식으로 제2, 제3의 에밀레종을 계속 만들 수 있었을까? 요새 우리 프로젝트가 에밀레종 전설을 따라가고 있지는 않은지 걱정된다. "Epic 결과물"을 내기 위해서는 이러한 희생이 당연한 것인가? 사실 조금은 아리송하다. 철저히 계획적이고, 관리된, 이상적인 프로젝트 성공사례를 잘 알지 못하기에... 만약 내가 아닌 다른 사람이 희생하여 프로젝트가 성공한다면 나는 모른척 그 성공을 즐길 것인가? 이것도 잘 모르겠다. 나도 이기적인 인간 중 하나이기에... 하지만 확실한건 옆에 사람이 괴로워하는 과정을 ..

Game Dev/Article 2013.03.26

간단한 Python 문법 정리 (XML 파싱 기준)

준비물 Python Install : http://www.python.org/download/ 나는 3.2.2 버전을 설치했다. Loop 아래 예제의 첫번째 방법은 C++의 foreach 구문과 비슷하고, 두번째 방법은 for 구문과 비슷하다. 루프나 비교문 내부는 C++의 { } 대신 띄어쓰기로 구분을 하므로 주의해야 한다. list = ['A', 'B', 'C'] for i in list: print(i) count = len(list) for i in range(count): print(str(i) + ':' + list[i]) 함수 선언 함수는 def 키워드로 선언을 한다. 함수 내부 정의 역시 띄어쓰기로 구분을 한다. def Func(param): print(param) 전역 변수 전역 변수는 ..

Game Dev/Article 2011.09.29

NDC2011 - 메이플스토리 개발스토리 Legacy Code - 유산과 함께 살아가기

김준엽 (넥슨 라이브팀) 다른 팀에서 근무하다가 도중에 메이플 스토리로 팀을 옮기게 됐다고 한다. 성공한 게임을 개발한 팀에서 개발하게 된다는 환상 뒤에는 서비스 8년(개발한지는 거의 10년)이 된 낡은 코드와 시스템이 있었다. 퀘스트 편집기라는 툴이 있는데 MFC와 변형된 Component인 PCOM, 가장 중요하게 기획자들이 사용하기 힘든 사용법 때문에 변화가 필요했다. 그래서 이번에는 C#과 .NET Framework를 가지고 새로 만들어 보기로 했다. 하지만 PCOM 인터페이스 때문에 Managed C++로 Wrapping이 필요했고, ILMerge 라는 프로그램도 사용했다. "해적"이라는 대규모 패치가 기획되었다. 제작 기간은 무려 1..

Game Dev/Article 2011.06.01

내가 만들고 싶은 회사 (작성 중)

게임코디에 Alucard님이 자신이 만들고 싶은 회사라는 글을 쓰셔서 이 참에 나도 정리해보련다. 꿈을 어딘가에 적고, 누군가에 말하고, 계속 생각하면 이룰 가능성이 더 크다더라. - 게임회사 (PC, 온라인) - 공동 창업자 2~3인 - 시작은 10~20명 규모 - 공동 창업자(경영자)와 직원들의 의견에 따라 만들고 싶은 게임 - 프로토타입 제작 후 투자받는 것을 고려 - 개인적으로는 한적한 교외도 좋지만 인력 수급에 따라 다를 수 있음 - 개발실 중심부는 약간 어두운 조명을 유지하고 책상마다 스탠드로 각자 밝기를 결정 (독서실과 유사하다고 보면 되며, 조명 밝기가 중요한 것이 아니라 집중과 눈의 피로가 우선) - 개발실의 외벽쪽은 최대한 창을 만듦 - 나무는 최대한 많은 곳에 놓아두며 1주일씩 파트가..

Game Dev/Article 2011.05.24

Float 상수의 컴파일-타임 최적화

도저히 메모리를 변조할 수가 없는 상황에서 해킹이 발생하였다. 예를들어 이런 코드다. float foo(float input) { if (input > 0) return input * 10.0f; else return input * -20.0f; } void main() { float f = 0; scanf("%f", &f); // 사용자는 항상 올바른 입력을 한다고 가정 float g = foo(f); printf("%f", g); } 예제이므로 코드 내용에는 큰 의미를 부여할 필요는 없음 foo 함수의 input이 매번 새로 입력되고 새로 계산되므로 리턴 값은 사용자가 입력한 값의 10배 혹은 -20배가 되어야 한다. 하지만 10이나 -20 이외의 수가 곱해져 나왔다면? 이건 무언가 잘못된 것이다. ..

Game Dev/Article 2011.03.31

메모리 변조를 막는 Coding

코드 영역을 변조하는 경우는 nProtect나 기타 보안 모듈을 통해서 검출이 가능한데 메모리 변조를 하는 경우는 검출하기가 힘든 것 같다. 따라서 이 포스트에 간단하게 메모리 변조 해키에 대응하는 코드 작성법을 정리해 놓는다. 1. 검증과 방어 간단하다. 예상되는 입력과 출력이 맞는지 코드를 항상 검증한다. 2. 안전한 함수, 안전한 자료형 seed 값이 노출 될 경우 rand 함수의 결과값을 100% 예측할 수 있다. 또 strcpy, strcat 등의 문자열 조작 함수는 버퍼 오버런 공격을 당할 위험이 크다. 따라서 WinCrypt.h에 포함된 CryptGenRandom 함수나 strcpy_s, strcat_s 등의 안전한 함수를 사용하고 기본 자료형을 Wrap한 자료형을 사용하도록 한다. 3. 메..

Game Dev/Article 2011.03.11

최근 일하면서 느낀 점들

1. 능력 없는 프로그래머는 회사에 존재할 이유가 없다. 아무것도 할 줄 모른다고 내버려 둬서는 안된다. 이들이 하는 일은 제로가 아니다. 다른 사람들의 일을 방해하기 때문이다. 소스 잘못 짜서 체크인 하면 고쳐야지, 모른다고 달려오면 알려줘야지... 하지만 웃긴 것은 아무리 "연봉제" "성과제"라고 하지만 이런 사람들이 짤리거나 연봉이 깎이는 것은 보지 못했다. "연봉은 삭감되지 않는다. 다만 동결될 뿐.." 2. 오래 지속하고 싶은 프로젝트 일수록 TDD는 필수! 현재 일하는 프로젝트는 7-8년 전부터 시작된 프로젝트이다. 그래서 컴파일러도 구형이고 소스 컨트롤 프로그램도 CVS를 쓴다. 나름의 이유야 있었겠지만 프로그램 구조도 좋지는 않은데, 이 모든 것들이 "여력이 없다." "현재 상용화 중이라 ..

Game Dev/Article 2011.03.04

우리나라는 왜 닌텐도DS 같은 게임기 못 만드는가

얼마전이라기엔 꽤 오래전에 친애하는 이명박 대통령 각하께서 이런 말을 했다. "우리나라는 닌텐도(DS) 같은것 못 만드나?" "우리나라도 이런 게임기 만들어보자." 사실 우리나라도 저런 게임기 만들 기술력 충분히 있다고 생각한다. 그리고 Made In Korea 게임기가 없는 것은 아니다. 예전으로 거슬러 올라가면 삼성의 게임보이라는 8비트 게임기가 있었고 (본인이 소유했었음) 가깝게는 GP32, GP2X 등의 휴대용 게임기가 개발되었다. 하지만 이 게임기들 모두 흥행에 성공하지 못했다. 왜일까? 기계의 성능이 나빠서? 가격이 비싸서? 절대 아니다. 정답은 "할 게임이 없어서"다. 기계의 성능이 흥행을 좌우한다면 PS3, XBOX360 등이 판치던 작년과 재작년 Wii 돌풍을 설명할 수 없고, 우리나라 ..

Game Dev/Article 2010.09.07