メインコンテンツにスキップ

ドラマ

ドラマは、選択肢や追加アクションを含む豊かな会話システムです。

追加方法

キャラクターにデフォルトのドラマを割り当てるには、LangMod/**/Dialog/Drama/ フォルダ内に id.xlsx を配置し、ファイル名をキャラクターIDにしてください(例: tinymita キャラクターなら tinymita.xlsx)。

別のドラマファイルを使用する場合は、キャラクターのソース行に addDrama(DramaFileId) タグを追加します。

C# API の chara.SetDramaOverride(DramaFileId) または chara.ShowDialog(DramaId, step) も利用可能です。

新しいドラマシートを作成する際は、Elin/Package/_Elona/Lang/_Dialog/Drama 内のゲーム内シートを参考にするか、Tiny Mita のサンプルをテンプレートとしてダウンロードしてください。

ホットリロード

ドラマシートはゲーム実行中に編集できます。変更は次にダイアログを開いたときに自動で反映されます。

定義

ドラマシートは上から下へ順に読み込まれ、複数の行で構成されます。各行には以下のフィールドがあります(1行目で定義)。

  • step:ステップの開始を表します。以降の行はこのステップに属し、次の step が出現するまで続きます。
  • jump:この行の実行後にジャンプする先のステップ。
  • if / if2:実行前に確認する条件。if2 がある場合は両方を満たす必要があります。
  • action:実行するアクション。
  • param:アクションのパラメータ。
  • actor:アクションまたは会話行の話者。
    • ???? と表示。
    • tg:ドラマ対象のキャラクター。actor が空欄の場合はこれが既定。
    • narrator:既定のナレーター。
    • pc:プレイヤー。
  • id:一意の識別子。text 行と choice 行では必須です。その他の行では不要。
  • text_XX / text_JP / text_EN / text:会話内容。XX は言語コード(例: text_CNtext_ZHTW)。対応する言語がない場合は text がフォールバックとして使用されます。text_JPtext_EN は必須ですが、翻訳を提供する必要はありません。

(クリックで拡大) img

ステップ

ドラマの流れは複数のステップで構成されます。各ステップには会話・アクション・条件を含む 1 つ以上の行が含まれます。

main が既定の開始ステップで、end でドラマを終了します。

シート作成時は、内部ステップとの競合を避けるため、ステップ名を _ または flag で始めないようにしてください。

組み込みステップ

inject/Unique アクションを実行すると、多くの組み込みドラマステップが現在のドラマシートに挿入されます。これらを使用するには、単に jump ターゲットとして指定するだけです。一部のステップは既定の inject/Unique ダイアログで既に使用されているため、通常は自分で再利用する必要はありません。

ステップ名用途
_banishドラマを終了
_byeドラマを終了
_toggleSharedEquiptg の共有装備状態を切り替え
_daMakeMaidtg をメイドに設定
_joinPartytg の特性が参加可能ならパーティメンバーに設定(これは招待ではありません
_leavePartytg をパーティから外し、拠点エリアへ送る
_makeLivestocktg を派閥の家畜に設定
_makeResidenttg を派閥の住民に設定
_departtg を派閥から除外
_rumor噂を見る
_sleepBesidetg がプレイヤーの隣で寝るかどうかを切り替え
_disableLoyaltg の忠誠心状態を切り替え
_sucktg がプレイヤーを吸う(吸血を優先、次に猫を吸う
_insulttg の挑発状態を切り替え
_makeHome現在のエリア分岐を tg の家に設定
_invitetg を仲間として招待を試みる(プレイヤー属性と tg の招待可能状態をチェック)。無条件で仲間にするには拡張アクション join_party() を使用
_Guideプレイヤーを一連の場所へ誘導
_tail純粋な肉体関係
_whore金銭を伴う肉体関係
_bloomtg との絆を深める
_buytg からアイテムを購入
_buyPlantg から研究図面を購入
_givetg にアイテムを渡す
_blessingパーティに祝福を付与
_traintg とスキル訓練を行う
_changeDomaintg の領域を変更
_revive死亡した仲間を復活させる
_buySlavetg から奴隷を購入
_tradetg とアイテムを交換
_identifytg でアイテムを鑑定
_identifyAlltg で全アイテムを鑑定
_identifySPtg の上級スキルでアイテムを鑑定
_bout決闘を申し込む
_newsマップ上にランダムダンジョンを生成
_healプレイヤーを治療
_foodtg から食料を購入
_deposittg に預金
_withdrawtg から引き出し
_copyItemtg でアイテムを複製
_extraTax追加税を納める
_upgradeHearthハースストーンをアップグレード
_sellFame名声を売却
_investZone現在のエリアに投資
_investShoptg の商店に投資
_changeTitleプレイヤーの称号を変更
_buyLand現在のエリアマップを拡張
_disableMovetg を移動不可にする
_enableMovetg を移動可能にする

テキスト

置換変数

テキスト
#tg_histg の所有代名詞
#tg_himtg の目的格代名詞
#tgtg キャラクター名
#last_choice前回の選択肢のテキスト
#newline改行文字
#costHiretg を雇用するためのコスト(数値、ローカライズ済み)
#self / #meキャラクター tg のフルネーム(称号を含む)
#histg の所有代名詞
#himtg の目的格代名詞
#1#5外部変数 refDrama1refDrama5(数値は自動フォーマット)
#god神の名前(tg が空でなければその信仰に基づき、空の場合はランダムな宗教)
#player / #titleプレイヤーの称号
#zone現在のゾーン名
#guild_title現在のストーリーに関連するギルドの称号
#guild現在のストーリーのギルド名
#raceプレイヤーの種族名
#pcプレイヤーの略称
#pc_fullプレイヤーのフルネーム(称号を含む)
#pc_hisプレイヤーの所有代名詞
#pc_himプレイヤーの目的格代名詞
#pc_raceプレイヤーの種族
#akaプレイヤーの別名
#bigdaddyローカライズ文字列 "bigdaddy"
#festival祭りの名前(ゾーンに祭りがあればその名前、なければ汎用)
#brother2「兄弟」または「姉妹」(プレイヤーの性別に応じて)
#brother兄弟/姉妹のランダムな呼称(bro または sis リストからランダム)
#onii2お兄ちゃん/お姉ちゃんのランダムな呼称(リスト onii2 / onee2
#oniiお兄ちゃん/お姉ちゃんのランダムな呼称(リスト onii / onee
#genderプレイヤーの性別に対応するランダムな呼称(gendersDrama リスト)
#he「彼」または「彼女」(プレイヤーの性別に応じて)
#He同上、先頭文字が大文字のもの

動的コンテンツ

#eval <C#スクリプト> で始まる記述は、C#スクリプトを実行して文字列を返します。これによりテキストを動的に生成できます。

アクション

テキスト行 が最も一般的で、idtext 列(および任意で if 条件)のみを持ちます。実行時はプレイヤーの入力(クリックまたはキー押下)が必要です。

アクション行choice を除く)は入力なしで自動実行されます。同一行に actiontext の両方がある場合、text は通常無視されます。

例: テキスト行の後にアクション行を配置した場合、テキスト行をクリックして進めるまでアクションは実行されません。

組み込みアクション
アクションパラメータ説明
injectUnique「話そう」と多くの便利なステップを挿入
choice直前のテキスト行に選択肢を追加。textjump が必要
choice/bye既定の別れ選択肢を挿入
cancel右クリック/ESC キーの動作を設定。jump が必要(通常は end
setFlagフラグ名,値(省略可)フラグを設定。値省略時は 1
reloadドラマを再読み込みしてフラグ変更を反映。jump が必要(通常は main)。開発時のホットリロードとは異なります
enableToneドラマ全体で会話トーン変換を有効化
addActor後で使用するドラマキャラクターを追加。text で名前を上書き可能。actor セルに新しい ID を入力すると自動実行。actor にはキャラクターIDが必要
invokeメソッド名メソッドを呼び出す(すべて本体側でハードコード)
setBG画像名(省略可)背景画像を設定。空欄でクリア。Texture フォルダでカスタム PNG を提供可能
BGMBGM ID指定 BGM に切り替え。カスタム BGM は音声/BGM ページを参照
stopBGMBGM を停止して続行しない
lastBGMBGM を停止し、直前の BGM を再開
sound音声 ID指定音声を再生。カスタム音声は音声/BGM ページを参照
wait秒数指定秒数だけ実行を一時停止(アニメーション完了待ちに便利)
alphaIn alphaOut秒数透明度トランジション(秒)
alphaInOut秒数,待機時間alphaIn → 待機 → alphaOut
fadeIn fadeOut秒数,white/black(省略可)フェードトランジション(秒)
fadeInOut秒数,待機時間,white/black(省略可)fadeIn → 待機 → fadeOut
hideUI遷移時間HUD をトランジション付きで非表示(終了時に復元)
hideDialogダイアログを非表示にしてカットシーン作成。テキスト行は強制表示されるため wait と併用
end即座にドラマ終了(end ステップへの jump と同等)
addKeyItem重要アイテム IDプレイヤーに重要アイテムを付与
dropアイテム IDプレイヤー位置に報酬アイテムをドロップ
addResourceリソース名,数量ホームリソースを追加
shake画面を振動
slapドラマ所有者キャラクターを平手打ち
destroyItemアイテム IDプレイヤー所持品から指定アイテムを破棄
focus即座にカメラをドラマ所有者キャラクターにフォーカス
focusCharaキャラクター ID,速度(省略可)同一マップのキャラクターにカメラを移動・フォーカス
focusPC速度(省略可)プレイヤーにカメラをフォーカス
unfocusカメラのフォーカスを解除・リセット
destroyキャラクター ID同一マップのキャラクターを削除
saveセーブ
setHour時間ゲーム時間を設定

複数パラメータを指定する場合は、半角カンマ(,)で区切り、スペースを入れないでください。

条件

条件は行を実行するかどうかを判断します。

静的条件

静的条件は読み込み時に1回だけ判定されます。

if 列(任意で if2 列)で任意の行に条件を付加します。

条件パラメータ説明
hasFlagフラグ名フラグが存在し値が 0 でない
!hasFlagフラグ名フラグが存在しない、または値が 0
hasMelilithCurseメリリス呪いを持つ
merchant商人ギルドにいる
fighter戦士ギルドにいる
thief盗賊ギルドにいる
mage魔術ギルドにいる
hasItemアイテム ID所持品にアイテムがある
isCompletedクエスト ID指定クエストを完了済み

単純値チェック(フラグ・カウンターで最もよく使われます):

=,example_flag,1
>,example_counter,20
!,example_flag,69

ほとんどの行は if 列だけで十分です。複数条件が必要な場合は if2 列を追加してください。

動的条件

行を動的に有効・無効にするには以下を使用します:

  • invoke* 条件式
  • bool を返す eval アクション

分岐

jump にドラマステップを指定すると、そのステップへ分岐します。

jumpeval_result に設定し、string を返す eval アクションを使用すると、動的にジャンプ先を決定できます。

invoke* 式

ドラマシート内で特殊アクション invoke*(略して i*)を使用すると、拡張メソッドを呼び出せます:

構文

疑似コード風の構文はシンプルです。actioninvoke* または i* を、param に有効なメソッドを指定します。

アクションパラメータactor
invoke*/i*honk_honk(arg1, arg2)pc

これは honk_honk メソッドを arg1arg2 の 2 引数で呼び出します。

パラメータ

パラメータは半角カンマ , で区切り、拡張メソッドの括弧内に記述します。引数がない場合は空の () を使用してください。

ほとんどのメソッドは actor セルを対象キャラクター(pctg、または任意のキャラクターID)として使用します。既定は tg です。

同一行の jump に値がある場合、拡張メソッドの戻り値がジャンプを実行するかどうかを決定します。true を返すとジャンプを実行します。

数値式の構文

DramaValueExpression は値の評価・代入に使用します。

例:

意味
6969 を代入
=6969 を代入
+5元の値に 5 を加算
-3元の値から 3 を減算
*10元の値に 10 を乗算
/2元の値を 2 で除算
==6969 と等しいか判定
!=114114 と等しくないか判定
>1010 より大きいか判定
>=2020 以上か判定
<55 より小さいか判定
<=33 以下か判定

拡張アクション

メソッドパラメータ説明ジャンプ条件
add_itemアイテムID, 素材エイリアス(省略可), レベル(省略可), 数量(省略可)actor にアイテムを追加(既定: ランダム素材・自動レベル・数量1)常時
equip_itemアイテムID, 素材エイリアス(省略可), レベル(省略可)actor にアイテムを装備(既定: ランダム素材・自動レベル)常時
destroy_itemアイテムID, 数量(省略可)actor のアイテムを破棄(既定: 1)常時
join_faith信仰ID(省略可)actor を指定信仰に加入(空欄で脱退)成功時
join_partyactor をプレイヤーパーティに無条件加入常時
apply_condition状態エイリアス, 強度状態を付与(既定強度 100)常時
remove_condition状態エイリアス状態を解除常時

拡張演出

メソッドパラメータ説明ジャンプ条件
move_next_toキャラクターIDactor同一マップのキャラクターの隣へ移動常時
move_tileXオフセット, Yオフセットactor相対座標で移動(例: 1,12,-1常時
move_toX, Yactor絶対座標で移動(例: 64,4412,0常時
move_zoneエリアID, 階層(省略可)指定エリアへ移動(既定階層 0)成功時
move_zone_2エリア完全名エリア完全名で移動(例: derphy@-1成功時
play_animeアニメIDactor にアニメーションを再生常時
play_effectエフェクトIDactor にエフェクトを再生常時
play_effect_atエフェクトID, X, Y指定位置にエフェクトを再生常時
play_emoteエモートIDactor にエモートを表示常時
play_screen_effect画面エフェクトID画面エフェクトを再生常時
pop_textテキストactor の頭上にテキストを表示常時
set_portraitポートレートID(省略可)ダイアログ時のポートレートを設定(空欄でリセット)。Portrait フォルダ対応常時
set_portrait_overrideポートレートID(省略可)ダイアログ外のポートレートを設定(空欄でリセット)。完全ID必須常時
set_spriteテクスチャID(省略可)actor のカスタムスプライトを設定(空欄でリセット)。Texture フォルダから取得常時
show_book分類/書籍ID本を開く(LangMod/**/Text フォルダ対応)成功時

拡張変更

メソッドパラメータ説明ジャンプ条件
mod_affinity数値式actor の好感度を数値式で変更成功時
mod_currency通貨種別, 数値式actor の通貨を数値式で変更(money money2 plat medal influence casino_coin ecopo常時
mod_element要素エイリアス, 強度(省略可)actor の要素(特性・耐性・スキル等)を変更(既定強度 1)常時
mod_element_exp要素エイリアス, 数値式actor の要素経験値を変更成功時
mod_fame数値式プレイヤーの名声を数値式で変更常時
mod_flagフラグ, 数値式actor のフラグ値を数値式で変更(非プレイヤーキャラクターも対応)常時
mod_keyitem重要アイテムエイリアス, 数値式(省略可)重要アイテム値を数値式で変更(既定 =1成功時

拡張条件

これらも invoke* アクションで呼び出す拡張メソッドですが、戻り値が重要です。

メソッドパラメータ説明ジャンプ条件
if_affinity数値式actor の好感度を式で判定(例: <5>=90!=0条件成立時
if_condition状態エイリアスactor が指定状態を持っているか判定所持時
if_currency通貨種別, 数値式actor の通貨を式で判定条件成立時
if_element要素エイリアス, 数値式actor の要素を式で判定条件成立時
if_faith信仰ID, 奉献ランク(省略可)指定信仰に所属しランク以上か判定(既定 >0条件成立時
if_fame数値式プレイヤーの名声を式で判定条件成立時
if_flagフラグ名, 数値式actor のフラグ値を式で判定条件成立時
if_lv数値式actor のレベルを式で判定条件成立時
if_has_itemアイテムID, 数値式(省略可)アイテム所持数を式で判定(既定 >=1条件成立時
if_hostility陣営数値式actor の陣営を判定(例: =Ally>Enemy条件成立時
if_in_partytrue または false(省略可)プレイヤーパーティに所属しているか判定(既定 true条件成立時
if_keyitem重要アイテムエイリアス, 数値式(省略可)重要アイテム所持を式で判定(既定 >0条件成立時
if_race種族ID指定種族か判定条件成立時
if_tagタグChara 行で定義されたタグを持っているか判定定義時
if_zoneエリアID, 階層(省略可)指定エリアにいるか(階層も任意で判定)存在時
if_zone_2エリア完全名エリア完全名でエリア判定(例: derphy@-1存在時

特殊メソッド

メソッドパラメータ説明ジャンプ条件
console_cmdコンソールコマンド 引数1 引数2...コンソールコマンドを実行常時
evalC# スクリプトまたは <<<path.cs 構文でファイル指定C# スクリプトを実行(invoke* ではなく eval アクションの使用を推奨)true 返却時
andand(if_flag(flag1, >0), if_flag(flag2, <0)...)invoke* 式を引数としてすべて評価すべて成立時
oror(if_race(lich), if_race(snail)...)invoke* 式を引数としてすべて評価いずれか成立時
notnot(if_zone(dungeon), if_zone(field), if_zone(underground)...)invoke* 式を引数としてすべて評価すべて不成立時

API

Elin は独自のスクリプト DLL からカスタム拡張メソッドを追加するための簡単な API を提供しています。

アクションパーサー

パーサーはドラマ読み込み時に、組み込み以外の登録済みアクション行に対して呼び出され、イベントの作成を担当します。

cs
[ElinDramaActionParser("my_action")]
public static bool ExampleParser(DramaManager dm, Dictionary<string, string> line) 
{
    dm.AddEvent(new DramaEventTalk(line["actor"], () => {
        // 処理
        return "テキスト行!";
    }));
    // この行は処理済み
    return true;
}
// または手動登録
CustomDramaExpansion.AddDramaActionParser("my_action", ExampleParser);

アクション呼び出し

呼び出しメソッドは自動的に invoke* 式にコンパイルされ、ドラマ実行時に呼び出されます。

cs
[ElinDramaActionInvoke]
public static bool add_item(DramaManager dm, Dictionary<string, string> line,
                            string itemId,
                            string materialAlias = "wood",
                            int lv = -1,
                            int count = 1)
{
    var chara = dm.GetChara(line["actor"]);

    var mat = sources.materials.alias.TryGetValue(materialAlias, "wood");
    var item = ThingGen.Create(itemId, mat.id, lv).SetNum(count);
    chara.Pick(item);

    return true;
}

[ElinDramaActionInvoke("nodiscard")]
public static bool if_element(DramaManager dm, Dictionary<string, string> line,
                              string elementAlias,
                              DramaValueExpression expr) 
{
    var chara = dm.GetChara(line["actor"]);
    return chara.HasElement(elementAlias) && expr.Compare(chara.Evalue(elementAlias));
}
cs
[ElinDramaActionInvoke]
public static bool console_cmd(DramaManager dm, Dictionary<string, string> line, 
                               params string[] parameters)
{
    string.Join(' ', parameters).EvaluateAsCommand();
    return true;
}

ドラマ呼び出しメソッドは staticbool を返し、パラメータは DramaManager dm, Dictionary<string, string> line で始まる必要があります。

実際の式パラメータは Elin が自動変換するか、string[] として渡されます。自動変換可能な型には、組み込み型、DramaValueExpression、または static bool TryParse(string, out T) を持つカスタム型が含まれます。

使用例は CustomDramaExpansion の実装を参照してください。

スクリプト

eval アクションを使用すると、ドラマシート内で直接 C# コード を実行できます。

通常の C# と同等のスクリプト機能を提供しますが、以下の違いがあります:

  • スクリプトの状態は現在のドラマインスタンスに紐づく(ドラマ終了まで保持され、その後自動リセット)。
  • ショートカット: dm = DramaManager、line = 現在の行(Dictionary<string, string>)、tg = 対象 Charapc = プレイヤー Chara

戻り値の動作:

  • bool + 有効な jump ターゲット → ジャンプを実行するかを決定。
  • string + jump セルが eval_result → その文字列を新しいジャンプ先として使用。
  • 戻り値なし → 通常のアクションとして扱う。

同一フォルダのスクリプトファイルを <<<script_snippet.cs でインポートできます。

変数の受け渡し

共有の Script 辞書を使用します:

cs
// 1回目の eval
var value = EClass.rnd(100) * 5;
Script["random_value"] = value;

// 以降の eval
var value = (int)Script["random_value"];

よく使う例

機能コード
指定ステップへジャンプdm.Goto("my_new_step");
「話そう」オプションを追加dm.InjectUniqueRumor();
一時的な会話行を追加dm.AddTempTalk("topic", "actor", "jump");
Chara インスタンスを取得var chara = dm.GetChara("tg");
パーティに勧誘chara.MakeAlly();
レベルを変更chara.SetLv(chara.LV + 5);

ヘルプが必要な場合は Elona Discord で @freshcloth まで、または メール でお問い合わせください。

This project is an unofficial documentation site and is not affiliated with, endorsed by, or associated with Elin or Lafrontier / Noa. All trademarks are the property of their respective owners.