言語の基本 link

Ren'Py 言語について解説する前に、まず Ren'Py のスクリプトの構造を解説しなければなりません。ここでは、行がブロックを構成し、ブロックがファイル全体を構成する仕組みや、行がステートメントを構成する要素の集まりであることについて説明します。

ファイル link

Ren'Py ゲームのスクリプトは、game ディレクトリー以下の .rpy 拡張子で終わるファイルで構成されています。Ren'Py はそのようなファイルを (そのパスの Unicode 順に) 考慮し、そのファイルの内容をスクリプトとして扱います。

基本的に複数ファイルに分割したスクリプトと単一の大きなファイルでできたスクリプトに違いはありません。 label に対する jump や呼び出しにより(ファイル間を含め)スクリプト内で制御を移動できます。これにより、自分のやり方に合わせてスクリプトをファイルに分けられます。(イベントごとや、一日ごとの)小さなファイルを好む人もいれば、大きなスクリプトを好む人もいるでしょう。

ロード時間を速くするために、Ren'Py は起動時に .rpy ファイルを .rpyc ファイルにコンパイルします。 .rpy ファイルが変更されると、 .rpyc ファイルは Ren'Py の起動時に更新されます。しかし、対応する .rpy がないような .rpyc ファイルが存在すると、その .rpyc ファイルが使われます。このため、 .rpy ファイルが削除またはリネームや移動されると .rpyc ファイルも削除しないとそれが含めるスクリプトがまだ処理されるため問題が起こるかもしれません。

ファイル名は "00" 以外の数字または文字で始まる必要があります。"00" で始まるファイルは Ren'Py 自身が内部で使用しています。

ベースディレクトリー link

ベースディレクトリーはゲームで配布される全てのファイルがあるディレクトリーです ( 多分ゲームで配布されないファイルもいくつか含みます )。 配布物のビルド も参照してください。README のようなファイルはベースディレクトリーに置かれるべきです。

ベースディレクトリーはゲーム作成時にランチャーで設定される "Projects Directory" 内部に作成されます。例えば、プロジェクトディレクトリーが renpygames でゲーム名が「 HelloWorld 」なら、あなたのゲームのベースディレクトリーは renpygames/HelloWorld になるでしょう。

ゲームディレクトリー link

ゲームディレクトリーは「 game 」と名付けられたベースディレクトリー下のディレクトリーです。例えばベースディレクトリーが renpygames/HelloWorld の場合、ゲームディレクトリーは renpygames/HelloWorld/game です。

ゲームディレクトリーにはゲームで使用される全てのファイルが有ります。すべてのサブディレクトリーを含め、ゲームディレクトリーでは .rpy.rpyc ファイルが検索され、ゲームスクリプトを構成します。 .rpa アーカイブもゲームディレクトリーで検索され、自動的にゲームで使用されます。最後に Ren'Py がファイルへのパスを受け取るまたは含めるときは、そのパスは (ごく僅かな例外を除き) ゲームディレクトリーからの相対パスです(しかし config.searchpath でこれは変更可能です)。

コメント link

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 はコメントを無視するので、スクリプトはコメントが無いかのように扱われます。

論理行 link

スクリプトは、 複数の 論理行 に分けられます。論理行は必ずファイル内の行の最初から始まります。論理行は、以下に当てはまらない限り、その行の最後で終わります:

  • 行がバックスラッシュ (\) で終わるとき。

  • 行に開き括弧文字 ((, {, [) があり、かつ対応する閉じ括弧文字 (それぞれ ), }, ]) がないとき。

  • Python のルールとは異なり、シングルクオート含め どのような文字列 であっても文字列中で行の終わりが発生します。

論理行が終わると、次の行の初めから次の論理行が始まります。

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." ]

空の行は無視されて、論理行としてはカウントされません。

インデントとブロック link

インデント とは、各論理行の始めにある(*訳注 4つ連続の)スペースのことで、Ren'Py のステートメントを整列するのに使われます。Ren'Py では、インデントにはスペースのみを使わなければなりません。

インデントは、ステートメントを ブロック にまとめるのに使われます。ブロックは行のまとまりで、多くはステートメントのまとまりでもあります。ファイルをブロックに分ける規則は:

  • ファイルの先頭で、ブロックが一つ始まります。

  • 前の論理行より深くインデントされるごとに、新しいブロックが始まります。

  • 一つのブロック内のインデントは、すべて同じでなければなりません。

  • ブロックは、ブロックの各行よりも少ないインデントの空ではない論理行があるときに終わります。

Ren'Py では Python 同様インデントが非常に重要で、正しくないと構文または論理エラーを起こします。同時に、インデントでブロック構造を伝えるので他の区切りを使用する言語よりずっと簡単にできます。

"This statement, and the if statement that follows, are 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."

ステートメントの要素 link

Ren'Py のステートメントは、いくつかの基本的な部品でできています。

予約語

予約語は、ソースコードに正確に書かなければならない単語です。予約語は主にステートメントやプロパティーを導入するのに使われます。

名前

名前は、文字またはアンダースコアで始まり、それにゼロ個以上の文字、数字、アンダースコアが続きます。ここでは、U+00a0 から U+fffd までの Unicode 文字が文字とみなされます。

警告

アンダースコア(_)で始まる名前はドキュメントに記載がなければRen'Py内部で扱われます。

二つのアンダースコア(__)で始まるが、二つのアンダースコアで終わらない名前はその名前のファイル特有のバージョンに変更されます。

画像名

画像名 は、スペースで分けられた1つ以上の名前でできています。画像名を構成する最初の部分を 画像タグ と言います。それ以降の部分は 画像属性 です。画像の要素はアルファベット、数字、アンダースコアで構成されます。

例えば、 mary beach night happy という画像名があるとします。この画像タグは mary で、画像属性は beachnighthappy です。

at, as, behind, onlayer, with, zorder という単語は画像名として使用出来ません。

文字列

クォート文字 (", ', ` のいずれか) で始まる文字列は、文字の並びを含み、同じクォート文字で終わります。

バックスラッシュ文字 (\) は、クォートや、特別な文字の% (\% と書く) および { (\{ と書く) 等をエスケープするのに使います。また、\n と並べて改行を含めるのにも使います。

Ren'Py の文字列中にある連続する空白と改行は、そのスペースにバックスラッシュを前置しない限り、一つの空白文字にまとめられます:

'Strings can\'t contain their delimiter, unless you escape it.'

"There will be a space between the two following
 words."

"There will be a line break between\nthese."

"And there will be three spaces between\ \ \ these."

r 接頭辞はサポートされており、多かれ少なかれ Python のルールに従います。 u, b, f のような他の接頭辞はサポートされません。トリプルクオートの文字列は一般的には通常の文字列が期待されるところでは受け入れられず、通常異なる結果になります。例の モノローグモード を参照してください。

注釈

これは say ステートメント選択肢 のような Ren'Py のスクリプトの ディレクトリー にある文字列に適用されます。 python ステートメント や(後述の)式にある文字列は通常の python のルールに従います。

単純式

単純式は Python 式で、Python を Ren'Py スクリプトの部品として含めるのに使います。単純式は以下のもので始まります:

  • 名前

  • 文字列

  • 括弧内のあらゆる Python 式

そしてこれらを任意の数だけ続けられます:

  • ドットとそれに続く名前

  • 括弧内の Python 式。

例えば、 3, (3 + 4), foo.bar および foo(42) はすべて単純式です。しかし、文字列の終わりで式は途切れるので、 3 + 4 は単純式ではありません。

Python 式

Python 式はコロンを含まない任意の Python の式です。これらは、 ifwhile ステートメントの条件に使われます。

共通の構文 link

ほとんどの Ren'Py ステートメントは構文が同じです。 say ステートメント を除き、ステートメントを導入する予約語で始まります。ステートメントがパラメーターを受け取るなら、予約語の次に続きます。

パラメーターの後には、一つ以上のプロパティーが続きます。プロパティーは好きな順序で与えられますが、それぞれのプロパティーは一度しか与えられません。プロパティーは予約語で始まります。ほとんどのプロパティーでは、プロパティー名に上述の構文要素を続けます。

ブロックを受け取るステートメントでは、行はコロン (:) で終わります。そうでなければ、行は普通に終わります。

Python 式の構文 link

注釈

この節を今すぐ読み通す必要はないかもしれません。飛ばして先に進み、例を理解できなかったり、実際にどのように動いているかを理解したくなったりしたら、ここに戻ってきて見直すことができます。

Ren'Py は多くの部分で Python 式を受け取ります。例えば、新しいキャラクターを定義するときには、Character() 関数を呼び出しています。Python 式は非常に強力ですが、普通の Ren'Py ゲームを書くのに必要なのはその力のほんの一部だけです。

Python 式の概要はこちらです。

整数

整数は、小数点を持たない数です。3 や 42 は整数です。

浮動小数点数

浮動小数点数は、小数点を持つ数です。 .57.9.0 はすべて浮動小数点数です。

文字列

Python 文字列は、" または ' で始まり、同じ文字で終わります。終わりの文字をエスケープしたり、改行 (\n) などの特殊文字を導入するのに \ が使われます。 Ren'Py の文字列と違い、 Python の文字列は複数の行や ` での区切りを跨げません。

True, False, None

特殊な値が 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]
変数

Python 式では define ステートメントや default ステートメント を使って定義された値を保存する変数を扱えます。変数名は ステートメントの要素 で説明された通りに、 name のルールに従います。例

playername
love_love_points
trebuchet2_range
フィールドアクセス

Python のモジュールとオブジェクトはフィールドを持ち、式にドットとフィールド名を続けてアクセスできます。例えば:

config.screen_width

は、変数 (config) にフィールドアクセス (screen_width) を続けています。

呼び出し

Python の式は、値を返す関数を呼び出せます。式 (通常は変数) で始まり、括弧で括られてカンマで分けられた引数リストが続きます。引数リストは、Python 式である位置引数で始まります。その後に、「引数名=式」という形式のキーワード引数が続きます。例

Character("Eileen", type=adv, color="#0f0")

Character() 関数を呼んでいます。1 つの位置引数、文字列 "Eileen" が指定されています。2 つのキーワード引数、 type に値 adv が、 color に文字列値 "#0f0" が与えられています。

関数以外のオブジェクトも呼び出せ、 callables として広く知られています。

このドキュメントを読むときは、このような定義で関数を見てください。

Sample(name, delay, position=(0, 0), **properties) link

ドキュメントにのみ使われていて、Ren'Py には実在しないサンプル関数です。

この関数は:

  • "Sample" という名前です。

  • 2 つの位置パラメーター、name と delay を持ちます。実際の関数では、このパラメーターの意味はドキュメントで解説されます。

  • 1 つのキーワード引数 position を持ち、そのデフォルト値は (0, 0) です。

この関数は **properties で終わっているので、追加のキーワード引数として スタイルプロパティー を受け取れます。その他の特別な項目として、任意の数の位置パラメーターを受け取ることを表す *args や、通常その関数のドキュメントで解説されている広い範囲のキーワード引数を受け取る **kwargs があります。

関数の構文でみられる / シンボルはそれ以前のパラメーターは位置引数のみでキーワード引数を渡すべきで無いことを意味しています。 * シンボルは逆に その後は キーワード引数のみ、つまり name=value 構文でであることを表しています。

Python はこのマニュアルで記述されているよりずっとパワフルです。 Python についてより詳しく学ぶなら、以下のサイトの Python tutorial を始めることを勧めます。 python.org Ren'Py の使用には Python の深い知識は必要ないと思われますが、Python ステートメントと式の基本知識はしばしば有効です。