Slide 1

Slide 1 text

ドラクエ3(HD-2D)のモンスター戦闘システム をモデリングしてみよう 2025/10/16 レトロゲームから得た学びの発表 #04 しゅういちろ

Slide 2

Slide 2 text

目次 1. 目次 2. 自己紹介 3. なぜ、このお話をするか 4. モデリングをする 5. モデリングをする2(懇親会で) 6. まとめ

Slide 3

Slide 3 text

自己紹介

Slide 4

Slide 4 text

自己紹介 しゅういちろ 2004.4 2024.7 中堅SIerに入社 SESで顧客先で常駐しつつ、実装から要件定義、 PMOなど を経験する。大障害の中の青い銀行の中の人だったこともあ ります。 パッケージソフトのSaaS化プロジェクトにて開発組織の立ち 上げ、スケールを実践し、自分の可能性を感じて転職を決意 ビットキーへjoin 2025.10 全てのエンジニアが幸せに、開発に集中できるようにするこ と(技術広報/採用/組織開発/EM育成) shucho0103 ・データベーススペシャリスト

Slide 5

Slide 5 text

自己紹介 趣味:本を書く 商業誌 同人誌 何かしらの 新刊 技術書典19(11/15〜) 新刊携えてお待ちしております

Slide 6

Slide 6 text

なぜ、このお話をするか

Slide 7

Slide 7 text

なぜ、このお話をするか ゲームからの学びはソフトスキルになりやすいので、無理やりハードスキルに持っ ていこうと思った。 HD-2Dとつけたのは、当日のマシンスペック的にオブジェクト指向の実現は難しそ うだと思ったのと、当時の仕様を思い出すのが難しいからです。 ※ 単なる思考実験です。実際の仕様はわかりません。

Slide 8

Slide 8 text

モデリングをする

Slide 9

Slide 9 text

ドラクエ3(HD-2D)の仕様(戦闘編) ※想像です 1. 戦闘の仕様(ver 1.00) a. 概要 i. 戦闘は味方パーティvs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全てのコマンドを入力し終わった後に戦闘参加者がコマンドに応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで(0.8〜1.2)の数字をかけて、高い順に行動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのステータスに応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユニットの防御力) × ランダムな数字(13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの魔法耐性) × ランダムな数字(38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在のHPからマイナスをする。HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後にHPが0となったユニットは戦闘不能となり、このターンの全ての行動がキャンセルされ、次ターンのコマンド入力は受け付けない

Slide 10

Slide 10 text

モデリングしてみよう 1. 戦闘の仕様(ver 1.00) a. 概要 i. 戦闘は味方パーティ vs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全ての コマンドを入力し終わった後に戦闘参加者 がコマンドに応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで( 0.8〜1.2)の数字をかけて、高い順に行 動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのス テータスに応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユニッ トの防御力) × ランダムな数字(13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は 0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの魔法耐性) × ラ ンダムな数字(38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在 のHPからマイナスをする。 HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後に HPが0となったユニットは戦闘不能となり、このターンの全ての 行動がキャンセルされ、次ターンのコマンド入力は受け付けない 戦闘エンジン -入力コマンド[] +コマンド入力 +ターン開始 -行動順序決定 -ダメージ計算 -HP増減 -死亡判定

Slide 11

Slide 11 text

モデリングしてみよう 1. 戦闘の仕様(ver 1.00) a. 概要 i. 戦闘は味方パーティ vs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全てのコマンドを入力し終わった後に戦闘参加者が コマンドに応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで( 0.8〜1.2)の数字をかけて、高い順に行 動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのス テータスに応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユ ニットの防御力) × ランダムな数字(13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は 0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの 魔法耐性) × ランダムな数字(38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在 のHPからマイナスをする。 HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後に HPが0となったユニットは戦闘不能となり、このターンの全ての 行動がキャンセルされ、次ターンのコマンド入力は受け付けない 戦闘エンジン -入力コマンド[] : コマンド +コマンド入力(コマンド) +ターン開始 -行動順序決定 -ダメージ計算 -HP増減 -死亡判定 コマンド -行動 -ユニット攻撃力 -装備品攻撃力 -魔力 -防御力 -魔法耐性[]

Slide 12

Slide 12 text

モデリングしてみよう 1. 戦闘の仕様(ver 1.00) a. 概要 i. 戦闘は味方パーティ vs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全てのコマンドを入力し終わった後に戦闘参加者が コマンドに応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで( 0.8〜1.2)の数字をかけて、高い順に行 動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのス テータスに応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユニッ トの防御力) × ランダムな数字(13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は 0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの魔法耐性) × ラ ンダムな数字(38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在 のHPからマイナスをする。 HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後に HPが0となったユニットは戦闘不能となり、このターンの全ての 行動がキャンセルされ、次ターンのコマンド入力は受け付けない 戦闘エンジン -入力コマンド[] : {コマンド, ユニット} -戦闘参加ユニット []:ユニット +コマンド入力(コマンド,ターゲットユニット ) +ターン開始 -行動順序決定 -ダメージ計算 -HP増減 -死亡判定 コマンド -行動 -ユニット攻撃力 -装備品攻撃力 -魔力 -防御力 -魔法耐性[] ユニット -HP -攻撃力 -装備品攻撃力 -魔力 -防御力 -魔法耐性[] +HP減少

Slide 13

Slide 13 text

モデリングをする2

Slide 14

Slide 14 text

ドラクエ3(HD-2D)の仕様(戦闘編) ※想像です 1. 戦闘の仕様(ver 2.00) a. 概要 i. 戦闘は味方パーティ vs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全てのコマンドを入力し終わった後に戦闘参加者がコマンドに応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで( 0.8〜1.2)の数字をかけて、高い順に行動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのステータスに応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユニットの防御力) × ランダムな数字( 13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は 0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの魔法耐性) × ランダムな数字( 38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる 3. ユニット属性 a. 各ユニットには種族の属性があり、ユニットのコマンドには種族特攻が付与されるものがある 4. 全体攻撃 a. 武器や魔法によってはパーティを対象とするものがある。その場合は対象となる各ユニット毎にそれぞれダメージ計算を行い、 HPの減少をさせる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在の HPからマイナスをする。 HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後に HPが0となったユニットは戦闘不能となり、このターンの全ての行動がキャンセルされ、次ターンのコマンド入力は受け付けない

Slide 15

Slide 15 text

モデリングしてみよう 1. 戦闘の仕様(ver 2.00) a. 概要 i. 戦闘は味方パーティvs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全てのコマンドを入力し終わった後に戦闘参加者がコマンド に応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで( 0.8〜1.2)の数字をかけて、高い順に行動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのステータスに 応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユニットの防御 力) × ランダムな数字(13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は 0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの魔法耐性) × ランダムな 数字(38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる 3. ユニット属性 a. 各ユニットには種族の属性があり、ユニットのコマンドには種族特攻が付与されるものが ある 4. 全体攻撃 a. 武器や魔法によってはパーティを対象とするものがある。その場合は対象となる各ユニッ ト毎にそれぞれダメージ計算を行い、 HPの減少をさせる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在の HPか らマイナスをする。HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後にHPが0となったユニットは戦闘不能となり、このターンの全ての行動が キャンセルされ、次ターンのコマンド入力は受け付けない 戦闘エンジン -入力コマンド[] : {コマンド, ユニット} -戦闘参加ユニット[]:ユニット +コマンド入力(コマンド,ターゲットユニット) +ターン開始 -行動順序決定 -ダメージ計算 -HP増減 -死亡判定 コマンド -行動 -ユニット攻撃力 -装備品攻撃力 -魔力 -防御力 -魔法耐性[] -属性 ユニット -HP -攻撃力 -装備品攻撃力 -魔力 -防御力 -魔法耐性[] -属性 +HP減少

Slide 16

Slide 16 text

モデリングしてみよう 1. 戦闘の仕様(ver 2.00) a. 概要 i. 戦闘は味方パーティvs敵対パーティで行われる ii. 基本は多対多で行われ、ターン制で戦闘は行われる iii. ターンの最初にコマンドを入力し、全てのコマンドを入力し終わった後に戦闘参加者がコマンド に応じた行動を行う b. 戦闘参加者 i. 戦闘参加者は敵味方どちらかに所属するユニットで行われる c. 行動順序 i. 行動順序は各ユニットの素早さにランダムで( 0.8〜1.2)の数字をかけて、高い順に行動を行う d. ダメージ計算 i. ダメージ計算は行動を行うアクションユニットのステータス、被アクションユニットのステータスに 応じて計算を行う 1. 物理攻撃の場合の計算式 a. ((アクションユニットの攻撃力+装備アイテムの攻撃力) - 被アクションユニットの防御 力) × ランダムな数字(13〜25) b. 会心の一撃の場合は被アクションユニットの防御力は 0として計算する 2. 魔法攻撃の場合の計算式 a. (アクションユニットの魔力 - 被アクションユニットの属性ごとの魔法耐性) × ランダムな 数字(38〜72) i. 魔法耐性は魔法の属性ごとに使用する耐性が異なる 3. ユニット属性 a. 各ユニットには種族の属性があり、ユニットのコマンドには種族特攻が付与されるものが ある 4. 全体攻撃 a. 武器や魔法によってはパーティを対象とするものがある 。その場合は対象となる各ユ ニット毎にそれぞれダメージ計算を行い、 HPの減少をさせる e. HPの減少 i. 各ユニットの行動後、被アクションユニットはダメージ計算で算出されたダメージを現在の HPか らマイナスをする。HPの最小値は0とする。 f. 死亡判定 i. 各ユニットの行動後にHPが0となったユニットは戦闘不能となり、このターンの全ての行動が キャンセルされ、次ターンのコマンド入力は受け付けない 戦闘エンジン -入力コマンド[] : {コマンド, ユニット} -戦闘参加ユニット[]:ユニット +コマンド入力(コマンド,ターゲットユニット ) +ターン開始 -行動順序決定 -ダメージ計算 -HP増減 -死亡判定 コマンド -行動 -行動ユニット :ユニット -ターゲットユニット [] :ユニット ユニット -HP -攻撃力 -装備品攻撃力 -魔力 -防御力 -魔法耐性[] -属性 +HP減少

Slide 17

Slide 17 text

まとめ

Slide 18

Slide 18 text

まとめ 1. モデリングはプログラムに落とし込むまでの思考のプロセスの可 視化 a. 説明しやすくなる b. 聞く方も理解しやすい 2. 一瞬で頭の中でプログラムが構築できる人もいる ≒モデリング必要ない人