1 /*
2 * This file is part of the Simutrans project under the artistic licence.
3 * (see licence.txt)
4 */
5
6 #include "records.h"
7 #include "../dataobj/translator.h"
8 #include "../player/simplay.h"
9 #include "../simcolor.h"
10 #include "../simmesg.h"
11 #include "../simconvoi.h"
12 #include "../utils/cbuffer_t.h"
13 #include "../vehicle/simvehicle.h"
14
get_record_speed(waytype_t w) const15 sint32 records_t::get_record_speed( waytype_t w ) const
16 {
17 switch(w) {
18 case road_wt: return max_road_speed.speed;
19 case track_wt:
20 case tram_wt: return max_rail_speed.speed;
21 case monorail_wt: return max_monorail_speed.speed;
22 case maglev_wt: return max_maglev_speed.speed;
23 case narrowgauge_wt: return max_narrowgauge_speed.speed;
24 case water_wt: return max_ship_speed.speed;
25 case air_wt: return max_air_speed.speed;
26 default: return 0;
27 }
28 }
29
clear_speed_records()30 void records_t::clear_speed_records()
31 {
32 max_road_speed.speed = 0;
33 max_rail_speed.speed = 0;
34 max_monorail_speed.speed = 0;
35 max_maglev_speed.speed = 0;
36 max_narrowgauge_speed.speed = 0;
37 max_ship_speed.speed = 0;
38 max_air_speed.speed = 0;
39 }
40
notify_record(convoihandle_t cnv,sint32 max_speed,koord k,uint32 current_month)41 void records_t::notify_record( convoihandle_t cnv, sint32 max_speed, koord k, uint32 current_month )
42 {
43 speed_record_t *sr = NULL;
44 switch (cnv->front()->get_waytype()) {
45 case road_wt: sr = &max_road_speed; break;
46 case track_wt:
47 case tram_wt: sr = &max_rail_speed; break;
48 case monorail_wt: sr = &max_monorail_speed; break;
49 case maglev_wt: sr = &max_maglev_speed; break;
50 case narrowgauge_wt: sr = &max_narrowgauge_speed; break;
51 case water_wt: sr = &max_ship_speed; break;
52 case air_wt: sr = &max_air_speed; break;
53 default: assert(0);
54 }
55
56 // avoid the case of two convois with identical max speed ...
57 if(cnv!=sr->cnv && sr->speed+1==max_speed) {
58 return;
59 }
60
61 // really new/faster?
62 if(k!=sr->pos || sr->speed+1<max_speed) {
63 // update it
64 sr->cnv = cnv;
65 sr->speed = max_speed-1;
66 sr->year_month = current_month;
67 sr->pos = k;
68 sr->owner = NULL; // will be set, when accepted
69 }
70 else {
71 sr->cnv = cnv;
72 sr->speed = max_speed-1;
73 sr->pos = k;
74
75 // same convoi and same position
76 if(sr->owner==NULL && current_month!=sr->year_month) {
77 // notify the world of this new record
78 sr->speed = max_speed-1;
79 sr->owner = cnv->get_owner();
80 const char* text;
81 switch (cnv->front()->get_waytype()) {
82 default: NOT_REACHED
83 case road_wt: text = "New world record for motorcars: %.1f km/h by %s."; break;
84 case track_wt:
85 case tram_wt: text = "New world record for railways: %.1f km/h by %s."; break;
86 case monorail_wt: text = "New world record for monorails: %.1f km/h by %s."; break;
87 case maglev_wt: text = "New world record for maglevs: %.1f km/h by %s."; break;
88 case narrowgauge_wt: text = "New world record for narrowgauges: %.1f km/h by %s."; break;
89 case water_wt: text = "New world record for ship: %.1f km/h by %s."; break;
90 case air_wt: text = "New world record for planes: %.1f km/h by %s."; break;
91 }
92 cbuffer_t buf;
93 buf.printf( translator::translate(text), speed_to_kmh(10*sr->speed)/10.0, sr->cnv->get_name() );
94 msg->add_message( buf, sr->pos, message_t::new_vehicle, PLAYER_FLAG|sr->owner->get_player_nr() );
95 }
96 }
97 }
98