X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=SCX%2FTrack.pm;h=4e0e722ce9dde34f93f750df2734aab0c4fbe23d;hb=8d71f3a03548e1c6946914404f2889e9cbbc55be;hp=f6200de651989d50c18d85f64a503b99a77a1905;hpb=471218eeb91909ba9601ccee0e4d66b1902e1e9e;p=slotcarman.git diff --git a/SCX/Track.pm b/SCX/Track.pm index f6200de..4e0e722 100644 --- a/SCX/Track.pm +++ b/SCX/Track.pm @@ -5,8 +5,12 @@ package SCX::Track; use strict; use Carp; +use Time::HiRes qw(gettimeofday); +use Glib qw(TRUE FALSE); use SCX::Car; +our $SEMAPHORE_STEP = 1000; + sub new { my ($class, $args) = @_; @@ -16,14 +20,18 @@ sub new { $self->{race_running} = 0; $self->{lap_counting_up} = 1; + bless $self, $class; + for my $i (0..5) { $self->{cars}->[$i] = SCX::Car->new({ gui => $self->{gui}, - order => $i, + id => $i, + track => $self, }); + $self->car($i)->set_order($i); } - bless $self, $class; + return $self; } sub car { return shift->{cars}->[shift]; } @@ -31,8 +39,37 @@ sub car { return shift->{cars}->[shift]; } sub race_start { my ($self) = @_; - $self->{race_running} = 1; + return if $self->{race_running} || $self->{start_in_progress}; + $self->{race_running} = 0; + $self->{start_in_progress} = 1; + $self->{semaphore} = 0; + $self->{gui}->show_semaphore(0); + Glib::Timeout->add($SEMAPHORE_STEP, \&semaphore_step, $self); +} + +sub semaphore_step { + my ($self) = @_; + return FALSE if !$self->{start_in_progress} && !$self->{race_running}; + + $self->{semaphore}++; + if ($self->{semaphore} <= 5) { + $self->{gui}->show_semaphore($self->{semaphore}); + my $timeout = $SEMAPHORE_STEP; + $timeout += $SEMAPHORE_STEP * rand() + if $self->{semaphore} == 5; + Glib::Timeout->add($timeout, \&semaphore_step, $self); + } elsif ($self->{semaphore} == 6) { + $self->{race_running} = 1; + $self->{race_running_since} = gettimeofday; + $self->{start_in_progress} = undef; + $self->{gui}->show_semaphore(0); + Glib::Timeout->add(3*$SEMAPHORE_STEP, \&semaphore_step, $self); + } else { + $self->{gui}->show_semaphore(undef); + $self->{semaphore} = undef; + } + return FALSE; } sub race_end { @@ -41,5 +78,46 @@ sub race_end { $self->{race_running} = 0; } +sub race_setup { + my ($self, $rounds) = @_; + + if ($rounds) { + $self->{gui}->rounds('0/' . $rounds); + $self->{race_rounds} = $rounds; + } else { + $self->{gui}->rounds('0'); + $self->{race_rounds} = 0; + } + $self->{race_time} = 0; + $self->{best_lap} = undef; + + $self->{gui}->show_semaphore(undef); + $self->{race_running} = 0; + $self->{start_in_progress} = 0; + + $self->{gui}->time('00:00'); + $self->{gui}->best_lap('0.00'); + + for my $car (0..5) { + $self->car($car)->set_order($car); + $self->car($car)->set_lap(0); + $self->car($car)->set_laptime(undef); + } +} + +sub check_best_lap { + my ($self, $time, $who) = @_; + + return if !defined $time || $time == 0; + + if (!defined $self->{best_lap} + || $time < $self->{best_lap}) { + $self->{best_lap} = $time; + $self->{gui}->best_lap(sprintf("%.2f", $time), $who); + return 1; + } + return 0; +} + 1;