use strict;
use Carp;
+use Glib qw(TRUE FALSE);
use SCX::Car;
+our $SEMAPHORE_STEP = 1000;
+
sub new {
my ($class, $args) = @_;
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 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->{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 {
$self->{race_running} = 0;
}
+
1;