Introduction to Macro Branching/ja: Difference between revisions
m (Taustin moved page introduction to Macro Branching/ja to Introduction to Macro Branching/ja over redirect) |
|||
(9 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
[[Category:MapTool]][[Category:Tutorial]]{{ | [[Category:MapTool]][[Category:Tutorial]]{{Languages|Introduction to Macro Branching}}{{Translation}}{{DISPLAYTITLE:はじめてのマクロ分岐|はじめてのマクロ分岐}}{{Intermediate}} | ||
==はじめに== | ==はじめに== | ||
When you write a macro, you'll frequently find yourelf wanting to either repeat an operation several times, or to choose from several options based on the outcome of a macro command. In game terms, you might want to make an damage roll several times in a row (say, one time for each enemy caught by a grenade blast), or you might want your macro to give you a damage roll ''if'' you hit, and say {{code|You missed!}} if you miss. | <div style="color:gray">When you write a macro, you'll frequently find yourelf wanting to either repeat an operation several times, or to choose from several options based on the outcome of a macro command. In game terms, you might want to make an damage roll several times in a row (say, one time for each enemy caught by a grenade blast), or you might want your macro to give you a damage roll ''if'' you hit, and say {{code|You missed!}} if you miss. </div> | ||
マクロを書いていると、何度も同じ処理を繰り返したり、マクロ・コマンドの結果に応じて複数の選択肢から一つを選んで実行したりしたくなることが良くある。ゲームを例に取るなら、(例えば手榴弾の爆発に複数の敵を巻き込んだときのように、)何度も続けてダメージ・ダイスを振りたいこともあるだろうし、また、''もし''攻撃が命中したらダメージ・ダイスを振り、外したら{{code|ハズレ!}} と表示してくれるようなマクロを作りたいと考えるかも知れない。 | マクロを書いていると、何度も同じ処理を繰り返したり、マクロ・コマンドの結果に応じて複数の選択肢から一つを選んで実行したりしたくなることが良くある。ゲームを例に取るなら、(例えば手榴弾の爆発に複数の敵を巻き込んだときのように、)何度も続けてダメージ・ダイスを振りたいこともあるだろうし、また、''もし''攻撃が命中したらダメージ・ダイスを振り、外したら{{code|ハズレ!}} と表示してくれるようなマクロを作りたいと考えるかも知れない。 | ||
In programming jargon, those concepts are called ''looping'' (where you go through a process repeatedly, or "loop through it"), and ''branching'' (where your program - in this case, the macro - "branches" down different paths). The MapTool macro language has several roll options (and one function) to let you branch and/or loop your commands. | <div style="color:gray">In programming jargon, those concepts are called ''looping'' (where you go through a process repeatedly, or "loop through it"), and ''branching'' (where your program - in this case, the macro - "branches" down different paths). The MapTool macro language has several roll options (and one function) to let you branch and/or loop your commands. </div> | ||
プログラム用語では、こういう概念を''繰り返し''(一つの処理を繰り返す)と''分岐''(プログラム―ここではマクロだが―が異なる複数の処理に枝分かれする)と呼ぶ。MapToolのマクロ言語にはダイスを振るための複数のオプション(や関数)があり、これであなたの命令を分岐・繰り返しさせることができる。 | プログラム用語では、こういう概念を''繰り返し''(一つの処理を繰り返す)と''分岐''(プログラム―ここではマクロだが―が異なる複数の処理に枝分かれする)と呼ぶ。MapToolのマクロ言語にはダイスを振るための複数のオプション(や関数)があり、これであなたの命令を分岐・繰り返しさせることができる。 | ||
Finally, because there are a lot of times when you'll want to do ''several'' things at the same time when you branch or loop, there's a special roll option called ''code'' that tells MapTool to treat several macro commands as a single "unit" when you loop or branch. That may sound confusing, but you'll see what it all means shortly! | <div style="color:gray">Finally, because there are a lot of times when you'll want to do ''several'' things at the same time when you branch or loop, there's a special roll option called ''code'' that tells MapTool to treat several macro commands as a single "unit" when you loop or branch. That may sound confusing, but you'll see what it all means shortly!</div> | ||
そして最後に、分岐や繰り返しを使って一度に''複数の''事をさばきたいと感じるのは良くあることなので、繰り返しや分岐の際に複数のマクロ・コマンドをまとめて一つの「単位」として扱える''code''というオプションも用意されている。ちょっと分かりにくいかも知れないが、すぐに分かるようになる。 | そして最後に、分岐や繰り返しを使って一度に''複数の''事をさばきたいと感じるのは良くあることなので、繰り返しや分岐の際に複数のマクロ・コマンドをまとめて一つの「単位」として扱える''code''というオプションも用意されている。ちょっと分かりにくいかも知れないが、すぐに分かるようになる。 | ||
Since there's a lot of ground to cover, this tutorial will cover ''branching'' (running different commands based on some condition). The [[Introduction to Macro Loops]] will handle looping (running a process repeatedly, until you wish it to stop). | <div style="color:gray">Since there's a lot of ground to cover, this tutorial will cover ''branching'' (running different commands based on some condition). The [[Introduction to Macro Loops]] will handle looping (running a process repeatedly, until you wish it to stop).</div> | ||
話さなければならないことが沢山あるので、このチュートリアルでは''分岐''(ある条件によって異なる命令を実行する)について説明することにする。繰り返し(ある処理を止めるまで繰り返す)については[[Introduction to Macro Loops]]で解説する。 | 話さなければならないことが沢山あるので、このチュートリアルでは''分岐''(ある条件によって異なる命令を実行する)について説明することにする。繰り返し(ある処理を止めるまで繰り返す)については[[Introduction to Macro Loops]]で解説する。 | ||
Line 20: | Line 20: | ||
==想定する読者== | ==想定する読者== | ||
We're going to get to using these options pretty fast, so I assume you've read the [[Introduction to Macro Writing]] and have knowledge of how to create a new macro and use some very basic commands in it (like creating a variable or a dice roll). | <div style="color:gray">We're going to get to using these options pretty fast, so I assume you've read the [[Introduction to Macro Writing]] and have knowledge of how to create a new macro and use some very basic commands in it (like creating a variable or a dice roll). </div> | ||
これから急ぎ足でいろいろなオプションを使っていくことになる。そんなわけで、[[Introduction to Macro Writing]]を読み終え、新しいマクロの作り方を知っていて、その中に含まれていた(変数を作ったり、ダイス振りをしたりするなどの)基本的なコマンドが使えると想定することにする。 | これから急ぎ足でいろいろなオプションを使っていくことになる。そんなわけで、[[Introduction to Macro Writing]]を読み終え、新しいマクロの作り方を知っていて、その中に含まれていた(変数を作ったり、ダイス振りをしたりするなどの)基本的なコマンドが使えると想定することにする。 | ||
There are a couple concepts that should be introduced first, since they're going to be a great way to illustrate some of the branching concepts (and looping concepts, in the [[Introduction to Macro Loops]]. You'll get an explanation of the new concepts below. | <div style="color:gray">There are a couple concepts that should be introduced first, since they're going to be a great way to illustrate some of the branching concepts (and looping concepts, in the [[Introduction to Macro Loops]]. You'll get an explanation of the new concepts below.</div> | ||
まず最初にいくつかの概念を理解してもらうが、これは分岐という概念を(そしてこの先[[Introduction to Macro Loops]]で説明する繰り返しの概念を)理解するという大変な作業を行うために必要だからだ。その新しい概念について、これから説明していこう。 | まず最初にいくつかの概念を理解してもらうが、これは分岐という概念を(そしてこの先[[Introduction to Macro Loops]]で説明する繰り返しの概念を)理解するという大変な作業を行うために必要だからだ。その新しい概念について、これから説明していこう。 | ||
Line 30: | Line 30: | ||
==新しい概念: CODE オプション== | ==新しい概念: CODE オプション== | ||
Normally, in any branching or looping technique, MapTool lets you do ''one thing'' - that is, one command. So if you had a statement that said "if a condition is true, do something cool," then "something cool" can only be one single thing - you might roll some dice, or assign a variable, or print out some text to the chat window. However, you couldn't roll some dice, assign a variable, assign ''another'' variable, do some math, and ''then'' print out something all in that statement. That's too many operations. | <div style="color:gray">Normally, in any branching or looping technique, MapTool lets you do ''one thing'' - that is, one command. So if you had a statement that said "if a condition is true, do something cool," then "something cool" can only be one single thing - you might roll some dice, or assign a variable, or print out some text to the chat window. However, you couldn't roll some dice, assign a variable, assign ''another'' variable, do some math, and ''then'' print out something all in that statement. That's too many operations.</div> | ||
MapToolでは、分岐や繰り返しの技法を使うと、''一つのこと''しかできないのが普通だ。この一つのこととは、つまりコマンド1個ということだ。だから「もしある条件が満たされたなら、なにかイケてることをしろ」では、この「なにかイケてること」の部分には一つのことしか入れられない。ダイスを振るとか、変数を宣言するとか、チャット・ウィンドウになにかのテキストを表示するとか、だ。しかし、ダイスを振って、変数を宣言して、さらに''もう一つ''変数を宣言して、計算を行い、''それから''そのなにかを出力する、といった処理はできない。処理の数が多すぎるからだ。 | MapToolでは、分岐や繰り返しの技法を使うと、''一つのこと''しかできないのが普通だ。この一つのこととは、つまりコマンド1個ということだ。だから「もしある条件が満たされたなら、なにかイケてることをしろ」では、この「なにかイケてること」の部分には一つのことしか入れられない。ダイスを振るとか、変数を宣言するとか、チャット・ウィンドウになにかのテキストを表示するとか、だ。しかし、ダイスを振って、変数を宣言して、さらに''もう一つ''変数を宣言して、計算を行い、''それから''そのなにかを出力する、といった処理はできない。処理の数が多すぎるからだ。 | ||
If you could only do one thing when you branch or loop, macros would be very limited - so the macro language supports a special roll option called {{roll|code}}, which indicates to MapTool that you want to do several things at once, but have them all happen as a single "branch" or "loop." You would group these several commands inside a pair of curly braces ( { } ). | <div style="color:gray">If you could only do one thing when you branch or loop, macros would be very limited - so the macro language supports a special roll option called {{roll|code}}, which indicates to MapTool that you want to do several things at once, but have them all happen as a single "branch" or "loop." You would group these several commands inside a pair of curly braces ( { } ). </div> | ||
分岐や繰り返しを使うと一つのことしかできないというのでは、マクロの可能性は限られたものになってしまう。そこで、マクロ言語は特殊なロールのオプションを用意している。これが{{roll|code}}だ。これは、複数の処理を行いたいが、それが「分岐」や「繰り返し」の一つとして行われるべきだということをMapToolに伝えるためのものだ。複数のコマンドを一組の中カッコ({})の中に書く。 | 分岐や繰り返しを使うと一つのことしかできないというのでは、マクロの可能性は限られたものになってしまう。そこで、マクロ言語は特殊なロールのオプションを用意している。これが{{roll|code}}だ。これは、複数の処理を行いたいが、それが「分岐」や「繰り返し」の一つとして行われるべきだということをMapToolに伝えるためのものだ。複数のコマンドを一組の中カッコ({})の中に書く。 | ||
The examples below will use the {{roll|code}} option, so you can see how it works. | <div style="color:gray">The examples below will use the {{roll|code}} option, so you can see how it works. </div> | ||
以下の例では{{roll|code}}のオプションを使っている。その仕組みが分かってもらえるだろう。 | 以下の例では{{roll|code}}のオプションを使っている。その仕組みが分かってもらえるだろう。 | ||
Line 44: | Line 44: | ||
==新しい概念: 比較演算子と論理演算子== | ==新しい概念: 比較演算子と論理演算子== | ||
In macro writing, you're going to want to compare values together a lot - is my dice roll greater than 20? Are my hit points less than 0? Does that weapon name equal "Warhammer?" All of these are handled via comparison operators and logical operators. | <div style="color:gray">In macro writing, you're going to want to compare values together a lot - is my dice roll greater than 20? Are my hit points less than 0? Does that weapon name equal "Warhammer?" All of these are handled via comparison operators and logical operators.</div> | ||
マクロを作成する場合、二つの数値を比べたいと考えることがよくある。ダイスの出目は20より大きいか? ヒットポイントは 0 より小さいか? その武器の名前は "Warhammer" と等しいか? | マクロを作成する場合、二つの数値を比べたいと考えることがよくある。ダイスの出目は20より大きいか? ヒットポイントは 0 より小さいか? その武器の名前は "Warhammer" と等しいか? | ||
''Comparison Operator'' is programming jargon for the symbols we use to have MapTool compare two values to each other in certain ways (an ''operator'' is a symbol that performs an operation - for instance, the + symbol is an operator that adds things together). | <div style="color:gray">''Comparison Operator'' is programming jargon for the symbols we use to have MapTool compare two values to each other in certain ways (an ''operator'' is a symbol that performs an operation - for instance, the + symbol is an operator that adds things together). </div> | ||
''比較演算子''とはプログラミングで用いる用語で、MapToolで二つの値を特定の基準で比べあうときに使う記号のことだ(''演算子''とは、ある演算を行うための記号だ)。例えば+記号は加算を表す。 | ''比較演算子''とはプログラミングで用いる用語で、MapToolで二つの値を特定の基準で比べあうときに使う記号のことだ(''演算子''とは、ある演算を行うための記号だ)。例えば+記号は加算を表す。 | ||
A ''Logical Operator'' is a symbol you use to instruct MapTool in what order to consider comparisons, and how to group comparisons together. The comparison and logical operators are described below: | <div style="color:gray">A ''Logical Operator'' is a symbol you use to instruct MapTool in what order to consider comparisons, and how to group comparisons together. The comparison and logical operators are described below:</div> | ||
''論理演算子''は、MapToolに対してどういう順番で比較を解釈したらよいか、それをどうまとめるかを教えるための記号だ。比較演算子と論理演算子については以下で説明する: | ''論理演算子''は、MapToolに対してどういう順番で比較を解釈したらよいか、それをどうまとめるかを教えるための記号だ。比較演算子と論理演算子については以下で説明する: | ||
In the examples below, the {{func|if}} function is used to illustrate the examples. It's described in more detail later, but the basic "format" of the {{func|if}} function is this: | <div style="color:gray">In the examples below, the {{func|if}} function is used to illustrate the examples. It's described in more detail later, but the basic "format" of the {{func|if}} function is this:</div> | ||
以下の例では、{{func|if}} を使って説明している。これについては後でもう少し詳しく解説するが、基本的な{{func|if}}の「文法」は以下の通りだ: | 以下の例では、{{func|if}} を使って説明している。これについては後でもう少し詳しく解説するが、基本的な{{func|if}}の「文法」は以下の通りだ: | ||
{{code|if(comparison, value_if_true, value_if_false)}} | <div style="color:gray">{{code|if(comparison, value_if_true, value_if_false)}}</div> | ||
{{code|if(比較, 真のときの値, 偽のときの値)}} | {{code|if(比較, 真のときの値, 偽のときの値)}} | ||
<div style="color:gray"> | |||
* '''Comparison''' is where you do your actual comparison (greater than, less than, etc.) | * '''Comparison''' is where you do your actual comparison (greater than, less than, etc.) | ||
* '''Value_if_true''' is where you put the output or value if the comparison is true | * '''Value_if_true''' is where you put the output or value if the comparison is true | ||
* '''Value_if_false''' is, obviously, where you put the output or value if the comparison is false | * '''Value_if_false''' is, obviously, where you put the output or value if the comparison is false | ||
</div> | |||
* '''比較'''は、実際に比較を行う部分(~より大きい、~より小さい、など) | * '''比較'''は、実際に比較を行う部分(~より大きい、~より小さい、など) | ||
Line 75: | Line 76: | ||
===比較演算子=== | ===比較演算子=== | ||
The symbols below are the comparison operators. Remember that you must always think of these comparisons from the reference point of the value on the ''left'' side. So, in the comparison {{code|value1 > value2}}, you read it based on the left side: "is {{code|value1}} greater than {{code|value2}}. This is the rule for comparisons in MapTool - the left side of the operator is the "point of view." | <div style="color:gray">The symbols below are the comparison operators. Remember that you must always think of these comparisons from the reference point of the value on the ''left'' side. So, in the comparison {{code|value1 > value2}}, you read it based on the left side: "is {{code|value1}} greater than {{code|value2}}. This is the rule for comparisons in MapTool - the left side of the operator is the "point of view." </div> | ||
比較演算子を以下に挙げる。こうした比較は常に''左辺値''を起点として考えねばならない点に注意すること。だから、{{code|value1 > value2}}という比較では、左辺値を基本として「{{code|value1}}は{{code|value2}}よりも大きい」と読むことになる。これはMapToolで比較を行う場合の規則だ。演算子の左辺値がかならず比較の「視点」となる。 | 比較演算子を以下に挙げる。こうした比較は常に''左辺値''を起点として考えねばならない点に注意すること。だから、{{code|value1 > value2}}という比較では、左辺値を基本として「{{code|value1}}は{{code|value2}}よりも大きい」と読むことになる。これはMapToolで比較を行う場合の規則だ。演算子の左辺値がかならず比較の「視点」となる。 | ||
<div style="color:gray"> | |||
* '''==''': "is equal to;" this is the operator you use to see if one value is equal to another. Be careful - it has ''two'' equals signs in a row (remember, one equal sign is already reserved for assigning values to variable). An example of this comparison would look like {{code|[if(hit == "yes", "you hit!", "you missed!")]}} | * '''==''': "is equal to;" this is the operator you use to see if one value is equal to another. Be careful - it has ''two'' equals signs in a row (remember, one equal sign is already reserved for assigning values to variable). An example of this comparison would look like {{code|[if(hit == "yes", "you hit!", "you missed!")]}} | ||
* '''>''': "is greater than; use this to see if the value on the left side is greater than the value on the right. For example: {{code|[if(roll > 17, "Hit!", "Miss")]}}. You can put a number on the left side, like {{code|[if(17 > roll, "Miss", "Hit!")]}} (note that it basically reverses the first example, so you need to switch the true and false outputs). | |||
* '''>=''': "is greater than or equal to"; use this to see if the value on the left side is greater than ''or equal to'' the value on the right. For example: {{code|[if(roll >= 17, "Hit!", "Miss")]}} | |||
* '''<''': "is less than"; use this to see if the value on the left side is ''less than'' the value on the right. For example, {{code|[if(roll < 19, "Miss", "Hit!")]}}} | |||
* '''<=''': "is less than or equal to"; use this to see if the value on the left side is ''less than or equal to'' the value on the right. For example: {{code|[if(roll <= 18, "normal hit", "critical hit")]}} | |||
* !=: "is not equal to"; use this to compare whether the value on the left side is ''not equal to'' the value on the right. Note that this operator doesn't care what the values actually ''are'', only that they are ''not equal''. For example, {{code|[if(roll != 1, "Not a fumble", "You fumbled!")]}} | |||
</div> | |||
* '''==''': 「~と等しい」 これは両方の値が等しいことを確認するための演算子だ。間違いやすいので注意して欲しいが、等号は''二つ''並んでいる(等号一つは、左辺値が変数であることを表すときに使われることを思い出して欲しい)。比較の例はこのようになる。{{code|[if(hit == "yes", "命中!", "外した!")]}} | * '''==''': 「~と等しい」 これは両方の値が等しいことを確認するための演算子だ。間違いやすいので注意して欲しいが、等号は''二つ''並んでいる(等号一つは、左辺値が変数であることを表すときに使われることを思い出して欲しい)。比較の例はこのようになる。{{code|[if(hit == "yes", "命中!", "外した!")]}} | ||
* '''>''': 「~より大きい」 これは左辺値が右辺値よりも大きいことを確認するために用いる。例えば、{{code|[if(roll > 17, "Hit!", "Miss")]}}という具合だ。左辺値は数値にすることもでき、その場合はこのようになる。{{code|[if(17 > roll, "外れ!", "命中!")]}} (これは単に最初の例を逆にしただけだ。なので、結果が真のときと偽の時の処理を逆にする必要がある)。 | * '''>''': 「~より大きい」 これは左辺値が右辺値よりも大きいことを確認するために用いる。例えば、{{code|[if(roll > 17, "Hit!", "Miss")]}}という具合だ。左辺値は数値にすることもでき、その場合はこのようになる。{{code|[if(17 > roll, "外れ!", "命中!")]}} (これは単に最初の例を逆にしただけだ。なので、結果が真のときと偽の時の処理を逆にする必要がある)。 | ||
* '''>=''': 「~以上」 左辺値が右辺値''以上''になることを確認するためのもの。例えば、{{code|[if(roll >= 17, "命中!", "外れ")]}}という具合に。 | * '''>=''': 「~以上」 左辺値が右辺値''以上''になることを確認するためのもの。例えば、{{code|[if(roll >= 17, "命中!", "外れ")]}}という具合に。 | ||
* '''<''': 「~未満」 左辺値が右辺値''未満''であることを確認するときに使われる。例えば、{{code|[if(roll < 19, "外れ", "命中!")]}}} のように。 | * '''<''': 「~未満」 左辺値が右辺値''未満''であることを確認するときに使われる。例えば、{{code|[if(roll < 19, "外れ", "命中!")]}}} のように。 | ||
* '''<=''': 「~以下」 左辺値が右辺値''以下''であることを確認するときに使われる。例えば、{{code|[if(roll <= 18, "通常命中", "クリティカルヒット")]}} のように。 | * '''<=''': 「~以下」 左辺値が右辺値''以下''であることを確認するときに使われる。例えば、{{code|[if(roll <= 18, "通常命中", "クリティカルヒット")]}} のように。 | ||
* '''!=''': 「~と等しくない」 左辺値と右辺値が''等しくない''ことを調べるために使うことができる。なお、この演算子はそれぞれの値が実際に''どういう値かは考慮しない''点に注意。単に''等しくない''ことだけを調べている。例えば、{{code|[if(roll != 1, "ファンブルでない", "ファンブルした!")]}} のように。 | * '''!=''': 「~と等しくない」 左辺値と右辺値が''等しくない''ことを調べるために使うことができる。なお、この演算子はそれぞれの値が実際に''どういう値かは考慮しない''点に注意。単に''等しくない''ことだけを調べている。例えば、{{code|[if(roll != 1, "ファンブルでない", "ファンブルした!")]}} のように。 | ||
===論理演算子=== | ===論理演算子=== | ||
The symbols below are the ''logical operators''. You use this to group comparisons together (you only need these if you need to make multiple comparisons at the same time). These go ''between'' individual comparisons (these don't replace the comparison operators above!). | <div style="color:gray">The symbols below are the ''logical operators''. You use this to group comparisons together (you only need these if you need to make multiple comparisons at the same time). These go ''between'' individual comparisons (these don't replace the comparison operators above!).</div> | ||
以下に挙げる記号が''論理演算子''だ。これらの演算子は組み合わせて使うことができる(が、それが必要なのは一度に複数の比較を行いたい場合だけだろう)。こうした演算子は比較演算子の''間''で使われる(前述の比較演算子を置き換えるものではない)。 | 以下に挙げる記号が''論理演算子''だ。これらの演算子は組み合わせて使うことができる(が、それが必要なのは一度に複数の比較を行いたい場合だけだろう)。こうした演算子は比較演算子の''間''で使われる(前述の比較演算子を置き換えるものではない)。 | ||
* '''&&''': "and"; use this if you want to make sure that two or more comparisons are ''all'' true. For example: {{code|[if(roll > 1 && roll < 20, "Hit", "Miss")]}} requires ''both'' comparisons to be true, for the whole comparison group to be true. In other words, the roll must be ''greater than 1'' '''and''' ''less than 20'' in order for it to be a hit. If both of those aren't true, the output is {{code|Miss}}. | <div style="color:gray"> | ||
* '''&&''': "and"; use this if you want to make sure that two or more comparisons are ''all'' true. For example: {{code|[if(roll > 1 && roll < 20, "Hit", "Miss")]}} requires ''both'' comparisons to be true, for the whole comparison group to be true. In other words, the roll must be ''greater than 1'' '''and''' ''less than 20'' in order for it to be a hit. If both of those aren't true, the output is {{code|Miss}}. | |||
** '''Remember: if you use &&, every part of the comparison statement must be true for the whole comparison to be true!''' | |||
* '''||''': "or"; use this if you want or need only one out of multiple comparisons to be true, in order for the whole thing to be true. For example, {{code|if(enemyHealth == "dead" || enemyHealth = "dying", "Don't kick a guy while he's down", "He's fair game!")}}. In the example, if ''either'' condition is true (that is, if {{code|enemyHealth}} is "dead" ''or'' "dying") the entire comparison group is true. Only if ''neither'' comparison is true does the whole thing become false. | |||
** '''Remember: use || if you only need one out of several comparisons to be true''' | |||
</div> | |||
* '''&&''': 「かつ」 これは複数の比較が全て真になるかどうかを確かめるときに用いる。例えば、{{code|[if(roll > 1 && roll < 20, "命中", "外れ")]}}とした場合、二つの比較の''両方とも''真となり、比較群全体としても真となることが求められている。 言い換えると、命中するためには、ダイスの出目は''1より大きく''て、''かつ''、''20未満''でなければならないことになる。この両方が真にならない場合、出力結果は{{code|外れ}}になる。 | * '''&&''': 「かつ」 これは複数の比較が全て真になるかどうかを確かめるときに用いる。例えば、{{code|[if(roll > 1 && roll < 20, "命中", "外れ")]}}とした場合、二つの比較の''両方とも''真となり、比較群全体としても真となることが求められている。 言い換えると、命中するためには、ダイスの出目は''1より大きく''て、''かつ''、''20未満''でなければならないことになる。この両方が真にならない場合、出力結果は{{code|外れ}}になる。 | ||
** '''注意: 全ての比較条件を && で結んだ場合、その全てが真にならないと、全体の結果も真にならない。''' | ** '''注意: 全ての比較条件を && で結んだ場合、その全てが真にならないと、全体の結果も真にならない。''' | ||
* '''||''': 「または」 は、複数の比較のうちどれかが真であれば、全体が真となる場合に使用する。例えば、{{code|if(enemyHealth == "死亡" || enemyHealth = "瀕死", "死んだ相手に蹴りなんか入れるな", "格好の標的だぜ!")}}というように。この例では、''どちらかの''条件が真なら(つまり、{{code|enemyHealth}}が"死亡"または"瀕死"なら)、比較群全体が真になる。''両方とも偽''である場合にのみ、全体が偽となる。 | * '''||''': 「または」 は、複数の比較のうちどれかが真であれば、全体が真となる場合に使用する。例えば、{{code|if(enemyHealth == "死亡" || enemyHealth = "瀕死", "死んだ相手に蹴りなんか入れるな", "格好の標的だぜ!")}}というように。この例では、''どちらかの''条件が真なら(つまり、{{code|enemyHealth}}が"死亡"または"瀕死"なら)、比較群全体が真になる。''両方とも偽''である場合にのみ、全体が偽となる。 | ||
** '''注意: 複数の条件のうち一つでも真になればよいときだけ、|| を使うこと。''' | ** '''注意: 複数の条件のうち一つでも真になればよいときだけ、|| を使うこと。''' | ||
==IF: 値を比較する== | ==IF: 値を比較する== | ||
One of the most elementary ways to branch any code is the use of the idea of ''if - then''. That is, ''if'' some comparison is true, ''then'' do something else. You would use the ''if'' concept to say "If my attack hits, then show the damage result!" | <div style="color:gray">One of the most elementary ways to branch any code is the use of the idea of ''if - then''. That is, ''if'' some comparison is true, ''then'' do something else. You would use the ''if'' concept to say "If my attack hits, then show the damage result!" </div> | ||
あらゆるコードで使われる中でも最も基本的な分岐の方法は''if - then''だ。つまり、''if(もし)''何らかの比較結果が真になる、''then(なら)''何か特別なことをする。この''if''は、「もし、私の攻撃が命中したら、ダメージ値を表示する!」というように使うことになるだろう。 | あらゆるコードで使われる中でも最も基本的な分岐の方法は''if - then''だ。つまり、''if(もし)''何らかの比較結果が真になる、''then(なら)''何か特別なことをする。この''if''は、「もし、私の攻撃が命中したら、ダメージ値を表示する!」というように使うことになるだろう。 | ||
MapTool's macro language has two kinds of if - a function (a function is a pre-defined set of instructions that you can "call" by referring to it by name), and a roll option (a roll option is a "switch" or "toggle" that tells MapTool how to handle a command. | <div style="color:gray">MapTool's macro language has two kinds of if - a function (a function is a pre-defined set of instructions that you can "call" by referring to it by name), and a roll option (a roll option is a "switch" or "toggle" that tells MapTool how to handle a command. </div> | ||
MapToolのマクロ言語には二種類の if がある。―関数とロール・オプションだ。関数とは、あらかじめ定義されている一連の命令のことで、名前をつかってそれを「呼び出す」ことができる。ロール・オプションとは、MapToolに対してある命令の扱い方を教えるための「スイッチ」とか「トグル」のことだ。 | MapToolのマクロ言語には二種類の if がある。―関数とロール・オプションだ。関数とは、あらかじめ定義されている一連の命令のことで、名前をつかってそれを「呼び出す」ことができる。ロール・オプションとは、MapToolに対してある命令の扱い方を教えるための「スイッチ」とか「トグル」のことだ。 | ||
Line 137: | Line 126: | ||
===if() 関数=== | ===if() 関数=== | ||
The {{func|if}} function is called simply by writing {{code|if()}} and putting the thing you want compared, what to do if the comparison is true, and what to do if the comparison is false, all inside the parentheses. The general format is: | <div style="color:gray">The {{func|if}} function is called simply by writing {{code|if()}} and putting the thing you want compared, what to do if the comparison is true, and what to do if the comparison is false, all inside the parentheses. The general format is:</div> | ||
{{func|if}} 関数は単に{{code|if()}}と書いて、比較すべきものと、その結果が真になったときにすることと、偽になったときにすることを、全てカッコの中に入れるだけで使える。基本的な文法はこうなる: | {{func|if}} 関数は単に{{code|if()}}と書いて、比較すべきものと、その結果が真になったときにすることと、偽になったときにすることを、全てカッコの中に入れるだけで使える。基本的な文法はこうなる: | ||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
{{code|if(comparison, value_if_true, value_if_false)}} | {{code|if(comparison, value_if_true, value_if_false)}} | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | <blockquote> | ||
Line 150: | Line 140: | ||
</blockquote> | </blockquote> | ||
<div style="color:gray">An actual example would look like:</div> | |||
An actual example would look like: | |||
そして実際の例はこんな風になる: | そして実際の例はこんな風になる: | ||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[if(attackHits == "yes", "You hit!", "You missed")] | [if(attackHits == "yes", "You hit!", "You missed")] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[if(attackHits == "yes", "命中!", "外れ")] | [if(attackHits == "yes", "命中!", "外れ")] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
In that single line, we've said: | <div style="color:gray">In that single line, we've said:</div> | ||
この一行でやらせていることは以下のとおり: | この一行でやらせていることは以下のとおり: | ||
<div style="color:gray"> | |||
* Check the variable {{code|attackHits}} to see if it has the value "yes" | * Check the variable {{code|attackHits}} to see if it has the value "yes" | ||
* If it has the value "yes", then print {{code|You hit!}} to chat, or | * If it has the value "yes", then print {{code|You hit!}} to chat, or | ||
* If it does ''not'' have the value "yes", then prin {{code|You missed}} to chat | * If it does ''not'' have the value "yes", then prin {{code|You missed}} to chat | ||
</div> | |||
* 変数{{code|attackHits}} の値が"yes"かどうかを確認 | * 変数{{code|attackHits}} の値が"yes"かどうかを確認 | ||
Line 180: | Line 173: | ||
* 値が"yes"''でない''なら{{code|外れ}} と、チャットに表示する。 | * 値が"yes"''でない''なら{{code|外れ}} と、チャットに表示する。 | ||
The ''value_if_true'' and ''value_if_false'' parts of the {{func|if}} statement can be text, dice roll commands (like 1d6 or 1d20), or variables. What they ''cannot'' be is variable assignments - that is, you can't write an {{func|if}} statement like this: | <div style="color:gray">The ''value_if_true'' and ''value_if_false'' parts of the {{func|if}} statement can be text, dice roll commands (like 1d6 or 1d20), or variables. What they ''cannot'' be is variable assignments - that is, you can't write an {{func|if}} statement like this:</div> | ||
{{func|if}}関数の中の、''真の時の値''と''偽の時の値''の二つの部分はテキストでも、ダイスロール・コマンド(1d6とか1d20とか)でも、変数でも構わない。そこに''入れてはいけない''のは、変数の代入だ。つまり、{{func|if}}をこういう風には書けないことになる: | {{func|if}}関数の中の、''真の時の値''と''偽の時の値''の二つの部分はテキストでも、ダイスロール・コマンド(1d6とか1d20とか)でも、変数でも構わない。そこに''入れてはいけない''のは、変数の代入だ。つまり、{{func|if}}をこういう風には書けないことになる: | ||
<blockquote>< | <div style="color:gray"> | ||
<blockquote><syntaxhighlight lang="mtmacro"> | |||
[if(attackHits=="yes", output = "You Hit!", output = "You missed")] | [if(attackHits=="yes", output = "You Hit!", output = "You missed")] | ||
</ | </syntaxhighlight></blockquote> | ||
</div> | |||
<blockquote>< | <blockquote><syntaxhighlight lang="mtmacro"> | ||
[if(attackHits=="yes", output = "命中!", output = "外れ")] | [if(attackHits=="yes", output = "命中!", output = "外れ")] | ||
</ | </syntaxhighlight></blockquote> | ||
It may seem like a good idea, but it won't work - MapTool will give what's known as a ''null pointer exception'', and the macro will fail. However, there is a trick to get around that: since {{func|if}} is a function, and all functions - when they run - produce a ''value'', you can assign the ''result'' of it to a variable! You would do it like this: | <div style="color:gray">It may seem like a good idea, but it won't work - MapTool will give what's known as a ''null pointer exception'', and the macro will fail. However, there is a trick to get around that: since {{func|if}} is a function, and all functions - when they run - produce a ''value'', you can assign the ''result'' of it to a variable! You would do it like this:</div> | ||
一見よさそうに見えるが、これはうまくいかない。これをやると、MapToolは俗に「ヌルポインター例外」と呼ばれるものを出し、マクロはエラーを起こしてしまう。しかし、これをうまく回避するワザもある。{{func|if}}は関数であり、すべての関数は実行すると''値を返す''のだから、その''戻り値''を変数に代入することができるんだ。こんな風に: | 一見よさそうに見えるが、これはうまくいかない。これをやると、MapToolは俗に「ヌルポインター例外」と呼ばれるものを出し、マクロはエラーを起こしてしまう。しかし、これをうまく回避するワザもある。{{func|if}}は関数であり、すべての関数は実行すると''値を返す''のだから、その''戻り値''を変数に代入することができるんだ。こんな風に: | ||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[output = if(attackHits=="yes", "You Hit!", "You missed")] | [output = if(attackHits=="yes", "You Hit!", "You missed")] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[output = if(attackHits=="yes", "命中!", "はずれ")] | [output = if(attackHits=="yes", "命中!", "はずれ")] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
When you do it that way, MapTool will: | <div style="color:gray">When you do it that way, MapTool will:</div> | ||
このように書いておくと、MapToolはこんな風に動く: | このように書いておくと、MapToolはこんな風に動く: | ||
<div style="color:gray"> | |||
* First, decide what the result of the {{func|if}} is, and | * First, decide what the result of the {{func|if}} is, and | ||
* Second, assign that ''result'' to the variable {{code|output}}, which you can then use like any variable | * Second, assign that ''result'' to the variable {{code|output}}, which you can then use like any variable | ||
</div> | |||
* まず、{{func|if}}の値を求め、それから | * まず、{{func|if}}の値を求め、それから | ||
Line 220: | Line 219: | ||
==={{roll|if}} ロール・オプション=== | ==={{roll|if}} ロール・オプション=== | ||
In addition to {{func|if}}, there is another way to employ the concept of "if-then" in macro code. The {{roll|if}} ''roll option''. Roll options are, as mentioned above, effectively "switches" or "toggles" that you set for a macro command that affect how MapTool will handle it. A couple simple roll options are mentioned in the [[Introduction to Macro Writing]] - things like {{roll|h}} and {{roll|e}} for hidden or expanded output, for example. | <div style="color:gray">In addition to {{func|if}}, there is another way to employ the concept of "if-then" in macro code. The {{roll|if}} ''roll option''. Roll options are, as mentioned above, effectively "switches" or "toggles" that you set for a macro command that affect how MapTool will handle it. A couple simple roll options are mentioned in the [[Introduction to Macro Writing]] - things like {{roll|h}} and {{roll|e}} for hidden or expanded output, for example. </div> | ||
{{func|if}}の他にも、「もし~ならば~」の概念をマクロ・コードで使う方法がもう一つある。それが{{roll|if}}の''ロール・オプション''だ。ロール・オプションとは、前述したとおり、あらかじめ与えておいたマクロ・コマンドの扱い方をMapToolに「切り替え」あるいは「トグル」させるためのものだ。[[Introduction to Macro Writing]]にはそのいくつかが載っている。{{roll|h}}や{{roll|e}}などがそれだ。 | {{func|if}}の他にも、「もし~ならば~」の概念をマクロ・コードで使う方法がもう一つある。それが{{roll|if}}の''ロール・オプション''だ。ロール・オプションとは、前述したとおり、あらかじめ与えておいたマクロ・コマンドの扱い方をMapToolに「切り替え」あるいは「トグル」させるためのものだ。[[Introduction to Macro Writing]]にはそのいくつかが載っている。{{roll|h}}や{{roll|e}}などがそれだ。 | ||
Roll options must follow these rules: | <div style="color:gray">Roll options must follow these rules:</div> | ||
ロール・オプションは以下の規則に従わねばならない: | ロール・オプションは以下の規則に従わねばならない: | ||
<div style="color:gray"> | |||
# Appear at the beginning of a macro command | # Appear at the beginning of a macro command | ||
# If only '''one''' roll option is on the line, it ends with a colon. For example: {{code|[h:]}} | # If only '''one''' roll option is on the line, it ends with a colon. For example: {{code|[h:]}} | ||
# If ''multiple'' roll option are on the same command, they are separated by commas, and the ''last'' one is followed by a colon. For example, {{code|[h,if(HP > 0): command]}} | # If ''multiple'' roll option are on the same command, they are separated by commas, and the ''last'' one is followed by a colon. For example, {{code|[h,if(HP > 0): command]}} | ||
# If a roll option takes an ''argument'' - that is, it has parentheses and wants you to put something in them, like a comparison - the colon (or comma, if there are multiple roll options) goes ''after'' the parentheses. Look at the examples below to see how it's used. | # If a roll option takes an ''argument'' - that is, it has parentheses and wants you to put something in them, like a comparison - the colon (or comma, if there are multiple roll options) goes ''after'' the parentheses. Look at the examples below to see how it's used. | ||
</div> | |||
# マクロ・コマンドの先頭につける | # マクロ・コマンドの先頭につける | ||
Line 239: | Line 239: | ||
# ロール・オプションが''引数''を持つ場合、つまり、比較をするときのように、そのオプションには小カッコがついていて、その中に何かを入れたい場合、コロン(複数のロール・オプションがある場合はコンマも)はその小カッコの''後ろ''に来る。どうなるかは以下の例を見て欲しい。 | # ロール・オプションが''引数''を持つ場合、つまり、比較をするときのように、そのオプションには小カッコがついていて、その中に何かを入れたい場合、コロン(複数のロール・オプションがある場合はコンマも)はその小カッコの''後ろ''に来る。どうなるかは以下の例を見て欲しい。 | ||
To use the {{roll|if}} option as a comparison, you must follow the format: | <div style="color:gray">To use the {{roll|if}} option as a comparison, you must follow the format:</div> | ||
{{roll|if}}オプションを比較に使う場合、以下の文法を使わなければならない: | {{roll|if}}オプションを比較に使う場合、以下の文法を使わなければならない: | ||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[if(comparison): command_if_true; command_if_false] | [if(comparison): command_if_true; command_if_false] | ||
</ | </syntaxhighlight></blockquote> | ||
</div> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[if(比較): 真のときのコマンド; 偽の時のコマンド] | [if(比較): 真のときのコマンド; 偽の時のコマンド] | ||
</ | </syntaxhighlight></blockquote> | ||
<div style="color:gray"> | |||
* '''Comparison''': this is a comparison statement, as used in the {{func|if}} above. | * '''Comparison''': this is a comparison statement, as used in the {{func|if}} above. | ||
* '''Command_if_true''': this is the command to execute if true; in this form of IF, you ''can'' do variable assignments or commands that you cannot do in the {{func|if}} method. However, it doesn't ''have'' to be a whole command - it can still be a bit of text. | |||
* '''Command_if_false''': this is the command to execute if false. This is an optional statement - if you want it to do nothing if the comparison is false, then leave off the semicolon and the {{code|command_if_false}} part entirely. | |||
</div> | |||
* '''比較''': これは比較文を表している。前述した{{func|if}}で使われたのと同じだ。 | * '''比較''': これは比較文を表している。前述した{{func|if}}で使われたのと同じだ。 | ||
* '''真のときのコマンド''': これは真の時に実行されるコマンドを表す。この形式のIFでは、コマンドだけでなく、{{func|if}}では不可能だった変数への代入ができる。なお、この部分はコマンドでなくても構わない。テキストでもいいのだ。 | * '''真のときのコマンド''': これは真の時に実行されるコマンドを表す。この形式のIFでは、コマンドだけでなく、{{func|if}}では不可能だった変数への代入ができる。なお、この部分はコマンドでなくても構わない。テキストでもいいのだ。 | ||
* '''偽のときのコマンド''': これは偽の時に実行されるコマンドを表す。この部分はオプショナルであり、比較結果が偽のときにしたいことがなければ、セミコロンも、その後ろの{{code|偽のときのコマンド}}も書かなくていい。 | * '''偽のときのコマンド''': これは偽の時に実行されるコマンドを表す。この部分はオプショナルであり、比較結果が偽のときにしたいことがなければ、セミコロンも、その後ろの{{code|偽のときのコマンド}}も書かなくていい。 | ||
An example of the use of the {{roll|if}} roll option might be: | <div style="color:gray">An example of the use of the {{roll|if}} roll option might be:</div> | ||
{{roll|if}}ロール・オプションの例は以下の通りだ: | {{roll|if}}ロール・オプションの例は以下の通りだ: | ||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[h,if(attackHits == "yes"): output="You hit!"; output="You missed"] | [h,if(attackHits == "yes"): output="You hit!"; output="You missed"] | ||
Result of your attack: [r:output] | Result of your attack: [r:output] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[h,if(attackHits == "yes"): output="命中!"; output="外れ"] | [h,if(attackHits == "yes"): output="命中!"; output="外れ"] | ||
攻撃結果: [r:output] | 攻撃結果: [r:output] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
In the above example, the following things are happening: | <div style="color:gray">In the above example, the following things are happening:</div> | ||
上の例では、以下のように処理されている: | 上の例では、以下のように処理されている: | ||
<div style="color:gray"> | |||
* MapTool compares the value of {{code|attackHits}} to the value {{code|"yes"}} | * MapTool compares the value of {{code|attackHits}} to the value {{code|"yes"}} | ||
** If the comparison is ''true'' - that is, the value of {{code|attackHits}} is ''indeed'' equal to {{code|"yes"}} - it assigns the value {{code|"You hit!"}} to the variable {{code|output}}. | |||
** If the comparison is ''false'' - the value of {{code|attackHits}} is ''not equal to'' {{code|"yes"}} - it assigns the value {{code|"You missed"}} to the variable {{code|output}}. | |||
* It then prints a short line of text and the value of {{code|output}} to chat. | |||
</div> | |||
* MapToolは{{code|attackHits}}の値と{{code|"yes"}}の値とを比較する | * MapToolは{{code|attackHits}}の値と{{code|"yes"}}の値とを比較する | ||
** 比較結果が''真''になったら、つまり、{{code|attackHits}}が''本当に''{{code|"yes"}}と等しいなら、変数{{code|output}}に{{code|"命中!"}}の値を代入する。 | ** 比較結果が''真''になったら、つまり、{{code|attackHits}}が''本当に''{{code|"yes"}}と等しいなら、変数{{code|output}}に{{code|"命中!"}}の値を代入する。 | ||
** 比較結果が''偽''になったら、つまり、{code|attackHits}}が{{code|"yes"}}と''等しくない''なら、変数{{code|output}}に{{code|"外れ"}}の値を代入する。 | |||
* そして、短いテキストと{{code|output}}の値をチャットに表示する。 | |||
<div style="color:gray">You'll note that the first line - the line that uses if - has '''''two''''' roll options on the same line: {{roll|h}} and {{roll|if}}. You'll also see that they are separated by a comma, and the colon goes ''after'' the last roll option, and ''before'' the commands in the {{code|command_if_true}} and {{code|command_if_false}} sections.</div> | |||
1行目で気づいた人もいるだろう。ここでは一つの行で、{{roll|h}} と {{roll|if}}の''二つ''のロール・オプションを使っている。この二つのオプションはコンマで区切られていて、コロンは最後のロール・オプションの後ろ、{{code|真のときのコマンド}}と{{code|偽の時のコマンド}}のセクションの前にある。 | |||
===IF と CODE=== | |||
<div style="color:gray">So what if you want to do more than one thing based on a comparison? Say, set a bunch of variables to a certain value? For that, you use the {{roll|code}} roll option. </div> | |||
比較の結果としてやりたいことが複数あったらどうしたらいいだろうか? 例えば、複数の変数にそれぞれ値を代入するとか? それには{{roll|code}}ロール・オプションが使える。 | |||
= | <div style="color:gray">Like all roll options, {{roll|code}} is put at the beginning of the line, separated from other roll options by a comma. Macro programming convention (that is, the way most macro writers seem to do it) is to put {{roll|code}} as the last roll option in the list. So, the general format you will see in a macro is likely to be:</div> | ||
他のロール・オプションと同じように、{{roll|code}}は行の先頭に置き、他のロール・オプションとはコンマで区切る。マクロプログラミング規約(要は、ほとんどのマクロがそうなってるって意味だ)では、{{roll|code}} をロール・オプションの一番最後につけることになっている。だから、マクロの中では一般にはこんな風になる: | |||
<div style="color:gray"> | |||
<blockquote> | |||
<syntaxhighlight lang="mtmacro"> | |||
[roll_option1, roll_option2, code: macro_commands] | |||
</syntaxhighlight> | |||
</blockquote> | |||
</div> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[roll_option1, roll_option2, code: macro_commands] | [roll_option1, roll_option2, code: macro_commands] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
The second component of the {{roll|code}} option is the curly bracket ({ }). You use these to enclose multiple commands as a single group. Remember the format of the {{roll|if}} roll option? | <div style="color:gray">The second component of the {{roll|code}} option is the curly bracket ({ }). You use these to enclose multiple commands as a single group. Remember the format of the {{roll|if}} roll option?</div> | ||
{{roll|code}}オプションの二番目の要素は中カッコ({})だ。これを使って複数のコマンドを一つの群にまとめる。{{roll|if}}ロール・オプションの文法を覚えているかな? | |||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[if(comparison): command_if_true; command_if_false] | [if(comparison): command_if_true; command_if_false] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
Well, the {{roll|code}} option lets you replace {{code|command_if_true}} and {{code|command_if_false}} with ''multiple'' macro commands. Let's look at an example: | <blockquote> | ||
<syntaxhighlight lang="mtmacro"> | |||
[if(comparison): 真のときのコマンド; 偽のときのコマンド] | |||
</syntaxhighlight> | |||
</blockquote> | |||
<div style="color:gray">Well, the {{roll|code}} option lets you replace {{code|command_if_true}} and {{code|command_if_false}} with ''multiple'' macro commands. Let's look at an example: </div> | |||
さて、{{roll|code}}オプションでは {{code|真のときのコマンド}} と {{code|偽のときのコマンド}} に''複数の''マクロ・コマンドを置くことができる。例を見てみよう: | |||
<div style="color:gray">Suppose we write a macro to look at a variable called {{code|attackRoll}}. We want to compare it to a number (the target number), which is held by the variable {{code|targetNumber}}. Here's what we want the macro to do:</div> | |||
これから{{code|attackRoll}}という変数の値を調べるマクロを書くとしよう。そしてこれをある値(目標値)と比較しようと考えている。この値は{{code|targetNumber}}という変数に格納されている。マクロにやらせたいのはこういうことだ: | |||
If {{code|attackRoll}} is greater than or equal to {{code|targetNumber}}, the macro should: | <div style="color:gray">If {{code|attackRoll}} is greater than or equal to {{code|targetNumber}}, the macro should: | ||
* Set {{code|attackUsed}} to "yes" | * Set {{code|attackUsed}} to "yes" | ||
Line 339: | Line 362: | ||
* Set {{code|damageRoll}} to the result of the dice roll 1d8+4. | * Set {{code|damageRoll}} to the result of the dice roll 1d8+4. | ||
* Output a string telling the user the results. | * Output a string telling the user the results. | ||
</div> | |||
もし {{code|attackRoll}} が {{code|targetNumber}} 以上なら: | |||
If {{code|attackRoll}} is ''not'' greater than or equal to {{code|targetNumber}}, the macro should: | * {{code|attackUsed}} に "yes" をセット | ||
* {{code|attackResult}} に "命中" をセット | |||
* {{code|attackRecharge}} に 3 をセット | |||
* {{code|damageRoll}} には 1d8+4 の結果をセット | |||
* ユーザーにその結果を知らせる文字列を表示する | |||
<div style="color:gray">If {{code|attackRoll}} is ''not'' greater than or equal to {{code|targetNumber}}, the macro should: | |||
* Set {{code|attackUsed}} to "Yes" | * Set {{code|attackUsed}} to "Yes" | ||
* Set {{code|attackResult}} to "misses" | * Set {{code|attackResult}} to "misses" | ||
* Set {{code|attackRecharge}} to 3 | * Set {{code|attackRecharge}} to 3 | ||
* Set {{code|damageRoll}} to "no" | * Set {{code|damageRoll}} to "no" | ||
* Output a string to chat telling the user the results. | * Output a string to chat telling the user the results. | ||
</div> | |||
もし {{code|attackRoll}} が {{code|targetNumber}}''未満''なら: | |||
* {{code|attackUsed}} に "yes" をセット | |||
* {{code|attackResult}} に "外れ" をセット | |||
* {{code|attackRecharge}} に 3 をセット | |||
* {{code|damageRoll}} には "no" をセット | |||
* ユーザーにその結果を知らせる文字列を表示する | |||
<div style="color:gray">Here's how to do it:</div> | |||
では、以下にそのマクロを載せる: | |||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[h:attackRoll = 1d20] | [h:attackRoll = 1d20] | ||
[h:targetNumber = 15] | [h:targetNumber = 15] | ||
Line 370: | Line 414: | ||
Your attack [attackResult], and you do [damageRoll] damage. Your attack will recharge in [attackRecharge] rounds. | Your attack [attackResult], and you do [damageRoll] damage. Your attack will recharge in [attackRecharge] rounds. | ||
</ | </syntaxhighlight> | ||
</blockquote> | |||
</div> | |||
<blockquote> | |||
<syntaxhighlight lang="mtmacro"> | |||
[h:attackRoll = 1d20] | |||
[h:targetNumber = 15] | |||
[h,if(attackRoll >= targetNumber), code: | |||
{ | |||
[attackUsed = "yes"] | |||
[attackResult = "命中"] | |||
[attackRecharge = 3] | |||
[damageRoll = 1d8+4] | |||
}; | |||
{ | |||
[attackUsed = "yes"] | |||
[attackResult = "外れ"] | |||
[attackRecharge = 3] | |||
[damageRoll = 0] | |||
}] | |||
あなたの攻撃は [attackResult] で、与えたダメージは [damageRoll] 点。 次の攻撃ができるまで [attackRecharge] ラウンドかかる。 | |||
</syntaxhighlight> | |||
</blockquote> | </blockquote> | ||
* We declare two variables, {{code|attackRoll}} and {{code|targetNumber}}, and give them initial values (in this case, {{code|attackRoll}} will be the result of a 1d20 roll, and {{code|targetNumber}} is set to 15). | <div style="color:gray">There's a lot going on here, but the important thing to look for is the CODE option in the very first line, and the curly braces. The curly braces enclose multiple separate commands, but say to MapTool, "treat these as one thing". So in the example above:</div> | ||
ここではいろいろなことをしているが、注目して欲しいのは一番最初の行にある CODE オプションと、中カッコだ。中カッコの中には複数のコマンドが入っているが、MapToolに対してこれを「一つのものとして扱う」よう指示していることになる。従って、上の例はこのように動作する: | |||
<div style="color:gray"> | |||
* We declare two variables, {{code|attackRoll}} and {{code|targetNumber}}, and give them initial values (in this case, {{code|attackRoll}} will be the result of a 1d20 roll, and {{code|targetNumber}} is set to 15). | |||
* We set up the comparison (putting an h, in front - remember, that will hide the results from chat, so you don't see all the calculations in the if statement). | * We set up the comparison (putting an h, in front - remember, that will hide the results from chat, so you don't see all the calculations in the if statement). | ||
* We put {{roll|code}} in there to warn MapTool that each part of the {{roll|if}} roll option - {{code|command_if_true}} and {{code|command_if_false}} - will actually consist of multiple separate commands. | * We put {{roll|code}} in there to warn MapTool that each part of the {{roll|if}} roll option - {{code|command_if_true}} and {{code|command_if_false}} - will actually consist of multiple separate commands. | ||
* We put a colon after the word {{code|code}}, to mark off the end of all the roll options. There is only ONE colon in the line! | * We put a colon after the word {{code|code}}, to mark off the end of all the roll options. There is only ONE colon in the line! | ||
* We use a { to mark the start of the {{code|command_if_true}} portion of the IF statement. We then put in our commands, each one separately and enclosed in square brackets. Once finished, we ''close'' that section of the IF statement with a }, and put a semicolon on the end (remember, the IF roll option needs a semicolon to separate {{code|command_if_true}} from {{code|command_if_false}}. | * We use a { to mark the start of the {{code|command_if_true}} portion of the IF statement. We then put in our commands, each one separately and enclosed in square brackets. Once finished, we ''close'' that section of the IF statement with a }, and put a semicolon on the end (remember, the IF roll option needs a semicolon to separate {{code|command_if_true}} from {{code|command_if_false}}. | ||
* We do the same process for the {{code|command_if_false}} section - a { followed by a series of commands, and then closed with a }. | * We do the same process for the {{code|command_if_false}} section - a { followed by a series of commands, and then closed with a }. | ||
* We make sure to close off the '''''whole''''' if statement with another square bracket ( ] ). Remember, an IF roll option is still just a macro command, and all macro commands must be enclosed in '''[ ]'''. | * We make sure to close off the '''''whole''''' if statement with another square bracket ( ] ). Remember, an IF roll option is still just a macro command, and all macro commands must be enclosed in '''[ ]'''. | ||
* Finally, we write some text, with the several variables we have inserted at appropriate points, to be sent to chat when the macro runs. | * Finally, we write some text, with the several variables we have inserted at appropriate points, to be sent to chat when the macro runs. | ||
</div> | |||
* 二つの変数 {{code|attackRoll}} と {{code|targetNumber}} を宣言し、初期値を与える(この場合、{{code|attackRoll}} は 1d20 の結果、{{code|targetNumber}} は15になるはずだ)。 | |||
* 比較条件を設定する(まず最初に h を置く。このオプションをつけるとその結果をチャットに表示しなくなる。従って、この if 文の計算結果は見えなくなる)。 | |||
* {{roll|if}}ロール・オプションの中の、{{code|真のときのコマンド}} と {{code|偽のときのコマンド}}のそれぞれの部分に{{roll|code}}を置いて、この部分の中には複数のコマンドが入るのだということをMapToolにあらかじめ報せておく。 | |||
* {{code|code}}文の後ろにコロンを置き、ロール・オプションの終端であることを知らせる。この行にあるコロンはこれ一つだけ! | |||
* IF文の中の、{{code|真のときのコマンド}} の最初に { を置く。それからそれぞれ大カッコでくくったコマンドを並べていく。全部終わったら、このセクションを } で閉じ、最後にセミコロンをつける( IF ロール・オプションでは、{{code|真のときのコマンド}} と {{code|偽のときのコマンド}} を区切るのにセミコロンが必要だということを思い出して欲しい) | |||
* 上と同じ作業を {{code|偽のときのコマンド}} のセクションについても行う。 { の後に一連のコマンドを並べ、最後に } で閉じる。 | |||
* ここでこの if 文'''''全体を'''''大カッコ( ] )でくくっておくこと。 IF ロール・オプションもマクロ・コマンドの一つであり、全てのマクロ・コマンドは'''[ ]'''でくくられていなければならない。 | |||
* 最後に、それぞれの変数を適当な場所に埋め込んだテキストを書き、マクロが実行されたときにチャットに送り込まれるようにしておく | |||
<div style="color:gray">'''NOTE''': The CODE roll option only works with ''other roll options''. You would not use this with the {{func|if}} ''function''. That is a bit confusing, but just remember: CODE only goes with other roll options.</div> | |||
''' | '''注意''': CODE ロール・オプションは''他のロール・オプション''と組み合わせたときにだけ動作する。''関数''である{{func|if}} とは組み合わせられない。ちょっとややこしいかも知れないが、「 CODE は ロール・オプションと組み合わせてしか使えない」とだけ、覚えておいて欲しい。 | ||
==SWITCH: | ==SWITCH: 複数の選択肢の中から選ぶ== | ||
The {{func|if}} function and the {{roll|if}} roll option both let you pick from two options - either do something when the comparison is ''true'', or do something different when the comparison is ''false''. But life - and RPG's - are not always so black and white. When you want to do different things based on one of ''many'' options, you use the {{roll|switch}} roll option. | <div style="color:gray">The {{func|if}} function and the {{roll|if}} roll option both let you pick from two options - either do something when the comparison is ''true'', or do something different when the comparison is ''false''. But life - and RPG's - are not always so black and white. When you want to do different things based on one of ''many'' options, you use the {{roll|switch}} roll option. </div> | ||
{{func|if}}関数と{{roll|if}}ロール・オプションは両方とも二つある処理のどちらか一つを選ぶものだ。比較結果が''真''ならこちら、''偽''ならこちらという具合に。しかし人生というものは、そしてRPGもだが、常に白黒はっきりしたものではない。''複数の''選択肢の中から異なった動作を一つ選ぶ場合には、{{roll|switch}}ロール・オプションを使いたまえ。 | |||
<div style="color:gray">The general format is:</div> | |||
一般的な文法は以下の通り: | |||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[switch(val): | [switch(val): | ||
case case_value1: command_1; | case case_value1: command_1; | ||
Line 400: | Line 488: | ||
case case_value3: command_3; | case case_value3: command_3; | ||
default: command_Default] | default: command_Default] | ||
</ | </syntaxhighlight> | ||
</blockquote> | |||
</div> | |||
<blockquote> | |||
<syntaxhighlight lang="mtmacro"> | |||
[switch(val): | |||
case 第1の値: 第1のコマンド; | |||
case 第2の値: 第2のコマンド; | |||
case 第3の値: 第3のコマンド; | |||
default: デフォルトのコマンド] | |||
</syntaxhighlight> | |||
</blockquote> | </blockquote> | ||
<div style="color:gray">What's happening here is this:</div> | |||
MapToolはこういう風に動作する: | |||
<div style="color:gray"> | |||
* MapTool is looking at the value of the variable {{code|val}} | * MapTool is looking at the value of the variable {{code|val}} | ||
* MapTool then looks at each of the {{code|case}} statements in the switch, and compares {{code|val}} to {{code|case_value1}}, {{code|case_value2}}, and {{code|case_value3}} | * MapTool then looks at each of the {{code|case}} statements in the switch, and compares {{code|val}} to {{code|case_value1}}, {{code|case_value2}}, and {{code|case_value3}} | ||
* When MapTool finds a match - that is, {{code|val}} is equal to one of those cases, the appropriate command (either {{code|command_1}}, {{code|command_2}}, or {{code|command_3}}) is executed, and then MapTool exits the switch statement (which just means, once it's found a match, it does what that case says, and then stops checking for matches). | * When MapTool finds a match - that is, {{code|val}} is equal to one of those cases, the appropriate command (either {{code|command_1}}, {{code|command_2}}, or {{code|command_3}}) is executed, and then MapTool exits the switch statement (which just means, once it's found a match, it does what that case says, and then stops checking for matches). | ||
</div> | |||
* 変数 {{code|val}} の値を調べる | |||
* それから switch の中の {{code|case}} 文を一つ一つ見ていって、{{code|val}} を {{code|第1の値}}、{{code|第2の値}}、{{code|第3の値}} と比較する | |||
* 一致する値が見つかったら、つまり {{code|val}} が case 文のどれかと等しくなったら、それに該当するコマンドを({{code|第1のコマンド}}、{{code|第2のコマンド}}、{{code|第3のコマンド}}のいずれかを)実行する。それが終わったら、switch 文を抜ける(要は、一致するものを探して、そこに書いてある通りのことをして、そこで探すのをやめる、ということだ)。 | |||
<div style="color:gray">Suppose, for example, that the we wanted a macro that would automatically assign the right {{code|Armor}} value to a token, based on the token's {{code|Class}}. If you've been following along, you might recognize the '''Armor''' value as one of the attributes in the [[Sample Ruleset]]. If you visit the [[Sample Ruleset]] page, you'll see that a character can have one of several armor values, based on the character's class:</div> | |||
例えば、あるトークンに対して、その{{code|Class}}に応じた正しい{{code|Armor}}値を自動的に代入するマクロが欲しいと仮定してみる。ここまで読んできてくれたのなら、ここでいう'''Armor'''値は[[Sample Ruleset]]にある属性値の一つだということが分かってもらえるだろう。[[Sample Ruleset]]のページを読めば、キャラクターが自分のクラスに応じていくつかの装甲値(armor value)のなかから一つを選べることが分かるはずだ: | |||
<div style="color:gray"> | |||
* A '''Warrior''' has an armor value of 6 | * A '''Warrior''' has an armor value of 6 | ||
* A '''Rogue''' has an armor value of 2 | * A '''Rogue''' has an armor value of 2 | ||
* A '''Wizard''' has an armor value of 1 | * A '''Wizard''' has an armor value of 1 | ||
* A '''Priest''' has an armor value of 4 | * A '''Priest''' has an armor value of 4 | ||
</div> | |||
* A '''Warrior''' の装甲値は 6 | |||
* A '''Rogue''' の装甲値は 2 | |||
* A '''Wizard''' の装甲値は 1 | |||
* A '''Priest''' の装甲値は 4 | |||
<div style="color:gray">So, let's say we want a macro to ask us for the value of the variable {{code|class}}, and then use that variable to assign the right {{code|Armor}} value. Here's how we'd do it:</div> | |||
そこで、マクロがそのトークンの{{code|class}}を質問してくるようにして、その後で正しい{{code|Armor}}値を代入するようしよう。こういう風になる: | |||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[h:class = "Rogue"] | [h:class = "Rogue"] | ||
Line 430: | Line 550: | ||
Your Armor Value is [Armor]. | Your Armor Value is [Armor]. | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | |||
<syntaxhighlight lang="mtmacro"> | |||
[h:class = "Rogue"] | |||
* Look at the value for {{code|class}} - if you try this out, it will always show the value for "Rogue." If you alter the {{code|[h:class="Rogue"]}} line, you can see how changing that value affects the switch statement). | [h,switch(class): | ||
case "Warrior": Armor = 6; | |||
case "Rogue": Armor = 2; | |||
case "Wizard": Armor = 1; | |||
case "Priest": Armor = 4; | |||
default: Armor = 0] | |||
あなたの装甲値は [Armor] です。 | |||
</syntaxhighlight> | |||
</blockquote> | |||
<div style="color:gray">What the above example does is:</div> | |||
この例で何をやっているかというと、こういうことだ: | |||
<div style="color:gray"> | |||
* Look at the value for {{code|class}} - if you try this out, it will always show the value for "Rogue." If you alter the {{code|[h:class="Rogue"]}} line, you can see how changing that value affects the switch statement). | |||
* Compare what you put in there with the four different cases - checking to see if {{code|class}} is equal to {{code|"Warrior"}}, {{code|"Rogue"}}, {{code|"Wizard"}}, or {{code|"Priest"}}. | * Compare what you put in there with the four different cases - checking to see if {{code|class}} is equal to {{code|"Warrior"}}, {{code|"Rogue"}}, {{code|"Wizard"}}, or {{code|"Priest"}}. | ||
* If {{code|class}} equals any of those (and we mean EXACTLY equals - case sensitive, no spaces, an ''exact'' match), run the command to set the variable {{code|Armor}} to the appropriate value. | * If {{code|class}} equals any of those (and we mean EXACTLY equals - case sensitive, no spaces, an ''exact'' match), run the command to set the variable {{code|Armor}} to the appropriate value. | ||
* If no match is found, do whatever follows the {{code|default}} option (in other words, set {{code|Armor}} to 0. | * If no match is found, do whatever follows the {{code|default}} option (in other words, set {{code|Armor}} to 0. | ||
* Stop looking for matches, and move on. | * Stop looking for matches, and move on. | ||
</div> | |||
* {{code|class}} 変数の値を調べる。このマクロを試しに動かしてみると、常に "Rogue" の値を表示してくるだろう。{{code|[h:class="Rogue"]}} の行を変更すれば、それが switch 文にどういう影響を与えるか、分かるはずだ。 | |||
* ここで代入したものを、他の4つの case と比較する。{{code|class}}の値が{{code|"Warrior"}}、{{code|"Rogue"}}、{{code|"Wizard"}}、{{code|"Priest"}}、のどれと等しいか調べる。 | |||
* {{code|class}} が上のどれかと同じ値であれば(ここでいう同じとは、「全く同じ」ということだ。大文字小文字やスペースの有無にいたるまで、全く同じでなければならない)、対応するコマンドを実行して、{{code|Armor}} に正しい値を与える。 | |||
* どれとも一致しなかった場合、{{code|default}} の後ろにあるとおりに実行する(ここでは、{{code|Armor}} に 0 をセットする)。 | |||
* そこで探すのを止めて、次の処理へと移動する。 | |||
===SWITCH と CODE を組み合わせる=== | |||
<div style="color:gray">The {{roll|code}} option can be used with a {{roll|switch}} option, in a similar manner as {{roll|if}}. There are a couple tricky bits, but if you follow the pattern given in the examples, it should work for you. </div> | |||
以前に {{roll|if}} でもできたように、{{roll|code}} は {{roll|switch}} とも組み合わせることができる。多少ややこしいが、例に挙がっているパターンにさえ従っていれば、うまく動いてくれる。 | |||
<div style="color:gray">To do a {{roll|switch}} option with {{roll|code}}, the general format is:</div> | |||
{{roll|code}} と {{roll|switch }} とを組み合わせる場合、基本的な文法は以下の通りだ: | |||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[switch(val),code: | [switch(val),code: | ||
case case_1: { commands_for_case_1}; | case case_1: { commands_for_case_1}; | ||
Line 454: | Line 605: | ||
case case_3: { commands_for_case_3}; | case case_3: { commands_for_case_3}; | ||
default: { commands_for_default}] | default: { commands_for_default}] | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | |||
<syntaxhighlight lang="mtmacro"> | |||
[switch(val),code: | |||
case 第1のケース: { 第1のケースのコマンド }; | |||
case 第2のケース: { 第3のケースのコマンド }; | |||
case 第3のケース: { 第3のケースのコマンド }; | |||
default: { デフォルトのコマンド}] | |||
</syntaxhighlight> | |||
</blockquote> | |||
<div style="color:gray">An actual example can be drawn from the [[Sample Ruleset]] as well. Not only does a character's class indicate his or her armor value, but also the list of "Beginning Powers" from which the character can draw. Suppose we wanted to set not only the armor value, but also a variable called {{code|beginningPowers}}. To do that, you'd write a SWITCH that looks like:</div> | |||
これは [[Sample Ruleset]] からそのまま引いてきたもう一つの実例だ。キャラクターのクラスが決めるのは装甲値だけでなく、そのキャラクターが選択できる「作成時パワー」のリストもそれで決まる。装甲値以外にも {{code|beginningPowers}} 変数も代入したいと仮定する。これを行うには、SWITCH 文を以下のように書けばいい: | |||
<div style="color:gray"> | |||
<blockquote> | <blockquote> | ||
< | <syntaxhighlight lang="mtmacro"> | ||
[h,switch(class),code: | [h,switch(class),code: | ||
case "Warrior": | case "Warrior": | ||
Line 489: | Line 654: | ||
Your Armor Value is [Armor] and your beginning powers are [beginningPowers]. | Your Armor Value is [Armor] and your beginning powers are [beginningPowers]. | ||
</ | </syntaxhighlight> | ||
</blockquote> | </blockquote> | ||
</div> | |||
<blockquote> | |||
<syntaxhighlight lang="mtmacro"> | |||
[h,switch(class),code: | |||
case "Warrior": | |||
{ | |||
[Armor = 6] | |||
[beginningPowers = "Sword, Shield Bash, Bow, Shield, Torch"] | |||
}; | |||
case "Rogue": | |||
{ | |||
[Armor = 2] | |||
[beginningPowers = "Dagger, Hide, Backstab, Pick Lock, Torch"] | |||
}; | |||
case "Wizard": | |||
{ | |||
[Armor = 1] | |||
[beginningPowers = "Dagger, Staff, Light, Lightning Bolt, Fire Ball"] | |||
}; | |||
case "Priest": | |||
{ | |||
[Armor = 4] | |||
[beginningPowers = "Mace, Heal, Protect, Banish Undead, Torch"] | |||
}; | |||
default: | |||
{ | |||
[Armor = 0] | |||
[beginningPowers = "Fists, Feet"] | |||
}] | |||
あなたの装甲値は [Armor] で、開始時パワーのリストは [beginningPowers] です。 | |||
</syntaxhighlight> | |||
</blockquote> | |||
<div style="color:gray">As you can see, each different case is treated as a single block of operations - so you need to put curly braces for each separate case, and separate them all with the semicolon. At the very end, we put a closing square bracket (''']'''), to finish the whole command. Again, what has happened is that the CODE option and the curly braces have allowed you to replace a single command, like {{code|command_for_case_1}}, with a ''group'' of commands.</div> | |||
お分かりのように、それぞれのケースが一つの処理として扱われている。だからそれぞれのケースは中カッコで囲み、セミコロンで区切っておかなければならない。そして一番最後を大カッコ(''']''')で閉じ、コマンド全体を区切る。ここでも、CODE オプションを使うことで、{{code|第1のケースのコマンド}} のコマンドを、コマンドの「グループ」で置き換えることができる。 | |||
<div style="color:gray">Also, you'll see that I've added in some line breaks so that each separate group of operations is easier to read - MapTool is cool with that, because extra line breaks ''inside'' a command (remember, commands are enclosed within '''[ ]''') are ignored. This is nice, because it makes the macros ''much'' easier to read.</div> | |||
なお、読みやすくするために、それぞれの処理グループごとに改行を入れているのが分かると思う。ここはMapToolのいいところで、一つのコマンドの''中''での改行を無視してくれる(一つのコマンドは、'''[''' と ''']''' で囲まれているという点に注意)。これはマクロを''大幅に''読みやすくできて、都合がいい。 | |||
==高度な分岐オプション== | |||
<div style="color:gray">The two options illustrated above are the most common branching options used in macro writing. However, they are not the ''only'' options for branching macros - there are two others, which involve either leaving one macro entirely to call on another, or changing the focus (that is, what token is the [[Current Token]]) of a macro temporarily. Since these are fairly complex operations all on their own, you'll find them in the [[More Branching Options]] guide.</div> | |||
ここで説明した二つのオプションは、マクロを書くときに最もよく使われる分岐方法だ。しかし、マクロで分岐を行う手段は''これだけではない''。他にも二つのオプションがあるが、その中には、あるマクロの中から完全に抜け出して別のマクロを呼び出したり、マクロのフォーカスを切り替える(つまり、マクロの[[Current Token]]が表すトークンを一時的に変える)ものが含まれている。こうした処理はそれ単体でもやや複雑なものなので、この先の[[More Branching Options]]ガイドで読むことにする。 | |||
{{Languages|Introduction to Macro Branching}} |
Latest revision as of 23:59, 15 March 2023
INTERMEDIATE
THIS IS AN INTERMEDIATE ARTICLE
はじめに
You missed!
if you miss. マクロを書いていると、何度も同じ処理を繰り返したり、マクロ・コマンドの結果に応じて複数の選択肢から一つを選んで実行したりしたくなることが良くある。ゲームを例に取るなら、(例えば手榴弾の爆発に複数の敵を巻き込んだときのように、)何度も続けてダメージ・ダイスを振りたいこともあるだろうし、また、もし攻撃が命中したらダメージ・ダイスを振り、外したらハズレ!
と表示してくれるようなマクロを作りたいと考えるかも知れない。
プログラム用語では、こういう概念を繰り返し(一つの処理を繰り返す)と分岐(プログラム―ここではマクロだが―が異なる複数の処理に枝分かれする)と呼ぶ。MapToolのマクロ言語にはダイスを振るための複数のオプション(や関数)があり、これであなたの命令を分岐・繰り返しさせることができる。
そして最後に、分岐や繰り返しを使って一度に複数の事をさばきたいと感じるのは良くあることなので、繰り返しや分岐の際に複数のマクロ・コマンドをまとめて一つの「単位」として扱えるcodeというオプションも用意されている。ちょっと分かりにくいかも知れないが、すぐに分かるようになる。
話さなければならないことが沢山あるので、このチュートリアルでは分岐(ある条件によって異なる命令を実行する)について説明することにする。繰り返し(ある処理を止めるまで繰り返す)についてはIntroduction to Macro Loopsで解説する。
想定する読者
これから急ぎ足でいろいろなオプションを使っていくことになる。そんなわけで、Introduction to Macro Writingを読み終え、新しいマクロの作り方を知っていて、その中に含まれていた(変数を作ったり、ダイス振りをしたりするなどの)基本的なコマンドが使えると想定することにする。
まず最初にいくつかの概念を理解してもらうが、これは分岐という概念を(そしてこの先Introduction to Macro Loopsで説明する繰り返しの概念を)理解するという大変な作業を行うために必要だからだ。その新しい概念について、これから説明していこう。
新しい概念: CODE オプション
MapToolでは、分岐や繰り返しの技法を使うと、一つのことしかできないのが普通だ。この一つのこととは、つまりコマンド1個ということだ。だから「もしある条件が満たされたなら、なにかイケてることをしろ」では、この「なにかイケてること」の部分には一つのことしか入れられない。ダイスを振るとか、変数を宣言するとか、チャット・ウィンドウになにかのテキストを表示するとか、だ。しかし、ダイスを振って、変数を宣言して、さらにもう一つ変数を宣言して、計算を行い、それからそのなにかを出力する、といった処理はできない。処理の数が多すぎるからだ。
分岐や繰り返しを使うと一つのことしかできないというのでは、マクロの可能性は限られたものになってしまう。そこで、マクロ言語は特殊なロールのオプションを用意している。これが[code():]だ。これは、複数の処理を行いたいが、それが「分岐」や「繰り返し」の一つとして行われるべきだということをMapToolに伝えるためのものだ。複数のコマンドを一組の中カッコ({})の中に書く。
以下の例では[code():]のオプションを使っている。その仕組みが分かってもらえるだろう。
新しい概念: 比較演算子と論理演算子
マクロを作成する場合、二つの数値を比べたいと考えることがよくある。ダイスの出目は20より大きいか? ヒットポイントは 0 より小さいか? その武器の名前は "Warhammer" と等しいか?
比較演算子とはプログラミングで用いる用語で、MapToolで二つの値を特定の基準で比べあうときに使う記号のことだ(演算子とは、ある演算を行うための記号だ)。例えば+記号は加算を表す。
論理演算子は、MapToolに対してどういう順番で比較を解釈したらよいか、それをどうまとめるかを教えるための記号だ。比較演算子と論理演算子については以下で説明する:
以下の例では、if() を使って説明している。これについては後でもう少し詳しく解説するが、基本的なif()の「文法」は以下の通りだ:
if(comparison, value_if_true, value_if_false)
if(比較, 真のときの値, 偽のときの値)
- Comparison is where you do your actual comparison (greater than, less than, etc.)
- Value_if_true is where you put the output or value if the comparison is true
- Value_if_false is, obviously, where you put the output or value if the comparison is false
- 比較は、実際に比較を行う部分(~より大きい、~より小さい、など)
- 真のときの値は、比較結果が正しいときに出す出力や取る値を書く部分
- 偽のときの値は、当然、比較結果が正しくないときに出す出力や取る値を書く部分
比較演算子
value1 > value2
, you read it based on the left side: "is value1
greater than value2
. This is the rule for comparisons in MapTool - the left side of the operator is the "point of view." 比較演算子を以下に挙げる。こうした比較は常に左辺値を起点として考えねばならない点に注意すること。だから、value1 > value2
という比較では、左辺値を基本として「value1
はvalue2
よりも大きい」と読むことになる。これはMapToolで比較を行う場合の規則だ。演算子の左辺値がかならず比較の「視点」となる。
- ==: "is equal to;" this is the operator you use to see if one value is equal to another. Be careful - it has two equals signs in a row (remember, one equal sign is already reserved for assigning values to variable). An example of this comparison would look like
[if(hit == "yes", "you hit!", "you missed!")]
- >: "is greater than; use this to see if the value on the left side is greater than the value on the right. For example:
[if(roll > 17, "Hit!", "Miss")]
. You can put a number on the left side, like[if(17 > roll, "Miss", "Hit!")]
(note that it basically reverses the first example, so you need to switch the true and false outputs). - >=: "is greater than or equal to"; use this to see if the value on the left side is greater than or equal to the value on the right. For example:
[if(roll >= 17, "Hit!", "Miss")]
- <: "is less than"; use this to see if the value on the left side is less than the value on the right. For example,
[if(roll < 19, "Miss", "Hit!")]
} - <=: "is less than or equal to"; use this to see if the value on the left side is less than or equal to the value on the right. For example:
[if(roll <= 18, "normal hit", "critical hit")]
- !=: "is not equal to"; use this to compare whether the value on the left side is not equal to the value on the right. Note that this operator doesn't care what the values actually are, only that they are not equal. For example,
[if(roll != 1, "Not a fumble", "You fumbled!")]
- ==: 「~と等しい」 これは両方の値が等しいことを確認するための演算子だ。間違いやすいので注意して欲しいが、等号は二つ並んでいる(等号一つは、左辺値が変数であることを表すときに使われることを思い出して欲しい)。比較の例はこのようになる。
[if(hit == "yes", "命中!", "外した!")]
- >: 「~より大きい」 これは左辺値が右辺値よりも大きいことを確認するために用いる。例えば、
[if(roll > 17, "Hit!", "Miss")]
という具合だ。左辺値は数値にすることもでき、その場合はこのようになる。[if(17 > roll, "外れ!", "命中!")]
(これは単に最初の例を逆にしただけだ。なので、結果が真のときと偽の時の処理を逆にする必要がある)。 - >=: 「~以上」 左辺値が右辺値以上になることを確認するためのもの。例えば、
[if(roll >= 17, "命中!", "外れ")]
という具合に。 - <: 「~未満」 左辺値が右辺値未満であることを確認するときに使われる。例えば、
[if(roll < 19, "外れ", "命中!")]
} のように。 - <=: 「~以下」 左辺値が右辺値以下であることを確認するときに使われる。例えば、
[if(roll <= 18, "通常命中", "クリティカルヒット")]
のように。 - !=: 「~と等しくない」 左辺値と右辺値が等しくないことを調べるために使うことができる。なお、この演算子はそれぞれの値が実際にどういう値かは考慮しない点に注意。単に等しくないことだけを調べている。例えば、
[if(roll != 1, "ファンブルでない", "ファンブルした!")]
のように。
論理演算子
以下に挙げる記号が論理演算子だ。これらの演算子は組み合わせて使うことができる(が、それが必要なのは一度に複数の比較を行いたい場合だけだろう)。こうした演算子は比較演算子の間で使われる(前述の比較演算子を置き換えるものではない)。
- &&: "and"; use this if you want to make sure that two or more comparisons are all true. For example:
[if(roll > 1 && roll < 20, "Hit", "Miss")]
requires both comparisons to be true, for the whole comparison group to be true. In other words, the roll must be greater than 1 and less than 20 in order for it to be a hit. If both of those aren't true, the output isMiss
.- Remember: if you use &&, every part of the comparison statement must be true for the whole comparison to be true!
- ||: "or"; use this if you want or need only one out of multiple comparisons to be true, in order for the whole thing to be true. For example,
. In the example, if either condition is true (that is, if
enemyHealth
is "dead" or "dying") the entire comparison group is true. Only if neither comparison is true does the whole thing become false.- Remember: use || if you only need one out of several comparisons to be true
- &&: 「かつ」 これは複数の比較が全て真になるかどうかを確かめるときに用いる。例えば、
[if(roll > 1 && roll < 20, "命中", "外れ")]
とした場合、二つの比較の両方とも真となり、比較群全体としても真となることが求められている。 言い換えると、命中するためには、ダイスの出目は1より大きくて、かつ、20未満でなければならないことになる。この両方が真にならない場合、出力結果は外れ
になる。- 注意: 全ての比較条件を && で結んだ場合、その全てが真にならないと、全体の結果も真にならない。
- ||: 「または」 は、複数の比較のうちどれかが真であれば、全体が真となる場合に使用する。例えば、
というように。この例では、どちらかの条件が真なら(つまり、
enemyHealth
が"死亡"または"瀕死"なら)、比較群全体が真になる。両方とも偽である場合にのみ、全体が偽となる。- 注意: 複数の条件のうち一つでも真になればよいときだけ、|| を使うこと。
IF: 値を比較する
あらゆるコードで使われる中でも最も基本的な分岐の方法はif - thenだ。つまり、if(もし)何らかの比較結果が真になる、then(なら)何か特別なことをする。このifは、「もし、私の攻撃が命中したら、ダメージ値を表示する!」というように使うことになるだろう。
MapToolのマクロ言語には二種類の if がある。―関数とロール・オプションだ。関数とは、あらかじめ定義されている一連の命令のことで、名前をつかってそれを「呼び出す」ことができる。ロール・オプションとは、MapToolに対してある命令の扱い方を教えるための「スイッチ」とか「トグル」のことだ。
if() 関数
if()
and putting the thing you want compared, what to do if the comparison is true, and what to do if the comparison is false, all inside the parentheses. The general format is:if() 関数は単にif()
と書いて、比較すべきものと、その結果が真になったときにすることと、偽になったときにすることを、全てカッコの中に入れるだけで使える。基本的な文法はこうなる:
if(comparison, value_if_true, value_if_false)
if(比較, 真のときの値, 偽の時の値)
そして実際の例はこんな風になる:
[if(attackHits == "yes", "You hit!", "You missed")]
[if(attackHits == "yes", "命中!", "外れ")]
この一行でやらせていることは以下のとおり:
- Check the variable
attackHits
to see if it has the value "yes" - If it has the value "yes", then print
You hit!
to chat, or - If it does not have the value "yes", then prin
You missed
to chat
- 変数
attackHits
の値が"yes"かどうかを確認 - 値が"yes"なら
命中!
、 - 値が"yes"でないなら
外れ
と、チャットに表示する。
if()関数の中の、真の時の値と偽の時の値の二つの部分はテキストでも、ダイスロール・コマンド(1d6とか1d20とか)でも、変数でも構わない。そこに入れてはいけないのは、変数の代入だ。つまり、if()をこういう風には書けないことになる:
[if(attackHits=="yes", output = "You Hit!", output = "You missed")]
[if(attackHits=="yes", output = "命中!", output = "外れ")]
一見よさそうに見えるが、これはうまくいかない。これをやると、MapToolは俗に「ヌルポインター例外」と呼ばれるものを出し、マクロはエラーを起こしてしまう。しかし、これをうまく回避するワザもある。if()は関数であり、すべての関数は実行すると値を返すのだから、その戻り値を変数に代入することができるんだ。こんな風に:
[output = if(attackHits=="yes", "You Hit!", "You missed")]
[output = if(attackHits=="yes", "命中!", "はずれ")]
このように書いておくと、MapToolはこんな風に動く:
- First, decide what the result of the if() is, and
- Second, assign that result to the variable
output
, which you can then use like any variable
- まず、if()の値を求め、それから
- 次に、その戻り値を変数
output
に代入し、それを他の変数と同じようにいろいろ使う
[if():] ロール・オプション
if()の他にも、「もし~ならば~」の概念をマクロ・コードで使う方法がもう一つある。それが[if():]のロール・オプションだ。ロール・オプションとは、前述したとおり、あらかじめ与えておいたマクロ・コマンドの扱い方をMapToolに「切り替え」あるいは「トグル」させるためのものだ。Introduction to Macro Writingにはそのいくつかが載っている。[h:]や[e:]などがそれだ。
ロール・オプションは以下の規則に従わねばならない:
- Appear at the beginning of a macro command
- If only one roll option is on the line, it ends with a colon. For example:
[h:]
- If multiple roll option are on the same command, they are separated by commas, and the last one is followed by a colon. For example,
[h,if(HP > 0): command]
- If a roll option takes an argument - that is, it has parentheses and wants you to put something in them, like a comparison - the colon (or comma, if there are multiple roll options) goes after the parentheses. Look at the examples below to see how it's used.
- マクロ・コマンドの先頭につける
- その行内に現れるロール・オプションが'一つだけなら、オプションはコロンで終わる。例:
[h:]
- 同じに現れるロール・オプションが複数あるなら、コンマで区切り、最後にコロンをつける。例:
[h,if(HP > 0): command]
- ロール・オプションが引数を持つ場合、つまり、比較をするときのように、そのオプションには小カッコがついていて、その中に何かを入れたい場合、コロン(複数のロール・オプションがある場合はコンマも)はその小カッコの後ろに来る。どうなるかは以下の例を見て欲しい。
[if():]オプションを比較に使う場合、以下の文法を使わなければならない:
[if(comparison): command_if_true; command_if_false]
[if(比較): 真のときのコマンド; 偽の時のコマンド]
- Comparison: this is a comparison statement, as used in the if() above.
- Command_if_true: this is the command to execute if true; in this form of IF, you can do variable assignments or commands that you cannot do in the if() method. However, it doesn't have to be a whole command - it can still be a bit of text.
- Command_if_false: this is the command to execute if false. This is an optional statement - if you want it to do nothing if the comparison is false, then leave off the semicolon and the
command_if_false
part entirely.
- 比較: これは比較文を表している。前述したif()で使われたのと同じだ。
- 真のときのコマンド: これは真の時に実行されるコマンドを表す。この形式のIFでは、コマンドだけでなく、if()では不可能だった変数への代入ができる。なお、この部分はコマンドでなくても構わない。テキストでもいいのだ。
- 偽のときのコマンド: これは偽の時に実行されるコマンドを表す。この部分はオプショナルであり、比較結果が偽のときにしたいことがなければ、セミコロンも、その後ろの
偽のときのコマンド
も書かなくていい。
[if():]ロール・オプションの例は以下の通りだ:
[h,if(attackHits == "yes"): output="You hit!"; output="You missed"] Result of your attack: [r:output]
[h,if(attackHits == "yes"): output="命中!"; output="外れ"] 攻撃結果: [r:output]
上の例では、以下のように処理されている:
- MapTool compares the value of
attackHits
to the value"yes"
- If the comparison is true - that is, the value of
attackHits
is indeed equal to"yes"
- it assigns the value"You hit!"
to the variableoutput
. - If the comparison is false - the value of
attackHits
is not equal to"yes"
- it assigns the value"You missed"
to the variableoutput
.
- If the comparison is true - that is, the value of
- It then prints a short line of text and the value of
output
to chat.
- MapToolは
attackHits
の値と"yes"
の値とを比較する- 比較結果が真になったら、つまり、
attackHits
が本当に"yes"
と等しいなら、変数output
に"命中!"
の値を代入する。 - 比較結果が偽になったら、つまり、{code|attackHits}}が
"yes"
と等しくないなら、変数output
に"外れ"
の値を代入する。
- 比較結果が真になったら、つまり、
- そして、短いテキストと
output
の値をチャットに表示する。
command_if_true
and command_if_false
sections.1行目で気づいた人もいるだろう。ここでは一つの行で、[h:] と [if():]の二つのロール・オプションを使っている。この二つのオプションはコンマで区切られていて、コロンは最後のロール・オプションの後ろ、真のときのコマンド
と偽の時のコマンド
のセクションの前にある。
IF と CODE
比較の結果としてやりたいことが複数あったらどうしたらいいだろうか? 例えば、複数の変数にそれぞれ値を代入するとか? それには[code():]ロール・オプションが使える。
他のロール・オプションと同じように、[code():]は行の先頭に置き、他のロール・オプションとはコンマで区切る。マクロプログラミング規約(要は、ほとんどのマクロがそうなってるって意味だ)では、[code():] をロール・オプションの一番最後につけることになっている。だから、マクロの中では一般にはこんな風になる:
[roll_option1, roll_option2, code: macro_commands]
[roll_option1, roll_option2, code: macro_commands]
[code():]オプションの二番目の要素は中カッコ({})だ。これを使って複数のコマンドを一つの群にまとめる。[if():]ロール・オプションの文法を覚えているかな?
[if(comparison): command_if_true; command_if_false]
[if(comparison): 真のときのコマンド; 偽のときのコマンド]
command_if_true
and command_if_false
with multiple macro commands. Let's look at an example: さて、[code():]オプションでは 真のときのコマンド
と 偽のときのコマンド
に複数のマクロ・コマンドを置くことができる。例を見てみよう:
attackRoll
. We want to compare it to a number (the target number), which is held by the variable targetNumber
. Here's what we want the macro to do:これからattackRoll
という変数の値を調べるマクロを書くとしよう。そしてこれをある値(目標値)と比較しようと考えている。この値はtargetNumber
という変数に格納されている。マクロにやらせたいのはこういうことだ:
attackRoll
is greater than or equal to targetNumber
, the macro should:
- Set
attackUsed
to "yes" - Set
attackResult
to "hits" - Set
attackRecharge
to 3 - Set
damageRoll
to the result of the dice roll 1d8+4. - Output a string telling the user the results.
もし attackRoll
が targetNumber
以上なら:
attackUsed
に "yes" をセットattackResult
に "命中" をセットattackRecharge
に 3 をセットdamageRoll
には 1d8+4 の結果をセット- ユーザーにその結果を知らせる文字列を表示する
attackRoll
is not greater than or equal to targetNumber
, the macro should:
- Set
attackUsed
to "Yes" - Set
attackResult
to "misses" - Set
attackRecharge
to 3 - Set
damageRoll
to "no" - Output a string to chat telling the user the results.
もし attackRoll
が targetNumber
未満なら:
attackUsed
に "yes" をセットattackResult
に "外れ" をセットattackRecharge
に 3 をセットdamageRoll
には "no" をセット- ユーザーにその結果を知らせる文字列を表示する
では、以下にそのマクロを載せる:
[h:attackRoll = 1d20] [h:targetNumber = 15] [h,if(attackRoll >= targetNumber), code: { [attackUsed = "yes"] [attackResult = "hits"] [attackRecharge = 3] [damageRoll = 1d8+4] }; { [attackUsed = "yes"] [attackResult = "misses"] [attackRecharge = 3] [damageRoll = "no"] }] Your attack [attackResult], and you do [damageRoll] damage. Your attack will recharge in [attackRecharge] rounds.
[h:attackRoll = 1d20] [h:targetNumber = 15] [h,if(attackRoll >= targetNumber), code: { [attackUsed = "yes"] [attackResult = "命中"] [attackRecharge = 3] [damageRoll = 1d8+4] }; { [attackUsed = "yes"] [attackResult = "外れ"] [attackRecharge = 3] [damageRoll = 0] }] あなたの攻撃は [attackResult] で、与えたダメージは [damageRoll] 点。 次の攻撃ができるまで [attackRecharge] ラウンドかかる。
ここではいろいろなことをしているが、注目して欲しいのは一番最初の行にある CODE オプションと、中カッコだ。中カッコの中には複数のコマンドが入っているが、MapToolに対してこれを「一つのものとして扱う」よう指示していることになる。従って、上の例はこのように動作する:
- We declare two variables,
attackRoll
andtargetNumber
, and give them initial values (in this case,attackRoll
will be the result of a 1d20 roll, andtargetNumber
is set to 15). - We set up the comparison (putting an h, in front - remember, that will hide the results from chat, so you don't see all the calculations in the if statement).
- We put [code():] in there to warn MapTool that each part of the [if():] roll option -
command_if_true
andcommand_if_false
- will actually consist of multiple separate commands. - We put a colon after the word
code
, to mark off the end of all the roll options. There is only ONE colon in the line! - We use a { to mark the start of the
command_if_true
portion of the IF statement. We then put in our commands, each one separately and enclosed in square brackets. Once finished, we close that section of the IF statement with a }, and put a semicolon on the end (remember, the IF roll option needs a semicolon to separatecommand_if_true
fromcommand_if_false
. - We do the same process for the
command_if_false
section - a { followed by a series of commands, and then closed with a }. - We make sure to close off the whole if statement with another square bracket ( ] ). Remember, an IF roll option is still just a macro command, and all macro commands must be enclosed in [ ].
- Finally, we write some text, with the several variables we have inserted at appropriate points, to be sent to chat when the macro runs.
- 二つの変数
attackRoll
とtargetNumber
を宣言し、初期値を与える(この場合、attackRoll
は 1d20 の結果、targetNumber
は15になるはずだ)。 - 比較条件を設定する(まず最初に h を置く。このオプションをつけるとその結果をチャットに表示しなくなる。従って、この if 文の計算結果は見えなくなる)。
- [if():]ロール・オプションの中の、
真のときのコマンド
と偽のときのコマンド
のそれぞれの部分に[code():]を置いて、この部分の中には複数のコマンドが入るのだということをMapToolにあらかじめ報せておく。 code
文の後ろにコロンを置き、ロール・オプションの終端であることを知らせる。この行にあるコロンはこれ一つだけ!- IF文の中の、
真のときのコマンド
の最初に { を置く。それからそれぞれ大カッコでくくったコマンドを並べていく。全部終わったら、このセクションを } で閉じ、最後にセミコロンをつける( IF ロール・オプションでは、真のときのコマンド
と偽のときのコマンド
を区切るのにセミコロンが必要だということを思い出して欲しい) - 上と同じ作業を
偽のときのコマンド
のセクションについても行う。 { の後に一連のコマンドを並べ、最後に } で閉じる。 - ここでこの if 文全体を大カッコ( ] )でくくっておくこと。 IF ロール・オプションもマクロ・コマンドの一つであり、全てのマクロ・コマンドは[ ]でくくられていなければならない。
- 最後に、それぞれの変数を適当な場所に埋め込んだテキストを書き、マクロが実行されたときにチャットに送り込まれるようにしておく
注意: CODE ロール・オプションは他のロール・オプションと組み合わせたときにだけ動作する。関数であるif() とは組み合わせられない。ちょっとややこしいかも知れないが、「 CODE は ロール・オプションと組み合わせてしか使えない」とだけ、覚えておいて欲しい。
SWITCH: 複数の選択肢の中から選ぶ
if()関数と[if():]ロール・オプションは両方とも二つある処理のどちらか一つを選ぶものだ。比較結果が真ならこちら、偽ならこちらという具合に。しかし人生というものは、そしてRPGもだが、常に白黒はっきりしたものではない。複数の選択肢の中から異なった動作を一つ選ぶ場合には、[switch():]ロール・オプションを使いたまえ。
一般的な文法は以下の通り:
[switch(val): case case_value1: command_1; case case_value2: command_2; case case_value3: command_3; default: command_Default]
[switch(val): case 第1の値: 第1のコマンド; case 第2の値: 第2のコマンド; case 第3の値: 第3のコマンド; default: デフォルトのコマンド]
MapToolはこういう風に動作する:
- MapTool is looking at the value of the variable
val
- MapTool then looks at each of the
case
statements in the switch, and comparesval
tocase_value1
,case_value2
, andcase_value3
- When MapTool finds a match - that is,
val
is equal to one of those cases, the appropriate command (eithercommand_1
,command_2
, orcommand_3
) is executed, and then MapTool exits the switch statement (which just means, once it's found a match, it does what that case says, and then stops checking for matches).
- 変数
val
の値を調べる - それから switch の中の
case
文を一つ一つ見ていって、val
を第1の値
、第2の値
、第3の値
と比較する - 一致する値が見つかったら、つまり
val
が case 文のどれかと等しくなったら、それに該当するコマンドを(第1のコマンド
、第2のコマンド
、第3のコマンド
のいずれかを)実行する。それが終わったら、switch 文を抜ける(要は、一致するものを探して、そこに書いてある通りのことをして、そこで探すのをやめる、ということだ)。
Armor
value to a token, based on the token's Class
. If you've been following along, you might recognize the Armor value as one of the attributes in the Sample Ruleset. If you visit the Sample Ruleset page, you'll see that a character can have one of several armor values, based on the character's class:例えば、あるトークンに対して、そのClass
に応じた正しいArmor
値を自動的に代入するマクロが欲しいと仮定してみる。ここまで読んできてくれたのなら、ここでいうArmor値はSample Rulesetにある属性値の一つだということが分かってもらえるだろう。Sample Rulesetのページを読めば、キャラクターが自分のクラスに応じていくつかの装甲値(armor value)のなかから一つを選べることが分かるはずだ:
- A Warrior has an armor value of 6
- A Rogue has an armor value of 2
- A Wizard has an armor value of 1
- A Priest has an armor value of 4
- A Warrior の装甲値は 6
- A Rogue の装甲値は 2
- A Wizard の装甲値は 1
- A Priest の装甲値は 4
class
, and then use that variable to assign the right Armor
value. Here's how we'd do it:そこで、マクロがそのトークンのclass
を質問してくるようにして、その後で正しいArmor
値を代入するようしよう。こういう風になる:
[h:class = "Rogue"] [h,switch(class): case "Warrior": Armor = 6; case "Rogue": Armor = 2; case "Wizard": Armor = 1; case "Priest": Armor = 4; default: Armor = 0] Your Armor Value is [Armor].
[h:class = "Rogue"] [h,switch(class): case "Warrior": Armor = 6; case "Rogue": Armor = 2; case "Wizard": Armor = 1; case "Priest": Armor = 4; default: Armor = 0] あなたの装甲値は [Armor] です。
この例で何をやっているかというと、こういうことだ:
- Look at the value for
class
- if you try this out, it will always show the value for "Rogue." If you alter the[h:class="Rogue"]
line, you can see how changing that value affects the switch statement). - Compare what you put in there with the four different cases - checking to see if
class
is equal to"Warrior"
,"Rogue"
,"Wizard"
, or"Priest"
. - If
class
equals any of those (and we mean EXACTLY equals - case sensitive, no spaces, an exact match), run the command to set the variableArmor
to the appropriate value. - If no match is found, do whatever follows the
default
option (in other words, setArmor
to 0. - Stop looking for matches, and move on.
class
変数の値を調べる。このマクロを試しに動かしてみると、常に "Rogue" の値を表示してくるだろう。[h:class="Rogue"]
の行を変更すれば、それが switch 文にどういう影響を与えるか、分かるはずだ。- ここで代入したものを、他の4つの case と比較する。
class
の値が"Warrior"
、"Rogue"
、"Wizard"
、"Priest"
、のどれと等しいか調べる。 class
が上のどれかと同じ値であれば(ここでいう同じとは、「全く同じ」ということだ。大文字小文字やスペースの有無にいたるまで、全く同じでなければならない)、対応するコマンドを実行して、Armor
に正しい値を与える。- どれとも一致しなかった場合、
default
の後ろにあるとおりに実行する(ここでは、Armor
に 0 をセットする)。 - そこで探すのを止めて、次の処理へと移動する。
SWITCH と CODE を組み合わせる
以前に [if():] でもできたように、[code():] は [switch():] とも組み合わせることができる。多少ややこしいが、例に挙がっているパターンにさえ従っていれば、うまく動いてくれる。
[code():] と [switch ():] とを組み合わせる場合、基本的な文法は以下の通りだ:
[switch(val),code: case case_1: { commands_for_case_1}; case case_2: { commands_for_case_2}; case case_3: { commands_for_case_3}; default: { commands_for_default}]
[switch(val),code: case 第1のケース: { 第1のケースのコマンド }; case 第2のケース: { 第3のケースのコマンド }; case 第3のケース: { 第3のケースのコマンド }; default: { デフォルトのコマンド}]
beginningPowers
. To do that, you'd write a SWITCH that looks like:これは Sample Ruleset からそのまま引いてきたもう一つの実例だ。キャラクターのクラスが決めるのは装甲値だけでなく、そのキャラクターが選択できる「作成時パワー」のリストもそれで決まる。装甲値以外にも beginningPowers
変数も代入したいと仮定する。これを行うには、SWITCH 文を以下のように書けばいい:
[h,switch(class),code: case "Warrior": { [Armor = 6] [beginningPowers = "Sword, Shield Bash, Bow, Shield, Torch"] }; case "Rogue": { [Armor = 2] [beginningPowers = "Dagger, Hide, Backstab, Pick Lock, Torch"] }; case "Wizard": { [Armor = 1] [beginningPowers = "Dagger, Staff, Light, Lightning Bolt, Fire Ball"] }; case "Priest": { [Armor = 4] [beginningPowers = "Mace, Heal, Protect, Banish Undead, Torch"] }; default: { [Armor = 0] [beginningPowers = "Fists, Feet"] }] Your Armor Value is [Armor] and your beginning powers are [beginningPowers].
[h,switch(class),code: case "Warrior": { [Armor = 6] [beginningPowers = "Sword, Shield Bash, Bow, Shield, Torch"] }; case "Rogue": { [Armor = 2] [beginningPowers = "Dagger, Hide, Backstab, Pick Lock, Torch"] }; case "Wizard": { [Armor = 1] [beginningPowers = "Dagger, Staff, Light, Lightning Bolt, Fire Ball"] }; case "Priest": { [Armor = 4] [beginningPowers = "Mace, Heal, Protect, Banish Undead, Torch"] }; default: { [Armor = 0] [beginningPowers = "Fists, Feet"] }] あなたの装甲値は [Armor] で、開始時パワーのリストは [beginningPowers] です。
command_for_case_1
, with a group of commands.お分かりのように、それぞれのケースが一つの処理として扱われている。だからそれぞれのケースは中カッコで囲み、セミコロンで区切っておかなければならない。そして一番最後を大カッコ(])で閉じ、コマンド全体を区切る。ここでも、CODE オプションを使うことで、第1のケースのコマンド
のコマンドを、コマンドの「グループ」で置き換えることができる。
なお、読みやすくするために、それぞれの処理グループごとに改行を入れているのが分かると思う。ここはMapToolのいいところで、一つのコマンドの中での改行を無視してくれる(一つのコマンドは、[ と ] で囲まれているという点に注意)。これはマクロを大幅に読みやすくできて、都合がいい。
高度な分岐オプション
ここで説明した二つのオプションは、マクロを書くときに最もよく使われる分岐方法だ。しかし、マクロで分岐を行う手段はこれだけではない。他にも二つのオプションがあるが、その中には、あるマクロの中から完全に抜け出して別のマクロを呼び出したり、マクロのフォーカスを切り替える(つまり、マクロのCurrent Tokenが表すトークンを一時的に変える)ものが含まれている。こうした処理はそれ単体でもやや複雑なものなので、この先のMore Branching Optionsガイドで読むことにする。