ただのゲーム好きブログ

ただのゲーム好き。Switchやインディーゲームのレビューをつらつらと。

よくわからない人向けのMorningScriptの使い方(ツクセカやってみた)

ブラウザ上でお手軽に2Dマップの作成ができる「ツクセカ」
ジェネレーターがあったり、使用できるサンプル素材があったり、画像から背景が作成できたりなどサクっと作れるのが魅力の一つなのですが、よりこだわりたい人は「MorningScript(モーニングスクリプト)」というツクセカ独自のスクリプト言語を使用して、ギミックのあるマップ作りをすることができます。

ただ、「ぷろぐらみんぐ?すくりぷと?詳しいことは知らんがとにかくやってみるか」と思った自分には「そもそもの部分がよくわかんないんだけど…」という部分がいくつかあったので、似たような方向けにまとめておこうと思います。

以下、わからない人なりに超解釈したものなので、間違っている部分などがあったらすみません…!ほぼ自分用メモ。あくまでも参考程度にどうぞ。

 

そもそもの話

MorningScript(モニスク)の使い方や仕様については、公式の「MorningScript仕様」や「MorningScript 言語ガイド」に記載されているのでまずはそちらを見てほしいのですが、「そもそも」の部分をざっくりまとめると…

  • ツクセカ内ではMorningScriptを使って動作をカスタマイズする
    C言語などとは別っぽい。それはそれ、これはこれなので、ツクセカではモニスクを使用する。

  • 書き方は[var:]
    [var:neko cat]と書くと、マップ内で「nekoはcatである」が定義された、設定されたみたいなイメージっぽい。(伝われ)

  • [var:app_]で特定の動作が実行される
    app_で始まるものについては「MorningScript仕様」に色々掲載されている。
    メッセージを出したり、タイルを置いたり…など。
    「予約済み変数」っていうのは、運営さんの方で「[var:app_○○]っていうのは既に書き方とできることが決まってるからね」っていう意味っぽい。
 

そもそもの話2

  • マスの数え方は左上が0,0
    マップの数え方も左上がX座標0,Y座標0
    タイルパレットも左上から横に0,1,2…と数える。

  • サンプル以外のアバターやマップで使いたい素材は自分で用意する必要がある
    スプライトシートが必要。
    スプライトシートとは、ざっくり言えば使用したい画像がマス状にずらっと並んだPNG画像のこと。
 

個人的に予約済み変数(app_)でよく使うもの

青色部分は書き換えてください。は補足なので記述しないでください。

// 左上にメッセージボックスを出す
[var:app_message_info 表示させたいメッセージ]

// タイル(タイルパレットの素材)を置く
[var:app_map_layer_base1_set 15,2,3,4,5,6,7]
15番の素材を2,3と4,5と6,7に置くということ
base1の部分はbase1、base2、frontで指定のレイヤーにする

// タイル(タイルパレットの素材)を消す
[var:app_map_layer_front_clear 座標X,座標Y]
base1の部分はbase1、base2、frontで指定のレイヤーにする

 

ifの使い方

こうだった時はこうするという条件分岐が可能。

// if文
[if var:flg1 = 0] もし、フラグ1が0だったら
  [var:] こうする
[elseif var:flg1 = 1] そうじゃなくてフラグ1が1だったら
  [var:] これをする
[else] それ以外だったら
  [var:] こうする
[endif] ifおわり

基本的にはこんな感じだけど、実際作っていてとにかく訳がわからなかったif…。
そもそも、このifを実行するには先にフラグを立てなくてはならないのです。(それはそう)

 

じゃあ、フラグってどうやって立てるの?というと、
[var:flg1 1] フラグ1が1の状態です
で、フラグが立てられる。
これをアクションマスに触れたときとか、モブに接触したときなどに入れておけばいい。

色々試した結果、フラグを立てる際にはflg1を絶対使わなければならない訳ではなく、またON・OFFも絶対に0か1で書かなければならないというものでもない。

どういうことかというと、
[var:flg1 1] フラグ1が1の状態です
[var:flg1 on] フラグ1がonの状態です
[var:neko 1] nekoが1の状態です
[var:tori piyo] toriがpiyoの状態です
この書き方でもフラグが立つ(起動のための条件が立つ)のである。
ただ、訳がわからなくなるのでわかりやすいものにしておく方がいい。

ちなみに、0と1で書くことが多いが、わかりにくいならon/offの書き方でもOKである。そう、ツクセカならこういう書き方でもOKなのである。

 

こういうのがやってみたいんだけど…の例

【例1:魚を持っていると持っていないとで、猫の反応を変えたい】

まず、魚に触れると魚をゲットしたことにしたい。
そして、魚のありなしで猫の反応を変えたい。…をやりたい場合は、

①魚をゲットする(魚ありのフラグを立てる)
アクション管理から魚が置いてあるマスを選択し、スクリプトを入力する。

[var:app_toast_short 魚を手に入れた!] 短い表示が出る
[var:flg1 1] 魚を手に入れた状態をflg1 1として、フラグを立てる

②魚のありなしで猫のセリフを変える
モブ管理でキャラを選んでスクリプトを入力する。

[if var:flg1 = 1] フラグ1が立っているとき
 にゃーん! これを表示する
[else] それ以外のときは
 …………。    これを表示する
[endif] おわり

ちなみに、①のこの記述だと魚が無限沸きする状態になってしまっているので、それを阻止したい場合は、魚を消したり、ifを使って魚を持っている場合と持っていない場合の動作を分ける必要がある。

[if var:flg1 != 1] フラグ1が立っていない場合(!=だと○○じゃないときになる)
 [var:app_toast_short 魚を手に入れた!] 短い表示が出る
 [var:flg1 1] 魚を手に入れた状態をflg1 1として、フラグを立てる
 [var:app_map_layer_bade2_clear X,Y] ベースレイヤーのX,Y座標からタイルを消す
[endif] おわり

で繰り返さないはず。

 

【例2:持っているくだものを左上に全部表示しておきたい】

キャラAに話しかけたらりんごを、キャラBに話しかけたらみかんをもらうことにする。
持っているものを左上にずらっと表示する。

①キャラAからりんごをもらって表示する

 // りんごをもらったメッセージを出す
[var:app_toast_short りんごを手に入れた]

// もちものを表示する(縦並びの場合)
 [var:item1 りんご] アイテム1をりんごと定義
 [var:disp_message もちもの] 
  [concat var:disp_message [br]] [br]を追加します=改行される
  [concat var:disp_message var:item1] item1(りんご)の文字を追加
  [concat var:disp_message [br]] [br]を追加します=改行される
  [concat var:disp_message var:item2] item2(みかん)の文字を追加
[var:app_message_info var:disp_message] 左上にもちもの(とconcatで追加したもの)を表示

②キャラBからみかんをもらって表示する

 // みかんをもらったメッセージを出す
[var:app_toast_short みかんを手に入れた]

// もちものを表示する(縦並びの場合)
 [var:item2 みかん]
 [var:disp_message もちもの]
  [concat var:disp_message [br]]
  [concat var:disp_message var:item1]
  [concat var:disp_message [br]]
  [concat var:disp_message var:item2]
[var:app_message_info var:disp_message]

りんごと同じなので補足なし。

これでりんごもみかんも持っているときは左上に、
もちもの
りんご
みかん
と、表示されるわけですが、何がどうなっているのかを紐解いてみると…

最終的にやりたいのはこの [var:app_message_info var:disp_message] 。
つまり、var:disp_message」を左上に表示します です。
じゃあ、実際に記述を見てみると…

[var:item2 みかん] でitem2をみかんと定義した上で、
 [var:disp_message もちもの] でdisp_messageって何?「もちもの」です。
  [concat var:disp_message [br]] 
  [concat var:disp_message var:item1]
  [concat var:disp_message [br]]
  [concat var:disp_message var:item2] これらを「もちもの」の次に追加します。
[var:app_message_info var:disp_message]

最後に[var:app_message_info var:disp_message]を書くことで、先に設定された定義を踏まえて「じゃあvar:disp_message表示するね」と実行されているわけです。
var:disp_messageの中身は、濃い紫と薄紫で書いた内容全部です。

ちなみに、ここまで書いておいて申し訳ないのですが、この縦並び表示の場合はみかんを持っていてりんごを持っていないときは、
もちもの

みかん
と、空白ができてしまいます。
横並び表示であれば詰めて表示されるため、違和感がありません。
何かもっといい方法があるのかなー…。

 

おまけ

実際に作ってみた「花でいっぱいにするマップ」ですが、

これで使った
[if var:switch_state = 1]
 [var:app_map_layer_base2_set 赤花タイル,X,Y]
[elseif var:switch_state = 2]
 [var:app_map_layer_base2_set 青花タイル,X,Y]
以下略
[else]
[endif]
ですが、この時はよく考えずに「赤ニワトリに話しかけたらスイッチ1番」。
「スイッチが1番になってるときは赤い花をベース2レイヤーに設置」…という形にしていたんですが、後からふと気になりました。

フラグは複数並べて立てることができますが、これはスイッチ〇番という形で上書きされているのか、それともスイッチ1番、スイッチ2番として同時にフラグとして立っているのかどっちなんだ、と。

以下、余計な話だなと思うので畳んでおきます。

クリックで詳細表示

【検証】

アクションマス1、2、3、4を用意し、それぞれに
[var:switch_state 1]
[var:switch_state 2]
[var:switch_state 3]
[var:switch1_state 1]
と入力しておきます。

判定用に別のアクションマスを用意し、
[if var:switch_state = 1]
スイッチ1番
[elseif var:switch_state = 2]
スイッチ2番
[elseif var:switch1_state = 1]
スイッチ1の1
[elseif var:switch_state = 3]
スイッチ3番
[endif]
と入力しておきます。
あとは、それぞれいろんなパターンで踏んで、判定でどう出るかを確認します。

 

【結果】

よく考えたら試すまでもなく、フラグ管理だって[var:frg1 1]と[var:frg1 0]でフラグのON/OFFができるのだから、
[var:switch_state 1]
[var:switch_state 2]
[var:switch_state 3]
[var:switch1_state 1]
では、上三つが同一のもの(最後に押したものが反映)、一番下が別物でした。

また、ifは一番上から優先的に実行されるので、
・スイッチ1→スイッチ2の場合、スイッチ2番の状態=2番判定
・スイッチ1→スイッチ1の1の場合、スイッチ1とスイッチ1の1状態だけど、1番の方が優先=1番判定
・スイッチ1→スイッチ2→スイッチ3→スイッチ1の1の場合は、スイッチ3とスイッチ1の1状態だけど、3より1の1の方が優先=1の1判定
という感じでした。

(以上で折り畳み部分は終了です!)

 

上手く説明できていない気もしますが、少しは伝わったでしょうか…?
また何か試したら、その都度まとめたいと思います。