新時代のソーサリアンを提案する

30周年を越えたソーサリアンの夢と妄想を語り続ける

ソーサリアンText 開発者向けマニュアル(SGMLリファレンス)

SGML(Sorcerian Gamebook Markup Language)仕様

ソーサリアンTextのシナリオデータは、SGMLと呼ばれるXMLベースのマークアップ言語で記述します。以下は、SGMLで利用できる要素/属性の一覧です。それぞれの詳しい用法は、サンプルシナリオも合わせて参照してください。

  • <scenario> ルート要素(シナリオ全体を括る)
    • @title シナリオタイトル
    • @author 作者名
    • @xmlns:xsi、@xsi:noNamespaceSchemaLocation システム情報*1
    • <items> アイテム情報全体を括る
      • <item> 個々のアイテム(複数列挙可)
        • @id アイテムコード
        • @name アイテムの名前
        • text アイテムの説明(15文字程度)
    • <flags> フラグ情報全体を括る
      • <frag> 個々のフラグ情報(複数列挙可)
        • @id フラグコード(接頭辞「f」。シナリオ内で一意であること)
        • text フラグの表示名(15文字程度)。先頭が「*」で始まる場合には、ステータス画面で表示されない隠しフラグとなる
    • <enemies> 敵情報全体を括る
      • <enemy> 敵/罠の情報
        • @id 敵コード(接頭辞「m」。シナリオ内で一意であること)
        • @name 敵/罠の名前(10文字程度)
        • @element 属性(敵のみ。地~霊)
        • @attack 攻撃の種類(物理/魔法/毒/石化/凍結/呪い/忘却)
        • @func ダメージ式(例:2L+R-STR。Lは左のサイコロ、Rは右のサイコロ)。 @attackが状態異常の時は回避条件(例:DEX>5、WIZARDなど*2)。カンマ区切りで複数指定も可(その場合はランダムに式を選択)
        • text モンスターの説明(50文字程度)
    • <results> 実績情報全体を括る
      • <result> 個々の実績情報(複数列挙可)
        • @id 実績コード(接頭辞「r」。シナリオ内で一意であること)
        • @name 実績名(ex. ガジガジネズミ)
        • @level 難易度(1~5)
        • text 実績の成立条件(ex. 隧道でネズミに食い殺された)
    • <licence> ライセンス情報
      • <work> 作品情報(複数列挙可)
        • @name 曲名(bgmの場合)、利用場所(pictureの場合。街、酒場など)
        • @category 分類(bgm:音楽、picture:画像)
        • @creator 作者 or サイト名
        • @url 参照先
    • <scene> シーン情報(複数列挙可)
      • @id シーン番号(リンク時にも利用する番号なので一意で。スタートは0固定、プロローグであること)
      • @items そのシーン移動時に入手できるアイテム(複数はカンマ区切り。「-i~」でアイテム喪失)
      • @flags  そのシーン移動時に立つフラグ(複数はカンマ区切り)
      • @enemies 敵情報(複数はカンマ区切り*3
      • @result そのシーン移動時に取得できる実績
      • @bgm シーン移動時にBGMを切替(bgm_boss.mp3であれば、「boss」と指定。メインテーマbgm.mp3に戻す場合は、「」(空文字列)と指定。[戻る]ボタンで戻った時のために、切り替え前のページでも切り替え前のBGMを明示しておくこと
      • @se シーン移動時に再生する効果音(se.mp3であれば、「se」と指定)
      • @allowMove 番号指定による移動を許可するか(値はtrue固定)2018/05削除
      • @end エンディングシーンか(happy:ハッピーエンド、bad:バッドエンド)
      • text シナリオ本文(Markdown形式。以下詳細)

シナリオデータのテンプレート(骨組み)は、/stext/common/template/scenario.xmlとして用意しています。/templateフォルダーごとコピーしてご利用ください。

@idについて
  • すべて半角英数字
  • アイテムコード/フラグコード/敵コードはシナリオ内で一意であること
  • アイテムコードは「i~」、フラグコードは「f~」、敵コードは「m~」、実績コードは「r~」で始まること
  • シナリオコードはシステム全体で一意であること(基本、Upload時に決定)

フォルダー構造

シナリオファイルは、以下のようなフォルダー構造で配置してください。

  • /シナリオコード シナリオルート
    • scenario.xml シナリオデータ
    • bgm.mp3 メインBGM(存在する場合のみ再生)
    • bgm_happy.mp3 ハッピーエンドBGM(存在する場合のみ再生)
    • bgm_bad.mp3 バッドエンドBGM(存在する場合のみ再生)
    • bgm_*.mp3 その他BGM(bgm属性で指定された場合に再生)
    • xxxxx.mp3 効果音(各シーンで再生する効果音)
    • /capture 挿絵
      • xxxxx.png 任意の名前(シーンについてひとつまでを推奨)

ローカル環境で、開発したシナリオを実行する場合には、このフォルダーを/stextフォルダーに配置します(現在はサンプルとして/scepterフォルダーをはじめ、いくつかのシナリオフォルダーが置いてあります)。

■Note■
シナリオを新規に投稿する場合は、トップフォルダーを圧縮して.zipファイルとしてお送りください。投稿方法については、STextサイト(http://www.web-deli.com/sorcerian/next/stext.aspx)を参照してください。

注意事項
  • ファイル名に「_」などの記号は利用できない
    • 原則として、ファイル名はアルファベット小文字+数字で統一してください
  • 挿絵の枚数は制限しない
    • 1シーンに複数のイラストがあっても構わないし、複数シーンで同一のイラストを共有しても構わない
    • ただし、読みやすさの観点から、1シーン複数イラストは避けることを推奨
  • カンマ区切りのコード前後には空白は入れない
    • 問題なく動くものもありますが、現時点ではサポートしていません。
  • システムコードはシステム全体で一意であること
    • 公開時に採番するので、開発時は「test」で固定
    • ローカル環境でシナリオの動作を確認する場合には、トップフォルダーの名前が「test」であることを確認した上で、/stextフォルダー直下にコピーしてください。あとは、トップページの選択ボックスから[テストシナリオ]を選択することで、シナリオを起動できます。

http://www.web-deli.com/sorcerian/next/images_blog/stext_d_test.png

Markdown形式

ブログなどに利用される簡易なテキストフォーマットです。
画像や表組み、リンク、箇条書きリストなどが可能です。
詳しくは、以下のようなページを参考にしてください。

http://kojika17.com/2013/01/starting-markdown.html
#ただし、一部の機能が非対応の可能性もあるので、ご了承くださいm(_ _)m

SGML固有のルール(リンクボタン)

SGMLでは、以下のように移動ボタンを表します。

[ボタンキャプション](リンク先番号)

[冒険に出発する](1)

フラグ/アイテムなどの有無によって移動ボタンの表示/非表示を制御できます。

(1)フラグがある/ない場合のみ表示

[ボタンキャプション](リンク先番号 "フラグコード")
[ボタンキャプション](リンク先番号 "-フラグコード")

[フラグ確認用1](12 "f1")
[フラグなし確認用1](12 "-f1")

(2)アイテムがある/ない場合のみ表示

[ボタンキャプション](リンク先番号 "アイテムコード")
[ボタンキャプション](リンク先番号 "-アイテムコード")

[アイテム確認用1](12 "i1")
[アイテムなし確認用1](12 "-i1")

(3)魔法を利用できる/できない場合のみ表示

[ボタンキャプション](リンク先番号 "m魔法名")
[ボタンキャプション](リンク先番号 "-m魔法名")

[魔法確認用(HEAL)](12 "mHEAL")
[魔法なし確認用(HEAL)](12 "-mHEAL")

(4)ステータスが指定値を上回っている/下回っている場合のみ表示

[ボタンキャプション](リンク先番号 "-o[ステータス種別][値][+/-]")

[STRが5より大きい場合のみ表示](12 "oSTR5+")
[HPが50未満の場合のみ表示](12 "oHP50-")

ステータス種別にはSTR、INT、DEX、KRM、HP、MP、FreeI、FreeIIを指定可能

(5)キャラの基本情報が合致している/していない場合のみ表示

[ボタンキャプション](リンク先番号 "x情報")
[ボタンキャプション](リンク先番号 "-x情報")

[種族がFIGHTER](41 "xFIGHTER")
[種族がFIGHTERでない](41 "-xFIGHTER")
[性別がMALE](41 "xMALE")
[年齢がOLD](41 "xOLD")
[状態異常がFROZEN](41 "xFROZEN")

情報には、以下のものを指定可能

  • 種族(FIGHTER/WIZARD/DWARF/ELF)
  • 性別(MALE/FEMALE)
  • 年齢帯(YOUNG/ADULT/OLD)
  • 状態異常(POINSON/FROZEN/STONE/CURSE/FORGET)
(6)実績がある/ない場合のみ表示

[ボタンキャプション](リンク先番号 "実績コード:シナリオコード")
[ボタンキャプション](リンク先番号 "-実績コード:シナリオコード")

[実績確認用(r01:scepter)](12 "r01:scepter")
[実績なし確認用(r15:tempest)](12 "-r15:tempest")

(7)指定された条件をすべて満たしている場合のみ表示(カンマ区切り)

利用できる条件は以下の通り(異種混在も可)

  • フラグ/アイテムを所有している
  • 魔法を利用できる
  • 実績を保持している
  • ステータス条件を満たしている
  • 基本情報が合致している

[ボタンキャプション](リンク先番号 "フラグ/アイテムコード/m魔法/o条件...")

[マルチフラグ確認用1](12 "f1,f2,f3")
[マルチアイテム確認用1](12 "i1,i2")
[マルチ魔法確認用1](12 "mHEAL,mCURE")
[マルチステータス確認用1](12 "oSTR5+,oHP50-")
[マルチ実績確認用1](51 "r01:scepter,r02:tempest")
[混合例確認用1](51 "r01:scepter,mHEAL")

(8)指定された条件のいずれかを満たしていない場合のみ表示

利用できる条件は(6)に準ずる(異種混在も可)

[ボタンキャプション](リンク先番号 "-フラグ/アイテムコード/m魔法/o条件,...")

[マルチフラグなし確認用1](12 "-f1,f2,f3")
[マルチアイテムなし確認用1](12 "-i1,f2,i3")
[マルチ魔法なし確認用1](12 "-mHEAL,mCURE")
[マルチステータスなし確認用1](12 "-oSTR5+,oHP50-")
[マルチ実績なし確認用1](51 "-r01:scepter,r02:tempest")
[混合例確認用1](51 "-r01:scepter,oSTR5+")

(9)シーン番号を入力しての移動を可能にする場合

以下のように、リンク先をX、キャプションに移動可能なシーン番号をカンマ区切りで列挙したリンクを用意します(任意移動リンクはシーンにひとつしか設置できません)。

[10,11,12](X)

(10)入力文字列を判定して正否によって分岐

以下のように、リンク先をQ、キャプションを「正答,正しい時の移動先,間違った場合の移動先」としたリンクを用意します(文字列入力リンクはシーンにひとつしか設置できません)。

[グーラン,11,12](Q)

上の例では、「グーラン」と入力した場合には11へ、さもなければ12へ移動します。

(11)ランダムな移動を可能にする場合

以下のようにリンク先番号をカンマ区切りで列挙することもできます。この場合、リンク先はその時どきにランダムで決まります。

[ランダムリンク](1,2,3)

SGML固有のルール(テキスト加工)

SGMLでは、Markdownを拡張して、カラーリングや式の埋め込みにも対応しています。

式埋め込み

${...}の形式で、テキストの任意の箇所に式の埋め込みが可能です。
利用可能な式は、以下の通りです。

  • ${title} … 称号
  • ${name} … キャラクターの名前
  • ${race?人間:魔法使い:ドワーフ:エルフ} … 種族に応じて単語を置き換え
  • ${sex?男:女} … 性別に応じて単語を置き換え
  • ${state?正常:毒:凍結:石化:忘却} … 状態異常に応じて単語を置き換え
  • ${age?若者:中年:老人} … 年齢帯に応じて単語を置き換え
  • ${rand?1:20} … 指定の値範囲で乱数を生成
  • ${msg?こんにちは:おはよう:こんばんは} … 指定のメッセージをランダムに選択

「?」以降は、「:」区切りで表示すべき任意の単語を指定できます。

テキストのカラーリング

%blue%~%/%でテキストを囲むことで、任意のテキストにカラーリングも可能です。

みんな、%blue%ソーサリアン%/%だ!

ただし、現時点では以下の制約があります。

  • 現在利用できるカラーは、blue、red、purpleのみです。
  • カラーリングしたテキストの前後には、半角スペースが入ります。

セーブデータ

セーブデータは以下の2種類。
いずれもJSON形式でWeb Storageに保存され、次回起動時に復帰できます。

  • シナリオを跨いだ「グローバルセーブデータ」
  • シナリオ単位に設置される「ローカルセーブデータ」
グローバルセーブデータ
  • 初回のシナリオ生成時に生成され、複数のシナリオ間で共有される
  • キーは固定で「sorcerian_text」

以下はセーブデータの構造。

  • items シナリオ終了時に得られるアイテム(シナリオ共通で累積される)
  • results 実績情報(「シナリオid: 実績リスト」の形式)
  • panel コントロールパネルは表示状態か
  • bgm BGMを再生するか
ローカルセーブデータ
  • 個々のシナリオ開始時に生成され、シナリオ固有の情報を管理する
  • シナリオ開始時にキャラは自動生成(「ソーサリアンになったったー」のイメージ)
    • 基本ステータスは種族/性別で決定(別表の基準値をもとにランダム決定)
  • キーは「シナリオコード」

以下はセーブデータの構造。

  • chara キャラ情報
    • title 称号
    • name 名前
    • race 種族
    • sex 性別
    • age 年齢帯(YOUNG/ADULT/OLD)
    • state 状態異常
    • hp_m HP上限
    • hp HP現在値
    • mp_m MP上限
    • mp MP現在値
    • str_i 強さ初期値(0~10)
    • str 強さ現在値(0~10)
    • int_i 賢さ初期値(0~10)
    • int 賢さ現在値(0~10)
    • dex_i 器用さ初期値(0~10)
    • dex 器用さ現在値(0~10)
    • krm_i 魅力初期値(0~10)
    • krm 魅力現在値(0~10)
    • free1 自由ステータス
    • free2 自由ステータス
  • stars 所持している七惑星の欠片(月~太陽の個数を配列で)
  • items 所持しているアイテム(配列)
  • flags 所持しているフラグ(配列)
  • memos 冒険メモ(自由入力欄)
  • scene 現在のシーン
  • ellapsed_scene 経過したシーン数
  • bgm 現在再生中のBGM(空文字列はメインテーマ)
  • bonus 現在のシナリオで適用されるボーナス
  • isEnded エンディングに到達しているか

*1:テンプレートの設定をそのまま利用してください。編集時の補助設定なので、実行時にはなくても問題ありません

*2:WIZARDは魔法使いの時に回避

*3:STextの内部的な理由で、敵情報は移動ボタンが存在しないシーンでは表示されません。一般的に移動ボタンのないシーンはないはずですが、デバッグ時などは注意してください。