메뉴 건너뛰기

창조도시 기록보관소

RPG2K 은행 시스템 구현하기

2009.07.07 08:36

앞만보맨 조회 수:354

http://littlebrain.tistory.com/107

몇 년만에 와서 쓴다는 게 중복자료네요~_~


하지만 그냥 은행이 아니고 9999,9999까지 입금할 수 있는 거대은행이니 용서해 주세요(...)


원본은 제 블로그에 있으니 한번씩 와서 카운터 좀 늘려주시구요(?)


 


--------------------------------


 


RPG Maker 2000의 한계는 가질 수 있는 최대 돈의 액수와, 변수의 최대값이 999999로 fix되어 있다는 것입니다. 때문에 이것을 극복하기 위해 여러가지 방법이 동원됩니다. 몇 가지 예를 들어 보자면,



  • 일부러 물가를 매우 낮게 맞춰 버린다거나
  • 고가의 보석 등을 도입해 상위 화폐 대용으로 사용하도록 하거나
  • n개의 변수를 이용해 BigInteger를 자체적으로 구현하거나

하는 방법들이 있겠습니다. 여기에서 제가 사용하고자 하는 방법은 세번째 방법으로, 게임 상에 『은행』시스템을 도입함은 물론, 은행에 예금할 수 있는 최대 예금액을 9999,9999까지 늘릴 수 있도록 하겠습니다.



먼저, 게임 Save 상에 구현된 은행을 스크린샷을 통해 살펴보도록 하죠.

 


은행원에게 말을 걸면 이런 메뉴가 나타납니다. 그럼 먼저 예금을 해 보도록 할까요?










 


 

 

 

 

 

 

 

 

 

 

 


현재는 계좌에 한 푼도 입금되어 있지 않습니다. 이런 식으로 예금액을 보여주는 것은 변수 8개의 나열로 처리한 것입니다.


 


 


 


 


 


 


 


 


 



 


 


 





예금을 하기 전에 현재 소지금을 표시해 줍니다. 이를 통해 플레이어가 얼마를 입금할 지 헷갈리지 않게 되므로 이런 처리는 사소하지만 매우 중요한 것 중 하나입니다.





 

 

 


 

 

 

 

 

 

 

 

 

 

 

 




이번에는 천 리프를 입금해 보도록 하겠습니다.





 


 

 

 

 

 

 

 

 


 

 

 

 

 

 




처리되었다고 하는군요. 과연 제대로 입금이 됐는지 확인해 봅시다.







 


 

 

 

 

 

 


 

 

 

 

 

 

 




다시 예금을 선택해 보았습니다. 확실히 1000리프가 예금되어 있군요.





 


 

 

 

 

 

 

 


 

 

 

 

 

 




한 번 가진 돈보다 더 많은 액수를 입금해 보았습니다.







 


 

 

 

 

 

 

 


 

 

 

 

 

 

 




당연한 일이겠지만, 이 경우에는 입금을 할 수가 없습니다. 이 처리를 해 주지 않는다면, 버그 악용으로 게임 내에 엄청난 인플레가 발생하겠죠.



 

 


 

 

 

 

 

 

 

 

 

 

 

 


 




그럼 이번엔 출금을 해 보도록 합시다. 출금시에도 현재 예금액을 표시해 주어, 헷갈리지 않도록 해 줍니다.





 

 

 

 

 

 

 

 


 

 

 

 

 

 

 




얼마를 인출할까요? 소지금은 999999리프가 한도액이므로 현재 소지금을 표시해 주어 너무 많이 인출하지 않도록 해 줍니다.





 

 


 

 

 

 

 

 


 

 

 

 

 

 




500리프를 인출해 보았습니다. 과연 이 은행원 녀석이 떼먹지 않고 제대로 넣어 줬을까요?





 


 

 

 

 

 

 

 

 

 

 

 

 

 

 




가진돈이 402601리프라고 나옵니다. 확실히 500리프 들어왔네요. 다행히도 정직한 은행원이었나 보군요.



 

 


 

 

 

 

 

 

 

 

 

 

 

 

 


 




이번에는 예금액보다 더 많은 1만 리프를 인출해 보도록 하겠습니다.





 


 

 

 

 

 

 

 

 

 

 

 

 


 




역시 당연한 일이겠지만, 인출하지 못하도록 막습니다.







 


 

 

 

 

 

 

 

 

 

 

 

 

 

여기까지가 기본적인 입,출금 시스템의 실제 구현이었습니다. 어떤가요? 꽤 쉬워 보이나요? 그렇다면 이 시스템의 자세한 구현은 어떤 식으로 되어 있는지 알아봅시다.

 



 

은행원 이벤트 작성 화면입니다. 상당히 짧게 끝났군요. 상단의 '명성' 부분은 따로 언급될 명성 시스템에 해당하는 부분이니, 무시하셔도 좋습니다. 핵심인 입/출금 파트는 입금할지, 출금할지만 정한 이후 커먼 이벤트로 처리되어 있습니다. 커먼 이벤트로 처리하는 것은, 프로그래밍 언어에서 라이브러리를 사용하는 것과 동일한 효과를 얻기 위해서 입니다. 다른 어느 곳에서도 '은행입출금' 이벤트를 호출하는 것 만으로 은행 지점을 만들 수 있는 것이죠. 그렇다면 '은행입출금' 이벤트는 어떤 식으로 구성되어 있을까요?

 


 


 


개복잡하죠~_~ 근데 이게 전부가 아니라 이건 예금 파트일 뿐입니다.

그냥 따라해도 되겠지만, 이해를 한다면 더 좋을테니 하나씩 설명해 보도록 하겠습니다. 앞서 은행원 이벤트에서 입금을 선택했을 경우 '은행입출금' 변수의 값을 1로 세팅해 주었습니다. 때문에 '은행입출금' 변수의 값이 1일 경우로 한정해 줍니다. 여기에서 미리 8개의 변수를 세팅해 두었는데, 각각의 변수 이름은 알기쉽게 '천만', '백만', ..., '십', '일' 이런 식으로 해 두도록 합시다. 이 변수들은 최소값 0, 최대값 9를 갖습니다. 이제 은행원의 대사가 나옵니다. 현재 예금액을 쭈루룩 표시해 주고, 얼마를 예금할 지를 물어봅니다. 수치 입력을 받기 전 라벨을 하나 설정해 두는데, 입력받은 수치가 기준 이상일 경우 다시 입력을 받기 위해서입니다. 이제 수치 입력을 받습니다. 그런데 0을 입력했다면, 입금하지 않는다는 것이겠죠. 여기에서 이벤트를 끊어 줍니다. 또한 입력한 값이 가진 돈보다 많은 경우에도 끊어서 미리 지정해 둔 라벨로 보내줍니다.

 이제 입력이 제대로 들어온 경우의 처리입니다. '17번 변수'는 나중에 출력을 위해 예비해 두는 변수로 계산 과정에서는 사용되지 않습니다. '18번 변수'는 예금액을 입력받은 변수입니다. '19번 변수'는 예금액을 단위별로 자르는 데 어시스트 역할을 합니다. 이제 계산 과정을 따라가 봅시다. 먼저 19번 변수에 18번 변수값을 대입한 후 '승제' 10을 했습니다. '승제'로 잘못 번역되어 있지만 '10으로 나눈 나머지'를 구하는 것입니다. 여기서 얻어진 값을 '일'에 더해줍니다. 그리고 이 과정에서 '일'의 값이 9를 초과했다면 '일'에서 10을 빼고 '십'에 1을 더해줍니다. 다시말해 윗 단위로 넘겨줍니다. 이제 마지막으로 18번 변수를 10으로 나눕니다. 이제 '십'의 자리를 처리할 준비가 되었네요. 마찬가지의 프로세스를 돌려줍니다. 이 과정을 '십만'의 자리까지 반복합니다. '십만'의 자리까지 처리한 후 '백만'과 '천만' 자리는 변수값이 9를 초과했는지만 체크해 주도록 합니다. 이 은행은 부패했기 때문에 9999,9999리프 보다 많이 예금하면 그냥 먹어버리네요.

 여기까지 계산이 완료되었습니다. 이제 고객에게 예금이 제대로 됐는 지를 알려줘야겠죠. 처음에 세팅했던 17번 변수가 여기서 사용됩니다.

 어떤가요? 어떤 방식으로 예금이 처리되는지 이해할 수 있었나요? 그럼 다음에는 출금의 처리에 대해 알아보도록 합시다.

 


 


 


스크린샷의 질이 점점 더 구려지네요~_~

보시다시피 예금 파트와 비슷한 구조로 되어 있습니다...만, 이쪽이 예금보다 조금 더 깁니다. 잘못된 출금액을 입력했을 때 원래의 예금액으로 복원해 주는 과정이 필요하기 때문이죠. 예금 파트와 출금 파트는 한 이벤트 안에 있다는 것에 유의해 주세요.

현재 예금액을 찍어 주고, 출금액을 입력받은 다음에 그 값이 0이거나 출금하고 나면 가질 수 있는 돈의 최대치가 초과될 경우에는 미리 안된다고 끊어 줍니다. 이 때 라벨의 번호가 2임에 주의해 주세요. 실수로 1을 또 쓰면 예금 파트로 가 버립니다. 이제 앞서 예금 파트에서 했던 대로 입력한 액수를 자리수별로 끊어서 예금액에서 빼 줍니다. 그 과정에서 예금액이 0보다 작아지면 상위 자리수에서 1을 꾸어온 후에 자기 자리수에 10을 더해줍니다. 이런 식으로 십만, 백만, 천만까지 쭉 올라가 보았는데... 천만 자리가 0보다 작아지게 되는 수가 있습니다. 현재 예금되어 있는 액수보다 많은 액수를 출금하려 시도했을 경우이죠. 이 때문 예금 파트의 계산 과정을 복-붙 해서 예금액을 복원해 주어야 합니다. 이 과정을 거치지 않으면 전체 예금액이 음수가 되어 버리는 불상사가 생길 수 있기 때문에 주의해야 합니다. 



자, 어떤가요? 처음에 스크린샷을 통해 봤을 때의 느낌 그대로 참 쉽죠? (밥아저씨 풍으로) 이걸 다 이해하기가 너무 어렵다면, 소스를 그대로 공개해 놓았기 때문에 그냥 나온 고대로 따라하기만 하셔도 됩니다. 이해야 뭐 차차 해 나가면 될테니까요.

그럼 다음 번에는 Save의 자체 메뉴는 어떤 식으로 만들어졌는지 알아보도록 하겠습니다. 스크린샷 만들기가 꽤나 귀찮다는 걸 깨달았기 때문에, 퀄리티는 훨씬 낮아질 것 같지만, 아무튼 기대 많이 해 주세요~

 

 

-------------------------

 

이건 뭐 에디터로 볼 때랑 미리보기로 볼 때랑 글 쓰고 볼 때랑 다 달라서 어느 장단에 맞춰야 될 지 모르겠네요~_~

뭐, 알아서들 잘 봐 주실 거라고 생각하겠습니다.(어?!)