Wiki

Clone wiki

CardWirthPy Reboot / Variant

コモンと式


目次


「コモン」とは?

コモンとは、フラグ・ステップに次ぐ新しい状態変数です。Wsn.4で追加されました。

コモンの値は、数値・文字列・真偽値のどれかです。

  • 数値とは、もちろん42だとか1.28とかいった数です。これはステップの値に似ています。10段階のステップの値は09ですが、コモンでは1000000とか31536000とかいった大きな数も扱うことができます。
  • 文字列とは、いわゆるテキスト、名前や文章のことです。
  • 真偽値とは、真(TRUE)か偽(FALSE)の2つの値しか表せないものです。これはフラグの値に似ています。「あり・なし」や「オン・オフ」など、二種類の状態しか持たないものがこの世には多くありますが、それらは真偽値で表現することができます。

コモンを使う

CWXEditorの状態変数ビューで右クリックすると、メニューから「コモンの作成」を選択できます。

数値・文字列値・真偽値のどれかを選んで、値を指定しましょう。

作成したコモンの値は、メッセージやテキストセルに表示することができます。$ステップ名$とすればステップの値を表示できますが、コモンの場合は@コモン名@で同じことを行えます。

メッセージ〔 一年の秒数 = @秒@ 〕


コモンは、フラグやステップのように、イベントの中で値の変更を行ったり、分岐条件に使用したりすることができます。

しかし、コモンは様々な値を持てるので、操作のパターンが大量にあります。

これがフラグなら、可能な操作は「TRUE・FALSEを切り替える」「TRUEかFALSEかを判定する」とその派生程度ですし、ステップでも「増やす」「減らす」「比較する」くらいです。

コモンは、それだけでは済みません。増やす、減らす、比較する、数値計算する、文字列を連結する、一部を取り出す、論理演算を行う、値をフラグやステップに渡す……と、ありとあらゆることが行えてしまいます。

これだけバリエーションがあると、操作ごとにイベントコンテントを用意することは、とてもできません。

そのため、というものが用意されています。


「式」を記述する

コモンと式に関係するイベントコンテントは3つあります。

  • コモン分岐コンテント …… の結果の真偽値によって、分岐を行います。
  • コモン設定コンテント …… の結果をコモン(またはフラグやステップ)に代入します。
  • コモン判定コンテント …… フラグ判定コンテントのように、の結果の真偽値によって後続のイベントの有無を切り替えます。

このどれを使おうとしてもが出てきます。式とはどんなものなのでしょうか?

まずは、コモン分岐コンテントを作成してみましょう。

目につくのは式の記述欄です。ここには文章形式で式を記述することができます。

式といえば計算式です。試しに1 + 2と入力してみましょう。

警告が出ているようです。確認してみます。

警告: 式の結果は数値ですが、コモン分岐コンテントでは真偽値でなければなりません。

コモン分岐コンテントは、フラグ分岐のようにTRUEFALSEの値によって分岐を行います。ですから、1 + 2の結果、つまり数値の3では判定が行なえません。そのせいで、この警告が出ています。

これが1 + 2 < 42のような式、つまり1 + 2の結果が42よりも小さいか、という式であれば、結果は真偽値になります。342より小さいので、結果は真(TRUE)になるわけです。

その逆の式1 + 2 > 42で結果が偽(FALSE)になることは、言うまでもありません。

今回は数値を直に書いたので、式の結果は何度計算し直しても同じです。

しかし、式からは、コモンの値を参照することができます。そうなると、結果は状況によって変わってきます。

@"コモン名"と書く事で、式にコモンの値を組み込めます。

式〔 42 < @"コモンA" 〕

この式では、「コモンA」という名前のコモンの値が42より大きければ、結果がTRUEになります。コモンAの値が0だったらFALSE側へ分岐しますし、100だったらTRUE側へ分岐するわけです。

コモンを参照する文字列@"コモン名"は、エディタのコモン挿入ボタンを使って簡単に入力することもできます。

このようにして式を記述することで、「コモン設定コンテントを使って式の結果をコモン・フラグ(真偽値)・ステップ(数値)へ代入する」「コモン分岐コンテントを使って式の結果の真偽値で分岐する」「コモン判定コンテントを使って式の結果の真偽値によってイベントの流れを変える」といった操作を行うことができます。

値の書き方

式の中に数値を書きたい時は、上の例のように直接書くことができます。

文字列の場合は、少し書き方を変える必要があります。数値の「123」と文字列の「123」は違うものなので、区別をつけるために別の書き方をしなければなりません。具体的には、"文字列"のようにします。

式〔 "文字列" ~ "連結" 〕

"を文字列の中で使いたい場合は、""のように2つ続けて書くと、1つの"に変換されます。

真偽値の場合は、TRUEFALSEを直接書くことができます。

式〔 1 + 2 < 42 = TRUE 〕


演算子

式〔 1 + 2 < 42 = TRUE 〕

「演算子」とは、式の中にある+<といった記号のことです。この演算子によって、どんな計算を行うかが決まります。

演算子には、1 + 2のように左右の値に対する計算を行うものや、not TRUEのように右側の値を変換するものがあります。

演算子には以下のものがあります。

基本的な演算子

  • A + B …… 足し算(加算)。左右の値を足し合わせる。1 + 2の結果は3になります。
  • A - B …… 引き算(減算)。左の値から右の値を引く。42 - 1の結果は41になります。
  • A * B …… 掛け算(乗算)。左右の値を掛ける。9 * 9の結果は81になります。
  • A / B …… 割り算(除算)。左の値を右の値で割る。3 / 2の結果は1.5になります。
  • A % B …… 割り算(剰余)。左の値を右の値で割った時の余りを求める。10 % 4の結果は2になります。
  • A ~ B …… 連結。左右の文字列を連結する。もし左右の値が文字列でなければ、文字列に変換してから連結する。"Step - " ~ 99の結果は"Step - 99"になります。

比較演算子

  • A = B …… 一致。左右の値が同じであれば、結果はTRUEになる。そうでなければFALSEになる。
  • A <> B …… 不一致。=の逆。左右の値が同じでなければ、結果はTRUEになる。=<>は、文字列同士の比較にも使えます。
  • A <= B …… 以下。Aの値がB以下であれば、結果はTRUE。逆にBより大きければFALSE
  • A >= B …… 以上。Aの値がB以上であれば、結果はTRUE。Bより小さければFALSE
  • A < B …… 未満。Aの値がBより小さければ、結果はTRUE。B以上であればFALSE
  • A > B …… 超過。Aの値がBより大きければ、結果はTRUE。B以下であればFALSE

論理演算子

  • A and B …… 論理積。AとBが両方ともTRUEの時だけ結果がTRUEになる。片方でもFALSEであれば、結果はFALSEです。
  • A or B …… 論理和。AとBのどちらか1つでもTRUEであれば結果はTRUEになる。両方FALSEの時に限り、結果はFALSEです。

論理演算子を使うと、2つの式が同時に成り立った時だけTRUEになるとか、片方だけ成り立つ時にTRUEになるとかいった式を簡単に記述することができます。

たとえば、(1 < 2) and (3 < 4)は、1 < 23 < 4の結果が両方ともTRUEなので、結果もTRUEになります。

単項演算子

  • not A …… 真偽値反転(否定)。Aの値がTRUEであれば結果はFALSEに、FALSEであればTRUEになる。
  • - A …… 符号反転。数値のプラス・マイナスを反転する。-42と書くと、結果はマイナス42になります。--42は、マイナス42がさらに反転してプラス42になります。
  • + A …… -との対称性を保つためにある演算子で、特になにもしません。

演算の優先順位

式は、常に左から順に計算されるとは限りません。一般的なルールとして、足し算・引き算と掛け算・割り算とで優先順位があることをご存じの方は多いと思います。

4 + 3 × 2 = 10

この計算式では、〔 4 + 3 〕よりも〔 3 × 2 〕のほうが優先して計算されるので、結果は4に6を足して10、となります。

今回紹介した各種の演算子にも優先順位があり、たとえば比較演算子は他のほとんどの演算子よりも優先順位が低くなっているため、

@"コモンA" + 42 < @"コモンB" * 2

というような式を書くと、"コモンA" + 42@"コモンB" * 2を先に計算し、それらの結果を<で比較する、という順で計算が行われます。

演算子の優先順位は、高いほうから順に以下の通りです。

  1. 単項演算子の-+
  2. * / %
  3. ~
  4. + -
  5. = <> <= >= < >
  6. and
  7. or
  8. not

同じ優先順位であれば、左から順に計算されます。

優先順位を変えたい場合は、先に計算したいほうの式を( )で囲います。

(4 + 3) * 2 = 14

関数を使用する

式では数値計算や文字列の連結といった様々な操作が行なえますが、限界もあります。たとえば「文字列の長さを測る」とか「文字列を数値に変換する」とかいった操作を行う演算子はありません。

そうした特別な操作を行うために、関数が用意されています。

試しに、文字列の長さがどれくらいかを関数を使って調べてみましょう。

式〔 LEN("いろはにほへと") = 7 〕

文字列"いろはにほへと"は7文字あるので、この式の結果はTRUEになります。なにが起きてそういう結果が出たのでしょうか。

数学用語として馴染みがある方もいるかもしれませんが、「関数」とは、いくつかの「引数」を受け取って、引数を元に計算を行い、計算結果として「戻り値」を返す、という処理をまとめたものです。

関数に引数を渡して結果を受け取ろうとすることを、「関数を呼び出す」というふうにいうこともあります。

関数呼び出しの書式は、以下のようになります。

関数名(引数1, 引数2, 引数3, ...)

引数がいくつあるかは、関数によって変わります。LEN関数の引数は、1つの文字列です。そして、戻り値として文字列の長さを返します。

つまりLEN("")の戻り値は0になりますし、LEN("ABCDEF")の長さは6になります。

これにより、LEN("いろはにほへと") = 7の結果は、

  1. LEN("いろはにほへと")の結果は7
  2. LENの結果の7を右側の7と比較したので、結果はTRUE

となるわけです。

関数は、手動で式内に記述することもできますが、「関数の挿入」を押して「関数エディタ」を開き、説明を見ながら書き込むこともできます。

引数のところには、式を書いて、式の結果を引数として関数へ渡すことができます。

式〔 MAX(1 + 2, 3 + 4, LEN("12345678"), 5) = 8 〕

フラグやステップの値も、関数を経由して参照することが可能です。

式〔 STEPTEXT("ステップA", 9) = "Step - 9" 〕


関数の一覧

Wsn.4では、以下の関数を使用することができます。

文字列操作

  • LEN(文字列) → 数値 …… 文字列の長さ(文字数)を返します。LEN("対象文字列")の結果は5です。
  • FIND(検索文字列, 対象文字列[, 検索開始位置]) → 数値 …… 対象文字列内に検索文字列があった場合は位置(1~)を返します。見つからなかった場合は0を返します。検索開始位置は省略可能ですが、2以降の値を指定した場合は、2文字目以降から検索を開始することができます。FIND("文字", "対象文字列")の結果は3です。
  • LEFT(文字列, 長さ(文字数)) → 文字列 …… 文字列の左側を返します。LEFT("対象文字列", 2)の結果は、左側2文字の"対象"です。
  • RIGHT(文字列, 長さ(文字数)) → 文字列 …… 文字列の右側を返します。RIGHT("対象文字列", 3)の結果は、右側3文字の"文字列"です。
  • MID(文字列, 位置(1~)[, 長さ(文字数)]) → 文字列 …… 文字列の中間部分を返します。MID("対象文字列", 3, 2)の結果は、3文字目から2文字で、"文字"になります。長さを省略した場合は、指定位置より右側を返します。MID("対象文字列", 3)の結果は"文字列"です。

数値操作

  • DICE(個数, 面数) → 数値 …… 任意面数のダイスを振って結果の値を返します。DICE(2, 6)の結果は、2個の6面ダイスを振った結果、すなわち212のどれかになります。
  • MAX(数値 1 ...) → 数値 …… 引数の中で最大の数値を返します。引数はいくつでも指定することができます。MAX(1, 23, 4, 5)の結果は23です。
  • MIN(数値 1 ...) → 数値 …… 引数の中で最小の数値を返します。引数はいくつでも指定することができます。MIN(12, 3, 4, 5)の結果は3です。

型変換

  • STR(任意の値) → 文字列 …… 任意の値を文字列に変換します。STR(999.9)の結果は"999.9"STR(TRUE)の結果は"TRUE"です。
  • VALUE(文字列または数値) → 数値 …… 文字列を数値に変換します。数値を引数にした場合は、そのまま返します。VALUE("999.9")の結果は数値の999.9です。
  • INT(文字列または数値) → 数値 …… 文字列または数値を整数に変換します。小数点以下の値は切り捨てられます。INT("999.9")の結果は、.9部分が切り捨てられて数値の999になります。

状態変数

  • VAR(コモン名) → 任意の値 …… コモンの値を返します。@"コモン名"の別の書き方です。VAR("コモンA")@"コモンA"は同じ結果になります。
  • FLAGVALUE(フラグ名) → 真偽値 …… フラグの値(真偽値)を返します。FLAGVALUE("フラグA")の結果は、フラグAの値がTRUEであればTRUE、FALSEであればFALSEになります。
  • FLAGTEXT(フラグ名[, フラグ値]) → 文字列 …… フラグの値のテキストを返します。2つめの引数を省略した場合は、フラグの現在値のテキストを返します。このテキストはメッセージ等で%フラグ名%として参照した時の表示内容と同じになります。
  • STEPVALUE(ステップ名) → 数値 …… ステップの値(数値)を返します。STEPVALUE("ステップA")の結果は、ステップAの値が0であれば0、5であれば5になります。
  • STEPTEXT(ステップ名[, ステップ値]) → 文字列 …… ステップの値のテキストを返します。2つめの引数を省略した場合は、ステップの現在値のテキストを返します。このテキストはメッセージ等で$ステップ名$として参照した時の表示内容と同じになります。
  • STEPMAX(ステップ名) → 数値 …… ステップの最大値を返します。STEPMAX("ステップA")の結果は、ステップAが10段階のステップ(値=0~9)であれば9になります。

カード情報

  • SELECTED() → 数値 …… 選択メンバの番号を1以上の数値で返します。選択メンバがいない場合は0を返します。引数はありません。
  • CASTTYPE(キャラクター番号) → 数値 …… キャラクターのタイプを返します(1=プレイヤー, 2=エネミー, 3=同行キャスト)。該当者がいない場合は0を返します。CASTTYPE(SELECTED())の結果は、選択メンバがプレイヤーキャラクターの時は1、エネミーカードの時は2、同行キャストの時は3になります。
  • CASTNAME(キャラクター番号) → 文字列 …… キャラクターの名前を返します。該当者がいない場合は空文字列を返します。CASTNAME(SELECTED())の結果は、選択中のメンバの名前になります。

称号情報

  • FINDCOUPON(キャラクター番号, 検索文字列[, 検索開始位置]) → 数値 …… キャラクターの所持するクーポンを検索し、クーポン番号を返します。見つからなかった場合は0を返します。
  • COUPONTEXT(キャラクター番号, クーポン番号) → 文字列 …… キャラクターの所持するクーポンの名前を返します。見つからなかった場合は空文字列を返します。
  • FINDGOSSIP(検索文字列[, 検索開始位置]) → 数値 …… ゴシップを検索し、ゴシップ番号を返します。見つからなかった場合は0を返します。
  • GOSSIPTEXT(ゴシップ番号) → 文字列 …… ゴシップの名前を返します。見つからなかった場合は空文字列を返します。

検索の特殊文字

FINDCOUPONFINDGOSSIPの検索文字列には特殊文字が使用できます。

  • * …… 任意の文字列にマッチする。つまりFINDCOUPON(SELECTED(), "母:*")という式で、選択中のメンバが持っている「母:<任意の名前>」というクーポンを見つけ出すことができます。
  • ? …… 任意の1文字にマッチする。つまりFINDGOSSIP("?ブリン退治")という式で、「ゴブリン退治」「バブリン退治」「ダブリン退治」といったゴシップを見つけ出すことができます。
  • [<任意の文字> ...] …… []の間にある文字のどれかにマッチする。"[ABC]"ABCのどれかにマッチします。
  • [!<任意の文字 ...] …… [!]の間にある文字のどれでもない文字にマッチする。[!ABC]ABCにはマッチしませんが、DEFといったその他の文字にはマッチします。

特殊文字を普通の文字のように検索したい場合は、[[]のように[]で囲います。

その他

  • IF(真偽値, TRUEの結果, FALSEの結果) → 任意の値 …… 最初の引数がTRUEであれば2つめの引数を、FALSEであれば3つめの引数を返します。IF(@"コモンA" = 42, "The Answer", -1)の結果は、コモンAの値が42であれば文字列"The Answer"42でなければ数値-1です。
  • PARTYNAME() → 文字列 …… 操作中のパーティ名を返します。引数はありません。

使用例

CWXスクリプトによるコモンの使用例です。コピーしてCWXEditorのイベントツリービューに貼り付けることができます。

1年間(365日)の秒数を計算して表示する

start "秒数計算(1日)"
    setvar "秒", '60 * 60 * 24 * 365'
    msg none, "1年の秒数 = @秒@", 1, true, true, true, false

※「秒」という名前のコモンを用意する必要があります。

6面ダイス2個を転がし、10以上が出たら「クリティカル!」と表示する

start "2D6判定"
    brvar '10 <= DICE(2, 6)'
    if true
        msg none, "クリティカル!", 1, true, true, true, false

選択中のメンバの親の名前を取得して表示する

start "親の名前を取得"
    selmember true, manual
    sif true
    setvar "親名", 'COUPONTEXT(SELECTED(), FINDCOUPON(SELECTED(), "[父母]:*"))'
    brvar '@"親名" = ""'
    if true
        msg none, "#Mの親の名前は不明です。", 1, true, true, true, false
    elif false
        setvar "親名", 'MID(@"親名", 3)'
        msg none, "#Mの親の名前は@親名@です。", 1, true, true, true, false
    fi

※「親名」という名前のコモンを用意する必要があります。

その場にいるキャラクターの名前を全て列挙する

start "キャスト名列挙"
    setvar "番号", '0'
    gostart "キャスト名列挙 (2)"

start "キャスト名列挙 (2)"
    setvar "番号", '@"番号" + 1'
    brvar 'CASTTYPE(@"番号") <> 0'
    sif true
    setvar "名称", 'CASTNAME(@"番号")'
    msg none, "@番号@: @名称@", 1, true, true, true, false
    gostart "キャスト名列挙 (2)"

選択中のメンバの称号を全て列挙する

start "クーポン列挙"
    setvar "番号", '0'
    gostart "クーポン列挙 (2)"

start "クーポン列挙 (2)"
    setvar "番号", 'FINDCOUPON(SELECTED(), "*", @"番号" + 1)'
    brvar '@"番号" <> 0'
    if true
        setvar "名称", 'COUPONTEXT(SELECTED(), @"番号")'
        msg none, "@番号@: @名称@", 1, true, true, true, false
        if "続ける"
            gostart "クーポン列挙 (2)"
        elif "中止"
            msg none, "", 1, true, true, true, false
        fi
    elif false
        msg none, "以上", 1, true, true, true, false
    fi

※「番号」及び「名称」という名前のコモンを用意する必要があります。

Updated