No.007 / Apps / 2025
MHLab|装備探索とダメージ検討をつなぐiOSアプリ
複数の条件から装備候補を探索し、物理・属性ダメージの比較とマイセット保存へつなぐSwiftUI製iOSアプリ。

Project facts
- Role
- App Development
- Deliverable
- iOSアプリ
- Industry
- ゲーム支援
- Capability
- iOSアプリ開発 / モバイルUI開発 / 組み合わせ探索設計 / データモデリング / データ投入ツール開発
- Technology
- Swift / SwiftUI / iOS / SQLite / Swift Concurrency / Combine / CryptoKit / Google Mobile Ads SDK / Swift Package Manager / Swift Testing / XCTest / Python / GitHub Actions
- Audience
- 発動条件を基準に装備候補をiPhoneで比較したいゲーム利用者 / 装備と攻撃対象の条件を変えながら物理・属性ダメージを比較したい利用者 / 検討した装備構成と計算条件を端末内へ保存して再利用したい利用者
課題
装備やスキルの候補が多いゲームでは、必要な条件を満たす構成の探索と、攻撃対象に応じたダメージ比較が別工程になりやすく、同じ装備条件を繰り返し入力する必要がある。
解決策
複数の要求条件から装備候補を探索し、候補を装備計算へ引き継いで物理・属性結果を比較し、構成と計算条件を保存できるiOSアプリとして構成。探索にはDFS、枝刈り、メモ化を用い、参照データはSQLiteで管理する。
主要機能・工夫
- スキル条件の検索・選択
名前、読み、カテゴリから複数のスキルと必要レベルを選択する。
- 指定条件から装備候補を探索
DFS、枝刈り、メモ化、重複排除を用いて条件を満たす構成を探索する。
- 装飾品割当ロジック
不足条件と空きスロットを評価し、候補となる装飾品を再帰的に割り当てる。
- 探索結果から装備計算へ引き継ぎ
候補のスキル、防御力、空きスロットを確認し、選択した構成を計算画面へ反映する。
- 装備一式の個別編集
武器、防具、護石、装衣、装飾品などの構成要素を個別に選択する。
- 物理・属性ダメージ計算
武器、スキル、切れ味、モーション、肉質、会心条件を段階的に反映する。
- 攻撃対象・部位別条件
対象、部位、物理・属性肉質、状態を切り替えて結果を比較する。
- マイセット保存
装備と計算条件を名前付きJSONとして端末内へ保存し、検索・読込・削除する。
- 端末内SQLiteデータ基盤
アプリ同梱の参照データを端末内データベースとして管理する。
- CSV差分投入
行ハッシュを比較し、データ種別ごとの非同期処理で参照データを投入する。
- 日英ローカライズ基盤
日本語と英語の文字列リソースを用意し、主要画面の表示へ利用する。
成果・変化
- 装備探索からダメージ検討までを接続
条件入力、候補探索、候補確認、装備計算への反映、構成保存を一つの操作フローへつないだ。
- 参照データをSQLiteへ集約
装備、スキル、計算条件に用いる参照データを端末内データベースから扱う構成へ整理した。
- データ変換と差分投入の経路を整備
CSV・JSON変換、行ハッシュ比較、SQLite投入をアプリの参照処理へ接続した。
- 日英文字列リソースを導入
日本語と英語の表示資産を用意し、主要画面の多くをローカライズキーへ移行した。
装備探索とダメージ検討をつなぐiOSアプリ
- プロダクト
- MHLab
- カテゴリ
- Game Companion Utility
- プラットフォーム
- iOS / iPhone
- 主要技術
- SwiftUI / SQLite
- データ
- On-device Reference Database
- 公開年
- 2025
条件入力、候補探索、計算、保存を一つの流れへ
発動させたい条件とレベルを選択し、条件を満たす装備候補を探索します。結果では発動条件、防御力、空きスロット、構成要素を確認できます。
採用した候補は装備計算へ引き継ぎ、武器、スキル、切れ味、攻撃対象、部位、肉質、会心などを反映した物理・属性結果の比較と、マイセット保存へ進めます。
多数の候補と計算条件をモバイル上で扱う
装備やスキルの候補が多いゲームでは、必要な条件を満たす構成を手作業で比較するだけでも多くの工程が発生します。さらに攻撃対象ごとの結果を別の画面やツールで確認すると、同じ構成の再入力が必要になります。
MHLabでは、検索条件、候補構成、計算条件、保存した構成を同じデータモデルで接続し、iPhone上で検討を継続できる流れを構成しました。利用者調査や時間短縮の計測結果は確認できていないため、設計上の課題として記載しています。
装備構成を検討する操作の流れ
- スキル名・読み・カテゴリから条件を選択
- 複数のスキルと必要レベルを指定
- 武器やスロット条件を設定して候補を探索
- 発動条件、防御力、空きスロット、構成要素を確認
- 選択した候補を装備計算へ反映
- 攻撃対象、部位、肉質、会心条件を調整
- 物理・属性結果を比較
- 装備と計算条件をマイセットとして端末内保存
複数条件を検索・並び替えながら選択
スキル条件は手動入力表示と一覧表示を切り替え、名前、読み、カテゴリから検索できます。複数の条件へそれぞれ必要レベルを指定し、探索入力として構造化します。
結果が見つからない場合は、条件の削減・変更を促す空状態と選択画面へ戻る導線を表示し、失敗した探索から条件調整へ戻れるようにしています。
DFS、枝刈り、メモ化による組み合わせ探索
装備候補の探索には深さ優先探索を基礎として、残り候補では条件を満たせない枝の打ち切り、計算済み状態の再利用、重複構成の排除、結果件数の上限を組み合わせています。
最初からすべての対象範囲を探索せず、結果が得られない場合に対象を広げます。これは候補数を制御する実装上の工夫であり、検索時間や速度改善率は実測していないため性能成果としては登録していません。
不足条件と空きスロットから候補を割り当てる
防具候補の探索とは別に、不足している条件、空きスロット、装飾品の効率を評価し、スロットへ割り当てる再帰探索とメモ化の処理があります。
ただし、監査対象の同梱データでは装飾品・護石の投入状態を十分に確認できず、現行配布環境で全候補を利用できるとは断定していません。ロジックの存在と利用可能なデータの完全性を分けて扱います。
探索結果を再入力せず装備計算へ
候補詳細には、発動条件、防御力、空きスロット、使用する装飾品、各装備部位をまとめて表示します。
選択した構成は共有モデルを通じて装備計算画面へ反映し、検索と計算の間で同じ装備を入力し直さず、攻撃対象の条件比較へ進める構成です。一部属性の引き継ぎは追加検証が必要です。
自動探索だけに依存しない個別編集
装備計算では、自動探索結果に加えて、武器、防具の各部位、護石、装衣、装飾品、食事、アイテムなどの構成要素を個別に選択できます。
検索画面群から対象を絞り込み、同じ装備セットモデルへ反映することで、自動生成された候補と手動で調整する構成を同じ計算処理へ接続します。
物理と属性を分けて計算条件を反映
物理側では表示攻撃力、武器係数、攻撃補正、切れ味、モーション値、物理肉質、会心を、属性側では属性値、属性補正、切れ味、属性肉質、会心条件を段階的に扱います。
対象、部位、肉質、状態を切り替えて結果を比較できます。ただし計算式と外部仕様の包括的な照合は確認できず、一部効果には開発途中の処理があるため、公式仕様の完全再現や正確性を保証する表現は使用していません。
装備と計算条件を名前付きで保存
検討した構成は名前を付け、装備、装飾品、食事・アイテム、攻撃対象、肉質、会心などの条件とともに端末のDocuments領域へJSONとして保存します。
保存済み構成は一覧から検索、読込、削除できます。状態保存には複数の経路があり、すべての条件が常に同じ形で復元されるかは追加検証が必要なため、完全な状態復元とは表現していません。
参照データをSQLiteへ集約
装備、スキル、攻撃対象、部位・肉質などの参照データはSQLite3で管理します。アプリへ同梱した初期データベースを端末内の作業領域へコピーして利用します。
整合性検査、WAL、外部キー、マイグレーションを組み込み、画面表示、探索、計算が同じ参照経路を利用できる構成です。旧永続化方式を想起させるクラス名が残りますが、現行実装に合わせて採用技術はSQLite3として登録しています。
CSV・JSON変換と行ハッシュによる差分投入
参照データはCSVから読み込み、行単位のSHA-256ハッシュを既存値と比較して変更を判定します。複数のデータ種別はSwift Concurrencyのタスクとして処理します。
開発用にはCSVをJSONへ変換するPythonツールも用意されています。一般的なすべてのCSV形式への対応や不正値の厳密な検出は確認していないため、対象データ向けの投入経路として記載しています。
画面表示を優先し、参照データを後段で読み込む
SwiftUIとCombineで画面とモデルの状態変化を接続し、起動時は初期画面の表示後に参照データの読み込みと状態復元を進める構成です。
並行処理、探索範囲の段階的拡張、結果上限は端末上の処理量を考慮した設計ですが、現行端末での起動時間、検索時間、メモリ使用量は計測していないため、速度や省メモリの成果は登録していません。
日本語と英語の文字列リソース
日本語と英語のLocalizable.stringsを用意し、タブ、検索、マイセット、エラー表示など主要画面の多くをローカライズキーで管理しています。
日本語固定の文言と両言語間のキー差が残るため、全画面の完全な日英対応ではなく、ローカライズ基盤を導入した状態として扱います。
広告表示と端末内処理の境界
アプリにはGoogle Mobile Ads SDKを用いたバナー・インタースティシャル広告の読み込みと表示管理があります。広告識別子や内部設定値はSanityへ登録していません。
主要な探索、計算、参照データは端末内で扱う構成ですが、広告通信があり、同意取得処理の実行とデータカテゴリの完全性も未確認です。そのためネットワーク不要を保証する表現やプライバシー対応完了の主張は使用していません。
実装済みのコード、検証済みの動作、配布状態を分離
単体テストはスキル条件モデルの生成、重複マージ、妥当性、検索エラーを対象とし、UIテストは起動、起動性能、起動画面を対象とします。探索アルゴリズム、計算式、SQLite、マイセットの包括的な自動検証は確認できていません。
今回の調査環境ではビルドとテストの完走を確認できませんでした。リポジトリ内にはデータ更新の研究コードもありますが現行ビルドへの接続が確認できないため、提供機能として登録していません。利用者数、検索速度、正解率、売上などの定量成果も確認できていません。
第三者情報と現在の配布状態を公開主張から分離
第三者のゲーム名称、ロゴ、画面内データ、具体的な数値、広告設定、内部URL、公開鍵候補、ローカルパスは公開案件データから除外しています。権利確認前のスクリーンショットとアイコンも共通表示へ登録していません。
既存データにあった配布ページは現在取得できないため、公開中とは表現せず、リンクも有効な公開先を確認できるまで掲載しません。制作年、所有ブランド、関与形態は既存Sanityで管理されていた編集済み情報を維持し、個人の担当範囲は新たに断定していません。
