]> www.fi.muni.cz Git - slotcarman.git/blob - SCX/Track.pm
Best lap handling.
[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 Time::HiRes qw(gettimeofday);
9 use Glib qw(TRUE FALSE);
10 use SCX::Car;
11
12 our $SEMAPHORE_STEP = 1000;
13
14 sub new {
15         my ($class, $args) = @_;
16
17         my $self;
18
19         $self->{gui} = $args->{gui} or croak;
20         $self->{race_running} = 0;
21         $self->{lap_counting_up} = 1;
22
23         bless $self, $class;
24
25         for my $i (0..5) {
26                 $self->{cars}->[$i] = SCX::Car->new({
27                         gui => $self->{gui},
28                         order => $i,
29                         track => $self,
30                 });
31         }
32
33         return $self;
34 }
35
36 sub car { return shift->{cars}->[shift]; }
37
38 sub race_start {
39         my ($self) = @_;
40
41         return if $self->{race_running} || $self->{start_in_progress};
42         $self->{race_running} = 0;
43         $self->{start_in_progress} = 1;
44         $self->{semaphore} = 0;
45         $self->{gui}->show_semaphore(0);
46         Glib::Timeout->add($SEMAPHORE_STEP, \&semaphore_step, $self);
47 }
48
49 sub semaphore_step {
50         my ($self) = @_;
51
52         return FALSE if !$self->{start_in_progress} && !$self->{race_running};
53
54         $self->{semaphore}++;
55         if ($self->{semaphore} <= 5) {
56                 $self->{gui}->show_semaphore($self->{semaphore});
57                 my $timeout = $SEMAPHORE_STEP;
58                 $timeout += $SEMAPHORE_STEP * rand()
59                         if $self->{semaphore} == 5;
60                 Glib::Timeout->add($timeout, \&semaphore_step, $self);
61         } elsif ($self->{semaphore} == 6) {
62                 $self->{race_running} = 1;
63                 $self->{race_running_since} = gettimeofday;
64                 $self->{start_in_progress} = undef;
65                 $self->{gui}->show_semaphore(0);
66                 Glib::Timeout->add(3*$SEMAPHORE_STEP, \&semaphore_step, $self);
67         } else {
68                 $self->{gui}->show_semaphore(undef);
69                 $self->{semaphore} = undef;
70         }
71         return FALSE;
72 }
73
74 sub race_end {
75         my ($self) = @_;
76
77         $self->{race_running} = 0;
78 }
79
80 sub race_setup {
81         my ($self, $rounds) = @_;
82
83         if ($rounds) {
84                 $self->{gui}->rounds('0/' . $rounds);
85                 $self->{race_rounds} = $rounds;
86         } else {
87                 $self->{gui}->rounds('0');
88                 $self->{race_rounds} = 0;
89         }
90         $self->{race_time} = 0;
91         $self->{best_lap} = undef;
92
93         $self->{gui}->show_semaphore(undef);
94         $self->{race_running} = 0;
95         $self->{start_in_progress} = 0;
96
97         $self->{gui}->time('00:00');
98         $self->{gui}->best_lap('0.00');
99
100         for my $car (0..5) {
101                 $self->car($car)->set_order($car);
102                 $self->car($car)->set_lap(0);
103                 $self->car($car)->set_laptime(undef);
104         }
105 }
106
107 sub check_best_lap {
108         my ($self, $time, $who) = @_;
109
110         return if !defined $time || $time == 0;
111
112         if (!defined $self->{best_lap}
113                 || $time < $self->{best_lap}) {
114                 $self->{best_lap} = $time;
115                 $self->{gui}->best_lap(sprintf("%.2f", $time), $who);
116                 return 1;
117         }
118         return 0;
119 }
120
121 1;
122