ソーサリアンText 開発者向けマニュアル(シナリオ開発リファレンス)
- 開発者マニュアル目次(http://d.hatena.ne.jp/sorcerian/20171221)
本ドキュメントの内容は、PgFlow/Editorのヘルプに統合されました。2021/07以降の更新は反映されていませんので、今後はPgFlow/Editorのヘルプを優先して参照してください。
以下は、ソーサリアン Text対応のシナリオデータ(データフォーマット、フォルダー構造、セーブデータ)の仕様をまとめたものです。
SGMLの基本構造
scenario.xmlは、SGML(Sorcerian Gamebook Markup Language)と呼ばれるXMLベースのマークアップ言語で記述します(文字コードはUTF-8)。
以下は、SGMLで利用できる要素の一覧です。<scenario>
、<scene>
要素を除くすべての要素は省略可能です。「*
」の付いた要素については属性を持つものです。SGMLリファレンスを参照してください。
<scenario>* ………… ルート要素 ├──<init> ……… 初期化情報 │ ├──<basic>* …………… シナリオ共通の挙動 │ ├──<constraint>* ……… シナリオ起動時に生成される種族/性別/年齢 │ ├──<bgm>* ……………… シナリオに適用するbgm │ ├──<label>* …………… FREE1~3欄に適用されるラベル │ └──<intro>* …………… シナリオの紹介情報 ├──<groups> …… グループ情報 │ └──<group>* ……………… 個々のグループ(複数列挙可) ├──<items> …… アイテム情報 │ └──<item>* ……………… 個々のアイテム(複数列挙可) ├──<flags> …… フラグ情報 │ └──<flag>* ……………… 個々のフラグ情報(複数列挙可) ├──<params> …… 独自パラメーター情報 │ └──<param>* ……………… 個々のパラメーター情報(複数列挙可) ├──<enemies> … 敵情報 │ └──<enemy>* …………… 敵/罠の情報 ├──<results> … 実績情報全体を括る │ └──<result>* …………… 個々の実績情報(複数列挙可) ├──<licence> … ライセンス情報 │ └──<work>* ……………… 作品情報(複数列挙可) └──<scene>* …………………… シーン情報(複数列挙可)
シナリオデータのテンプレート(骨組み)は、Playground(https://www.web-deli.com/sorcerian/next/playground.aspx)に用意しています。ご利用ください。
SGMLリファレンス
SGMLで利用できる要素と属性の仕様をまとめています(属性のない要素については、配下の要素を束ねるだけのものなので、説明を割愛しています)。
α版は開発中を意味します(動作も保証しない、あくまで将来的な機能の予告です)。β版は仮実装を意味します(動作はしますが、将来的に仕様変更の可能性があります)
<scenario>
要素
シナリオデータのルート要素です。
title属性
シナリオのタイトルを表します。
プレイ画面の右肩に表示されるので、文字数は10~15文字程度が推奨です。
作者名を表します。
投稿時には、ここで指定された名前を掲載します。
xmlns:xsi、xsi:noNamespaceSchemaLocation属性
システム情報なので、テンプレートの設定をそのまま利用してください。
編集時の補助設定なので、実行時にはなくても問題ありません。
<basic>
要素
シナリオ全般に関わる基本挙動を表します。
summary属性
true(値は固定)を設定することで、パラグラフ番号レスモードを有効にします。
具体的には、以下のように表示が変化します。
- scene要素のsummary属性をシーン冒頭に表示
- シーン冒頭に表示されているシーン番号が非表示
imgset属性
キャラの表示画像を変更する場合に、本属性を指定します。 設定値は「custom」で固定です。
■Note■ 将来的には「@~」のような形式で、 システム標準の画像セットを指定できるようにする、かもしれません。
本属性を指定した場合には、シナリオルートの配下に/charaフォルダーを作成し、以下の形式で画像を保存してください。
性別_年齢_種族.png
(たとえばmale_adult_fighter.png)
画像のルールは以下の通りです。
- サイズは100x100px
- constraint要素で除外した以外の全画像を用意すること(一部だけは不可)
<constraint>
要素
シナリオ起動時に生成される種族/性別/年齢を制限したい場合に指定します。
すべてを許容する場合は指定しません。
race属性
生成する種族を表します。
以下の値をカンマ区切りで列記してください。
- FIGHTER
- WIZARD
- DWARF
- ELF
sex属性
生成する性別を表します。
以下の値のいずれかを指定してください。複数は列記できません(双方許容する場合は指定しません)。
- MALE
- FEMALE
age属性
生成する年齢を表します。
以下の値をカンマ区切りで列記してください。
- YOUNG
- ADULT
- OLD
<bgm>
要素
シナリオで利用するメイン/エンディング曲を指定します。
以下は、属性値を指定する際の基本ルールです。
- 拡張子「.mp3」を除いたベース名で指定します(例えば、battle01.mp3ではなく、battle01)。
- 頭に「@」付きでシステム標準のBGMを意味します。
- 利用できる.mp3ファイルの名前については、STextページよりUtility 01を確認してください(たとえば@field01、@castle01など)。
- 特別な標準.mp3として無音を表す「@none」も利用できます。
- 標準BGMについては、シナリオフォルダーに.mp3ファイルを格納する必要はありません。
- 頭に「@」のないファイル名は、シナリオフォルダー配下の/bgmフォルダーを見に行きます。対応する.mp3ファイルを準備してください。
■注意■
旧仕様では、シナリオフォルダーの配下に、bgm_happy.mp3、bgm_bad.mp3、bgm_boss.mp3のような名前で格納していましたが、今後は/bgmフォルダー配下にhappy.mp3、bad.mp3、boss.mp3となります。できるだけ短い名前で表すのが望ましいでしょう。
main属性
メインテーマを表します(既定はmainです)
happy属性
ハッピーエンドの曲を表します(既定はhappy)
bad属性
バッドエンドの曲を表します(既定はbad)
<label>
要素
ステータスダイアログで表示されるラベル文字列を表します。
hp/mp/state/str/int/dex/krm属性
対応する項目のラベルに表示すべき文字列を表します。 既定では、それぞれHP、MP、STATE、STR、INT、DEX、KRMです。
表示の都合上、5文字以内を推奨します。また、見た目を考慮するならば、HP~MP、STR~KRMはセットで設定することをお勧めします。
free1/free2/free3属性
対応する項目のラベルに表示すべき文字列を表します。 既定では、それぞれFREE1、FREE2、FREE3です。
表示の都合上、5文字程度を推奨します。また、一部しか利用していない場合には、見た目を考慮して、未使用の項目には「-」などのダミー値を設定することをお勧めします。
本要素を指定した場合、BattleSheet下部の簡易ステータス表示にもFree1~3が追加されます。
<intro>
要素
ゲーム画面のメタ情報、Tweetボタンの紹介文などで利用される情報を定義します。
keywords属性
ゲーム画面でのメタ情報に埋め込まれるキーワードです。
カンマ区切りで1~3単語程度を目安に指定してください。
description属性
ゲーム画面でのメタ情報、Twitterカード、また、[Tweet]ボタンに反映される紹介文を表します(既定ではSText共通のメッセージが適用されます)。
シーン上で、${tweet}~${/tweet}
を指定した場合には上書きされます。
<group>
要素
シーンを束ねるためのグループ定義(シーンの範囲)を表します。グループは、シーンidの範囲で定義するので、関連するシーンは極力、特定のid範囲の中にまとめる(=なるべく順番に記述する)ことを強くお勧めします。
グループの情報はPlayground Flowでチャートの表示範囲を絞り込むために利用できます。
start属性
グループに入れるべきシーンのid値(開始)を表します。
end属性
グループに入れるべきシーンのid値(終了)を表します。
title属性
グループの表示名を表します。 識別しやすいよう、10文字前後のわかりやすい名前を付けてください。
<item>
要素
個々のアイテム定義を表します。
id属性
アイテムコードです(シナリオ内部で一意でなければなりません)。
接頭辞「i」+「番号」で表します。
name属性
アイテムの名前を表します。
target属性
アイテムの作用するパラメーターを表します。本属性を指定した場合、アイテムは「使用可能である」と見なされ、アイテム&フラグシートから[USE]ボタンで使用できます。
- hp
- mp
- state
- str
- int
- dex
- krm
- free1
- free2
- free3
- none(なにもしない)
none値では自動計算はせずに、アイテムをそのまま消費します(具体的な指示はシナリオ側で記述すべきです)。
effect属性
アイテムの効果を表します。target属性に応じた影響値(5、1..5、fullなど)を指定してください。
利用可能な設定値は、scene要素の対応する属性を参照してください(たとえばhpであれば、scene要素のhp属性で指定できる値だけが指定できます)。
target="none"の場合、effect属性の値は不要です(無視されます)。
アイテムを次のシナリオに引き継ぐかどうかを表します(値はtrue固定)。
※scene要素のnexts属性が指定された場合のみ有効
#text
アイテムの説明を表します(15文字程度を推奨)。 アイテム&フラグ画面、また、「使用可能なアイテム」では使用時にトースト表示のテキストにもなります(よって、使用時の結果を意識したテキストであるべきです)。
<flag>
要素
個々のフラグ定義を表します。
id属性
フラグコードです(シナリオ内部で一意でなければなりません)。
接頭辞「f」+「番号」で表します。
#text
フラグの表示名を表します。
シナリオの分岐スイッチとしてだけでなく、ステータス画面にあらすじとして表示する用途でも利用します。分岐の不要な箇所でも、物語の要所要所で設定しておくことをお勧めします(文字数は15文字程度を推奨)。
テキスト先頭が「*
」で始まる場合には、ステータス画面に表示されない隠しフラグとなります。あとで<scene>
要素のflags属性で削除できるのも、隠しフラグだけです。
<param>
要素
個々の固有パラメーターを表します。
固有パラメーターは、任意の個数だけ定義できるFree1~3のようなものです。各種サイドバーには表示されないので、内部的な値の管理に利用できます(ただし、${var?~}で本文に表示したり、分岐の条件式などで利用可能)。
数値での利用をメインに想定していますが、文字列の格納も可能です。
id属性
パラメーターコードです(シナリオ内部で一意でなければなりません)。
接頭辞「p」+「番号」で表します。
ただし、p90~99は予約番号です。現在、予約されているのは以下のものだけですが、将来的にシステムが特定の用途で利用する可能性があるので、シナリオ開発者が自分で採番してはいけません。
- p99:[戻る]機能の戻り先Scene番号を格納
min属性
パラメーター値の下限を表します(数値でのみ)。 任意ですが、指定時はmax属性とセットで利用してください。
max属性
パラメーター値の上限を表します(数値でのみ)。 任意ですが、指定時はmin属性とセットで利用してください。
initial属性
パラメーター値の初期値を表します(必須)。
#text
パラメーターの説明を表します(15文字程度を推奨)。 ${var?~}式で出力できるので、表示を意識した内容にすべきです。
<enemy>
要素
個々の敵/罠定義を表します。
id属性
敵コードです(シナリオ内部で一意でなければなりません)。
接頭辞「m」+「番号」で表します。
name属性
敵/罠の名前を表します(10文字程度を推奨します)。
element属性
敵/罠の属性を表します。
以下のいずれかを指定してください(無指定の場合は無属性と見なされます)。
- earth(地)
- fire(火)
- water(水)
- wind(風)
- spirit(霊)
attack属性
攻撃の種類を表し、どのステータスにダメージを反映するかを決定します(free1~3の意味は、シナリオによって異なります)。
以下のいずれかを指定してください。 いずれの値でもない場合は、(アイコン表示ではなく)文字列がそのまま表示されます。
- physics(物理)
- magic(魔法)
- both(物理/魔法双方)
- free1(FREE1)
- free2(FREE2)
- free3(FREE3)
- poison(毒)
- frozen(凍結)
- stone(石化)
- curse(呪い)
- forget(忘却)
- strN(STR低下)
- intN(INT低下)
- dexN(DEX低下)
- krmN(KRM低下)
strN~krmNのNには1~9の値を設定できます。str2の場合、STRを2低下させます。 ただし、str1はstrとしても同じ意味です。
■Note■ ただし、ゲームバランスの観点からは(数値抜きで)str、int、dex、krmを利用すべきです。 Playground FlowでもxxxN値には対応していません。
func属性
ダメージ式を表します。
(1)attack属性がphysics/magic/bothの場合
ダメージ式は「nL+nR+nLM+nRM+nM+n-nSTR-nINT-nDEX-nKRM-nFREE1-nFREE2-nFREE3」で統一。
- L、LM、M、RM、Rはダイスの値を表します。利用できる記号は、ダイスの個数によって変化します。
- 2個:L(左)、R(右)
- 3個:L(左)、M(中央)、R(右)
- 4個:L(左)、LM(中央左)、RM(中央右)、R(右)
- 5個:L(左)、LM(中央左)、M(中央)、RM(中央右)、R(右)
- その他の制約は以下の通りです。
- nは任意の数値
- 符号(プラスマイナス)は差し替え可能
- すべての項は省略可能&順番も入れ替え可能
- カッコは利用できない
(2)attack属性が状態異常、ステータス攻撃の場合
回避条件を「[exp]>[exp]」の形式で指定する([exp]はダメージ式と同様の形式)。 回避条件を満たさなかった場合にだけ、指定の状態異常が付与されます。
※「[exp]<[exp]」は不可です!!
■注意■
以前の仕様では、WIZARD(魔法使いの時に回避)のような記述を許容していましたが、利用されていないようだったので、廃止しています。今後、ご要望次第でサポートを検討します。
以下は、その他の注意点です。
- (1)(2)いずれの場合も、カンマ区切りで複数指定も可能です(その場合はランダムに式を選択します)。
- ダメージ式/回避条件のステータスへの反映(自動計算)は、func属性の頭に「
*
」を付与することで無効化できます(自動化ができないシナリオでは「*
」を付与してください)。
hp属性
敵の生命力を表します。 省略可能で、指定した場合にだけBattleSheetに表示されます。
- 本属性を指定した場合には、func_opp属性も指定してください。
- 具体的な数値の他、p01、p02...のような内部パラメーターidを指定することも可能です。その場合、シーンを跨って生命力を保持できます。
- 生命力の初期値もparam要素のinitial属性で指定します。
func_opp属性
プレイヤーから敵を攻撃する際のダメージ式を表します(hp属性が指定されている場合にだけ有効です)。指定可能な式については、func属性の(1)に準じます。
drop属性
ドロップアイテムを表します。以下は設定例です。
- 「mon/3」で「月×3」(mon、tue、wed、thu、fri、sat、sunを利用可能)
- 「free1/50/50Gold」で「50Gold」(「free1/50」は「free1を50加算の意)
- 「item/i01/武器」で「武器」(アイテムi01を入手)
- 「flag/f01/扉を開く」で「扉を開く」(フラグf01を設定)
- 「param/p01:10/瓶の中身」で「瓶の中身」(パラメーターp01を10加算。負数ならば減算)
- 「param/p01:@10/瓶の中身」で「瓶の中身」(パラメーターp01を10に設定)
任意の属性で、無指定の場合はelement属性からドロップアイテムを確定します(無属性ではドロップは空)。
#text
敵/罠の説明文です。
プレイ画面で敵リストをクリックした時にトースト表示される文言なので、最大でも50文字程度を推奨します。
<result>
要素
個々の実績情報を表します。
id属性
実績コードです(シナリオ内部で一意でなければなりません)。
接頭辞「r」+「番号」で表します。
name属性
実績名を表します(ex. ガジガジネズミ)。
level属性
難易度を表します。指定できるのは1~5の値です。
#text
実績の成立条件を表します(ex. 隧道でネズミに食い殺された)
<work>
要素
シナリオ内部で利用している画像/楽曲のライセンス情報を表します。
シナリオ終了時(ハッピー/バッドエンドを問わない)に、ブラウザーのコンソール画面にリスト表示される情報です。
name属性
category属性が...
- bgmの場合は曲名
- pictureの場合は利用場所(街、酒場など)
を表します。
category属性
作品の分類を表します。以下のいずれかを指定してください。
- bgm(楽曲)
- picture(画像)
creator属性
作者/サイト名を表します。
url属性
作品の公開サイト(URL)を表します。
<scene>
要素
各シーンの情報を表します。シナリオ本体です。
id属性
シーン番号を数字で表します。idのルールは以下です。
- シナリオ内部で一意であること
- id値は0~99999の範囲で採番すること(連番でなくても構わない)
- 予約番号を一般のSceneに付与してはいけない。
以下は、現在の予約番号です。
- 0:スタート地点(プロローグであること)
- 90000;[戻る]機能のリンク先(現在のシーンのひとつ前に戻る)
- 99998:共通インポート(全シーンの末尾に無条件に反映。ただし、exclude/end属性ありのシーンを除く)
- 99999:共通ルール(Battle Sheetに既定で反映される)
将来的にid="9XXXX"はなにかしらの予約idになる可能性があります。準予約番号扱いとし、通常のSceneとしては利用しないようにしてください。
items属性
そのシーンに移動した時に入手できるアイテムを表します。
カンマ区切りで複数列挙できます。「-i~」で、指定のアイテムを喪失します。
flags属性
そのシーンに移動した時に立つフラグを表します。
カンマ区切りで複数列挙できます。「-f~」で、指定のフラグを喪失します(ただし、破棄できるのは隠しフラグだけです)。
params属性
そのシーンに移動した時に加算/減算する内部パラメーターを表します。
- p01:10 … p01を10加算
- p01:-10 … p01を10減算
- p01:@10 … p01を10に設定
「p01:10,p02:Rio」のように、カンマ区切りで複数列挙も可能です。
enemies属性
そのシーンで登場する敵/罠情報を表します。プレイ画面下部に敵リストを生成するのに利用されます。
カンマ区切りで複数列挙できます。
dice属性
そのシーンのBattle Sheetで利用できるダイスを「種類:個数」の形式で表します。 たとえば「10:5」で、d10ダイスを5個表示します(既定は「6:2」)。
- 種類は数字、または文字列で表します。
- 数字:ダイスの上限値(1~20)
- 文字列:high(4、5、6のみ)、cheat_h(6の出やすい)、cheat_l(1が出やすい)
- 個数は2~5の間で表します。
stars属性
そのシーンに移動した時に加算/減算する<七惑星の欠片>を表します。指定できる形式は、以下の通りです。
- 月~太陽の順で「9,9,9,9,9,9,9」のカンマ形式(途中省略は不可)
- 負数指定も可(ただし、減算の結果が負になった場合はゼロ丸めされます。減算の際はシナリオ側で矛盾が生じないようにしてください)
- 「divN」ですべての星を1/Nにもできる(小数点以下切り捨て)
hp/mp属性
そのシーンに移動した時に加算/減算するhp、mp値を表します。指定できる形式は、以下の通りです。
- 「-5」「5」のような定数
- 「-10..-1」の範囲指定(範囲内で乱数が生成されます)
- 「full」で上限値がセットされます
- 「half」で上限値の半分がセットされます
ただし、自動更新によって上限を超えた場合には上限で丸められます。
state属性
そのシーンに移動した時に付与/解除する状態異常を表します。指定できる形式は、以下の通りです。
- poison(毒)
- frozen(凍結)
- stone(石化)
- curse(呪い)
- forget(忘却)
- それぞれに「-」を付与することで解除(例:-poison)
- 「-all」ですべての状態異常を解除
str/int/dex/krm属性
そのシーンに移動した時に加算/減算するstr、int、dex、krm値を表します。指定できる形式は、以下の通りです。
- 「-5」「5」で、指定値だけ増減
- 「@5」で、指定値を設定
- 「full」で初期値に戻す(非推奨)
free1/free2/free3属性
そのシーンに移動した時に加算/減算するfree1~3の値を表します。指定できる形式は、以下の通りです。
- 「-5」「5」で、指定値だけ増減
- 「-10..-1」の範囲指定(範囲内で乱数が生成されます)
- 「@5」で、指定値を設定
result属性
そのシーンに移動した時に取得できる実績を表します。複数指定はできません。
bgm属性
そのシーンに移動した時に、指定されたBGMに切り替えます(詳細は<bgm>
要素も参照してください)。
bgm/end属性が同時に指定された場合は、bgm属性で指定された曲が優先されます。
se属性
そのシーンに移動した時に、指定された効果音を再生します。
「se.mp3」であれば、「se」と指定します。
rule属性
Battle Sheetに反映すべきルールテキストを指定します(scene要素のid値で指定してください)。
無指定の場合は、id="99999"のシーンが共通テキストとして引用されます。
end属性
そのシーンがエンディングシーンであるかを表します。end属性が指定された場合、STextはゲームを終了し、セーブデータを初期化します。
指定できる値は、以下の通りです。
- happy(ハッピーエンド)
- bad(バッドエンド)
nexts属性
現在のシナリオのセーブデータを、指定のシナリオに引き継ぎます。連作(複数シナリオから構成されるシナリオ)のための機能です。
引き継ぎ先のシナリオコードを「scepter,zero,hero」のようなシナリオコード(カンマ区切り)で指定します。引き継ぐ項目については、以下のセーブデータ詳細を参照してください。
※end属性との組み合わせでのみ有効
■Caution■ 引き継ぎに際しては、次シナリオのScene 0の属性指定は無視されます。 セーブデータの一部に初期値を与える場合には、Scene 1(次のシーン) などで設定するようにしてください。
exclude属性
true(固定値)で、共通インポートを無効化します。 共通インポートについては、scene-id属性を参照してください。
#text
シナリオ本文をMarkdown形式で表します。詳細なルールは後述します。
シナリオ本文の記法(SGML拡張)
<scene>
要素の本体(#text)は、Markdownを拡張したSGML拡張で表します。
Markdownとは?
Markdown形式は、ブログなどに利用される簡易なテキストフォーマットです。簡単な文字修飾をはじめ、画像の埋め込みや表組み、リンク、箇条書きリストなどを表現できます。
構文 | 機能 |
---|---|
# ... | 見出し(#の数が階層レベル) |
空行 | 段落 |
**...** | 太字 |
*...* | 斜体 |
+ ... | 箇条書きリスト |
1. ... | 番号付きリスト |
![代替テキスト](ファイル名) | 画像の挿入 |
> ... | 引用 |
==== | 水平線 |
本ドキュメントではMarkdownの詳細については割愛します。より詳細は、以下のようなページも参考にしてください。
https://notepm.jp/help/how-to-markdown
基本的な構文には対応しているはずですが、リンクとテキストのカラーリングだけは例外です。リンクは「http://~」「https://~」で始まるテキストが自動リンクされます。カラーリングについては、以下のSGML拡張を利用してください。
SGMLリンク(移動ボタン)
SGMLでは、以下のような拡張構文で移動ボタンを作成できます。
[ボタンキャプション](リンク先番号)
▼
[冒険に出発する](1)
更に、フラグ/アイテムなどの有無によって、移動ボタンの表示/非表示を制御できます。
■Note■ 以下の条件式で、否定の意味を表す「-」は、旧構文(非推奨)です。 すぐに削除することはありませんが、今後はできるだけ新構文の「!」を利用するようにしてください。
フラグがある/ない場合のみ表示
[ボタンキャプション](リンク先番号 "フラグコード") [ボタンキャプション](リンク先番号 "!フラグコード") [ボタンキャプション](リンク先番号 "-フラグコード")
▼
[フラグ確認用1](12 "f1") [フラグなし確認用1](12 "!f1") [フラグなし確認用1](12 "-f1")
アイテムがある/ない場合のみ表示
[ボタンキャプション](リンク先番号 "アイテムコード") [ボタンキャプション](リンク先番号 "!アイテムコード") [ボタンキャプション](リンク先番号 "-アイテムコード")
▼
[アイテム確認用1](12 "i1") [アイテムなし確認用1](12 "!i1") [アイテムなし確認用1](12 "-i1")
内部パラメーターの値が条件に合致する場合のみ表示
[ボタンキャプション](リンク先番号 "パラメーターコード:値") …「値」以上 [ボタンキャプション](リンク先番号 "!パラメーターコード:値") …「値」未満 [ボタンキャプション](リンク先番号 "パラメーターコード:@値") …「値」と等しい [ボタンキャプション](リンク先番号 "!パラメーターコード:@値") …「値」と等しくない
▼
[ラベル](12 "p01:10") [ラベル](12 "!p01:10") [ラベル](12 "p01:@10") [ラベル](12 "!p01:@10")
比較する値が文字列の場合は常に等価比較となるので、先頭の「@」は不要です。
魔法を利用できる/できない場合のみ表示
[ボタンキャプション](リンク先番号 "m魔法名") [ボタンキャプション](リンク先番号 "!m魔法名") [ボタンキャプション](リンク先番号 "-m魔法名")
▼
[魔法確認用(HEAL)](12 "mHEAL") [魔法なし確認用(HEAL)](12 "!mHEAL") [魔法なし確認用(HEAL)](12 "-mHEAL")
魔法ボタンでの移動時には、自動的に対応する星が減算されます。
ステータスが指定値を上回っている/下回っている場合のみ表示
[ボタンキャプション](リンク先番号 "o[ステータス種別][値][+/-]") [ボタンキャプション](リンク先番号 "!o[ステータス種別][値][+/-]") [ボタンキャプション](リンク先番号 "-o[ステータス種別][値][+/-]")
▼
[STRが5より大きい場合のみ表示](12 "oSTR5+") [HPが50未満の場合のみ表示](12 "oHP50-")
ステータス種別にはSTR、INT、DEX、KRM、HP、MP、FreeI、FreeII、FreeIIIを指定可能です。
キャラの基本情報が合致している/していない場合のみ表示
[ボタンキャプション](リンク先番号 "x情報") [ボタンキャプション](リンク先番号 "!x情報") [ボタンキャプション](リンク先番号 "-x情報")
▼
[種族がFIGHTER](41 "xFIGHTER") [種族がFIGHTERでない](41 "!xFIGHTER") [種族がFIGHTERでない](41 "-xFIGHTER") [性別がMALE](41 "xMALE") [年齢がOLD](41 "xOLD") [状態異常がFROZEN](41 "xFROZEN") [職業がのうふ](41 "xのうふ")
情報には、以下のものを指定可能です。
- 種族(FIGHTER/WIZARD/DWARF/ELF)
- 性別(MALE/FEMALE)
- 年齢帯(YOUNG/ADULT/OLD)
- 状態異常(POINSON/FROZEN/STONE/CURSE/FORGET)
- 職業(のうふ/こじきなど。ひらがな/カタカナ表記)
個々の星を指定数以上、所持している/いない場合のみ表示
[ボタンキャプション](リンク先番号 "s月:...:太陽") [ボタンキャプション](リンク先番号 "!s月:...:太陽") [ボタンキャプション](リンク先番号 "-s月:...:太陽")
▼
[星が各7以上](2 "s7:7:7:7:7:7:7") [星の各7以上ない](2 "!s7:7:7:7:7:7:7") [星の各7以上ない](2 "-s7:7:7:7:7:7:7")
星の所持総数が指定数以上である/ない場合のみ表示
[ボタンキャプション](リンク先番号 "s総数") [ボタンキャプション](リンク先番号 "!s総数") [ボタンキャプション](リンク先番号 "-s総数")
▼
[星の総数49以上](2 "s49") [星の総数49未満](2 "!s49") [星の総数49未満](2 "-s49")
実績がある/ない場合のみ表示
[ボタンキャプション](リンク先番号 "実績コード:シナリオコード") [ボタンキャプション](リンク先番号 "!実績コード:シナリオコード") [ボタンキャプション](リンク先番号 "-実績コード:シナリオコード")
▼
[実績確認用(r01:scepter)](12 "r01:scepter") [実績なし確認用(r15:tempest)](12 "!r15:tempest") [実績なし確認用(r15:tempest)](12 "-r15:tempest")
経過シーン数が一定値を越えている/いない場合のみ表示
[ボタンキャプション](リンク先番号 "e経過シーン数") [ボタンキャプション](リンク先番号 "!e経過シーン数")
▼
[1日経過](100 "e15") [1日未経過](100 "!e15")
関数式[α版]
fn:関数名(引数,...)の形式で特殊な条件式を表現できます。 利用できる関数には、以下のようなものがあります。
- fn:rand(40):40%の確率で表示するリンク
- fn:include(2,f1,f2,f3):f1~3の中で2個以上存在すればtrue(i1、i2...も指定可)
- fn:range(str,5,10):STRの値が5以上10未満の場合にtrue(指定可能なキーは以下)
- ステータス(hp、mp、str~krm、free1~3)
- 内部パラメーター(p01...)
- 経過シーン数(e)
- fn:cycle(15,5,1):1~5、6~10、11~15...(1周15シーンを5シーンごとに分割=3等分)としたときの1番目のグループ1~5、16~20...の範囲に経過シーン数が含まれる場合にtrue
複合条件式
前出の条件を複合的に組み合わせ可能です。 組み合わせに際しては、以下の演算子を利用できます。
- !(否定)
- &(かつ)
- |(または)
演算子の優先順位は「!」>「&」>「|」ですが、カッコで括った場合には、そこが最優先となります。
[複合条件0](10 "!f03") … f03を所持しない [複合条件1](10 "f01&f02&i01") … f01、f02、i01が全て揃っている [複合条件2](10 "f01|f02|i01") … f01、f02、i01のどれかを所持 [複合条件3](10 "!(f01&f02&i01)") … f01、f02、i01のどれかを所持していない [複合条件4](10 "f01&(f02|i01)") … f02、i01いずれかを所持、かつ、f01を所持 [複合条件5](10 "f01&!f02&i01") … f01、i01を所持しており、かつ、f02を所持しない
なお、新規構文を利用する際には、<scene>
要素の配下全体を<![CDATA[~]]>
で括ってください(この記述はPlayground Flowでは不要です)。
<scene id="2"> <![CDATA[ ...本文... ]]> </scene>
指定された条件をすべて満たしている場合のみ表示(カンマ区切り)[非推奨]
利用できる条件は以下の通りです(異種混在も可)
- フラグ/アイテムを所有している
- 魔法を利用できる
- 実績を保持している
- ステータス条件を満たしている
- 基本情報が合致している
[ボタンキャプション](リンク先番号 "フラグ/アイテムコード/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")
■Note■ 複合条件式の導入に伴い、本構文は非推奨となりました。 すぐに機能削除はしませんが、新規の執筆では極力、「複合条件式」を利用するようにしてください。
指定された条件のいずれかを満たしていない場合のみ表示[非推奨]
利用できる条件は前項に準じます(異種混在も可)。
[ボタンキャプション](リンク先番号 "-フラグ/アイテムコード/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+")
■Note■ 複合条件式の導入に伴い、本構文は非推奨となりました。 すぐに機能削除はしませんが、新規の執筆では極力、「複合条件式」を利用するようにしてください。
シーン番号を入力しての移動を可能にする場合
以下のように、リンク先をX、キャプションに移動可能なシーン番号をカンマ区切りで列挙したリンクを用意します(任意移動リンクはシーンにひとつしか設置できません)。
[10,11,12](X)
入力文字列を判定して正否によって分岐
以下のように、リンク先をQ、キャプションを「正答,正しい時の移動先,間違った場合の移動先」としたリンクを用意します(文字列入力リンクはシーンにひとつしか設置できません)。
[グーラン,11,12](Q)
上の例では、「グーラン」と入力した場合には11へ、さもなければ12へ移動します。
ランダムな移動を可能にする場合
以下のようにリンク先番号をカンマ区切りで列挙することもできます。この場合、リンク先はその時どきにランダムで決まります。
[ランダムリンク](1,2,3) [ランダムリンク](1,2,3;2)
末尾に「;2」のような形式で日数を記述することで、キャッシュ機能を有効にできます。「;2」であれば、2日間、初回のリンク先が変化しません。
■Note■
キャッシュ機能はCookiesを利用して実装されています。キャッシュを手動で破棄するには、開発者ツールから「stext_cache_~」という名前のCookiesを削除します。
SGML式
SGMLでは、Markdownを拡張して、テキストのカラーリングや式の埋め込みにも対応しています。
式埋め込み
${...}の形式で、テキストの任意の箇所に式の埋め込みが可能です。利用可能な式は、以下の通りです。
- ${title} … キャラの称号
- ${name} … キャラの名前
- ${job} … キャラの職業
- ${xxxxx} … キャラのステータス(xxxxxはhp、mp、str、int、dex、krm、free1~3のずれか)
- ${race?人間:魔法使い:ドワーフ:エルフ} … 種族に応じて単語を置き換え
- ${sex?男:女} … 性別に応じて単語を置き換え
- ${state?正常:毒:凍結:石化:忘却} … 状態異常に応じて単語を置き換え
- ${age?若者:中年:老人} … 年齢帯に応じて単語を置き換え
- ${rand?1:20} … 指定の値範囲で乱数を生成
- ${msg?こんにちは:おはよう:こんばんは} … 指定のメッセージをランダムに選択
- ${var?i01:~} … アイテム情報を表示
- ${var?i01:name} … アイテムの名前
- ${var?i01:text} … アイテムの説明
- ${var?m01:~} … 敵/罠情報を表示
- ${var?m01:name} … 敵の名前
- ${var?m01:element} … 敵の属性
- ${var?m01:text} … 敵の説明
- ${var?r01:~} … 実績情報を表示
- ${var?r01:name} … 実績名
- ${var?r01:level} … 実績のレベル
- ${var?r01:text} … 実績の説明
- ${var?p01:~} … 内部パラメーター情報を表示
- ${var?p01:text} … パラメーターの説明
- ${var?p01:value} … パラメーターの現在値
- ${result?id}:シナリオidの実績数を取得
- ${result_rate?id}:シナリオidの実績率を取得
備考
- race、sex、state、age、msgなどでは、「?」以降は、「:」区切りで表示すべき任意の単語を指定できます。
- ${result?id}、${result_rate?id}は、現在の実装の制約で、起動時の最初のページでは実績情報を取得できません(Scene 0というわけではありません)。取得失敗時は「?????」を表示します。
共通テキストの埋め込み
${import id値}の形式で、<scene>
要素で指定されたテキストを埋め込むことができます。テキスト内には、任意の埋め込み式も指定可能ですが、${import}を入れ子で利用することはできません。
${import 99991}
フォーム要素の埋め込み
${...}の形式で、本文中にテキストボックスなどのフォーム要素を埋め込むことが可能です。
- ${input?0}
[+][-]ボタン付きの数値入力ボックス。引数は初期値。 セーブデータなどには反映されないので、シーン内でのメモ用途です。
■Note■ 現時点では、数値ボックスのみの対応ですが、将来的にボタン、チェックボックスなどを追加の予定です。
条件分岐
${if xxx}~${/if}の形式で、テキスト内に条件付きで表示するテキストを指定できます。xxxには移動ボタンで利用可能なすべての条件式を利用できます(複合条件式にも対応)。
${if f04} フラグ04が立っている時にだけ表示されます。 ${/if}
エフェクト再生[β版]
${effect xxxxx}~${/effect}で、配下のテキストに対して、エフェクト(アニメーション)を適用できます。xxxxxに指定できる値には、以下のようなものがあります。
- flash
- bounce
- shake
- tada
- swing
- wobble
- pulse
- flip/flipInX/flipInY
- fadeIn/fadeInUp/fadeInDown/fadeInLeft/fadeInRight
- fadeInUpBig/fadeInDownBig/fadeInLeftBig/fadeInRightBig
- bounceIn/bounceInDown/bounceInUp/bounceInLeft/bounceInRight
- rotateIn/rotateInDownLeft/rotateInDownRight/rotateInUpLeft/rotateInUpRight
- rollIn
${effect}は段落単位に指定してください(段落を跨ぐ場合には、その個数だけ指定すること)。
ルビ指定
${元の文字列|ルビ}の形式で、ルビの指定も可能です。
俺は${銀狼|silver wolf}だ!
テキストのカラーリング
%blue%~%/%でテキストを囲むことで、任意のテキストにカラーリングも可能です。
みんな、%blue%ソーサリアン%/%だ!
ただし、現時点では以下の制約があります。
- 現在利用できるカラーは、blue、red、purple、whiteのみです(whiteはテキスト選択でのみ反転表示される非表示テキストの用途が目的)。
- カラーリングしたテキストの前後には、半角スペースが入ります。
ツイートボタンへの反映
${tweet}~${/tweet}で、任意のテキストを括ることで、その内容を[ツイート]ボタンに反映できます。以下は制約事項です。
- ${tweet}配下では、Markdownによる修飾はできません。
- ${tweet}はひとつのシーンでひとつしか利用できません(複数は上書き)。
- 指定されていないシーンでは、init-intro要素での設定値が利用されます。
- 指定したシーンでは、intro要素での設定値は上書きされます。
■Note■独自サイトでSTextを運用する方向け
ツイートボタン機能を利用するには、「class="socialbtn twitter"」「class="socialbtn twitter_custom"」である要素をページの任意の箇所に配置してください。[ツイート]ボタンのプレイスホルダー(表示領域)となります。
※公式のSTextサイトでシナリオ公開する方には関係ありません。
フォルダー構造
本項の内容はFlow投稿を利用する限りは意識する必要はありません。ローカルでSTextを動作する方、Flow以外の方法で投稿する場合のみ確認してください。
シナリオデータは、以下のフォルダー構造で配置してください(データサイズは推奨する上限値です)。
/シナリオコード … シナリオルート ├──scenario.xml ……………… シナリオデータ(後述) ├──/bgm ……… BGM │ ├──xxxxx.mp3 ………… 個々の楽曲(1mb) │ └──/se … 効果音 │ └──xxxxx.mp3 … 個々の効果音(30kb) └──/capture … 挿絵 ├──intro.png ………… サイト紹介用の画像(120x180px) └──xxxxx.png ………… 個々の画像(100kb)
挿絵について
- ファイル名はアルファベット小文字+数字で統一してください
- 「_」などの記号は利用できません。
- 1シーンに複数のイラストがあっても構いませんし、複数シーンで同一のイラストを共有しても構いません。
- ただし、読みやすさの観点から、1シーン複数イラストは避けることを推奨します。
シナリオコードについて
- 公開時に管理者が決定するので、開発時は「test」固定で構いません。
- ローカル環境でシナリオの動作を確認する場合には、トップフォルダーの名前が「test」であることを確認した上で、/stextフォルダー直下にコピーしてください。あとは、トップページの選択ボックスから[テストシナリオ]を選択することで、シナリオを起動できます。
セーブデータ
本項の内容はシナリオ開発には特に関係ありません。システム改定提案の材料にご利用ください。
セーブデータは以下の2種類です。いずれもJSON形式でWeb Storageに保存され、次回起動時に復帰できます。
- シナリオを跨いだ「グローバルセーブデータ」
- シナリオ単位に設置される「ローカルセーブデータ」
グローバルセーブデータ
- 初回のシナリオ生成時に生成され、複数のシナリオ間で共有されます。
- キーは固定で「sorcerian_text」
以下はセーブデータの構造です。
├──items ………… シナリオ終了時に得られるアイテム(シナリオ共通で累積される) ├──results ……… 実績情報(「シナリオid: 実績リスト」の形式) ├──panel ………… コントロールパネルは表示状態か └──bgm …………… BGMを再生するか
ローカルセーブデータ
- 個々のシナリオ開始時に生成され、シナリオ固有の情報を管理します。
- シナリオ開始時にキャラは自動生成(「ソーサリアンになったったー」のイメージ)
- 基本ステータスは種族/性別で決定(別表の基準値をもとにランダム決定)
- キーは「シナリオコード」
以下はセーブデータの構造です。
├──chara …………………… キャラ情報 │ ├──title …………… 称号 │ ├──name …………… 名前 │ ├──race …………… 種族 │ ├──sex ……………… 性別 │ ├──age ……………… 年齢帯(YOUNG/ADULT/OLD) │ ├──job ……………… 職業 │ ├──state …………… 状態異常 │ ├──stone_scene …… 石化の経過シーン数 │ ├──forget_scene … 忘却の経過シーン数 │ ├──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 …………… 自由ステータス1 │ ├──free2 …………… 自由ステータス2 │ └──free3 …………… 自由ステータス3 ├──stars …………………… 所持している七惑星の欠片(月~太陽の個数を配列で) ├──items …………………… 所持しているアイテム(配列)★ ├──flags …………………… 所持しているフラグ(配列)★ ├──params…………………… 所持している内部パラメーター(配列)★ ├──memos …………………… 冒険メモ(自由入力欄) ├──scene …………………… 現在のシーン★ ├──ellapsed_scene ……… 経過したシーン数★ ├──bgm ……………………… 現在再生中のBGM(空文字列はメインテーマ)★ ├──bonus …………………… 現在のシナリオで適用されるボーナス └──isEnded ………………… エンディングに到達しているか★
※★はnexts属性でのコピー時に引き継がれない項目です。ただし、itemsは「item要素でshared属性が指定されているアイテムのみ」引き継がれます。