]> www.fi.muni.cz Git - slotcarman.git/blob - SCX/Car.pm
Make cars aware of their IDs.
[slotcarman.git] / SCX / Car.pm
1 #!/usr/bin/perl -w
2
3 package SCX::Car;
4
5 use strict;
6 use Time::HiRes qw(gettimeofday);
7
8 sub new {
9         my ($class, $args) = @_;
10
11         my $self = {
12                 gui      => $args->{gui},
13                 throttle => -1,
14                 fuel     => -1,
15                 id       => $args->{id},
16                 track    => $args->{track},
17         };
18
19         bless $self, $class;
20
21         $self->set_throttle(undef);
22         $self->set_fuel(undef);
23
24         return $self;
25 }
26
27 sub gui { return shift->{gui}; }
28
29 sub track { return shift->{track}; }
30
31 sub set_throttle {
32         my ($self, $val) = @_;
33
34         return if (!defined $self->{throttle} && !defined $val)
35                 || (defined $self->{throttle} && defined $val
36                         && $self->{throttle} == $val);
37
38         $self->{throttle} = $val;
39         $self->gui->set_throttle($self->{order}, $val);
40 }
41
42
43 sub set_fuel {
44         my ($self, $val) = @_;
45
46         return if (!defined $self->{fuel} && !defined $val)
47                 || (defined $self->{fuel} && defined $val
48                         && $self->{fuel} == $val);
49
50         $self->{fuel} = $val;
51         $self->gui->set_fuel($self->{order}, $val);
52 }
53
54 sub set_light {
55         # TODO
56 }
57
58 sub set_backbutton {
59         # TODO
60 }
61
62 sub set_model {
63         my ($self, $name) = @_;
64
65         return if (!defined $self->{car_icon} && !defined $name)
66                 || (defined $self->{car_icon} && defined $name
67                         && $self->{car_icon} eq $name);
68
69         $self->{car_icon} = $name;
70         $self->gui->set_car_icon($self->{order}, $name);
71 }
72
73 sub set_lap {
74         my ($self, $lap_nr) = @_;
75
76         return if (!defined $self->{lap} && !defined $lap_nr)
77                 || (defined $self->{lap} && defined $lap_nr
78                         && $self->{lap} == $lap_nr);
79
80         $self->{lap} = $lap_nr;
81         $self->gui->set_lap($self->{order}, defined $lap_nr ? $lap_nr : '--');
82         if ($self->track->{race_running} && $self->{lap} > 1) {
83                 my $now = gettimeofday;
84                 my $avg = ($now - $self->track->{race_running_since})
85                         / ($self->{lap} - 1);
86                 $self->{avg_lap} = $avg;
87                 $self->gui->set_avg_lap($self->{order}, $avg);
88         } else {
89                 $self->gui->set_avg_lap($self->{order}, '--');
90         }
91 }
92
93 sub set_laptime {
94         my ($self, $lap_time) = @_;
95
96         if (defined $lap_time) {
97                 $lap_time = sprintf("%.2f", $lap_time);
98                 if ($lap_time > 1.0 && !$self->{in_pit_lane}
99                         && (!defined $self->{best_lap}
100                                 || $self->{best_lap} > $lap_time
101                         )) {
102
103                         $self->{best_lap} = $lap_time;
104                         my $global = $self->{track}->check_best_lap($lap_time,
105                                 $self->{driver}
106                         );
107                         $self->gui->set_best_lap($self->{order}, $lap_time,
108                                 $global);
109                 }
110         } else {
111                 $self->gui->set_best_lap($self->{order}, '--');
112                 $self->{best_lap} = undef;
113         }
114
115         return if (!defined $self->{laptime} && !defined $lap_time)
116                 || (defined $self->{laptime} && defined $lap_time
117                         && $self->{laptime} == $lap_time);
118
119         $self->{laptime} = $lap_time;
120
121         $self->gui->set_laptime($self->{order}, defined $lap_time
122                 ? $lap_time : '--');
123 }
124
125 sub set_driver {
126         my ($self, $driver_name) = @_;
127
128         return if (!defined $self->{driver} && !defined $driver_name)
129                 || (defined $self->{driver} && defined $driver_name
130                         && $self->{driver} == $driver_name);
131
132         $self->{driver} = $driver_name;
133         $self->gui->set_driver($self->{order}, $driver_name || '--');
134 }
135
136 sub enter_pit_lane {
137         my ($self) = @_;
138
139         return if $self->{in_pit_lane};
140
141         $self->{in_pit_lane} = 1;
142         $self->gui->enter_pit_lane;
143 }
144
145 sub leave_pit_lane {
146         my ($self) = @_;
147
148         return if !$self->{in_pit_lane};
149
150         $self->{in_pit_lane} = 0;
151         $self->gui->leave_pit_lane;
152 }
153
154 sub set_order {
155         my ($self, $pos) = @_;
156
157         $self->{order} = $pos;
158         
159         $self->gui->set_driver($self->{order}, $self->{driver}
160                 || '--');
161         $self->gui->set_car_icon($self->{order}, $self->{car_icon});
162         $self->gui->set_throttle($self->{order}, $self->{throttle});
163         $self->gui->set_lap($self->{order}, defined $self->{lap}
164                 ? $self->{lap} : '--');
165         $self->gui->set_laptime($self->{order}, defined $self->{laptime}
166                 ? $self->{laptime} : '--');
167         $self->gui->set_best_lap($self->{order}, defined $self->{best_lap}
168                 ? $self->{best_lap} : '--');
169         $self->gui->set_avg_lap($self->{order}, defined $self->{avg_lap}
170                 ? $self->{avg_lap} : '--');
171         $self->gui->set_fuel($self->{order}, $self->{fuel});
172 }
173         
174 1;
175