]> www.fi.muni.cz Git - slotcarman.git/blob - SCX/Track.pm
c75659282f57061f35e3002efb567482b213b732
[slotcarman.git] / SCX / Track.pm
1 #!/usr/bin/perl -w
2
3 package SCX::Track;
4
5 use strict;
6 use Carp;
7
8 use Glib qw(TRUE FALSE);
9 use SCX::Car;
10
11 our $SEMAPHORE_STEP = 1000;
12
13 sub new {
14         my ($class, $args) = @_;
15
16         my $self;
17
18         $self->{gui} = $args->{gui} or croak;
19         $self->{race_running} = 0;
20         $self->{lap_counting_up} = 1;
21
22         for my $i (0..5) {
23                 $self->{cars}->[$i] = SCX::Car->new({
24                         gui => $self->{gui},
25                         order => $i,
26                 });
27         }
28
29         bless $self, $class;
30 }
31
32 sub car { return shift->{cars}->[shift]; }
33
34 sub race_start {
35         my ($self) = @_;
36
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);
43 }
44
45 sub semaphore_step {
46         my ($self) = @_;
47
48         return if !$self->{start_in_progress} && !$self->{race_running};
49
50         $self->{semaphore}++;
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);
62         } else {
63                 $self->{gui}->show_semaphore(undef);
64                 $self->{semaphore} = undef;
65         }
66         return FALSE;
67 }
68
69 sub race_end {
70         my ($self) = @_;
71
72         $self->{race_running} = 0;
73 }
74
75
76 1;
77