16 #include "../../core/bitmath_func.hpp" |
16 #include "../../core/bitmath_func.hpp" |
17 #include "table/strings.h" |
17 #include "table/strings.h" |
18 |
18 |
19 /* static */ bool AIEngine::IsValidEngine(EngineID engine_id) |
19 /* static */ bool AIEngine::IsValidEngine(EngineID engine_id) |
20 { |
20 { |
21 return ::IsEngineIndex(engine_id) && HasBit(GetEngine(engine_id)->player_avail, _current_player); |
21 return ::IsEngineIndex(engine_id) && HasBit(::GetEngine(engine_id)->player_avail, _current_player); |
22 } |
22 } |
23 |
23 |
24 /* static */ char *AIEngine::GetName(EngineID engine_id) |
24 /* static */ char *AIEngine::GetName(EngineID engine_id) |
25 { |
25 { |
26 if (!AIEngine::IsValidEngine(engine_id)) return NULL; |
26 if (!IsValidEngine(engine_id)) return NULL; |
27 |
27 |
28 static const int len = 64; |
28 static const int len = 64; |
29 char *engine_name = MallocT<char>(len); |
29 char *engine_name = MallocT<char>(len); |
30 |
30 |
31 ::SetDParam(0, engine_id); |
31 ::SetDParam(0, engine_id); |
61 } |
61 } |
62 } |
62 } |
63 |
63 |
64 /* static */ uint32 AIEngine::GetCapacity(EngineID engine_id) |
64 /* static */ uint32 AIEngine::GetCapacity(EngineID engine_id) |
65 { |
65 { |
66 if (!AIEngine::IsValidEngine(engine_id)) return 0; |
66 if (!IsValidEngine(engine_id)) return 0; |
67 |
67 |
68 switch (::GetEngine(engine_id)->type) { |
68 switch (::GetEngine(engine_id)->type) { |
69 case VEH_ROAD: { |
69 case VEH_ROAD: { |
70 const RoadVehicleInfo *vi = RoadVehInfo(engine_id); |
70 const RoadVehicleInfo *vi = ::RoadVehInfo(engine_id); |
71 return vi->capacity; |
71 return vi->capacity; |
72 } break; |
72 } break; |
73 |
73 |
74 case VEH_TRAIN: { |
74 case VEH_TRAIN: { |
75 const RailVehicleInfo *vi = RailVehInfo(engine_id); |
75 const RailVehicleInfo *vi = ::RailVehInfo(engine_id); |
76 return vi->capacity; |
76 return vi->capacity; |
77 } break; |
77 } break; |
78 |
78 |
79 case VEH_SHIP: { |
79 case VEH_SHIP: { |
80 const ShipVehicleInfo *vi = ShipVehInfo(engine_id); |
80 const ShipVehicleInfo *vi = ::ShipVehInfo(engine_id); |
81 return vi->capacity; |
81 return vi->capacity; |
82 } break; |
82 } break; |
83 |
83 |
84 case VEH_AIRCRAFT: { |
84 case VEH_AIRCRAFT: { |
85 const AircraftVehicleInfo *vi = AircraftVehInfo(engine_id); |
85 const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine_id); |
86 return vi->passenger_capacity; |
86 return vi->passenger_capacity; |
87 } break; |
87 } break; |
88 |
88 |
89 default: NOT_REACHED(); |
89 default: NOT_REACHED(); |
90 } |
90 } |
91 } |
91 } |
92 |
92 |
93 /* static */ uint32 AIEngine::GetReliability(EngineID engine_id) |
93 /* static */ uint32 AIEngine::GetReliability(EngineID engine_id) |
94 { |
94 { |
95 if (!AIEngine::IsValidEngine(engine_id)) return 0; |
95 if (!IsValidEngine(engine_id)) return 0; |
96 |
96 |
97 return (::GetEngine(engine_id)->reliability * 100 >> 16); |
97 return (::GetEngine(engine_id)->reliability * 100 >> 16); |
98 } |
98 } |
99 |
99 |
100 /* static */ uint32 AIEngine::GetMaxSpeed(EngineID engine_id) |
100 /* static */ uint32 AIEngine::GetMaxSpeed(EngineID engine_id) |
101 { |
101 { |
102 if (!AIEngine::IsValidEngine(engine_id)) return 0; |
102 if (!IsValidEngine(engine_id)) return 0; |
103 |
103 |
104 switch (::GetEngine(engine_id)->type) { |
104 switch (::GetEngine(engine_id)->type) { |
105 case VEH_ROAD: { |
105 case VEH_ROAD: { |
106 const RoadVehicleInfo *vi = RoadVehInfo(engine_id); |
106 const RoadVehicleInfo *vi = ::RoadVehInfo(engine_id); |
107 /* Internal speeds are km/h * 2 */ |
107 /* Internal speeds are km/h * 2 */ |
108 return vi->max_speed / 2; |
108 return vi->max_speed / 2; |
109 } break; |
109 } break; |
110 |
110 |
111 case VEH_TRAIN: { |
111 case VEH_TRAIN: { |
112 const RailVehicleInfo *vi = RailVehInfo(engine_id); |
112 const RailVehicleInfo *vi = ::RailVehInfo(engine_id); |
113 return vi->max_speed; |
113 return vi->max_speed; |
114 } break; |
114 } break; |
115 |
115 |
116 case VEH_SHIP: { |
116 case VEH_SHIP: { |
117 const ShipVehicleInfo *vi = ShipVehInfo(engine_id); |
117 const ShipVehicleInfo *vi = ::ShipVehInfo(engine_id); |
118 /* Internal speeds are km/h * 2 */ |
118 /* Internal speeds are km/h * 2 */ |
119 return vi->max_speed / 2; |
119 return vi->max_speed / 2; |
120 } break; |
120 } break; |
121 |
121 |
122 case VEH_AIRCRAFT: { |
122 case VEH_AIRCRAFT: { |
123 const AircraftVehicleInfo *vi = AircraftVehInfo(engine_id); |
123 const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine_id); |
124 return vi->max_speed; |
124 return vi->max_speed; |
125 } break; |
125 } break; |
126 |
126 |
127 default: NOT_REACHED(); |
127 default: NOT_REACHED(); |
128 } |
128 } |
129 } |
129 } |
130 |
130 |
131 /* static */ uint32 AIEngine::GetPrice(EngineID engine_id) |
131 /* static */ uint32 AIEngine::GetPrice(EngineID engine_id) |
132 { |
132 { |
133 if (!AIEngine::IsValidEngine(engine_id)) return 0; |
133 if (!IsValidEngine(engine_id)) return 0; |
134 |
134 |
135 switch (::GetEngine(engine_id)->type) { |
135 switch (::GetEngine(engine_id)->type) { |
136 case VEH_ROAD: { |
136 case VEH_ROAD: { |
137 const RoadVehicleInfo *vi = RoadVehInfo(engine_id); |
137 const RoadVehicleInfo *vi = ::RoadVehInfo(engine_id); |
138 return (_price.roadveh_base >> 3) * vi->base_cost >> 5; |
138 return (_price.roadveh_base >> 3) * vi->base_cost >> 5; |
139 } break; |
139 } break; |
140 |
140 |
141 case VEH_TRAIN: { |
141 case VEH_TRAIN: { |
142 const RailVehicleInfo *vi = RailVehInfo(engine_id); |
142 const RailVehicleInfo *vi = ::RailVehInfo(engine_id); |
143 return (_price.build_railvehicle >> 3) * vi->base_cost >> 5; |
143 return (_price.build_railvehicle >> 3) * vi->base_cost >> 5; |
144 } break; |
144 } break; |
145 |
145 |
146 case VEH_SHIP: { |
146 case VEH_SHIP: { |
147 const ShipVehicleInfo *vi = ShipVehInfo(engine_id); |
147 const ShipVehicleInfo *vi = ::ShipVehInfo(engine_id); |
148 return (_price.ship_base >> 3) * vi->base_cost >> 5; |
148 return (_price.ship_base >> 3) * vi->base_cost >> 5; |
149 } break; |
149 } break; |
150 |
150 |
151 case VEH_AIRCRAFT: { |
151 case VEH_AIRCRAFT: { |
152 const AircraftVehicleInfo *vi = AircraftVehInfo(engine_id); |
152 const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine_id); |
153 return (_price.aircraft_base >> 3) * vi->base_cost >> 5; |
153 return (_price.aircraft_base >> 3) * vi->base_cost >> 5; |
154 } break; |
154 } break; |
155 |
155 |
156 default: NOT_REACHED(); |
156 default: NOT_REACHED(); |
157 } |
157 } |
158 } |
158 } |
159 |
159 |
160 /* static */ uint32 AIEngine::GetMaxAge(EngineID engine_id) |
160 /* static */ uint32 AIEngine::GetMaxAge(EngineID engine_id) |
161 { |
161 { |
162 if (!AIEngine::IsValidEngine(engine_id)) return 0; |
162 if (!IsValidEngine(engine_id)) return 0; |
163 |
163 |
164 return ::GetEngine(engine_id)->lifelength * 366; |
164 return ::GetEngine(engine_id)->lifelength * 366; |
165 } |
165 } |
166 |
166 |
167 /* static */ Money AIEngine::GetRunningCost(EngineID engine_id) |
167 /* static */ Money AIEngine::GetRunningCost(EngineID engine_id) |
168 { |
168 { |
169 if (!AIEngine::IsValidEngine(engine_id)) return 0; |
169 if (!IsValidEngine(engine_id)) return 0; |
170 |
170 |
171 /* We need to create an instance in order to obtain GetRunningCost. |
171 /* We need to create an instance in order to obtain GetRunningCost. |
172 * This means we temporary allocate a vehicle in the pool, but |
172 * This means we temporary allocate a vehicle in the pool, but |
173 * there is no other way.. */ |
173 * there is no other way.. */ |
174 Vehicle *vehicle; |
174 Vehicle *vehicle; |