데코레이터 패턴을 이용한 집행검 인챈트 시스템 개발 #1

안녕하세요. 연두아빠에요.


오늘은 데코레이터 패턴을 이용하여 집행검 인챈트(Enchant) 시스템을 개발해 보겠습니다.

아... 이 집행검은 NC 소프트의 리니지라는 게임에 등장하는 진명황의 집행검이 아니구요.


연두아빠의 집행검이라고 불리는 아래와 같은 집행검입니다. 



후지다구요? 이 칼 디자인 하는데 거의 30분 넘게 걸렸습니다. 진짜에요...


언제나 그렇듯이 우리의 목적은 디자인 패턴을 공부하는 것이니까요.


아직은 비쥬얼에 신경쓰지 말고 열공합시다! 파이팅!



보통의 온라인 게임, 특히 MMO RPG((Massively Multiplayer Online Role-Playing Game)의 경우,


강화나 인챈트 시스템이 필수로 들어가곤 하죠.


오늘은 이 연두아빠의 집행검 전용 인챈트 시스템을 개발해보려고 합니다.


다들 벌써부터 심장이 두근 두근 하시리라 믿어보면서 시작해보겠습니다.



오늘 만들려는 인챈트 시스템의 대략적인 구상은 다음과 같습니다.



간단하죠? 인챈트를 시도할 것인지 물어보고, 인챈트를 시도할 경우, 인챈트를 진행합니다.


인챈트에 성공하면 집행검 앞에 여러가지 수식어가 붙게 됩니다.


마비노기 영웅전에서 사용되었던 접두어 시스템을 살짝 모방해보려고요.


몇 번째 인챈트인지에 따라 각기 다른 수식어가 붙게 되고요.


예를 들면 전설의 번쩍이는 슈퍼 집행검과 같은 식의 검 이름이 나오겠네요.


수식어만 달라지는게 아니라, 검에 화려한 이펙트도 수식어에 따라 달라져야 합니다.


각각의 수식어에 해당하는 가치도 각기 달라서 검의 전체적인 가치도 계산해야 하구요.


뿐만 아니라 각각의 수식어에는 해당되는 옵션들이 있습니다.


뭐 밸런스 같은거 신경은 기획자한테 맡기구요. 일단 우리끼리 한번 그냥 막 갔다 붙여 봅시다.


A랭크 수식어

전설의

모든 능력치 x 2

군주의

모든 능력치 x 1.5

어둠의

모든 능력치 x 1.2


B랭크 수식어

번쩍이는

모든 공격력 + 50

파괴적인

물리 공격력 + 50

마법같은

마법 공격력 + 50


C랭크 수식어

슈퍼

모든 속도 + 10

대박

공격 속도 + 10

번개

이동 속도 + 10

대충 훑어보니, 필요한 옵션 값들이 아래와 같네요.


  • 물리 공격력, 마법 공격력
  • 공격 속도, 이동 속도


좋습니다. 이제 한번 어떻게 만들어야 할지 함께 고민을 해봅시다.


음... 간단히 만들고 싶었는데 기획이 약간 거창하게 나온 것 같아서 조금 걱정 되기도 하지만,


일단 그냥 떠오르는데로 클래스를 설계 해보면 아래와 같이 나올 것 같은데요?



어떠신가요? 여러분이 생각한거랑 얼추 비슷하게 나왔나요?


인챈트를 할때마다 수식어를 랜덤으로 결정하고, 수식어에 해당하는 수치를 증가 시키면 될 것 같네요.


훌륭합니다! 이 정도면 충분히 인챈트 시스템을 구현할 수 있을 것 같아요.



어!? 그런데... 제일 먼저 문제점이 눈에 들어옵니다.


분명히 인챈트 시스템의 기획 내용 중에 모든 수식어가 제각각 다른 이펙트를 갖는다고 했는데...


이렇게 만들게 되면, 모든 인챈트 수식어에 해당하는 이펙트들을 처리하기 위한 코드들이


전부 이 클래스로 들어가버리게 되겠네요...


인챈트 수식어가 종류가 늘어날 수록 이 클래스의 코드가 점점 더 복잡해 지겠네요...



그리고 기획이 바뀌어서 인챈트 속성 별 효과 수치가 변경이 된다면?


예를 들면 전설의 속성모든 능력치 x 2였는데 밸런스 문제로 모든 능력치 x 1.8이 된다면?


처음 부터 모든 인챈트 속성의 증가 값들을 다시 계산해 주어야 겠네요.


인챈트 속성이 변경될 때마다 모든 유저의 추가 능력치를 다시 계산해서 DB에 넣어줘야 한다는건데...


아무래도 이건 아닌 것 같습니다. 기획이 변경될때 한가지 속성만 변경되는 것도 아닐테고...



오! 좋은 생각이 떠올랐어요! 지난 포스팅에서 배웠던 전략 패턴을 사용해볼까요?


전략 패턴, 스트레티지 패턴이 기억이 안나시는 분은 이전 포스팅을 참고하세요!


전략 패턴 (Stretegy Pattern)을 이용한 드래곤볼 게임 개발 #1



전략 패턴을 이용해보면 대략 아래와 같은 구조가 나오겠네요!



위와 같은 식으로 IEnchantable이라는 인터페이스를 만들고 각 랭크의 세부 속성들을 구현합니다.


전설의(Legendary), 군주의(Monarchical), 어둠의(Dark) 처럼요...


그림에는 간단히 A 랭크 관련 속성들만 표시했지만, 모든 인챈트 속성을 클래스를 만들어 주면 되겠죠?



음...? 생각보다 괜찮은 것 같은데요?


이런식으로 하면, 일단 이펙트도 각각의 인챈트 속성 클래스에 구현할 수 있으니 깔끔하고,


각 인챈트 별로 추가 되는 수치들은 EnchantOption이라는 클래스를 리턴하면 될 것 같아요.


그럼 이걸로 오늘의 스터디를 마치겠습니다...



앗, 스터디를 끝내려고 하는데 오늘도 기획이 변경되었다는 메일이 날아왔네요.

D랭크, E랭크도 추가해주세요.

억... 어쩔 수 없네요. Enchant System의 멤버 변수로 아래 두 줄을 추가해 넣습니다.


IEnchantable DRank;

IEnchantable ERank;


적용 되었다고 알려주고 쉬고 있는데 또 기획을 추가 변경하겠다고 메일이 왔네요.

같은 속성에 대해 최대 3회까지 중복 인챈트가 가능합니다.

  * 중복되는 속성은 컬러로 구분하여 표시합니다.

이런... 중복이 가능하다고 하네요.


예를 들어 전설의 인챈트가 1회일땐 하얀색, 2회일땐 분홍색, 3회일땐 빨간색 이런식으로요...


음... 어쩔 수 없죠... 그럼 IEnchantable에 Count 변수를 넣어서...


잠깐 IEnchantable은 인터페이스인데... 으악... 오늘도 또 꼬이기 시작하네요...


IEnchantable을 인터페이스로 구현하지 말고 추상클래스로 변경해야 할까요?



잠깐만요! 그런데 우리가 지난번 포스팅에서 공부했던 SOLID 원칙 기억 나시나요?


내맘대로 정의하는 디자인 패턴! 디자인 패턴이란 무엇인가?


위에 포스트에서 배웠던 디자인 패턴의 설계 원칙들이요!


OCP(The Open-Closed Principle) : 개방-폐쇄의 원칙


클래스나 모듈, 기능들에 있어 확장에 대해서는 Open, 변경에 대해서는 Close.


SOLID 원칙 중에 OCP에 대한 설명입니다.


클래스나 모듈, 기능들에 있어 확장에 대해서는 열려있어야 하지만...


변경에 대해서는 닫혀있답니다. 즉 기획이 바뀌어도 코드를 수정하지 않아야 합니다.


우리 근데 벌써 코드 두번이나 바꾸게 생겼잖아요.



물론, 이렇게 계속 발전시켜 나가도 땜빵 코드와 예외 처리 등으로 대충 대응은 할 수 있겠지만...


디자인 패턴을 스터디 하는 중이니 최대한 저 SOLID 원칙을 지킬 수 있는 방법들을 공부해야겠죠?


이런 상황에 딱 맞는 디자인 패턴이 하나 있습니다.


바로 장식자 패턴, 데코레이터 패턴(Decorator Pattern) 이라는 녀석인데요.


다음 포스팅에서 이 전략 패턴을 사용해서 한번 이런 지속적인 기획의 변경에도 적절히 대응 할 수 있는


방법을 알아보고 직접 C# 코드로 집행검 인챈트 시스템을 개발해 보도록 하겠습니다.


공감() 및 댓글은 글쓴이에게 커다란 힘이 됩니다.


길지 않은 이 글을 쓰는데 나름 몇 시간이 걸렸어요^^;


저에게 1초만 시간을 내주셔서 공감 버튼 꾸욱 눌러주세요^^


제 블로그를 방문해 주신 모든 분들 사랑합니다^^


이상입니다. 감사합니다!

이 글을 공유하기

댓글

Designed by CMSFactory.NET