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 FALSE 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->{race_running_since} = gettimeofday;
60 $self->{start_in_progress} = undef;
61 $self->{gui}->show_semaphore(0);
62 Glib::Timeout->add(3*$SEMAPHORE_STEP, \&semaphore_step, $self);
64 $self->{gui}->show_semaphore(undef);
65 $self->{semaphore} = undef;
73 $self->{race_running} = 0;
77 my ($self, $rounds) = @_;
80 $self->{gui}->rounds('0/' . $rounds);
81 $self->{race_rounds} = $rounds;
83 $self->{gui}->rounds('0');
84 $self->{race_rounds} = 0;
86 $self->{race_time} = 0;
87 $self->{best_lap} = undef;
89 $self->{gui}->show_semaphore(undef);
90 $self->{race_running} = 0;
91 $self->{start_in_progress} = 0;
93 $self->{gui}->time('00:00');
94 $self->{gui}->best_lap('0.00');
97 $self->car($car)->set_order($car);