8 use Glib qw(TRUE FALSE);
11 our $SEMAPHORE_STEP = 1000;
14 my ($class, $args) = @_;
18 $self->{gui} = $args->{gui} or croak;
19 $self->{race_running} = 0;
20 $self->{lap_counting_up} = 1;
23 $self->{cars}->[$i] = SCX::Car->new({
32 sub car { return shift->{cars}->[shift]; }
37 return if $self->{race_running} || $self->{start_in_progress};
38 $self->{race_running} = 0;
39 $self->{start_in_progress} = 1;
40 $self->{semaphore} = 0;
41 $self->{gui}->show_semaphore(0);
42 Glib::Timeout->add($SEMAPHORE_STEP, \&semaphore_step, $self);
48 return if !$self->{start_in_progress} && !$self->{race_running};
51 if ($self->{semaphore} <= 5) {
52 $self->{gui}->show_semaphore($self->{semaphore});
53 my $timeout = $SEMAPHORE_STEP;
54 $timeout += $SEMAPHORE_STEP * rand()
55 if $self->{semaphore} == 5;
56 Glib::Timeout->add($timeout, \&semaphore_step, $self);
57 } elsif ($self->{semaphore} == 6) {
58 $self->{race_running} = 1;
59 $self->{start_in_progress} = undef;
60 $self->{gui}->show_semaphore(0);
61 Glib::Timeout->add(3*$SEMAPHORE_STEP, \&semaphore_step, $self);
63 $self->{gui}->show_semaphore(undef);
64 $self->{semaphore} = undef;
72 $self->{race_running} = 0;