]> www.fi.muni.cz Git - slotcarman.git/blob - SCX/Track.pm
Race setup, car reordering.
[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 FALSE 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->{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);
63         } else {
64                 $self->{gui}->show_semaphore(undef);
65                 $self->{semaphore} = undef;
66         }
67         return FALSE;
68 }
69
70 sub race_end {
71         my ($self) = @_;
72
73         $self->{race_running} = 0;
74 }
75
76 sub race_setup {
77         my ($self, $rounds) = @_;
78
79         if ($rounds) {
80                 $self->{gui}->rounds('0/' . $rounds);
81                 $self->{race_rounds} = $rounds;
82         } else {
83                 $self->{gui}->rounds('0');
84                 $self->{race_rounds} = 0;
85         }
86         $self->{race_time} = 0;
87         $self->{best_lap} = undef;
88
89         $self->{gui}->show_semaphore(undef);
90         $self->{race_running} = 0;
91         $self->{start_in_progress} = 0;
92
93         $self->{gui}->time('00:00');
94         $self->{gui}->best_lap('0.00');
95
96         for my $car (0..5) {
97                 $self->car($car)->set_order($car);
98         }
99 }
100
101 1;
102