Skip to main content

subtr_actor/processor/
view.rs

1use super::*;
2
3/// Read-only processor surface consumed by collectors and stat calculators.
4///
5/// `ReplayProcessor` still owns replay traversal and actor-state mutation, but
6/// collectors should depend on this trait so the same collection pipeline can
7/// later be driven by non-replay state sources.
8pub trait ProcessorView {
9    fn get_replay_meta(&self) -> SubtrActorResult<ReplayMeta>;
10    fn player_count(&self) -> usize;
11    fn iter_player_ids_in_order(&self) -> Box<dyn Iterator<Item = &PlayerId> + '_>;
12    fn current_in_game_team_player_counts(&self) -> [usize; 2];
13
14    fn get_seconds_remaining(&self) -> SubtrActorResult<i32>;
15    fn get_replicated_state_name(&self) -> SubtrActorResult<i32>;
16    fn get_replicated_game_state_time_remaining(&self) -> SubtrActorResult<i32>;
17    fn get_ball_has_been_hit(&self) -> SubtrActorResult<bool>;
18    fn get_ignore_ball_syncing(&self) -> SubtrActorResult<bool>;
19    fn get_team_scores(&self) -> SubtrActorResult<(i32, i32)>;
20    fn get_ball_hit_team_num(&self) -> SubtrActorResult<u8>;
21    fn get_scored_on_team_num(&self) -> SubtrActorResult<u8>;
22
23    fn get_normalized_ball_rigid_body(&self) -> SubtrActorResult<boxcars::RigidBody>;
24    fn get_velocity_applied_ball_rigid_body(
25        &self,
26        target_time: f32,
27    ) -> SubtrActorResult<boxcars::RigidBody>;
28    fn get_interpolated_ball_rigid_body(
29        &self,
30        target_time: f32,
31        close_enough_to_frame_time: f32,
32    ) -> SubtrActorResult<boxcars::RigidBody>;
33
34    fn get_normalized_player_rigid_body(
35        &self,
36        player_id: &PlayerId,
37    ) -> SubtrActorResult<boxcars::RigidBody>;
38    fn get_velocity_applied_player_rigid_body(
39        &self,
40        player_id: &PlayerId,
41        target_time: f32,
42    ) -> SubtrActorResult<boxcars::RigidBody>;
43    fn get_interpolated_player_rigid_body(
44        &self,
45        player_id: &PlayerId,
46        target_time: f32,
47        close_enough_to_frame_time: f32,
48    ) -> SubtrActorResult<boxcars::RigidBody>;
49
50    fn get_player_name(&self, player_id: &PlayerId) -> SubtrActorResult<String>;
51    fn get_player_team_key(&self, player_id: &PlayerId) -> SubtrActorResult<String>;
52    fn get_player_is_team_0(&self, player_id: &PlayerId) -> SubtrActorResult<bool>;
53    fn get_player_id_from_car_id(&self, actor_id: &boxcars::ActorId) -> SubtrActorResult<PlayerId>;
54    fn get_player_boost_level(&self, player_id: &PlayerId) -> SubtrActorResult<f32>;
55    fn get_player_last_boost_level(&self, player_id: &PlayerId) -> SubtrActorResult<f32>;
56    fn get_player_boost_percentage(&self, player_id: &PlayerId) -> SubtrActorResult<f32>;
57    fn get_boost_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8>;
58    fn get_jump_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8>;
59    fn get_double_jump_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8>;
60    fn get_dodge_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8>;
61    fn get_powerslide_active(&self, player_id: &PlayerId) -> SubtrActorResult<bool>;
62    fn get_player_match_assists(&self, player_id: &PlayerId) -> SubtrActorResult<i32>;
63    fn get_player_match_goals(&self, player_id: &PlayerId) -> SubtrActorResult<i32>;
64    fn get_player_match_saves(&self, player_id: &PlayerId) -> SubtrActorResult<i32>;
65    fn get_player_match_score(&self, player_id: &PlayerId) -> SubtrActorResult<i32>;
66    fn get_player_match_shots(&self, player_id: &PlayerId) -> SubtrActorResult<i32>;
67
68    fn get_active_demos(&self) -> SubtrActorResult<Vec<DemolishAttribute>>;
69    fn demolishes(&self) -> &[DemolishInfo];
70    fn boost_pad_events(&self) -> &[BoostPadEvent];
71    fn touch_events(&self) -> &[TouchEvent];
72    fn dodge_refreshed_events(&self) -> &[DodgeRefreshedEvent];
73    fn player_stat_events(&self) -> &[PlayerStatEvent];
74    fn goal_events(&self) -> &[GoalEvent];
75    fn current_frame_active_demo_events(&self) -> &[DemoEventSample] {
76        &[]
77    }
78    fn current_frame_demolish_events(&self) -> &[DemolishInfo] {
79        &[]
80    }
81    fn current_frame_boost_pad_events(&self) -> &[BoostPadEvent];
82    fn current_frame_touch_events(&self) -> &[TouchEvent];
83    fn current_frame_dodge_refreshed_events(&self) -> &[DodgeRefreshedEvent];
84    fn current_frame_player_stat_events(&self) -> &[PlayerStatEvent];
85    fn current_frame_goal_events(&self) -> &[GoalEvent];
86}
87
88impl ProcessorView for ReplayProcessor<'_> {
89    fn get_replay_meta(&self) -> SubtrActorResult<ReplayMeta> {
90        ReplayProcessor::get_replay_meta(self)
91    }
92
93    fn player_count(&self) -> usize {
94        ReplayProcessor::player_count(self)
95    }
96
97    fn iter_player_ids_in_order(&self) -> Box<dyn Iterator<Item = &PlayerId> + '_> {
98        Box::new(ReplayProcessor::iter_player_ids_in_order(self))
99    }
100
101    fn current_in_game_team_player_counts(&self) -> [usize; 2] {
102        ReplayProcessor::current_in_game_team_player_counts(self)
103    }
104
105    fn get_seconds_remaining(&self) -> SubtrActorResult<i32> {
106        ReplayProcessor::get_seconds_remaining(self)
107    }
108
109    fn get_replicated_state_name(&self) -> SubtrActorResult<i32> {
110        ReplayProcessor::get_replicated_state_name(self)
111    }
112
113    fn get_replicated_game_state_time_remaining(&self) -> SubtrActorResult<i32> {
114        ReplayProcessor::get_replicated_game_state_time_remaining(self)
115    }
116
117    fn get_ball_has_been_hit(&self) -> SubtrActorResult<bool> {
118        ReplayProcessor::get_ball_has_been_hit(self)
119    }
120
121    fn get_ignore_ball_syncing(&self) -> SubtrActorResult<bool> {
122        ReplayProcessor::get_ignore_ball_syncing(self)
123    }
124
125    fn get_team_scores(&self) -> SubtrActorResult<(i32, i32)> {
126        ReplayProcessor::get_team_scores(self)
127    }
128
129    fn get_ball_hit_team_num(&self) -> SubtrActorResult<u8> {
130        ReplayProcessor::get_ball_hit_team_num(self)
131    }
132
133    fn get_scored_on_team_num(&self) -> SubtrActorResult<u8> {
134        ReplayProcessor::get_scored_on_team_num(self)
135    }
136
137    fn get_normalized_ball_rigid_body(&self) -> SubtrActorResult<boxcars::RigidBody> {
138        ReplayProcessor::get_normalized_ball_rigid_body(self)
139    }
140
141    fn get_velocity_applied_ball_rigid_body(
142        &self,
143        target_time: f32,
144    ) -> SubtrActorResult<boxcars::RigidBody> {
145        ReplayProcessor::get_velocity_applied_ball_rigid_body(self, target_time)
146    }
147
148    fn get_interpolated_ball_rigid_body(
149        &self,
150        target_time: f32,
151        close_enough_to_frame_time: f32,
152    ) -> SubtrActorResult<boxcars::RigidBody> {
153        ReplayProcessor::get_interpolated_ball_rigid_body(
154            self,
155            target_time,
156            close_enough_to_frame_time,
157        )
158    }
159
160    fn get_normalized_player_rigid_body(
161        &self,
162        player_id: &PlayerId,
163    ) -> SubtrActorResult<boxcars::RigidBody> {
164        ReplayProcessor::get_normalized_player_rigid_body(self, player_id)
165    }
166
167    fn get_velocity_applied_player_rigid_body(
168        &self,
169        player_id: &PlayerId,
170        target_time: f32,
171    ) -> SubtrActorResult<boxcars::RigidBody> {
172        ReplayProcessor::get_velocity_applied_player_rigid_body(self, player_id, target_time)
173    }
174
175    fn get_interpolated_player_rigid_body(
176        &self,
177        player_id: &PlayerId,
178        target_time: f32,
179        close_enough_to_frame_time: f32,
180    ) -> SubtrActorResult<boxcars::RigidBody> {
181        ReplayProcessor::get_interpolated_player_rigid_body(
182            self,
183            player_id,
184            target_time,
185            close_enough_to_frame_time,
186        )
187    }
188
189    fn get_player_name(&self, player_id: &PlayerId) -> SubtrActorResult<String> {
190        ReplayProcessor::get_player_name(self, player_id)
191    }
192
193    fn get_player_team_key(&self, player_id: &PlayerId) -> SubtrActorResult<String> {
194        ReplayProcessor::get_player_team_key(self, player_id)
195    }
196
197    fn get_player_is_team_0(&self, player_id: &PlayerId) -> SubtrActorResult<bool> {
198        ReplayProcessor::get_player_is_team_0(self, player_id)
199    }
200
201    fn get_player_id_from_car_id(&self, actor_id: &boxcars::ActorId) -> SubtrActorResult<PlayerId> {
202        ReplayProcessor::get_player_id_from_car_id(self, actor_id)
203    }
204
205    fn get_player_boost_level(&self, player_id: &PlayerId) -> SubtrActorResult<f32> {
206        ReplayProcessor::get_player_boost_level(self, player_id)
207    }
208
209    fn get_player_last_boost_level(&self, player_id: &PlayerId) -> SubtrActorResult<f32> {
210        ReplayProcessor::get_player_last_boost_level(self, player_id)
211    }
212
213    fn get_player_boost_percentage(&self, player_id: &PlayerId) -> SubtrActorResult<f32> {
214        ReplayProcessor::get_player_boost_percentage(self, player_id)
215    }
216
217    fn get_boost_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8> {
218        ReplayProcessor::get_boost_active(self, player_id)
219    }
220
221    fn get_jump_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8> {
222        ReplayProcessor::get_jump_active(self, player_id)
223    }
224
225    fn get_double_jump_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8> {
226        ReplayProcessor::get_double_jump_active(self, player_id)
227    }
228
229    fn get_dodge_active(&self, player_id: &PlayerId) -> SubtrActorResult<u8> {
230        ReplayProcessor::get_dodge_active(self, player_id)
231    }
232
233    fn get_powerslide_active(&self, player_id: &PlayerId) -> SubtrActorResult<bool> {
234        ReplayProcessor::get_powerslide_active(self, player_id)
235    }
236
237    fn get_player_match_assists(&self, player_id: &PlayerId) -> SubtrActorResult<i32> {
238        ReplayProcessor::get_player_match_assists(self, player_id)
239    }
240
241    fn get_player_match_goals(&self, player_id: &PlayerId) -> SubtrActorResult<i32> {
242        ReplayProcessor::get_player_match_goals(self, player_id)
243    }
244
245    fn get_player_match_saves(&self, player_id: &PlayerId) -> SubtrActorResult<i32> {
246        ReplayProcessor::get_player_match_saves(self, player_id)
247    }
248
249    fn get_player_match_score(&self, player_id: &PlayerId) -> SubtrActorResult<i32> {
250        ReplayProcessor::get_player_match_score(self, player_id)
251    }
252
253    fn get_player_match_shots(&self, player_id: &PlayerId) -> SubtrActorResult<i32> {
254        ReplayProcessor::get_player_match_shots(self, player_id)
255    }
256
257    fn get_active_demos(&self) -> SubtrActorResult<Vec<DemolishAttribute>> {
258        ReplayProcessor::get_active_demos(self).map(Iterator::collect)
259    }
260
261    fn demolishes(&self) -> &[DemolishInfo] {
262        &self.demolishes
263    }
264
265    fn boost_pad_events(&self) -> &[BoostPadEvent] {
266        &self.boost_pad_events
267    }
268
269    fn touch_events(&self) -> &[TouchEvent] {
270        &self.touch_events
271    }
272
273    fn dodge_refreshed_events(&self) -> &[DodgeRefreshedEvent] {
274        &self.dodge_refreshed_events
275    }
276
277    fn player_stat_events(&self) -> &[PlayerStatEvent] {
278        &self.player_stat_events
279    }
280
281    fn goal_events(&self) -> &[GoalEvent] {
282        &self.goal_events
283    }
284
285    fn current_frame_boost_pad_events(&self) -> &[BoostPadEvent] {
286        ReplayProcessor::current_frame_boost_pad_events(self)
287    }
288
289    fn current_frame_touch_events(&self) -> &[TouchEvent] {
290        ReplayProcessor::current_frame_touch_events(self)
291    }
292
293    fn current_frame_dodge_refreshed_events(&self) -> &[DodgeRefreshedEvent] {
294        ReplayProcessor::current_frame_dodge_refreshed_events(self)
295    }
296
297    fn current_frame_player_stat_events(&self) -> &[PlayerStatEvent] {
298        ReplayProcessor::current_frame_player_stat_events(self)
299    }
300
301    fn current_frame_goal_events(&self) -> &[GoalEvent] {
302        ReplayProcessor::current_frame_goal_events(self)
303    }
304}