1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-20 21:19:10 +00:00

Compare commits

...

53 Commits

Author SHA1 Message Date
rubidium
40ee9278f1 (svn r23281) -Release: 1.1.4-RC1 2011-11-20 12:35:39 +00:00
rubidium
45e119deeb (svn r23280) [1.1] -Prepare: 1.1.4-RC1 2011-11-20 12:30:55 +00:00
rubidium
fd48f42a07 (svn r23259) [1.1] -Backport from trunk:
- Fix: 3-column view of NewGRF GUI had too much space for certain font sizes (r23251)
- Fix: Ignore special characters, such as the train "character", when determining a fallback font (r23237)
- Fix: [NewGRF] Make train var 0xF3 consistent with TTDPatch (r23231)
- Fix: Invalidate build vehicle window when changing the setting for wagon speed limits (r23211)
2011-11-18 21:19:18 +00:00
rubidium
111fcafa2f (svn r23258) [1.1] -Backport from trunk: language updates 2011-11-18 21:17:11 +00:00
rubidium
47e7a98207 (svn r23257) [1.1] -Backport from trunk:
- Fix: [NoAI] Hide AIObject from the documentation as it cannot be used (r23204, r23201)
- Fix: [Network] Unstable sorting in the network list when two servers had the exact same name [FS#4829] (r23202)
- Fix: Oil rigs that "expired" did not get removed from the station list [FS#4822] (r23199)
2011-11-18 21:15:09 +00:00
rubidium
83062be4e0 (svn r23256) [1.1] -Backport from trunk:
- Fix: [Squirrel] replace custom qsort by std::sort to fix stack overflow [FS#4830] (r23190, r23187, r23186)
- Fix: Do not display railway fences between track and waypoints [FS#4627] (r23163)
- Fix: [NoAI] AIOrder didn't handle implicit orders correctly in all cases [FS#4823] (r23133)
2011-11-18 21:10:44 +00:00
rubidium
a04aad0df3 (svn r23255) [1.1] -Backport from trunk:
- Fix: When any keys on the on-screen keyboard were pressed the text cursor disappeared (r23132)
- Fix: [NoAI] AIOrder::IsCurrentOrderPartOfOrderList return false for valid vehicles and crashed for invalid ones (r23131)
- Fix: [NoAI] calling require() to include a file gave you 100.000 opcodes for free (r23117)
- Fix: Allow accessing the server's client info as well in the admin network [FS#4813] (r23115)
2011-11-18 21:04:08 +00:00
rubidium
5d9975cad1 (svn r23254) [1.1] -Backport from trunk:
- Fix: [NewGRF] Run StartupEngines() if NewGRFs changed during loading a savegame, just like it's running when NewGRFs are changed during a game (r23083)
- Fix: Account for snow line table when determining the snow line for building houses (r23082)
- Fix: [NewGRF] If a NewGRF overrides a default house the minimum start year for that house was set to 1930 [FS#4794] (r23059)
- Fix: [NoAI] AIOrder::GetOrderCount() did not hide implicit orders (r23057)
2011-11-18 20:52:13 +00:00
rubidium
68afdc6312 (svn r23054) [1.1] -Backport from trunk: language updates 2011-10-22 21:15:17 +00:00
rubidium
e706131e16 (svn r23053) [1.1] -Backport from trunk:
- Fix: [NewGRF] When vehicles break down, update the image cache after changing the vehicle state to make fish happy (r23050)
- Fix: Use the same forest-check for the vegetation-map colour as for nearby station names [FS#4810] (r23049)
- Fix: Check that the selected font size is valid the font face in use and choose the nearest size to that selected if not. Font metrics should then just work (r23038)
- Fix: The last custom playlist items went lost when the files in the .obm are not contiguous [FS#4776] (r23035, r23034, r23033)
2011-10-22 21:06:58 +00:00
rubidium
bf3c75c34c (svn r23052) [1.1] -Backport from trunk:
- Fix: Palette conversion windows to DOS for light house / stadium animated colour was mixed up (r23032)
- Fix: For the admin 'bots' there was no distinction between bankruptcy and manual removal of companies even though the API suggested that [FS#4804] (r23031)
- Fix: Always show a chat message and send an admin packet when a new company is made [FS#4796] (r23030)
- Fix: Pass bottom of dropdown item rather than bottom of dropdown window, so the dropdown gets drawn better with different font sizes (r23018)
2011-10-22 20:54:23 +00:00
rubidium
83d41e122c (svn r23051) [1.1] -Backport from trunk:
- Fix: AI backlog was to short to fully display the backtrace of some AI crashes [FS#4798] (r23012)
- Fix: When the last used server is deleted from the list also clear the last used server if it is the same [FS#4791] (r23011)
- Fix: [NewGRF] Make sure temporary storage is cleared before test and exec runs for DoCommands so NewGRF callbacks cannot change the result between the runs (r22996)
- Fix: [NewGRF] Tile was cleared before the object-placement callback was run, resulting in possible differences in test and exec run [FS#4775] (r22994)
2011-10-22 20:45:19 +00:00
rubidium
c1359d6d8a (svn r22995) [1.1] -Backport from trunk:
- Fix: [NoAI] Do not return ERR_UNKNOWN when the vehicle would become too long (r22988)
- Fix: Draw buoy sprite without outline on the map, fix minor issues with original graphics (r22974, r22973, r22971, r22962)
- Fix: [NewGRF] Strip newlines from NewGRF strings that should not have newlines, e.g. the NewGRF's name [FS#4769] (r22970)
2011-10-04 20:22:46 +00:00
rubidium
3daf4d012b (svn r22993) [1.1] -Backport from trunk:
- Fix: The savegame description and loading of savegames would crash with savegames from a patched stable (which did not bump the savegame version) [FS#4778] (r22958, r22957)
- Fix: Guard from reading outside the silly name list (r22955)
- Fix: [NewGRF] Properly limit the length of strings in a choice list (r22952)
- Fix: [NewGRF] Do not call CB 32 for disaster, effect vehicles or aircraft shadows/rotors (r22947)
2011-10-04 20:15:50 +00:00
rubidium
997a4aee46 (svn r22992) [1.1] -Backport from trunk:
- Fix: [NewGRF] Crash when accessing vehicle var 44 for a non-front aircraft [FS#4781] (r22946)
- Fix: Calculate the size of the start/stop vehicle button correctly (r22941)
- Fix: [OSX] Various MacOSX 10.7 issues causing OpenTTD to not work [FS#4751] (r22921, r22895, r22893, r22889)
- Fix: [NewGRF] Properties for feature 0x05 were not zeroed for each NewGRF, thus waterfeatures could glitch when the properties were set by a previous NewGRF and the NewGRF assumed the properties to be unmodified (r22918)
2011-10-04 20:12:02 +00:00
rubidium
4284b8abb3 (svn r22991) [1.1] -Backport from trunk:
- Fix: Old TTO/TTD savegames could get non-stop via orders upon savegame loading, even when those orders did not exist back then. This 'conversion' feature is something for TTDPatch and old OpenTTD savegames [FS#4716] (r22914)
- Fix: The icon would (almost) never be shown for SDL builds [FS#4617] (r22910)
- Fix: The name of the heightmap glitches in the 'play heightmap' window (r22902)
- Fix: Locks would be incorrectly assembled (r22108)
2011-10-04 20:06:23 +00:00
rubidium
526e7294a3 (svn r22937) [1.1] -Prepare 1.1.3 2011-09-15 19:03:33 +00:00
rubidium
9338e1a38f (svn r22936) [1.1] -Backport from trunk: language updates 2011-09-15 18:59:23 +00:00
rubidium
c42d060a44 (svn r22935) [1.1] -Backport from trunk:
- Fix: Prevent authentication bypass for the admin port when a new game is started [FS#4771] (r22934)
- Fix: TTO savegames with any aircraft not in an hangar caused crashes during load (r22915)
- Fix: Windows 2000 and XP without service pack 3 must use the win9x binary/installer; the newer MSVC compiler of the compile farm does not support those versions of Windows anymore [FS#4749] (r22909)
2011-09-15 18:56:43 +00:00
frosch
c33d1fc60b (svn r22890) [1.1] -Prepare: 1.1.3-RC1 2011-09-04 15:03:59 +00:00
frosch
41f777b0ec (svn r22887) [1.1] -Backport from trunk:
- Fix: [NewGRF] DCxx text references via the textstack are not allowed, but caused crash [FS#4758] (r22882)
- Fix: Miscalculation of train curve speed limits (r22879)
- Fix: Report an error in the news if autoreplace/renew fails due to the engine type being no longer available [FS#4712] (r22876)
2011-09-03 18:59:26 +00:00
frosch
daa89c982e (svn r22886) [1.1] -Backport from trunk:
- Fix: Harden memory allocation (r22881, r22880, r22875)
- Fix: Validate image dimensions before loading [FS#4747] (r22878, r22877, r22874, r22873)
- Fix: Perform stricter checks on RLE compressed BMP images [FS#4746] (r22872, r22871)
2011-09-03 18:56:34 +00:00
frosch
0ca913841d (svn r22885) [1.1] -Backport from trunk:
- Fix: [NewGRF] Variables 40 and 81 of callback 18 are not the same as 80 (r22867)
- Fix: [NewGRF] Generic callbacks shall chain to the next GRF when the callback fails (r22866, r22865)
2011-09-03 18:51:59 +00:00
frosch
7d984241f3 (svn r22884) [1.1] -Backport from trunk:
- Fix: Perform stricter checks on some commands [FS#4745] (r22845)
- Fix: Harden savegame load against too many AI config settings [FS#4748] (r22843)
2011-09-03 18:50:20 +00:00
rubidium
a95c366f58 (svn r22842) [1.1] -Backport from trunk:
- Add: River graphics for the original base set (r22766)
2011-08-25 13:46:19 +00:00
rubidium
d233a561a1 (svn r22841) [1.1] -Backport from trunk:
- Fix: Compilation with GCC 4.7 (r22832, r22728, r22719)
- Update: Translations
2011-08-25 13:41:06 +00:00
rubidium
0ded8c0cb8 (svn r22840) [1.1] -Backport from trunk:
- Fix: Allow to demolish aqueducts built in the scenario editor [FS#4741] (r22821)
- Fix: Towns expanding from the "wrong" side of a tunnel or bridge [FS#4731] (r22810, r22809)
- Fix: [NewGRF] String codes for dates should use unsigned words, like old OpenTTD did before it learned dates before 1920 (r22774)
- Fix: [NoAI] Clarify the meaning of AIStation::IsWithinTownInfluence(), AITile::IsWithinTownInfluence() and AITown::IsWithinTownInfluence() [FS#4702] (r22763)
2011-08-25 13:30:26 +00:00
rubidium
15d5df9496 (svn r22839) [1.1] -Backport from trunk:
- Fix: [NewGRF] Also free allocated depot tables of NewGRF airports (r22760)
- Fix: [NewGRF] Invalid memory access when querying the grfID of the default objects [FS#4730] (r22757)
- Fix: When marking tile selections dirty, use the height information of the corners instead of the surface slope. This is more accurate when the foundation is kind of undefined [FS#4727] (r22755)
- Fix: Make aircraft point to the exit when leaving the hangar [FS#4696] (r22743, r22742, r22741)
2011-08-25 13:27:56 +00:00
rubidium
85ee1737e4 (svn r22838) [1.1] -Backport from trunk:
- Fix: Display the size of the leveled platform in the measurement tooltip of terraforming operations [FS#4708] (r22740, r22739)
- Fix: Setting company passwords via the GUI on servers (including starting a company with the default password) failed, so no client could join that company [FS#4722] (r22738)
- Fix: [NewGRF] The construction stage sprites were incorrectly selected in cases other than 1 or 4 sprites per set (r22731)
- Fix: [NoAI] AITile::GetCargoAcceptance, AITile::GetCargoProduction and AIRail::BuildNewGRFRailStation did not check the cargo argument for validity (r22726)
2011-08-25 13:24:32 +00:00
rubidium
c5387508eb (svn r22837) [1.1] -Backport from trunk:
- Fix: [NewGRF] Always draw NewGRF supplied texts with a default colour (r22725)
- Fix: [NewGRF] Do not restrict AdvVarAct2 to 255 operations (r22723)
- Fix: If there is no point in opening the rail/air toolbar, do not open it for people who use hotkeys either rather than only for those using GUI elements (r22716, r22715, r22714)
- Fix: [NoAI] Allow AIAirport::GetNoiseLevelIncrease() also for expired airports [FS#4704] (r22710)
2011-08-25 13:21:25 +00:00
rubidium
a8c7707fe0 (svn r22752) [1.1] -Update: forgotten documentation changes from trunk 2011-08-14 18:56:33 +00:00
rubidium
eb7bceb240 (svn r22748) [1.1] -Prepare: 1.1.2 2011-08-14 15:23:27 +00:00
rubidium
6f8248c36d (svn r22747) [1.1] -Backport from trunk:
- Fix: Some corrupted savegames could crash OpenTTD instead of showing the 'savegame corrupted' message [FS#4717] (r22737, r22736)
- Fix: Triggering NOT_REACHED when playing with a NewGRF that supplies genders/cases for a language that was not installed [FS#4718] (r22735)
2011-08-14 15:23:10 +00:00
rubidium
41db186ea7 (svn r22704) [1.1] -Backport from trunk: language updates 2011-07-30 17:55:23 +00:00
rubidium
310d9e4ee3 (svn r22703) [1.1] -Prepare for 1.1.2-RC2 2011-07-30 17:53:09 +00:00
rubidium
be65972895 (svn r22702) [1.1] -Backport from trunk:
- Fix: Cost of adding an extra road type to a bridge or tunnel was undercalculated [FS#4680, FS#4681] (r22700, r22699)
- Fix: Only insert cleared object tiles into _cleared_object_areas if clearing actually succeeds, else subsequential tests of the same tile will be skipped and considered successful [FS#4694] (r22698)
- Fix: When building a house it could be built at the wrong place if multitile houses failed some tests (r22697)
2011-07-30 17:48:23 +00:00
rubidium
a51531e410 (svn r22701) [1.1] -Backport from trunk:
- Fix: [Network] Failed network address resolving could trigger temporary freezes [FS#4697] (r22696, r22695)
- Fix: [NewGRF] The override managers were not reset in some cases like creating a new scenario [FS#4691] (r22693)
- Fix: [NewGRF] Aircrafts defined with IDs above the default aircrafts always defaulted to passenger cargo (r22690)
2011-07-30 17:45:37 +00:00
rubidium
4b800313f4 (svn r22685) [1.1] -Prepare: 1.1.2-RC1 2011-07-24 14:43:42 +00:00
rubidium
e1841b5d68 (svn r22684) [1.1] -Backport from trunk:
- Change: [NewGRF] Only allow access (via hotkey and menu) to the bounding box visualisation when NewGRF developer tools are enabled (r22675)
- Fix: [NewGRF] Disallow accessing variable 1B in network games due to desync reasons (r22682)
- Update: languages
2011-07-24 14:34:38 +00:00
rubidium
4f8053e559 (svn r22654) [1.1] -Backport from trunk:
- Fix: Switching from a red to a white highlight (by switching to another tool) without switching the highlight mode (HT_RECT etc.) did not mark the selection dirty [FS#4670] (r22649)
- Fix: [NewGRF] Parameters from NewGRFs were not properly parsed in all cases [FS#4599] (r22648, r22630, r22629, r22628, r22627)
- Fix: GetSection() does not return a LockPart [FS#4678] (r22645)
- Fix: [NewGRF] Disallow building NewObjects on water tiles owned by another company (r22643)
2011-07-10 20:35:31 +00:00
rubidium
3a39cea23b (svn r22653) [1.1] -Backport from trunk:
- Fix: [NewGRF] Disable the 'set parameters' button in the NewGRF GUI, if the GRF specifies to have no parameters and one would not be able to set any parameters anyway (r22642)
- Fix: Keep the previous owner of the upper and lower lock parts if they are built on existing water (r22638)
- Fix: [NewGRF] Airports should not expose the tile specific random bits of the north tile. Only airport tiles should access those (r22636)
- Fix: [NewGRF] Correctly reseed random bits of industries and industry tiles (r22635, r22634)
2011-07-10 20:29:19 +00:00
rubidium
a873aa3337 (svn r22652) [1.1] -Backport from trunk:
- Fix: [NewGRF] Implement variables 25 and 7F for railtypes (r22633)
- Fix: [NewGRF] Additional text in fund industry window is NewGRF supplied and thus should have a default colour (r22631)
- Fix: Also initialise _old_vds with newgame settings; TTD savegames do not contain these settings [FS#4622] (r22626)
- Fix: Do not zero the orders of disaster vehicles when converting savegames [FS#4642] (r22625)
2011-07-10 20:25:59 +00:00
rubidium
a1826a043e (svn r22651) [1.1] -Backport from trunk:
- Fix: When closing an AI company the local player cheated to, we need to cheat him to another company [FS#4654] (r22624, r22623)
- Fix: When closing down companies their shares in other companies must be sold even if share trading is disabled at that point of time (r22622)
- Fix: When asking the user to confirm an unsafe unpausing, there is no need to execute a command if 'no' is choosed. This also prevents crashing when clicking unpause while the confirm window is shown (r22621)
- Fix: Enforce refit orders to be 'always go to depot' orders; service-only and stop-in-depot orders make no sense with refitting [FS#4651] (r22620)
- Fix: Consider the size of the vehicle sprite for the lineheight in the company GUI. This also makes the widget containing the sprite not skip drawing it, if the bounds of the widget are outside of the drawing area though the sprite actually needs drawing [FS#4662] (r22619)
2011-07-10 20:23:04 +00:00
rubidium
a6750a145e (svn r22650) [1.1] -Backport from trunk:
- Fix: When changing difficulty settings over the network, do not just reopen the difficulty window if any game options window is opened; instead invalidate them properly [FS#4653] (r22618, r22617)
- Fix: [NewGRF] If callback 33 returns a value out of range, no sound effect shall be played [FS#4656] (r22614)
- Fix: Use rotated heightmap sizes for reporting scaling problems [FS#4663] (r22608)
- Fix: No client error packet was sent to the admin bots [FS#4585] (r22384)
2011-07-10 20:17:56 +00:00
rubidium
b5bad6aa19 (svn r22602) [1.1] -Fix: MSVC compile warning 2011-06-19 12:12:10 +00:00
rubidium
725d00630f (svn r22601) [1.1] -Backport from trunk:
- Add: Makefile support for bundling pdb and running regressions with the MSVC makefile (r22581, r22580, r22576)
- Fix: Do not show cargo accepted/produced in the new station window when no tiles are selected (mouse hovering a window or toolbar) [FS#4647] (r22595, r22593)
- Fix: Add active NewGRFs to the list of available ones when selecting the empty preset [FS#4644] (r22594)
- Fix: Reading of heightmaps with uncommon BMP formats failed due to uninitialised variables [FS#4645] (r22592)
2011-06-18 19:43:51 +00:00
rubidium
0b02b285a8 (svn r22600) [1.1] -Backport from trunk:
- Fix: PBS order forecasting modified the current order index in case of a goto-nearest-depot order and no depot could be found [FS#4641] (r22589)
- Fix: Remove BaseStorageArrays from _changed_storage_arrays on destruction (r22583, r22551)
- Fix: Do not increment STL iterators after they've been invalidated (r22582)
- Fix: Do not lower the arrow buttons in the NewGRF/AI parameter windows if they are clicked when disabled (r22553, r22499)
2011-06-18 19:40:56 +00:00
rubidium
5cb560d4bd (svn r22599) [1.1] -Backport from trunk:
- Fix: Clear airport persistent storage on construction/removal of airports (r22552)
- Fix: Possible crash when opening the airport build window for the first time [FS#4619] (r22538)
- Fix: Replace the half small airport structure on the intercontinental airport with some grass [FS#3494] (r22537)
- Fix: Documentation omission regarding admin protocol [FS#4632] (r22536)
2011-06-18 19:20:01 +00:00
rubidium
4ba397c285 (svn r22598) [1.1] -Backport from trunk:
- Fix: [NoAI] Doing rescan_ai in a game with running AIs caused a crash [FS#4631] (r22534)
- Fix: Do not create an implicit order if the current order is the first order in the order list and we visit the station of the last entry of the order list (r22532)
- Fix: MinGW 64 related compilation issues [FS#4623] (r22522, r22491, r22490, r22489)
- Fix: The layout selectors of the airport build GUI did not latch properly (r22497, r22495)
2011-06-18 18:37:10 +00:00
rubidium
863d0e08e3 (svn r22597) [1.1] -Backport from trunk:
- Fix: Callback result for airport layout name was incorrectly used (r22496)
- Fix: Airport preview sprite can depend on the layout, so update the cached SpriteID when the layout changes (r22494)
- Fix: Engine IDs for coal and mail wagons were swapped in the TTO savegame conversion [FS#4622] (r22487)
- Fix: The caption of centered windows could be moved out of the main window and thus become inaccessible when resizing the main window (r22485, r22484)
2011-06-18 18:33:20 +00:00
frosch
041714e538 (svn r22527) [1.1] -Prepare for 1.1.1 2011-05-31 19:25:02 +00:00
rubidium
7bbfbcddb7 (svn r22524) [1.1] -Backport from trunk:
- Language updates
- Documentation updates
2011-05-29 20:08:21 +00:00
rubidium
c224791f7f (svn r22520) [1.1] -Backport from trunk:
- Fix: Only try to insert implicit orders for ground vehicles. Aircraft may reach unscheduled terminals when skipping orders etc [FS#4624] (r22492)
- Change: Automatic orders are better called implicit orders as no real order influencing path finding is added (r22474, r22473)
2011-05-29 17:55:15 +00:00
269 changed files with 7714 additions and 4175 deletions

View File

@@ -60,6 +60,9 @@ ifdef OSXAPP
$(Q)cp "$(ROOT_DIR)/os/macosx/openttd.icns" "$(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/openttd.icns" $(Q)cp "$(ROOT_DIR)/os/macosx/openttd.icns" "$(BUNDLE_DIR)/$(OSXAPP)/Contents/Resources/openttd.icns"
$(Q)$(ROOT_DIR)/os/macosx/plistgen.sh "$(BUNDLE_DIR)/$(OSXAPP)" "$(REV)" $(Q)$(ROOT_DIR)/os/macosx/plistgen.sh "$(BUNDLE_DIR)/$(OSXAPP)" "$(REV)"
$(Q)cp "$(ROOT_DIR)/os/macosx/splash.png" "$(DATA_DIR)" $(Q)cp "$(ROOT_DIR)/os/macosx/splash.png" "$(DATA_DIR)"
endif
ifeq ($(OS),UNIX)
$(Q)cp "$(ROOT_DIR)/media/openttd.32.bmp" "$(DATA_DIR)/"
endif endif
$(Q)cp "$(BIN_DIR)/$(TTD)" "$(TTD_DIR)/" $(Q)cp "$(BIN_DIR)/$(TTD)" "$(TTD_DIR)/"
$(Q)cp "$(BIN_DIR)/ai/"compat_*.nut "$(AI_DIR)/" $(Q)cp "$(BIN_DIR)/ai/"compat_*.nut "$(AI_DIR)/"

View File

@@ -42,8 +42,8 @@ NFORENUM := $(shell [ `nforenum -s -v 2>/dev/null | wc -l ` -eq 1 ] && echo "nfo
MD5SUM := $(shell [ "$(OS)" = "OSX" ] && echo "md5 -r" || echo "md5sum") MD5SUM := $(shell [ "$(OS)" = "OSX" ] && echo "md5 -r" || echo "md5sum")
# Some "should not be changed" settings. # Some "should not be changed" settings.
NFO_FILES := $(GRF_DIR)/*.nfo NFO_FILES := $(GRF_DIR)/*.nfo $(GRF_DIR)/rivers/*.nfo
PNG_FILES := $(GRF_DIR)/*.png PNG_FILES := $(GRF_DIR)/*.png $(GRF_DIR)/rivers/*.png
# Build the GRF. # Build the GRF.
all: $(BIN_DIR)/openttd.grf all: $(BIN_DIR)/openttd.grf

View File

@@ -27,9 +27,21 @@ SRC_DIR = "$(ROOT_DIR)/src"
BUNDLE_DIR = "$(ROOT_DIR)/bundle" BUNDLE_DIR = "$(ROOT_DIR)/bundle"
BUNDLES_DIR = "$(ROOT_DIR)/bundles" BUNDLES_DIR = "$(ROOT_DIR)/bundles"
TTD = openttd.exe TTD = openttd.exe
PDB = openttd.pdb
MODE = Release
TARGET := $(shell echo $(PLATFORM) | sed "s@win64@x64@;s@win32@Win32@") TARGET := $(shell echo $(PLATFORM) | sed "s@win64@x64@;s@win32@Win32@")
all: all:
$(Q)cp objs/$(TARGET)/Release/$(TTD) $(BIN_DIR)/$(TTD) $(Q)cp objs/$(TARGET)/$(MODE)/$(TTD) $(BIN_DIR)/$(TTD)
include Makefile.bundle.in include Makefile.bundle.in
bundle_pdb:
@echo '[BUNDLE] Creating $(BUNDLE_NAME).pdb.xz'
$(Q)mkdir -p "$(BUNDLES_DIR)"
$(Q)cp objs/$(TARGET)/Release/$(PDB) $(BUNDLES_DIR)/$(BUNDLE_NAME).pdb
$(Q)xz -9 $(BUNDLES_DIR)/$(BUNDLE_NAME).pdb
regression: all
$(Q)cp bin/$(TTD) bin/openttd
$(Q)cd bin && sh ai/regression/run.sh

View File

@@ -248,7 +248,10 @@ $(OBJS_RC): %.o: $(SRC_DIR)/%.rc $(FILE_DEP)
$(Q)$(WINDRES) -o $@ -I `basename $<` $< $(Q)$(WINDRES) -o $@ -I `basename $<` $<
$(BIN_DIR)/$(TTD): $(TTD) $(BIN_DIR)/$(TTD): $(TTD)
$(Q)cp $< $@ $(Q)cp $(TTD) $(BIN_DIR)/$(TTD)
ifeq ($(OS), UNIX)
$(Q)cp $(MEDIA_DIR)/openttd.32.bmp $(BIN_DIR)/data/
endif
$(TTD): $(OBJS) $(CONFIG_CACHE_LINKER) $(TTD): $(OBJS) $(CONFIG_CACHE_LINKER)
$(E) '$(STAGE) Linking $@' $(E) '$(STAGE) Linking $@'

View File

@@ -8456,7 +8456,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetNumWagons(): 3 GetNumWagons(): 3
GetLength(): 24 GetLength(): 24
GetWagonEngineType(): 9 GetWagonEngineType(): 9
GetWagonAge(): 0 GetWagonAge(): 1
GetWagonEngineType(): 27 GetWagonEngineType(): 27
GetWagonAge(): 0 GetWagonAge(): 0
GetWagonEngineType(): 27 GetWagonEngineType(): 27
@@ -8492,11 +8492,11 @@ ERROR: IsEnd() is invalid as Begin() is never called
14 => 1 14 => 1
12 => 1 12 => 1
Age ListDump: Age ListDump:
17 => 1
16 => 1
14 => 1 14 => 1
13 => 1 13 => 1
12 => 1 12 => 1
17 => 0
16 => 0
MaxAge ListDump: MaxAge ListDump:
16 => 10980 16 => 10980
14 => 10980 14 => 10980
@@ -8504,9 +8504,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
13 => 5490 13 => 5490
12 => 5490 12 => 5490
AgeLeft ListDump: AgeLeft ListDump:
16 => 10980 16 => 10979
14 => 10979 14 => 10979
17 => 7320 17 => 7319
13 => 5489 13 => 5489
12 => 5489 12 => 5489
CurrentSpeed ListDump: CurrentSpeed ListDump:

View File

@@ -28,6 +28,7 @@ else
./openttd -x -c ai/regression/regression.cfg $params -g ai/regression/regression.sav -d ai=2 2>&1 | awk '{ gsub("0x(\\(nil\\)|0+)(x0)?", "0x00000000", $0); gsub("^dbg: \\[ai\\]", "", $0); gsub("^ ", "ERROR: ", $0); gsub("ERROR: \\[1\\] ", "", $0); gsub("\\[P\\] ", "", $0); print $0; }' > tmp.regression ./openttd -x -c ai/regression/regression.cfg $params -g ai/regression/regression.sav -d ai=2 2>&1 | awk '{ gsub("0x(\\(nil\\)|0+)(x0)?", "0x00000000", $0); gsub("^dbg: \\[ai\\]", "", $0); gsub("^ ", "ERROR: ", $0); gsub("ERROR: \\[1\\] ", "", $0); gsub("\\[P\\] ", "", $0); print $0; }' > tmp.regression
fi fi
ret=0
if [ -z "$gdb" ]; then if [ -z "$gdb" ]; then
res="`diff -ub ai/regression/regression.txt tmp.regression`" res="`diff -ub ai/regression/regression.txt tmp.regression`"
if [ -z "$res" ]; then if [ -z "$res" ]; then
@@ -35,6 +36,7 @@ if [ -z "$gdb" ]; then
else else
echo "Regression test failed! Difference:" echo "Regression test failed! Difference:"
echo "$res" echo "$res"
ret=1
fi fi
echo "" echo ""
echo "Regression test done" echo "Regression test done"
@@ -49,3 +51,5 @@ fi
if [ "$1" != "-k" ]; then if [ "$1" != "-k" ]; then
rm -f tmp.regression rm -f tmp.regression
fi fi
exit $ret

Binary file not shown.

View File

@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
TRGC.GRF = ed446637e034104c5559b32c18afe78d TRGC.GRF = ed446637e034104c5559b32c18afe78d
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6 TRGT.GRF = e30e8a398ae86c03dc534a8ac7dfb3b6
OPENTTD.GRF = 066f0ce5500e0e8f5332aee42e2451a2 OPENTTD.GRF = 245e2125cecfe7e0b6c5e85d32459f86
[origin] [origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM. default = You can find it on your Transport Tycoon Deluxe CD-ROM.

View File

@@ -55,7 +55,7 @@ TRGI.GRF = da6a6c9dcc451eec88d79211437b76a8
TRGC.GRF = ed446637e034104c5559b32c18afe78d TRGC.GRF = ed446637e034104c5559b32c18afe78d
TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9 TRGH.GRF = ee6616fb0e6ef6b24892c58c93d86fc9
TRGT.GRF = fcde1d7e8a74197d72a62695884b909e TRGT.GRF = fcde1d7e8a74197d72a62695884b909e
OPENTTD.GRF = 066f0ce5500e0e8f5332aee42e2451a2 OPENTTD.GRF = 245e2125cecfe7e0b6c5e85d32459f86
[origin] [origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM. default = You can find it on your Transport Tycoon Deluxe CD-ROM.

View File

@@ -55,7 +55,7 @@ TRGIR.GRF = 0c2484ff6be49fc63a83be6ab5c38f32
TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b TRGCR.GRF = 3668f410c761a050b5e7095a2b14879b
TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1 TRGHR.GRF = 06bf2b7a31766f048baac2ebe43457b1
TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8 TRGTR.GRF = de53650517fe661ceaa3138c6edb0eb8
OPENTTD.GRF = 066f0ce5500e0e8f5332aee42e2451a2 OPENTTD.GRF = 245e2125cecfe7e0b6c5e85d32459f86
[origin] [origin]
default = You can find it on your Transport Tycoon Deluxe CD-ROM. default = You can find it on your Transport Tycoon Deluxe CD-ROM.

View File

@@ -1,3 +1,159 @@
1.1.4-RC1 (2011-11-20)
------------------------------------------------------------------------
- Fix: 3-column view of NewGRF GUI had too much space for certain font sizes (r23251)
- Fix: Ignore special characters, such as the train 'character', when determining a fallback font (r23237)
- Fix: [NewGRF] Make train var 0xF3 consistent with TTDPatch (r23231)
- Fix: Invalidate build vehicle window when changing the setting for wagon speed limits (r23211)
- Fix: [NoAI] Hide AIObject from the documentation as it cannot be used (r23204, r23201)
- Fix: [Network] Unstable sorting in the network list when two servers had the exact same name [FS#4829] (r23202)
- Fix: Oil rigs that 'expired' did not get removed from the station list [FS#4822] (r23199)
- Fix: [Squirrel] replace custom qsort by std::sort to fix stack overflow [FS#4830] (r23190, r23187, r23186)
- Fix: Do not display railway fences between track and waypoints [FS#4627] (r23163)
- Fix: [NoAI] AIOrder did not handle implicit orders correctly in all cases [FS#4823] (r23135, r23133)
- Fix: When any keys on the on-screen keyboard were pressed the text cursor disappeared (r23132)
- Fix: [NoAI] AIOrder::IsCurrentOrderPartOfOrderList return false for valid vehicles and crashed for invalid ones (r23131)
- Fix: [NoAI] calling require() to include a file gave you 100.000 opcodes for free (r23117)
- Fix: Allow accessing the server's client info as well in the admin network [FS#4813] (r23115)
- Fix: [NewGRF] Run StartupEngines() if NewGRFs changed during loading a savegame, just like it is running when NewGRFs are changed during a game (r23083)
- Fix: Account for snow line table when determining the snow line for building houses (r23082)
- Fix: [NewGRF] If a NewGRF overrides a default house the minimum start year for that house was set to 1930 [FS#4794] (r23059)
- Fix: [NoAI] AIOrder::GetOrderCount() did not hide implicit orders (r23057)
- Fix: [NewGRF] When vehicles break down, update the image cache after changing the vehicle state (r23050)
- Fix: Use the same forest-check for the vegetation-map colour as for nearby station names [FS#4810] (r23049)
- Fix: Check that the selected font size is valid the font face in use and choose the nearest size to that selected if not. Font metrics should then just work (r23038)
- Fix: [NewGRF] Strip newlines from NewGRF strings that should not have newlines, e.g. the NewGRF's name [FS#4769] (r23036, r22970)
- Fix: The last custom playlist items went lost when the files in the .obm are not contiguous [FS#4776] (r23035, r23034, r23033)
- Fix: Palette conversion windows to DOS for light house / stadium animated colour was mixed up (r23032)
- Fix: For the admin 'bots' there was no distinction between bankruptcy and manual removal of companies even though the API suggested that [FS#4804] (r23031)
- Fix: Always show a chat message and send an admin packet when a new company is made [FS#4796] (r23030)
- Fix: Pass bottom of dropdown item rather than bottom of dropdown window, so the dropdown gets drawn better with different font sizes (r23018)
- Fix: AI backlog was to short to fully display the backtrace of some AI crashes [FS#4798] (r23012)
- Fix: When the last used server is deleted from the list also clear the last used server if it is the same [FS#4791] (r23011)
- Fix: [NewGRF] Make sure temporary storage is cleared before test and exec runs for DoCommands so NewGRF callbacks cannot change the result between the runs (r22996)
- Fix: [NewGRF] Tile was cleared before the object-placement callback was run, resulting in possible differences in test and exec run [FS#4775] (r22994)
- Fix: [NoAI] Do not return ERR_UNKNOWN when the vehicle would become too long (r22988)
- Fix: Draw buoy sprite without outline on the map, fix minor issues with original graphics (r22974, r22973, r22971, r22962)
- Fix: The savegame description and loading of savegames would crash with savegames from a patched stable (which did not bump the savegame version) [FS#4778] (r22958, r22957)
- Fix: Guard from reading outside the silly name list (r22955)
- Fix: [NewGRF] Properly limit the length of strings in a choice list (r22952)
- Fix: [NewGRF] Do not call CB 32 for disaster, effect vehicles or aircraft shadows/rotors (r22947)
- Fix: [NewGRF] Crash when accessing vehicle var 44 for a non-front aircraft [FS#4781] (r22946)
- Fix: Calculate the size of the start/stop vehicle button correctly (r22941)
- Fix: [OSX] Various MacOSX 10.7 issues causing OpenTTD to not work [FS#4751] (r22921, r22895, r22893, r22889)
- Fix: [NewGRF] Properties for feature 0x05 were not zeroed for each NewGRF, thus waterfeatures could glitch when the properties were set by a previous NewGRF and the NewGRF assumed the properties to be unmodified (r22918)
- Fix: Old TTO/TTD savegames could get non-stop via orders upon savegame loading, even when those orders did not exist back then. This 'conversion' feature is something for TTDPatch and old OpenTTD savegames [FS#4716] (r22914)
- Fix: The icon would (almost) never be shown for SDL builds [FS#4617] (r22910)
- Fix: The name of the heightmap glitches in the 'play heightmap' window (r22902)
- Fix: Locks would be incorrectly assembled (r22108)
1.1.3 (2011-09-15)
------------------------------------------------------------------------
- Fix: Prevent authentication bypass for the admin port when a new game is started [FS#4771] (r22934)
- Fix: TTO savegames with any aircraft not in an hangar caused crashes during load (r22915)
- Fix: Windows 2000 and XP without service pack 3 must use the win9x binary/installer; the newer MSVC compiler of the compile farm does not support those versions of Windows anymore [FS#4749] (r22909)
1.1.3-RC1 (2011-09-04)
------------------------------------------------------------------------
- Add: River graphics for the original base set (r22766)
- Fix: [NewGRF] DCxx text references via the textstack are not allowed, but caused crash [FS#4758] (r22882)
- Fix: Harden memory allocation (r22881, r22880, r22875)
- Fix: Miscalculation of train curve speed limits (r22879)
- Fix: Validate image dimensions before loading [CVE-2011-3343] [FS#4747] (r22878, r22877, r22874, r22873)
- Fix: Report an error in the news if autoreplace/renew fails due to the engine type being no longer available [FS#4712] (r22876)
- Fix: Perform stricter checks on RLE compressed BMP images [CVE-2011-3343] [FS#4746] (r22872, r22871)
- Fix: [NewGRF] Variables 40 and 81 of callback 18 are not the same as 80 (r22867)
- Fix: [NewGRF] Generic callbacks shall chain to the next GRF when the callback fails (r22866, r22865)
- Fix: Perform stricter checks on some commands [CVE-2011-3341] [FS#4745] (r22845)
- Fix: Harden savegame load against too many AI config settings [CVE-2011-3342] [FS#4748] (r22843)
- Fix: Compilation with GCC 4.7 (r22832, r22728, r22719)
- Fix: Allow to demolish aqueducts built in the scenario editor [FS#4741] (r22821)
- Fix: Towns expanding from the 'wrong' side of a tunnel or bridge [FS#4731] (r22810, r22809)
- Fix: [NewGRF] String codes for dates should use unsigned words, like old OpenTTD did before it learned dates before 1920 (r22774)
- Fix: [NoAI] Clarify the meaning of AIStation::IsWithinTownInfluence(), AITile::IsWithinTownInfluence() and AITown::IsWithinTownInfluence() [FS#4702] (r22763)
- Fix: [NewGRF] Also free allocated depot tables of NewGRF airports (r22760)
- Fix: [NewGRF] Invalid memory access when querying the grfID of the default objects [FS#4730] (r22757)
- Fix: When marking tile selections dirty, use the height information of the corners instead of the surface slope. This is more accurate when the foundation is kind of undefined [FS#4727] (r22755)
- Fix: Make aircraft point to the exit when leaving the hangar [FS#4696] (r22743, r22742, r22741)
- Fix: Display the size of the leveled platform in the measurement tooltip of terraforming operations [FS#4708] (r22740, r22739)
- Fix: Setting company passwords via the GUI on servers (including starting a company with the default password) failed, so no client could join that company [FS#4722] (r22738)
- Fix: [NewGRF] The construction stage sprites were incorrectly selected in cases other than 1 or 4 sprites per set (r22731)
- Fix: [NoAI] AITile::GetCargoAcceptance, AITile::GetCargoProduction and AIRail::BuildNewGRFRailStation did not check the cargo argument for validity (r22726)
- Fix: [NewGRF] Always draw NewGRF supplied texts with a default colour (r22725)
- Fix: [NewGRF] Do not restrict AdvVarAct2 to 255 operations (r22723)
- Fix: If there is no point in opening the rail/air toolbar, do not open it for people who use hotkeys either rather than only for those using GUI elements (r22716, r22715, r22714)
- Fix: [NoAI] Allow AIAirport::GetNoiseLevelIncrease() also for expired airports [FS#4704] (r22710)
1.1.2 (2011-08-14)
------------------------------------------------------------------------
- Fix: Some corrupted savegames could crash OpenTTD instead of showing the 'savegame corrupted' message [CVE-2011-3342] [FS#4717] (r22737, r22736)
- Fix: [NewGRF] Triggering NOT_REACHED when playing with a NewGRF that supplies genders/cases for a language that was not installed [FS#4718] (r22735)
1.1.2-RC2 (2011-07-30)
------------------------------------------------------------------------
- Fix: Cost of adding an extra road type to a bridge or tunnel was undercalculated [FS#4680, FS#4681] (r22700, r22699)
- Fix: Only insert cleared object tiles into _cleared_object_areas if clearing actually succeeds, else subsequential tests of the same tile will be skipped and considered successful [FS#4694] (r22698)
- Fix: When building a house it could be built at the wrong place if multitile houses failed some tests (r22697)
- Fix: [Network] Failed network address resolving could trigger temporary freezes [FS#4697] (r22696, r22695)
- Fix: [NewGRF] The override managers were not reset in some cases like creating a new scenario [FS#4691] (r22693)
- Fix: [NewGRF] Aircrafts defined with IDs above the default aircrafts always defaulted to passenger cargo (r22690)
1.1.2-RC1 (2011-07-24)
------------------------------------------------------------------------
- Change: [NewGRF] Only allow access (via hotkey and menu) to the bounding box visualisation when NewGRF developer tools are enabled (r22675)
- Fix: [NewGRF] Disallow accessing variable 1B in network games due to desync reasons (r22682)
- Fix: Switching from a red to a white highlight (by switching to another tool) without switching the highlight mode (HT_RECT etc.) did not mark the selection dirty [FS#4670] (r22649)
- Fix: [NewGRF] Parameters from NewGRFs were not properly parsed in all cases [FS#4599] (r22648, r22630, r22629, r22628, r22627)
- Fix: GetSection() does not return a LockPart [FS#4678] (r22645)
- Fix: [NewGRF] Disallow building NewObjects on water tiles owned by another company (r22643)
- Fix: [NewGRF] Disable the 'set parameters' button in the NewGRF GUI, if the GRF specifies to have no parameters and one would not be able to set any parameters anyway (r22642)
- Fix: Keep the previous owner of the upper and lower lock parts if they are built on existing water (r22638)
- Fix: [NewGRF] Airports should not expose the tile specific random bits of the north tile. Only airport tiles should access those (r22636)
- Fix: [NewGRF] Correctly reseed random bits of industries and industry tiles (r22635, r22634)
- Fix: [NewGRF] Implement variables 25 and 7F for railtypes (r22633)
- Fix: [NewGRF] Additional text in fund industry window is NewGRF supplied and thus should have a default colour (r22631)
- Fix: Also initialise _old_vds with newgame settings; TTD savegames do not contain these settings [FS#4622] (r22626)
- Fix: Do not zero the orders of disaster vehicles when converting savegames [FS#4642] (r22625)
- Fix: When closing an AI company the local player cheated to, we need to cheat him to another company [FS#4654] (r22624, r22623)
- Fix: When closing down companies their shares in other companies must be sold even if share trading is disabled at that point of time (r22622)
- Fix: When asking the user to confirm an unsafe unpausing, there is no need to execute a command if 'no' is choosed. This also prevents crashing when clicking unpause while the confirm window is shown (r22621)
- Fix: Enforce refit orders to be 'always go to depot' orders; service-only and stop-in-depot orders make no sense with refitting [FS#4651] (r22620)
- Fix: Consider the size of the vehicle sprite for the lineheight in the company GUI. This also makes the widget containing the sprite not skip drawing it, if the bounds of the widget are outside of the drawing area though the sprite actually needs drawing [FS#4662] (r22619)
- Fix: When changing difficulty settings over the network, do not just reopen the difficulty window if any game options window is opened; instead invalidate them properly [FS#4653] (r22618, r22617)
- Fix: [NewGRF] If callback 33 returns a value out of range, no sound effect shall be played [FS#4656] (r22614)
- Fix: Use rotated heightmap sizes for reporting scaling problems [FS#4663] (r22608)
- Fix: Do not show cargo accepted/produced in the new station window when no tiles are selected (mouse hovering a window or toolbar) [FS#4647] (r22595, r22593)
- Fix: Add active NewGRFs to the list of available ones when selecting the empty preset [FS#4644] (r22594)
- Fix: Reading of heightmaps with uncommon BMP formats failed due to uninitialised variables [FS#4645] (r22592)
- Fix: PBS order forecasting modified the current order index in case of a goto-nearest-depot order and no depot could be found [FS#4641] (r22589)
- Fix: Remove BaseStorageArrays from _changed_storage_arrays on destruction (r22583, r22551)
- Fix: Do not increment STL iterators after they have been invalidated (r22582)
- Fix: Do not lower the arrow buttons in the NewGRF/AI parameter windows if they are clicked when disabled (r22553, r22499)
- Fix: Clear airport persistent storage on construction/removal of airports (r22552)
- Fix: Possible crash when opening the airport build window for the first time [FS#4619] (r22538)
- Fix: Replace the half small airport structure on the intercontinental airport with some grass [FS#3494] (r22537)
- Fix: Documentation omission regarding admin protocol [FS#4632] (r22536)
- Fix: [NoAI] Doing rescan_ai in a game with running AIs caused a crash [FS#4631] (r22534)
- Fix: Do not create an implicit order if the current order is the first order in the order list and we visit the station of the last entry of the order list (r22532)
- Fix: MinGW 64 related compilation issues [FS#4623] (r22522, r22491, r22490, r22489)
- Fix: The layout selectors of the airport build GUI did not latch properly (r22497, r22495)
- Fix: Callback result for airport layout name was incorrectly used (r22496)
- Fix: Airport preview sprite can depend on the layout, so update the cached SpriteID when the layout changes (r22494)
- Fix: Engine IDs for coal and mail wagons were swapped in the TTO savegame conversion [FS#4622] (r22487)
- Fix: The caption of centered windows could be moved out of the main window and thus become inaccessible when resizing the main window (r22485, r22484)
- Fix: No client error packet was sent to the admin bots [FS#4585] (r22384)
1.1.1 (2011-06-01)
------------------------------------------------------------------------
- Change: Automatic orders are better called implicit orders as no real order influencing path finding is added (r22474, r22473)
- Fix: Only try to insert implicit orders for ground vehicles. Aircraft may reach unscheduled terminals when skipping orders [FS#4624] (r22492)
1.1.1-RC1 (2011-05-15) 1.1.1-RC1 (2011-05-15)
------------------------------------------------------------------------ ------------------------------------------------------------------------
- Feature: [NewGRF] Allow to filter by town of the current industry when using industry variable 0x68 [FS#4591] (r22434) - Feature: [NewGRF] Allow to filter by town of the current industry when using industry variable 0x68 [FS#4591] (r22434)
@@ -21,7 +177,6 @@
- Fix: When a game uses a lot of NewGRFs the buffer for storing that information in the PNG is too small (r22388) - Fix: When a game uses a lot of NewGRFs the buffer for storing that information in the PNG is too small (r22388)
- Fix: Windows' recv seems to return 'graceful closed' before having passed the remaining buffer which causes OpenTTD to think all connections are 'incorrectly' terminated, i.e. without the 'I am leaving' packet from the client. So let the client wait a tiny bit after sending the 'I am leaving' packet and before gracefully closing the connection [FS#4601] (r22387) - Fix: Windows' recv seems to return 'graceful closed' before having passed the remaining buffer which causes OpenTTD to think all connections are 'incorrectly' terminated, i.e. without the 'I am leaving' packet from the client. So let the client wait a tiny bit after sending the 'I am leaving' packet and before gracefully closing the connection [FS#4601] (r22387)
- Fix: When the last AI company gets removed, the 'dead' state was not reset in the AI debug window [FS#4602] (r22386) - Fix: When the last AI company gets removed, the 'dead' state was not reset in the AI debug window [FS#4602] (r22386)
- Fix: No client error packet was sent to the admin bots [FS#4585] (r22384)
- Fix: Recolouring of silicon bridge was done incorrectly (r22380, r22379, r22378) - Fix: Recolouring of silicon bridge was done incorrectly (r22380, r22379, r22378)
- Fix: Crash when clicking a removed company in the vehicle list dropdowns [FS#4592] (r22373) - Fix: Crash when clicking a removed company in the vehicle list dropdowns [FS#4592] (r22373)
- Fix: Keep better accounting of the order in which clients joined; client cannot be starved from joining and they get shown the amount of clients waiting in front of them (r22372, r22370, r22369, r22368, r22367, r22366, r22365, r22364, r22363, r22362, r22361) - Fix: Keep better accounting of the order in which clients joined; client cannot be starved from joining and they get shown the amount of clients waiting in front of them (r22372, r22370, r22369, r22368, r22367, r22366, r22365, r22364, r22363, r22362, r22361)

View File

@@ -1296,6 +1296,15 @@ make_compiler_cflags() {
cxxflags="$cxxflags -std=gnu++0x" cxxflags="$cxxflags -std=gnu++0x"
fi fi
if [ $cc_version -ge 47 ]; then
# Disable -Wnarrowing which gives many warnings, such as:
# warning: narrowing conversion of '...' from 'unsigned int' to 'int' inside { } [-Wnarrowing]
# They are valid according to the C++ standard, but useless.
cxxflags="$cxxflags -Wno-narrowing"
# Disable bogus 'attempt to free a non-heap object' warning
flags="$flags -Wno-free-nonheap-object"
fi
if [ "$enable_lto" != "0" ]; then if [ "$enable_lto" != "0" ]; then
# GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}' # GCC 4.5 outputs '%{flto}', GCC 4.6 outputs '%{flto*}'
has_lto=`$1 -dumpspecs | grep '\%{flto'` has_lto=`$1 -dumpspecs | grep '\%{flto'`

View File

@@ -1,6 +1,6 @@
OpenTTD's known bugs OpenTTD's known bugs
Last updated: 2011-05-15 Last updated: 2011-11-20
Release version: 1.1.1-RC1 Release version: 1.1.4-RC1
------------------------------------------------------------------------ ------------------------------------------------------------------------
@@ -39,6 +39,8 @@ officially supporting Mac OS X again. For now it remains unsupported and
we only apply bug fixes provided by the community but we are unable to fix we only apply bug fixes provided by the community but we are unable to fix
these bugs ourselves. these bugs ourselves.
- 4744 [OSX] Crash when switching to full screen with OS X Lion
- 4689 [OSX] Crash when hiding window after coming from full screen
- 4594 [Windows] Minimizing the windows when a modal error message is - 4594 [Windows] Minimizing the windows when a modal error message is
shown makes it difficult to exit the game shown makes it difficult to exit the game
- 4420 [OSX] OS' mouse pointer still shows - 4420 [OSX] OS' mouse pointer still shows
@@ -265,7 +267,7 @@ OpenTTD hangs when started on 32 bits Windows [FS#4083]
default we are not able to detect this failure, except when Windows' default we are not able to detect this failure, except when Windows'
music initialisation function returns after several hours and then music initialisation function returns after several hours and then
there is no point in switching the music driver anymore. there is no point in switching the music driver anymore.
The reason we do not use the "win32" music driver as default are The reason we still use the "win32" music driver as default are
described in the "Long delay between switching music/song" section described in the "Long delay between switching music/song" section
of this document. of this document.
@@ -301,3 +303,38 @@ Can't run OpenTTD with the -d option from a MSYS console [FS#4587]
debugging output. Compiling OpenTTD with the --enable-console debugging output. Compiling OpenTTD with the --enable-console
configure option prevents this issue and allows the -d option to use configure option prevents this issue and allows the -d option to use
the MSYS console for its output. the MSYS console for its output.
Unreadable characters for non-latin locales [FS#4607]
OpenTTD does not ship a non-latin font in its graphics files. As a
result OpenTTD needs to acquire the font from somewhere else. What
OpenTTD does is ask the operating system, or a system library, for
the best font for a given language if the currently loaded font
does not provide all characters of the chosen translation. This
means that OpenTTD has no influence over the quality of the chosen
font; it just does the best it can do.
If the text is unreadable there are several steps that you can take
to improve this. The first step is finding a good font and configure
this in the configuration file. See section 9.0 of readme.txt for
more information. You can also increase the font size to make the
characters bigger and possible better readable.
If the problem is with the clarity of the font you might want to
enable anti-aliasing by setting the small_aa/medium_aa/large_aa
settings to "true". However, anti-aliasing only works when a 32 bits
blitter has been selected, e.g. blitter = "32bpp-anim", as with the
8 bits blitter there are not enough colours to properly perform the
anti-aliasing.
Train does not crash with itself [FS#4635]:
When a train drives in a circle the front engine passes through
wagons of the same train without crashing. This is intentional.
Signals are only aware of tracks, they do not consider the train
length and whether there would be enough room for a train in some
circle it might drive on. Also the path a train might take is not
necessarily known when passing a signal.
Checking all circumstances would take a lot of additional computational
power for signals, which is not considered worth the effort, as
it does not add anything to gameplay.
Nevertheless trains shall not crash in normal operation, so making
a train not crash with itself is the best solution for everyone.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 29 KiB

View File

@@ -6,13 +6,26 @@
// 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. // 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/>. // 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/>.
// //
-1 * 0 0C "Aqueduct graphics by Jonathan G. Rennison" -1 * 0 0C "Aqueduct graphics by Jonathan G. Rennison / PaulC"
// temperate aqueduct
-1 * 6 07 83 01 \7! 00 09
-1 * 3 05 12 08 -1 * 3 05 12 08
-1 sprites/aqueduct.png 34 8 09 33 64 -34 -10 -1 sprites/aqueduct.png 34 8 09 32 61 -30 -9
-1 sprites/aqueduct.png 114 8 09 33 66 -37 -9 -1 sprites/aqueduct.png 114 8 09 31 62 -29 -9
-1 sprites/aqueduct.png 194 8 09 33 64 -34 -10 -1 sprites/aqueduct.png 194 8 09 32 61 -30 -9
-1 sprites/aqueduct.png 274 8 09 33 66 -37 -9 -1 sprites/aqueduct.png 274 8 09 31 62 -29 -9
-1 sprites/aqueduct.png 354 8 09 33 64 -34 -5 -1 sprites/aqueduct.png 354 8 09 32 61 -30 -4
-1 sprites/aqueduct.png 434 8 09 33 66 -37 -4 -1 sprites/aqueduct.png 434 8 09 31 62 -29 -4
-1 sprites/aqueduct.png 514 8 09 23 33 -31 0 -1 sprites/aqueduct.png 514 8 09 23 33 -31 0
-1 sprites/aqueduct.png 562 8 09 23 33 0 1 -1 sprites/aqueduct.png 562 8 09 23 33 0 1
// non-temperate aqueduct
-1 * 6 07 83 01 \7= 00 09
-1 * 3 05 12 08
-1 sprites/aqueduct.png 34 48 09 32 61 -30 -9
-1 sprites/aqueduct.png 114 48 09 31 62 -29 -9
-1 sprites/aqueduct.png 194 48 09 32 61 -30 -9
-1 sprites/aqueduct.png 274 48 09 31 62 -29 -9
-1 sprites/aqueduct.png 354 48 09 32 61 -30 -4
-1 sprites/aqueduct.png 434 48 09 31 62 -29 -4
-1 sprites/aqueduct.png 514 48 09 23 33 -31 0
-1 sprites/aqueduct.png 562 48 09 23 33 0 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@@ -6,70 +6,166 @@
// 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. // 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/>. // 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/>.
// //
-1 * 0 0C "Canal graphics by George" -1 * 0 0C "Canal graphics by George / PaulC"
-1 * 3 05 08 41 -1 * 3 05 08 41
-1 sprites/canals.png 66 8 09 23 64 -31 0 // Canal slopes
-1 sprites/canals.png 146 8 09 39 64 -31 -8 -1 sprites/canal_locks.png 66 8 09 23 64 -31 0
-1 sprites/canals.png 226 8 09 23 64 -31 0 -1 sprites/canal_locks.png 146 8 09 39 64 -31 -8
-1 sprites/canals.png 306 8 09 39 64 -31 -8 -1 sprites/canal_locks.png 226 8 09 23 64 -31 0
-1 sprites/canals.png 386 8 09 59 64 -31 -36 -1 sprites/canal_locks.png 306 8 09 39 64 -31 -8
-1 sprites/canals.png 466 8 09 65 64 -31 -34 // Lock sides
-1 sprites/canals.png 546 8 09 59 64 -31 -36 -1 sprites/canal_locks.png 386 8 09 59 64 -31 -36
-1 sprites/canals.png 626 8 09 59 64 -31 -28 -1 sprites/canal_locks.png 466 8 09 65 64 -31 -34
-1 sprites/canals.png 706 8 09 62 64 -1 -51 -1 sprites/canal_locks.png 546 8 09 59 64 -31 -36
-1 sprites/canals.png 2 88 09 62 64 -61 -43 -1 sprites/canal_locks.png 626 8 09 59 64 -31 -28
-1 sprites/canals.png 82 88 09 62 64 -61 -51 -1 sprites/canal_locks.png 706 8 09 62 64 -1 -51
-1 sprites/canals.png 162 88 09 62 64 -1 -43 -1 sprites/canal_locks.png 2 88 09 62 64 -61 -43
-1 sprites/canals.png 242 88 09 59 64 -31 -28 -1 sprites/canal_locks.png 82 88 09 62 64 -61 -51
-1 sprites/canals.png 322 88 09 65 66 -33 -34 -1 sprites/canal_locks.png 162 88 09 62 64 -1 -43
-1 sprites/canals.png 402 88 09 59 64 -31 -28 -1 sprites/canal_locks.png 242 88 09 59 64 -31 -28
-1 sprites/canals.png 482 88 09 59 64 -31 -28 -1 sprites/canal_locks.png 322 88 09 65 66 -33 -34
-1 sprites/canals.png 562 88 09 62 64 -1 -43 -1 sprites/canal_locks.png 402 88 09 59 64 -31 -28
-1 sprites/canals.png 642 88 09 60 64 -61 -43 -1 sprites/canal_locks.png 482 88 09 59 64 -31 -28
-1 sprites/canals.png 722 88 09 62 66 -61 -43 -1 sprites/canal_locks.png 562 88 09 62 64 -1 -43
-1 sprites/canals.png 2 168 09 60 64 -1 -43 -1 sprites/canal_locks.png 642 88 09 60 64 -61 -43
-1 sprites/canals.png 82 168 09 59 64 -31 -28 -1 sprites/canal_locks.png 722 88 09 62 66 -61 -43
-1 sprites/canals.png 162 168 09 59 64 -31 -28 -1 sprites/canal_locks.png 2 168 09 60 64 -1 -43
-1 sprites/canals.png 242 168 09 59 64 -31 -28 -1 sprites/canal_locks.png 82 168 09 59 64 -31 -28
-1 sprites/canals.png 322 168 09 59 64 -31 -28 -1 sprites/canal_locks.png 162 168 09 59 64 -31 -28
-1 sprites/canals.png 402 168 09 60 64 -1 -43 -1 sprites/canal_locks.png 242 168 09 59 64 -31 -28
-1 sprites/canals.png 482 168 09 62 68 -61 -43 -1 sprites/canal_locks.png 322 168 09 59 64 -31 -28
-1 sprites/canals.png 562 168 09 60 64 -61 -43 -1 sprites/canal_locks.png 402 168 09 60 64 -1 -43
-1 sprites/canals.png 642 168 09 62 64 -1 -43 -1 sprites/canal_locks.png 482 168 09 62 68 -61 -43
-1 sprites/canals.png 722 168 09 59 64 -31 -36 -1 sprites/canal_locks.png 562 168 09 60 64 -61 -43
-1 sprites/canals.png 2 248 09 65 64 -31 -34 -1 sprites/canal_locks.png 642 168 09 62 64 -1 -43
-1 sprites/canals.png 82 248 09 59 64 -31 -36 -1 sprites/canal_locks.png 722 168 09 59 64 -31 -36
-1 sprites/canals.png 162 248 09 59 64 -31 -28 -1 sprites/canal_locks.png 2 248 09 65 64 -31 -34
-1 sprites/canals.png 242 248 09 62 64 -1 -51 -1 sprites/canal_locks.png 82 248 09 59 64 -31 -36
-1 sprites/canals.png 322 248 09 62 64 -61 -43 -1 sprites/canal_locks.png 162 248 09 59 64 -31 -28
-1 sprites/canals.png 402 248 09 62 64 -61 -51 -1 sprites/canal_locks.png 242 248 09 62 64 -1 -51
-1 sprites/canals.png 482 248 09 62 64 -1 -43 -1 sprites/canal_locks.png 322 248 09 62 64 -61 -43
-1 sprites/canals.png 562 248 09 59 64 -31 -28 -1 sprites/canal_locks.png 402 248 09 62 64 -61 -51
-1 sprites/canals.png 642 248 09 65 66 -33 -34 -1 sprites/canal_locks.png 482 248 09 62 64 -1 -43
-1 sprites/canals.png 722 248 09 59 64 -31 -28 -1 sprites/canal_locks.png 562 248 09 59 64 -31 -28
-1 sprites/canals.png 2 328 09 59 64 -31 -28 -1 sprites/canal_locks.png 642 248 09 65 66 -33 -34
-1 sprites/canals.png 82 328 09 62 64 -1 -43 -1 sprites/canal_locks.png 722 248 09 59 64 -31 -28
-1 sprites/canals.png 162 328 09 60 64 -61 -43 -1 sprites/canal_locks.png 2 328 09 59 64 -31 -28
-1 sprites/canals.png 242 328 09 62 66 -61 -43 -1 sprites/canal_locks.png 82 328 09 62 64 -1 -43
-1 sprites/canals.png 322 328 09 60 64 -1 -43 -1 sprites/canal_locks.png 162 328 09 60 64 -61 -43
-1 sprites/canals.png 402 328 09 59 64 -31 -28 -1 sprites/canal_locks.png 242 328 09 62 66 -61 -43
-1 sprites/canals.png 482 328 09 59 64 -31 -28 -1 sprites/canal_locks.png 322 328 09 60 64 -1 -43
-1 sprites/canals.png 562 328 09 59 64 -31 -28 -1 sprites/canal_locks.png 402 328 09 59 64 -31 -28
-1 sprites/canals.png 642 328 09 59 64 -31 -28 -1 sprites/canal_locks.png 482 328 09 59 64 -31 -28
-1 sprites/canals.png 722 328 09 60 64 -1 -43 -1 sprites/canal_locks.png 562 328 09 59 64 -31 -28
-1 sprites/canals.png 2 408 09 62 68 -61 -43 -1 sprites/canal_locks.png 642 328 09 59 64 -31 -28
-1 sprites/canals.png 82 408 09 60 64 -61 -43 -1 sprites/canal_locks.png 722 328 09 60 64 -1 -43
-1 sprites/canals.png 162 408 09 62 64 -1 -43 -1 sprites/canal_locks.png 2 408 09 62 68 -61 -43
-1 sprites/canals.png 242 408 09 37 70 -31 -6 -1 sprites/canal_locks.png 82 408 09 60 64 -61 -43
-1 sprites/canals.png 322 408 09 37 70 -31 0 -1 sprites/canal_locks.png 162 408 09 62 64 -1 -43
-1 sprites/canals.png 402 408 09 37 70 -37 0 // Canal edges (temperate)
-1 sprites/canals.png 482 408 09 37 70 -37 -6 -1 sprites/canals.png 30 10 09 22 45 -11 -1
-1 sprites/canals.png 562 408 09 31 64 -31 0 -1 sprites/canals.png 94 10 09 21 41 -8 10
-1 sprites/canals.png 642 408 09 31 64 -31 0 -1 sprites/canals.png 142 10 09 21 42 -31 10
-1 sprites/canals.png 722 408 09 31 64 -31 0 -1 sprites/canals.png 190 10 09 22 43 -31 -1
-1 sprites/canals.png 2 488 09 37 64 -31 -6 -1 sprites/canals.png 238 10 09 22 22 11 4
-1 sprites/canals.png 82 488 09 31 64 -31 0 -1 sprites/canals.png 270 10 09 16 24 -11 15
-1 sprites/canals.png 162 488 09 31 64 -31 0 -1 sprites/canals.png 302 10 09 23 23 -31 4
-1 sprites/canals.png 242 488 09 31 64 -31 0 -1 sprites/canals.png 334 10 09 18 24 -11 -1
-1 sprites/canals.png 322 488 09 37 64 -31 -6 -1 sprites/canals.png 366 10 09 11 12 21 10
-1 sprites/canals.png 402 488 09 20 20 0 0 -1 sprites/canals.png 398 10 09 10 19 -8 21
-1 sprites/canals.png 430 10 09 10 11 -31 10
-1 sprites/canals.png 446 10 09 16 24 -11 -6
// Canal icon
-1 sprites/canal_locks.png 242 408 09 20 20 0 0
// Differentiation for the climates starts here
// Canal edges (arctic snowy)
-1 * 4 01 05 01 \b12
-1 sprites/canals.png 30 40 09 22 45 -11 -1
-1 sprites/canals.png 94 40 09 21 41 -8 10
-1 sprites/canals.png 142 40 09 21 42 -31 10
-1 sprites/canals.png 190 40 09 22 43 -31 -1
-1 sprites/canals.png 238 40 09 22 22 11 4
-1 sprites/canals.png 270 40 09 16 24 -11 15
-1 sprites/canals.png 302 40 09 23 23 -31 4
-1 sprites/canals.png 334 40 09 18 24 -11 -1
-1 sprites/canals.png 366 40 09 11 12 21 10
-1 sprites/canals.png 398 40 09 10 19 -8 21
-1 sprites/canals.png 430 40 09 10 11 -31 10
-1 sprites/canals.png 446 40 09 16 24 -11 -6
-1 * 7 02 05 10 01 00 00 00
// Canal edges (arctic normal)
-1 * 4 01 05 01 \b12
-1 sprites/canals.png 30 70 09 22 45 -11 -1
-1 sprites/canals.png 94 70 09 21 41 -8 10
-1 sprites/canals.png 142 70 09 21 42 -31 10
-1 sprites/canals.png 190 70 09 22 43 -31 -1
-1 sprites/canals.png 238 70 09 22 22 11 4
-1 sprites/canals.png 270 70 09 16 24 -11 15
-1 sprites/canals.png 302 70 09 23 23 -31 4
-1 sprites/canals.png 334 70 09 18 24 -11 -1
-1 sprites/canals.png 366 70 09 11 12 21 10
-1 sprites/canals.png 398 70 09 10 19 -8 21
-1 sprites/canals.png 430 70 09 10 11 -31 10
-1 sprites/canals.png 446 70 09 16 24 -11 -6
-1 * 7 02 05 11 01 00 00 00
// Choose the right arctic canal edges
-1 * 14 02 05 12 81 81 00 FF 01 10 00 04 04 11 00
-1 * 6 07 83 01 \7! 01 01
-1 * 7 03 05 01 02 00 12 00
// Canal edges (tropic desert)
-1 * 4 01 05 01 \b12
-1 sprites/canals.png 30 100 09 22 45 -11 -1
-1 sprites/canals.png 94 100 09 21 41 -8 10
-1 sprites/canals.png 142 100 09 21 42 -31 10
-1 sprites/canals.png 190 100 09 22 43 -31 -1
-1 sprites/canals.png 238 100 09 22 22 11 4
-1 sprites/canals.png 270 100 09 16 24 -11 15
-1 sprites/canals.png 302 100 09 23 23 -31 4
-1 sprites/canals.png 334 100 09 18 24 -11 -1
-1 sprites/canals.png 366 100 09 11 12 21 10
-1 sprites/canals.png 398 100 09 10 19 -8 21
-1 sprites/canals.png 430 100 09 10 11 -31 10
-1 sprites/canals.png 446 100 09 16 24 -11 -6
-1 * 7 02 05 13 01 00 00 00
// Canal edges (tropic rainforest)
-1 * 4 01 05 01 \b12
-1 sprites/canals.png 30 130 09 22 45 -11 -1
-1 sprites/canals.png 94 130 09 21 41 -8 10
-1 sprites/canals.png 142 130 09 21 42 -31 10
-1 sprites/canals.png 190 130 09 22 43 -31 -1
-1 sprites/canals.png 238 130 09 22 22 11 4
-1 sprites/canals.png 270 130 09 16 24 -11 15
-1 sprites/canals.png 302 130 09 23 23 -31 4
-1 sprites/canals.png 334 130 09 18 24 -11 -1
-1 sprites/canals.png 366 130 09 11 12 21 10
-1 sprites/canals.png 398 130 09 10 19 -8 21
-1 sprites/canals.png 430 130 09 10 11 -31 10
-1 sprites/canals.png 446 130 09 16 24 -11 -6
-1 * 7 02 05 14 01 00 00 00
// Choose the right tropic canal edges
-1 * 14 02 05 15 81 81 00 FF 01 13 00 01 01 14 00
-1 * 6 07 83 01 \7! 02 01
-1 * 7 03 05 01 02 00 15 00
// Canal edges (toyland)
-1 * 4 01 05 01 \b12
-1 sprites/canals.png 30 160 09 22 45 -11 -1
-1 sprites/canals.png 94 160 09 21 41 -8 10
-1 sprites/canals.png 142 160 09 21 42 -31 10
-1 sprites/canals.png 190 160 09 22 43 -31 -1
-1 sprites/canals.png 238 160 09 22 22 11 4
-1 sprites/canals.png 270 160 09 16 24 -11 15
-1 sprites/canals.png 302 160 09 23 23 -31 4
-1 sprites/canals.png 334 160 09 18 24 -11 -1
-1 sprites/canals.png 366 160 09 11 12 21 10
-1 sprites/canals.png 398 160 09 10 19 -8 21
-1 sprites/canals.png 430 160 09 10 11 -31 10
-1 sprites/canals.png 446 160 09 16 24 -11 -6
-1 * 7 02 05 16 01 00 00 00
-1 * 6 07 83 01 \7! 03 01
-1 * 7 03 05 01 02 00 16 00

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 6.1 KiB

View File

@@ -6,8 +6,8 @@
// 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. // 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/>. // 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/>.
// //
-1 * 0 0C "Fixing (alignment) bugs in the orignal graphics. By Addi." -1 * 0 0C "Fixing (alignment) bugs in the original graphics. By Addi and PaulC."
-1 * 6 07 83 01 \7= 03 69 -1 * 6 07 83 01 \7= 03 7D
// Different graphics for same wood truck // Different graphics for same wood truck
-1 * 14 0A 04 01 87 0C 01 89 0C 01 07 0E 01 09 0E -1 * 14 0A 04 01 87 0C 01 89 0C 01 07 0E 01 09 0E
-1 sprites/fix_graphics.png 82 8 09 16 22 -6 -7 -1 sprites/fix_graphics.png 82 8 09 16 22 -6 -7
@@ -79,6 +79,11 @@
-1 sprites/fix_graphics.png 370 72 09 35 48 -23 -7 -1 sprites/fix_graphics.png 370 72 09 35 48 -23 -7
-1 sprites/fix_graphics.png 434 72 09 35 48 -23 -7 -1 sprites/fix_graphics.png 434 72 09 35 48 -23 -7
-1 sprites/fix_graphics.png 498 72 09 21 49 -24 3 -1 sprites/fix_graphics.png 498 72 09 21 49 -24 3
// Misaligned maglev bridge heads
-1 * 8 0A 02 01 12 11 02 14 11
-1 sprites/fix_graphics.png 322 486 09 35 48 -23 -7
-1 sprites/fix_graphics.png 386 486 09 35 48 -23 -7
-1 sprites/fix_graphics.png 450 486 09 21 49 -24 3
// Improperly cut cinema // Improperly cut cinema
-1 * 5 0A 01 02 34 11 -1 * 5 0A 01 02 34 11
-1 sprites/fix_graphics.png 578 72 09 31 64 -31 0 -1 sprites/fix_graphics.png 578 72 09 31 64 -31 0
@@ -198,3 +203,132 @@
// GUI sprite // GUI sprite
-1 * 5 0A 01 01 \w2600 -1 * 5 0A 01 01 \w2600
-1 sprites/fix_graphics.png 433 298 09 15 40 0 5 -1 sprites/fix_graphics.png 433 298 09 15 40 0 5
// Make level crossings in tropical climate look normal
-1 * 6 07 83 01 \7! 02 19
-1 * 14 0A 04 04 5A 05 08 62 05 08 6E 05 04 7A 05
-1 sprites/fix_graphics.png 2 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 162 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 242 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 322 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 402 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 482 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 562 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 642 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 722 390 09 31 64 -31 0
-1 sprites/fix_graphics.png 2 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 162 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 242 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 322 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 402 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 482 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 562 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 642 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 722 438 09 31 64 -31 0
-1 sprites/fix_graphics.png 2 486 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 486 09 31 64 -31 0
-1 sprites/fix_graphics.png 162 486 09 31 64 -31 0
-1 sprites/fix_graphics.png 242 486 09 31 64 -31 0
// Fix transparency of steel mill
-1 * 6 07 83 01 \7! 00 0A
-1 * 5 0A 01 04 4D 08
-1 sprites/fix_graphics.png 610 486 09 31 64 -31 0
-1 sprites/fix_graphics.png 690 486 09 61 59 -31 -33
-1 sprites/fix_graphics.png 2 566 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 566 09 50 51 -25 -21
-1 * 5 0A 01 04 58 08
-1 sprites/fix_graphics.png 162 566 09 31 64 -31 0
-1 sprites/fix_graphics.png 242 566 09 52 59 -31 -24
-1 sprites/fix_graphics.png 306 566 09 31 64 -31 0
-1 sprites/fix_graphics.png 386 566 09 44 51 -25 -15
// Fix transparency of oil well
-1 * 6 07 83 01 \7= 03 10
-1 * 5 0A 01 06 7E 08
-1 sprites/fix_graphics.png 482 566 09 50 31 -11 -28
-1 sprites/fix_graphics.png 530 566 09 47 31 -11 -25
-1 sprites/fix_graphics.png 578 566 09 47 31 -11 -25
-1 sprites/fix_graphics.png 626 566 09 47 31 -11 -25
-1 sprites/fix_graphics.png 674 566 09 49 31 -11 -27
-1 sprites/fix_graphics.png 722 566 09 52 31 -11 -30
-1 * 6 07 83 01 \7! 00 02
-1 * 5 0A 01 01 7D 08
-1 sprites/fix_graphics.png 2 630 09 31 64 -31 0
-1 * 6 07 83 01 \7! 01 02
-1 * 5 0A 01 01 7D 08
-1 sprites/fix_graphics.png 114 630 09 31 64 -31 0
-1 * 6 07 83 01 \7! 02 02
-1 * 5 0A 01 01 7D 08
-1 sprites/fix_graphics.png 226 630 09 31 64 -31 0
-1 * 6 07 83 01 \7! 03 0F
-1 * 5 0A 01 06 91 04
// Fix toyland overlay for PBS on maglev
-1 sprites/fix_graphics.png 338 630 09 16 30 -14 8
-1 sprites/fix_graphics.png 386 630 09 16 30 -14 8
-1 sprites/fix_graphics.png 434 630 01 7 40 -19 4
-1 sprites/fix_graphics.png 482 630 01 7 40 -19 20
-1 sprites/fix_graphics.png 530 630 01 19 12 11 6
-1 sprites/fix_graphics.png 562 630 01 19 12 -21 6
// Fix toyland monorail bridge alignment
-1 * 8 0A 02 01 EA 10 02 EC 10
-1 sprites/fix_graphics.png 610 630 09 35 48 -23 -7
-1 sprites/fix_graphics.png 674 630 09 35 48 -23 -7
-1 sprites/fix_graphics.png 738 630 09 21 49 -24 3
// Fix toyland maglev bridge alignment
-1 * 8 0A 02 01 12 11 02 14 11
-1 sprites/fix_graphics.png 18 678 09 35 48 -23 -7
-1 sprites/fix_graphics.png 82 678 09 35 48 -23 -7
-1 sprites/fix_graphics.png 146 678 09 21 49 -24 3
// Fix city airport's grass for temperate
-1 * 6 07 83 01 \7! 00 0A
-1 * 5 0A 01 09 4C 0A
-1 sprites/fix_graphics.png 242 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 322 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 402 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 482 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 562 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 642 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 722 678 09 31 64 -31 0
-1 sprites/fix_graphics.png 2 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 726 09 31 64 -31 0
// Fix city airport's grass for arctic
-1 * 6 07 83 01 \7! 01 0A
-1 * 5 0A 01 09 4C 0A
-1 sprites/fix_graphics.png 194 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 274 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 354 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 434 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 514 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 594 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 674 726 09 31 64 -31 0
-1 sprites/fix_graphics.png 2 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 774 09 31 64 -31 0
// Fix city airport's grass for tropical
-1 * 6 07 83 01 \7! 02 0A
-1 * 5 0A 01 09 4C 0A
-1 sprites/fix_graphics.png 194 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 274 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 354 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 434 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 514 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 594 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 674 774 09 31 64 -31 0
-1 sprites/fix_graphics.png 2 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 822 09 31 64 -31 0
// Fix city airport's grass for toyland
-1 * 6 07 83 01 \7! 03 0A
-1 * 5 0A 01 09 4C 0A
-1 sprites/fix_graphics.png 194 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 274 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 354 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 434 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 514 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 594 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 674 822 09 31 64 -31 0
-1 sprites/fix_graphics.png 2 870 09 31 64 -31 0
-1 sprites/fix_graphics.png 82 870 09 31 64 -31 0
// Fix buoy in-game; don't show black outline
-1 * 4 01 05 01 \b1
-1 sprites/fix_graphics.png 575 490 09 11 7 7 4
-1 * 7 02 05 17 01 00 00 00
-1 * 7 03 05 01 08 00 17 00

Binary file not shown.

Before

Width:  |  Height:  |  Size: 29 KiB

After

Width:  |  Height:  |  Size: 63 KiB

View File

@@ -80,6 +80,7 @@
"David Dallaston: tram tracks" 0D "David Dallaston: tram tracks" 0D
"Jonathan G. Rennison: aqueducts" 0D "Jonathan G. Rennison: aqueducts" 0D
"Bilbo, Jasper Vries: font" 0D "Bilbo, Jasper Vries: font" 0D
"Andrew Parkhouse: rivers" 0D
"OpenTTD developers: other graphics" 00 "OpenTTD developers: other graphics" 00
// //
@@ -104,3 +105,8 @@
#include "chars.nfo" #include "chars.nfo"
#include "overrides.nfo" #include "overrides.nfo"
#include "fix_graphics.nfo" #include "fix_graphics.nfo"
#include "rivers/rapids.nfo"
#include "rivers/temperate.nfo"
#include "rivers/arctic.nfo"
#include "rivers/tropic.nfo"
#include "rivers/toyland.nfo"

View File

@@ -0,0 +1,282 @@
//
// $Id$
//
// 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/>.
//
-1 * 0 0C "Arctic river graphics by andythenorth (Andrew Parkhouse)"
-1 * 4 01 05 01 3C
-1 sprites/arctic_snowy.png 10 10 09 19 38 -5 0
-1 sprites/arctic_snowy.png 58 10 09 18 38 -5 13
-1 sprites/arctic_snowy.png 106 10 09 18 38 -31 13
-1 sprites/arctic_snowy.png 154 10 09 19 38 -31 0
-1 sprites/arctic_snowy.png 202 10 09 9 19 14 11
-1 sprites/arctic_snowy.png 234 10 09 9 16 -7 22
-1 sprites/arctic_snowy.png 266 10 09 9 19 -31 11
-1 sprites/arctic_snowy.png 298 10 09 9 16 -7 0
-1 sprites/arctic_snowy.png 330 10 09 6 8 25 13
-1 sprites/arctic_snowy.png 346 10 09 4 12 -5 27
-1 sprites/arctic_snowy.png 364 10 09 6 8 -31 13
-1 sprites/arctic_snowy.png 380 10 09 5 12 -5 0
-1 sprites/arctic_snowy.png 10 40 09 11 40 -7 0
-1 sprites/arctic_snowy.png 58 40 09 18 39 -6 5
-1 sprites/arctic_snowy.png 106 40 09 11 38 -31 12
-1 sprites/arctic_snowy.png 154 40 09 18 39 -31 0
-1 sprites/arctic_snowy.png 202 40 09 6 20 13 5
-1 sprites/arctic_snowy.png 234 40 09 7 13 -6 16
-1 sprites/arctic_snowy.png 266 40 09 6 20 -31 12
-1 sprites/arctic_snowy.png 298 40 09 7 13 -5 0
-1 sprites/arctic_snowy.png 330 40 09 5 8 25 6
-1 sprites/arctic_snowy.png 346 40 09 3 12 -5 20
-1 sprites/arctic_snowy.png 364 40 09 4 8 -31 13
-1 sprites/arctic_snowy.png 380 40 09 4 15 -7 0
-1 sprites/arctic_snowy.png 10 70 09 20 38 -5 -8
-1 sprites/arctic_snowy.png 58 70 09 26 38 -5 5
-1 sprites/arctic_snowy.png 106 70 09 20 37 -31 11
-1 sprites/arctic_snowy.png 154 70 09 27 38 -31 -8
-1 sprites/arctic_snowy.png 202 70 09 9 16 17 3
-1 sprites/arctic_snowy.png 234 70 09 9 15 -7 22
-1 sprites/arctic_snowy.png 266 70 09 9 16 -31 11
-1 sprites/arctic_snowy.png 298 70 09 9 15 -6 -8
-1 sprites/arctic_snowy.png 330 70 09 7 8 25 5
-1 sprites/arctic_snowy.png 346 70 09 5 10 -4 27
-1 sprites/arctic_snowy.png 364 70 09 7 8 -31 11
-1 sprites/arctic_snowy.png 380 70 09 6 12 -5 -8
-1 sprites/arctic_snowy.png 10 100 09 18 39 -6 0
-1 sprites/arctic_snowy.png 58 100 09 11 38 -5 12
-1 sprites/arctic_snowy.png 106 100 09 18 39 -31 5
-1 sprites/arctic_snowy.png 154 100 09 11 40 -32 0
-1 sprites/arctic_snowy.png 202 100 09 6 20 13 12
-1 sprites/arctic_snowy.png 234 100 09 7 13 -5 16
-1 sprites/arctic_snowy.png 266 100 09 6 20 -31 5
-1 sprites/arctic_snowy.png 298 100 09 7 13 -6 0
-1 sprites/arctic_snowy.png 330 100 09 4 8 26 13
-1 sprites/arctic_snowy.png 346 100 09 3 12 -5 20
-1 sprites/arctic_snowy.png 364 100 09 5 8 -31 6
-1 sprites/arctic_snowy.png 380 100 09 4 15 -6 0
-1 sprites/arctic_snowy.png 10 130 09 27 38 -5 -8
-1 sprites/arctic_snowy.png 58 130 09 20 37 -4 11
-1 sprites/arctic_snowy.png 106 130 09 26 37 -31 5
-1 sprites/arctic_snowy.png 154 130 09 20 38 -31 -8
-1 sprites/arctic_snowy.png 202 130 09 9 16 17 11
-1 sprites/arctic_snowy.png 234 130 09 9 15 -6 22
-1 sprites/arctic_snowy.png 266 130 09 9 16 -31 3
-1 sprites/arctic_snowy.png 298 130 09 9 15 -7 -8
-1 sprites/arctic_snowy.png 330 130 09 7 8 25 11
-1 sprites/arctic_snowy.png 346 130 09 5 10 -4 26
-1 sprites/arctic_snowy.png 364 130 09 7 8 -31 5
-1 sprites/arctic_snowy.png 380 130 09 6 12 -5 -8
-1 * 7 02 05 30 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/arctic_brown.png 10 10 09 19 38 -5 0
-1 sprites/arctic_brown.png 58 10 09 18 38 -5 13
-1 sprites/arctic_brown.png 106 10 09 18 38 -31 13
-1 sprites/arctic_brown.png 154 10 09 19 38 -31 0
-1 sprites/arctic_brown.png 202 10 09 9 19 14 11
-1 sprites/arctic_brown.png 234 10 09 9 16 -7 22
-1 sprites/arctic_brown.png 266 10 09 9 19 -31 11
-1 sprites/arctic_brown.png 298 10 09 9 16 -7 0
-1 sprites/arctic_brown.png 330 10 09 6 8 25 13
-1 sprites/arctic_brown.png 346 10 09 4 12 -5 27
-1 sprites/arctic_brown.png 364 10 09 6 8 -31 13
-1 sprites/arctic_brown.png 380 10 09 5 12 -5 0
-1 sprites/arctic_brown.png 10 40 09 11 40 -7 0
-1 sprites/arctic_brown.png 58 40 09 18 39 -6 5
-1 sprites/arctic_brown.png 106 40 09 11 38 -31 12
-1 sprites/arctic_brown.png 154 40 09 18 39 -31 0
-1 sprites/arctic_brown.png 202 40 09 6 20 13 5
-1 sprites/arctic_brown.png 234 40 09 7 13 -6 16
-1 sprites/arctic_brown.png 266 40 09 6 20 -31 12
-1 sprites/arctic_brown.png 298 40 09 7 13 -5 0
-1 sprites/arctic_brown.png 330 40 09 5 8 25 6
-1 sprites/arctic_brown.png 346 40 09 3 12 -5 20
-1 sprites/arctic_brown.png 364 40 09 4 8 -31 13
-1 sprites/arctic_brown.png 380 40 09 4 15 -7 0
-1 sprites/arctic_brown.png 10 70 09 20 38 -5 -8
-1 sprites/arctic_brown.png 58 70 09 26 38 -5 5
-1 sprites/arctic_brown.png 106 70 09 20 37 -31 11
-1 sprites/arctic_brown.png 154 70 09 27 38 -31 -8
-1 sprites/arctic_brown.png 202 70 09 9 16 17 3
-1 sprites/arctic_brown.png 234 70 09 9 15 -7 22
-1 sprites/arctic_brown.png 266 70 09 9 16 -31 11
-1 sprites/arctic_brown.png 298 70 09 9 15 -6 -8
-1 sprites/arctic_brown.png 330 70 09 7 8 25 5
-1 sprites/arctic_brown.png 346 70 09 5 10 -4 27
-1 sprites/arctic_brown.png 364 70 09 7 8 -31 11
-1 sprites/arctic_brown.png 380 70 09 6 12 -5 -8
-1 sprites/arctic_brown.png 10 100 09 18 39 -6 0
-1 sprites/arctic_brown.png 58 100 09 11 38 -5 12
-1 sprites/arctic_brown.png 106 100 09 18 39 -31 5
-1 sprites/arctic_brown.png 154 100 09 11 40 -32 0
-1 sprites/arctic_brown.png 202 100 09 6 20 13 12
-1 sprites/arctic_brown.png 234 100 09 7 13 -5 16
-1 sprites/arctic_brown.png 266 100 09 6 20 -31 5
-1 sprites/arctic_brown.png 298 100 09 7 13 -6 0
-1 sprites/arctic_brown.png 330 100 09 4 8 26 13
-1 sprites/arctic_brown.png 346 100 09 3 12 -5 20
-1 sprites/arctic_brown.png 364 100 09 5 8 -31 6
-1 sprites/arctic_brown.png 380 100 09 4 15 -6 0
-1 sprites/arctic_brown.png 10 130 09 27 38 -5 -8
-1 sprites/arctic_brown.png 58 130 09 20 37 -4 11
-1 sprites/arctic_brown.png 106 130 09 26 37 -31 5
-1 sprites/arctic_brown.png 154 130 09 20 38 -31 -8
-1 sprites/arctic_brown.png 202 130 09 9 16 17 11
-1 sprites/arctic_brown.png 234 130 09 9 15 -6 22
-1 sprites/arctic_brown.png 266 130 09 9 16 -31 3
-1 sprites/arctic_brown.png 298 130 09 9 15 -7 -8
-1 sprites/arctic_brown.png 330 130 09 7 8 25 11
-1 sprites/arctic_brown.png 346 130 09 5 10 -4 26
-1 sprites/arctic_brown.png 364 130 09 7 8 -31 5
-1 sprites/arctic_brown.png 380 130 09 6 12 -5 -8
-1 * 7 02 05 31 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/arctic_snowy.png 10 210 09 19 38 -5 0
-1 sprites/arctic_snowy.png 58 210 09 18 38 -5 13
-1 sprites/arctic_snowy.png 106 210 09 18 38 -31 13
-1 sprites/arctic_snowy.png 154 210 09 19 38 -31 0
-1 sprites/arctic_snowy.png 202 210 09 9 19 14 11
-1 sprites/arctic_snowy.png 234 210 09 9 16 -7 22
-1 sprites/arctic_snowy.png 266 210 09 9 19 -31 11
-1 sprites/arctic_snowy.png 298 210 09 9 16 -7 0
-1 sprites/arctic_snowy.png 330 210 09 6 8 25 13
-1 sprites/arctic_snowy.png 346 210 09 4 12 -5 27
-1 sprites/arctic_snowy.png 364 210 09 6 8 -31 13
-1 sprites/arctic_snowy.png 380 210 09 5 12 -5 0
-1 sprites/arctic_snowy.png 10 240 09 11 40 -7 0
-1 sprites/arctic_snowy.png 58 240 09 18 39 -6 5
-1 sprites/arctic_snowy.png 106 240 09 11 38 -31 12
-1 sprites/arctic_snowy.png 154 240 09 18 39 -31 0
-1 sprites/arctic_snowy.png 202 240 09 6 20 13 5
-1 sprites/arctic_snowy.png 234 240 09 7 13 -6 16
-1 sprites/arctic_snowy.png 266 240 09 6 20 -31 12
-1 sprites/arctic_snowy.png 298 240 09 7 13 -5 0
-1 sprites/arctic_snowy.png 330 240 09 5 8 25 6
-1 sprites/arctic_snowy.png 346 240 09 3 12 -5 20
-1 sprites/arctic_snowy.png 364 240 09 4 8 -31 13
-1 sprites/arctic_snowy.png 380 240 09 4 15 -7 0
-1 sprites/arctic_snowy.png 10 270 09 20 38 -5 -8
-1 sprites/arctic_snowy.png 58 270 09 26 38 -5 5
-1 sprites/arctic_snowy.png 106 270 09 20 37 -31 11
-1 sprites/arctic_snowy.png 154 270 09 27 38 -31 -8
-1 sprites/arctic_snowy.png 202 270 09 9 16 17 3
-1 sprites/arctic_snowy.png 234 270 09 9 15 -7 22
-1 sprites/arctic_snowy.png 266 270 09 9 16 -31 11
-1 sprites/arctic_snowy.png 298 270 09 9 15 -6 -8
-1 sprites/arctic_snowy.png 330 270 09 7 8 25 5
-1 sprites/arctic_snowy.png 346 270 09 5 10 -4 27
-1 sprites/arctic_snowy.png 364 270 09 7 8 -31 11
-1 sprites/arctic_snowy.png 380 270 09 6 12 -5 -8
-1 sprites/arctic_snowy.png 10 300 09 18 39 -6 0
-1 sprites/arctic_snowy.png 58 300 09 11 38 -5 12
-1 sprites/arctic_snowy.png 106 300 09 18 39 -31 5
-1 sprites/arctic_snowy.png 154 300 09 11 40 -32 0
-1 sprites/arctic_snowy.png 202 300 09 6 20 13 12
-1 sprites/arctic_snowy.png 234 300 09 7 13 -5 16
-1 sprites/arctic_snowy.png 266 300 09 6 20 -31 5
-1 sprites/arctic_snowy.png 298 300 09 7 13 -6 0
-1 sprites/arctic_snowy.png 330 300 09 4 8 26 13
-1 sprites/arctic_snowy.png 346 300 09 3 12 -5 20
-1 sprites/arctic_snowy.png 364 300 09 5 8 -31 6
-1 sprites/arctic_snowy.png 380 300 09 4 15 -6 0
-1 sprites/arctic_snowy.png 10 330 09 27 38 -5 -8
-1 sprites/arctic_snowy.png 58 330 09 20 37 -4 11
-1 sprites/arctic_snowy.png 106 330 09 26 37 -31 5
-1 sprites/arctic_snowy.png 154 330 09 20 38 -31 -8
-1 sprites/arctic_snowy.png 202 330 09 9 16 17 11
-1 sprites/arctic_snowy.png 234 330 09 9 15 -6 22
-1 sprites/arctic_snowy.png 266 330 09 9 16 -31 3
-1 sprites/arctic_snowy.png 298 330 09 9 15 -7 -8
-1 sprites/arctic_snowy.png 330 330 09 7 8 25 11
-1 sprites/arctic_snowy.png 346 330 09 5 10 -4 26
-1 sprites/arctic_snowy.png 364 330 09 7 8 -31 5
-1 sprites/arctic_snowy.png 380 330 09 6 12 -5 -8
-1 * 7 02 05 32 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/arctic_brown.png 10 210 09 19 38 -5 0
-1 sprites/arctic_brown.png 58 210 09 18 38 -5 13
-1 sprites/arctic_brown.png 106 210 09 18 38 -31 13
-1 sprites/arctic_brown.png 154 210 09 19 38 -31 0
-1 sprites/arctic_brown.png 202 210 09 9 19 14 11
-1 sprites/arctic_brown.png 234 210 09 9 16 -7 22
-1 sprites/arctic_brown.png 266 210 09 9 19 -31 11
-1 sprites/arctic_brown.png 298 210 09 9 16 -7 0
-1 sprites/arctic_brown.png 330 210 09 6 8 25 13
-1 sprites/arctic_brown.png 346 210 09 4 12 -5 27
-1 sprites/arctic_brown.png 364 210 09 6 8 -31 13
-1 sprites/arctic_brown.png 380 210 09 5 12 -5 0
-1 sprites/arctic_brown.png 10 240 09 11 40 -7 0
-1 sprites/arctic_brown.png 58 240 09 18 39 -6 5
-1 sprites/arctic_brown.png 106 240 09 11 38 -31 12
-1 sprites/arctic_brown.png 154 240 09 18 39 -31 0
-1 sprites/arctic_brown.png 202 240 09 6 20 13 5
-1 sprites/arctic_brown.png 234 240 09 7 13 -6 16
-1 sprites/arctic_brown.png 266 240 09 6 20 -31 12
-1 sprites/arctic_brown.png 298 240 09 7 13 -5 0
-1 sprites/arctic_brown.png 330 240 09 5 8 25 6
-1 sprites/arctic_brown.png 346 240 09 3 12 -5 20
-1 sprites/arctic_brown.png 364 240 09 4 8 -31 13
-1 sprites/arctic_brown.png 380 240 09 4 15 -7 0
-1 sprites/arctic_brown.png 10 270 09 20 38 -5 -8
-1 sprites/arctic_brown.png 58 270 09 26 38 -5 5
-1 sprites/arctic_brown.png 106 270 09 20 37 -31 11
-1 sprites/arctic_brown.png 154 270 09 27 38 -31 -8
-1 sprites/arctic_brown.png 202 270 09 9 16 17 3
-1 sprites/arctic_brown.png 234 270 09 9 15 -7 22
-1 sprites/arctic_brown.png 266 270 09 9 16 -31 11
-1 sprites/arctic_brown.png 298 270 09 9 15 -6 -8
-1 sprites/arctic_brown.png 330 270 09 7 8 25 5
-1 sprites/arctic_brown.png 346 270 09 5 10 -4 27
-1 sprites/arctic_brown.png 364 270 09 7 8 -31 11
-1 sprites/arctic_brown.png 380 270 09 6 12 -5 -8
-1 sprites/arctic_brown.png 10 300 09 18 39 -6 0
-1 sprites/arctic_brown.png 58 300 09 11 38 -5 12
-1 sprites/arctic_brown.png 106 300 09 18 39 -31 5
-1 sprites/arctic_brown.png 154 300 09 11 40 -32 0
-1 sprites/arctic_brown.png 202 300 09 6 20 13 12
-1 sprites/arctic_brown.png 234 300 09 7 13 -5 16
-1 sprites/arctic_brown.png 266 300 09 6 20 -31 5
-1 sprites/arctic_brown.png 298 300 09 7 13 -6 0
-1 sprites/arctic_brown.png 330 300 09 4 8 26 13
-1 sprites/arctic_brown.png 346 300 09 3 12 -5 20
-1 sprites/arctic_brown.png 364 300 09 5 8 -31 6
-1 sprites/arctic_brown.png 380 300 09 4 15 -6 0
-1 sprites/arctic_brown.png 10 330 09 27 38 -5 -8
-1 sprites/arctic_brown.png 58 330 09 20 37 -4 11
-1 sprites/arctic_brown.png 106 330 09 26 37 -31 5
-1 sprites/arctic_brown.png 154 330 09 20 38 -31 -8
-1 sprites/arctic_brown.png 202 330 09 9 16 17 11
-1 sprites/arctic_brown.png 234 330 09 9 15 -6 22
-1 sprites/arctic_brown.png 266 330 09 9 16 -31 3
-1 sprites/arctic_brown.png 298 330 09 9 15 -7 -8
-1 sprites/arctic_brown.png 330 330 09 7 8 25 11
-1 sprites/arctic_brown.png 346 330 09 5 10 -4 26
-1 sprites/arctic_brown.png 364 330 09 7 8 -31 5
-1 sprites/arctic_brown.png 380 330 09 6 12 -5 -8
-1 * 7 02 05 33 01 00 00 00
-1 * 14 02 05 34 81 81 00 FF 01 30 00 04 04 31 00
-1 * 14 02 05 35 81 81 00 FF 01 32 00 04 04 33 00
-1 * 14 02 05 36 81 80 00 FF 01 34 00 00 00 35 00
-1 * 6 07 83 01 \7! 01 01
-1 * 7 03 05 01 06 00 36 00

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

View File

@@ -0,0 +1,139 @@
//
// $Id$
//
// 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/>.
//
-1 * 0 0C "Rapid graphics"
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 10 09 23 64 -31 0
-1 sprites/rapids.png 90 10 09 39 64 -31 -8
-1 sprites/rapids.png 170 10 09 23 64 -31 0
-1 sprites/rapids.png 250 10 09 39 64 -31 -8
-1 * 7 02 05 00 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 60 09 23 64 -31 0
-1 sprites/rapids.png 90 60 09 39 64 -31 -8
-1 sprites/rapids.png 170 60 09 23 64 -31 0
-1 sprites/rapids.png 250 60 09 39 64 -31 -8
-1 * 7 02 05 01 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 110 09 23 64 -31 0
-1 sprites/rapids.png 90 110 09 39 64 -31 -8
-1 sprites/rapids.png 170 110 09 23 64 -31 0
-1 sprites/rapids.png 250 110 09 39 64 -31 -8
-1 * 7 02 05 02 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 160 09 23 64 -31 0
-1 sprites/rapids.png 90 160 09 39 64 -31 -8
-1 sprites/rapids.png 170 160 09 23 64 -31 0
-1 sprites/rapids.png 250 160 09 39 64 -31 -8
-1 * 7 02 05 03 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 210 09 23 64 -31 0
-1 sprites/rapids.png 90 210 09 39 64 -31 -8
-1 sprites/rapids.png 170 210 09 23 64 -31 0
-1 sprites/rapids.png 250 210 09 39 64 -31 -8
-1 * 7 02 05 04 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 260 09 23 64 -31 0
-1 sprites/rapids.png 90 260 09 39 64 -31 -8
-1 sprites/rapids.png 170 260 09 23 64 -31 0
-1 sprites/rapids.png 250 260 09 39 64 -31 -8
-1 * 7 02 05 05 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 310 09 23 64 -31 0
-1 sprites/rapids.png 90 310 09 39 64 -31 -8
-1 sprites/rapids.png 170 310 09 23 64 -31 0
-1 sprites/rapids.png 250 310 09 39 64 -31 -8
-1 * 7 02 05 06 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 360 09 23 64 -31 0
-1 sprites/rapids.png 90 360 09 39 64 -31 -8
-1 sprites/rapids.png 170 360 09 23 64 -31 0
-1 sprites/rapids.png 250 360 09 39 64 -31 -8
-1 * 7 02 05 07 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 410 09 23 64 -31 0
-1 sprites/rapids.png 90 410 09 39 64 -31 -8
-1 sprites/rapids.png 170 410 09 23 64 -31 0
-1 sprites/rapids.png 250 410 09 39 64 -31 -8
-1 * 7 02 05 08 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 460 09 23 64 -31 0
-1 sprites/rapids.png 90 460 09 39 64 -31 -8
-1 sprites/rapids.png 170 460 09 23 64 -31 0
-1 sprites/rapids.png 250 460 09 39 64 -31 -8
-1 * 7 02 05 09 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 510 09 23 64 -31 0
-1 sprites/rapids.png 90 510 09 39 64 -31 -8
-1 sprites/rapids.png 170 510 09 23 64 -31 0
-1 sprites/rapids.png 250 510 09 39 64 -31 -8
-1 * 7 02 05 0A 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 560 09 23 64 -31 0
-1 sprites/rapids.png 90 560 09 39 64 -31 -8
-1 sprites/rapids.png 170 560 09 23 64 -31 0
-1 sprites/rapids.png 250 560 09 39 64 -31 -8
-1 * 7 02 05 0B 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 610 09 23 64 -31 0
-1 sprites/rapids.png 90 610 09 39 64 -31 -8
-1 sprites/rapids.png 170 610 09 23 64 -31 0
-1 sprites/rapids.png 250 610 09 39 64 -31 -8
-1 * 7 02 05 0C 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 660 09 23 64 -31 0
-1 sprites/rapids.png 90 660 09 39 64 -31 -8
-1 sprites/rapids.png 170 660 09 23 64 -31 0
-1 sprites/rapids.png 250 660 09 39 64 -31 -8
-1 * 7 02 05 0D 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 710 09 23 64 -31 0
-1 sprites/rapids.png 90 710 09 39 64 -31 -8
-1 sprites/rapids.png 170 710 09 23 64 -31 0
-1 sprites/rapids.png 250 710 09 39 64 -31 -8
-1 * 7 02 05 0E 01 00 00 00
-1 * 4 01 05 01 04
-1 sprites/rapids.png 10 760 09 23 64 -31 0
-1 sprites/rapids.png 90 760 09 39 64 -31 -8
-1 sprites/rapids.png 170 760 09 23 64 -31 0
-1 sprites/rapids.png 250 760 09 39 64 -31 -8
-1 * 7 02 05 0F 01 00 00 00
-1 * 39 02 05 10 80 00 01 10
00 00
01 00
02 00
03 00
04 00
05 00
06 00
07 00
08 00
09 00
0A 00
0B 00
0C 00
0D 00
0E 00
0F 00
-1 * 7 03 05 01 05 00 10 00

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

View File

@@ -0,0 +1,146 @@
//
// $Id$
//
// 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/>.
//
-1 * 0 0C "Temperate river graphics by andythenorth (Andrew Parkhouse)"
-1 * 4 01 05 01 3C
-1 sprites/temperate.png 10 10 09 19 38 -5 0
-1 sprites/temperate.png 58 10 09 18 38 -5 13
-1 sprites/temperate.png 106 10 09 18 38 -31 13
-1 sprites/temperate.png 154 10 09 19 38 -31 0
-1 sprites/temperate.png 202 10 09 9 19 14 11
-1 sprites/temperate.png 234 10 09 9 16 -7 22
-1 sprites/temperate.png 266 10 09 9 19 -31 11
-1 sprites/temperate.png 298 10 09 9 16 -7 0
-1 sprites/temperate.png 330 10 09 6 8 25 13
-1 sprites/temperate.png 346 10 09 4 12 -5 27
-1 sprites/temperate.png 364 10 09 6 8 -31 13
-1 sprites/temperate.png 380 10 09 5 12 -5 0
-1 sprites/temperate.png 10 40 09 11 40 -7 0
-1 sprites/temperate.png 58 40 09 18 39 -6 5
-1 sprites/temperate.png 106 40 09 11 38 -31 12
-1 sprites/temperate.png 154 40 09 18 39 -31 0
-1 sprites/temperate.png 202 40 09 6 20 13 5
-1 sprites/temperate.png 234 40 09 7 13 -6 16
-1 sprites/temperate.png 266 40 09 6 20 -31 12
-1 sprites/temperate.png 298 40 09 7 13 -5 0
-1 sprites/temperate.png 330 40 09 5 8 25 6
-1 sprites/temperate.png 346 40 09 3 12 -5 20
-1 sprites/temperate.png 364 40 09 4 8 -31 13
-1 sprites/temperate.png 380 40 09 4 15 -7 0
-1 sprites/temperate.png 10 70 09 20 38 -5 -8
-1 sprites/temperate.png 58 70 09 26 38 -5 5
-1 sprites/temperate.png 106 70 09 20 37 -31 11
-1 sprites/temperate.png 154 70 09 27 38 -31 -8
-1 sprites/temperate.png 202 70 09 9 16 17 3
-1 sprites/temperate.png 234 70 09 9 15 -7 22
-1 sprites/temperate.png 266 70 09 9 16 -31 11
-1 sprites/temperate.png 298 70 09 9 15 -6 -8
-1 sprites/temperate.png 330 70 09 7 8 25 5
-1 sprites/temperate.png 346 70 09 5 10 -4 27
-1 sprites/temperate.png 364 70 09 7 8 -31 11
-1 sprites/temperate.png 380 70 09 6 12 -5 -8
-1 sprites/temperate.png 10 100 09 18 39 -6 0
-1 sprites/temperate.png 58 100 09 11 38 -5 12
-1 sprites/temperate.png 106 100 09 18 39 -31 5
-1 sprites/temperate.png 154 100 09 11 40 -32 0
-1 sprites/temperate.png 202 100 09 6 20 13 12
-1 sprites/temperate.png 234 100 09 7 13 -5 16
-1 sprites/temperate.png 266 100 09 6 20 -31 5
-1 sprites/temperate.png 298 100 09 7 13 -6 0
-1 sprites/temperate.png 330 100 09 4 8 26 13
-1 sprites/temperate.png 346 100 09 3 12 -5 20
-1 sprites/temperate.png 364 100 09 5 8 -31 6
-1 sprites/temperate.png 380 100 09 4 15 -6 0
-1 sprites/temperate.png 10 130 09 27 38 -5 -8
-1 sprites/temperate.png 58 130 09 20 37 -4 11
-1 sprites/temperate.png 106 130 09 26 37 -31 5
-1 sprites/temperate.png 154 130 09 20 38 -31 -8
-1 sprites/temperate.png 202 130 09 9 16 17 11
-1 sprites/temperate.png 234 130 09 9 15 -6 22
-1 sprites/temperate.png 266 130 09 9 16 -31 3
-1 sprites/temperate.png 298 130 09 9 15 -7 -8
-1 sprites/temperate.png 330 130 09 7 8 25 11
-1 sprites/temperate.png 346 130 09 5 10 -4 26
-1 sprites/temperate.png 364 130 09 7 8 -31 5
-1 sprites/temperate.png 380 130 09 6 12 -5 -8
-1 * 7 02 05 20 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/temperate.png 10 210 09 19 38 -5 0
-1 sprites/temperate.png 58 210 09 18 38 -5 13
-1 sprites/temperate.png 106 210 09 18 38 -31 13
-1 sprites/temperate.png 154 210 09 19 38 -31 0
-1 sprites/temperate.png 202 210 09 9 19 14 11
-1 sprites/temperate.png 234 210 09 9 16 -7 22
-1 sprites/temperate.png 266 210 09 9 19 -31 11
-1 sprites/temperate.png 298 210 09 9 16 -7 0
-1 sprites/temperate.png 330 210 09 6 8 25 13
-1 sprites/temperate.png 346 210 09 4 12 -5 27
-1 sprites/temperate.png 364 210 09 6 8 -31 13
-1 sprites/temperate.png 380 210 09 5 12 -5 0
-1 sprites/temperate.png 10 240 09 11 40 -7 0
-1 sprites/temperate.png 58 240 09 18 39 -6 5
-1 sprites/temperate.png 106 240 09 11 38 -31 12
-1 sprites/temperate.png 154 240 09 18 39 -31 0
-1 sprites/temperate.png 202 240 09 6 20 13 5
-1 sprites/temperate.png 234 240 09 7 13 -6 16
-1 sprites/temperate.png 266 240 09 6 20 -31 12
-1 sprites/temperate.png 298 240 09 7 13 -5 0
-1 sprites/temperate.png 330 240 09 5 8 25 6
-1 sprites/temperate.png 346 240 09 3 12 -5 20
-1 sprites/temperate.png 364 240 09 4 8 -31 13
-1 sprites/temperate.png 380 240 09 4 15 -7 0
-1 sprites/temperate.png 10 270 09 20 38 -5 -8
-1 sprites/temperate.png 58 270 09 26 38 -5 5
-1 sprites/temperate.png 106 270 09 20 37 -31 11
-1 sprites/temperate.png 154 270 09 27 38 -31 -8
-1 sprites/temperate.png 202 270 09 9 16 17 3
-1 sprites/temperate.png 234 270 09 9 15 -7 22
-1 sprites/temperate.png 266 270 09 9 16 -31 11
-1 sprites/temperate.png 298 270 09 9 15 -6 -8
-1 sprites/temperate.png 330 270 09 7 8 25 5
-1 sprites/temperate.png 346 270 09 5 10 -4 27
-1 sprites/temperate.png 364 270 09 7 8 -31 11
-1 sprites/temperate.png 380 270 09 6 12 -5 -8
-1 sprites/temperate.png 10 300 09 18 39 -6 0
-1 sprites/temperate.png 58 300 09 11 38 -5 12
-1 sprites/temperate.png 106 300 09 18 39 -31 5
-1 sprites/temperate.png 154 300 09 11 40 -32 0
-1 sprites/temperate.png 202 300 09 6 20 13 12
-1 sprites/temperate.png 234 300 09 7 13 -5 16
-1 sprites/temperate.png 266 300 09 6 20 -31 5
-1 sprites/temperate.png 298 300 09 7 13 -6 0
-1 sprites/temperate.png 330 300 09 4 8 26 13
-1 sprites/temperate.png 346 300 09 3 12 -5 20
-1 sprites/temperate.png 364 300 09 5 8 -31 6
-1 sprites/temperate.png 380 300 09 4 15 -6 0
-1 sprites/temperate.png 10 330 09 27 38 -5 -8
-1 sprites/temperate.png 58 330 09 20 37 -4 11
-1 sprites/temperate.png 106 330 09 26 37 -31 5
-1 sprites/temperate.png 154 330 09 20 38 -31 -8
-1 sprites/temperate.png 202 330 09 9 16 17 11
-1 sprites/temperate.png 234 330 09 9 15 -6 22
-1 sprites/temperate.png 266 330 09 9 16 -31 3
-1 sprites/temperate.png 298 330 09 9 15 -7 -8
-1 sprites/temperate.png 330 330 09 7 8 25 11
-1 sprites/temperate.png 346 330 09 5 10 -4 26
-1 sprites/temperate.png 364 330 09 7 8 -31 5
-1 sprites/temperate.png 380 330 09 6 12 -5 -8
-1 * 7 02 05 21 01 00 00 00
-1 * 14 02 05 22 81 80 00 FF 01 20 00 00 00 21 00
-1 * 6 07 83 01 \7! 00 01
-1 * 7 03 05 01 06 00 22 00

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,146 @@
//
// $Id$
//
// 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/>.
//
-1 * 0 0C "Toyland river graphics by andythenorth (Andrew Parkhouse)"
-1 * 4 01 05 01 3C
-1 sprites/toyland.png 10 10 09 19 38 -5 0
-1 sprites/toyland.png 58 10 09 18 38 -5 13
-1 sprites/toyland.png 106 10 09 18 38 -31 13
-1 sprites/toyland.png 154 10 09 19 38 -31 0
-1 sprites/toyland.png 202 10 09 9 19 14 11
-1 sprites/toyland.png 234 10 09 9 16 -7 22
-1 sprites/toyland.png 266 10 09 9 19 -31 11
-1 sprites/toyland.png 298 10 09 9 16 -7 0
-1 sprites/toyland.png 330 10 09 6 8 25 13
-1 sprites/toyland.png 346 10 09 4 12 -5 27
-1 sprites/toyland.png 364 10 09 6 8 -31 13
-1 sprites/toyland.png 380 10 09 5 12 -5 0
-1 sprites/toyland.png 10 40 09 11 40 -7 0
-1 sprites/toyland.png 58 40 09 18 39 -6 5
-1 sprites/toyland.png 106 40 09 11 38 -31 12
-1 sprites/toyland.png 154 40 09 18 39 -31 0
-1 sprites/toyland.png 202 40 09 6 20 13 5
-1 sprites/toyland.png 234 40 09 7 13 -6 16
-1 sprites/toyland.png 266 40 09 6 20 -31 12
-1 sprites/toyland.png 298 40 09 7 13 -5 0
-1 sprites/toyland.png 330 40 09 5 8 25 6
-1 sprites/toyland.png 346 40 09 3 12 -5 20
-1 sprites/toyland.png 364 40 09 4 8 -31 13
-1 sprites/toyland.png 380 40 09 4 15 -7 0
-1 sprites/toyland.png 10 70 09 20 38 -5 -8
-1 sprites/toyland.png 58 70 09 26 38 -5 5
-1 sprites/toyland.png 106 70 09 20 37 -31 11
-1 sprites/toyland.png 154 70 09 27 38 -31 -8
-1 sprites/toyland.png 202 70 09 9 16 17 3
-1 sprites/toyland.png 234 70 09 9 15 -7 22
-1 sprites/toyland.png 266 70 09 9 16 -31 11
-1 sprites/toyland.png 298 70 09 9 15 -6 -8
-1 sprites/toyland.png 330 70 09 7 8 25 5
-1 sprites/toyland.png 346 70 09 5 10 -4 27
-1 sprites/toyland.png 364 70 09 7 8 -31 11
-1 sprites/toyland.png 380 70 09 6 12 -5 -8
-1 sprites/toyland.png 10 100 09 18 39 -6 0
-1 sprites/toyland.png 58 100 09 11 38 -5 12
-1 sprites/toyland.png 106 100 09 18 39 -31 5
-1 sprites/toyland.png 154 100 09 11 40 -32 0
-1 sprites/toyland.png 202 100 09 6 20 13 12
-1 sprites/toyland.png 234 100 09 7 13 -5 16
-1 sprites/toyland.png 266 100 09 6 20 -31 5
-1 sprites/toyland.png 298 100 09 7 13 -6 0
-1 sprites/toyland.png 330 100 09 4 8 26 13
-1 sprites/toyland.png 346 100 09 3 12 -5 20
-1 sprites/toyland.png 364 100 09 5 8 -31 6
-1 sprites/toyland.png 380 100 09 4 15 -6 0
-1 sprites/toyland.png 10 130 09 27 38 -5 -8
-1 sprites/toyland.png 58 130 09 20 37 -4 11
-1 sprites/toyland.png 106 130 09 26 37 -31 5
-1 sprites/toyland.png 154 130 09 20 38 -31 -8
-1 sprites/toyland.png 202 130 09 9 16 17 11
-1 sprites/toyland.png 234 130 09 9 15 -6 22
-1 sprites/toyland.png 266 130 09 9 16 -31 3
-1 sprites/toyland.png 298 130 09 9 15 -7 -8
-1 sprites/toyland.png 330 130 09 7 8 25 11
-1 sprites/toyland.png 346 130 09 5 10 -4 26
-1 sprites/toyland.png 364 130 09 7 8 -31 5
-1 sprites/toyland.png 380 130 09 6 12 -5 -8
-1 * 7 02 05 50 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/toyland.png 10 210 09 19 38 -5 0
-1 sprites/toyland.png 58 210 09 18 38 -5 13
-1 sprites/toyland.png 106 210 09 18 38 -31 13
-1 sprites/toyland.png 154 210 09 19 38 -31 0
-1 sprites/toyland.png 202 210 09 9 19 14 11
-1 sprites/toyland.png 234 210 09 9 16 -7 22
-1 sprites/toyland.png 266 210 09 9 19 -31 11
-1 sprites/toyland.png 298 210 09 9 16 -7 0
-1 sprites/toyland.png 330 210 09 6 8 25 13
-1 sprites/toyland.png 346 210 09 4 12 -5 27
-1 sprites/toyland.png 364 210 09 6 8 -31 13
-1 sprites/toyland.png 380 210 09 5 12 -5 0
-1 sprites/toyland.png 10 240 09 11 40 -7 0
-1 sprites/toyland.png 58 240 09 18 39 -6 5
-1 sprites/toyland.png 106 240 09 11 38 -31 12
-1 sprites/toyland.png 154 240 09 18 39 -31 0
-1 sprites/toyland.png 202 240 09 6 20 13 5
-1 sprites/toyland.png 234 240 09 7 13 -6 16
-1 sprites/toyland.png 266 240 09 6 20 -31 12
-1 sprites/toyland.png 298 240 09 7 13 -5 0
-1 sprites/toyland.png 330 240 09 5 8 25 6
-1 sprites/toyland.png 346 240 09 3 12 -5 20
-1 sprites/toyland.png 364 240 09 4 8 -31 13
-1 sprites/toyland.png 380 240 09 4 15 -7 0
-1 sprites/toyland.png 10 270 09 20 38 -5 -8
-1 sprites/toyland.png 58 270 09 26 38 -5 5
-1 sprites/toyland.png 106 270 09 20 37 -31 11
-1 sprites/toyland.png 154 270 09 27 38 -31 -8
-1 sprites/toyland.png 202 270 09 9 16 17 3
-1 sprites/toyland.png 234 270 09 9 15 -7 22
-1 sprites/toyland.png 266 270 09 9 16 -31 11
-1 sprites/toyland.png 298 270 09 9 15 -6 -8
-1 sprites/toyland.png 330 270 09 7 8 25 5
-1 sprites/toyland.png 346 270 09 5 10 -4 27
-1 sprites/toyland.png 364 270 09 7 8 -31 11
-1 sprites/toyland.png 380 270 09 6 12 -5 -8
-1 sprites/toyland.png 10 300 09 18 39 -6 0
-1 sprites/toyland.png 58 300 09 11 38 -5 12
-1 sprites/toyland.png 106 300 09 18 39 -31 5
-1 sprites/toyland.png 154 300 09 11 40 -32 0
-1 sprites/toyland.png 202 300 09 6 20 13 12
-1 sprites/toyland.png 234 300 09 7 13 -5 16
-1 sprites/toyland.png 266 300 09 6 20 -31 5
-1 sprites/toyland.png 298 300 09 7 13 -6 0
-1 sprites/toyland.png 330 300 09 4 8 26 13
-1 sprites/toyland.png 346 300 09 3 12 -5 20
-1 sprites/toyland.png 364 300 09 5 8 -31 6
-1 sprites/toyland.png 380 300 09 4 15 -6 0
-1 sprites/toyland.png 10 330 09 27 38 -5 -8
-1 sprites/toyland.png 58 330 09 20 37 -4 11
-1 sprites/toyland.png 106 330 09 26 37 -31 5
-1 sprites/toyland.png 154 330 09 20 38 -31 -8
-1 sprites/toyland.png 202 330 09 9 16 17 11
-1 sprites/toyland.png 234 330 09 9 15 -6 22
-1 sprites/toyland.png 266 330 09 9 16 -31 3
-1 sprites/toyland.png 298 330 09 9 15 -7 -8
-1 sprites/toyland.png 330 330 09 7 8 25 11
-1 sprites/toyland.png 346 330 09 5 10 -4 26
-1 sprites/toyland.png 364 330 09 7 8 -31 5
-1 sprites/toyland.png 380 330 09 6 12 -5 -8
-1 * 7 02 05 51 01 00 00 00
-1 * 14 02 05 52 81 80 00 FF 01 50 00 00 00 51 00
-1 * 6 07 83 01 \7! 03 01
-1 * 7 03 05 01 06 00 52 00

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1,282 @@
//
// $Id$
//
// 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/>.
//
-1 * 0 0C "Tropic river graphics by andythenorth (Andrew Parkhouse)"
-1 * 4 01 05 01 3C
-1 sprites/tropic_desert.png 10 10 09 19 38 -5 0
-1 sprites/tropic_desert.png 58 10 09 18 38 -5 13
-1 sprites/tropic_desert.png 106 10 09 18 38 -31 13
-1 sprites/tropic_desert.png 154 10 09 19 38 -31 0
-1 sprites/tropic_desert.png 202 10 09 9 19 14 11
-1 sprites/tropic_desert.png 234 10 09 9 16 -7 22
-1 sprites/tropic_desert.png 266 10 09 9 19 -31 11
-1 sprites/tropic_desert.png 298 10 09 9 16 -7 0
-1 sprites/tropic_desert.png 330 10 09 6 8 25 13
-1 sprites/tropic_desert.png 346 10 09 4 12 -5 27
-1 sprites/tropic_desert.png 364 10 09 6 8 -31 13
-1 sprites/tropic_desert.png 380 10 09 5 12 -5 0
-1 sprites/tropic_desert.png 10 40 09 11 40 -7 0
-1 sprites/tropic_desert.png 58 40 09 18 39 -6 5
-1 sprites/tropic_desert.png 106 40 09 11 38 -31 12
-1 sprites/tropic_desert.png 154 40 09 18 39 -31 0
-1 sprites/tropic_desert.png 202 40 09 6 20 13 5
-1 sprites/tropic_desert.png 234 40 09 7 13 -6 16
-1 sprites/tropic_desert.png 266 40 09 6 20 -31 12
-1 sprites/tropic_desert.png 298 40 09 7 13 -5 0
-1 sprites/tropic_desert.png 330 40 09 5 8 25 6
-1 sprites/tropic_desert.png 346 40 09 3 12 -5 20
-1 sprites/tropic_desert.png 364 40 09 4 8 -31 13
-1 sprites/tropic_desert.png 380 40 09 4 15 -7 0
-1 sprites/tropic_desert.png 10 70 09 20 38 -5 -8
-1 sprites/tropic_desert.png 58 70 09 26 38 -5 5
-1 sprites/tropic_desert.png 106 70 09 20 37 -31 11
-1 sprites/tropic_desert.png 154 70 09 27 38 -31 -8
-1 sprites/tropic_desert.png 202 70 09 9 16 17 3
-1 sprites/tropic_desert.png 234 70 09 9 15 -7 22
-1 sprites/tropic_desert.png 266 70 09 9 16 -31 11
-1 sprites/tropic_desert.png 298 70 09 9 15 -6 -8
-1 sprites/tropic_desert.png 330 70 09 7 8 25 5
-1 sprites/tropic_desert.png 346 70 09 5 10 -4 27
-1 sprites/tropic_desert.png 364 70 09 7 8 -31 11
-1 sprites/tropic_desert.png 380 70 09 6 12 -5 -8
-1 sprites/tropic_desert.png 10 100 09 18 39 -6 0
-1 sprites/tropic_desert.png 58 100 09 11 38 -5 12
-1 sprites/tropic_desert.png 106 100 09 18 39 -31 5
-1 sprites/tropic_desert.png 154 100 09 11 40 -32 0
-1 sprites/tropic_desert.png 202 100 09 6 20 13 12
-1 sprites/tropic_desert.png 234 100 09 7 13 -5 16
-1 sprites/tropic_desert.png 266 100 09 6 20 -31 5
-1 sprites/tropic_desert.png 298 100 09 7 13 -6 0
-1 sprites/tropic_desert.png 330 100 09 4 8 26 13
-1 sprites/tropic_desert.png 346 100 09 3 12 -5 20
-1 sprites/tropic_desert.png 364 100 09 5 8 -31 6
-1 sprites/tropic_desert.png 380 100 09 4 15 -6 0
-1 sprites/tropic_desert.png 10 130 09 27 38 -5 -8
-1 sprites/tropic_desert.png 58 130 09 20 37 -4 11
-1 sprites/tropic_desert.png 106 130 09 26 37 -31 5
-1 sprites/tropic_desert.png 154 130 09 20 38 -31 -8
-1 sprites/tropic_desert.png 202 130 09 9 16 17 11
-1 sprites/tropic_desert.png 234 130 09 9 15 -6 22
-1 sprites/tropic_desert.png 266 130 09 9 16 -31 3
-1 sprites/tropic_desert.png 298 130 09 9 15 -7 -8
-1 sprites/tropic_desert.png 330 130 09 7 8 25 11
-1 sprites/tropic_desert.png 346 130 09 5 10 -4 26
-1 sprites/tropic_desert.png 364 130 09 7 8 -31 5
-1 sprites/tropic_desert.png 380 130 09 6 12 -5 -8
-1 * 7 02 05 40 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/tropic_forest.png 10 10 09 19 38 -5 0
-1 sprites/tropic_forest.png 58 10 09 18 38 -5 13
-1 sprites/tropic_forest.png 106 10 09 18 38 -31 13
-1 sprites/tropic_forest.png 154 10 09 19 38 -31 0
-1 sprites/tropic_forest.png 202 10 09 9 19 14 11
-1 sprites/tropic_forest.png 234 10 09 9 16 -7 22
-1 sprites/tropic_forest.png 266 10 09 9 19 -31 11
-1 sprites/tropic_forest.png 298 10 09 9 16 -7 0
-1 sprites/tropic_forest.png 330 10 09 6 8 25 13
-1 sprites/tropic_forest.png 346 10 09 4 12 -5 27
-1 sprites/tropic_forest.png 364 10 09 6 8 -31 13
-1 sprites/tropic_forest.png 380 10 09 5 12 -5 0
-1 sprites/tropic_forest.png 10 40 09 11 40 -7 0
-1 sprites/tropic_forest.png 58 40 09 18 39 -6 5
-1 sprites/tropic_forest.png 106 40 09 11 38 -31 12
-1 sprites/tropic_forest.png 154 40 09 18 39 -31 0
-1 sprites/tropic_forest.png 202 40 09 6 20 13 5
-1 sprites/tropic_forest.png 234 40 09 7 13 -6 16
-1 sprites/tropic_forest.png 266 40 09 6 20 -31 12
-1 sprites/tropic_forest.png 298 40 09 7 13 -5 0
-1 sprites/tropic_forest.png 330 40 09 5 8 25 6
-1 sprites/tropic_forest.png 346 40 09 3 12 -5 20
-1 sprites/tropic_forest.png 364 40 09 4 8 -31 13
-1 sprites/tropic_forest.png 380 40 09 4 15 -7 0
-1 sprites/tropic_forest.png 10 70 09 20 38 -5 -8
-1 sprites/tropic_forest.png 58 70 09 26 38 -5 5
-1 sprites/tropic_forest.png 106 70 09 20 37 -31 11
-1 sprites/tropic_forest.png 154 70 09 27 38 -31 -8
-1 sprites/tropic_forest.png 202 70 09 9 16 17 3
-1 sprites/tropic_forest.png 234 70 09 9 15 -7 22
-1 sprites/tropic_forest.png 266 70 09 9 16 -31 11
-1 sprites/tropic_forest.png 298 70 09 9 15 -6 -8
-1 sprites/tropic_forest.png 330 70 09 7 8 25 5
-1 sprites/tropic_forest.png 346 70 09 5 10 -4 27
-1 sprites/tropic_forest.png 364 70 09 7 8 -31 11
-1 sprites/tropic_forest.png 380 70 09 6 12 -5 -8
-1 sprites/tropic_forest.png 10 100 09 18 39 -6 0
-1 sprites/tropic_forest.png 58 100 09 11 38 -5 12
-1 sprites/tropic_forest.png 106 100 09 18 39 -31 5
-1 sprites/tropic_forest.png 154 100 09 11 40 -32 0
-1 sprites/tropic_forest.png 202 100 09 6 20 13 12
-1 sprites/tropic_forest.png 234 100 09 7 13 -5 16
-1 sprites/tropic_forest.png 266 100 09 6 20 -31 5
-1 sprites/tropic_forest.png 298 100 09 7 13 -6 0
-1 sprites/tropic_forest.png 330 100 09 4 8 26 13
-1 sprites/tropic_forest.png 346 100 09 3 12 -5 20
-1 sprites/tropic_forest.png 364 100 09 5 8 -31 6
-1 sprites/tropic_forest.png 380 100 09 4 15 -6 0
-1 sprites/tropic_forest.png 10 130 09 27 38 -5 -8
-1 sprites/tropic_forest.png 58 130 09 20 37 -4 11
-1 sprites/tropic_forest.png 106 130 09 26 37 -31 5
-1 sprites/tropic_forest.png 154 130 09 20 38 -31 -8
-1 sprites/tropic_forest.png 202 130 09 9 16 17 11
-1 sprites/tropic_forest.png 234 130 09 9 15 -6 22
-1 sprites/tropic_forest.png 266 130 09 9 16 -31 3
-1 sprites/tropic_forest.png 298 130 09 9 15 -7 -8
-1 sprites/tropic_forest.png 330 130 09 7 8 25 11
-1 sprites/tropic_forest.png 346 130 09 5 10 -4 26
-1 sprites/tropic_forest.png 364 130 09 7 8 -31 5
-1 sprites/tropic_forest.png 380 130 09 6 12 -5 -8
-1 * 7 02 05 41 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/tropic_desert.png 10 210 09 19 38 -5 0
-1 sprites/tropic_desert.png 58 210 09 18 38 -5 13
-1 sprites/tropic_desert.png 106 210 09 18 38 -31 13
-1 sprites/tropic_desert.png 154 210 09 19 38 -31 0
-1 sprites/tropic_desert.png 202 210 09 9 19 14 11
-1 sprites/tropic_desert.png 234 210 09 9 16 -7 22
-1 sprites/tropic_desert.png 266 210 09 9 19 -31 11
-1 sprites/tropic_desert.png 298 210 09 9 16 -7 0
-1 sprites/tropic_desert.png 330 210 09 6 8 25 13
-1 sprites/tropic_desert.png 346 210 09 4 12 -5 27
-1 sprites/tropic_desert.png 364 210 09 6 8 -31 13
-1 sprites/tropic_desert.png 380 210 09 5 12 -5 0
-1 sprites/tropic_desert.png 10 240 09 11 40 -7 0
-1 sprites/tropic_desert.png 58 240 09 18 39 -6 5
-1 sprites/tropic_desert.png 106 240 09 11 38 -31 12
-1 sprites/tropic_desert.png 154 240 09 18 39 -31 0
-1 sprites/tropic_desert.png 202 240 09 6 20 13 5
-1 sprites/tropic_desert.png 234 240 09 7 13 -6 16
-1 sprites/tropic_desert.png 266 240 09 6 20 -31 12
-1 sprites/tropic_desert.png 298 240 09 7 13 -5 0
-1 sprites/tropic_desert.png 330 240 09 5 8 25 6
-1 sprites/tropic_desert.png 346 240 09 3 12 -5 20
-1 sprites/tropic_desert.png 364 240 09 4 8 -31 13
-1 sprites/tropic_desert.png 380 240 09 4 15 -7 0
-1 sprites/tropic_desert.png 10 270 09 20 38 -5 -8
-1 sprites/tropic_desert.png 58 270 09 26 38 -5 5
-1 sprites/tropic_desert.png 106 270 09 20 37 -31 11
-1 sprites/tropic_desert.png 154 270 09 27 38 -31 -8
-1 sprites/tropic_desert.png 202 270 09 9 16 17 3
-1 sprites/tropic_desert.png 234 270 09 9 15 -7 22
-1 sprites/tropic_desert.png 266 270 09 9 16 -31 11
-1 sprites/tropic_desert.png 298 270 09 9 15 -6 -8
-1 sprites/tropic_desert.png 330 270 09 7 8 25 5
-1 sprites/tropic_desert.png 346 270 09 5 10 -4 27
-1 sprites/tropic_desert.png 364 270 09 7 8 -31 11
-1 sprites/tropic_desert.png 380 270 09 6 12 -5 -8
-1 sprites/tropic_desert.png 10 300 09 18 39 -6 0
-1 sprites/tropic_desert.png 58 300 09 11 38 -5 12
-1 sprites/tropic_desert.png 106 300 09 18 39 -31 5
-1 sprites/tropic_desert.png 154 300 09 11 40 -32 0
-1 sprites/tropic_desert.png 202 300 09 6 20 13 12
-1 sprites/tropic_desert.png 234 300 09 7 13 -5 16
-1 sprites/tropic_desert.png 266 300 09 6 20 -31 5
-1 sprites/tropic_desert.png 298 300 09 7 13 -6 0
-1 sprites/tropic_desert.png 330 300 09 4 8 26 13
-1 sprites/tropic_desert.png 346 300 09 3 12 -5 20
-1 sprites/tropic_desert.png 364 300 09 5 8 -31 6
-1 sprites/tropic_desert.png 380 300 09 4 15 -6 0
-1 sprites/tropic_desert.png 10 330 09 27 38 -5 -8
-1 sprites/tropic_desert.png 58 330 09 20 37 -4 11
-1 sprites/tropic_desert.png 106 330 09 26 37 -31 5
-1 sprites/tropic_desert.png 154 330 09 20 38 -31 -8
-1 sprites/tropic_desert.png 202 330 09 9 16 17 11
-1 sprites/tropic_desert.png 234 330 09 9 15 -6 22
-1 sprites/tropic_desert.png 266 330 09 9 16 -31 3
-1 sprites/tropic_desert.png 298 330 09 9 15 -7 -8
-1 sprites/tropic_desert.png 330 330 09 7 8 25 11
-1 sprites/tropic_desert.png 346 330 09 5 10 -4 26
-1 sprites/tropic_desert.png 364 330 09 7 8 -31 5
-1 sprites/tropic_desert.png 380 330 09 6 12 -5 -8
-1 * 7 02 05 42 01 00 00 00
-1 * 4 01 05 01 3C
-1 sprites/tropic_forest.png 10 210 09 19 38 -5 0
-1 sprites/tropic_forest.png 58 210 09 18 38 -5 13
-1 sprites/tropic_forest.png 106 210 09 18 38 -31 13
-1 sprites/tropic_forest.png 154 210 09 19 38 -31 0
-1 sprites/tropic_forest.png 202 210 09 9 19 14 11
-1 sprites/tropic_forest.png 234 210 09 9 16 -7 22
-1 sprites/tropic_forest.png 266 210 09 9 19 -31 11
-1 sprites/tropic_forest.png 298 210 09 9 16 -7 0
-1 sprites/tropic_forest.png 330 210 09 6 8 25 13
-1 sprites/tropic_forest.png 346 210 09 4 12 -5 27
-1 sprites/tropic_forest.png 364 210 09 6 8 -31 13
-1 sprites/tropic_forest.png 380 210 09 5 12 -5 0
-1 sprites/tropic_forest.png 10 240 09 11 40 -7 0
-1 sprites/tropic_forest.png 58 240 09 18 39 -6 5
-1 sprites/tropic_forest.png 106 240 09 11 38 -31 12
-1 sprites/tropic_forest.png 154 240 09 18 39 -31 0
-1 sprites/tropic_forest.png 202 240 09 6 20 13 5
-1 sprites/tropic_forest.png 234 240 09 7 13 -6 16
-1 sprites/tropic_forest.png 266 240 09 6 20 -31 12
-1 sprites/tropic_forest.png 298 240 09 7 13 -5 0
-1 sprites/tropic_forest.png 330 240 09 5 8 25 6
-1 sprites/tropic_forest.png 346 240 09 3 12 -5 20
-1 sprites/tropic_forest.png 364 240 09 4 8 -31 13
-1 sprites/tropic_forest.png 380 240 09 4 15 -7 0
-1 sprites/tropic_forest.png 10 270 09 20 38 -5 -8
-1 sprites/tropic_forest.png 58 270 09 26 38 -5 5
-1 sprites/tropic_forest.png 106 270 09 20 37 -31 11
-1 sprites/tropic_forest.png 154 270 09 27 38 -31 -8
-1 sprites/tropic_forest.png 202 270 09 9 16 17 3
-1 sprites/tropic_forest.png 234 270 09 9 15 -7 22
-1 sprites/tropic_forest.png 266 270 09 9 16 -31 11
-1 sprites/tropic_forest.png 298 270 09 9 15 -6 -8
-1 sprites/tropic_forest.png 330 270 09 7 8 25 5
-1 sprites/tropic_forest.png 346 270 09 5 10 -4 27
-1 sprites/tropic_forest.png 364 270 09 7 8 -31 11
-1 sprites/tropic_forest.png 380 270 09 6 12 -5 -8
-1 sprites/tropic_forest.png 10 300 09 18 39 -6 0
-1 sprites/tropic_forest.png 58 300 09 11 38 -5 12
-1 sprites/tropic_forest.png 106 300 09 18 39 -31 5
-1 sprites/tropic_forest.png 154 300 09 11 40 -32 0
-1 sprites/tropic_forest.png 202 300 09 6 20 13 12
-1 sprites/tropic_forest.png 234 300 09 7 13 -5 16
-1 sprites/tropic_forest.png 266 300 09 6 20 -31 5
-1 sprites/tropic_forest.png 298 300 09 7 13 -6 0
-1 sprites/tropic_forest.png 330 300 09 4 8 26 13
-1 sprites/tropic_forest.png 346 300 09 3 12 -5 20
-1 sprites/tropic_forest.png 364 300 09 5 8 -31 6
-1 sprites/tropic_forest.png 380 300 09 4 15 -6 0
-1 sprites/tropic_forest.png 10 330 09 27 38 -5 -8
-1 sprites/tropic_forest.png 58 330 09 20 37 -4 11
-1 sprites/tropic_forest.png 106 330 09 26 37 -31 5
-1 sprites/tropic_forest.png 154 330 09 20 38 -31 -8
-1 sprites/tropic_forest.png 202 330 09 9 16 17 11
-1 sprites/tropic_forest.png 234 330 09 9 15 -6 22
-1 sprites/tropic_forest.png 266 330 09 9 16 -31 3
-1 sprites/tropic_forest.png 298 330 09 9 15 -7 -8
-1 sprites/tropic_forest.png 330 330 09 7 8 25 11
-1 sprites/tropic_forest.png 346 330 09 5 10 -4 26
-1 sprites/tropic_forest.png 364 330 09 7 8 -31 5
-1 sprites/tropic_forest.png 380 330 09 6 12 -5 -8
-1 * 7 02 05 43 01 00 00 00
-1 * 14 02 05 44 81 81 00 FF 01 40 00 01 01 41 00
-1 * 14 02 05 45 81 81 00 FF 01 42 00 01 01 43 00
-1 * 14 02 05 46 81 80 00 FF 01 44 00 00 00 45 00
-1 * 6 07 83 01 \7! 02 01
-1 * 7 03 05 01 06 00 46 00

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View File

@@ -1,3 +1,45 @@
openttd (1.1.4-RC1) unstable; urgency=low
* New upstream release 1.1.4-RC1
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 20 Nov 2011 17:00:00 +0100
openttd (1.1.3) unstable; urgency=low
* New upstream release 1.1.3
-- Matthijs Kooijman <matthijs@stdin.nl> Thu, 15 Sep 2011 21:00:00 +0200
openttd (1.1.3-RC1) unstable; urgency=low
* New upstream release 1.1.3-RC1
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 04 Sep 2011 17:00:00 +0200
openttd (1.1.2) unstable; urgency=low
* New upstream release 1.1.2
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 14 Aug 2011 17:00:00 +0200
openttd (1.1.2~RC2) unstable; urgency=low
* New upstream release 1.1.2-RC2
-- Matthijs Kooijman <matthijs@stdin.nl> Sat, 30 Jul 2011 21:00:00 +0200
openttd (1.1.2~RC1) unstable; urgency=low
* New upstream release 1.1.2-RC1
-- Matthijs Kooijman <matthijs@stdin.nl> Sun, 24 Jul 2011 21:00:00 +0200
openttd (1.1.1) unstable; urgency=low
* New upstream release 1.1.1
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Jun 2011 00:00:00 +0200
openttd (1.1.1~RC1) unstable; urgency=low openttd (1.1.1~RC1) unstable; urgency=low
* New upstream release 1.1.1-RC1 * New upstream release 1.1.1-RC1

View File

@@ -1,6 +1,6 @@
@echo off @echo off
set OPENTTD_VERSION=1.1.1-RC1 set OPENTTD_VERSION=1.1.4-RC1
set OPENSFX_VERSION=0.8.0 set OPENSFX_VERSION=0.8.0
set NOSOUND_VERSION=0.8.0 set NOSOUND_VERSION=0.8.0
set OPENGFX_VERSION=0.7.0 set OPENGFX_VERSION=0.7.0

View File

@@ -2,7 +2,7 @@
%define binname openttd %define binname openttd
%define srcver 1.1.1 %define srcver 1.1.4
%if %{dedicated} %if %{dedicated}
Name: %{binname}-dedicated Name: %{binname}-dedicated

View File

@@ -1,7 +1,7 @@
# Version numbers to update # Version numbers to update
!define APPV_MAJOR 1 !define APPV_MAJOR 1
!define APPV_MINOR 1 !define APPV_MINOR 1
!define APPV_MAINT 1 !define APPV_MAINT 4
!define APPV_BUILD 0 !define APPV_BUILD 0
!define APPV_EXTRA "-RC1" !define APPV_EXTRA "-RC1"
@@ -57,6 +57,7 @@ Var CDDRIVE
; Modern interface settings ; Modern interface settings
!include "MUI2.nsh" !include "MUI2.nsh"
!include "InstallOptions.nsh" !include "InstallOptions.nsh"
!include "WinVer.nsh"
!define MUI_ABORTWARNING !define MUI_ABORTWARNING
!define MUI_WELCOMEPAGE_TITLE_3LINES !define MUI_WELCOMEPAGE_TITLE_3LINES
@@ -518,17 +519,17 @@ hasCD:
FunctionEnd FunctionEnd
;------------------------------------------------------------------------------- ;-------------------------------------------------------------------------------
; Determine windows version, returns "win9x" if Win9x/Me or "winnt" on the stack ; Determine windows version, returns "win9x" if Win9x/Me/2000/XP SP2- or "winnt" for the rest on the stack
Function GetWindowsVersion Function GetWindowsVersion
ClearErrors ClearErrors
StrCpy $R0 "winnt"
GetVersion::WindowsPlatformId
Pop $R0
IntCmp $R0 2 WinNT 0
StrCpy $R0 "win9x" StrCpy $R0 "win9x"
WinNT: ${If} ${IsNT}
ClearErrors ${If} ${IsWinXP}
${AndIf} ${AtLeastServicePack} 3
${OrIf} ${AtLeastWin2003}
StrCpy $R0 "winnt"
${EndIf}
${EndIf}
Push $R0 Push $R0
FunctionEnd FunctionEnd
@@ -540,12 +541,12 @@ Function CheckProcessorArchitecture
IntCmp $R0 64 Win64 0 IntCmp $R0 64 Win64 0
ClearErrors ClearErrors
IntCmp ${APPBITS} 64 0 Done IntCmp ${APPBITS} 64 0 Done
MessageBox MB_OKCANCEL|MB_ICONSTOP "You are trying to install the 64-bit OpenTTD on a 32-bit operating system. This is not going to work. Please download the correct version. Do you really want to continue?" IDOK Done IDCANCEL Abort MessageBox MB_YESNO|MB_ICONSTOP "You are trying to install the 64-bit OpenTTD on a 32-bit operating system. This is not going to work. Please download the correct version. Do you really want to continue?" IDYES Done IDNO Abort
GoTo Done GoTo Done
Win64: Win64:
ClearErrors ClearErrors
IntCmp ${APPBITS} 64 Done 0 IntCmp ${APPBITS} 64 Done 0
MessageBox MB_OKCANCEL|MB_ICONINFORMATION "You are trying to install the 32-bit OpenTTD on a 64-bit operating system. This is not advised, but will work with reduced capabilities. We suggest that you download the correct version. Do you really want to continue?" IDOK Done IDCANCEL Abort MessageBox MB_YESNO|MB_ICONINFORMATION "You are trying to install the 32-bit OpenTTD on a 64-bit operating system. This is not advised, but will work with reduced capabilities. We suggest that you download the correct version. Do you really want to continue?" IDYES Done IDNO Abort
GoTo Done GoTo Done
Abort: Abort:
Quit Quit
@@ -560,12 +561,12 @@ Function CheckWindowsVersion
StrCmp $R0 "win9x" 0 WinNT StrCmp $R0 "win9x" 0 WinNT
ClearErrors ClearErrors
StrCmp ${APPARCH} "win9x" Done 0 StrCmp ${APPARCH} "win9x" Done 0
MessageBox MB_OKCANCEL|MB_ICONSTOP "You are trying to install the Windows 2000, XP and Vista version on Windows 95, 98 or ME. This is will not work. Please download the correct version. Do you really want to continue?" IDOK Done IDCANCEL Abort MessageBox MB_YESNO|MB_ICONSTOP "You are trying to install the Windows XP SP3, Vista and 7 version on Windows 95, 98, ME, 2000 and XP without SP3. This is will not work. Please download the correct version. Do you really want to continue?" IDYES Done IDNO Abort
GoTo Done GoTo Done
WinNT: WinNT:
ClearErrors ClearErrors
StrCmp ${APPARCH} "win9x" 0 Done StrCmp ${APPARCH} "win9x" 0 Done
MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION "You are trying to install the Windows 95, 98 and ME version on Windows 2000, XP or Vista. This is not advised, but will work with reduced capabilities. We suggest that you download the correct version. Do you really want to continue?" IDOK Done IDCANCEL Abort MessageBox MB_YESNO|MB_ICONEXCLAMATION "You are trying to install the Windows 95, 98, 2000 and XP without SP3 version on Windows XP SP3, Vista or 7. This is not advised, but will work with reduced capabilities. We suggest that you download the correct version. Do you really want to continue?" IDYES Done IDNO Abort
Abort: Abort:
Quit Quit
Done: Done:
@@ -674,8 +675,7 @@ WelcomeToSetup:
ReadRegStr $OLDVERSION HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "DisplayVersion" ReadRegStr $OLDVERSION HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "DisplayVersion"
; Gets the older version then displays it in a message box ; Gets the older version then displays it in a message box
MessageBox MB_OK|MB_ICONINFORMATION \ MessageBox MB_OK|MB_ICONINFORMATION \
"Welcome to ${APPNAMEANDVERSION} Setup.$\n \ "Welcome to ${APPNAMEANDVERSION} Setup.$\nThis will allow you to upgrade from version $OLDVERSION."
This will allow you to upgrade from version $OLDVERSION."
SectionSetFlags ${Section2} 0x80 ; set bit 7 SectionSetFlags ${Section2} 0x80 ; set bit 7
SectionSetFlags ${Section3} 0x80 ; set bit 7 SectionSetFlags ${Section3} 0x80 ; set bit 7
SectionSetFlags ${Section4} 0x80 ; set bit 7 SectionSetFlags ${Section4} 0x80 ; set bit 7
@@ -686,8 +686,7 @@ VersionsAreEqual:
ReadRegStr $UninstallString HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "UninstallString" ReadRegStr $UninstallString HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\OpenTTD" "UninstallString"
IfFileExists "$UninstallString" "" FinishCallback IfFileExists "$UninstallString" "" FinishCallback
MessageBox MB_YESNO|MB_ICONQUESTION \ MessageBox MB_YESNO|MB_ICONQUESTION \
"Setup detected ${APPNAMEANDVERSION} on your system. This is the same version that this program will install.$\n \ "Setup detected ${APPNAMEANDVERSION} on your system. This is the same version that this program will install.$\nAre you trying to uninstall it?" \
Are you trying to uninstall it?" \
IDYES DoUninstall IDNO FinishCallback IDYES DoUninstall IDNO FinishCallback
DoUninstall: ; You have the same version as this installer. This allows you to uninstall. DoUninstall: ; You have the same version as this installer. This allows you to uninstall.
Exec "$UninstallString" Exec "$UninstallString"
@@ -695,8 +694,7 @@ DoUninstall: ; You have the same version as this installer. This allows you to
InstallerIsOlder: InstallerIsOlder:
MessageBox MB_OK|MB_ICONSTOP \ MessageBox MB_OK|MB_ICONSTOP \
"You have a newer version of ${APPNAME}.$\n \ "You have a newer version of ${APPNAME}.$\nSetup will now exit."
Setup will now exit."
Quit Quit
FinishCallback: FinishCallback:

View File

@@ -1,5 +1,5 @@
!define APPBITS 32 ; Define number of bits for the architecture !define APPBITS 32 ; Define number of bits for the architecture
!define EXTRA_VERSION "2000, XP, Vista and 7" !define EXTRA_VERSION "XP SP3, Vista and 7"
!define APPARCH "win32" ; Define the application architecture !define APPARCH "win32" ; Define the application architecture
!define BINARY_DIR "${PATH_ROOT}objs\win32\Release" !define BINARY_DIR "${PATH_ROOT}objs\win32\Release"
InstallDir "$PROGRAMFILES32\OpenTTD\" InstallDir "$PROGRAMFILES32\OpenTTD\"

View File

@@ -1,5 +1,5 @@
!define APPBITS 32 ; Define number of bits for the architecture !define APPBITS 32 ; Define number of bits for the architecture
!define EXTRA_VERSION "95, 98 and ME" !define EXTRA_VERSION "95, 98, ME, 2000 and XP without SP3"
!define APPARCH "win9x" ; Define the application architecture !define APPARCH "win9x" ; Define the application architecture
!define BINARY_DIR "${PATH_ROOT}bin" !define BINARY_DIR "${PATH_ROOT}bin"
InstallDir "$PROGRAMFILES32\OpenTTD\" InstallDir "$PROGRAMFILES32\OpenTTD\"

View File

@@ -1,6 +1,6 @@
OpenTTD readme OpenTTD readme
Last updated: 2011-05-15 Last updated: 2011-11-20
Release version: 1.1.1-RC1 Release version: 1.1.4-RC1
------------------------------------------------------------------------ ------------------------------------------------------------------------
@@ -249,9 +249,12 @@ wait for an error message to pop up. The error message will tell you
4.2) OpenTTD directories 4.2) OpenTTD directories
---- ------------------- ---- -------------------
The required 3rd party files listed in the section 4.1 "(Required) 3rd party files" OpenTTD uses its own directory to store its required 3rd party base set files (see section
as well as other non-compulsory extensions (NewGRFs, AI, heightmaps, scenarios) can be 4.1 "Required 3rd party files") and non-compulsory extension and configuration files. See
placed in a few different locations: below for their proper place within this OpenTTD main data directory.
The main OpenTTD directories can be found in various locations, depending on your operating
system:
1. The current working directory (from where you started OpenTTD) 1. The current working directory (from where you started OpenTTD)
For non-Windows operating systems OpenTTD will not scan for files in this For non-Windows operating systems OpenTTD will not scan for files in this
directory if it is your personal directory, i.e. "~/", or when it is the directory if it is your personal directory, i.e. "~/", or when it is the
@@ -273,7 +276,26 @@ placed in a few different locations:
5. The installation directory (Linux only) 5. The installation directory (Linux only)
Linux: /usr/share/games/openttd Linux: /usr/share/games/openttd
6. The application bundle (Mac OSX only) 6. The application bundle (Mac OSX only)
It includes the OpenTTD files (grf+lng) and it will work as long as they aren't touched It includes the OpenTTD files (grf+lng) and it will work as long as they aren't
touched
Different types of data or extensions go into different subdirectories of the chosen main
OpenTTD directory:
Config File: (no subdirectory)
Screenshots: (no subdirectory)
Base Graphics: data (or a subdirectory thereof)
Sound Sets: data (or a subdirectory thereof)
NewGRFs: data (or a subdirectory thereof)
32bpp Sets: data (or a subdirectory thereof)
Music Sets: gm (or a subdirectory thereof)
AIs: ai (or a subdirectory thereof)
AI Libraries: ai/libraries (or a subdirectory thereof)
Savegames: save
Automatic Savegames: save/autosave
Scenarios: scenario
The (automatically created) directory content_download is for OpenTTD's internal use and
no files should be added to it or its subdirectories manually.
Notes: Notes:
- Linux in the previous list means .deb, but most paths should be similar for others. - Linux in the previous list means .deb, but most paths should be similar for others.
@@ -357,7 +379,7 @@ OpenTTD in debug mode.
The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like The configuration file for OpenTTD (openttd.cfg) is in a simple Windows-like
.INI format. It's mostly undocumented. Almost all settings can be changed .INI format. It's mostly undocumented. Almost all settings can be changed
ingame by using the 'Advanced Settings' window. ingame by using the 'Advanced Settings' window.
When you can not find openttd.cfg you should look in the directories as When you cannot find openttd.cfg you should look in the directories as
described in section 4.2. If you do not have an openttd.cfg OpenTTD will described in section 4.2. If you do not have an openttd.cfg OpenTTD will
create one after closing. create one after closing.
@@ -419,7 +441,8 @@ DOS:
---- --------------------------- ---- ---------------------------
The following libraries are used by OpenTTD for: The following libraries are used by OpenTTD for:
- libSDL/liballegro: hardware access (video, sound, mouse) - libSDL/liballegro: hardware access (video, sound, mouse)
- zlib: (de)compressing of old (0.3.0-1.0.5) savegames, content downloads, heightmaps - zlib: (de)compressing of old (0.3.0-1.0.5) savegames, content downloads,
heightmaps
- liblzo2: (de)compressing of old (pre 0.3.0) savegames - liblzo2: (de)compressing of old (pre 0.3.0) savegames
- liblzma: (de)compressing of savegames (1.1.0 and later) - liblzma: (de)compressing of savegames (1.1.0 and later)
- libpng: making screenshots and loading heightmaps - libpng: making screenshots and loading heightmaps
@@ -447,7 +470,8 @@ The following compilers are known to compile OpenTTD:
Version 2005 gives bogus warnings about scoping issues. Version 2005 gives bogus warnings about scoping issues.
- GNU Compiler Collection (GCC) 3.3 - 4.7. - GNU Compiler Collection (GCC) 3.3 - 4.7.
Versions 4.1 and earlier give bogus warnings about uninitialised variables. Versions 4.1 and earlier give bogus warnings about uninitialised variables.
Versions 4.4 and later give bogus warnings about freeing non-heap objects. Versions 4.4 - 4.6 give bogus warnings about freeing non-heap objects.
Versions 4.5 and later give invalid warnings when lto is enabled.
- Intel C++ Compiler (ICC) 12.0. - Intel C++ Compiler (ICC) 12.0.
The following compilers are known not to compile OpenTTD: The following compilers are known not to compile OpenTTD:
@@ -455,7 +479,8 @@ The following compilers are known not to compile OpenTTD:
- GNU Compiler Collection (GCC) 3.2 and earlier. - GNU Compiler Collection (GCC) 3.2 and earlier.
These old versions fail due to OpenTTD's template usage. These old versions fail due to OpenTTD's template usage.
- Intel C++ Compiler (ICC) 11.1 and earlier. - Intel C++ Compiler (ICC) 11.1 and earlier.
Version 10.0 and earlier fail a configure check and fail with recent system headers. Version 10.0 and earlier fail a configure check and fail with recent system
headers.
Version 10.1 fails to compile station_gui.cpp. Version 10.1 fails to compile station_gui.cpp.
Version 11.1 fails with internal error when compiling network.cpp. Version 11.1 fails with internal error when compiling network.cpp.
- Clang/LLVM 2.8 and earlier. - Clang/LLVM 2.8 and earlier.
@@ -542,66 +567,76 @@ Under Windows 98 and lower it is impossible to use a dedicated server; it will
fail to start. Perhaps this is for the better because those OSes are not known fail to start. Perhaps this is for the better because those OSes are not known
for their stability. for their stability.
With the added support for font-based text selecting a non-latin language will With the added support for font-based text selecting a non-latin language can
result in garbage (lots of '?') shown on screen. Please open your configuration result in lots of question marks ('?') being shown on screen. Please open your
file and add a desired font for small/medium/-and large_font. This can be a font configuration file (openttd.cfg - see Section 4.2 for where to find it)
name like "Tahoma" or a path to a font. and add a suitable font for the small, medium and / or large font, e.g.:
small_font = "Tahoma"
medium_font = "Tahoma"
large_font = "Tahoma"
You should use a font name like "Tahoma" or a path to the desired font.
Any NewGRF file used in a game is stored inside the savegame and will refuse Any NewGRF file used in a game is stored inside the savegame and will refuse
to load if you don't have that NewGRF file available. A list of missing files to load if you don't have that NewGRF file available. A list of missing files
will be output to the console at the moment, so use the '-d' flag (on windows) can be viewed in the NewGRF window accessible from the file load dialogue window.
to see this list. You just have to find the files (http://grfcrawler.tt-forums.net/)
put them in the data/ folder and you're set to go. You can try to obtain the missing files from that NewGRF dialogue or - if they
are not available online - you can search manually through our forum's graphics
development section (http://www.tt-forums.net/viewforum.php?f=66) or GrfCrawler
(http://grfcrawler.tt-forums.net/). Put the NewGRF files in OpenTTD's data folder
(see section 4.2 "OpenTTD directories") and rescan the list of available NewGRFs.
Once you have all missing files, you are set to go.
X.X) Credits X.X) Credits
---- ------- ---- -------
The OpenTTD team (in alphabetical order): The OpenTTD team (in alphabetical order):
Albert Hofkamp (Alberth) - GUI expert Albert Hofkamp (Alberth) - GUI expert
Jean-François Claeys (Belugas) - GUI, newindustries and more Jean-François Claeys (Belugas) - GUI, newindustries and more
Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework
Christoph Elsenhans (frosch) - General coding Christoph Elsenhans (frosch) - General coding
Loïc Guilloux (glx) - Windows Expert Loïc Guilloux (glx) - Windows Expert
Michael Lutz (michi_cc) - Path based signals Michael Lutz (michi_cc) - Path based signals
Owen Rudge (orudge) - Forum host, OS/2 port Owen Rudge (orudge) - Forum host, OS/2 port
Peter Nelson (peter1138) - Spiritual descendant from newGRF gods Peter Nelson (peter1138) - Spiritual descendant from newGRF gods
Ingo von Borstel (planetmaker) - Support Ingo von Borstel (planetmaker) - Support
Remko Bijker (Rubidium) - Lead coder and way more Remko Bijker (Rubidium) - Lead coder and way more
Zdeněk Sojka (SmatZ) - Bug finder and fixer Zdeněk Sojka (SmatZ) - Bug finder and fixer
José Soler (Terkhen) - General coding José Soler (Terkhen) - General coding
Thijs Marinussen (Yexo) - AI Framework Thijs Marinussen (Yexo) - AI Framework
Inactive Developers: Inactive Developers:
Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles Bjarni Corfitzen (Bjarni) - MacOSX port, coder and vehicles
Victor Fischer (Celestar) - Programming everywhere you need him to Victor Fischer (Celestar) - Programming everywhere you need him to
Tamás Faragó (Darkvater) - Ex-Lead coder Tamás Faragó (Darkvater) - Ex-Lead coder
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;) Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
Attila Bán (MiHaMiX) - WebTranslator 1 and 2 Attila Bán (MiHaMiX) - WebTranslator 1 and 2
Christoph Mallon (Tron) - Programmer, code correctness police Christoph Mallon (Tron) - Programmer, code correctness police
Retired Developers: Retired Developers:
Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3) Ludvig Strigeus (ludde) - OpenTTD author, main coder (0.1 - 0.3.3)
Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3) Serge Paquet (vurlix) - Assistant project manager, coder (0.1 - 0.3.3)
Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3.0 - 0.3.6) Dominik Scherer (dominik81) - Lead programmer, GUI expert (0.3.0 - 0.3.6)
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
Patric Stout (TrueLight) - Programmer (0.3 - pre0.7), sys op (active) Patric Stout (TrueLight) - Programmer (0.3 - pre0.7), sys op (active)
Thanks to: Thanks to:
Josef Drexler - For his great work on TTDPatch. Josef Drexler - For his great work on TTDPatch.
Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and graphics (signals and track foundations) Marcin Grzegorczyk - For his TTDPatch work and documentation of Transport Tycoon Deluxe internals and graphics (signals and track foundations)
Petr Baudiš (pasky) - Many patches, newgrf support, etc. Petr Baudiš (pasky) - Many patches, newgrf support, etc.
Simon Sasburg (HackyKid) - For the many bugfixes he has blessed us with Simon Sasburg (HackyKid) - For the many bugfixes he has blessed us with
Stefan Meißner (sign_de) - For his work on the console Stefan Meißner (sign_de) - For his work on the console
Mike Ragsdale - OpenTTD installer Mike Ragsdale - OpenTTD installer
Cian Duffy (MYOB) - BeOS port / manual writing Cian Duffy (MYOB) - BeOS port / manual writing
Christian Rosentreter (tokai) - MorphOS / AmigaOS port Christian Rosentreter (tokai) - MorphOS / AmigaOS port
Richard Kempton (RichK67) - Additional airports, initial TGP implementation Richard Kempton (RichK67) - Additional airports, initial TGP implementation
Alberto Demichelis - Squirrel scripting language Alberto Demichelis - Squirrel scripting language
L. Peter Deutsch - MD5 implementation L. Peter Deutsch - MD5 implementation
Michael Blunck - For revolutionizing TTD with awesome graphics Michael Blunck - For revolutionizing TTD with awesome graphics
George - Canal graphics George - Canal graphics
David Dallaston (Pikka) - Tram tracks Andrew Parkhouse (andythenorth) - River graphics
All Translators - For their support to make OpenTTD a truly international game David Dallaston (Pikka) - Tram tracks
Bug Reporters - Thanks for all bug reports All Translators - For their support to make OpenTTD a truly international game
Chris Sawyer - For an amazing game! Bug Reporters - Thanks for all bug reports
Chris Sawyer - For an amazing game!

View File

@@ -54,6 +54,10 @@ extern "C" {
typedef __int64 SQInteger; typedef __int64 SQInteger;
typedef unsigned __int64 SQUnsignedInteger; typedef unsigned __int64 SQUnsignedInteger;
typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/ typedef unsigned __int64 SQHash; /*should be the same size of a pointer*/
#elif defined(_WIN32)
typedef long long SQInteger;
typedef unsigned long long SQUnsignedInteger;
typedef unsigned long long SQHash; /*should be the same size of a pointer*/
#else #else
typedef long SQInteger; typedef long SQInteger;
typedef unsigned long SQUnsignedInteger; typedef unsigned long SQUnsignedInteger;
@@ -77,6 +81,8 @@ typedef float SQFloat;
#if defined(SQUSEDOUBLE) && !defined(_SQ64) #if defined(SQUSEDOUBLE) && !defined(_SQ64)
#ifdef _MSC_VER #ifdef _MSC_VER
typedef __int64 SQRawObjectVal; //must be 64bits typedef __int64 SQRawObjectVal; //must be 64bits
#elif defined(_WIN32)
typedef long long SQRawObjectVal; //must be 64bits
#else #else
typedef long SQRawObjectVal; //must be 64bits typedef long SQRawObjectVal; //must be 64bits
#endif #endif

View File

@@ -1,6 +1,9 @@
/* /*
see copyright notice in squirrel.h see copyright notice in squirrel.h
*/ */
/* Needs to be first due to a squirrel header defining type() and type()
* being used in some versions of the headers included by algorithm. */
#include <algorithm>
#include "sqpcheader.h" #include "sqpcheader.h"
#include "sqvm.h" #include "sqvm.h"
#include "sqstring.h" #include "sqstring.h"
@@ -484,7 +487,7 @@ static SQInteger array_resize(HSQUIRRELVM v)
//QSORT ala Sedgewick //QSORT ala Sedgewick
bool _qsort_compare(HSQUIRRELVM v,SQObjectPtr &arr,SQObjectPtr &a,SQObjectPtr &b,SQInteger func,SQInteger &ret) bool _qsort_compare(HSQUIRRELVM v,SQObjectPtr &arr,const SQObjectPtr &a,const SQObjectPtr &b,SQInteger func,SQInteger &ret)
{ {
if(func < 0) { if(func < 0) {
if(!v->ObjCmp(a,b,ret)) return false; if(!v->ObjCmp(a,b,ret)) return false;
@@ -506,40 +509,26 @@ bool _qsort_compare(HSQUIRRELVM v,SQObjectPtr &arr,SQObjectPtr &a,SQObjectPtr &b
} }
return true; return true;
} }
//QSORT ala Sedgewick struct qsort_cmp
bool _qsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger l, SQInteger r,SQInteger func)
{ {
SQInteger i, j; HSQUIRRELVM v;
SQArray *a=_array(arr); SQInteger func;
SQObjectPtr pivot,t; bool operator() (const SQObjectPtr &a, const SQObjectPtr &b) const
if( l < r ){ {
pivot = a->_values[l]; SQInteger res;
i = l; j = r+1; SQObjectPtr dummy;
while(1){ if (!_qsort_compare(v, dummy, a, b, func, res)) return false;
SQInteger ret; return res < 0;
do {
++i;
if(i > r) break;
if(!_qsort_compare(v,arr,a->_values[i],pivot,func,ret))
return false;
} while( ret <= 0);
do {
--j;
if ( j < 0 ) {
v->Raise_Error( _SC("Invalid qsort, probably compare function defect") );
return false;
}
if(!_qsort_compare(v,arr,a->_values[j],pivot,func,ret))
return false;
}
while( ret > 0 );
if( i >= j ) break;
t = a->_values[i]; a->_values[i] = a->_values[j]; a->_values[j] = t;
}
t = a->_values[l]; a->_values[l] = a->_values[j]; a->_values[j] = t;
if(!_qsort( v, arr, l, j-1,func)) return false;
if(!_qsort( v, arr, j+1, r,func)) return false;
} }
};
bool _qsort(HSQUIRRELVM v,SQObjectPtr &arr, SQInteger func)
{
SQArray *a=_array(arr);
qsort_cmp cur_cmp;
cur_cmp.v = v;
cur_cmp.func = func;
std::sort(a->_values._vals, a->_values._vals + a->Size(), cur_cmp);
return true; return true;
} }
@@ -550,7 +539,7 @@ static SQInteger array_sort(HSQUIRRELVM v)
SQObject &funcobj = stack_get(v,2); SQObject &funcobj = stack_get(v,2);
if(_array(o)->Size() > 1) { if(_array(o)->Size() > 1) {
if(type(funcobj) == OT_CLOSURE || type(funcobj) == OT_NATIVECLOSURE) func = 2; if(type(funcobj) == OT_CLOSURE || type(funcobj) == OT_NATIVECLOSURE) func = 2;
if(!_qsort(v, o, 0, _array(o)->Size()-1, func)) if(!_qsort(v, o, func))
return SQ_ERROR; return SQ_ERROR;
} }

View File

@@ -75,9 +75,9 @@ AIInfo *AIConfig::GetInfo() const
return this->info; return this->info;
} }
bool AIConfig::ResetInfo() bool AIConfig::ResetInfo(bool force_exact_match)
{ {
this->info = AI::FindInfo(this->name, -1, false); this->info = AI::FindInfo(this->name, force_exact_match ? this->version : -1, force_exact_match);
return this->info != NULL; return this->info != NULL;
} }

View File

@@ -57,10 +57,12 @@ public:
/** /**
* When ever the AI Scanner is reloaded, all infos become invalid. This * When ever the AI Scanner is reloaded, all infos become invalid. This
* function tells AIConfig about this. * function tells AIConfig about this.
* @param force_exact_match If true try to find the exact same version
* as specified. If false any version is ok.
* @return \c true if the reset was successful, \c false if the AI was no longer * @return \c true if the reset was successful, \c false if the AI was no longer
* found. * found.
*/ */
bool ResetInfo(); bool ResetInfo(bool force_exact_match);
/** /**
* Get the AIInfo linked to this AIConfig. * Get the AIInfo linked to this AIConfig.

View File

@@ -170,13 +170,24 @@
* a random new AI on reload). */ * a random new AI on reload). */
for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) { for (CompanyID c = COMPANY_FIRST; c < MAX_COMPANIES; c++) {
if (_settings_game.ai_config[c] != NULL && _settings_game.ai_config[c]->HasAI()) { if (_settings_game.ai_config[c] != NULL && _settings_game.ai_config[c]->HasAI()) {
if (!_settings_game.ai_config[c]->ResetInfo()) { if (!_settings_game.ai_config[c]->ResetInfo(true)) {
DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_game.ai_config[c]->GetName()); DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_game.ai_config[c]->GetName());
_settings_game.ai_config[c]->ChangeAI(NULL); _settings_game.ai_config[c]->ChangeAI(NULL);
if (Company::IsValidAiID(c)) {
/* The code belonging to an already running AI was deleted. We can only do
* one thing here to keep everything sane and that is kill the AI. After
* killing the offending AI we start a random other one in it's place, just
* like what would happen if the AI was missing during loading. */
AI::Stop(c);
AI::StartNew(c, false);
}
} else if (Company::IsValidAiID(c)) {
/* Update the reference in the Company struct. */
Company::Get(c)->ai_info = _settings_game.ai_config[c]->GetInfo();
} }
} }
if (_settings_newgame.ai_config[c] != NULL && _settings_newgame.ai_config[c]->HasAI()) { if (_settings_newgame.ai_config[c] != NULL && _settings_newgame.ai_config[c]->HasAI()) {
if (!_settings_newgame.ai_config[c]->ResetInfo()) { if (!_settings_newgame.ai_config[c]->ResetInfo(false)) {
DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_newgame.ai_config[c]->GetName()); DEBUG(ai, 0, "After a reload, the AI by the name '%s' was no longer found, and removed from the list.", _settings_newgame.ai_config[c]->GetName());
_settings_newgame.ai_config[c]->ChangeAI(NULL); _settings_newgame.ai_config[c]->ChangeAI(NULL);
} }

View File

@@ -374,6 +374,7 @@ struct AISettingsWindow : public Window {
/* One of the arrows is clicked (or green/red rect in case of bool value) */ /* One of the arrows is clicked (or green/red rect in case of bool value) */
if (IsInsideMM(x, 0, 21)) { if (IsInsideMM(x, 0, 21)) {
int new_val = this->ai_config->GetSetting(config_item.name); int new_val = this->ai_config->GetSetting(config_item.name);
int old_val = new_val;
if (bool_item) { if (bool_item) {
new_val = !new_val; new_val = !new_val;
} else if (x >= 10) { } else if (x >= 10) {
@@ -388,18 +389,19 @@ struct AISettingsWindow : public Window {
this->clicked_increase = false; this->clicked_increase = false;
} }
this->ai_config->SetSetting(config_item.name, new_val); if (new_val != old_val) {
this->clicked_button = num; this->ai_config->SetSetting(config_item.name, new_val);
this->timeout = 5; this->clicked_button = num;
this->timeout = 5;
this->CheckDifficultyLevel(); this->CheckDifficultyLevel();
}
} else if (!bool_item) { } else if (!bool_item) {
/* Display a query box so users can enter a custom value. */ /* Display a query box so users can enter a custom value. */
this->clicked_row = num; this->clicked_row = num;
SetDParam(0, this->ai_config->GetSetting(config_item.name)); SetDParam(0, this->ai_config->GetSetting(config_item.name));
ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, 100, this, CS_NUMERAL, QSF_NONE); ShowQueryString(STR_JUST_INT, STR_CONFIG_SETTING_QUERY_CAPTION, 10, 100, this, CS_NUMERAL, QSF_NONE);
} }
this->SetDirty(); this->SetDirty();
break; break;
} }
@@ -1000,7 +1002,7 @@ struct AIDebugWindow : public QueryStringBaseWindow {
switch (widget) { switch (widget) {
case AID_WIDGET_RELOAD_TOGGLE: case AID_WIDGET_RELOAD_TOGGLE:
/* First kill the company of the AI, then start a new one. This should start the current AI again */ /* First kill the company of the AI, then start a new one. This should start the current AI again */
DoCommandP(0, 2 | ai_debug_company << 16, 0, CMD_COMPANY_CTRL); DoCommandP(0, 2 | ai_debug_company << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
DoCommandP(0, 1 | ai_debug_company << 16, 0, CMD_COMPANY_CTRL); DoCommandP(0, 1 | ai_debug_company << 16, 0, CMD_COMPANY_CTRL);
break; break;

View File

@@ -206,7 +206,7 @@ EXPAND_ONLY_PREDEF = YES
SEARCH_INCLUDES = YES SEARCH_INCLUDES = YES
INCLUDE_PATH = INCLUDE_PATH =
INCLUDE_FILE_PATTERNS = INCLUDE_FILE_PATTERNS =
PREDEFINED = DOXYGEN_SKIP PREDEFINED = DOXYGEN_AI_DOCS
EXPAND_AS_DEFINED = DEF_COMMAND EXPAND_AS_DEFINED = DEF_COMMAND
SKIP_FUNCTION_MACROS = YES SKIP_FUNCTION_MACROS = YES
#--------------------------------------------------------------------------- #---------------------------------------------------------------------------

View File

@@ -131,7 +131,7 @@
extern uint8 GetAirportNoiseLevelForTown(const AirportSpec *as, TileIndex town_tile, TileIndex tile); extern uint8 GetAirportNoiseLevelForTown(const AirportSpec *as, TileIndex town_tile, TileIndex tile);
if (!::IsValidTile(tile)) return -1; if (!::IsValidTile(tile)) return -1;
if (!IsValidAirportType(type)) return -1; if (!IsAirportInformationAvailable(type)) return -1;
if (_settings_game.economy.station_noise_level) { if (_settings_game.economy.station_noise_level) {
const AirportSpec *as = ::AirportSpec::Get(type); const AirportSpec *as = ::AirportSpec::Get(type);

View File

@@ -180,6 +180,7 @@ public:
* built at this tile. * built at this tile.
* @param tile The tile to check. * @param tile The tile to check.
* @param type The AirportType to check. * @param type The AirportType to check.
* @pre IsAirportInformationAvailable(type).
* @return The amount of noise added to the nearest town. * @return The amount of noise added to the nearest town.
* @note The noise will be added to the town with TownID GetNearestTown(tile, type). * @note The noise will be added to the town with TownID GetNearestTown(tile, type).
*/ */

View File

@@ -109,7 +109,7 @@ public:
*/ */
static int32 GetMinLength(BridgeID bridge_id); static int32 GetMinLength(BridgeID bridge_id);
#ifndef DOXYGEN_SKIP #ifndef DOXYGEN_AI_DOCS
/** /**
* Internal function to help BuildBridge in case of road. * Internal function to help BuildBridge in case of road.
*/ */

View File

@@ -15,6 +15,19 @@
* functions may still be available if you return an older API version * functions may still be available if you return an older API version
* in GetAPIVersion() in info.nut. * in GetAPIVersion() in info.nut.
* *
* \b 1.1.4
*
* API additions:
* \li AIVehicle::ERR_VEHICLE_TOO_LONG in case vehicle length limit is reached.
*
* \b 1.1.3
*
* No changes
*
* \b 1.1.2
*
* No changes
*
* \b 1.1.1 * \b 1.1.1
* *
* No changes * No changes

View File

@@ -278,7 +278,7 @@ public:
*/ */
Money GetRunningCost(); Money GetRunningCost();
#ifdef DOXYGEN_SKIP #ifdef DOXYGEN_AI_DOCS
/** /**
* Get the type of the offered engine. * Get the type of the offered engine.
* @return The type the engine has. * @return The type the engine has.

View File

@@ -10,7 +10,7 @@
/** @file ai_info_docs.hpp Description of the functions an AI can/must provide in AIInfo. */ /** @file ai_info_docs.hpp Description of the functions an AI can/must provide in AIInfo. */
/* This file exists purely for doxygen purposes. */ /* This file exists purely for doxygen purposes. */
#ifdef DOXYGEN_SKIP #ifdef DOXYGEN_AI_DOCS
/** /**
* 'Abstract' class of the class AIs/AI libraries use to register themselves. * 'Abstract' class of the class AIs/AI libraries use to register themselves.
* *

View File

@@ -239,7 +239,7 @@ public:
*/ */
void KeepList(AIList *list); void KeepList(AIList *list);
#ifndef DOXYGEN_SKIP #ifndef DOXYGEN_AI_DOCS
/** /**
* Used for 'foreach()' and [] get from Squirrel. * Used for 'foreach()' and [] get from Squirrel.
*/ */
@@ -280,7 +280,7 @@ public:
* list.Valuate(MyVal, 12); * list.Valuate(MyVal, 12);
*/ */
void Valuate(void *valuator_function, int params, ...); void Valuate(void *valuator_function, int params, ...);
#endif /* DOXYGEN_SKIP */ #endif /* DOXYGEN_AI_DOCS */
}; };
#endif /* AI_LIST_HPP */ #endif /* AI_LIST_HPP */

View File

@@ -37,9 +37,9 @@
AIObject::GetLogPointer() = new LogData(); AIObject::GetLogPointer() = new LogData();
LogData *log = (LogData *)AIObject::GetLogPointer(); LogData *log = (LogData *)AIObject::GetLogPointer();
log->lines = CallocT<char *>(80); log->lines = CallocT<char *>(400);
log->type = CallocT<AILog::AILogType>(80); log->type = CallocT<AILog::AILogType>(400);
log->count = 80; log->count = 400;
log->pos = log->count - 1; log->pos = log->count - 1;
log->used = 0; log->used = 0;
} }

View File

@@ -37,6 +37,8 @@ typedef bool (AIModeProc)();
class AIObject : public SimpleCountedObject { class AIObject : public SimpleCountedObject {
friend void CcAI(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2); friend void CcAI(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2);
friend class AIInstance; friend class AIInstance;
friend class AIController;
#ifndef DOXYGEN_AI_DOCS
protected: protected:
/** /**
* Executes a raw DoCommand for the AI. * Executes a raw DoCommand for the AI.
@@ -179,51 +181,45 @@ protected:
public: public:
/** /**
* Store the latest result of a DoCommand per company. * Store the latest result of a DoCommand per company.
* @note NEVER use this yourself in your AI!
* @param res The result of the last command. * @param res The result of the last command.
*/ */
static void SetLastCommandRes(bool res); static void SetLastCommandRes(bool res);
/** /**
* Store a new_vehicle_id per company. * Store a new_vehicle_id per company.
* @note NEVER use this yourself in your AI!
* @param vehicle_id The new VehicleID. * @param vehicle_id The new VehicleID.
*/ */
static void SetNewVehicleID(VehicleID vehicle_id); static void SetNewVehicleID(VehicleID vehicle_id);
/** /**
* Store a new_sign_id per company. * Store a new_sign_id per company.
* @note NEVER use this yourself in your AI!
* @param sign_id The new SignID. * @param sign_id The new SignID.
*/ */
static void SetNewSignID(SignID sign_id); static void SetNewSignID(SignID sign_id);
/** /**
* Store a new_tunnel_endtile per company. * Store a new_tunnel_endtile per company.
* @note NEVER use this yourself in your AI!
* @param tile The new TileIndex. * @param tile The new TileIndex.
*/ */
static void SetNewTunnelEndtile(TileIndex tile); static void SetNewTunnelEndtile(TileIndex tile);
/** /**
* Store a new_group_id per company. * Store a new_group_id per company.
* @note NEVER use this yourself in your AI!
* @param group_id The new GroupID. * @param group_id The new GroupID.
*/ */
static void SetNewGroupID(GroupID group_id); static void SetNewGroupID(GroupID group_id);
/** /**
* Store a allow_do_command per company. * Store a allow_do_command per company.
* @note NEVER use this yourself in your AI!
* @param allow The new allow. * @param allow The new allow.
*/ */
static void SetAllowDoCommand(bool allow); static void SetAllowDoCommand(bool allow);
/** /**
* Get the pointer to store log message in. * Get the pointer to store log message in.
* @note NEVER use this yourself in your AI!
*/ */
static void *&GetLogPointer(); static void *&GetLogPointer();
#endif /* DOXYGEN_AI_DOCS */
}; };
#endif /* AI_OBJECT_HPP */ #endif /* AI_OBJECT_HPP */

View File

@@ -66,15 +66,40 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
if (order_position == AIOrder::ORDER_INVALID) return NULL; if (order_position == AIOrder::ORDER_INVALID) return NULL;
} }
const Order *order = v->orders.list->GetFirstOrder(); const Order *order = v->orders.list->GetFirstOrder();
while (order->GetType() == OT_AUTOMATIC) order = order->next; while (order->GetType() == OT_IMPLICIT) order = order->next;
while (order_position > 0) { while (order_position > 0) {
order_position = (AIOrder::OrderPosition)(order_position - 1); order_position = (AIOrder::OrderPosition)(order_position - 1);
order = order->next; order = order->next;
while (order->GetType() == OT_AUTOMATIC) order = order->next; while (order->GetType() == OT_IMPLICIT) order = order->next;
} }
return order; return order;
} }
/**
* Convert an AIOrder::OrderPosition (which is the manual order index) to an order index
* as expected by the OpenTTD commands.
* @param order_position The OrderPosition to convert.
* @return An OpenTTD-internal index for the same order.
*/
static int AIOrderPositionToRealOrderPosition(VehicleID vehicle_id, AIOrder::OrderPosition order_position)
{
const Vehicle *v = ::Vehicle::Get(vehicle_id);
if (order_position == v->GetNumManualOrders()) return v->GetNumOrders();
assert(AIOrder::IsValidVehicleOrder(vehicle_id, order_position));
int res = (int)order_position;
const Order *order = v->orders.list->GetFirstOrder();
for (; order->GetType() == OT_IMPLICIT; order = order->next) res++;
while (order_position > 0) {
order_position = (AIOrder::OrderPosition)(order_position - 1);
order = order->next;
for (; order->GetType() == OT_IMPLICIT; order = order->next) res++;
}
return res;
}
/* static */ bool AIOrder::IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position) /* static */ bool AIOrder::IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position)
{ {
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false; if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
@@ -104,7 +129,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
if (order_position == ORDER_CURRENT) return false; if (order_position == ORDER_CURRENT) return false;
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false; if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
const Order *order = Vehicle::Get(vehicle_id)->GetOrder(order_position); const Order *order = ::Vehicle::Get(vehicle_id)->GetOrder(AIOrderPositionToRealOrderPosition(vehicle_id, order_position));
return order->GetType() == OT_CONDITIONAL; return order->GetType() == OT_CONDITIONAL;
} }
@@ -113,13 +138,13 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
if (order_position == ORDER_CURRENT) return false; if (order_position == ORDER_CURRENT) return false;
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false; if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
const Order *order = Vehicle::Get(vehicle_id)->GetOrder(order_position); const Order *order = ::ResolveOrder(vehicle_id, order_position);
return order->GetType() == OT_DUMMY; return order->GetType() == OT_DUMMY;
} }
/* static */ bool AIOrder::IsCurrentOrderPartOfOrderList(VehicleID vehicle_id) /* static */ bool AIOrder::IsCurrentOrderPartOfOrderList(VehicleID vehicle_id)
{ {
if (AIVehicle::IsValidVehicle(vehicle_id)) return false; if (!AIVehicle::IsValidVehicle(vehicle_id)) return false;
if (GetOrderCount(vehicle_id) == 0) return false; if (GetOrderCount(vehicle_id) == 0) return false;
const Order *order = &::Vehicle::Get(vehicle_id)->current_order; const Order *order = &::Vehicle::Get(vehicle_id)->current_order;
@@ -135,12 +160,12 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
int cur_order_pos = ::Vehicle::Get(vehicle_id)->cur_real_order_index; int cur_order_pos = ::Vehicle::Get(vehicle_id)->cur_real_order_index;
const Order *order = ::Vehicle::Get(vehicle_id)->GetOrder(0); const Order *order = ::Vehicle::Get(vehicle_id)->GetOrder(0);
if (order == NULL) return ORDER_INVALID; if (order == NULL) return ORDER_INVALID;
int num_automatic_orders = 0; int num_implicit_orders = 0;
for (int i = 0; i < cur_order_pos; i++) { for (int i = 0; i < cur_order_pos; i++) {
if (order->GetType() == OT_AUTOMATIC) num_automatic_orders++; if (order->GetType() == OT_IMPLICIT) num_implicit_orders++;
order = order->next; order = order->next;
} }
return (AIOrder::OrderPosition)(cur_order_pos - num_automatic_orders); return (AIOrder::OrderPosition)(cur_order_pos - num_implicit_orders);
} }
return (order_position >= 0 && order_position < ::Vehicle::Get(vehicle_id)->GetNumManualOrders()) ? order_position : ORDER_INVALID; return (order_position >= 0 && order_position < ::Vehicle::Get(vehicle_id)->GetNumManualOrders()) ? order_position : ORDER_INVALID;
} }
@@ -190,7 +215,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
/* static */ int32 AIOrder::GetOrderCount(VehicleID vehicle_id) /* static */ int32 AIOrder::GetOrderCount(VehicleID vehicle_id)
{ {
return AIVehicle::IsValidVehicle(vehicle_id) ? ::Vehicle::Get(vehicle_id)->GetNumOrders() : -1; return AIVehicle::IsValidVehicle(vehicle_id) ? ::Vehicle::Get(vehicle_id)->GetNumManualOrders() : -1;
} }
/* static */ TileIndex AIOrder::GetOrderDestination(VehicleID vehicle_id, OrderPosition order_position) /* static */ TileIndex AIOrder::GetOrderDestination(VehicleID vehicle_id, OrderPosition order_position)
@@ -337,7 +362,8 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position)); EnforcePrecondition(false, order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position));
EnforcePrecondition(false, condition >= OC_LOAD_PERCENTAGE && condition <= OC_UNCONDITIONALLY); EnforcePrecondition(false, condition >= OC_LOAD_PERCENTAGE && condition <= OC_UNCONDITIONALLY);
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), MOF_COND_VARIABLE | (condition << 4), CMD_MODIFY_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), MOF_COND_VARIABLE | (condition << 4), CMD_MODIFY_ORDER);
} }
/* static */ bool AIOrder::SetOrderCompareFunction(VehicleID vehicle_id, OrderPosition order_position, CompareFunction compare) /* static */ bool AIOrder::SetOrderCompareFunction(VehicleID vehicle_id, OrderPosition order_position, CompareFunction compare)
@@ -346,7 +372,8 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position)); EnforcePrecondition(false, order_position != ORDER_CURRENT && IsConditionalOrder(vehicle_id, order_position));
EnforcePrecondition(false, compare >= CF_EQUALS && compare <= CF_IS_FALSE); EnforcePrecondition(false, compare >= CF_EQUALS && compare <= CF_IS_FALSE);
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), MOF_COND_COMPARATOR | (compare << 4), CMD_MODIFY_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), MOF_COND_COMPARATOR | (compare << 4), CMD_MODIFY_ORDER);
} }
/* static */ bool AIOrder::SetOrderCompareValue(VehicleID vehicle_id, OrderPosition order_position, int32 value) /* static */ bool AIOrder::SetOrderCompareValue(VehicleID vehicle_id, OrderPosition order_position, int32 value)
@@ -356,7 +383,8 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, value >= 0 && value < 2048); EnforcePrecondition(false, value >= 0 && value < 2048);
if (GetOrderCondition(vehicle_id, order_position) == OC_MAX_SPEED) value = value * 10 / 16; if (GetOrderCondition(vehicle_id, order_position) == OC_MAX_SPEED) value = value * 10 / 16;
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), MOF_COND_VALUE | (value << 4), CMD_MODIFY_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), MOF_COND_VALUE | (value << 4), CMD_MODIFY_ORDER);
} }
/* static */ bool AIOrder::SetStopLocation(VehicleID vehicle_id, OrderPosition order_position, StopLocation stop_location) /* static */ bool AIOrder::SetStopLocation(VehicleID vehicle_id, OrderPosition order_position, StopLocation stop_location)
@@ -366,7 +394,10 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, IsGotoStationOrder(vehicle_id, order_position)); EnforcePrecondition(false, IsGotoStationOrder(vehicle_id, order_position));
EnforcePrecondition(false, stop_location >= STOPLOCATION_NEAR && stop_location <= STOPLOCATION_FAR); EnforcePrecondition(false, stop_location >= STOPLOCATION_NEAR && stop_location <= STOPLOCATION_FAR);
uint32 p1 = vehicle_id | (order_position << 20); order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position);
int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
uint32 p1 = vehicle_id | (order_pos << 20);
uint32 p2 = MOF_STOP_LOCATION | (stop_location << 4); uint32 p2 = MOF_STOP_LOCATION | (stop_location << 4);
return AIObject::DoCommand(0, p1, p2, CMD_MODIFY_ORDER); return AIObject::DoCommand(0, p1, p2, CMD_MODIFY_ORDER);
} }
@@ -376,7 +407,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id)); EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id));
EnforcePrecondition(false, AreOrderFlagsValid(destination, order_flags)); EnforcePrecondition(false, AreOrderFlagsValid(destination, order_flags));
return InsertOrder(vehicle_id, (AIOrder::OrderPosition)::Vehicle::Get(vehicle_id)->GetNumOrders(), destination, order_flags); return InsertOrder(vehicle_id, (AIOrder::OrderPosition)::Vehicle::Get(vehicle_id)->GetNumManualOrders(), destination, order_flags);
} }
/* static */ bool AIOrder::AppendConditionalOrder(VehicleID vehicle_id, OrderPosition jump_to) /* static */ bool AIOrder::AppendConditionalOrder(VehicleID vehicle_id, OrderPosition jump_to)
@@ -384,7 +415,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id)); EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id));
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, jump_to)); EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, jump_to));
return InsertConditionalOrder(vehicle_id, (AIOrder::OrderPosition)::Vehicle::Get(vehicle_id)->GetNumOrders(), jump_to); return InsertConditionalOrder(vehicle_id, (AIOrder::OrderPosition)::Vehicle::Get(vehicle_id)->GetNumManualOrders(), jump_to);
} }
/* static */ bool AIOrder::InsertOrder(VehicleID vehicle_id, OrderPosition order_position, TileIndex destination, AIOrder::AIOrderFlags order_flags) /* static */ bool AIOrder::InsertOrder(VehicleID vehicle_id, OrderPosition order_position, TileIndex destination, AIOrder::AIOrderFlags order_flags)
@@ -393,7 +424,7 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
if (order_position == ORDER_CURRENT) order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position); if (order_position == ORDER_CURRENT) order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position);
EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id)); EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id));
EnforcePrecondition(false, order_position >= 0 && order_position <= ::Vehicle::Get(vehicle_id)->GetNumOrders()); EnforcePrecondition(false, order_position >= 0 && order_position <= ::Vehicle::Get(vehicle_id)->GetNumManualOrders());
EnforcePrecondition(false, AreOrderFlagsValid(destination, order_flags)); EnforcePrecondition(false, AreOrderFlagsValid(destination, order_flags));
Order order; Order order;
@@ -437,7 +468,8 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
order.SetNonStopType((OrderNonStopFlags)GB(order_flags, 0, 2)); order.SetNonStopType((OrderNonStopFlags)GB(order_flags, 0, 2));
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), order.Pack(), CMD_INSERT_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), order.Pack(), CMD_INSERT_ORDER);
} }
/* static */ bool AIOrder::InsertConditionalOrder(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to) /* static */ bool AIOrder::InsertConditionalOrder(VehicleID vehicle_id, OrderPosition order_position, OrderPosition jump_to)
@@ -446,12 +478,14 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
if (order_position == ORDER_CURRENT) order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position); if (order_position == ORDER_CURRENT) order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position);
EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id)); EnforcePrecondition(false, AIVehicle::IsValidVehicle(vehicle_id));
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, jump_to)); EnforcePrecondition(false, order_position >= 0 && order_position <= ::Vehicle::Get(vehicle_id)->GetNumManualOrders());
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, jump_to) && jump_to != ORDER_CURRENT);
Order order; Order order;
order.MakeConditional(jump_to); order.MakeConditional(jump_to);
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), order.Pack(), CMD_INSERT_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), order.Pack(), CMD_INSERT_ORDER);
} }
/* static */ bool AIOrder::RemoveOrder(VehicleID vehicle_id, OrderPosition order_position) /* static */ bool AIOrder::RemoveOrder(VehicleID vehicle_id, OrderPosition order_position)
@@ -460,7 +494,8 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position)); EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position));
return AIObject::DoCommand(0, vehicle_id, order_position, CMD_DELETE_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
return AIObject::DoCommand(0, vehicle_id, order_pos, CMD_DELETE_ORDER);
} }
/* static */ bool AIOrder::SkipToOrder(VehicleID vehicle_id, OrderPosition next_order) /* static */ bool AIOrder::SkipToOrder(VehicleID vehicle_id, OrderPosition next_order)
@@ -469,7 +504,8 @@ static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition or
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, next_order)); EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, next_order));
return AIObject::DoCommand(0, vehicle_id, next_order, CMD_SKIP_TO_ORDER); int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, next_order);
return AIObject::DoCommand(0, vehicle_id, order_pos, CMD_SKIP_TO_ORDER);
} }
/** /**
@@ -506,13 +542,14 @@ static void _DoCommandReturnSetOrderFlags(class AIInstance *instance)
EnforcePrecondition(false, AreOrderFlagsValid(GetOrderDestination(vehicle_id, order_position), order_flags)); EnforcePrecondition(false, AreOrderFlagsValid(GetOrderDestination(vehicle_id, order_position), order_flags));
const Order *order = ::ResolveOrder(vehicle_id, order_position); const Order *order = ::ResolveOrder(vehicle_id, order_position);
int order_pos = AIOrderPositionToRealOrderPosition(vehicle_id, order_position);
AIOrderFlags current = GetOrderFlags(vehicle_id, order_position); AIOrderFlags current = GetOrderFlags(vehicle_id, order_position);
EnforcePrecondition(false, (order_flags & AIOF_GOTO_NEAREST_DEPOT) == (current & AIOF_GOTO_NEAREST_DEPOT)); EnforcePrecondition(false, (order_flags & AIOF_GOTO_NEAREST_DEPOT) == (current & AIOF_GOTO_NEAREST_DEPOT));
if ((current & AIOF_NON_STOP_FLAGS) != (order_flags & AIOF_NON_STOP_FLAGS)) { if ((current & AIOF_NON_STOP_FLAGS) != (order_flags & AIOF_NON_STOP_FLAGS)) {
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), (order_flags & AIOF_NON_STOP_FLAGS) << 4 | MOF_NON_STOP, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags); return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), (order_flags & AIOF_NON_STOP_FLAGS) << 4 | MOF_NON_STOP, CMD_MODIFY_ORDER, NULL, &::_DoCommandReturnSetOrderFlags);
} }
switch (order->GetType()) { switch (order->GetType()) {
@@ -521,16 +558,16 @@ static void _DoCommandReturnSetOrderFlags(class AIInstance *instance)
uint data = DA_ALWAYS_GO; uint data = DA_ALWAYS_GO;
if (order_flags & AIOF_SERVICE_IF_NEEDED) data = DA_SERVICE; if (order_flags & AIOF_SERVICE_IF_NEEDED) data = DA_SERVICE;
if (order_flags & AIOF_STOP_IN_DEPOT) data = DA_STOP; if (order_flags & AIOF_STOP_IN_DEPOT) data = DA_STOP;
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), (data << 4) | MOF_DEPOT_ACTION, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags); return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), (data << 4) | MOF_DEPOT_ACTION, CMD_MODIFY_ORDER, NULL, &::_DoCommandReturnSetOrderFlags);
} }
break; break;
case OT_GOTO_STATION: case OT_GOTO_STATION:
if ((current & AIOF_UNLOAD_FLAGS) != (order_flags & AIOF_UNLOAD_FLAGS)) { if ((current & AIOF_UNLOAD_FLAGS) != (order_flags & AIOF_UNLOAD_FLAGS)) {
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), (order_flags & AIOF_UNLOAD_FLAGS) << 2 | MOF_UNLOAD, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags); return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), (order_flags & AIOF_UNLOAD_FLAGS) << 2 | MOF_UNLOAD, CMD_MODIFY_ORDER, NULL, &::_DoCommandReturnSetOrderFlags);
} }
if ((current & AIOF_LOAD_FLAGS) != (order_flags & AIOF_LOAD_FLAGS)) { if ((current & AIOF_LOAD_FLAGS) != (order_flags & AIOF_LOAD_FLAGS)) {
return AIObject::DoCommand(0, vehicle_id | (order_position << 20), (order_flags & AIOF_LOAD_FLAGS) >> 1 | MOF_LOAD, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags); return AIObject::DoCommand(0, vehicle_id | (order_pos << 20), (order_flags & AIOF_LOAD_FLAGS) >> 1 | MOF_LOAD, CMD_MODIFY_ORDER, NULL, &::_DoCommandReturnSetOrderFlags);
} }
break; break;
@@ -561,7 +598,9 @@ static void _DoCommandReturnSetOrderFlags(class AIInstance *instance)
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position_move)); EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position_move));
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position_target)); EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, order_position_target));
return AIObject::DoCommand(0, vehicle_id, order_position_move | (order_position_target << 16), CMD_MOVE_ORDER); int order_pos_move = AIOrderPositionToRealOrderPosition(vehicle_id, order_position_move);
int order_pos_target = AIOrderPositionToRealOrderPosition(vehicle_id, order_position_target);
return AIObject::DoCommand(0, vehicle_id, order_pos_move | (order_pos_target << 16), CMD_MOVE_ORDER);
} }
/* static */ bool AIOrder::CopyOrders(VehicleID vehicle_id, VehicleID main_vehicle_id) /* static */ bool AIOrder::CopyOrders(VehicleID vehicle_id, VehicleID main_vehicle_id)

View File

@@ -443,12 +443,12 @@ public:
*/ */
static bool RemoveOrder(VehicleID vehicle_id, OrderPosition order_position); static bool RemoveOrder(VehicleID vehicle_id, OrderPosition order_position);
#ifndef DOXYGEN_SKIP #ifndef DOXYGEN_AI_DOCS
/** /**
* Internal function to help SetOrderFlags. * Internal function to help SetOrderFlags.
*/ */
static bool _SetOrderFlags(); static bool _SetOrderFlags();
#endif /* DOXYGEN_SKIP */ #endif /* DOXYGEN_AI_DOCS */
/** /**
* Changes the order flags of the given order. * Changes the order flags of the given order.

View File

@@ -14,6 +14,7 @@
#include "ai_map.hpp" #include "ai_map.hpp"
#include "ai_station.hpp" #include "ai_station.hpp"
#include "ai_industrytype.hpp" #include "ai_industrytype.hpp"
#include "ai_cargo.hpp"
#include "../../debug.h" #include "../../debug.h"
#include "../../station_base.h" #include "../../station_base.h"
#include "../../company_func.h" #include "../../company_func.h"
@@ -170,6 +171,7 @@
EnforcePrecondition(false, platform_length > 0 && platform_length <= 0xFF); EnforcePrecondition(false, platform_length > 0 && platform_length <= 0xFF);
EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType())); EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType()));
EnforcePrecondition(false, station_id == AIStation::STATION_NEW || station_id == AIStation::STATION_JOIN_ADJACENT || AIStation::IsValidStation(station_id)); EnforcePrecondition(false, station_id == AIStation::STATION_NEW || station_id == AIStation::STATION_JOIN_ADJACENT || AIStation::IsValidStation(station_id));
EnforcePrecondition(false, AICargo::IsValidCargo(cargo_id));
EnforcePrecondition(false, source_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || source_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(source_industry)); EnforcePrecondition(false, source_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || source_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(source_industry));
EnforcePrecondition(false, goal_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || goal_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(goal_industry)); EnforcePrecondition(false, goal_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || goal_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(goal_industry));

View File

@@ -279,6 +279,7 @@ public:
* @pre num_platforms > 0 && num_platforms <= 255. * @pre num_platforms > 0 && num_platforms <= 255.
* @pre platform_length > 0 && platform_length <= 255. * @pre platform_length > 0 && platform_length <= 255.
* @pre station_id == AIStation::STATION_NEW || station_id == AIStation::STATION_JOIN_ADJACENT || AIStation::IsValidStation(station_id). * @pre station_id == AIStation::STATION_NEW || station_id == AIStation::STATION_JOIN_ADJACENT || AIStation::IsValidStation(station_id).
* @pre AICargo::IsValidCargo(cargo_type)
* @pre source_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || source_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(source_industry). * @pre source_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || source_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(source_industry).
* @pre goal_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || goal_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(goal_industry). * @pre goal_industry == AIIndustryType::INDUSTRYTYPE_UNKNOWN || goal_industry == AIIndustryType::INDUSTRYTYPE_TOWN || AIIndustryType::IsValidIndustryType(goal_industry).
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY * @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY

View File

@@ -117,7 +117,8 @@ public:
/** /**
* Find out if this station is within the rating influence of a town. * Find out if this station is within the rating influence of a town.
* Stations within the radius influence the rating of the town. * The service quality of stations with signs within this radius
* influences the rating of the town.
* @param station_id The station to check. * @param station_id The station to check.
* @param town_id The town to check. * @param town_id The town to check.
* @return True if the tile is within the rating influence of the town. * @return True if the tile is within the rating influence of the town.

View File

@@ -13,6 +13,7 @@
#include "ai_tile.hpp" #include "ai_tile.hpp"
#include "ai_map.hpp" #include "ai_map.hpp"
#include "ai_town.hpp" #include "ai_town.hpp"
#include "ai_cargo.hpp"
#include "../../station_func.h" #include "../../station_func.h"
#include "../../company_func.h" #include "../../company_func.h"
#include "../../water_map.h" #include "../../water_map.h"
@@ -192,7 +193,7 @@
/* static */ int32 AITile::GetCargoAcceptance(TileIndex tile, CargoID cargo_type, int width, int height, int radius) /* static */ int32 AITile::GetCargoAcceptance(TileIndex tile, CargoID cargo_type, int width, int height, int radius)
{ {
if (!::IsValidTile(tile) || width <= 0 || height <= 0 || radius < 0) return -1; if (!::IsValidTile(tile) || width <= 0 || height <= 0 || radius < 0 || !AICargo::IsValidCargo(cargo_type)) return -1;
CargoArray acceptance = ::GetAcceptanceAroundTiles(tile, width, height, _settings_game.station.modified_catchment ? radius : (int)CA_UNMODIFIED); CargoArray acceptance = ::GetAcceptanceAroundTiles(tile, width, height, _settings_game.station.modified_catchment ? radius : (int)CA_UNMODIFIED);
return acceptance[cargo_type]; return acceptance[cargo_type];
@@ -200,7 +201,7 @@
/* static */ int32 AITile::GetCargoProduction(TileIndex tile, CargoID cargo_type, int width, int height, int radius) /* static */ int32 AITile::GetCargoProduction(TileIndex tile, CargoID cargo_type, int width, int height, int radius)
{ {
if (!::IsValidTile(tile) || width <= 0 || height <= 0 || radius < 0) return -1; if (!::IsValidTile(tile) || width <= 0 || height <= 0 || radius < 0 || !AICargo::IsValidCargo(cargo_type)) return -1;
CargoArray produced = ::GetProductionAroundTiles(tile, width, height, _settings_game.station.modified_catchment ? radius : (int)CA_UNMODIFIED); CargoArray produced = ::GetProductionAroundTiles(tile, width, height, _settings_game.station.modified_catchment ? radius : (int)CA_UNMODIFIED);
return produced[cargo_type]; return produced[cargo_type];

View File

@@ -319,6 +319,7 @@ public:
* @param height The height of the station. * @param height The height of the station.
* @param radius The radius of the station. * @param radius The radius of the station.
* @pre AIMap::IsValidTile(tile). * @pre AIMap::IsValidTile(tile).
* @pre AICargo::IsValidCargo(cargo_type)
* @pre width > 0. * @pre width > 0.
* @pre height > 0. * @pre height > 0.
* @pre radius >= 0. * @pre radius >= 0.
@@ -335,6 +336,7 @@ public:
* @param height The height of the station. * @param height The height of the station.
* @param radius The radius of the station. * @param radius The radius of the station.
* @pre AIMap::IsValidTile(tile). * @pre AIMap::IsValidTile(tile).
* @pre AICargo::IsValidCargo(cargo_type)
* @pre width > 0. * @pre width > 0.
* @pre height > 0. * @pre height > 0.
* @pre radius >= 0. * @pre radius >= 0.
@@ -439,7 +441,8 @@ public:
/** /**
* Find out if this tile is within the rating influence of a town. * Find out if this tile is within the rating influence of a town.
* Stations on this tile influence the rating of the town. * If a station sign would be on this tile, the servicing quality of the station would
* influence the rating of the town.
* @param tile The tile to check. * @param tile The tile to check.
* @param town_id The town to check. * @param town_id The town to check.
* @return True if the tile is within the rating influence of the town. * @return True if the tile is within the rating influence of the town.

View File

@@ -209,7 +209,8 @@ public:
/** /**
* Find out if this tile is within the rating influence of a town. * Find out if this tile is within the rating influence of a town.
* Stations on this tile influence the rating of the town. * If a station sign would be on this tile, the servicing quality of the station would
* influence the rating of the town.
* @param town_id The town to check. * @param town_id The town to check.
* @param tile The tile to check. * @param tile The tile to check.
* @pre IsValidTown(town_id). * @pre IsValidTown(town_id).

View File

@@ -65,7 +65,7 @@ public:
*/ */
static TileIndex GetOtherTunnelEnd(TileIndex tile); static TileIndex GetOtherTunnelEnd(TileIndex tile);
#ifndef DOXYGEN_SKIP #ifndef DOXYGEN_AI_DOCS
/** /**
* Internal function to help BuildTunnel in case of road. * Internal function to help BuildTunnel in case of road.
*/ */
@@ -75,7 +75,7 @@ public:
* Internal function to help BuildTunnel in case of road. * Internal function to help BuildTunnel in case of road.
*/ */
static bool _BuildTunnelRoad2(); static bool _BuildTunnelRoad2();
#endif /* DOXYGEN_SKIP */ #endif /* DOXYGEN_AI_DOCS */
/** /**
* Builds a tunnel starting at start. The direction of the tunnel depends * Builds a tunnel starting at start. The direction of the tunnel depends

View File

@@ -65,6 +65,8 @@ public:
/** Vehicle is without power */ /** Vehicle is without power */
ERR_VEHICLE_NO_POWER, // [STR_ERROR_TRAIN_START_NO_CATENARY] ERR_VEHICLE_NO_POWER, // [STR_ERROR_TRAIN_START_NO_CATENARY]
/** Vehicle would get too long during construction. */
ERR_VEHICLE_TOO_LONG, // [STR_ERROR_TRAIN_TOO_LONG]
}; };
/** /**

View File

@@ -47,6 +47,7 @@ void SQAIVehicle_Register(Squirrel *engine)
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT, "ERR_VEHICLE_NOT_IN_DEPOT"); SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT, "ERR_VEHICLE_NOT_IN_DEPOT");
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT"); SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT");
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_NO_POWER, "ERR_VEHICLE_NO_POWER"); SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_NO_POWER, "ERR_VEHICLE_NO_POWER");
SQAIVehicle.DefSQConst(engine, AIVehicle::ERR_VEHICLE_TOO_LONG, "ERR_VEHICLE_TOO_LONG");
SQAIVehicle.DefSQConst(engine, AIVehicle::VT_RAIL, "VT_RAIL"); SQAIVehicle.DefSQConst(engine, AIVehicle::VT_RAIL, "VT_RAIL");
SQAIVehicle.DefSQConst(engine, AIVehicle::VT_ROAD, "VT_ROAD"); SQAIVehicle.DefSQConst(engine, AIVehicle::VT_ROAD, "VT_ROAD");
SQAIVehicle.DefSQConst(engine, AIVehicle::VT_WATER, "VT_WATER"); SQAIVehicle.DefSQConst(engine, AIVehicle::VT_WATER, "VT_WATER");
@@ -95,6 +96,7 @@ void SQAIVehicle_Register(Squirrel *engine)
AIError::RegisterErrorMap(STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT); AIError::RegisterErrorMap(STR_ERROR_SHIP_MUST_BE_STOPPED_INSIDE_DEPOT, AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT);
AIError::RegisterErrorMap(STR_ERROR_AIRCRAFT_IS_IN_FLIGHT, AIVehicle::ERR_VEHICLE_IN_FLIGHT); AIError::RegisterErrorMap(STR_ERROR_AIRCRAFT_IS_IN_FLIGHT, AIVehicle::ERR_VEHICLE_IN_FLIGHT);
AIError::RegisterErrorMap(STR_ERROR_TRAIN_START_NO_CATENARY, AIVehicle::ERR_VEHICLE_NO_POWER); AIError::RegisterErrorMap(STR_ERROR_TRAIN_START_NO_CATENARY, AIVehicle::ERR_VEHICLE_NO_POWER);
AIError::RegisterErrorMap(STR_ERROR_TRAIN_TOO_LONG, AIVehicle::ERR_VEHICLE_TOO_LONG);
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_TOO_MANY, "ERR_VEHICLE_TOO_MANY"); AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_TOO_MANY, "ERR_VEHICLE_TOO_MANY");
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NOT_AVAILABLE, "ERR_VEHICLE_NOT_AVAILABLE"); AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NOT_AVAILABLE, "ERR_VEHICLE_NOT_AVAILABLE");
@@ -108,6 +110,7 @@ void SQAIVehicle_Register(Squirrel *engine)
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT, "ERR_VEHICLE_NOT_IN_DEPOT"); AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NOT_IN_DEPOT, "ERR_VEHICLE_NOT_IN_DEPOT");
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT"); AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT");
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NO_POWER, "ERR_VEHICLE_NO_POWER"); AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_NO_POWER, "ERR_VEHICLE_NO_POWER");
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_TOO_LONG, "ERR_VEHICLE_TOO_LONG");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle", 2, ".i"); SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetNumWagons, "GetNumWagons", 2, ".i"); SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetNumWagons, "GetNumWagons", 2, ".i");

View File

@@ -102,9 +102,9 @@ BEGIN {
/^( *)private/ { if (cls_level == 1) public = "false"; next; } /^( *)private/ { if (cls_level == 1) public = "false"; next; }
# Ignore special doxygen blocks # Ignore special doxygen blocks
/^#ifndef DOXYGEN_SKIP/ { doxygen_skip = "next"; next; } /^#ifndef DOXYGEN_AI_DOCS/ { doxygen_skip = "next"; next; }
/^#ifdef DOXYGEN_SKIP/ { doxygen_skip = "true"; next; } /^#ifdef DOXYGEN_AI_DOCS/ { doxygen_skip = "true"; next; }
/^#endif \/\* DOXYGEN_SKIP \*\// { doxygen_skip = "false"; next; } /^#endif \/\* DOXYGEN_AI_DOCS \*\// { doxygen_skip = "false"; next; }
/^#else/ { /^#else/ {
if (doxygen_skip == "next") { if (doxygen_skip == "next") {
doxygen_skip = "true"; doxygen_skip = "true";

View File

@@ -31,7 +31,7 @@ void GetAircraftSpriteSize(EngineID engine, uint &width, uint &height);
void UpdateAirplanesOnNewStation(const Station *st); void UpdateAirplanesOnNewStation(const Station *st);
void UpdateAircraftCache(Aircraft *v); void UpdateAircraftCache(Aircraft *v);
void AircraftLeaveHangar(Aircraft *v); void AircraftLeaveHangar(Aircraft *v, Direction exit_dir);
void AircraftNextAirportPos_and_Order(Aircraft *v); void AircraftNextAirportPos_and_Order(Aircraft *v);
void SetAircraftPosition(Aircraft *v, int x, int y, int z); void SetAircraftPosition(Aircraft *v, int x, int y, int z);
byte GetAircraftFlyingAltitude(const Aircraft *v); byte GetAircraftFlyingAltitude(const Aircraft *v);

View File

@@ -1243,12 +1243,20 @@ void AircraftNextAirportPos_and_Order(Aircraft *v)
v->pos = v->previous_pos = AircraftGetEntryPoint(v, apc, rotation); v->pos = v->previous_pos = AircraftGetEntryPoint(v, apc, rotation);
} }
void AircraftLeaveHangar(Aircraft *v) /**
* Aircraft is about to leave the hangar.
* @param v Aircraft leaving.
* @param exit_dir The direction the vehicle leaves the hangar.
* @note This function is called in AfterLoadGame for old savegames, so don't rely
* on any data to be valid, especially don't rely on the fact that the vehicle
* is actually on the ground inside a depot.
*/
void AircraftLeaveHangar(Aircraft *v, Direction exit_dir)
{ {
v->cur_speed = 0; v->cur_speed = 0;
v->subspeed = 0; v->subspeed = 0;
v->progress = 0; v->progress = 0;
v->direction = DIR_SE; v->direction = exit_dir;
v->vehstatus &= ~VS_HIDDEN; v->vehstatus &= ~VS_HIDDEN;
{ {
Vehicle *u = v->Next(); Vehicle *u = v->Next();
@@ -1333,7 +1341,8 @@ static void AircraftEventHandler_InHangar(Aircraft *v, const AirportFTAClass *ap
/* airplane goto state takeoff, helicopter to helitakeoff */ /* airplane goto state takeoff, helicopter to helitakeoff */
v->state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF; v->state = (v->subtype == AIR_HELICOPTER) ? HELITAKEOFF : TAKEOFF;
} }
AircraftLeaveHangar(v); const Station *st = Station::GetByTile(v->tile);
AircraftLeaveHangar(v, st->airport.GetHangarExitDirection(v->tile));
AirportMove(v, apc); AirportMove(v, apc);
} }

View File

@@ -26,6 +26,7 @@
#include "widgets/dropdown_type.h" #include "widgets/dropdown_type.h"
#include "core/geometry_func.hpp" #include "core/geometry_func.hpp"
#include "hotkeys.h" #include "hotkeys.h"
#include "vehicle_func.h"
#include "sprite.h" #include "sprite.h"
#include "table/strings.h" #include "table/strings.h"
@@ -195,6 +196,7 @@ Window *ShowBuildAirToolbar()
EventState AirportToolbarGlobalHotkeys(uint16 key, uint16 keycode) EventState AirportToolbarGlobalHotkeys(uint16 key, uint16 keycode)
{ {
if (!CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) return ES_NOT_HANDLED;
int num = CheckHotkeyMatch<BuildAirToolbarWindow>(_airtoolbar_hotkeys, keycode, NULL, true); int num = CheckHotkeyMatch<BuildAirToolbarWindow>(_airtoolbar_hotkeys, keycode, NULL, true);
if (num == -1) return ES_NOT_HANDLED; if (num == -1) return ES_NOT_HANDLED;
Window *w = ShowBuildAirToolbar(); Window *w = ShowBuildAirToolbar();
@@ -422,11 +424,6 @@ public:
_selected_airport_index = airport_index; _selected_airport_index = airport_index;
_selected_airport_layout = 0; _selected_airport_layout = 0;
if (_selected_airport_index != -1) {
const AirportSpec *as = AirportClass::Get(_selected_airport_class, _selected_airport_index);
this->preview_sprite = GetCustomAirportSprite(as, _selected_airport_layout);
}
this->UpdateSelectSize(); this->UpdateSelectSize();
this->SetDirty(); this->SetDirty();
} }
@@ -445,6 +442,8 @@ public:
if (rotation == DIR_E || rotation == DIR_W) Swap(w, h); if (rotation == DIR_E || rotation == DIR_W) Swap(w, h);
SetTileSelectSize(w, h); SetTileSelectSize(w, h);
this->preview_sprite = GetCustomAirportSprite(as, _selected_airport_layout);
this->SetWidgetDisabledState(BAIRW_LAYOUT_DECREASE, _selected_airport_layout == 0); this->SetWidgetDisabledState(BAIRW_LAYOUT_DECREASE, _selected_airport_layout == 0);
this->SetWidgetDisabledState(BAIRW_LAYOUT_INCREASE, _selected_airport_layout + 1 >= as->num_table); this->SetWidgetDisabledState(BAIRW_LAYOUT_INCREASE, _selected_airport_layout + 1 >= as->num_table);
@@ -578,7 +577,7 @@ static const NWidgetPart _nested_build_airport_widgets[] = {
static const WindowDesc _build_airport_desc( static const WindowDesc _build_airport_desc(
WDP_AUTO, 0, 0, WDP_AUTO, 0, 0,
WC_BUILD_STATION, WC_BUILD_TOOLBAR, WC_BUILD_STATION, WC_BUILD_TOOLBAR,
WDF_CONSTRUCTION, WDF_CONSTRUCTION | WDF_UNCLICK_BUTTONS,
_nested_build_airport_widgets, lengthof(_nested_build_airport_widgets) _nested_build_airport_widgets, lengthof(_nested_build_airport_widgets)
); );
@@ -590,4 +589,5 @@ static void ShowBuildAirportPicker(Window *parent)
void InitializeAirportGui() void InitializeAirportGui()
{ {
_selected_airport_class = APC_BEGIN; _selected_airport_class = APC_BEGIN;
_selected_airport_index = -1;
} }

View File

@@ -213,29 +213,35 @@ static CargoID GetNewCargoTypeForReplace(Vehicle *v, EngineID engine_type, bool
* Get the EngineID of the replacement for a vehicle * Get the EngineID of the replacement for a vehicle
* @param v The vehicle to find a replacement for * @param v The vehicle to find a replacement for
* @param c The vehicle's owner (it's faster to forward the pointer than refinding it) * @param c The vehicle's owner (it's faster to forward the pointer than refinding it)
* @return the EngineID of the replacement. INVALID_ENGINE if no buildable replacement is found * @param [out] e the EngineID of the replacement. INVALID_ENGINE if no replacement is found
* @return Error if the engine to build is not available
*/ */
static EngineID GetNewEngineType(const Vehicle *v, const Company *c) static CommandCost GetNewEngineType(const Vehicle *v, const Company *c, EngineID &e)
{ {
assert(v->type != VEH_TRAIN || !v->IsArticulatedPart()); assert(v->type != VEH_TRAIN || !v->IsArticulatedPart());
e = INVALID_ENGINE;
if (v->type == VEH_TRAIN && Train::From(v)->IsRearDualheaded()) { if (v->type == VEH_TRAIN && Train::From(v)->IsRearDualheaded()) {
/* we build the rear ends of multiheaded trains with the front ones */ /* we build the rear ends of multiheaded trains with the front ones */
return INVALID_ENGINE; return CommandCost();
} }
EngineID e = EngineReplacementForCompany(c, v->engine_type, v->group_id); e = EngineReplacementForCompany(c, v->engine_type, v->group_id);
/* Autoreplace, if engine is available */
if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) { if (e != INVALID_ENGINE && IsEngineBuildable(e, v->type, _current_company)) {
return e; return CommandCost();
} }
if (v->NeedsAutorenewing(c) && // replace if engine is too old /* Autorenew if needed */
IsEngineBuildable(v->engine_type, v->type, _current_company)) { // engine can still be build if (v->NeedsAutorenewing(c)) e = v->engine_type;
return v->engine_type;
}
return INVALID_ENGINE; /* Nothing to do or all is fine? */
if (e == INVALID_ENGINE || IsEngineBuildable(e, v->type, _current_company)) return CommandCost();
/* The engine we need is not available. Report error to user */
return CommandCost(STR_ERROR_RAIL_VEHICLE_NOT_AVAILABLE + v->type);
} }
/** /**
@@ -252,7 +258,9 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
/* Shall the vehicle be replaced? */ /* Shall the vehicle be replaced? */
const Company *c = Company::Get(_current_company); const Company *c = Company::Get(_current_company);
EngineID e = GetNewEngineType(old_veh, c); EngineID e;
CommandCost cost = GetNewEngineType(old_veh, c, e);
if (cost.Failed()) return cost;
if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered if (e == INVALID_ENGINE) return CommandCost(); // neither autoreplace is set, nor autorenew is triggered
/* Does it need to be refitted */ /* Does it need to be refitted */
@@ -260,7 +268,7 @@ static CommandCost BuildReplacementVehicle(Vehicle *old_veh, Vehicle **new_vehic
if (refit_cargo == CT_INVALID) return CommandCost(); // incompatible cargos if (refit_cargo == CT_INVALID) return CommandCost(); // incompatible cargos
/* Build the new vehicle */ /* Build the new vehicle */
CommandCost cost = DoCommand(old_veh->tile, e, 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh)); cost = DoCommand(old_veh->tile, e, 0, DC_EXEC | DC_AUTOREPLACE, GetCmdBuildVeh(old_veh));
if (cost.Failed()) return cost; if (cost.Failed()) return cost;
Vehicle *new_veh = Vehicle::Get(_new_vehicle_id); Vehicle *new_veh = Vehicle::Get(_new_vehicle_id);
@@ -662,8 +670,11 @@ CommandCost CmdAutoreplaceVehicle(TileIndex tile, DoCommandFlag flags, uint32 p1
/* Test whether any replacement is set, before issuing a whole lot of commands that would end in nothing changed */ /* Test whether any replacement is set, before issuing a whole lot of commands that would end in nothing changed */
Vehicle *w = v; Vehicle *w = v;
bool any_replacements = false; bool any_replacements = false;
while (w != NULL && !any_replacements) { while (w != NULL) {
any_replacements = (GetNewEngineType(w, c) != INVALID_ENGINE); EngineID e;
CommandCost cost = GetNewEngineType(w, c, e);
if (cost.Failed()) return cost;
any_replacements |= (e != INVALID_ENGINE);
w = (!free_wagon && w->type == VEH_TRAIN ? Train::From(w)->GetNextUnit() : NULL); w = (!free_wagon && w->type == VEH_TRAIN ? Train::From(w)->GetNextUnit() : NULL);
} }
@@ -731,7 +742,7 @@ CommandCost CmdSetAutoReplace(TileIndex tile, DoCommandFlag flags, uint32 p1, ui
GroupID id_g = GB(p1, 16, 16); GroupID id_g = GB(p1, 16, 16);
CommandCost cost; CommandCost cost;
if (!Group::IsValidID(id_g) && !IsAllGroupID(id_g) && !IsDefaultGroupID(id_g)) return CMD_ERROR; if (Group::IsValidID(id_g) ? Group::Get(id_g)->owner != _current_company : !IsAllGroupID(id_g) && !IsDefaultGroupID(id_g)) return CMD_ERROR;
if (!Engine::IsValidID(old_engine_type)) return CMD_ERROR; if (!Engine::IsValidID(old_engine_type)) return CMD_ERROR;
if (new_engine_type != INVALID_ENGINE) { if (new_engine_type != INVALID_ENGINE) {

View File

@@ -13,6 +13,7 @@
#include "bmp.h" #include "bmp.h"
#include "core/bitmath_func.hpp" #include "core/bitmath_func.hpp"
#include "core/alloc_func.hpp" #include "core/alloc_func.hpp"
#include "core/mem_func.hpp"
void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file) void BmpInitializeBuffer(BmpBuffer *buffer, FILE *file)
{ {
@@ -129,53 +130,63 @@ static inline bool BmpRead4(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
*/ */
static inline bool BmpRead4Rle(BmpBuffer *buffer, BmpInfo *info, BmpData *data) static inline bool BmpRead4Rle(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
{ {
uint i;
uint x = 0; uint x = 0;
uint y = info->height - 1; uint y = info->height - 1;
byte n, c, b;
byte *pixel = &data->bitmap[y * info->width]; byte *pixel = &data->bitmap[y * info->width];
while (y != 0 || x < info->width) { while (y != 0 || x < info->width) {
if (EndOfBuffer(buffer)) return false; // the file is shorter than expected if (EndOfBuffer(buffer)) return false; // the file is shorter than expected
n = ReadByte(buffer);
c = ReadByte(buffer); byte n = ReadByte(buffer);
byte c = ReadByte(buffer);
if (n == 0) { if (n == 0) {
switch (c) { switch (c) {
case 0: // end of line case 0: // end of line
x = 0; x = 0;
pixel = &data->bitmap[--y * info->width]; if (y == 0) return false;
break; pixel = &data->bitmap[--y * info->width];
case 1: // end of bitmap break;
x = info->width;
y = 0; case 1: // end of bitmap
pixel = NULL; return true;
break;
case 2: // delta case 2: { // delta
x += ReadByte(buffer); if (EndOfBuffer(buffer)) return false;
i = ReadByte(buffer); byte dx = ReadByte(buffer);
if (x >= info->width || (y == 0 && i > 0)) return false; byte dy = ReadByte(buffer);
y -= i;
pixel = &data->bitmap[y * info->width + x]; /* Check for over- and underflow. */
break; if (x + dx >= info->width || x + dx < x || dy > y) return false;
default: // uncompressed
i = 0; x += dx;
while (i++ < c) { y -= dy;
if (EndOfBuffer(buffer) || x >= info->width) return false; pixel = &data->bitmap[y * info->width + x];
b = ReadByte(buffer); break;
*pixel++ = GB(b, 4, 4); }
x++;
if (x < info->width && i++ < c) { default: { // uncompressed
*pixel++ = GB(b, 0, 4); uint i = 0;
x++; while (i++ < c) {
} if (EndOfBuffer(buffer) || x >= info->width) return false;
byte b = ReadByte(buffer);
*pixel++ = GB(b, 4, 4);
x++;
if (i++ < c) {
if (x >= info->width) return false;
*pixel++ = GB(b, 0, 4);
x++;
}
}
/* Padding for 16 bit align */
SkipBytes(buffer, ((c + 1) / 2) % 2);
break;
} }
/* Padding for 16 bit align */
SkipBytes(buffer, ((c + 1) / 2) % 2);
break;
} }
} else { } else {
i = 0; /* Apparently it is common to encounter BMPs where the count of
while (i++ < n) { * pixels to be written is higher than the remaining line width.
if (EndOfBuffer(buffer) || x >= info->width) return false; * Ignore the superfluous pixels instead of reporting an error. */
uint i = 0;
while (x < info->width && i++ < n) {
*pixel++ = GB(c, 4, 4); *pixel++ = GB(c, 4, 4);
x++; x++;
if (x < info->width && i++ < n) { if (x < info->width && i++ < n) {
@@ -212,43 +223,55 @@ static inline bool BmpRead8(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
*/ */
static inline bool BmpRead8Rle(BmpBuffer *buffer, BmpInfo *info, BmpData *data) static inline bool BmpRead8Rle(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
{ {
uint i;
uint x = 0; uint x = 0;
uint y = info->height - 1; uint y = info->height - 1;
byte n, c;
byte *pixel = &data->bitmap[y * info->width]; byte *pixel = &data->bitmap[y * info->width];
while (y != 0 || x < info->width) { while (y != 0 || x < info->width) {
if (EndOfBuffer(buffer)) return false; // the file is shorter than expected if (EndOfBuffer(buffer)) return false; // the file is shorter than expected
n = ReadByte(buffer);
c = ReadByte(buffer); byte n = ReadByte(buffer);
byte c = ReadByte(buffer);
if (n == 0) { if (n == 0) {
switch (c) { switch (c) {
case 0: // end of line case 0: // end of line
x = 0; x = 0;
pixel = &data->bitmap[--y * info->width]; if (y == 0) return false;
break; pixel = &data->bitmap[--y * info->width];
case 1: // end of bitmap break;
x = info->width;
y = 0; case 1: // end of bitmap
pixel = NULL; return true;
break;
case 2: // delta case 2: { // delta
x += ReadByte(buffer); if (EndOfBuffer(buffer)) return false;
i = ReadByte(buffer); byte dx = ReadByte(buffer);
if (x >= info->width || (y == 0 && i > 0)) return false; byte dy = ReadByte(buffer);
y -= i;
pixel = &data->bitmap[y * info->width + x]; /* Check for over- and underflow. */
break; if (x + dx >= info->width || x + dx < x || dy > y) return false;
default: // uncompressed
if ((x += c) > info->width) return false; x += dx;
for (i = 0; i < c; i++) *pixel++ = ReadByte(buffer); y -= dy;
/* Padding for 16 bit align */ pixel = &data->bitmap[y * info->width + x];
SkipBytes(buffer, c % 2); break;
break; }
default: { // uncompressed
for (uint i = 0; i < c; i++) {
if (EndOfBuffer(buffer) || x >= info->width) return false;
*pixel++ = ReadByte(buffer);
x++;
}
/* Padding for 16 bit align */
SkipBytes(buffer, c % 2);
break;
}
} }
} else { } else {
for (i = 0; i < n; i++) { /* Apparently it is common to encounter BMPs where the count of
if (x >= info->width) return false; * pixels to be written is higher than the remaining line width.
* Ignore the superfluous pixels instead of reporting an error. */
for (uint i = 0; x < info->width && i < n; i++) {
*pixel++ = c; *pixel++ = c;
x++; x++;
} }
@@ -287,6 +310,7 @@ bool BmpReadHeader(BmpBuffer *buffer, BmpInfo *info, BmpData *data)
{ {
uint32 header_size; uint32 header_size;
assert(info != NULL); assert(info != NULL);
MemSetT(info, 0);
/* Reading BMP header */ /* Reading BMP header */
if (ReadWord(buffer) != 0x4D42) return false; // signature should be 'BM' if (ReadWord(buffer) != 0x4D42) return false; // signature should be 'BM'

View File

@@ -420,7 +420,11 @@ void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transpo
Money infra_cost = 0; Money infra_cost = 0;
switch (transport_type) { switch (transport_type) {
case TRANSPORT_ROAD: infra_cost = (bridge_len + 2) * _price[PR_BUILD_ROAD] * 2; break; case TRANSPORT_ROAD:
infra_cost = (bridge_len + 2) * _price[PR_BUILD_ROAD] * 2;
/* In case we add a new road type as well, we must be aware of those costs. */
if (IsBridgeTile(start)) infra_cost *= CountBits(GetRoadTypes(start) | (RoadTypes)road_rail_type);
break;
case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost((RailType)road_rail_type); break; case TRANSPORT_RAIL: infra_cost = (bridge_len + 2) * RailBuildCost((RailType)road_rail_type); break;
default: break; default: break;
} }

View File

@@ -740,7 +740,7 @@ static uint ShowAdditionalText(int left, int right, int y, EngineID engine)
/* STR_BLACK_STRING is used to start the string with {BLACK} */ /* STR_BLACK_STRING is used to start the string with {BLACK} */
SetDParam(0, GetGRFStringID(GetEngineGRFID(engine), 0xD000 + callback)); SetDParam(0, GetGRFStringID(GetEngineGRFID(engine), 0xD000 + callback));
PrepareTextRefStackUsage(0); StartTextRefStackUsage(0);
uint result = DrawStringMultiLine(left, right, y, INT32_MAX, STR_BLACK_STRING); uint result = DrawStringMultiLine(left, right, y, INT32_MAX, STR_BLACK_STRING);
StopTextRefStackUsage(); StopTextRefStackUsage();
return result; return result;

View File

@@ -216,7 +216,7 @@ void CargoList<Tinst>::Truncate(uint max_remaining)
CargoPacket *cp = *it; CargoPacket *cp = *it;
if (max_remaining == 0) { if (max_remaining == 0) {
/* Nothing should remain, just remove the packets. */ /* Nothing should remain, just remove the packets. */
this->packets.erase(it++); it = this->packets.erase(it);
static_cast<Tinst *>(this)->RemoveFromCache(cp); static_cast<Tinst *>(this)->RemoveFromCache(cp);
delete cp; delete cp;
continue; continue;
@@ -276,7 +276,7 @@ bool CargoList<Tinst>::MoveTo(Tother_inst *dest, uint max_move, MoveToAction mta
if (cp->count <= max_move) { if (cp->count <= max_move) {
/* Can move the complete packet */ /* Can move the complete packet */
max_move -= cp->count; max_move -= cp->count;
this->packets.erase(it++); it = this->packets.erase(it);
static_cast<Tinst *>(this)->RemoveFromCache(cp); static_cast<Tinst *>(this)->RemoveFromCache(cp);
switch (mta) { switch (mta) {
case MTA_FINAL_DELIVERY: case MTA_FINAL_DELIVERY:

View File

@@ -530,7 +530,7 @@ bool DoCommandP(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd, CommandCallbac
/* Only show the error when it's for us. */ /* Only show the error when it's for us. */
StringID error_part1 = GB(cmd, 16, 16); StringID error_part1 = GB(cmd, 16, 16);
if (estimate_only || (IsLocalCompany() && error_part1 != 0 && my_cmd)) { if (estimate_only || (IsLocalCompany() && error_part1 != 0 && my_cmd)) {
ShowErrorMessage(error_part1, res.GetErrorMessage(), WL_INFO, x, y); ShowErrorMessage(error_part1, res.GetErrorMessage(), WL_INFO, x, y, res.GetTextRefStackSize(), res.GetTextRefStack());
} }
} else if (estimate_only) { } else if (estimate_only) {
ShowEstimatedCostOrIncome(res.GetCost(), x, y); ShowEstimatedCostOrIncome(res.GetCost(), x, y);
@@ -633,6 +633,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
/* Test the command. */ /* Test the command. */
_cleared_object_areas.Clear(); _cleared_object_areas.Clear();
SetTownRatingTestMode(true); SetTownRatingTestMode(true);
ClearStorageChanges(false);
res = proc(tile, flags, p1, p2, text); res = proc(tile, flags, p1, p2, text);
SetTownRatingTestMode(false); SetTownRatingTestMode(false);
@@ -672,6 +673,7 @@ CommandCost DoCommandPInternal(TileIndex tile, uint32 p1, uint32 p2, uint32 cmd,
/* Actually try and execute the command. If no cost-type is given /* Actually try and execute the command. If no cost-type is given
* use the construction one */ * use the construction one */
_cleared_object_areas.Clear(); _cleared_object_areas.Clear();
ClearStorageChanges(false);
CommandCost res2 = proc(tile, flags | DC_EXEC, p1, p2, text); CommandCost res2 = proc(tile, flags | DC_EXEC, p1, p2, text);
if (cmd_id == CMD_COMPANY_CTRL) { if (cmd_id == CMD_COMPANY_CTRL) {
@@ -735,3 +737,25 @@ void CommandCost::AddCost(const CommandCost &ret)
this->success = false; this->success = false;
} }
} }
/**
* Values to put on the #TextRefStack for the error message.
* There is only one static instance of the array, just like there is only one
* instance of normal DParams.
*/
uint32 CommandCost::textref_stack[16];
/**
* Activate usage of the NewGRF #TextRefStack for the error message.
* @param number of entries to copy from the temporary NewGRF registers
*/
void CommandCost::UseTextRefStack(uint num_registers)
{
extern TemporaryStorageArray<int32, 0x110> _temp_store;
assert(num_registers < lengthof(textref_stack));
this->textref_stack_size = num_registers;
for (uint i = 0; i < num_registers; i++) {
textref_stack[i] = _temp_store.Get(0x100 + i);
}
}

View File

@@ -25,30 +25,33 @@ class CommandCost {
Money cost; ///< The cost of this action Money cost; ///< The cost of this action
StringID message; ///< Warning message for when success is unset StringID message; ///< Warning message for when success is unset
bool success; ///< Whether the comment went fine up to this moment bool success; ///< Whether the comment went fine up to this moment
uint textref_stack_size; ///< Number of uint32 values to put on the #TextRefStack for the error message.
static uint32 textref_stack[16];
public: public:
/** /**
* Creates a command cost return with no cost and no error * Creates a command cost return with no cost and no error
*/ */
CommandCost() : expense_type(INVALID_EXPENSES), cost(0), message(INVALID_STRING_ID), success(true) {} CommandCost() : expense_type(INVALID_EXPENSES), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}
/** /**
* Creates a command return value the is failed with the given message * Creates a command return value the is failed with the given message
*/ */
explicit CommandCost(StringID msg) : expense_type(INVALID_EXPENSES), cost(0), message(msg), success(false) {} explicit CommandCost(StringID msg) : expense_type(INVALID_EXPENSES), cost(0), message(msg), success(false), textref_stack_size(0) {}
/** /**
* Creates a command cost with given expense type and start cost of 0 * Creates a command cost with given expense type and start cost of 0
* @param ex_t the expense type * @param ex_t the expense type
*/ */
explicit CommandCost(ExpensesType ex_t) : expense_type(ex_t), cost(0), message(INVALID_STRING_ID), success(true) {} explicit CommandCost(ExpensesType ex_t) : expense_type(ex_t), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}
/** /**
* Creates a command return value with the given start cost and expense type * Creates a command return value with the given start cost and expense type
* @param ex_t the expense type * @param ex_t the expense type
* @param cst the initial cost of this command * @param cst the initial cost of this command
*/ */
CommandCost(ExpensesType ex_t, const Money &cst) : expense_type(ex_t), cost(cst), message(INVALID_STRING_ID), success(true) {} CommandCost(ExpensesType ex_t, const Money &cst) : expense_type(ex_t), cost(cst), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}
/** /**
@@ -100,6 +103,26 @@ public:
this->message = message; this->message = message;
} }
void UseTextRefStack(uint num_registers);
/**
* Returns the number of uint32 values for the #TextRefStack of the error message.
* @return number of uint32 values.
*/
uint GetTextRefStackSize() const
{
return this->textref_stack_size;
}
/**
* Returns a pointer to the values for the #TextRefStack of the error message.
* @return uint32 values for the #TextRefStack
*/
const uint32 *GetTextRefStack() const
{
return textref_stack;
}
/** /**
* Returns the error message of a command * Returns the error message of a command
* @return the error message, if succeeded #INVALID_STRING_ID * @return the error message, if succeeded #INVALID_STRING_ID

View File

@@ -349,7 +349,7 @@ static void GenerateCompanyName(Company *c)
StringID str; StringID str;
uint32 strp; uint32 strp;
if (t->name == NULL && IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1)) { if (t->name == NULL && IsInsideMM(t->townnametype, SPECSTR_TOWNNAME_START, SPECSTR_TOWNNAME_LAST + 1)) {
str = t->townnametype - SPECSTR_TOWNNAME_START + SPECSTR_PLAYERNAME_START; str = t->townnametype - SPECSTR_TOWNNAME_START + SPECSTR_COMPANY_NAME_START;
strp = t->townnameparts; strp = t->townnameparts;
verify_name:; verify_name:;
@@ -773,13 +773,14 @@ void CompanyAdminUpdate(const Company *company)
} }
/** /**
* Called whenever a company goes bankrupt in order to notify admins. * Called whenever a company is removed in order to notify admins.
* @param company_id The company that went bankrupt. * @param company_id The company that was removed.
* @param reason The reason the company was removed.
*/ */
void CompanyAdminBankrupt(CompanyID company_id) void CompanyAdminRemove(CompanyID company_id, CompanyRemoveReason reason)
{ {
#ifdef ENABLE_NETWORK #ifdef ENABLE_NETWORK
if (_network_server) NetworkAdminCompanyRemove(company_id, ADMIN_CRR_BANKRUPT); if (_network_server) NetworkAdminCompanyRemove(company_id, (AdminCompanyRemoveReason)reason);
#endif /* ENABLE_NETWORK */ #endif /* ENABLE_NETWORK */
} }
@@ -846,7 +847,6 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
} }
if (_network_server) { if (_network_server) {
CompanyID old_playas = ci->client_playas;
ci->client_playas = c->index; ci->client_playas = c->index;
NetworkUpdateClientInfo(ci->client_id); NetworkUpdateClientInfo(ci->client_id);
@@ -869,11 +869,9 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
NetworkSendCommand(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name, ci->client_playas); NetworkSendCommand(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name, ci->client_playas);
} }
/* Announce new company on network, if the client was a SPECTATOR before */ /* Announce new company on network. */
if (old_playas == COMPANY_SPECTATOR) { NetworkAdminCompanyInfo(c, true);
NetworkAdminCompanyInfo(c, true); NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, ci->client_playas + 1);
NetworkServerSendChat(NETWORK_ACTION_COMPANY_NEW, DESTTYPE_BROADCAST, 0, "", ci->client_id, ci->client_playas + 1);
}
} }
#endif /* ENABLE_NETWORK */ #endif /* ENABLE_NETWORK */
break; break;
@@ -887,6 +885,9 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
break; break;
case 2: { // Delete a company case 2: { // Delete a company
CompanyRemoveReason reason = (CompanyRemoveReason)GB(p2, 0, 2);
if (reason >= CRR_END) return CMD_ERROR;
Company *c = Company::GetIfValid(company_id); Company *c = Company::GetIfValid(company_id);
if (c == NULL) return CMD_ERROR; if (c == NULL) return CMD_ERROR;
@@ -910,7 +911,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
CompanyID c_index = c->index; CompanyID c_index = c->index;
delete c; delete c;
AI::BroadcastNewEvent(new AIEventCompanyBankrupt(c_index)); AI::BroadcastNewEvent(new AIEventCompanyBankrupt(c_index));
CompanyAdminBankrupt(c_index); CompanyAdminRemove(c_index, (CompanyRemoveReason)reason);
break; break;
} }

View File

@@ -1824,6 +1824,15 @@ struct CompanyWindow : Window
virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize) virtual void UpdateWidgetSize(int widget, Dimension *size, const Dimension &padding, Dimension *fill, Dimension *resize)
{ {
switch (widget) { switch (widget) {
case CW_WIDGET_DESC_COLOUR_SCHEME_EXAMPLE: {
Point offset;
Dimension d = GetSpriteSize(SPR_VEH_BUS_SW_VIEW, &offset);
d.width -= offset.x;
d.height -= offset.y;
*size = maxdim(*size, d);
break;
}
case CW_WIDGET_DESC_COMPANY_VALUE: case CW_WIDGET_DESC_COMPANY_VALUE:
SetDParam(0, INT64_MAX); // Arguably the maximum company value SetDParam(0, INT64_MAX); // Arguably the maximum company value
size->width = GetStringBoundingBox(STR_COMPANY_VIEW_COMPANY_VALUE).width; size->width = GetStringBoundingBox(STR_COMPANY_VIEW_COMPANY_VALUE).width;
@@ -1869,9 +1878,13 @@ struct CompanyWindow : Window
DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE, TC_FROMSTRING, SA_CENTER); DrawStringMultiLine(r.left, r.right, r.top, r.bottom, STR_COMPANY_VIEW_PRESIDENT_MANAGER_TITLE, TC_FROMSTRING, SA_CENTER);
break; break;
case CW_WIDGET_DESC_COLOUR_SCHEME_EXAMPLE: case CW_WIDGET_DESC_COLOUR_SCHEME_EXAMPLE: {
DrawSprite(SPR_VEH_BUS_SW_VIEW, COMPANY_SPRITE_COLOUR(c->index), (r.left + r.right) / 2, r.top + FONT_HEIGHT_NORMAL / 10); Point offset;
Dimension d = GetSpriteSize(SPR_VEH_BUS_SW_VIEW, &offset);
d.height -= offset.y;
DrawSprite(SPR_VEH_BUS_SW_VIEW, COMPANY_SPRITE_COLOUR(c->index), r.left - offset.x, (r.top + r.bottom - d.height) / 2 - offset.y);
break; break;
}
case CW_WIDGET_DESC_VEHICLE_COUNTS: { case CW_WIDGET_DESC_VEHICLE_COUNTS: {
uint amounts[4]; uint amounts[4];

View File

@@ -56,4 +56,13 @@ typedef uint16 CompanyMask;
struct Company; struct Company;
typedef uint32 CompanyManagerFace; ///< Company manager face bits, info see in company_manager_face.h typedef uint32 CompanyManagerFace; ///< Company manager face bits, info see in company_manager_face.h
/** The reason why the company was removed. */
enum CompanyRemoveReason {
CRR_MANUAL, ///< The company is manually removed.
CRR_AUTOCLEAN, ///< The company is removed due to autoclean.
CRR_BANKRUPT, ///< The company went belly-up.
CRR_END ///< Sentinel for end.
};
#endif /* COMPANY_TYPE_H */ #endif /* COMPANY_TYPE_H */

View File

@@ -836,7 +836,7 @@ DEF_CONSOLE_CMD(ConResetCompany)
} }
/* It is safe to remove this company */ /* It is safe to remove this company */
DoCommandP(0, 2 | index << 16, 0, CMD_COMPANY_CTRL); DoCommandP(0, 2 | index << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
IConsolePrint(CC_DEFAULT, "Company deleted."); IConsolePrint(CC_DEFAULT, "Company deleted.");
return true; return true;
@@ -1196,7 +1196,7 @@ DEF_CONSOLE_CMD(ConReloadAI)
} }
/* First kill the company of the AI, then start a new one. This should start the current AI again */ /* First kill the company of the AI, then start a new one. This should start the current AI again */
DoCommandP(0, 2 | company_id << 16, 0, CMD_COMPANY_CTRL); DoCommandP(0, 2 | company_id << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
DoCommandP(0, 1 | company_id << 16, 0, CMD_COMPANY_CTRL); DoCommandP(0, 1 | company_id << 16, 0, CMD_COMPANY_CTRL);
IConsolePrint(CC_DEFAULT, "AI reloaded."); IConsolePrint(CC_DEFAULT, "AI reloaded.");
@@ -1233,7 +1233,7 @@ DEF_CONSOLE_CMD(ConStopAI)
} }
/* Now kill the company of the AI. */ /* Now kill the company of the AI. */
DoCommandP(0, 2 | company_id << 16, 0, CMD_COMPANY_CTRL); DoCommandP(0, 2 | company_id << 16, CRR_MANUAL, CMD_COMPANY_CTRL);
IConsolePrint(CC_DEFAULT, "AI stopped, company deleted."); IConsolePrint(CC_DEFAULT, "AI stopped, company deleted.");
return true; return true;
@@ -1269,7 +1269,7 @@ DEF_CONSOLE_CMD(ConRescanNewGRF)
TarScanner::DoScan(); TarScanner::DoScan();
ScanNewGRFFiles(); ScanNewGRFFiles();
InvalidateWindowData(WC_GAME_OPTIONS, 0, 1); InvalidateWindowData(WC_GAME_OPTIONS, 0, GOID_NEWGRF_RESCANNED);
return true; return true;
} }
@@ -1640,7 +1640,7 @@ DEF_CONSOLE_CMD(ConCompanyPassword)
return false; return false;
} }
password = NetworkChangeCompanyPassword(company_id, password, false); password = NetworkChangeCompanyPassword(company_id, password);
if (StrEmpty(password)) { if (StrEmpty(password)) {
IConsolePrintF(CC_WARNING, "Company password cleared"); IConsolePrintF(CC_WARNING, "Company password cleared");

View File

@@ -22,6 +22,29 @@
void NORETURN MallocError(size_t size); void NORETURN MallocError(size_t size);
void NORETURN ReallocError(size_t size); void NORETURN ReallocError(size_t size);
/**
* Checks whether allocating memory would overflow size_t.
*
* @param element_size Size of the structure to allocate.
* @param num_elements Number of elements to allocate.
*/
static inline void CheckAllocationConstraints(size_t element_size, size_t num_elements)
{
if (num_elements > SIZE_MAX / element_size) MallocError(SIZE_MAX);
}
/**
* Checks whether allocating memory would overflow size_t.
*
* @tparam T Structure to allocate.
* @param num_elements Number of elements to allocate.
*/
template <typename T>
static inline void CheckAllocationConstraints(size_t num_elements)
{
CheckAllocationConstraints(sizeof(T), num_elements);
}
/** /**
* Simplified allocation function that allocates the specified number of * Simplified allocation function that allocates the specified number of
* elements of the given type. It also explicitly casts it to the requested * elements of the given type. It also explicitly casts it to the requested
@@ -42,6 +65,9 @@ static FORCEINLINE T *MallocT(size_t num_elements)
*/ */
if (num_elements == 0) return NULL; if (num_elements == 0) return NULL;
/* Ensure the size does not overflow. */
CheckAllocationConstraints<T>(num_elements);
T *t_ptr = (T*)malloc(num_elements * sizeof(T)); T *t_ptr = (T*)malloc(num_elements * sizeof(T));
if (t_ptr == NULL) MallocError(num_elements * sizeof(T)); if (t_ptr == NULL) MallocError(num_elements * sizeof(T));
return t_ptr; return t_ptr;
@@ -96,12 +122,17 @@ static FORCEINLINE T *ReallocT(T *t_ptr, size_t num_elements)
return NULL; return NULL;
} }
/* Ensure the size does not overflow. */
CheckAllocationConstraints<T>(num_elements);
t_ptr = (T*)realloc(t_ptr, num_elements * sizeof(T)); t_ptr = (T*)realloc(t_ptr, num_elements * sizeof(T));
if (t_ptr == NULL) ReallocError(num_elements * sizeof(T)); if (t_ptr == NULL) ReallocError(num_elements * sizeof(T));
return t_ptr; return t_ptr;
} }
/** alloca() has to be called in the parent function, so define AllocaM() as a macro */ /** alloca() has to be called in the parent function, so define AllocaM() as a macro */
#define AllocaM(T, num_elements) ((T*)alloca((num_elements) * sizeof(T))) #define AllocaM(T, num_elements) \
(CheckAllocationConstraints<T>(num_elements), \
(T*)alloca((num_elements) * sizeof(T)))
#endif /* ALLOC_FUNC_HPP */ #endif /* ALLOC_FUNC_HPP */

View File

@@ -292,6 +292,21 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
/* In all cases, make spectators of clients connected to that company */ /* In all cases, make spectators of clients connected to that company */
if (_networking) NetworkClientsToSpectators(old_owner); if (_networking) NetworkClientsToSpectators(old_owner);
#endif /* ENABLE_NETWORK */ #endif /* ENABLE_NETWORK */
if (old_owner == _local_company) {
/* Single player cheated to AI company.
* There are no specatators in single player, so we must pick some other company. */
assert(!_networking);
Backup<CompanyByte> cur_company(_current_company, FILE_LINE);
Company *c;
FOR_ALL_COMPANIES(c) {
if (c->index != old_owner) {
SetLocalCompany(c->index);
break;
}
}
cur_company.Restore();
assert(old_owner != _local_company);
}
Town *t; Town *t;
@@ -306,7 +321,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
for (i = 0; i < 4; i++) { for (i = 0; i < 4; i++) {
if (c->share_owners[i] == old_owner) { if (c->share_owners[i] == old_owner) {
/* Sell his shares */ /* Sell his shares */
CommandCost res = DoCommand(0, c->index, 0, DC_EXEC, CMD_SELL_SHARE_IN_COMPANY); CommandCost res = DoCommand(0, c->index, 0, DC_EXEC | DC_BANKRUPT, CMD_SELL_SHARE_IN_COMPANY);
/* Because we are in a DoCommand, we can't just execute another one and /* Because we are in a DoCommand, we can't just execute another one and
* expect the money to be removed. We need to do it ourself! */ * expect the money to be removed. We need to do it ourself! */
SubtractMoneyFromCompany(res); SubtractMoneyFromCompany(res);
@@ -321,7 +336,7 @@ void ChangeOwnershipOfCompanyItems(Owner old_owner, Owner new_owner)
cur_company2.Change(c->share_owners[i]); cur_company2.Change(c->share_owners[i]);
if (_current_company != INVALID_OWNER) { if (_current_company != INVALID_OWNER) {
/* Sell the shares */ /* Sell the shares */
CommandCost res = DoCommand(0, old_owner, 0, DC_EXEC, CMD_SELL_SHARE_IN_COMPANY); CommandCost res = DoCommand(0, old_owner, 0, DC_EXEC | DC_BANKRUPT, CMD_SELL_SHARE_IN_COMPANY);
/* Because we are in a DoCommand, we can't just execute another one and /* Because we are in a DoCommand, we can't just execute another one and
* expect the money to be removed. We need to do it ourself! */ * expect the money to be removed. We need to do it ourself! */
SubtractMoneyFromCompany(res); SubtractMoneyFromCompany(res);
@@ -531,7 +546,7 @@ static void CompanyCheckBankrupt(Company *c)
* that changing the current company is okay. In case of single * that changing the current company is okay. In case of single
* player we are sure (the above check) that we are not the local * player we are sure (the above check) that we are not the local
* company and thus we won't be moved. */ * company and thus we won't be moved. */
if (!_networking || _network_server) DoCommandP(0, 2 | (c->index << 16), 0, CMD_COMPANY_CTRL); if (!_networking || _network_server) DoCommandP(0, 2 | (c->index << 16), CRR_BANKRUPT, CMD_COMPANY_CTRL);
break; break;
} }
} }
@@ -1500,16 +1515,6 @@ static void DoAcquireCompany(Company *c)
owner->current_loan += c->current_loan; owner->current_loan += c->current_loan;
} }
Money value = CalculateCompanyValue(c) >> 2;
Backup<CompanyByte> cur_company(_current_company, FILE_LINE);
for (int i = 0; i != 4; i++) {
if (c->share_owners[i] != COMPANY_SPECTATOR) {
cur_company.Change(c->share_owners[i]);
SubtractMoneyFromCompany(CommandCost(EXPENSES_OTHER, -value));
}
}
cur_company.Restore();
if (c->is_ai) AI::Stop(c->index); if (c->is_ai) AI::Stop(c->index);
DeleteCompanyWindows(ci); DeleteCompanyWindows(ci);
@@ -1589,9 +1594,12 @@ CommandCost CmdSellShareInCompany(TileIndex tile, DoCommandFlag flags, uint32 p1
CompanyID target_company = (CompanyID)p1; CompanyID target_company = (CompanyID)p1;
Company *c = Company::GetIfValid(target_company); Company *c = Company::GetIfValid(target_company);
/* Check if selling shares is allowed (protection against modified clients) /* Cannot sell own shares */
* Cannot sell own shares */ if (c == NULL || _current_company == target_company) return CMD_ERROR;
if (c == NULL || !_settings_game.economy.allow_shares || _current_company == target_company) return CMD_ERROR;
/* Check if selling shares is allowed (protection against modified clients).
* However, we must sell shares of companies being closed down. */
if (!_settings_game.economy.allow_shares && !(flags & DC_BANKRUPT)) return CMD_ERROR;
/* Those lines are here for network-protection (clients can be slow) */ /* Those lines are here for network-protection (clients can be slow) */
if (GetAmountOwnedBy(c, _current_company) == 0) return CommandCost(); if (GetAmountOwnedBy(c, _current_company) == 0) return CommandCost();

View File

@@ -91,6 +91,8 @@ Engine::Engine(VehicleType type, EngineID base)
this->info.base_life = 0xFF; this->info.base_life = 0xFF;
/* Set road vehicle tractive effort to the default value */ /* Set road vehicle tractive effort to the default value */
if (type == VEH_ROAD) this->u.road.tractive_effort = 0x4C; if (type == VEH_ROAD) this->u.road.tractive_effort = 0x4C;
/* Aircraft must have CT_INVALID as default, as there is no property */
if (type == VEH_AIRCRAFT) this->info.cargo_type = CT_INVALID;
/* Set visual effect to the default value */ /* Set visual effect to the default value */
switch (type) { switch (type) {
case VEH_TRAIN: this->u.rail.visual_effect = VE_DEFAULT; break; case VEH_TRAIN: this->u.rail.visual_effect = VE_DEFAULT; break;
@@ -648,6 +650,10 @@ void StartupOneEngine(Engine *e, Date aging_date)
} }
} }
/**
* Start/initialise all our engines. Must be called whenever there are changes
* to the NewGRF config.
*/
void StartupEngines() void StartupEngines()
{ {
Engine *e; Engine *e;

View File

@@ -21,9 +21,7 @@
#include <Path.h> #include <Path.h>
#include <storage/FindDirectory.h> #include <storage/FindDirectory.h>
#else #else
#if defined(OPENBSD) || defined(DOS)
#include <unistd.h> #include <unistd.h>
#endif
#include <pwd.h> #include <pwd.h>
#endif #endif
#include <sys/stat.h> #include <sys/stat.h>

View File

@@ -746,18 +746,25 @@ bool SetFallbackFont(FreeTypeSettings *settings, const char *language_isocode, i
static void SetFontGeometry(FT_Face face, FontSize size, int pixels) static void SetFontGeometry(FT_Face face, FontSize size, int pixels)
{ {
FT_Set_Pixel_Sizes(face, 0, pixels); FT_Error err = FT_Set_Pixel_Sizes(face, 0, pixels);
if (err == FT_Err_Invalid_Pixel_Size) {
if (FT_IS_SCALABLE(face)) { /* Find nearest size to that requested */
int asc = face->ascender * pixels / face->units_per_EM; FT_Bitmap_Size *bs = face->available_sizes;
int dec = face->descender * pixels / face->units_per_EM; int i = face->num_fixed_sizes;
int n = bs->height;
for (; --i; bs++) {
if (abs(pixels - bs->height) < abs(pixels - n)) n = bs->height;
}
_ascender[size] = asc; FT_Set_Pixel_Sizes(face, 0, n);
_font_height[size] = asc - dec;
} else {
_ascender[size] = pixels;
_font_height[size] = pixels;
} }
int asc = face->size->metrics.ascender >> 6;
int dec = face->size->metrics.descender >> 6;
_ascender[size] = asc;
_font_height[size] = asc - dec;
} }
/** /**
@@ -1034,6 +1041,9 @@ const Sprite *GetGlyph(FontSize size, WChar key)
width = max(1, slot->bitmap.width + (size == FS_NORMAL)); width = max(1, slot->bitmap.width + (size == FS_NORMAL));
height = max(1, slot->bitmap.rows + (size == FS_NORMAL)); height = max(1, slot->bitmap.rows + (size == FS_NORMAL));
/* Limit glyph size to prevent overflows later on. */
if (width > 256 || height > 256) usererror("Font glyph is too large");
/* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */ /* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */
sprite.AllocateData(width * height); sprite.AllocateData(width * height);
sprite.width = width; sprite.width = width;

View File

@@ -86,7 +86,6 @@ enum GenerateLandscapeWindowWidgets {
GLAND_LANDSCAPE_PULLDOWN, ///< Dropdown 'Land generator' GLAND_LANDSCAPE_PULLDOWN, ///< Dropdown 'Land generator'
GLAND_HEIGHTMAP_NAME_TEXT, ///< Heightmap name GLAND_HEIGHTMAP_NAME_TEXT, ///< Heightmap name
GLAND_HEIGHTMAP_NAME_SPACER, ///< Spacer used for aligning items in the second column nicely
GLAND_HEIGHTMAP_SIZE_TEXT, ///< Size of heightmap GLAND_HEIGHTMAP_SIZE_TEXT, ///< Size of heightmap
GLAND_HEIGHTMAP_ROTATION_PULLDOWN, ///< Dropdown 'Heightmap rotation' GLAND_HEIGHTMAP_ROTATION_PULLDOWN, ///< Dropdown 'Heightmap rotation'
@@ -249,45 +248,47 @@ static const NWidgetPart _nested_heightmap_load_widgets[] = {
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_ROTATION, STR_NULL), SetFill(1, 1),
EndContainer(), EndContainer(),
/* Widgets at the right of the labels. */ /* Widgets at the right of the labels. */
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_EMPTY, COLOUR_ORANGE, GLAND_HEIGHTMAP_NAME_TEXT), SetFill(1, 0),
/* Mapsize X * Y. */
NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetPadding(1, 0, 0, 0), SetFill(1, 1),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_EDITBOX, COLOUR_WHITE, GLAND_RANDOM_EDITBOX), SetDataTip(STR_MAPGEN_RANDOM_SEED_OSKTITLE, STR_MAPGEN_RANDOM_SEED_HELP), SetFill(1, 1),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_TREE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_HEIGHTMAP_ROTATION_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(NWID_VERTICAL), SetPIP(0, 4, 0), NWidget(NWID_VERTICAL), SetPIP(0, 4, 0),
NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0), NWidget(WWT_EMPTY, COLOUR_ORANGE, GLAND_HEIGHTMAP_NAME_TEXT), SetFill(1, 0),
NWidget(NWID_HORIZONTAL), SetPIP(0, 5, 0),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(WWT_EMPTY, INVALID_COLOUR, GLAND_HEIGHTMAP_NAME_SPACER), SetFill(1, 0), /* Mapsize X * Y. */
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_NULL), SetFill(1, 1), NWidget(NWID_HORIZONTAL), SetPIP(0, 4, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1), NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_MAPSIZE_X_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_LINE_HEIGHT, STR_NULL), SetFill(1, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_BY, STR_NULL), SetPadding(1, 0, 0, 0), SetFill(1, 1),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_MAPSIZE_Y_PULLDOWN), SetDataTip(STR_JUST_INT, STR_NULL), SetFill(1, 0),
EndContainer(),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_TOWN_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_INDUSTRY_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_EDITBOX, COLOUR_WHITE, GLAND_RANDOM_EDITBOX), SetDataTip(STR_MAPGEN_RANDOM_SEED_OSKTITLE, STR_MAPGEN_RANDOM_SEED_HELP), SetFill(1, 1),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_TREE_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
NWidget(WWT_DROPDOWN, COLOUR_ORANGE, GLAND_HEIGHTMAP_ROTATION_PULLDOWN), SetDataTip(STR_JUST_STRING, STR_NULL), SetFill(1, 0),
EndContainer(), EndContainer(),
NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0), NWidget(NWID_VERTICAL), SetPIP(0, 4, 0),
NWidget(WWT_EMPTY, INVALID_COLOUR, GLAND_HEIGHTMAP_NAME_SPACER), SetFill(1, 0), NWidget(NWID_HORIZONTAL), SetPIP(0, 3, 0),
NWidget(WWT_TEXT, COLOUR_ORANGE, GLAND_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 0), NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE_LABEL, STR_NULL), SetFill(1, 1),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_DATE, STR_NULL), SetFill(1, 1),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, GLAND_START_DATE_TEXT), SetDataTip(STR_BLACK_DATE_LONG, STR_NULL), SetFill(1, 0), NWidget(WWT_TEXT, COLOUR_ORANGE), SetDataTip(STR_MAPGEN_SNOW_LINE_HEIGHT, STR_NULL), SetFill(1, 1),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1), EndContainer(),
EndContainer(), NWidget(NWID_VERTICAL, NC_EQUALSIZE), SetPIP(0, 4, 0),
NWidget(NWID_HORIZONTAL), NWidget(WWT_TEXT, COLOUR_ORANGE, GLAND_HEIGHTMAP_SIZE_TEXT), SetDataTip(STR_MAPGEN_HEIGHTMAP_SIZE, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_SNOW_LEVEL_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_LINE_DOWN), SetFill(0, 1), NWidget(NWID_HORIZONTAL),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, GLAND_SNOW_LEVEL_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0), NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_START_DATE_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_BACKWARD), SetFill(0, 1),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_SNOW_LEVEL_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_LINE_UP), SetFill(0, 1), NWidget(WWT_TEXTBTN, COLOUR_ORANGE, GLAND_START_DATE_TEXT), SetDataTip(STR_BLACK_DATE_LONG, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_START_DATE_UP), SetDataTip(SPR_ARROW_UP, STR_SCENEDIT_TOOLBAR_TOOLTIP_MOVE_THE_STARTING_DATE_FORWARD), SetFill(0, 1),
EndContainer(),
NWidget(NWID_HORIZONTAL),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_SNOW_LEVEL_DOWN), SetDataTip(SPR_ARROW_DOWN, STR_MAPGEN_SNOW_LINE_DOWN), SetFill(0, 1),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, GLAND_SNOW_LEVEL_TEXT), SetDataTip(STR_BLACK_INT, STR_NULL), SetFill(1, 0),
NWidget(WWT_IMGBTN, COLOUR_ORANGE, GLAND_SNOW_LEVEL_UP), SetDataTip(SPR_ARROW_UP, STR_MAPGEN_SNOW_LINE_UP), SetFill(0, 1),
EndContainer(),
EndContainer(),
EndContainer(), EndContainer(),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, GLAND_RANDOM_BUTTON), SetDataTip(STR_MAPGEN_RANDOM, STR_MAPGEN_RANDOM_HELP), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREEN, GLAND_GENERATE_BUTTON), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1),
EndContainer(), EndContainer(),
EndContainer(), EndContainer(),
NWidget(WWT_TEXTBTN, COLOUR_ORANGE, GLAND_RANDOM_BUTTON), SetDataTip(STR_MAPGEN_RANDOM, STR_MAPGEN_RANDOM_HELP), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREEN, GLAND_GENERATE_BUTTON), SetDataTip(STR_MAPGEN_GENERATE, STR_NULL), SetFill(1, 1),
EndContainer(), EndContainer(),
EndContainer(), EndContainer(),
NWidget(NWID_SPACER), SetMinimalSize(0, 9), SetFill(1, 1), NWidget(NWID_SPACER), SetMinimalSize(0, 9), SetFill(1, 1),
@@ -531,7 +532,6 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
*size = maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_RANDOM), maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_WATER), GetStringBoundingBox(STR_MAPGEN_BORDER_FREEFORM))); *size = maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_RANDOM), maxdim(GetStringBoundingBox(STR_MAPGEN_BORDER_WATER), GetStringBoundingBox(STR_MAPGEN_BORDER_FREEFORM)));
break; break;
case GLAND_HEIGHTMAP_NAME_SPACER:
case GLAND_HEIGHTMAP_NAME_TEXT: case GLAND_HEIGHTMAP_NAME_TEXT:
size->width = 0; size->width = 0;
break; break;
@@ -552,12 +552,7 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
{ {
switch (widget) { switch (widget) {
case GLAND_HEIGHTMAP_NAME_TEXT: { case GLAND_HEIGHTMAP_NAME_TEXT: {
/* Little bit of a hack going on here; just to get the widgets DrawString(r.left, r.right, r.top, this->name, TC_ORANGE);
* spaced without doing much magic. The space we can draw on is
* covered by both the spacer and text widgets, so take their
* outer most boundaries (left and right) as draw locations. */
const NWidgetBase *nwi_spacer = this->GetWidget<NWidgetBase>(GLAND_HEIGHTMAP_NAME_SPACER);
DrawString(min(r.left, nwi_spacer->pos_x), max<int>(r.right, nwi_spacer->pos_x + nwi_spacer->current_x), r.top, this->name, TC_ORANGE);
break; break;
} }
} }
@@ -602,12 +597,22 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
this->SetDirty(); this->SetDirty();
break; break;
case GLAND_GENERATE_BUTTON: // Generate case GLAND_GENERATE_BUTTON: { // Generate
/* Get rotated map size. */
uint map_x;
uint map_y;
if (_settings_newgame.game_creation.heightmap_rotation == HM_CLOCKWISE) {
map_x = this->y;
map_y = this->x;
} else {
map_x = this->x;
map_y = this->y;
}
if (mode == GLWM_HEIGHTMAP && if (mode == GLWM_HEIGHTMAP &&
(this->x * 2 < (1U << _settings_newgame.game_creation.map_x) || (map_x * 2 < (1U << _settings_newgame.game_creation.map_x) ||
this->x / 2 > (1U << _settings_newgame.game_creation.map_x) || map_x / 2 > (1U << _settings_newgame.game_creation.map_x) ||
this->y * 2 < (1U << _settings_newgame.game_creation.map_y) || map_y * 2 < (1U << _settings_newgame.game_creation.map_y) ||
this->y / 2 > (1U << _settings_newgame.game_creation.map_y))) { map_y / 2 > (1U << _settings_newgame.game_creation.map_y))) {
ShowQuery( ShowQuery(
STR_WARNING_HEIGHTMAP_SCALE_CAPTION, STR_WARNING_HEIGHTMAP_SCALE_CAPTION,
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE, STR_WARNING_HEIGHTMAP_SCALE_MESSAGE,
@@ -617,6 +622,7 @@ struct GenerateLandscapeWindow : public QueryStringBaseWindow {
StartGeneratingLandscape(mode); StartGeneratingLandscape(mode);
} }
break; break;
}
case GLAND_START_DATE_DOWN: case GLAND_START_DATE_DOWN:
case GLAND_START_DATE_UP: // Year buttons case GLAND_START_DATE_UP: // Year buttons

View File

@@ -1114,13 +1114,19 @@ skip_cont:;
/** /**
* Get the size of a sprite. * Get the size of a sprite.
* @param sprid Sprite to examine. * @param sprid Sprite to examine.
* @param [out] offset Optionally returns the sprite position offset.
* @return Sprite size in pixels. * @return Sprite size in pixels.
* @note The size assumes (0, 0) as top-left coordinate and ignores any part of the sprite drawn at the left or above that position. * @note The size assumes (0, 0) as top-left coordinate and ignores any part of the sprite drawn at the left or above that position.
*/ */
Dimension GetSpriteSize(SpriteID sprid) Dimension GetSpriteSize(SpriteID sprid, Point *offset)
{ {
const Sprite *sprite = GetSprite(sprid, ST_NORMAL); const Sprite *sprite = GetSprite(sprid, ST_NORMAL);
if (offset != NULL) {
offset->x = sprite->x_offs;
offset->y = sprite->y_offs;
}
Dimension d; Dimension d;
d.width = max<int>(0, sprite->x_offs + sprite->width); d.width = max<int>(0, sprite->x_offs + sprite->width);
d.height = max<int>(0, sprite->y_offs + sprite->height); d.height = max<int>(0, sprite->y_offs + sprite->height);

View File

@@ -88,7 +88,7 @@ static const int DRAW_STRING_BUFFER = 2048;
void RedrawScreenRect(int left, int top, int right, int bottom); void RedrawScreenRect(int left, int top, int right, int bottom);
void GfxScroll(int left, int top, int width, int height, int xo, int yo); void GfxScroll(int left, int top, int width, int height, int xo, int yo);
Dimension GetSpriteSize(SpriteID sprid); Dimension GetSpriteSize(SpriteID sprid, Point *offset = NULL);
void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = NULL); void DrawSprite(SpriteID img, PaletteID pal, int x, int y, const SubSprite *sub = NULL);
/** How to align the to-be drawn text. */ /** How to align the to-be drawn text. */

View File

@@ -52,7 +52,7 @@ struct GroundVehicleCache {
enum GroundVehicleFlags { enum GroundVehicleFlags {
GVF_GOINGUP_BIT = 0, ///< Vehicle is currently going uphill. (Cached track information for acceleration) GVF_GOINGUP_BIT = 0, ///< Vehicle is currently going uphill. (Cached track information for acceleration)
GVF_GOINGDOWN_BIT = 1, ///< Vehicle is currently going downhill. (Cached track information for acceleration) GVF_GOINGDOWN_BIT = 1, ///< Vehicle is currently going downhill. (Cached track information for acceleration)
GVF_SUPPRESS_AUTOMATIC_ORDERS = 2, ///< Disable insertion and removal of automatic orders until the vehicle completes the real order. GVF_SUPPRESS_IMPLICIT_ORDERS = 2, ///< Disable insertion and removal of automatic orders until the vehicle completes the real order.
}; };
/** /**

View File

@@ -63,7 +63,7 @@ enum WarningLevel {
WL_CRITICAL, ///< Critical errors, the MessageBox is shown in all cases WL_CRITICAL, ///< Critical errors, the MessageBox is shown in all cases
}; };
void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0); void ShowErrorMessage(StringID summary_msg, StringID detailed_msg, WarningLevel wl, int x = 0, int y = 0, uint textref_stack_size = 0, const uint32 *textref_stack = NULL);
void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE); void ShowExtraViewPortWindow(TileIndex tile = INVALID_TILE);
void ShowExtraViewPortWindowForTileUnderCursor(); void ShowExtraViewPortWindowForTileUnderCursor();

View File

@@ -142,13 +142,24 @@ static bool ReadHeightmapPNG(char *filename, uint *x, uint *y, byte **map)
return false; return false;
} }
uint width = png_get_image_width(png_ptr, info_ptr);
uint height = png_get_image_height(png_ptr, info_ptr);
/* Check if image dimensions don't overflow a size_t to avoid memory corruption. */
if ((uint64)width * height >= (size_t)-1) {
ShowErrorMessage(STR_ERROR_PNGMAP, STR_ERROR_HEIGHTMAP_TOO_LARGE, WL_ERROR);
fclose(fp);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
return false;
}
if (map != NULL) { if (map != NULL) {
*map = MallocT<byte>(png_get_image_width(png_ptr, info_ptr) * png_get_image_height(png_ptr, info_ptr)); *map = MallocT<byte>(width * height);
ReadHeightmapPNGImageData(*map, png_ptr, info_ptr); ReadHeightmapPNGImageData(*map, png_ptr, info_ptr);
} }
*x = png_get_image_width(png_ptr, info_ptr); *x = width;
*y = png_get_image_height(png_ptr, info_ptr); *y = height;
fclose(fp); fclose(fp);
png_destroy_read_struct(&png_ptr, &info_ptr, NULL); png_destroy_read_struct(&png_ptr, &info_ptr, NULL);
@@ -243,6 +254,14 @@ static bool ReadHeightmapBMP(char *filename, uint *x, uint *y, byte **map)
return false; return false;
} }
/* Check if image dimensions don't overflow a size_t to avoid memory corruption. */
if ((uint64)info.width * info.height >= (size_t)-1 / (info.bpp == 24 ? 3 : 1)) {
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_HEIGHTMAP_TOO_LARGE, WL_ERROR);
fclose(f);
BmpDestroyData(&data);
return false;
}
if (map != NULL) { if (map != NULL) {
if (!BmpReadBitmap(&buffer, &info, &data)) { if (!BmpReadBitmap(&buffer, &info, &data)) {
ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_BMPMAP_IMAGE_TYPE, WL_ERROR); ShowErrorMessage(STR_ERROR_BMPMAP, STR_ERROR_BMPMAP_IMAGE_TYPE, WL_ERROR);

View File

@@ -140,6 +140,8 @@ void PlantRandomFarmField(const Industry *i);
void ReleaseDisastersTargetingIndustry(IndustryID); void ReleaseDisastersTargetingIndustry(IndustryID);
bool IsTileForestIndustry(TileIndex tile);
#define FOR_ALL_INDUSTRIES_FROM(var, start) FOR_ALL_ITEMS_FROM(Industry, industry_index, var, start) #define FOR_ALL_INDUSTRIES_FROM(var, start) FOR_ALL_ITEMS_FROM(Industry, industry_index, var, start)
#define FOR_ALL_INDUSTRIES(var) FOR_ALL_INDUSTRIES_FROM(var, 0) #define FOR_ALL_INDUSTRIES(var) FOR_ALL_INDUSTRIES_FROM(var, 0)

View File

@@ -908,6 +908,30 @@ static void ChangeTileOwner_Industry(TileIndex tile, Owner old_owner, Owner new_
if (i->founder == old_owner) i->founder = (new_owner == INVALID_OWNER) ? OWNER_NONE : new_owner; if (i->founder == old_owner) i->founder = (new_owner == INVALID_OWNER) ? OWNER_NONE : new_owner;
} }
/**
* Check whether the tile is a forest.
* @param tile the tile to investigate.
* @return true if and only if the tile is a forest
*/
bool IsTileForestIndustry(TileIndex tile)
{
/* Check for industry tile */
if (!IsTileType(tile, MP_INDUSTRY)) return false;
const Industry *ind = Industry::GetByTile(tile);
/* Check for organic industry (i.e. not processing or extractive) */
if ((GetIndustrySpec(ind->type)->life_type & INDUSTRYLIFE_ORGANIC) == 0) return false;
/* Check for wood production */
for (uint i = 0; i < lengthof(ind->produced_cargo); i++) {
/* The industry produces wood. */
if (ind->produced_cargo[i] != CT_INVALID && CargoSpec::Get(ind->produced_cargo[i])->label == 'WOOD') return true;
}
return false;
}
static const byte _plantfarmfield_type[] = {1, 1, 1, 1, 1, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6}; static const byte _plantfarmfield_type[] = {1, 1, 1, 1, 1, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6};
static bool IsBadFarmFieldTile(TileIndex tile) static bool IsBadFarmFieldTile(TileIndex tile)

View File

@@ -74,7 +74,7 @@ static void GetCargoSuffix(uint cargo, CargoSuffixType cst, const Industry *ind,
if (HasBit(indspec->callback_mask, CBM_IND_CARGO_SUFFIX)) { if (HasBit(indspec->callback_mask, CBM_IND_CARGO_SUFFIX)) {
uint16 callback = GetIndustryCallback(CBID_INDUSTRY_CARGO_SUFFIX, 0, (cst << 8) | cargo, const_cast<Industry *>(ind), ind_type, (cst != CST_FUND) ? ind->location.tile : INVALID_TILE); uint16 callback = GetIndustryCallback(CBID_INDUSTRY_CARGO_SUFFIX, 0, (cst << 8) | cargo, const_cast<Industry *>(ind), ind_type, (cst != CST_FUND) ? ind->location.tile : INVALID_TILE);
if (GB(callback, 0, 8) != 0xFF) { if (GB(callback, 0, 8) != 0xFF) {
PrepareTextRefStackUsage(6); StartTextRefStackUsage(6);
GetString(suffix, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), suffix_last); GetString(suffix, GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback), suffix_last);
StopTextRefStackUsage(); StopTextRefStackUsage();
} }
@@ -458,8 +458,8 @@ public:
if (callback_res != CALLBACK_FAILED) { // Did it fail? if (callback_res != CALLBACK_FAILED) { // Did it fail?
str = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res); // No. here's the new string str = GetGRFStringID(indsp->grf_prop.grffile->grfid, 0xD000 + callback_res); // No. here's the new string
if (str != STR_UNDEFINED) { if (str != STR_UNDEFINED) {
PrepareTextRefStackUsage(6); StartTextRefStackUsage(6);
DrawStringMultiLine(left, right, y, bottom, str); DrawStringMultiLine(left, right, y, bottom, str, TC_YELLOW);
StopTextRefStackUsage(); StopTextRefStackUsage();
} }
} }
@@ -788,11 +788,11 @@ public:
if (message != STR_NULL && message != STR_UNDEFINED) { if (message != STR_NULL && message != STR_UNDEFINED) {
y += WD_PAR_VSEP_WIDE; y += WD_PAR_VSEP_WIDE;
PrepareTextRefStackUsage(6); StartTextRefStackUsage(6);
/* Use all the available space left from where we stand up to the /* Use all the available space left from where we stand up to the
* end of the window. We ALSO enlarge the window if needed, so we * end of the window. We ALSO enlarge the window if needed, so we
* can 'go' wild with the bottom of the window. */ * can 'go' wild with the bottom of the window. */
y = DrawStringMultiLine(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, UINT16_MAX, message); y = DrawStringMultiLine(left + WD_FRAMERECT_LEFT, right - WD_FRAMERECT_RIGHT, y, UINT16_MAX, message, TC_BLACK);
StopTextRefStackUsage(); StopTextRefStackUsage();
} }
} }

View File

@@ -99,7 +99,7 @@ STR_QUANTITY_PASSENGERS :{COMMA}راكب
STR_QUANTITY_COAL :{WEIGHT} من الفحم STR_QUANTITY_COAL :{WEIGHT} من الفحم
STR_QUANTITY_MAIL :{COMMA} صندوق من البريد STR_QUANTITY_MAIL :{COMMA} صندوق من البريد
STR_QUANTITY_OIL :{VOLUME} من النفط STR_QUANTITY_OIL :{VOLUME} من النفط
STR_QUANTITY_LIVESTOCK :{COMMA}رأس من الماشية STR_QUANTITY_LIVESTOCK :{COMMA}راس من الماشية
STR_QUANTITY_GOODS :{COMMA} قفص من البضائع STR_QUANTITY_GOODS :{COMMA} قفص من البضائع
STR_QUANTITY_GRAIN :{WEIGHT} من الحبوب STR_QUANTITY_GRAIN :{WEIGHT} من الحبوب
STR_QUANTITY_WOOD :{WEIGHT} من الخشب STR_QUANTITY_WOOD :{WEIGHT} من الخشب
@@ -117,7 +117,7 @@ STR_QUANTITY_WATER :{VOLUME} من
STR_QUANTITY_WHEAT :{WEIGHT} من القمح STR_QUANTITY_WHEAT :{WEIGHT} من القمح
STR_QUANTITY_RUBBER :{VOLUME} من المطاط STR_QUANTITY_RUBBER :{VOLUME} من المطاط
STR_QUANTITY_SUGAR :{WEIGHT} من السكر STR_QUANTITY_SUGAR :{WEIGHT} من السكر
STR_QUANTITY_TOYS :{COMMA}الألعاب STR_QUANTITY_TOYS :{COMMA}الالعاب
STR_QUANTITY_SWEETS :{COMMA} كيس من الحلويات STR_QUANTITY_SWEETS :{COMMA} كيس من الحلويات
STR_QUANTITY_COLA :{VOLUME} من الكولا STR_QUANTITY_COLA :{VOLUME} من الكولا
STR_QUANTITY_CANDYFLOSS :{WEIGHT} من الحلاوة القطنية STR_QUANTITY_CANDYFLOSS :{WEIGHT} من الحلاوة القطنية
@@ -447,6 +447,7 @@ STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :صورة للش
STR_ABOUT_MENU_GIANT_SCREENSHOT :صورة كبيرة لكامل الخريطة -Ctrl-G - STR_ABOUT_MENU_GIANT_SCREENSHOT :صورة كبيرة لكامل الخريطة -Ctrl-G -
STR_ABOUT_MENU_ABOUT_OPENTTD :حول 'OpenTTD' STR_ABOUT_MENU_ABOUT_OPENTTD :حول 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :موائم العفريتات STR_ABOUT_MENU_SPRITE_ALIGNER :موائم العفريتات
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :اضهار /اخفاء مربح الحوارات/الخيارات
############ range ends here ############ range ends here
############ range for days starts (also used for the place in the highscore window) ############ range for days starts (also used for the place in the highscore window)
@@ -1056,6 +1057,7 @@ STR_SEA_LEVEL_HIGH :عالي
STR_SEA_LEVEL_CUSTOM :مخصص STR_SEA_LEVEL_CUSTOM :مخصص
STR_SEA_LEVEL_CUSTOM_PERCENTAGE :مخصص ({NUM}%) STR_SEA_LEVEL_CUSTOM_PERCENTAGE :مخصص ({NUM}%)
STR_DISASTER_NONE :بدون STR_DISASTER_NONE :بدون
STR_DISASTER_REDUCED :قليل STR_DISASTER_REDUCED :قليل
STR_DISASTER_NORMAL :طبيعي STR_DISASTER_NORMAL :طبيعي
@@ -1223,6 +1225,7 @@ STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_LONG :طويل - 31
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :قصير - 31 - 12 - 2008 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_SHORT :قصير - 31 - 12 - 2008
STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ايزو 31-12-2008 STR_CONFIG_SETTING_DATE_FORMAT_IN_SAVE_NAMES_ISO :ايزو 31-12-2008
STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :{LTBLUE}إيقاف اللعبة تلقائيا عند بدأ لعبة جديدة: {ORANGE}{STRING} STR_CONFIG_SETTING_PAUSE_ON_NEW_GAME :{LTBLUE}إيقاف اللعبة تلقائيا عند بدأ لعبة جديدة: {ORANGE}{STRING}
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :{LTBLUE}عندمل توقف أسمح: {ORANGE}{STRING} STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL :{LTBLUE}عندمل توقف أسمح: {ORANGE}{STRING}
STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :لا تصرف STR_CONFIG_SETTING_COMMAND_PAUSE_LEVEL_NO_ACTIONS :لا تصرف
@@ -1405,6 +1408,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK} ابح
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK} عرض اعدادات الذكاء الصناعي STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK} عرض اعدادات الذكاء الصناعي
STR_INTRO_TOOLTIP_QUIT :{BLACK}اغلاق'OpenTTD' STR_INTRO_TOOLTIP_QUIT :{BLACK}اغلاق'OpenTTD'
# Quit window # Quit window
STR_QUIT_CAPTION :{WHITE}انهاء STR_QUIT_CAPTION :{WHITE}انهاء
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}هل تود اغلاق النسخة المفتوحة و العودة لـ {STRING}? STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}هل تود اغلاق النسخة المفتوحة و العودة لـ {STRING}?
@@ -1416,11 +1420,11 @@ STR_OSNAME_WINDOWS :ويندوز
STR_OSNAME_DOS :دوس STR_OSNAME_DOS :دوس
STR_OSNAME_UNIX :يونكس STR_OSNAME_UNIX :يونكس
STR_OSNAME_OSX :OS{NBSP}X STR_OSNAME_OSX :OS{NBSP}X
STR_OSNAME_BEOS :بي أو أس STR_OSNAME_BEOS :بي او اس
STR_OSNAME_HAIKU :هايكو STR_OSNAME_HAIKU :هايكو
STR_OSNAME_MORPHOS :مورف أو أس STR_OSNAME_MORPHOS :مورف او اس
STR_OSNAME_AMIGAOS :أميقا STR_OSNAME_AMIGAOS :اميقا
STR_OSNAME_OS2 :أو أس/2 STR_OSNAME_OS2 :او اس/2
STR_OSNAME_SUNOS :صن STR_OSNAME_SUNOS :صن
# Abandon game # Abandon game
@@ -2280,7 +2284,7 @@ STR_LAI_OBJECT_DESCRIPTION_COMPANY_OWNED_LAND :ارض مملو
# About OpenTTD window # About OpenTTD window
STR_ABOUT_OPENTTD :{WHITE}حول النسخة المفتوحة STR_ABOUT_OPENTTD :{WHITE}حول النسخة المفتوحة
STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}الحقوق الأصلية {COPYRIGHT} كريس سوير 1995 , جميع الحقوق محفوظة STR_ABOUT_ORIGINAL_COPYRIGHT :{BLACK}الحقوق الاصلية {COPYRIGHT} كريس سوير 1995 , جميع الحقوق محفوظة
STR_ABOUT_VERSION :{BLACK}النسخة المفتوحة رقم {REV} STR_ABOUT_VERSION :{BLACK}النسخة المفتوحة رقم {REV}
STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}النسخة المفتوحة {COPYRIGHT}2002-2011 فريق النسخة المفتوحة STR_ABOUT_COPYRIGHT_OPENTTD :{BLACK}النسخة المفتوحة {COPYRIGHT}2002-2011 فريق النسخة المفتوحة
@@ -2483,6 +2487,8 @@ STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING
STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :يحتوي على اوامر متعددة - 8 مدخلات STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :يحتوي على اوامر متعددة - 8 مدخلات
STR_NEWGRF_ERROR_READ_BOUNDS :خطأ في قرائة البرمجة STR_NEWGRF_ERROR_READ_BOUNDS :خطأ في قرائة البرمجة
STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}ملف الرسوم المستخدم حاليا يفتقد لبعض الرسوم الاساسية.{}الرجاء حدث ملف الرسوم. STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}ملف الرسوم المستخدم حاليا يفتقد لبعض الرسوم الاساسية.{}الرجاء حدث ملف الرسوم.
STR_NEWGRF_ERROR_GRM_FAILED :معلومات الاضافة غير متاحة
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{2:STRING}تم تعطيلة بواسطة{4:STRING}
# NewGRF related 'general' warnings # NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}تحذير! STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}تحذير!
@@ -2519,6 +2525,8 @@ STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} لـ<ح
STR_NEWGRF_INVALID_ENGINE :<موديل العربة غير صالح> STR_NEWGRF_INVALID_ENGINE :<موديل العربة غير صالح>
STR_NEWGRF_INVALID_INDUSTRYTYPE :<المصنع غير صالح> STR_NEWGRF_INVALID_INDUSTRYTYPE :<المصنع غير صالح>
# NewGRF scanning window
# Sign list window # Sign list window
STR_SIGN_LIST_CAPTION :{WHITE}قائمة العلامات - {COMMA} علامة STR_SIGN_LIST_CAPTION :{WHITE}قائمة العلامات - {COMMA} علامة
STR_SIGN_LIST_MATCH_CASE :{BLACK}طابق الحالة STR_SIGN_LIST_MATCH_CASE :{BLACK}طابق الحالة
@@ -3127,7 +3135,7 @@ STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}السع
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}السعة الجديدة: {GOLD}{CARGO}, {GOLD}{CARGO}{}{BLACK}تكلفة اعادة التهيئة: {GOLD}{CURRENCY} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}السعة الجديدة: {GOLD}{CARGO}, {GOLD}{CARGO}{}{BLACK}تكلفة اعادة التهيئة: {GOLD}{CURRENCY}
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}اختر العربة لاعادة تهيئتها. اسحب بالفارة لاختيار عدة عربات. اضغط على مساحة خالية لاختيار كل العربات. اضغط + كنترول لاختيار العربة الحالية وما بعدها. STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}اختر العربة لاعادة تهيئتها. اسحب بالفارة لاختيار عدة عربات. اضغط على مساحة خالية لاختيار كل العربات. اضغط + كنترول لاختيار العربة الحالية وما بعدها.
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}أختر نوع البضاعة لينقلها القطار STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}اختر نوع البضاعة لينقلها القطار
STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK} اختر نوع حمولة العربة STR_REFIT_ROAD_VEHICLE_LIST_TOOLTIP :{BLACK} اختر نوع حمولة العربة
STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}اختر نوع الحمولة للسفينة STR_REFIT_SHIP_LIST_TOOLTIP :{BLACK}اختر نوع الحمولة للسفينة
STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}اختر نوع الحمولة للطائرة STR_REFIT_AIRCRAFT_LIST_TOOLTIP :{BLACK}اختر نوع الحمولة للطائرة
@@ -3186,6 +3194,8 @@ STR_ORDER_DROP_HALT_DEPOT :توقف
STR_ORDER_SERVICE_TOOLTIP :{BLACK}تجاوز هذا الامر الا اذا لم تكن الصيانة مطلوبة STR_ORDER_SERVICE_TOOLTIP :{BLACK}تجاوز هذا الامر الا اذا لم تكن الصيانة مطلوبة
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}بيانات العربة لتعريف التجاوز الى STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}بيانات العربة لتعريف التجاوز الى
# Conditional order variables, must follow order of OrderConditionVariable enum
STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :نسبة التحميل STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :نسبة التحميل
STR_ORDER_CONDITIONAL_RELIABILITY :الصلاحية STR_ORDER_CONDITIONAL_RELIABILITY :الصلاحية
STR_ORDER_CONDITIONAL_MAX_SPEED :السرعة القصوى STR_ORDER_CONDITIONAL_MAX_SPEED :السرعة القصوى
@@ -3246,7 +3256,7 @@ STR_ORDER_STOP_ORDER :توقف
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_AUTOMATIC :(تلقائى) STR_ORDER_IMPLICIT :(تلقائى)
STR_ORDER_FULL_LOAD :-تحميل بالكامل- STR_ORDER_FULL_LOAD :-تحميل بالكامل-
STR_ORDER_FULL_LOAD_ANY :-حمل اي بضاعة بالكامل- STR_ORDER_FULL_LOAD_ANY :-حمل اي بضاعة بالكامل-
@@ -3437,6 +3447,8 @@ STR_ERROR_PNGMAP_MISC :{WHITE}حدث
STR_ERROR_BMPMAP :{WHITE}لا يمكن تحميل الخريطة من BMP ... STR_ERROR_BMPMAP :{WHITE}لا يمكن تحميل الخريطة من BMP ...
STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}لايمكن تحويل نوع الصورة... STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}لايمكن تحويل نوع الصورة...
STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}الصورة ضخمة جدا ...
STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}تحذير STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}تحذير
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}اعادة تحجيم الخريطة المصدر كثيرا غير مستحسن. هل تريد اكمال توليد الخريطة؟ STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}اعادة تحجيم الخريطة المصدر كثيرا غير مستحسن. هل تريد اكمال توليد الخريطة؟
@@ -4242,6 +4254,7 @@ STR_TINY_BLACK_COMA :{TINYFONT}{BLAC
STR_TINY_COMMA :{TINYFONT}{COMMA} STR_TINY_COMMA :{TINYFONT}{COMMA}
STR_BLUE_COMMA :{BLUE}{COMMA} STR_BLUE_COMMA :{BLUE}{COMMA}
STR_RED_COMMA :{RED}{COMMA} STR_RED_COMMA :{RED}{COMMA}
STR_TINY_BLACK_DECIMAL :{TINYFONT}{BLACK}{DECIMAL}
STR_COMPANY_MONEY :{WHITE}{CURRENCY} STR_COMPANY_MONEY :{WHITE}{CURRENCY}
STR_BLACK_DATE_LONG :{BLACK}{DATE_LONG} STR_BLACK_DATE_LONG :{BLACK}{DATE_LONG}
STR_BLACK_CROSS :{BLACK}{CROSS} STR_BLACK_CROSS :{BLACK}{CROSS}

View File

@@ -545,11 +545,11 @@ STR_TOOLTIP_WINDOW_TITLE_DRAG_THIS :{BLACK}Зага
STR_TOOLTIP_SHADE :{BLACK}Згарнуць вакно, пакінуўшы загаловак STR_TOOLTIP_SHADE :{BLACK}Згарнуць вакно, пакінуўшы загаловак
STR_TOOLTIP_DEBUG :{BLACK}Паказаць наладачную iнфармацыю NewGRF STR_TOOLTIP_DEBUG :{BLACK}Паказаць наладачную iнфармацыю NewGRF
STR_TOOLTIP_STICKY :{BLACK}Ігнараваць націск клявішы «Закрыць усе вокны» STR_TOOLTIP_STICKY :{BLACK}Ігнараваць націск клявішы «Закрыць усе вокны»
STR_TOOLTIP_RESIZE :{BLACK}Націсьніце ды цягнiце для змяненьня памеру вакна STR_TOOLTIP_RESIZE :{BLACK}Націсьніце ды цягнiце для зьмяненьня памеру вакна
STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Вялікае/маленькае вакно STR_TOOLTIP_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Вялікае/маленькае вакно
STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка ўверх/уніз STR_TOOLTIP_VSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка ўверх/уніз
STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка налева/направа STR_TOOLTIP_HSCROLL_BAR_SCROLLS_LIST :{BLACK}Пракрутка налева/направа
STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Поўная ачыстка прамавугольнага ўчастку зямлі. Ctrl - выбар вобласці па дыяганалі. Пры націснутым Shift - ацэнка кошту ачысткі. STR_TOOLTIP_DEMOLISH_BUILDINGS_ETC :{BLACK}Поўная ачыстка прамавугольнага ўчастку зямлі. Ctrl - выбар вобласьці па дыяганалі. Пры націснутым Shift - ацэнка кошту ачысткі.
# Query window # Query window
STR_BUTTON_DEFAULT :{BLACK}Па змоўчаньнi STR_BUTTON_DEFAULT :{BLACK}Па змоўчаньнi
@@ -564,7 +564,7 @@ STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|Q
STR_MEASURE_LENGTH :{BLACK}Даўжыня: {NUM} STR_MEASURE_LENGTH :{BLACK}Даўжыня: {NUM}
STR_MEASURE_AREA :{BLACK}Плошча: {NUM} x {NUM} STR_MEASURE_AREA :{BLACK}Плошча: {NUM} x {NUM}
STR_MEASURE_LENGTH_HEIGHTDIFF :{BLACK}Даўжыня: {NUM}{}Розніца вышыняў: {HEIGHT} STR_MEASURE_LENGTH_HEIGHTDIFF :{BLACK}Даўжыня: {NUM}{}Розніца вышыняў: {HEIGHT}
STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Плошча: {NUM} x {NUM}{}Рознiца вышыняў: {HEIGHT} STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Плошча: {NUM} x {NUM}{}Розьнiца вышыняў: {HEIGHT}
# These are used in buttons # These are used in buttons
@@ -581,13 +581,13 @@ STR_SORT_BY_NUMBER :Нумар
STR_SORT_BY_PROFIT_LAST_YEAR :Прыбытак летась STR_SORT_BY_PROFIT_LAST_YEAR :Прыбытак летась
STR_SORT_BY_PROFIT_THIS_YEAR :Прыбытак у бягучым годзе STR_SORT_BY_PROFIT_THIS_YEAR :Прыбытак у бягучым годзе
STR_SORT_BY_AGE :Узрост STR_SORT_BY_AGE :Узрост
STR_SORT_BY_RELIABILITY :Надзейнасць STR_SORT_BY_RELIABILITY :Надзейнасьць
STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Умяшчальнасьць грузу STR_SORT_BY_TOTAL_CAPACITY_PER_CARGOTYPE :Умяшчальнасьць грузу
STR_SORT_BY_MAX_SPEED :Максымальная хуткасць STR_SORT_BY_MAX_SPEED :Максымальная хуткасьць
STR_SORT_BY_MODEL :Мадэль STR_SORT_BY_MODEL :Мадэль
STR_SORT_BY_VALUE :Кошт STR_SORT_BY_VALUE :Кошт
STR_SORT_BY_LENGTH :Даўжыня STR_SORT_BY_LENGTH :Даўжыня
STR_SORT_BY_LIFE_TIME :Астатні тэрмін службы STR_SORT_BY_LIFE_TIME :Рэшткавы тэрмін службы
STR_SORT_BY_TIMETABLE_DELAY :Адставаньне ад графіку STR_SORT_BY_TIMETABLE_DELAY :Адставаньне ад графіку
STR_SORT_BY_FACILITY :Тып станцыі STR_SORT_BY_FACILITY :Тып станцыі
STR_SORT_BY_WAITING :Коль-ць грузу на станцыі STR_SORT_BY_WAITING :Коль-ць грузу на станцыі
@@ -599,7 +599,7 @@ STR_SORT_BY_POWER :Магутна
STR_SORT_BY_TRACTIVE_EFFORT :Цягавае намаганьне STR_SORT_BY_TRACTIVE_EFFORT :Цягавае намаганьне
STR_SORT_BY_INTRO_DATE :Пачатак вытворчасьцi STR_SORT_BY_INTRO_DATE :Пачатак вытворчасьцi
STR_SORT_BY_RUNNING_COST :Кошт абслугоўваньня STR_SORT_BY_RUNNING_COST :Кошт абслугоўваньня
STR_SORT_BY_POWER_VS_RUNNING_COST :Магутнасць/кошт абслуг. STR_SORT_BY_POWER_VS_RUNNING_COST :Магутнасьць/кошт абслуг.
STR_SORT_BY_CARGO_CAPACITY :Ёмiстасьць STR_SORT_BY_CARGO_CAPACITY :Ёмiстасьць
# Tooltips for the main toolbar # Tooltips for the main toolbar
@@ -626,7 +626,7 @@ STR_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TRACK :{BLACK}Буда
STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Будаўніцтва аўтамабільных дарог STR_TOOLBAR_TOOLTIP_BUILD_ROADS :{BLACK}Будаўніцтва аўтамабільных дарог
STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Будаўніцтва водных камунікацыяў STR_TOOLBAR_TOOLTIP_BUILD_SHIP_DOCKS :{BLACK}Будаўніцтва водных камунікацыяў
STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Будаўніцтва аэрапортаў STR_TOOLBAR_TOOLTIP_BUILD_AIRPORTS :{BLACK}Будаўніцтва аэрапортаў
STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Адкрыць панэль ляндшафту для змяненьня рэльефу, пасадкi дрэваў i г.д. STR_TOOLBAR_TOOLTIP_LANDSCAPING :{BLACK}Адкрыць панэль ляндшафту для зьмяненьня рэльефу, пасадкi дрэваў i г.д.
STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Наладка гуку й музыкі STR_TOOLBAR_TOOLTIP_SHOW_SOUND_MUSIC_WINDOW :{BLACK}Наладка гуку й музыкі
STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Паказаць апошнiя паведамленьнi/навiны, паказаць наладкi паведамленьняў STR_TOOLBAR_TOOLTIP_SHOW_LAST_MESSAGE_NEWS :{BLACK}Паказаць апошнiя паведамленьнi/навiны, паказаць наладкi паведамленьняў
STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Iнфармацыя аб зямлi; кансоль; наладка штучнага інтэлекту (AI/ШI); здымкi экрана; аб гульні STR_TOOLBAR_TOOLTIP_LAND_BLOCK_INFORMATION :{BLACK}Iнфармацыя аб зямлi; кансоль; наладка штучнага інтэлекту (AI/ШI); здымкi экрана; аб гульні
@@ -659,7 +659,7 @@ STR_SCENEDIT_FILE_MENU_QUIT :Выхад
############ range for settings menu starts ############ range for settings menu starts
STR_SETTINGS_MENU_GAME_OPTIONS :Наладкі гульні STR_SETTINGS_MENU_GAME_OPTIONS :Наладкі гульні
STR_SETTINGS_MENU_DIFFICULTY_SETTINGS :Наладкі складанасцi STR_SETTINGS_MENU_DIFFICULTY_SETTINGS :Наладкі складанасьцi
STR_SETTINGS_MENU_CONFIG_SETTINGS :Пашыраныя наладкі STR_SETTINGS_MENU_CONFIG_SETTINGS :Пашыраныя наладкі
STR_SETTINGS_MENU_AI_SETTINGS :Наладки ШI (AI) STR_SETTINGS_MENU_AI_SETTINGS :Наладки ШI (AI)
STR_SETTINGS_MENU_NEWGRF_SETTINGS :Наладкі NewGRF STR_SETTINGS_MENU_NEWGRF_SETTINGS :Наладкі NewGRF
@@ -760,6 +760,7 @@ STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Здымак э
STR_ABOUT_MENU_GIANT_SCREENSHOT :Здымак усёй мапы (Ctrl+G) STR_ABOUT_MENU_GIANT_SCREENSHOT :Здымак усёй мапы (Ctrl+G)
STR_ABOUT_MENU_ABOUT_OPENTTD :Аб гульні OpenTTD STR_ABOUT_MENU_ABOUT_OPENTTD :Аб гульні OpenTTD
STR_ABOUT_MENU_SPRITE_ALIGNER :Выраўноўваньне спрайтаў STR_ABOUT_MENU_SPRITE_ALIGNER :Выраўноўваньне спрайтаў
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Пераключыць абмежавальныя рамкі
############ range ends here ############ range ends here
############ range for days starts (also used for the place in the highscore window) ############ range for days starts (also used for the place in the highscore window)
@@ -1308,7 +1309,7 @@ STR_CURRENCY_CUSTOM_CURRENCY_PREVIEW_TOOLTIP :{BLACK}10000 б
STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Зьмяніць парамэтр уласнай валюты STR_CURRENCY_CHANGE_PARAMETER :{BLACK}Зьмяніць парамэтр уласнай валюты
# Difficulty level window # Difficulty level window
STR_DIFFICULTY_LEVEL_CAPTION :{WHITE}Узровень складанасцi STR_DIFFICULTY_LEVEL_CAPTION :{WHITE}Узровень складанасьцi
############ range for difficulty levels starts ############ range for difficulty levels starts
STR_DIFFICULTY_LEVEL_EASY :{BLACK}Лёгкі STR_DIFFICULTY_LEVEL_EASY :{BLACK}Лёгкі
@@ -1350,7 +1351,7 @@ STR_NUM_VERY_LOW :Вельмі м
STR_NUM_LOW :Мала STR_NUM_LOW :Мала
STR_NUM_NORMAL :Звычайна STR_NUM_NORMAL :Звычайна
STR_NUM_HIGH :Шмат STR_NUM_HIGH :Шмат
STR_NUM_CUSTOM :Уласная STR_NUM_CUSTOM :Уласны
STR_NUM_CUSTOM_NUMBER :Зададзены ({NUM}) STR_NUM_CUSTOM_NUMBER :Зададзены ({NUM})
STR_VARIETY_NONE :Няма STR_VARIETY_NONE :Няма
@@ -1373,6 +1374,7 @@ STR_SEA_LEVEL_HIGH :Вялiкая
STR_SEA_LEVEL_CUSTOM :Зададзены STR_SEA_LEVEL_CUSTOM :Зададзены
STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Зададзены ({NUM}%) STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Зададзены ({NUM}%)
STR_DISASTER_NONE :Выключаны STR_DISASTER_NONE :Выключаны
STR_DISASTER_REDUCED :Зьніжаныя STR_DISASTER_REDUCED :Зьніжаныя
STR_DISASTER_NORMAL :Звычайныя STR_DISASTER_NORMAL :Звычайныя
@@ -1417,7 +1419,7 @@ STR_CONFIG_SETTING_AUTOSLOPE :{LTBLUE}Даз
STR_CONFIG_SETTING_CATCHMENT :{LTBLUE}Зона пакрыцьця залежыць ад тыпу станцыі: {ORANGE}{STRING} STR_CONFIG_SETTING_CATCHMENT :{LTBLUE}Зона пакрыцьця залежыць ад тыпу станцыі: {ORANGE}{STRING}
STR_CONFIG_SETTING_EXTRADYNAMITE :{LTBLUE}Дазволіць знос амаль усіх гарадзкіх аб'ектаў: {ORANGE}{STRING} STR_CONFIG_SETTING_EXTRADYNAMITE :{LTBLUE}Дазволіць знос амаль усіх гарадзкіх аб'ектаў: {ORANGE}{STRING}
STR_CONFIG_SETTING_TRAIN_LENGTH :{LTBLUE}Макс. даўжыня цягнiкоў: {ORANGE}{STRING} клет{P 0:1 ка кi ак} STR_CONFIG_SETTING_TRAIN_LENGTH :{LTBLUE}Макс. даўжыня цягнiкоў: {ORANGE}{STRING} клет{P 0:1 ка кi ак}
STR_CONFIG_SETTING_SMOKE_AMOUNT :{LTBLUE}Колькасць дыму/іскраў у лакаматываў: {ORANGE}{STRING} STR_CONFIG_SETTING_SMOKE_AMOUNT :{LTBLUE}Колькасьць дыму/іскраў у лакаматываў: {ORANGE}{STRING}
STR_CONFIG_SETTING_SMOKE_AMOUNT_NONE :няма STR_CONFIG_SETTING_SMOKE_AMOUNT_NONE :няма
STR_CONFIG_SETTING_SMOKE_AMOUNT_ORIGINAL :арыгальная STR_CONFIG_SETTING_SMOKE_AMOUNT_ORIGINAL :арыгальная
STR_CONFIG_SETTING_SMOKE_AMOUNT_REALISTIC :рэалістычная STR_CONFIG_SETTING_SMOKE_AMOUNT_REALISTIC :рэалістычная
@@ -1440,8 +1442,8 @@ STR_CONFIG_SETTING_MAX_TUNNEL_LENGTH :{LTBLUE}Мак
STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Мэтад стварэньня сыравінных прадпрыемстваў: {ORANGE}{STRING} STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Мэтад стварэньня сыравінных прадпрыемстваў: {ORANGE}{STRING}
STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :не ствараць STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :не ствараць
STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :як i iншыя STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_NORMAL :як i iншыя
STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :геолагаразьведка STR_CONFIG_SETTING_RAW_INDUSTRY_CONSTRUCTION_METHOD_PROSPECTING :геалягiчная разьведка
STR_CONFIG_SETTING_INDUSTRY_PLATFORM :{LTBLUE}Плоскi рэльеф вакол прадпрыемстваў: {ORANGE}{STRING} клет{P 0:1 ка кi ак} STR_CONFIG_SETTING_INDUSTRY_PLATFORM :{LTBLUE}Пляскаты рэльеф вакол прадпрыемстваў: {ORANGE}{STRING} клет{P 0:1 ка кi ак}
STR_CONFIG_SETTING_MULTIPINDTOWN :{LTBLUE}Дазволіць некалькі прадпрыемстваў аднаго тыпу на горад: {ORANGE}{STRING} STR_CONFIG_SETTING_MULTIPINDTOWN :{LTBLUE}Дазволіць некалькі прадпрыемстваў аднаго тыпу на горад: {ORANGE}{STRING}
STR_CONFIG_SETTING_SIGNALSIDE :{LTBLUE}Паказваць сыгналы на баку руху: {ORANGE}{STRING} STR_CONFIG_SETTING_SIGNALSIDE :{LTBLUE}Паказваць сыгналы на баку руху: {ORANGE}{STRING}
STR_CONFIG_SETTING_SHOWFINANCES :{LTBLUE}Паказваць фінансавую статыстыку напрыканцы года: {ORANGE}{STRING} STR_CONFIG_SETTING_SHOWFINANCES :{LTBLUE}Паказваць фінансавую статыстыку напрыканцы года: {ORANGE}{STRING}
@@ -1466,7 +1468,7 @@ STR_CONFIG_SETTING_STOP_ON_TOWN_ROAD :{LTBLUE}Даз
STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :{LTBLUE}Дазволіць будаўніцтва прыпынкаў Ro-Ro на дарогах канкурэнтаў: {ORANGE}{STRING} STR_CONFIG_SETTING_STOP_ON_COMPETITOR_ROAD :{LTBLUE}Дазволіць будаўніцтва прыпынкаў Ro-Ro на дарогах канкурэнтаў: {ORANGE}{STRING}
STR_CONFIG_SETTING_ADJACENT_STATIONS :{LTBLUE}Дазволіць будаўніцтва сумежных станцыяў: {ORANGE}{STRING} STR_CONFIG_SETTING_ADJACENT_STATIONS :{LTBLUE}Дазволіць будаўніцтва сумежных станцыяў: {ORANGE}{STRING}
STR_CONFIG_SETTING_DYNAMIC_ENGINES :{LTBLUE}Уключыць падтрымку некалькіх транспартных набораў NewGRF: {ORANGE}{STRING} STR_CONFIG_SETTING_DYNAMIC_ENGINES :{LTBLUE}Уключыць падтрымку некалькіх транспартных набораў NewGRF: {ORANGE}{STRING}
STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Зьмена гэтага парамэтру немагчыма, калі ў гульні ёсць транспартныя сродкі. STR_CONFIG_SETTING_DYNAMIC_ENGINES_EXISTING_VEHICLES :{WHITE}Зьмена гэтага парамэтру немагчыма, калі ў гульні ёсьць транспартныя сродкі.
STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :{LTBLUE}Малыя аэрапорты ніколі не састарэюць: {ORANGE}{STRING} STR_CONFIG_SETTING_NEVER_EXPIRE_AIRPORTS :{LTBLUE}Малыя аэрапорты ніколі не састарэюць: {ORANGE}{STRING}
@@ -1633,7 +1635,7 @@ STR_CONFIG_SETTING_TOOLBAR_POS :{LTBLUE}Раз
STR_CONFIG_SETTING_TOOLBAR_POS_LEFT :леваруч STR_CONFIG_SETTING_TOOLBAR_POS_LEFT :леваруч
STR_CONFIG_SETTING_TOOLBAR_POS_CENTER :ў цэнтры STR_CONFIG_SETTING_TOOLBAR_POS_CENTER :ў цэнтры
STR_CONFIG_SETTING_TOOLBAR_POS_RIGHT :праваруч STR_CONFIG_SETTING_TOOLBAR_POS_RIGHT :праваруч
STR_CONFIG_SETTING_STATUSBAR_POS :{LTBLUE}Размяшчэньне радка стану: {ORANGE}{STRING} STR_CONFIG_SETTING_STATUSBAR_POS :{LTBLUE}Разьмяшчэньне радка стану: {ORANGE}{STRING}
STR_CONFIG_SETTING_STATUSBAR_POS_LEFT :Зьлева STR_CONFIG_SETTING_STATUSBAR_POS_LEFT :Зьлева
STR_CONFIG_SETTING_STATUSBAR_POS_CENTER :Пасярэдзiне STR_CONFIG_SETTING_STATUSBAR_POS_CENTER :Пасярэдзiне
STR_CONFIG_SETTING_STATUSBAR_POS_RIGHT :Зправа STR_CONFIG_SETTING_STATUSBAR_POS_RIGHT :Зправа
@@ -1668,7 +1670,7 @@ STR_CONFIG_SETTING_VEHICLES_SERVICING :{ORANGE}Абс
STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Маршруты STR_CONFIG_SETTING_VEHICLES_ROUTING :{ORANGE}Маршруты
STR_CONFIG_SETTING_VEHICLES_TRAINS :{ORANGE}Цягнікі STR_CONFIG_SETTING_VEHICLES_TRAINS :{ORANGE}Цягнікі
STR_CONFIG_SETTING_ECONOMY_TOWNS :{ORANGE}Населеныя пункты STR_CONFIG_SETTING_ECONOMY_TOWNS :{ORANGE}Населеныя пункты
STR_CONFIG_SETTING_ECONOMY_INDUSTRIES :{ORANGE}Прамысловасць STR_CONFIG_SETTING_ECONOMY_INDUSTRIES :{ORANGE}Прамысловасьць
STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :{LTBLUE}Альгарытм пошуку шляху для цягнікоў: {ORANGE}{STRING} STR_CONFIG_SETTING_PATHFINDER_FOR_TRAINS :{LTBLUE}Альгарытм пошуку шляху для цягнікоў: {ORANGE}{STRING}
@@ -1723,6 +1725,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Прав
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Паказаць наладкi ШI/АІ STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Паказаць наладкi ШI/АІ
STR_INTRO_TOOLTIP_QUIT :{BLACK}Выйсьці з OpenTTD STR_INTRO_TOOLTIP_QUIT :{BLACK}Выйсьці з OpenTTD
# Quit window # Quit window
STR_QUIT_CAPTION :{WHITE}Выхад STR_QUIT_CAPTION :{WHITE}Выхад
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Вы ўпэўнены, што жадаеце перапыніць гульню й вярнуцца ў {STRING}? STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Вы ўпэўнены, што жадаеце перапыніць гульню й вярнуцца ў {STRING}?
@@ -1761,7 +1764,7 @@ STR_CHEAT_SWITCH_CLIMATE_SUB_ARCTIC_LANDSCAPE :субаркт
STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :субтрапічны ляндшафт STR_CHEAT_SWITCH_CLIMATE_SUB_TROPICAL_LANDSCAPE :субтрапічны ляндшафт
STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :цацачны ляндшафт STR_CHEAT_SWITCH_CLIMATE_TOYLAND_LANDSCAPE :цацачны ляндшафт
STR_CHEAT_CHANGE_DATE :{LTBLUE}Зьмяненьне даты: {ORANGE}{DATE_SHORT} STR_CHEAT_CHANGE_DATE :{LTBLUE}Зьмяненьне даты: {ORANGE}{DATE_SHORT}
STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Змянiць бягучы год STR_CHEAT_CHANGE_DATE_QUERY_CAPT :{WHITE}Зьмянiць бягучы год
STR_CHEAT_SETUP_PROD :{LTBLUE}Дазволіць зьмяненьне прадукцыйнасьці: {ORANGE}{STRING} STR_CHEAT_SETUP_PROD :{LTBLUE}Дазволіць зьмяненьне прадукцыйнасьці: {ORANGE}{STRING}
# Livery window # Livery window
@@ -1922,7 +1925,7 @@ STR_NETWORK_START_SERVER_SET_PASSWORD :{BLACK}Уста
STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Абараніце вашу гульню паролем, калі ня хочаце рабіць яе публічна даступнай STR_NETWORK_START_SERVER_PASSWORD_TOOLTIP :{BLACK}Абараніце вашу гульню паролем, калі ня хочаце рабіць яе публічна даступнай
STR_NETWORK_START_SERVER_LAN_INTERNET :Лакальная сетка / Інтэрнэт STR_NETWORK_START_SERVER_LAN_INTERNET :Лакальная сетка / Інтэрнэт
STR_NETWORK_START_SERVER_INTERNET_ADVERTISE :Інтэрнэт (зьмясціць у агульны сьпіс) STR_NETWORK_START_SERVER_INTERNET_ADVERTISE :Інтэрнэт (зьмясьціць у агульны сьпіс)
STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клiент{P "" ы аў} STR_NETWORK_START_SERVER_CLIENTS_SELECT :{BLACK}{NUM} клiент{P "" ы аў}
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. клiентаў: STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS :{BLACK}Макс. клiентаў:
STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Выбар максымальнай колькасьці кліентаў. Ня ўсе месцы павінны быць занятыя STR_NETWORK_START_SERVER_NUMBER_OF_CLIENTS_TOOLTIP :{BLACK}Выбар максымальнай колькасьці кліентаў. Ня ўсе месцы павінны быць занятыя
@@ -1952,7 +1955,7 @@ STR_NETWORK_LANG_DUTCH :Нідэрля
STR_NETWORK_LANG_ESPERANTO :Эспэранта STR_NETWORK_LANG_ESPERANTO :Эспэранта
STR_NETWORK_LANG_FINNISH :Фінская STR_NETWORK_LANG_FINNISH :Фінская
STR_NETWORK_LANG_HUNGARIAN :Вугорская STR_NETWORK_LANG_HUNGARIAN :Вугорская
STR_NETWORK_LANG_ICELANDIC :Ісляндзкая STR_NETWORK_LANG_ICELANDIC :Ісьляндзкая
STR_NETWORK_LANG_ITALIAN :Італьянская STR_NETWORK_LANG_ITALIAN :Італьянская
STR_NETWORK_LANG_JAPANESE :Японская STR_NETWORK_LANG_JAPANESE :Японская
STR_NETWORK_LANG_KOREAN :Карэйская STR_NETWORK_LANG_KOREAN :Карэйская
@@ -2260,6 +2263,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Буда
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Пераключэньне паміж будаўніцтвам і выдаленьнем чыгуначных рэйкаў, сыгналаў, станцыяў. Пры націснутым Ctrl станцыі ліквідуюцца разам з рэйкамі. STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Пераключэньне паміж будаўніцтвам і выдаленьнем чыгуначных рэйкаў, сыгналаў, станцыяў. Пры націснутым Ctrl станцыі ліквідуюцца разам з рэйкамі.
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Канвэртаваць/мадэрнізаваць тып каляінаў. Пры націснутым Shift - ацэнка кошту будаўніцтва. STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL :{BLACK}Канвэртаваць/мадэрнізаваць тып каляінаў. Пры націснутым Shift - ацэнка кошту будаўніцтва.
# Rail depot construction window # Rail depot construction window
STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Кірунак дэпо STR_BUILD_DEPOT_TRAIN_ORIENTATION_CAPTION :{WHITE}Кірунак дэпо
STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Выберыце кірунак дэпо STR_BUILD_DEPOT_TRAIN_ORIENTATION_TOOLTIP :{BLACK}Выберыце кірунак дэпо
@@ -2291,14 +2295,14 @@ STR_BUILD_SIGNAL_SEMAPHORE_NORM_TOOLTIP :{BLACK}Звыч
STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Уваходны сэмафор (прэсыгнал).{}Адкрыты, калі хаця б адзін з выхадных сыгналаў на наступнай сэкцыі каляіны адкрыты. У астатніх выпадках закрыты. STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TOOLTIP :{BLACK}Уваходны сэмафор (прэсыгнал).{}Адкрыты, калі хаця б адзін з выхадных сыгналаў на наступнай сэкцыі каляіны адкрыты. У астатніх выпадках закрыты.
STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Выхадны сэмафор (прэсыгнал).{}Працуе як звычайны сэмафор, але яго стан улічваецца ў працы ўваходных і камбінаваных сыгналаў. STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TOOLTIP :{BLACK}Выхадны сэмафор (прэсыгнал).{}Працуе як звычайны сэмафор, але яго стан улічваецца ў працы ўваходных і камбінаваных сыгналаў.
STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Камбінаваны сэмафор (прэсыгнал).{}Працуе адначасова як уваходны і выхадны сэмафор. Гэта дазваляе будаваць вялікія «дрэвы» каляінаў з прэсыгналамі. STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TOOLTIP :{BLACK}Камбінаваны сэмафор (прэсыгнал).{}Працуе адначасова як уваходны і выхадны сэмафор. Гэта дазваляе будаваць вялікія «дрэвы» каляінаў з прэсыгналамі.
STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Маршрутны сэмафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны з іх можа зарэзэрваваць сабе бясьпечны шлях. Дазваляе праходжаньне цягнікоў у абодва бакі. STR_BUILD_SIGNAL_SEMAPHORE_PBS_TOOLTIP :{BLACK}Маршрутны сэмафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны зь іх можа зарэзэрваваць сабе бясьпечны шлях. Дазваляе праходжаньне цягнікоў у абодва бакі.
STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Аднабаковы маршрутны сэмафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны з іх можа зарэзэрваваць сабе бясьпечны шлях. Не дазваляе цягнікам праходзіць з адваротнага боку. STR_BUILD_SIGNAL_SEMAPHORE_PBS_OWAY_TOOLTIP :{BLACK}Аднабаковы маршрутны сэмафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны зь іх можа зарэзэрваваць сабе бясьпечны шлях. Не дазваляе цягнікам праходзіць з адваротнага боку.
STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Звычайны сьветлафор.{}Не дазваляе некалькім цягнікам адначасова знаходзіцца на адным блёк-участку. STR_BUILD_SIGNAL_ELECTRIC_NORM_TOOLTIP :{BLACK}Звычайны сьветлафор.{}Не дазваляе некалькім цягнікам адначасова знаходзіцца на адным блёк-участку.
STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Уваходны сьветлафор (прэсыгнал).{}Адкрыты, калі хаця б адзін з выхадных сыгналаў на наступнай сэкцыі каляіны адкрыты. У астатніх выпадках закрыты. STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TOOLTIP :{BLACK}Уваходны сьветлафор (прэсыгнал).{}Адкрыты, калі хаця б адзін з выхадных сыгналаў на наступнай сэкцыі каляіны адкрыты. У астатніх выпадках закрыты.
STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Выхадны сьветлафор (прэсыгнал).{}Працуе як звычайны сьветлафор, але яго стан улічваецца ў працы ўваходных і камбінаваных сыгналаў. STR_BUILD_SIGNAL_ELECTRIC_EXIT_TOOLTIP :{BLACK}Выхадны сьветлафор (прэсыгнал).{}Працуе як звычайны сьветлафор, але яго стан улічваецца ў працы ўваходных і камбінаваных сыгналаў.
STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Камбінаваны сьветлафор (прэсыгнал).{}Працуе адначасова як уваходны і выхадны сьветлафор. Гэта дазваляе будаваць вялікія «дрэвы» каляінаў з прэсыгналамі. STR_BUILD_SIGNAL_ELECTRIC_COMBO_TOOLTIP :{BLACK}Камбінаваны сьветлафор (прэсыгнал).{}Працуе адначасова як уваходны і выхадны сьветлафор. Гэта дазваляе будаваць вялікія «дрэвы» каляінаў з прэсыгналамі.
STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Маршрутны сьветлафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны з іх можа зарэзэрваваць сабе бясьпечны шлях. Дазваляе праходжаньне цягнікоў у абодва бакі. STR_BUILD_SIGNAL_ELECTRIC_PBS_TOOLTIP :{BLACK}Маршрутны сьветлафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны зь іх можа зарэзэрваваць сабе бясьпечны шлях. Дазваляе праходжаньне цягнікоў у абодва бакі.
STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Аднабаковы маршрутны сьветлафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны з іх можа зарэзэрваваць сабе бясьпечны шлях. Не дазваляе цягнікам праходзіць з адваротнага боку. STR_BUILD_SIGNAL_ELECTRIC_PBS_OWAY_TOOLTIP :{BLACK}Аднабаковы маршрутны сьветлафор (PMS).{}Дазваляе некалькім цягнікам знаходзіцца ў адным сыгнальным блёку, калі кожны зь іх можа зарэзэрваваць сабе бясьпечны шлях. Не дазваляе цягнікам праходзіць з адваротнага боку.
STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Зьмяненьне тыпаў сыгналаў.{}Калі кнопка націснута, пстрыкніце для пераўтварэньня існуючага сыгнала ў сыгнал выбранага тыпу й віду, або пстрыкніце з націснутым Ctrl для перабіраньня існуючых варыянтаў. Shift+пстрычка - ацэнка кошту пераўтварэньня. STR_BUILD_SIGNAL_CONVERT_TOOLTIP :{BLACK}Зьмяненьне тыпаў сыгналаў.{}Калі кнопка націснута, пстрыкніце для пераўтварэньня існуючага сыгнала ў сыгнал выбранага тыпу й віду, або пстрыкніце з націснутым Ctrl для перабіраньня існуючых варыянтаў. Shift+пстрычка - ацэнка кошту пераўтварэньня.
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Шчыльнасьць аўтаматычнай расстаноўкі сыгналаў пры цягненьні STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_TOOLTIP :{BLACK}Шчыльнасьць аўтаматычнай расстаноўкі сыгналаў пры цягненьні
STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Паменшыць шчыльнасьць расстаноўкі сыгналаў STR_BUILD_SIGNAL_DRAG_SIGNALS_DENSITY_DECREASE_TOOLTIP :{BLACK}Паменшыць шчыльнасьць расстаноўкі сыгналаў
@@ -2367,7 +2371,7 @@ STR_WATERWAYS_TOOLBAR_BUILD_DOCK_TOOLTIP :{BLACK}Буда
STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Разьмясьціць буй, які можа быць выкарыстаны як пункт шляху. Пры націснутым Shift - ацэнка кошту будаўніцтва. STR_WATERWAYS_TOOLBAR_BUOY_TOOLTIP :{BLACK}Разьмясьціць буй, які можа быць выкарыстаны як пункт шляху. Пры націснутым Shift - ацэнка кошту будаўніцтва.
STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Будаўніцтва аквэдукаў Пры націснутым Shift - ацэнка кошту будаўніцтва. STR_WATERWAYS_TOOLBAR_BUILD_AQUEDUCT_TOOLTIP :{BLACK}Будаўніцтва аквэдукаў Пры націснутым Shift - ацэнка кошту будаўніцтва.
STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Пазначыць, дзе будзе вада.{}Пабудаваць канал, а пры націснутым Ctrl клетка на ўзроўні мора запаўняецца вадой. STR_WATERWAYS_TOOLBAR_CREATE_LAKE_TOOLTIP :{BLACK}Пазначыць, дзе будзе вада.{}Пабудаваць канал, а пры націснутым Ctrl клетка на ўзроўні мора запаўняецца вадой.
STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Разьмясціць рэкі STR_WATERWAYS_TOOLBAR_CREATE_RIVER_TOOLTIP :{BLACK}Разьмясьціць рэкі
# Ship depot construction window # Ship depot construction window
STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Кірунак дока STR_DEPOT_BUILD_SHIP_CAPTION :{WHITE}Кірунак дока
@@ -2409,7 +2413,7 @@ STR_STATION_BUILD_NOISE :{BLACK}Узро
# Landscaping toolbar # Landscaping toolbar
STR_LANDSCAPING_TOOLBAR :{WHITE}Земляныя работы STR_LANDSCAPING_TOOLBAR :{WHITE}Земляныя работы
STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Апусціць кут зямлі. Перацягваньне апускае першы абраны кут і выраўноўвае выбраную вобласьць да новай вышыні кута. Ctrl выбірае вобласьць па дыяганалі. Пры націснутым Shift - ацэнка кошту будаўніцтва. STR_LANDSCAPING_TOOLTIP_LOWER_A_CORNER_OF_LAND :{BLACK}Апусьціць кут зямлі. Перацягваньне апускае першы абраны кут і выраўноўвае выбраную вобласьць да новай вышыні кута. Ctrl выбірае вобласьць па дыяганалі. Пры націснутым Shift - ацэнка кошту будаўніцтва.
STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Падняць кут зямлі. Перацягваньне падымае першы абраны кут і выраўноўвае выбраную вобласьць да новай вышыні кута. Ctrl выбірае вобласьць па дыяганалі. Пры націснутым Shift - ацэнка кошту будаўніцтва. STR_LANDSCAPING_TOOLTIP_RAISE_A_CORNER_OF_LAND :{BLACK}Падняць кут зямлі. Перацягваньне падымае першы абраны кут і выраўноўвае выбраную вобласьць да новай вышыні кута. Ctrl выбірае вобласьць па дыяганалі. Пры націснутым Shift - ацэнка кошту будаўніцтва.
STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Выраўнаваць зямлю да вышыні першага абранага кута. Ctrl выбірае вобласьць па дыяганалі. Пры націснутым Shift - ацэнка кошту выраўноўваньня. STR_LANDSCAPING_LEVEL_LAND_TOOLTIP :{BLACK}Выраўнаваць зямлю да вышыні першага абранага кута. Ctrl выбірае вобласьць па дыяганалі. Пры націснутым Shift - ацэнка кошту выраўноўваньня.
STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Набыцьцё зямлі. Пры націснутым Shift - ацэнка кошту набыцьця. STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Набыцьцё зямлі. Пры націснутым Shift - ацэнка кошту набыцьця.
@@ -2417,7 +2421,7 @@ STR_LANDSCAPING_TOOLTIP_PURCHASE_LAND :{BLACK}Набы
# Object construction window # Object construction window
STR_OBJECT_BUILD_CAPTION :{WHITE}Выбар аб'екта STR_OBJECT_BUILD_CAPTION :{WHITE}Выбар аб'екта
STR_OBJECT_BUILD_TOOLTIP :{BLACK}Абярыце ствараны аб'ект. Пры націснутым Shift - ацэнка кошту пабудовы. STR_OBJECT_BUILD_TOOLTIP :{BLACK}Абярыце ствараны аб'ект. Пры націснутым Shift - ацэнка кошту пабудовы.
STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Абярыце клас аб'екта для будаўніцтва STR_OBJECT_BUILD_CLASS_TOOLTIP :{BLACK}Абярыце клясу аб'екта для будаўніцтва
STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Прагляд аб'екта STR_OBJECT_BUILD_PREVIEW_TOOLTIP :{BLACK}Прагляд аб'екта
STR_OBJECT_BUILD_SIZE :{BLACK}Памер: {GOLD}{NUM} x {NUM} клетак STR_OBJECT_BUILD_SIZE :{BLACK}Памер: {GOLD}{NUM} x {NUM} клетак
@@ -2434,10 +2438,10 @@ STR_TREES_RANDOM_TREES_TOOLTIP :{BLACK}Паса
# Land generation window (SE) # Land generation window (SE)
STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Стварэньне ляндшафту STR_TERRAFORM_TOOLBAR_LAND_GENERATION_CAPTION :{WHITE}Стварэньне ляндшафту
STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Разьмясціць камяні па мапе STR_TERRAFORM_TOOLTIP_PLACE_ROCKY_AREAS_ON_LANDSCAPE :{BLACK}Разьмясьціць камяні па мапе
STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Разьмясціць пустэльню.{}Націсьніце Ctrl, каб выдаліць яе. STR_TERRAFORM_TOOLTIP_DEFINE_DESERT_AREA :{BLACK}Разьмясьціць пустэльню.{}Націсьніце Ctrl, каб выдаліць яе.
STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Павялічыць плошчу змяненьня рэльефу STR_TERRAFORM_TOOLTIP_INCREASE_SIZE_OF_LAND_AREA :{BLACK}Павялічыць плошчу зьмяненьня рэльефу
STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Паменшыць плошчу змяненьня рэльефу STR_TERRAFORM_TOOLTIP_DECREASE_SIZE_OF_LAND_AREA :{BLACK}Паменшыць плошчу зьмяненьня рэльефу
STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Стварыць выпадковую мапу STR_TERRAFORM_TOOLTIP_GENERATE_RANDOM_LAND :{BLACK}Стварыць выпадковую мапу
STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Стварыць новы сцэнар STR_TERRAFORM_SE_NEW_WORLD :{BLACK}Стварыць новы сцэнар
STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Ачысьціць ляндшафт STR_TERRAFORM_RESET_LANDSCAPE :{BLACK}Ачысьціць ляндшафт
@@ -2695,7 +2699,7 @@ STR_SE_MAPGEN_FLAT_WORLD_TOOLTIP :{BLACK}Ства
STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Выпадковы рэльеф STR_SE_MAPGEN_RANDOM_LAND :{WHITE}Выпадковы рэльеф
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Вышыня над узроўнем мора: STR_SE_MAPGEN_FLAT_WORLD_HEIGHT :{BLACK}Вышыня над узроўнем мора:
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Падняць ўзровень роўнай зямлі на 1 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_DOWN :{BLACK}Падняць ўзровень роўнай зямлі на 1
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Апусціць ўзровень роўнай зямлі на 1 STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_UP :{BLACK}Апусьціць ўзровень роўнай зямлі на 1
STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Зьмяніць вышыню роўнай зямлі STR_SE_MAPGEN_FLAT_WORLD_HEIGHT_QUERY_CAPT :{WHITE}Зьмяніць вышыню роўнай зямлі
@@ -2738,7 +2742,6 @@ STR_NEWGRF_SETTINGS_MOVEUP_TOOLTIP :{BLACK}Пера
STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Унiз STR_NEWGRF_SETTINGS_MOVEDOWN :{BLACK}Унiз
STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Перамясьціць выбраны файл NewGRF ніжэй STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Перамясьціць выбраны файл NewGRF ніжэй
STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Сьпіс устаноўленых файлаў NewGRF. Выберыце файл для зьмяненьня парамэтраў STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Сьпіс устаноўленых файлаў NewGRF. Выберыце файл для зьмяненьня парамэтраў
STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Усталяваць парамэтры STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Усталяваць парамэтры
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Пераключыць палітру STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Пераключыць палітру
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Пераключыць палітру для выбраных NewGRF файлаў.{}Выкарыстоўвайце пераключэньне, калі графіка ў гульні малюецца ружовым колерам. STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Пераключыць палітру для выбраных NewGRF файлаў.{}Выкарыстоўвайце пераключэньне, калі графіка ў гульні малюецца ружовым колерам.
@@ -2758,7 +2761,7 @@ STR_NEWGRF_SETTINGS_PARAMETER :{BLACK}Пара
STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}Няма даступнай інфармацыі STR_NEWGRF_SETTINGS_NO_INFO :{BLACK}Няма даступнай інфармацыі
STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Файл ня знойдзены STR_NEWGRF_SETTINGS_NOT_FOUND :{RED}Файл ня знойдзены
STR_NEWGRF_SETTINGS_DISABLED :{RED}Адключана STR_NEWGRF_SETTINGS_DISABLED :{RED}Адключана
STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Несумяшчальна з дадзенай версіяй OpenTTD STR_NEWGRF_SETTINGS_INCOMPATIBLE :{RED}Несумяшчальна з дадзенай вэрсіяй OpenTTD
STR_NEWGRF_SETTINGS_PARAMETER_QUERY :{BLACK}Увядзіце парамэтры файла NewGRF STR_NEWGRF_SETTINGS_PARAMETER_QUERY :{BLACK}Увядзіце парамэтры файла NewGRF
@@ -2769,12 +2772,14 @@ STR_NEWGRF_PARAMETERS_RESET :{BLACK}Ськi
STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Ськінуць значэньнi ўсіх парамэтраў STR_NEWGRF_PARAMETERS_RESET_TOOLTIP :{BLACK}Ськінуць значэньнi ўсіх парамэтраў
STR_NEWGRF_PARAMETERS_DEFAULT_NAME :Парамэтр {NUM} STR_NEWGRF_PARAMETERS_DEFAULT_NAME :Парамэтр {NUM}
STR_NEWGRF_PARAMETERS_SETTING :{STRING}: {ORANGE}{STRING} STR_NEWGRF_PARAMETERS_SETTING :{STRING}: {ORANGE}{STRING}
STR_NEWGRF_PARAMETERS_NUM_PARAM :{LTBLUE}Колькасць параметраў: {ORANGE}{NUM} STR_NEWGRF_PARAMETERS_NUM_PARAM :{LTBLUE}Колькасьць парамэтраў: {ORANGE}{NUM}
# NewGRF readme window
# NewGRF inspect window # NewGRF inspect window
STR_NEWGRF_INSPECT_CAPTION :{WHITE}Прагляд - {STRING} STR_NEWGRF_INSPECT_CAPTION :{WHITE}Прагляд - {STRING}
STR_NEWGRF_INSPECT_PARENT_BUTTON :{BLACK}Бацька (parent) STR_NEWGRF_INSPECT_PARENT_BUTTON :{BLACK}Бацька (parent)
STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Прагляд аб'екта ў кантэксце бацькі STR_NEWGRF_INSPECT_PARENT_TOOLTIP :{BLACK}Прагляд аб'екта ў кантэксьце бацькі
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} у {HEX} STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT :{STRING} у {HEX}
STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Аб'ект STR_NEWGRF_INSPECT_CAPTION_OBJECT_AT_OBJECT :Аб'ект
@@ -2785,7 +2790,7 @@ STR_NEWGRF_INSPECT_QUERY_CAPTION :{WHITE}Пара
# Sprite aligner window # Sprite aligner window
STR_SPRITE_ALIGNER_CAPTION :{WHITE}Выраўноўваньне спрайта {COMMA} ({STRING}) STR_SPRITE_ALIGNER_CAPTION :{WHITE}Выраўноўваньне спрайта {COMMA} ({STRING})
STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Наступны спрайт STR_SPRITE_ALIGNER_NEXT_BUTTON :{BLACK}Наступны спрайт
STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Перайсьці да наступнага нармальнага спрайта, прапускаючы псэўдаспрайты, а таксама змяненьнi колеру/шрыфтавыя. STR_SPRITE_ALIGNER_NEXT_TOOLTIP :{BLACK}Перайсьці да наступнага нармальнага спрайта, прапускаючы псэўдаспрайты, а таксама зьмяненьнi колеру/шрыфтавыя.
STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Перайсьці да спрайта STR_SPRITE_ALIGNER_GOTO_BUTTON :{BLACK}Перайсьці да спрайта
STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Перайсьці да зададзеных спрайту. Калі спрайт не нармальны, пераход адбудзецца да наступнага нармальнага. STR_SPRITE_ALIGNER_GOTO_TOOLTIP :{BLACK}Перайсьці да зададзеных спрайту. Калі спрайт не нармальны, пераход адбудзецца да наступнага нармальнага.
STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Папярэдні спрайт STR_SPRITE_ALIGNER_PREVIOUS_BUTTON :{BLACK}Папярэдні спрайт
@@ -2818,7 +2823,7 @@ STR_NEWGRF_ERROR_UNEXPECTED_SPRITE :Нечакан
STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Невядомая ўласьцівасьць для Action 0. STR_NEWGRF_ERROR_UNKNOWN_PROPERTY :Невядомая ўласьцівасьць для Action 0.
STR_NEWGRF_ERROR_INVALID_ID :Выкарыстоўваецца няправільны ID. STR_NEWGRF_ERROR_INVALID_ID :Выкарыстоўваецца няправільны ID.
STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} утрымлiвае пашкоджаны спрайт. Усе пашкоджаныя спрайты будуць паказаны чырвоным знакам пытаньня (?). STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING} утрымлiвае пашкоджаны спрайт. Усе пашкоджаныя спрайты будуць паказаны чырвоным знакам пытаньня (?).
STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Змяшчае некалькі Action 8 дзеяньняў. STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Зьмяшчае некалькі Action 8 дзеяньняў.
STR_NEWGRF_ERROR_READ_BOUNDS :Дадзеныя раптоўна скончыліся. STR_NEWGRF_ERROR_READ_BOUNDS :Дадзеныя раптоўна скончыліся.
STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}У бягучым наборы базавай графікі адсутнічаюць выявы некаторых аб'ектаў.{}Калі ласка, абнавіце модуль базавай графікі. STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}У бягучым наборы базавай графікі адсутнічаюць выявы некаторых аб'ектаў.{}Калі ласка, абнавіце модуль базавай графікі.
STR_NEWGRF_ERROR_GRM_FAILED :Запрошаныя рэсурсы GRF недаступныя STR_NEWGRF_ERROR_GRM_FAILED :Запрошаныя рэсурсы GRF недаступныя
@@ -2849,7 +2854,7 @@ STR_NEWGRF_BROKEN_VEHICLE_LENGTH :{WHITE}Мяня
STR_BROKEN_VEHICLE_LENGTH :{WHITE}Цягнік «{VEHICLE}», які належыць «{COMPANY}», мае няправільную даўжыню. Верагодна, гэта выклікана праблемамі ў файле новай графікі. Гульня можа рассынхранізавацца або «выляцець». STR_BROKEN_VEHICLE_LENGTH :{WHITE}Цягнік «{VEHICLE}», які належыць «{COMPANY}», мае няправільную даўжыню. Верагодна, гэта выклікана праблемамі ў файле новай графікі. Гульня можа рассынхранізавацца або «выляцець».
STR_NEWGRF_BUGGY :{WHITE}NewGRF «{0:STRING}» падае няправільную інфармацыю. STR_NEWGRF_BUGGY :{WHITE}NewGRF «{0:STRING}» падае няправільную інфармацыю.
STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Інфармацыя аб умяшчальнасьці/пераабсталяваньнi для лякаматыва «{1:ENGINE}» пасля пабудовы адрозніваецца ад зьвестак у сьпісе пакупкі, што можа перашкодзіць функцыі аўтаабнаўленьня/аўтазамены карэктна зрабіць пераабсталяваньне. STR_NEWGRF_BUGGY_ARTICULATED_CARGO :{WHITE}Інфармацыя аб умяшчальнасьці/пераабсталяваньнi для лякаматыва «{1:ENGINE}» пасьля пабудовы адрозніваецца ад зьвестак у сьпісе пакупкі, што можа перашкодзіць функцыі аўтаабнаўленьня/аўтазамены карэктна зрабіць пераабсталяваньне.
STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}«{1:STRING}» выклікаў бясконцы цыкл. STR_NEWGRF_BUGGY_ENDLESS_PRODUCTION_CALLBACK :{WHITE}«{1:STRING}» выклікаў бясконцы цыкл.
# 'User removed essential NewGRFs'-placeholders for stuff without specs # 'User removed essential NewGRFs'-placeholders for stuff without specs
@@ -2859,12 +2864,14 @@ STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} <нев
STR_NEWGRF_INVALID_ENGINE :<няправільная мадэль> STR_NEWGRF_INVALID_ENGINE :<няправільная мадэль>
STR_NEWGRF_INVALID_INDUSTRYTYPE :<невядомае прадпрыемства> STR_NEWGRF_INVALID_INDUSTRYTYPE :<невядомае прадпрыемства>
# NewGRF scanning window
# Sign list window # Sign list window
STR_SIGN_LIST_CAPTION :{WHITE}Сьпіс таблічак - {COMMA} табліч{P ка кi ак} STR_SIGN_LIST_CAPTION :{WHITE}Сьпіс таблічак - {COMMA} табліч{P ка кi ак}
STR_SIGN_LIST_MATCH_CASE :{BLACK}Рэгiстр STR_SIGN_LIST_MATCH_CASE :{BLACK}Рэгiстр
STR_SIGN_LIST_CLEAR :{BLACK}Ачысціць фільтр STR_SIGN_LIST_CLEAR :{BLACK}Ачысьціць фільтр
STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Пераключыць праверку рэгістра пры параўнанні назваў таблiчак з фільтрам STR_SIGN_LIST_MATCH_CASE_TOOLTIP :{BLACK}Пераключыць праверку рэгістра пры параўнанні назваў таблiчак з фільтрам
STR_SIGN_LIST_CLEAR_TOOLTIP :{BLACK}Ачысціць фільтр STR_SIGN_LIST_CLEAR_TOOLTIP :{BLACK}Ачысьціць фільтр
# Sign window # Sign window
STR_EDIT_SIGN_CAPTION :{WHITE}Зьмяніць надпіс на таблічцы STR_EDIT_SIGN_CAPTION :{WHITE}Зьмяніць надпіс на таблічцы
@@ -2979,10 +2986,10 @@ STR_CARGO_RATING_OUTSTANDING :Цудоўны
STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць станцыю ў асноўным вакне. Ctrl+клік - паказаць у дадатковым вакне. STR_STATION_VIEW_CENTER_TOOLTIP :{BLACK}Паказаць станцыю ў асноўным вакне. Ctrl+клік - паказаць у дадатковым вакне.
STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Перайменаваць станцыю STR_STATION_VIEW_RENAME_TOOLTIP :{BLACK}Перайменаваць станцыю
STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Паказаць усе цягнiкi, у раскладзе якіх ёсць гэтая станцыя STR_STATION_VIEW_SCHEDULED_TRAINS_TOOLTIP :{BLACK}Паказаць усе цягнiкi, у раскладзе якіх ёсьць гэтая станцыя
STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Паказаць усе аўтамабiлi, у раскладзе якіх ёсць гэты тэрмiнал/прыпынак STR_STATION_VIEW_SCHEDULED_ROAD_VEHICLES_TOOLTIP :{BLACK}Паказаць усе аўтамабiлi, у раскладзе якіх ёсьць гэты тэрмiнал/прыпынак
STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Паказаць увесь авiятранспарт, у раскладзе якога ёсць гэты аэрапорт STR_STATION_VIEW_SCHEDULED_AIRCRAFT_TOOLTIP :{BLACK}Паказаць увесь авiятранспарт, у раскладзе якога ёсьць гэты аэрапорт
STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Паказаць усе караблі, у раскладзе якіх ёсць гэтая прыстань STR_STATION_VIEW_SCHEDULED_SHIPS_TOOLTIP :{BLACK}Паказаць усе караблі, у раскладзе якіх ёсьць гэтая прыстань
STR_STATION_VIEW_RENAME_STATION_CAPTION :Перайменаваць станцыю STR_STATION_VIEW_RENAME_STATION_CAPTION :Перайменаваць станцыю
@@ -3022,7 +3029,7 @@ STR_FINANCES_TOTAL_CURRENCY :{BLACK}{CURRENC
STR_FINANCES_BORROW_BUTTON :{BLACK}Пазычыць {CURRENCY} STR_FINANCES_BORROW_BUTTON :{BLACK}Пазычыць {CURRENCY}
STR_FINANCES_BORROW_TOOLTIP :{BLACK}Павелічыць памер пазыкі. Ctrl+клiк - пазычыць да максымальнай сумы. STR_FINANCES_BORROW_TOOLTIP :{BLACK}Павелічыць памер пазыкі. Ctrl+клiк - пазычыць да максымальнай сумы.
STR_FINANCES_REPAY_BUTTON :{BLACK}Аддаць {CURRENCY} STR_FINANCES_REPAY_BUTTON :{BLACK}Аддаць {CURRENCY}
STR_FINANCES_REPAY_TOOLTIP :{BLACK}Вярнуць частку пазыкі. Ctrl+клiк - вярнуць усё, па магчымасці. STR_FINANCES_REPAY_TOOLTIP :{BLACK}Вярнуць частку пазыкі. Ctrl+клiк - вярнуць усё, па магчымасьці.
# Company view # Company view
STR_COMPANY_VIEW_CAPTION :{WHITE}{COMPANY} {BLACK}{COMPANYNUM} STR_COMPANY_VIEW_CAPTION :{WHITE}{COMPANY} {BLACK}{COMPANYNUM}
@@ -3046,8 +3053,8 @@ STR_COMPANY_VIEW_VIEW_HQ_TOOLTIP :{BLACK}Агле
STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Перамясьціць STR_COMPANY_VIEW_RELOCATE_HQ :{BLACK}Перамясьціць
STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Перамясьціць штаб-кватэру кампаніі ў іншае месца за 1% ацэнкавага кошту капіталу кампаніі. Shift+пстрычка - ацэнка кошту пераносу. STR_COMPANY_VIEW_RELOCATE_COMPANY_HEADQUARTERS :{BLACK}Перамясьціць штаб-кватэру кампаніі ў іншае месца за 1% ацэнкавага кошту капіталу кампаніі. Shift+пстрычка - ацэнка кошту пераносу.
STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Знешнасьць STR_COMPANY_VIEW_NEW_FACE_BUTTON :{BLACK}Зьнешнасьць
STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Зьмяніць знешнасьць дырэктара STR_COMPANY_VIEW_NEW_FACE_TOOLTIP :{BLACK}Зьмяніць зьнешнасьць дырэктара
STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Колер STR_COMPANY_VIEW_COLOUR_SCHEME_BUTTON :{BLACK}Колер
STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Зьмяніць колер транспартных сродкаў кампаніі STR_COMPANY_VIEW_COLOUR_SCHEME_TOOLTIP :{BLACK}Зьмяніць колер транспартных сродкаў кампаніі
STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Назва кампаніі STR_COMPANY_VIEW_COMPANY_NAME_BUTTON :{BLACK}Назва кампаніі
@@ -3484,7 +3491,7 @@ STR_VEHICLE_DETAILS_TRAIN_ARTICULATED_RV_CAPACITY :{BLACK}Ёміс
STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Пераабсталяваньне) STR_REFIT_CAPTION :{WHITE}{VEHICLE} (Пераабсталяваньне)
STR_REFIT_TITLE :{GOLD}Выберыце тып грузу для перавозкі: STR_REFIT_TITLE :{GOLD}Выберыце тып грузу для перавозкі:
STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Новая ёмістасьць: {GOLD}{CARGO}{}{BLACK}Кошт пераабсталяваньня: {GOLD}{CURRENCY} STR_REFIT_NEW_CAPACITY_COST_OF_REFIT :{BLACK}Новая ёмістасьць: {GOLD}{CARGO}{}{BLACK}Кошт пераабсталяваньня: {GOLD}{CURRENCY}
STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Новая ёмістасць: {GOLD}{CARGO}, {GOLD}{CARGO}{}{BLACK}Кошт пераабсталяваньня: {GOLD}{CURRENCY} STR_REFIT_NEW_CAPACITY_COST_OF_AIRCRAFT_REFIT :{BLACK}Новая ёмістасьць: {GOLD}{CARGO}, {GOLD}{CARGO}{}{BLACK}Кошт пераабсталяваньня: {GOLD}{CURRENCY}
STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Абярыце вагоны для пераабсталяваньня. Можна абвесьці мышшу некалькі вагонаў. Пстрычка па-за межамі састава абярэ ўвесь састаў. Ctrl+пстрычка абярэ вагоны да канца састава. STR_REFIT_SELECT_VEHICLES_TOOLTIP :{BLACK}Абярыце вагоны для пераабсталяваньня. Можна абвесьці мышшу некалькі вагонаў. Пстрычка па-за межамі састава абярэ ўвесь састаў. Ctrl+пстрычка абярэ вагоны да канца састава.
STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Выберыце тып грузу для перавозкі STR_REFIT_TRAIN_LIST_TOOLTIP :{BLACK}Выберыце тып грузу для перавозкі
@@ -3543,9 +3550,11 @@ STR_ORDER_SERVICE :{BLACK}Абсл
STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ісьці заўсёды STR_ORDER_DROP_GO_ALWAYS_DEPOT :Ісьці заўсёды
STR_ORDER_DROP_SERVICE_DEPOT :Абслужыць, калі неабходна STR_ORDER_DROP_SERVICE_DEPOT :Абслужыць, калі неабходна
STR_ORDER_DROP_HALT_DEPOT :Стоп STR_ORDER_DROP_HALT_DEPOT :Стоп
STR_ORDER_SERVICE_TOOLTIP :{BLACK}Прапусціць гэтае заданьне, калі абслугоўваньне не патрабуецца STR_ORDER_SERVICE_TOOLTIP :{BLACK}Прапусьціць гэтае заданьне, калі абслугоўваньне не патрабуецца
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Парамэтр транспарту для параўнаньня STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Парамэтр транспарту для параўнаньня
# Conditional order variables, must follow order of OrderConditionVariable enum
STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Працэнт пагрузкі STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Працэнт пагрузкі
STR_ORDER_CONDITIONAL_RELIABILITY :Надзейнасьць STR_ORDER_CONDITIONAL_RELIABILITY :Надзейнасьць
STR_ORDER_CONDITIONAL_MAX_SPEED :Макс. хуткасьць STR_ORDER_CONDITIONAL_MAX_SPEED :Макс. хуткасьць
@@ -3606,7 +3615,7 @@ STR_ORDER_STOP_ORDER :(Стоп)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_AUTOMATIC :(Аўтаматычна) STR_ORDER_IMPLICIT :(Аўтаматычна)
STR_ORDER_FULL_LOAD :(Поўная загрузка) STR_ORDER_FULL_LOAD :(Поўная загрузка)
STR_ORDER_FULL_LOAD_ANY :(Поўная загрузка любым грузам) STR_ORDER_FULL_LOAD_ANY :(Поўная загрузка любым грузам)
@@ -3624,6 +3633,8 @@ STR_ORDER_NO_UNLOAD_FULL_LOAD :(Не разг
STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Не разгружацца й чакаць поўнай загрузкі любым грузам) STR_ORDER_NO_UNLOAD_FULL_LOAD_ANY :(Не разгружацца й чакаць поўнай загрузкі любым грузам)
STR_ORDER_NO_UNLOAD_NO_LOAD :(Не разгружацца й не грузiцца) STR_ORDER_NO_UNLOAD_NO_LOAD :(Не разгружацца й не грузiцца)
STR_ORDER_STOP_LOCATION_NEAR_END :[пачатак станцыi] STR_ORDER_STOP_LOCATION_NEAR_END :[пачатак станцыi]
STR_ORDER_STOP_LOCATION_MIDDLE :[сярэдзiна станцыi] STR_ORDER_STOP_LOCATION_MIDDLE :[сярэдзiна станцыi]
STR_ORDER_STOP_LOCATION_FAR_END :[канец станцыі] STR_ORDER_STOP_LOCATION_FAR_END :[канец станцыі]
@@ -3786,7 +3797,7 @@ STR_GAME_SAVELOAD_NOT_AVAILABLE :<недасту
STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Гульня была захавана ў вэрсіі без падтрымкі трамваяў. Усе трамваі былі адключаны. STR_WARNING_LOADGAME_REMOVED_TRAMS :{WHITE}Гульня была захавана ў вэрсіі без падтрымкі трамваяў. Усе трамваі былі адключаны.
# Map generation messages # Map generation messages
STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Генэрацыя карты спынена...{}... няма прыдатных месцаў для разьмяшчэньня гарадоў STR_ERROR_COULD_NOT_CREATE_TOWN :{WHITE}Генэрацыя мапы спынена...{}... няма прыдатных месцаў для разьмяшчэньня гарадоў
STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... у гэтым сцэнары няма гарадоў STR_ERROR_NO_TOWN_IN_SCENARIO :{WHITE}... у гэтым сцэнары няма гарадоў
STR_ERROR_PNGMAP :{WHITE}Не атрымалася загрузіць ляндшафт з PNG... STR_ERROR_PNGMAP :{WHITE}Не атрымалася загрузіць ляндшафт з PNG...
@@ -3797,8 +3808,10 @@ STR_ERROR_PNGMAP_MISC :{WHITE}... не
STR_ERROR_BMPMAP :{WHITE}Не атрымалася загрузіць ляндшафт з BMP... STR_ERROR_BMPMAP :{WHITE}Не атрымалася загрузіць ляндшафт з BMP...
STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... немагчыма пераўтварыць тып вiдарысу. STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... немагчыма пераўтварыць тып вiдарысу.
STR_ERROR_HEIGHTMAP_TOO_LARGE :{WHITE}... выява занадта вялiкая
STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Выхад за межы даступных значэньняў STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Выхад за межы даступных значэньняў
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Змяненьне памераў зыходнай карты да такіх значэньняў не рэкамендуецца. Працягваць? STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Зьмяненьне памераў зыходнай мапы да такіх значэньняў не рэкамэндуецца. Працягваць?
# Soundset messages # Soundset messages
STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Бягучая гукавая схэма абрана сістэмай аўтаматычна. Дадатковыя наборы гукаў можна загрузіць праз сістэму анлайн-кантэнту. STR_WARNING_FALLBACK_SOUNDSET :{WHITE}Бягучая гукавая схэма абрана сістэмай аўтаматычна. Дадатковыя наборы гукаў можна загрузіць праз сістэму анлайн-кантэнту.
@@ -3825,7 +3838,7 @@ STR_ERROR_ALREADY_BUILT :{WHITE}... уж
STR_ERROR_OWNED_BY :{WHITE}... належыць {STRING} STR_ERROR_OWNED_BY :{WHITE}... належыць {STRING}
STR_ERROR_AREA_IS_OWNED_BY_ANOTHER :{WHITE}... участак належыць іншай кампаніі STR_ERROR_AREA_IS_OWNED_BY_ANOTHER :{WHITE}... участак належыць іншай кампаніі
STR_ERROR_TERRAFORM_LIMIT_REACHED :{WHITE}... дасягнуты лiмiт ляндшафтных зьменаў STR_ERROR_TERRAFORM_LIMIT_REACHED :{WHITE}... дасягнуты лiмiт ляндшафтных зьменаў
STR_ERROR_CLEARING_LIMIT_REACHED :{WHITE}... дасягнута абмежаваньне па колькасці ачышчаных клетак STR_ERROR_CLEARING_LIMIT_REACHED :{WHITE}... дасягнута абмежаваньне па колькасьці ачышчаных клетак
STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}Імя павінна быць унікальным STR_ERROR_NAME_MUST_BE_UNIQUE :{WHITE}Імя павінна быць унікальным
STR_ERROR_GENERIC_OBJECT_IN_THE_WAY :{WHITE}{1:STRING} на шляху STR_ERROR_GENERIC_OBJECT_IN_THE_WAY :{WHITE}{1:STRING} на шляху
STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Забаронена падчас паўзы STR_ERROR_NOT_ALLOWED_WHILE_PAUSED :{WHITE}Забаронена падчас паўзы
@@ -3835,7 +3848,7 @@ STR_ERROR_LOCAL_AUTHORITY_REFUSES_TO_ALLOW_THIS :{WHITE}... ад
STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}Адміністрацыя г. {NBSP}{TOWN} забараняе пабудову яшчэ аднаго аэрапорта ў горадзе STR_ERROR_LOCAL_AUTHORITY_REFUSES_AIRPORT :{WHITE}Адміністрацыя г. {NBSP}{TOWN} забараняе пабудову яшчэ аднаго аэрапорта ў горадзе
STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}Адміністрацыя г. {NBSP}{TOWN} не дазваляе будаўніцтва аэрапорта з-за высокага ўзроўню шуму. STR_ERROR_LOCAL_AUTHORITY_REFUSES_NOISE :{WHITE}Адміністрацыя г. {NBSP}{TOWN} не дазваляе будаўніцтва аэрапорта з-за высокага ўзроўню шуму.
STR_ERROR_BRIBE_FAILED :{WHITE}Ваша спроба даць хабар была STR_ERROR_BRIBE_FAILED :{WHITE}Ваша спроба даць хабар была
STR_ERROR_BRIBE_FAILED_2 :{WHITE}выяўлена рэгіянальным следчым STR_ERROR_BRIBE_FAILED_2 :{WHITE}выяўлена рэгіянальным сьледчым
# Levelling errors # Levelling errors
STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Тут немагчыма падвысіць узровень зямлі... STR_ERROR_CAN_T_RAISE_LAND_HERE :{WHITE}Тут немагчыма падвысіць узровень зямлі...
@@ -3867,7 +3880,7 @@ STR_ERROR_CAN_T_GENERATE_TOWN :{WHITE}Нема
STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}Немагчыма перайменаваць горад... STR_ERROR_CAN_T_RENAME_TOWN :{WHITE}Немагчыма перайменаваць горад...
STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Тут немагчыма пабудаваць горад... STR_ERROR_CAN_T_FOUND_TOWN_HERE :{WHITE}Тут немагчыма пабудаваць горад...
STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}Немагчыма пашырыць горад... STR_ERROR_CAN_T_EXPAND_TOWN :{WHITE}Немагчыма пашырыць горад...
STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... занадта блізка да краю карты STR_ERROR_TOO_CLOSE_TO_EDGE_OF_MAP_SUB :{WHITE}... занадта блізка да краю мапы
STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... занадта блізка да іншага горада STR_ERROR_TOO_CLOSE_TO_ANOTHER_TOWN :{WHITE}... занадта блізка да іншага горада
STR_ERROR_TOO_MANY_TOWNS :{WHITE}... занадта шмат гарадоў STR_ERROR_TOO_MANY_TOWNS :{WHITE}... занадта шмат гарадоў
STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... няма месца на мапе STR_ERROR_NO_SPACE_FOR_TOWN :{WHITE}... няма месца на мапе
@@ -3890,7 +3903,7 @@ STR_ERROR_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}... мо
STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... можна будаваць толькі ў гарадах STR_ERROR_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}... можна будаваць толькі ў гарадах
STR_ERROR_CAN_ONLY_BE_BUILT_IN_LOW_AREAS :{WHITE}... можна будаваць толькі ў нізінах STR_ERROR_CAN_ONLY_BE_BUILT_IN_LOW_AREAS :{WHITE}... можна будаваць толькі ў нізінах
STR_ERROR_CAN_ONLY_BE_POSITIONED :{WHITE}... можа знаходзіцца толькі ля краю мапы STR_ERROR_CAN_ONLY_BE_POSITIONED :{WHITE}... можа знаходзіцца толькі ля краю мапы
STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... лес можна саджаць толькі вышэй за лінію сьнегу STR_ERROR_FOREST_CAN_ONLY_BE_PLANTED :{WHITE}... лес можна саджаць толькі вышэй за сьнегавую лiнiю
# Station construction related errors # Station construction related errors
STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Тут немагчыма пабудаваць чыгуначную станцыю... STR_ERROR_CAN_T_BUILD_RAILROAD_STATION :{WHITE}Тут немагчыма пабудаваць чыгуначную станцыю...

View File

@@ -38,12 +38,12 @@ STR_CARGO_PLURAL_GRAIN :{G=m}Cereais
STR_CARGO_PLURAL_WOOD :{G=f}Madeira STR_CARGO_PLURAL_WOOD :{G=f}Madeira
STR_CARGO_PLURAL_IRON_ORE :{G=m}Minério de Ferro STR_CARGO_PLURAL_IRON_ORE :{G=m}Minério de Ferro
STR_CARGO_PLURAL_STEEL :{G=m}Aço STR_CARGO_PLURAL_STEEL :{G=m}Aço
STR_CARGO_PLURAL_VALUABLES :{G=f}Objetos de Valor STR_CARGO_PLURAL_VALUABLES :{G=f}Preciosidades
STR_CARGO_PLURAL_COPPER_ORE :{G=m}Minério de Cobre STR_CARGO_PLURAL_COPPER_ORE :{G=m}Minério de Cobre
STR_CARGO_PLURAL_MAIZE :{G=m}Milho STR_CARGO_PLURAL_MAIZE :{G=m}Milho
STR_CARGO_PLURAL_FRUIT :{G=f}Fruta STR_CARGO_PLURAL_FRUIT :{G=f}Fruta
STR_CARGO_PLURAL_DIAMONDS :{G=m}Diamantes STR_CARGO_PLURAL_DIAMONDS :{G=m}Diamantes
STR_CARGO_PLURAL_FOOD :{G=m}Alimentos STR_CARGO_PLURAL_FOOD :{G=m}Alimento
STR_CARGO_PLURAL_PAPER :{G=m}Papel STR_CARGO_PLURAL_PAPER :{G=m}Papel
STR_CARGO_PLURAL_GOLD :{G=m}Ouro STR_CARGO_PLURAL_GOLD :{G=m}Ouro
STR_CARGO_PLURAL_WATER :{G=f}Água STR_CARGO_PLURAL_WATER :{G=f}Água
@@ -448,6 +448,7 @@ STR_ABOUT_MENU_ZOOMIN_SCREENSHOT :Ampliado em cap
STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de tela do mapa inteiro STR_ABOUT_MENU_GIANT_SCREENSHOT :Captura de tela do mapa inteiro
STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD' STR_ABOUT_MENU_ABOUT_OPENTTD :Sobre 'OpenTTD'
STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de "sprites" STR_ABOUT_MENU_SPRITE_ALIGNER :Alinhador de "sprites"
STR_ABOUT_MENU_TOGGLE_BOUNDING_BOXES :Alternar caixas limítrofes
############ range ends here ############ range ends here
############ range for days starts (also used for the place in the highscore window) ############ range for days starts (also used for the place in the highscore window)
@@ -540,7 +541,7 @@ STR_GRAPH_PERFORMANCE_DETAIL_TOOLTIP :{BLACK}Exibir a
# Graph key window # Graph key window
STR_GRAPH_KEY_CAPTION :{WHITE}Chave para gráficos da empresa STR_GRAPH_KEY_CAPTION :{WHITE}Chave para gráficos da empresa
STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para alternar a entrada da empresa no gráfico em ligado/desligado STR_GRAPH_KEY_COMPANY_SELECTION_TOOLTIP :{BLACK}Clique aqui para alternar a entrada da empresa no gráfico
# Company league window # Company league window
STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela da Liga das Empresas STR_COMPANY_LEAGUE_TABLE_CAPTION :{WHITE}Tabela da Liga das Empresas
@@ -707,7 +708,7 @@ STR_SMALLMAP_ENABLE_ALL :{BLACK}Habilita
STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altitude STR_SMALLMAP_SHOW_HEIGHT :{BLACK}Mostrar altitude
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não exibir indústrias no mapa STR_SMALLMAP_TOOLTIP_DISABLE_ALL_INDUSTRIES :{BLACK}Não exibir indústrias no mapa
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Exibir todas as indústrias no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_INDUSTRIES :{BLACK}Exibir todas as indústrias no mapa
STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a exibição de mapa de elevação STR_SMALLMAP_TOOLTIP_SHOW_HEIGHT :{BLACK}Alternar a exibição de mapa topográfico
STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedade da empresa no mapa STR_SMALLMAP_TOOLTIP_DISABLE_ALL_COMPANIES :{BLACK}Não exibir propriedade da empresa no mapa
STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Exibir todas as propriedades da empresa no mapa STR_SMALLMAP_TOOLTIP_ENABLE_ALL_COMPANIES :{BLACK}Exibir todas as propriedades da empresa no mapa
@@ -840,9 +841,9 @@ STR_NEWS_OFFER_OF_SUBSIDY_EXPIRED :{BIGFONT}{BLACK
STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIGFONT}{BLACK}Subsídio removido:{}{} Serviço de {STRING} de {STRING} para {STRING} não é mais subsidiado STR_NEWS_SUBSIDY_WITHDRAWN_SERVICE :{BIGFONT}{BLACK}Subsídio removido:{}{} Serviço de {STRING} de {STRING} para {STRING} não é mais subsidiado
STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIGFONT}{BLACK}Subsídio de serviço oferecido:{}{} Primeiro serviço de {STRING} de {STRING} para {STRING} atrairá subsídio de um ano da autoridade local! STR_NEWS_SERVICE_SUBSIDY_OFFERED :{BIGFONT}{BLACK}Subsídio de serviço oferecido:{}{} Primeiro serviço de {STRING} de {STRING} para {STRING} atrairá subsídio de um ano da autoridade local!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará 50% extra durante o próximo ano ano! STR_NEWS_SERVICE_SUBSIDY_AWARDED_HALF :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará 50% extra durante o próximo ano ano!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará o dobro de impostos durante o próximo ano! STR_NEWS_SERVICE_SUBSIDY_AWARDED_DOUBLE :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará o dobro de tarifas durante o próximo ano!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará o triplo de impostos durante o próximo ano! STR_NEWS_SERVICE_SUBSIDY_AWARDED_TRIPLE :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará o triplo de tarifas durante o próximo ano!
STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará o quadruplo de impostos durante o próximo ano! STR_NEWS_SERVICE_SUBSIDY_AWARDED_QUADRUPLE :{BIGFONT}{BLACK}Subsídio de serviço concedido á {STRING}!{}{}{STRING} serviço de {STRING} para {STRING} pagará o quadruplo de tarifas durante o próximo ano!
STR_NEWS_ROAD_REBUILDING :{BIGFONT}{BLACK}Tráfego caótico em {TOWN}!{}{} Programa de reconstrução rodoviária financiado por {STRING} provoca 6 meses de miséria aos condutores! STR_NEWS_ROAD_REBUILDING :{BIGFONT}{BLACK}Tráfego caótico em {TOWN}!{}{} Programa de reconstrução rodoviária financiado por {STRING} provoca 6 meses de miséria aos condutores!
@@ -1057,6 +1058,7 @@ STR_SEA_LEVEL_HIGH :Alto
STR_SEA_LEVEL_CUSTOM :Personalizado STR_SEA_LEVEL_CUSTOM :Personalizado
STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Personalizado ({NUM}%) STR_SEA_LEVEL_CUSTOM_PERCENTAGE :Personalizado ({NUM}%)
STR_DISASTER_NONE :Nenhum STR_DISASTER_NONE :Nenhum
STR_DISASTER_REDUCED :Reduzido STR_DISASTER_REDUCED :Reduzido
STR_DISASTER_NORMAL :Normal STR_DISASTER_NORMAL :Normal
@@ -1183,7 +1185,7 @@ STR_CONFIG_SETTING_TREE_PLACER :{LTBLUE}Algorí
STR_CONFIG_SETTING_TREE_PLACER_NONE :Nenhum STR_CONFIG_SETTING_TREE_PLACER_NONE :Nenhum
STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Original STR_CONFIG_SETTING_TREE_PLACER_ORIGINAL :Original
STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Melhorado STR_CONFIG_SETTING_TREE_PLACER_IMPROVED :Melhorado
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :{LTBLUE}Rotação do mapa em relevo: {ORANGE}{STRING} STR_CONFIG_SETTING_HEIGHTMAP_ROTATION :{LTBLUE}Rotação do mapa topográfico: {ORANGE}{STRING}
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sentido Anti-Horário STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_COUNTER_CLOCKWISE :Sentido Anti-Horário
STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Sentido Horário STR_CONFIG_SETTING_HEIGHTMAP_ROTATION_CLOCKWISE :Sentido Horário
STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :{LTBLUE}A altitude de um mapa regular é de: {ORANGE}{STRING} STR_CONFIG_SETTING_SE_FLAT_WORLD_HEIGHT :{LTBLUE}A altitude de um mapa regular é de: {ORANGE}{STRING}
@@ -1375,7 +1377,7 @@ STR_INTRO_CAPTION :{WHITE}OpenTTD
STR_INTRO_NEW_GAME :{BLACK}Novo Jogo STR_INTRO_NEW_GAME :{BLACK}Novo Jogo
STR_INTRO_LOAD_GAME :{BLACK}Abrir Jogo STR_INTRO_LOAD_GAME :{BLACK}Abrir Jogo
STR_INTRO_PLAY_SCENARIO :{BLACK}Jogar Cenário STR_INTRO_PLAY_SCENARIO :{BLACK}Jogar Cenário
STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Jogar num mapa de relevo STR_INTRO_PLAY_HEIGHTMAP :{BLACK}Jogar num mapa topográfico
STR_INTRO_SCENARIO_EDITOR :{BLACK}Editor de Cenário STR_INTRO_SCENARIO_EDITOR :{BLACK}Editor de Cenário
STR_INTRO_MULTIPLAYER :{BLACK}Multi-jogador STR_INTRO_MULTIPLAYER :{BLACK}Multi-jogador
@@ -1389,7 +1391,7 @@ STR_INTRO_QUIT :{BLACK}Sair
STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Iniciar um novo jogo. Ctrl+Clique para pular a configuração do mapa STR_INTRO_TOOLTIP_NEW_GAME :{BLACK}Iniciar um novo jogo. Ctrl+Clique para pular a configuração do mapa
STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Carregar um jogo salvado STR_INTRO_TOOLTIP_LOAD_GAME :{BLACK}Carregar um jogo salvado
STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Inica um novo jogo, a partir de um mapa de relevo STR_INTRO_TOOLTIP_PLAY_HEIGHTMAP :{BLACK}Inica um novo jogo, a partir de um mapa topográfico
STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Iniciar um novo jogo, usando um cenário personalizado STR_INTRO_TOOLTIP_PLAY_SCENARIO :{BLACK}Iniciar um novo jogo, usando um cenário personalizado
STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Criar um cenário de jogo personalizado STR_INTRO_TOOLTIP_SCENARIO_EDITOR :{BLACK}Criar um cenário de jogo personalizado
STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Iniciar um jogo de vários jogadores STR_INTRO_TOOLTIP_MULTIPLAYER :{BLACK}Iniciar um jogo de vários jogadores
@@ -1407,6 +1409,7 @@ STR_INTRO_TOOLTIP_ONLINE_CONTENT :{BLACK}Checar p
STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Exibir configs. da IA STR_INTRO_TOOLTIP_AI_SETTINGS :{BLACK}Exibir configs. da IA
STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD' STR_INTRO_TOOLTIP_QUIT :{BLACK}Sair de 'OpenTTD'
# Quit window # Quit window
STR_QUIT_CAPTION :{WHITE}Sair STR_QUIT_CAPTION :{WHITE}Sair
STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Tem a certeza que deseja abandonar este jogo e voltar ao {STRING}? STR_QUIT_ARE_YOU_SURE_YOU_WANT_TO_EXIT_OPENTTD :{YELLOW}Tem a certeza que deseja abandonar este jogo e voltar ao {STRING}?
@@ -1864,7 +1867,7 @@ STR_CONTENT_TYPE_NEWGRF :NewGRF
STR_CONTENT_TYPE_AI :IA STR_CONTENT_TYPE_AI :IA
STR_CONTENT_TYPE_AI_LIBRARY :IA's disponíveis STR_CONTENT_TYPE_AI_LIBRARY :IA's disponíveis
STR_CONTENT_TYPE_SCENARIO :Cenário STR_CONTENT_TYPE_SCENARIO :Cenário
STR_CONTENT_TYPE_HEIGHTMAP :Mapa de altitudes STR_CONTENT_TYPE_HEIGHTMAP :Mapa topográfico
STR_CONTENT_TYPE_BASE_SOUNDS :Sons padrão STR_CONTENT_TYPE_BASE_SOUNDS :Sons padrão
STR_CONTENT_TYPE_BASE_MUSIC :Músicsas padrão STR_CONTENT_TYPE_BASE_MUSIC :Músicsas padrão
@@ -1922,7 +1925,7 @@ STR_RAIL_TOOLBAR_TOOLTIP_BUILD_AUTORAIL :{BLACK}Construi
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito (para compra e manutenção de trens). Shift altera construção/estimação de custo STR_RAIL_TOOLBAR_TOOLTIP_BUILD_TRAIN_DEPOT_FOR_BUILDING :{BLACK}Construir depósito (para compra e manutenção de trens). Shift altera construção/estimação de custo
STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Converter linha em ponto de controle. Ctrl permite a união de pontos de controle. Shift altera construção/estimação de custo STR_RAIL_TOOLBAR_TOOLTIP_CONVERT_RAIL_TO_WAYPOINT :{BLACK}Converter linha em ponto de controle. Ctrl permite a união de pontos de controle. Shift altera construção/estimação de custo
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl permite a união de estações. Shift altera construção/estimação de custo STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_STATION :{BLACK}Construir estação ferroviária. Ctrl permite a união de estações. Shift altera construção/estimação de custo
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais ferroviários. Ctrl liga/desliga a constução de semáforos/sinais{}Clicar e arrastar constroi sinais até a próxima junção{}Ctrl+Clique liga/desliga a janela de seleção de sinais. Shift altera construção/estimação de custo STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_SIGNALS :{BLACK}Construir sinais ferroviários. Ctrl alterna a construção de semáforos/sinais{}Clicar e arrastar constroi sinais até a próxima junção{}Ctrl+Clique alterna a janela de seleção de sinais. Shift altera construção/estimação de custo
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift altera construção/estimação de custo STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_BRIDGE :{BLACK}Construir ponte ferroviária. Shift altera construção/estimação de custo
STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Shift altera construção/estimação de custo STR_RAIL_TOOLBAR_TOOLTIP_BUILD_RAILROAD_TUNNEL :{BLACK}Construir túnel ferroviário. Shift altera construção/estimação de custo
STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar construir/remover ferrovias, sinais, pontos de controle e estações. Segure ctrl para remover os trilhos de estações e pontos de controle. STR_RAIL_TOOLBAR_TOOLTIP_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Alternar construir/remover ferrovias, sinais, pontos de controle e estações. Segure ctrl para remover os trilhos de estações e pontos de controle.
@@ -2291,7 +2294,7 @@ STR_SAVELOAD_SAVE_CAPTION :{WHITE}Salvar J
STR_SAVELOAD_LOAD_CAPTION :{WHITE}Abrir Jogo STR_SAVELOAD_LOAD_CAPTION :{WHITE}Abrir Jogo
STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Salvar Cenário STR_SAVELOAD_SAVE_SCENARIO :{WHITE}Salvar Cenário
STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Abrir Cenário STR_SAVELOAD_LOAD_SCENARIO :{WHITE}Abrir Cenário
STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Carregar Relevo STR_SAVELOAD_LOAD_HEIGHTMAP :{WHITE}Carregar mapa topográfico
STR_SAVELOAD_HOME_BUTTON :{BLACK}Clique aqui para selecionar o diretório padrão de jogos salvos STR_SAVELOAD_HOME_BUTTON :{BLACK}Clique aqui para selecionar o diretório padrão de jogos salvos
STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} livres STR_SAVELOAD_BYTES_FREE :{BLACK}{BYTES} livres
STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista de unidades, diretórios e arquivos de jogos gravados STR_SAVELOAD_LIST_TOOLTIP :{BLACK}Lista de unidades, diretórios e arquivos de jogos gravados
@@ -2343,8 +2346,8 @@ STR_MAPGEN_BORDER_RANDOM :{BLACK}Randômi
STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Randômico STR_MAPGEN_BORDER_RANDOMIZE :{BLACK}Randômico
STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual STR_MAPGEN_BORDER_MANUAL :{BLACK}Manual
STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotação do mapa em relevo: STR_MAPGEN_HEIGHTMAP_ROTATION :{BLACK}Rotação do mapa topográfico:
STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome do mapa em relevo: STR_MAPGEN_HEIGHTMAP_NAME :{BLACK}Nome do mapa topográfico:
STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Tamanho: STR_MAPGEN_HEIGHTMAP_SIZE_LABEL :{BLACK}Tamanho:
STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM} STR_MAPGEN_HEIGHTMAP_SIZE :{ORANGE}{NUM} x {NUM}
@@ -2404,8 +2407,8 @@ STR_NEWGRF_SETTINGS_MOVEDOWN_TOOLTIP :{BLACK}Move o N
STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Lista dos NewGRF instalados. Clique em um deles para mudar seus parâmetros STR_NEWGRF_SETTINGS_FILE_TOOLTIP :{BLACK}Lista dos NewGRF instalados. Clique em um deles para mudar seus parâmetros
STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Definir parâmetros STR_NEWGRF_SETTINGS_SET_PARAMETERS :{BLACK}Definir parâmetros
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Liga/Desliga paleta STR_NEWGRF_SETTINGS_TOGGLE_PALETTE :{BLACK}Alterna paleta
STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Liga/desliga a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo STR_NEWGRF_SETTINGS_TOGGLE_PALETTE_TOOLTIP :{BLACK}Alterna a paleta do NewGRF selecionado.{}Faça isso quando os gráficos deste ficarem rosa durante o jogo
STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar alterações STR_NEWGRF_SETTINGS_APPLY_CHANGES :{BLACK}Aplicar alterações
STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Procurar o conteúdo on-line STR_NEWGRF_SETTINGS_FIND_MISSING_CONTENT_BUTTON :{BLACK}Procurar o conteúdo on-line
@@ -2485,6 +2488,8 @@ STR_NEWGRF_ERROR_CORRUPT_SPRITE :{YELLOW}{STRING
STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contém entradas múltiplas de Ação 8 STR_NEWGRF_ERROR_MULTIPLE_ACTION_8 :Contém entradas múltiplas de Ação 8
STR_NEWGRF_ERROR_READ_BOUNDS :Continuar lendo após o fim do pseudo-sprite STR_NEWGRF_ERROR_READ_BOUNDS :Continuar lendo após o fim do pseudo-sprite
STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Estão faltando alguns sprites na base de gráficos em uso.{}Por favor atualize a base de gráficos STR_NEWGRF_ERROR_MISSING_SPRITES :{WHITE}Estão faltando alguns sprites na base de gráficos em uso.{}Por favor atualize a base de gráficos
STR_NEWGRF_ERROR_GRM_FAILED :Recursos GRF requisitados não estão dispon.
STR_NEWGRF_ERROR_FORCEFULLY_DISABLED :{2:STRING} foi desativado por {4:STRING}
# NewGRF related 'general' warnings # NewGRF related 'general' warnings
STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Cuidado! STR_NEWGRF_POPUP_CAUTION_CAPTION :{WHITE}Cuidado!
@@ -2521,6 +2526,8 @@ STR_NEWGRF_INVALID_CARGO_QUANTITY :{COMMA} de <car
STR_NEWGRF_INVALID_ENGINE :<modelo de veíc. inválido> STR_NEWGRF_INVALID_ENGINE :<modelo de veíc. inválido>
STR_NEWGRF_INVALID_INDUSTRYTYPE :<indústria inválida> STR_NEWGRF_INVALID_INDUSTRYTYPE :<indústria inválida>
# NewGRF scanning window
# Sign list window # Sign list window
STR_SIGN_LIST_CAPTION :{WHITE}Lista de Placas - {COMMA} Placa{P "" s} STR_SIGN_LIST_CAPTION :{WHITE}Lista de Placas - {COMMA} Placa{P "" s}
STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar caixa alta STR_SIGN_LIST_MATCH_CASE :{BLACK}Diferenciar caixa alta
@@ -3188,6 +3195,8 @@ STR_ORDER_DROP_HALT_DEPOT :Parar
STR_ORDER_SERVICE_TOOLTIP :{BLACK}Pular esta ordem a menos que necessite de manutenção STR_ORDER_SERVICE_TOOLTIP :{BLACK}Pular esta ordem a menos que necessite de manutenção
STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados do veículo no qual se basear para pular ordem STR_ORDER_CONDITIONAL_VARIABLE_TOOLTIP :{BLACK}Dados do veículo no qual se basear para pular ordem
# Conditional order variables, must follow order of OrderConditionVariable enum
STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Percentual carregado STR_ORDER_CONDITIONAL_LOAD_PERCENTAGE :Percentual carregado
STR_ORDER_CONDITIONAL_RELIABILITY :Confiabilidade STR_ORDER_CONDITIONAL_RELIABILITY :Confiabilidade
STR_ORDER_CONDITIONAL_MAX_SPEED :Velocidade máxima STR_ORDER_CONDITIONAL_MAX_SPEED :Velocidade máxima
@@ -3248,7 +3257,7 @@ STR_ORDER_STOP_ORDER :(Parar)
STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING} STR_ORDER_GO_TO_STATION :{STRING} {STATION} {STRING}
STR_ORDER_AUTOMATIC :(Automatico) STR_ORDER_IMPLICIT :(Implícito)
STR_ORDER_FULL_LOAD :(Carregar completamente) STR_ORDER_FULL_LOAD :(Carregar completamente)
STR_ORDER_FULL_LOAD_ANY :(Carregar completamente qualquer carga) STR_ORDER_FULL_LOAD_ANY :(Carregar completamente qualquer carga)
@@ -3404,8 +3413,8 @@ STR_PERCENT_UP_DOWN :{WHITE}{NUM}%{U
# Income 'floats' # Income 'floats'
STR_INCOME_FLOAT_COST_SMALL :{TINYFONT}{RED}Custo: {CURRENCY} STR_INCOME_FLOAT_COST_SMALL :{TINYFONT}{RED}Custo: {CURRENCY}
STR_INCOME_FLOAT_COST :{RED}Custo: {CURRENCY} STR_INCOME_FLOAT_COST :{RED}Custo: {CURRENCY}
STR_INCOME_FLOAT_INCOME_SMALL :{TINYFONT}{GREEN}Renda: {CURRENCY} STR_INCOME_FLOAT_INCOME_SMALL :{TINYFONT}{GREEN}Lucro: {CURRENCY}
STR_INCOME_FLOAT_INCOME :{GREEN}Renda: {CURRENCY} STR_INCOME_FLOAT_INCOME :{GREEN}Lucro: {CURRENCY}
STR_FEEDER_TINY :{TINYFONT}{YELLOW}Transferir: {CURRENCY} STR_FEEDER_TINY :{TINYFONT}{YELLOW}Transferir: {CURRENCY}
STR_FEEDER :{YELLOW}Transferir: {CURRENCY} STR_FEEDER :{YELLOW}Transferir: {CURRENCY}
STR_MESSAGE_ESTIMATED_COST :{WHITE}Custo Estimado: {CURRENCY} STR_MESSAGE_ESTIMATED_COST :{WHITE}Custo Estimado: {CURRENCY}
@@ -3439,6 +3448,7 @@ STR_ERROR_PNGMAP_MISC :{WHITE}... algu
STR_ERROR_BMPMAP :{WHITE}Impossível carregar terreno a partir de BMP... STR_ERROR_BMPMAP :{WHITE}Impossível carregar terreno a partir de BMP...
STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... não foi possível converter o tipo de imagem STR_ERROR_BMPMAP_IMAGE_TYPE :{WHITE}... não foi possível converter o tipo de imagem
STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Aviso de Escala STR_WARNING_HEIGHTMAP_SCALE_CAPTION :{WHITE}Aviso de Escala
STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Alterar muito o tamanho do mapa original não é recomendado. Continuar com a geração? STR_WARNING_HEIGHTMAP_SCALE_MESSAGE :{YELLOW}Alterar muito o tamanho do mapa original não é recomendado. Continuar com a geração?

Some files were not shown because too many files have changed in this diff Show More