#!/usr/bin/perl -w package SCX::Car; use strict; use Time::HiRes qw(gettimeofday); sub new { my ($class, $args) = @_; my $self = { gui => $args->{gui}, driver => $args->{driver} || '--', throttle => undef, fuel => 0, lap => 0, laptime => 0, avg_lap => 0, car_img => $args->{car_img}, id => $args->{id}, track => $args->{track}, }; bless $self, $class; return $self; } sub gui { return shift->{gui}; } sub track { return shift->{track}; } sub same { my ($self, $key, $val) = @_; return 1 if !defined $self->{$key} && !defined $val || (defined $self->{$key} && defined $val && $self->{$key} eq $val); $self->{$key} = $val; return undef; } sub set_throttle { my ($self, $val) = @_; return if $self->same('throttle', $val); if ($self->track->{start_in_progress} && $val) { $self->{early_start} = 1; $self->gui->set_driver('Early start!'); } $self->gui->set_throttle($self->{order}, $val); } sub set_fuel { my ($self, $val) = @_; return if $self->same('fuel', $val); $self->gui->set_fuel($self->{order}, $val); } sub set_light { # TODO } sub set_backbutton { # TODO } sub set_model { my ($self, $name) = @_; return if $self->same('car_img', $name); $self->gui->set_car_icon($self->{order}, $name); } sub set_lap { my ($self, $lap_nr) = @_; return if $self->same('lap', $lap_nr); $self->gui->set_lap($self->{order}, defined $lap_nr ? $lap_nr : '--'); if ($self->track->{race_running} && $self->{lap} > 1) { my $now = gettimeofday; my $avg = ($now - $self->track->{race_running_since}) / ($self->{lap} - 1); $self->{avg_lap} = $avg; $self->gui->set_avg_lap($self->{order}, $avg); } else { $self->gui->set_avg_lap($self->{order}, undef); } } sub set_laptime { my ($self, $lap_time) = @_; return if $self->same('laptime', $lap_time); $self->gui->set_laptime($self->{order}, $lap_time); if (defined $lap_time) { if ($lap_time > 1.0 && !$self->{in_pit_lane} && (!defined $self->{best_lap} || $self->{best_lap} > $lap_time )) { $self->{best_lap} = $lap_time; my $global = $self->{track}->check_best_lap($lap_time, $self->{driver} ); $self->gui->set_best_lap($self->{order}, $lap_time, $global); } } else { $self->gui->set_best_lap($self->{order}, $lap_time); $self->{best_lap} = undef; } } sub set_driver { my ($self, $driver_name) = @_; return if $self->same('driver', $driver_name); $self->gui->set_name($self->{order}, $driver_name); } sub enter_pit_lane { my ($self) = @_; return if $self->{in_pit_lane}; $self->{in_pit_lane} = 1; $self->gui->enter_pit_lane; } sub leave_pit_lane { my ($self) = @_; return if !$self->{in_pit_lane}; $self->{in_pit_lane} = 0; $self->gui->leave_pit_lane; } sub set_order { my ($self, $pos) = @_; $self->{order} = $pos; $self->gui->set_name($self->{order}, $self->{driver}); $self->gui->set_car_icon($self->{order}, $self->{car_icon}); $self->gui->set_throttle($self->{order}, $self->{throttle}); $self->gui->set_lap($self->{order}, $self->{lap}); $self->gui->set_laptime($self->{order}, $self->{laptime}); $self->gui->set_best_lap($self->{order}, $self->{best_lap}); $self->gui->set_avg_lap($self->{order}, $self->{avg_lap}); $self->gui->set_fuel($self->{order}, $self->{fuel}); if ($self->{in_pit_lane}) { $self->gui->enter_pit_lane; } } 1;