はかせるおむつ

ゴミ置き場

Power Automateを使用して、スマホのボタンから定型文をツイートする

概要

スマホのPower Automateアプリから、複数の定型文を番号で選択してツイートできます。いくつかの定型文をExcelシート上に用意しておいて、すぐにツイートできます。

下記が定型文を保存するExcelファイルです。例として3つの定型文が保存してありますが、定型文はいくつでも増やせます。

フロー

下記の通りフローを作成します。この場合、OneDrive上にある、tweet_table.xlsx内のテーブル「ツイートテーブル」に定型文が保存してあります。Power Automateアプリ上のボタンを押す際に、数字を入力してどの定型文をツイートするかを選択します。

Slay the Spireのカード画像の変更

カード画像の変更

Slay the Spireのカード画像は簡単に変更できることが分かったので、メモを残しておきます。

上の画像では、いらすとやの画像を借りて、ストライクと防御のカード画像を変えてみました。一気に気の抜ける感じにまりました。

変更の手順は下記の通りです。

  1. オリジナルのカード画像を手に入れる。

    オリジナルのカード画像は下記のdesktop-1.0.jarファイル内にあります。

    [Steam installed directory]\steamapps\common\SlayTheSpire\desktop-1.0.jar

    jarファイルの実体はzipファイルなので、zipファイルを展開するのと同様に展開してください。その中にcardsディレクトリがあるので、cardsディレクトリごとコピーしてください。

  2. カード画像を指定の場所に保存する

    前の手順でコピーしたcardsディレクトリを下記のディレクトリに保存してください。

    [Steam installed directory]\steamapps\common\SlayTheSpire

    ここに保存したカード画像が読み込まれて、ゲームに反映されるようになります。

  3. 画像を加工する。

    cardsディレクトリ内にはcards.atlascards.pngcards2.pngcards3.pngcards4.pngがあります。その中で編集するのは4つのpng画像だけです。(cards.atlasはカード画像の位置を保存したテキストファイルなので編集の必要がないです。)

    それぞれのpng画像を見てもらうと分かりますが、多くのカード画像が1つのファイルにまとまっているので、必要なカード画像の部分だけを変更してください。

なお、cardsディレクトリ内の画像を変更しても、カードコレクションの画像は変更されません。カードコレクションの画像も変更したければ、images\1024Portraits内の画像も編集が必要かもしれません(未確認)。

さらにcardui内の画像も同様の方法で変更できると面白いかもしれません(未確認)。

Slay the Spire MODの作り方(メモ)

はじめに

Default Mod BaseのWikiを足掛かりに、すべてを読めばSlay the SpireのMODは作れるようになるはずです。

github.com

すべてを説明するのは大変なので、私が悩んだ部分のみを書いておきます。

開発環境構築

Default Mod Baseの使用

Default Mod Baseを使用します。使用しなくても頑張ればMODは作れるでしょうが、すべて一からを用意するのは大変なので使わせてもらいます。

GitHub - Gremious/StS-DefaultModBase: (USE THIS AND BASEMOD IF YOU'RE NEW TO MODDING) This is a minimal, over-commented, "default clean slate" for jump-starting Slay the spire mods.

Default Mod Base Wikiの指示通り、Default Mod BaseのGitリポジトリをzip形式でダウンロードし、自分で用意した任意のディレクトリに展開しておきます。

3つのMODの導入

下記3つのMODをSteam Workshopからインストールしてください。Steamクライアント上でサブスクライブボタンをクリックするだけです。

各MODのGithubのReleaseページからインストールしないでください。

IntelliJでの既存プロジェクトのインポート

Maven開発環境上でMODのためのコードを編集するので、IntelliJを使用します。

Default Mod BaseのWikiでは、ダウンロードしたDefault Mod Baseのプロジェクトをインポートする際に、画面上のインポートボタンから進めています。しかし、IntelliJ IDEA 2022.2.3 (Community Edition)ではそのインポートボタンがありません。下記の通りインポートします。

プロジェクトのインポートとエクスポート

ウェルカム画面が開いたら、Ctrl+Shift+A を押し、project from existing sources と入力して、ポップアップで既存ソースのプロジェクトをインポートアクションをクリックします。

JDK

最新のJDKではMODのビルドに失敗しました。JDK 8が必要です。下記からOpen JDK 8をダウンロードしてインストールします。

www.openlogic.com

File -> Project Structure -> Project Settings -> Projectとたどり、SDKの設定をします。

Mavenプロジェクトとして認識させる

プロジェクトをインポートした後は、IntelliJMavenプロジェクトとして認識させて作業をする必要があります。

If you do not have a Maven tab, double-tap Shift to open the intelliJ search (your best friend!) and type "Maven" - you'll find it there.

Default Mod Base Wikiには上記のようにありますが、簡単に見つけられません。下記の手順でIntelliJMavenプロジェクトとして認識させます。

  1. pom.xmlを選択する。

  2. Shiftキーを2回連続で押して、IntelliJ検索画面を出す。
  3. その選択画面でAdd as Maven Projectを検索して選択する。

DefaultMod.javaの編集

DefaultMod.java内のTODO:から始まるコメント行の内容にしたがって編集します。

パッケージ名の設定

//TODO: FIRST THINGS FIRST: RENAME YOUR PACKAGE AND ID NAMES FIRST-THING!!!

左ペインの黒ドットがついたthe Defaultを自分のMOD名に変更します。

4か所の変更

DefaultMod()メソッド内に4か所を変更する指示があります。その通りに変更すればOKです。

パッケージ化

Mavenプロジェクト内のpackageをダブルクリックすれば、[yourmodname].jarが生成されてMODは完成です。cleanでそのパッケージを削除できます。

SpirePatchの使い方(一部)

Insertの使用

Insertメソッドを使用して、オリジナルのSlay the Spireのメソッドのコードの間に、自分のコードを挿入できます。

挿入箇所の指定の仕方は、locrloclocsrlocsをそれぞれ使用する方法もありますが、Matcherを使用した方法もあります。Matcherを使用した方法では、自分のコードを、任意のメソッドの実行の直前などで実行できます。

@SpirePatch(
    clz = ShopScreen.class,     //コードを挿入したいメソッドが含まれるクラスを指定
    method = "purchaseCard"     //コードを挿入したいメソッド名
)
public class ClickBuyCard {
    @SpireInsertPatch(
        locator= ClickBuyMod.ClickBuyCard.Locator.class     //[packagename].[thisclassname].Locator.class
    )
    public static void Insert(ShopScreen __instance) {
        AbstractDungeon.player.gold += 1;       //ここに挿入したい自分のコードを書く
    }

    private static class Locator extends SpireInsertLocator {
        public int[] Locate(CtBehavior ctMethodToPatch) throws CannotCompileException, PatchingException {
            //MethodCallMatcher()の1つ目に対象のメソッドが含まれるクラスを指定する。
            //MethodCallMatcher()の2つ目の引数に対象のメソッド名を渡す。
            //その関数の直前にInsert()で指定した自分のコードが実行される。
            Matcher finalMatcher = new Matcher.MethodCallMatcher(ShopScreen.class, "playCantBuySfx");

        return LineFinder.findInOrder(ctMethodToPatch, new ArrayList<Matcher>(), finalMatcher);
    }
}

フィールドにアクセスがあったときに自分のコードが実行されるようにするには、FieldAccessMatcher()を使用します。

また、オリジナルのコードの中で元のクラスのフィールドにアクセスしたいときは、localvarsにそのフィールドの名前を指定したうえで、Insertメソッドの引数にその引数を指定します。下記の例ではフィールドcardAtlasを読み書き可能です。

@SpirePatch2 (clz = AbstractCard.class, method ="initialize")
public class CardImgMod {
    @SpireInsertPatch (
            locator = Locator.class,
            localvars = {"cardAtlas"}
    )
    public static void Insert(TextureAtlas cardAtlas) {
        //ここに挿入したい自分のコードを書く。ここではフィールドcardAtlasにアクセス可能。
    }

    public static class Locator extends SpireInsertLocator {
        public int[] Locate(CtBehavior ctMethodToPatch) throws CannotCompileException, PatchingException {
            Matcher.FieldAccessMatcher fieldAccessMatcher = new Matcher.FieldAccessMatcher(AbstractCard.class, "cardAtlas");

            return LineFinder.findInOrder(ctMethodToPatch, new ArrayList<Matcher>(), fieldAccessMatcher);
        }
    }
}

質問は@hotpot774までお願いします。

Slay the SpireのMODを作りました

ショップで買えないアイテムをクリックすると、1ゴールドもらえるMODです。つまり、買えないアイテムをクリック連打で買えるようになります。

www.youtube.com

MOD作成の練習として作成しました。チートMODです。

C4 LAN 2022 SUMMER参加しました

C4 LAN 2022 SUMMER in ツインメッセ静岡 参加しました!!!

静岡では初めてのC4LAN開催でした。

初日は豪雨の中、なんとかバスで会場に到着。 ツインメッセ静岡の入口外観

開場入口にはいつもの立て札。これがあるとC4LANへ来た実感がわく。うれしいね。

コロナ対策で1人当たりのスペースが広くなってて、余裕の設営。

開場の雰囲気が懐かしくて涙でた。

レッドブルが来てくれて、参加者にレッドブル缶を配ってくれてた!でも来た時間がかなり遅くて、参加者が少ない時間帯なのはどうして…

BYOCチケットの売れ残りがあって、空席がそこそこ目立ったのが残念だった。コミケと被ったのは痛い。コロナもあるし。

開場の壁側から全体を見渡すように動画をとってみた。広くて余裕のある席配置でした。増席いけますよこれは。

お腹が減ってて、丼自体の写真を撮り忘れるミス。値段に対しては百点満点のおいしい丼ぶりでした。

2日目にはちょうど台風が来て、河川に近い地域に避難指示が出て少し焦った。会場はその河川に近い地域ではなく、台風はあっという間に去ったから問題にはならなかったが。

夜は風雨がやんだ隙をついて、レンタサイクルで会場からホテルに戻った。 C4LANのためだけに、会場に臨時レンタサイクルステーションが作られていたのは驚いた。ありがたい。

3日目にはまぐカツ丼もいただきました。

スポンサーブースで販売されていた、しぞーかおでんも食べたけど写真なし。おいしかった!

ステージイベントとスポンサーブースで遊んでいると自席でゆっくりしている時間はないのが悔しい。あっという間に時間が過ぎてしまった。正直、楽しすぎて詳しいことは覚えていない。結局、まともに写真を撮っていないので、公式の写真集を見て思い出すのが最強だと思う。

photos.app.goo.gl

ほとんどのホテルが静岡駅前にしかなく、会場であるツインメッセ静岡から遠いのは欠点。会場から静岡駅前まで徒歩30分またはバス10分。初日と2日目は、夜にどのタイミングでホテルに戻るか悩んだ。

結局、色々と思うところはあったけど、でっていうの聖衣を確認できたのでヨシ!

次回も絶対に行くぞ。そのときは仕込みをしていきたい。

C4 LAN GARAGE #1 感想

2022/4/29から2022/5/1でC4 LAN GARAGE #1にBYOC参加したので、感想を書きます。

初日

会場は日本カレット株式会社の千葉倉庫。京葉工業地域の工場が多く立ち並ぶエリアでした。

幕張メッセには何度も行ったことがあるのですが、その先は初めてで心臓が飛び出しそうなくらい緊張しました。 雨が降っていたので、最寄り駅の稲毛海岸駅からはタクシーを使い会場近くまで移動しました。

開場が14:00で14:15前後に会場に到着しました。会場内はまさに倉庫でしたが、パーティー用に改装されていて雰囲気がありました。初日は雨が降るくらいの気候で寒かったので、暖房を効かせてくれていて助かりました。席の幅は今までのC4LANの倍くらいあり、さらにゲーミングチェア付きで個人の環境としては申し分なかったです。

自席のセッティングをして、Apex Legendsをしたり、ご飯を食べたりしていたら、あっという間に24時近くになったので、徒歩5分の東横INNに撤収しました。初日は、はしゃぎすぎないようにするのが大事。

2日目

朝は9:30くらいに会場に戻ってきた記憶があります。午前中は一体何をしていたのか、よく覚えていませんがあっという間に時間が過ぎました。Inscryptionのクリア状況が中途半端だったので、とりあえずクリアしてしまおうとしていたような気がします。結局、最後までInscryptionはクリアできませんでしたが。

薄暗い会場に差し込む入口からの光があまりにもまぶしくて、体に悪いことを続けている感覚があったので、お昼ご飯も兼ねて散歩に出ることにしました。

結局、片道40分以上かけて海岸まで歩きました。海岸の風は気持ちよくて気分は最高でしたが、普段あまり歩いていなかったので脚がぱんぱんになりました。

あとは15:00からのSurvival Quiz CITYマッチに参加して、ゲラゲラ笑っていました。

そのあと、近所の業務スーパーに行ってお菓子とお茶を買ってきたので、この日はだらだらゲームをプレイしていました。今回のC4LANはステージがないので、ゲームに集中できました。ピザの配給もありました。運営には感謝します。

なお、私がC4LANに参加する目的の50%はでっていうの聖衣を見るためです。

この日は結局、24時近くにホテルに帰った気がします。そこそこ歩いて疲れていました。

3日目

最終日です。この日は10:00から恒例のGolf With Your Friends大会があるので、それに間に合うように会場へ戻りました。大会の結果はぼちぼちでした。

そのあと、急遽13:00から田原さんがCrab Gameのマッチをホストをしてくれたので、それに参加しました。優勝はできませんでしたが、このゲームも毎回やっていきたいと思うくらいには面白かったです。

あっという間に14:00を過ぎ、周りが撤収の準備を始めたので私も撤収作業をしました。とはいえ15:45が閉会の儀だったので、1時間以上することもなくぼーっとしていました。

最後の恒例のじゃんけん大会では、ゲーミングたわしを含めて何も勝ち取ることができませんでした。くやしい。

帰りはタクシーを使わずに歩いて稲毛海岸駅まで行きました。途中から雨が降ってきたうえに、キャリーバッグのキャスターが壊れてしまい、非常に残念な感じになりました。

ですます調で文章にするとあっさりしてますが、今回もとても楽しませてもらいました。次回のC4LANも、人生に問題がなければ参加します。とりあえず会場近くのホテルの検索から始めます。