スクリプトの編集


スクリプト

  • スクリプトはLuaというスクリプト言語で記述されています。
スクリプト
スクリプト
  • コンティニューを利用するか、どのキャラクターを育成し、継承ウマ娘、サポートキャラの編成をどうするのか等の基本的な設定と、ウマ娘の育成に関わる各トレーニングや選択肢、スキル、レースの採点方法や、採点したスコアからトレーニングを行うかお休みをとるかレースに出走するかなどの実行する行動の判断方法、習得するスキルの条件設定等、AIの処理部分は外部ファイルとして保存しており編集が可能となっています。
  • この外部ファイルとして保存されているスクリプトを編集することによってツール上で設定した優先度等の扱い方を変更することが可能なので、ウマ娘の育成の肝になるAIを自由にカスタマイズすることができ、自分好みの育成方法を組み上げることができます。
  • 『ステータス上昇値が上振れしている場合は体力が減っていてもトレーニングするようにしたい』『序盤はスキルの習得を行わずにコストを抑えられる後半に習得するようにしたい』『円弧のマエストロなど特定のスキルだけ先に習得したい』『あんし~ん笹針師の選ぶ選択肢を時期によって変更したい』といった事もスクリプトを編集することによって自由に実装することができます。
  • 拡張モードを有効にしていない場合スクリプトの閲覧はできますが、外部スクリプトの読み込み処理を行っていませんので編集をしても反映はされません。

Luaについて

  • Luaは主にゲームに組み込んで利用されているスクリプト言語で、メジャーなものなので検索すれば解説サイトがいくらでもでてくるかと思います。
  • 細かな仕様等を知りたい場合は解説サイトやリファレンスを参考にして下さい。
  • 下記はWikipediaのLuaのページです。コード例なども書かれているので参考程度にご覧ください。
  • ここでは、実際どのようにスクリプトをカスタマイズするのかをメインに解説します。
  • プログラムやスクリプトについて一切知識がなくても問題がないようにスクリプトファイルに設定方法を詳細に記述しております。
  • AIのカスタマイズに関しては『関数』『変数』『テーブル』『条件分岐』についてなんとなく分かる程度の基礎知識をつければ変更が可能になっています。
  • スクリプトファイルの拡張子は『.lua』になっています。まずはデフォルトの処理を行っている『設定:デフォルト.lua』をメモ帳等のテキストエディタで開いて確認して下さい。
  • スクリプトの閲覧、編集にはソースコードの編集に特化した『Visual Studio Code』等のテキストエディタを利用することを推奨します。

Visual Studio Code

https://code.visualstudio.com


『設定:デフォルト.lua』と『設定.lua』

  • スクリプトファイルは『設定:デフォルト.lua』と『設定.lua』が用意されていますが、『設定:デフォルト.lua』にはデフォルトの処理が記述されており、『設定.lua』にはコメントのみしか記述していません(luaファイルが存在しない場合は初回起動時に自動的に作成されますので一度起動して下さい)
  • ソフトをアップデートする際、更新により『設定:デフォルト.lua』に変更があった場合に各自による編集と衝突が起きないようにこのような仕様になっています。
  • 先頭のコメントに記述しているように、スクリプトを編集する場合は『設定:デフォルト.lua』の方を直接編集するのではなく、変更したい部分を『設定:デフォルト.lua』から『設定.lua』にコピー&ペーストしてから編集を行います。
コピー&ペーストしてから編集
コピー&ペーストしてから編集
  • 『設定.lua』で設定されたものは『設定:デフォルト.lua』で設定されているものより優先される(上書きされる)仕組みになっています。
  • 『設定:デフォルト.lua』は変更しても起動時にデフォルトのファイルに上書きされるのでご注意下さい。

基本設定

  • スクリプトファイルの設定項目は大きく分けて2種類あり、基本設定と関数設定があります。
  • 基本設定は『CONFIG.○○○』という各項目に数字や文字などを入力するだけのもので、書かれているコメント通りに設定すればよいだけなので特に解説の必要はないかと思います。
  • 詳しくは『設定:デフォルト.lua』を開き、コメントの方を参照してください。
全自動育成モードの設定
全自動育成モードの設定
  • 基本設定は以下のように分類されています
    • 各種全般の設定
    • bot検知対策の設定
    • 全自動育成モードの設定
    • レース自動出走の設定
    • 画面保存の設定
    • 待機時間の設定
    • おまけ機能関連の設定
  • 必要に応じて『設定:デフォルト.lua』から『設定.lua』へコピー&ペーストをして変更して下さい。
  • 基本設定は『ユーザー定義定数』を利用することによって、スクリプトを編集しなくてもツール上から設定できるようになります。
ユーザー定義定数画面
ユーザー定義定数画面
  • また、『プリセット』を利用することにより、あらかじめ設定したユーザー定義定数を切り替えることができるます。

関数設定

  • 関数設定は採点方法や実行する行動などを処理しているAIをカスタマイズする部分で、編集を行うにはスクリプトの基本的な知識がある程度必要になるかと思います。
  • こちらに関してもコメントにて詳しく解説しているので、まずは『設定:デフォルト.lua』を開き、コメントの方を参照してください。
関数設定についての解説
関数設定についての解説
  • ここではコンテニューするかどうかを決定するisContinue関数を例にして関数の設定方法を解説します。
  • 『関数』『変数』『条件分岐』についてなんとなく分かる程度の基礎知識があることを前提に解説します。

isContinue関数

  • isContinue関数はコンティニューのポップアップが表示された時に呼び出され、引数としてisFree(1日1回消費なしか)とclockCount(目覚まし時計の所持数)が渡されます。
  • 戻り値として true を返すとコンティニューを行い、 false を返すとコンティニューせずにゲームオーバーになります。
isContinue関数
isContinue関数

-- 基本設定でコンティニューの利用をしない設定にしている場合はコンティニューしない

if CONFIG.CONTINUE == false then

    return false

  • この部分は基本設定で CONFIG.CONTINUE を false に設定していると必ずコンティニューを行わないようにしています。
  • CONFIG.CONTINUE を true に設定していると以降の処理が実行されます。
  • 関数を変更しなくても基本設定を変更するだけで挙動が変わるようにしています。

-- 目覚まし時計の数が0の場合はコンティニューしない

elseif clockCount == 0 then

    return false

  • この部分は目覚まし時計が0の場合はコンティニューを行わないようにしています。
  • この部分を削除すると目覚まし時計の数のチェックは行わないようになります。必要に応じて削除・変更して下さい。
  • 目覚まし時計の数が0の状態で true を返した場合はジュエルを消費してコンティニューを行います。

-- コンティニュー回数も加味して勝率の算出

local winRate = 0

local raceCount = g_status[STATUS.RACE_COUNT] + g_status[STATUS.CONTINUE_COUNT]

if raceCount > 0 then

    winRate = (g_status[STATUS.RACE_WIN_COUNT] * 100) / raceCount

end

  • ここではこれまで出走したレースの勝率を算出しています。
  • localはローカル変数を定義する時に記述します。
  • g_status[STATUS.RACE_COUNT]にはこれまでのレースの出走数、g_status[STATUS.RACE_WIN_COUNT]にはこれまでのレースの勝利数、g_status[STATUS.CONTINUE_COUNT]にはコンティニューした回数が入っています。
  • まずローカル変数 winRate を定義して0を代入しています
  • 次にローカル変数 raceCount を定義してレースの出走数とコンティニューした回数を足した値を代入しています。
  • raceCount が0より大きい場合は勝利数×100÷ raceCount で勝率を求めて winRate に代入します。
  • コンティニュー回数が増えると勝率は下がることになります。
  • raceCountが0だと0で割ってしまうことになるので0より大きいかチェックしています(Luaの場合0で割ってもエラーになりませんが一応チェックしています)

-- 勝率が70%以上かつ出走数が3回以上の場合はコンティニュー

if winRate >= 70 and g_status[STATUS.RACE_COUNT] >= 3 then

    return true

  • 先程求めた勝率が70以上かつレースの出走数が3回以上ならコンティニューを行います。
  • 勝率が悪い場合はコンティニューするのは微妙だと判断してこのような処理にしています。

-- シニア級の場合は勝率50%以上でコンティニュー

elseif winRate >= 50 and g_status[STATUS.SEASON].index >= SEASON.SENIOR_1A.index then

    return true

  • シニア級まで来たら育成に時間が掛かっているので、コンティニューを行う勝率を50%まで下げて判定を緩めています。
  • g_status[STATUS.SEASON]には現在の期間が入っており、g_status[STATUS.SEASON].indexでツール上で設定しているインデックスを参照できます。
  • また、『SEASON.SENIOR_1A』という定数(正確には変数)もツール上で設定しているものになります。

-- URAファイナルズの場合はコンティニュー

elseif g_status[STATUS.SEASON].index == SEASON.FINALS.index then

    return true

  • URAファイナルズまで来たら勝率に関係なくコンティニューを行うようにしています。
  • 以上がisContinue関数がデフォルトで行っている処理になります。
  • この関数を編集することによって条件は自由に変更することができますので、必要に応じて『設定:デフォルト.lua』から『設定.lua』へコピー&ペーストをして編集して下さい。

スクリプトのエラー

  • スクリプトを編集・保存し、実行を開始するとログに『!!エラー!!○○○○』と表示されてスクリプトが停止する場合があります。
  • これは、編集したスクリプトの記述にミスがあるためです。
実行開始時のエラー
実行開始時のエラー
  • エラーが発生するのは実行開始時だけではなく、実行中に発生する場合もあります。
実行中のエラー
実行中のエラー
  • エラー内容は英語で出力されますが、『[string "設定"]:○○』の○○の部分がエラーが発生している行番号になるので、表示されている行付近を確認してエラーを修正して下さい。
  • 場合によっては表示されている行番号より以前にバグがある場合もあるのでエラーメッセージを頼りに修正して下さい。
78行目でエラーが出ているが41行目のタイプミスが原因
78行目でエラーが出ているが41行目のタイプミスが原因

print関数とabort関数

  • 実行中に変数の内容を確認したい場合はprint関数を使うことによってログに出力することができます。
  • これはエラー発生時に修正する時にも役に立つ(いわゆるprintデバッグです)ので、実行時にエラーが発生した時に活用して下さい。
  • また、変数の内容を表示しても実行中だとログが流れていってしまうのでスクリプトを強制的に停止したい事もあるかと思います。
  • そういった場合は、abort関数を呼び出すと強制終了するようになっていますので、必要があれば利用して下さい。
  • abort関数を呼び出すと!!エラー!!〇〇強制終了〇〇のようにログに表示されます。
print関数とabort関数
print関数とabort関数

スクリプトファイルの保存形式

  • スクリプトファイルはマルチバイト文字(日本語の文字)を正常に処理させるために文字コードを『UTF-8』として保存しています。
  • 文字コードを『Shift-JIS(ANSI)』にして保存すると正常に動作しなくなる可能性があるので必ず『UTF-8』で保存して下さい。
メモ帳で保存する時の文字コードの指定
メモ帳で保存する時の文字コードの指定
  • 通常、テキストエディタでスクリプトを読み込んだ時に『UTF-8』として認識されるので保存する時も『UTF-8』として自動的に保存されます。
  • 従って、そこまで気をつける必要はありませんが一応留意してください。