【伺か】更新しやすい形で好感度と関係性を実装した話。【yaya】

ukagaka

前回

【伺か】メンテナンスモードを作ってみる。【yaya】 — 異風堂々

今回すること

今後、下記のような形のテンプレートを作って更新し続けれるようにしました。
できること

  • Nを現在の段階を表す数字に書き換えるだけで、段階ごとのトークの変化を簡単に設定できます。
  • フラグを段階ごとに管理できるので、どのイベントを処理できていないかの管理・デバッグが容易になります。
  • ゴーストが未完成の状態で配布しても進展の管理と続きの書き足しが容易です。
//現在の関係性 
CharA.Name_N { 
    "" 
} 


//初期化 
CharA.SetUp_N { 
} 


//デバッグメニューで個別のフラグを変更するためのメニュー 
CharA.CheatFlagMenu_N { 
} 


//特定のイベントを消化したかどうか。 
//全て満たしているとき1を返す。 
CharA.CheckFlagList_N{ 
    _flag = 1 
    _flag 
} 



CharA.Upgrade_N { 
    //次の移行先X 
    CharA.Phase = X 
    CharA.Count = 0 
    EVAL( "CharA.SetUp_%( CharA.Phase )" ) 
} 


//現在のフェーズの撫でトークを返す。 
CharA.Nade_N { 
} 

実装と解説

ファイル構成

他の辞書ファイル群のフォルダに二つのファイルを追加する。

新しくPhaseFilesフォルダを作成します。
中身にdic_CharA_Config.ukadic_CharA_Phase0.ukaを作成します。

└─ghost 
   └─master 
       ├─dll 
       ├─profile 
       ├─system 
       ├─PhaseFiles 
       │    │─dic_CharA_Config.uka 
       │    └─dic_CharA_Phase0.uka 
       ├─ ... 
       └─dic_XXX.uka 

yaya.txtに登録する。

ディレクトリごと読み込まれるように下記を追記します。

dicdir, PhaseFiles 

dic_CharA_Config.ukaの中身

一度書いてしまえばこのファイルをいじる必要はありません。
メンテナンスモードは前回の 【伺か】メンテナンスモードを作ってみる。【yaya】 — 異風堂々 を参考にしてください。
メンテナンスモード有効時に現在のゴーストとの関係性と好感度を表示できるようにしています。

CharA.LoadConfig { 
    //キャラの好感度 
    if ( ISVAR( "CharA.Count" ) == 0 ) { 
        CharA.Count = 0 
    } 
    //キャラの進行段階 
    if ( ISVAR( "CharA.Phase" ) == 0 ) { 
        CharA.Phase = 0 
    } 
    //好感度最大値 
    CharA.CountMax = 100 
    //一度に上がる量 
    CharA.AddCount = 5 
} 


CharA.UnloadConfig { 
    ERASEVAR( 'CharA.CountMax' ) 
    ERASEVAR( 'CharA.AddCount' ) 
} 


//撫で時、呼ばれるように。 
CharA.CheckPhase { 

    _flag = CharA.CheckUpgrade() 
    //条件をすべて満たしている場合アップデートをする。 
    if ( _flag == 0 ){ 
        CharA.Count = CharA.CountMax 
        EVAL( "CharA.Upgrade_%( CharA.Phase )" ) 

    } else { 
        CharA.Count = CharA.Count + CharA.AddCount 
        //メンテナンスモードが有効ならば 
        if ( ISFUNC( "DebugModeFunction" ) == 1 ) { 

            _flagText = "" 
            if ( _flag == 1 ) { 
                _flagText = "好感度が不足している。\n" 

            } elseif ( _flag == 2 ) { 
                _flagText = "Upgrade関数が用意されていない。\n" 

            } elseif ( _flag == 3 ) { 
                _flagText = "他のフラグが足りていない。\n" 
            } 

            _logText  = "現在の好感度 : " + CharA.Count + "\n現在の段階 : " + CharA.Phase + "\n" 
            _text = EVAL( "CharA.Nade_%( CharA.Phase )" ) 

            _text = _flagText + _logText + _text 
            _text 

        } else { 
            //撫で反応トーク 
            EVAL( "CharA.Nade_%( CharA.Phase )" ) 
        } 
    } 
} 


// 0 : 進行可能である。 
// 1 : 好感度不足 
// 2 : Upgradeが用意されていない。 
// 3 : ほかのフラグが足りない。 
CharA.CheckUpgrade { 
    _flag = 0 
    //他のフラグを満たしていない。 
    if ( EVAL( "CharA.CheckFlagList_%( CharA.Phase )" ) != 1 ) { 
        _flag = 3 
    } 
    //現在のフェーズにUpgrade関数が存在しない。 
    if ( ISFUNC( "CharA.Upgrade_%( CharA.Phase )" ) != 1 ) { 
        _flag = 2 
    } 
    //現在の好感度がマックスじゃない。 
    if ( CharA.CountMax > CharA.Count ) { 
        _flag = 1 
    } 
    _flag 
} 
  • CharA.LoadConfig
    CharA.Phase : 現在のゴーストとユーザの関係Nです。
    この数字をいじることによって 関係性を変更していきます。

  • CharA.CheckPhase
    CharA.CheckUpgrade関数が呼ばれ、関係性を更新できる状態か確かめます。
    未達の場合、撫でトークとして
    CharA.Nade_Nが呼ばれます。
    更新可能な状態ならば、CharA.Upgrade_Nが呼ばれます。

  • CharA.CheckUpgrade
    更新可能かチェックする関数です。
    確認項目は,

    • 好感度がMAXかどうか
    • 次の関係性にいたるためのUpgrade関数が用意されているかどうか。
      無ければ現在の状況が保留されるため、未完成ゴーストを安心して送り出せます。
    • 他のそれぞれの段階に用意されたflagを満たしているかどうか。
      フラグリストをそれぞれの段階のファイルで管理するため混乱しません

初期化できるように登録しておく。

それぞれ読み込まれるようにOnGhostLoadとOnGhostUnloadに追記します。
【コピペで作る】うちの子を伺かのゴーストにする方法【yaya】 — 異風堂々から始めてくださった方はdic_Boot.ukaに追記する関数があります。

OnGhostLoad { 
    //追加 
    CharA.LoadConfig() 
} 
OnGhostUnload { 
    //追加 
    CharA.UnloadConfig() 
} 

撫で時に機能するようにする。

【コピペで作る】うちの子を伺かのゴーストにする方法【yaya】 — 異風堂々から始めてくださった方はdic_MouseStroke.ukaに追記する関数があります。

MouseStroke_0Head { 
    CharA.CheckPhase() 
} 

dic_CharA_Phase0.ukaの中身

//現在の関係性の名称。 
//EVAL( "CharA.Name_%( CharA.Phase )" ) 
CharA.Name_0 { 
    "赤の他人" 
} 


//このフェーズで使用するすべてのフラグをリストアップ 
//flagの命名規則 CharA.FlagName_N 
CharA.SetUp_0 { 
    //CharA.arekore_0 = 0 
} 


//デバッグメニューで個別のフラグを変更するためのメニュー 
CharA.CheatFlagMenu_0 { 
} 


//特定のイベントを消化したかどうか。 
//全て満たしているとき1を返す。 
CharA.CheckFlagList_0{ 
    _flag = 1 
    //if ( CharA.FlagName_N != 1 ){ 
    //    _flag = 0 
    //} 
    _flag 
} 


//現在のフェーズからフェーズアップさせる関数。 
//実装されてなければここで止まる。 
//実際にアップグレードするかどうかはここで処理させる。 
//次に移行する段階を指定する。 
CharA.Upgrade_0 { 
    //"条件を満たした。" 
    CharA.Phase = 1 
    CharA.Count = 0 
    EVAL( "CharA.SetUp_%( CharA.Phase )" ) 
} 


//現在のフェーズの撫でトークを返す。 
CharA.Nade_0 { 
    _text = "えへへ" 
    _text 
} 
  • CharA.SetUp_N
    使用するフラグを一通り初期化する関数。
    Upgrade時に一緒に呼ばれる。

  • CharA.CheatFlagMenu_N
    チートメニューでほかのフラグを手動変更するための関数。
    メニューの実装とフラグの数だけ項目を設置。
    メンテナンスモード用。

  • CharA.CheckFlagList_N
    使用しているフラグをここで一括チェックするための関数
    問題なければ1

  • CharA.Upgrade_N
    この関数自体をコメントアウトしておけば関係性の進展を止めることができる。
    呼ばれた際は次のPhaseに移行する。
    ここで分岐させておけば友人ルートや恋人ルートなど、ノベルゲーチックなことができるようになる。
    移行後、次の段階のSetUp_Nが呼ばれる。

以降、dic_CharA_PhaseN.ukaファイルを作成して追加し続ければ快適な管理ができると思います。

次回

今回関数名だけ用意した、CharA.CheatFlagMenu_Nを編集し、
メンテナンスモードで直接フラグの管理をできるように実装します。
【伺か】メンテナンスモードを利用して現在の好感度やシナリオ進行度をいじれるようにしてみる【yaya】 — 異風堂々