Merge branch 'master' into jgrpp
# Conflicts: # src/company_cmd.cpp # src/core/overflowsafe_type.hpp # src/economy.cpp # src/engine_base.h # src/ground_vehicle.cpp # src/group_gui.cpp # src/industry_cmd.cpp # src/industry_gui.cpp # src/newgrf_commons.cpp # src/newgrf_engine.cpp # src/newgrf_industries.cpp # src/newgrf_object.cpp # src/newgrf_roadstop.cpp # src/newgrf_station.cpp # src/rail_gui.cpp # src/road_cmd.h # src/road_gui.cpp # src/saveload/afterload.cpp # src/script/api/script_log.cpp # src/script/api/script_log.hpp # src/settings_gui.cpp # src/settingsgen/settingsgen.cpp # src/station_cmd.cpp # src/station_cmd.h # src/station_gui.cpp # src/strgen/strgen.cpp # src/string_func.h # src/string_type.h # src/table/settings/network_private_settings.ini # src/tests/math_func.cpp # src/textfile_gui.cpp # src/timetable_gui.cpp # src/town_cmd.cpp # src/vehicle.cpp # src/waypoint_cmd.cpp # src/waypoint_cmd.h # src/widgets/dropdown.cpp
This commit is contained in:
Binary file not shown.
@@ -5,233 +5,233 @@
|
||||
//
|
||||
-1 * 0 0C "Monospaced characters (Liberation Mono)"
|
||||
-1 * 0 12 01 03 60 20 00
|
||||
-1 sprites/mono.png 8bpp 10 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 30 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 50 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 70 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 30 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 10 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 50 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 10 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 70 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 70 7 13 0 -2 normal
|
||||
|
||||
-1 * 0 12 01 03 80 80 00
|
||||
-1 sprites/mono.png 8bpp 10 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 90 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 110 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 130 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 25 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 40 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 55 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 70 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 85 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 100 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 115 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 130 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 145 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 160 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 175 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 190 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 205 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 220 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 235 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 250 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 265 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 280 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 295 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 310 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 325 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 340 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 355 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 385 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 400 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 415 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 430 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 445 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 460 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 475 150 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 10 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 90 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 10 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 110 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 10 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 130 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 10 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 25 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 40 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 55 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 70 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 85 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 100 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 115 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 130 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 145 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 160 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 175 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 190 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 205 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 220 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 235 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 250 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 265 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 280 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 295 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 310 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 325 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 340 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 355 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 370 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 385 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 400 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 415 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 430 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 445 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 460 150 7 13 0 -2 normal
|
||||
-1 sprites/mono.png 8bpp 475 150 7 13 0 -2 normal
|
||||
|
||||
//U+0178 Latin Capital Letter Y With Diaeresis (only needed for mono as it is in the base set, but relocated by some code)
|
||||
-1 * 0 12 01 03 01 78 01
|
||||
-1 sprites/mono.png 8bpp 370 230 7 13 0 0 normal
|
||||
-1 sprites/mono.png 8bpp 370 230 7 13 0 -2 normal
|
||||
|
@@ -1702,7 +1702,7 @@ static void AircraftEventHandler_AtTerminal(Aircraft *v, const AirportFTAClass *
|
||||
return;
|
||||
default: // orders have been deleted (no orders), goto depot and don't bother us
|
||||
v->current_order.Free();
|
||||
go_to_hangar = Station::Get(v->targetairport)->airport.HasHangar();
|
||||
go_to_hangar = true;
|
||||
}
|
||||
|
||||
if (go_to_hangar && Station::Get(v->targetairport)->airport.HasHangar()) {
|
||||
|
@@ -215,7 +215,7 @@ class ReplaceVehicleWindow : public Window {
|
||||
if (this->engines[0].NeedRebuild()) {
|
||||
/* We need to rebuild the left engines list */
|
||||
this->GenerateReplaceVehList(true);
|
||||
this->vscroll[0]->SetCount((uint)this->engines[0].size());
|
||||
this->vscroll[0]->SetCount(this->engines[0].size());
|
||||
if (this->reset_sel_engine && this->sel_engine[0] == INVALID_ENGINE && this->engines[0].size() != 0) {
|
||||
this->sel_engine[0] = this->engines[0][0].engine_id;
|
||||
}
|
||||
@@ -235,7 +235,7 @@ class ReplaceVehicleWindow : public Window {
|
||||
}
|
||||
/* Regenerate the list on the right. Note: This resets sel_engine[1] to INVALID_ENGINE, if it is no longer available. */
|
||||
this->GenerateReplaceVehList(false);
|
||||
this->vscroll[1]->SetCount((uint)this->engines[1].size());
|
||||
this->vscroll[1]->SetCount(this->engines[1].size());
|
||||
if (this->reset_sel_engine && this->sel_engine[1] != INVALID_ENGINE) {
|
||||
int position = 0;
|
||||
for (const auto &item : this->engines[1]) {
|
||||
|
@@ -180,7 +180,7 @@ public:
|
||||
this->bridges->NeedResort();
|
||||
this->SortBridgeList();
|
||||
|
||||
this->vscroll->SetCount((uint)bl->size());
|
||||
this->vscroll->SetCount(bl->size());
|
||||
}
|
||||
|
||||
~BuildBridgeWindow()
|
||||
|
@@ -62,17 +62,17 @@ static const NWidgetPart _nested_build_vehicle_widgets[] = {
|
||||
NWidget(WWT_DEFSIZEBOX, COLOUR_GREY),
|
||||
NWidget(WWT_STICKYBOX, COLOUR_GREY),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_ENGINES),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BV_FILTER), SetMinimalSize(128, 0), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_ENGINES),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BV_FILTER), SetResize(1, 0), SetFill(1, 0), SetPadding(2), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
/* Vehicle list. */
|
||||
@@ -111,17 +111,17 @@ static const NWidgetPart _nested_build_vehicle_widgets_train_advanced[] = {
|
||||
NWidget(WWT_LABEL, COLOUR_GREY, WID_BV_CAPTION_LOCO), SetDataTip(STR_JUST_STRING, STR_NULL), SetTextStyle(TC_WHITE), SetResize(1, 0), SetFill(1, 0),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING_LOCO), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN_LOCO), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_LOCOS),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN_LOCO), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BV_FILTER_LOCO), SetMinimalSize(128, 0), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING_LOCO), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN_LOCO), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_LOCOS),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN_LOCO), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BV_FILTER_LOCO), SetResize(1, 0), SetFill(1, 0), SetPadding(2), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
/* Vehicle list for locomotives. */
|
||||
@@ -150,17 +150,17 @@ static const NWidgetPart _nested_build_vehicle_widgets_train_advanced[] = {
|
||||
NWidget(WWT_LABEL, COLOUR_GREY, WID_BV_CAPTION_WAGON), SetDataTip(STR_JUST_STRING, STR_NULL), SetTextStyle(TC_WHITE), SetResize(1, 0), SetFill(1, 0),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING_WAGON), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN_WAGON), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_WAGONS),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN_WAGON), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BV_FILTER_WAGON), SetMinimalSize(128, 0), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_PUSHTXTBTN, COLOUR_GREY, WID_BV_SORT_ASCENDING_DESCENDING_WAGON), SetDataTip(STR_BUTTON_SORT_BY, STR_TOOLTIP_SORT_ORDER), SetFill(1, 0),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_SORT_DROPDOWN_WAGON), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_SORT_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_BV_SHOW_HIDDEN_WAGONS),
|
||||
NWidget(WWT_DROPDOWN, COLOUR_GREY, WID_BV_CARGO_FILTER_DROPDOWN_WAGON), SetResize(1, 0), SetFill(1, 0), SetDataTip(STR_JUST_STRING, STR_TOOLTIP_FILTER_CRITERIA),
|
||||
EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_GREY),
|
||||
NWidget(WWT_EDITBOX, COLOUR_GREY, WID_BV_FILTER_WAGON), SetResize(1, 0), SetFill(1, 0), SetPadding(2), SetDataTip(STR_LIST_FILTER_OSKTITLE, STR_LIST_FILTER_TOOLTIP),
|
||||
EndContainer(),
|
||||
EndContainer(),
|
||||
/* Vehicle list for wagons. */
|
||||
@@ -322,7 +322,7 @@ static bool EngineCostSorter(const GUIEngineListItem &a, const GUIEngineListItem
|
||||
{
|
||||
Money va = Engine::Get(a.engine_id)->GetCost();
|
||||
Money vb = Engine::Get(b.engine_id)->GetCost();
|
||||
int r = ClampToI32(va - vb);
|
||||
int r = ClampTo<int32_t>(va - vb);
|
||||
|
||||
/* Use EngineID to sort instead since we want consistent sorting */
|
||||
if (r == 0) return EngineNumberSorter(a, b);
|
||||
@@ -390,7 +390,7 @@ static bool EngineRunningCostSorter(const GUIEngineListItem &a, const GUIEngineL
|
||||
{
|
||||
Money va = Engine::Get(a.engine_id)->GetRunningCost();
|
||||
Money vb = Engine::Get(b.engine_id)->GetRunningCost();
|
||||
int r = ClampToI32(va - vb);
|
||||
int r = ClampTo<int32_t>(va - vb);
|
||||
|
||||
/* Use EngineID to sort instead since we want consistent sorting */
|
||||
if (r == 0) return EngineNumberSorter(a, b);
|
||||
@@ -2066,7 +2066,7 @@ struct BuildVehicleWindow : BuildVehicleWindowBase {
|
||||
void OnPaint() override
|
||||
{
|
||||
this->GenerateBuildList();
|
||||
this->vscroll->SetCount((uint)this->eng_list.size());
|
||||
this->vscroll->SetCount(this->eng_list.size());
|
||||
|
||||
this->SetWidgetsDisabledState(this->sel_engine == INVALID_ENGINE, WID_BV_SHOW_HIDE, WID_BV_BUILD, WIDGET_LIST_END);
|
||||
|
||||
|
@@ -289,15 +289,20 @@ void SubtractMoneyFromCompanyFract(CompanyID company, const CommandCost &cst)
|
||||
if (cost != 0) SubtractMoneyFromAnyCompany(c, CommandCost(cst.GetExpensesType(), cost));
|
||||
}
|
||||
|
||||
static constexpr void UpdateLandscapingLimit(uint32_t &limit, uint64_t per_64k_frames, uint64_t burst)
|
||||
{
|
||||
limit = static_cast<uint32_t>(std::min<uint64_t>(limit + per_64k_frames, burst << 16));
|
||||
}
|
||||
|
||||
/** Update the landscaping limits per company. */
|
||||
void UpdateLandscapingLimits()
|
||||
{
|
||||
for (Company *c : Company::Iterate()) {
|
||||
c->terraform_limit = std::min<uint64>((uint64)c->terraform_limit + _settings_game.construction.terraform_per_64k_frames, (uint64)_settings_game.construction.terraform_frame_burst << 16);
|
||||
c->clear_limit = std::min<uint64>((uint64)c->clear_limit + _settings_game.construction.clear_per_64k_frames, (uint64)_settings_game.construction.clear_frame_burst << 16);
|
||||
c->tree_limit = std::min<uint64>((uint64)c->tree_limit + _settings_game.construction.tree_per_64k_frames, (uint64)_settings_game.construction.tree_frame_burst << 16);
|
||||
c->purchase_land_limit = std::min<uint64>((uint64)c->purchase_land_limit + _settings_game.construction.purchase_land_per_64k_frames, (uint64)_settings_game.construction.purchase_land_frame_burst << 16);
|
||||
c->build_object_limit = std::min<uint64>((uint64)c->build_object_limit + _settings_game.construction.build_object_per_64k_frames, (uint64)_settings_game.construction.build_object_frame_burst << 16);
|
||||
UpdateLandscapingLimit(c->terraform_limit, _settings_game.construction.terraform_per_64k_frames, _settings_game.construction.terraform_frame_burst);
|
||||
UpdateLandscapingLimit(c->clear_limit, _settings_game.construction.clear_per_64k_frames, _settings_game.construction.clear_frame_burst);
|
||||
UpdateLandscapingLimit(c->tree_limit, _settings_game.construction.tree_per_64k_frames, _settings_game.construction.tree_frame_burst);
|
||||
UpdateLandscapingLimit(c->purchase_land_limit, _settings_game.construction.purchase_land_per_64k_frames, _settings_game.construction.purchase_land_frame_burst);
|
||||
UpdateLandscapingLimit(c->build_object_limit, _settings_game.construction.build_object_per_64k_frames, _settings_game.construction.build_object_frame_burst);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -326,11 +326,11 @@ struct IConsoleWindow : Window
|
||||
return r;
|
||||
}
|
||||
|
||||
const char *GetTextCharacterAtPosition(const Point &pt) const override
|
||||
ptrdiff_t GetTextCharacterAtPosition(const Point &pt) const override
|
||||
{
|
||||
int delta = std::min<int>(this->width - this->line_offset - _iconsole_cmdline.pixels - ICON_RIGHT_BORDERWIDTH, 0);
|
||||
|
||||
if (!IsInsideMM(pt.y, this->height - this->line_height, this->height)) return nullptr;
|
||||
if (!IsInsideMM(pt.y, this->height - this->line_height, this->height)) return -1;
|
||||
|
||||
return GetCharAtPosition(_iconsole_cmdline.buf, pt.x - delta);
|
||||
}
|
||||
|
@@ -10,6 +10,9 @@
|
||||
#ifndef MATH_FUNC_HPP
|
||||
#define MATH_FUNC_HPP
|
||||
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
|
||||
/**
|
||||
* Returns the absolute value of (scalar) variable.
|
||||
*
|
||||
@@ -148,38 +151,65 @@ static inline uint ClampU(const uint a, const uint min, const uint max)
|
||||
}
|
||||
|
||||
/**
|
||||
* Reduce a signed 64-bit int to a signed 32-bit one
|
||||
* Clamp the given value down to lie within the requested type.
|
||||
*
|
||||
* This function clamps a 64-bit integer to a 32-bit integer.
|
||||
* If the 64-bit value is smaller than the smallest 32-bit integer
|
||||
* value 0x80000000 this value is returned (the left one bit is the sign bit).
|
||||
* If the 64-bit value is greater than the greatest 32-bit integer value 0x7FFFFFFF
|
||||
* this value is returned. In all other cases the 64-bit value 'fits' in a
|
||||
* 32-bits integer field and so the value is casted to int32 and returned.
|
||||
* For example ClampTo<uint8_t> will return a value clamped to the range of 0
|
||||
* to 255. Anything smaller will become 0, anything larger will become 255.
|
||||
*
|
||||
* @param a The 64-bit value to clamps
|
||||
* @return The 64-bit value reduced to a 32-bit value
|
||||
* @param a The 64-bit value to clamp.
|
||||
* @return The 64-bit value reduced to a value within the given allowed range
|
||||
* for the return type.
|
||||
* @see Clamp(int, int, int)
|
||||
*/
|
||||
static inline int32 ClampToI32(const int64 a)
|
||||
template <typename To, typename From>
|
||||
constexpr To ClampTo(From value)
|
||||
{
|
||||
return static_cast<int32>(Clamp<int64>(a, INT32_MIN, INT32_MAX));
|
||||
}
|
||||
static_assert(std::numeric_limits<To>::is_integer, "Do not clamp from non-integer values");
|
||||
static_assert(std::numeric_limits<From>::is_integer, "Do not clamp to non-integer values");
|
||||
|
||||
/**
|
||||
* Reduce an unsigned 64-bit int to an unsigned 16-bit one
|
||||
*
|
||||
* @param a The 64-bit value to clamp
|
||||
* @return The 64-bit value reduced to a 16-bit value
|
||||
* @see ClampU(uint, uint, uint)
|
||||
*/
|
||||
static inline uint16 ClampToU16(const uint64 a)
|
||||
{
|
||||
/* MSVC thinks, in its infinite wisdom, that int min(int, int) is a better
|
||||
* match for min(uint64, uint) than uint64 min(uint64, uint64). As such we
|
||||
* need to cast the UINT16_MAX to prevent MSVC from displaying its
|
||||
* infinite loads of warnings. */
|
||||
return static_cast<uint16>(std::min(a, static_cast<uint64>(UINT16_MAX)));
|
||||
if (sizeof(To) >= sizeof(From) && std::numeric_limits<To>::is_signed == std::numeric_limits<From>::is_signed) {
|
||||
/* Same signedness and To type is larger or equal than From type, no clamping is required. */
|
||||
return static_cast<To>(value);
|
||||
}
|
||||
|
||||
if (sizeof(To) > sizeof(From) && std::numeric_limits<To>::is_signed) {
|
||||
/* Signed destination and a larger To type, no clamping is required. */
|
||||
return static_cast<To>(value);
|
||||
}
|
||||
|
||||
/* Get the bigger of the two types based on essentially the number of bits. */
|
||||
using BiggerType = typename std::conditional<sizeof(From) >= sizeof(To), From, To>::type;
|
||||
|
||||
if constexpr (std::numeric_limits<To>::is_signed) {
|
||||
/* The output is a signed number. */
|
||||
if constexpr (std::numeric_limits<From>::is_signed) {
|
||||
/* Both input and output are signed. */
|
||||
return static_cast<To>(std::clamp<BiggerType>(value,
|
||||
std::numeric_limits<To>::lowest(), std::numeric_limits<To>::max()));
|
||||
}
|
||||
|
||||
/* The input is unsigned, so skip the minimum check and use unsigned variant of the biggest type as intermediate type. */
|
||||
using BiggerUnsignedType = typename std::make_unsigned<BiggerType>::type;
|
||||
return static_cast<To>(std::min<BiggerUnsignedType>(std::numeric_limits<To>::max(), value));
|
||||
}
|
||||
|
||||
/* The output is unsigned. */
|
||||
|
||||
if constexpr (std::numeric_limits<From>::is_signed) {
|
||||
/* Input is signed; account for the negative numbers in the input. */
|
||||
if constexpr (sizeof(To) >= sizeof(From)) {
|
||||
/* If the output type is larger or equal to the input type, then only clamp the negative numbers. */
|
||||
return static_cast<To>(std::max<From>(value, 0));
|
||||
}
|
||||
|
||||
/* The output type is smaller than the input type. */
|
||||
using BiggerSignedType = typename std::make_signed<BiggerType>::type;
|
||||
return static_cast<To>(std::clamp<BiggerSignedType>(value,
|
||||
std::numeric_limits<To>::lowest(), std::numeric_limits<To>::max()));
|
||||
}
|
||||
|
||||
/* The input and output are unsigned, just clamp at the high side. */
|
||||
return static_cast<To>(std::min<BiggerType>(value, std::numeric_limits<To>::max()));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -212,4 +212,8 @@ static_assert(OverflowSafeInt32(INT32_MAX) + 1 == OverflowSafeInt32(INT32_MAX));
|
||||
static_assert(OverflowSafeInt32(INT32_MAX) * 2 == OverflowSafeInt32(INT32_MAX));
|
||||
static_assert(OverflowSafeInt32(INT32_MIN) * 2 == OverflowSafeInt32(INT32_MIN));
|
||||
|
||||
/* Specialisation of the generic ClampTo function for overflow safe integers to normal integers. */
|
||||
template <typename To, typename From>
|
||||
constexpr To ClampTo(OverflowSafeInt<From> value) { return ClampTo<To>(From(value)); }
|
||||
|
||||
#endif /* OVERFLOWSAFE_TYPE_HPP */
|
||||
|
@@ -735,7 +735,7 @@ struct DepotWindow : Window {
|
||||
max_width = std::max(max_width, width);
|
||||
}
|
||||
/* Always have 1 empty row, so people can change the setting of the train */
|
||||
this->vscroll->SetCount((uint)this->vehicle_list.size() + (uint)this->wagon_list.size() + 1);
|
||||
this->vscroll->SetCount(this->vehicle_list.size() + this->wagon_list.size() + 1);
|
||||
/* Always make it longer than the longest train, so you can attach vehicles at the end, and also see the next vertical tile separator line */
|
||||
this->hscroll->SetCount(max_width + ScaleSpriteTrad(2 * VEHICLEINFO_FULL_VEHICLE_WIDTH + 1));
|
||||
} else {
|
||||
|
@@ -1051,7 +1051,7 @@ Money GetTransportedGoodsIncome(uint num_pieces, uint dist, uint16 transit_days,
|
||||
|
||||
/* Use callback to calculate cargo profit, if available */
|
||||
if (HasBit(cs->callback_mask, CBM_CARGO_PROFIT_CALC)) {
|
||||
uint32 var18 = std::min(dist, 0xFFFFu) | (std::min(num_pieces, 0xFFu) << 16) | (std::min<uint16>(transit_days, 0xFFu) << 24);
|
||||
uint32 var18 = ClampTo<uint16_t>(dist) | (ClampTo<uint8_t>(num_pieces) << 16) | (ClampTo<uint8_t>(transit_days) << 24);
|
||||
uint16 callback = GetCargoCallback(CBID_CARGO_PROFIT_CALC, 0, var18, cs);
|
||||
if (callback != CALLBACK_FAILED) {
|
||||
int result = GB(callback, 0, 14);
|
||||
@@ -1355,7 +1355,7 @@ static void TriggerIndustryProduction(Industry *i)
|
||||
if (cargo_waiting == 0) continue;
|
||||
|
||||
for (uint ci_out = 0; ci_out < lengthof(i->produced_cargo_waiting); ci_out++) {
|
||||
i->produced_cargo_waiting[ci_out] = std::min(i->produced_cargo_waiting[ci_out] + (cargo_waiting * indspec->input_cargo_multiplier[ci_in][ci_out] / 256), 0xFFFFu);
|
||||
i->produced_cargo_waiting[ci_out] = ClampTo<uint16_t>(i->produced_cargo_waiting[ci_out] + (cargo_waiting * indspec->input_cargo_multiplier[ci_in][ci_out] / 256));
|
||||
}
|
||||
|
||||
i->incoming_cargo_waiting[ci_in] = 0;
|
||||
@@ -2132,8 +2132,8 @@ static void LoadUnloadVehicle(Vehicle *front)
|
||||
}
|
||||
|
||||
/* if last speed is 0, we treat that as if no vehicle has ever visited the station. */
|
||||
ge->last_speed = std::min(t, 255);
|
||||
ge->last_age = std::min(_cur_year - front->build_year, 255);
|
||||
ge->last_speed = ClampTo<uint8_t>(t);
|
||||
ge->last_age = ClampTo<uint8_t>(_cur_year - front->build_year);
|
||||
|
||||
assert(v->cargo_cap >= v->cargo.StoredCount());
|
||||
/* Capacity available for loading more cargo. */
|
||||
|
@@ -673,8 +673,8 @@ void CalcEngineReliability(Engine *e, bool new_month)
|
||||
re = Engine::Get(re->info.variant_id);
|
||||
}
|
||||
|
||||
uint age = re->age;
|
||||
if (new_month && re->index > e->index && age != MAX_DAY) age++; /* parent variant's age has not yet updated. */
|
||||
uint32 age = re->age;
|
||||
if (new_month && re->index > e->index && age != INT32_MAX) age++; /* parent variant's age has not yet updated. */
|
||||
|
||||
/* Check for early retirement */
|
||||
if (e->company_avail != 0 && !_settings_game.vehicle.never_expire_vehicles && e->info.base_life != 0xFF) {
|
||||
@@ -1187,7 +1187,7 @@ void EnginesMonthlyLoop()
|
||||
bool refresh = false;
|
||||
for (Engine *e : Engine::Iterate()) {
|
||||
/* Age the vehicle */
|
||||
if ((e->flags & ENGINE_AVAILABLE) && e->age != MAX_DAY) {
|
||||
if ((e->flags & ENGINE_AVAILABLE) && e->age != INT32_MAX) {
|
||||
e->age++;
|
||||
CalcEngineReliability(e, true);
|
||||
refresh = true;
|
||||
|
@@ -44,7 +44,7 @@ struct EngineRefitCapacityValue {
|
||||
struct Engine : EnginePool::PoolItem<&_engine_pool> {
|
||||
TinyString name; ///< Custom name of engine.
|
||||
Date intro_date; ///< Date of introduction of the engine.
|
||||
Date age;
|
||||
int32 age; ///< Age of the engine in months.
|
||||
uint16 reliability; ///< Current reliability of the engine.
|
||||
uint16 reliability_spd_dec; ///< Speed of reliability decay between services (per day).
|
||||
uint16 reliability_start; ///< Initial reliability of the engine.
|
||||
|
@@ -861,7 +861,7 @@ public:
|
||||
|
||||
_fios_path_changed = true;
|
||||
this->fios_items.BuildFileList(this->abstract_filetype, this->fop);
|
||||
this->vscroll->SetCount((uint)this->fios_items.size());
|
||||
this->vscroll->SetCount(this->fios_items.size());
|
||||
this->selected = nullptr;
|
||||
_load_check_data.Clear();
|
||||
|
||||
|
@@ -133,7 +133,7 @@ struct GSConfigWindow : public Window {
|
||||
}
|
||||
}
|
||||
|
||||
this->vscroll->SetCount((int)this->visible_settings.size());
|
||||
this->vscroll->SetCount(this->visible_settings.size());
|
||||
}
|
||||
|
||||
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override
|
||||
|
85
src/gfx.cpp
85
src/gfx.cpp
@@ -679,7 +679,7 @@ static int DrawLayoutLine(const ParagraphLayouter::Line &line, int y, int left,
|
||||
* @return In case of left or center alignment the right most pixel we have drawn to.
|
||||
* In case of right alignment the left most pixel we have drawn to.
|
||||
*/
|
||||
int DrawString(int left, int right, int top, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
|
||||
int DrawString(int left, int right, int top, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
|
||||
{
|
||||
/* The string may contain control chars to change the font, just use the biggest font for clipping. */
|
||||
int max_height = std::max({FONT_HEIGHT_SMALL, FONT_HEIGHT_NORMAL, FONT_HEIGHT_LARGE, FONT_HEIGHT_MONO});
|
||||
@@ -698,28 +698,6 @@ int DrawString(int left, int right, int top, const char *str, TextColour colour,
|
||||
return DrawLayoutLine(*layout.front(), top, left, right, align, underline, true);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw string, possibly truncated to make it fit in its allocated space
|
||||
*
|
||||
* @param left The left most position to draw on.
|
||||
* @param right The right most position to draw on.
|
||||
* @param top The top most position to draw on.
|
||||
* @param str String to draw.
|
||||
* @param colour Colour used for drawing the string, for details see _string_colourmap in
|
||||
* table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h
|
||||
* @param align The alignment of the string when drawing left-to-right. In the
|
||||
* case a right-to-left language is chosen this is inverted so it
|
||||
* will be drawn in the right direction.
|
||||
* @param underline Whether to underline what has been drawn or not.
|
||||
* @param fontsize The size of the initial characters.
|
||||
* @return In case of left or center alignment the right most pixel we have drawn to.
|
||||
* In case of right alignment the left most pixel we have drawn to.
|
||||
*/
|
||||
int DrawString(int left, int right, int top, const std::string &str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
|
||||
{
|
||||
return DrawString(left, right, top, str.c_str(), colour, align, underline, fontsize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw string, possibly truncated to make it fit in its allocated space
|
||||
*
|
||||
@@ -750,7 +728,7 @@ int DrawString(int left, int right, int top, StringID str, TextColour colour, St
|
||||
* @param maxw maximum string width
|
||||
* @return height of pixels of string when it is drawn
|
||||
*/
|
||||
int GetStringHeight(const char *str, int maxw, FontSize fontsize)
|
||||
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize)
|
||||
{
|
||||
Layouter layout(str, maxw, TC_FROMSTRING, fontsize);
|
||||
return layout.GetBounds().height;
|
||||
@@ -802,7 +780,7 @@ Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestio
|
||||
* @param suggestion Suggested bounding box.
|
||||
* @return Bounding box for the multi-line string, may be bigger than \a suggestion.
|
||||
*/
|
||||
Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &suggestion)
|
||||
Dimension GetStringMultiLineBoundingBox(std::string_view str, const Dimension &suggestion)
|
||||
{
|
||||
Dimension box = {suggestion.width, (uint)GetStringHeight(str, suggestion.width)};
|
||||
return box;
|
||||
@@ -824,7 +802,7 @@ Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &sugges
|
||||
*
|
||||
* @return If \a align is #SA_BOTTOM, the top to where we have written, else the bottom to where we have written.
|
||||
*/
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
|
||||
{
|
||||
int maxw = right - left + 1;
|
||||
int maxh = bottom - top + 1;
|
||||
@@ -870,28 +848,6 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, const char *st
|
||||
return ((align & SA_VERT_MASK) == SA_BOTTOM) ? first_line : last_line;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Draw string, possibly over multiple lines.
|
||||
*
|
||||
* @param left The left most position to draw on.
|
||||
* @param right The right most position to draw on.
|
||||
* @param top The top most position to draw on.
|
||||
* @param bottom The bottom most position to draw on.
|
||||
* @param str String to draw.
|
||||
* @param colour Colour used for drawing the string, for details see _string_colourmap in
|
||||
* table/palettes.h or docs/ottd-colourtext-palette.png or the enum TextColour in gfx_type.h
|
||||
* @param align The horizontal and vertical alignment of the string.
|
||||
* @param underline Whether to underline all strings
|
||||
* @param fontsize The size of the initial characters.
|
||||
*
|
||||
* @return If \a align is #SA_BOTTOM, the top to where we have written, else the bottom to where we have written.
|
||||
*/
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, const std::string &str, TextColour colour, StringAlignment align, bool underline, FontSize fontsize)
|
||||
{
|
||||
return DrawStringMultiLine(left, right, top, bottom, str.c_str(), colour, align, underline, fontsize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Draw string, possibly over multiple lines.
|
||||
*
|
||||
@@ -925,30 +881,15 @@ int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str,
|
||||
* @param start_fontsize Fontsize to start the text with
|
||||
* @return string width and height in pixels
|
||||
*/
|
||||
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize)
|
||||
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize)
|
||||
{
|
||||
Layouter layout(str, INT32_MAX, TC_FROMSTRING, start_fontsize);
|
||||
return layout.GetBounds();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the string dimension in pixels. The height and width are returned
|
||||
* in a single Dimension value. TINYFONT, BIGFONT modifiers are only
|
||||
* supported as the first character of the string. The returned dimensions
|
||||
* are therefore a rough estimation correct for all the current strings
|
||||
* but not every possible combination
|
||||
* @param str string to calculate pixel-width
|
||||
* @param start_fontsize Fontsize to start the text with
|
||||
* @return string width and height in pixels
|
||||
*/
|
||||
Dimension GetStringBoundingBox(const std::string &str, FontSize start_fontsize)
|
||||
{
|
||||
return GetStringBoundingBox(str.c_str(), start_fontsize);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get bounding box of a string. Uses parameters set by #SetDParam if needed.
|
||||
* Has the same restrictions as #GetStringBoundingBox(const char *str, FontSize start_fontsize).
|
||||
* Has the same restrictions as #GetStringBoundingBox(std::string_view str, FontSize start_fontsize).
|
||||
* @param strid String to examine.
|
||||
* @return Width and height of the bounding box for the string in pixels.
|
||||
*/
|
||||
@@ -983,10 +924,14 @@ uint GetStringListWidth(const StringID *list, FontSize fontsize)
|
||||
* @param start_fontsize Font size to start the text with.
|
||||
* @return Upper left corner of the glyph associated with the character.
|
||||
*/
|
||||
Point GetCharPosInString(const char *str, const char *ch, FontSize start_fontsize)
|
||||
Point GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize)
|
||||
{
|
||||
/* Ensure "ch" is inside "str" or at the exact end. */
|
||||
assert(ch >= str.data() && (ch - str.data()) <= static_cast<ptrdiff_t>(str.size()));
|
||||
auto it_ch = str.begin() + (ch - str.data());
|
||||
|
||||
Layouter layout(str, INT32_MAX, TC_FROMSTRING, start_fontsize);
|
||||
return layout.GetCharPosition(ch);
|
||||
return layout.GetCharPosition(it_ch);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -994,11 +939,11 @@ Point GetCharPosInString(const char *str, const char *ch, FontSize start_fontsiz
|
||||
* @param str String to test.
|
||||
* @param x Position relative to the start of the string.
|
||||
* @param start_fontsize Font size to start the text with.
|
||||
* @return Pointer to the character at the position or nullptr if there is no character at the position.
|
||||
* @return Index of the character position or -1 if there is no character at the position.
|
||||
*/
|
||||
const char *GetCharAtPosition(const char *str, int x, FontSize start_fontsize)
|
||||
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize)
|
||||
{
|
||||
if (x < 0) return nullptr;
|
||||
if (x < 0) return -1;
|
||||
|
||||
Layouter layout(str, INT32_MAX, TC_FROMSTRING, start_fontsize);
|
||||
return layout.GetCharAtPosition(x);
|
||||
|
@@ -109,11 +109,9 @@ void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub
|
||||
void DrawSpriteIgnorePadding(SpriteID img, PaletteID pal, const Rect &r, bool clicked, StringAlignment align); /* widget.cpp */
|
||||
std::unique_ptr<uint32[]> DrawSpriteToRgbaBuffer(SpriteID spriteId, ZoomLevel zoom = ZOOM_LVL_GUI);
|
||||
|
||||
int DrawString(int left, int right, int top, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawString(int left, int right, int top, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawString(int left, int right, int top, std::string_view str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawString(int left, int right, int top, StringID str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, std::string_view str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
int DrawStringMultiLine(int left, int right, int top, int bottom, StringID str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL);
|
||||
|
||||
void DrawCharCentered(WChar c, const Rect &r, TextColour colour);
|
||||
@@ -126,12 +124,7 @@ inline void GfxDrawLine(int left, int top, int right, int bottom, int colour, in
|
||||
void DrawBox(const DrawPixelInfo *dpi, int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
|
||||
|
||||
/* Versions of DrawString/DrawStringMultiLine that accept a Rect instead of separate left, right, top and bottom parameters. */
|
||||
static inline int DrawString(const Rect &r, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL)
|
||||
{
|
||||
return DrawString(r.left, r.right, r.top, str, colour, align, underline, fontsize);
|
||||
}
|
||||
|
||||
static inline int DrawString(const Rect &r, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL)
|
||||
static inline int DrawString(const Rect &r, std::string_view str, TextColour colour = TC_FROMSTRING, StringAlignment align = SA_LEFT, bool underline = false, FontSize fontsize = FS_NORMAL)
|
||||
{
|
||||
return DrawString(r.left, r.right, r.top, str, colour, align, underline, fontsize);
|
||||
}
|
||||
@@ -141,12 +134,7 @@ static inline int DrawString(const Rect &r, StringID str, TextColour colour = TC
|
||||
return DrawString(r.left, r.right, r.top, str, colour, align, underline, fontsize);
|
||||
}
|
||||
|
||||
static inline int DrawStringMultiLine(const Rect &r, const char *str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL)
|
||||
{
|
||||
return DrawStringMultiLine(r.left, r.right, r.top, r.bottom, str, colour, align, underline, fontsize);
|
||||
}
|
||||
|
||||
static inline int DrawStringMultiLine(const Rect &r, const std::string &str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL)
|
||||
static inline int DrawStringMultiLine(const Rect &r, std::string_view str, TextColour colour = TC_FROMSTRING, StringAlignment align = (SA_TOP | SA_LEFT), bool underline = false, FontSize fontsize = FS_NORMAL)
|
||||
{
|
||||
return DrawStringMultiLine(r.left, r.right, r.top, r.bottom, str, colour, align, underline, fontsize);
|
||||
}
|
||||
@@ -161,18 +149,17 @@ static inline void GfxFillRect(const Rect &r, int colour, FillRectMode mode = FI
|
||||
GfxFillRect(r.left, r.top, r.right, r.bottom, colour, mode);
|
||||
}
|
||||
|
||||
Dimension GetStringBoundingBox(const char *str, FontSize start_fontsize = FS_NORMAL);
|
||||
Dimension GetStringBoundingBox(const std::string &str, FontSize start_fontsize = FS_NORMAL);
|
||||
Dimension GetStringBoundingBox(std::string_view str, FontSize start_fontsize = FS_NORMAL);
|
||||
Dimension GetStringBoundingBox(StringID strid, FontSize start_fontsize = FS_NORMAL);
|
||||
uint GetStringListWidth(const StringID *list, FontSize fontsize = FS_NORMAL);
|
||||
int GetStringHeight(const char *str, int maxw, FontSize fontsize = FS_NORMAL);
|
||||
int GetStringHeight(std::string_view str, int maxw, FontSize fontsize = FS_NORMAL);
|
||||
int GetStringHeight(StringID str, int maxw);
|
||||
int GetStringLineCount(StringID str, int maxw);
|
||||
Dimension GetStringMultiLineBoundingBox(StringID str, const Dimension &suggestion);
|
||||
Dimension GetStringMultiLineBoundingBox(const char *str, const Dimension &suggestion);
|
||||
Dimension GetStringMultiLineBoundingBox(std::string_view str, const Dimension &suggestion);
|
||||
void LoadStringWidthTable(bool monospace = false);
|
||||
Point GetCharPosInString(const char *str, const char *ch, FontSize start_fontsize = FS_NORMAL);
|
||||
const char *GetCharAtPosition(const char *str, int x, FontSize start_fontsize = FS_NORMAL);
|
||||
Point GetCharPosInString(std::string_view str, const char *ch, FontSize start_fontsize = FS_NORMAL);
|
||||
ptrdiff_t GetCharAtPosition(std::string_view str, int x, FontSize start_fontsize = FS_NORMAL);
|
||||
|
||||
void DrawDirtyBlocks();
|
||||
void SetDirtyBlocks(int left, int top, int right, int bottom);
|
||||
|
@@ -59,7 +59,7 @@ Font::Font(FontSize size, TextColour colour) :
|
||||
* @tparam T The type of layouter we want.
|
||||
*/
|
||||
template <typename T>
|
||||
static inline void GetLayouter(Layouter::LineCacheItem &line, const char *&str, FontState &state)
|
||||
static inline void GetLayouter(Layouter::LineCacheItem &line, std::string_view str, FontState &state)
|
||||
{
|
||||
if (line.buffer != nullptr) free(line.buffer);
|
||||
|
||||
@@ -72,15 +72,18 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, const char *&str,
|
||||
line.buffer = buff_begin;
|
||||
fontMapping.clear();
|
||||
|
||||
auto cur = str.begin();
|
||||
|
||||
/*
|
||||
* Go through the whole string while adding Font instances to the font map
|
||||
* whenever the font changes, and convert the wide characters into a format
|
||||
* usable by ParagraphLayout.
|
||||
*/
|
||||
for (; buff < buffer_last;) {
|
||||
WChar c = Utf8Consume(const_cast<const char **>(&str));
|
||||
for (; buff < buffer_last && cur != str.end();) {
|
||||
WChar c = Utf8Consume(cur);
|
||||
if (c == '\0' || c == '\n') {
|
||||
break;
|
||||
/* Caller should already have filtered out these characters. */
|
||||
NOT_REACHED();
|
||||
} else if (c >= SCC_BLUE && c <= SCC_BLACK) {
|
||||
state.SetColour((TextColour)(c - SCC_BLUE));
|
||||
} else if (c == SCC_PUSH_COLOUR) {
|
||||
@@ -123,65 +126,51 @@ static inline void GetLayouter(Layouter::LineCacheItem &line, const char *&str,
|
||||
* @param colour The colour of the font.
|
||||
* @param fontsize The size of font to use.
|
||||
*/
|
||||
Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsize) : string(str)
|
||||
Layouter::Layouter(std::string_view str, int maxw, TextColour colour, FontSize fontsize) : string(str)
|
||||
{
|
||||
FontState state(colour, fontsize);
|
||||
WChar c = 0;
|
||||
|
||||
do {
|
||||
/* Scan string for end of line */
|
||||
const char *lineend = str;
|
||||
for (;;) {
|
||||
size_t len = Utf8Decode(&c, lineend);
|
||||
if (c == '\0' || c == '\n') break;
|
||||
lineend += len;
|
||||
}
|
||||
while (true) {
|
||||
auto line_length = str.find_first_of('\n');
|
||||
auto str_line = str.substr(0, line_length);
|
||||
|
||||
LineCacheItem& line = GetCachedParagraphLayout(str, lineend - str, state);
|
||||
LineCacheItem &line = GetCachedParagraphLayout(str_line, state);
|
||||
if (line.layout != nullptr) {
|
||||
/* Line is in cache */
|
||||
str = lineend + 1;
|
||||
state = line.state_after;
|
||||
line.layout->Reflow();
|
||||
} else {
|
||||
/* Line is new, layout it */
|
||||
FontState old_state = state;
|
||||
#if (defined(WITH_ICU_I18N) && defined(WITH_HARFBUZZ)) || defined(WITH_UNISCRIBE) || defined(WITH_COCOA)
|
||||
const char *old_str = str;
|
||||
#endif
|
||||
|
||||
#if defined(WITH_ICU_I18N) && defined(WITH_HARFBUZZ)
|
||||
if (line.layout == nullptr) {
|
||||
GetLayouter<ICUParagraphLayoutFactory>(line, str, state);
|
||||
GetLayouter<ICUParagraphLayoutFactory>(line, str_line, state);
|
||||
if (line.layout == nullptr) {
|
||||
state = old_state;
|
||||
str = old_str;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WITH_UNISCRIBE
|
||||
if (line.layout == nullptr) {
|
||||
GetLayouter<UniscribeParagraphLayoutFactory>(line, str, state);
|
||||
GetLayouter<UniscribeParagraphLayoutFactory>(line, str_line, state);
|
||||
if (line.layout == nullptr) {
|
||||
state = old_state;
|
||||
str = old_str;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef WITH_COCOA
|
||||
if (line.layout == nullptr) {
|
||||
GetLayouter<CoreTextParagraphLayoutFactory>(line, str, state);
|
||||
GetLayouter<CoreTextParagraphLayoutFactory>(line, str_line, state);
|
||||
if (line.layout == nullptr) {
|
||||
state = old_state;
|
||||
str = old_str;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (line.layout == nullptr) {
|
||||
GetLayouter<FallbackParagraphLayoutFactory>(line, str, state);
|
||||
GetLayouter<FallbackParagraphLayoutFactory>(line, str_line, state);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -191,7 +180,15 @@ Layouter::Layouter(const char *str, int maxw, TextColour colour, FontSize fontsi
|
||||
if (l == nullptr) break;
|
||||
this->push_back(std::move(l));
|
||||
}
|
||||
} while (c != '\0');
|
||||
|
||||
/* Break out if this was the last line. */
|
||||
if (line_length == std::string_view::npos) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Go to the next line. */
|
||||
str.remove_prefix(line_length + 1);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -210,58 +207,58 @@ Dimension Layouter::GetBounds()
|
||||
|
||||
/**
|
||||
* Get the position of a character in the layout.
|
||||
* @param ch Character to get the position of.
|
||||
* @param ch Character to get the position of. Must be an iterator of the string passed to the constructor.
|
||||
* @return Upper left corner of the character relative to the start of the string.
|
||||
* @note Will only work right for single-line strings.
|
||||
*/
|
||||
Point Layouter::GetCharPosition(const char *ch) const
|
||||
Point Layouter::GetCharPosition(std::string_view::const_iterator ch) const
|
||||
{
|
||||
const auto &line = this->front();
|
||||
|
||||
/* Pointer to the end-of-string marker? Return total line width. */
|
||||
if (ch == this->string.end()) {
|
||||
Point p = { line->GetWidth(), 0 };
|
||||
return p;
|
||||
}
|
||||
|
||||
/* Find the code point index which corresponds to the char
|
||||
* pointer into our UTF-8 source string. */
|
||||
size_t index = 0;
|
||||
const char *str = this->string;
|
||||
auto str = this->string.begin();
|
||||
while (str < ch) {
|
||||
WChar c;
|
||||
size_t len = Utf8Decode(&c, str);
|
||||
if (c == '\0' || c == '\n') break;
|
||||
str += len;
|
||||
index += this->front()->GetInternalCharLength(c);
|
||||
WChar c = Utf8Consume(str);
|
||||
index += line->GetInternalCharLength(c);
|
||||
}
|
||||
|
||||
if (str == ch) {
|
||||
/* Valid character. */
|
||||
const auto &line = this->front();
|
||||
/* We couldn't find the code point index. */
|
||||
if (str != ch) {
|
||||
return { 0, 0 };
|
||||
}
|
||||
|
||||
/* Pointer to the end-of-string/line marker? Return total line width. */
|
||||
if (*ch == '\0' || *ch == '\n') {
|
||||
Point p = { line->GetWidth(), 0 };
|
||||
return p;
|
||||
}
|
||||
/* Valid character. */
|
||||
|
||||
/* Scan all runs until we've found our code point index. */
|
||||
for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
|
||||
const ParagraphLayouter::VisualRun &run = line->GetVisualRun(run_index);
|
||||
/* Scan all runs until we've found our code point index. */
|
||||
for (int run_index = 0; run_index < line->CountRuns(); run_index++) {
|
||||
const ParagraphLayouter::VisualRun &run = line->GetVisualRun(run_index);
|
||||
|
||||
for (int i = 0; i < run.GetGlyphCount(); i++) {
|
||||
/* Matching glyph? Return position. */
|
||||
if ((size_t)run.GetGlyphToCharMap()[i] == index) {
|
||||
Point p = { (int)run.GetPositions()[i * 2], (int)run.GetPositions()[i * 2 + 1] };
|
||||
return p;
|
||||
}
|
||||
for (int i = 0; i < run.GetGlyphCount(); i++) {
|
||||
/* Matching glyph? Return position. */
|
||||
if ((size_t)run.GetGlyphToCharMap()[i] == index) {
|
||||
Point p = { (int)run.GetPositions()[i * 2], (int)run.GetPositions()[i * 2 + 1] };
|
||||
return p;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Point p = { 0, 0 };
|
||||
return p;
|
||||
NOT_REACHED();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the character that is at a position.
|
||||
* @param x Position in the string.
|
||||
* @return Pointer to the character at the position or nullptr if no character is at the position.
|
||||
* @return Index of the position or -1 if no character is at the position.
|
||||
*/
|
||||
const char *Layouter::GetCharAtPosition(int x) const
|
||||
ptrdiff_t Layouter::GetCharAtPosition(int x) const
|
||||
{
|
||||
const auto &line = this->front();
|
||||
|
||||
@@ -280,17 +277,18 @@ const char *Layouter::GetCharAtPosition(int x) const
|
||||
size_t index = run.GetGlyphToCharMap()[i];
|
||||
|
||||
size_t cur_idx = 0;
|
||||
for (const char *str = this->string; *str != '\0'; ) {
|
||||
if (cur_idx == index) return str;
|
||||
int char_index = 0;
|
||||
for (auto str = this->string.begin(); str != this->string.end(); char_index++) {
|
||||
if (cur_idx == index) return char_index;
|
||||
|
||||
WChar c = Utf8Consume(&str);
|
||||
WChar c = Utf8Consume(str);
|
||||
cur_idx += line->GetInternalCharLength(c);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -332,18 +330,17 @@ void Layouter::ResetFontCache(FontSize size)
|
||||
* Get reference to cache item.
|
||||
* If the item does not exist yet, it is default constructed.
|
||||
* @param str Source string of the line (including colour and font size codes).
|
||||
* @param len Length of \a str in bytes (no termination).
|
||||
* @param state State of the font at the beginning of the line.
|
||||
* @return Reference to cache item.
|
||||
*/
|
||||
Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, size_t len, const FontState &state)
|
||||
Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(std::string_view str, const FontState &state)
|
||||
{
|
||||
if (linecache == nullptr) {
|
||||
/* Create linecache on first access to avoid trouble with initialisation order of static variables. */
|
||||
linecache = new LineCache();
|
||||
}
|
||||
|
||||
if (auto match = linecache->find(LineCacheQuery{state, std::string_view{str, len}});
|
||||
if (auto match = linecache->find(LineCacheQuery{state, str});
|
||||
match != linecache->end()) {
|
||||
return match->second;
|
||||
}
|
||||
@@ -351,7 +348,7 @@ Layouter::LineCacheItem &Layouter::GetCachedParagraphLayout(const char *str, siz
|
||||
/* Create missing entry */
|
||||
LineCacheKey key;
|
||||
key.state_before = state;
|
||||
key.str.assign(str, len);
|
||||
key.str.assign(str);
|
||||
return (*linecache)[key];
|
||||
}
|
||||
|
||||
|
@@ -127,7 +127,7 @@ public:
|
||||
* It also accounts for the memory allocations and frees.
|
||||
*/
|
||||
class Layouter : public std::vector<std::unique_ptr<const ParagraphLayouter::Line>> {
|
||||
const char *string; ///< Pointer to the original string.
|
||||
std::string_view string; ///< Pointer to the original string.
|
||||
|
||||
/** Key into the linecache */
|
||||
struct LineCacheKey {
|
||||
@@ -171,17 +171,17 @@ private:
|
||||
typedef std::map<LineCacheKey, LineCacheItem, LineCacheCompare> LineCache;
|
||||
static LineCache *linecache;
|
||||
|
||||
static LineCacheItem &GetCachedParagraphLayout(const char *str, size_t len, const FontState &state);
|
||||
static LineCacheItem &GetCachedParagraphLayout(std::string_view str, const FontState &state);
|
||||
|
||||
typedef SmallMap<TextColour, Font *> FontColourMap;
|
||||
static FontColourMap fonts[FS_END];
|
||||
public:
|
||||
static Font *GetFont(FontSize size, TextColour colour);
|
||||
|
||||
Layouter(const char *str, int maxw = INT32_MAX, TextColour colour = TC_FROMSTRING, FontSize fontsize = FS_NORMAL);
|
||||
Layouter(std::string_view str, int maxw = INT32_MAX, TextColour colour = TC_FROMSTRING, FontSize fontsize = FS_NORMAL);
|
||||
Dimension GetBounds();
|
||||
Point GetCharPosition(const char *ch) const;
|
||||
const char *GetCharAtPosition(int x) const;
|
||||
Point GetCharPosition(std::string_view::const_iterator ch) const;
|
||||
ptrdiff_t GetCharAtPosition(int x) const;
|
||||
|
||||
static void ResetFontCache(FontSize size);
|
||||
static void ResetLineCache();
|
||||
|
@@ -208,7 +208,7 @@ void ICURun::Shape(UChar *buff, size_t buff_length) {
|
||||
x_advance = glyph_pos[i].x_advance / FONT_SCALE;
|
||||
}
|
||||
|
||||
this->glyph_to_char.push_back(glyph_info[i].cluster);
|
||||
this->glyph_to_char.push_back(glyph_info[i].cluster - this->start);
|
||||
this->advance.push_back(x_advance);
|
||||
advance += x_advance;
|
||||
}
|
||||
|
@@ -893,7 +893,7 @@ struct PaymentRatesGraphWindow : BaseGraphWindow {
|
||||
|
||||
this->CreateNestedTree();
|
||||
this->vscroll = this->GetScrollbar(WID_CPR_MATRIX_SCROLLBAR);
|
||||
this->vscroll->SetCount(static_cast<int>(_sorted_standard_cargo_specs.size()));
|
||||
this->vscroll->SetCount(_sorted_standard_cargo_specs.size());
|
||||
|
||||
this->SetWidgetLoweredState(WID_CPR_DAYS, _cargo_payment_x_mode == 0);
|
||||
this->SetWidgetLoweredState(WID_CPR_SPEED, _cargo_payment_x_mode == 1);
|
||||
|
@@ -269,13 +269,13 @@ GroundVehicleAcceleration GroundVehicle<T, Type>::GetAcceleration()
|
||||
/* Assume that every part of a train is braked, not just the engine.
|
||||
* Exceptionally heavy freight trains should still have a sensible braking distance.
|
||||
* The total braking force is generally larger than the total tractive force. */
|
||||
braking_accel = ClampToI32((-braking_force - resistance - (Train::From(this)->tcache.cached_braking_length * (int64)RBC_BRAKE_FORCE_PER_LENGTH)) / (mass * 4));
|
||||
braking_accel = ClampTo<int32>((-braking_force - resistance - (Train::From(this)->tcache.cached_braking_length * (int64)RBC_BRAKE_FORCE_PER_LENGTH)) / (mass * 4));
|
||||
|
||||
/* Defensive driving: prevent ridiculously fast deceleration.
|
||||
* -130 corresponds to a braking distance of about 6.2 tiles from 160 km/h. */
|
||||
braking_accel = std::max(braking_accel, -(GetTrainRealisticBrakingTargetDecelerationLimit(acceleration_type) + 10));
|
||||
} else {
|
||||
braking_accel = ClampToI32(std::min<int64>(-braking_force - resistance, -10000) / mass);
|
||||
braking_accel = ClampTo<int32>(std::min<int64>(-braking_force - resistance, -10000) / mass);
|
||||
}
|
||||
|
||||
if (mode == AS_ACCEL) {
|
||||
@@ -287,7 +287,7 @@ GroundVehicleAcceleration GroundVehicle<T, Type>::GetAcceleration()
|
||||
* down hill will never slow down enough, and a vehicle that came up
|
||||
* a hill will never speed up enough to (eventually) get back to the
|
||||
* same (maximum) speed. */
|
||||
int accel = ClampToI32((force - resistance) / (mass * 4));
|
||||
int accel = ClampTo<int32>((force - resistance) / (mass * 4));
|
||||
accel = force < resistance ? std::min(-1, accel) : std::max(1, accel);
|
||||
if (this->type == VEH_TRAIN) {
|
||||
if(_settings_game.vehicle.train_acceleration_model == AM_ORIGINAL &&
|
||||
|
@@ -438,7 +438,7 @@ public:
|
||||
this->groups.ForceRebuild();
|
||||
this->groups.NeedResort();
|
||||
this->BuildGroupList(vli.company);
|
||||
this->group_sb->SetCount((uint)this->groups.size());
|
||||
this->group_sb->SetCount(this->groups.size());
|
||||
|
||||
this->RecalculateInfoTotals();
|
||||
|
||||
@@ -587,8 +587,8 @@ public:
|
||||
|
||||
this->BuildGroupList(this->owner);
|
||||
|
||||
this->group_sb->SetCount(static_cast<int>(this->groups.size()));
|
||||
this->vscroll->SetCount(static_cast<int>(this->vehgroups.size()));
|
||||
this->group_sb->SetCount(this->groups.size());
|
||||
this->vscroll->SetCount(this->vehgroups.size());
|
||||
|
||||
/* The drop down menu is out, *but* it may not be used, retract it. */
|
||||
if (!this->ShouldShowActionDropdownList() && this->IsWidgetLowered(WID_GL_MANAGE_VEHICLES_DROPDOWN)) {
|
||||
@@ -675,13 +675,13 @@ public:
|
||||
|
||||
case WID_GL_LIST_GROUP: {
|
||||
int y1 = r.top + WidgetDimensions::scaled.framerect.top;
|
||||
int max = std::min<size_t>(this->group_sb->GetPosition() + this->group_sb->GetCapacity(), this->groups.size());
|
||||
for (int i = this->group_sb->GetPosition(); i < max; ++i) {
|
||||
size_t max = std::min<size_t>(this->group_sb->GetPosition() + this->group_sb->GetCapacity(), this->groups.size());
|
||||
for (size_t i = this->group_sb->GetPosition(); i < max; ++i) {
|
||||
const Group *g = this->groups[i];
|
||||
|
||||
assert(g->owner == this->owner);
|
||||
|
||||
DrawGroupInfo(y1, r.left, r.right, g->index, this->indents[i] * WidgetDimensions::scaled.hsep_indent, HasBit(g->flags, GroupFlags::GF_REPLACE_PROTECTION), g->folded || (i + 1 < (int)this->groups.size() && indents[i + 1] > this->indents[i]));
|
||||
DrawGroupInfo(y1, r.left, r.right, g->index, this->indents[i] * WidgetDimensions::scaled.hsep_indent, HasBit(g->flags, GroupFlags::GF_REPLACE_PROTECTION), g->folded || (i + 1 < this->groups.size() && indents[i + 1] > this->indents[i]));
|
||||
|
||||
y1 += this->tiny_step_height;
|
||||
}
|
||||
@@ -699,8 +699,8 @@ public:
|
||||
if (this->vli.index != ALL_GROUP && this->grouping == GB_NONE) {
|
||||
/* Mark vehicles which are in sub-groups (only if we are not using shared order coalescing) */
|
||||
Rect mr = r.WithHeight(this->resize.step_height);
|
||||
uint max = static_cast<uint>(std::min<size_t>(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->vehgroups.size()));
|
||||
for (uint i = this->vscroll->GetPosition(); i < max; ++i) {
|
||||
size_t max = std::min<size_t>(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->vehgroups.size());
|
||||
for (size_t i = this->vscroll->GetPosition(); i < max; ++i) {
|
||||
const Vehicle *v = this->vehgroups[i].GetSingleVehicle();
|
||||
if (v->group_id != this->vli.index) {
|
||||
GfxFillRect(mr.Shrink(WidgetDimensions::scaled.bevel), _colour_gradient[COLOUR_GREY][3], FILLRECT_CHECKER);
|
||||
@@ -1242,7 +1242,7 @@ public:
|
||||
}
|
||||
this->groups.ForceRebuild();
|
||||
this->BuildGroupList(this->owner);
|
||||
this->group_sb->SetCount((uint)this->groups.size());
|
||||
this->group_sb->SetCount(this->groups.size());
|
||||
id_g = find_index(this->groups, g);
|
||||
}
|
||||
this->group_sb->ScrollTowards(id_g);
|
||||
|
@@ -132,7 +132,7 @@ void SaveToHighScore()
|
||||
for (i = 0; i < SP_SAVED_HIGHSCORE_END; i++) {
|
||||
for (hs = _highscore_table[i]; hs != endof(_highscore_table[i]); hs++) {
|
||||
/* First character is a command character, so strlen will fail on that */
|
||||
byte length = std::min(sizeof(hs->company), StrEmpty(hs->company) ? 0 : strlen(&hs->company[1]) + 1);
|
||||
byte length = ClampTo<byte>(std::min(sizeof(hs->company), StrEmpty(hs->company) ? 0 : strlen(&hs->company[1]) + 1));
|
||||
|
||||
if (fwrite(&length, sizeof(length), 1, fp) != 1 || // write away string length
|
||||
fwrite(hs->company, length, 1, fp) > 1 || // Yes... could be 0 bytes too
|
||||
|
@@ -1182,7 +1182,7 @@ static void ChopLumberMillTrees(Industry *i)
|
||||
|
||||
TileIndex tile = i->location.tile;
|
||||
if (CircularTileSearch(&tile, 40, SearchLumberMillTrees, nullptr)) { // 40x40 tiles to search.
|
||||
i->produced_cargo_waiting[0] = std::min(0xffff, i->produced_cargo_waiting[0] + 45); // Found a tree, add according value to waiting cargo.
|
||||
i->produced_cargo_waiting[0] = ClampTo<uint16_t>(i->produced_cargo_waiting[0] + 45); // Found a tree, add according value to waiting cargo.
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1193,7 +1193,7 @@ static void ProduceIndustryGoodsFromRate(Industry *i, bool scale)
|
||||
if (amount != 0 && scale) {
|
||||
amount = ScaleQuantity(amount, _settings_game.economy.industry_cargo_scale_factor);
|
||||
}
|
||||
i->produced_cargo_waiting[j] = std::min<uint>(0xffff, i->produced_cargo_waiting[j] + amount);
|
||||
i->produced_cargo_waiting[j] = ClampTo<uint16>(i->produced_cargo_waiting[j] + amount);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1853,7 +1853,7 @@ static void DoCreateNewIndustry(Industry *i, TileIndex tile, IndustryType type,
|
||||
/* Randomize inital production if non-original economy is used and there are no production related callbacks. */
|
||||
if (!indspec->UsesOriginalEconomy()) {
|
||||
for (size_t ci = 0; ci < lengthof(i->production_rate); ci++) {
|
||||
i->production_rate[ci] = std::min((RandomRange(256) + 128) * i->production_rate[ci] >> 8, 255u);
|
||||
i->production_rate[ci] = ClampTo<byte>((RandomRange(256) + 128) * i->production_rate[ci] >> 8);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2503,7 +2503,7 @@ static void UpdateIndustryStatistics(Industry *i)
|
||||
byte pct = 0;
|
||||
if (i->this_month_production[j] != 0) {
|
||||
i->last_prod_year = _cur_year;
|
||||
pct = std::min(i->this_month_transported[j] * 256 / i->this_month_production[j], 255);
|
||||
pct = ClampTo<byte>(i->this_month_transported[j] * 256 / i->this_month_production[j]);
|
||||
}
|
||||
i->last_month_pct_transported[j] = pct;
|
||||
|
||||
@@ -2527,7 +2527,7 @@ void Industry::RecomputeProductionMultipliers()
|
||||
|
||||
/* Rates are rounded up, so e.g. oilrig always produces some passengers */
|
||||
for (size_t i = 0; i < lengthof(this->production_rate); i++) {
|
||||
this->production_rate[i] = std::min(CeilDiv(indspec->production_rate[i] * this->prod_level, PRODLEVEL_DEFAULT), 0xFFu);
|
||||
this->production_rate[i] = ClampTo<byte>(CeilDiv(indspec->production_rate[i] * this->prod_level, PRODLEVEL_DEFAULT));
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -302,25 +302,23 @@ static WindowDesc _build_industry_desc(
|
||||
|
||||
/** Build (fund or prospect) a new industry, */
|
||||
class BuildIndustryWindow : public Window {
|
||||
int selected_index; ///< index of the element in the matrix
|
||||
IndustryType selected_type; ///< industry corresponding to the above index
|
||||
uint16 count; ///< How many industries are loaded
|
||||
IndustryType index[NUM_INDUSTRYTYPES + 1]; ///< Type of industry, in the order it was loaded
|
||||
bool enabled[NUM_INDUSTRYTYPES + 1]; ///< availability state, coming from CBID_INDUSTRY_PROBABILITY (if ever)
|
||||
std::vector<IndustryType> list; ///< List of industries.
|
||||
bool enabled; ///< Availability state of the selected industry.
|
||||
Scrollbar *vscroll;
|
||||
Dimension legend; ///< Dimension of the legend 'blob'.
|
||||
|
||||
/** The largest allowed minimum-width of the window, given in line heights */
|
||||
static const int MAX_MINWIDTH_LINEHEIGHTS = 20;
|
||||
|
||||
void UpdateAvailability()
|
||||
{
|
||||
this->enabled = this->selected_type != INVALID_INDUSTRYTYPE && (_game_mode == GM_EDITOR || GetIndustryProbabilityCallback(this->selected_type, IACT_USERCREATION, 1) > 0);
|
||||
}
|
||||
|
||||
void SetupArrays()
|
||||
{
|
||||
this->count = 0;
|
||||
|
||||
for (uint i = 0; i < lengthof(this->index); i++) {
|
||||
this->index[i] = INVALID_INDUSTRYTYPE;
|
||||
this->enabled[i] = false;
|
||||
}
|
||||
this->list.clear();
|
||||
|
||||
/* Fill the arrays with industries.
|
||||
* The tests performed after the enabled allow to load the industries
|
||||
@@ -334,32 +332,27 @@ class BuildIndustryWindow : public Window {
|
||||
* and raw ones are loaded only when setting allows it */
|
||||
if (_game_mode != GM_EDITOR && indsp->IsRawIndustry() && _settings_game.construction.raw_industry_construction == 0) {
|
||||
/* Unselect if the industry is no longer in the list */
|
||||
if (this->selected_type == ind) this->selected_index = -1;
|
||||
if (this->selected_type == ind) this->selected_type = INVALID_INDUSTRYTYPE;
|
||||
continue;
|
||||
}
|
||||
this->index[this->count] = ind;
|
||||
this->enabled[this->count] = (_game_mode == GM_EDITOR) || GetIndustryProbabilityCallback(ind, IACT_USERCREATION, 1) > 0;
|
||||
/* Keep the selection to the correct line */
|
||||
if (this->selected_type == ind) this->selected_index = this->count;
|
||||
this->count++;
|
||||
|
||||
this->list.push_back(ind);
|
||||
}
|
||||
}
|
||||
|
||||
/* first industry type is selected if the current selection is invalid.
|
||||
* I'll be damned if there are none available ;) */
|
||||
if (this->selected_index == -1) {
|
||||
this->selected_index = 0;
|
||||
this->selected_type = this->index[0];
|
||||
}
|
||||
/* First industry type is selected if the current selection is invalid. */
|
||||
if (this->selected_type == INVALID_INDUSTRYTYPE && !this->list.empty()) this->selected_type = this->list[0];
|
||||
|
||||
this->vscroll->SetCount(this->count);
|
||||
this->UpdateAvailability();
|
||||
|
||||
this->vscroll->SetCount(this->list.size());
|
||||
}
|
||||
|
||||
/** Update status of the fund and display-chain widgets. */
|
||||
void SetButtons()
|
||||
{
|
||||
this->SetWidgetDisabledState(WID_DPI_FUND_WIDGET, this->selected_type != INVALID_INDUSTRYTYPE && !this->enabled[this->selected_index]);
|
||||
this->SetWidgetDisabledState(WID_DPI_DISPLAY_WIDGET, this->selected_type == INVALID_INDUSTRYTYPE && this->enabled[this->selected_index]);
|
||||
this->SetWidgetDisabledState(WID_DPI_FUND_WIDGET, this->selected_type != INVALID_INDUSTRYTYPE && !this->enabled);
|
||||
this->SetWidgetDisabledState(WID_DPI_DISPLAY_WIDGET, this->selected_type == INVALID_INDUSTRYTYPE && this->enabled);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -412,7 +405,6 @@ class BuildIndustryWindow : public Window {
|
||||
public:
|
||||
BuildIndustryWindow() : Window(&_build_industry_desc)
|
||||
{
|
||||
this->selected_index = -1;
|
||||
this->selected_type = INVALID_INDUSTRYTYPE;
|
||||
|
||||
this->CreateNestedTree();
|
||||
@@ -443,9 +435,8 @@ public:
|
||||
switch (widget) {
|
||||
case WID_DPI_MATRIX_WIDGET: {
|
||||
Dimension d = GetStringBoundingBox(STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES);
|
||||
for (uint16 i = 0; i < this->count; i++) {
|
||||
if (this->index[i] == INVALID_INDUSTRYTYPE) continue;
|
||||
d = maxdim(d, GetStringBoundingBox(GetIndustrySpec(this->index[i])->name));
|
||||
for (const auto &indtype : this->list) {
|
||||
d = maxdim(d, GetStringBoundingBox(GetIndustrySpec(indtype)->name));
|
||||
}
|
||||
resize->height = std::max<uint>(this->legend.height, FONT_HEIGHT_NORMAL) + padding.height;
|
||||
d.width += this->legend.width + WidgetDimensions::scaled.hsep_wide + padding.width;
|
||||
@@ -462,14 +453,12 @@ public:
|
||||
uint extra_lines_newgrf = 0;
|
||||
uint max_minwidth = FONT_HEIGHT_NORMAL * MAX_MINWIDTH_LINEHEIGHTS;
|
||||
Dimension d = {0, 0};
|
||||
for (uint16 i = 0; i < this->count; i++) {
|
||||
if (this->index[i] == INVALID_INDUSTRYTYPE) continue;
|
||||
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->index[i]);
|
||||
for (const auto &indtype : this->list) {
|
||||
const IndustrySpec *indsp = GetIndustrySpec(indtype);
|
||||
CargoSuffix cargo_suffix[lengthof(indsp->accepts_cargo)];
|
||||
|
||||
/* Measure the accepted cargoes, if any. */
|
||||
GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_FUND, nullptr, this->index[i], indsp, indsp->accepts_cargo, cargo_suffix);
|
||||
GetAllCargoSuffixes(CARGOSUFFIX_IN, CST_FUND, nullptr, indtype, indsp, indsp->accepts_cargo, cargo_suffix);
|
||||
std::string cargostring = this->MakeCargoListString(indsp->accepts_cargo, cargo_suffix, lengthof(indsp->accepts_cargo), STR_INDUSTRY_VIEW_REQUIRES_N_CARGO);
|
||||
Dimension strdim = GetStringBoundingBox(cargostring.c_str());
|
||||
if (strdim.width > max_minwidth) {
|
||||
@@ -479,7 +468,7 @@ public:
|
||||
d = maxdim(d, strdim);
|
||||
|
||||
/* Measure the produced cargoes, if any. */
|
||||
GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_FUND, nullptr, this->index[i], indsp, indsp->produced_cargo, cargo_suffix);
|
||||
GetAllCargoSuffixes(CARGOSUFFIX_OUT, CST_FUND, nullptr, indtype, indsp, indsp->produced_cargo, cargo_suffix);
|
||||
cargostring = this->MakeCargoListString(indsp->produced_cargo, cargo_suffix, lengthof(indsp->produced_cargo), STR_INDUSTRY_VIEW_PRODUCES_N_CARGO);
|
||||
strdim = GetStringBoundingBox(cargostring.c_str());
|
||||
if (strdim.width > max_minwidth) {
|
||||
@@ -523,8 +512,8 @@ public:
|
||||
/* We've chosen many random industries but no industries have been specified */
|
||||
SetDParam(0, STR_FUND_INDUSTRY_BUILD_NEW_INDUSTRY);
|
||||
} else {
|
||||
if (count > 0) {
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->index[this->selected_index]);
|
||||
if (this->selected_type != INVALID_INDUSTRYTYPE) {
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->selected_type);
|
||||
SetDParam(0, (_settings_game.construction.raw_industry_construction == 2 && indsp->IsRawIndustry()) ? STR_FUND_INDUSTRY_PROSPECT_NEW_INDUSTRY : STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY);
|
||||
} else {
|
||||
SetDParam(0, STR_FUND_INDUSTRY_FUND_NEW_INDUSTRY);
|
||||
@@ -547,19 +536,15 @@ public:
|
||||
icon.top = r.top + (this->resize.step_height - this->legend.height + 1) / 2;
|
||||
icon.bottom = icon.top + this->legend.height - 1;
|
||||
|
||||
for (uint16 i = 0; i < this->vscroll->GetCapacity() && i + this->vscroll->GetPosition() < this->count; i++) {
|
||||
bool selected = this->selected_index == i + this->vscroll->GetPosition();
|
||||
for (uint16 i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < this->vscroll->GetCount(); i++) {
|
||||
bool selected = this->selected_type == this->list[i];
|
||||
|
||||
if (this->index[i + this->vscroll->GetPosition()] == INVALID_INDUSTRYTYPE) {
|
||||
DrawString(text, STR_FUND_INDUSTRY_MANY_RANDOM_INDUSTRIES, selected ? TC_WHITE : TC_ORANGE);
|
||||
} else {
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->index[i + this->vscroll->GetPosition()]);
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->list[i]);
|
||||
|
||||
/* Draw the name of the industry in white is selected, otherwise, in orange */
|
||||
DrawString(text, indsp->name, selected ? TC_WHITE : TC_ORANGE);
|
||||
GfxFillRect(icon, selected ? PC_WHITE : PC_BLACK);
|
||||
GfxFillRect(icon.Shrink(WidgetDimensions::scaled.bevel), indsp->map_colour);
|
||||
}
|
||||
/* Draw the name of the industry in white is selected, otherwise, in orange */
|
||||
DrawString(text, indsp->name, selected ? TC_WHITE : TC_ORANGE);
|
||||
GfxFillRect(icon, selected ? PC_WHITE : PC_BLACK);
|
||||
GfxFillRect(icon.Shrink(WidgetDimensions::scaled.bevel), indsp->map_colour);
|
||||
|
||||
text = text.Translate(0, this->resize.step_height);
|
||||
icon = icon.Translate(0, this->resize.step_height);
|
||||
@@ -666,24 +651,23 @@ public:
|
||||
|
||||
case WID_DPI_MATRIX_WIDGET: {
|
||||
int y = this->vscroll->GetScrolledRowFromWidget(pt.y, this, WID_DPI_MATRIX_WIDGET);
|
||||
if (y < this->count) { // Is it within the boundaries of available data?
|
||||
this->selected_index = y;
|
||||
this->selected_type = this->index[y];
|
||||
const IndustrySpec *indsp = (this->selected_type == INVALID_INDUSTRYTYPE) ? nullptr : GetIndustrySpec(this->selected_type);
|
||||
if (y != INT_MAX) { // Is it within the boundaries of available data?
|
||||
this->selected_type = this->list[y];
|
||||
this->UpdateAvailability();
|
||||
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->selected_type);
|
||||
|
||||
this->SetDirty();
|
||||
|
||||
if (_thd.GetCallbackWnd() == this &&
|
||||
((_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indsp != nullptr && indsp->IsRawIndustry()) ||
|
||||
this->selected_type == INVALID_INDUSTRYTYPE ||
|
||||
!this->enabled[this->selected_index])) {
|
||||
((_game_mode != GM_EDITOR && _settings_game.construction.raw_industry_construction == 2 && indsp != nullptr && indsp->IsRawIndustry()) || !this->enabled)) {
|
||||
/* Reset the button state if going to prospecting or "build many industries" */
|
||||
this->RaiseButtons();
|
||||
ResetObjectToPlace();
|
||||
}
|
||||
|
||||
this->SetButtons();
|
||||
if (this->enabled[this->selected_index] && click_count > 1) this->OnClick(pt, WID_DPI_FUND_WIDGET, 1);
|
||||
if (this->enabled && click_count > 1) this->OnClick(pt, WID_DPI_FUND_WIDGET, 1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -749,18 +733,13 @@ public:
|
||||
void OnHundredthTick() override
|
||||
{
|
||||
if (_game_mode == GM_EDITOR) return;
|
||||
if (this->count == 0) return;
|
||||
const IndustrySpec *indsp = GetIndustrySpec(this->selected_type);
|
||||
if (this->selected_type == INVALID_INDUSTRYTYPE) return;
|
||||
|
||||
if (indsp->enabled) {
|
||||
bool call_back_result = GetIndustryProbabilityCallback(this->selected_type, IACT_USERCREATION, 1) > 0;
|
||||
|
||||
/* Only if result does match the previous state would it require a redraw. */
|
||||
if (call_back_result != this->enabled[this->selected_index]) {
|
||||
this->enabled[this->selected_index] = call_back_result;
|
||||
this->SetButtons();
|
||||
this->SetDirty();
|
||||
}
|
||||
bool enabled = this->enabled;
|
||||
this->UpdateAvailability();
|
||||
if (enabled != this->enabled) {
|
||||
this->SetButtons();
|
||||
this->SetDirty();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -783,9 +762,6 @@ public:
|
||||
{
|
||||
if (!gui_scope) return;
|
||||
this->SetupArrays();
|
||||
|
||||
const IndustrySpec *indsp = (this->selected_type == INVALID_INDUSTRYTYPE) ? nullptr : GetIndustrySpec(this->selected_type);
|
||||
if (indsp == nullptr) this->enabled[this->selected_index] = _settings_game.difficulty.industry_density != ID_FUND_ONLY;
|
||||
this->SetButtons();
|
||||
this->SetDirty();
|
||||
}
|
||||
@@ -1059,10 +1035,10 @@ public:
|
||||
case EA_MULTIPLIER:
|
||||
if (decrease) {
|
||||
if (i->prod_level <= PRODLEVEL_MINIMUM) return;
|
||||
i->prod_level = std::max<uint>(i->prod_level / 2, PRODLEVEL_MINIMUM);
|
||||
i->prod_level = static_cast<byte>(std::max<uint>(i->prod_level / 2, PRODLEVEL_MINIMUM));
|
||||
} else {
|
||||
if (i->prod_level >= PRODLEVEL_MAXIMUM) return;
|
||||
i->prod_level = std::min<uint>(i->prod_level * 2, PRODLEVEL_MAXIMUM);
|
||||
i->prod_level = static_cast<byte>(std::min<uint>(i->prod_level * 2, PRODLEVEL_MAXIMUM));
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1074,7 +1050,7 @@ public:
|
||||
if (i->production_rate[line - IL_RATE1] >= 255) return;
|
||||
/* a zero production industry is unlikely to give anything but zero, so push it a little bit */
|
||||
int new_prod = i->production_rate[line - IL_RATE1] == 0 ? 1 : i->production_rate[line - IL_RATE1] * 2;
|
||||
i->production_rate[line - IL_RATE1] = std::min<uint>(new_prod, 255);
|
||||
i->production_rate[line - IL_RATE1] = ClampTo<byte>(new_prod);
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -1465,7 +1441,7 @@ protected:
|
||||
IndustryDirectoryWindow::produced_cargo_filter = this->cargo_filter[this->produced_cargo_filter_criteria];
|
||||
this->industries.Sort();
|
||||
|
||||
this->vscroll->SetCount((uint)this->industries.size()); // Update scrollbar as well.
|
||||
this->vscroll->SetCount(this->industries.size()); // Update scrollbar as well.
|
||||
|
||||
this->SetDirty();
|
||||
}
|
||||
@@ -1920,7 +1896,7 @@ static const NWidgetPart _nested_industry_cargoes_widgets[] = {
|
||||
EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(NWID_VERTICAL),
|
||||
NWidget(WWT_PANEL, COLOUR_BROWN, WID_IC_PANEL), SetResize(1, 10), SetMinimalSize(200, 90), SetScrollbar(WID_IC_SCROLLBAR), EndContainer(),
|
||||
NWidget(WWT_PANEL, COLOUR_BROWN, WID_IC_PANEL), SetResize(1, 10), SetScrollbar(WID_IC_SCROLLBAR), EndContainer(),
|
||||
NWidget(NWID_HORIZONTAL),
|
||||
NWidget(NWID_BUTTON_DROPDOWN, COLOUR_BROWN, WID_IC_NOTIFY),
|
||||
SetDataTip(STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP, STR_INDUSTRY_CARGOES_NOTIFY_SMALLMAP_TOOLTIP),
|
||||
@@ -2983,19 +2959,19 @@ struct IndustryCargoesWindow : public Window {
|
||||
{
|
||||
if (widget != WID_IC_PANEL) return;
|
||||
|
||||
Rect ir = r.Shrink(WidgetDimensions::scaled.framerect);
|
||||
Rect ir = r.Shrink(WidgetDimensions::scaled.bevel);
|
||||
DrawPixelInfo tmp_dpi;
|
||||
if (!FillDrawPixelInfo(&tmp_dpi, ir.left, ir.top, ir.Width(), ir.Height())) return;
|
||||
AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi);
|
||||
|
||||
int left_pos = ir.left;
|
||||
int left_pos = WidgetDimensions::scaled.frametext.left - WidgetDimensions::scaled.bevel.left;
|
||||
if (this->ind_cargo >= NUM_INDUSTRYTYPES) left_pos += (CargoesField::industry_width + CargoesField::cargo_field_width) / 2;
|
||||
int last_column = (this->ind_cargo < NUM_INDUSTRYTYPES) ? 4 : 2;
|
||||
|
||||
const NWidgetBase *nwp = this->GetWidget<NWidgetBase>(WID_IC_PANEL);
|
||||
int vpos = -this->vscroll->GetPosition() * nwp->resize_y;
|
||||
for (uint i = 0; i < this->fields.size(); i++) {
|
||||
int row_height = (i == 0) ? CargoesField::small_height : CargoesField::normal_height;
|
||||
int vpos = WidgetDimensions::scaled.frametext.top - WidgetDimensions::scaled.bevel.top - this->vscroll->GetPosition() * nwp->resize_y;
|
||||
int row_height = CargoesField::small_height;
|
||||
for (const auto &field : this->fields) {
|
||||
if (vpos + row_height >= 0) {
|
||||
int xpos = left_pos;
|
||||
int col, dir;
|
||||
@@ -3007,13 +2983,14 @@ struct IndustryCargoesWindow : public Window {
|
||||
dir = 1;
|
||||
}
|
||||
while (col >= 0 && col <= last_column) {
|
||||
this->fields[i].columns[col].Draw(xpos, vpos);
|
||||
field.columns[col].Draw(xpos, vpos);
|
||||
xpos += (col & 1) ? CargoesField::cargo_field_width : CargoesField::industry_width;
|
||||
col += dir;
|
||||
}
|
||||
}
|
||||
vpos += row_height;
|
||||
if (vpos >= height) break;
|
||||
row_height = CargoesField::normal_height;
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -932,8 +932,22 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copia el
|
||||
# Game options window
|
||||
STR_GAME_OPTIONS_CAPTION :{WHITE}Opcions de la partida
|
||||
|
||||
STR_GAME_OPTIONS_TAB_GENERAL :General
|
||||
STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}Trieu la configuració general.
|
||||
STR_GAME_OPTIONS_TAB_GRAPHICS :Gràfics
|
||||
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Trieu la configuració dels gràfics.
|
||||
STR_GAME_OPTIONS_TAB_SOUND :So
|
||||
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Escolliu la configuració de so i de música.
|
||||
|
||||
STR_GAME_OPTIONS_VOLUME :Volum
|
||||
STR_GAME_OPTIONS_SFX_VOLUME :Efectes de so
|
||||
STR_GAME_OPTIONS_MUSIC_VOLUME :Música
|
||||
|
||||
STR_GAME_OPTIONS_VOLUME_0 :0{NBSP}%
|
||||
STR_GAME_OPTIONS_VOLUME_25 :25{NBSP}%
|
||||
STR_GAME_OPTIONS_VOLUME_50 :50{NBSP}%
|
||||
STR_GAME_OPTIONS_VOLUME_75 :75{NBSP}%
|
||||
STR_GAME_OPTIONS_VOLUME_100 :100{NBSP}%
|
||||
|
||||
STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Moneda
|
||||
STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Selecció de la unitat monetària
|
||||
@@ -988,6 +1002,10 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Seleccio
|
||||
# Autosave dropdown
|
||||
###length 5
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Inactiu
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_10_MINUTES :Cada 10 minuts
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_30_MINUTES :Cada 30 minuts
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_60_MINUTES :Cada 60 minuts
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_120_MINUTES :Cada 120 minuts
|
||||
|
||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Idioma
|
||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Selecciona l'idioma de la interfície
|
||||
@@ -1153,6 +1171,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Desplega
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Plega-ho tot
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Restableix tots els valors
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(cap explicació disponible)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Valor per defecte: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipus de paràmetre: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Paràmetre del client (no s'emmagatzema a les partides; afecta a totes les partides)
|
||||
@@ -1713,7 +1732,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Quantitat de me
|
||||
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA}{NBSP}MiB
|
||||
|
||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT :Els intervals de revisions es mostren en percentatges: {STRING}
|
||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Escull si les revisions dels vehicles depenen del temps passat des de la darrera revisió o de la caiguda d'un cert percentatge de la fiabilitat màxima
|
||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Quan l'opció està activada, els vehicles intenten fer les seves revisions quan la seva fiabilitat baixa d'un cert percentatge de la fiabilitat màxima.{}{}Per exemple, si la fiabilitat màxima d'un vehicle és del 90{NBSP}% i l'interval de revisions és del 20{NBSP}%, el vehicle mirarà de fer la revisió quan arribi a un 72{NBSP}% de fiabilitat.
|
||||
|
||||
STR_CONFIG_SETTING_SERVINT_TRAINS :Interval per defecte de servei per als trens: {STRING}
|
||||
STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Estableix l'interval de revisió predeterminat pels nous ferrocarrils, si no hi ha un interval de revisió explícit pel vehicle
|
||||
@@ -1918,6 +1937,10 @@ STR_CONFIG_SETTING_LARGER_TOWNS_DISABLED :Cap
|
||||
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER :Multiplicador de mida inicial de ciutats: {STRING}
|
||||
STR_CONFIG_SETTING_CITY_SIZE_MULTIPLIER_HELPTEXT :La grandària mitjana de les ciutats en relació als pobles a l'inici de la partida.
|
||||
|
||||
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL :Actualitza el graf de distribució cada {STRING}{NBSP}segon{P 0:2 "" s}
|
||||
STR_CONFIG_SETTING_LINKGRAPH_RECALC_INTERVAL_HELPTEXT :Temps entre actualitzacions de les arestes del graf de distribució. Cada vegada es calcularan els plans d'un dels components del graf. Això vol dir que un valor X d'aquesta opció no significa que es recalculi el graf sencer cada X segons. Només ho farà algun component. Com més curt sigui, farà falta més temps de CPU per a calcular-lo. Com més llarg sigui, més es trigarà a què la distribució de càrrega s'apliqui a les rutes noves.
|
||||
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME :Triga {STRING}{NBSP}segon{P 0:2 "" s} per a recalcular el graf de distribució
|
||||
STR_CONFIG_SETTING_LINKGRAPH_RECALC_TIME_HELPTEXT :Temps emprat per a cada actualització del component d'una aresta del graf. Quan comença el recàlcul, s'inicia un fil que pot executar-se durant aquests segons. Com més curt sigui, més probable és que el fil no acabi a temps. Llavors, la partida para fins que finalitzi, provocant una interrupció del desenvolupament de la partida. Com més llarg sigui, més es trigarà a actualitzar el graf de distribució quan es facin canvis de rutes.
|
||||
|
||||
STR_CONFIG_SETTING_DISTRIBUTION_PAX :Mode de distribució per passatgers: {STRING}
|
||||
STR_CONFIG_SETTING_DISTRIBUTION_PAX_HELPTEXT :"Simètric" vol dir que aproximadament el mateix nombre de passatgers aniran des de l'estació A a la B que de B a A. "Asimètric" significa que un nombre arbitrari de passatgers poden anar en qualsevol dels dos sentits. "Manual" vol dir que no s'aplicarà una distribució automàtica pels passatgers.
|
||||
@@ -3806,6 +3829,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envia in
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Substitueix vehicles
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Envia a fer revisió
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Benefici enguany: {CURRENCY_LONG} (darrer any: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Envia a la cotxera
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Envia a la cotxera
|
||||
@@ -4572,6 +4597,7 @@ STR_AI_CONFIG_RANDOM_AI :IA aleatòria
|
||||
STR_AI_CONFIG_NONE :(cap)
|
||||
STR_AI_CONFIG_NAME_VERSION :{STRING} {YELLOW}v{NUM}
|
||||
STR_AI_CONFIG_MAX_COMPETITORS :{LTBLUE}Nombre màxim de competidors: {ORANGE}{COMMA}
|
||||
STR_AI_CONFIG_COMPETITORS_INTERVAL :{LTBLUE}Interval entre l'inici de competidors: {ORANGE}{COMMA} minut{P "" s}
|
||||
|
||||
STR_AI_CONFIG_MOVE_UP :{BLACK}Mou amunt
|
||||
STR_AI_CONFIG_MOVE_UP_TOOLTIP :{BLACK}Desplaça la IA seleccionada una posició cap amunt
|
||||
@@ -5086,6 +5112,7 @@ STR_ERROR_NO_BUOY :{WHITE}No hi ha
|
||||
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossible establir l'horari del vehicle...
|
||||
STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Els vehicles només poden esperar a les estacions
|
||||
STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Aquest vehicle no para en aquesta estació
|
||||
STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... l'horari està incomplet.
|
||||
|
||||
# Sign related errors
|
||||
STR_ERROR_TOO_MANY_SIGNS :{WHITE}... massa senyals
|
||||
@@ -5565,11 +5592,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1170,6 +1170,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expand a
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Collapse all
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Reset all values
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(no explanation available)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Default value: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Setting type: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Client setting (not stored in saves; affects all games)
|
||||
@@ -3827,6 +3828,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Send ins
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Replace vehicles
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Send for Servicing
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit this year: {CURRENCY_LONG} (last year: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Send to Depot
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Send to Depot
|
||||
@@ -5588,11 +5591,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1170,6 +1170,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expand a
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Collapse all
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Reset all values
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(no explanation available)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Default value: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Setting type: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Client setting (not stored in saves; affects all games)
|
||||
@@ -3827,6 +3828,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Send ins
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Replace vehicles
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Send for Maintenance
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit this year: {CURRENCY_LONG} (last year: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Send to Depot
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Send to Depot
|
||||
@@ -5588,11 +5591,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1170,6 +1170,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Avaa kai
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Sulje kaikki
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Palauta oletukset
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(selitystä ei saatavilla)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Oletusarvo: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Asetuksen tyyppi: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Yleinen asetus (ei tallenneta tallennuksiin; vaikuttaa kaikkiin peleihin)
|
||||
@@ -3827,6 +3828,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Ohjaa ka
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Korvaa kulkuneuvoja
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Lähetä huoltoon
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Tuotto tänä vuonna: {CURRENCY_LONG} (viime vuonna: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Lähetä varikolle
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Lähetä varikolle
|
||||
@@ -5588,11 +5591,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -932,8 +932,22 @@ STR_EXTRA_VIEW_MOVE_MAIN_TO_VIEW_TT :{BLACK}Copier l
|
||||
# Game options window
|
||||
STR_GAME_OPTIONS_CAPTION :{WHITE}Options du jeu
|
||||
|
||||
STR_GAME_OPTIONS_TAB_GENERAL :Général
|
||||
STR_GAME_OPTIONS_TAB_GENERAL_TT :{BLACK}Régler les paramètres généraux
|
||||
STR_GAME_OPTIONS_TAB_GRAPHICS :Graphiques
|
||||
STR_GAME_OPTIONS_TAB_GRAPHICS_TT :{BLACK}Régler les paramètres graphiques
|
||||
STR_GAME_OPTIONS_TAB_SOUND :Son
|
||||
STR_GAME_OPTIONS_TAB_SOUND_TT :{BLACK}Régler les paramètres de son et de musique
|
||||
|
||||
STR_GAME_OPTIONS_VOLUME :Volume
|
||||
STR_GAME_OPTIONS_SFX_VOLUME :Effets sonores
|
||||
STR_GAME_OPTIONS_MUSIC_VOLUME :Musique
|
||||
|
||||
STR_GAME_OPTIONS_VOLUME_0 :0%
|
||||
STR_GAME_OPTIONS_VOLUME_25 :25%
|
||||
STR_GAME_OPTIONS_VOLUME_50 :50%
|
||||
STR_GAME_OPTIONS_VOLUME_75 :75%
|
||||
STR_GAME_OPTIONS_VOLUME_100 :100%
|
||||
|
||||
STR_GAME_OPTIONS_CURRENCY_UNITS_FRAME :{BLACK}Devise
|
||||
STR_GAME_OPTIONS_CURRENCY_UNITS_DROPDOWN_TOOLTIP :{BLACK}Sélectionner l'unité monétaire
|
||||
@@ -988,6 +1002,10 @@ STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_TOOLTIP :{BLACK}Sélecti
|
||||
# Autosave dropdown
|
||||
###length 5
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_OFF :Désactivée
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_10_MINUTES :Toutes les 10 minutes
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_30_MINUTES :Toutes les 30 minutes
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_60_MINUTES :Toutes les 60 minutes
|
||||
STR_GAME_OPTIONS_AUTOSAVE_DROPDOWN_EVERY_120_MINUTES :Toutes les 120 minutes
|
||||
|
||||
STR_GAME_OPTIONS_LANGUAGE :{BLACK}Langue
|
||||
STR_GAME_OPTIONS_LANGUAGE_TOOLTIP :{BLACK}Sélectionner la langue à utiliser pour l'interface
|
||||
@@ -1153,6 +1171,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Tout dé
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Tout réduire
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Réinitialiser tous les réglages
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(pas d'explication disponible)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Valeur par défaut{NBSP}: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Type de paramètre{NBSP}: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Paramètre du client (n'est pas enregistré dans les sauvegardes{NBSP}; affecte toutes les parties)
|
||||
@@ -1713,7 +1732,7 @@ STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_HELPTEXT :Quantité de m
|
||||
STR_CONFIG_SETTING_SCRIPT_MAX_MEMORY_VALUE :{COMMA} Mio
|
||||
|
||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT :Les intervalles de service sont en pourcentage{NBSP}: {STRING}
|
||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Choisir si l'entretien des véhicule est activé par le temps passé depuis le dernier entretien ou par la fiabilité passant sous un pourcentage de la fiabilité maximum
|
||||
STR_CONFIG_SETTING_SERVINT_ISPERCENT_HELPTEXT :Lorsqu'il est activé, les véhicules essaient d'être entretenus quand leur fiabilité passe sous le pourcentage donné de la fiabilité maximum.{}{}Par exemple, si la fiabilité maximum d'un véhicule est 90% et l'intervalle d'entretien 20%, le véhicule essayera d'être entretenu quand sa fiabilité atteindra 72%.
|
||||
|
||||
STR_CONFIG_SETTING_SERVINT_TRAINS :Intervalle d'entretien par défaut pour les trains{NBSP}: {STRING}
|
||||
STR_CONFIG_SETTING_SERVINT_TRAINS_HELPTEXT :Définit l'intervalle d'entretien par défaut des nouveaux véhicules ferroviaires, si aucun intervalle d'entretien n'est défini pour le véhicule
|
||||
@@ -3810,6 +3829,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Envoyer
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Remplacer des véhicules
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Envoyer à l'entretien
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profit cette année{NBSP}: {CURRENCY_LONG} (année précédente{NBSP}: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Envoyer au dépôt
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Envoyer au dépôt
|
||||
@@ -5091,6 +5112,7 @@ STR_ERROR_NO_BUOY :{WHITE}Il n'y a
|
||||
STR_ERROR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Impossible d'affecter un horaire au véhicule...
|
||||
STR_ERROR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Les véhicules ne peuvent attendre qu'aux stations
|
||||
STR_ERROR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Ce véhicule ne s'arrête pas à cette station
|
||||
STR_ERROR_TIMETABLE_INCOMPLETE :{WHITE}... l'horaire est incomplet
|
||||
|
||||
# Sign related errors
|
||||
STR_ERROR_TOO_MANY_SIGNS :{WHITE}... trop de panneaux
|
||||
@@ -5570,11 +5592,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1184,6 +1184,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Espandi
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Comprimi tutti
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Resetta tutti i valori
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(descrizione non disponibile)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Valore predefinito: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipo impostazione: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Impostazione del client (non conservata nei salvataggi; influenza tutte le partite)
|
||||
@@ -3868,6 +3869,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Invia is
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Rimpiazza veicoli
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Manutenzione
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Profitto quest'anno: {CURRENCY_LONG} (anno scorso: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Manda al deposito
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Manda al deposito
|
||||
@@ -5629,11 +5632,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1171,6 +1171,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}모두
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}모두 접기
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}모든 설정 초기화
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(설명이 존재하지 않습니다)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}기본값: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}설정 종류: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :접속자 설정 (게임 저장 파일에 저장되지 않음; 모든 게임에 적용됨)
|
||||
@@ -3828,6 +3829,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}이 목
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :차량 교체
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :점검하러 보내기
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}올해 이익: {CURRENCY_LONG} (작년: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :차량기지로 보내기
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :차고지로 보내기
|
||||
@@ -5589,11 +5592,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1550,6 +1550,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Otwórz
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Zamknij wszystko
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Zresetuj wszystkie ustawienia
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(wyjaśnienie niedostępne)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Domyślna wartość: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Typ ustawienia: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Ustawienie klienta (nie przechowywane w plikach zapisu; ma wpływ na wszystkie gry)
|
||||
@@ -4207,6 +4208,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Wyślij
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Zastąp pojazdy
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Wyślij do serwisu
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Zysk w tym roku: {CURRENCY_LONG} (ostatni rok: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Wyślij do warsztatów
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Wyślij do zajezdni
|
||||
@@ -6011,11 +6014,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1171,6 +1171,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Expandir
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Colapsar todas
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Repor todos os valores
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(sem explicação disponível)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Valor por omissão: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Tipo de configuração: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Configuração de cliente (não guardado; afeta todos os jogos)
|
||||
@@ -3828,6 +3829,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Enviar i
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Substituir Veículos
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Enviar para Serviço
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Lucro deste ano: {CURRENCY_LONG} (último ano: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Enviar para Depósito
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Enviar para Depósito
|
||||
@@ -5589,11 +5592,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1319,6 +1319,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Разв
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Свернуть всё
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Сбросить все значения
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(нет описания)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Значение по умолчанию: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Тип настроек: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Настройки клиента (не содержатся в файлах сохранений; влияют на все игры)
|
||||
@@ -4002,6 +4003,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Упра
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Замена транспорта
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Отправить на тех. обслуживание
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Прибыль в этом году: {CURRENCY_LONG} (в прошлом году: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Отправить в депо
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Отправить в гараж
|
||||
@@ -5812,11 +5815,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1171,6 +1171,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Tümün
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Tümünü kısalt
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Tüm değerleri sıfırla
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(açıklama bulunmamaktadır)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Varsayılan değer: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Ayar türü: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Kullanıcı ayarları (kayıtlı dosyada saklanmaz; tüm oyunları etkilemektedir)
|
||||
@@ -3828,6 +3829,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Listedek
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Araçları Değiştir
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Bakıma Gönder
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Bu seneki kar: {CURRENCY_LONG} (geçen sene: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Garaja Gönder
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Garaja Gönder
|
||||
@@ -5599,11 +5602,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -1170,6 +1170,7 @@ STR_CONFIG_SETTING_EXPAND_ALL :{BLACK}Mở xu
|
||||
STR_CONFIG_SETTING_COLLAPSE_ALL :{BLACK}Đóng lại tất cả
|
||||
STR_CONFIG_SETTING_RESET_ALL :{BLACK}Thiết lập lại tất cả
|
||||
STR_CONFIG_SETTING_NO_EXPLANATION_AVAILABLE_HELPTEXT :(hiện không có giải thích nào)
|
||||
STR_CONFIG_SETTING_VALUE :{PUSH_COLOUR}{ORANGE}{STRING}{POP_COLOUR}
|
||||
STR_CONFIG_SETTING_DEFAULT_VALUE :{LTBLUE}Giá trị mặc định: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE :{LTBLUE}Kiểu thiết lập: {ORANGE}{STRING}
|
||||
STR_CONFIG_SETTING_TYPE_CLIENT :Cấu hình máy khách (không được lưu trong save; tác động tới tất cả các ván chơi)
|
||||
@@ -3827,6 +3828,8 @@ STR_VEHICLE_LIST_MANAGE_LIST_TOOLTIP :{BLACK}Gửi ch
|
||||
STR_VEHICLE_LIST_REPLACE_VEHICLES :Thay phương tiện
|
||||
STR_VEHICLE_LIST_SEND_FOR_SERVICING :Gửi về bảo trì
|
||||
STR_VEHICLE_LIST_PROFIT_THIS_YEAR_LAST_YEAR :{TINY_FONT}{BLACK}Lợi nhuận năm nay: {CURRENCY_LONG} (năm ngoái: {CURRENCY_LONG})
|
||||
STR_VEHICLE_LIST_CARGO :[{CARGO_LIST}]
|
||||
STR_VEHICLE_LIST_NAME_AND_CARGO :{STRING} {STRING}
|
||||
|
||||
STR_VEHICLE_LIST_SEND_TRAIN_TO_DEPOT :Gửi về xưởng
|
||||
STR_VEHICLE_LIST_SEND_ROAD_VEHICLE_TO_DEPOT :Gửi về xưởng
|
||||
@@ -5588,11 +5591,13 @@ STR_VEHICLE_NAME :{VEHICLE}
|
||||
STR_WAYPOINT_NAME :{WAYPOINT}
|
||||
|
||||
STR_JUST_CARGO :{CARGO_LONG}
|
||||
STR_JUST_RIGHT_ARROW :{RIGHT_ARROW}
|
||||
STR_JUST_CHECKMARK :{CHECKMARK}
|
||||
STR_JUST_COMMA :{COMMA}
|
||||
STR_JUST_CURRENCY_SHORT :{CURRENCY_SHORT}
|
||||
STR_JUST_CURRENCY_LONG :{CURRENCY_LONG}
|
||||
STR_JUST_CARGO_LIST :{CARGO_LIST}
|
||||
STR_JUST_DECIMAL :{DECIMAL}
|
||||
STR_JUST_INT :{NUM}
|
||||
STR_JUST_DATE_TINY :{DATE_TINY}
|
||||
STR_JUST_DATE_SHORT :{DATE_SHORT}
|
||||
|
@@ -975,9 +975,9 @@ Rect QueryString::GetBoundingRect(const Window *w, int wid, const char *from, co
|
||||
* @param w Window the edit box is in.
|
||||
* @param wid Widget index.
|
||||
* @param pt Position to test.
|
||||
* @return Pointer to the character at the position or nullptr if no character is at the position.
|
||||
* @return Index of the character position or -1 if no character is at the position.
|
||||
*/
|
||||
const char *QueryString::GetCharAtPosition(const Window *w, int wid, const Point &pt) const
|
||||
ptrdiff_t QueryString::GetCharAtPosition(const Window *w, int wid, const Point &pt) const
|
||||
{
|
||||
const NWidgetLeaf *wi = w->GetWidget<NWidgetLeaf>(wid);
|
||||
|
||||
@@ -989,7 +989,7 @@ const char *QueryString::GetCharAtPosition(const Window *w, int wid, const Point
|
||||
|
||||
Rect r = wi->GetCurrentRect().Indent(clearbtn_width, !rtl).Shrink(WidgetDimensions::scaled.framerect);
|
||||
|
||||
if (!IsInsideMM(pt.y, r.top, r.bottom)) return nullptr;
|
||||
if (!IsInsideMM(pt.y, r.top, r.bottom)) return -1;
|
||||
|
||||
/* Clamp caret position to be inside our current width. */
|
||||
const Textbuf *tb = &this->text;
|
||||
|
@@ -424,7 +424,7 @@ class NetworkContentListWindow : public Window, ContentCallback {
|
||||
this->content.RebuildDone();
|
||||
this->SortContentList();
|
||||
|
||||
this->vscroll->SetCount((int)this->content.size()); // Update the scrollbar
|
||||
this->vscroll->SetCount(this->content.size()); // Update the scrollbar
|
||||
this->ScrollToSelected();
|
||||
}
|
||||
|
||||
|
@@ -295,7 +295,7 @@ protected:
|
||||
|
||||
this->servers.shrink_to_fit();
|
||||
this->servers.RebuildDone();
|
||||
this->vscroll->SetCount((int)this->servers.size());
|
||||
this->vscroll->SetCount(this->servers.size());
|
||||
|
||||
/* Sort the list of network games as requested. */
|
||||
this->servers.Sort();
|
||||
|
@@ -212,7 +212,7 @@ void AirportOverrideManager::SetEntitySpec(AirportSpec *as)
|
||||
case 0x7C: return (this->st->airport.psa != nullptr) ? this->st->airport.psa->GetValue(parameter) : 0;
|
||||
|
||||
case 0xF0: return this->st->facilities;
|
||||
case 0xFA: return Clamp(this->st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535);
|
||||
case 0xFA: return ClampTo<uint16_t>(this->st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR);
|
||||
}
|
||||
|
||||
return this->st->GetNewGRFVariable(this->ro, variable, parameter, &(extra->available));
|
||||
|
@@ -450,7 +450,7 @@ uint32 GetNearbyTileInformation(TileIndex tile, bool grf_version8, uint32 mask)
|
||||
int z;
|
||||
Slope tileh = GetTilePixelSlope(tile, &z);
|
||||
if (grf_version8) z /= TILE_HEIGHT;
|
||||
result |= Clamp(z, 0, 0xFF) << 16 | tileh;
|
||||
result |= ClampTo<uint8>(z) << 16 | tileh;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
@@ -1502,7 +1502,7 @@ struct SpriteAlignerWindow : Window {
|
||||
if (data == 1) {
|
||||
/* Sprite picker finished */
|
||||
this->RaiseWidget(WID_SA_PICKER);
|
||||
this->vscroll->SetCount((uint)_newgrf_debug_sprite_picker.sprites.size());
|
||||
this->vscroll->SetCount(_newgrf_debug_sprite_picker.sprites.size());
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -660,7 +660,7 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
{
|
||||
const Vehicle *w = v->Next();
|
||||
assert(w != nullptr);
|
||||
uint16 altitude = ClampToU16(v->z_pos - w->z_pos); // Aircraft height - shadow height
|
||||
uint16 altitude = ClampTo<uint16_t>(v->z_pos - w->z_pos); // Aircraft height - shadow height
|
||||
byte airporttype = ATP_TTDP_LARGE;
|
||||
|
||||
const Station *st = GetTargetAirportIfValid(Aircraft::From(v));
|
||||
@@ -669,7 +669,7 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
airporttype = st->airport.GetSpec()->ttd_airport_type;
|
||||
}
|
||||
|
||||
return (Clamp(altitude, 0, 0xFF) << 8) | airporttype;
|
||||
return (ClampTo<uint8_t>(altitude) << 8) | airporttype;
|
||||
}
|
||||
|
||||
case 0x45: { // Curvature info
|
||||
@@ -925,8 +925,8 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
}
|
||||
return (variable - 0x80) == 0x10 ? ticks : GB(ticks, 8, 8);
|
||||
}
|
||||
case 0x12: return Clamp(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 0xFFFF);
|
||||
case 0x13: return GB(Clamp(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 0xFFFF), 8, 8);
|
||||
case 0x12: return ClampTo<uint16_t>(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR);
|
||||
case 0x13: return GB(ClampTo<uint16_t>(v->date_of_last_service - DAYS_TILL_ORIGINAL_BASE_YEAR), 8, 8);
|
||||
case 0x14: return v->GetServiceInterval();
|
||||
case 0x15: return GB(v->GetServiceInterval(), 8, 8);
|
||||
case 0x16: return v->last_station_visited;
|
||||
@@ -979,14 +979,14 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
case 0x39: return v->cargo_type;
|
||||
case 0x3A: return v->cargo_cap;
|
||||
case 0x3B: return GB(v->cargo_cap, 8, 8);
|
||||
case 0x3C: return ClampToU16(v->cargo.StoredCount());
|
||||
case 0x3D: return GB(ClampToU16(v->cargo.StoredCount()), 8, 8);
|
||||
case 0x3C: return ClampTo<uint16_t>(v->cargo.StoredCount());
|
||||
case 0x3D: return GB(ClampTo<uint16_t>(v->cargo.StoredCount()), 8, 8);
|
||||
case 0x3E: return v->cargo.Source();
|
||||
case 0x3F: return ClampU(v->cargo.DaysInTransit(), 0, 0xFF);
|
||||
case 0x40: return ClampToU16(v->age);
|
||||
case 0x41: return GB(ClampToU16(v->age), 8, 8);
|
||||
case 0x42: return ClampToU16(v->max_age);
|
||||
case 0x43: return GB(ClampToU16(v->max_age), 8, 8);
|
||||
case 0x3F: return ClampTo<uint8_t>(v->cargo.DaysInTransit());
|
||||
case 0x40: return ClampTo<uint16_t>(v->age);
|
||||
case 0x41: return GB(ClampTo<uint16_t>(v->age), 8, 8);
|
||||
case 0x42: return ClampTo<uint16_t>(v->max_age);
|
||||
case 0x43: return GB(ClampTo<uint16_t>(v->max_age), 8, 8);
|
||||
case 0x44: return Clamp(v->build_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR;
|
||||
case 0x45: return v->unitnumber;
|
||||
case 0x46: return v->GetEngine()->grf_prop.local_id;
|
||||
@@ -1004,20 +1004,20 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
case 0x4F: return GB(v->reliability, 8, 8);
|
||||
case 0x50: return v->reliability_spd_dec;
|
||||
case 0x51: return GB(v->reliability_spd_dec, 8, 8);
|
||||
case 0x52: return ClampToI32(v->GetDisplayProfitThisYear());
|
||||
case 0x53: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 8, 24);
|
||||
case 0x54: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 16, 16);
|
||||
case 0x55: return GB(ClampToI32(v->GetDisplayProfitThisYear()), 24, 8);
|
||||
case 0x56: return ClampToI32(v->GetDisplayProfitLastYear());
|
||||
case 0x57: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 8, 24);
|
||||
case 0x58: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 16, 16);
|
||||
case 0x59: return GB(ClampToI32(v->GetDisplayProfitLastYear()), 24, 8);
|
||||
case 0x52: return ClampTo<int32_t>(v->GetDisplayProfitThisYear());
|
||||
case 0x53: return GB(ClampTo<int32_t>(v->GetDisplayProfitThisYear()), 8, 24);
|
||||
case 0x54: return GB(ClampTo<int32_t>(v->GetDisplayProfitThisYear()), 16, 16);
|
||||
case 0x55: return GB(ClampTo<int32_t>(v->GetDisplayProfitThisYear()), 24, 8);
|
||||
case 0x56: return ClampTo<int32_t>(v->GetDisplayProfitLastYear());
|
||||
case 0x57: return GB(ClampTo<int32_t>(v->GetDisplayProfitLastYear()), 8, 24);
|
||||
case 0x58: return GB(ClampTo<int32_t>(v->GetDisplayProfitLastYear()), 16, 16);
|
||||
case 0x59: return GB(ClampTo<int32_t>(v->GetDisplayProfitLastYear()), 24, 8);
|
||||
case 0x5A: return v->Next() == nullptr ? INVALID_VEHICLE : v->Next()->index;
|
||||
case 0x5B: break; // not implemented
|
||||
case 0x5C: return ClampToI32(v->value);
|
||||
case 0x5D: return GB(ClampToI32(v->value), 8, 24);
|
||||
case 0x5E: return GB(ClampToI32(v->value), 16, 16);
|
||||
case 0x5F: return GB(ClampToI32(v->value), 24, 8);
|
||||
case 0x5C: return ClampTo<int32_t>(v->value);
|
||||
case 0x5D: return GB(ClampTo<int32_t>(v->value), 8, 24);
|
||||
case 0x5E: return GB(ClampTo<int32_t>(v->value), 16, 16);
|
||||
case 0x5F: return GB(ClampTo<int32_t>(v->value), 24, 8);
|
||||
case 0x60: break; // not implemented
|
||||
case 0x61: break; // not implemented
|
||||
case 0x62: break; // vehicle specific, see below
|
||||
@@ -1132,8 +1132,8 @@ static uint32 VehicleGetVariable(Vehicle *v, const VehicleScopeResolver *object,
|
||||
case 0x48: return Engine::Get(this->self_type)->flags; // Vehicle Type Info
|
||||
case 0x49: return _cur_year; // 'Long' format build year
|
||||
case 0x4B: return _date; // Long date of last service
|
||||
case 0x92: return Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 0xFFFF); // Date of last service
|
||||
case 0x93: return GB(Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 0xFFFF), 8, 8);
|
||||
case 0x92: return ClampTo<uint16>(_date - DAYS_TILL_ORIGINAL_BASE_YEAR); // Date of last service
|
||||
case 0x93: return GB(ClampTo<uint16>(_date - DAYS_TILL_ORIGINAL_BASE_YEAR), 8, 8);
|
||||
case 0xC4: return Clamp(_cur_year, ORIGINAL_BASE_YEAR, ORIGINAL_MAX_YEAR) - ORIGINAL_BASE_YEAR; // Build year
|
||||
case 0xC6: return Engine::Get(this->self_type)->grf_prop.local_id;
|
||||
case 0xC7: return GB(Engine::Get(this->self_type)->grf_prop.local_id, 8, 8);
|
||||
|
@@ -1501,7 +1501,7 @@ private:
|
||||
}
|
||||
}
|
||||
|
||||
this->vscroll2->SetCount((uint)this->avails.size()); // Update the scrollbar
|
||||
this->vscroll2->SetCount(this->avails.size()); // Update the scrollbar
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2097,7 +2097,7 @@ struct SavePresetWindow : public Window {
|
||||
this->vscroll = this->GetScrollbar(WID_SVP_SCROLLBAR);
|
||||
this->FinishInitNested(0);
|
||||
|
||||
this->vscroll->SetCount((uint)this->presets.size());
|
||||
this->vscroll->SetCount(this->presets.size());
|
||||
this->SetFocusedWidget(WID_SVP_EDITBOX);
|
||||
if (initial_text != nullptr) this->presetname_editbox.text.Assign(initial_text);
|
||||
}
|
||||
|
@@ -185,13 +185,12 @@ void DecreaseBuildingCount(Town *t, HouseID house_id)
|
||||
|
||||
static uint32 GetNumHouses(HouseID house_id, const Town *town)
|
||||
{
|
||||
uint8 map_id_count, town_id_count, map_class_count, town_class_count;
|
||||
HouseClassID class_id = HouseSpec::Get(house_id)->class_id;
|
||||
|
||||
map_id_count = ClampU(_building_counts.id_count[house_id], 0, 255);
|
||||
map_class_count = ClampU(_building_counts.class_count[class_id], 0, 255);
|
||||
town_id_count = ClampU(town->cache.building_counts.id_count[house_id], 0, 255);
|
||||
town_class_count = ClampU(town->cache.building_counts.class_count[class_id], 0, 255);
|
||||
uint8_t map_id_count = ClampTo<uint8_t>(_building_counts.id_count[house_id]);
|
||||
uint8_t map_class_count = ClampTo<uint8_t>(_building_counts.class_count[class_id]);
|
||||
uint8_t town_id_count = ClampTo<uint8_t>(town->cache.building_counts.id_count[house_id]);
|
||||
uint8_t town_class_count = ClampTo<uint8_t>(town->cache.building_counts.class_count[class_id]);
|
||||
|
||||
return map_class_count << 24 | town_class_count << 16 | map_id_count << 8 | town_id_count;
|
||||
}
|
||||
|
@@ -164,7 +164,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
|
||||
/* If the filter is 0, it could be because none was specified as well as being really a 0.
|
||||
* In either case, just do the regular var67 */
|
||||
if (mask & 0xFFFF) closest_dist = GetClosestIndustry(current->location.tile, ind_index, current);
|
||||
if (mask & 0xFF0000) count = std::min<uint>(Industry::GetIndustryTypeCount(ind_index), UINT8_MAX); // clamp to 8 bit
|
||||
if (mask & 0xFF0000) count = ClampTo<byte>(Industry::GetIndustryTypeCount(ind_index));
|
||||
} else {
|
||||
/* Count only those who match the same industry type and layout filter
|
||||
* Unfortunately, we have to do it manually */
|
||||
@@ -205,16 +205,16 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
|
||||
case 0x88: return GetTownRadiusGroup(this->industry->town, this->tile);
|
||||
|
||||
/* Manhattan distance of the closest town */
|
||||
case 0x89: return std::min(DistanceManhattan(this->industry->town->xy, this->tile), 255u);
|
||||
case 0x89: return ClampTo<uint8_t>(DistanceManhattan(this->industry->town->xy, this->tile));
|
||||
|
||||
/* Lowest height of the tile */
|
||||
case 0x8A: return Clamp(GetTileZ(this->tile) * (this->ro.grffile->grf_version >= 8 ? 1 : TILE_HEIGHT), 0, 0xFF);
|
||||
case 0x8A: return ClampTo<uint8_t>(GetTileZ(this->tile) * (this->ro.grffile->grf_version >= 8 ? 1 : TILE_HEIGHT));
|
||||
|
||||
/* Distance to the nearest water/land tile */
|
||||
case 0x8B: return GetClosestWaterDistance(this->tile, (GetIndustrySpec(this->industry->type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) == 0);
|
||||
|
||||
/* Square of Euclidian distance from town */
|
||||
case 0x8D: return std::min(DistanceSquare(this->industry->town->xy, this->tile), 65535u);
|
||||
case 0x8D: return ClampTo<uint16_t>(DistanceSquare(this->industry->town->xy, this->tile));
|
||||
|
||||
/* 32 random bits */
|
||||
case 0x8F: return this->random_bits;
|
||||
@@ -238,9 +238,9 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
|
||||
if (HasBit(callback, CBM_IND_PRODUCTION_CARGO_ARRIVAL) || HasBit(callback, CBM_IND_PRODUCTION_256_TICKS)) {
|
||||
if ((indspec->behaviour & INDUSTRYBEH_PROD_MULTI_HNDLING) != 0) {
|
||||
if (this->industry->prod_level == 0) return 0;
|
||||
return std::min<uint16>(this->industry->incoming_cargo_waiting[variable - 0x40] / this->industry->prod_level, 0xFFFFu);
|
||||
return ClampTo<uint16>(this->industry->incoming_cargo_waiting[variable - 0x40] / this->industry->prod_level);
|
||||
} else {
|
||||
return std::min<uint16>(this->industry->incoming_cargo_waiting[variable - 0x40], 0xFFFFu);
|
||||
return ClampTo<uint16>(this->industry->incoming_cargo_waiting[variable - 0x40]);
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
@@ -309,7 +309,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
|
||||
case 0x65: {
|
||||
if (this->tile == INVALID_TILE) break;
|
||||
TileIndex tile = GetNearbyTile(parameter, this->tile, true);
|
||||
return GetTownRadiusGroup(this->industry->town, tile) << 16 | std::min(DistanceManhattan(tile, this->industry->town->xy), 0xFFFFu);
|
||||
return GetTownRadiusGroup(this->industry->town, tile) << 16 | ClampTo<uint16_t>(DistanceManhattan(tile, this->industry->town->xy));
|
||||
}
|
||||
/* Get square of Euclidian distance of closest town */
|
||||
case 0x66: {
|
||||
@@ -420,16 +420,16 @@ static uint32 GetCountAndDistanceOfClosestInstance(byte param_setID, byte layout
|
||||
case 0xA6: return indspec->grf_prop.local_id;
|
||||
case 0xA7: return this->industry->founder;
|
||||
case 0xA8: return this->industry->random_colour;
|
||||
case 0xA9: return Clamp(this->industry->last_prod_year - ORIGINAL_BASE_YEAR, 0, 255);
|
||||
case 0xA9: return ClampTo<uint8_t>(this->industry->last_prod_year - ORIGINAL_BASE_YEAR);
|
||||
case 0xAA: return this->industry->counter;
|
||||
case 0xAB: return GB(this->industry->counter, 8, 8);
|
||||
case 0xAC: return this->industry->was_cargo_delivered;
|
||||
|
||||
case 0xB0: return Clamp(this->industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date when built since 1920 (in days)
|
||||
case 0xB0: return ClampTo<uint16_t>(this->industry->construction_date - DAYS_TILL_ORIGINAL_BASE_YEAR); // Date when built since 1920 (in days)
|
||||
case 0xB3: return this->industry->construction_type; // Construction type
|
||||
case 0xB4: {
|
||||
Date *latest = std::max_element(this->industry->last_cargo_accepted_at, endof(this->industry->last_cargo_accepted_at));
|
||||
return Clamp((*latest) - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Date last cargo accepted since 1920 (in days)
|
||||
return ClampTo<uint16>((*latest) - DAYS_TILL_ORIGINAL_BASE_YEAR); // Date last cargo accepted since 1920 (in days)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -672,22 +672,22 @@ void IndustryProductionCallback(Industry *ind, int reason)
|
||||
if (group->version < 2) {
|
||||
/* Callback parameters map directly to industry cargo slot indices */
|
||||
for (uint i = 0; i < group->num_input; i++) {
|
||||
ind->incoming_cargo_waiting[i] = Clamp(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF);
|
||||
ind->incoming_cargo_waiting[i] = ClampTo<uint16_t>(ind->incoming_cargo_waiting[i] - DerefIndProd(group->subtract_input[i], deref) * multiplier);
|
||||
}
|
||||
for (uint i = 0; i < group->num_output; i++) {
|
||||
ind->produced_cargo_waiting[i] = Clamp(ind->produced_cargo_waiting[i] + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
|
||||
ind->produced_cargo_waiting[i] = ClampTo<uint16_t>(ind->produced_cargo_waiting[i] + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier);
|
||||
}
|
||||
} else {
|
||||
/* Callback receives list of cargos to apply for, which need to have their cargo slots in industry looked up */
|
||||
for (uint i = 0; i < group->num_input; i++) {
|
||||
int cargo_index = ind->GetCargoAcceptedIndex(group->cargo_input[i]);
|
||||
if (cargo_index < 0) continue;
|
||||
ind->incoming_cargo_waiting[cargo_index] = Clamp(ind->incoming_cargo_waiting[cargo_index] - DerefIndProd(group->subtract_input[i], deref) * multiplier, 0, 0xFFFF);
|
||||
ind->incoming_cargo_waiting[cargo_index] = ClampTo<uint16_t>(ind->incoming_cargo_waiting[cargo_index] - DerefIndProd(group->subtract_input[i], deref) * multiplier);
|
||||
}
|
||||
for (uint i = 0; i < group->num_output; i++) {
|
||||
int cargo_index = ind->GetCargoProducedIndex(group->cargo_output[i]);
|
||||
if (cargo_index < 0) continue;
|
||||
ind->produced_cargo_waiting[cargo_index] = Clamp(ind->produced_cargo_waiting[cargo_index] + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier, 0, 0xFFFF);
|
||||
ind->produced_cargo_waiting[cargo_index] = ClampTo<uint16_t>(ind->produced_cargo_waiting[cargo_index] + std::max(DerefIndProd(group->add_output[i], deref), 0) * multiplier);
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -253,7 +253,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(uint32 local_id, uint32 grfid
|
||||
/* If the object type is invalid, there is none and the closest is far away. */
|
||||
if (idx >= NUM_OBJECTS) return 0 | 0xFFFF;
|
||||
|
||||
return Object::GetTypeCount(idx) << 16 | std::min(GetClosestObject(tile, idx, current), 0xFFFFu);
|
||||
return Object::GetTypeCount(idx) << 16 | ClampTo<uint16_t>(GetClosestObject(tile, idx, current));
|
||||
}
|
||||
|
||||
/** Used by the resolver to get values for feature 0F deterministic spritegroups. */
|
||||
@@ -334,7 +334,7 @@ static uint32 GetCountAndDistanceOfClosestInstance(uint32 local_id, uint32 grfid
|
||||
case 0x44: return GetTileOwner(this->tile);
|
||||
|
||||
/* Get town zone and Manhattan distance of closest town */
|
||||
case 0x45: return (t == nullptr) ? 0 : (GetTownRadiusGroup(t, this->tile) << 16 | std::min(DistanceManhattan(this->tile, t->xy), 0xFFFFu));
|
||||
case 0x45: return (t == nullptr) ? 0 : (GetTownRadiusGroup(t, this->tile) << 16 | ClampTo<uint16>(DistanceManhattan(this->tile, t->xy)));
|
||||
|
||||
/* Get square of Euclidian distance of closest town */
|
||||
case 0x46: return (t == nullptr) ? 0 : DistanceSquare(this->tile, t->xy);
|
||||
|
@@ -32,13 +32,10 @@ template <typename Tspec, typename Tid, Tid Tmax>
|
||||
void NewGRFClass<Tspec, Tid, Tmax>::InsertDefaults()
|
||||
{
|
||||
/* Set up initial data */
|
||||
classes[0].global_id = 'DFLT';
|
||||
classes[0].name = STR_STATION_CLASS_DFLT;
|
||||
classes[0].Insert(nullptr);
|
||||
|
||||
classes[1].global_id = 'WAYP';
|
||||
classes[1].name = STR_STATION_CLASS_WAYP;
|
||||
classes[1].Insert(nullptr);
|
||||
RoadStopClass::Get(RoadStopClass::Allocate('DFLT'))->name = STR_STATION_CLASS_DFLT;
|
||||
RoadStopClass::Get(RoadStopClass::Allocate('DFLT'))->Insert(nullptr);
|
||||
RoadStopClass::Get(RoadStopClass::Allocate('WAYP'))->name = STR_STATION_CLASS_WAYP;
|
||||
RoadStopClass::Get(RoadStopClass::Allocate('WAYP'))->Insert(nullptr);
|
||||
}
|
||||
|
||||
template <typename Tspec, typename Tid, Tid Tmax>
|
||||
@@ -96,7 +93,7 @@ uint32 RoadStopScopeResolver::GetNearbyRoadStopsInfo(uint32 parameter, RoadStopS
|
||||
switch (mode) {
|
||||
case NearbyRoadStopInfoMode::Standard:
|
||||
default:
|
||||
return res | std::min<uint16>(localidx, 0xFF);
|
||||
return res | ClampTo<uint8>(localidx);
|
||||
|
||||
case NearbyRoadStopInfoMode::Extended:
|
||||
return res | (localidx & 0xFF) | ((localidx & 0xFF00) << 16);
|
||||
@@ -145,7 +142,7 @@ uint32 RoadStopScopeResolver::GetVariable(uint16 variable, uint32 parameter, Get
|
||||
case 0x45: {
|
||||
if (this->tile == INVALID_TILE) return HZB_TOWN_EDGE << 16;
|
||||
const Town *t = (this->st == nullptr) ? ClosestTownFromTile(this->tile, UINT_MAX) : this->st->town;
|
||||
return t != nullptr ? (GetTownRadiusGroup(t, this->tile) << 16 | std::min(DistanceManhattan(this->tile, t->xy), 0xFFFFu)) : HZB_TOWN_EDGE << 16;
|
||||
return t != nullptr ? (GetTownRadiusGroup(t, this->tile) << 16 | ClampTo<uint16_t>(DistanceManhattan(this->tile, t->xy))) : HZB_TOWN_EDGE << 16;
|
||||
}
|
||||
|
||||
/* Get square of Euclidian distance of closest town */
|
||||
@@ -241,7 +238,7 @@ uint32 RoadStopScopeResolver::GetVariable(uint16 variable, uint32 parameter, Get
|
||||
|
||||
case 0xF0: return this->st == nullptr ? 0 : this->st->facilities; // facilities
|
||||
|
||||
case 0xFA: return Clamp((this->st == nullptr ? _date : this->st->build_date) - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // build date
|
||||
case 0xFA: return ClampTo<uint16>((this->st == nullptr ? _date : this->st->build_date) - DAYS_TILL_ORIGINAL_BASE_YEAR); // build date
|
||||
}
|
||||
|
||||
if (this->st != nullptr) return this->st->GetNewGRFVariable(this->ro, variable, parameter, &(extra->available));
|
||||
|
@@ -32,13 +32,10 @@ template <typename Tspec, typename Tid, Tid Tmax>
|
||||
/* static */ void NewGRFClass<Tspec, Tid, Tmax>::InsertDefaults()
|
||||
{
|
||||
/* Set up initial data */
|
||||
classes[0].global_id = 'DFLT';
|
||||
classes[0].name = STR_STATION_CLASS_DFLT;
|
||||
classes[0].Insert(nullptr);
|
||||
|
||||
classes[1].global_id = 'WAYP';
|
||||
classes[1].name = STR_STATION_CLASS_WAYP;
|
||||
classes[1].Insert(nullptr);
|
||||
StationClass::Get(StationClass::Allocate('DFLT'))->name = STR_STATION_CLASS_DFLT;
|
||||
StationClass::Get(StationClass::Allocate('DFLT'))->Insert(nullptr);
|
||||
StationClass::Get(StationClass::Allocate('WAYP'))->name = STR_STATION_CLASS_WAYP;
|
||||
StationClass::Get(StationClass::Allocate('WAYP'))->Insert(nullptr);
|
||||
}
|
||||
|
||||
template <typename Tspec, typename Tid, Tid Tmax>
|
||||
@@ -290,7 +287,7 @@ uint32 StationScopeResolver::GetNearbyStationInfo(uint32 parameter, StationScope
|
||||
switch (mode) {
|
||||
case NearbyStationInfoMode::Standard:
|
||||
default:
|
||||
return res | std::min<uint16>(localidx, 0xFF);
|
||||
return res | ClampTo<uint8>(localidx);
|
||||
|
||||
case NearbyStationInfoMode::Extended:
|
||||
return res | (localidx & 0xFF) | ((localidx & 0xFF00) << 16);
|
||||
@@ -327,7 +324,7 @@ uint32 StationScopeResolver::GetNearbyStationInfo(uint32 parameter, StationScope
|
||||
}
|
||||
break;
|
||||
|
||||
case 0xFA: return Clamp(_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535); // Build date, clamped to a 16 bit value
|
||||
case 0xFA: return ClampTo<uint16>(_date - DAYS_TILL_ORIGINAL_BASE_YEAR); // Build date, clamped to a 16 bit value
|
||||
}
|
||||
|
||||
extra->available = false;
|
||||
@@ -417,7 +414,7 @@ uint32 StationScopeResolver::GetNearbyStationInfo(uint32 parameter, StationScope
|
||||
case 0x84: return this->st->string_id;
|
||||
case 0x86: return 0;
|
||||
case 0xF0: return this->st->facilities;
|
||||
case 0xFA: return Clamp(this->st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR, 0, 65535);
|
||||
case 0xFA: return ClampTo<uint16_t>(this->st->build_date - DAYS_TILL_ORIGINAL_BASE_YEAR);
|
||||
}
|
||||
|
||||
return this->st->GetNewGRFVariable(this->ro, variable, parameter, &(extra->available));
|
||||
|
@@ -47,21 +47,21 @@
|
||||
/* Town properties */
|
||||
case 0x80: return this->t->xy;
|
||||
case 0x81: return GB(this->t->xy, 8, 8);
|
||||
case 0x82: return ClampToU16(this->t->cache.population);
|
||||
case 0x83: return GB(ClampToU16(this->t->cache.population), 8, 8);
|
||||
case 0x82: return ClampTo<uint16_t>(this->t->cache.population);
|
||||
case 0x83: return GB(ClampTo<uint16_t>(this->t->cache.population), 8, 8);
|
||||
case 0x8A: return this->t->grow_counter / TOWN_GROWTH_TICKS;
|
||||
case 0x92: return this->t->flags; // In original game, 0x92 and 0x93 are really one word. Since flags is a byte, this is to adjust
|
||||
case 0x93: return 0;
|
||||
case 0x94: return ClampToU16(this->t->cache.squared_town_zone_radius[0]);
|
||||
case 0x95: return GB(ClampToU16(this->t->cache.squared_town_zone_radius[0]), 8, 8);
|
||||
case 0x96: return ClampToU16(this->t->cache.squared_town_zone_radius[1]);
|
||||
case 0x97: return GB(ClampToU16(this->t->cache.squared_town_zone_radius[1]), 8, 8);
|
||||
case 0x98: return ClampToU16(this->t->cache.squared_town_zone_radius[2]);
|
||||
case 0x99: return GB(ClampToU16(this->t->cache.squared_town_zone_radius[2]), 8, 8);
|
||||
case 0x9A: return ClampToU16(this->t->cache.squared_town_zone_radius[3]);
|
||||
case 0x9B: return GB(ClampToU16(this->t->cache.squared_town_zone_radius[3]), 8, 8);
|
||||
case 0x9C: return ClampToU16(this->t->cache.squared_town_zone_radius[4]);
|
||||
case 0x9D: return GB(ClampToU16(this->t->cache.squared_town_zone_radius[4]), 8, 8);
|
||||
case 0x94: return ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[0]);
|
||||
case 0x95: return GB(ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[0]), 8, 8);
|
||||
case 0x96: return ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[1]);
|
||||
case 0x97: return GB(ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[1]), 8, 8);
|
||||
case 0x98: return ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[2]);
|
||||
case 0x99: return GB(ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[2]), 8, 8);
|
||||
case 0x9A: return ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[3]);
|
||||
case 0x9B: return GB(ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[3]), 8, 8);
|
||||
case 0x9C: return ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[4]);
|
||||
case 0x9D: return GB(ClampTo<uint16_t>(this->t->cache.squared_town_zone_radius[4]), 8, 8);
|
||||
case 0x9E: return this->t->ratings[0];
|
||||
case 0x9F: return GB(this->t->ratings[0], 8, 8);
|
||||
case 0xA0: return this->t->ratings[1];
|
||||
@@ -80,24 +80,24 @@
|
||||
case 0xAD: return GB(this->t->ratings[7], 8, 8);
|
||||
case 0xAE: return this->t->have_ratings;
|
||||
case 0xB2: return this->t->statues;
|
||||
case 0xB6: return ClampToU16(this->t->cache.num_houses);
|
||||
case 0xB6: return ClampTo<uint16_t>(this->t->cache.num_houses);
|
||||
case 0xB9: return this->t->growth_rate / TOWN_GROWTH_TICKS;
|
||||
case 0xBA: return ClampToU16(this->t->supplied[CT_PASSENGERS].new_max);
|
||||
case 0xBB: return GB(ClampToU16(this->t->supplied[CT_PASSENGERS].new_max), 8, 8);
|
||||
case 0xBC: return ClampToU16(this->t->supplied[CT_MAIL].new_max);
|
||||
case 0xBD: return GB(ClampToU16(this->t->supplied[CT_MAIL].new_max), 8, 8);
|
||||
case 0xBE: return ClampToU16(this->t->supplied[CT_PASSENGERS].new_act);
|
||||
case 0xBF: return GB(ClampToU16(this->t->supplied[CT_PASSENGERS].new_act), 8, 8);
|
||||
case 0xC0: return ClampToU16(this->t->supplied[CT_MAIL].new_act);
|
||||
case 0xC1: return GB(ClampToU16(this->t->supplied[CT_MAIL].new_act), 8, 8);
|
||||
case 0xC2: return ClampToU16(this->t->supplied[CT_PASSENGERS].old_max);
|
||||
case 0xC3: return GB(ClampToU16(this->t->supplied[CT_PASSENGERS].old_max), 8, 8);
|
||||
case 0xC4: return ClampToU16(this->t->supplied[CT_MAIL].old_max);
|
||||
case 0xC5: return GB(ClampToU16(this->t->supplied[CT_MAIL].old_max), 8, 8);
|
||||
case 0xC6: return ClampToU16(this->t->supplied[CT_PASSENGERS].old_act);
|
||||
case 0xC7: return GB(ClampToU16(this->t->supplied[CT_PASSENGERS].old_act), 8, 8);
|
||||
case 0xC8: return ClampToU16(this->t->supplied[CT_MAIL].old_act);
|
||||
case 0xC9: return GB(ClampToU16(this->t->supplied[CT_MAIL].old_act), 8, 8);
|
||||
case 0xBA: return ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].new_max);
|
||||
case 0xBB: return GB(ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].new_max), 8, 8);
|
||||
case 0xBC: return ClampTo<uint16_t>(this->t->supplied[CT_MAIL].new_max);
|
||||
case 0xBD: return GB(ClampTo<uint16_t>(this->t->supplied[CT_MAIL].new_max), 8, 8);
|
||||
case 0xBE: return ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].new_act);
|
||||
case 0xBF: return GB(ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].new_act), 8, 8);
|
||||
case 0xC0: return ClampTo<uint16_t>(this->t->supplied[CT_MAIL].new_act);
|
||||
case 0xC1: return GB(ClampTo<uint16_t>(this->t->supplied[CT_MAIL].new_act), 8, 8);
|
||||
case 0xC2: return ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].old_max);
|
||||
case 0xC3: return GB(ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].old_max), 8, 8);
|
||||
case 0xC4: return ClampTo<uint16_t>(this->t->supplied[CT_MAIL].old_max);
|
||||
case 0xC5: return GB(ClampTo<uint16_t>(this->t->supplied[CT_MAIL].old_max), 8, 8);
|
||||
case 0xC6: return ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].old_act);
|
||||
case 0xC7: return GB(ClampTo<uint16_t>(this->t->supplied[CT_PASSENGERS].old_act), 8, 8);
|
||||
case 0xC8: return ClampTo<uint16_t>(this->t->supplied[CT_MAIL].old_act);
|
||||
case 0xC9: return GB(ClampTo<uint16_t>(this->t->supplied[CT_MAIL].old_act), 8, 8);
|
||||
case 0xCA: return this->t->GetPercentTransported(CT_PASSENGERS);
|
||||
case 0xCB: return this->t->GetPercentTransported(CT_MAIL);
|
||||
case 0xCC: return this->t->received[TE_FOOD].new_act;
|
||||
|
@@ -123,7 +123,7 @@ public:
|
||||
|
||||
ResetObjectToPlace();
|
||||
|
||||
this->vscroll->SetCount((int)this->object_classes.size());
|
||||
this->vscroll->SetCount(this->object_classes.size());
|
||||
|
||||
EnsureSelectedObjectClassIsVisible();
|
||||
|
||||
@@ -164,7 +164,7 @@ public:
|
||||
this->object_classes.RebuildDone();
|
||||
this->object_classes.Sort();
|
||||
|
||||
this->vscroll->SetCount((uint)this->object_classes.size());
|
||||
this->vscroll->SetCount(this->object_classes.size());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -341,13 +341,13 @@ static std::vector<SCRIPT_ITEM> UniscribeItemizeString(UniscribeParagraphLayoutF
|
||||
}
|
||||
|
||||
/* Gather runs until the line is full. */
|
||||
while (last_run != this->ranges.end() && cur_width < max_width) {
|
||||
while (last_run != this->ranges.end() && cur_width <= max_width) {
|
||||
cur_width += last_run->total_advance;
|
||||
++last_run;
|
||||
}
|
||||
|
||||
/* If the text does not fit into the available width, find a suitable breaking point. */
|
||||
int remaining_offset = (last_run - 1)->len;
|
||||
int remaining_offset = (last_run - 1)->len + 1;
|
||||
int whitespace_count = 0;
|
||||
if (cur_width > max_width) {
|
||||
std::vector<SCRIPT_LOGATTR> log_attribs;
|
||||
@@ -433,7 +433,7 @@ static std::vector<SCRIPT_ITEM> UniscribeItemizeString(UniscribeParagraphLayoutF
|
||||
cur_pos += run.total_advance;
|
||||
}
|
||||
|
||||
if (remaining_offset + whitespace_count < (last_run - 1)->len) {
|
||||
if (remaining_offset + whitespace_count - 1 < (last_run - 1)->len) {
|
||||
/* We didn't use up all of the last run, store remainder for the next line. */
|
||||
this->cur_range_offset = remaining_offset + whitespace_count - 1;
|
||||
this->cur_range = last_run - 1;
|
||||
|
@@ -54,7 +54,7 @@ public:
|
||||
|
||||
Point GetCaretPosition(const Window *w, int wid) const;
|
||||
Rect GetBoundingRect(const Window *w, int wid, const char *from, const char *to) const;
|
||||
const char *GetCharAtPosition(const Window *w, int wid, const Point &pt) const;
|
||||
ptrdiff_t GetCharAtPosition(const Window *w, int wid, const Point &pt) const;
|
||||
|
||||
/**
|
||||
* Get the current text.
|
||||
|
@@ -72,8 +72,8 @@ struct RailStationGUISettings {
|
||||
|
||||
bool newstations; ///< Are custom station definitions available?
|
||||
StationClassID station_class; ///< Currently selected custom station class (if newstations is \c true )
|
||||
uint16 station_type; ///< %Station type within the currently selected custom station class (if newstations is \c true )
|
||||
uint16 station_count; ///< Number of custom stations (if newstations is \c true )
|
||||
uint16 station_type; ///< %Station type within the currently selected custom station class (if newstations is \c true )
|
||||
uint16 station_count; ///< Number of custom stations (if newstations is \c true )
|
||||
};
|
||||
static RailStationGUISettings _railstation; ///< Settings of the station builder GUI
|
||||
|
||||
@@ -1108,7 +1108,7 @@ private:
|
||||
if (station_class == _railstation.station_class) break;
|
||||
pos++;
|
||||
}
|
||||
this->vscroll->SetCount((int)this->station_classes.size());
|
||||
this->vscroll->SetCount(this->station_classes.size());
|
||||
this->vscroll->ScrollTowards(pos);
|
||||
}
|
||||
|
||||
@@ -1253,7 +1253,7 @@ public:
|
||||
this->station_classes.RebuildDone();
|
||||
this->station_classes.Sort();
|
||||
|
||||
this->vscroll->SetCount((uint)this->station_classes.size());
|
||||
this->vscroll->SetCount(this->station_classes.size());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1470,7 +1470,7 @@ public:
|
||||
}
|
||||
|
||||
case WID_BRAS_IMAGE: {
|
||||
byte type = GB(widget, 16, 16);
|
||||
uint16_t type = GB(widget, 16, 16);
|
||||
assert(type < _railstation.station_count);
|
||||
/* Check station availability callback */
|
||||
const StationSpec *statspec = StationClass::Get(_railstation.station_class)->GetSpec(type);
|
||||
@@ -1658,7 +1658,7 @@ public:
|
||||
}
|
||||
|
||||
case WID_BRAS_IMAGE: {
|
||||
int y = GB(widget, 16, 16);
|
||||
uint16_t y = GB(widget, 16, 16);
|
||||
if (y >= _railstation.station_count) return;
|
||||
|
||||
/* Check station availability callback */
|
||||
|
@@ -201,8 +201,10 @@ void CcRoadDepot(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2
|
||||
* bit 2: Allow stations directly adjacent to other stations.
|
||||
* bit 3..4: Entrance direction (#DiagDirection) for normal stops.
|
||||
* bit 3: #Axis of the road for drive-through stops.
|
||||
* bit 5..9: The roadtype.
|
||||
* bit 5..10: The roadtype.
|
||||
* bit 16..31: Station ID to join (NEW_STATION if build new one).
|
||||
* @param p3 bit 0..7: Roadstop class.
|
||||
* bit 16..31: Roadstopspec index.
|
||||
* @param cmd Unused.
|
||||
* @see CmdBuildRoadStop
|
||||
*/
|
||||
@@ -217,7 +219,7 @@ void CcRoadStop(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2,
|
||||
bool connect_to_road = true;
|
||||
|
||||
RoadStopClassID spec_class = Extract<RoadStopClassID, 0, 8>(p3);
|
||||
uint16 spec_index = GB(p3, 16, 16);
|
||||
uint16 spec_index = GB(p3, 16, 16);
|
||||
if ((uint)spec_class < RoadStopClass::GetClassCount() && spec_index < RoadStopClass::Get(spec_class)->GetSpecCount()) {
|
||||
const RoadStopSpec *roadstopspec = RoadStopClass::Get(spec_class)->GetSpec(spec_index);
|
||||
if (roadstopspec != nullptr && HasBit(roadstopspec->flags, RSF_NO_AUTO_ROAD_CONNECTION)) connect_to_road = false;
|
||||
@@ -1251,7 +1253,7 @@ private:
|
||||
if (rs_class == _roadstop_gui_settings.roadstop_class) break;
|
||||
pos++;
|
||||
}
|
||||
this->vscrollList->SetCount((int)this->roadstop_classes.size());
|
||||
this->vscrollList->SetCount(this->roadstop_classes.size());
|
||||
this->vscrollList->ScrollTowards(pos);
|
||||
}
|
||||
|
||||
@@ -1397,7 +1399,7 @@ public:
|
||||
this->roadstop_classes.RebuildDone();
|
||||
this->roadstop_classes.Sort();
|
||||
|
||||
this->vscrollList->SetCount((uint)this->roadstop_classes.size());
|
||||
this->vscrollList->SetCount(this->roadstop_classes.size());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1601,7 +1603,7 @@ public:
|
||||
}
|
||||
|
||||
case WID_BROS_IMAGE: {
|
||||
byte type = GB(widget, 16, 16);
|
||||
uint16_t type = GB(widget, 16, 16);
|
||||
assert(type < _roadstop_gui_settings.roadstop_count);
|
||||
|
||||
const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(type);
|
||||
@@ -1698,7 +1700,7 @@ public:
|
||||
}
|
||||
|
||||
case WID_BROS_IMAGE: {
|
||||
int y = GB(widget, 16, 16);
|
||||
uint16_t y = GB(widget, 16, 16);
|
||||
if (y >= _roadstop_gui_settings.roadstop_count) return;
|
||||
|
||||
const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(y);
|
||||
|
@@ -2301,7 +2301,7 @@ bool AfterLoadGame()
|
||||
|
||||
/* Replace "house construction year" with "house age" */
|
||||
if (IsTileType(t, MP_HOUSE) && IsHouseCompleted(t)) {
|
||||
_m[t].m5 = Clamp(_cur_year - (_m[t].m5 + ORIGINAL_BASE_YEAR), 0, 0xFF);
|
||||
_m[t].m5 = ClampTo<uint8>(_cur_year - (_m[t].m5 + ORIGINAL_BASE_YEAR));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -638,7 +638,7 @@ bool DispatchSchedule::UpdateScheduledDispatchToDate(DateTicksScaled now)
|
||||
const int64 day = 24 * 60 * _settings_game.game_time.ticks_per_minute;
|
||||
this->scheduled_dispatch_last_dispatch = last_dispatch + (CeilDivT<int64>(INT_MIN - last_dispatch, day) * day);
|
||||
} else {
|
||||
this->scheduled_dispatch_last_dispatch = ClampToI32(last_dispatch);
|
||||
this->scheduled_dispatch_last_dispatch = ClampTo<int32>(last_dispatch);
|
||||
}
|
||||
}
|
||||
/* Most of the time this loop does not runs. It makes sure start date in in past */
|
||||
|
@@ -182,6 +182,7 @@ add_files(
|
||||
script_league.hpp
|
||||
script_list.hpp
|
||||
script_log.hpp
|
||||
script_log_types.hpp
|
||||
script_map.hpp
|
||||
script_marine.hpp
|
||||
script_newgrf.hpp
|
||||
|
@@ -52,7 +52,7 @@
|
||||
|
||||
char log_message[1024];
|
||||
seprintf(log_message, lastof(log_message), "Break: %s", message);
|
||||
ScriptLog::Log(ScriptLog::LOG_SQ_ERROR, log_message);
|
||||
ScriptLog::Log(ScriptLogTypes::LOG_SQ_ERROR, log_message);
|
||||
|
||||
/* Inform script developer that their script has been paused and
|
||||
* needs manual action to continue. */
|
||||
@@ -65,7 +65,7 @@
|
||||
|
||||
/* static */ void ScriptController::Print(bool error_msg, const char *message)
|
||||
{
|
||||
ScriptLog::Log(error_msg ? ScriptLog::LOG_SQ_ERROR : ScriptLog::LOG_SQ_INFO, message);
|
||||
ScriptLog::Log(error_msg ? ScriptLogTypes::LOG_SQ_ERROR : ScriptLogTypes::LOG_SQ_INFO, message);
|
||||
}
|
||||
|
||||
ScriptController::ScriptController(CompanyID company) :
|
||||
|
@@ -8,6 +8,7 @@
|
||||
/** @file script_log.cpp Implementation of ScriptLog. */
|
||||
|
||||
#include "../../stdafx.h"
|
||||
#include "script_log_types.hpp"
|
||||
#include "script_log.hpp"
|
||||
#include "../../core/alloc_func.hpp"
|
||||
#include "../../debug.h"
|
||||
@@ -18,80 +19,50 @@
|
||||
|
||||
/* static */ void ScriptLog::Info(const char *message)
|
||||
{
|
||||
ScriptLog::Log(LOG_INFO, message);
|
||||
ScriptLog::Log(ScriptLogTypes::LOG_INFO, message);
|
||||
}
|
||||
|
||||
/* static */ void ScriptLog::Warning(const char *message)
|
||||
{
|
||||
ScriptLog::Log(LOG_WARNING, message);
|
||||
ScriptLog::Log(ScriptLogTypes::LOG_WARNING, message);
|
||||
}
|
||||
|
||||
/* static */ void ScriptLog::Error(const char *message)
|
||||
{
|
||||
ScriptLog::Log(LOG_ERROR, message);
|
||||
ScriptLog::Log(ScriptLogTypes::LOG_ERROR, message);
|
||||
}
|
||||
|
||||
/* static */ void ScriptLog::Log(ScriptLog::ScriptLogType level, const char *message)
|
||||
/* static */ void ScriptLog::Log(ScriptLogTypes::ScriptLogType level, const char *message)
|
||||
{
|
||||
if (ScriptObject::GetLogPointer() == nullptr) {
|
||||
ScriptObject::GetLogPointer() = new LogData();
|
||||
LogData *log = (LogData *)ScriptObject::GetLogPointer();
|
||||
ScriptLogTypes::LogData &logdata = ScriptObject::GetLogData();
|
||||
|
||||
log->lines = CallocT<char *>(400);
|
||||
log->type = CallocT<ScriptLog::ScriptLogType>(400);
|
||||
log->count = 400;
|
||||
log->pos = log->count - 1;
|
||||
log->used = 0;
|
||||
}
|
||||
LogData *log = (LogData *)ScriptObject::GetLogPointer();
|
||||
/* Limit the log to 400 lines. */
|
||||
if (logdata.size() >= 400U) logdata.pop_front();
|
||||
|
||||
/* Go to the next log-line */
|
||||
log->pos = (log->pos + 1) % log->count;
|
||||
|
||||
if (log->used != log->count) log->used++;
|
||||
|
||||
/* Free last message, and write new message */
|
||||
free(log->lines[log->pos]);
|
||||
log->lines[log->pos] = stredup(message);
|
||||
log->type[log->pos] = level;
|
||||
auto &line = logdata.emplace_back();
|
||||
line.type = level;
|
||||
|
||||
/* Cut string after first \n */
|
||||
char *p;
|
||||
while ((p = strchr(log->lines[log->pos], '\n')) != nullptr) {
|
||||
*p = '\0';
|
||||
break;
|
||||
}
|
||||
const char *newline = strchr(message, '\n');
|
||||
line.text = std::string(message, 0, newline == nullptr ? strlen(message) : newline - message);
|
||||
|
||||
char logc;
|
||||
|
||||
switch (level) {
|
||||
case LOG_SQ_ERROR: logc = 'S'; break;
|
||||
case LOG_ERROR: logc = 'E'; break;
|
||||
case LOG_SQ_INFO: logc = 'P'; break;
|
||||
case LOG_WARNING: logc = 'W'; break;
|
||||
case LOG_INFO: logc = 'I'; break;
|
||||
default: logc = '?'; break;
|
||||
case ScriptLogTypes::LOG_SQ_ERROR: logc = 'S'; break;
|
||||
case ScriptLogTypes::LOG_ERROR: logc = 'E'; break;
|
||||
case ScriptLogTypes::LOG_SQ_INFO: logc = 'P'; break;
|
||||
case ScriptLogTypes::LOG_WARNING: logc = 'W'; break;
|
||||
case ScriptLogTypes::LOG_INFO: logc = 'I'; break;
|
||||
default: logc = '?'; break;
|
||||
}
|
||||
|
||||
/* Also still print to debug window */
|
||||
DEBUG(script, level, "[%d] [%c] %s", (uint)ScriptObject::GetRootCompany(), logc, log->lines[log->pos]);
|
||||
DEBUG(script, level, "[%d] [%c] %s", (uint)ScriptObject::GetRootCompany(), logc, line.text.c_str());
|
||||
InvalidateWindowData(WC_SCRIPT_DEBUG, 0, ScriptObject::GetRootCompany());
|
||||
}
|
||||
|
||||
/* static */ void ScriptLog::FreeLogPointer()
|
||||
{
|
||||
LogData *log = (LogData *)ScriptObject::GetLogPointer();
|
||||
|
||||
for (int i = 0; i < log->count; i++) {
|
||||
free(log->lines[i]);
|
||||
}
|
||||
|
||||
free(log->lines);
|
||||
free(log->type);
|
||||
delete log;
|
||||
}
|
||||
|
||||
/* static */ void ScriptLog::LogOnce(ScriptLog::ScriptLogType level, std::string &&message)
|
||||
/* static */ void ScriptLog::LogOnce(ScriptLogTypes::ScriptLogType level, std::string &&message)
|
||||
{
|
||||
if (ScriptObject::IsNewUniqueLogMessage(message)) {
|
||||
ScriptLog::Log(level, message.c_str());
|
||||
|
@@ -22,32 +22,6 @@ class ScriptLog : public ScriptObject {
|
||||
friend class ScriptController;
|
||||
|
||||
public:
|
||||
/**
|
||||
* Log levels; The value is also feed to DEBUG() lvl.
|
||||
* This has no use for you, as script writer.
|
||||
* @api -all
|
||||
*/
|
||||
enum ScriptLogType {
|
||||
LOG_SQ_ERROR = 0, ///< Squirrel printed an error.
|
||||
LOG_ERROR = 1, ///< User printed an error.
|
||||
LOG_SQ_INFO = 2, ///< Squirrel printed some info.
|
||||
LOG_WARNING = 3, ///< User printed some warning.
|
||||
LOG_INFO = 4, ///< User printed some info.
|
||||
};
|
||||
|
||||
/**
|
||||
* Internal representation of the log-data inside the script.
|
||||
* This has no use for you, as script writer.
|
||||
* @api -all
|
||||
*/
|
||||
struct LogData {
|
||||
char **lines; ///< The log-lines.
|
||||
ScriptLog::ScriptLogType *type; ///< Per line, which type of log it was.
|
||||
int count; ///< Total amount of log-lines possible.
|
||||
int pos; ///< Current position in lines.
|
||||
int used; ///< Total amount of used log-lines.
|
||||
};
|
||||
|
||||
/**
|
||||
* Print an Info message to the logs.
|
||||
* @param message The message to log.
|
||||
@@ -69,23 +43,17 @@ public:
|
||||
*/
|
||||
static void Error(const char *message);
|
||||
|
||||
/**
|
||||
* Free the log pointer.
|
||||
* @api -all
|
||||
*/
|
||||
static void FreeLogPointer();
|
||||
|
||||
/**
|
||||
* Log this message once.
|
||||
* @api -all
|
||||
*/
|
||||
static void LogOnce(ScriptLog::ScriptLogType level, std::string &&message);
|
||||
static void LogOnce(ScriptLogTypes::ScriptLogType level, std::string &&message);
|
||||
|
||||
private:
|
||||
/**
|
||||
* Internal command to log the message in a common way.
|
||||
*/
|
||||
static void Log(ScriptLog::ScriptLogType level, const char *message);
|
||||
static void Log(ScriptLogTypes::ScriptLogType level, const char *message);
|
||||
};
|
||||
|
||||
#endif /* SCRIPT_LOG_HPP */
|
||||
|
47
src/script/api/script_log_types.hpp
Normal file
47
src/script/api/script_log_types.hpp
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* This file is part of OpenTTD.
|
||||
* OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
|
||||
* OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
* See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/** @file script_log_types.hpp Data types for script log messages. */
|
||||
|
||||
#ifndef SCRIPT_LOG_TYPES_HPP
|
||||
#define SCRIPT_LOG_TYPES_HPP
|
||||
|
||||
#include <deque>
|
||||
|
||||
namespace ScriptLogTypes {
|
||||
/**
|
||||
* Log levels; The value is also feed to Debug() lvl.
|
||||
* This has no use for you, as script writer.
|
||||
* @api -all
|
||||
*/
|
||||
enum ScriptLogType {
|
||||
LOG_SQ_ERROR = 0, ///< Squirrel printed an error.
|
||||
LOG_ERROR = 1, ///< User printed an error.
|
||||
LOG_SQ_INFO = 2, ///< Squirrel printed some info.
|
||||
LOG_WARNING = 3, ///< User printed some warning.
|
||||
LOG_INFO = 4, ///< User printed some info.
|
||||
};
|
||||
|
||||
/**
|
||||
* Internal representation of the log-data inside the script.
|
||||
* This has no use for you, as script writer.
|
||||
* @api -all
|
||||
*/
|
||||
struct LogLine {
|
||||
std::string text; ///< The text
|
||||
ScriptLogType type; ///< Text type
|
||||
};
|
||||
|
||||
/**
|
||||
* Internal representation of the log-data inside the script.
|
||||
* This has no use for you, as script writer.
|
||||
* @api -all
|
||||
*/
|
||||
using LogData = std::deque<LogLine>; ///< The log type
|
||||
};
|
||||
|
||||
#endif /* SCRIPT_LOG_TYPES_HPP */
|
@@ -306,7 +306,7 @@ ScriptObject::ActiveInstance::~ActiveInstance()
|
||||
return GetStorage()->event_data;
|
||||
}
|
||||
|
||||
/* static */ void *&ScriptObject::GetLogPointer()
|
||||
/* static */ ScriptLogTypes::LogData &ScriptObject::GetLogData()
|
||||
{
|
||||
return GetStorage()->log_data;
|
||||
}
|
||||
|
@@ -16,6 +16,7 @@
|
||||
#include "../../core/random_func.hpp"
|
||||
|
||||
#include "script_types.hpp"
|
||||
#include "script_log_types.hpp"
|
||||
#include "../script_suspend.hpp"
|
||||
#include "../squirrel.hpp"
|
||||
|
||||
@@ -317,7 +318,7 @@ protected:
|
||||
/**
|
||||
* Get the pointer to store log message in.
|
||||
*/
|
||||
static void *&GetLogPointer();
|
||||
static ScriptLogTypes::LogData &GetLogData();
|
||||
|
||||
/**
|
||||
* Get an allocated string with all control codes stripped off.
|
||||
|
@@ -185,7 +185,7 @@
|
||||
0,
|
||||
source_industry,
|
||||
goal_industry,
|
||||
std::min<SQInteger>(255, distance / 2),
|
||||
ClampTo<uint8_t>(distance / 2),
|
||||
AICE_STATION_GET_STATION_ID,
|
||||
source_station ? 0 : 1,
|
||||
std::min<SQInteger>(15u, num_platforms) << 4 | std::min<SQInteger>(15u, platform_length),
|
||||
|
@@ -174,7 +174,7 @@ const std::string ScriptText::GetEncodedText()
|
||||
void ScriptText::_TextParamError(std::string msg)
|
||||
{
|
||||
if (this->GetActiveInstance()->IsTextParamMismatchAllowed()) {
|
||||
ScriptLog::LogOnce(ScriptLog::LOG_ERROR, std::move(msg));
|
||||
ScriptLog::LogOnce(ScriptLogTypes::LOG_ERROR, std::move(msg));
|
||||
} else {
|
||||
throw Script_FatalError(std::move(msg));
|
||||
}
|
||||
|
@@ -78,7 +78,7 @@ struct ScriptListWindow : public Window {
|
||||
this->vscroll = this->GetScrollbar(WID_SCRL_SCROLLBAR);
|
||||
this->FinishInitNested(); // Initializes 'this->line_height' as side effect.
|
||||
|
||||
this->vscroll->SetCount((int)this->info_list->size() + 1);
|
||||
this->vscroll->SetCount(this->info_list->size() + 1);
|
||||
|
||||
/* Try if we can find the currently selected AI */
|
||||
this->selected = -1;
|
||||
@@ -238,7 +238,7 @@ struct ScriptListWindow : public Window {
|
||||
|
||||
if (!gui_scope) return;
|
||||
|
||||
this->vscroll->SetCount((int)this->info_list->size() + 1);
|
||||
this->vscroll->SetCount(this->info_list->size() + 1);
|
||||
|
||||
/* selected goes from -1 .. length of ai list - 1. */
|
||||
this->selected = std::min(this->selected, this->vscroll->GetCount() - 2);
|
||||
@@ -346,7 +346,7 @@ struct ScriptSettingsWindow : public Window {
|
||||
}
|
||||
}
|
||||
|
||||
this->vscroll->SetCount((int)this->visible_settings.size());
|
||||
this->vscroll->SetCount(this->visible_settings.size());
|
||||
}
|
||||
|
||||
void SetStringParameters(int widget) const override
|
||||
@@ -720,10 +720,10 @@ struct ScriptDebugWindow : public Window {
|
||||
int highlight_row; ///< The output row that matches the given string, or -1
|
||||
Scrollbar *vscroll; ///< Cache of the vertical scrollbar.
|
||||
|
||||
ScriptLog::LogData *GetLogPointer() const
|
||||
ScriptLogTypes::LogData &GetLogData() const
|
||||
{
|
||||
if (script_debug_company == OWNER_DEITY) return (ScriptLog::LogData *)Game::GetInstance()->GetLogPointer();
|
||||
return (ScriptLog::LogData *)Company::Get(script_debug_company)->ai_instance->GetLogPointer();
|
||||
if (script_debug_company == OWNER_DEITY) return Game::GetInstance()->GetLogData();
|
||||
return Company::Get(script_debug_company)->ai_instance->GetLogData();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -861,9 +861,9 @@ struct ScriptDebugWindow : public Window {
|
||||
/* If there are no active companies, don't display anything else. */
|
||||
if (script_debug_company == INVALID_COMPANY) return;
|
||||
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
ScriptLogTypes::LogData &log = this->GetLogData();
|
||||
|
||||
int scroll_count = (log == nullptr) ? 0 : log->used;
|
||||
int scroll_count = (int)log.size();
|
||||
if (this->vscroll->GetCount() != scroll_count) {
|
||||
this->vscroll->SetCount(scroll_count);
|
||||
|
||||
@@ -871,16 +871,15 @@ struct ScriptDebugWindow : public Window {
|
||||
this->SetWidgetDirty(WID_SCRD_SCROLLBAR);
|
||||
}
|
||||
|
||||
if (log == nullptr) return;
|
||||
if (log.empty()) return;
|
||||
|
||||
/* Detect when the user scrolls the window. Enable autoscroll when the
|
||||
* bottom-most line becomes visible. */
|
||||
if (this->last_vscroll_pos != this->vscroll->GetPosition()) {
|
||||
this->autoscroll = this->vscroll->GetPosition() >= log->used - this->vscroll->GetCapacity();
|
||||
this->autoscroll = this->vscroll->GetPosition() + this->vscroll->GetCapacity() >= (int)log.size();
|
||||
}
|
||||
if (this->autoscroll) {
|
||||
int scroll_pos = std::max(0, log->used - this->vscroll->GetCapacity());
|
||||
if (this->vscroll->SetPosition(scroll_pos)) {
|
||||
if (this->vscroll->SetPosition((int)log.size())) {
|
||||
/* We need a repaint */
|
||||
this->SetWidgetDirty(WID_SCRD_SCROLLBAR);
|
||||
this->SetWidgetDirty(WID_SCRD_LOG_PANEL);
|
||||
@@ -916,32 +915,31 @@ struct ScriptDebugWindow : public Window {
|
||||
|
||||
if (widget != WID_SCRD_LOG_PANEL) return;
|
||||
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
if (log == nullptr) return;
|
||||
ScriptLogTypes::LogData &log = this->GetLogData();
|
||||
if (log.empty()) return;
|
||||
|
||||
Rect br = r.Shrink(WidgetDimensions::scaled.bevel);
|
||||
Rect tr = r.Shrink(WidgetDimensions::scaled.framerect);
|
||||
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && i < log->used; i++) {
|
||||
int pos = (i + log->pos + 1 - log->used + log->count) % log->count;
|
||||
if (log->lines[pos] == nullptr) break;
|
||||
for (int i = this->vscroll->GetPosition(); this->vscroll->IsVisible(i) && (size_t)i < log.size(); i++) {
|
||||
const ScriptLogTypes::LogLine &line = log[i];
|
||||
|
||||
TextColour colour;
|
||||
switch (log->type[pos]) {
|
||||
case ScriptLog::LOG_SQ_INFO: colour = TC_BLACK; break;
|
||||
case ScriptLog::LOG_SQ_ERROR: colour = TC_WHITE; break;
|
||||
case ScriptLog::LOG_INFO: colour = TC_BLACK; break;
|
||||
case ScriptLog::LOG_WARNING: colour = TC_YELLOW; break;
|
||||
case ScriptLog::LOG_ERROR: colour = TC_RED; break;
|
||||
default: colour = TC_BLACK; break;
|
||||
switch (line.type) {
|
||||
case ScriptLogTypes::LOG_SQ_INFO: colour = TC_BLACK; break;
|
||||
case ScriptLogTypes::LOG_SQ_ERROR: colour = TC_WHITE; break;
|
||||
case ScriptLogTypes::LOG_INFO: colour = TC_BLACK; break;
|
||||
case ScriptLogTypes::LOG_WARNING: colour = TC_YELLOW; break;
|
||||
case ScriptLogTypes::LOG_ERROR: colour = TC_RED; break;
|
||||
default: colour = TC_BLACK; break;
|
||||
}
|
||||
|
||||
/* Check if the current line should be highlighted */
|
||||
if (pos == this->highlight_row) {
|
||||
if (i == this->highlight_row) {
|
||||
GfxFillRect(br.left, tr.top, br.right, tr.top + this->resize.step_height - 1, PC_BLACK);
|
||||
if (colour == TC_BLACK) colour = TC_WHITE; // Make black text readable by inverting it to white.
|
||||
}
|
||||
|
||||
DrawString(tr, log->lines[pos], colour, SA_LEFT | SA_FORCE);
|
||||
DrawString(tr, line.text, colour, SA_LEFT | SA_FORCE);
|
||||
tr.top += this->resize.step_height;
|
||||
}
|
||||
}
|
||||
@@ -1064,11 +1062,11 @@ struct ScriptDebugWindow : public Window {
|
||||
* This needs to be done in gameloop-scope, so the AI is suspended immediately. */
|
||||
if (!gui_scope && data == script_debug_company && this->IsValidDebugCompany(script_debug_company) && this->break_check_enabled && !this->break_string_filter.IsEmpty()) {
|
||||
/* Get the log instance of the active company */
|
||||
ScriptLog::LogData *log = this->GetLogPointer();
|
||||
ScriptLogTypes::LogData &log = this->GetLogData();
|
||||
|
||||
if (log != nullptr) {
|
||||
if (!log.empty()) {
|
||||
this->break_string_filter.ResetState();
|
||||
this->break_string_filter.AddLine(log->lines[log->pos]);
|
||||
this->break_string_filter.AddLine(log.back().text);
|
||||
if (this->break_string_filter.GetState()) {
|
||||
/* Pause execution of script. */
|
||||
if (!this->IsDead()) {
|
||||
@@ -1085,7 +1083,7 @@ struct ScriptDebugWindow : public Window {
|
||||
}
|
||||
|
||||
/* Highlight row that matched */
|
||||
this->highlight_row = log->pos;
|
||||
this->highlight_row = (int)(log.size() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1094,8 +1092,7 @@ struct ScriptDebugWindow : public Window {
|
||||
|
||||
this->SelectValidDebugCompany();
|
||||
|
||||
ScriptLog::LogData *log = script_debug_company != INVALID_COMPANY ? this->GetLogPointer() : nullptr;
|
||||
this->vscroll->SetCount((log == nullptr) ? 0 : log->used);
|
||||
this->vscroll->SetCount(script_debug_company != INVALID_COMPANY ? this->GetLogData().size() : 0);
|
||||
|
||||
/* Update company buttons */
|
||||
for (CompanyID i = COMPANY_FIRST; i < MAX_COMPANIES; i++) {
|
||||
|
@@ -146,42 +146,42 @@ SQInteger ScriptInfo::AddSetting(HSQUIRRELVM vm)
|
||||
} else if (strcmp(key, "min_value") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.min_value = ClampToI32(res);
|
||||
config.min_value = ClampTo<int32_t>(res);
|
||||
items |= 0x004;
|
||||
} else if (strcmp(key, "max_value") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.max_value = ClampToI32(res);
|
||||
config.max_value = ClampTo<int32_t>(res);
|
||||
items |= 0x008;
|
||||
} else if (strcmp(key, "easy_value") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.easy_value = ClampToI32(res);
|
||||
config.easy_value = ClampTo<int32_t>(res);
|
||||
items |= 0x010;
|
||||
} else if (strcmp(key, "medium_value") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.medium_value = ClampToI32(res);
|
||||
config.medium_value = ClampTo<int32_t>(res);
|
||||
items |= 0x020;
|
||||
} else if (strcmp(key, "hard_value") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.hard_value = ClampToI32(res);
|
||||
config.hard_value = ClampTo<int32_t>(res);
|
||||
items |= 0x040;
|
||||
} else if (strcmp(key, "random_deviation") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.random_deviation = ClampToI32(abs(res));
|
||||
config.random_deviation = ClampTo<int32_t>(abs(res));
|
||||
items |= 0x200;
|
||||
} else if (strcmp(key, "custom_value") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.custom_value = ClampToI32(res);
|
||||
config.custom_value = ClampTo<int32_t>(res);
|
||||
items |= 0x080;
|
||||
} else if (strcmp(key, "step_size") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
config.step_size = ClampToI32(res);
|
||||
config.step_size = ClampTo<int32_t>(res);
|
||||
} else if (strcmp(key, "flags") == 0) {
|
||||
SQInteger res;
|
||||
if (SQ_FAILED(sq_getinteger(vm, -1, &res))) return SQ_ERROR;
|
||||
|
@@ -35,7 +35,6 @@ ScriptStorage::~ScriptStorage()
|
||||
{
|
||||
/* Free our pointers */
|
||||
if (event_data != nullptr) ScriptEventController::FreeEventPointer();
|
||||
if (log_data != nullptr) ScriptLog::FreeLogPointer();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -350,11 +349,11 @@ ScriptStorage *ScriptInstance::GetStorage()
|
||||
return this->storage;
|
||||
}
|
||||
|
||||
void *ScriptInstance::GetLogPointer()
|
||||
ScriptLogTypes::LogData &ScriptInstance::GetLogData()
|
||||
{
|
||||
ScriptObject::ActiveInstance active(this);
|
||||
|
||||
return ScriptObject::GetLogPointer();
|
||||
return ScriptObject::GetLogData();
|
||||
}
|
||||
|
||||
/*
|
||||
|
@@ -15,6 +15,7 @@
|
||||
#include <squirrel.h>
|
||||
#include "squirrel.hpp"
|
||||
#include "script_suspend.hpp"
|
||||
#include "script_log_types.hpp"
|
||||
|
||||
#include "../command_type.h"
|
||||
#include "../company_type.h"
|
||||
@@ -96,7 +97,7 @@ public:
|
||||
/**
|
||||
* Get the log pointer of this script.
|
||||
*/
|
||||
void *GetLogPointer();
|
||||
ScriptLogTypes::LogData &GetLogData();
|
||||
|
||||
/**
|
||||
* Return a true/false reply for a DoCommand.
|
||||
|
@@ -18,6 +18,8 @@
|
||||
#include "../story_type.h"
|
||||
#include "../3rdparty/robin_hood/robin_hood.h"
|
||||
|
||||
#include "script_log_types.hpp"
|
||||
|
||||
#include "table/strings.h"
|
||||
#include <vector>
|
||||
|
||||
@@ -72,7 +74,7 @@ private:
|
||||
RailType rail_type; ///< The current railtype we build.
|
||||
|
||||
void *event_data; ///< Pointer to the event data storage.
|
||||
void *log_data; ///< Pointer to the log data storage.
|
||||
ScriptLogTypes::LogData log_data;///< Log data storage.
|
||||
|
||||
robin_hood::unordered_node_set<std::string> seen_unique_log_messages; ///< Messages which have already been logged once and don't need to be logged again
|
||||
|
||||
@@ -105,8 +107,7 @@ public:
|
||||
/* calback_value (can't be set) */
|
||||
road_type (INVALID_ROADTYPE),
|
||||
rail_type (INVALID_RAILTYPE),
|
||||
event_data (nullptr),
|
||||
log_data (nullptr)
|
||||
event_data (nullptr)
|
||||
{ }
|
||||
|
||||
~ScriptStorage();
|
||||
|
@@ -2947,7 +2947,7 @@ struct GameSettingsWindow : Window {
|
||||
/* Save the correct currency-translated value */
|
||||
if (sd->flags & SF_GUI_CURRENCY) llvalue /= _currency->rate;
|
||||
|
||||
value = (int32)ClampToI32(llvalue);
|
||||
value = ClampTo<int32>(llvalue);
|
||||
|
||||
/* Save the correct velocity-translated value */
|
||||
if (sd->flags & SF_GUI_VELOCITY) value = ConvertDisplaySpeedToKmhishSpeed(value, VEH_TRAIN);
|
||||
|
@@ -35,7 +35,7 @@ void NORETURN CDECL error(const char *s, ...)
|
||||
va_start(va, s);
|
||||
vseprintf(buf, lastof(buf), s, va);
|
||||
va_end(va);
|
||||
fprintf(stderr, "FATAL: %s\n", buf);
|
||||
fprintf(stderr, "settingsgen: FATAL: %s\n", buf);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -72,7 +72,7 @@ public:
|
||||
void Write(FILE *out_fp) const
|
||||
{
|
||||
if (fwrite(this->data, 1, this->size, out_fp) != this->size) {
|
||||
fprintf(stderr, "Error: Cannot write output\n");
|
||||
error("Cannot write output");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -329,8 +329,7 @@ static void DumpSections(IniLoadFile *ifile)
|
||||
|
||||
IniItem *template_item = templates_grp->GetItem(grp->name, false); // Find template value.
|
||||
if (template_item == nullptr || !template_item->value.has_value()) {
|
||||
fprintf(stderr, "settingsgen: Warning: Cannot find template %s\n", grp->name.c_str());
|
||||
continue;
|
||||
error("Cannot find template %s", grp->name.c_str());
|
||||
}
|
||||
DumpLine(template_item, grp, default_grp, _stored_output);
|
||||
|
||||
@@ -354,8 +353,7 @@ static void CopyFile(const char *fname, FILE *out_fp)
|
||||
|
||||
FILE *in_fp = fopen(fname, "r");
|
||||
if (in_fp == nullptr) {
|
||||
fprintf(stderr, "settingsgen: Warning: Cannot open file %s for copying\n", fname);
|
||||
return;
|
||||
error("Cannot open file %s for copying", fname);
|
||||
}
|
||||
|
||||
char buffer[4096];
|
||||
@@ -363,8 +361,7 @@ static void CopyFile(const char *fname, FILE *out_fp)
|
||||
do {
|
||||
length = fread(buffer, 1, lengthof(buffer), in_fp);
|
||||
if (fwrite(buffer, 1, length, out_fp) != length) {
|
||||
fprintf(stderr, "Error: Cannot copy file\n");
|
||||
break;
|
||||
error("Cannot copy file");
|
||||
}
|
||||
} while (length == lengthof(buffer));
|
||||
|
||||
@@ -513,8 +510,7 @@ int CDECL main(int argc, char *argv[])
|
||||
|
||||
FILE *fp = fopen(tmp_output, "w");
|
||||
if (fp == nullptr) {
|
||||
fprintf(stderr, "settingsgen: Warning: Cannot open file %s\n", tmp_output);
|
||||
return 1;
|
||||
error("Cannot open file %s", tmp_output);
|
||||
}
|
||||
CopyFile(before_file, fp);
|
||||
_stored_output.Write(fp);
|
||||
|
@@ -305,7 +305,7 @@ struct SignListWindow : Window, SignList {
|
||||
{
|
||||
if (this->signs.NeedRebuild()) {
|
||||
this->BuildSignsList();
|
||||
this->vscroll->SetCount((uint)this->signs.size());
|
||||
this->vscroll->SetCount(this->signs.size());
|
||||
this->SetWidgetDirty(WID_SIL_CAPTION);
|
||||
}
|
||||
this->SortSignsList();
|
||||
|
@@ -165,7 +165,7 @@ bool DecodeSingleSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t f
|
||||
if (colour_fmt & SCC_PAL) {
|
||||
switch (sprite_type) {
|
||||
case SpriteType::Normal: data->m = file.NeedsPaletteRemap() ? _palmap_w2d[*dest] : *dest; break;
|
||||
case SpriteType::Font: data->m = std::min<uint>(*dest, 2u); break;
|
||||
case SpriteType::Font: data->m = std::min<byte>(*dest, 2u); break;
|
||||
default: data->m = *dest; break;
|
||||
}
|
||||
/* Magic blue. */
|
||||
@@ -202,7 +202,7 @@ bool DecodeSingleSprite(SpriteLoader::Sprite *sprite, SpriteFile &file, size_t f
|
||||
if (colour_fmt & SCC_PAL) {
|
||||
switch (sprite_type) {
|
||||
case SpriteType::Normal: sprite->data[i].m = file.NeedsPaletteRemap() ? _palmap_w2d[*pixel] : *pixel; break;
|
||||
case SpriteType::Font: sprite->data[i].m = std::min<uint>(*pixel, 2u); break;
|
||||
case SpriteType::Font: sprite->data[i].m = std::min<byte>(*pixel, 2u); break;
|
||||
default: sprite->data[i].m = *pixel; break;
|
||||
}
|
||||
/* Magic blue. */
|
||||
|
@@ -1015,7 +1015,7 @@ CommandCost IsRoadStopBridgeAboveOK(TileIndex tile, const RoadStopSpec *spec, bo
|
||||
* @param numtracks Number of platforms.
|
||||
* @return The cost in case of success, or an error code if it failed.
|
||||
*/
|
||||
static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector<Train *> &affected_vehicles, StationClassID spec_class, byte spec_index, byte plat_len, byte numtracks)
|
||||
static CommandCost CheckFlatLandRailStation(TileArea tile_area, DoCommandFlag flags, Axis axis, StationID *station, RailType rt, std::vector<Train *> &affected_vehicles, StationClassID spec_class, uint16_t spec_index, byte plat_len, byte numtracks)
|
||||
{
|
||||
CommandCost cost(EXPENSES_CONSTRUCTION);
|
||||
int allowed_z = -1;
|
||||
@@ -1484,7 +1484,7 @@ CommandCost CmdBuildRailStation(TileIndex tile_org, DoCommandFlag flags, uint32
|
||||
bool adjacent = HasBit(p1, 24);
|
||||
|
||||
StationClassID spec_class = Extract<StationClassID, 0, 8>(p2);
|
||||
byte spec_index = GB(p3, 0, 16);
|
||||
uint16 spec_index = GB(p3, 0, 16);
|
||||
StationID station_to_join = GB(p2, 16, 16);
|
||||
|
||||
/* Does the authority allow this? */
|
||||
@@ -4251,7 +4251,7 @@ int GetTargetRating(const Station *st, const CargoSpec *cs, const GoodsEntry *ge
|
||||
rating += GetStatueRating(st);
|
||||
rating += GetVehicleAgeRating(ge);
|
||||
|
||||
return Clamp(rating, 0, 255);
|
||||
return ClampTo<uint8>(rating);
|
||||
}
|
||||
|
||||
static void UpdateStationRating(Station *st)
|
||||
@@ -4671,7 +4671,7 @@ void ModifyStationRatingAround(TileIndex tile, Owner owner, int amount, uint rad
|
||||
GoodsEntry *ge = &st->goods[i];
|
||||
|
||||
if (ge->status != 0) {
|
||||
ge->rating = Clamp(ge->rating + amount, 0, 255);
|
||||
ge->rating = ClampTo<uint8_t>(ge->rating + amount);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -311,7 +311,7 @@ protected:
|
||||
this->stations.shrink_to_fit();
|
||||
this->stations.RebuildDone();
|
||||
|
||||
this->vscroll->SetCount((uint)this->stations.size()); // Update the scrollbar
|
||||
this->vscroll->SetCount(this->stations.size()); // Update the scrollbar
|
||||
}
|
||||
|
||||
/** Sort stations by their name */
|
||||
@@ -549,7 +549,7 @@ public:
|
||||
|
||||
case WID_STL_LIST: {
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
int max = std::min<size_t>(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->stations.size());
|
||||
size_t max = std::min<size_t>(this->vscroll->GetPosition() + this->vscroll->GetCapacity(), this->stations.size());
|
||||
Rect tr = r.Shrink(WidgetDimensions::scaled.framerect);
|
||||
uint line_height = this->GetWidget<NWidgetBase>(widget)->resize_y;
|
||||
/* Spacing between station name and first rating graph. */
|
||||
@@ -557,7 +557,7 @@ public:
|
||||
/* Spacing between additional rating graphs. */
|
||||
int rating_spacing = WidgetDimensions::scaled.hsep_normal;
|
||||
|
||||
for (int i = this->vscroll->GetPosition(); i < max; ++i) { // do until max number of stations of owner
|
||||
for (size_t i = this->vscroll->GetPosition(); i < max; ++i) { // do until max number of stations of owner
|
||||
const Station *st = this->stations[i];
|
||||
assert(st->xy != INVALID_TILE);
|
||||
|
||||
@@ -2616,7 +2616,7 @@ struct SelectStationWindow : Window {
|
||||
{
|
||||
if (!gui_scope) return;
|
||||
FindStationsNearby<T>(this->area, true, IsSpecializedStationRightType<T>(this->select_station_cmd));
|
||||
this->vscroll->SetCount((uint)_stations_nearby_list.size() + 1);
|
||||
this->vscroll->SetCount(_stations_nearby_list.size() + 1);
|
||||
this->SetDirty();
|
||||
}
|
||||
|
||||
|
@@ -131,7 +131,7 @@ struct FileStringReader : StringReader {
|
||||
|
||||
char *ReadLine(char *buffer, const char *last) override
|
||||
{
|
||||
char *result = fgets(buffer, ClampToU16(last - buffer + 1), this->fh);
|
||||
char *result = fgets(buffer, ClampTo<uint16>(last - buffer + 1), this->fh);
|
||||
if (result == nullptr && this->fh2 != nullptr) {
|
||||
fclose(this->fh);
|
||||
this->fh = this->fh2;
|
||||
|
@@ -233,16 +233,19 @@ static void StrMakeValidInPlace(T &dst, const char *str, const char *last, Strin
|
||||
} while (--len != 0);
|
||||
} else if ((settings & SVS_ALLOW_NEWLINE) != 0 && c == '\n') {
|
||||
*dst++ = *str++;
|
||||
} else if ((settings & SVS_ALLOW_SEPARATOR_CODE) != 0 && c == 0x1F) {
|
||||
*dst++ = *str++;
|
||||
} else {
|
||||
if ((settings & SVS_ALLOW_NEWLINE) != 0 && c == '\r' && str[1] == '\n') {
|
||||
str += len;
|
||||
continue;
|
||||
}
|
||||
/* Replace the undesirable character with a question mark */
|
||||
str += len;
|
||||
if ((settings & SVS_REPLACE_WITH_QUESTION_MARK) != 0) *dst++ = '?';
|
||||
if ((settings & SVS_REPLACE_TAB_CR_NL_WITH_SPACE) != 0 && (c == '\r' || c == '\n' || c == '\t')) {
|
||||
/* Replace the tab, carriage return or newline with a space. */
|
||||
*dst++ = ' ';
|
||||
} else if ((settings & SVS_REPLACE_WITH_QUESTION_MARK) != 0) {
|
||||
/* Replace the undesirable character with a question mark */
|
||||
*dst++ = '?';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -284,7 +287,7 @@ void StrMakeValidInPlace(char *str, StringValidationSettings settings)
|
||||
* @param str The string to validate.
|
||||
* @param settings The settings for the string validation.
|
||||
*/
|
||||
std::string StrMakeValid(const std::string &str, StringValidationSettings settings)
|
||||
std::string StrMakeValid(std::string_view str, StringValidationSettings settings)
|
||||
{
|
||||
auto buf = str.data();
|
||||
auto last = buf + str.size();
|
||||
|
@@ -41,7 +41,7 @@ std::string CDECL stdstr_fmt(const char *str, ...) WARN_FORMAT(1, 2);
|
||||
std::string stdstr_vfmt(const char *str, va_list va) WARN_FORMAT(1, 0);
|
||||
|
||||
char *StrMakeValidInPlace(char *str, const char *last, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK) NOACCESS(2);
|
||||
[[nodiscard]] std::string StrMakeValid(const std::string &str, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK);
|
||||
[[nodiscard]] std::string StrMakeValid(std::string_view str, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK);
|
||||
void StrMakeValidInPlace(char *str, StringValidationSettings settings = SVS_REPLACE_WITH_QUESTION_MARK);
|
||||
|
||||
const char *str_fix_scc_encoded(char *str, const char *last) NOACCESS(2);
|
||||
|
@@ -51,9 +51,14 @@ static const WChar CHAR_TD_PDF = 0x202C; ///< Restore the text-direction state t
|
||||
enum StringValidationSettings {
|
||||
SVS_NONE = 0, ///< Allow nothing and replace nothing.
|
||||
SVS_REPLACE_WITH_QUESTION_MARK = 1 << 0, ///< Replace the unknown/bad bits with question marks.
|
||||
SVS_ALLOW_NEWLINE = 1 << 1, ///< Allow newlines.
|
||||
SVS_ALLOW_NEWLINE = 1 << 1, ///< Allow newlines; replaces '\r\n' with '\n' during processing.
|
||||
SVS_ALLOW_CONTROL_CODE = 1 << 2, ///< Allow the special control codes.
|
||||
SVS_ALLOW_SEPARATOR_CODE = 1 << 3, ///< Allow separator control code (0x1F).
|
||||
/**
|
||||
* Replace tabs ('\t'), carriage returns ('\r') and newlines ('\n') with spaces.
|
||||
* When #SVS_ALLOW_NEWLINE is set, a '\n' or '\r\n' combination are not replaced with a space. A lone '\r' is replaced with a space.
|
||||
* When #SVS_REPLACE_WITH_QUESTION_MARK is set, this replacement runs first.
|
||||
*/
|
||||
SVS_REPLACE_TAB_CR_NL_WITH_SPACE = 1 << 3,
|
||||
};
|
||||
DECLARE_ENUM_AS_BIT_SET(StringValidationSettings)
|
||||
|
||||
|
@@ -2504,9 +2504,13 @@ bool MissingGlyphSearcher::FindMissingGlyphs()
|
||||
}
|
||||
|
||||
this->Reset();
|
||||
for (const char *text = this->NextString(); text != nullptr; text = this->NextString()) {
|
||||
for (auto text = this->NextString(); text.has_value(); text = this->NextString()) {
|
||||
auto src = text->cbegin();
|
||||
|
||||
FontSize size = this->DefaultSize();
|
||||
for (WChar c = Utf8Consume(&text); c != '\0'; c = Utf8Consume(&text)) {
|
||||
while (src != text->cend()) {
|
||||
WChar c = Utf8Consume(src);
|
||||
|
||||
if (c >= SCC_FIRST_FONT && c <= SCC_LAST_FONT) {
|
||||
size = (FontSize)(c - SCC_FIRST_FONT);
|
||||
} else if (!IsInsideMM(c, SCC_SPRITE_START, SCC_SPRITE_END) && IsPrintable(c) && !IsTextDirectionChar(c) && c != '?' && GetGlyph(size, c) == question_mark[size]) {
|
||||
@@ -2545,9 +2549,9 @@ class LanguagePackGlyphSearcher : public MissingGlyphSearcher {
|
||||
return FS_NORMAL;
|
||||
}
|
||||
|
||||
const char *NextString() override
|
||||
std::optional<std::string_view> NextString() override
|
||||
{
|
||||
if (this->i >= TEXT_TAB_END) return nullptr;
|
||||
if (this->i >= TEXT_TAB_END) return std::nullopt;
|
||||
|
||||
const char *ret = _langpack.offsets[_langpack.langtab_start[this->i] + this->j];
|
||||
|
||||
|
@@ -264,9 +264,9 @@ public:
|
||||
|
||||
/**
|
||||
* Get the next string to search through.
|
||||
* @return The next string or nullptr if there is none.
|
||||
* @return The next string or nullopt if there is none.
|
||||
*/
|
||||
virtual const char *NextString() = 0;
|
||||
virtual std::optional<std::string_view> NextString() = 0;
|
||||
|
||||
/**
|
||||
* Get the default (font) size of the string.
|
||||
|
@@ -15,11 +15,10 @@ static const SettingTable _network_private_settings = {
|
||||
[templates]
|
||||
SDTC_BOOL = SDTC_BOOL( $var, $flags, $def, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr),
|
||||
SDTC_OMANY = SDTC_OMANY( $var, $type, $flags, $def, $max, $full, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr),
|
||||
SDTC_VAR = SDTC_VAR( $var, $type, $flags, $def, $min, $max, $interval, $str, $strhelp, $strval, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr),
|
||||
SDTC_SSTR = SDTC_SSTR( $var, $type, $flags, $def, $length, $pre_cb, $post_cb, $from, $to, $extver, $cat, $guiproc, $startup, nullptr),
|
||||
|
||||
[validation]
|
||||
SDTC_OMANY = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
|
||||
SDTC_VAR = static_assert($max <= MAX_$type, "Maximum value for $var exceeds storage size");
|
||||
|
||||
[defaults]
|
||||
flags = SF_NONE
|
||||
|
@@ -70,11 +70,6 @@ TextfileWindow::TextfileWindow(TextfileType file_type) : Window(&_textfile_desc)
|
||||
this->hscroll->SetStepSize(10); // Speed up horizontal scrollbar
|
||||
}
|
||||
|
||||
/* virtual */ TextfileWindow::~TextfileWindow()
|
||||
{
|
||||
free(this->text);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the total height of the content displayed in this window, if wrapping is disabled.
|
||||
* @return the height in pixels
|
||||
@@ -124,11 +119,11 @@ void TextfileWindow::SetupScrollbars(bool force_reflow)
|
||||
if (IsWidgetLowered(WID_TF_WRAPTEXT)) {
|
||||
/* Reflow is mandatory if text wrapping is on */
|
||||
uint height = this->ReflowContent();
|
||||
this->vscroll->SetCount(std::min<uint>(UINT16_MAX, height));
|
||||
this->vscroll->SetCount(ClampTo<uint16_t>(height));
|
||||
this->hscroll->SetCount(0);
|
||||
} else {
|
||||
uint height = force_reflow ? this->ReflowContent() : this->GetContentHeight();
|
||||
this->vscroll->SetCount(std::min<uint>(UINT16_MAX, height));
|
||||
this->vscroll->SetCount(ClampTo<uint16_t>(height));
|
||||
this->hscroll->SetCount(this->max_length + WidgetDimensions::scaled.frametext.Horizontal());
|
||||
}
|
||||
|
||||
@@ -199,9 +194,9 @@ void TextfileWindow::SetupScrollbars(bool force_reflow)
|
||||
return FS_MONO;
|
||||
}
|
||||
|
||||
/* virtual */ const char *TextfileWindow::NextString()
|
||||
/* virtual */ std::optional<std::string_view> TextfileWindow::NextString()
|
||||
{
|
||||
if (this->search_iterator >= this->lines.size()) return nullptr;
|
||||
if (this->search_iterator >= this->lines.size()) return std::nullopt;
|
||||
|
||||
return this->lines[this->search_iterator++].text;
|
||||
}
|
||||
@@ -344,11 +339,14 @@ static void Xunzip(byte **bufp, size_t *sizep)
|
||||
FILE *handle = FioFOpenFile(textfile, "rb", dir, &filesize);
|
||||
if (handle == nullptr) return;
|
||||
|
||||
this->text = ReallocT(this->text, filesize);
|
||||
size_t read = fread(this->text, 1, filesize, handle);
|
||||
char *buf = MallocT<char>(filesize);
|
||||
size_t read = fread(buf, 1, filesize, handle);
|
||||
fclose(handle);
|
||||
|
||||
if (read != filesize) return;
|
||||
if (read != filesize) {
|
||||
free(buf);
|
||||
return;
|
||||
}
|
||||
|
||||
#if defined(WITH_ZLIB) || defined(WITH_LIBLZMA)
|
||||
const char *suffix = strrchr(textfile, '.');
|
||||
@@ -357,40 +355,37 @@ static void Xunzip(byte **bufp, size_t *sizep)
|
||||
|
||||
#if defined(WITH_ZLIB)
|
||||
/* In-place gunzip */
|
||||
if (strcmp(suffix, ".gz") == 0) Gunzip((byte**)&this->text, &filesize);
|
||||
if (StrEndsWith(textfile, ".gz")) Gunzip((byte**)&buf, &filesize);
|
||||
#endif
|
||||
|
||||
#if defined(WITH_LIBLZMA)
|
||||
/* In-place xunzip */
|
||||
if (strcmp(suffix, ".xz") == 0) Xunzip((byte**)&this->text, &filesize);
|
||||
if (StrEndsWith(textfile, ".xz")) Xunzip((byte**)&buf, &filesize);
|
||||
#endif
|
||||
|
||||
if (!this->text) return;
|
||||
if (buf == nullptr) return;
|
||||
|
||||
/* Add space for trailing \0 */
|
||||
this->text = ReallocT(this->text, filesize + 1);
|
||||
this->text[filesize] = '\0';
|
||||
|
||||
/* Replace tabs and line feeds with a space since StrMakeValidInPlace removes those. */
|
||||
for (char *p = this->text; *p != '\0'; p++) {
|
||||
if (*p == '\t' || *p == '\r') *p = ' ';
|
||||
}
|
||||
std::string_view sv_buf(buf, filesize);
|
||||
|
||||
/* Check for the byte-order-mark, and skip it if needed. */
|
||||
char *p = this->text + (strncmp(u8"\ufeff", this->text, 3) == 0 ? 3 : 0);
|
||||
if (StrStartsWith(sv_buf, u8"\ufeff")) sv_buf.remove_prefix(3);
|
||||
|
||||
/* Make sure the string is a valid UTF-8 sequence. */
|
||||
StrMakeValidInPlace(p, this->text + filesize, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE);
|
||||
/* Replace any invalid characters with a question-mark. This copies the buf in the process. */
|
||||
this->text = StrMakeValid(sv_buf, SVS_REPLACE_WITH_QUESTION_MARK | SVS_ALLOW_NEWLINE | SVS_REPLACE_TAB_CR_NL_WITH_SPACE);
|
||||
free(buf);
|
||||
|
||||
/* Split the string on newlines. */
|
||||
std::string_view p(this->text);
|
||||
int row = 0;
|
||||
this->lines.emplace_back(row, p);
|
||||
for (; *p != '\0'; p++) {
|
||||
if (*p == '\n') {
|
||||
*p = '\0';
|
||||
this->lines.emplace_back(++row, p + 1);
|
||||
}
|
||||
auto next = p.find_first_of('\n');
|
||||
while (next != std::string_view::npos) {
|
||||
this->lines.emplace_back(row, p.substr(0, next));
|
||||
p.remove_prefix(next + 1);
|
||||
|
||||
row++;
|
||||
next = p.find_first_of('\n');
|
||||
}
|
||||
this->lines.emplace_back(row, p);
|
||||
|
||||
/* Calculate maximum text line length. */
|
||||
uint max_length = 0;
|
||||
|
@@ -19,25 +19,14 @@ const char *GetTextfile(TextfileType type, Subdirectory dir, const char *filenam
|
||||
|
||||
/** Window for displaying a textfile */
|
||||
struct TextfileWindow : public Window, MissingGlyphSearcher {
|
||||
struct Line {
|
||||
int top; ///< Top scroll position.
|
||||
int bottom; ///< Bottom scroll position.
|
||||
const char *text; ///< Pointer to text buffer.
|
||||
|
||||
Line(int top, const char *text) : top(top), bottom(top + 1), text(text) {}
|
||||
};
|
||||
|
||||
TextfileType file_type; ///< Type of textfile to view.
|
||||
Scrollbar *vscroll; ///< Vertical scrollbar.
|
||||
Scrollbar *hscroll; ///< Horizontal scrollbar.
|
||||
char *text; ///< Lines of text from the NewGRF's textfile.
|
||||
std::vector<Line> lines; ///< #text, split into lines in a table with lines.
|
||||
uint search_iterator; ///< Iterator for the font check search.
|
||||
|
||||
uint max_length; ///< Maximum length of unwrapped text line.
|
||||
|
||||
TextfileWindow(TextfileType file_type);
|
||||
~TextfileWindow();
|
||||
|
||||
void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) override;
|
||||
void OnClick(Point pt, int widget, int click_count) override;
|
||||
@@ -47,13 +36,24 @@ struct TextfileWindow : public Window, MissingGlyphSearcher {
|
||||
|
||||
void Reset() override;
|
||||
FontSize DefaultSize() override;
|
||||
const char *NextString() override;
|
||||
std::optional<std::string_view> NextString() override;
|
||||
bool Monospace() override;
|
||||
void SetFontNames(FontCacheSettings *settings, const char *font_name, const void *os_data) override;
|
||||
|
||||
virtual void LoadTextfile(const char *textfile, Subdirectory dir);
|
||||
|
||||
private:
|
||||
struct Line {
|
||||
int top; ///< Top scroll position.
|
||||
int bottom; ///< Bottom scroll position.
|
||||
std::string_view text; ///< Pointer to text buffer.
|
||||
|
||||
Line(int top, std::string_view text) : top(top), bottom(top + 1), text(text) {}
|
||||
};
|
||||
|
||||
std::string text; ///< Lines of text from the NewGRF's textfile.
|
||||
std::vector<Line> lines; ///< #text, split into lines in a table with lines.
|
||||
|
||||
uint ReflowContent();
|
||||
uint GetContentHeight();
|
||||
void SetupScrollbars(bool force_reflow);
|
||||
|
@@ -821,7 +821,7 @@ static void HeightMapSmoothCoastInDirection(int org_x, int org_y, int dir_x, int
|
||||
* Soften the coast slope */
|
||||
for (depth = 0; IsValidXY(x, y) && depth <= max_coast_Smooth_depth; depth++, x += dir_x, y += dir_y) {
|
||||
h = _height_map.height(x, y);
|
||||
h = std::min<uint>(h, h_prev + (4 + depth)); // coast softening formula
|
||||
h = static_cast<Height>(std::min<uint>(h, h_prev + (4 + depth))); // coast softening formula
|
||||
_height_map.height(x, y) = h;
|
||||
h_prev = h;
|
||||
}
|
||||
|
@@ -3384,7 +3384,7 @@ CommandCost CmdExpandTown(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32
|
||||
if (flags & DC_EXEC) {
|
||||
/* The more houses, the faster we grow */
|
||||
if (p2 == 0) {
|
||||
uint amount = RandomRange(ClampToU16(t->cache.num_houses / 10)) + 3;
|
||||
uint amount = RandomRange(ClampTo<uint16>(t->cache.num_houses / 10)) + 3;
|
||||
t->cache.num_houses += amount;
|
||||
UpdateTownRadius(t);
|
||||
|
||||
|
@@ -916,7 +916,7 @@ private:
|
||||
|
||||
this->towns.shrink_to_fit();
|
||||
this->towns.RebuildDone();
|
||||
this->vscroll->SetCount((uint)this->towns.size()); // Update scrollbar as well.
|
||||
this->vscroll->SetCount(this->towns.size()); // Update scrollbar as well.
|
||||
}
|
||||
/* Always sort the towns. */
|
||||
this->towns.Sort();
|
||||
|
@@ -7447,7 +7447,7 @@ int GetTrainRealisticAccelerationAtSpeed(const int speed, const int mass, const
|
||||
/* Easy way out when there is no acceleration. */
|
||||
if (force == resistance) return 0;
|
||||
|
||||
int acceleration = ClampToI32((force - resistance) / (mass * 4));
|
||||
int acceleration = ClampTo<int32>((force - resistance) / (mass * 4));
|
||||
acceleration = force < resistance ? std::min(-1, acceleration) : std::max(1, acceleration);
|
||||
|
||||
return acceleration;
|
||||
|
@@ -2134,7 +2134,7 @@ void CheckVehicleBreakdown(Vehicle *v)
|
||||
/* increase chance of failure */
|
||||
int chance = v->breakdown_chance + 1;
|
||||
if (Chance16I(1, 25, r)) chance += 25;
|
||||
chance = std::min(255, chance);
|
||||
chance = ClampTo<uint8>(chance);
|
||||
v->breakdown_chance = chance;
|
||||
|
||||
if (_settings_game.vehicle.improved_breakdowns) {
|
||||
|
@@ -272,7 +272,7 @@ void BaseVehicleListWindow::BuildVehicleList()
|
||||
this->CountOwnVehicles();
|
||||
|
||||
this->vehgroups.RebuildDone();
|
||||
this->vscroll->SetCount(static_cast<int>(this->vehgroups.size()));
|
||||
this->vscroll->SetCount(this->vehgroups.size());
|
||||
}
|
||||
|
||||
static bool GroupCargoFilter(const GUIVehicleGroup* group, const CargoID cid)
|
||||
@@ -1573,21 +1573,21 @@ static bool VehicleAgeSorter(const Vehicle * const &a, const Vehicle * const &b)
|
||||
/** Sort vehicles by this year profit */
|
||||
static bool VehicleProfitThisYearSorter(const Vehicle * const &a, const Vehicle * const &b)
|
||||
{
|
||||
int r = ClampToI32(a->GetDisplayProfitThisYear() - b->GetDisplayProfitThisYear());
|
||||
int r = ClampTo<int32_t>(a->GetDisplayProfitThisYear() - b->GetDisplayProfitThisYear());
|
||||
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
||||
}
|
||||
|
||||
/** Sort vehicles by last year profit */
|
||||
static bool VehicleProfitLastYearSorter(const Vehicle * const &a, const Vehicle * const &b)
|
||||
{
|
||||
int r = ClampToI32(a->GetDisplayProfitLastYear() - b->GetDisplayProfitLastYear());
|
||||
int r = ClampTo<int32>(a->GetDisplayProfitLastYear() - b->GetDisplayProfitLastYear());
|
||||
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
||||
}
|
||||
|
||||
/** Sort vehicles by lifetime profit */
|
||||
static bool VehicleProfitLifetimeSorter(const Vehicle * const &a, const Vehicle * const &b)
|
||||
{
|
||||
int r = ClampToI32(a->GetDisplayProfitLifetime() - b->GetDisplayProfitLifetime());
|
||||
int r = ClampTo<int32>(a->GetDisplayProfitLifetime() - b->GetDisplayProfitLifetime());
|
||||
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
||||
}
|
||||
|
||||
@@ -1640,7 +1640,7 @@ static bool VehicleValueSorter(const Vehicle * const &a, const Vehicle * const &
|
||||
for (u = a; u != nullptr; u = u->Next()) diff += u->value;
|
||||
for (u = b; u != nullptr; u = u->Next()) diff -= u->value;
|
||||
|
||||
int r = ClampToI32(diff);
|
||||
int r = ClampTo<int32_t>(diff);
|
||||
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
||||
}
|
||||
|
||||
@@ -1654,7 +1654,7 @@ static bool VehicleLengthSorter(const Vehicle * const &a, const Vehicle * const
|
||||
/** Sort vehicles by the time they can still live */
|
||||
static bool VehicleTimeToLiveSorter(const Vehicle * const &a, const Vehicle * const &b)
|
||||
{
|
||||
int r = ClampToI32((a->max_age - a->age) - (b->max_age - b->age));
|
||||
int r = ClampTo<int32_t>((a->max_age - a->age) - (b->max_age - b->age));
|
||||
return (r != 0) ? r < 0 : VehicleNumberSorter(a, b);
|
||||
}
|
||||
|
||||
|
@@ -1059,10 +1059,11 @@ void CocoaDialog(const char *title, const char *message, const char *buttonLabel
|
||||
|
||||
Point pt = { (int)view_pt.x, (int)[ self frame ].size.height - (int)view_pt.y };
|
||||
|
||||
const char *ch = _focused_window->GetTextCharacterAtPosition(pt);
|
||||
if (ch == nullptr) return NSNotFound;
|
||||
auto index = _focused_window->GetTextCharacterAtPosition(pt);
|
||||
if (index == -1) return NSNotFound;
|
||||
|
||||
return CountUtf16Units(_focused_window->GetFocusedText(), ch);
|
||||
auto text = _focused_window->GetFocusedText();
|
||||
return CountUtf16Units(text, text + index);
|
||||
}
|
||||
|
||||
/** Get the bounding rect for the given range. */
|
||||
|
@@ -510,7 +510,7 @@ static inline void DrawText(const Rect &r, TextColour colour, StringID str, Stri
|
||||
{
|
||||
Dimension d = GetStringBoundingBox(str, fs);
|
||||
Point p = GetAlignedPosition(r, d, align);
|
||||
if (str != STR_NULL) DrawString(r.left, r.right, p.y, str, colour, align, fs);
|
||||
if (str != STR_NULL) DrawString(r.left, r.right, p.y, str, colour, align, false, fs);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -730,10 +730,11 @@ public:
|
||||
* Set the distance to scroll when using the buttons or the wheel.
|
||||
* @param stepsize Scrolling speed.
|
||||
*/
|
||||
void SetStepSize(uint16 stepsize)
|
||||
void SetStepSize(size_t stepsize)
|
||||
{
|
||||
assert(stepsize > 0);
|
||||
this->stepsize = stepsize;
|
||||
|
||||
this->stepsize = ClampTo<uint16_t>(stepsize);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -741,15 +742,13 @@ public:
|
||||
* @param num the number of elements in the list
|
||||
* @note updates the position if needed
|
||||
*/
|
||||
void SetCount(int num)
|
||||
void SetCount(size_t num)
|
||||
{
|
||||
assert(num >= 0);
|
||||
assert(num <= MAX_UVALUE(uint16));
|
||||
|
||||
this->count = num;
|
||||
num -= this->cap;
|
||||
if (num < 0) num = 0;
|
||||
if (num < this->pos) this->pos = num;
|
||||
this->count = ClampTo<uint16_t>(num);
|
||||
/* Ensure position is within bounds */
|
||||
this->SetPosition(this->pos);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -757,13 +756,13 @@ public:
|
||||
* @param capacity the new capacity
|
||||
* @note updates the position if needed
|
||||
*/
|
||||
void SetCapacity(int capacity)
|
||||
void SetCapacity(size_t capacity)
|
||||
{
|
||||
assert(capacity > 0);
|
||||
assert(capacity <= MAX_UVALUE(uint16));
|
||||
|
||||
this->cap = capacity;
|
||||
if (this->cap + this->pos > this->count) this->pos = std::max(0, this->count - this->cap);
|
||||
this->cap = ClampTo<uint16_t>(capacity);
|
||||
/* Ensure position is within bounds */
|
||||
this->SetPosition(this->pos);
|
||||
}
|
||||
|
||||
void SetCapacityFromWidget(Window *w, int widget, int padding = 0);
|
||||
|
@@ -176,8 +176,8 @@ struct DropdownWindow : Window {
|
||||
}
|
||||
|
||||
/* Capacity is the average number of items visible */
|
||||
this->vscroll->SetCapacity(size.height * (uint16)this->list.size() / list_height);
|
||||
this->vscroll->SetCount((uint16)this->list.size());
|
||||
this->vscroll->SetCapacity(size.height * this->list.size() / list_height);
|
||||
this->vscroll->SetCount(this->list.size());
|
||||
|
||||
this->parent_button = button;
|
||||
this->selected_index = selected;
|
||||
@@ -289,14 +289,9 @@ struct DropdownWindow : Window {
|
||||
this->scrolling_timer.SetInterval(MILLISECONDS_PER_TICK);
|
||||
|
||||
if (this->scrolling != 0) {
|
||||
int pos = this->vscroll->GetPosition();
|
||||
if (this->vscroll->UpdatePosition(this->scrolling)) this->SetDirty();
|
||||
|
||||
this->vscroll->UpdatePosition(this->scrolling);
|
||||
this->scrolling = 0;
|
||||
|
||||
if (pos != this->vscroll->GetPosition()) {
|
||||
this->SetDirty();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@@ -438,15 +438,15 @@ void Window::UpdateQueryStringSize()
|
||||
/**
|
||||
* Get the character that is rendered at a position by the focused edit box.
|
||||
* @param pt The position to test.
|
||||
* @return Pointer to the character at the position or nullptr if no character is at the position.
|
||||
* @return Index of the character position or -1 if no character is at the position.
|
||||
*/
|
||||
/* virtual */ const char *Window::GetTextCharacterAtPosition(const Point &pt) const
|
||||
/* virtual */ ptrdiff_t Window::GetTextCharacterAtPosition(const Point &pt) const
|
||||
{
|
||||
if (this->nested_focus != nullptr && this->nested_focus->type == WWT_EDITBOX) {
|
||||
return this->GetQueryString(this->nested_focus->index)->GetCharAtPosition(this, this->nested_focus->index, pt);
|
||||
}
|
||||
|
||||
return nullptr;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2504,13 +2504,10 @@ static void HandleScrollbarScrolling(Window *w)
|
||||
return;
|
||||
}
|
||||
|
||||
/* Find the item we want to move to and make sure it's inside bounds. */
|
||||
int pos = std::min(RoundDivSU(std::max(0, i + _scrollbar_start_pos) * sb->GetCount(), _scrollbar_size), std::max(0, sb->GetCount() - sb->GetCapacity()));
|
||||
if (rtl) pos = std::max(0, sb->GetCount() - sb->GetCapacity() - pos);
|
||||
if (pos != sb->GetPosition()) {
|
||||
sb->SetPosition(pos);
|
||||
w->SetDirty();
|
||||
}
|
||||
/* Find the item we want to move to. SetPosition will make sure it's inside bounds. */
|
||||
int pos = RoundDivSU((i + _scrollbar_start_pos) * sb->GetCount(), _scrollbar_size);
|
||||
if (rtl) pos = sb->GetCount() - sb->GetCapacity() - pos;
|
||||
if (sb->SetPosition(pos)) w->SetDirty();
|
||||
}
|
||||
|
||||
/**
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user