X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FCar.pm;h=683a2cc77f22023c40249438a2d29ff4136694bc;hb=8709f4aa800632f00a54eeb2c85e20b38fe9f6fa;hp=4ef5543c1d089909cd38ba9093d958b5e3dd0cdb;hpb=345e8e96dea605056d0c35461c4f16234c247fba;p=slotcarman.git diff --git a/SCX/Car.pm b/SCX/Car.pm index 4ef5543..683a2cc 100644 --- a/SCX/Car.pm +++ b/SCX/Car.pm @@ -12,6 +12,7 @@ sub new { gui => $args->{gui}, driver => $args->{driver} || '--', throttle => undef, + button => undef, fuel => 0, lap => 0, laptime => 0, @@ -23,6 +24,8 @@ sub new { bless $self, $class; + $self->set_order($self->{id}); + return $self; } @@ -42,15 +45,24 @@ sub same { } sub set_throttle { - my ($self, $val) = @_; + my ($self, $val, $button, $time) = @_; - return if $self->same('throttle', $val); + return if $self->same('throttle', $val) + && $self->same('button', $button); if ($self->track->{start_in_progress} && $val) { $self->{early_start} = 1; - $self->gui->set_driver('Early start!'); + $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->gui->set_throttle($self->{order}, $val); + + $self->gui->set_throttle($self->{order}, $val, $button); } @@ -79,43 +91,55 @@ sub set_model { sub set_lap { my ($self, $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}, defined $lap_nr ? $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 = 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}, undef); + $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) { - 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; - } + 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 { @@ -131,7 +155,7 @@ sub enter_pit_lane { return if $self->{in_pit_lane}; $self->{in_pit_lane} = 1; - $self->gui->enter_pit_lane; + $self->print_state; } sub leave_pit_lane { @@ -140,7 +164,7 @@ sub leave_pit_lane { return if !$self->{in_pit_lane}; $self->{in_pit_lane} = 0; - $self->gui->leave_pit_lane; + $self->print_state; } sub set_order { @@ -149,17 +173,148 @@ sub set_order { $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_car_icon($self->{order}, $self->{car_img}); + $self->gui->set_throttle($self->{order}, $self->{throttle}, + $self->{button}); $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}, $self->{grey_diff}); + $self->print_state; +} + +sub print_state { + my ($self) = @_; + if ($self->{in_pit_lane}) { - $self->gui->enter_pit_lane; + $self->{state} = 'pit'; + } elsif ($self->{finished}) { + $self->{state} = 'finished'; + } elsif ($self->{early_start}) { + $self->{state} = 'disqualified'; + } else { + $self->{state} = 'greenflag'; } + + $self->gui->set_state($self->{order}, $self->{state}); } +sub reset { + my ($self) = @_; + + $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; +} + +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); + } 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, $finishing) = @_; + + return if !defined $lap_first || !defined $self->{lap} + || !defined $time_first || !defined $self->{first_finish_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) { + $self->{total_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}, $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;