X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FCar.pm;h=9f58b5b720f79edd614fc7c853914838403f200f;hb=972687391b212153ee34a6ecf616fd1c1a53d01b;hp=7dffb7a5361df8d184e1a303884e07f8aa5575c8;hpb=8d71f3a03548e1c6946914404f2889e9cbbc55be;p=slotcarman.git diff --git a/SCX/Car.pm b/SCX/Car.pm index 7dffb7a..9f58b5b 100644 --- a/SCX/Car.pm +++ b/SCX/Car.pm @@ -10,17 +10,20 @@ sub new { my $self = { gui => $args->{gui}, - throttle => -1, - fuel => -1, + driver => $args->{driver} || '--', + throttle => undef, + fuel => 0, + lap => 0, + laptime => 0, + avg_lap => 0, + car_img => $args->{car_img}, id => $args->{id}, + order => $args->{id}, track => $args->{track}, }; bless $self, $class; - $self->set_throttle(undef); - $self->set_fuel(undef); - return $self; } @@ -28,14 +31,34 @@ 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) = @_; + my ($self, $val, $time) = @_; - return if (!defined $self->{throttle} && !defined $val) - || (defined $self->{throttle} && defined $val - && $self->{throttle} == $val); + return if $self->same('throttle', $val); + + if ($self->track->{start_in_progress} && $val) { + $self->{early_start} = 1; + $self->gui->set_name($self->{order}, 'Early start!'); + } + + if ($self->{in_pit_lane} && defined $val) { + $self->{last_finish_time} = $time; + if ($val > 3) { + $self->leave_pit_lane; + } + } - $self->{throttle} = $val; $self->gui->set_throttle($self->{order}, $val); } @@ -43,11 +66,7 @@ sub set_throttle { sub set_fuel { my ($self, $val) = @_; - return if (!defined $self->{fuel} && !defined $val) - || (defined $self->{fuel} && defined $val - && $self->{fuel} == $val); - - $self->{fuel} = $val; + return if $self->same('fuel', $val); $self->gui->set_fuel($self->{order}, $val); } @@ -62,40 +81,47 @@ sub set_backbutton { sub set_model { my ($self, $name) = @_; - return if (!defined $self->{car_icon} && !defined $name) - || (defined $self->{car_icon} && defined $name - && $self->{car_icon} eq $name); - - $self->{car_icon} = $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 (!defined $self->{lap} && !defined $lap_nr) - || (defined $self->{lap} && defined $lap_nr - && $self->{lap} == $lap_nr); - - $self->{lap} = $lap_nr; - $self->gui->set_lap($self->{order}, defined $lap_nr ? $lap_nr : '--'); + if (!$lap_nr) { + $self->{avg_lap} = undef; + $self->{lap} = $lap_nr; + $self->gui->set_avg_lap($self->{order}, undef); + $self->gui->set_lap($self->{order}, $lap_nr); + return; + } + + return if $self->same('lap', $lap_nr); + $self->gui->set_lap($self->{order}, $lap_nr); if ($self->track->{race_running} && $self->{lap} > 1) { - my $now = gettimeofday; + my $now = $self->{last_finish_time}; 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}, '--'); + $self->gui->set_avg_lap($self->{order}, $self->{avg_lap}); } } sub set_laptime { my ($self, $lap_time) = @_; + if (!defined $lap_time) { + $self->gui->set_best_lap($self->{order}, undef); + $self->{best_lap} = undef; + } + + return if $self->same('laptime', $lap_time); + + $self->gui->set_laptime($self->{order}, $lap_time); + if (defined $lap_time) { - $lap_time = sprintf("%.2f", $lap_time); if ($lap_time > 1.0 && !$self->{in_pit_lane} + && $self->track->{race_running} && (!defined $self->{best_lap} || $self->{best_lap} > $lap_time )) { @@ -107,30 +133,14 @@ sub set_laptime { $self->gui->set_best_lap($self->{order}, $lap_time, $global); } - } else { - $self->gui->set_best_lap($self->{order}, '--'); - $self->{best_lap} = undef; } - - return if (!defined $self->{laptime} && !defined $lap_time) - || (defined $self->{laptime} && defined $lap_time - && $self->{laptime} == $lap_time); - - $self->{laptime} = $lap_time; - - $self->gui->set_laptime($self->{order}, defined $lap_time - ? $lap_time : '--'); } sub set_driver { my ($self, $driver_name) = @_; - return if (!defined $self->{driver} && !defined $driver_name) - || (defined $self->{driver} && defined $driver_name - && $self->{driver} == $driver_name); - - $self->{driver} = $driver_name; - $self->gui->set_driver($self->{order}, $driver_name || '--'); + return if $self->same('driver', $driver_name); + $self->gui->set_name($self->{order}, $driver_name); } sub enter_pit_lane { @@ -139,7 +149,7 @@ sub enter_pit_lane { return if $self->{in_pit_lane}; $self->{in_pit_lane} = 1; - $self->gui->enter_pit_lane; + $self->gui->enter_pit_lane($self->{order}); } sub leave_pit_lane { @@ -148,7 +158,7 @@ sub leave_pit_lane { return if !$self->{in_pit_lane}; $self->{in_pit_lane} = 0; - $self->gui->leave_pit_lane; + $self->gui->leave_pit_lane($self->{order}); } sub set_order { @@ -156,20 +166,88 @@ sub set_order { $self->{order} = $pos; - $self->gui->set_driver($self->{order}, $self->{driver} - || '--'); - $self->gui->set_car_icon($self->{order}, $self->{car_icon}); + $self->gui->set_name($self->{order}, $self->{driver}); + $self->gui->set_car_icon($self->{order}, $self->{car_img}); $self->gui->set_throttle($self->{order}, $self->{throttle}); - $self->gui->set_lap($self->{order}, defined $self->{lap} - ? $self->{lap} : '--'); - $self->gui->set_laptime($self->{order}, defined $self->{laptime} - ? $self->{laptime} : '--'); - $self->gui->set_best_lap($self->{order}, defined $self->{best_lap} - ? $self->{best_lap} : '--'); - $self->gui->set_avg_lap($self->{order}, defined $self->{avg_lap} - ? $self->{avg_lap} : '--'); + $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}); + $self->gui->set_car_id($self->{order}, $self->{id} + 1); + $self->gui->set_distance($self->{order}, + $self->{time_diff}, $self->{lap_diff}); + if ($self->{in_pit_lane}) { + $self->gui->enter_pit_lane; + } } - + +sub reset { + my ($self) = @_; + + $self->set_lap(0); + $self->set_laptime(undef); + $self->{in_pit_lane} = 0; + $self->{early_start} = undef; + $self->{last_finish_time} = undef; + $self->{first_finish_time} = undef; + $self->{time_diff} = undef; + $self->{lap_diff} = undef; +} + +sub finish_line { + my ($self, $time, $regular) = @_; + + if (defined $self->{last_finish_time} + && $time - $self->{last_finish_time} < 2) { + + $self->{last_finish_time} = $time; + if ($regular && $self->{in_pit_lane}) { + $self->leave_pit_lane; + } + return undef; + } + + if ($regular) { + if (defined $self->{first_finish_time}) { + $self->set_laptime($time - $self->{first_finish_time}); + } + } else { + $self->enter_pit_lane; + } + + $self->{first_finish_time} = $self->{last_finish_time} = $time; + + if ($self->track->{race_running}) { + $self->set_lap($self->{lap} + 1); + } + + return 1; +} + +sub recalc_distance { + my ($self, $lap_first, $time_first) = @_; + + return if !defined $lap_first || !defined $self->{lap} + || !defined $time_first || !defined $self->{first_finish_time}; + + my $time; + + if ($self->{lap} == $lap_first) { + if ($self->{first_finish_time} == $time_first) { + $time = $self->{first_finish_time} + - $self->track->{race_running_since}; + } else { + $self->{time_diff} = $self->{first_finish_time} + - $time_first; + } + } else { + $self->{lap_diff} = $lap_first - $self->{lap}; + } + + $self->gui->set_distance($self->{order}, $time, + $self->{lap_diff}, $self->{time_diff}); +} + 1;