1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
//! Action Plugin Events
//!
//! Provides Messages (buffered events) and Observer Events for action point system.
use *;
// ============================================================================
// Messages (Buffered Events - Bevy 0.17)
// ============================================================================
/// Request to consume action points for a specific entity
///
/// Publish this message to consume one action point from the specified entity.
///
/// # Example
///
/// ```rust
/// use bevy::prelude::*;
/// use issun_bevy::plugins::action::ConsumeActionMessage;
///
/// #[derive(Component)]
/// struct Player;
///
/// fn player_action(
/// mut commands: Commands,
/// player_query: Query<Entity, With<Player>>,
/// ) {
/// if let Ok(player) = player_query.single() {
/// commands.write_message(ConsumeActionMessage {
/// entity: player,
/// context: "Attack enemy".to_string(),
/// });
/// }
/// }
/// ```
/// Published when action points are consumed
///
/// This message is published after successful action consumption.
/// Subscribe to this message to react to action consumption (e.g., update UI).
/// Published when action points are reset (typically on day change)
///
/// This message is published for each entity when its action points are reset.
/// Request to check if turn should end
///
/// This message is published when any entity depletes its action points.
/// The turn-end checking system determines if ALL players are depleted
/// before advancing the turn.
///
/// ⚠️ CRITICAL: This is part of the two-step turn advancement design.
/// - Step 1: Any entity depletes → CheckTurnEndMessage published
/// - Step 2: System checks if ALL entities depleted → AdvanceTimeRequestedMessage
;
// ============================================================================
// Observer Events (Immediate Events for Extensibility)
// ============================================================================
/// Observer event triggered when action points are consumed
///
/// Use this event to add custom behavior when actions are consumed.
///
/// # Example
///
/// ```no_run
/// use bevy::prelude::*;
/// use issun_bevy::plugins::action::ActionConsumedHook;
///
/// fn log_action_consumed(trigger: Trigger<ActionConsumedHook>) {
/// let event = trigger.event();
/// info!(
/// "Entity {:?} consumed action: {} ({} remaining)",
/// event.entity, event.context, event.remaining
/// );
/// }
///
/// # fn setup(app: &mut App) {
/// app.add_observer(log_action_consumed);
/// # }
/// ```
/// Observer event triggered when entity's action points are depleted
///
/// Use this event to trigger turn-end checking or other depletion logic.
///
/// # Example
///
/// ```no_run
/// use bevy::prelude::*;
/// use issun_bevy::plugins::action::{ActionsDepletedHook, CheckTurnEndMessage};
///
/// fn on_actions_depleted(
/// trigger: Trigger<ActionsDepletedHook>,
/// mut commands: Commands,
/// ) {
/// warn!("Entity {:?} depleted all actions", trigger.event().entity);
/// commands.write_message(CheckTurnEndMessage);
/// }
///
/// # fn setup(app: &mut App) {
/// app.add_observer(on_actions_depleted);
/// # }
/// ```
/// Observer event triggered when action points are reset
///
/// Use this event to react to action point resets (e.g., update UI, log events).
///
/// # Example
///
/// ```no_run
/// use bevy::prelude::*;
/// use issun_bevy::plugins::action::ActionsResetHook;
///
/// fn on_actions_reset(trigger: Trigger<ActionsResetHook>) {
/// let event = trigger.event();
/// info!(
/// "Entity {:?} reset to {} actions",
/// event.entity, event.new_count
/// );
/// }
///
/// # fn setup(app: &mut App) {
/// app.add_observer(on_actions_reset);
/// # }
/// ```