Handsome-Goo / MUGEN / Ikemen GO 仕様差分解説
Date: 2026-05-23
概要
----
Handsome-Goo は Ikemen GO を基礎にした派生版であり、MUGEN 互換の基本挙動と
Ikemen GO の既存拡張を保ちながら、AI 制御、外部ツール連携、部位防御、アーマー、
反射、相殺、音声管理、ヘッドレス実行などを追加している。
大きく言うと、違いは次の 3 層に分かれる。
1. MUGEN にはない Ikemen GO 由来の拡張
Tag / Simul / 追加 trigger / Go 実装のシステムなど。
2. オリジナル Ikemen GO にはない Handsome-Goo 独自拡張
AIGO、ArmorOverride、GuardPointOverride、PartDefense、Clsn metadata、
ReflectProjectile、ClashDef、External API、Headless battle など。
3. 互換性を保つために通常キャラでは触らない内部拡張
ログ、デバッグ API、外部入力、AI 学習用 state、batch/headless 実行など。
1. MUGEN との違い
----------------
1.1 エンジン基盤
MUGEN は Windows 向けの古い 2D 格闘ゲームエンジンで、CNS/CMD/AIR/SFF/SND による
キャラクター定義を中心に動作する。
Handsome-Goo は Ikemen GO ベースなので、MUGEN の基本形式を読みつつ、Go 実装の
拡張エンジンとして動作する。
主な違い:
- MUGEN より多くの trigger / state controller を扱える。
- Tag / Simul / チーム戦など Ikemen GO 系の機能を前提にできる。
- 外部 API、ヘッドレス実行、ログ出力など、ツール連携向けの機能を持つ。
- MUGEN 互換キャラは基本的に動くが、Handsome-Goo 独自 SCTRL を使ったキャラは MUGEN では動かない。
1.2 CNS / Trigger の違い
MUGEN の CNS では、基本的な HitDef、Explod、PlaySnd、ChangeState などを使う。
Handsome-Goo ではそれに加えて、次のような独自 trigger / SCTRL が使える。
- ArmorOverride
- GuardPointOverride
- ArmorOverrideClear
- PartDefenseSet
- PartDefenseClear
- ChangeAsset
- SetReflectable
- ReflectProjectile
- ClashDef
- ClashOverride
- SendExternalEvent
- SetExternalFlag
- PartLife / PartStatus / PartHit / PartDamage / PartDefense
- SoundChannelBusy / SoundChannelFree / SoundPlaying
- HeadlessMode / FastBattleMode / ExternalAPIEnabled
- HitAttackGroup / HitAttackType / HitAttackAttr
- MoveHitAttackGroup / MoveHitAttackType / MoveHitAttackAttr
- svar(n)
これらは MUGEN には存在しないため、MUGEN 互換を重視するキャラでは使用を避ける必要がある。
1.3 AIR の違い
MUGEN の AIR では Clsn1 / Clsn2 の矩形を定義する。
Handsome-Goo では、Clsn に意味づけを追加できる。
追加 AIR key:
- Clsn2Group[n]
- Clsn2Type[n]
- Clsn1Group[n]
- Clsn1Type[n]
- Clsn1Attr[n]
用途:
- Clsn2Group: 頭、胴、腕、脚などの部位名
- Clsn2Type: normal、armor、guardpoint、critzone、invul などの防御分類
- Clsn1Group: 剣先、柄、拳、弾などの攻撃部位名
- Clsn1Type: slash、pierce、blunt、magic などの攻撃種類
- Clsn1Attr: fire、ice、sharp、weapon などの任意タグ
MUGEN ではこれらの key は意味を持たない。
2. オリジナル Ikemen GO との違い
-------------------------------
2.1 AIGO
AIGO は Handsome-Goo 独自の AI システムである。
オリジナル Ikemen GO の CPU AI は、主に既存 CMD/CNS と内部 AI 入力に依存する。
Handsome-Goo では、キャラクターごとの .aigo / aigo.def から行動パターンを読み、
条件評価、SEQ、入力予約、学習情報を使って行動を決める。
特徴:
- .aigo ファイルで AI パターンを定義する。
- AIGO 有効時は既存 CPU AI 入力を止める。
- 最終的にはキャラの command 入力として流すため、CNS の通常コマンド処理と接続される。
- aigo_debug_*.txt に AIGO 専用ログを出す。
- player_control_P*.txt にプレイヤー操作・入力系ログを出す。
互換注意:
- AIGO はオリジナル Ikemen GO には存在しない。
- .aigo を前提にした AI 調整は、オリジナル Ikemen GO では再現されない。
- AIGO は入力予約経由なので、直接 state を強制する AI とは挙動が異なる。
2.2 ArmorOverride / GuardPointOverride
オリジナル Ikemen GO では、アーマーやガードポイントは主に HitOverride、NotHitBy、
ReversalDef、独自 state 処理などを組み合わせて作る。
Handsome-Goo では専用 SCTRL として実装している。
ArmorOverride:
- 被弾を成立させつつ、ダメージ、ヒットポーズ、硬直、速度、エフェクトなどを差し替える。
- keep.state / keep.anim / keep.velocity / keep.ctrl などで被弾時の挙動を細かく制御できる。
- damage.mul / damage.add / damage.min / damage.max / kill などでダメージ処理を制御できる。
- no.hitspark / no.hitsound で相手 HitDef のヒット演出を抑制できる。
GuardPointOverride:
- ArmorOverride のガードポイント版。
- 成立時は相手側のヒットスパーク、ヒット音、guard damage、guard power などをガード扱いにする。
- 通常ヒットではなく、ガード成立に近い結果を作るために使う。
追加の違い:
- ArmorOverride と GuardPointOverride は同じ見かけ slot を指定しても内部的に別レイヤーとして保持される。
- `attack.group/type/attr` と `ignore.attack.group/type/attr` で、攻撃側 Clsn1 metadata による成立条件を設定できる。
- Projectile の `attack.group/type/attr` は ArmorOverride / GuardPointOverride の判定に使える。
2.3 PartDefense
PartDefense は、Clsn2Group を使った部位別防御システムである。
オリジナル Ikemen GO / MUGEN では、通常 HitDef はキャラ全体に対して damage を与える。
Handsome-Goo では、当たった Clsn2 の group/type に応じて、部位ごとの防御力や弱点を設定できる。
できること:
- 頭、腕、胴、脚などの部位ごとに damage 倍率を変える。
- 部位 HP を持たせる。
- 部位が壊れた時に broken state / broken anim / broken spark / broken sound を出す。
- 弱点攻撃で weak.mul / weak.sound / weak.sparkno などを使う。
- Clsn1Group / Clsn1Type / Clsn1Attr によって弱点を変える。
- ignore.attack.* で特定攻撃を部位防御対象外にできる。
互換注意:
- PartDefenseSet / PartDefenseClear は MUGEN / オリジナル Ikemen GO には存在しない。
- Projectile 直接ヒットへの PartDefense 適用は現時点では未接続。
- 通常打撃と Armor hit 経路では PartDefense が接続されている。
2.4 Clsn1 攻撃メタデータ
Handsome-Goo では、攻撃判定 Clsn1 に group / type / attr を付けられる。
例:
Clsn1Group[0] = sword
Clsn1Type[0] = slash
Clsn1Attr[0] = weapon, sharp, fire
用途:
- 剣先だけ弱点にする。
- 打撃、斬撃、刺突、魔法で PartDefense の反応を変える。
- ArmorOverride を特定の攻撃種類だけに反応させる。
- HitAttackGroup / MoveHitAttackAttr などの trigger で直近の攻撃種類を見る。
- ClashDef の attack.* 条件に使う。
互換注意:
- MUGEN / オリジナル Ikemen GO ではこれらの AIR key は未対応。
- ClashDef attack.* は現時点では相手側現在フレームの先頭 Clsn1 metadata を使う。
実際に接触した Clsn1 index を使う精密判定は未実装。
2.5 ReflectProjectile / SetReflectable
Handsome-Goo では Projectile や攻撃 helper の反射を扱うための SCTRL を追加している。
SetReflectable:
- 自分または helper を反射可能状態にする。
- reflect limit や owner 情報を持つ。
ReflectProjectile:
- 条件に合う Projectile / helper 攻撃を反射する。
- 反射後の owner、team owner、facing、速度倍率、damage scale、guard scale、hitpause scale を指定できる。
- reflect spark / reflect sound / asset 指定に対応する。
オリジナル Ikemen GO では、反射はキャラ側 CNS でかなり手作業になりやすい。
Handsome-Goo ではエンジン側で共通化している。
互換注意:
- Projectile 反射後の attack metadata 上書き設定はまだ仕様未確定。
- 反射後も Projectile 構造体上の attackInfo は維持される。
2.6 ClashDef / 小競り合い
Handsome-Goo では、攻撃判定同士の相殺を ClashDef で設定できる。
できること:
- HitDef に対して相殺可能条件を付ける。
- clashlevel / priority / clashpause / clashspark / clashsound を設定する。
- removeonclash で相殺時に攻撃を消す。
- ClashOverride で相殺後の state を変更する。
- scuffle = 1 の攻撃同士がぶつかった時、小競り合い state に入れる。
- svar(0..2) を小競り合い用の専用値として使える。
MUGEN / オリジナル Ikemen GO では、攻撃同士の相殺はキャラ側で独自に作ることが多い。
Handsome-Goo では SCTRL と trigger として扱える。
現行制限:
- 主経路は Player/Helper の Clsn1 vs Clsn1。
- projectile/weapon/throw flag は予約的に残している部分がある。
- `ClashDef attack.*` の精密な接触 index 判定は未実装。
2.7 複数アセット / ChangeAsset
Handsome-Goo では、複数 SFF/AIR/SND を読み込み、state 中に使用 asset を切り替えられる。
主な機能:
- AssetBundle
- ChangeAsset
- sprite / anim / sound asset の切替
- scope / persistent / fallback / resetanim / stopsndonchange
- PlaySnd.sndasset
- Explod.animasset
用途:
- 変身、武器変更、フォーム変更で別 AIR/SFF/SND を使う。
- キャラを分割 asset 化する。
- 反射 spark / sound に別 asset を使う。
互換注意:
- MUGEN / オリジナル Ikemen GO にはこの asset 切替仕様はない。
- 通常キャラ互換を重視する場合は、標準 SFF/AIR/SND にまとめる方が安全。
2.8 Sound channel
Handsome-Goo では、音声 channel の制御を拡張している。
追加機能:
- PlaySnd.autochannel
- PlaySnd.channelrange
- PlaySnd.channelpriority
- PlaySnd.avoidchannel
- PlaySnd.channelpolicy = replace / skip / findfree / oldest / lowpriority
- SoundChannelBusy
- SoundChannelFree
- SoundChannelGroup
- SoundChannelIndex
- SoundChannelTime
- FreeSoundChannel
- SoundGroupPlaying
- SoundPlaying
用途:
- ボイスと効果音の channel 衝突を避ける。
- 同じ音が重なりすぎるのを防ぐ。
- 古い音だけ差し替える。
- 空き channel を探して再生する。
MUGEN / オリジナル Ikemen GO では、ここまで細かい channel 管理はできない。
2.9 Headless battle / Batch / External API
Handsome-Goo は、画面表示を前提にしない自動対戦・外部ツール連携を強化している。
Headless battle:
- `-headless`
- `-fast`
- `-matches`
- `-batch battle_batch.json`
- round / match result の出力
- action stats
- AIGO training summary
- ai_state 出力
External API:
- localhost 専用で `127.0.0.1:<port>` に bind する。
- 外部入力、step 同期、状態取得、event 送信を扱う。
- allowRemote / authToken / host のようなネットワーク公開系設定は削除済み。
MUGEN / オリジナル Ikemen GO との違い:
- 自動評価、AI 学習、外部ツール連携を前提にできる。
- ネット公開 API ではなく、ローカルツール連携用 API として整理されている。
3. キャラ作者から見た互換性
--------------------------
3.1 MUGEN 互換キャラ
標準的な MUGEN キャラは、独自拡張を使わなければ概ね従来通りの考え方で扱える。
ただし、Handsome-Goo 専用 SCTRL / trigger / AIR key を使った場合、そのキャラは
MUGEN では互換性がなくなる。
MUGEN 互換を残したい場合:
- ArmorOverride ではなく従来の HitOverride / NotHitBy 等で作る。
- PartDefenseSet を使わない。
- Clsn1Group / Clsn2Group などを必須にしない。
- HitAttackGroup などの trigger を通常 CNS の必須条件にしない。
3.2 Ikemen GO 互換キャラ
オリジナル Ikemen GO 互換を残したい場合も、Handsome-Goo 独自 SCTRL は避ける必要がある。
互換を壊す代表例:
- type = ArmorOverride
- type = GuardPointOverride
- type = PartDefenseSet
- type = ReflectProjectile
- type = ClashDef
- trigger1 = HitAttackGroup(...)
- trigger1 = SoundChannelBusy(...)
- Clsn1Group[n] / Clsn2Group[n] を前提にした処理
- AIGO 専用ファイルを前提にした AI
一方、Handsome-Goo だけを対象にするなら、これらは機能として積極的に使える。
4. 開発者から見た変更箇所
------------------------
主な実装ファイル:
- `src/char.go`
hit、armor、guardpoint、reflect、clash、projectile、headless/event 周辺。
- `src/bytecode.go`
追加 SCTRL の runtime、trigger opcode、Projectile / ClashDef / ArmorOverride 実行。
- `src/compiler.go`
追加 trigger 登録、式コンパイル。
- `src/compiler_functions.go`
追加 SCTRL parameter のコンパイル。
- `src/anim.go`
Clsn1Group / Clsn1Type / Clsn1Attr、Clsn2Group / Clsn2Type の AIR 読み込み。
- `src/part_defense.go`
PartDefenseSet のデータ、部位判定、弱点、broken、ignore.attack.*。
- `src/aigo_*.go`
AIGO 本体、parser、pattern、SEQ、入力予約、debug。
- `src/external_api.go` 系
localhost API、step 同期、外部入力、event。
5. 現時点の主な未接続・注意点
----------------------------
1. Projectile 直接ヒットへの PartDefense
Projectile には `attack.group/type/attr` を設定できるが、PartDefenseSet の部位防御処理には
まだ直接接続していない。
2. ClashDef attack.* の接触 index
現在は相手の現在フレーム先頭 Clsn1 metadata を使う。
実際にぶつかった Clsn1 index を返す精密判定はまだない。
3. Projectile 反射後の attack metadata 上書き
反射後も attackInfo は保持されるが、反射側が metadata を明示的に上書きする仕様は未定義。
4. AIGO と CNS trigger の完全一致
AIGO 側の条件評価は独自 evaluator を持つため、CNS trigger と完全に同じ範囲を常に扱えるとは限らない。
追加 trigger を AIGO でも使う場合は、AIGO 側 evaluator への接続確認が必要。
6. まとめ
--------
MUGEN は基本形式の基準。
Ikemen GO は MUGEN 互換を拡張した現代的なエンジン。
Handsome-Goo は Ikemen GO をさらに、AI 開発、外部ツール連携、細かい戦闘制御、研究用自動対戦へ
寄せた派生版である。
キャラ互換を重視するなら、MUGEN / Ikemen GO の標準機能だけで作る。
Handsome-Goo 専用キャラとして作るなら、ArmorOverride、PartDefense、Clsn metadata、ReflectProjectile、
ClashDef、AIGO、Headless / External API を使うことで、通常の MUGEN/Ikemen GO では作りにくい
部位別防御、精密ガードポイント、攻撃属性判定、AI 学習、外部検証ワークフローを組める。