aoirint

技術とさぶかる

Steamデスクトップクライアントで古いバージョンのゲームをダウンロードする

Steamデスクトップクライアントでコンソールを開く の手順に従って、Steamクライアントのコンソールを開きます。 以下は、ゲームの指定したバージョンをダウンロードするコマンドです。このコマンドによってダウンロードされたゲームは、通常のインストール先C:\Program Files (x86)\Steam\steamapps\commonではなく、専用のダウンロードディレクトリC:\Program Files (x86)\Steam\steamapps\contentに格納されます。 ] download_depot download_depot <appid> <depotid> [<target manifestid>] [<delta manifestid>] : download a single depot appidは、ゲームのプロパティを開くと表示されるApp IDです。SteamストアページのURLにも含まれています。また、SteamDBでも確認できます。 depotid、target manifestidは、SteamDB(非公式データベースサイト)を利用して調べます。delta manifestidは今回使用せず、省略します。 Lethal Company Depots · SteamDB Lethal CompanyのDepotsのうち、228988はVisual C++ 2019 Redistributableというランタイムライブラリであり、1966721がゲーム本体です。 1966721をクリックして、Manifestsタブを開きます。 ManifestIDがゲームバージョンに対応しています。 Lethal Companyは、ときどきゲーム内に表示されるバージョン番号を変えずにホットフィックスや季節イベントをリリースすることや、ゲーム内に表示されるバージョンとリリースノートのバージョンが異なっていることがあるため、リリース日も参考にして目的のバージョンを特定します。 SteamDBで古いバージョンのManifestを調べるには、Steamアカウント連携でログインする必要があります。 また、コミュニティでManifest IDが共有されていることもあります。 競技プレイなどに参加するときは、Verifierコミュニティのガイドに従ってManifest IDを選択するとよいでしょう。 バージョン リリース日 (UTC) Manifest ID v73 2025-10-04 1749099131234587692 v72 2025-06-18 4861510547912001926 v64 2024-09-05 8158077314512521071 v62 2024-08-21 2681997312468718444 v56 2024-07-07 6648293528411358330 v50 2024-04-16 2961956797830002840 v49 2024-01-09 7525563530173177311 v45 2023-12-10 7637156099460715726 v40 2023-11-12 8596342981027780916 ※ 2025-10-02より古いバージョンのUnityランタイムが使われているゲームには、 CVE-2025-59489 脆弱性(Unity公式アドバイザリー、発見者および所属組織による日本語記事、Steamによる開発者向け記事)が存在します。SteamのカスタムURIスキームを利用した攻撃は、最新のSteamクライアントによってブロックされますが、ゲームによってその他の攻撃経路が存在する可能性があります。古いバージョンのゲームをダウンロードして利用する場合は、そのような攻撃手法が既に公開され、悪用されている可能性があるリスクを十分に理解した上で自己責任で行ってください。 ...

2025年12月30日 · aoirint

Steamデスクトップクライアントでコンソールを開く

1回限り(プロトコルハンドラー) Steamクライアントが起動中であることを確認した上で、以下のURLをGoogle Chromeなど通常のWebブラウザで開きます。 steam://nav/console WebブラウザがSteamを開くかどうか確認するダイアログを表示するので、「Steamを開く」などを選択して許可すると、Steamクライアント側でコンソールが開きます。 1回限り(起動オプション) Steamによって起動中のゲームやツールがないことを確認した上で、タスクバーの通知領域にあるSteamクライアントのアイコンから「Steamを終了」を選択して、Steamクライアントを終了します。 または、Steamクライアント画面の左上の「Steam」メニューから「終了」を選択して、Steamクライアントを終了します。 Windows + Rキーで「ファイル名を指定して実行」ダイアログを開き、以下のコマンドを入力して、Steamクライアントを起動します。 "C:\Program Files (x86)\Steam\Steam.exe" -dev 上部のタブに「コンソール」タブが表示され、Steamクライアントのコンソールが有効になります。 常設化 ※ 以下の手順は、Windowsのレジストリを編集するため、操作を誤るとシステムに不具合が発生する可能性があります。また、Steam公式にサポートされている方法ではなく、将来Steamクライアントが起動しなくなるなどの問題が発生する可能性があります。そのような場合に、自らの責任で対処できる方のみ実施するようにしてください。 タスクマネージャーの「スタートアップ アプリ」タブでSteamクライアントのエントリを確認すると、 以下のようなコマンドがレジストリから登録されていることがわかります。 "C:\Program Files (x86)\Steam\Steam.exe" -silent Steamのスタートアップエントリは、以下のレジストリキーに格納されています。 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run\Steam このエントリの値を以下のように編集して、Steamクライアントの自動起動時にコンソールを有効にすることができます。 "C:\Program Files (x86)\Steam\Steam.exe" -silent -dev PC起動後にSteamクライアントを手動で再起動したときにもコンソールを有効にするには、以下のショートカットのプロパティを編集し、リンク先に-devを追加します。 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Steam\Steam.lnk %APPDATA%\Roaming\Microsoft\Windows\Start Menu\Programs\Steam\Steam.lnk "C:\Program Files (x86)\Steam\steam.exe" -dev 参考 What does the hidden steam console actually do? : r/Steam

2025年12月30日 · aoirint

VSCode PS1ファイルを開きながら統合ターミナルを開いたとき、PowerShell Extensionsが自動起動しないようにする

VSCodeのターミナルパネルでランダムにPowerShell Extensionsが自動的に起動してしまうことに悩まされていたので、その対処法をメモしておきます。 Windows 11 25H2 PowerShell 7.5 VSCode 1.106 VSCode拡張 PowerShell 2025.4.0 VSCodeの統合ターミナルには普段はGit Bashを使っていて、PowerShellスクリプトは他のシェルからpwshコマンドで実行しています。 ところが、Ctrl + Shift + @などでターミナルパネルにGit Bashを開こうとすると、PowerShell Extensionsが勝手に起動することがあり、 デフォルトターミナルのように振る舞うので、その度に終了して、Git Bashに戻す手間が発生していました。 どうやら、これはVSCodeのPowerShell拡張の機能で、 PS1ファイルを開いているときにVSCodeの統合ターミナルを開くと、 PowerShell Extensionsが自動的に起動するようです。 これを回避するために、拡張機能の設定でPowerShell Extensionsが自動起動しないようにします。 WSL側には影響しないため、Windows側のVSCodeウインドウを開きます。 Ctrl + , を押して設定画面を開き、検索ボックスにpowershell startと入力します。 PowerShell > Start Automaticallyという設定項目が表示されるので、チェックを外します。 これで、PS1ファイルを開いているときにターミナルを開いても、PowerShell Extensionsが自動起動しなくなりました。

2025年11月29日 · aoirint

GIMP 文字の縁取り

GIMPで文字の縁取りをする方法をメモしておきます。 ※ 縁取りをしたあと、テキストの内容を変更した場合、再度縁取りの手順をやり直す必要があります。 バージョン情報 Windows 11 GIMP 3.0.4 手順 キャンバスサイズが小さい場合、縁取りが切れることがあるので、目的の文字サイズに合わせてキャンバスサイズを十分広く設定します。ここでは、フォントサイズ 200ptに対して、幅 1920px、高さ 1080px に設定します。 フォントを設定して、テキストを入力します。ここでは、フォントは源柔ゴシック、フォントサイズ 200pt、文字色は白に設定します。 テキストレイヤーをキャンバスの隅に作成した場合、縁取りが切れることがあるので、ツールボックスから「移動」ツールを選択し、テキストレイヤーをキャンバスの中央寄りに移動します。 テキストレイヤーを右クリックして、「レイヤーを画像サイズに合わせる」を選択します。 テキストレイヤーを右クリックして、「不透明部分を選択範囲に」を選択します。 メニューから「選択」→「選択範囲の拡大」を選択し、ダイアログで希望する縁取りの太さ(ここでは 10px)を指定して「OK」をクリックします。 レイヤーパネルを右クリックして、「新しいレイヤーの追加」を選択して、レイヤーを追加します。「塗りつぶし色」は「透明」に設定します。このレイヤーはテキストレイヤーの下に配置します。 ツールボックスから「塗りつぶし」ツールを選択します。「塗りつぶす範囲」を「選択範囲」に設定します。描画色に縁取りしたい色(ここでは黒)を設定します。 レイヤーパネルから追加したレイヤーを選択して、選択範囲内をクリックして塗りつぶします。 二重の縁取り 上記の手順で一重の縁取りを作成して、最後の選択範囲が残った状態にします。 メニューから「選択」→「選択範囲の拡大」を選択し、ダイアログで希望する縁取りの太さ(ここでは 10px)を指定して「OK」をクリックします。 新しいレイヤーを作成し、前の縁取りレイヤーの下に配置します。 ツールボックスから「塗りつぶし」を選択し、描画色に二重目の縁取りしたい色(ここでは白)を設定します。 レイヤーパネルから追加したレイヤーを選択して、選択範囲内をクリックして塗りつぶします。 縁取りされた文字の回転 レイヤーパネルを右クリックして、「新しいレイヤーグループ」を選択して、レイヤーグループを作成します。 テキストレイヤー、縁取りのレイヤーをすべて選択して、レイヤーグループにドラッグ&ドロップして、レイヤーグループに追加します。 メニューから「レイヤー」→「変形」→「任意の回転」を選択します。 キャンバス内をクリックして、回転ダイアログで希望する角度を指定して「回転」をクリックします。 縁取りされた文字の移動 レイヤーパネルを右クリックして、「新しいレイヤーグループ」を選択して、レイヤーグループを作成します。 テキストレイヤー、縁取りのレイヤーをすべて選択して、レイヤーグループにドラッグ&ドロップして、レイヤーグループに追加します。 ツールボックスから「移動」ツールを選択します。 レイヤーパネルから作成したレイヤーグループを選択します。 Shift キーを押しながら、キャンバス内でドラッグして移動します。

2025年10月11日 · aoirint

Lethal Company Mod Zehs-StreamOverlaysを例としたMod改変手順

Zehs-StreamOverlaysの手元での改変を試したので、他のMod改変で共通して使える知見として、メモしておきます。 今回は公開を目的としたものではなく、知見も持っていないので、Thunderstoreへの公開は内容に含まれていません。 Zehs-StreamOverlaysのソースコードは、MIT Licenseで配布されており、改変箇所を示すため、一部引用します。 GitHub Thunderstore バージョン情報 以下のバージョンを想定しています。 Lethal Company v72 (Build ID: 18916695) Windows 11 24H2 .NET SDK 9.0.201 BepInEx v5.4.21 ZehsTeam/Lethal-Company-StreamOverlays@8ba3632 BeplnEx プラグイン開発環境の設定 BeplnEx公式チュートリアルの開発環境の設定手順に従って、プラグイン開発環境を構築します。 Basic plugin: Setting up the development environment | BepInEx Docs GitHub: 記事執筆時点のソース@ca4a997 依存関係のセットアップ Thunderstore: LethalConfig v1.4.6 Thunderstore: ShipInventoryUpdated v1.2.13 Thunderstore: CSync v5.0.1 Thunderstoreの「Manual Download」からzipファイルをダウンロードして、中のDLLファイルを取り出します。 そのままビルドに使うと、以下のようなエラーが発生します。 $ DOTNET_CLI_UI_LANGUAGE=en dotnet build --configuration Release Restore complete (0.5s) StreamOverlays failed with 4 error(s) (0.3s) D:\workspaces\lethal_company_modding_workspace\Lethal-Company-StreamOverlays\StreamOverlays\Dependencies\ShipInventoryProxy\Patches\ChuteInteractPatch.cs(10,40): error CS0117: 'ChuteInteract' does not contain a definition for 'SpawnItemClientRpc' D:\workspaces\lethal_company_modding_workspace\Lethal-Company-StreamOverlays\StreamOverlays\Dependencies\ShipInventoryProxy\Patches\ItemManagerPatch.cs(10,38): error CS0117: 'ItemManager' does not contain a definition for 'UpdateCache' D:\workspaces\lethal_company_modding_workspace\Lethal-Company-StreamOverlays\StreamOverlays\Dependencies\ShipInventoryProxy\ShipInventoryProxy.cs(12,39): error CS0122: 'LCMPluginInfo' is inaccessible due to its protection level D:\workspaces\lethal_company_modding_workspace\Lethal-Company-StreamOverlays\StreamOverlays\Plugin.cs(16,18): error CS0182: An attribute argument must be a constant expression, typeof expression or array creation expression of an attribute parameter type Build failed with 4 error(s) in 1.1s BepInEx.AssemblyPublicizerを使って、エラーの原因のアクセス制御を無効化したDLLを作成します。これらのDLLはビルド時のみ使用します。 ...

2025年8月21日 · aoirint

Lethal Company コンペティション Museum%に関するメモ

リーダーボード https://www.speedrun.com/Lethal_Company https://www.speedrun.com/Lethal_Company_Category_Extensions https://www.speedrun.com/Lethal_Company_Modded Museum% 達成条件 スクラップ全種かつ全バリエーションの船への保持 バリエーションのあるスクラップの一覧(v72) Easter egg (5種) Flask (2種) Painting (2種) Coffee mug (5種) Tattered metal sheet (2種) 追跡用MOD https://thunderstore.io/c/lethal-company/p/WarperSan/LethalMuseum/ 参考 https://www.speedrun.com/Lethal_Company/news/r655gv6v https://www.youtube.com/watch?v=pLwq3RJeRoE

2025年8月18日 · aoirint

Lethal Company Quotaの計算 v72 (Build ID: 18916695)

Lethal Company v72 (Build ID: 18916695)時点のQuotaの計算に関する仕様の解析メモです。 Quotaの増加量のランダム性 Quotaの増加量のランダム性は、TimeOfDay.quotaVariables.randomizerCurveで定義される、右肩上がりのランダマイザ曲線によってもたらされます。 このランダマイザ曲線は、以下の制御点を持つエルミート曲線です。 x y in_tangent out_tangent 0 -0.5030289 7.455404 7.455404 0.117235 -0.1301773 0.5548811 0.5548811 0.8803625 0.1534421 0.5221589 0.5221589 1 0.5030365 7.051469 7.051469 Unity 2022.3.9f1のAnimationCurveが使われています。 preWrapModeおよびpostWrapModeは、ClampForeverに設定されています。 これにより、[0, 1]の外側の評価値は、端点の値になります。 https://docs.unity3d.com/2022.3/Documentation/ScriptReference/WrapMode.ClampForever.html ランダマイザ曲線の描画スクリプト(Python) Details from dataclasses import dataclass from typing import List import bisect import numpy as np import matplotlib.pyplot as plt from matplotlib.ticker import MultipleLocator # ---- Unity AnimationCurve Keyframes ---- # pre_wrap, post_wrap: ClampForever KEYFRAMES_RAW = [ {"time": 0.0, "value": -0.5030289, "inTangent": 7.455404, "outTangent": 7.455404}, {"time": 0.117235, "value": -0.1301773, "inTangent": 0.5548811, "outTangent": 0.5548811}, {"time": 0.8803625, "value": 0.1534421, "inTangent": 0.5221589, "outTangent": 0.5221589}, {"time": 1.0, "value": 0.5030365, "inTangent": 7.051469, "outTangent": 7.051469}, ] @dataclass class Key: time: float value: float inTangent: float outTangent: float # ---- Unity-style Hermite evaluator (non-weighted) ---- class Curve: def __init__(self, keys: List[Key]): self.keys = sorted(keys, key=lambda k: k.time) def evaluate(self, t: float) -> float: if not self.keys: return 0.0 if len(self.keys) == 1: return self.keys[0].value times = [k.time for k in self.keys] # ClampForever: 範囲外は端の値を返す if t <= self.keys[0].time: return self.keys[0].value if t >= self.keys[-1].time: return self.keys[-1].value i = bisect.bisect_right(times, t) - 1 k0 = self.keys[i] k1 = self.keys[i + 1] t0, t1 = k0.time, k1.time y0, y1 = k0.value, k1.value dx = t1 - t0 if dx == 0.0: return y1 u = (t - t0) / dx m0 = k0.outTangent m1 = k1.inTangent h00 = 2*u**3 - 3*u**2 + 1 h10 = u**3 - 2*u**2 + u h01 = -2*u**3 + 3*u**2 h11 = u**3 - u**2 return h00*y0 + h10*(dx*m0) + h01*y1 + h11*(dx*m1) def main(): # Build curve curve = Curve([Key(**k) for k in KEYFRAMES_RAW]) # Sample and plot # 右に5%の外挿を含めてサンプリング t_min = KEYFRAMES_RAW[0]["time"] t_max = KEYFRAMES_RAW[-1]["time"] t_range = t_max - t_min ts = np.linspace(t_min, t_max + t_range * 0.05, 500) ys = np.array([curve.evaluate(t) for t in ts]) plt.figure( figsize=(16, 9), dpi=300, facecolor='white', edgecolor='black' ) plt.plot(ts, ys) plt.scatter([k["time"] for k in KEYFRAMES_RAW], [k["value"] for k in KEYFRAMES_RAW], label="Keyframes") plt.xlabel("Input") plt.ylabel("Output") plt.legend() plt.title("Quota randomizer curve") plt.grid(True, which='both', axis='both') plt.gca().xaxis.set_major_locator(MultipleLocator(0.05)) plt.gca().yaxis.set_major_locator(MultipleLocator(0.1)) ts_expect = np.linspace(t_min, t_max, 1000) ys_expect = np.array([curve.evaluate(t) for t in ts_expect]) expected_value = ys_expect.mean() print(f"期待値: {expected_value:.4f}") # 特別なX値でのY値を取得し、グラフに表示 special_xs = [0.7865, 1.012] for x in special_xs: y = curve.evaluate(x) plt.plot(x, y, 'ro') # 赤丸でマーク plt.text(x, y, f"({x:.4f}, {y:.4f})", color='red', fontsize=12, ha='right', va='bottom') # 制限値付きの期待値の計算 ts_expect = np.linspace(t_min, x, 1000) ys_expect = np.array([curve.evaluate(t) for t in ts_expect]) expected_value = ys_expect.mean() print(f"制限付き期待値(x <= {x}): {expected_value:.4f}") # Y=0となるtを探索し、同様にプロット zero_crossings: list[float] = [] for i in range(len(ts)-1): if ys[i] * ys[i+1] < 0: # 線形補間でゼロ点近似 t0, t1 = ts[i], ts[i+1] y0, y1 = ys[i], ys[i+1] t_zero = t0 - y0 * (t1 - t0) / (y1 - y0) zero_crossings.append(t_zero) for x in zero_crossings: y = 0.0 plt.plot(x, y, 'ro') plt.text(x, y, f"({x:.4f}, 0.0000)", color='red', fontsize=12, ha='right', va='bottom') plt.savefig("quota_randomizer_curve.png") if __name__ == "__main__": main() LuckとQuotaの関係 Luckが大きいほどQuotaは上がりにくくなり、Luckが小さいほどQuotaは上がりやすくなります。 ...

2025年8月13日 · aoirint

R.E.P.O. Mod ゲーム内テキストを翻訳せずに日本語のSteamユーザー名を表示する(R.E.P.O. v0.2.1)

R.E.P.O. v0.2.1 REPO_JP_TranslationAndFont v1.1.3 ゲーム内テキストは英語のまま、日本語のSteamユーザー名が豆腐にならないようにします。 ThunderstoreでREPO_JP_TranslationAndFontをインストールします。 https://thunderstore.io/c/repo/p/makuromk6/REPO_JP_TranslationAndFont/ 設定ファイルを生成するため、MODを有効化した状態で一度ゲームを起動して閉じます。 設定ファイルBepInEx/config/AutoTranslatorConfig.iniを以下のように編集します。 [General] -Language=ja +Language=en FromLanguage=en

2025年8月9日 · aoirint

Lethal Company 家具のLuckと販売額の一覧 v72 (Build ID: 18916695)

Lethal Company v72 (Build ID: 18916695)の家具のLuckと販売額の一覧です。 販売額当たりのLuck効率が高い順にソートしています。 値は自作のLuckDumperでダンプしました。 QuotaとLuckの関係については、Quotaの計算を参照してください。 v72 (Build ID: 18916695) name luck cost luck/cost*10^5 Disco Ball 0.06 150 40.00 JackOLantern 0.012 50 24.00 Television 0.02 130 15.38 Electric chair 0.018 140 12.86 Microwave 0.01 80 12.50 Goldfish 0.006 50 12.00 Dog house 0.007 80 8.75 Shower 0.015 180 8.33 Welcome mat 0.003 40 7.50 Toilet 0.01 150 6.67 Table 0.004 70 5.71 Sofa chair 0.008 150 5.33 Fridge 0.01 225 4.44 Record player 0.005 120 4.17 Romantic table 0.005 120 4.17 Cozy lights 0.005 140 3.57 Plushie pajama man 0.003 100 3.00 Loud horn 0.0025 100 2.50 Classic painting 0.006 400 1.50 Inverse Teleporter 0.004 425 0.94 Green suit 0 60 0.00 Hazard suit 0 90 0.00 Pajama suit 0 900 0.00 Teleporter 0 375 0.00 Purple Suit 0 70 0.00 Bee Suit 0 110 0.00 Bunny Suit 0 200 0.00 Signal translator -0.012 255 -4.71

2025年8月9日 · aoirint

Lethal Company 家具のLuckと販売額の一覧 v68 (Build ID: 16274733)

Lethal Company v68 (Build ID: 16274733)の家具のLuckと販売額の一覧です。 販売額当たりのLuck効率が高い順にソートしています。 値は自作のLuckDumperでダンプしました。 QuotaとLuckの関係については、Quotaの計算を参照してください。 v68 (Build ID: 16274733) name luck cost luck/cost*10^5 Disco Ball 0.06 150 40.00 JackOLantern 0.012 50 24.00 Television 0.02 130 15.38 Goldfish 0.006 50 12.00 Shower 0.015 180 8.33 Welcome mat 0.003 40 7.50 Toilet 0.01 150 6.67 Table 0.004 70 5.71 Record player 0.005 120 4.17 Romantic table 0.005 120 4.17 Cozy lights 0.005 140 3.57 Plushie pajama man 0.003 100 3.00 Loud horn 0.0025 100 2.50 Inverse Teleporter 0.004 425 0.94 Green suit 0 60 0.00 Hazard suit 0 90 0.00 Pajama suit 0 900 0.00 Teleporter 0 375 0.00 Purple Suit 0 70 0.00 Bee Suit 0 110 0.00 Bunny Suit 0 200 0.00 Signal translator -0.012 255 -4.71

2025年8月9日 · aoirint