/**
  * {@inheritdoc}
  */
 public static function fromArray(array $values)
 {
     $message = new self();
     $values = array_merge(['energy_per_sec' => null, 'dodge_energy_cost' => null, 'retarget_seconds' => null, 'enemy_attack_interval' => null, 'attack_server_interval' => null, 'round_duration_seconds' => null, 'bonus_time_per_ally_seconds' => null, 'maximum_attackers_per_battle' => null, 'same_type_attack_bonus_multiplier' => null, 'maximum_energy' => null, 'energy_delta_per_health_lost' => null, 'dodge_duration_ms' => null, 'minimum_player_level' => null, 'swap_duration_ms' => null, 'dodge_damage_reduction_percent' => null], $values);
     $message->setEnergyPerSec($values['energy_per_sec']);
     $message->setDodgeEnergyCost($values['dodge_energy_cost']);
     $message->setRetargetSeconds($values['retarget_seconds']);
     $message->setEnemyAttackInterval($values['enemy_attack_interval']);
     $message->setAttackServerInterval($values['attack_server_interval']);
     $message->setRoundDurationSeconds($values['round_duration_seconds']);
     $message->setBonusTimePerAllySeconds($values['bonus_time_per_ally_seconds']);
     $message->setMaximumAttackersPerBattle($values['maximum_attackers_per_battle']);
     $message->setSameTypeAttackBonusMultiplier($values['same_type_attack_bonus_multiplier']);
     $message->setMaximumEnergy($values['maximum_energy']);
     $message->setEnergyDeltaPerHealthLost($values['energy_delta_per_health_lost']);
     $message->setDodgeDurationMs($values['dodge_duration_ms']);
     $message->setMinimumPlayerLevel($values['minimum_player_level']);
     $message->setSwapDurationMs($values['swap_duration_ms']);
     $message->setDodgeDamageReductionPercent($values['dodge_damage_reduction_percent']);
     return $message;
 }