예전 게시글에서 웹게임을 만드는 토이프로젝트를 시작했다고 밝힌 바 있다. 처음 기획안을 작성하고 토이프로젝트를 시작한지 한달 조금 넘은 것 같은데, 초기에는 개발 실력이 너무 모자라서 손도 대지 못했던 것들을 최근 1-2주 사이에 조금씩 조금씩 구현하고 있다.
1-2주동안 게임상에 필요한 여러가지 기능들을 구현하는 테스트를 진행했었는데(아직은 실력이 모자라 구현하지 못하는 기능이 많다. 지금 실력 상으로는 코드를 아주 복~~~잡하게 짜서 만들 수야 있을 것 같은데 솔직히 성공할 수 있을지 잘.. 모르겠다.), 요 며칠동안은 게임 내에서 몬스터와 전투를 할 수 있는 시스템을 구현하는데 집중했었다. 결과는, 최소한 지금 시점에서는, 아주 긍정적.
그렇다고 구현하는 과정이 마냥 평탄했던 것은 아니었다. 중간에 장애물도 많이 만났었고, 그걸 해결하기 위해서 한참동안 머리를 싸매기도 했었다.
그 중에서 가장 까다롭고 어려웠던 것은 오늘 결국 구현에 성공한 기능이었다. 솔직히 가능할지 몰랐는데 결과가 긍정적으로 나와서 너무너무 기쁘다. 그래서 블로그에 내가 오늘 머리를 싸매며 고민했던 과정, 그것을 해결하기 위해 노력한 흔적들, 그리고 그로 인한 결과물을 기록하기 위해 이 글을 쓴다.
본문 시작
내가 만드는 웹게임의 전투시스템은(아니 사실 거의 대부분의 시스템이) Call of Cthulhu 7판의 규칙을 따른다. (콜 오브 크툴루는 주사위로 게임을 할 수 있는 TRPG 게임이다! 게임을 하기 위해 게임의 룰을 설명해 놓은 룰북이 존재한다. 나의 게임은 그 룰을 사용한 것.) 그 말은 즉, 전투에는 주사위 요소가 필요하다는 것이다. 뭐, 이건 진작에 구현해놓은 기능이었다.
문제는 게임을 플레이하는 플레이어가 무기를 착용했을 때 데미지를 어떻게 산출해야 하는가, 하는 부분이었다. 플레이어가 무기를 착용하지 않았을 때는 플레이어 케릭터의 기본 공격력을 공격에 사용하면 된다. 이 부분은 문제가 되지 않는다.
그러나 플레이어 케릭터의 손에 무기가 들려 있다면? 인게임에서는 적어도 2개 이상의 무기가 존재할텐데 내가 구현한 코드가 게임을 플레이하는 플레이어의 손에 어떤 무기가 들려 있는지 어떻게 알 수 있단 말인가?
이 값은 쉽게 예측할 수 있는 값이 아니기 때문에 로직을 어떻게 구현해야 할지 알 수 없었다. 사실 무기마다 데미지값이 고정되어 있다면 그렇게 어려운 상황은 아니다. 공격을 할 때 무기의 데미지값을 그냥 추가하면 되니까. 그런데 무기의 데미지는 고정된 데미지값이 아니라 '확률'에 근거한 가변한 값이었다. (위의 사진에 1D3, 2D4 등이 그것에 해당한다. 예를 들어 1D3은 "3면체 주사위를 한번 던져 나온 값"을 의미하며 2D4는 "4면체 주사위를 두번 던져 나온 값"을 의미한다.)
정말 한참을 고민하다가, 문득 함수로 해결이 가능하지 않을까 하는 생각이 들었다. 함수의 인자로 값을 주고 함수 내에서 수를 가공해서 산출하면 되지 않을까? 하는 생각. 그래서 탄생한 것이 아래의 식이다.
콘솔창에 나온 함수의 결과값을 보라!! 아름다운 결과에 기쁜 마음을 주체할 수 없었다. 그러나 기쁜 마음은 오래 가지 않아 또 다른 고민으로 바뀌고 말았다.
나는 무기의 데미지를 localStorage에 저장했는데, 주사위값을 함수화한 식을 localStorage에 저장하니 그 값이 고정된 값으로 저장되는 것이었다. 범위 내의 랜덤한 값이 나와줘야 하는데 고정된 값이라니... 좌절적인 결과에 내가 여지껏 헛짓거리를 한건가하는 생각이 들어 한참동안 모니터만 바라볼 따름이었다.
그러다, 머릿속에 있는 생각들을 좀 정리해보자 하는 마음으로 노트를 꺼내 들어 그 동안의 과정들을 적기 시작했다. 문제가 뭐였을까. 랜덤한 아이템을 골랐을 때, 그 아이템이 가지고 있는 확률을 어떻게 코딩 상에 반영할 수 있을까...
로직들을 노트에 정리하면서 내가 해결해야 하는 부분은 위의 그림에 '미지의 영역'으로 표시된 영역임을 알게 되었다. 랜덤하게 주어진 확률식을 랜덤하게 주사위를 굴려 고정된 정수값을 도출할 수 있는 방법은?
문득 중요한 것은 아이템이 랜덤하게 주어진다는 사실이 아니라는 것을 알게 되었다. 아이템이 랜덤하게 주어지든, 랜덤하게 주어지지 않든 중요한 것은 그 아이템을 가지고 '주사위를 굴려내는 식'이었다. 나는 위의 그림에 How로 표시된 영역에 집중하기 시작했다.
만약 How의 영역을 일종의 공장으로 만든다면 어떨까? 랜덤하게 주어진 아이템을 가공해서 특정한 값을 출력해낼 수 있는 기능을 가진 공장!
그렇게 가설 1이라는 공장을 만들었다. 그런데 다 만들고 보니 좀 이상했다. 이게 과연 기능을 할까? 하는 의문이 한편으로 들었지만, 느낌상 kit이라는 함수를 제거하면 보다 깔끔하면서도 잘 동작하는 코드를 만들 수 있을 것 같다는 생각이 들었다.
과감하게 kit 함수를 없앴다. 그리고 바로 입력값을 주사위를 굴리는 함수에 넣었다. (말을 안한 부분이 있다! 아이템 배열에서 한개의 값이었던 데미지 값을 두개의 값으로 나눴다. 한개는 xD를 저장하고, 다른 한개는 Dx를 저장한다. 그리고 각각의 배열값을 함수 내에 집어넣으면 되는 것. 이것이 오늘 여정에서 가장 중요한 인사이트였던 것 같다.)
그리고, 가설2를 컴퓨터상에서 증명해봤다. 두근두근... 과연 동작할까, 하는 마음으로.
결과는 성공적. 아이템이 무엇이든, 주사위 값이 무엇이든, 단 두개의 인자를 함수에 넣으면 해당 주사위의 결과값을 얻을 수 있다. 이제 저 공장을 전투 시스템에 편입하기만 하면 될 것이다.
사실 테스트를 하면서 마지막 코드 2줄이 같은 값이 나오면 어떻게 하나 많이 가슴을 졸였다. 다행히도 코드가 잘 동작했으니 망정이지 또 고정된 값이 나왔으면 아마 멘탈이 터졌을 것 같다 ㅋㅋㅠㅠ
끝
테스트 값을 전투시스템에 편입할 때도 많은 문제가 생길 것 같다. 뭔가 느낌이 그렇다.... 한번도 문제 없이 모든 기능이 단 한번에 제대로 흘러간 적이 없던 것 같다. 코딩이란 원래 그런 것일까?
그러나 문제가 생기면 해결하면 된다. 머리를 싸매고 고민을 하는 것도 코딩의 큰 즐거움이라 믿는다.
내일의 고민은 내일의 나에게 맡기며, 오늘은 좀 쉬어야겠다.
'[토이프로젝트] 웹게임 개발일기' 카테고리의 다른 글
노드JS.... (0) | 2021.10.12 |
---|---|
nodeJS를 이용한 로컬서버 구동 | module 문제 해결 (0) | 2021.10.03 |
[토이프로젝트] 프로젝트 재시작, 1주일 진행 상황 (0) | 2021.09.26 |
[토이프로젝트] 뒤엎다. 제대로 다시 시작하자! | 유지보수 고민 (0) | 2021.09.20 |
토이프로젝트 (0) | 2021.07.28 |