MorningScript 言語ガイド

目次

  1. MorningScriptとは
  2. はじめに
  3. 基本的な書き方
  4. 変数
  5. 四則演算
  6. 条件分岐(if文)
  7. ループ処理
  8. 乱数
  9. コメント
  10. よくある質問
  11. 実用的なサンプル集
  12. エラーメッセージ一覧

MorningScriptとは

MorningScriptは、テキストの中に埋め込んで使える超軽量なスクリプト言語です。[] で囲んだコマンドを使って、動的なテキスト生成、計算、条件分岐などを行うことができます。

特徴

ライトモーニングくん

利点

MorningScriptは「変数を操作する」「変数の状態によって処理を変化させる」ことを主な目的として開発された言語です。
この言語特性により、Webサービスに以下の振る舞いを安全に組み込むことができます。

具体的な活用イメージ

ツクセカ」における、MorningScriptを活用したマップの作り込み例(※近日中に実装予定)。

はじめに

最初のプログラム

こんにちは、モニスク!
今日は[rand 1 31]日です。

このプログラムを実行すると、以下のような出力になります。

こんにちは、モニスク!
今日は15日です。

[rand 1 31] の部分が1から31までのランダムな数値に置き換わります。

MorningScriptの基本ルール

  1. コマンドは [] で囲む
    [var:name 太郎]
  2. コマンドには2種類ある
    • 単独行コマンド: その行に単独で書く必要がある
    • インラインコマンド: テキストと混在できる
  3. 大文字・小文字は区別される
    • [var:Name][var:name] は別の変数

基本的な書き方

インラインコマンド(テキストと混在可能)

以下のコマンドは、通常のテキストと同じ行に書くことができます。

今日の運勢は[rand 1 100]点です!
私の名前は[var:name]です。

単独行コマンド

以下のコマンドは、必ず独立した行に書く必要があります。

[var:score 100]
[plus var:score 50]
[if var:score > 100]
  高得点です!
[endif]
間違った例:
得点は[var:score 100]点です。  ← エラー!
正しい例:
[var:score 100]
得点は[var:score]点です。

変数

変数の基本

変数は、値を保存しておくための「箱」のようなものです。

変数名のルール

変数の設定(単独行のみ)

[var:message こんにちは]
[var:score 100]
[var:player_name 太郎]

変数の取得(インライン可能)

メッセージ: [var:message]
現在のスコア: [var:score]点

変数の初期値

定義されていない変数を参照すると、空文字列(何も表示されない)になります。

[var:defined_var 存在する]
定義済み: [var:defined_var]
未定義: [var:undefined_var]
定義済み: 存在する
未定義:

変数のリセット

変数を空文字列に戻すことができます。

[var:temp 一時的な値]
設定後: [var:temp]
[reset var:temp]
リセット後: [var:temp](空)

変数に別の変数の値をコピー

[var:original 元の値]
[var:copy [var:original]]
オリジナル: [var:original]
コピー: [var:copy]

四則演算

MorningScriptでは整数の四則演算ができます。小数は使用できません。

基本的な演算(単独行のみ)

足し算

[var:score 100]
[plus var:score 50]
結果: [var:score]  ← 150

引き算

[var:hp 100]
[minus var:hp 30]
残りHP: [var:hp]  ← 70

掛け算

[var:price 500]
[multiply var:price 3]
合計: [var:price]円  ← 1500円

割り算(小数点以下切り捨て)

[var:total 100]
[divide var:total 3]
結果: [var:total]  ← 33

変数を使った演算

数値の代わりに変数を使うこともできます。

[var:damage 20]
[var:hp 100]
[minus var:hp var:damage]
残りHP: [var:hp]  ← 80

注意事項

条件分岐(if文)

条件によって表示する内容を変えることができます。

基本的な if 文(単独行のみ)

[var:age 20]
[if var:age >= 18]
  成人です
[endif]

if-else 文

[var:score 75]
[if var:score >= 80]
  合格です!
[else]
  もう少し頑張りましょう
[endif]

if-elseif-else 文

[var:grade 85]
[if var:grade >= 90]
  評価: S
[elseif var:grade >= 80]
  評価: A
[elseif var:grade >= 70]
  評価: B
[else]
  評価: C
[endif]

使える比較演算子

演算子 意味
= 等しい [if var:x = 10]
!= 等しくない [if var:x != 0]
> より大きい [if var:age > 18]
>= 以上 [if var:score >= 60]
< より小さい [if var:hp < 20]
<= 以下 [if var:count <= 100]

変数同士の比較

[var:player_score 100]
[var:enemy_score 80]
[if var:player_score > var:enemy_score]
  プレイヤーの勝利!
[else]
  敵の勝利...
[endif]

文字列の比較

数値以外の値も比較できます(等号・不等号のみ)。

[var:answer はい]
[if var:answer = はい]
  了解しました
[else]
  キャンセルしました
[endif]

ループ処理

同じ処理を繰り返し実行できます。

基本的なループ(単独行のみ)

[loop 5]
  こんにちは!
[endloop]
こんにちは!
こんにちは!
こんにちは!
こんにちは!
こんにちは!

カウンタを使ったループ

[var:i 0]
[loop 5]
  [plus var:i 1]
  [var:i]回目のループ
[endloop]
1回目のループ
2回目のループ
3回目のループ
4回目のループ
5回目のループ

変数でループ回数を指定

[var:times 3]
[loop var:times]
  繰り返し
[endloop]

ループの途中終了(break)

[var:i 0]
[loop 10]
  [plus var:i 1]
  数: [var:i]
  [if var:i = 5]
    ここで終了
    [break]
  [endif]
[endloop]
数: 1
数: 2
数: 3
数: 4
数: 5
ここで終了

ネストしたループ

ループの中にループを書くこともできます。

[var:total 0]
[loop 2]
  外側のループ
  [loop 3]
    [plus var:total 1]
    内側: [var:total]
  [endloop]
[endloop]

乱数

ランダムな数値を生成できます。

基本的な使い方(インライン可能)

サイコロ: [rand 1 6]
コイン: [rand 0 1]
パーセント: [rand 1 100]%

変数に乱数を保存

[var:dice [rand 1 6]]
サイコロの目: [var:dice]
もう一度: [var:dice]  ← 同じ値

負の数も使用可能

温度: [rand -10 35]度

注意事項

コメント

プログラムの説明を書くためのコメント機能があります。

行コメント

// で始まる行はコメントとして扱われ、実行されません。

// プレイヤーの初期設定
[var:hp 100]
[var:mp 50]

// 敵からのダメージ計算
[var:damage [rand 10 30]]
[minus var:hp var:damage]

コメントのルール

よくある質問

Q: if文をインラインで使えますか?

A: いいえ、if文は必ず単独の行に書く必要があります。

できません:
結果は[if var:x = 1]OK[else]NG[endif]です
代わりにこう書きます:
[if var:x = 1]
  結果はOKです
[else]
  結果はNGです
[endif]

Q: 小数を使った計算はできますか?

A: いいえ、MorningScriptは整数のみ対応しています。割り算の結果も切り捨てられます。

[var:x 10]
[divide var:x 3]
結果: [var:x]  ← 3(3.333...ではない)

Q: 変数名に日本語は使えますか?

A: いいえ、変数名は半角英数字とアンダースコアのみです。

[var:名前 太郎]  ← エラー!
[var:name 太郎]  ← OK

Q: 配列やリストは使えますか?

A: MorningScriptには配列機能はありません。必要な場合は番号付き変数を使います。

[var:item_1 剣]
[var:item_2 盾]
[var:item_3 薬]

Q: 関数は定義できますか?

A: MorningScriptには関数定義機能はありません。

Q: エラーが出たらどうすればいいですか?

A: エラーメッセージには行番号が含まれているので、その行を確認してください。

サンプル集

1. おみくじプログラム

// おみくじプログラム
[var:fortune [rand 1 5]]

今日の運勢は...

[if var:fortune = 1]
  大吉!今日もファンタスティックな1日になりそうだぜ。
[elseif var:fortune = 2]
  吉。ふふっ、なにか良いことがありそうだ。
[elseif var:fortune = 3]
  中吉。平穏な一日、悪くないね。
[elseif var:fortune = 4]
  小吉。小さな幸せを見つけに行こうか。
[else]
  凶...もうだめだ、おしまいだぁぁぁぁああああぁぁ!!!。
[endif]

ラッキーナンバー: [rand 1 9]

2. 成績判定システム

// テストの点数を設定
[var:math 85]
[var:english 72]
[var:science 90]

=== 成績表 ===
数学: [var:math]点
英語: [var:english]点
理科: [var:science]点

// 合計点を計算
[var:total 0]
[plus var:total var:math]
[plus var:total var:english]
[plus var:total var:science]
合計: [var:total]点

// 平均点を計算(小数点以下切り捨て)
[var:average var:total]
[divide var:average 3]
平均: [var:average]点

// 評価
[if var:average >= 90]
  評価: 秀
[elseif var:average >= 80]
  評価: 優
[elseif var:average >= 70]
  評価: 良
[elseif var:average >= 60]
  評価: 可
[else]
  評価: 不可
[endif]

3. パスワード生成器

// 簡単なパスワード生成
パスワード候補:

[loop 10]
  pw[rand 0 9][rand 0 9][rand 0 9][rand 0 9][rand 0 9][rand 0 9][rand 0 9][rand 0 9]
[endloop]

※実際のパスワードにはもっと複雑なものを使用してください

4. 九九の表

// 2の段
[var:base 2]
[var:i 0]

[var:base]の段:
[loop 9]
  [plus var:i 1]
  [var:result var:base]
  [multiply var:result var:i]
  [var:base] × [var:i] = [var:result]
[endloop]

エラーメッセージ一覧

よく見るエラーと対処法

「不明なコマンド」

原因: コマンドのスペルが間違っているか、存在しないコマンド

[vra:x 10]  ← × varのスペルミス
[var:x 10]  ← ○

「[コマンド名]は単独の行に記述する必要があります」

原因: 単独行コマンドをテキストと混在させた

名前は[var:name 太郎]です  ← ×
[var:name 太郎]             ← ○
名前は[var:name]です        ← ○

「変数が xxxx 定義されていません」

原因: 四則演算で未定義の変数を使用

[plus var:undefined 10]  ← × 未定義
[var:score 0]           ← ○ 先に定義
[plus var:score 10]     ← ○

「ゼロで除算することはできません」

原因: 0で割り算をした

[var:x 10]
[divide var:x 0]  ← ×

「ループの外でbreakは使用できません」

原因: loop~endloopの外でbreakを使用

[break]  ← × ループの外

[loop 5]
  [break]  ← ○ ループの中
[endloop]

Playgroundで試してみる →