プログラミングで遊ぶ
by
pocke
×
Copy
Open
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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!