Ren'Py 言語について解説する前に、まず Ren'Py のスクリプトの構造を解説しなければなりません。ここでは、行がブロックを構成し、ブロックがファイル全体を構成する仕組みや、行がステートメントを構成する要素の集まりであることについて説明します。
Ren'Py ゲームのスクリプトは、game ディレクトリー以下の .rpy 拡張子で終わるファイルで構成されています。Ren'Py はそのようなファイルを (そのパスの Unicode 順に) 考慮し、そのファイルの内容をスクリプトとして扱います。
基本的に複数ファイルに分割したスクリプトと単一の大きなファイルでできたスクリプトに違いはありません。他のファイルにあるラベルに対して jump や呼び出しをして制御をファイル間で移動できます。これにより、自分のやり方に合わせてスクリプトをファイルに分けられます。(イベントごとや、一日ごとの)小さなファイルを好む人もいれば、大きなスクリプトを好む人もいるでしょう。
ロード時間を速くするために、Ren'Py は起動時に .rpy ファイルを .rpyc ファイルにコンパイルします。 .rpy ファイルが変更されると、 .rpyc ファイルは Ren'Py の起動時に更新されます。しかし、対応する .rpy がないような .rpyc ファイルが存在すると、その .rpyc ファイルが使われます。このため、 .rpy ファイルを削除するときに .rpyc ファイルも削除しないと問題が起こるかもしれません。
ファイル名は "00" 以外の数字または文字で始まる必要があります。"00" で始まるファイルは Ren'Py 自身が内部で使用しています。
ベースディレクトリーはゲームで配布される全てのファイルがあるディレクトリーです ( 多分ゲームで配布されないファイルもいくつか含みます )。 README のようなファイルはベースディレクトリーに置かれるべきです。
ベースディレクトリーは Ren'Py ディレクトリーの直下に作成され、そのゲームの名前になります。例えば Ren'Py ディレクトリーが renpy-6.11.2 であなたのゲーム名が「 HelloWorld 」なら、あなたのベースディレクトリーは renpy-6.11.2/HelloWorld になるでしょう。
ゲームディレクトリーはほとんどの場合「 game 」と名付けられたベースディレクトリー直下のディレクトリーです。例えばベースディレクトリーが renpy-6.11.2/HelloWorld の場合ゲームディレクトリーは renpy-6.11.2/HelloWorld/game です。
その他に、Ren'Py は以下の順にディレクトリーを検索します。 :
接尾辞を取り除いた実行可能ファイルの名前。例えば実行可能ファイルが moonlight.exe なら、ベースディレクトリー下の moonlight と名付けられたディレクトリーを探します。
実行可能ファイルから接尾辞と、 _ で終る接頭辞を取り除いた名前。例えば実行可能ファイルが moonlight_en.exe なら、 Ren'Py は en という名前のディレクトリーを探します。
順に「 game 」、「 data 」、「 launcher 」 ディレクトリー。
ランチャーの場合は、「game」ディレクトリーと「data」ディレクトリーのみ適切に認識します。
ゲームディレクトリーにはゲームで使用される全てのファイルが有ります。すべてのサブディレクトリーを含めたゲームディレクトリーで .rpy, .rpyc ファイルが検索され、ゲームスクリプトを構成します。 .rpa アーカイブもゲームディレクトリーで検索され、自動的にゲームで使用されます。ロードするファイルのパスが指定されると、ゲームディレクトリーからの相対パスでロードされます(しかし config.search でこれは変更可能です)。
Ren'Py スクリプトファイルには、コメントを含められます。コメントは、ハッシュ記号 ('#') で始まり、コメントを含む行の終端で終わります。例のように、コメントは文字列の一部にはできません。
# This is a comment.
show black # this is also a comment.
"# This isn't a comment, since it's part of a string."
Ren'Py はコメントを無視するので、スクリプトはコメントが無いかのように扱われます。
スクリプトは、 複数の 論理行 に分けられます。論理行は必ずファイル内の行の最初から始まります。論理行は、以下に当てはまらない限り、その行の最後で終わります:
行がバックスラッシュ ('\')で終わるとき。
行に開き括弧文字 ('(', '{', '[') があり、かつ対応する閉じ括弧文字 (それぞれ ')', '}', ']') がないとき。
行の最後が文字列中にあるとき
論理行が終わると、次の行の初めから次の論理行が始まります。
Ren'Py 言語のほとんどのステートメントは一つの論理行でできていますが、中には複数の行でできているステートメントもあります。
"This is one logical line"
"Since this line contains a string, it continues
even when the line ends."
$ a = [ "Because of parenthesis, this line also",
"spans more than one line." ]
空の論理行は無視されます。
インデント とは、各論理行の始めにある(*訳注 4つ連続の)スペースのことで、Ren'Py のステートメントを整列するのに使われます。Ren'Py では、インデントにはスペースのみを使わなければなりません。
インデントは、文を ブロック にまとめるのに使われます。ブロックは行のまとまりで、多くはステートメントのまとまりでもあります。ファイルをブロックに分ける規則は:
ファイルの先頭で、ブロックが一つ始まります。
前の論理行より深くインデントされるごとに、新しいブロックが始まります。
一つのブロック内のインデントは、すべて同じでなければなりません。
ブロックは、ブロックの各行よりも少ないインデントの論理行があるときに終わります。
Ren'Py ではインデントが非常に重要で、正しくないと構文または論理エラーを起こします。同時に、インデントでブロック構造を伝えるのでスクリプトテキストを圧迫せず構造を明示できます。
"This statement, and the if statement that follows, is part of a block."
if True:
"But this statement is part of a new block."
"This is also part of that new block."
"This is part of the first block, again."
Ren'Py のステートメントは、いくつかの基本的な部品でできています。
予約語は、ソースコードに正確に書かなければならない単語です。予約語はステートメントやプロパティーを導入するのに使われます。
アンダースコア(_)で始まる名前はドキュメントに記載がなければRen'Py内部で扱われます。 __で始まり、__では終わらない名前はその名前のファイル特有のバージョンに変更されます。
名前は、文字またはアンダースコアで始まり、それにゼロ個以上の文字、数字、アンダースコアが続きます。ここでは、U+00a0 から U+fffd までの Unicode 文字が文字とみなされます。
画像名 は、スペースで分けられた1つ以上の名前でできています。画像名を構成する最初の部分を 画像タグ と言います。それ以降の部分は 画像属性 です。画像の要素はアルファベット、数字、アンダースコアで構成されます。
例えば、 mary beach night happy
という画像名があるとします。この画像タグは mary
で、画像属性は beach
、 night
、 happy
です。
クォート文字 (", ', ` のいずれか) で始まる文字列は、文字の並びを含み、同じクォート文字で終わります。
バックスラッシュ文字 (\) は、クォートや、特別な文字の% (\% と書く) および { (\{ と書く) 等をエスケープするのに使います。また、\n と並べて改行を含めるのにも使います。
Ren'Py 文字列の中で連続する空白は、そのスペースにバックスラッシュを前置しない限り、一つの空白文字にまとめられます:
'Strings can\'t contain their delimiter, unless you escape it.'
単純式は Python 式で、Python を Ren'Py スクリプトの部品として含めるのに使います。単純式は以下のもので始まります:
名前
文字列
数
括弧内のあらゆる Python 式
そしてこれらを任意の数だけ続けられます:
ドットとそれに続く名前
括弧内の Python 式。
例えば、 3
, (3 + 4)
, foo.bar
および foo(42)
はすべて単純式です。しかし、文字列の終わりで式は途切れるので、 3 + 4
は単純式ではありません。
式リストは、カンマで分けられた一連の単純式です。
Python 式はコロンを含まない任意の Python の式です。これらは、if や while ステートメントの条件に使われます。
ほとんどの Ren'Py ステートメントは構文が同じです。say ステートメントを除き、ステートメントを導入する予約語で始まります。ステートメントがパラメーターを受け取るなら、予約語の次に続きます。
パラメーターの後には、一つ以上のプロパティーが続きます。プロパティーは好きな順序で与えられますが、それぞれのプロパティーは一度しか与えられません。プロパティーは予約語で始まります。ほとんどのプロパティーでは、プロパティー名に上述の構文要素を続けます。
ブロックを受け取るステートメントでは、行はコロン (:) で終わります。そうでなければ、行は普通に終わります。
注釈
この節を今すぐ読み通す必要はないかもしれません。飛ばして先に進み、例を理解できなかったり、実際にどのように動いているかを理解したくなったりしたら、ここに戻ってきて見直すことができます。
Ren'Py は多くの部分で Python 式を受け取ります。例えば、新しいキャラクターを定義するときには、Character()
関数を呼び出しています。Python 式は非常に強力ですが、普通の Ren'Py ゲームを書くのに必要なのはその力のほんの一部だけです。
Python 式の概要はこちらです。
整数は、小数点を持たない数です。3 や 42 は整数です。
浮動小数点数は、小数点を持つ数です。 .5
、 7.
、 9.0
はすべて浮動小数点数です。
Python 文字列は、" または ' で始まり、同じ文字で終わります。終わりの文字をエスケープしたり、改行 (\n) などの特殊文字を導入するのに \ が使われます。 Ren'Py の文字列と違い、 Python の文字列は行を跨げません。
特殊な値が 3 つあります。True
は真値、False
は偽値です。None
は値がないことを表します。
タプルは、要素の数が重要なコンテナを表すのに使います。例えば、2-タプル (対とも呼ばれます) で幅と高さを表したり、4-タプル (x, y, width, height) で長方形を表したりできます。
タプルは左丸括弧 (
で始まり、カンマで分けられたゼロ個以上の Python 式からなり、右丸括弧 )
で終わります。1-タプルは特殊で、要素の次にカンマを置かなければなりません。例
()
(1,)
(1, "#555")
(32, 24, 200, 100)
リストは、要素の数が変わるコンテナを表すのに使います。リストは [
で始まり、カンマで分けられた一連の式を含み、 ]
で終わります。例 :
[ ]
[ 1 ]
[ 1, 2 ]
[ 1, 2, 3 ]
define
ステートメントや Python ステートメントを使って定義された値を保存する変数を、 Python 式では扱えます。変数は文字またはアンダースコアで始まり、ゼロ個以上の文字、数字、アンダースコアが続きます。例
name
love_love_points
trebuchet2_range
_ で始まる変数は Ren'Py で使用するために予約されているので、ユーザーコードでは使うべきではありません。
Python のモジュールとオブジェクトはフィールドを持ち、式にドットとフィールド名を続けてアクセスできます。例えば:
config.screen_width
は、変数 (config) にフィールドアクセス (screen_width) を続けています。
Python の式は、値を返す関数を呼び出せます。式 (通常は変数) で始まり、括弧で括られてカンマで分けられた引数リストが続きます。引数リストは、Python 式である位置引数で始まります。その後に、「引数名=式」という形式のキーワード引数が続きます。例
Character("Eileen", type=adv, color="#0f0")
1 つの位置引数、文字列 "Eileen" が与えられています。2 つのキーワード引数、 type
に値 adv
が、 color
に文字列値 "#0f0" が与えられています。
コンストラクタは新しいオブジェクトを返す関数の型で、同じように呼び出されます。
このドキュメントを読むときは、このような定義で関数を見てください。
Sample
(name, delay, position=(0, 0), **properties) linkドキュメントにのみ使われていて、Ren'Py には実在しないサンプル関数です。
この関数は:
"Sample" という名前です。
2 つの位置パラメーター、name と delay を持ちます。実際の関数では、このパラメーターの意味はドキュメントで解説されます。
1 つのキーワード引数 position を持ち、そのデフォルト値は (0, 0) です。
この関数は **properties で終わっているので、追加のキーワード引数として スタイルプロパティー を受け取れます。その他の項目として、任意の数の位置パラメーターを受け取ることを表す *args や、ドキュメントで解説されているキーワード引数を受け取る **kwargs があります。
Python はこのマニュアルで記述されているよりずっとパワフルです。 Python についてより詳しく学ぶなら、以下のサイトの Python tutorial を始めることを勧めます。 python.org Ren'Py の使用には Python の深い知識は必要ないと思われますが、Python ステートメントの基本や表現はしばしば有効です。