忍者ブログ

雑・記ング・オブ・ファイターズ

ハンサムGooの説明

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 学習、外部検証ワークフローを組める。

PR

コメント

ただいまコメントを受けつけておりません。

プロフィール

HN:
ですからー
Webサイト:
性別:
非公開
自己紹介:
だまれ!

P R