렌파이에서는 게임의 진행도와 관계 없이 저장되는 데이터인 지속
데이터를 지원합니다. 지속 데이터는 persistent
라는 변수에
연결되어 있는 persistent 객체의 필드를 통해 접근할 수
있습니다.
persistent
의 필드로서 접근할 수 있는 모든 데이터는
렌파이가 종료하거나 renpy.save_persistent()
가 호출될 때 저장됩니다.
지속 데이터는 렌파이가 시작될 때, 그리고 렌파이가 디스크에 기록된 지속 데이터가 갱신됐다는 것을
탐지했을 때 불려옵니다.
독특하게도 persistent 객체는 정의되지 않은 필드에 접근하는 것이 예외를 발생시키는 대신 None 값을 지니게 됩니다.
지속 데이터를 사용하는 예제 가운데 하나로는 잠금해제할 수 있는 CG 갤러리를 만드는 것입니다. 갤러리 기능이 잠금 해제되었는지를 결정하는 분기를 지속 데이터에 저장하면 됩니다.
label gallery:
if not persistent.gallery_unlocked:
show background
centered "아직 이 갤러리를 열지 못했습니다."
$ renpy.full_restart()
# 이미지를 표시하는 코드들..
플레이어가 갤러리 기능을 여는 엔딩을 봤다면, 플래그를 True로 설정해야 합니다.
$ persistent.gallery_unlocked = True
지속 데이터는 init 코드가 실행되기 전에 불려오므로 지속 데이터는
오로지 렌파이나 파이썬 고유의 데이터 타입을 담아야 합니다. 그 대신으로
python early
블럭에 피클할 수 있고 동등성을 구현할 수 있는 클래스가 정의되어 있다면
해당 클래스들을 사용할 수도 있습니다.
렌파이가 두 가지 소스에 있는 지속 데이터를 통합해야 하는 경우들이 있습니다. 예를 들어 렌파이가 로컬 기기의 지속 데이터를 USB 드라이브에 저장된 지속 데이터를 통합해야 할 수 있습니다.
렌파이는 가장 최근에 갱신된 데이터를 기준으로 지속 데이터를 필드 단위로
통합합니다. 어떤 경우에는 이 방식이 바람직한 통합 방법이 아닐 것
입니다. 그런 때에는 renpy.register_persistent()
함수를 활용할
수 있습니다.
예를 들어 이미 본 엔딩을 set 자료형으로 저장했다면, 지속 데이터를 통합할 때 해당 set 데이터를 병합해야 할 것입니다.
init python:
if persistent.endings is None:
persistent.endings = set()
def merge_endings(old, new, current):
current.update(old)
current.update(new)
renpy.register_persistent('endings', merge_endings)
renpy.
register_persistent
(field, func)¶persistent 필드와 그 값을 디스크에서 불러와 현재 persistent 객체의 값과 병합할 때 사용할 함수를 등록한다.
old, new, current 라는 세 가지 매개변수와 함께 호출되는 함수:
함수는 지속 데이터 객체에 있는 필드의 새로운 값을 반환해야 한다.
renpy.
save_persistent
()¶지속 데이터를 디스크에 저장한다.
다중 게임 지속 데이터는 렌파이 게임들 간에 정보를 공유할 수 있도록 하는 기능입니다. 게임을 계속해서 만들 계획이 있고 그 게임들의 정보가 서로 공유될 수 있도록 하고 싶다면 이 기능이 유용할 것입니다.
다중 지속 데이터를 사용하고 싶다면 반드시 MultiPersistent 객체가 ini 블럭 안에 생성되어야 합니다. 유저는 이 객체를 업데이트하고, save 메소드를 호출해 디스크에 객체를 저장할 수 있습니다. 정의하지 않은 필드는 기본값이 None 입니다. 이 객체가 다시 불려올 수 있도록 하려면 사용자가 정의한 타입에 객체 인스턴스를 배정하지 마시기 바랍니다.
MultiPersistent
(key)¶새 MultiPersistent 객체를 생성한다. 이것은 init 블록 내에서 호출되어야 하며, key에 상응하는 새로운 MultiPersistent의 객체를 반환한다.
save
()¶디스크에 MultiPersistent 객체를 저장한다. 이 메소드는 반드시 다중 지속 데이터가 수정된 이후에 호출해야 한다.
다음은 예제입니다. 2부작으로 구성된 게임의 1부.:
init python:
mp = MultiPersistent("demo.renpy.org")
label start:
# ...
# 유저가 1부을 클리어했다는 사실을 기록한다.
$ mp.beat_part_1 = True
$ mp.save()
e "1부를 클리어했습니다. 2부에서 봐요!"
다음은 2부입니다.:
init python:
mp = MultiPersistent("demo.renpy.org")
label start:
if mp.beat_part_1:
e "1부를 클리어했군요. 어서 오세요!"
else:
e "음, 아직 1부를 클리어하지 않았는데, 1부를 먼저 해보는 게 어떠세요?"