【伺か】メンテナンスモードを利用して現在の好感度やシナリオ進行度をいじれるようにしてみる【yaya】

ukagaka

前回

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

今回すること

ukagaka_Demo.gif
このように、フラグのon/off管理、好感度の直接入力ができるようにしてみました。

前回と細々とした修正点があるので、追記ではなくまとめて掲載します。

dic_CharA_Phase0.uka

今回はサンプルとしてCharA.NextFlagX_0を進行に必須イベントフラグとしています。
好きなだけ増やしても問題なく管理できます。

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


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


//デバッグメニューで個別のフラグを変更するためのメニュー 
//\![*]\q[現在の  FLAG_NAME : %(FLAG_NAME),OnCharA.ReversalFlag,FLAG_NAME,%(FLAG_NAME)]\n/ 
CharA.CheatFlagMenu_0 { 
    "\_q/ 
    \n[half]/ 
     【機能】\n/ 
    \![*]\q[好感度を入力 / 現在 : %(CharA.Count),CharA.CallInputBox]\n/ 
    \![*]\q[現在のCharA.NextFlagX_0 : %(CharA.NextFlagX_0),OnCharA.ReversalFlag,CharA.NextFlagX_0,%(CharA.NextFlagX_0)]\n/ 
    \![*]\q[特にない,]\n/ 
    \n[half]\e" 
} 


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


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


//現在のフェーズの撫でトークを返す。 
CharA.Nade_0 { 
    _text = "トークテキストサンプル" 
    _text 
} 
  • CharA.CheatFlagMenu_0
    フラグを管理するメニューです。
    管理が必要なフラグの数だけ項目を増やせば制御できます。

dic_CharA_Config.uka

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 ){ 
        EVAL( "CharA.Upgrade_%( CharA.Phase )" ) 

    } else { 
        CharA.Count = CharA.Count + CharA.AddCount 
        if ( CharA.Count > CharA.CountMax ) { 
            CharA.Count = CharA.CountMax 
        } 

        //メンテナンスモードが有効ならば 
        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.CallCheatFlagMenu { 
    if ( ISFUNC( "CharA.CheatFlagMenu_%(CharA.Phase)" ) == 1 ) { 
        EVAL( "CharA.CheatFlagMenu_%(CharA.Phase)" ) 

    //CheatFlagMenuが存在しなかった場合の処理 
    } else { 
        CharA.CheatFlagMenu_None() 
    } 
} 


//デバッグメニューを用意していなかった場合 
CharA.CheatFlagMenu_None { 
    _phaseName = EVAL( "CharA.Name_%( CharA.Phase )" ) 
    "現在の好感度 : %( CharA.Count )\n/ 
    現在の段階 : %( CharA.Phase ) \n/ 
    関係性 : %( _phaseName ) " 
} 


//表示時間無制限。初期値100 
CharA.CallInputBox { 
    "\![open,inputbox,OnCharA.SetCount,0,100]" 
} 


//半角数字を入力する必要がある。 
OnCharA.SetCount { 
    CharA.Count = TOINT( reference0 ) 
    CharA.CallCheatFlagMenu 
} 


//引数 0 : 変数名 
//引数 1 : 現在の内容 
OnCharA.ReversalFlag { 

    if ( EVAL( reference1 ) == 0 ) { 
        EVAL( "%(reference0) = 1" ) 

    } elseif ( EVAL( reference1 ) == 1 ) { 
        EVAL( "%(reference0) = 0" ) 

    } else { 
        //errorの為0を挿入。 
        //flagが初期化されていなかった場合など。 
        EVAL( "%(reference0) = 0" ) 
    } 
    //menu再呼び出し 
    CharA.CallCheatFlagMenu 
} 

今回追加した関数について

  • CharA.CallCheatFlagMenu
    関係性毎に呼び出されるmenuを振り分けます。
    CharA.CheatFlagMenu_Nをdic_CharA_PhaseN関数をそれぞれ用意しておく必要があります。

  • CharA.CheatFlagMenu_None
    CharA.CheatFlagMenu_Nが存在しなかった場合に呼ばれる汎用メニューです。

  • CharA.CallInputBox
    好感度を挿入するバルーンを呼びます。
    CharA.CheatFlagMenu_Nから呼ぶことを想定しています。

  • OnCharA.ReversalFlag
    受け取ったフラグを反転させます。
    同じく、CharA.CheatFlagMenu_Nから呼ぶことを想定しています。

デバッグメニューを追加

以前作成したdic_Menu.ukaのメンテナンスモードのメニューに項目を追加する。

DebugMenu { 
    "\_q/ 
    \n[half]/ 
     【デバッグ】\n/ 
    \![*]\q[CharACall,CharA.CallCheatFlagMenu]\n/ 
    \![*]\q[特にない,]\n/ 
    \n[half]\e" 
} 

実装はここまでです。
これで後はコピペで進行度の管理ができるようになります。

次回

次はGit Hubを使ってゴーストの公開とネットワーク更新を予定しています。