Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions doc/dev/role/01_overview.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,8 @@ ExtremeRoles/Roles/Solo/Crewmate/MyRole/
2. **オプションの実装**: [03_option_factory.md](./03_option_factory.md)
3. **能力の実装**: [04_ability_handler.md](./04_ability_handler.md)
4. **状態管理の実装**: [05_status_model.md](./05_status_model.md)
5. **インターフェースの活用**: [06_interfaces_and_methods.md](./06_interfaces_and_methods.md)
6. **役職の登録**: [07_registration_and_selector.md](./07_registration_and_selector.md)
7. **翻訳の追加**: [08_translation.md](./08_translation.md)
5. **インターフェースの活用**: [07_interfaces.md](./07_interfaces.md) / [08_methods.md](./08_methods.md)
6. **役職の登録**: [98_registration.md](./98_registration.md)
7. **翻訳の追加**: [99_translation.md](./99_translation.md)

各ステップの詳細は、番号順の各ドキュメントを参照してください。
2 changes: 1 addition & 1 deletion doc/dev/role/02_role_class.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,4 +89,4 @@ public MyRole() : base(

## 重要なメソッドとインターフェース

利用可能な主要メソッドや拡張インターフェースについては、[重要なメソッドとインターフェース](./06_interfaces_and_methods.md) を参照してください。
利用可能な主要メソッドや拡張インターフェースについては、[インターフェース](./07_interfaces.md) および [主要なメソッドとプロパティ](./08_methods.md) を参照してください。
2 changes: 1 addition & 1 deletion doc/dev/role/04_ability_handler.md
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,4 @@ public bool Execute(byte targetId)

## 便利なインターフェース

AbilityHandler で活用できるインターフェースについては、[重要なメソッドとインターフェース](./06_interfaces_and_methods.md) を参照してください。
AbilityHandler で活用できるインターフェースについては、[インターフェース](./07_interfaces.md) を参照してください。
229 changes: 177 additions & 52 deletions doc/dev/role/07_interfaces.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,180 @@

役職作成において頻繁に使用する機能拡張のためのインターフェースについて説明します。

## 機能拡張インターフェース

特定のインターフェースを実装することで、様々なゲームイベントにフックできます。**`IRole` から始まる名前のインターフェースは、主に `SingleRoleBase` (Roleクラス) に実装することを目的としています。**

### Roleクラス (SingleRoleBase) 向け
これらのインターフェースは通常、役職の定義である Role クラスに実装します。

- **`IRoleUpdate`**
- `Update(PlayerControl rolePlayer)`: 毎フレーム呼ばれます。
- **`IRoleResetMeeting`**
- `ResetOnMeetingStart()`: 会議開始時に呼ばれます。
- `ResetOnMeetingEnd(NetworkedPlayerInfo? exiledPlayer)`: 会議終了時に呼ばれます。

#### 投票・会議
- **`IRoleVoteModifier`**
- `ModifiedVote(...)`: 投票結果を書き換えます。
- `GetModdedVoteInfo(...)`: 投票の演出を書き換えます。
- **`IRoleMeetingButtonAbility`**
- 会議中の投票画面に特殊なボタンを追加したい場合に実装します。

#### フック・割り込み
- **`IRoleReportHook`**
- `HookReportButton(...)`: 緊急会議ボタンが押された時に割り込みます。
- `HookBodyReport(...)`: 死体レポート時に割り込みます。
- **`IRolePerformKillHook`**
- キルを実行する瞬間に割り込みます。
- **`IRoleMurderPlayerHook`**
- プレイヤーが殺害される処理に割り込みます。

### 能力・ロジック (AbilityHandler) 向け
能動的な能力や詳細なロジックを担う `AbilityHandler` に実装できるインターフェースです。

- **`IKilledFrom`**
- `IKilledFrom(PlayerControl rolePlayer, PlayerControl fromPlayer)`: `fromPlayer`が`rolePlayer`に対してキルボタンを押した時に呼ばれます。`true`を返すとキルされます

- **`IInvincible`**
- `IsValidKillFromSource(byte source)` : `source`からキルの対象になるかどうかの判定
- `IsValidAbilitySource(byte source)` : `source`から能力の対象になるかどうかの判定
- `IsBlockKillFrom(byte? fromTarget)`: `fromTarget`からのキルをブロックするかどうかを判定します。

- **`IExiledAnimationOverrideWhenExiled`**
- `OverrideInfo`: 追放時のメッセージやアニメーションを上書きします。

- **`IVoteCheck`**
- `VoteTo(byte target)`: `target`へ投票した時のフック

### ビジュアル (IVisual) 向け
役職のビジュアル向けのロジックを担う `Visual` に実装することされるインターフェースです。
- **`IVisual`**
- `UpdateVisual(PlayerControl rolePlayer)`: プレイヤーの見た目(色やエフェクト)を更新します。
- **`ILookedTag`**
- 他のプレイヤーから見た時のタグを制御します。
## 機能拡張インターフェースの概要

特定のインターフェースを実装することで、様々なゲームイベントにフックできます。
- **`IRole` から始まる名前**: 主に `SingleRoleBase` (Roleクラス) に実装することを目的としています。
- **それ以外の名前**: 主に `AbilityHandler` や `StatusModel` に実装することを目的としています。

---

## Roleクラス (SingleRoleBase) 向け

### 基本イベント
#### `IRoleUpdate`
毎フレームの更新処理を実装します。
- `void Update(PlayerControl rolePlayer)`
- `rolePlayer`: この役職を持つプレイヤーのインスタンス。

#### `IRoleResetMeeting`
会議の開始時と終了時のリセット処理を実装します。
- `void ResetOnMeetingStart()`
- 会議が開始された瞬間に呼ばれます。
- `void ResetOnMeetingEnd(NetworkedPlayerInfo? exiledPlayer)`
- 会議が終了し、追放が確定した後に呼ばれます。
- `exiledPlayer`: 追放されたプレイヤーの情報(誰も追放されなかった場合は `null`)。

#### `IRoleSpecialSetUp`
役職の導入(イントロ)演出に関するセットアップを行います。
- `void IntroBeginSetUp()`
- イントロ演出が開始される直前に呼ばれます。
- `void IntroEndSetUp()`
- イントロ演出が終了した直前に呼ばれます。

---

### 投票・会議
#### `IRoleVoteModifier`
投票結果を動的に書き換えます。
- `int Order { get; }`
- 変更の優先順位。`ModOrder` 列挙型を使用して指定します。
- `void ModifiedVote(byte rolePlayerId, ref Dictionary<byte, byte> voteTarget, ref Dictionary<byte, int> voteResult)`
- `rolePlayerId`: 役職保持者のプレイヤーID。
- `voteTarget`: 誰が誰に投票したかの辞書。
- `voteResult`: 各プレイヤーが獲得した票数の辞書。
- `IEnumerable<VoteInfo> GetModdedVoteInfo(VoteInfoCollector collector, NetworkedPlayerInfo rolePlayer)`
- 投票の演出(投票画面のバッジ等)を書き換えます。
- `void ResetModifier()`
- 会議終了後などに内部状態をリセットします。

#### `IRoleMeetingButtonAbility`
会議中の投票画面に特殊なボタンを追加します。
- `bool IsBlockMeetingButtonAbility(PlayerVoteArea instance)`: ボタンを無効化するかどうか。
- `void ButtonMod(PlayerVoteArea instance, UiElement abilityButton)`: ボタンの見た目をカスタマイズ。
- `Action CreateAbilityAction(PlayerVoteArea instance)`: ボタンが押された時の動作を返します。
- `Sprite AbilityImage { get; }`: ボタンのアイコン画像。

#### `IRoleHookVoteEnd`
投票結果が確定した直後に呼ばれます。
- `void HookVoteEnd(MeetingHud instance, NetworkedPlayerInfo rolePlayer, IReadOnlyDictionary<byte, int> voteIndex)`
- `voteIndex`: 各プレイヤーが得た最終的な票数。

---

### フック・割り込み
#### `IRoleReportHook`
レポートや緊急会議ボタンの挙動に割り込みます。
- `void HookReportButton(PlayerControl rolePlayer, NetworkedPlayerInfo reporter)`
- `reporter`: ボタンを押したプレイヤー。
- `void HookBodyReport(PlayerControl rolePlayer, NetworkedPlayerInfo reporter, NetworkedPlayerInfo reportBody)`
- `reportBody`: 通報された死体の情報。

#### `IRolePerformKillHook`
キルアニメーションの開始時と終了時に呼ばれます。
- `void OnStartKill()`
- `void OnEndKill()`

#### `IRoleMurderPlayerHook`
プレイヤーが殺害される瞬間の処理に割り込みます(キルボタン押下時ではなく、実際の死亡処理時)。
- `void HookMuderPlayer(PlayerControl source, PlayerControl target)`

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

low

HookMuderPlayerHookMurderPlayer のスペルミスと思われます。

Suggested change
- `void HookMuderPlayer(PlayerControl source, PlayerControl target)`
- void HookMurderPlayer(PlayerControl source, PlayerControl target)

- `source`: 加害者, `target`: 被害者。

---

### 特殊状態・ライフサイクル
#### `IRoleWinPlayerModifier`
勝利条件や勝利チームの判定を書き換えます。
- `void ModifiedWinPlayer(NetworkedPlayerInfo rolePlayerInfo, GameOverReason reason, in WinnerContainer winner)`
- `winner`: 勝利者リストを含むコンテナ。この内容を書き換えることで勝利者を操作できます。

#### `IRoleAwake<T>`
「覚醒」などの状態変化を持つ役職で使用します。
- `bool IsAwake { get; }`: 覚醒しているかどうか。
- `T NoneAwakeRole { get; }`: 未覚醒状態のID。
- `string GetFakeOptionString()`: オプション画面での表示。

#### `IRoleOnRevive` / `IRoleReviveHook`
蘇生に関する処理を実装します。
- `void ReviveAction(PlayerControl player)`: 自身が蘇生した時の処理。
- `void HookRevive(PlayerControl revivePlayer)`: 誰かが蘇生した時に呼ばれるフック。

#### `IRoleFakeIntro`
イントロ画面で別のチームとして表示させたい場合に実装します。
- `ExtremeRoleType FakeTeam { get; }`: 表示上のチーム(Crewmate, Impostorなど)。

#### `IRoleSpecialReset`
役職が剥奪されたり、特殊なリセットが必要な場合に実装します。
- `void AllReset(PlayerControl rolePlayer)`

---

## 能力・ロジック (AbilityHandler) 向け

#### `IKilledFrom`
キルボタンが押された瞬間の判定を行います。
- `bool TryKilledFrom(PlayerControl rolePlayer, PlayerControl fromPlayer)`
- `true` を返すと、通常のキル処理を続行(殺害を許可)します。

#### `IInvincible`
無敵状態やキル・能力の対象外判定を行います。
- `bool IsBlockKillFrom(byte? fromPlayer)`: `fromPlayer` からのキルをブロックするか。
- `bool IsValidKillFromSource(byte source)`: 指定されたソースからのキルが有効か。

#### `IExiledAnimationOverrideWhenExiled`
追放時のアニメーションテキストなどを上書きします。
- `OverrideInfo? OverrideInfo { get; }`: `ExiledPlayer` と `AnimationText` を含むレコード。

#### `IVoteCheck`
投票を行った時のフックです。
- `void VoteTo(byte target)`: 投票先のプレイヤーID。

#### `ITryKillTo`
自分が誰かをキルしようとした時の判定です。
- `bool TryRolePlayerKillTo(PlayerControl rolePlayer, PlayerControl targetPlayer)`

---

## 状態管理 (StatusModel) 向け

#### `IDeadBodyReportOverrideStatus`
死体の通報可否を制御します。
- `bool CanReport { get; }`

#### `IFakeImpostorStatus`
ゲームシステム上でインポスターとして扱われるかどうか(通報画面の赤文字など)。
- `bool IsFakeImpostor { get; }`

#### `IStatusMovable`
移動可能かどうかを制御します。
- `bool CanMove { get; }`

#### `ISubTeam`
第三陣営内での所属チーム(例:ジャッカルチーム等)を定義します。
- `NeutralSeparateTeam Main { get; }`
- `NeutralSeparateTeam Sub { get; }`

#### `IUsableOverrideStatus`
ボタンの有効化状態を制御します。
- `bool EnableUseButton { get; }`
- `bool EnableVentButton { get; }`

---

## 実装例

```csharp
public sealed class MyRoleAbilityHandler : IAbility, IKilledFrom
{
// キルボタンを押された時の処理
public bool TryKilledFrom(PlayerControl rolePlayer, PlayerControl fromPlayer)
{
// 50%の確率でキルを回避
if (UnityEngine.Random.value > 0.5f)
{
return false; // キルを阻止
}
return true; // キルを許可
}
}
```
Loading
Loading