アイテムリストの作り方・所持してるかどうかをif判定する方法【Twine・Harlowe】

Twineでのアイテムリストの作り方・所持してるかどうかをif条件分岐するやり方Twine

ゲームブック制作ツールでおなじみのTwineで、所持しているアイテムを管理するための変数の書き方を紹介します。
また、特定のアイテムを所持しているかどうかのif判定をする書き方も説明します。

つまり、Twineでこんなことをやりたい人向けです。

  • 全ての所持アイテムを一覧で表示させたい
  • アイテムを増やしたり減らしたりしたい
  • 特定のアイテムを所持してるかどうかを判定しifで分岐させる

なお、使っているフォーマットはHarloweです。

TwineでアドベンチャーブックやTRPG風な何かを作りたいけど、どう書いたらいいのか分からない、そんな誰かのお役に立てたら幸い!

はじめに

いろいろと説明をする前に、これを書いている現在時点の私の環境をのせておきます。

  • Twine:2.0.8
  • フォーマット:Harlowe 3.3.7

というのも、TwineやHarloweのバージョンによっても若干仕様が変わる可能性もあるためです。

なので、原因は分からないけどなんだかうまく動かないなあなんていう時はお使いのTwineのバージョンなども確認してみてくださいませ。

また、この所持アイテムリストを作るにあたり、下記のTwine Forumの投稿を参考にさせていただきました。

Help with (set: $list) and (if: $list contains)
Hi! So I am brand new at this - literally started today - and I am trying to get the lists to work.

英語ですが、よければ合わせてどうぞ。

フォーマットってなに?

Twineを始めたばかりの人に向けてさくっと説明しておきます。
分かるよ!という人はここは飛ばして、「所持アイテムリストの作り方」から読み始めてくださいませ!

フォーマットとは、「ストーリーフォーマット(Story Fromat)」のことです。
これは簡単に言うと、ゲームエンジンのようなものですね。

Twineでストーリーを書く時に使える機能や、どんな風にコードを記述していくのかも、どのフォーマットを使うかでガラッと変わってきます。

今回ここで使う「Harlowe」も、Twineの中にいくつかあるフォーマットのうちのひとつです。

フォーマットには「Harlowe」の他にも「Chapbook」「Snowman」「SugarCube」などがあり、それぞれ特徴があります。
例えば初心者さん向けシンプルフォーマットや、JavaScriptに慣れ親しんだ人向けのフォーマットなどなど。

どんなフォーマットがTwineにあるのか知りたい方は、Twine公式サイトの「Learn Twine」というセクションも合わせてどうぞ。

Twine / An open-source tool for telling interactive, nonlinear stories

公式サイトの「Learn Twine」というセクションの中にあるリンクをクリックすると、それぞれのフォーマットの仕様書・説明書を読むことができます。ありがたい!

そして、今回ここで紹介している記述は「Harlowe」というフォーマットを使ってTwineを使っている人向けの記述の紹介です。
つまり、「Chapbook」など他のフォーマットを使っている人はここで紹介するものと同じように記述を書いても動きません。ご注意ください!

所持アイテムリストの作り方

では所持アイテムリストを作っていきましょう。

Twineが右も左も分からない!という人のために解説もちょこちょこ交えつつ説明していきます。ご安心!

前提の記述

まず、所持アイテムリストを作るための前提の記述として、以下のように書きます。

(set: $items to (array:))

上記のように書くことで、「$items」という変数に空っぽの値を入れています。

前提記述なので、開始地点などに書いておくといいでしょう。

ただし何度も繰り返し戻ってこれるタイプの開始地点である場合は、開始地点に戻るたびにこの処理がされるといったことは起こらないように書く必要があります。
というのも、この記述は所持アイテムリストとして登録した文字列全てを空っぽにする処理だからです。

なので、開始地点に戻るたびに所持アイテムが空っぽになってしまう!という事態を防ぐために、1度のみこの処理がされるように書く必要があるのです。
その点だけご注意!

また、所持品アイテムの全てを消したい時もこのように書くことで、リセットすることができます。

ちょこっと解説

上記の記述の解説をさらっとしておきます。

「$items」は変数の名前です。
なので、この「items」の部分はお好きな文字列に書き換えて使うことができます。

なおこの記述を書き忘れた場合、「アイテムを追加する時」や「特定のアイテムを所持してるかどうかのif判定」を行った時に、以下のようなエラーが表示されてしまいます。

The number 0 isn’t the same type of data as an array (with the string “短剣”)

そしてこの記述を書き忘れた場合、アイテムリストを表示させた時に「0」と表示されてしまいます。
あらかじめ前提記述を挟むことで、何もアイテムを所持していない時は「何も文字が表示されない」ようにすることができるのです。

もっと詳しく言うと、(print: $items)などのように書いた箇所に「0」という文字が表示されているとしたら、前提の記述が動いていないということになります。
(print: $items)についてはこれから説明します。

所持アイテムを表示させる

そして次に、所持アイテムを表示させるための記述です。

(print: $items)

上記のように書くことで、現在所持しているアイテムをずらっと表示させることができます。

この記述だけで、「$items」の中に登録したアイテム名を全て表示させることができます。
なので、所持品を表示させたい箇所に上記のように書いておけば、所持品が増えようが減ろうが、あとはいじる必要はありません。便利。

ちなみに、ここで扱っている変数「$items」のイメージを簡単にいうと、「複数の値が出たり入ったりする変数」のような感じです。
なので、「$items」の中に入っている値を表示させておけばすべての所持アイテムが表示されるよ、ということなのです。

アイテムを所持品に追加する

さて、ではアイテムを実際に所持品に追加していきましょう。

以下のように書くと、イベントリにアイテムを追加することができます。

(set: $items to it + (array: "短剣"))
(set: $items to it + (array: "おにぎり", "木の実", "もやし"))

アイテムをひとつだけ追加する場合は、1行目のように書きます。

そして複数のアイテムを一度に追加したい場合は、2行目のようにコンマで区切って追加したいアイテムを羅列していきます。

アイテム名は“”で囲うのを忘れないようにしましょう!

所持品からアイテムを取り除く

そしてアイテムを所持品から取り除く、イベントリ内から消したい時は以下のように書きます。

(set: $items to it - (array: "短剣"))
(set: $items to it - (array: "おにぎり", "木の実", "もやし"))

先程と同じように、アイテムをひとつだけ取り除く場合は1行目のように書き、複数のアイテムを一度に取り除く場合は2行目のようにコンマで区切って羅列していきます。

見て分かる通り、先程の「アイテムを追加する時」の記述とほとんど全部同じです。
この2つの違いは、プラスの記号がマイナスになっただけですね。

つまり、アイテムを追加する時は「+」を書く、アイテムを取り除く時は「-」を書く、というそれだけです。

特定のアイテムを所持しているかをif判定する

最後に、特定のアイテムが所持品の中にあるかどうかを判定し、ifで条件分岐をつけるやり方を紹介します。

以下のように書くことで、特定のアイテムを持っているかどうかでif条件分岐を付けることができます。

(if: $items contains "短剣")[あなたは短剣を懐から取り出した。]
(else:)[あなたは短剣を持っていないようだ……。]

上記の判定では、ifとelseを使って「短剣を所持していた場合」と「所持していなかった場合」の2パターンを書いています。

なお、「所持していた場合」もしくは「所持していなかった場合」の、このどちらか片方の分岐だけで良いという場合には、大カッコ[]の中の文字列を削除すれば何も表示されなくなります。

例えば、短剣を所持していなかった場合のみ表示させたいテキストがある場合は、以下のように書くことができます。

(if: $items contains "短剣")[]
(else:)[あなたは短剣を持っていないようだ……。]

ちょっと周りくどい書き方ですが、大カッコの中身を消すだけでいいので、コピペでどんな場面にでも使い回せるのが強みです。
あと、慣れないうちはこのように書いた方が、あとから見返した時に「これは今なにをしている記述なのか」が分かりやすいかもしれません。

なおこのifとelseの2行はセットなため、elseだけ書けばいいじゃん、みたいなことはできません。

もっとシンプルにおさめたいんだけど、という場合は以下の「シンプルな書き方」で紹介する記述をお使いください。

シンプルな書き方

「所持していた場合」または「所持していなかった場合」のどちらか片方のみの分岐が必要な場合は、以下のようにシンプルに書くこともできます。

(if: $items contains "短剣")[短剣を所持してた時のみ表示されるテキストだよ。]
(unless: $items contains "短剣")[短剣を所持していない時のみ表示されるテキストだよ。]

このifとunlessは、セットではありません。
必要に応じてどちらか片方だけ記述すれば大丈夫です。

ちょこっと解説

ここで使っているifとunlessのコマンドの違いについてさくっと説明しておきます。

まずifは「この条件がtrueである時、これを表示しますよ」という意味です。
そしてunlessは「この条件がfalseである時、これを表示しますよ」という意味です。

分かりづらい場合は、unlessはifの反対の言葉だとイメージをしておけば大丈夫です。

イメージがつきやすいようにもっと簡単にいうと、ifは「これに当てはまる時だけそれを表示するよ!」という条件分岐で、unlessは「これに当てはまらない時だけそれを表示するよ!」という条件分岐を行っています。

例えば上記の記述を例えに説明すると、(if: $items contains “短剣”)[XXX]は「itemsという変数の中に短剣って文字列が入ってる時だけ、XXXと表示するよ」という意味のコマンドです。
そして(unless: $items contains “短剣”)[XXX]は、「itemsという変数の中に短剣って文字列が見当たらない時だけ、XXXと表示するよ」と言っています。

コメント

タイトルとURLをコピーしました