Slide 1

Slide 1 text

プログラミングで遊ぶ 2025-10-25 【Okayama.なんか #6】Okayama.Geek

Slide 2

Slide 2 text

self.inspect ● Rubyist / Web backend Connpassより(a-knowさんありがとうございます!)

Slide 3

Slide 3 text

色々なプログラミングで遊ぶ ● 趣味のプロダクトを作る ● 面白い問題を解く ● 面白いコードを書く ○ TRICK https://x.com/tompng/status/1582322388678549504 ● etc…

Slide 4

Slide 4 text

プログラミングでゲームを遊ぶ ● ゲームをより楽しむために、プログラミングを活用し始めた ● ゲームの楽しさと、プログラミングの楽しさ両方が増えた

Slide 5

Slide 5 text

ゲームの紹介: Elin ● 2DローグライクRPG ● ダンジョン探索+クラフト ● 現在はアーリーアクセス ○ かなり頻繁に更新されている ● カオス ○ たくさんのパロディ ○ そこそこあるブラックジョーク

Slide 6

Slide 6 text

アジェンダ ● MOD編 ● コードリーディング編 ● Webアプリ編 ● 組合せ最適化編

Slide 7

Slide 7 text

MOD編

Slide 8

Slide 8 text

MODとは ● ゲームのプログラムを外部から改造するプログラム ● ゲームの開発元とは別に、有志が非公式に開発 ● 例: ○ グラフィックの変更 ○ アイテムやキャラクターなどの追加 ○ 日本語化 ○ 便利機能の追加

Slide 9

Slide 9 text

ElinでのMOD ● ElinはMODフレンドリーなゲーム ○ MOD作成、公開が許可されている ○ Steam上に公式にMOD公開プラットフォームが存在する ○ MODのソースコード公開が許可されている ○ Elin本体のソースコード公開が許可されている (?!?!) ● Unity / C# 製 ● 私は便利系を主に公開、時々ジョークMOD ○ 現時点で12個公開 ○ 利用者が一番多いMODで4700ユーザーほど

Slide 10

Slide 10 text

MODデモ

Slide 11

Slide 11 text

MODの作り方(BepInEx) C#のメソッド単位でコードを差し込むのが基本 ● メソッド呼び出し直前にコードを差し込み ○ 必要であれば本体の skip ● メソッド呼び出し後にコードを差し込み ○ 必要であれば結果の書き換え ● メソッドのバイトコードを書き換え ○ 何でもできるけど大変

Slide 12

Slide 12 text

C# への入門 ● C# は完全未経験 ● とはいえ、AIに聞けば言語の壁はだいぶ薄くなった ○ 「RubyのこれはC#でどう書くの?」 ○ 「◯◯を実装しているのはどこ ?」

Slide 13

Slide 13 text

メンテナンス性を意識した実装 自分の管理化にないコードを変更したい都合上、普段と違う視点が求められる ● メソッドの挙動を変えたいとき ○ 呼び出し前にフックして変えたい処理を呼び、元のメソッドをスキップすれば実現できる ○ しかし、変更に弱い ● 意識している点 ○ コードのコピーをなるべく避ける ○ メソッドのスキップをなるべく避ける (とはいえそこそこ長いメソッドのif文の条件を変えたい、とかだと難しいことも多い……)

Slide 14

Slide 14 text

難しさ ● MOD許容されているとはいえ、ドキュメントは少ない ○ MODを作り始めるまでのドキュメントは公式に一応ある https://ylvapedia.wiki/wiki/Elin:Mod ○ ちょっとした非公式チュートリアルもある ○ ただし、基本はデコンパイルしたコードから意図を読み解く必要がある ● デコンパイルされたコードは情報が落ちる ○ コメントがないため、実装から意図を読み解く必要がある ○ 変数名も落ちるが、これは案外障害になりづらい

Slide 15

Slide 15 text

dotfiles感 .vimrc をよくいじっていた頃を思い出す ● 自分が使いやすいようにゲームに手を入れていく感覚 ● 公開はしないけど動かしたいコードのために、自分専用MODを作るのも楽しい ○ https://github.com/pocke/ElinMiscMod

Slide 16

Slide 16 text

コードリーディング編

Slide 17

Slide 17 text

コードリーディング編 ● Elin のソースコードは、公開することが許容されている ● GitHub にデコンパイルした結果が公開されている ○ https://github.com/Elin-Modding-Resources/Elin-Decompiled コードリーディングをする環境が整っている

Slide 18

Slide 18 text

コードリーディングの目的 ● MOD作成のため ● 攻略のため ○ このスキルを上げるにはどの行動をしたらいいのか ○ 窃盗コマンドを成功させるにはどうしたらいいのか ○ etc… Webバックエンドとは実装の雰囲気が違っていて楽しい

Slide 19

Slide 19 text

例: 経験値の処理 ここで乱数を使っているのが 最初理解できなかった

Slide 20

Slide 20 text

例: 経験値の処理 ● 経験値の小数点以下 が、0から1の乱数よりも 上ならば経験値に1を足 す ● つまり、小数点以下をそ の確率で1に切り上げて いる ○ 保存する経験値を整数と して扱いつつ、小数点以 下の経験値も反映する

Slide 21

Slide 21 text

Webアプリ編

Slide 22

Slide 22 text

Webアプリ編 ペット(仲間)の育成をするにあたって、困ることが増えてきた ● 公式のWikiだと、情報が足りなかったり、検索性に難がある。 ● MOD開発リソースとして、有志がゲーム内データのCSVを公開している ○ https://docs.google.com/spreadsheets/d/1CJqsXFF2FLlpPz710oCpNFYF4W_5yoVn/edit?g id=1016121330#gid=1016121330 ○ そのCSVを眺めれば、キャラクターの (ほぼ)すべてが理解できる ● しかし、CSVはとてもめんどくさい ○ 複数のCSV(キャラクター、職業、種族など )を自力でmergeする必要がある ○ アビリティ名がゲーム内 IDで表記されていて、自力で変換が必要 ○ UIがスプレッドシート それならCSVをいい感じに見れるWebアプリを作ろう!

Slide 23

Slide 23 text

作った(DEMO) ● CSVをいい感じに成型して表示 ● ゲームの更新への対応は、基本的にCSVを差し替えるだけ https://elin.pocke.me https://github.com/pocke/elin-chara-viewer

Slide 24

Slide 24 text

技術構成 ● Next.js, SSG only ● TypeScript ○ (ちょっとだけRuby) ● MUI ● Cloudflare Pages ランニングコストをかけないため、完全に静的なページを生成、配信

Slide 25

Slide 25 text

AIの活躍 開発のほとんどをClaude Codeで行った ● HTML要素の配置をやってくれるのが本当に助かる ○ 90点ぐらいのUIをうまく作ってくれればいい、という期待にしっかり応えてくれる ● 結構めちゃくちゃなコードを書かれることもそこそこある ○ 手直しの指示は必要 ● コアのロジックはある程度自分で実装・細かく指示出しをした ○ CSVの内容をどう解釈するべきか ○ これもElin側のコードを合わせて読ませたら、もっと AIに任せられたかも…

Slide 26

Slide 26 text

作った結果 めちゃくちゃ便利になった ● 育成したいキャラ選びがとても楽に ● ほしい情報がなかったら自分で足せる ● 一応自分以外もちらほら使ってくれていそう

Slide 27

Slide 27 text

組合せ最適化編

Slide 28

Slide 28 text

組合せ最適化編 ゲームをしていて、ある問題を解くとゲームプレイをより効率化できそうだった

Slide 29

Slide 29 text

問題: 完全飯を作る Elinでは、食事でキャラクターが成長する ● 食事に含まれる特性によって、成長するステータス が変化する ○ 対象となるステータスは 16個 ● 食事は料理スキルによって、複数の食材を組み合わ せてクラフトできる ● 食材ごとに特性が決まっている(== 成長するステータ スが異なる) どのような組合せを選べば、全能力が上昇する完全飯を 作れるか

Slide 30

Slide 30 text

課題 ● 単純に全探索すると、ものすごい数の組合せを探索しないといけない ○ 5つの異なるカテゴリの食材を使うレシピ ○ それぞれのカテゴリで食材の候補が 26, 400, 736, 566, 20種類ある ○ 全組み合わせは86647808000通り(866億通り) ● 品種改良というややこしい要素がある ○ 食材となる農作物は自作できる ○ 農作物は品種改良でき、対象のステータス 16個の中の9個のいずれかを上昇させる事ができる ○ つまり農作物の場合は候補数が 9倍になり、候補が更に膨れ上がる

Slide 31

Slide 31 text

前処理: パレート最適問題 ある食材Aのステータス上昇値が、別の食材Bのそれと比べてすべて同じか上回って いるのであれば、食材Bは考慮する必要がない 例: ● 食材Aは筋力が3, 耐久が2上がる ● 食材Bは筋力が3, 耐久が1上がる ● この場合、食材Bは必要がない 食材データがスプレッドシートで提供されていたので、GASで実装。 これで食材数が16, 71, 89, 73, 19に、組合せが140231248(1.4億)に減少

Slide 32

Slide 32 text

本題: 組合せ最適問題 GASでこれ以上実装するのは厳しい気がしてきたので、データをCSVでexportして手 元で実装することに しばらく実装方法を検討したあと、仕様書をかなり詳細に書いてAIに丸投げ。 https://github.com/pocke/elin-complete-meal

Slide 33

Slide 33 text

組合せ最適化の解説 ● 基本は全探索 ● 枝刈りを実施 ○ あらかじめ食材のグループごとにそのグループ内の各ステータスの最大値を保存 ○ 組合せを途中まで選んだあと、足りてないステータスが残りのグループに含まれていなければス キップ ● 並列化を実施 ○ Goで実装させたので、いい感じに並列化ができたっぽい

Slide 34

Slide 34 text

やらなかったこと: ビット演算 ● 各ステータスが埋まっているかどうかをbitで管理 ● 食材の組合せはビットOR演算で行って高速化 やれたら面白そうだったけど、これをやらずとも十分高速だった

Slide 35

Slide 35 text

まとめ

Slide 36

Slide 36 text

まとめ ● プログラミングを使って、ゲームを色々な方向から楽しんでいる ○ MOD、コードリーディング、 Webアプリ、組合せ最適 ● AIによって慣れない分野に手を出しやすくなった ○ C#, Webフロントエンド ● Elinはプログラミングを活かしやすいゲーム ○ ゲームによってはデコンパイルが許されていない場合もあるので注意 Thanks for your listening!