Using C# Script

Using C# Scripts #

You can write part of the matching process using C# scripts to set up detailed conditions. This feature is primarily intended for use in conjunction with LiveSplit.


There are potentially disruptive specification changes.
スクリプトの扱い、特に第三者のものを使用する場合は十分に気をつけて使用してください。

General Flow #

RunLeash handles screen capture and similarity calculation, while the script performs similarity judgment processing and timer operations.

How to Use #

Open Settings → Other tab and check “Use C# script instead of normal monitoring”. You can use scripts by placing a script.cs file in the target profile folder.

スクリプトを編集する場合、
RunLeashを開いていない場合は
profile\対象のプロファイル\script.cs
RunLeashを開いたいる場合は
variousdata\current\script.cs
を編集してください。

基本形 #

/* 外部dllを記述する場合は_Runleash.exeのある場所にdllを置き、#r と using 両方書く */
#r "OpenCvSharp.dll"

using OpenCvSharp;

/* 各メソッドを横断して変数を使用したい場合は、メソッド外で宣言する */
int param; 

/// <summary>
/// 監視をスタートしたときに1回だけ行う処理
/// </summary>
public void Initialize() 
{
    param = 10;
    app.Print("初期化完了");
}

/// <summary>
/// 常に行う処理(類似度算出後に実行される)
/// </summary>
public void Update() 
{
    param ++;
    app.Print($"param:{param}");
}

/// <summary>
/// Split判定に関わるものはここに書く(類似度算出後に実行される)
/// </summary>
public void Split() 
{
    if (currentSegment == 1 && splitSimilarity[1] >= splitTable[1].threshold )
    {
        app.Split(1); 
        return;
    }
    else if (currentSegment == 2 && ...)
    {
        ...
    } 
}

/// <summary>
/// Reset判定に関わるものはここに書く(類似度算出後に実行される)
/// </summary>
public void Reset() 
{
    if (splitSimilarity[0] >= splitTable[0].threshold)
    {
        app.Reset();
    }
}

/// <summary>
/// Loading判定に関わるものはここに書く(類似度算出後に実行される)
/// </summary>
public void Loading() 
{
    if (loadingSimilarity[1] >= loadingTable[1].threshold && app.SendLiveSplitCommand("getcurrenttimerphase") == "Running")
    {
        app.SendCommand("pausegametime");
    }
}

Blocks #

The script consists of several blocks:

RunLeashの設定で自動化を有効にしている項目(Split/Reset/Loading)に応じてブロックを記述してください。
Initialize、Updateブロックは使用しない場合でも記述する必要があります。

Initialize #

Write processes to be executed only once when monitoring starts.

Update #

Write processes to be executed constantly during monitoring (executed after similarity calculation).

Split #

Write Split-related judgments here (executed after similarity calculation).
Sleep中は実行されません。

Reset #

Write Reset-related judgments here (executed after similarity calculation).
Resetしてから最初のSplitが実行されるまでは動作しません。

Loading #

Write Loading-related judgments here (executed after similarity calculation).

Available Parameters #

You can use parameters listed in the RunLeash table, current segment number, current similarity, and past similarities in the script.

splitSimilarity[index] #

Current similarity (Split, Reset)
index:現在の区間の対象の画像番号(複数枚同時監視を使用していない場合は1固定)

loadingSimilarity[index] #

Current similarity (Loading)
index:表のNo列の値

currentSegment #

Current segment

capturedImage #

The latest captured image(使用するには設定を変更する必要があります)

OpenCVSharpのMat型が返ってきます。Bitmap型で扱いたい場合は、以下のようなコードを記述してください。

#r "OpenCvSharp.dll"
#r "OpenCvSharp.Extensions.dll"

using OpenCvSharp;
using OpenCvSharp.Extensions;

...
using Bitmap bmp = BitmapConverter.ToBitmap(capturedImage);

splitTable[index].xxx #

表のパラメーターを取得(Split, Reset)。
index:現在の区間の対象の画像番号(複数枚同時監視を使用していない場合は1固定)
xxx:列名(左から順に、comment1, comment2, comment3, segment, loop, andor, method, key, adjTable, adjTimer, seek, mask, audio, threshold, pn, sleepTime, timing, delay, thresholdN, colorTolerance, filter, colorR, colorG, colorB, akaze, px, py, sx, sy, pxScene, pyScene, sxScene, syScene, ltx, lty, rbx, rby)

型はcomment1, comment2, comment3, pn, filterがstring、seek, threshold, sleepTime, thresholdNがdouble、残りはintです。

loadingTable[index].xxx #

表のパラメーターを取得(Loading)
index:表のNo列の値
xxx:列名(左から順に、no, enable, comment, inFlagNo, inFlagStatus, inFlagKeyNo, inFlagKeyStatus, inKey, inFlagLiveSplitNo, inFlagLiveSplitStatus, inLiveSplitNo, inLiveSplitTime, outFlag, outFlagTpl, outFlagNo, outFlagStatus, outFlagKeyNo, outFlagKeyStatus, outKey, outFlagLiveSplitNo, outFlagLiveSplitStatus, outLiveSplitNo, outLiveSplitTime, delay, init, method, mask, threshold, thresholdN, pn, colorTolerance, colorR, colorG, colorB, filter, akaze, px, py, sx, sy, pxScene, pyScene, sxScene, syScene, ltx, lty, rbx, rby)

型はcomment, init, pn, filterがstring、inLiveSplitTime, outLiveSplitTime, threshold, thresholdNがdouble、残りはintです。

RunLeash-specific Commands (Methods) #

Use methods in the form of app.XXX();

app.Split(n); #

タイマーをSplitします。
n:現在の区間の対象の画像番号(複数枚同時監視を使用していない場合は1固定)
 マッチング後の追加処理(ループ回数、指定時間待機、シーンチェンジ待機)などはRunLeash側のパラメーターが使用されるため、複数枚同時監視を使用している場合は適切な番号を指定してください。

app.Reset(); #

Reset timer.

app.Pause(); #

Pause timer.

app.Resume(); #

Resume timer.

app.Undo(); #

Undo timer.

app.Skip(); #

Skip timer.

app.SendLiveSplitCommand(command); #

LiveSplitを使用している場合、LiveSplitを操作するコマンドを送信します。
参考:https://github.com/LiveSplit/LiveSplit/tree/master?tab=readme-ov-file#commands

使用できるコマンド

  • startorsplit
  • split
  • unsplit
  • skipsplit
  • pause
  • resume
  • reset
  • starttimer
  • setgametime TIME
  • setloadingtimes TIME
  • pausegametime
  • unpausegametime
  • alwayspausegametime
  • setcomparison COMPARISON
  • switchto realtime
  • switchto gametime
  • setsplitname INDEX NAME
  • setcurrentsplitname NAME

タイムの戻り値があるコマンド(string型で返ってきます)

  • getdelta
  • getdelta COMPARISON
  • getlastsplittime
  • getcomparisonsplittime
  • getcurrentrealtime
  • getcurrentgametime
  • getcurrenttime
  • getfinaltime
  • getfinaltime COMPARISON
  • getpredictedtime COMPARISON
  • getbestpossibletime

その他のコマンド(string型で返ってきます)

  • getsplitindex
  • getcurrentsplitname
  • getprevioussplitname
  • getcurrenttimerphase

app.SplitOldSimilarity(index, milliSecondsAgo); #

(Split) References past similarity.

  • index:Image number for the current segment (Input 1 if not using multiple simultaneous monitoring)
  • milliSecondsAgo: Specify how many milliseconds ago to reference the similarity
    With 60fps monitoring, you can go back approximately 60 seconds.

app.LoadingOldSimilarity(index, milliSecondsAgo); #

(Loading) References past similarity.

  • index: Image number for the current segment (Input 1 if not using multiple simultaneous monitoring)
  • milliSecondsAgo: Specify how many milliseconds ago to reference the similarity
    With 60fps monitoring, you can go back approximately 60 seconds.

app.Print(string); #

Displays the specified string or variable in RunLeash’s Log.

app.GetImage(); #

Retrieves the latest captured image.

This returns an OpenCVSharp Mat type. If you want to handle it as a Bitmap type, use the following code:

#r "OpenCvSharp.dll"
#r "OpenCvSharp.Extensions.dll"

using OpenCvSharp;
using OpenCvSharp.Extensions;

...

using Mat src = app.GetImage();
using Bitmap bmp = BitmapConverter.ToBitmap(src);

app.ApplyFilter(filter, src, dst); #

画像にフィルターを適用します。

  • filter:フィルター
  • src, dst:Mat型の画像データ

使用できるフィルターはこちらを参照してください。

使用例:

#r "OpenCvSharp.dll"
using OpenCvSharp;

...

using Mat src = app.GetImage();
app.ApplyFilter("{Grayscale}", src, src);
src.SaveImage("save.png");

その他 #

C#のバージョンは11ですが、フレームワークが.NET Frameworkのため、使用できない機能があります。
参考:https://qiita.com/kenichiuda/items/fada6068ea265fd6a389