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