X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FCar.pm;h=878247a902c2af5304987405e5edd0a9e601ae87;hb=75ce1fc525e3b555e435c08ce951e3b5a6c628b6;hp=b6466be7ad12ad3b97ffbf66b82a6a0cf386376a;hpb=cd3dd2cbdb007c774c2485a7e14cf12b75249dfd;p=slotcarman.git diff --git a/SCX/Car.pm b/SCX/Car.pm index b6466be..878247a 100644 --- a/SCX/Car.pm +++ b/SCX/Car.pm @@ -3,7 +3,6 @@ package SCX::Car; use strict; -use Time::HiRes qw(gettimeofday); sub new { my ($class, $args) = @_; @@ -17,15 +16,15 @@ sub new { lap => 0, laptime => 0, avg_lap => 0, - state => 'greenflag', car_img => $args->{car_img}, id => $args->{id}, - order => $args->{id}, track => $args->{track}, }; bless $self, $class; + $self->set_order($self->{id}); + return $self; } @@ -69,7 +68,16 @@ sub set_throttle { sub set_fuel { my ($self, $val) = @_; + my $prev = $self->{fuel}; return if $self->same('fuel', $val); + if (defined $val && defined $prev && $val < 8) { + if ($val == $prev + 1 && !$self->{in_pit_lane}) { + print STDERR $self->track->{now}, ' car ', + $self->{id}, ' missed pit lane entry', "\n"; + $self->enter_pit_lane; + } + } + $self->gui->set_fuel($self->{order}, $val); } @@ -100,6 +108,12 @@ sub set_lap { } return if $self->same('lap', $lap_nr); + if (defined $self->{lap} && defined $self->track->{race_rounds} + && $self->track->{race_rounds} > 0 + && $self->{lap} > $self->track->{race_rounds}) { + $self->{finished} = 1; + $self->print_state; + } $self->gui->set_lap($self->{order}, $lap_nr); if ($self->track->{race_running} && $self->{lap} > 1) { my $now = $self->{last_finish_time}; @@ -122,21 +136,18 @@ sub set_laptime { $self->gui->set_laptime($self->{order}, $lap_time); - if (defined $lap_time) { - if ($lap_time > 1.0 && !$self->{in_pit_lane} - && $self->track->{race_running} - && (!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); - } - } + return if !defined $lap_time || $lap_time <= 1.0 + || $self->{in_pit_lane}; + + return if $self->{finished}; + + return if 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); } sub set_driver { @@ -180,11 +191,8 @@ sub set_order { $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}); - $self->gui->set_state($self->{order}, $self->{state}); - if ($self->{in_pit_lane}) { - $self->gui->enter_pit_lane; - } + $self->{time_diff}, $self->{lap_diff}, $self->{grey_diff}); + $self->print_state; } sub print_state { @@ -192,8 +200,6 @@ sub print_state { if ($self->{in_pit_lane}) { $self->{state} = 'pit'; - } elsif ($self->{running}) { - $self->{state} = 'go'; } elsif ($self->{finished}) { $self->{state} = 'finished'; } elsif ($self->{early_start}) { @@ -210,12 +216,16 @@ sub reset { $self->set_lap(0); $self->set_laptime(undef); + $self->{finished} = 0; $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; + $self->{total_time} = undef; + $self->{grey_diff} = undef; + $self->print_state; } sub finish_line { @@ -243,22 +253,31 @@ sub finish_line { if ($self->track->{race_running}) { $self->set_lap($self->{lap} + 1); + } elsif ($self->track->{qualification_running} && !$self->{finished}) { + $self->set_lap($self->{lap} + 1); + if ($self->{lap} > $self->track->{race_rounds}) { + $self->{finished} = 1; + $self->print_state; + } } return 1; } sub recalc_distance { - my ($self, $lap_first, $time_first) = @_; + my ($self, $lap_first, $time_first, $finishing) = @_; return if !defined $lap_first || !defined $self->{lap} || !defined $time_first || !defined $self->{first_finish_time}; - my $time; + $self->{total_time} = undef; + $self->{lap_diff} = undef; + $self->{time_diff} = undef; + $self->{grey_diff} = undef; if ($self->{lap} == $lap_first) { if ($self->{first_finish_time} == $time_first) { - $time = $self->{first_finish_time} + $self->{total_time} = $self->{first_finish_time} - $self->track->{race_running_since}; } else { $self->{time_diff} = $self->{first_finish_time} @@ -268,8 +287,42 @@ sub recalc_distance { $self->{lap_diff} = $lap_first - $self->{lap}; } - $self->gui->set_distance($self->{order}, $time, - $self->{lap_diff}, $self->{time_diff}); + $self->gui->set_distance($self->{order}, $self->{total_time}, + $self->{lap_diff}, $self->{time_diff}, $self->{grey_diff}); + + if ($finishing) { + $self->{finished} = 1; + $self->print_state; + } +} + +sub recalc_qual_distance { + my ($self, $time_first) = @_; + + return if !defined $self->{best_lap} || $self->{best_lap} <= 0; + + $self->{total_time} = undef; + $self->{time_diff} = undef; + $self->{grey_diff} = undef; + $self->{lap_diff} = undef; + + if ($self->{best_lap} == $time_first) { + $self->{total_time} = $self->{best_lap}; + } else { + $self->{time_diff} = $self->{best_lap} - $time_first; + } + + $self->gui->set_distance($self->{order}, $self->{total_time}, + $self->{lap_diff}, $self->{time_diff}, $self->{grey_diff}); +} + +sub greyout_distance { + my ($self) = @_; + + return if $self->{grey_diff}; + $self->{grey_diff} = 1; + $self->gui->set_distance($self->{order}, $self->{total_time}, + $self->{lap_diff}, $self->{time_diff}, $self->{grey_diff}); } 1;