본문 바로가기

렌파이/게임 제작하기

렌파이로 육성 시뮬레이션 게임 만들기 (3) DSE 를 이용해 이벤트 만들기 (1)

이제 연습 게임에 이벤트를 채워봅시다. event_dispatcher.rpy 를 본격적으로 사용할 시간입니다.
그 전에 DSE 엔진의 events.rpy 파일을 확인해서, 이벤트는 어떤 식으로 스크립트를 써야 만들어지는지 살펴봅시다.



event() 해석

이벤트를 만드려면 파이썬 블록에 event(어쩌구) 라고 적어야 합니다. 어쩌구에 있는 내용을 간단히 해석하자면 다음과 같습니다.

event('레이블 이름', priority = 우선도, 나머지는 전부 이벤트 실행 조건)

- 레이블 이름
이벤트 실행 조건이 참일 때 불러올 레이블 블럭의 이름입니다.

- 이벤트 실행 조건
말 그대로입니다. 파이썬 표현식을 문자열 형태로 적거나 (ex 'act == "class"'), 아니면 위의 예제에서 보이는 event.어쩌구 와 같은, DSE 를 이용할 때만 사용 가능한 함수를 적어야 합니다. 이 함수에 대해서는 다음 글에서 다시 설명하겠습니다.

어쨌든 이 실행 조건들 간에는 파이썬 표현식에서 사용할 수 있는 and 나 or, not 같은 연산자를 사용할 수 있습니다.
event('marry', event.depends('engage_1') or event.depends('engage_2')) 나,
event('sub_lesson', event.depends('get_Fail') and 'intelligence == 0') 처럼 쓸 수 있다는 얘기입니다.

- priority
단어 뜻 그대로 해당 이벤트의 우선도를 나타냅니다. 기본값은 100 이며 이 값이 낮을 수록 해당 이벤트의 실행 조건이 먼저 고려됩니다. 여기서 조심하실 게 하나 있습니다. 만일 이벤트 실행 조건이 똑같은 2 개의 이벤트가 있다고 가정했을 때, 한 쪽의 priority 가 10 이고 다른 이벤트는 priority 가 200 이라고 해서 우선도가 더 높은 쪽의 이벤트가 실행이 안 되는 것이 아닙니다. priority 가 1000짜리라도 실행 조건만 충족되면 발생합니다. 아까도 적었지만, priority 는 해당 이벤트의 실행 조건을 먼저 따질 때 사용하는 수치인 것이지, 우선도가 낮은 다른 이벤트를 배제하고 실행하지 않는다는 의미가 아닙니다.


* 아까 이벤트 실행 조건 설명할 때 넘어갔던 event.어쩌구 함수들..은 직접 이벤트를 만들면서 설명드리겠습니다.


이벤트 만들기

프로젝트/game 폴더에 event_dispatcher.rpy 들어있는 것 확인하시고, 이제 이벤트를 만들어보도록 합시다.

* 이벤트에는 여러가지 내용이 들어가니까 관리하기 쉽게 스크립트 파일을 새로 만듭시다. 전 events.rpy 라는 새 파일을 만들었습니다.

* 이제 어떤 이벤트가 필요할지 생각해봅시다.

* 일정 조건을 달성하면 뿅 하고 등장하는 그런 것 외에도, 일반적인 상황에서 발생하는 스케쥴 실행 화면도 이벤트로 칩시다. 여러 게임에서는 기본 스케쥴을 실행할 때도 특정 조건에 따라 성공/실패 여부가 갈려서 스탯을 획득하거나 하니까요(예제 게임에선 그런 식으로 만들지는 않을 겁니다만 참고하시라는 의미에서 적어둡니다).

* 기초 설정 잡았을 때, 스케쥴 종류가 휴식, 전략 구상, 마인드 컨트롤, 연습 이렇게 네 가지 있었습니다.

휴식: 스트레스 4 감소, 정신력 1 증가,
연습: 상황 판단력 1 증가, 반응 속도 3 증가, 스트레스 3 증가.
전략 구상: 상황 판단력 2 증가, 정신력 1 증가, 스트레스 2 증가
마인드 컨트롤: 정신력 2 증가

(스트레스는 stress, 정신력은 mental, 상황 판단력은 judge, 반응 속도는 react 라는 변수명을 정해주었죠)

* 일단 각 스케쥴이 실행되면, 발생할 이벤트의 내용이 적인 레이블을 만들어줍니다. 이벤트로 쓰이는 각 레이블은 호출(call)되는 형식이기 때문에 레이블마다 끝에 return 을 적어주어서 원래 진행 흐름으로 돌아갈 수 있도록 해야 합니다. 진행상황을 확인할 수 있도록 한마디도 써줍시다.


# 여기서 stress =  max(stress -4, 0) 는
stress 에서 - 4 하되 만일 이 결과값이 0보다 작으면 0을 stress 변수에 배정한단 의미입니다. 스탯 수치가 0 이하로 내려가지 않도록 하기 위해 사용한 함수입니다.

* 그리고 event() 함수를 이용해서 각 레이블이 실행될 수 있도록 이벤트들을 만들어줍니다. 우선도는 적지 않았으니, 기본값인 100이 적용될 겁니다.


이제 실행 조건을 적을 차례입니다. 사용자가 정한 스케쥴만 제 때 실행되도록 조건을...


어떻게 적어야 할까여....-.-

지금 스케쥴이

$ morning = '휴식'
$ free = '마인드 컨트롤'

같은 식으로 저장되어 있고 스크립트는

label morning:
label free:
label afternoon:

이런 식으로 작성되어있죠.

그럼 변수를 하나 만들어서 그 변수에 morning, free, afternoon 에 저장된 값을 옮기고, 각 레이블 끝마다 이벤트를 불러오도록 하면 되겠네요.

급하게 act 라는 변수를 하나 만듭시다.

act = ''

그리고 각 레이블에마다 act 를 적고 해당 시기에 실행할 스케쥴의 정보를 또 저장하도록 해줍니다.

label morning:
    $ act = morning
   
이제 이벤트를 호출할 수 있도록 명령어를 하나 더 적어줍니다.

call events_run_period 를 사용하면 event() 로 만들어진 이벤트들 중에서 현재 조건에 맞는 이벤트를 실행시킬겁니다.
이제 다시 events.rpy 로 돌아가서 event() 함수들을 마저 작성합시다.


여기까지 완성한 게임의 스크립트를 확인하시고, 게임을 테스트해보시면서 잘못된 부분이 있나 확인합시다.

저는 7일째를 판정하는 if 문이랑 day 변수를 잘못 써서 6일 째에 게임이 끝나게 되더군요.. 그 부분을 수정했습니다.



다음 글은 특별한 조건에서 실행되는 이벤트를 만드는 방법입니다.