macro_rules! build_player_feature_adder {
    ($struct_name:ident, $prop_getter:expr, $( $column_names:expr ),* $(,)?) => { ... };
}
Expand description

This macro creates a player feature adder struct and implements the necessary traits to add the calculated player-specific features to the data matrix. The macro exports a struct with the same name as passed in the parameter. The number of column names and the length of the feature array returned by $prop_getter are checked at compile time to ensure they match, in line with the LengthCheckedPlayerFeatureAdder trait. The output struct also provides an implementation of the PlayerFeatureAdder trait via the impl_player_feature_adder! macro, allowing it to be used in contexts where a PlayerFeatureAdder object is required.

Parameters

  • $struct_name: The name of the struct to be created.
  • $prop_getter: The function or closure used to calculate the features.
  • $( $column_names:expr ),*: A comma-separated list of column names as strings.

Example

use subtr_actor::*;

fn u8_get_f32(v: u8) -> SubtrActorResult<f32> {
   v.try_into().map_err(convert_float_conversion_error)
}

build_player_feature_adder!(
    PlayerJump,
    |_,
     player_id: &PlayerId,
     processor: &ReplayProcessor,
     _frame,
     _frame_number,
     _current_time: f32| {
        convert_all_floats!(
            processor
                .get_dodge_active(player_id)
                .and_then(u8_get_f32)
                .unwrap_or(0.0),
            processor
                .get_jump_active(player_id)
                .and_then(u8_get_f32)
                .unwrap_or(0.0),
            processor
                .get_double_jump_active(player_id)
                .and_then(u8_get_f32)
                .unwrap_or(0.0),
        )
    },
    "dodge active",
    "jump active",
    "double jump active"
);

This will create a struct named PlayerJump and implement necessary traits to calculate features using the provided closure. The player-specific features will be added under the column names “dodge active”, “jump active”, and “double jump active” respectively.