بنقرة واحدة
بنقرة واحدة
| name | calc |
| description | ダメージ計算。攻撃側・防御側・技名を指定し、特性・持ち物・天候込みのダメージ乱数表を出力する。ダメージ計算・ダメ計・何発で落ちる等の質問時に使用。 |
| allowed-tools | Bash, Read, AskUserQuestion |
Lv50ダメージ計算スキル。特性・持ち物・天候・フィールド・テラスタル・急所・ランク補正に対応。16段階の乱数テーブルと確定数を出力する。
特殊計算パターン (おやこあい / ばけのかわ / Psyshock 系 / シェルアームズ / 壁 / 連続技 / 可変威力技 / 急所のランク無視ルール / JSON 出力フィールド) の網羅仕様は references/special_cases.md に分離。pkdx damage の個別フラグの意味に迷ったらまずそちらを参照する。
SKILL_DIR=(このSKILL.mdが置かれたディレクトリ)
REPO_ROOT=$SKILL_DIR/../../../.. (.claude/skills/calc/ → repo root)
PKDX=$REPO_ROOT/bin/pkdx
$PKDX query "ピカチュウ" --format json >/dev/null 2>&1 && echo "OK" || echo "NOT_FOUND"
NOT_FOUNDの場合、以下を案内してスキルを終了:
pkdx CLI または pokedex.db / champions.db が見つかりません。リポジトリルートで以下を実行してください:
./setup.sh
ユーザーの発言から情報を抽出する。既に指定されている項目はスキップし、不足分のみ質問する。
未指定の場合、AskUserQuestionで3問まとめて質問する。 各質問のオプションには「Otherで回答してください」等のガイドラベルを2つ設置し、ユーザーは「Other」で自由入力する。
AskUserQuestion(3問):
| # | 質問 | header | オプション | multiSelect |
|---|---|---|---|---|
| 1 | 攻撃ポケモンは? | 攻撃側 | "Otherで回答してください" (desc: ポケモン名を入力), "Otherで入力" (desc: 日英どちらも対応) | false |
| 2 | 防御ポケモンは? | 防御側 | "Otherで回答してください" (desc: ポケモン名を入力), "Otherで入力" (desc: 日英どちらも対応) | false |
| 3 | 技は?(日本語名) | 技名 | "Otherで回答してください" (desc: 技名を入力), "Otherで入力" (desc: 日本語名で入力) | false |
テンプレートのポケモン名や技名をオプションに含めてはならない。
ポケモン名確定後、$PKDX query のJSON出力から特性一覧を取得:
$PKDX query "<ポケモン名>" --version "<version>" --format json
# → ability1, ability2, dream_ability フィールドを参照
フォーム違いはタイプ・種族値・特性が全て変わるのでダメージ計算結果が大きく異なる (例: ウォッシュロトム=でんき/みず/特攻105、ヒートロトム=でんき/ほのお、キュウコン(アローラ)=こおり/フェアリー/ゆきがくれ・ゆきふらし)。原種のデータで代用すると火力・耐久・タイプ一致・半減/無効判定が根本から狂うため、フォームは確実に解決してから Phase 2 以降へ進む。
手順:
pkdx query "<名前>" --version "<version>" --format json に渡す。以下は直接引ける:
ウォッシュロトム / ヒートロトム / メガガブリアス / メガリザードンX 等キュウコン(アローラ) / ランドロス(れいじゅう) / ガーディ(ヒスイ) / バクフーン(ヒスイ) 等Wash Rotom / Ninetales (Alolan) 等Error: Pokemon not found) は原種名で再 query し、返り値の forms[] を確認:
forms[] はその version に実在するフォームの一意名配列。原種引き時のみ列挙され、フォーム直引き時や形態無しの場合は JSON キーごと省略 されるpkdx query ロトム --version champions → "forms":["ヒートロトム","ウォッシュロトム","フロストロトム","スピンロトム","カットロトム"]pkdx query キュウコン --version scarlet_violet → "forms":["キュウコン(アローラ)"]type1 / type2 / ability1 / ability2 / dream_ability / 種族値を取得pkdx damage の --attacker / --defender および --atk-ability / --def-ability に渡す注意点:
forms[] に現れない。これらは原種として扱って問題ない (例: 「ハーフトリム」指定は原種 トリミアン で計算)forms[] からも除外される (例: Champions にはランドロス(れいじゅう)未収録) — ユーザーにその旨を伝えて別 version を提案するforms[] に含まれる (メガガブリアス 等)。メガ名で query するとメガ進化後の type/ability/stats が得られるイダイトウ(オス) / イダイトウ(メス)、eng Basculegion (Male) / Basculegion (Female)。性別未指定の イダイトウ は M base のステータスを返すため、F 個体を計算する際は必ず (メス) 付きで照合する (例: イダイトウ♂ atk 112 / spa 80、♀ atk 92 / spa 100 とダメージ計算結果が大きく変わる)。ユーザー入力が イダイトウ♂ / イダイトウ♀ (ゲーム内表記) で来た場合は ♂ → (オス) / ♀ → (メス) に正規化してから query するAskUserQuestion 1(4問、左右キー選択):
| # | 質問 | header | オプション |
|---|---|---|---|
| 1 | 攻撃側特性は? | 攻撃特性 | なし(default), {ability1}, {ability2}, {dream_ability} |
| 2 | 防御側特性は? | 防御特性 | なし(default), {ability1}, {ability2}, {dream_ability} |
| 3 | 攻撃側持ち物は? | 攻撃持物 | なし(default), こだわりハチマキ/メガネ, いのちのたま |
| 4 | 防御側持ち物は? | 防御持物 | なし(default), しんかのきせき, とつげきチョッキ |
特性オプションはDBから取得した実際の特性を表示する。空の特性は除外。
AskUserQuestion 2(4問 + 条件付き1問):
| # | 質問 | header | オプション |
|---|---|---|---|
| 1 | 攻撃側の性格は? | 攻撃性格 | 特化(default=+10%相当), Other(性格名 例:ようき/いじっぱり/まじめ) |
| 2 | 防御側の性格は? | 防御性格 | 無補正(default), Other(例:ずぶとい/しんちょう) |
| 3 | 攻撃側の実数値は? | 攻撃数値 | デフォルト(SP=32+性格の自動計算), Other(数値入力) |
| 4 | 防御側の実数値は? | 防御数値 | デフォルト(SP=0+性格の自動計算), Other(数値入力) |
| 5 | 天候は? | 天候 | なし(default), はれ, あめ, すなあらし |
攻撃側特性が そうだいしょう または技が おはかまいり の場合、追加で以下を質問する:
| # | 質問 | header | オプション |
|---|---|---|---|
| 6 | 味方のひんし数は? | ひんし数 | 1, 2(default), 3, 4, 5 |
AskUserQuestion 3(2問、ランク補正):
| # | 質問 | header | オプション |
|---|---|---|---|
| 1 | 攻撃側のランクは? | 攻撃ランク | 0(default), +1, +2, +4, -1, Other |
| 2 | 防御側のランクは? | 防御ランク | 0(default), +1, +2, -1, -2, Other |
ボディプレスが技として選択されている場合は、攻撃ランクの質問に「※ボディプレスでは攻撃ランク=Bランクを入力」と注記を追加する。
重要: --atk-stat / --def-stat を override 指定していても、ランク補正・特性・道具・天候などの後段補正はすべて適用される。override は「rank 前の実数値」として扱われる。
$PKDX damage "<攻撃側名>" "<防御側名>" "<技名>" \
[--version <ver>] \ # champions を指定可能
[--regulation <reg>] \ # M-A 等(champions 時のみ有効)
[--atk-ability <name>] [--def-ability <name>] \
[--atk-item <name>] [--def-item <name>] \
[--weather <type>] [--field <type>] \
[--tera-type <type>] [--critical] \
[--atk-nature <name>] [--def-nature <name>] \
[--atk-stat <value>] [--def-stat <value>] [--def-hp <value>] \
[--atk-rank <n>] [--def-rank <n>] \
[--fainted-count <n>] \
[--wall <kind>] [--pierce-screen] \
[--atk-status <name>] [--def-status <name>] \
[--atk-rank-up-count <n>] [--def-rank-up-count <n>] \
[--atk-hp <ratio>] [--def-item-removable] \
[--multi-hit <mode>] [--disguise-active] \
--format json
「なし」が選択された修飾子はオプションを省略する。
| フラグ | 意味 | 受け入れる値 (ja / en 両対応) | 用途 |
|---|---|---|---|
--wall <kind> | 防御側の壁 | reflect / リフレクター, light-screen / ひかりのかべ, aurora-veil / オーロラベール | 壁込みダメ計 (0.5x / ダブルは 0.667x) |
--pierce-screen | 壁貫通 move | bool flag | かわらわり / サイコファング等 |
--atk-status <name> | 攻撃側状態異常 | burn / やけど, paralyze / まひ, poison / どく, badpoison / もうどく, sleep / ねむり | からげんき威力 2x 判定用 (まひ/やけど/どく/もうどく で発動) |
--def-status <name> | 防御側状態異常 | 同上 | たたりめ威力 2x 判定用 |
--atk-rank-up-count <n> | 攻撃側ランクアップ累積段数 | 0..6 | アシストパワー威力 = 20 + 20×n |
--def-rank-up-count <n> | 防御側ランクアップ累積段数 | 0..6 | つけあがる威力 = 20 + 20×n |
--atk-hp <ratio> | 攻撃側残 HP 比率 | 1/2, 50%, 1/3, 33% ... | やけっぱち (HP ≤ 1/2 で威力 2x) |
--def-item-removable | 防御側が奪える持ち物を持つ | bool flag | はたきおとす威力 = 65 × 1.5 = 97 |
--multi-hit <mode> | 連続技の回数固定 | auto (既定, DB 参照), 1..5 (固定) | 連続技の検証・Skill Link 再現 |
--disguise-active | ばけのかわが剥がれる前 | bool flag | 通常ダメージに 1/8 HP chip を加算した damages[] を返す (disguise_blocked=true, disguise_chip=def_hp/8)。「ばけのかわ消費 + 実ダメージ」を 1 つの数で扱う |
# ミミッキュ (ばけのかわ) の初撃検証
$PKDX damage "ガブリアス" "ミミッキュ" "じしん" --disguise-active --format json
# リフレクター下のガブリアス → カイリュー (物理)
$PKDX damage "ガブリアス" "カイリュー" "じしん" --wall reflect --format json
# アシストパワー (攻撃側が +2 を 2 stat = 計 4 段上がった状態)
$PKDX damage "ミュウツー" "ハピナス" "アシストパワー" --atk-rank-up-count 4 --format json
# やけっぱち (HP 半分以下で威力 2x)
$PKDX damage "パチリス" "ガブリアス" "やけっぱち" --atk-hp 1/2 --format json
# からげんき (攻撃側が状態異常で威力 2x)
$PKDX damage "カビゴン" "ハピナス" "からげんき" --atk-status burn --format json
# たたりめ (相手状態異常時 2x)
$PKDX damage "ゲンガー" "トゲキッス" "たたりめ" --def-status paralyze --format json
# はたきおとす (持ち物剥がせる相手に 1.5x)
$PKDX damage "サザンドラ" "ハピナス" "はたきおとす" --def-item-removable --format json
# Skill Link でロックブラスト 5 回固定
$PKDX damage "ドリュウズ" "ナットレイ" "ロックブラスト" \
--atk-ability スキルリンク --multi-hit 5 --format json
--atk-nature / --def-nature で性格の日本語名を渡す(例: いじっぱり, ずぶとい)。未指定時は上記デフォルト--atk-stat, --def-stat, --def-hp で実数値を直接指定可能。これは「rank 前の実数値」として扱われ、rank/特性/道具/天候などの後段補正はすべて適用される
--atk-stat に渡す--atk-stat に渡す--atk-rank, --def-rank で -6〜+6 の段階を指定(0 = 補正なし){
"attacker": "攻撃側名",
"defender": "防御側名",
"move": "技名",
"damages": [d1, d2, ..., d16],
"percents": [p1, p2, ..., p16],
"min": min_damage,
"max": max_damage,
"defender_hp": hp,
"hits_dealt": n,
"ko": "確定数テキスト",
"disguise_blocked": false, // true なら damages に ばけのかわ chip が加算済み
"disguise_chip": 0, // ばけのかわ消費時の固定 1/8 HP chip。0 なら未加算
"variants": [...],
"input": {
"attacker": {
"name": "...",
"types": ["type1", "type2"],
"base_stats": {"hp": n, "atk": n, "def": n, "spa": n, "spd": n, "spe": n},
"ability": "", // 空文字 = 指定なし
"item": "",
"nature": "", // 空文字 = 攻撃ステ特化相当 (+10%) を自動適用
"rank": 0,
"stat_override": 0, // 0 = 未指定 (engine がデフォルトの実数値を計算)
"status": "none", // none / paralyze / burn / poison / badpoison / sleep / drowsy
"rank_up_count": 0,
"hp_num": 2, "hp_den": 2 // 攻撃側 HP 比 (やけっぱち用)、満タン = 2/2
},
"defender": {
"name": "...",
"types": [...],
"base_stats": {...},
"ability": "", "item": "", "nature": "", // 防御側 nature 空文字 = 無補正
"rank": 0,
"stat_override": 0,
"hp_override": 0,
"status": "none",
"rank_up_count": 0,
"item_removable": false
},
"move": {"name": "...", "type": "...", "category": "物理|特殊|変化", "power": n, "accuracy": n},
"tera_type": "", // 空文字 = テラスタルなし
"weather": "none", // none / はれ / あめ / すなあらし / ゆき
"field": "none", // none / エレキ / グラス / サイコ / ミスト
"critical": false,
"wall": "none", // none / reflect / light-screen / aurora-veil
"screen_pierce": false,
"fainted_count": 2,
"is_double": false,
"stat_system": "champions", // champions / standard
"multi_hit_mode": "auto", // auto / fixed:N / expected
"disguise_active": false
}
}
重要: input フィールドは pkdx がダメ計に実際に使用した条件を echo back する。Phase 3 のテーブル整形では 必ず input.* の値を引用し、ユーザーへの問い合わせや AskUserQuestion で得た値を再現してはならない (typo や型違いで乖離する場合がある)。
input.* の意味:
"") は「未指定」を意味する。攻撃側 nature: "" は engine が「攻撃ステ特化相当 +10%」を自動適用、防御側 nature: "" は「無補正」。stat_override/hp_override の 0 は「未指定 (engine が SP/EV/性格からデフォルト実数値を計算)」。非 0 ならユーザーが渡した rank 前の実数値そのもの。weather/field は "none" か canonical な JP 名 (はれ/あめ/...)。status は canonical な英語短縮形 (burn/paralyze/...). counter 値 (BadPoison(n)/Sleep(n)/Drowsy(n)) は表現せず、種別のみ返す。multi_hit_mode は "auto" (DB 参照), "fixed:N" (1..5), "expected" (payoff 専用、damage CLI では発生しない)。スクリプト出力を以下のMarkdownテーブルに整形して提示する。
フィードバック前提: 条件テーブルの値は すべて input.* フィールドから引く。damages/percents/ko だけを読んで「攻撃側は〇〇特化のはず」「天候ははれだったはず」と推論で補完してはならない (LLM が前提を取り違える典型箇所)。
input.attacker.name / input.attacker.typesinput.attacker.ability / .item / .nature / .rankinput.defender.* から引くinput.move.*input.weather / .field / .tera_type / .critical / .wallinput.multi_hit_mode ("fixed:N" なら N 回固定、"auto" なら DB 解決) と hits_dealt を併記空文字 ("") や "none" の項目は条件テーブル行ごと省略してよい。
## ダメージ計算結果
**{攻撃側名}** → **{防御側名}** / {技名}
### 条件
| 項目 | 値 |
|------|-----|
| 攻撃側 | {name} ({types}) |
| 攻撃特性 | {ability or なし} |
| 攻撃持ち物 | {item or なし} |
| 攻撃実数値 | {stat_name} {actual} ({detail}) |
| 攻撃ランク | {+n or -n} |
| 防御側 | {name} ({types}) |
| 防御特性 | {ability or なし} |
| 防御持ち物 | {item or なし} |
| HP実数値 | {hp_actual} ({detail}) |
| 防御実数値 | {stat_name} {actual} ({detail}) |
| 防御ランク | {+n or -n} |
| 天候 | {weather or なし} |
| 技 | {move_name} ({type}/{category}, 威力{power}) |
| タイプ一致 | {あり/なし} ({mult}x) |
| タイプ相性 | {eff}x |
### ダメージ乱数表
| | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 |
|---|----|----|----|----|----|----|----|----|----|----|----|----|----|----|----|-----|
| ダメージ | {d} | {d} | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | {d} |
| 割合 | {%} | {%} | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | {%} |
### 確定数
**{min_dmg} ~ {max_dmg} ({min_pct}% ~ {max_pct}%)**
→ {確定1発 / 乱数1発(X/16) / 確定2発 / ... / 5発以上}
修飾子がない項目は条件テーブルから省略してよい。
ダメージが 0 になるケースでは 16 段階乱数表を省略し、確定数行を 無効化の理由 に置き換える。条件テーブルの「タイプ相性」欄には実効倍率を記す。
ko: "immune" 相当): Immune (0 damage) 平文のため JSON フィールドが取れないことに留意。乱数表行は「ダメージは発生しない(タイプ相性または特性により無効)」と一行で済ませ、確定数欄は 「無効(ダメージ0)」 とするdisguise_blocked: true): damages[] には 1/8 HP chip が 既に加算済み。条件テーブル下に「ばけのかわ chip: disguise_chip HP (各乱数値に加算済み)」の一行を添えて、ユーザーが「実ダメージ + 消費 chip の合算値」と認識できるようにする。乱数表・確定数はそのまま通常通り表示するAskUserQuestionで追加計算を提案:
| # | 質問 | header | オプション |
|---|---|---|---|
| 1 | 続けて計算しますか? | 追加計算 | 別の技で計算, 別の相手で計算, 攻防入替, 構築ブログに貼り付け, 終了 |
選択に応じてPhase 1に戻る(既知の情報は保持)。終了を選んだ場合はスキルを終了。
--attach-team)ユーザーが「構築ブログに貼り付け」を選んだ場合、計算結果を box/teams/<slug>.meta.json の damage_calcs[] に追記する。GitHub Pages (Astro) 側が読み取って構築記事ページに 16 段階の乱数テーブルとしてレンダリングする。
box/teams/ 配下の *.meta.json を ls box/teams/*.meta.json で列挙し、AskUserQuestion でユーザーに選んでもらう--attach-title) と任意コメント (--attach-note) を尋ねる$PKDX damage 呼び出しに --attach-team <path> --attach-title "<title>" --attach-note "<note>" を足して再実行する (計算結果は stdout にそのまま出るので表示ブロックはそのまま作れる)$PKDX damage "<攻撃側名>" "<防御側名>" "<技名>" \
--attach-team "box/teams/<slug>.meta.json" \
--attach-title "vs <防御側名> (<一口メモ>)" \
--attach-note "<任意コメント>" \
<その他の修飾子オプション>
成功時は stderr に Attached damage calc to <path> と出るのでユーザーに通知する。同じ計算を複数回 attach すると単純に重複追加される — 誤登録に気付いた場合は .meta.json の damage_calcs[] を手動で編集する必要があることを案内する。
ブログに表示される粒度:
--attach-title) / 攻撃側・防御側のポケモン名・特性・持ち物・性格・ランク・テラスタイプguaranteed_hits を付与 — 乱数系は rolls_percent から FE 側で再計算)--attach-note)未記入フィールド (特性なし、性格なし等) は FE 側で非表示になる。
pkdx が Error: で始まる出力を返した場合、またはJSON出力の ko が "immune" の場合、以下に従って対処する。
| 状況 | 対応 |
|---|---|
| pkdx / DB が見つからない | セットアップ手順を案内しスキル終了 |
| ポケモンが見つからない | 名前の再入力を依頼。リージョンフォームの可能性を案内 |
| 技が見つからない | 「技が見つかりません。日本語名で入力してください」→ 再入力を依頼 |
Immune (0 damage) 平文 / または JSON "ko": "immune" | 「タイプ相性または特性により無効(ダメージ0)です」と案内(immune 時は --format json 指定でも平文を返すので、JSON parse 前に "Immune" prefix を判定する) |
ちからもち, ヨガパワー, はりきり, サンパワー, テクニシャン, てつのこぶし, がんじょうあご, メガランチャー, すてみ, すなのちから, すいほう, もらいび, てきおうりょく, フェアリースキン, スカイスキン, フリーズスキン, エレキスキン, こだいかっせい, クォークチャージ, トランジスタ, りゅうのあぎと, はがねのせいしん, ちからずく, アナライズ, いろめがね, そうだいしょう, かたいツメ, きれあじ, ひひいろのこどう, ハドロンエンジン
ちょすい, よびみず, もらいび, ひらいしん, でんきエンジン, ふゆう, そうしょく, かんそうはだ, ファーコート, マルチスケイル, フィルター, ハードロック, こおりのりんぷん, あついしぼう, たいねつ, もふもふ, すいほう
こだわりハチマキ, こだわりメガネ, いのちのたま, たつじんのおび, ちからのハチマキ, ものしりメガネ, ふといホネ, でんきだま, 各タイプ強化アイテム(プレート・おこう系)
しんかのきせき, とつげきチョッキ, 各半減きのみ(オッカ・ヤチェ等全18種)
はれ, あめ, すなあらし, ゆき, エレキフィールド, グラスフィールド, サイコフィールド, ミストフィールド
テラスタル(--tera-type), 急所(--critical), ランク補正(--atk-rank, --def-rank、-6〜+6、第3世代以降仕様。急所時は攻撃側の負ランク・防御側の正ランクを無視。--atk-stat/--def-stat の override は「rank 前の実数値」として扱われ、rank は常に乗る), 性格(--atk-nature, --def-nature, ja名), ひんし数(--fainted-count、0-5、そうだいしょう用)
--def-rank-up-count), アシストパワー (--atk-rank-up-count), やけっぱち (--atk-hp), はたきおとす (--def-item-removable), たたりめ (--def-status), からげんき (--atk-status)--disguise-active), おやこあい (atk_ability で自動, hits_dealt=2)--wall), 貫通技 (--pierce-screen)--multi-hit auto は中央値 3, Skill Link で 5 固定), 任意固定 (--multi-hit 1..5)