렌파이에서는 게임의 진행도와 관계 없이 저장되는 데이터인 지속
데이터를 지원합니다. 지속 데이터는 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부를 먼저 해보는 게 어떠세요?"