1
0
mirror of https://github.com/OpenTTD/OpenTTD.git synced 2025-08-28 17:09:10 +00:00

Compare commits

...

96 Commits

Author SHA1 Message Date
rubidium
1003eb6eba (svn r16279) -Release: 0.7.1-RC1 2009-05-11 15:45:50 +00:00
rubidium
139a213d4d (svn r16278) [0.7] -Backport from trunk:
- Fix: The language is called Slovak, not Slovakish (r16090)
2009-05-11 15:35:26 +00:00
rubidium
06c45d6fe5 (svn r16275) [0.7] -Backport a lot of language updates from trunk. 2009-05-10 22:35:36 +00:00
rubidium
8446d6b8c2 (svn r16273) [0.7] -Backport from trunk:
- Fix: Wrong number of parameters or wrong parameter types sent to printf-like functions at several places (r16269)
- Fix: [NewGRF] When callback 2E returns an amount of 0, do not transport 1 unit to the station (r16268)
- Fix: [NoAI] Various documentation omissions with respect to IDs of various objects and corners for AITile::(Raise|Lower)Tile (r16267,r16266)
2009-05-10 21:33:55 +00:00
rubidium
9676072298 (svn r16272) [0.7] -Backport from trunk:
- Fix: [NoAI] Check slopes passed to the API better for validity (r16264, r16262)
- Fix: [NewGRF] Interpret setting bridge property 08 to 0 as always available (r16263)
- Add: [NoAI] AIController::GetVersion, this returns the version of OpenTTD in the same way as for NewGRFs (r16253)
- Add: [NoAI] AIAirport::GetPrice, returning the building cost of an airport (r16252)
- Fix: [NoAI] Enable parameter checking for AIController::* functions again (r16249)
2009-05-10 21:26:46 +00:00
rubidium
2db7e3a0a8 (svn r16248) [0.7] -Backport from trunk:
- Fix: Improve corner case order handling: mark order as done only when actually done, obey non-stop orders, do only stop/refit at the depot in the order (r16240,r16228,r16199,r16198,r16187)
- Fix: Use the stop/non-stop intermediate orderflags AIs can give for goto-depot orders (r16239)
2009-05-06 23:21:43 +00:00
rubidium
1e9fd18e6a (svn r16247) [0.7] -Backport from trunk:
- Fix: [NoAI] Make sure AITunnel::BuildTunnel returns what the documentation says it does (r16244)
- Fix: [NoAI] CmdBuildTunnel could be called with invalid parameters from the API code, causing crashes later [FS#2875] (r16243)
- Fix: [NewGRF] ActionB should use the online parameters from GRFFile instead of the initial user-specified values from GRFConfig. Also use the values as they were set when the ActionB was executed, not as they are set when the message is shown (r16223)
- Fix: Possible crashes when quiting OpenTTD or forcing resizes/redraws of the screen during map generation [FS#2862] (r16220)
- Fix: Shared orders without orders were not properly converted causing corrupt/invalid orders when loading pre 0.7 savegames [FS#2878] (r16214)
2009-05-06 22:37:19 +00:00
rubidium
909af50aaa (svn r16246) [0.7] -Backport from trunk:
- Fix: [Squirrel] the traps variable wasn't restored, causing try/catch blocks to be 'forgotten' during a suspend (r16181)
- Add: [NoAI] Two new error codes to AITile: ERR_AREA_ALREADY_FLAT and ERR_EXCAVATION_WOULD_DAMAGE (r16171)
- Add: [NoAI] AITile::Get(Min|Max|Corner)Height (r16166)
- Add: [NoAI] Several functions to AIOrder to check the what kind of order an order is [FS#2801] (r16165)
- Fix: [NoAI] AIOrder::GetOrderDestination and AIOrder::GetOrderFlags didn't work on ORDER_CURRENT when the vehicle was loading/leaving in a station (r16165)
- Fix: [NoAI] Change WAYPOINT_INVALID to 0xFFFF from -1 as that is the value the AIs got (due to casting) (r16150)
2009-05-06 22:31:52 +00:00
rubidium
07a16f9282 (svn r16245) [0.7] -Backport from trunk:
- Fix: Hardcoded (old sized) MAX_COMPANIES constant (r16182)
- Fix: Do not try to reserve path for trains crashed in station [FS#2866] (r16178)
- Fix: Forbid joining AI companies via the 'move' and 'join' console commands/multiplayer lobby (r16176, r16175)
- Fix: The overflowsafe type did not like dividing by int64 larger than MAX_INT32 causing division by negative numbers and small anomolies when drawing graphs [FS#2855] (r16130)
2009-05-06 22:21:32 +00:00
rubidium
28e7981a5b (svn r16121) [0.7] -Backport from trunk:
- Add: [NoAI] UseAsRandomAI as function in info.nut. When an AI returns false, it will never be chosen as random AI (r16113)
- Fix: [NoAI] Make sure AIOrder::GetDestination always returns a tile belonging to the station (16109)
- Fix: [NoAI] When giving an aircraft a goto-hangar order do not let it be a normal goto-station order (r16108)
- Add: [NoAI] AIOF_STOP_IN_DEPOT to the orderflags in AIOrder to allow stop-in-depot orders (r16107)
- Fix: [NoAI] AIOrder::SetOrderFlags always removed "Service if needed" from goto-depot orders (r16106)
- Add: [NoAI] GetURL() as possible function to info.nut. If AIs implement it, that url is shown when the AI crashes and also in the AI selection window [FS#2808] (r16093)
- Change: [NoAI] Reverse the order of the lines in the AI debug window [FS#2778] (r16091)
- Fix: [NoAI] AIDebug window profiled the blitters by invalidating itself unconditionally on repaint. OTOH it was not invalidated in other cases when needed (r16094)
- Fix: [NoAI] MOF_COND_DESTINATION was not accepted by CmdModifyOrder() (r16063)
2009-04-22 09:00:19 +00:00
rubidium
f7cc97fe5c (svn r16120) [0.7] -Backport from trunk:
- Fix: Road was removed when both the Remove button was active and Ctrl was pressed [FS#2582] (r16119)
- Fix: Connect tried to validate too much of the company ID with too little information on hand [FS#2849] (r16096)
- Fix: Insanely fast trains would not stop in time for stations/'jump' over waypoints/via stations within a tick, which would cause the order not to be processed causing the train to go in loops until (with luck) it 'hit' the tile [FS#2824] (r16079)
- Fix: Content download progress bar 'resetting' due to mathematical overflow [FS#2845] (r16071)
- Fix: Memory leak when querying a server multiple times (r16064)
2009-04-22 08:48:08 +00:00
rubidium
d9ed2d380f (svn r16061) [0.7] -Backport from trunk:
- Fix: Non advanced vehicle list did not handle company switching correctly (r16054)
- Fix: Do not warn that crashed vehicles are getting old; upgrading them is impossible [FS#2740] (r16048)
- Fix: The currency abbreviation for the Romanian Leu is now RON [FS#774] (r16041)
- Fix: Dash was not able to run iconv detection (r16035)
- Fix: [NewGRF] Do not give "... Mines" as name to the station of oil rigs, or more general: do not add "... Mines" when the all of the cargoes are part of the liquid, passenger or mail classes [FS#2785] (r16029)
2009-04-14 21:20:03 +00:00
rubidium
60901368cc (svn r16060) [0.7] -Backport from trunk:
- Fix: Storing/loading some currencies failed due to inconsistent settings "tables" [FS#2826] (r16028)
- Fix: Usage of uninitialised memory when trying to build a random new industry, but there are no industrytypes to choose from (i.e. all appearance probabilities are zero) (r16027)
- Fix: "Build separate station" in the station picker would reuse deleted stations [FS#2818] (r16025)
- Fix: 32 bpp sprites in tars would also be shown in the list of heightmaps [FS#2817] (r16023)
- Fix: Sometimes the unregister "query" thread could be delayed so much that the network stuff was already closed and the packet would never reach the master server causing the server to appear online longer than necessary (r16022)
- Fix: Chance16() did not work for b = 1. Also transform the formula to not use divisions (r16006)
2009-04-14 21:13:07 +00:00
rubidium
9f5e690118 (svn r16059) [0.7] -Backport from trunk:
- Fix: Inconsistency between using NETWORK_NAME_LENGTH and NETWORK_CLIENT_NAME_LENGTH for the length of client names (r15988)
- Fix: [NewGRF] Abort production callback after 0x10000 iterations and show a messagebox blaming the NewGRF [FS#2787] (r15958)
- Fix: [NewGRF] Set callback_param1 (var 10) to 1 only when requested (r15957)
- Fix: Tooltip of detailed ratings window button showed wrong tip (r15943)
- Change: Harden string copying on places where it is possible (r16024)
- Change: Use recent Czech language for plural form (r15965)
2009-04-14 21:07:33 +00:00
rubidium
2fbd7ff6cc (svn r15912) [0.7] -Backport from trunk:
- Update: lots and lots of translations
- Fix: Chat completion got called twice causing tab completion to seemingly fail (r15905)
2009-04-01 14:24:54 +00:00
rubidium
1595413545 (svn r15904) [0.7] -Backport from trunk:
- Feature: Watermark crash.sav and do not generate crash information if a loaded crash.sav causes a crash so the real crash report does not get overwritten (r15893)
- Feature: Add autoclean_novehicles setting which will, when autoclean_companies is true, remove any company with no vehicles and no active client after autoclean_novehicles-months (r15848)
- Add: [NoAI] AIIndustryType::IsBuiltOnWater(), HasHeliport() and HasDock(). Just like AIIndustry (r15901)
- Add: [NoAI] AIBridge::GetBridgeID() so AIs can get the type of bridge that are already build (r15875)
- Add: [NoAI] AIRoad::GetRoadVehicleTypeForCargo() to tell whether a certain cargo needs a bus- or a truckstop (r15860)
2009-03-30 23:22:13 +00:00
rubidium
76b2e1c5ab (svn r15903) [0.7] -Backport from trunk:
- Fix: YAPF did not apply the platform length (too long/too short) penalties (r15900)
- Fix: Fixing the slopes was done a bit more often than intended making map generation with the original generator horribly slow (r15895)
- Fix: YAPF used different penalties for aqueducts than for other water tiles (r15891)
- Fix: Round the production rate up, so e.g. oilrigs always produce some passengers on lowest production level [FS#2772] (r15888)
- Fix: Libtimidity cannot handle frees of NULL (in contrast of most other frees) [FS#2770] (r15886)
- Fix: Make sure house class/ID counters do not overflow (r15831)
2009-03-30 23:15:05 +00:00
rubidium
7e1385b6eb (svn r15828) [0.7] -Prepare: for 0.7.0-RC2. 2009-03-23 00:19:22 +00:00
rubidium
4ec28e1ba7 (svn r15826) [0.7] -Backport from trunk:
- Update: language files
- Fix: Some (newer) GCCs have trouble compiling the Win32 specific part of fontcache.cpp; jumps across variable declarations [FS#2752] (r15818)
- Fix: When sorting on cost do not sort on the running cost [FS#2749] (r15778)
2009-03-23 00:12:52 +00:00
rubidium
30afba1d10 (svn r15775) [0.7] -Backport from trunk:
- Fix: Do not show the message about reporting an AI crash for the dummy AI (r15774)
- Fix: Number of active clients was not always properly updated [FS#2475] (r15773)
- Fix: Settings from the [gameopt] section (from old 0.6 config files) were overwritten with default values (r15771)
- Fix: Infinite loop when skipping sprites when a GRF is invalid (or truncated) (r15767)
- Fix: Crash when opening the content list window twice; inconsistencies when clicking download twice [FS#2744] (r15766)
2009-03-19 23:50:54 +00:00
rubidium
61e97110c9 (svn r15765) [0.7] -Backport from trunk:
- Change: [NewGRF] Expose GRF ID of engines in var action property 0x25 (r15739)
- Fix: Add Engine::GetDisplayDefaultCapacity() and use it everywhere, so CB 36 is also used everywhere (r15763)
- Fix: [Windows] Inlined UTF-8 characters (in the source code) are not handled properly on Eastern versions of Windows so escape them (r15762)
- Fix: [Windows] On some system searching a font using its English name fails. So now we search the font using the localised name and use the English name for the final 'validation' only (r15757)
2009-03-18 19:50:34 +00:00
rubidium
9e592b9986 (svn r15764) [0.7] -Backport from trunk:
- Fix: Number of houses in house variables 0x44, 0x60 and 0x61 were incorrect after 0xFF had been reached and could desync clients joining afterwards (r15755)
- Fix: Crash when clicking the small area between the savegame list and the save button in the save game window [FS#2742] (r15753)
- Fix: Do not try to (un)draw the cursor when the screen is not ready (r15752)
- Fix: The big UFO sometimes landed just outside the map. Instead of landing, just disappear (fly away) in those cases (r15750)
- Fix: Crash because submarines would sometimes start far outside of the map [FS#2739] (r15748)
- Fix: Road ownership getting lost when removing a road stop [FS#2736] (r15747)
- Fix: Update threading code for OS/2, add mutex support, fix compilation (r15746, r15745)
- Fix: When town generator failed to create requested number of towns, there were too many cities (r15744)
2009-03-18 19:47:05 +00:00
rubidium
de7a4a4006 (svn r15737) [0.7] -Prepare: for 0.7.0-RC1. 2009-03-15 22:42:48 +00:00
rubidium
53dc1a89da (svn r15734) [0.7] -Branch: the long awaited branch so we can introduce new features in trunk before 0.7.0, but not let them destabalize the pending release :) 2009-03-15 22:14:10 +00:00
yexo
42e0a5d2ca (svn r15733) -Fix: Enabling freeform edges could cause submarines to get stuck on land tiles. 2009-03-15 21:49:37 +00:00
rubidium
deab21114e (svn r15732) -Fix: enumified constant name style 2009-03-15 21:34:18 +00:00
rubidium
64dcd8acc5 (svn r15731) -Codechange: unify submarine creation 2009-03-15 21:29:07 +00:00
rubidium
95cff9979c (svn r15730) -Fix (r15727): regression wasn't updated. 2009-03-15 21:22:08 +00:00
rubidium
5648ea3058 (svn r15729) -Fix: silence MSVC warning 2009-03-15 21:16:07 +00:00
translators
9dc98b4c27 (svn r15728) -Update: WebTranslator2 update to 2009-03-15 18:52:21
czech      - 7 fixed, 6 changed by SmatZ (13)
danish     - 4 fixed by MiR (4)
german     - 3 fixed by planetmaker (3)
hungarian  - 2 fixed by alyr (2)
indonesian - 2 fixed by fanioz (2)
korean     - 4 fixed by darkttd (4)
lithuanian - 43 fixed, 1 changed by Enternald (8), geckonas (36)
norwegian_nynorsk - 12 fixed by Thor (12)
2009-03-15 18:52:31 +00:00
smatz
36dfa1f21e (svn r15727) -Codechange: apply coding style to namegen arrays
-Fix (r1307): missing comma in _name_original_english_4
2009-03-15 16:31:16 +00:00
smatz
8585aa71ed (svn r15726) -Codechange: unify coding style for const pointers 2009-03-15 16:04:39 +00:00
smatz
af293142fe (svn r15725) -Fix: centering on a vehicle didn't respect its z coordinate 2009-03-15 15:25:18 +00:00
rubidium
4f8eeca437 (svn r15724) -Codechange: some widget documentation/fixing of enumified constant names (Alberth) 2009-03-15 15:22:09 +00:00
rubidium
f9def73be6 (svn r15723) -Codechange: use a constructor for WindowDescs as that makes expanding them much easier (Alberth) 2009-03-15 15:12:06 +00:00
rubidium
e9ae5ae307 (svn r15722) -Change: add a bit more information to the readme. 2009-03-15 14:35:12 +00:00
rubidium
8761a5a4c4 (svn r15721) -Change: give a more useful (for 'normal' users) error message when there's no AI and they want to play with an AI 2009-03-15 14:33:40 +00:00
rubidium
6e9dc85c76 (svn r15720) -Change: put a bit more information into the crash log 2009-03-15 14:28:46 +00:00
yexo
e5204f96f9 (svn r15719) -Update: the credit section. 2009-03-15 00:32:36 +00:00
rubidium
b25a4f8231 (svn r15718) -Cleanup: apply some comment coding style on the rest of the sources too 2009-03-15 00:32:18 +00:00
rubidium
d72273d1f3 (svn r15717) -Cleanup: apply some documentation coding style upon the stuff in table/ 2009-03-15 00:03:27 +00:00
yexo
86a9df82b7 (svn r15716) -Change [NoAI]: AI libraries should now be stored in ai/library/<library_name>/ instead of ai/library/<category_name>/<library_name>/. Libraries inside tar files are not affected. 2009-03-14 23:57:37 +00:00
frosch
bbb28d210a (svn r15715) -Fix (r15714): Project files. (Thanks michi_cc) 2009-03-14 20:43:37 +00:00
frosch
1f5ad840a4 (svn r15714) -Remove: 'Original vehicle names' - err - language... Use the (static) newgrf on BaNaNaS if you care. 2009-03-14 19:52:41 +00:00
frosch
e0dd907cab (svn r15713) -Feature(ette): Allow static newgrfs to set 'GRF ID engine overrides', if the source GRF is static. 2009-03-14 19:38:19 +00:00
translators
40ddc49764 (svn r15712) -Update: WebTranslator2 update to 2009-03-14 18:38:56
catalan    - 4 fixed by arnaullv (4)
finnish    - 3 fixed by jpx_ (3)
french     - 3 fixed by glx (3)
german     - 3 fixed by planetmaker (3)
hungarian  - 1 fixed, 1 changed by alyr (2)
italian    - 3 fixed by lorenzodv (3)
lithuanian - 17 fixed by geckonas (17)
norwegian_nynorsk - 11 fixed by Thor (11)
slovenian  - 10 fixed by Necrolyte (10)
2009-03-14 18:39:10 +00:00
rubidium
9d018723b7 (svn r15711) -Codechange: lots of whitespace cleanup/fixes 2009-03-14 18:16:29 +00:00
glx
1692ce8312 (svn r15710) -Fix (r15706): for non MSVC io.h needs to be included before defining unlink. Also remove redundant tchar.h includes as it is already in stdafx.h. 2009-03-14 15:42:53 +00:00
rubidium
aea8e7291e (svn r15709) -Change [FS#2729]: be a tad more specific about the fact that you're building incompatible tracks when building incompatible track types on the same tile. 2009-03-14 15:34:30 +00:00
yexo
2e6e2457f1 (svn r15708) -Feature [FS#2728]: Pop up the AI Debug Window if one of the AIs crashed and show a message that the user should report the crash. 2009-03-14 01:32:04 +00:00
michi_cc
0ca92a47a2 (svn r15707) -Fix (r15686): The config file was not updated on Windows because rename() can't replace existing files. 2009-03-14 00:26:03 +00:00
michi_cc
b1479bec02 (svn r15706) -Fix: Make sure the filename passed to unlink() is always in file system encoding. 2009-03-14 00:25:59 +00:00
frosch
fa35dc10e5 (svn r15705) -Fix: Do not show passenger-/mail-capacity if the aircraft carries only cargo. 2009-03-13 23:49:12 +00:00
smatz
40745dc0d9 (svn r15704) -Cleanup: remove further includes from recently split files 2009-03-13 23:48:07 +00:00
belugas
42d9816ce3 (svn r15703) -Codechange: split Cmd* from waypoint.cpp to waypoint_cmd.cpp. 2009-03-13 21:49:24 +00:00
rubidium
27bcfd115b (svn r15702) -Feature(tte): direct content download 'links' in the play scenario/heightmap windows. 2009-03-13 21:32:38 +00:00
frosch
4129b418cc (svn r15701) -Fix [FS#2595]: Blame NewGRFs returning inconsistent information in purchase-list/after building before users have a chance to blame OpenTTD for incorrectly autorenewing/-replacing. 2009-03-13 21:28:40 +00:00
rubidium
e6353a1a22 (svn r15700) -Codechange: split Cmd* from signs.cpp to signs_cmd.cpp. 2009-03-13 20:29:35 +00:00
rubidium
070320f25b (svn r15699) -Codechange: split Cmd* from vehicle.cpp to vehicle_cmd.cpp. 2009-03-13 20:09:35 +00:00
translators
38d66e82e2 (svn r15698) -Update: WebTranslator2 update to 2009-03-13 18:45:47
dutch      - 1 changed by Excel20 (1)
english_US - 1 fixed by WhiteRabbit (1)
finnish    - 1 fixed by jpx_ (1)
german     - 1 fixed, 3 changed by planetmaker (4)
italian    - 1 fixed by lorenzodv (1)
slovak     - 1 fixed by James (1)
turkish    - 3 fixed by jnmbk (3)
2009-03-13 18:45:56 +00:00
rubidium
2adbf67968 (svn r15697) -Fix (r15695): warning about comparing signed vs unsigned. 2009-03-13 00:48:03 +00:00
rubidium
eb0d43aadd (svn r15696) -Codechange: move the NewGRF language ID into the language file instead of maintaining a table in the code. 2009-03-13 00:30:26 +00:00
belugas
f6e4bc765a (svn r15695) -Feature [FS#2672]: Allow the number of towns that will be generated in the generate world window to be customized.
Some warnings: 
-the maximum number of towns to be accepted is set to 5000
-the minimum number of towns to be accepted is set to 1
-the number that is specified is NOT guaranteed to be the exact number of towns generated.  The normal mechanism of town creation has not been modified.  So town placement can still fail.
-setting a custom number of town will change your difficulty settings to custom as well
2009-03-12 23:54:20 +00:00
rubidium
af18469455 (svn r15694) -Codechange/feature/fix: invert the order in which base graphics sets are queried making it fairly unlikely that downloaded graphics sets override the original graphics. 2009-03-12 20:43:03 +00:00
yexo
5c40b7235c (svn r15693) -Fix (r15691): The msvc project files weren't updated to include luxembourgish. 2009-03-12 19:57:51 +00:00
frosch
afe547448e (svn r15692) -Fix [FS#2721]: Just sell the old engines after autorenew/replace. Don't bother about trains exceeding the trainlimit, which will be sold anyway. 2009-03-12 19:40:16 +00:00
translators
684d1c4d4c (svn r15691) -Update: WebTranslator2 update to 2009-03-12 18:42:18
french     - 1 fixed by glx (1)
hungarian  - 1 fixed by alyr (1)
luxembourgish - 258 fixed, 3 changed by Gubius (261)
persian    - 146 fixed by ali sattari (146)
russian    - 1 fixed by Smoky555 (1)
spanish    - 1 fixed by eusebio (1)
2009-03-12 18:42:25 +00:00
rubidium
0f361aab6e (svn r15690) -Feature(tte(tte)): CTRL-"New Game" skips the "World generation" window. 2009-03-12 16:48:28 +00:00
rubidium
d5a2dc1d0b (svn r15689) -Fix [FS#2720]: do not crash when the generate map doesn't contain a suitable location for a town. 2009-03-12 15:14:22 +00:00
rubidium
9dbf8a163f (svn r15688) -Codechange: unifiy cleaning up the map generation (normal and abort) 2009-03-12 14:28:55 +00:00
rubidium
8ed58f2b94 (svn r15687) -Fix [FS#2723]: wrong/misleading error message when autorail builds nothing when trying to build over signals in the wrong way. 2009-03-12 14:23:23 +00:00
rubidium
bd2e1ac903 (svn r15686) -Codechange: make it a bit harder for crashes to trash your config file. 2009-03-12 14:22:17 +00:00
rubidium
3d780608a2 (svn r15685) -Fix [FS#2720]: do not crash when someone substitutes the "map generation" sprites with garbage. 2009-03-12 14:21:18 +00:00
yexo
cef662825b (svn r15684) -Add [NoAI]: AIOrder::SkipToOrder(). 2009-03-12 11:43:40 +00:00
yexo
9eef8f77e2 (svn r15683) -Fix (r15670): Removing town-owned bridges was no longer possible. 2009-03-12 11:36:18 +00:00
rubidium
84e5e44ca9 (svn r15682) -Codechange: some coding style 2009-03-12 11:28:03 +00:00
rubidium
55ce735c2c (svn r15681) -Cleanup: remove unneeded forward declaration. 2009-03-12 11:04:41 +00:00
smatz
c2834412f7 (svn r15680) -Cleanup: remove redundant comment 2009-03-12 10:42:02 +00:00
belugas
7f650197d7 (svn r15679) -Cleanup: Little code-style application 2009-03-12 01:35:27 +00:00
rubidium
f67e2a41ce (svn r15678) -Fix (r15676): crash when (re)applying newgrf settings 2009-03-11 23:35:32 +00:00
rubidium
cf21547814 (svn r15677) -Fix [FS#2546]: vehicle images would be determined during the process of moving the vehicle which means that only the (orientation) data for the vehicles in front of it is valid. Now the data for the vehicles behind the vehicle are valid too. 2009-03-11 23:23:08 +00:00
rubidium
655b0ccc2e (svn r15676) -Codechange: remove the need for BeginVehicleMove and merge VehiclePositionChanged and EndVehicleMove. 2009-03-11 20:43:14 +00:00
rubidium
48c8cdfd84 (svn r15675) -Codechange: don't unnecessarily mark vehicles dirty before deleting them; it already happens in the destructor. 2009-03-11 19:50:19 +00:00
translators
a471321b1b (svn r15674) -Update: WebTranslator2 update to 2009-03-11 18:52:10
german     - 9 changed by planetmaker (9)
indonesian - 1 fixed by fanioz (1)
luxembourgish - 121 fixed by Gubius (121)
portuguese - 4 fixed by SnowFlake (4)
russian    - 1 fixed by Smoky555 (1)
slovak     - 3 fixed by James (3)
2009-03-11 18:52:19 +00:00
glx
308dbcf822 (svn r15673) -Fix: it was not possible to compile a win32 dedicated server (even if 'configure --enable-dedicated' passed) 2009-03-11 17:40:49 +00:00
rubidium
fb2ea6c9ed (svn r15672) -Codechange: (left,right,top,bottom)_coord -> coord.(left,right,top,bottom), i.e. use Rect. 2009-03-11 17:26:58 +00:00
rubidium
66e0fcdd01 (svn r15671) -Codechange: bit of coding style/clarification. 2009-03-11 15:00:40 +00:00
yexo
bdab37b11a (svn r15670) -Fix (r15601): The owner of both the road and of the tram tracks was checked, but not the owner of the road itself. 2009-03-11 10:58:42 +00:00
yexo
2b0b9a6367 (svn r15669) -Change: Key presses that are not handles by an input box are no longer marked as handled but given to other OnKeyPress handlers. This makes the global shortcuts like F1 work again when an input box is open. 2009-03-11 09:21:11 +00:00
yexo
13fb01d07d (svn r15668) -Fix: a few typos. 2009-03-11 07:32:31 +00:00
yexo
da0cbb2a2f (svn r15667) -Fix (r15601)[FS#2718]: It was possible to remove rail tunnels/bridges and aqueducts build by rival companies. 2009-03-10 23:16:45 +00:00
rubidium
fa78027ffd (svn r15666) -Fix [FS#2689]: sorting of engines in the purchase list didn't use the same numbers as the GUI showed, e.g. articulated parts weren't taken into accound when ordering by capacity. 2009-03-10 21:17:00 +00:00
733c0c5c5b (svn r15665) -Fix (r8973): Handling of aircraft crash counter did not take account of the reduced number of calls (from 6 down to 2) to the aircraft event handler, resulting in crashed aircraft taking three times longer than they should to clear. Compensate by increasing the counter by 3 on every call instead of 1. 2009-03-10 18:54:33 +00:00
glx
f45e3b3068 (svn r15664) -Fix [FS#2716]: as always windows needs special handling when strings are involved 2009-03-10 14:54:46 +00:00
rubidium
d6f2a65323 (svn r15663) -Fix: growing of vsize as (some) threads weren't properly released. 2009-03-10 11:12:03 +00:00
0564d52d99 (svn r15662) -Fix (r11795): Don't mark a company as having ratings in a town when querying the cost of a command. 2009-03-10 06:53:00 +00:00
359 changed files with 10786 additions and 8205 deletions

View File

@@ -1,7 +1,7 @@
#---------------------------------------------------------------------------
# Project related configuration options
#---------------------------------------------------------------------------
PROJECT_NAME = openttd
PROJECT_NAME = OpenTTD
OUTPUT_DIRECTORY = docs/source/
CREATE_SUBDIRS = NO
OUTPUT_LANGUAGE = English

View File

@@ -220,6 +220,7 @@ function Regression::Airport()
}
print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.COMPANY_SELF));
print(" GetPrice(): " + AIAirport.GetPrice(0));
print(" BuildAirport(): " + AIAirport.BuildAirport(32116, 0, AIStation.STATION_JOIN_ADJACENT));
print(" IsHangarTile(): " + AIAirport.IsHangarTile(32116));
print(" IsAirportTile(): " + AIAirport.IsAirportTile(32116));
@@ -256,12 +257,15 @@ function Regression::Bridge()
print(" Valid Bridges: " + j);
print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
print(" GetBridgeID(): " + AIBridge.GetBridgeID(33160));
print(" RemoveBridge(): " + AIBridge.RemoveBridge(33155));
print(" GetLastErrorString(): " + AIError.GetLastErrorString());
print(" GetOtherBridgeEnd(): " + AIBridge.GetOtherBridgeEnd(33160));
print(" BuildBridge(): " + AIBridge.BuildBridge(AIVehicle.VT_ROAD, 5, 33160, 33155));
print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
print(" GetBridgeID(): " + AIBridge.GetBridgeID(33160));
print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33155));
print(" GetBridgeID(): " + AIBridge.GetBridgeID(33155));
print(" GetOtherBridgeEnd(): " + AIBridge.GetOtherBridgeEnd(33160));
print(" BuildBridge(): " + AIBridge.BuildBridge(AIVehicle.VT_ROAD, 5, 33160, 33155));
print(" GetLastErrorString(): " + AIError.GetLastErrorString());
@@ -329,6 +333,7 @@ function Regression::Cargo()
print(" GetCargoIncome(10, 10): " + AICargo.GetCargoIncome(i, 10, 10));
print(" GetCargoIncome(100, 10): " + AICargo.GetCargoIncome(i, 100, 10));
print(" GetCargoIncome(10, 100): " + AICargo.GetCargoIncome(i, 10, 100));
print(" GetRoadVehicleTypeForCargo(): " + AIRoad.GetRoadVehicleTypeForCargo(i));
}
}
@@ -631,6 +636,9 @@ function Regression::IndustryTypeList()
print(" GetName(): " + AIIndustryType.GetName(i));
print(" CanBuildIndustry(): " + AIIndustryType.CanBuildIndustry(i));
print(" CanProspectIndustry(): " + AIIndustryType.CanProspectIndustry(i));
print(" IsBuiltOnWater(): " + AIIndustryType.IsBuiltOnWater(i));
print(" HasHeliport(): " + AIIndustryType.HasHeliport(i));
print(" HasDock(): " + AIIndustryType.HasDock(i));
}
}
@@ -1182,7 +1190,7 @@ function Regression::TileList()
print("");
print("--TileList--");
print(" Count(): " + list.Count());
list.AddRectangle(41895 - 256 * 2, 256 * 2 + 41895 + 8);
list.AddRectangle(34436, 256 * 2 + 34436 + 8);
print(" Count(): " + list.Count());
list.Valuate(AITile.GetHeight);
@@ -1193,6 +1201,30 @@ function Regression::TileList()
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.GetCornerHeight, AITile.CORNER_N);
print(" CornerHeight(North): done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.GetMinHeight);
print(" MinHeight(): done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.GetMaxHeight);
print(" MaxHeight(): done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
print(" " + i + " => " + list.GetValue(i));
}
list.Valuate(AITile.GetSlope);
list.KeepValue(0);
print(" Slope(): done");
@@ -1203,6 +1235,8 @@ function Regression::TileList()
print(" " + i + " => " + list.GetValue(i));
}
list.Clear();
list.AddRectangle(41895 - 256 * 2, 256 * 2 + 41895 + 8);
list.Valuate(AITile.IsBuildable);
list.KeepValue(1);
print(" Buildable(): done");

File diff suppressed because it is too large Load Diff

View File

@@ -1,3 +1,122 @@
0.7.1-RC1 (2009-05-11)
------------------------------------------------------------------------
- Add: [NoAI] AIController::GetVersion, this returns the version of OpenTTD in the same way as for NewGRFs (r16253)
- Add: [NoAI] AIAirport::GetPrice, returning the building cost of an airport (r16252)
- Add: [NoAI] Two new error codes to AITile: ERR_AREA_ALREADY_FLAT and ERR_EXCAVATION_WOULD_DAMAGE (r16171)
- Add: [NoAI] AITile::Get(Min|Max|Corner)Height (r16166)
- Add: [NoAI] Several functions to AIOrder to check the what kind of order an order is [FS#2801] (r16165)
- Add: [NoAI] UseAsRandomAI as function in info.nut. When an AI returns false, it will never be chosen as random AI (r16113)
- Add: [NoAI] AIOF_STOP_IN_DEPOT to the orderflags in AIOrder to allow stop-in-depot orders (r16107)
- Add: [NoAI] GetURL() as possible function to info.nut. If AIs implement it, that url is shown when the AI crashes and also in the AI selection window [FS#2808] (r16093)
- Change: [NoAI] Reverse the order of the lines in the AI debug window [FS#2778] (r16091)
- Change: Harden string copying on places where it is possible (r16024)
- Change: Use recent Czech language for plural form (r15965)
- Fix: Wrong number of parameters or wrong parameter types sent to printf-like functions at several places (r16269)
- Fix: [NewGRF] When callback 2E returns an amount of 0, do not transport 1 unit to the station (r16268)
- Fix: [NoAI] Various documentation omissions with respect to IDs of various objects and corners for AITile::(Raise|Lower)Tile (r16267, r16266)
- Fix: [NoAI] Check slopes passed to the API better for validity (r16264, r16262)
- Fix: [NewGRF] Interpret setting bridge property 08 to 0 as always available (r16263)
- Fix: [NoAI] Enable parameter checking for AIController::* functions again (r16249)
- Fix: [NoAI] Make sure AITunnel::BuildTunnel returns what the documentation says it does (r16244)
- Fix: [NoAI] CmdBuildTunnel could be called with invalid parameters from the API code, causing crashes later [FS#2875] (r16243)
- Fix: Improve corner case order handling: mark order as done only when actually done, obey non-stop orders, do only stop/refit at the depot in the order (r16240, r16228, r16199, r16198, r16187)
- Fix: [NoAI] Use the stop/non-stop intermediate orderflags AIs can give for goto-depot orders (r16239)
- Fix: [NewGRF] ActionB should use the online parameters from GRFFile instead of the initial user-specified values from GRFConfig. Also use the values as they were set when the ActionB was executed, not as they are set when the message is shown (r16223)
- Fix: Possible crashes when quiting OpenTTD or forcing resizes/redraws of the screen during map generation [FS#2862] (r16220)
- Fix: Shared orders without orders were not properly converted causing corrupt/invalid orders when loading pre 0.7 savegames [FS#2878] (r16214)
- Fix: Hardcoded (old sized) MAX_COMPANIES constant (r16182)
- Fix: [Squirrel] The traps variable was not restored, causing try/catch blocks to be 'forgotten' during a suspend (r16181)
- Fix: Do not try to reserve path for trains crashed in station [FS#2866] (r16178)
- Fix: Forbid joining AI companies via the 'move' and 'join' console commands/multiplayer lobby (r16176, r16175)
- Fix: [NoAI] AIOrder::GetOrderDestination and AIOrder::GetOrderFlags did not work on ORDER_CURRENT when the vehicle was loading/leaving in a station (r16165)
- Fix: [NoAI] Change WAYPOINT_INVALID to 0xFFFF from -1 as that is the value the AIs got (due to casting) (r16150)
- Fix: The overflowsafe type did not like dividing by int64 larger than MAX_INT32 causing division by negative numbers and small anomolies when drawing graphs [FS#2855] (r16130)
- Fix: Road was removed when both the Remove button was active and Ctrl was pressed [FS#2582] (r16119)
- Fix: [NoAI] Make sure AIOrder::GetDestination always returns a tile belonging to the station (16109)
- Fix: [NoAI] When giving an aircraft a goto-hangar order do not let it be a normal goto-station order (r16108)
- Fix: [NoAI] AIOrder::SetOrderFlags always removed "Service if needed" from goto-depot orders (r16106)
- Fix: Connect tried to validate too much of the company ID with too little information on hand [FS#2849] (r16096)
- Fix: [NoAI] AIDebug window profiled the blitters by invalidating itself unconditionally on repaint. On the other hand it was not invalidated in other cases when needed (r16094)
- Fix: The language is called Slovak, not Slovakish (r16090)
- Fix: Insanely fast trains would not stop in time for stations/'jump' over waypoints/via stations within a tick, which would cause the order not to be processed causing the train to go in loops until (with luck) it 'hit' the tile [FS#2824] (r16079)
- Fix: Content download progress bar 'resetting' due to mathematical overflow [FS#2845] (r16071)
- Fix: Memory leak when querying a server multiple times (r16064)
- Fix: [NoAI] MOF_COND_DESTINATION was not accepted by CmdModifyOrder() (r16063)
- Fix: Non advanced vehicle list did not handle company switching correctly (r16054)
- Fix: Do not warn that crashed vehicles are getting old; upgrading them is impossible [FS#2740] (r16048)
- Fix: The currency abbreviation for the Romanian Leu is now RON [FS#774] (r16041)
- Fix: Dash was not able to run iconv detection (r16035)
- Fix: [NewGRF] Do not give "... Mines" as name to the station of oil rigs, or more general: do not add "... Mines" when the all of the cargoes are part of the liquid, passenger or mail classes [FS#2785] (r16029)
- Fix: Storing/loading some currencies failed due to inconsistent settings "tables" [FS#2826] (r16028)
- Fix: Usage of uninitialised memory when trying to build a random new industry, but there are no industrytypes to choose from (i.e. all appearance probabilities are zero) (r16027)
- Fix: "Build separate station" in the station picker would reuse deleted stations [FS#2818] (r16025)
- Fix: 32 bpp sprites in tars would also be shown in the list of heightmaps [FS#2817] (r16023)
- Fix: Sometimes the unregister "query" thread could be delayed so much that the network stuff was already closed and the packet would never reach the master server causing the server to appear online longer than necessary (r16022)
- Fix: Chance16() did not work for b = 1. Also transform the formula to not use divisions (r16006)
- Fix: Inconsistency between using NETWORK_NAME_LENGTH and NETWORK_CLIENT_NAME_LENGTH for the length of client names (r15988)
- Fix: [NewGRF] Abort production callback after 0x10000 iterations and show a messagebox blaming the NewGRF [FS#2787] (r15958)
- Fix: [NewGRF] Set callback_param1 (var 10) to 1 only when requested (r15957)
- Fix: Tooltip of detailed ratings window button showed wrong message (r15943)
0.7.0 (2009-04-01)
------------------------------------------------------------------------
- Feature: Watermark crash.sav and do not generate crash information if a loaded crash.sav causes a crash so the real crash report does not get overwritten (r15893)
- Feature: Add autoclean_novehicles setting which will, when autoclean_companies is true, remove any company with no vehicles and no active client after autoclean_novehicles-months (r15848)
- Add: [NoAI] AIIndustryType::IsBuiltOnWater(), HasHeliport() and HasDock(). Just like AIIndustry (r15901)
- Add: [NoAI] AIBridge::GetBridgeID() so AIs can get the type of bridge that are already build (r15875)
- Add: [NoAI] AIRoad::GetRoadVehicleTypeForCargo() to tell whether a certain cargo needs a bus- or a truckstop (r15860)
- Fix: Chat completion got called twice causing tab completion to seemingly fail (r15905)
- Fix: YAPF did not apply the platform length (too long/too short) penalties (r15900)
- Fix: Fixing the slopes was done a bit more often than intended making map generation with the original generator horribly slow (r15895)
- Fix: YAPF used different penalties for aqueducts than for other water tiles (r15891)
- Fix: Round the production rate up, so e.g. oilrigs always produce some passengers on lowest production level [FS#2772] (r15888)
- Fix: Libtimidity cannot handle frees of NULL (in contrast of most other frees) [FS#2770] (r15886)
- Fix: Make sure house class/ID counters do not overflow (r15831)
0.7.0-RC2 (2009-03-23)
------------------------------------------------------------------------
- Change: [NewGRF] Expose GRF ID of engines in var action property 0x25 (r15739)
- Fix: Some (newer) GCCs have trouble compiling the Win32 specific part of fontcache.cpp; jumps across variable declarations [FS#2752] (r15818)
- Fix: When sorting on cost do not sort on the running cost [FS#2749] (r15778)
- Fix: Do not show the message about reporting an AI crash for the dummy AI (r15774)
- Fix: Number of active clients was not always properly updated [FS#2475] (r15773)
- Fix: Settings from the [gameopt] section (from old 0.6 config files) were overwritten with default values (r15771)
- Fix: Infinite loop when skipping sprites when a GRF is invalid (or truncated) (r15767)
- Fix: Crash when opening the content list window twice; inconsistencies when clicking download twice [FS#2744] (r15766)
- Fix: Add Engine::GetDisplayDefaultCapacity() and use it everywhere, so CB 36 is also used everywhere (r15763)
- Fix: [Windows] Inlined UTF-8 characters (in the source code) are not handled properly on Eastern versions of Windows so escape them (r15762)
- Fix: [Windows] On some system searching a font using its English name fails. So now we search the font using the localised name and use the English name for the final 'validation' only (r15757)
- Fix: Number of houses in house variables 0x44, 0x60 and 0x61 were incorrect after 0xFF had been reached and could desync clients joining afterwards (r15755)
- Fix: Crash when clicking the small area between the savegame list and the save button in the save game window [FS#2742] (r15753)
- Fix: Do not try to (un)draw the cursor when the screen is not ready (r15752)
- Fix: The big UFO sometimes landed just outside the map. Instead of landing, just disappear (fly away) in those cases (r15750)
- Fix: Crash because submarines would sometimes start far outside of the map [FS#2739] (r15748)
- Fix: Road ownership getting lost when removing a road stop [FS#2736] (r15747)
- Fix: Update threading code for OS/2, add mutex support, fix compilation (r15746, r15745)
- Fix: When town generator failed to create requested number of towns, there were too many cities (r15744)
0.7.0-RC1 (2009-03-16)
------------------------------------------------------------------------
- Feature: Pop up the AI Debug Window if one of the AIs crashed and show a message that the user should report the crash [FS#2728] (r15708)
- Feature: Allow the number of towns that will be generated in the generate world window to be customized [FS#2672] (r15695)
- Fix: Enabling freeform edges could cause submarines to get stuck on land tiles (r15733)
- Fix: Centering on a vehicle did not respect its z coordinate (r15725)
- Fix: Do not show passenger-/mail-capacity if the aircraft carries only cargo (r15705)
- Fix: Blame NewGRFs returning inconsistent information in purchase-list/after building before users have a chance to blame OpenTTD for incorrectly autorenewing/-replacing [FS#2595] (r15701)
- Fix: Just sell the old engines after autorenew/replace. Do not bother about trains exceeding the trainlimit, which will be sold anyway [FS#2721] (r15692)
- Fix: Do not crash when the generate map does not contain a suitable location for a town [FS#2720] (r15689)
- Fix: Do not crash when someone substitutes the "map generation" sprites with garbage [FS#2720] (r15685)
- Fix: Vehicle images would be determined during the process of moving the vehicle which means that only the (orientation) data for the vehicles in front of it is valid. Now the data for the vehicles behind the vehicle are valid too [FS#2546] (r15677)
- Fix: It was possible to remove rail tunnels/bridges and aqueducts build by rival companies [FS#2718] (r15667)
- Fix: Sorting of engines in the purchase list did not use the same numbers as the GUI showed, e.g. articulated parts were not taken into accound when ordering by capacity [FS#2689] (r15666)
- Fix: Handling of aircraft crash counter did not take account of the reduced number of calls (from 6 down to 2) to the aircraft event handler, resulting in crashed aircraft taking three times longer than they should to clear. Compensate by increasing the counter by 3 on every call instead of 1 (r15665)
- Fix: Growing of vsize as (some) threads were not properly released (r15663)
- Fix: Do not mark a company as having ratings in a town when querying the cost of a command (r15662)
0.7.0-beta2 (2009-03-10)
------------------------------------------------------------------------
- Feature: Allow downloading scenarios and heightmaps via the in game content download (r15632)
@@ -23,7 +142,7 @@
- Fix: Kicking/banning a client from the Client list window crashed the server [FS#2705] (r15628)
- Fix: UTF8 string handling could cause buffer overruns [FS#2698] (r15626)
- Fix: When trying to reserve a self-crossing path the failed reservation was sometimes not cleared completely [FS#2701] (r15619)
- Fix: Towns would only build houses where the grid would not be, even when they aren't allowed to build roads and the user 'implements' another layout [FS#2661] (r15604)
- Fix: Towns would only build houses where the grid would not be, even when they are not allowed to build roads and the user 'implements' another layout [FS#2661] (r15604)
- Fix: Crash when using an extraordinarily large sprite as cursor [FS#2696] (r15601)
- Fix: Crash when opening viewport while scrolling the map and the mouse 'lands' on the window decoration of the viewport [FS#2695] (r15598)
- Fix: [NewGRF] Refit-info in purchase list did only check the first articulated part (r15592)
@@ -205,7 +324,7 @@
- Fix: Invalid v->u.air.targetairport could cause crashes at several places [FS#2300] (r14383, r14344, r14343)
- Fix: Moving the first vehicle of a train elsewhere might require a new unitnumber for the remaining chain which might not be available (r14384)
- Fix: Trams jumping when reversing on a single trambit (like caused during road construction reworks) or when (manually) reversing in a corner [FS#1852] (r14371)
- Fix: Multiheaded parts in free wagon chains weren't connected (could cause desyncs) (r14366, r14362)
- Fix: Multiheaded parts in free wagon chains were not connected (could cause desyncs) (r14366, r14362)
- Fix: [Win32] Some keypress combinations could be handled twice [FS#2206] (r14363)
- Fix: The ownership of roadtiles was not properly set for very old savegames (including TTD's) making it impossible to remove some pieces of road [FS#2311] (r14359)
- Fix: Desync due to randomly ordered vehicle hash by flooding and road vehicle overtake/following (r14356, r14258)
@@ -214,9 +333,9 @@
- Fix: Signs from old savegames were lost (causing little memory leaks) (r14340)
- Fix: When a company was renamed and then manager was renamed before building anything, company name changed (r14328)
- Fix: When you rename a town before building something and build something near that town your company would be called "<old townname> Transport" [FS#2251] (r14327)
- Fix: Free any blocks that a helicopter may have on an oilrig when the helicopter gets forcefully removed (bankruptcy). For other airports this isn't needed as they can't be used by multiple companies [FS#2241] (r14324)
- Fix: Free any blocks that a helicopter may have on an oilrig when the helicopter gets forcefully removed (bankruptcy). For other airports this is not needed as they cannot be used by multiple companies [FS#2241] (r14324)
- Fix: Possible assert when renaming removed waypoint (r14322)
- Fix: Properly delete orders so the pool doesn't fill up (r14319)
- Fix: Properly delete orders so the pool does not fill up (r14319)
- Fix: Do not allow building road over level crossings and drive-through road stops in the wrong direction; do not allow adding roadtypes to non-drive through road stops; pay for all added road bits [FS#2268] (r14316, r14315, r14314, r14308)
- Fix: Aircraft frozen above oil rig when the next order is invalid [FS#2244] (r14309)
- Fix: [YAPF] Only reserve road slots for multistop when they are really reachable [FS#2294] (r14305)
@@ -225,7 +344,7 @@
- Fix: Make small UFO aware of articulated RVs so they crash the complete vehicle instead of a small part of it (r14270)
- Fix: Desyncs after deleting a waypoint because of explicit destructor call instead of using operator delete (r14265)
- Fix: Merge keycode for "normal" 0-9 keys and keypad 0-9 keys so people do not get confused that the keypad does not work as expected [FS#2277] (r14260)
- Fix: Clicking on the smallmap didn't break the "follow vehicle in main viewport" [FS#2269] (r14243)
- Fix: Clicking on the smallmap did not break the "follow vehicle in main viewport" [FS#2269] (r14243)
- Fix: The engine-purchase-list-sorter doubled running-cost and halfed capacity of double-headed engines [FS#2267] (r14239)
- Fix: Feeder share was computed wrong when splitting cargo packet (r14234)
- Fix: Signs (town name, station name, ...) could be too long for 8bit width in pixels (r14221)
@@ -248,10 +367,10 @@
- Fix: Flawed parsing of words (as in 2 bytes) in GRF strings due to sign extension [FS#2228] (r14087)
- Fix: Division by 0 in NewAI [FS#2226] (r14062)
- Fix: NewGRF callback 23 did not use the NewGRF compatible text stack [FS#2224] (r14058)
- Fix: NewGRF text stack's "push word" didn't move the data around properly (r14057)
- Fix: NewGRF text stack's "push word" did not move the data around properly (r14057)
- Fix: Long strings in the edit box would cause OpenTTD to stop drawing the string. This is especially noticable with low resolutions and the chat input box (r14054)
- Fix: [OSX] changed the condition for selecting 8 or 32 bpp blitter by default. Now we will pick 32 bpp if no 8 bpp fullscreen resolutions are available on the main display (the one with the dock) (r14032)
- Fix: Crash when the AI tries to find the depot of an airport that doesn't have a depot [FS#2190] (r13999)
- Fix: Crash when the AI tries to find the depot of an airport that does not have a depot [FS#2190] (r13999)
- Fix: MSVC cannot handle changed files in the prebuild event, so make the version determination a separate subproject [FS#2004] (r13998)
- Fix: The dedicated console removed any character that was not a printable ASCII character instead. Now it allows UTF8 formated strings too [FS#2189] (r13992)
- Fix: Resetting construction stage counter reset more than it should (r13981)
@@ -311,7 +430,7 @@
- Fix: Signal states could be propagated through waypoints built in orthogonal axis (r13589)
- Fix: [OSX] 10.5 failed to switch to fullscreen (r13584)
- Fix: RVs continueing onto next DT station when they are build adjacent to them [FS#2040] (r13581)
- Fix: Disable static NewGRFs when non-static NewGRFs query them in the context of network games. This makes it impossible for static NewGRFs to disable non-static NewGRFs and 'bad' things happening because the non-static NewGRF doesn't know about the static NewGRF (r13576)
- Fix: Disable static NewGRFs when non-static NewGRFs query them in the context of network games. This makes it impossible for static NewGRFs to disable non-static NewGRFs and 'bad' things happening because the non-static NewGRF does not know about the static NewGRF (r13576)
- Fix: Properly count number of non-north housetiles [FS#2083] (r13518)
- Fix: Incorrect usage of strtoul (r13508)
- Fix: Clear the memory for the new AI during the loading of a savegame so it does not try to execute commands generated in a different savegame, which could be resulting in the AI trying to give orders to stations that do not exist (r13505)
@@ -410,11 +529,11 @@
- Fix: Non-breaking spaces should not be broken (r12385)
- Fix: Check return of AfterLoadGame for success or failure when loading TTD games [FS#1860] (r12383)
- Fix: Use 'items' unit for batteries, fizzy drinks, toys and bubbles in total cargo tab [FS#1864] (r12382)
- Fix: The number of houses wasn't computed right [FS#1835, FS#1535] (r12381)
- Fix: The number of houses was not computed right [FS#1835, FS#1535] (r12381)
- Fix: Update train acceleration and max speed after setting cached value to ensure the correct max speed is used with disabled real acceleration (r12380)
- Fix: Refresh vehicle details window when cached values are updated (r12378)
- Fix: Set cached value for vehicle property 25 before other cached values [FS#1854] (r12377)
- Fix: Don't close a dropmenu when clicking on a dropdown widget (r12374)
- Fix: Do not close a dropmenu when clicking on a dropdown widget (r12374)
- Fix: win32 music driver fails if path is too long or if containing non-latin chars [FS#1849] (r12373, r12372)
- Fix: Do not let window hide behind the main toolbar after resizing the screen [FS#1823] (r12371)
- Fix: Close language drop down when parent window is clicked/closed [FS#1853] (r12370)
@@ -427,7 +546,7 @@
- Fix: Do not try to flood water tile [FS#1836] (r12350)
- Fix: NTP skipped junction just after bridge end (r12348)
- Fix: Remove duplicated and inconsistent code wrt. autoreplace with rules in both vehicles' group and ALL_GROUP [FS#1748, FS#1825] (r12346)
- Fix: Don't try to restore backupped timetable when timetabling is disabled [FS#1828] (r12345)
- Fix: Do not try to restore backupped timetable when timetabling is disabled [FS#1828] (r12345)
- Fix: Slow helicopters never got the 'chance' to finish the landing routine (r12343)
- Fix: GRM buffer for cargos was incorrect size [FS#1827] (r12341)
- Fix: Recalculate cached train data after clearing reversing flag when entering depot (r12339)
@@ -439,7 +558,7 @@
- Feature: Support loading full range of 0xD0xx NewGRF strings which includes 0xD000 to 0xD3FF (r12316)
- Feature: Ability to change aircraft speed factor, from so called 'realistic' (matching other vehicles) (1/1) to original TTD speed (1/4) (r12293, r12294)
- Change: Update readme about where openttd looks for files (r12321)
- Fix: Don't pause/unpause the game when showing load/save windows when the game is paused due to missing GRFs [FS#1733] (r12336)
- Fix: Do not pause/unpause the game when showing load/save windows when the game is paused due to missing GRFs [FS#1733] (r12336)
- Fix: Disallow building level crossings over one-way roads as this allowed competitors to remove the one-way state [FS#1819] (r12329)
- Fix: Wrong Y pillar specified for girder with arch bridge (r12328)
- Fix: Vehicles could be sorted in a wrong order when a vehicle name changed - cached name was not invalidated (r12324)
@@ -459,13 +578,13 @@
- Fix: Mac OSX bundle display name should be 'OpenTTD' [FS#1798] (r12234)
- Fix: [NewGRF] Support using any base price for rail and road vehicles' running cost, show running cost of wagons if available (r12209)
- Fix: When loading a savegame fails, do not start creating a new game, just go straight back to the intro screen (r12202)
- Fix: Force AI to build rail or road instead of bridges if possible, so it doesn't build bridges everywhere (r12200)
- Fix: Force AI to build rail or road instead of bridges if possible, so it does not build bridges everywhere (r12200)
- Fix: "Transparent buildings" now only toggles buildings, so show tick when buildings are transparent [FS#1789] (r12198)
- Fix: Show correct last year profit when the train had negative income [FS#1788] (r12197)
- Fix: There can be oil rigs at map borders, do not set water class for them [FS#1787] (r12195)
- Fix: Do not start overtaking if the RV reaches wrong-way one-way-road in the next tiles (r12191)
- Fix: Assert when trying to play tile sound at NW border of map (placing buyos, leveling land) [FS#1784] (r12186)
- Fix: Take into account possible loan when AI is deciding which bridge to build, so it won't build wooden bridges everytime (r12184)
- Fix: Take into account possible loan when AI is deciding which bridge to build, so it will not build wooden bridges everytime (r12184)
0.6.0-beta4 (2008-02-18)
@@ -487,16 +606,16 @@
- Feature: [NewGRF] Add support for Action 0D, var 13: informations about current map size (r11961)
- Feature: Support Action5 type 0D (newwater) (r11947)
- Feature: Allow building bridge heads on more slopes (r11937)
- Feature: [NewGRF] Add support for Rivers. Rivers can currently only be placed with-in the scenario editor (r11926,r11938,r11949,r12071)
- Feature: [NewGRF] Add support for Rivers. Rivers can currently only be placed with-in the scenario editor (r11926, r11938, r11949, r12071)
- Feature: Generate.vbs script to allow project files generation for users unable to run generate bash script (r12123)
- Feature: Sort the strings in languages dropdown (r11886)
- Codechange: Drop MSVC 2003 support (r11979)
- Fix: Test purchase list loading/loaded sprites instead of unconditionally returning a possibly non-existant sprite (r12180)
- Fix: Return correct bridge price for AI when DC_QUERY_COST is set [FS#609] (r12171)
- Fix: When drag&drop mode was cancelled by keyboard input, depot/group window wasn't updated [FS#337] (r12166)
- Fix: When drag&drop mode was cancelled by keyboard input, depot/group window was not updated [FS#337] (r12166)
- Fix: Buffer overflow when drawing scrolling news [FS#1652, FS#1773] (r12165)
- Fix: If a train is 'stopping' when entering a depot, do not let it leave again [FS#1705] (r12163)
- Fix: Towns shouldn't build over houses owned by another town [FS#1757] (r12162)
- Fix: Towns should not build over houses owned by another town [FS#1757] (r12162)
- Fix: Towns will no longer build houses > 1x1 there where should be road (with 2x2, 3x3 grid town layouts) (r12161)
- Fix: Remove the arbitrary limit of 64 waypoints per town [FS#1744] (r12160)
- Fix: Chance16I was now biased towards zero - round to nearest now (r12156)
@@ -507,7 +626,7 @@
- Fix: With mammoth trains disabled, maximum train length was limited to 9 (r12131)
- Fix: Use tile index 0 for planes in the air, so it cannot have an invalid tile index [FS#1745] (r12109)
- Fix: X/Y axis swap for station tiles in GetNearbyTile() was wrong way around [FS#1753]( r12108)
- Fix: Loading older savegames fixes (r12096,r12097)
- Fix: Loading older savegames fixes (r12096, r12097)
- Fix: When a company bankrupts, remove drive-through road stops, ship depots and buoys too. Update owners of water and road [FS#1703] (r12095)
- Fix: Do not set station owner for buoys when merging company (r12093)
- Fix: Keep production level within delimited boundaries, while using var result 0D/0E and than multiplying/dividing it [FS#1755] (r12092)
@@ -519,7 +638,7 @@
- Fix: Make docks at sea flood neighboured tiles (r12072)
- Fix: Possible deadlock when there are no houses available to build at given tile (r12062)
- Fix: Houses with zero probability could be built (r12062)
- Fix: Do not clear tiles when the town won't be able to build any buildings anyway (r12060)
- Fix: Do not clear tiles when the town will not be able to build any buildings anyway (r12060)
- Fix: Allow building 2x2 building on slopes if not explicitly forbidden (r12060)
- Fix: It was possible to build 2x1 and 1x2 buildings on slopes even if it was not allowed (r12060)
- Fix: Teach NPF where road vehicles and trams can reverse (r12058)
@@ -563,11 +682,11 @@
- Fix: Industries using results 0D/0E on callback cb29/35 were a bit too eager to close down (r11976)
- Fix: Shore and sea tiles under bridges were converted to canals in old savegames [FS#1684] (r11974)
- Fix: Use grass tiles for corner shores, if shores got replaced by ActionA [FS#1683] (r11973)
- Fix: Old AI shouldn't build fast planes with a small airport in orders(r11972)
- Fix: Old AI should not build fast planes with a small airport in orders(r11972)
- Fix: MP_ROAD can have railbits too - OPF searching over rail of diffen t owner behind crossing (r11967)
- Fix: OPF was searching through depots and normal road stops [FS#1403, FS#1506] (r11966)
- Fix: Tropic zone data was returned incorrectly [FS#1685] (r11964)
- Fix: NewAI couldn't build any road vehicles when there were any tram grfs loaded (r11958)
- Fix: NewAI could not build any road vehicles when there were any tram grfs loaded (r11958)
- Fix: Disallow building locks and docks on rapids [FS#1675] (r11956)
- Fix: Do not allow modifying roadbits when other roadtypes would need different foundation (r11953)
- Fix: Loading of very old savegames was broken (r11951)
@@ -585,10 +704,10 @@
- Fix: Crash in MP in vehicle group window if the currently selected group is deleted by another player (r11878)
- Fix: Another way to crash competitors' train in a station (r11877)
- Fix: Automatically sending aircraft to depot for autoreplace/renew is now triggered by the correct conditions (r11875)
- Fix: EngineHasReplacementForPlayer() didn't look in ALL_GROUP (r11872)
- Fix: EngineHasReplacementForPlayer() did not look in ALL_GROUP (r11872)
- Fix: Do not update signals after each tile when building/removing a large block of track/signals/station [FS#1074] (r11871)
- Fix: Slow down train when approaching tile we can't enter in more cases (r11870)
- Fix: Do not make crossing red when we can't enter it in any case (r11870)
- Fix: Slow down train when approaching tile we cannot enter in more cases (r11870)
- Fix: Do not make crossing red when we cannot enter it in any case (r11870)
0.6.0-beta3 (2008-01-16)
@@ -633,7 +752,7 @@
- Fix: Popping from text reference stack must be done in a precise order. But some compiler (MSVC) over optimised it and inverted this order [FS#1532] (r11627)
- Fix: There were still some cases where one could not build a tram track, but the tram could become blocked [FS#1525] (r11621)
- Fix: Do not make crossing red behind depot the train is entering [FS#1531] (r11619)
- Fix: Buoys are just waypoints, so don't allow load/unload/transfert for them (r11618)
- Fix: Buoys are just waypoints, so do not allow load/unload/transfer for them (r11618)
- Fix: Sometimes large values could go off the chart [FS#1526] (r11616)
- Fix: Temperate banks can only be built in towns (over a house) (r11615)
@@ -654,7 +773,7 @@
- Fix: Do not allow changing network only patches settings from console when not in network game (r11594)
- Fix: IsSlopeRefused() result was half wrong causing banks to be built on wrong places (r11590)
- Fix: When ship depots got destroyed they always returned to water, even when it should have been canals [FS#1514] (r11589)
- Fix: The one way road button wasn't reset on abort (r11587)
- Fix: The one way road button was not reset on abort (r11587)
- Fix: Windows could get completely missing when one resized the window to something very small [FS#1484] (r11583)
- Fix: Invalidate 'list trains/roadvehs/ships/planes' widgets when station part is added/removed so it does not become glitchy (r11577)
- Fix: Flood train stations when there are no trains on border tiles too (r11574, r11570)
@@ -781,7 +900,7 @@
- Codechange: Keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo is not thrown on a big pile when it is put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it (r10266)
- Codechange: Do not limit the cost of tunnels (r10248)
- Codechange: Add new vehicle hash table for collision detection and finding vehicles on a tile. The hash area scanned is far smaller than the old hash table, which is now used for viewport updates only. This should give a significant performance improvement for games with many vehicles (r10111)
- Codechange: Don't redraw all station tiles when cargo is added or removed if the station has no custom graphics (r10062)
- Codechange: Do not redraw all station tiles when cargo is added or removed if the station has no custom graphics (r10062)
- Codechange: Add some support for NewGRF var 7D, temporary storage array (r9707)
- Codechange: Add support for returning 'ttdpatch variables' (Action D) (r9701)
- Codechange: Implement NewGRF callback 36, which allows changing of various properties which were previously static (r9671 and several others)
@@ -928,7 +1047,7 @@
- Fix: Take the age of the front vehicle for station rating (r10246)
- Fix: Terraforming wipes out canals. Now you always have to remove the canal before terraforming, instead of "just" removing the canal [FS#594] (r10240)
- Fix: Only 2 trains could crash at one time as collision checking stopped on the first hit. This could technically cause desyncs in network games as the collision hash order is not guaranteed [FS#892] (r10222)
- Fix: Land under foundations was terraform when it shouldn't be terraformed [FS#882, FS#890] (r10219)
- Fix: Land under foundations was terraform when it should not be terraformed [FS#882, FS#890] (r10219)
- Fix: Do not make a 270 degree turn on the international airport when a 90 degree turn is enough (r10187)
- Fix: Crash when trying to get the aircraft movement state of an aircraft going to a just deleted airport [FS#874] (r10165)
- Fix: Airports did not flood when there are aircraft on the airport [FS#601] (r10155)
@@ -969,7 +1088,7 @@
- Fix: Remove arbitrary limit on length of NewGRF strings (r9775)
- Fix: [NewGRF] Ignore axis-bit of station tile layouts [FS#756] (r9758)
- Fix: [win32] Dead key and open/close console. (r9728)
- Fix: When you have closed the "Load game"/"New game" windows which you started from the "start server" menu, you shouldn't start a server when starting a new game [SF#1244842] (r9757)
- Fix: When you have closed the "Load game"/"New game" windows which you started from the "start server" menu, you should not start a server when starting a new game [SF#1244842] (r9757)
- Fix: Trains were lost after autorenewal/autoreplace [FS#732] (r9753)
- Fix: Stop flooded towns from building roads on water [FS#598] (r9743)
- Fix: Station signs were not resized when the language changed [FS#672] (r9741)
@@ -1026,10 +1145,10 @@
- Fix: Difficulty level button was not selected when opening the difficulty window (r9117)
- Fix: The wrong catenary wires were drawn for tunnel entrances [FS#612] (r9077)
- Fix: The intercontinental airport used 'T-junction' runway sprites when there is no exit in the middle of the runway as in the city airport [FS#529] (r9076)
- Fix: [win] dedicated console now doesn't need an extra 'enter' to fully quit [FS#459] (r9074)
- Fix: [win] dedicated console now does not need an extra 'enter' to fully quit [FS#459] (r9074)
- Fix: Take over companies properly in multiplayer games [FS#459] (r9071)
- Fix: When a bribe failed and you haven't picked up cargo yet, you would never be able to do so for a given station [FS#404] (r9070)
- Fix: Don't keep on scrolling for non-numeric values in settings, but require reclick [FS#663] (r9064)
- Fix: When a bribe failed and you have not picked up cargo yet, you would never be able to do so for a given station [FS#404] (r9070)
- Fix: Do not keep on scrolling for non-numeric values in settings, but require reclick [FS#663] (r9064)
- Fix: The personal (.openttd) directories were hidden in the load/save directory listings [FS#652] (r9043)
- Fix: Desync caused by buffer overflow [FS#664] (r9027)
- Fix: When cutting strings into multiple lines also take into consideration whitespace characters of more than 1 byte length. (r9012)
@@ -1089,7 +1208,7 @@
- Fix: Some disaster-events fixed: combat chopper shoots from right position, submarine once again moves around (r8140, r8158)
- Fix: "out of sprite memory" warning messages due to incorrect assumption of requested memory for sprites (r8133)
- Fix: Bouys are now built and numbered 1..9 not 9..1 [FS#538] (r8123)
- Fix: Clicking for more news properly cycles through the news history backwards, and doesn't show the first item doubly if it's already open (r8049)
- Fix: Clicking for more news properly cycles through the news history backwards, and does not show the first item doubly if it's already open (r8049)
- Fix: Crash when removing a town in the scenario editor while the query window is open for one of the town's tiles (r8030)
- Fix: Overflow of system-ticks was not handled properly, resulting in a possibly unresponsive server/client (r8028)
- Fix: Automatic pause interfering with 'pause_on_join setting' in MP when <shift> is pressed [FS#486] (r8027)
@@ -1114,7 +1233,7 @@
- Fix: Signal update got propagated through incompatible railtypes and under certain circumstances tunnels and rail on top (r7620)
- Fix: Remove landscaping toolbar option from road consturction toolbar in scenario editor [FS#473] (r7586)
- Fix: The server could under certain circumstances tell a client too late to start syncing if it has been waiting to join (r7566)
- Fix: Removing towns in scenario editor didn't remove their subsidies causing possible crashes [FS#468] (r7563)
- Fix: Removing towns in scenario editor did not remove their subsidies causing possible crashes [FS#468] (r7563)
- Fix: Internal and (patches) GUI were disagreeing about autorenew settings [FS#431] (r7561)
- Fix: No new company could be created if more than 8 clients were connected, even if not all 8 companies were used (r7560)
- Fix; Clicking 'full load' could under certain circumstances change the current depot order [FS#456] (r7559)
@@ -1125,7 +1244,6 @@
0.5.0-RC1 (2006-12-21)
------------------------------------------------------------------------
- General fixes and improvements to TTDPatch's newgrf format, most noticable are newstations, newsounds, more callbacks and I18n
- Added languages: Bulgarian, Esperanto, Russian, Ukrainian, Languages with proper diacretics: Czech, Hungarian, Turkish
- Feature: Show NewGRF compatability of network games; green for full compatibility, yellow for missing newgrfs and red for invalid revision (r7505)
@@ -1139,14 +1257,14 @@
- Feature: Add Slovak, Brazil and Slovenian currency [SF 1243657, 1171147; FS#131] (r7160, r5964)
- Feature: Allow towns to be built on top of trees in the scenario editor [FS#396] (r7152)
- Feature: Allow over-building of compatible railtypes, i.e. normal and electrified rail. If building electrified rail, normal rail is upgraded for you (at a cost) (r7106)
- Feature: Additional positioning for long dropdown lists with scrollbar support if dropdown list wouldn't fit (r7086)
- Feature: Additional positioning for long dropdown lists with scrollbar support if dropdown list would not fit (r7086)
- Feature: [win32] Remember the window size between restarts when quit in fullscreen mode (r7061)
- Feature: Increase the chatbuffer of chat messages, messages longer than the graphical box will be wrapped to a new line (r6956)
- Feature: Allow typing longer text than visible for an editbox; it will scroll properly now (r6954)
- Feature: Allow spectators to team-speak to eachother (r6933)
- Feature: Allow for " to be in console tokens. Escape them with \. eg \" (r6875)
- Feature: Change the functionality of the chat window. SHIFT+ENTER (SHIFT+T) sends a message to all players, CTRL+ENTER (CTRL+T) sends a message to all team mates and ENTER (T) is customizable (r6824)
- Feature: (Train is) lost message is now generated immediately when pathfinder can't find the path (r6800)
- Feature: (Train is) lost message is now generated immediately when pathfinder cannot find the path (r6800)
- Feature: Add a measurement tool that will show dimensions and height differences of various draggable tools (r6758)
- Feature: Added sort options to the build aircraft and train windows (r6708)
- Feature: Depot lists are now sorted, so vehicle 1 is always first and so on (r6652)
@@ -1203,7 +1321,7 @@
- Codechange: Allow standard ini-file style comments (;) (r6972)
- Codechange: Send server messages with format NETWORK_ACTION_SERVER_MESSAGE so it is general colour like the rest of the server messages. Spectators speak in grey (r6932)
- Codechange: Change textmessage format a bit. Only the sender's name and target are in the sender's colour, the actual message is in white. Should improve readability (r6932)
- Codechange: Add an MD5 sum check of our own data files, and warn if they don't match (r6921)
- Codechange: Add an MD5 sum check of our own data files, and warn if they do not match (r6921)
- Codechange: Add strict bounds checking in string formatting system to check for possible buffer overflows (r6884)
- Codechange: Have the dropdown menus fall fully inside the top toolbar (r6745)
- Codechange: Determine the length of the main toolbar dropdown list based on the length of the strings in that list (r6744)
@@ -1226,7 +1344,7 @@
- Fix: Changed "kick off" acceleration resulted in only a small amount of power being applied; this resulted in a perceived delay before trains moved. (r7421)
- Fix: Long delay for message windows to appear. Immediately show a new message if present if no news window is open, or has just been closed instead of waiting for the timer of the current news to time out [FS#255] (r7402)
- Fix: Deleting Train in depot with autoreplace fails [FS#418] (r7385)
- Fix: Don't update vehicle images when turning a train around. During this procedure the train is split into parts which can result in incorrect images being used (r7378)
- Fix: Do not update vehicle images when turning a train around. During this procedure the train is split into parts which can result in incorrect images being used (r7378)
- Fix: OpenTTD could crash under certain circumstances when a vehicle as autoreplaced and a news window was open [FS#332] (r7368)
- Fix: Segmentation fault in the SDL video driver when one goes to fullscreen and there are no suitable resolutions (r7332)
- Fix: When loading a game from a dedicated server the local player set to 0, theoretically enabling the dedicated server to also play (r7312)
@@ -1234,11 +1352,11 @@
- Fix: Always display the excavation of roadworks even when fully zoomed out or "full details" are off (r7240)
- Fix: Window allocation and deletion messed with the actual window pointer, possibly crashing OpenTTD [FS#350, SF#1560913] (r7205)
- Fix: Callback not executed for non-player based patch changes in multiplayer for all clients; possible desync issue (r7190)
- Fix: Station sign (and base station coordinates) didn't move along with station when station moved by walking. [FS#388] (r7169)
- Fix: Station sign (and base station coordinates) did not move along with station when station moved by walking. [FS#388] (r7169)
- Fix: MiniMap was misplacing vehicles sometimes [FS#402] (r7166)
- Fix: Some mouse events possibly lost under high CPU load, handle mouse input right away instead of waiting for GameLoop. [FS#221, SF1168820] (r7157)
- Fix: Some keyboard events possibly lost under high CPU load, handle keyboard input in place instead of global variables magic. [FS#279] (r7153)
- Fix: "Position of Main Toolbar" option isn't honored when starting new game or loading saved [FS#172] (r7130)
- Fix: "Position of Main Toolbar" option is not honored when starting new game or loading saved [FS#172] (r7130)
- Fix: Synchronize the engine-renew settings of a player when joining a multiplayer game (r7126)
- Fix: Several errors/glitches related to multiplayer and bankrupcy (mainly server), and non-updated company-information (r7125)
- Fix: Cloning a vehicle that has been refitted would incur the expense as running costs, not new vehicles [FS#371] (r7115)
@@ -1253,8 +1371,8 @@
- Fix: Crash at game end when server company is bankrupt [FS#369] (r7008)
- Fix: List of actions panel in the town authority window went underneath its scrollbar (r6885)
- Fix: Pressing ^D (EOF) at a dedicated console caused it to repeat the last command, instead of doing nothing (r6835)
- Fix: Don't add up running cost of articulated engine parts (r6765)
- Fix: If a rail is not available, don't show toolbar even with hotkey 'A' (r6740)
- Fix: Do not add up running cost of articulated engine parts (r6765)
- Fix: If a rail is not available, do not show toolbar even with hotkey 'A' (r6740)
- Fix: Only apply the virtual transfer profit if the order is a transfer order, rather than to any unload order (r6738)
- Fix: Disable main toolbar buttons showing company list drop downs when there are no companies [FS#356] (r6695)
- Fix: Autoreplace can now use the money for selling the old vehicle to build the new one (r6640)
@@ -1265,34 +1383,32 @@
- Fix: Station catchment area persists after switching tools [FS#136] (r6368)
- Fix: Do not reset the current cursor action when centering on a depot/hangar (r6360)
- Fix: Go to hangar orders for aircraft could get spuriously removed when a road or rail depot got deleted (r6355)
- Fix: Due to some off-by-one errors the width or height of a clipping rectangle could become 0, which isn't sensible. This should fix a very rare and hard to trigger assertion in GfxFillRect() (r6351)
- Fix: Never allow scrolling the map in the main menu (scroll-settings weren't reset if switched to mainmenu) (r6037)
- Fix: Due to some off-by-one errors the width or height of a clipping rectangle could become 0, which is not sensible. This should fix a very rare and hard to trigger assertion in GfxFillRect() (r6351)
- Fix: Never allow scrolling the map in the main menu (scroll-settings were not reset if switched to mainmenu) (r6037)
- Fix: Never set I-am-a-thread bool to true IN the thread, dual-core machines could flip [FS#78] (r5977)
- Fix: Town-growth removed houses under construction to make way for road; unwanted behaviour [FS#49] (r5970)
- Fix: Cloned toad vehicles are not refitted to correct cargo [FS#275] (r5917)
- Fix: Bugfix for errors in FindNearestHangar function in aircraft_cmd.c [FS#235] (r5914)
- Fix: Sort order for produced amount and transported percentage was reversed in the industry list (r5912)
- Fix: Changing patch settings through the console didn't accept on/off or true/false [FS#170] (r5903)
- Fix: Changing patch settings through the console did not accept on/off or true/false [FS#170] (r5903)
- Fix: Differing price calculation for tunnels depending on starting point [FS#253] (r5901)
- Fix: Goto sepot not always working for road vehicles [FS#249] (r5898)
- Fix: Bus trying to service in depot of other company [SF1519167] (r5897)
- Fix: If vehicles break down and service is turned off, the vehicles failed to enter any depots; now they will quickly go to a depot if set to be replaced (r5888)
- Fix: Incomplete removal of player owned property due to lack of money [FS#273] (r5886)
- Fix: < > boxes in patch-settings didn't grey out when they hit the limit of their range (r5714)
- Fix: < > boxes in patch-settings did not grey out when they hit the limit of their range (r5714)
- Fix: Check the configuration file for valid values and clamp them to their ingame minimum/maximum [SF1288024] (r3726)
- Fix: Remove the restriction that the 'patch' console command can only be run from network games [SF1366446] (r3723)
0.4.8 (2006-08-12)
------------------------------------------------------------------------
- Fix: A ship in a depot must be stopped before it can be cloned.
- Fix: After changing directory in 'Play Scenario', the default scenarios didn't show up in 'New Game'
0.4.8-RC2 (2006-07-31)
------------------------------------------------------------------------
- Feature: Add Italian town names as we have an official Italian translation
- Codechange: Verify the presence of music files in the gm/ folder. This should also solve some 100% CPU buildup for some users.
- Fix: Certain combinations of trains crash when moved around inside the depot.
@@ -1306,7 +1422,6 @@
0.4.8-RC1 (2006-06-28)
------------------------------------------------------------------------
- Feature: Add Turkish town names as we have an official Turkish translation
- Feature: Add a fully optional configure script that is a wrapper around the cumbersome makefile.config
- Codechange: [NPF] Disable NPF totally for ships as it wholly kills performance (blathijs). Only for 0.4/ branch and 0.4.8.
@@ -1367,7 +1482,6 @@
0.4.7 (2006-03-26)
------------------------------------------------------------------------
- Feature: [OSX] Add support for triple-binaries (PPC, PPC970, i386) (r4102)
- Fix: [OSX] crash when going to fullscreen (r4100)
- Fix: Allow unused wagons to have their first cache set. Fixes faulty cache-warning message and noticably speeds up depot operations (r4094)
@@ -1412,7 +1526,6 @@
0.4.5 (2006-01-31)
------------------------------------------------------------------------
- Feature: [newgrf] Implement varaction2 property 0x41 and 0xDA. (2361)
- Feature: giving server_ip a value of 'all' will make the server listen on any interface (2374)
- Feature: shortcut CTRL + U that clears the current input-box (2385)
@@ -2043,7 +2156,6 @@
0.3.3 (2004-07-13)
------------------------------------------------------------------------
- Feature: (MorphOS/AmigaOS) network support
- Feature: improved german town name generator
- Change: scenarios now have the file extension .scn

View File

@@ -5,7 +5,7 @@ log() {
}
set_default() {
released_version=""
released_version="0.7.1-RC1"
ignore_extra_parameters="0"
# We set all kinds of defaults for params. Later on the user can override
@@ -2405,7 +2405,7 @@ int main() {
}
EOF
execute="$cxx_host $CFLAGS -c tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
eval $execute >&/dev/null
eval $execute > /dev/null
ret=$?
log 2 "executing $execute"
log 2 " exit code $ret"
@@ -2426,7 +2426,7 @@ int main() {
}
EOF
execute="$cxx_host $CFLAGS tmp.iconv.cpp -o tmp.iconv -DTESTING 2>&1"
eval $execute >&/dev/null
eval $execute > /dev/null
ret=$?
log 2 "executing $execute"
log 2 " exit code $ret"

View File

@@ -11,13 +11,15 @@ by the number below on http://bugs.openttd.org.
If the bug report is closed, it has been fixed, which then can be verified
in the latest SVN version of /trunk.
Bugs for 0.7.0-beta2
Bugs for 0.7.1-RC1
------------------------------------------------------------------------
URL: http://bugs.openttd.org
- 2689 Capacity ordering of articulated vehicle in build vehicle window is wrong
- 2769 No offer for buying bankrupt AIs
- 2737 Self-crossing trains ignore "forbid 90 degree turn" setting
- 2616 Cloning creates vehicles with invalid subcargos
- 2585 [OSX] OS' mouse pointer showing
- 2484 [OSX] Cannot enter CJK characters
- 2427 Vehicle owner gets paid for whole cargo feeder share
- 1944 Road vehicles not picking empty drivethrough platform
- 1762 Strange Autoreplace behaviour

View File

@@ -1,17 +1,34 @@
openttd (0.7~svn-1) UNRELEASED; urgency=low
openttd (0.7.1~RC1) unstable; urgency=low
* Unreleased SVN version. Versioned to allow normal upgrades to released
versions.
* New upstream release.
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 03 Sep 2008 18:56:04 +0200
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 11 Mar 2008 17:34:56 +0200
openttd (0.7.0-beta2) unstable; urgency=low
openttd (0.7.0) unstable; urgency=low
* New upstream release.
-- Matthijs Kooijman <matthijs@stdin.nl> Wed, 01 Apr 2008 13:37:42 +0000
openttd (0.7.0~RC2) unstable; urgency=low
* New upstream release.
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 23 Mar 2008 00:42:00 +0200
openttd (0.7.0~RC1) unstable; urgency=low
* New upstream release.
-- Matthijs Kooijman <matthijs@stdin.nl> Mon, 16 Mar 2008 00:07:00 +0200
openttd (0.7.0~beta2) unstable; urgency=low
* New upstream release.
-- Matthijs Kooijman <matthijs@stdin.nl> Tue, 10 Mar 2009 00:33:05 +0100
openttd (0.7.0-beta1) unstable; urgency=low
openttd (0.7.0~beta1) unstable; urgency=low
* New upstream release.

View File

@@ -1,11 +1,11 @@
!define APPNAME "OpenTTD" ; Define application name
!define APPVERSION "0.7.0" ; Define application version
!define INSTALLERVERSION 55 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
!define APPVERSION "0.7.1-RC1" ; Define application version
!define APPVERSIONINTERNAL "0.7.1.0" ; Define application version in X.X.X.X
!define INSTALLERVERSION 59 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
!include ${VERSION_INCLUDE}
!define APPURLLINK "http://www.openttd.org"
!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}"
!define APPVERSIONINTERNAL "${APPVERSION}.0" ; Needs to be of the format X.X.X.X
!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION_FULL}"
!define MUI_ICON "..\..\..\media\openttd.ico"
!define MUI_UNICON "..\..\..\media\openttd.ico"

View File

@@ -32,6 +32,7 @@ Sub UpdateFiles(version)
modified = Mid(version, InStrRev(version, Chr(9)) + 1)
version = Mid(version, 1, InStr(version, Chr(9)) - 1)
Else
version = "0.7.1-RC1"
revision = 0
modified = 1
End If

View File

@@ -436,6 +436,21 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\luxembourgish.txt"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Generating luxembourgish language file"
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
AdditionalDependencies=""
Outputs="..\bin\lang\luxembourgish.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\norwegian_bokmal.txt"
>
@@ -466,21 +481,6 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\origveh.txt"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Generating origveh language file"
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
AdditionalDependencies=""
Outputs="..\bin\lang\origveh.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\piglatin.txt"
>

View File

@@ -437,6 +437,21 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\luxembourgish.txt"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Generating luxembourgish language file"
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
AdditionalDependencies=""
Outputs="..\bin\lang\luxembourgish.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\norwegian_bokmal.txt"
>
@@ -467,21 +482,6 @@
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\origveh.txt"
>
<FileConfiguration
Name="Debug|Win32"
>
<Tool
Name="VCCustomBuildTool"
Description="Generating origveh language file"
CommandLine="..\objs\strgen\strgen.exe -s ..\src\lang -d ..\bin\lang &quot;$(InputPath)&quot;&#x0D;&#x0A;"
AdditionalDependencies=""
Outputs="..\bin\lang\origveh.lng"
/>
</FileConfiguration>
</File>
<File
RelativePath="..\src\lang\piglatin.txt"
>

View File

@@ -1971,6 +1971,10 @@
RelativePath=".\..\src\ship_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\signs_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\station_cmd.cpp"
>
@@ -2003,10 +2007,18 @@
RelativePath=".\..\src\unmovable_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\vehicle_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\water_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\waypoint_cmd.cpp"
>
</File>
</Filter>
<Filter
Name="Save/Load handlers"

View File

@@ -1968,6 +1968,10 @@
RelativePath=".\..\src\ship_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\signs_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\station_cmd.cpp"
>
@@ -2000,10 +2004,18 @@
RelativePath=".\..\src\unmovable_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\vehicle_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\water_cmd.cpp"
>
</File>
<File
RelativePath=".\..\src\waypoint_cmd.cpp"
>
</File>
</Filter>
<Filter
Name="Save/Load handlers"

View File

@@ -1,6 +1,6 @@
OpenTTD README
Last updated: 2009-03-10
Release version: 0.7.0-beta2
Last updated: 2009-04-01
Release version: 0.7.0
------------------------------------------------------------------------
@@ -65,6 +65,8 @@ Please include the following information in your bug report:
version without the bug and the first version including
the bug. That way we can fix it quicker by looking at the
changes made.
- Attach crash.dmp, crash.log and crash.sav from the data
directory if they exist.
2.2) Reporting Desyncs:
---- ------------------
@@ -251,9 +253,11 @@ features known from TTDPatch (http://www.ttdpatch.net/).
Several important non-standard controls:
* Use Ctrl to place semaphore signals
* Ctrl makes many commands more powerful. For example Ctrl clicking on signals
with the build signal tool changes their behaviour.
* Ingame console. More information at
http://wiki.openttd.org/index.php/Console
* Right clicking shows tooltips
5.1) Logging of potentially dangerous actions:
@@ -291,6 +295,9 @@ OpenTTD in debug mode.
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
ingame by using the 'Advanced Settings' window.
When you can not 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
create one after closing.
7.0) Compiling:
@@ -467,26 +474,27 @@ The OpenTTD team (in alphabetical order):
Matthijs Kooijman (blathijs) - Pathfinder-guru, pool rework
Victor Fischer (Celestar) - Programming everywhere you need him to
Christoph Elsenhans (frosch) - General coding
Loïc Guilloux (glx) - General coding
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
Loïc Guilloux (glx) - Windows Expert
Michael Lutz (michi_cc) - Path based signals
Attila Bán (MiHaMiX) - WebTranslator, Nightlies, Wiki and bugtracker host
Owen Rudge (orudge) - Forum host, OS/2 port
Peter Nelson (peter1138) - Spiritual descendant from newGRF gods
Remko Bijker (Rubidium) - Lead coder and way more
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
Zdenek Sojka (SmatZ) - Bug finder and fixer
Thijs Marinussen (Yexo) - AI Framework
Inactive Developers:
Tamás Faragó (Darkvater) - Ex-Lead coder
Jaroslav Mazanec (KUDr) - YAPG (Yet Another Pathfinder God) ;)
Jonathan Coome (Maedhros) - High priest of the NewGRF Temple
Attila Bán (MiHaMiX) - WebTranslator, Nightlies, Wiki and bugtracker host
Christoph Mallon (Tron) - Programmer, code correctness police
Retired Developers:
Ludvig Strigeus (ludde) - OpenTTD author, main 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)
Patric Stout (TrueLight) - Programmer, webhoster (0.3 - pre0.6)
Benedikt Brüggemeier (skidd13) - Bug fixer and code reworker
Patric Stout (TrueLight) - Programmer, webhoster (0.3 - pre0.7)
Thanks to:
Josef Drexler - For his great work on TTDPatch.

View File

@@ -441,6 +441,7 @@ rail_cmd.cpp
road_cmd.cpp
roadveh_cmd.cpp
ship_cmd.cpp
signs_cmd.cpp
station_cmd.cpp
terraform_cmd.cpp
timetable_cmd.cpp
@@ -449,7 +450,9 @@ train_cmd.cpp
tree_cmd.cpp
tunnelbridge_cmd.cpp
unmovable_cmd.cpp
vehicle_cmd.cpp
water_cmd.cpp
waypoint_cmd.cpp
# Save/Load handlers
saveload/afterload.cpp

View File

@@ -83,7 +83,7 @@ SQVM::SQVM(SQSharedState *ss)
_suspended = SQFalse;
_suspended_target=-1;
_suspended_root = SQFalse;
_suspended_traps=-1;
_suspended_traps=0;
_foreignptr=NULL;
_nnativecalls=0;
_lasterror = _null_;
@@ -688,6 +688,7 @@ bool SQVM::Execute(SQObjectPtr &closure, SQInteger target, SQInteger nargs, SQIn
_suspended = SQFalse;
break;
case ET_RESUME_OPENTTD:
traps = _suspended_traps;
_suspended = SQFalse;
break;
}
@@ -698,7 +699,7 @@ exception_restore:
for(;;)
{
DecreaseOps(1);
if (ShouldSuspend()) { _suspended = SQTrue; return true; }
if (ShouldSuspend()) { _suspended = SQTrue; _suspended_traps = traps; return true; }
const SQInstruction &_i_ = *ci->_ip++;
//dumpstack(_stackbase);

View File

@@ -103,6 +103,11 @@ struct AIListWindow : public Window {
sprintf(buf, "%d", selected_info->GetVersion());
DoDrawStringTruncated(buf, x + 5, y, TC_BLACK, this->width - x - 8);
y += 13;
if (selected_info->GetURL() != NULL) {
SetDParamStr(0, selected_info->GetURL());
DrawString(4, y, STR_AI_URL, TC_BLACK);
y += 13;
}
SetDParamStr(0, selected_info->GetDescription());
DrawStringMultiLine(4, y, STR_JUST_RAW_STRING, this->width - 8, this->widget[AIL_WIDGET_INFO_BG].bottom - y);
}
@@ -195,12 +200,12 @@ static const Widget _ai_list_widgets[] = {
};
/* Window definition for the ai list window. */
static const WindowDesc _ai_list_desc = {
static const WindowDesc _ai_list_desc(
WDP_CENTER, WDP_CENTER, 200, 234, 200, 234,
WC_AI_LIST, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
_ai_list_widgets
};
);
void ShowAIListWindow(CompanyID slot)
{
@@ -377,12 +382,12 @@ static const Widget _ai_settings_widgets[] = {
};
/* Window definition for the AI settings window. */
static const WindowDesc _ai_settings_desc = {
static const WindowDesc _ai_settings_desc(
WDP_CENTER, WDP_CENTER, 200, 208, 500, 208,
WC_AI_SETTINGS, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE,
_ai_settings_widgets
};
);
void ShowAISettingsWindow(CompanyID slot)
{
@@ -405,12 +410,12 @@ static const Widget _ai_config_widgets[] = {
};
/* Window definition for the configure AI window. */
static const WindowDesc _ai_config_desc = {
static const WindowDesc _ai_config_desc(
WDP_CENTER, WDP_CENTER, 300, 172, 300, 172,
WC_GAME_OPTIONS, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_ai_config_widgets
};
);
/**
* Window to configure which AIs will start.
@@ -575,6 +580,8 @@ struct AIDebugWindow : public Window {
static CompanyID ai_debug_company;
int redraw_timer;
int last_vscroll_pos;
bool autoscroll;
AIDebugWindow(const WindowDesc *desc, WindowNumber number) : Window(desc, number)
{
@@ -587,6 +594,8 @@ struct AIDebugWindow : public Window {
this->vscroll.cap = 14;
this->vscroll.pos = 0;
this->resize.step_height = 12;
this->last_vscroll_pos = 0;
this->autoscroll = true;
if (ai_debug_company != INVALID_COMPANY) this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
@@ -664,13 +673,35 @@ struct AIDebugWindow : public Window {
AILog::LogData *log = (AILog::LogData *)AIObject::GetLogPointer();
_current_company = old_company;
SetVScrollCount(this, (log == NULL) ? 0 : log->used);
this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
int scroll_count = (log == NULL) ? 0 : log->used;
if (this->vscroll.count != scroll_count) {
SetVScrollCount(this, scroll_count);
/* We need a repaint */
this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
}
if (log == NULL) return;
/* Detect when the user scrolls the window. Enable autoscroll when the
* bottom-most line becomes visible. */
if (this->last_vscroll_pos != this->vscroll.pos) {
this->autoscroll = this->vscroll.pos >= log->used - this->vscroll.cap;
}
if (this->autoscroll) {
int scroll_pos = max(0, log->used - this->vscroll.cap);
if (scroll_pos != this->vscroll.pos) {
this->vscroll.pos = scroll_pos;
/* We need a repaint */
this->InvalidateWidget(AID_WIDGET_SCROLLBAR);
}
}
last_vscroll_pos = this->vscroll.pos;
int y = 6;
for (int i = this->vscroll.pos; i < (this->vscroll.cap + this->vscroll.pos); i++) {
uint pos = (log->count + log->pos - i) % log->count;
for (int i = this->vscroll.pos; i < (this->vscroll.cap + this->vscroll.pos) && i < log->used; i++) {
uint pos = (i + log->pos + 1 - log->used + log->count) % log->count;
if (log->lines[pos] == NULL) break;
TextColour colour;
@@ -688,16 +719,23 @@ struct AIDebugWindow : public Window {
}
}
void ChangeToAI(CompanyID show_ai)
{
this->RaiseWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
ai_debug_company = show_ai;
this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
this->autoscroll = true;
this->last_vscroll_pos = this->vscroll.pos;
this->SetDirty();
}
virtual void OnClick(Point pt, int widget)
{
/* Check which button is clicked */
if (IsInsideMM(widget, AID_WIDGET_COMPANY_BUTTON_START, AID_WIDGET_COMPANY_BUTTON_END + 1)) {
/* Is it no on disable? */
if (!this->IsWidgetDisabled(widget)) {
this->RaiseWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
ai_debug_company = (CompanyID)(widget - AID_WIDGET_COMPANY_BUTTON_START);
this->LowerWidget(ai_debug_company + AID_WIDGET_COMPANY_BUTTON_START);
this->SetDirty();
ChangeToAI((CompanyID)(widget - AID_WIDGET_COMPANY_BUTTON_START));
}
}
if (widget == AID_WIDGET_RELOAD_TOGGLE && !this->IsWidgetDisabled(widget)) {
@@ -721,6 +759,7 @@ struct AIDebugWindow : public Window {
virtual void OnResize(Point new_size, Point delta)
{
this->vscroll.cap += delta.y / (int)this->resize.step_height;
SetVScrollCount(this, this->vscroll.count); // vscroll.pos should be in a valid range
}
};
@@ -763,17 +802,19 @@ static const Widget _ai_debug_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _ai_debug_desc = {
static const WindowDesc _ai_debug_desc(
WDP_AUTO, WDP_AUTO, 299, 241, 299, 241,
WC_AI_DEBUG, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE,
_ai_debug_widgets
};
);
void ShowAIDebugWindow()
void ShowAIDebugWindow(CompanyID show_company)
{
if (!_networking || _network_server) {
AllocateWindowDescFront<AIDebugWindow>(&_ai_debug_desc, 0);
AIDebugWindow *w = (AIDebugWindow *)BringWindowToFrontById(WC_AI_DEBUG, 0);
if (w == NULL) w = new AIDebugWindow(&_ai_debug_desc, 0);
if (show_company != INVALID_COMPANY) w->ChangeToAI(show_company);
} else {
ShowErrorMessage(INVALID_STRING_ID, STR_AI_DEBUG_SERVER_ONLY, 0, 0);
}

View File

@@ -5,7 +5,7 @@
#ifndef AI_GUI_HPP
#define AI_GUI_HPP
void ShowAIDebugWindow();
void ShowAIDebugWindow(CompanyID show_company = INVALID_COMPANY);
void ShowAIConfigWindow();
#endif /* AI_GUI_HPP */

View File

@@ -36,6 +36,7 @@ AIFileInfo::~AIFileInfo()
free((void *)this->description);
free((void *)this->date);
free((void *)this->instance_name);
free((void *)this->url);
free(this->main_script);
free(this->SQ_instance);
}
@@ -98,6 +99,11 @@ bool AIFileInfo::CheckMethod(const char *name) const
if (!info->engine->CallIntegerMethod(*info->SQ_instance, "GetVersion", &info->version)) return SQ_ERROR;
if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "CreateInstance", &info->instance_name)) return SQ_ERROR;
/* The GetURL function is optional. */
if (info->engine->MethodExists(*info->SQ_instance, "GetURL")) {
if (!info->engine->CallStringMethodStrdup(*info->SQ_instance, "GetURL", &info->url)) return SQ_ERROR;
}
return 0;
}
@@ -125,6 +131,12 @@ bool AIFileInfo::CheckMethod(const char *name) const
} else {
info->min_loadable_version = info->GetVersion();
}
/* When there is an UseAsRandomAI function, call it. */
if (info->engine->MethodExists(*info->SQ_instance, "UseAsRandomAI")) {
if (!info->engine->CallBoolMethod(*info->SQ_instance, "UseAsRandomAI", &info->use_as_random)) return SQ_ERROR;
} else {
info->use_as_random = true;
}
/* Remove the link to the real instance, else it might get deleted by RegisterAI() */
sq_setinstanceup(vm, 2, NULL);

View File

@@ -41,7 +41,7 @@ public:
friend class AIInfo;
friend class AILibrary;
AIFileInfo() : SQ_instance(NULL), main_script(NULL), author(NULL), name(NULL), short_name(NULL), description(NULL), date(NULL), instance_name(NULL) {};
AIFileInfo() : SQ_instance(NULL), main_script(NULL), author(NULL), name(NULL), short_name(NULL), description(NULL), date(NULL), instance_name(NULL), url(NULL) {};
~AIFileInfo();
/**
@@ -84,6 +84,11 @@ public:
*/
const char *GetInstanceName() const { return this->instance_name; }
/**
* Get the website for this script.
*/
const char *GetURL() const { return this->url; }
/**
* Get the filename of the main.nut script.
*/
@@ -111,6 +116,7 @@ private:
const char *date;
const char *instance_name;
int version;
const char *url;
};
class AIInfo : public AIFileInfo {
@@ -155,9 +161,15 @@ public:
*/
int GetSettingDefaultValue(const char *name) const;
/**
* Use this AI as a random AI.
*/
bool UseAsRandomAI() const { return this->use_as_random; }
private:
AIConfigItemList config_list;
int min_loadable_version;
bool use_as_random;
};
class AILibrary : public AIFileInfo {

View File

@@ -31,7 +31,7 @@ class DummyAI extends AIController {
function Start() { \n\
AILog.Error(\"No suitable AI found to load.\"); \n\
AILog.Error(\"This AI is a dummy AI and won't do anything.\"); \n\
AILog.Error(\"Please add one or several AIs in your ai/ directory.\"); \n\
AILog.Error(\"You can download several AIs via the 'Online Content' system.\"); \n\
} \n\
} \n\
");

View File

@@ -7,6 +7,7 @@
#include "../settings_type.h"
#include "../vehicle_base.h"
#include "../saveload/saveload.h"
#include "../gui.h"
#include "table/strings.h"
#include <squirrel.h>
@@ -18,8 +19,10 @@
#define DEFINE_SCRIPT_FILES
#include "ai_info.hpp"
#include "ai_config.hpp"
#include "ai_storage.hpp"
#include "ai_instance.hpp"
#include "ai_gui.hpp"
/* Convert all AI related classes to Squirrel data.
* Note: this line a marker in squirrel_export.sh. Do not change! */
@@ -251,6 +254,18 @@ void AIInstance::Died()
delete this->engine;
this->instance = NULL;
this->engine = NULL;
ShowAIDebugWindow(_current_company);
const AIInfo *info = AIConfig::GetConfig(_current_company)->GetInfo();
if (info != NULL) {
ShowErrorMessage(INVALID_STRING_ID, STR_AI_PLEASE_REPORT_CRASH, 0, 0);
if (info->GetURL() != NULL) {
AILog::Info("Please report the error to the following URL:");
AILog::Info(info->GetURL());
}
}
}
void AIInstance::GameLoop()
@@ -388,7 +403,7 @@ enum {
/* static */ bool AIInstance::SaveObject(HSQUIRRELVM vm, SQInteger index, int max_depth, bool test)
{
if (max_depth == 0) {
AILog::Error("Savedata can only be nested to 5 deep. No data saved.");
AILog::Error("Savedata can only be nested to 25 deep. No data saved.");
return false;
}
@@ -499,7 +514,7 @@ enum {
}
default:
AILog::Error("You tried to save unsupported type. No data saved.");
AILog::Error("You tried to save an unsupported type. No data saved.");
return false;
}
}

View File

@@ -20,7 +20,7 @@
#include "ai_scanner.hpp"
#include "api/ai_controller.hpp"
void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_recursive)
void AIScanner::ScanDir(const char *dirname, bool library_scan)
{
extern bool FiosIsValidFile(const char *path, const struct dirent *ent, struct stat *sb);
extern bool FiosIsHiddenFile(const struct dirent *ent);
@@ -48,19 +48,10 @@ void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_rec
ttd_strlcpy(temp_script, dirname, sizeof(temp_script));
ttd_strlcat(temp_script, d_name, sizeof(temp_script));
if (S_ISDIR(sb.st_mode)) {
/* Libraries are always in a subdirectory of their category, so scan those */
if (library_scan && !library_recursive) {
ttd_strlcat(temp_script, PATHSEP, sizeof(temp_script));
ScanDir(temp_script, library_scan, true);
continue;
}
} else if (S_ISREG(sb.st_mode)) {
if (S_ISREG(sb.st_mode)) {
/* Only .tar files are allowed */
char *ext = strrchr(d_name, '.');
if (ext == NULL || strcasecmp(ext, ".tar") != 0) continue;
/* .tar files are only allowed in the root of the library dir */
if (library_recursive) continue;
/* We always expect a directory in the TAR */
const char *first_dir = FioTarFirstDir(temp_script);
@@ -69,7 +60,7 @@ void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_rec
ttd_strlcat(temp_script, PATHSEP, sizeof(temp_script));
ttd_strlcat(temp_script, first_dir, sizeof(temp_script));
FioTarAddLink(temp_script, first_dir);
} else {
} else if (!S_ISDIR(sb.st_mode)) {
/* Skip any other type of file */
continue;
}
@@ -88,7 +79,7 @@ void AIScanner::ScanDir(const char *dirname, bool library_scan, bool library_rec
if (!FioCheckFileExists(info_script, AI_DIR) || !FioCheckFileExists(main_script, AI_DIR)) continue;
DEBUG(ai, 6, "Loading AI at location '%s'", main_script);
/* We don't care if one of the other scripst failed to load. */
/* We don't care if one of the other scripts failed to load. */
this->engine->ResetCrashed();
this->engine->LoadScript(info_script);
} else {
@@ -162,7 +153,7 @@ AIScanner::AIScanner() :
/* Create the dummy AI */
this->engine->ResetCrashed();
strcpy(this->main_script, "%_dummy");
strecpy(this->main_script, "%_dummy", lastof(this->main_script));
extern void AI_CreateAIInfoDummy(HSQUIRRELVM vm);
AI_CreateAIInfoDummy(this->engine->GetVM());
}
@@ -354,20 +345,31 @@ void AIScanner::RegisterAI(AIInfo *info)
AIInfo *AIScanner::SelectRandomAI()
{
if (this->info_single_list.size() == 0) {
uint num_random_ais = 0;
for (AIInfoList::iterator it = this->info_single_list.begin(); it != this->info_single_list.end(); it++) {
if (it->second->UseAsRandomAI()) num_random_ais++;
}
if (num_random_ais == 0) {
DEBUG(ai, 0, "No suitable AI found, loading 'dummy' AI.");
return this->info_dummy;
}
/* Find a random AI */
uint pos;
if (_networking) pos = InteractiveRandomRange((uint16)this->info_single_list.size());
else pos = RandomRange((uint16)this->info_single_list.size());
if (_networking) {
pos = InteractiveRandomRange(num_random_ais);
} else {
pos = RandomRange(num_random_ais);
}
/* Find the Nth item from the array */
AIInfoList::iterator it = this->info_single_list.begin();
for (; pos > 0; pos--) it++;
AIInfoList::iterator first_it = it;
while (!it->second->UseAsRandomAI()) it++;
for (; pos > 0; pos--) {
it++;
while (!it->second->UseAsRandomAI()) it++;
}
return (*it).second;
}
@@ -563,7 +565,7 @@ bool AIScanner::HasAI(const ContentInfo *ci, bool md5sum)
* @param md5sum whether to check the MD5 checksum
* @return true iff we have an AI (library) matching.
*/
/*static */ bool AI::HasAI(const ContentInfo *ci, bool md5sum)
/* static */ bool AI::HasAI(const ContentInfo *ci, bool md5sum)
{
return AI::ai_scanner->HasAI(ci, md5sum);
}

View File

@@ -56,7 +56,7 @@ public:
const AIInfoList *GetUniqueAIInfoList() { return &this->info_single_list; }
/**
* Get the engine of the main squirrel handler (it indexes all avialable squirrels).
* Get the engine of the main squirrel handler (it indexes all available scripts).
*/
class Squirrel *GetEngine() { return this->engine; }
@@ -88,7 +88,7 @@ private:
* For library-scan, if a library is found, AILibrary is created, and the
* library is registered to the central system.
*/
void ScanDir(const char *dirname, bool library_dir, bool library_recursive = false);
void ScanDir(const char *dirname, bool library_dir);
AIInfo *info_dummy;
AIInfoList info_list;

View File

@@ -8,12 +8,21 @@
#include "../../company_func.h"
#include "../../command_type.h"
#include "../../town.h"
#include "../../economy_func.h"
/* static */ bool AIAirport::IsValidAirportType(AirportType type)
{
return type >= AT_SMALL && type <= AT_HELISTATION && HasBit(::GetValidAirports(), type);
}
/* static */ Money AIAirport::GetPrice(AirportType type)
{
if (!IsValidAirportType(type)) return -1;
const AirportFTAClass *afc = ::GetAirport(type);
return _price.build_airport * afc->size_x * afc->size_y;
}
/* static */ bool AIAirport::IsHangarTile(TileIndex tile)
{
if (!::IsValidTile(tile)) return false;

View File

@@ -53,6 +53,13 @@ public:
*/
static bool IsValidAirportType(AirportType type);
/**
* Get the cost to build this AirportType.
* @param type The AirportType to check.
* @return The cost of building this AirportType.
*/
static Money GetPrice(AirportType type);
/**
* Checks whether the given tile is actually a tile with a hangar.
* @param tile The tile to check.

View File

@@ -39,6 +39,7 @@ void SQAIAirport_Register(Squirrel *engine) {
SQAIAirport.DefSQConst(engine, AIAirport::PT_INVALID, "PT_INVALID");
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::IsValidAirportType, "IsValidAirportType", 2, ".i");
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::GetPrice, "GetPrice", 2, ".i");
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::IsHangarTile, "IsHangarTile", 2, ".i");
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::IsAirportTile, "IsAirportTile", 2, ".i");
SQAIAirport.DefSQStaticMethod(engine, &AIAirport::GetAirportWidth, "GetAirportWidth", 2, ".i");

View File

@@ -23,6 +23,12 @@
return ::IsBridgeTile(tile);
}
/* static */ BridgeID AIBridge::GetBridgeID(TileIndex tile)
{
if (!IsBridgeTile(tile)) return (BridgeID)-1;
return (BridgeID)::GetBridgeType(tile);
}
static void _DoCommandReturnBuildBridge2(class AIInstance *instance)
{
if (!AIBridge::_BuildBridgeRoad2()) {
@@ -32,7 +38,7 @@ static void _DoCommandReturnBuildBridge2(class AIInstance *instance)
}
/* This can never happen, as in test-mode this callback is never executed,
* and in execute-mode, the other callback is called. */
* and in execute-mode, the other callback is called. */
NOT_REACHED();
}
@@ -45,7 +51,7 @@ static void _DoCommandReturnBuildBridge1(class AIInstance *instance)
}
/* This can never happen, as in test-mode this callback is never executed,
* and in execute-mode, the other callback is called. */
* and in execute-mode, the other callback is called. */
NOT_REACHED();
}

View File

@@ -51,6 +51,14 @@ public:
*/
static bool IsBridgeTile(TileIndex tile);
/**
* Get the BridgeID of a bridge at a given tile.
* @param tile The tile to get the BridgeID from.
* @pre IsBridgeTile(tile).
* @return The BridgeID from the bridge at tile 'tile'.
*/
static BridgeID GetBridgeID(TileIndex tile);
/**
* Get the name of a bridge.
* @param bridge_id The bridge to get the name of.

View File

@@ -36,6 +36,7 @@ void SQAIBridge_Register(Squirrel *engine) {
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::IsValidBridge, "IsValidBridge", 2, ".i");
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::IsBridgeTile, "IsBridgeTile", 2, ".i");
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetBridgeID, "GetBridgeID", 2, ".i");
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetName, "GetName", 2, ".i");
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetMaxSpeed, "GetMaxSpeed", 2, ".i");
SQAIBridge.DefSQStaticMethod(engine, &AIBridge::GetPrice, "GetPrice", 3, ".ii");

View File

@@ -18,7 +18,7 @@ public:
* The classes of cargo (from newgrf_cargo.h).
*/
enum CargoClass {
CC_PASSENGERS = 1 << 0, //!< Passengers
CC_PASSENGERS = 1 << 0, //!< Passengers. Cargos of this class appear at bus stops. Cargos not of this class appear at truck stops.
CC_MAIL = 1 << 1, //!< Mail
CC_EXPRESS = 1 << 2, //!< Express cargo (Goods, Food, Candy, but also possible for passengers)
CC_ARMOURED = 1 << 3, //!< Armoured cargo (Valuables, Gold, Diamonds)
@@ -52,6 +52,7 @@ public:
/**
* Gets the string representation of the cargo label.
* @param cargo_type The cargo to get the string representation of.
* @pre AICargo::IsValidCargo(cargo_type).
* @return The cargo label.
* @note Never use this to check if it is a certain cargo. NewGRF can
* redefine all of the names.
@@ -60,7 +61,10 @@ public:
/**
* Checks whether the give cargo is a freight or not.
* This defines whether the "freight train weight multiplier" will apply to
* trains transporting this cargo.
* @param cargo_type The cargo to check on.
* @pre AICargo::IsValidCargo(cargo_type).
* @return True if and only if the cargo is freight.
*/
static bool IsFreight(CargoID cargo_type);
@@ -68,6 +72,7 @@ public:
/**
* Check if this cargo is in the requested cargo class.
* @param cargo_type The cargo to check on.
* @pre AICargo::IsValidCargo(cargo_type).
* @param cargo_class The class to check for.
* @return True if and only if the cargo is in the cargo class.
*/
@@ -76,6 +81,7 @@ public:
/**
* Get the effect this cargo has on a town.
* @param cargo_type The cargo to check on.
* @pre AICargo::IsValidCargo(cargo_type).
* @return The effect this cargo has on a town, or TE_NONE if it has no effect.
*/
static TownEffect GetTownEffect(CargoID cargo_type);
@@ -84,6 +90,7 @@ public:
* Get the income for transporting a piece of cargo over the
* given distance within the specified time.
* @param cargo_type The cargo to transport.
* @pre AICargo::IsValidCargo(cargo_type).
* @param distance The distance the cargo travels from begin to end.
* @param days_in_transit Amount of (game) days the cargo is in transit. The max value of this variable is 637. Any value higher returns the same as 637 would.
* @return The amount of money that would be earned by this trip.

View File

@@ -153,7 +153,8 @@ public:
* Return the location of a company's HQ.
* @param company The company the get the HQ of.
* @pre ResolveCompanyID(company) != COMPANY_INVALID.
* @return The tile of the company's HQ, this tile is the most nothern tile of that HQ, or TILE_INVALID if there is no HQ yet.
* @return The tile of the company's HQ, this tile is the most nothern tile
* of that HQ, or AIMap::TILE_INVALID if there is no HQ yet.
*/
static TileIndex GetCompanyHQ(CompanyID company);

View File

@@ -5,6 +5,7 @@
#include "../../stdafx.h"
#include "../../string_func.h"
#include "../../company_base.h"
#include "../../rev.h"
#include "table/strings.h"
#include "../ai.hpp"
@@ -66,6 +67,11 @@ AIController::~AIController()
return AIConfig::GetConfig(_current_company)->GetSetting(name);
}
/* static */ uint AIController::GetVersion()
{
return _openttd_newgrf_version;
}
bool AIController::LoadedLibrary(const char *library_name, int *next_number, char *fake_class_name, int fake_class_name_len)
{
LoadedLibraryList::iterator iter = this->loaded_library.find(library_name);

View File

@@ -50,6 +50,18 @@ public:
*/
static int GetSetting(const char *name);
/**
* Get the OpenTTD version of this executable. The version is formatted
* with the bits having the following meaning:
* 28-31 major version
* 24-27 minor version
* 20-23 build
* 19 1 if it is a release, 0 if it is not.
* 0-18 revision number; 0 when the revision is unknown.
* @return The version in newgrf format.
*/
static uint GetVersion();
/**
* Change the minimum amount of time the AI should be put in suspend mode
* when you execute a command. Normally in SP this is 1, and in MP it is

View File

@@ -5,10 +5,11 @@
void SQAIController_Register(Squirrel *engine) {
DefSQClass <AIController> SQAIController("AIController");
SQAIController.PreRegister(engine);
SQAIController.DefSQStaticMethod(engine, &AIController::GetTick, "GetTick", 1, "?");
SQAIController.DefSQStaticMethod(engine, &AIController::SetCommandDelay, "SetCommandDelay", 2, "?i");
SQAIController.DefSQStaticMethod(engine, &AIController::Sleep, "Sleep", 2, "?i");
SQAIController.DefSQStaticMethod(engine, &AIController::GetSetting, "GetSetting", 2, "?s");
SQAIController.DefSQStaticMethod(engine, &AIController::Print, "Print", 3, "?bs");
SQAIController.DefSQStaticMethod(engine, &AIController::GetTick, "GetTick", 1, ".");
SQAIController.DefSQStaticMethod(engine, &AIController::SetCommandDelay, "SetCommandDelay", 2, ".i");
SQAIController.DefSQStaticMethod(engine, &AIController::Sleep, "Sleep", 2, ".i");
SQAIController.DefSQStaticMethod(engine, &AIController::GetSetting, "GetSetting", 2, ".s");
SQAIController.DefSQStaticMethod(engine, &AIController::GetVersion, "GetVersion", 1, ".");
SQAIController.DefSQStaticMethod(engine, &AIController::Print, "Print", 3, ".bs");
SQAIController.PostRegister(engine);
}

View File

@@ -6,9 +6,10 @@
#include "ai_cargo.hpp"
#include "../../company_func.h"
#include "../../strings_func.h"
#include "../../aircraft.h"
#include "../../vehicle_func.h"
#include "../../settings_type.h"
#include "../../rail.h"
#include "../../engine_base.h"
#include "../../articulated_vehicles.h"
#include "table/strings.h"
@@ -64,10 +65,11 @@
{
if (!IsValidEngine(engine_id)) return -1;
switch (::GetEngine(engine_id)->type) {
const Engine *e = ::GetEngine(engine_id);
switch (e->type) {
case VEH_ROAD:
case VEH_TRAIN: {
uint16 *capacities = GetCapacityOfArticulatedParts(engine_id, ::GetEngine(engine_id)->type);
uint16 *capacities = GetCapacityOfArticulatedParts(engine_id, e->type);
for (CargoID c = 0; c < NUM_CARGO; c++) {
if (capacities[c] == 0) continue;
return capacities[c];
@@ -75,15 +77,10 @@
return -1;
} break;
case VEH_SHIP: {
const ShipVehicleInfo *vi = ::ShipVehInfo(engine_id);
return vi->capacity;
} break;
case VEH_AIRCRAFT: {
const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine_id);
return vi->passenger_capacity;
} break;
case VEH_SHIP:
case VEH_AIRCRAFT:
return e->GetDisplayDefaultCapacity();
break;
default: NOT_REACHED();
}

View File

@@ -91,6 +91,7 @@ public:
/**
* Insert an event to the queue for the company.
* @param event The event to insert.
* @note DO NOT CALL YOURSELF; leave it to the internal AI programming.
*/
static void InsertEvent(AIEvent *event);

View File

@@ -3,9 +3,11 @@
/** @file ai_event_types.cpp Implementation of all EventTypes. */
#include "ai_event_types.hpp"
#include "../../command_type.h"
#include "../../strings_func.h"
#include "../../settings_type.h"
#include "../../aircraft.h"
#include "../../rail.h"
#include "../../engine_base.h"
#include "../../articulated_vehicles.h"
#include "table/strings.h"
@@ -28,10 +30,11 @@ CargoID AIEventEnginePreview::GetCargoType()
int32 AIEventEnginePreview::GetCapacity()
{
switch (::GetEngine(engine)->type) {
const Engine *e = ::GetEngine(engine);
switch (e->type) {
case VEH_ROAD:
case VEH_TRAIN: {
uint16 *capacities = GetCapacityOfArticulatedParts(engine, ::GetEngine(engine)->type);
uint16 *capacities = GetCapacityOfArticulatedParts(engine, e->type);
for (CargoID c = 0; c < NUM_CARGO; c++) {
if (capacities[c] == 0) continue;
return capacities[c];
@@ -39,15 +42,10 @@ int32 AIEventEnginePreview::GetCapacity()
return -1;
} break;
case VEH_SHIP: {
const ShipVehicleInfo *vi = ::ShipVehInfo(engine);
return vi->capacity;
} break;
case VEH_AIRCRAFT: {
const AircraftVehicleInfo *vi = ::AircraftVehInfo(engine);
return vi->passenger_capacity;
} break;
case VEH_SHIP:
case VEH_AIRCRAFT:
return e->GetDisplayDefaultCapacity();
break;
default: NOT_REACHED();
}

View File

@@ -86,7 +86,9 @@ public:
static TileIndex GetLocation(IndustryID industry_id);
/**
* Get the number of stations around an industry.
* Get the number of stations around an industry. All stations that can
* service the industry are counted, your own stations but also your
* opponents stations.
* @param industry_id The index of the industry.
* @pre IsValidIndustry(industry_id).
* @return The number of stations around an industry.

View File

@@ -111,3 +111,24 @@
uint32 seed = ::InteractiveRandom();
return AIObject::DoCommand(0, industry_type, seed, CMD_BUILD_INDUSTRY);
}
/* static */ bool AIIndustryType::IsBuiltOnWater(IndustryType industry_type)
{
if (!IsValidIndustryType(industry_type)) return false;
return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_BUILT_ONWATER) != 0;
}
/* static */ bool AIIndustryType::HasHeliport(IndustryType industry_type)
{
if (!IsValidIndustryType(industry_type)) return false;
return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0;
}
/* static */ bool AIIndustryType::HasDock(IndustryType industry_type)
{
if (!IsValidIndustryType(industry_type)) return false;
return (::GetIndustrySpec(industry_type)->behaviour & INDUSTRYBEH_AI_AIRSHIP_ROUTES) != 0;
}

View File

@@ -113,6 +113,30 @@ public:
* @note If true is returned the money is paid, whether a new industry was build or not.
*/
static bool ProspectIndustry(IndustryType industry_type);
/**
* Is this type of industry built on water.
* @param industry_type The type of the industry.
* @pre IsValidIndustryType(industry_type).
* @return True when this type is built on water.
*/
static bool IsBuiltOnWater(IndustryType industry_type);
/**
* Does this type of industry have a heliport?
* @param industry_type The type of the industry.
* @pre IsValidIndustryType(industry_type).
* @return True when this type has a heliport.
*/
static bool HasHeliport(IndustryType industry_type);
/**
* Does this type of industry have a dock?
* @param industry_type The type of the industry.
* @pre IsValidIndustryType(industry_type).
* @return True when this type has a dock.
*/
static bool HasDock(IndustryType industry_type);
};
#endif /* AI_INDUSTRYTYPE_HPP */

View File

@@ -28,6 +28,9 @@ void SQAIIndustryType_Register(Squirrel *engine) {
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::CanProspectIndustry, "CanProspectIndustry", 2, ".i");
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::BuildIndustry, "BuildIndustry", 3, ".ii");
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::ProspectIndustry, "ProspectIndustry", 2, ".i");
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::IsBuiltOnWater, "IsBuiltOnWater", 2, ".i");
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::HasHeliport, "HasHeliport", 2, ".i");
SQAIIndustryType.DefSQStaticMethod(engine, &AIIndustryType::HasDock, "HasDock", 2, ".i");
SQAIIndustryType.PostRegister(engine);
}

View File

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

View File

@@ -17,6 +17,9 @@ public:
TILE_INVALID = INVALID_TILE, //!< Invalid TileIndex.
};
#endif /* DEFINE_SCRIPT_FILES */
#ifdef DOXYGEN_SKIP
const static TileIndex TILE_INVALID; //!< Invalid TileIndex.
#endif /* DOXYGEN_SKIP */
static const char *GetClassName() { return "AIMap"; }

View File

@@ -23,7 +23,10 @@ static OrderType GetOrderTypeByTile(TileIndex t)
switch (::GetTileType(t)) {
default: break;
case MP_STATION: return OT_GOTO_STATION; break;
case MP_STATION:
if (IsHangar(t)) return OT_GOTO_DEPOT;
return OT_GOTO_STATION;
break;
case MP_WATER: if (::IsShipDepot(t)) return OT_GOTO_DEPOT; break;
case MP_ROAD: if (::GetRoadTileType(t) == ROAD_TILE_DEPOT) return OT_GOTO_DEPOT; break;
case MP_RAILWAY:
@@ -43,6 +46,47 @@ static OrderType GetOrderTypeByTile(TileIndex t)
return AIVehicle::IsValidVehicle(vehicle_id) && order_position >= 0 && (order_position < ::GetVehicle(vehicle_id)->GetNumOrders() || order_position == ORDER_CURRENT);
}
/**
* Get the current order the vehicle is executing. If the current order is in
* the order list, return the order from the orderlist. If the current order
* was a manual order, return the current order.
*/
static const Order *ResolveOrder(VehicleID vehicle_id, AIOrder::OrderPosition order_position)
{
const Vehicle *v = ::GetVehicle(vehicle_id);
if (order_position == AIOrder::ORDER_CURRENT) {
const Order *order = &v->current_order;
if (order->GetType() == OT_GOTO_DEPOT && !(order->GetDepotOrderType() & ODTFB_PART_OF_ORDERS)) return order;
order_position = AIOrder::ResolveOrderPosition(vehicle_id, order_position);
if (order_position == AIOrder::ORDER_INVALID) return NULL;
}
return ::GetVehicleOrder(v, order_position);
}
/* static */ bool AIOrder::IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position)
{
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
const Order *order = ::ResolveOrder(vehicle_id, order_position);
return order != NULL && order->GetType() == OT_GOTO_STATION;
}
/* static */ bool AIOrder::IsGotoDepotOrder(VehicleID vehicle_id, OrderPosition order_position)
{
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
const Order *order = ::ResolveOrder(vehicle_id, order_position);
return order != NULL && order->GetType() == OT_GOTO_DEPOT;
}
/* static */ bool AIOrder::IsGotoWaypointOrder(VehicleID vehicle_id, OrderPosition order_position)
{
if (!IsValidVehicleOrder(vehicle_id, order_position)) return false;
const Order *order = ::ResolveOrder(vehicle_id, order_position);
return order != NULL && order->GetType() == OT_GOTO_WAYPOINT;
}
/* static */ bool AIOrder::IsConditionalOrder(VehicleID vehicle_id, OrderPosition order_position)
{
if (order_position == ORDER_CURRENT) return false;
@@ -52,6 +96,16 @@ static OrderType GetOrderTypeByTile(TileIndex t)
return order->GetType() == OT_CONDITIONAL;
}
/* static */ bool AIOrder::IsCurrentOrderPartOfOrderList(VehicleID vehicle_id)
{
if (AIVehicle::IsValidVehicle(vehicle_id)) return false;
if (GetOrderCount(vehicle_id) == 0) return false;
const Order *order = &::GetVehicle(vehicle_id)->current_order;
if (order->GetType() != OT_GOTO_DEPOT) return true;
return (order->GetDepotOrderType() & ODTFB_PART_OF_ORDERS) != 0;
}
/* static */ AIOrder::OrderPosition AIOrder::ResolveOrderPosition(VehicleID vehicle_id, OrderPosition order_position)
{
if (!AIVehicle::IsValidVehicle(vehicle_id)) return ORDER_INVALID;
@@ -74,7 +128,10 @@ static OrderType GetOrderTypeByTile(TileIndex t)
(((order_flags & AIOF_NO_UNLOAD) == 0) || ((order_flags & AIOF_NO_LOAD) == 0)) &&
(((order_flags & AIOF_FULL_LOAD_ANY) == 0) || ((order_flags & AIOF_NO_LOAD) == 0));
case OT_GOTO_DEPOT: return (order_flags & ~(AIOF_NON_STOP_FLAGS | AIOF_SERVICE_IF_NEEDED)) == 0;
case OT_GOTO_DEPOT:
return ((order_flags & ~(AIOF_NON_STOP_FLAGS | AIOF_DEPOT_FLAGS)) == 0) &&
(((order_flags & AIOF_SERVICE_IF_NEEDED) == 0) || ((order_flags & AIOF_STOP_IN_DEPOT) == 0));
case OT_GOTO_WAYPOINT: return (order_flags & ~(AIOF_NON_STOP_FLAGS)) == 0;
default: return false;
}
@@ -108,21 +165,41 @@ static OrderType GetOrderTypeByTile(TileIndex t)
{
if (!IsValidVehicleOrder(vehicle_id, order_position)) return INVALID_TILE;
const Order *order;
const Order *order = ::ResolveOrder(vehicle_id, order_position);
if (order == NULL || order->GetType() == OT_CONDITIONAL) return INVALID_TILE;
const Vehicle *v = ::GetVehicle(vehicle_id);
if (order_position == ORDER_CURRENT) {
order = &v->current_order;
} else {
order = ::GetVehicleOrder(GetVehicle(vehicle_id), order_position);
if (order->GetType() == OT_CONDITIONAL) return INVALID_TILE;
}
switch (order->GetType()) {
case OT_GOTO_DEPOT:
case OT_GOTO_DEPOT: {
if (v->type != VEH_AIRCRAFT) return ::GetDepot(order->GetDestination())->xy;
/* FALL THROUGH: aircraft's hangars are referenced by StationID, not DepotID */
/* Aircraft's hangars are referenced by StationID, not DepotID */
const Station *st = ::GetStation(order->GetDestination());
const AirportFTAClass *airport = st->Airport();
if (airport == NULL || airport->nof_depots == 0) return INVALID_TILE;
return st->airport_tile + ::ToTileIndexDiff(st->Airport()->airport_depots[0]);
}
case OT_GOTO_STATION: return ::GetStation(order->GetDestination())->xy;
case OT_GOTO_STATION: {
const Station *st = ::GetStation(order->GetDestination());
if (st->train_tile != INVALID_TILE) {
for (uint i = 0; i < st->trainst_w; i++) {
TileIndex t = st->train_tile + TileDiffXY(i, 0);
if (st->TileBelongsToRailStation(t)) return t;
}
} else if (st->dock_tile != INVALID_TILE) {
return st->dock_tile;
} else if (st->bus_stops != NULL) {
return st->bus_stops->xy;
} else if (st->truck_stops != NULL) {
return st->truck_stops->xy;
} else if (st->airport_tile != INVALID_TILE) {
const AirportFTAClass *fta = st->Airport();
BEGIN_TILE_LOOP(tile, fta->size_x, fta->size_y, st->airport_tile) {
if (!::IsHangar(tile)) return tile;
} END_TILE_LOOP(tile, fta->size_x, fta->size_y, st->airport_tile)
}
return INVALID_TILE;
}
case OT_GOTO_WAYPOINT: return ::GetWaypoint(order->GetDestination())->xy;
default: return INVALID_TILE;
}
@@ -132,19 +209,15 @@ static OrderType GetOrderTypeByTile(TileIndex t)
{
if (!IsValidVehicleOrder(vehicle_id, order_position)) return AIOF_INVALID;
const Order *order;
if (order_position == ORDER_CURRENT) {
order = &::GetVehicle(vehicle_id)->current_order;
} else {
order = ::GetVehicleOrder(GetVehicle(vehicle_id), order_position);
if (order->GetType() == OT_CONDITIONAL) return AIOF_INVALID;
}
const Order *order = ::ResolveOrder(vehicle_id, order_position);
if (order == NULL || order->GetType() == OT_CONDITIONAL) return AIOF_INVALID;
AIOrderFlags order_flags = AIOF_NONE;
order_flags |= (AIOrderFlags)order->GetNonStopType();
switch (order->GetType()) {
case OT_GOTO_DEPOT:
if (order->GetDepotOrderType() & ODTFB_SERVICE) order_flags |= AIOF_SERVICE_IF_NEEDED;
if (order->GetDepotActionType() & ODATFB_HALT) order_flags |= AIOF_STOP_IN_DEPOT;
break;
case OT_GOTO_STATION:
@@ -260,9 +333,21 @@ static OrderType GetOrderTypeByTile(TileIndex t)
Order order;
switch (::GetOrderTypeByTile(destination)) {
case OT_GOTO_DEPOT:
order.MakeGoToDepot(::GetDepotByTile(destination)->index, (OrderDepotTypeFlags)(ODTFB_PART_OF_ORDERS | ((order_flags & AIOF_SERVICE_IF_NEEDED) ? ODTFB_SERVICE : 0)));
case OT_GOTO_DEPOT: {
OrderDepotTypeFlags odtf = (OrderDepotTypeFlags)(ODTFB_PART_OF_ORDERS | ((order_flags & AIOF_SERVICE_IF_NEEDED) ? ODTFB_SERVICE : 0));
OrderDepotActionFlags odaf = (OrderDepotActionFlags)(ODATF_SERVICE_ONLY | ((order_flags & AIOF_STOP_IN_DEPOT) ? ODATFB_HALT : 0));
OrderNonStopFlags onsf = (OrderNonStopFlags)((order_flags & AIOF_NON_STOP_INTERMEDIATE) ? ONSF_NO_STOP_AT_INTERMEDIATE_STATIONS : ONSF_STOP_EVERYWHERE);
/* Check explicitly if the order is to a station (for aircraft) or
* to a depot (other vehicle types). */
if (::GetVehicle(vehicle_id)->type == VEH_AIRCRAFT) {
if (!::IsTileType(destination, MP_STATION)) return false;
order.MakeGoToDepot(::GetStationIndex(destination), odtf, onsf, odaf);
} else {
if (::IsTileType(destination, MP_STATION)) return false;
order.MakeGoToDepot(::GetDepotByTile(destination)->index, odtf, onsf, odaf);
}
break;
}
case OT_GOTO_STATION:
order.MakeGoToStation(::GetStationIndex(destination));
@@ -306,6 +391,13 @@ static OrderType GetOrderTypeByTile(TileIndex t)
return AIObject::DoCommand(0, vehicle_id, order_position, CMD_DELETE_ORDER);
}
/* static */ bool AIOrder::SkipToOrder(VehicleID vehicle_id, OrderPosition next_order)
{
EnforcePrecondition(false, IsValidVehicleOrder(vehicle_id, next_order));
return AIObject::DoCommand(0, vehicle_id, next_order, CMD_SKIP_TO_ORDER);
}
/**
* Callback handler as SetOrderFlags possibly needs multiple DoCommand calls
* to be able to set all order flags correctly. As we need to wait till the
@@ -349,8 +441,11 @@ static void _DoCommandReturnSetOrderFlags(class AIInstance *instance)
switch (order->GetType()) {
case OT_GOTO_DEPOT:
if ((current & AIOF_SERVICE_IF_NEEDED) != (order_flags & AIOF_SERVICE_IF_NEEDED)) {
return AIObject::DoCommand(0, vehicle_id | (order_position << 16), MOF_DEPOT_ACTION, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags);
if ((current & AIOF_DEPOT_FLAGS) != (order_flags & AIOF_DEPOT_FLAGS)) {
uint data = DA_ALWAYS_GO;
if (order_flags & AIOF_SERVICE_IF_NEEDED) data = DA_SERVICE;
if (order_flags & AIOF_STOP_IN_DEPOT) data = DA_STOP;
return AIObject::DoCommand(0, vehicle_id | (order_position << 16), (data << 4) | MOF_DEPOT_ACTION, CMD_MODIFY_ORDER, NULL, &_DoCommandReturnSetOrderFlags);
}
break;

View File

@@ -57,6 +57,8 @@ public:
/** Service the vehicle when needed, otherwise skip this order; only for depots. */
AIOF_SERVICE_IF_NEEDED = 1 << 2,
/** Stop in the depot instead of only go there for servicing; only for depots. */
AIOF_STOP_IN_DEPOT = 1 << 3,
/** All flags related to non-stop settings. */
AIOF_NON_STOP_FLAGS = AIOF_NON_STOP_INTERMEDIATE | AIOF_NON_STOP_DESTINATION,
@@ -64,6 +66,8 @@ public:
AIOF_UNLOAD_FLAGS = AIOF_TRANSFER | AIOF_UNLOAD | AIOF_NO_UNLOAD,
/** All flags related to loading. */
AIOF_LOAD_FLAGS = AIOF_FULL_LOAD | AIOF_FULL_LOAD_ANY | AIOF_NO_LOAD,
/** All flags related to depots. */
AIOF_DEPOT_FLAGS = AIOF_SERVICE_IF_NEEDED | AIOF_STOP_IN_DEPOT,
/** For marking invalid order flags */
AIOF_INVALID = 0xFFFF,
@@ -114,6 +118,33 @@ public:
*/
static bool IsValidVehicleOrder(VehicleID vehicle_id, OrderPosition order_position);
/**
* Checks whether the given order is a goto-station order.
* @param vehicle_id The vehicle to check.
* @param order_position The order index to check.
* @pre IsValidVehicleOrder(vehicle_id, order_position).
* @return True if and only if the order is a goto-station order.
*/
static bool IsGotoStationOrder(VehicleID vehicle_id, OrderPosition order_position);
/**
* Checks whether the given order is a goto-depot order.
* @param vehicle_id The vehicle to check.
* @param order_position The order index to check.
* @pre IsValidVehicleOrder(vehicle_id, order_position).
* @return True if and only if the order is a goto-depot order.
*/
static bool IsGotoDepotOrder(VehicleID vehicle_id, OrderPosition order_position);
/**
* Checks whether the given order is a goto-waypoint order.
* @param vehicle_id The vehicle to check.
* @param order_position The order index to check.
* @pre IsValidVehicleOrder(vehicle_id, order_position).
* @return True if and only if the order is a goto-waypoint order.
*/
static bool IsGotoWaypointOrder(VehicleID vehicle_id, OrderPosition order_position);
/**
* Checks whether the given order is a conditional order.
* @param vehicle_id The vehicle to check.
@@ -123,6 +154,17 @@ public:
*/
static bool IsConditionalOrder(VehicleID vehicle_id, OrderPosition order_position);
/**
* Checks whether the current order is part of the orderlist.
* @param vehicle_id The vehicle to check.
* @pre AIVehicle::IsValidVehicle(vehicle_id).
* @return True if and only if the current order is part of the order list.
* @note If the order is a non-'non-stop' order, and the vehicle is currently
* (un)loading at a station that is not the final destination, this function
* will still return true.
*/
static bool IsCurrentOrderPartOfOrderList(VehicleID vehicle_id);
/**
* Resolves the given order index to the correct index for the given vehicle.
* If the order index was ORDER_CURRENT it will be resolved to the index of
@@ -331,7 +373,7 @@ public:
* Removes an order from the vehicle's order list.
* @param vehicle_id The vehicle to remove the order from.
* @param order_position The order to remove from the order list.
* @pre AIVehicle::IsValidVehicleOrder(vehicle_id, order_position).
* @pre IsValidVehicleOrder(vehicle_id, order_position).
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
* @return True if and only if the order was removed.
*/
@@ -377,6 +419,16 @@ public:
*/
static bool MoveOrder(VehicleID vehicle_id, OrderPosition order_position_move, OrderPosition order_position_target);
/**
* Make a vehicle execute next_order instead of its current order.
* @param vehicle_id The vehicle that should skip some orders.
* @param next_order The order the vehicle should skip to.
* @pre IsValidVehicleOrder(vehicle_id, next_order).
* @exception AIError::ERR_OWNED_BY_ANOTHER_COMPANY
* @return True if and only the current order was changed.
*/
static bool SkipToOrder(VehicleID vehicle_id, OrderPosition next_order);
/**
* Copies the orders from another vehicle. The orders of the main vehicle
* are going to be the orders of the changed vehicle.

View File

@@ -42,9 +42,11 @@ void SQAIOrder_Register(Squirrel *engine) {
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_FULL_LOAD_ANY, "AIOF_FULL_LOAD_ANY");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_NO_LOAD, "AIOF_NO_LOAD");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_SERVICE_IF_NEEDED, "AIOF_SERVICE_IF_NEEDED");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_STOP_IN_DEPOT, "AIOF_STOP_IN_DEPOT");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_NON_STOP_FLAGS, "AIOF_NON_STOP_FLAGS");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_UNLOAD_FLAGS, "AIOF_UNLOAD_FLAGS");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_LOAD_FLAGS, "AIOF_LOAD_FLAGS");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_DEPOT_FLAGS, "AIOF_DEPOT_FLAGS");
SQAIOrder.DefSQConst(engine, AIOrder::AIOF_INVALID, "AIOF_INVALID");
SQAIOrder.DefSQConst(engine, AIOrder::OC_LOAD_PERCENTAGE, "OC_LOAD_PERCENTAGE");
SQAIOrder.DefSQConst(engine, AIOrder::OC_RELIABILITY, "OC_RELIABILITY");
@@ -71,33 +73,38 @@ void SQAIOrder_Register(Squirrel *engine) {
AIError::RegisterErrorMapString(AIOrder::ERR_ORDER_TOO_MANY, "ERR_ORDER_TOO_MANY");
AIError::RegisterErrorMapString(AIOrder::ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION, "ERR_ORDER_TOO_FAR_AWAY_FROM_PREVIOUS_DESTINATION");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidVehicleOrder, "IsValidVehicleOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsConditionalOrder, "IsConditionalOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ResolveOrderPosition, "ResolveOrderPosition", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AreOrderFlagsValid, "AreOrderFlagsValid", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidConditionalOrder, "IsValidConditionalOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCount, "GetOrderCount", 2, ".i");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderDestination, "GetOrderDestination", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderFlags, "GetOrderFlags", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderJumpTo, "GetOrderJumpTo", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCondition, "GetOrderCondition", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareFunction, "GetOrderCompareFunction", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareValue, "GetOrderCompareValue", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderJumpTo, "SetOrderJumpTo", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCondition, "SetOrderCondition", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareFunction, "SetOrderCompareFunction", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareValue, "SetOrderCompareValue", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendOrder, "AppendOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendConditionalOrder, "AppendConditionalOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertOrder, "InsertOrder", 5, ".iiii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertConditionalOrder, "InsertConditionalOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::RemoveOrder, "RemoveOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderFlags, "SetOrderFlags", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ChangeOrder, "ChangeOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::MoveOrder, "MoveOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::CopyOrders, "CopyOrders", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ShareOrders, "ShareOrders", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::UnshareOrders, "UnshareOrders", 2, ".i");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidVehicleOrder, "IsValidVehicleOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsGotoStationOrder, "IsGotoStationOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsGotoDepotOrder, "IsGotoDepotOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsGotoWaypointOrder, "IsGotoWaypointOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsConditionalOrder, "IsConditionalOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsCurrentOrderPartOfOrderList, "IsCurrentOrderPartOfOrderList", 2, ".i");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ResolveOrderPosition, "ResolveOrderPosition", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AreOrderFlagsValid, "AreOrderFlagsValid", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::IsValidConditionalOrder, "IsValidConditionalOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCount, "GetOrderCount", 2, ".i");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderDestination, "GetOrderDestination", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderFlags, "GetOrderFlags", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderJumpTo, "GetOrderJumpTo", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCondition, "GetOrderCondition", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareFunction, "GetOrderCompareFunction", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::GetOrderCompareValue, "GetOrderCompareValue", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderJumpTo, "SetOrderJumpTo", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCondition, "SetOrderCondition", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareFunction, "SetOrderCompareFunction", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderCompareValue, "SetOrderCompareValue", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendOrder, "AppendOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::AppendConditionalOrder, "AppendConditionalOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertOrder, "InsertOrder", 5, ".iiii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::InsertConditionalOrder, "InsertConditionalOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::RemoveOrder, "RemoveOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SetOrderFlags, "SetOrderFlags", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ChangeOrder, "ChangeOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::MoveOrder, "MoveOrder", 4, ".iii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::SkipToOrder, "SkipToOrder", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::CopyOrders, "CopyOrders", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::ShareOrders, "ShareOrders", 3, ".ii");
SQAIOrder.DefSQStaticMethod(engine, &AIOrder::UnshareOrders, "UnshareOrders", 2, ".i");
SQAIOrder.PostRegister(engine);
}

View File

@@ -316,7 +316,7 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to)
EnforcePrecondition(false, ::IsValidTile(tile));
EnforcePrecondition(false, ::IsValidTile(to));
EnforcePrecondition(false, ::DistanceManhattan(from, tile) == 1);
EnforcePrecondition(false, ::DistanceManhattan(tile,to) >= 1);
EnforcePrecondition(false, ::DistanceManhattan(tile, to) >= 1);
EnforcePrecondition(false, IsRailTypeAvailable(GetCurrentRailType()));
int diag_offset = abs(abs((int)::TileX(to) - (int)::TileX(tile)) - abs((int)::TileY(to) - (int)::TileY(tile)));
EnforcePrecondition(false, diag_offset <= 1 ||
@@ -333,7 +333,7 @@ static uint32 SimulateDrag(TileIndex from, TileIndex tile, TileIndex *to)
EnforcePrecondition(false, ::IsValidTile(tile));
EnforcePrecondition(false, ::IsValidTile(to));
EnforcePrecondition(false, ::DistanceManhattan(from, tile) == 1);
EnforcePrecondition(false, ::DistanceManhattan(tile,to) >= 1);
EnforcePrecondition(false, ::DistanceManhattan(tile, to) >= 1);
int diag_offset = abs(abs((int)::TileX(to) - (int)::TileX(tile)) - abs((int)::TileY(to) - (int)::TileY(tile)));
EnforcePrecondition(false, diag_offset <= 1 ||
(::TileX(from) == ::TileX(tile) && ::TileX(tile) == ::TileX(to)) ||

View File

@@ -5,12 +5,18 @@
#include "ai_road.hpp"
#include "ai_map.hpp"
#include "ai_station.hpp"
#include "ai_cargo.hpp"
#include "../../station_map.h"
#include "../../command_type.h"
#include "../../settings_type.h"
#include "../../company_func.h"
#include "../../script/squirrel_helper_type.hpp"
/* static */ AIRoad::RoadVehicleType AIRoad::GetRoadVehicleTypeForCargo(CargoID cargo_type)
{
return AICargo::HasCargoClass(cargo_type, AICargo::CC_PASSENGERS) ? ROADVEHTYPE_BUS : ROADVEHTYPE_TRUCK;
}
/* static */ bool AIRoad::IsRoadTile(TileIndex tile)
{
if (!::IsValidTile(tile)) return false;
@@ -395,7 +401,7 @@ static bool NormaliseTileOffset(int32 *tile)
static bool NeighbourHasReachableRoad(::RoadTypes rts, TileIndex start_tile, DiagDirection neighbour)
{
TileIndex neighbour_tile = ::TileAddByDiagDir(start_tile, neighbour);
if ((rts & ::GetRoadTypes(neighbour_tile)) == 0) return false;
if ((rts & ::GetRoadTypes(neighbour_tile)) == 0) return false;
switch (::GetTileType(neighbour_tile)) {
case MP_ROAD:

View File

@@ -56,6 +56,14 @@ public:
ROADVEHTYPE_TRUCK, //!< Build objects useable for trucks and cargo trams
};
/**
* Determines whether a busstop or a truckstop is needed to transport a certain cargo.
* @param cargo_type The cargo to test.
* @pre AICargo::IsValidCargo(cargo_type).
* @return The road vehicle type needed to transport the cargo.
*/
static RoadVehicleType GetRoadVehicleTypeForCargo(CargoID cargo_type);
/**
* Checks whether the given tile is actually a tile with road that can be
* used to traverse a tile. This excludes road depots and 'normal' road

View File

@@ -46,6 +46,7 @@ void SQAIRoad_Register(Squirrel *engine) {
AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD, "ERR_ROAD_CANNOT_BUILD_ON_TOWN_ROAD");
AIError::RegisterErrorMapString(AIRoad::ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS, "ERR_ROAD_ONE_WAY_ROADS_CANNOT_HAVE_JUNCTIONS");
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::GetRoadVehicleTypeForCargo, "GetRoadVehicleTypeForCargo", 2, ".i");
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::IsRoadTile, "IsRoadTile", 2, ".i");
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::IsRoadDepotTile, "IsRoadDepotTile", 2, ".i");
SQAIRoad.DefSQStaticMethod(engine, &AIRoad::IsRoadStationTile, "IsRoadStationTile", 2, ".i");

View File

@@ -8,7 +8,7 @@
bool AITestMode::ModeProc(TileIndex tile, uint32 p1, uint32 p2, uint procc, CommandCost costs)
{
/* In test mode we only return 'false', telling the DoCommand it
* should stop after testing the command and return with that result. */
* should stop after testing the command and return with that result. */
return false;
}

View File

@@ -11,6 +11,7 @@
#include "../../water_map.h"
#include "../../clear_map.h"
#include "../../town.h"
#include "../../landscape.h"
/* static */ bool AITile::IsBuildable(TileIndex tile)
{
@@ -72,14 +73,14 @@
/* static */ bool AITile::IsSteepSlope(Slope slope)
{
if (slope == SLOPE_INVALID) return false;
if ((slope & ~(SLOPE_ELEVATED | SLOPE_STEEP | SLOPE_HALFTILE_MASK)) != 0) return false;
return ::IsSteepSlope((::Slope)slope);
}
/* static */ bool AITile::IsHalftileSlope(Slope slope)
{
if (slope == SLOPE_INVALID) return false;
if ((slope & ~(SLOPE_ELEVATED | SLOPE_STEEP | SLOPE_HALFTILE_MASK)) != 0) return false;
return ::IsHalftileSlope((::Slope)slope);
}
@@ -123,20 +124,41 @@
/* static */ AITile::Slope AITile::GetComplementSlope(Slope slope)
{
if (slope == SLOPE_INVALID) return SLOPE_INVALID;
if (IsSteepSlope(slope)) return SLOPE_INVALID;
if (IsHalftileSlope(slope)) return SLOPE_INVALID;
if ((slope & ~SLOPE_ELEVATED) != 0) return SLOPE_INVALID;
return (Slope)::ComplementSlope((::Slope)slope);
}
/* static */ int32 AITile::GetHeight(TileIndex tile)
{
if (!::IsValidTile(tile)) return false;
if (!::IsValidTile(tile)) return -1;
return ::TileHeight(tile);
}
/* static */ int32 AITile::GetMinHeight(TileIndex tile)
{
if (!::IsValidTile(tile)) return -1;
return ::GetTileZ(tile) / ::TILE_HEIGHT;
}
/* static */ int32 AITile::GetMaxHeight(TileIndex tile)
{
if (!::IsValidTile(tile)) return -1;
return ::GetTileMaxZ(tile) / ::TILE_HEIGHT;
}
/* static */ int32 AITile::GetCornerHeight(TileIndex tile, Corner corner)
{
if (!::IsValidTile(tile) || !::IsValidCorner((::Corner)corner)) return -1;
uint z;
::Slope slope = ::GetTileSlope(tile, &z);
return (z + ::GetSlopeZInCorner(slope, (::Corner)corner)) / ::TILE_HEIGHT;
}
/* static */ AICompany::CompanyID AITile::GetOwner(TileIndex tile)
{
if (!::IsValidTile(tile)) return AICompany::COMPANY_INVALID;

View File

@@ -29,10 +29,28 @@ public:
/** Tile can't be lowered any lower */
ERR_TILE_TOO_LOW, // [STR_1003_ALREADY_AT_SEA_LEVEL]
/** The area was already flat */
ERR_AREA_ALREADY_FLAT, // [STR_ALREADY_LEVELLED]
/** There is a tunnel underneed */
ERR_EXCAVATION_WOULD_DAMAGE, // [STR_1002_EXCAVATION_WOULD_DAMAGE]
};
/**
* Enumeration for the slope-type (from slopes.h).
* Enumeration for corners of tiles.
*/
enum Corner {
CORNER_W = 0, //!< West corner
CORNER_S = 1, //!< South corner
CORNER_E = 2, //!< East corner
CORNER_N = 3, //!< North corner
CORNER_INVALID = 0xFF,
};
/**
* Enumeration for the slope-type.
*
* This enumeration use the chars N, E, S, W corresponding the
* direction North, East, South and West. The top corner of a tile
@@ -41,18 +59,18 @@ public:
enum Slope {
/* Values are important, as they represent the internal state of the game. */
SLOPE_FLAT = 0x00, //!< A flat tile
SLOPE_W = 0x01, //!< The west corner of the tile is raised
SLOPE_S = 0x02, //!< The south corner of the tile is raised
SLOPE_E = 0x04, //!< The east corner of the tile is raised
SLOPE_N = 0x08, //!< The north corner of the tile is raised
SLOPE_STEEP = 0x10, //!< Indicates the slope is steep
SLOPE_W = 1 << CORNER_W, //!< The west corner of the tile is raised
SLOPE_S = 1 << CORNER_S, //!< The south corner of the tile is raised
SLOPE_E = 1 << CORNER_E, //!< The east corner of the tile is raised
SLOPE_N = 1 << CORNER_N, //!< The north corner of the tile is raised
SLOPE_STEEP = 0x10, //!< Indicates the slope is steep (The corner opposite of the not-raised corner is raised two times)
SLOPE_NW = SLOPE_N | SLOPE_W, //!< North and west corner are raised
SLOPE_SW = SLOPE_S | SLOPE_W, //!< South and west corner are raised
SLOPE_SE = SLOPE_S | SLOPE_E, //!< South and east corner are raised
SLOPE_NE = SLOPE_N | SLOPE_E, //!< North and east corner are raised
SLOPE_EW = SLOPE_E | SLOPE_W, //!< East and west corner are raised
SLOPE_NS = SLOPE_N | SLOPE_S, //!< North and south corner are raised
SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, //!< All corner are raised, similar to SLOPE_FLAT
SLOPE_ELEVATED = SLOPE_N | SLOPE_E | SLOPE_S | SLOPE_W, //!< Bit mask containing all 'simple' slopes. Does not appear as a slope.
SLOPE_NWS = SLOPE_N | SLOPE_W | SLOPE_S, //!< North, west and south corner are raised
SLOPE_WSE = SLOPE_W | SLOPE_S | SLOPE_E, //!< West, south and east corner are raised
SLOPE_SEN = SLOPE_S | SLOPE_E | SLOPE_N, //!< South, east and north corner are raised
@@ -62,7 +80,7 @@ public:
SLOPE_STEEP_E = SLOPE_STEEP | SLOPE_SEN, //!< A steep slope falling to west (from east)
SLOPE_STEEP_N = SLOPE_STEEP | SLOPE_ENW, //!< A steep slope falling to south (from north)
SLOPE_INVALID = 0xFF, //!< An invalid slope
SLOPE_INVALID = 0xFFFF, //!< An invalid slope
};
/**
@@ -129,6 +147,7 @@ public:
/**
* Check if a tile has a steep slope.
* Steep slopes are slopes with a height difference of 2 across one diagonal of the tile.
* @param slope The slope to check on.
* @pre slope != SLOPE_INVALID.
* @return True if the slope is a steep slope.
@@ -137,9 +156,11 @@ public:
/**
* Check if a tile has a halftile slope.
* Halftile slopes appear on top of halftile foundations. E.g. the slope you get when building a horizontal railtrack on the top of a SLOPE_N or SLOPE_STEEP_N.
* @param slope The slope to check on.
* @pre slope != SLOPE_INVALID.
* @return True if the slope is a halftile slope.
* @note Currently there is no API function that would return or accept a halftile slope.
*/
static bool IsHalftileSlope(Slope slope);
@@ -193,9 +214,10 @@ public:
/**
* Get the slope of a tile.
* This is the slope of the bare tile. A possible foundation on the tile does not influence this slope.
* @param tile The tile to check on.
* @pre AIMap::IsValidTile(tile).
* @return 0 means flat, others indicate internal state of slope.
* @return Bit mask encoding the slope. See #Slope for a description of the returned values.
*/
static Slope GetSlope(TileIndex tile);
@@ -211,13 +233,43 @@ public:
static Slope GetComplementSlope(Slope slope);
/**
* Get the height of the tile.
* Get the height of the north corner of a tile.
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
* @deprecated This function is deprecated and might be removed in future versions of the API. Use GetMinHeight(), GetMaxHeight() or GetCornerHeight() instead.
* @param tile The tile to check on.
* @pre AIMap::IsValidTile(tile).
* @return The height of the tile, ranging from 0 to 15.
* @return The height of the north corner of the tile, ranging from 0 to 15.
*/
static int32 GetHeight(TileIndex tile);
/**
* Get the minimal height on a tile.
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
* @param tile The tile to check on.
* @pre AIMap::IsValidTile(tile).
* @return The height of the lowest corner of the tile, ranging from 0 to 15.
*/
static int32 GetMinHeight(TileIndex tile);
/**
* Get the maximal height on a tile.
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
* @param tile The tile to check on.
* @pre AIMap::IsValidTile(tile).
* @return The height of the highest corner of the tile, ranging from 0 to 15.
*/
static int32 GetMaxHeight(TileIndex tile);
/**
* Get the height of a certain corner of a tile.
* The returned height is the height of the bare tile. A possible foundation on the tile does not influence this height.
* @param tile The tile to check on.
* @param corner The corner to query.
* @pre AIMap::IsValidTile(tile).
* @return The height of the lowest corner of the tile, ranging from 0 to 15.
*/
static int32 GetCornerHeight(TileIndex tile, Corner corner);
/**
* Get the owner of the tile.
* @param tile The tile to get the owner from.
@@ -288,7 +340,10 @@ public:
/**
* Raise the given corners of the tile. The corners can be combined,
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW)
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW) will raise the west and the north corner.
* @note The corners will be modified in the order west (first), south, east, north (last).
* Changing one corner might cause another corner to be changed too. So modifiing
* multiple corners may result in changing some corners by multiple steps.
* @param tile The tile to raise.
* @param slope Corners to raise (SLOPE_xxx).
* @pre tile < AIMap::GetMapSize().
@@ -301,7 +356,10 @@ public:
/**
* Lower the given corners of the tile. The corners can be combined,
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW)
* for example: SLOPE_N | SLOPE_W (= SLOPE_NW) will lower the west and the north corner.
* @note The corners will be modified in the order west (first), south, east, north (last).
* Changing one corner might cause another corner to be changed too. So modifiing
* multiple corners may result in changing some corners by multiple steps.
* @param tile The tile to lower.
* @param slope Corners to lower (SLOPE_xxx).
* @pre tile < AIMap::GetMapSize().

View File

@@ -7,6 +7,8 @@ namespace SQConvert {
/* Allow enums to be used as Squirrel parameters */
template <> AITile::ErrorMessages GetParam(ForceType<AITile::ErrorMessages>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::ErrorMessages)tmp; }
template <> int Return<AITile::ErrorMessages>(HSQUIRRELVM vm, AITile::ErrorMessages res) { sq_pushinteger(vm, (int32)res); return 1; }
template <> AITile::Corner GetParam(ForceType<AITile::Corner>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::Corner)tmp; }
template <> int Return<AITile::Corner>(HSQUIRRELVM vm, AITile::Corner res) { sq_pushinteger(vm, (int32)res); return 1; }
template <> AITile::Slope GetParam(ForceType<AITile::Slope>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::Slope)tmp; }
template <> int Return<AITile::Slope>(HSQUIRRELVM vm, AITile::Slope res) { sq_pushinteger(vm, (int32)res); return 1; }
template <> AITile::TransportType GetParam(ForceType<AITile::TransportType>, HSQUIRRELVM vm, int index, SQAutoFreePointers *ptr) { SQInteger tmp; sq_getinteger(vm, index, &tmp); return (AITile::TransportType)tmp; }
@@ -25,42 +27,53 @@ void SQAITile_Register(Squirrel *engine) {
SQAITile.PreRegister(engine);
SQAITile.AddConstructor<void (AITile::*)(), 1>(engine, "x");
SQAITile.DefSQConst(engine, AITile::ERR_TILE_BASE, "ERR_TILE_BASE");
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
SQAITile.DefSQConst(engine, AITile::SLOPE_FLAT, "SLOPE_FLAT");
SQAITile.DefSQConst(engine, AITile::SLOPE_W, "SLOPE_W");
SQAITile.DefSQConst(engine, AITile::SLOPE_S, "SLOPE_S");
SQAITile.DefSQConst(engine, AITile::SLOPE_E, "SLOPE_E");
SQAITile.DefSQConst(engine, AITile::SLOPE_N, "SLOPE_N");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP, "SLOPE_STEEP");
SQAITile.DefSQConst(engine, AITile::SLOPE_NW, "SLOPE_NW");
SQAITile.DefSQConst(engine, AITile::SLOPE_SW, "SLOPE_SW");
SQAITile.DefSQConst(engine, AITile::SLOPE_SE, "SLOPE_SE");
SQAITile.DefSQConst(engine, AITile::SLOPE_NE, "SLOPE_NE");
SQAITile.DefSQConst(engine, AITile::SLOPE_EW, "SLOPE_EW");
SQAITile.DefSQConst(engine, AITile::SLOPE_NS, "SLOPE_NS");
SQAITile.DefSQConst(engine, AITile::SLOPE_ELEVATED, "SLOPE_ELEVATED");
SQAITile.DefSQConst(engine, AITile::SLOPE_NWS, "SLOPE_NWS");
SQAITile.DefSQConst(engine, AITile::SLOPE_WSE, "SLOPE_WSE");
SQAITile.DefSQConst(engine, AITile::SLOPE_SEN, "SLOPE_SEN");
SQAITile.DefSQConst(engine, AITile::SLOPE_ENW, "SLOPE_ENW");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_W, "SLOPE_STEEP_W");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_S, "SLOPE_STEEP_S");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_E, "SLOPE_STEEP_E");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_N, "SLOPE_STEEP_N");
SQAITile.DefSQConst(engine, AITile::SLOPE_INVALID, "SLOPE_INVALID");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_RAIL, "TRANSPORT_RAIL");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_ROAD, "TRANSPORT_ROAD");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_WATER, "TRANSPORT_WATER");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_AIR, "TRANSPORT_AIR");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_INVALID, "TRANSPORT_INVALID");
SQAITile.DefSQConst(engine, AITile::ERR_TILE_BASE, "ERR_TILE_BASE");
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
SQAITile.DefSQConst(engine, AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
SQAITile.DefSQConst(engine, AITile::ERR_AREA_ALREADY_FLAT, "ERR_AREA_ALREADY_FLAT");
SQAITile.DefSQConst(engine, AITile::ERR_EXCAVATION_WOULD_DAMAGE, "ERR_EXCAVATION_WOULD_DAMAGE");
SQAITile.DefSQConst(engine, AITile::CORNER_W, "CORNER_W");
SQAITile.DefSQConst(engine, AITile::CORNER_S, "CORNER_S");
SQAITile.DefSQConst(engine, AITile::CORNER_E, "CORNER_E");
SQAITile.DefSQConst(engine, AITile::CORNER_N, "CORNER_N");
SQAITile.DefSQConst(engine, AITile::CORNER_INVALID, "CORNER_INVALID");
SQAITile.DefSQConst(engine, AITile::SLOPE_FLAT, "SLOPE_FLAT");
SQAITile.DefSQConst(engine, AITile::SLOPE_W, "SLOPE_W");
SQAITile.DefSQConst(engine, AITile::SLOPE_S, "SLOPE_S");
SQAITile.DefSQConst(engine, AITile::SLOPE_E, "SLOPE_E");
SQAITile.DefSQConst(engine, AITile::SLOPE_N, "SLOPE_N");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP, "SLOPE_STEEP");
SQAITile.DefSQConst(engine, AITile::SLOPE_NW, "SLOPE_NW");
SQAITile.DefSQConst(engine, AITile::SLOPE_SW, "SLOPE_SW");
SQAITile.DefSQConst(engine, AITile::SLOPE_SE, "SLOPE_SE");
SQAITile.DefSQConst(engine, AITile::SLOPE_NE, "SLOPE_NE");
SQAITile.DefSQConst(engine, AITile::SLOPE_EW, "SLOPE_EW");
SQAITile.DefSQConst(engine, AITile::SLOPE_NS, "SLOPE_NS");
SQAITile.DefSQConst(engine, AITile::SLOPE_ELEVATED, "SLOPE_ELEVATED");
SQAITile.DefSQConst(engine, AITile::SLOPE_NWS, "SLOPE_NWS");
SQAITile.DefSQConst(engine, AITile::SLOPE_WSE, "SLOPE_WSE");
SQAITile.DefSQConst(engine, AITile::SLOPE_SEN, "SLOPE_SEN");
SQAITile.DefSQConst(engine, AITile::SLOPE_ENW, "SLOPE_ENW");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_W, "SLOPE_STEEP_W");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_S, "SLOPE_STEEP_S");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_E, "SLOPE_STEEP_E");
SQAITile.DefSQConst(engine, AITile::SLOPE_STEEP_N, "SLOPE_STEEP_N");
SQAITile.DefSQConst(engine, AITile::SLOPE_INVALID, "SLOPE_INVALID");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_RAIL, "TRANSPORT_RAIL");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_ROAD, "TRANSPORT_ROAD");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_WATER, "TRANSPORT_WATER");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_AIR, "TRANSPORT_AIR");
SQAITile.DefSQConst(engine, AITile::TRANSPORT_INVALID, "TRANSPORT_INVALID");
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_HIGH);
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_LOW);
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_HIGH);
AIError::RegisterErrorMap(STR_1003_ALREADY_AT_SEA_LEVEL, AITile::ERR_TILE_TOO_LOW);
AIError::RegisterErrorMap(STR_ALREADY_LEVELLED, AITile::ERR_AREA_ALREADY_FLAT);
AIError::RegisterErrorMap(STR_1002_EXCAVATION_WOULD_DAMAGE, AITile::ERR_EXCAVATION_WOULD_DAMAGE);
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_HIGH, "ERR_TILE_TOO_HIGH");
AIError::RegisterErrorMapString(AITile::ERR_TILE_TOO_LOW, "ERR_TILE_TOO_LOW");
AIError::RegisterErrorMapString(AITile::ERR_AREA_ALREADY_FLAT, "ERR_AREA_ALREADY_FLAT");
AIError::RegisterErrorMapString(AITile::ERR_EXCAVATION_WOULD_DAMAGE, "ERR_EXCAVATION_WOULD_DAMAGE");
SQAITile.DefSQStaticMethod(engine, &AITile::IsBuildable, "IsBuildable", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::IsBuildableRectangle, "IsBuildableRectangle", 4, ".iii");
@@ -78,6 +91,9 @@ void SQAITile_Register(Squirrel *engine) {
SQAITile.DefSQStaticMethod(engine, &AITile::GetSlope, "GetSlope", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::GetComplementSlope, "GetComplementSlope", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::GetHeight, "GetHeight", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::GetMinHeight, "GetMinHeight", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::GetMaxHeight, "GetMaxHeight", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::GetCornerHeight, "GetCornerHeight", 3, ".ii");
SQAITile.DefSQStaticMethod(engine, &AITile::GetOwner, "GetOwner", 2, ".i");
SQAITile.DefSQStaticMethod(engine, &AITile::HasTransportType, "HasTransportType", 3, ".ii");
SQAITile.DefSQStaticMethod(engine, &AITile::GetCargoAcceptance, "GetCargoAcceptance", 6, ".iiiii");

View File

@@ -23,14 +23,26 @@
/* If it's a tunnel alread, take the easy way out! */
if (IsTunnelTile(tile)) return ::GetOtherTunnelEnd(tile);
::DoCommand(tile, 0, 0, DC_AUTO, CMD_BUILD_TUNNEL);
return _build_tunnel_endtile == 0 ? INVALID_TILE : _build_tunnel_endtile;
uint start_z;
Slope start_tileh = ::GetTileSlope(tile, &start_z);
DiagDirection direction = ::GetInclinedSlopeDirection(start_tileh);
if (direction == INVALID_DIAGDIR) return INVALID_TILE;
TileIndexDiff delta = ::TileOffsByDiagDir(direction);
uint end_z;
do {
tile += delta;
if (!::IsValidTile(tile)) return INVALID_TILE;
::GetTileSlope(tile, &end_z);
} while (start_z != end_z);
return tile;
}
static void _DoCommandReturnBuildTunnel2(class AIInstance *instance)
{
if (!AITunnel::_BuildTunnelRoad2()) {
AIObject::SetLastCommandRes(false);
AIInstance::DoCommandReturn(instance);
return;
}
@@ -43,7 +55,6 @@ static void _DoCommandReturnBuildTunnel2(class AIInstance *instance)
static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
{
if (!AITunnel::_BuildTunnelRoad1()) {
AIObject::SetLastCommandRes(false);
AIInstance::DoCommandReturn(instance);
return;
}
@@ -62,7 +73,7 @@ static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
uint type = 0;
if (vehicle_type == AIVehicle::VT_ROAD) {
type |= (TRANSPORT_ROAD << 9);
type |= RoadTypeToRoadTypes((::RoadType)AIObject::GetRoadType());
type |= ::RoadTypeToRoadTypes((::RoadType)AIObject::GetRoadType());
} else {
type |= (TRANSPORT_RAIL << 9);
type |= AIRail::GetCurrentRailType();
@@ -74,10 +85,7 @@ static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
}
AIObject::SetCallbackVariable(0, start);
if (!AIObject::DoCommand(start, type, 0, CMD_BUILD_TUNNEL, NULL, &_DoCommandReturnBuildTunnel1)) return false;
/* In case of test-mode, test if we can build both road pieces */
return _BuildTunnelRoad1();
return AIObject::DoCommand(start, type, 0, CMD_BUILD_TUNNEL, NULL, &_DoCommandReturnBuildTunnel1);
}
/* static */ bool AITunnel::_BuildTunnelRoad1()
@@ -89,10 +97,7 @@ static void _DoCommandReturnBuildTunnel1(class AIInstance *instance)
DiagDirection dir_1 = (DiagDirection)((::TileX(start) == ::TileX(end)) ? (::TileY(start) < ::TileY(end) ? DIAGDIR_NW : DIAGDIR_SE) : (::TileX(start) < ::TileX(end) ? DIAGDIR_NE : DIAGDIR_SW));
DiagDirection dir_2 = ::ReverseDiagDir(dir_1);
if (!AIObject::DoCommand(start + ::TileOffsByDiagDir(dir_1), ::DiagDirToRoadBits(dir_2) | (AIObject::GetRoadType() << 4), 0, CMD_BUILD_ROAD, NULL, &_DoCommandReturnBuildTunnel2)) return false;
/* In case of test-mode, test the other road piece too */
return _BuildTunnelRoad2();
return AIObject::DoCommand(start + ::TileOffsByDiagDir(dir_1), ::DiagDirToRoadBits(dir_2) | (AIObject::GetRoadType() << 4), 0, CMD_BUILD_ROAD, NULL, &_DoCommandReturnBuildTunnel2);
}
/* static */ bool AITunnel::_BuildTunnelRoad2()

View File

@@ -46,11 +46,15 @@ public:
/**
* Get the tile that exits on the other end of a (would be) tunnel starting
* at tile.
* at tile. If there is no 'simple' inclined slope at the start tile,
* this function will return AIMap::TILE_INVALID.
* @param tile The tile that is an entrance to a tunnel or the tile where you may want to build a tunnel.
* @pre AIMap::IsValidTile(tile).
* @return The TileIndex that is the other end of the (would be) tunnel, or
* TILE_INVALID if no other end was found (can't build tunnel).
* AIMap::TILE_INVALID if no other end was found (can't build tunnel).
* @note Even if this function returns a valid tile, that is no guarantee
* that building a tunnel will succeed. Use BuildTunnel in AITestMode to
* check whether a tunnel can actually be build.
*/
static TileIndex GetOtherTunnelEnd(TileIndex tile);

View File

@@ -1,6 +1,75 @@
/* $Id$ */
/** @file ai_types.hpp Defines all the types of the game, like VehicleID, .... */
/** @file ai_types.hpp Defines all the types of the game, like IDs of various objects.
*
* IDs are used to identify certain objects. They are only unique within the object type, so for example a vehicle may have VehicleID 2009,
* while a station has StationID 2009 at the same time. Also IDs are assigned arbitrary, you cannot assume them to be consecutive.
* Also note, that some IDs are static and never change, while others are allocated dynamically and might be
* reused for other objects once they are released. So be careful, which IDs you store for which purpose and whether they stay valid all the time.
*
* <table>
* <tr><th>type </th><th> object </th>
* <th> acquired </th>
* <th> released </th>
* <th> reused </th></tr>
* <tr><td>#BridgeID </td><td> bridge type </td>
* <td> introduction \ref newgrf_changes "(1)" </td>
* <td> never \ref newgrf_changes "(1)" </td>
* <td> no \ref newgrf_changes "(1)" </td></tr>
* <tr><td>#CargoID </td><td> cargo type </td>
* <td> game start \ref newgrf_changes "(1)" </td>
* <td> never \ref newgrf_changes "(1)" </td>
* <td> no \ref newgrf_changes "(1)" </td></tr>
* <tr><td>#EngineID </td><td> engine type </td>
* <td> introduction, preview \ref dynamic_engines "(2)" </td>
* <td> engines retires \ref dynamic_engines "(2)" </td>
* <td> no \ref dynamic_engines "(2)" </td></tr>
* <tr><td>#GroupID </td><td> vehicle group </td>
* <td> creation </td>
* <td> deletion </td>
* <td> yes </td></tr>
* <tr><td>#IndustyID </td><td> industry </td>
* <td> construction </td>
* <td> closure </td>
* <td> yes </td></tr>
* <tr><td>#IndustyType</td><td> industry type </td>
* <td> game start \ref newgrf_changes "(1)" </td>
* <td> never \ref newgrf_changes "(1)" </td>
* <td> no </td></tr>
* <tr><td>#SignID </td><td> sign </td>
* <td> construction </td>
* <td> deletion </td>
* <td> yes </td></tr>
* <tr><td>#StationID </td><td> station </td>
* <td> construction </td>
* <td> expiration of 'grey' station sign after deletion </td>
* <td> yes </td></tr>
* <tr><td>#SubsidyID </td><td> subsidy </td>
* <td> offer announcement </td>
* <td> (offer) expiration </td>
* <td> yes </td></tr>
* <tr><td>#TileIndex </td><td> tile on map </td>
* <td> game start </td>
* <td> never </td>
* <td> no </td></tr>
* <tr><td>#TownID </td><td> town </td>
* <td> game start </td>
* <td> never </td>
* <td> no </td></tr>
* <tr><td>#VehicleID </td><td> vehicle </td>
* <td> construction, autorenew, autoreplace </td>
* <td> destruction, autorenew, autoreplace </td>
* <td> yes </td></tr>
* <tr><td>#WaypointID </td><td> waypoint </td>
* <td> construction </td>
* <td> destruction </td>
* <td> yes </td></tr>
* </table>
*
* @remarks
* \li \anchor newgrf_changes (1) in-game changes of newgrfs may reassign/invalidate IDs (will also cause other trouble though).
* \li \anchor dynamic_engines (2) engine IDs are reassigned/invalidated on changing 'allow multiple newgrf engine sets' (only allowed as long as no vehicles are built).
*/
#ifndef AI_TYPES_HPP
#define AI_TYPES_HPP

View File

@@ -160,6 +160,13 @@
return AIObject::DoCommand(0, vehicle_id, 0, GetCmdSendToDepot(::GetVehicle(vehicle_id)));
}
/* static */ bool AIVehicle::SendVehicleToDepotForServicing(VehicleID vehicle_id)
{
EnforcePrecondition(false, IsValidVehicle(vehicle_id));
return AIObject::DoCommand(0, vehicle_id, DEPOT_SERVICE, GetCmdSendToDepot(::GetVehicle(vehicle_id)));
}
/* static */ bool AIVehicle::IsInDepot(VehicleID vehicle_id)
{
if (!IsValidVehicle(vehicle_id)) return false;

View File

@@ -422,14 +422,25 @@ public:
static bool SellWagonChain(VehicleID vehicle_id, int wagon);
/**
* Sends the given vehicle to a depot.
* Sends the given vehicle to a depot. If the vehicle has already been
* sent to a depot it continues with its normal orders instead.
* @param vehicle_id The vehicle to send to a depot.
* @pre IsValidVehicle(vehicle_id).
* @exception AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT
* @return True if and only if the vehicle has been sent to a depot.
* @return True if the current order was changed.
*/
static bool SendVehicleToDepot(VehicleID vehicle_id);
/**
* Sends the given vehicle to a depot for servicing. If the vehicle has
* already been sent to a depot it continues with its normal orders instead.
* @param vehicle_id The vehicle to send to a depot for servicing.
* @pre IsValidVehicle(vehicle_id).
* @exception AIVehicle::ERR_VEHICLE_CANNOT_SEND_TO_DEPOT
* @return True if the current order was changed.
*/
static bool SendVehicleToDepotForServicing(VehicleID vehicle_id);
/**
* Starts or stops the given vehicle depending on the current state.
* @param vehicle_id The vehicle to start/stop.

View File

@@ -98,47 +98,48 @@ void SQAIVehicle_Register(Squirrel *engine) {
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHICLE_IN_FLIGHT, "ERR_VEHICLE_IN_FLIGHT");
AIError::RegisterErrorMapString(AIVehicle::ERR_VEHCILE_NO_POWER, "ERR_VEHCILE_NO_POWER");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetNumWagons, "GetNumWagons", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SetName, "SetName", 3, ".is");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetName, "GetName", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLocation, "GetLocation", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetEngineType, "GetEngineType", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonEngineType, "GetWagonEngineType", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetUnitNumber, "GetUnitNumber", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAge, "GetAge", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonAge, "GetWagonAge", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetMaxAge, "GetMaxAge", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAgeLeft, "GetAgeLeft", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentSpeed, "GetCurrentSpeed", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetState, "GetState", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRunningCost, "GetRunningCost", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitThisYear, "GetProfitThisYear", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitLastYear, "GetProfitLastYear", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentValue, "GetCurrentValue", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetVehicleType, "GetVehicleType", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRoadType, "GetRoadType", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsInDepot, "IsInDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsStoppedInDepot, "IsStoppedInDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::BuildVehicle, "BuildVehicle", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::CloneVehicle, "CloneVehicle", 4, ".iib");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagon, "MoveWagon", 5, ".iiii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagonChain, "MoveWagonChain", 5, ".iiii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRefitCapacity, "GetRefitCapacity", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::RefitVehicle, "RefitVehicle", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellVehicle, "SellVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagon, "SellWagon", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagonChain, "SellWagonChain", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SendVehicleToDepot, "SendVehicleToDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::StartStopVehicle, "StartStopVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SkipToVehicleOrder, "SkipToVehicleOrder", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::ReverseVehicle, "ReverseVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCapacity, "GetCapacity", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLength, "GetLength", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCargoLoad, "GetCargoLoad", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetGroupID, "GetGroupID", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsArticulated, "IsArticulated", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::HasSharedOrders, "HasSharedOrders", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsValidVehicle, "IsValidVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetNumWagons, "GetNumWagons", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SetName, "SetName", 3, ".is");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetName, "GetName", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLocation, "GetLocation", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetEngineType, "GetEngineType", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonEngineType, "GetWagonEngineType", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetUnitNumber, "GetUnitNumber", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAge, "GetAge", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetWagonAge, "GetWagonAge", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetMaxAge, "GetMaxAge", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetAgeLeft, "GetAgeLeft", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentSpeed, "GetCurrentSpeed", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetState, "GetState", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRunningCost, "GetRunningCost", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitThisYear, "GetProfitThisYear", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetProfitLastYear, "GetProfitLastYear", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCurrentValue, "GetCurrentValue", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetVehicleType, "GetVehicleType", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRoadType, "GetRoadType", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsInDepot, "IsInDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsStoppedInDepot, "IsStoppedInDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::BuildVehicle, "BuildVehicle", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::CloneVehicle, "CloneVehicle", 4, ".iib");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagon, "MoveWagon", 5, ".iiii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::MoveWagonChain, "MoveWagonChain", 5, ".iiii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetRefitCapacity, "GetRefitCapacity", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::RefitVehicle, "RefitVehicle", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellVehicle, "SellVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagon, "SellWagon", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SellWagonChain, "SellWagonChain", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SendVehicleToDepot, "SendVehicleToDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SendVehicleToDepotForServicing, "SendVehicleToDepotForServicing", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::StartStopVehicle, "StartStopVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::SkipToVehicleOrder, "SkipToVehicleOrder", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::ReverseVehicle, "ReverseVehicle", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCapacity, "GetCapacity", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetLength, "GetLength", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetCargoLoad, "GetCargoLoad", 3, ".ii");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::GetGroupID, "GetGroupID", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::IsArticulated, "IsArticulated", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &AIVehicle::HasSharedOrders, "HasSharedOrders", 2, ".i");
SQAIVehicle.PostRegister(engine);
}

View File

@@ -16,7 +16,7 @@ public:
static const char *GetClassName() { return "AIWaypoint"; }
enum SpecialWaypointIDs {
WAYPOINT_INVALID = -1, //!< An invalid WaypointID.
WAYPOINT_INVALID = 0xFFFF, //!< An invalid WaypointID.
};
/**

View File

@@ -397,8 +397,8 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
UpdateAircraftCache(v);
VehiclePositionChanged(v);
VehiclePositionChanged(u);
VehicleMove(v, false);
VehicleMove(u, false);
/* Aircraft with 3 vehicles (chopper)? */
if (v->subtype == AIR_HELICOPTER) {
@@ -421,14 +421,14 @@ CommandCost CmdBuildAircraft(TileIndex tile, DoCommandFlag flags, uint32 p1, uin
w->UpdateDeltaXY(INVALID_DIR);
u->SetNext(w);
VehiclePositionChanged(w);
VehicleMove(w, false);
}
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
InvalidateWindowClassesData(WC_AIRCRAFT_LIST, 0);
InvalidateWindow(WC_COMPANY, v->owner);
if (IsLocalCompany())
InvalidateAutoreplaceWindow(v->engine_type, v->group_id); //updates the replace Aircraft window
InvalidateAutoreplaceWindow(v->engine_type, v->group_id); // updates the replace Aircraft window
GetCompany(_current_company)->num_engines[p1]++;
}
@@ -692,9 +692,7 @@ static void HelicopterTickHandler(Vehicle *v)
u->cur_image = img;
BeginVehicleMove(u);
VehiclePositionChanged(u);
EndVehicleMove(u);
VehicleMove(u, true);
}
void SetAircraftPosition(Vehicle *v, int x, int y, int z)
@@ -706,9 +704,7 @@ void SetAircraftPosition(Vehicle *v, int x, int y, int z)
v->cur_image = v->GetImage(v->direction);
if (v->subtype == AIR_HELICOPTER) v->Next()->Next()->cur_image = GetRotorImage(v);
BeginVehicleMove(v);
VehiclePositionChanged(v);
EndVehicleMove(v);
VehicleMove(v, true);
Vehicle *u = v->Next();
@@ -721,9 +717,7 @@ void SetAircraftPosition(Vehicle *v, int x, int y, int z)
u->z_pos = GetSlopeZ(safe_x, safe_y);
u->cur_image = v->cur_image;
BeginVehicleMove(u);
VehiclePositionChanged(u);
EndVehicleMove(u);
VehicleMove(u, true);
u = u->Next();
if (u != NULL) {
@@ -731,9 +725,7 @@ void SetAircraftPosition(Vehicle *v, int x, int y, int z)
u->y_pos = y;
u->z_pos = z + 5;
BeginVehicleMove(u);
VehiclePositionChanged(u);
EndVehicleMove(u);
VehicleMove(u, true);
}
}
@@ -1156,7 +1148,7 @@ static bool AircraftController(Vehicle *v)
static void HandleCrashedAircraft(Vehicle *v)
{
v->u.air.crashed_counter++;
v->u.air.crashed_counter += 3;
Station *st = GetTargetAirportIfValid(v);
@@ -1630,9 +1622,9 @@ static void AircraftEventHandler_Flying(Vehicle *v, const AirportFTAClass *apc)
if (apc->flags & (v->subtype == AIR_HELICOPTER ? AirportFTAClass::HELICOPTERS : AirportFTAClass::AIRPLANES) &&
st->airport_tile != INVALID_TILE &&
(st->owner == OWNER_NONE || st->owner == v->owner)) {
// {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
// if it is an airplane, look for LANDING, for helicopter HELILANDING
// it is possible to choose from multiple landing runways, so loop until a free one is found
/* {32,FLYING,NOTHING_block,37}, {32,LANDING,N,33}, {32,HELILANDING,N,41},
* if it is an airplane, look for LANDING, for helicopter HELILANDING
* it is possible to choose from multiple landing runways, so loop until a free one is found */
byte landingtype = (v->subtype == AIR_HELICOPTER) ? HELILANDING : LANDING;
const AirportFTA *current = apc->layout[v->u.air.pos].next;
while (current != NULL) {

View File

@@ -15,12 +15,12 @@
#include "table/strings.h"
/**
* Draw the details for the given vehicle at the position (x,y)
*
* @param v current vehicle
* @param x The x coordinate
* @param y The y coordinate
*/
* Draw the details for the given vehicle at the position (x, y)
*
* @param v current vehicle
* @param x The x coordinate
* @param y The y coordinate
*/
void DrawAircraftDetails(const Vehicle *v, int x, int y)
{
int y_offset = (v->Next()->cargo_cap != 0) ? -11 : 0;

View File

@@ -69,8 +69,8 @@ enum {
HELIPAD4 = 22
};
/* Movement Blocks on Airports */
/* blocks (eg_airport_flags) */
/* Movement Blocks on Airports
* blocks (eg_airport_flags) */
static const uint64
TERM1_block = 1ULL << 0,
TERM2_block = 1ULL << 1,

View File

@@ -138,12 +138,12 @@ static const Widget _air_toolbar_widgets[] = {
};
static const WindowDesc _air_toolbar_desc = {
static const WindowDesc _air_toolbar_desc(
WDP_ALIGN_TBR, 22, 64, 36, 64, 36,
WC_BUILD_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_CONSTRUCTION,
_air_toolbar_widgets,
};
_air_toolbar_widgets
);
void ShowBuildAirToolbar()
{
@@ -299,12 +299,12 @@ static const Widget _build_airport_picker_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _build_airport_desc = {
static const WindowDesc _build_airport_desc(
WDP_AUTO, WDP_AUTO, 148, 240, 148, 240,
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_CONSTRUCTION,
_build_airport_picker_widgets,
};
_build_airport_picker_widgets
);
static void ShowBuildAirportPicker(Window *parent)
{

View File

@@ -6,8 +6,8 @@
#define AIRPORT_MOVEMENT_H
// state machine input struct (from external file, etc.)
// Finite sTate mAchine --> FTA
/* state machine input struct (from external file, etc.)
* Finite sTate mAchine --> FTA */
struct AirportFTAbuildup {
byte position; // the position that an airplane is at
byte heading; // the current orders (eg. TAKEOFF, HANGAR, ENDLANDING, etc.)
@@ -25,7 +25,7 @@ static const AirportMovingData _airport_moving_data_dummy[] = {
{ 96, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} },
};
// Country Airfield (small) 4x3
/* Country Airfield (small) 4x3 */
static const AirportMovingData _airport_moving_data_country[22] = {
{ 53, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 53, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
@@ -51,7 +51,7 @@ static const AirportMovingData _airport_moving_data_country[22] = {
{ 44, 40, AMED_HELI_LOWER, {DIR_N} }, // 21 Helicopter landing
};
// Commuter Airfield (small) 5x4
/* Commuter Airfield (small) 5x4 */
static const AirportMovingData _airport_moving_data_commuter[37] = {
{ 69, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 72, 22, 0, {DIR_N} }, // 01 Taxi to right outside depot
@@ -78,7 +78,7 @@ static const AirportMovingData _airport_moving_data_commuter[37] = {
{ 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 22 Fly around waiting for a landing spot (north-west)
{ 193, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 23 Fly around waiting for a landing spot (south-west)
{ 225, 81, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 24 Fly around waiting for a landing spot (south)
// Helicopter
/* Helicopter */
{ 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 25 Bufferspace before helipad
{ 80, 0, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 26 Bufferspace before helipad
{ 32, 8, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 27 Get in position for Helipad1
@@ -93,7 +93,7 @@ static const AirportMovingData _airport_moving_data_commuter[37] = {
{ 56, 8, AMED_EXACTPOS, {DIR_N} }, // pre-helitakeoff helipad 2
};
// City Airport (large) 6x6
/* City Airport (large) 6x6 */
static const AirportMovingData _airport_moving_data_town[] = {
{ 85, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 85, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
@@ -111,7 +111,7 @@ static const AirportMovingData _airport_moving_data_town[] = {
{ 177, 87, AMED_HOLD | AMED_SLOWTURN, {DIR_N} }, // 13 Fly to landing position in air
{ 89, 87, AMED_HOLD | AMED_LAND, {DIR_N} }, // 14 Going down for land
{ 20, 87, AMED_NOSPDCLAMP | AMED_BRAKE, {DIR_N} }, // 15 Just landed, brake until end of runway
{ 20, 87, 0, {DIR_N} }, // 16 Just landed, turn around and taxi 1 square /* NOT USED */
{ 20, 87, 0, {DIR_N} }, // 16 Just landed, turn around and taxi 1 square // NOT USED
{ 36, 71, 0, {DIR_N} }, // 17 Taxi from runway to crossing
{ 160, 87, AMED_HOLD | AMED_SLOWTURN, {DIR_N} }, // 18 Fly around waiting for a landing spot (north-east)
{ 140, 1, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 19 Final approach fix
@@ -127,7 +127,7 @@ static const AirportMovingData _airport_moving_data_town[] = {
{ -32, 120, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 29 Initial approach fix (east)
};
// Metropolitan Airport (metropolitan) - 2 runways
/* Metropolitan Airport (metropolitan) - 2 runways */
static const AirportMovingData _airport_moving_data_metropolitan[27] = {
{ 85, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar
{ 85, 27, 0, {DIR_N} }, // 01 Taxi to right outside depot
@@ -158,7 +158,7 @@ static const AirportMovingData _airport_moving_data_metropolitan[27] = {
{ 15, 54, AMED_HELI_LOWER, {DIR_N} }, // 26 Helicopter landing
};
// International Airport (international) - 2 runways, 6 terminals, dedicated helipod
/* International Airport (international) - 2 runways, 6 terminals, dedicated helipod */
static const AirportMovingData _airport_moving_data_international[51] = {
{ 7, 55, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar 1
{ 100, 21, AMED_EXACTPOS, {DIR_SE} }, // 01 In Hangar 2
@@ -201,7 +201,7 @@ static const AirportMovingData _airport_moving_data_international[51] = {
{ 1, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 38 Fly around waiting for a landing spot (north-west)
{ 273, 6, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 39 Fly around waiting for a landing spot (south-west)
{ 305, 81, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 40 Fly around waiting for a landing spot (south)
// Helicopter
/* Helicopter */
{ 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 41 Bufferspace before helipad
{ 128, 80, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 42 Bufferspace before helipad
{ 96, 71, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 43 Get in position for Helipad1
@@ -214,7 +214,7 @@ static const AirportMovingData _airport_moving_data_international[51] = {
{ 104, 32, AMED_HELI_LOWER, {DIR_N} }, // 50 Land in HANGAR2_AREA to go to hangar
};
// Intercontinental Airport - 4 runways, 8 terminals, 2 dedicated helipads
/* Intercontinental Airport - 4 runways, 8 terminals, 2 dedicated helipads */
static const AirportMovingData _airport_moving_data_intercontinental[77] = {
{ 7, 87, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar 1
{ 135, 72, AMED_EXACTPOS, {DIR_SE} }, // 01 In Hangar 2
@@ -263,7 +263,7 @@ static const AirportMovingData _airport_moving_data_intercontinental[77] = {
{ -200, 88, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 44 Fly around waiting for a landing spot (north-west)
{ 56, -168, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 45 Fly around waiting for a landing spot (south-west)
{ 312, 88, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 46 Fly around waiting for a landing spot (south)
// Helicopter
/* Helicopter */
{ 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 47 Bufferspace before helipad
{ 96, 40, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 48 Bufferspace before helipad
{ 82, 54, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 49 Get in position for Helipad1
@@ -297,7 +297,7 @@ static const AirportMovingData _airport_moving_data_intercontinental[77] = {
};
// Heliport (heliport)
/* Heliport (heliport) */
static const AirportMovingData _airport_moving_data_heliport[9] = {
{ 5, 9, AMED_EXACTPOS, {DIR_NE} }, // 0 - At heliport terminal
{ 2, 9, AMED_HELI_RAISE, {DIR_N} }, // 1 - Take off (play sound)
@@ -310,7 +310,7 @@ static const AirportMovingData _airport_moving_data_heliport[9] = {
{ 70, 9, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 8 - Circle #4 (south)
};
// HeliDepot 2x2 (heliport)
/* HeliDepot 2x2 (heliport) */
static const AirportMovingData _airport_moving_data_helidepot[18] = {
{ 24, 4, AMED_EXACTPOS, {DIR_NE} }, // 0 - At depot
{ 24, 28, 0, {DIR_N} }, // 1 Taxi to right outside depot
@@ -332,7 +332,7 @@ static const AirportMovingData _airport_moving_data_helidepot[18] = {
{ 8, 24, AMED_SLOWTURN | AMED_EXACTPOS, {DIR_E} }, // 17 - turn on helipad1 for takeoff
};
// HeliDepot 2x2 (heliport)
/* HeliDepot 2x2 (heliport) */
static const AirportMovingData _airport_moving_data_helistation[33] = {
{ 8, 3, AMED_EXACTPOS, {DIR_SE} }, // 00 In Hangar2
{ 8, 22, 0, {DIR_N} }, // 01 outside hangar 2
@@ -369,7 +369,7 @@ static const AirportMovingData _airport_moving_data_helistation[33] = {
{ 132, -24, AMED_NOSPDCLAMP | AMED_SLOWTURN, {DIR_N} }, // 32 Fly around waiting for a landing spot (north-east)
};
// Oilrig
/* Oilrig */
static const AirportMovingData _airport_moving_data_oilrig[9] = {
{ 31, 9, AMED_EXACTPOS, {DIR_NE} }, // 0 - At oilrig terminal
{ 28, 9, AMED_HELI_RAISE, {DIR_N} }, // 1 - Take off (play sound)
@@ -406,17 +406,17 @@ static const AirportFTAbuildup _airport_fta_country[] = {
{ 4, 255, AIRPORT_BUSY_block, 0 }, { 4, TERM2, 0, 5 }, { 4, HANGAR, 0, 1 }, { 4, TAKEOFF, 0, 6 }, { 4, HELITAKEOFF, 0, 1 },
{ 5, 255, AIRPORT_BUSY_block, 0 }, { 5, TERM2, TERM2_block, 3 }, { 5, 0, 0, 4 },
{ 6, 0, AIRPORT_BUSY_block, 7 },
// takeoff
/* takeoff */
{ 7, TAKEOFF, AIRPORT_BUSY_block, 8 },
{ 8, STARTTAKEOFF, NOTHING_block, 9 },
{ 9, ENDTAKEOFF, NOTHING_block, 0 },
// landing
/* landing */
{ 10, FLYING, NOTHING_block, 15 }, { 10, LANDING, 0, 11 }, { 10, HELILANDING, 0, 20 },
{ 11, LANDING, AIRPORT_BUSY_block, 12 },
{ 12, 0, AIRPORT_BUSY_block, 13 },
{ 13, ENDLANDING, AIRPORT_BUSY_block, 14 }, { 13, TERM2, 0, 5 }, { 13, 0, 0, 14 },
{ 14, 0, AIRPORT_BUSY_block, 1 },
// In air
/* In air */
{ 15, 0, NOTHING_block, 16 },
{ 16, 0, NOTHING_block, 17 },
{ 17, 0, NOTHING_block, 18 },
@@ -444,31 +444,31 @@ static const AirportFTAbuildup _airport_fta_commuter[] = {
{ 9, 255, TAXIWAY_BUSY_block, 9 }, { 9, TAKEOFF, TAXIWAY_BUSY_block, 10 }, { 9, HANGAR, TAXIWAY_BUSY_block, 10 }, { 9, TERM2, TERM2_block, 4 }, { 9, HELIPAD1, HELIPAD1_block, 6 }, { 9, HELITAKEOFF, HELIPAD1_block, 6 }, { 9, TERM1, TAXIWAY_BUSY_block, 8 }, { 9, 0, TAXIWAY_BUSY_block, 10 },
{ 10, 255, TAXIWAY_BUSY_block, 10 }, { 10, TERM3, TERM3_block, 5 }, { 10, HELIPAD1, 0, 9 }, { 10, HELIPAD2, HELIPAD2_block, 7 }, { 10, HELITAKEOFF, HELIPAD2_block, 7 }, { 10, TAKEOFF, TAXIWAY_BUSY_block, 1 }, { 10, HANGAR, TAXIWAY_BUSY_block, 1 }, { 10, 0, TAXIWAY_BUSY_block, 9 },
{ 11, 0, OUT_WAY_block, 12 },
// takeoff
/* takeoff */
{ 12, TAKEOFF, RUNWAY_IN_OUT_block, 13 },
{ 13, 0, RUNWAY_IN_OUT_block, 14 },
{ 14, STARTTAKEOFF, RUNWAY_IN_OUT_block, 15 },
{ 15, ENDTAKEOFF, NOTHING_block, 0 },
// landing
/* landing */
{ 16, FLYING, NOTHING_block, 21 }, { 16, LANDING, IN_WAY_block, 17 }, { 16, HELILANDING, 0, 25 },
{ 17, LANDING, RUNWAY_IN_OUT_block, 18 },
{ 18, 0, RUNWAY_IN_OUT_block, 19 },
{ 19, 0, RUNWAY_IN_OUT_block, 20 },
{ 20, ENDLANDING, IN_WAY_block, 2 },
// In Air
/* In Air */
{ 21, 0, NOTHING_block, 22 },
{ 22, 0, NOTHING_block, 23 },
{ 23, 0, NOTHING_block, 24 },
{ 24, 0, NOTHING_block, 16 },
// Helicopter -- stay in air in special place as a buffer to choose from helipads
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 25, HELILANDING, PRE_HELIPAD_block, 26 },
{ 26, HELIENDLANDING, PRE_HELIPAD_block, 26 }, { 26, HELIPAD1, 0, 27 }, { 26, HELIPAD2, 0, 28 }, { 26, HANGAR, 0, 33 },
{ 27, 0, NOTHING_block, 29 }, //helipad1 approach
{ 27, 0, NOTHING_block, 29 }, // helipad1 approach
{ 28, 0, NOTHING_block, 30 },
// landing
/* landing */
{ 29, 255, NOTHING_block, 0 }, { 29, HELIPAD1, HELIPAD1_block, 6 },
{ 30, 255, NOTHING_block, 0 }, { 30, HELIPAD2, HELIPAD2_block, 7 },
// Helicopter -- takeoff
/* Helicopter -- takeoff */
{ 31, HELITAKEOFF, NOTHING_block, 0 },
{ 32, HELITAKEOFF, NOTHING_block, 0 },
{ 33, 0, TAXIWAY_BUSY_block, 34 }, // need to go to hangar when waiting in air
@@ -492,22 +492,22 @@ static const AirportFTAbuildup _airport_fta_city[] = {
{ 7, 255, TAXIWAY_BUSY_block, 0 }, { 7, TERM1, TERM1_block, 2 }, { 7, TAKEOFF, OUT_WAY_block, 8 }, { 7, HELITAKEOFF, 0, 22 }, { 7, HANGAR, 0, 1 }, { 7, 0, 0, 6 },
{ 8, 0, OUT_WAY_block, 9 },
{ 9, 0, RUNWAY_IN_OUT_block, 10 },
// takeoff
/* takeoff */
{ 10, TAKEOFF, RUNWAY_IN_OUT_block, 11 },
{ 11, STARTTAKEOFF, NOTHING_block, 12 },
{ 12, ENDTAKEOFF, NOTHING_block, 0 },
// landing
/* landing */
{ 13, FLYING, NOTHING_block, 18 }, { 13, LANDING, 0, 14 }, { 13, HELILANDING, 0, 23 },
{ 14, LANDING, RUNWAY_IN_OUT_block, 15 },
{ 15, 0, RUNWAY_IN_OUT_block, 17 },
{ 16, 0, RUNWAY_IN_OUT_block, 17 }, /* not used, left for compatibility */
{ 16, 0, RUNWAY_IN_OUT_block, 17 }, // not used, left for compatibility
{ 17, ENDLANDING, IN_WAY_block, 7 },
// In Air
/* In Air */
{ 18, 0, NOTHING_block, 25 },
{ 19, 0, NOTHING_block, 20 },
{ 20, 0, NOTHING_block, 21 },
{ 21, 0, NOTHING_block, 13 },
// helicopter
/* helicopter */
{ 22, HELITAKEOFF, NOTHING_block, 0 },
{ 23, HELILANDING, IN_WAY_block, 24 },
{ 24, HELIENDLANDING, IN_WAY_block, 17 },
@@ -533,23 +533,23 @@ static const AirportFTAbuildup _airport_fta_metropolitan[] = {
{ 7, 255, TAXIWAY_BUSY_block, 0 }, { 7, TERM1, TERM1_block, 2 }, { 7, TAKEOFF, 0, 8 }, { 7, HELITAKEOFF, 0, 23 }, { 7, HANGAR, 0, 1 }, { 7, 0, 0, 6 },
{ 8, 0, OUT_WAY_block, 9 },
{ 9, 0, RUNWAY_OUT_block, 10 },
// takeoff
/* takeoff */
{ 10, TAKEOFF, RUNWAY_OUT_block, 11 },
{ 11, STARTTAKEOFF, NOTHING_block, 12 },
{ 12, ENDTAKEOFF, NOTHING_block, 0 },
// landing
/* landing */
{ 13, FLYING, NOTHING_block, 19 }, { 13, LANDING, 0, 14 }, { 13, HELILANDING, 0, 25 },
{ 14, LANDING, RUNWAY_IN_block, 15 },
{ 15, 0, RUNWAY_IN_block, 16 },
{ 16, 255, RUNWAY_IN_block, 0 }, { 16, ENDLANDING, IN_WAY_block, 17 },
{ 17, 255, RUNWAY_OUT_block, 0 }, { 17, ENDLANDING, IN_WAY_block, 18 },
{ 18, ENDLANDING, IN_WAY_block, 7 },
// In Air
/* In Air */
{ 19, 0, NOTHING_block, 20 },
{ 20, 0, NOTHING_block, 21 },
{ 21, 0, NOTHING_block, 22 },
{ 22, 0, NOTHING_block, 13 },
// helicopter
/* helicopter */
{ 23, 0, NOTHING_block, 24 },
{ 24, HELITAKEOFF, NOTHING_block, 0 },
{ 25, HELILANDING, IN_WAY_block, 26 },
@@ -590,31 +590,31 @@ static const AirportFTAbuildup _airport_fta_international[] = {
{ 25, 255, TERM_GROUP1_block, 0 }, { 25, TERM3, TERM3_block, 6 }, { 25, TAKEOFF, 0, 26 }, { 25, 0, 0, 24 },
{ 26, 255, TAXIWAY_BUSY_block, 0 }, { 26, TAKEOFF, 0, 27 }, { 26, 0, 0, 25 },
{ 27, 0, OUT_WAY_block, 28 },
// takeoff
/* takeoff */
{ 28, TAKEOFF, OUT_WAY_block, 29 },
{ 29, 0, RUNWAY_OUT_block, 30 },
{ 30, STARTTAKEOFF, NOTHING_block, 31 },
{ 31, ENDTAKEOFF, NOTHING_block, 0 },
// landing
/* landing */
{ 32, FLYING, NOTHING_block, 37 }, { 32, LANDING, 0, 33 }, { 32, HELILANDING, 0, 41 },
{ 33, LANDING, RUNWAY_IN_block, 34 },
{ 34, 0, RUNWAY_IN_block, 35 },
{ 35, 0, RUNWAY_IN_block, 36 },
{ 36, ENDLANDING, IN_WAY_block, 36 }, { 36, 255, TERM_GROUP1_block, 0 }, { 36, 255, TERM_GROUP2_ENTER1_block, 1 }, { 36, TERM4, 0, 12 }, { 36, TERM5, 0, 12 }, { 36, TERM6, 0, 12 }, { 36, 0, 0, 2 },
// In Air
/* In Air */
{ 37, 0, NOTHING_block, 38 },
{ 38, 0, NOTHING_block, 39 },
{ 39, 0, NOTHING_block, 40 },
{ 40, 0, NOTHING_block, 32 },
// Helicopter -- stay in air in special place as a buffer to choose from helipads
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 41, HELILANDING, PRE_HELIPAD_block, 42 },
{ 42, HELIENDLANDING, PRE_HELIPAD_block, 42 }, { 42, HELIPAD1, 0, 43 }, { 42, HELIPAD2, 0, 44 }, { 42, HANGAR, 0, 49 },
{ 43, 0, NOTHING_block, 45 },
{ 44, 0, NOTHING_block, 46 },
// landing
/* landing */
{ 45, 255, NOTHING_block, 0 }, { 45, HELIPAD1, HELIPAD1_block, 10 },
{ 46, 255, NOTHING_block, 0 }, { 46, HELIPAD2, HELIPAD2_block, 11 },
// Helicopter -- takeoff
/* Helicopter -- takeoff */
{ 47, HELITAKEOFF, NOTHING_block, 0 },
{ 48, HELITAKEOFF, NOTHING_block, 0 },
{ 49, 0, HANGAR2_AREA_block, 50 }, // need to go to hangar when waiting in air
@@ -622,7 +622,7 @@ static const AirportFTAbuildup _airport_fta_international[] = {
{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
};
// intercontinental
/* intercontinental */
static const TileIndexDiffC _airport_depots_intercontinental[] = { { 0, 5 }, { 8, 4 } };
static const byte _airport_terminal_intercontinental[] = { 2, 4, 4 };
static const byte _airport_helipad_intercontinental[] = { 1, 2 };
@@ -660,12 +660,12 @@ static const AirportFTAbuildup _airport_fta_intercontinental[] = {
{ 29, 255, TERM_GROUP1_block, 0 }, { 29, TERM4, TERM4_block, 7 }, { 29, HANGAR, HANGAR1_AREA_block, 27 }, { 29, TAKEOFF, 0, 30 }, { 29, 0, 0, 28 },
{ 30, 0, OUT_WAY_block2, 31 },
{ 31, 0, OUT_WAY_block, 32 },
// takeoff
/* takeoff */
{ 32, TAKEOFF, RUNWAY_OUT_block, 33 },
{ 33, 0, RUNWAY_OUT_block, 34 },
{ 34, STARTTAKEOFF, NOTHING_block, 35 },
{ 35, ENDTAKEOFF, NOTHING_block, 0 },
// landing
/* landing */
{ 36, 0, 0, 0 },
{ 37, LANDING, RUNWAY_IN_block, 38 },
{ 38, 0, RUNWAY_IN_block, 39 },
@@ -673,32 +673,32 @@ static const AirportFTAbuildup _airport_fta_intercontinental[] = {
{ 40, ENDLANDING, RUNWAY_IN_block, 41 },
{ 41, 0, IN_WAY_block, 42 },
{ 42, 255, IN_WAY_block, 0 }, { 42, 255, TERM_GROUP1_block, 0 }, { 42, 255, TERM_GROUP1_block, 1 }, { 42, HANGAR, 0, 2 }, { 42, 0, 0, 26 },
// In Air
/* In Air */
{ 43, 0, 0, 44 },
{ 44, FLYING, 0, 45 }, { 44, HELILANDING, 0, 47 }, { 44, LANDING, 0, 69 }, { 44, 0, 0, 45 },
{ 45, 0, 0, 46 },
{ 46, FLYING, 0, 43 }, { 46, LANDING, 0, 76 }, { 46, 0, 0, 43 },
// Helicopter -- stay in air in special place as a buffer to choose from helipads
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 47, HELILANDING, PRE_HELIPAD_block, 48 },
{ 48, HELIENDLANDING, PRE_HELIPAD_block, 48 }, { 48, HELIPAD1, 0, 49 }, { 48, HELIPAD2, 0, 50 }, { 48, HANGAR, 0, 55 },
{ 49, 0, NOTHING_block, 51 },
{ 50, 0, NOTHING_block, 52 },
// landing
/* landing */
{ 51, 255, NOTHING_block, 0 }, { 51, HELIPAD1, HELIPAD1_block, 12 }, { 51, HANGAR, 0, 55 }, { 51, 0, 0, 12 },
{ 52, 255, NOTHING_block, 0 }, { 52, HELIPAD2, HELIPAD2_block, 13 }, { 52, HANGAR, 0, 55 }, { 52, 0, 0, 13 },
// Helicopter -- takeoff
/* Helicopter -- takeoff */
{ 53, HELITAKEOFF, NOTHING_block, 0 },
{ 54, HELITAKEOFF, NOTHING_block, 0 },
{ 55, 0, HANGAR2_AREA_block, 56 }, // need to go to hangar when waiting in air
{ 56, 0, HANGAR2_AREA_block, 3 },
// runway 2 out support
/* runway 2 out support */
{ 57, 255, OUT_WAY2_block, 0 }, { 57, TAKEOFF, 0, 58 }, { 57, 0, 0, 58 },
{ 58, 0, OUT_WAY2_block, 59 },
{ 59, TAKEOFF, RUNWAY_OUT2_block, 60 }, // takeoff
{ 60, 0, RUNWAY_OUT2_block, 61 },
{ 61, STARTTAKEOFF, NOTHING_block, 62 },
{ 62, ENDTAKEOFF, NOTHING_block, 0 },
// runway 2 in support
/* runway 2 in support */
{ 63, LANDING, RUNWAY_IN2_block, 64 },
{ 64, 0, RUNWAY_IN2_block, 65 },
{ 65, 0, RUNWAY_IN2_block, 66 },
@@ -717,7 +717,7 @@ static const AirportFTAbuildup _airport_fta_intercontinental[] = {
};
// heliports, oilrigs don't have depots
/* heliports, oilrigs don't have depots */
static const byte _airport_helipad_heliport_oilrig[] = { 1, 1 };
static const byte _airport_entries_heliport_oilrig[] = { 7, 7, 7, 7 };
static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
@@ -726,7 +726,7 @@ static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
{ 2, 255, AIRPORT_BUSY_block, 0 }, { 2, HELILANDING, 0, 3 }, { 2, HELITAKEOFF, 0, 1 },
{ 3, HELILANDING, AIRPORT_BUSY_block, 4 },
{ 4, HELIENDLANDING, AIRPORT_BUSY_block, 4 }, { 4, HELIPAD1, HELIPAD1_block, 0 }, { 4, HELITAKEOFF, 0, 2 },
// In Air
/* In Air */
{ 5, 0, NOTHING_block, 6 },
{ 6, 0, NOTHING_block, 7 },
{ 7, 0, NOTHING_block, 8 },
@@ -734,7 +734,7 @@ static const AirportFTAbuildup _airport_fta_heliport_oilrig[] = {
{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
};
// helidepots
/* helidepots */
static const TileIndexDiffC _airport_depots_helidepot[] = { { 1, 0 } };
static const byte _airport_helipad_helidepot[] = { 1, 1 };
static const byte _airport_entries_helidepot[] = { 4, 4, 4, 4 };
@@ -742,18 +742,18 @@ static const AirportFTAbuildup _airport_fta_helidepot[] = {
{ 0, HANGAR, NOTHING_block, 1 },
{ 1, 255, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELIPAD1, HELIPAD1_block, 14 }, { 1, HELITAKEOFF, 0, 15 }, { 1, 0, 0, 0 },
{ 2, FLYING, NOTHING_block, 3 }, { 2, HELILANDING, PRE_HELIPAD_block, 7 }, { 2, HANGAR, 0, 12 }, { 2, HELITAKEOFF, NOTHING_block, 16 },
// In Air
/* In Air */
{ 3, 0, NOTHING_block, 4 },
{ 4, 0, NOTHING_block, 5 },
{ 5, 0, NOTHING_block, 6 },
{ 6, 0, NOTHING_block, 2 },
// Helicopter -- stay in air in special place as a buffer to choose from helipads
/* Helicopter -- stay in air in special place as a buffer to choose from helipads */
{ 7, HELILANDING, PRE_HELIPAD_block, 8 },
{ 8, HELIENDLANDING, PRE_HELIPAD_block, 8 }, { 8, HELIPAD1, 0, 9 }, { 8, HANGAR, 0, 12 }, { 8, 0, 0, 2 },
{ 9, 0, NOTHING_block, 10 },
// landing
/* landing */
{ 10, 255, NOTHING_block, 10 }, { 10, HELIPAD1, HELIPAD1_block, 14 }, { 10, HANGAR, 0, 1 }, { 10, 0, 0, 14 },
// Helicopter -- takeoff
/* Helicopter -- takeoff */
{ 11, HELITAKEOFF, NOTHING_block, 0 },
{ 12, 0, HANGAR2_AREA_block, 13 }, // need to go to hangar when waiting in air
{ 13, 0, HANGAR2_AREA_block, 1 },
@@ -764,16 +764,16 @@ static const AirportFTAbuildup _airport_fta_helidepot[] = {
{ MAX_ELEMENTS, 0, 0, 0 } // end marker. DO NOT REMOVE
};
// helistation
/* helistation */
static const TileIndexDiffC _airport_depots_helistation[] = { { 0, 0 } };
static const byte _airport_helipad_helistation[] = { 1, 3 };
static const byte _airport_entries_helistation[] = { 25, 25, 25, 25 };
static const AirportFTAbuildup _airport_fta_helistation[] = {
{ 0, HANGAR, NOTHING_block, 8 }, { 0, HELIPAD1, 0, 1 }, { 0, HELIPAD2, 0, 1 }, { 0, HELIPAD3, 0, 1 }, { 0, HELITAKEOFF, 0, 1 }, { 0, 0, 0, 0 },
{ 1, 255, HANGAR2_AREA_block, 0 }, { 1, HANGAR, 0, 0 }, { 1, HELITAKEOFF, 0, 3 }, { 1, 0, 0, 4 },
// landing
/* landing */
{ 2, FLYING, NOTHING_block, 28 }, { 2, HELILANDING, 0, 15 }, { 2, 0, 0, 28 },
// helicopter side
/* helicopter side */
{ 3, HELITAKEOFF, NOTHING_block, 0 }, // helitakeoff outside hangar2
{ 4, 255, TAXIWAY_BUSY_block, 0 }, { 4, HANGAR, HANGAR2_AREA_block, 1 }, { 4, HELITAKEOFF, 0, 1 }, { 4, 0, 0, 5 },
{ 5, 255, TAXIWAY_BUSY_block, 0 }, { 5, HELIPAD1, HELIPAD1_block, 6 }, { 5, HELIPAD2, HELIPAD2_block, 7 }, { 5, HELIPAD3, HELIPAD3_block, 8 }, { 5, 0, 0, 4 },
@@ -786,13 +786,13 @@ static const AirportFTAbuildup _airport_fta_helistation[] = {
{ 12, HELITAKEOFF, NOTHING_block, 0 },
{ 13, HELITAKEOFF, NOTHING_block, 0 },
{ 14, HELITAKEOFF, NOTHING_block, 0 },
// heli - in flight moves
/* heli - in flight moves */
{ 15, HELILANDING, PRE_HELIPAD_block, 16 },
{ 16, HELIENDLANDING, PRE_HELIPAD_block, 16 }, { 16, HELIPAD1, 0, 17 }, { 16, HELIPAD2, 0, 18 }, { 16, HELIPAD3, 0, 19 }, { 16, HANGAR, 0, 23 },
{ 17, 0, NOTHING_block, 20 },
{ 18, 0, NOTHING_block, 21 },
{ 19, 0, NOTHING_block, 22 },
// heli landing
/* heli landing */
{ 20, 255, NOTHING_block, 0 }, { 20, HELIPAD1, HELIPAD1_block, 6 }, { 20, HANGAR, 0, 23 }, { 20, 0, 0, 6 },
{ 21, 255, NOTHING_block, 0 }, { 21, HELIPAD2, HELIPAD2_block, 7 }, { 21, HANGAR, 0, 23 }, { 21, 0, 0, 7 },
{ 22, 255, NOTHING_block, 0 }, { 22, HELIPAD3, HELIPAD3_block, 8 }, { 22, HANGAR, 0, 23 }, { 22, 0, 0, 8 },

View File

@@ -5,10 +5,11 @@
#include "stdafx.h"
#include "train.h"
#include "roadveh.h"
#include "aircraft.h"
#include "newgrf_engine.h"
#include "vehicle_func.h"
#include "table/strings.h"
static const uint MAX_ARTICULATED_PARTS = 100; ///< Maximum of articulated parts per vehicle, i.e. when to abort calling the articulated vehicle callback.
uint CountArticulatedParts(EngineID engine_type, bool purchase_window)
@@ -50,22 +51,7 @@ static inline uint16 GetVehicleDefaultCapacity(EngineID engine, VehicleType type
CargoID cargo = (e->CanCarryCargo() ? e->GetDefaultCargoType() : (CargoID)CT_INVALID);
if (cargo_type != NULL) *cargo_type = cargo;
if (cargo == CT_INVALID) return 0;
switch (type) {
case VEH_TRAIN:
return GetEngineProperty(engine, 0x14, e->u.rail.capacity) + (e->u.rail.railveh_type == RAILVEH_MULTIHEAD ? e->u.rail.capacity : 0);
case VEH_ROAD:
return GetEngineProperty(engine, 0x0F, e->u.road.capacity);
case VEH_SHIP:
return GetEngineProperty(engine, 0x0D, e->u.ship.capacity);
case VEH_AIRCRAFT:
return AircraftDefaultCargoCapacity(cargo, &e->u.air);
default: NOT_REACHED();
}
return e->GetDisplayDefaultCapacity();
}
/**
@@ -238,6 +224,64 @@ bool IsArticulatedVehicleCarryingDifferentCargos(const Vehicle *v, CargoID *carg
return false;
}
/**
* Checks whether the specs of freshly build articulated vehicles are consistent with the information specified in the purchase list.
* Only essential information is checked to leave room for magic tricks/workarounds to grfcoders.
* It checks:
* For autoreplace/-renew:
* - Default cargo type (without capacity)
* - intersection and union of refit masks.
*/
void CheckConsistencyOfArticulatedVehicle(const Vehicle *v)
{
const Engine *engine = GetEngine(v->engine_type);
uint32 purchase_refit_union = GetUnionOfArticulatedRefitMasks(v->engine_type, v->type, true);
uint32 purchase_refit_intersection = GetIntersectionOfArticulatedRefitMasks(v->engine_type, v->type, true);
uint16 *purchase_default_capacity = GetCapacityOfArticulatedParts(v->engine_type, v->type);
uint32 real_refit_union = 0;
uint32 real_refit_intersection = UINT_MAX;
uint16 real_default_capacity[NUM_CARGO];
memset(real_default_capacity, 0, sizeof(real_default_capacity));
do {
uint32 refit_mask = GetAvailableVehicleCargoTypes(v->engine_type, v->type, true);
real_refit_union |= refit_mask;
if (refit_mask != 0) real_refit_intersection &= refit_mask;
assert(v->cargo_type < NUM_CARGO);
real_default_capacity[v->cargo_type] += v->cargo_cap;
switch (v->type) {
case VEH_TRAIN:
v = (EngineHasArticPart(v) ? GetNextArticPart(v) : NULL);
break;
case VEH_ROAD:
v = (RoadVehHasArticPart(v) ? v->Next() : NULL);
break;
default:
v = NULL;
break;
}
} while (v != NULL);
/* Check whether the vehicle carries more cargos than expected */
bool carries_more = false;
for (CargoID cid = 0; cid < NUM_CARGO; cid++) {
if (real_default_capacity[cid] != 0 && purchase_default_capacity[cid] == 0) {
carries_more = true;
break;
}
}
/* show a warning once for each GRF after each game load */
if (real_refit_union != purchase_refit_union || real_refit_intersection != purchase_refit_intersection || carries_more) {
ShowNewGrfVehicleError(engine->index, STR_NEWGRF_BUGGY, STR_NEWGRF_BUGGY_ARTICULATED_CARGO, GBUG_VEH_REFIT, false);
}
}
void AddArticulatedParts(Vehicle **vl, VehicleType type)
{
@@ -329,6 +373,6 @@ void AddArticulatedParts(Vehicle **vl, VehicleType type)
if (flip_image) u->spritenum++;
VehiclePositionChanged(u);
VehicleMove(u, false);
}
}

View File

@@ -15,5 +15,7 @@ uint32 GetUnionOfArticulatedRefitMasks(EngineID engine, VehicleType type, bool i
uint32 GetIntersectionOfArticulatedRefitMasks(EngineID engine, VehicleType type, bool include_initial_cargo_type);
bool IsArticulatedVehicleCarryingDifferentCargos(const Vehicle *v, CargoID *cargo_type);
bool IsArticulatedVehicleRefittable(EngineID engine);
void CheckConsistencyOfArticulatedVehicle(const Vehicle *v);
#endif /* ARTICULATED_VEHICLES_H */

View File

@@ -342,7 +342,6 @@ static CommandCost CopyHeadSpecificThings(Vehicle *old_head, Vehicle *new_head,
/** Replace a single unit in a free wagon chain
* @param single_unit vehicle to let autoreplace/renew operator on
* @param flags command flags
* @param wagon_removal remove wagons when the resulting chain occupies more tiles than the old did
* @param nothing_to_do is set to 'false' when something was done (only valid when not failed)
* @return cost or error
*/
@@ -514,7 +513,7 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
*chain = new_head;
}
/* Transfer cargo of old vehicles and sell them*/
/* Transfer cargo of old vehicles and sell them */
for (int i = 0; i < num_units; i++) {
Vehicle *w = old_vehs[i];
/* Is the vehicle again part of the new chain?
@@ -523,7 +522,10 @@ static CommandCost ReplaceChain(Vehicle **chain, DoCommandFlag flags, bool wagon
if ((flags & DC_EXEC) != 0) TransferCargo(w, new_head, true);
cost.AddCost(DoCommand(0, w->index, 0, flags, GetCmdSellVeh(w)));
/* Sell the vehicle.
* Note: This might temporarly construct new trains, so use DC_AUTOREPLACE to prevent
* it from failing due to engine limits. */
cost.AddCost(DoCommand(0, w->index, 0, flags | DC_AUTOREPLACE, GetCmdSellVeh(w)));
if ((flags & DC_EXEC) != 0) {
old_vehs[i] = NULL;
if (i == 0) old_head = NULL;

View File

@@ -207,7 +207,7 @@ public:
if (vehicletype == VEH_TRAIN) {
this->wagon_btnstate = true;
/* The train window is bigger so we will move some of the widgets to fit the new size.
* We will start by moving the resize button to the lower right corner. */
* We will start by moving the resize button to the lower right corner. */
widget[RVW_WIDGET_RESIZE].top = widget[RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE].top;
widget[RVW_WIDGET_RESIZE].bottom = widget[RVW_WIDGET_TRAIN_ENGINEWAGON_TOGGLE].bottom;
widget[RVW_WIDGET_STOP_REPLACE].right = widget[RVW_WIDGET_RESIZE].right;
@@ -342,7 +342,7 @@ public:
this->SetDirty();
break;
case RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN: { /* Railtype selection dropdown menu */
case RVW_WIDGET_TRAIN_RAILTYPE_DROPDOWN: { // Railtype selection dropdown menu
const Company *c = GetCompany(_local_company);
DropDownList *list = new DropDownList();
for (RailType rt = RAILTYPE_BEGIN; rt != RAILTYPE_END; rt++) {
@@ -355,18 +355,18 @@ public:
break;
}
case RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE: /* toggle renew_keep_length */
case RVW_WIDGET_TRAIN_WAGONREMOVE_TOGGLE: // toggle renew_keep_length
DoCommandP(0, 5, GetCompany(_local_company)->renew_keep_length ? 0 : 1, CMD_SET_AUTOREPLACE);
break;
case RVW_WIDGET_START_REPLACE: { /* Start replacing */
case RVW_WIDGET_START_REPLACE: { // Start replacing
EngineID veh_from = this->sel_engine[0];
EngineID veh_to = this->sel_engine[1];
DoCommandP(0, 3 + (this->sel_group << 16) , veh_from + (veh_to << 16), CMD_SET_AUTOREPLACE);
this->SetDirty();
} break;
case RVW_WIDGET_STOP_REPLACE: { /* Stop replacing */
case RVW_WIDGET_STOP_REPLACE: { // Stop replacing
EngineID veh_from = this->sel_engine[0];
DoCommandP(0, 3 + (this->sel_group << 16), veh_from + (INVALID_ENGINE << 16), CMD_SET_AUTOREPLACE);
this->SetDirty();
@@ -421,12 +421,12 @@ public:
if (delta.x != 0) {
/* We changed the width of the window so we have to resize the lists.
* Because ResizeButtons() makes each widget the same size it can't be used on the lists
* because then the lists would have the same size as the scrollbars.
* Instead we use it on the detail panels.
* Afterwards we use the new location of the detail panels (the middle of the window)
* to place the lists.
* This way the lists will have equal size while keeping the width of the scrollbars unchanged. */
* Because ResizeButtons() makes each widget the same size it can't be used on the lists
* because then the lists would have the same size as the scrollbars.
* Instead we use it on the detail panels.
* Afterwards we use the new location of the detail panels (the middle of the window)
* to place the lists.
* This way the lists will have equal size while keeping the width of the scrollbars unchanged. */
ResizeButtons(this, RVW_WIDGET_LEFT_DETAILS, RVW_WIDGET_RIGHT_DETAILS);
widget[RVW_WIDGET_RIGHT_MATRIX].left = widget[RVW_WIDGET_RIGHT_DETAILS].left;
widget[RVW_WIDGET_LEFT_SCROLLBAR].right = widget[RVW_WIDGET_LEFT_DETAILS].right;
@@ -470,19 +470,19 @@ static const Widget _replace_vehicle_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _replace_rail_vehicle_desc = {
static const WindowDesc _replace_rail_vehicle_desc(
WDP_AUTO, WDP_AUTO, 456, 140, 456, 140,
WC_REPLACE_VEHICLE, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE | WDF_CONSTRUCTION,
_replace_vehicle_widgets,
};
_replace_vehicle_widgets
);
static const WindowDesc _replace_vehicle_desc = {
static const WindowDesc _replace_vehicle_desc(
WDP_AUTO, WDP_AUTO, 456, 118, 456, 118,
WC_REPLACE_VEHICLE, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE | WDF_CONSTRUCTION,
_replace_vehicle_widgets,
};
_replace_vehicle_widgets
);
RailType ReplaceVehicleWindow::sel_railtype = RAILTYPE_RAIL;

View File

@@ -25,36 +25,36 @@
int _aystar_stats_open_size;
int _aystar_stats_closed_size;
// This looks in the Hash if a node exists in ClosedList
// If so, it returns the PathNode, else NULL
/* This looks in the Hash if a node exists in ClosedList
* If so, it returns the PathNode, else NULL */
static PathNode *AyStarMain_ClosedList_IsInList(AyStar *aystar, const AyStarNode *node)
{
return (PathNode*)Hash_Get(&aystar->ClosedListHash, node->tile, node->direction);
}
// This adds a node to the ClosedList
// It makes a copy of the data
/* This adds a node to the ClosedList
* It makes a copy of the data */
static void AyStarMain_ClosedList_Add(AyStar *aystar, const PathNode *node)
{
// Add a node to the ClosedList
/* Add a node to the ClosedList */
PathNode *new_node = MallocT<PathNode>(1);
*new_node = *node;
Hash_Set(&aystar->ClosedListHash, node->node.tile, node->node.direction, new_node);
}
// Checks if a node is in the OpenList
// If so, it returns the OpenListNode, else NULL
/* Checks if a node is in the OpenList
* If so, it returns the OpenListNode, else NULL */
static OpenListNode *AyStarMain_OpenList_IsInList(AyStar *aystar, const AyStarNode *node)
{
return (OpenListNode*)Hash_Get(&aystar->OpenListHash, node->tile, node->direction);
}
// Gets the best node from OpenList
// returns the best node, or NULL of none is found
// Also it deletes the node from the OpenList
/* Gets the best node from OpenList
* returns the best node, or NULL of none is found
* Also it deletes the node from the OpenList */
static OpenListNode *AyStarMain_OpenList_Pop(AyStar *aystar)
{
// Return the item the Queue returns.. the best next OpenList item.
/* Return the item the Queue returns.. the best next OpenList item. */
OpenListNode *res = (OpenListNode*)aystar->OpenListQueue.pop(&aystar->OpenListQueue);
if (res != NULL) {
Hash_Delete(&aystar->OpenListHash, res->path.node.tile, res->path.node.direction);
@@ -63,18 +63,18 @@ static OpenListNode *AyStarMain_OpenList_Pop(AyStar *aystar)
return res;
}
// Adds a node to the OpenList
// It makes a copy of node, and puts the pointer of parent in the struct
/* Adds a node to the OpenList
* It makes a copy of node, and puts the pointer of parent in the struct */
static void AyStarMain_OpenList_Add(AyStar *aystar, PathNode *parent, const AyStarNode *node, int f, int g)
{
// Add a new Node to the OpenList
/* Add a new Node to the OpenList */
OpenListNode *new_node = MallocT<OpenListNode>(1);
new_node->g = g;
new_node->path.parent = parent;
new_node->path.node = *node;
Hash_Set(&aystar->OpenListHash, node->tile, node->direction, new_node);
// Add it to the queue
/* Add it to the queue */
aystar->OpenListQueue.push(&aystar->OpenListQueue, new_node, f);
}
@@ -89,49 +89,49 @@ int AyStarMain_CheckTile(AyStar *aystar, AyStarNode *current, OpenListNode *pare
PathNode *closedlist_parent;
OpenListNode *check;
// Check the new node against the ClosedList
/* Check the new node against the ClosedList */
if (AyStarMain_ClosedList_IsInList(aystar, current) != NULL) return AYSTAR_DONE;
// Calculate the G-value for this node
/* Calculate the G-value for this node */
new_g = aystar->CalculateG(aystar, current, parent);
// If the value was INVALID_NODE, we don't do anything with this node
/* If the value was INVALID_NODE, we don't do anything with this node */
if (new_g == AYSTAR_INVALID_NODE) return AYSTAR_DONE;
// There should not be given any other error-code..
/* There should not be given any other error-code.. */
assert(new_g >= 0);
// Add the parent g-value to the new g-value
/* Add the parent g-value to the new g-value */
new_g += parent->g;
if (aystar->max_path_cost != 0 && (uint)new_g > aystar->max_path_cost) return AYSTAR_DONE;
// Calculate the h-value
/* Calculate the h-value */
new_h = aystar->CalculateH(aystar, current, parent);
// There should not be given any error-code..
/* There should not be given any error-code.. */
assert(new_h >= 0);
// The f-value if g + h
/* The f-value if g + h */
new_f = new_g + new_h;
// Get the pointer to the parent in the ClosedList (the currentone is to a copy of the one in the OpenList)
/* Get the pointer to the parent in the ClosedList (the currentone is to a copy of the one in the OpenList) */
closedlist_parent = AyStarMain_ClosedList_IsInList(aystar, &parent->path.node);
// Check if this item is already in the OpenList
/* Check if this item is already in the OpenList */
check = AyStarMain_OpenList_IsInList(aystar, current);
if (check != NULL) {
uint i;
// Yes, check if this g value is lower..
/* Yes, check if this g value is lower.. */
if (new_g > check->g) return AYSTAR_DONE;
aystar->OpenListQueue.del(&aystar->OpenListQueue, check, 0);
// It is lower, so change it to this item
/* It is lower, so change it to this item */
check->g = new_g;
check->path.parent = closedlist_parent;
/* Copy user data, will probably have changed */
for (i = 0; i < lengthof(current->user_data); i++) {
check->path.node.user_data[i] = current->user_data[i];
}
// Readd him in the OpenListQueue
/* Readd him in the OpenListQueue */
aystar->OpenListQueue.push(&aystar->OpenListQueue, check, new_f);
} else {
// A new node, add him to the OpenList
/* A new node, add him to the OpenList */
AyStarMain_OpenList_Add(aystar, closedlist_parent, current, new_f, new_g);
}
@@ -153,12 +153,12 @@ int AyStarMain_Loop(AyStar *aystar)
{
int i, r;
// Get the best node from OpenList
/* Get the best node from OpenList */
OpenListNode *current = AyStarMain_OpenList_Pop(aystar);
// If empty, drop an error
/* If empty, drop an error */
if (current == NULL) return AYSTAR_EMPTY_OPENLIST;
// Check for end node and if found, return that code
/* Check for end node and if found, return that code */
if (aystar->EndNodeCheck(aystar, current) == AYSTAR_FOUND_END_NODE) {
if (aystar->FoundEndNode != NULL)
aystar->FoundEndNode(aystar, current);
@@ -166,26 +166,26 @@ int AyStarMain_Loop(AyStar *aystar)
return AYSTAR_FOUND_END_NODE;
}
// Add the node to the ClosedList
/* Add the node to the ClosedList */
AyStarMain_ClosedList_Add(aystar, &current->path);
// Load the neighbours
/* Load the neighbours */
aystar->GetNeighbours(aystar, current);
// Go through all neighbours
/* Go through all neighbours */
for (i = 0; i < aystar->num_neighbours; i++) {
// Check and add them to the OpenList if needed
/* Check and add them to the OpenList if needed */
r = aystar->checktile(aystar, &aystar->neighbours[i], current);
}
// Free the node
/* Free the node */
free(current);
if (aystar->max_search_nodes != 0 && Hash_Size(&aystar->ClosedListHash) >= aystar->max_search_nodes) {
/* We've expanded enough nodes */
return AYSTAR_LIMIT_REACHED;
} else {
// Return that we are still busy
/* Return that we are still busy */
return AYSTAR_STILL_BUSY;
}
}
@@ -211,10 +211,10 @@ void AyStarMain_Free(AyStar *aystar)
*/
void AyStarMain_Clear(AyStar *aystar)
{
// Clean the Queue, but not the elements within. That will be done by
// the hash.
/* Clean the Queue, but not the elements within. That will be done by
* the hash. */
aystar->OpenListQueue.clear(&aystar->OpenListQueue, false);
// Clean the hashes
/* Clean the hashes */
clear_Hash(&aystar->OpenListHash, true);
clear_Hash(&aystar->ClosedListHash, true);
@@ -235,8 +235,8 @@ void AyStarMain_Clear(AyStar *aystar)
*/
int AyStarMain_Main(AyStar *aystar) {
int r, i = 0;
// Loop through the OpenList
// Quit if result is no AYSTAR_STILL_BUSY or is more than loops_per_tick
/* Loop through the OpenList
* Quit if result is no AYSTAR_STILL_BUSY or is more than loops_per_tick */
while ((r = aystar->loop(aystar)) == AYSTAR_STILL_BUSY && (aystar->loops_per_tick == 0 || ++i < aystar->loops_per_tick)) { }
#ifdef AYSTAR_DEBUG
switch (r) {
@@ -279,14 +279,14 @@ void AyStarMain_AddStartNode(AyStar *aystar, AyStarNode *start_node, uint g)
void init_AyStar(AyStar *aystar, Hash_HashProc hash, uint num_buckets)
{
// Allocated the Hash for the OpenList and ClosedList
/* Allocated the Hash for the OpenList and ClosedList */
init_Hash(&aystar->OpenListHash, hash, num_buckets);
init_Hash(&aystar->ClosedListHash, hash, num_buckets);
// Set up our sorting queue
// BinaryHeap allocates a block of 1024 nodes
// When thatone gets full it reserves an otherone, till this number
// That is why it can stay this high
/* Set up our sorting queue
* BinaryHeap allocates a block of 1024 nodes
* When thatone gets full it reserves an otherone, till this number
* That is why it can stay this high */
init_BinaryHeap(&aystar->OpenListQueue, 102400);
aystar->addstart = AyStarMain_AddStartNode;

View File

@@ -35,16 +35,16 @@ struct AyStarNode {
uint user_data[2];
};
// The resulting path has nodes looking like this.
/* The resulting path has nodes looking like this. */
struct PathNode {
AyStarNode node;
// The parent of this item
/* The parent of this item */
PathNode *parent;
};
// For internal use only
// We do not save the h-value, because it is only needed to calculate the f-value.
// h-value should _always_ be the distance left to the end-tile.
/* For internal use only
* We do not save the h-value, because it is only needed to calculate the f-value.
* h-value should _always_ be the distance left to the end-tile. */
struct OpenListNode {
int g;
PathNode path;
@@ -97,7 +97,7 @@ typedef void AyStar_GetNeighbours(AyStar *aystar, OpenListNode *current);
*/
typedef void AyStar_FoundEndNode(AyStar *aystar, OpenListNode *current);
// For internal use, see aystar.c
/* For internal use, see aystar.cpp */
typedef void AyStar_AddStartNode(AyStar *aystar, AyStarNode *start_node, uint g);
typedef int AyStar_Main(AyStar *aystar);
typedef int AyStar_Loop(AyStar *aystar);

View File

@@ -128,7 +128,7 @@ void Blitter_32bppBase::ScrollBuffer(void *video, int &left, int &top, int &widt
uint32 *dst;
if (scroll_y > 0) {
/*Calculate pointers */
/* Calculate pointers */
dst = (uint32 *)video + left + (top + height - 1) * _screen.pitch;
src = dst - scroll_y * _screen.pitch;

View File

@@ -97,12 +97,12 @@ public:
}
/**
* Make a pixel looks like it is transparent.
* @param colour the colour already on the screen.
* @param nom the amount of transparency, nominator, makes colour lighter.
* @param denom denominator, makes colour darker.
* @return the new colour for the screen.
*/
* Make a pixel looks like it is transparent.
* @param colour the colour already on the screen.
* @param nom the amount of transparency, nominator, makes colour lighter.
* @param denom denominator, makes colour darker.
* @return the new colour for the screen.
*/
static inline uint32 MakeTransparent(uint32 colour, uint nom, uint denom = 256)
{
uint r = GB(colour, 16, 8);
@@ -113,10 +113,10 @@ public:
}
/**
* Make a colour grey - based.
* @param colour the colour to make grey.
* @return the new colour, now grey.
*/
* Make a colour grey - based.
* @param colour the colour to make grey.
* @return the new colour, now grey.
*/
static inline uint32 MakeGrey(uint32 colour)
{
uint r = GB(colour, 16, 8);
@@ -124,8 +124,8 @@ public:
uint b = GB(colour, 0, 8);
/* To avoid doubles and stuff, multiple it with a total of 65536 (16bits), then
* divide by it to normalize the value to a byte again. See heightmap.cpp for
* information about the formula. */
* divide by it to normalize the value to a byte again. See heightmap.cpp for
* information about the formula. */
colour = ((r * 19595) + (g * 38470) + (b * 7471)) / 65536;
return ComposeColour(0xFF, colour, colour, colour);

View File

@@ -132,7 +132,7 @@ void Blitter_8bppBase::ScrollBuffer(void *video, int &left, int &top, int &width
uint8 *dst;
if (scroll_y > 0) {
/*Calculate pointers */
/* Calculate pointers */
dst = (uint8 *)video + left + (top + height - 1) * _screen.pitch;
src = dst - scroll_y * _screen.pitch;

View File

@@ -67,7 +67,7 @@ private:
/* Constants for sorting the bridges */
static const StringID sorter_names[];
static GUIBridgeList::SortFunction *const sorter_funcs[];
static GUIBridgeList::SortFunction * const sorter_funcs[];
/* Internal variables */
TileIndex start_tile;
@@ -268,12 +268,12 @@ static const Widget _build_bridge_widgets[] = {
};
/* Window definition for the rail bridge selection window */
static const WindowDesc _build_bridge_desc = {
static const WindowDesc _build_bridge_desc(
WDP_AUTO, WDP_AUTO, 200, 114, 200, 114,
WC_BUILD_BRIDGE, WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_RESIZABLE | WDF_CONSTRUCTION,
_build_bridge_widgets,
};
_build_bridge_widgets
);
/**
* Prepare the data for the build a bridge window.

View File

@@ -55,6 +55,7 @@ static const Widget _build_vehicle_widgets[] = {
{ WIDGETS_END},
};
static bool _internal_sort_order; // descending/ascending
static byte _last_sort_criteria[] = {0, 0, 0, 0};
static bool _last_sort_order[] = {false, false, false, false};
@@ -74,10 +75,8 @@ static int CDECL EngineIntroDateSorter(const void *a, const void *b)
const int vb = GetEngine(*(const EngineID*)b)->intro_date;
const int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
@@ -88,7 +87,6 @@ static int CDECL EngineNameSorter(const void *a, const void *b)
const EngineID va = *(const EngineID*)a;
const EngineID vb = *(const EngineID*)b;
int r;
if (va != last_engine[0]) {
last_engine[0] = va;
@@ -102,12 +100,10 @@ static int CDECL EngineNameSorter(const void *a, const void *b)
GetString(last_name[1], STR_ENGINE_NAME, lastof(last_name[1]));
}
r = strcmp(last_name[0], last_name[1]); // sort by name
int r = strcmp(last_name[0], last_name[1]); // sort by name
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
@@ -117,68 +113,73 @@ static int CDECL EngineReliabilitySorter(const void *a, const void *b)
const int vb = GetEngine(*(const EngineID*)b)->reliability;
const int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
/* Train sorting functions */
static int CDECL TrainEngineCostSorter(const void *a, const void *b)
static int CDECL EngineCostSorter(const void *a, const void *b)
{
int va = RailVehInfo(*(const EngineID*)a)->cost_factor;
int vb = RailVehInfo(*(const EngineID*)b)->cost_factor;
Money va = GetEngine(*(const EngineID*)a)->GetCost();
Money vb = GetEngine(*(const EngineID*)b)->GetCost();
int r = ClampToI32(va - vb);
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
static int CDECL EngineSpeedSorter(const void *a, const void *b)
{
int va = GetEngine(*(const EngineID*)a)->GetDisplayMaxSpeed();
int vb = GetEngine(*(const EngineID*)b)->GetDisplayMaxSpeed();
int r = va - vb;
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
static int CDECL TrainEngineSpeedSorter(const void *a, const void *b)
static int CDECL EnginePowerSorter(const void *a, const void *b)
{
int va = RailVehInfo(*(const EngineID*)a)->max_speed;
int vb = RailVehInfo(*(const EngineID*)b)->max_speed;
int va = GetEngine(*(const EngineID*)a)->GetPower();
int vb = GetEngine(*(const EngineID*)b)->GetPower();
int r = va - vb;
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
static int CDECL TrainEnginePowerSorter(const void *a, const void *b)
{
const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
int va = rvi_a->power;
int vb = rvi_b->power;
int r = va - vb;
return _internal_sort_order ? -r : r;
}
static int CDECL TrainEngineRunningCostSorter(const void *a, const void *b)
static int CDECL EngineRunningCostSorter(const void *a, const void *b)
{
Money va = GetEngine(*(const EngineID*)a)->GetRunningCost();
Money vb = GetEngine(*(const EngineID*)b)->GetRunningCost();
int r = ClampToI32(va - vb);
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
/* Train sorting functions */
static int CDECL TrainEnginePowerVsRunningCostSorter(const void *a, const void *b)
{
const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
const Engine *e_a = GetEngine(*(const EngineID*)a);
const Engine *e_b = GetEngine(*(const EngineID*)b);
/* Here we are using a few tricks to get the right sort.
* We want power/running cost, but since we usually got higher running cost than power and we store the result in an int,
* we will actually calculate cunning cost/power (to make it more than 1).
* Because of this, the return value have to be reversed as well and we return b - a instead of a - b.
* Another thing is that both power and running costs should be doubled for multiheaded engines.
* Since it would be multipling with 2 in both numerator and denumerator, it will even themselves out and we skip checking for multiheaded. */
Money va = (GetEngine(*(const EngineID*)a)->GetRunningCost()) / max(1U, (uint)rvi_a->power);
Money vb = (GetEngine(*(const EngineID*)b)->GetRunningCost()) / max(1U, (uint)rvi_b->power);
* We want power/running cost, but since we usually got higher running cost than power and we store the result in an int,
* we will actually calculate cunning cost/power (to make it more than 1).
* Because of this, the return value have to be reversed as well and we return b - a instead of a - b.
* Another thing is that both power and running costs should be doubled for multiheaded engines.
* Since it would be multipling with 2 in both numerator and denumerator, it will even themselves out and we skip checking for multiheaded. */
Money va = (e_a->GetRunningCost()) / max(1U, (uint)e_a->GetPower());
Money vb = (e_b->GetRunningCost()) / max(1U, (uint)e_b->GetPower());
int r = ClampToI32(vb - va);
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
@@ -187,14 +188,12 @@ static int CDECL TrainEngineCapacitySorter(const void *a, const void *b)
const RailVehicleInfo *rvi_a = RailVehInfo(*(const EngineID*)a);
const RailVehicleInfo *rvi_b = RailVehInfo(*(const EngineID*)b);
int va = rvi_a->capacity * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
int vb = rvi_b->capacity * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
int va = GetTotalCapacityOfArticulatedParts(*(const EngineID*)a, VEH_TRAIN) * (rvi_a->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
int vb = GetTotalCapacityOfArticulatedParts(*(const EngineID*)b, VEH_TRAIN) * (rvi_b->railveh_type == RAILVEH_MULTIHEAD ? 2 : 1);
int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
@@ -208,141 +207,44 @@ static int CDECL TrainEnginesThenWagonsSorter(const void *a, const void *b)
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
/* Road vehicle sorting functions */
static int CDECL RoadVehEngineCostSorter(const void *a, const void *b)
{
int va = RoadVehInfo(*(const EngineID*)a)->cost_factor;
int vb = RoadVehInfo(*(const EngineID*)b)->cost_factor;
int r = va - vb;
return _internal_sort_order ? -r : r;
}
static int CDECL RoadVehEngineSpeedSorter(const void *a, const void *b)
{
int va = RoadVehInfo(*(const EngineID*)a)->max_speed;
int vb = RoadVehInfo(*(const EngineID*)b)->max_speed;
int r = va - vb;
return _internal_sort_order ? -r : r;
}
static int CDECL RoadVehEngineRunningCostSorter(const void *a, const void *b)
{
Money va = GetEngine(*(const EngineID*)a)->GetRunningCost();
Money vb = GetEngine(*(const EngineID*)b)->GetRunningCost();
int r = ClampToI32(va - vb);
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
return _internal_sort_order ? -r : r;
}
static int CDECL RoadVehEngineCapacitySorter(const void *a, const void *b)
{
int va = RoadVehInfo(*(const EngineID*)a)->capacity;
int vb = RoadVehInfo(*(const EngineID*)b)->capacity;
int va = GetTotalCapacityOfArticulatedParts(*(const EngineID*)a, VEH_ROAD);
int vb = GetTotalCapacityOfArticulatedParts(*(const EngineID*)b, VEH_ROAD);
int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
return _internal_sort_order ? -r : r;
}
/* Road vehicle sorting functions */
static int CDECL ShipEngineCostSorter(const void *a, const void *b)
{
int va = ShipVehInfo(*(const EngineID*)a)->cost_factor;
int vb = ShipVehInfo(*(const EngineID*)b)->cost_factor;
int r = va - vb;
return _internal_sort_order ? -r : r;
}
static int CDECL ShipEngineSpeedSorter(const void *a, const void *b)
{
int va = ShipVehInfo(*(const EngineID*)a)->max_speed;
int vb = ShipVehInfo(*(const EngineID*)b)->max_speed;
int r = va - vb;
return _internal_sort_order ? -r : r;
}
static int CDECL ShipEngineRunningCostSorter(const void *a, const void *b)
{
const int va = GetEngine(*(const EngineID*)a)->GetRunningCost();
const int vb = GetEngine(*(const EngineID*)b)->GetRunningCost();
const int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
/* Ship vehicle sorting functions */
static int CDECL ShipEngineCapacitySorter(const void *a, const void *b)
{
int va = ShipVehInfo(*(const EngineID*)a)->capacity;
int vb = ShipVehInfo(*(const EngineID*)b)->capacity;
const Engine *e_a = GetEngine(*(const EngineID*)a);
const Engine *e_b = GetEngine(*(const EngineID*)b);
int va = e_a->GetDisplayDefaultCapacity();
int vb = e_b->GetDisplayDefaultCapacity();
int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
/* Use EngineID to sort instead since we want consistent sorting */
if (r == 0) return EngineNumberSorter(a, b);
return _internal_sort_order ? -r : r;
}
/* Aircraft sorting functions */
static int CDECL AircraftEngineCostSorter(const void *a, const void *b)
{
const int va = AircraftVehInfo(*(const EngineID*)a)->cost_factor;
const int vb = AircraftVehInfo(*(const EngineID*)b)->cost_factor;
int r = va - vb;
return _internal_sort_order ? -r : r;
}
static int CDECL AircraftEngineSpeedSorter(const void *a, const void *b)
{
const int va = AircraftVehInfo(*(const EngineID*)a)->max_speed;
const int vb = AircraftVehInfo(*(const EngineID*)b)->max_speed;
const int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
return _internal_sort_order ? -r : r;
}
static int CDECL AircraftEngineRunningCostSorter(const void *a, const void *b)
{
const int va = GetEngine(*(const EngineID*)a)->GetRunningCost();
const int vb = GetEngine(*(const EngineID*)b)->GetRunningCost();
const int r = va - vb;
if (r == 0) {
/* Use EngineID to sort instead since we want consistent sorting */
return EngineNumberSorter(a, b);
}
return _internal_sort_order ? -r : r;
}
static int CDECL AircraftEngineCargoSorter(const void *a, const void *b)
{
int va = AircraftVehInfo(*(const EngineID*)a)->passenger_capacity;
int vb = AircraftVehInfo(*(const EngineID*)b)->passenger_capacity;
const Engine *e_a = GetEngine(*(const EngineID*)a);
const Engine *e_b = GetEngine(*(const EngineID*)b);
int va = e_a->GetDisplayDefaultCapacity();
int vb = e_b->GetDisplayDefaultCapacity();
int r = va - vb;
if (r == 0) {
@@ -362,43 +264,43 @@ static int CDECL AircraftEngineCargoSorter(const void *a, const void *b)
static EngList_SortTypeFunction * const _sorter[][10] = {{
/* Trains */
&EngineNumberSorter,
&TrainEngineCostSorter,
&TrainEngineSpeedSorter,
&TrainEnginePowerSorter,
&EngineCostSorter,
&EngineSpeedSorter,
&EnginePowerSorter,
&EngineIntroDateSorter,
&EngineNameSorter,
&TrainEngineRunningCostSorter,
&EngineRunningCostSorter,
&TrainEnginePowerVsRunningCostSorter,
&EngineReliabilitySorter,
&TrainEngineCapacitySorter,
}, {
/* Road vehicles */
&EngineNumberSorter,
&RoadVehEngineCostSorter,
&RoadVehEngineSpeedSorter,
&EngineCostSorter,
&EngineSpeedSorter,
&EngineIntroDateSorter,
&EngineNameSorter,
&RoadVehEngineRunningCostSorter,
&EngineRunningCostSorter,
&EngineReliabilitySorter,
&RoadVehEngineCapacitySorter,
}, {
/* Ships */
&EngineNumberSorter,
&ShipEngineCostSorter,
&ShipEngineSpeedSorter,
&EngineCostSorter,
&EngineSpeedSorter,
&EngineIntroDateSorter,
&EngineNameSorter,
&ShipEngineRunningCostSorter,
&EngineRunningCostSorter,
&EngineReliabilitySorter,
&ShipEngineCapacitySorter,
}, {
/* Aircraft */
&EngineNumberSorter,
&AircraftEngineCostSorter,
&AircraftEngineSpeedSorter,
&EngineCostSorter,
&EngineSpeedSorter,
&EngineIntroDateSorter,
&EngineNameSorter,
&AircraftEngineRunningCostSorter,
&EngineRunningCostSorter,
&EngineReliabilitySorter,
&AircraftEngineCargoSorter,
}};
@@ -484,7 +386,7 @@ static int DrawRailWagonPurchaseInfo(int x, int y, EngineID engine_number, const
/* Wagon weight - (including cargo) */
uint weight = e->GetDisplayWeight();
SetDParam(0, weight);
uint cargo_weight = (e->CanCarryCargo() ? GetCargo(e->GetDefaultCargoType())->weight * GetEngineProperty(engine_number, 0x14, rvi->capacity) >> 4 : 0);
uint cargo_weight = (e->CanCarryCargo() ? GetCargo(e->GetDefaultCargoType())->weight * e->GetDisplayDefaultCapacity() >> 4 : 0);
SetDParam(1, cargo_weight + weight);
DrawString(x, y, STR_PURCHASE_INFO_WEIGHT_CWEIGHT, TC_FROMSTRING);
y += 10;
@@ -583,7 +485,7 @@ static int DrawShipPurchaseInfo(int x, int y, EngineID engine_number, const Ship
/* Cargo type + capacity */
SetDParam(0, e->GetDefaultCargoType());
SetDParam(1, GetEngineProperty(engine_number, 0x0D, svi->capacity));
SetDParam(1, e->GetDisplayDefaultCapacity());
SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
y += 10;
@@ -610,14 +512,14 @@ static int DrawAircraftPurchaseInfo(int x, int y, EngineID engine_number, const
/* Cargo capacity */
if (cargo == CT_INVALID || cargo == CT_PASSENGERS) {
SetDParam(0, avi->passenger_capacity);
SetDParam(0, e->GetDisplayDefaultCapacity());
SetDParam(1, avi->mail_capacity);
DrawString(x, y, STR_PURCHASE_INFO_AIRCRAFT_CAPACITY, TC_FROMSTRING);
} else {
/* Note, if the default capacity is selected by the refit capacity
* callback, then the capacity shown is likely to be incorrect. */
* callback, then the capacity shown is likely to be incorrect. */
SetDParam(0, cargo);
SetDParam(1, AircraftDefaultCargoCapacity(cargo, avi));
SetDParam(1, e->GetDisplayDefaultCapacity());
SetDParam(2, refittable ? STR_9842_REFITTABLE : STR_EMPTY);
DrawString(x, y, STR_PURCHASE_INFO_CAPACITY, TC_FROMSTRING);
}
@@ -910,9 +812,9 @@ struct BuildVehicleWindow : Window {
this->eng_list.Clear();
/* Make list of all available train engines and wagons.
* Also check to see if the previously selected engine is still available,
* and if not, reset selection to INVALID_ENGINE. This could be the case
* when engines become obsolete and are removed */
* Also check to see if the previously selected engine is still available,
* and if not, reset selection to INVALID_ENGINE. This could be the case
* when engines become obsolete and are removed */
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_TRAIN) {
EngineID eid = e->index;
@@ -992,9 +894,9 @@ struct BuildVehicleWindow : Window {
const Station *st = this->listview_mode ? NULL : GetStationByTile(this->window_number);
/* Make list of all available planes.
* Also check to see if the previously selected plane is still available,
* and if not, reset selection to INVALID_ENGINE. This could be the case
* when planes become obsolete and are removed */
* Also check to see if the previously selected plane is still available,
* and if not, reset selection to INVALID_ENGINE. This could be the case
* when planes become obsolete and are removed */
const Engine *e;
FOR_ALL_ENGINES_OF_TYPE(e, VEH_AIRCRAFT) {
EngineID eid = e->index;
@@ -1188,12 +1090,12 @@ struct BuildVehicleWindow : Window {
}
};
static const WindowDesc _build_vehicle_desc = {
static const WindowDesc _build_vehicle_desc(
WDP_AUTO, WDP_AUTO, 240, 174, 240, 256,
WC_BUILD_VEHICLE, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_RESIZABLE | WDF_CONSTRUCTION,
_build_vehicle_widgets,
};
_build_vehicle_widgets
);
void ShowBuildVehicleWindow(TileIndex tile, VehicleType type)
{

View File

@@ -235,12 +235,12 @@ struct CheatWindow : Window {
}
};
static const WindowDesc _cheats_desc = {
static const WindowDesc _cheats_desc(
240, 22, 400, 170, 400, 170,
WC_CHEATS, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_cheat_widgets,
};
_cheat_widgets
);
void ShowCheatWindow()

View File

@@ -21,7 +21,7 @@ template<> struct ExtractBits<RoadBits> { static const uint Count = 4; };
template<typename T, uint N, typename U> static inline T Extract(U v)
{
// Check if there are enough bits in v
/* Check if there are enough bits in v */
ExtractValid<N + ExtractBits<T>::Count <= sizeof(U) * 8>();
return (T)GB(v, N, ExtractBits<T>::Count);
}

View File

@@ -201,140 +201,140 @@ DEF_COMMAND(CmdAutofillTimetable);
* as the value from the CMD_* enums.
*/
static const Command _command_proc_table[] = {
{CmdBuildRailroadTrack, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_RAILROAD_TRACK */
{CmdRemoveRailroadTrack, CMD_AUTO}, /* CMD_REMOVE_RAILROAD_TRACK */
{CmdBuildSingleRail, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_SINGLE_RAIL */
{CmdRemoveSingleRail, CMD_AUTO}, /* CMD_REMOVE_SINGLE_RAIL */
{CmdLandscapeClear, 0}, /* CMD_LANDSCAPE_CLEAR */
{CmdBuildBridge, CMD_AUTO}, /* CMD_BUILD_BRIDGE */
{CmdBuildRailroadStation, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_RAILROAD_STATION */
{CmdBuildTrainDepot, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_TRAIN_DEPOT */
{CmdBuildSingleSignal, CMD_AUTO}, /* CMD_BUILD_SIGNALS */
{CmdRemoveSingleSignal, CMD_AUTO}, /* CMD_REMOVE_SIGNALS */
{CmdTerraformLand, CMD_ALL_TILES | CMD_AUTO}, /* CMD_TERRAFORM_LAND */
{CmdPurchaseLandArea, CMD_NO_WATER | CMD_AUTO}, /* CMD_PURCHASE_LAND_AREA */
{CmdSellLandArea, 0}, /* CMD_SELL_LAND_AREA */
{CmdBuildTunnel, CMD_AUTO}, /* CMD_BUILD_TUNNEL */
{CmdRemoveFromRailroadStation, 0}, /* CMD_REMOVE_FROM_RAILROAD_STATION */
{CmdConvertRail, 0}, /* CMD_CONVERT_RAILD */
{CmdBuildTrainWaypoint, 0}, /* CMD_BUILD_TRAIN_WAYPOINT */
{CmdRenameWaypoint, 0}, /* CMD_RENAME_WAYPOINT */
{CmdRemoveTrainWaypoint, 0}, /* CMD_REMOVE_TRAIN_WAYPOINT */
{CmdBuildRailroadTrack, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_RAILROAD_TRACK
{CmdRemoveRailroadTrack, CMD_AUTO}, // CMD_REMOVE_RAILROAD_TRACK
{CmdBuildSingleRail, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_SINGLE_RAIL
{CmdRemoveSingleRail, CMD_AUTO}, // CMD_REMOVE_SINGLE_RAIL
{CmdLandscapeClear, 0}, // CMD_LANDSCAPE_CLEAR
{CmdBuildBridge, CMD_AUTO}, // CMD_BUILD_BRIDGE
{CmdBuildRailroadStation, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_RAILROAD_STATION
{CmdBuildTrainDepot, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_TRAIN_DEPOT
{CmdBuildSingleSignal, CMD_AUTO}, // CMD_BUILD_SIGNALS
{CmdRemoveSingleSignal, CMD_AUTO}, // CMD_REMOVE_SIGNALS
{CmdTerraformLand, CMD_ALL_TILES | CMD_AUTO}, // CMD_TERRAFORM_LAND
{CmdPurchaseLandArea, CMD_NO_WATER | CMD_AUTO}, // CMD_PURCHASE_LAND_AREA
{CmdSellLandArea, 0}, // CMD_SELL_LAND_AREA
{CmdBuildTunnel, CMD_AUTO}, // CMD_BUILD_TUNNEL
{CmdRemoveFromRailroadStation, 0}, // CMD_REMOVE_FROM_RAILROAD_STATION
{CmdConvertRail, 0}, // CMD_CONVERT_RAILD
{CmdBuildTrainWaypoint, 0}, // CMD_BUILD_TRAIN_WAYPOINT
{CmdRenameWaypoint, 0}, // CMD_RENAME_WAYPOINT
{CmdRemoveTrainWaypoint, 0}, // CMD_REMOVE_TRAIN_WAYPOINT
{CmdBuildRoadStop, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_ROAD_STOP */
{CmdRemoveRoadStop, 0}, /* CMD_REMOVE_ROAD_STOP */
{CmdBuildLongRoad, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_LONG_ROAD */
{CmdRemoveLongRoad, CMD_NO_TEST | CMD_AUTO}, /* CMD_REMOVE_LONG_ROAD; towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed. */
{CmdBuildRoad, 0}, /* CMD_BUILD_ROAD */
{CmdRemoveRoad, 0}, /* CMD_REMOVE_ROAD */
{CmdBuildRoadDepot, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_ROAD_DEPOT */
{CmdBuildRoadStop, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_ROAD_STOP
{CmdRemoveRoadStop, 0}, // CMD_REMOVE_ROAD_STOP
{CmdBuildLongRoad, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_LONG_ROAD
{CmdRemoveLongRoad, CMD_NO_TEST | CMD_AUTO}, // CMD_REMOVE_LONG_ROAD; towns may disallow removing road bits (as they are connected) in test, but in exec they're removed and thus removing is allowed.
{CmdBuildRoad, 0}, // CMD_BUILD_ROAD
{CmdRemoveRoad, 0}, // CMD_REMOVE_ROAD
{CmdBuildRoadDepot, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_ROAD_DEPOT
{CmdBuildAirport, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_AIRPORT */
{CmdBuildDock, CMD_AUTO}, /* CMD_BUILD_DOCK */
{CmdBuildShipDepot, CMD_AUTO}, /* CMD_BUILD_SHIP_DEPOT */
{CmdBuildBuoy, CMD_AUTO}, /* CMD_BUILD_BUOY */
{CmdPlantTree, CMD_AUTO}, /* CMD_PLANT_TREE */
{CmdBuildRailVehicle, 0}, /* CMD_BUILD_RAIL_VEHICLE */
{CmdMoveRailVehicle, 0}, /* CMD_MOVE_RAIL_VEHICLE */
{CmdBuildAirport, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_AIRPORT
{CmdBuildDock, CMD_AUTO}, // CMD_BUILD_DOCK
{CmdBuildShipDepot, CMD_AUTO}, // CMD_BUILD_SHIP_DEPOT
{CmdBuildBuoy, CMD_AUTO}, // CMD_BUILD_BUOY
{CmdPlantTree, CMD_AUTO}, // CMD_PLANT_TREE
{CmdBuildRailVehicle, 0}, // CMD_BUILD_RAIL_VEHICLE
{CmdMoveRailVehicle, 0}, // CMD_MOVE_RAIL_VEHICLE
{CmdSellRailWagon, 0}, /* CMD_SELL_RAIL_WAGON */
{CmdSendTrainToDepot, 0}, /* CMD_SEND_TRAIN_TO_DEPOT */
{CmdForceTrainProceed, 0}, /* CMD_FORCE_TRAIN_PROCEED */
{CmdReverseTrainDirection, 0}, /* CMD_REVERSE_TRAIN_DIRECTION */
{CmdSellRailWagon, 0}, // CMD_SELL_RAIL_WAGON
{CmdSendTrainToDepot, 0}, // CMD_SEND_TRAIN_TO_DEPOT
{CmdForceTrainProceed, 0}, // CMD_FORCE_TRAIN_PROCEED
{CmdReverseTrainDirection, 0}, // CMD_REVERSE_TRAIN_DIRECTION
{CmdModifyOrder, 0}, /* CMD_MODIFY_ORDER */
{CmdSkipToOrder, 0}, /* CMD_SKIP_TO_ORDER */
{CmdDeleteOrder, 0}, /* CMD_DELETE_ORDER */
{CmdInsertOrder, 0}, /* CMD_INSERT_ORDER */
{CmdModifyOrder, 0}, // CMD_MODIFY_ORDER
{CmdSkipToOrder, 0}, // CMD_SKIP_TO_ORDER
{CmdDeleteOrder, 0}, // CMD_DELETE_ORDER
{CmdInsertOrder, 0}, // CMD_INSERT_ORDER
{CmdChangeServiceInt, 0}, /* CMD_CHANGE_SERVICE_INT */
{CmdChangeServiceInt, 0}, // CMD_CHANGE_SERVICE_INT
{CmdBuildIndustry, 0}, /* CMD_BUILD_INDUSTRY */
{CmdBuildCompanyHQ, CMD_NO_WATER | CMD_AUTO}, /* CMD_BUILD_COMPANY_HQ */
{CmdSetCompanyManagerFace, 0}, /* CMD_SET_COMPANY_MANAGER_FACE */
{CmdSetCompanyColour, 0}, /* CMD_SET_COMPANY_COLOUR */
{CmdBuildIndustry, 0}, // CMD_BUILD_INDUSTRY
{CmdBuildCompanyHQ, CMD_NO_WATER | CMD_AUTO}, // CMD_BUILD_COMPANY_HQ
{CmdSetCompanyManagerFace, 0}, // CMD_SET_COMPANY_MANAGER_FACE
{CmdSetCompanyColour, 0}, // CMD_SET_COMPANY_COLOUR
{CmdIncreaseLoan, 0}, /* CMD_INCREASE_LOAN */
{CmdDecreaseLoan, 0}, /* CMD_DECREASE_LOAN */
{CmdIncreaseLoan, 0}, // CMD_INCREASE_LOAN
{CmdDecreaseLoan, 0}, // CMD_DECREASE_LOAN
{CmdWantEnginePreview, 0}, /* CMD_WANT_ENGINE_PREVIEW */
{CmdWantEnginePreview, 0}, // CMD_WANT_ENGINE_PREVIEW
{CmdRenameVehicle, 0}, /* CMD_RENAME_VEHICLE */
{CmdRenameEngine, 0}, /* CMD_RENAME_ENGINE */
{CmdRenameVehicle, 0}, // CMD_RENAME_VEHICLE
{CmdRenameEngine, 0}, // CMD_RENAME_ENGINE
{CmdRenameCompany, 0}, /* CMD_RENAME_COMPANY */
{CmdRenamePresident, 0}, /* CMD_RENAME_PRESIDENT */
{CmdRenameCompany, 0}, // CMD_RENAME_COMPANY
{CmdRenamePresident, 0}, // CMD_RENAME_PRESIDENT
{CmdRenameStation, 0}, /* CMD_RENAME_STATION */
{CmdRenameStation, 0}, // CMD_RENAME_STATION
{CmdSellAircraft, 0}, /* CMD_SELL_AIRCRAFT */
{CmdSellAircraft, 0}, // CMD_SELL_AIRCRAFT
{CmdBuildAircraft, 0}, /* CMD_BUILD_AIRCRAFT */
{CmdSendAircraftToHangar, 0}, /* CMD_SEND_AIRCRAFT_TO_HANGAR */
{CmdRefitAircraft, 0}, /* CMD_REFIT_AIRCRAFT */
{CmdBuildAircraft, 0}, // CMD_BUILD_AIRCRAFT
{CmdSendAircraftToHangar, 0}, // CMD_SEND_AIRCRAFT_TO_HANGAR
{CmdRefitAircraft, 0}, // CMD_REFIT_AIRCRAFT
{CmdPlaceSign, 0}, /* CMD_PLACE_SIGN */
{CmdRenameSign, 0}, /* CMD_RENAME_SIGN */
{CmdPlaceSign, 0}, // CMD_PLACE_SIGN
{CmdRenameSign, 0}, // CMD_RENAME_SIGN
{CmdBuildRoadVeh, 0}, /* CMD_BUILD_ROAD_VEH */
{CmdSellRoadVeh, 0}, /* CMD_SELL_ROAD_VEH */
{CmdSendRoadVehToDepot, 0}, /* CMD_SEND_ROADVEH_TO_DEPOT */
{CmdTurnRoadVeh, 0}, /* CMD_TURN_ROADVEH */
{CmdRefitRoadVeh, 0}, /* CMD_REFIT_ROAD_VEH */
{CmdBuildRoadVeh, 0}, // CMD_BUILD_ROAD_VEH
{CmdSellRoadVeh, 0}, // CMD_SELL_ROAD_VEH
{CmdSendRoadVehToDepot, 0}, // CMD_SEND_ROADVEH_TO_DEPOT
{CmdTurnRoadVeh, 0}, // CMD_TURN_ROADVEH
{CmdRefitRoadVeh, 0}, // CMD_REFIT_ROAD_VEH
{CmdPause, CMD_SERVER}, /* CMD_PAUSE */
{CmdPause, CMD_SERVER}, // CMD_PAUSE
{CmdBuyShareInCompany, 0}, /* CMD_BUY_SHARE_IN_COMPANY */
{CmdSellShareInCompany, 0}, /* CMD_SELL_SHARE_IN_COMPANY */
{CmdBuyCompany, 0}, /* CMD_BUY_COMANY */
{CmdBuyShareInCompany, 0}, // CMD_BUY_SHARE_IN_COMPANY
{CmdSellShareInCompany, 0}, // CMD_SELL_SHARE_IN_COMPANY
{CmdBuyCompany, 0}, // CMD_BUY_COMANY
{CmdBuildTown, CMD_OFFLINE}, /* CMD_BUILD_TOWN */
{CmdRenameTown, CMD_SERVER}, /* CMD_RENAME_TOWN */
{CmdDoTownAction, 0}, /* CMD_DO_TOWN_ACTION */
{CmdBuildTown, CMD_OFFLINE}, // CMD_BUILD_TOWN
{CmdRenameTown, CMD_SERVER}, // CMD_RENAME_TOWN
{CmdDoTownAction, 0}, // CMD_DO_TOWN_ACTION
{CmdSellShip, 0}, /* CMD_SELL_SHIP */
{CmdBuildShip, 0}, /* CMD_BUILD_SHIP */
{CmdSendShipToDepot, 0}, /* CMD_SEND_SHIP_TO_DEPOT */
{CmdRefitShip, 0}, /* CMD_REFIT_SHIP */
{CmdSellShip, 0}, // CMD_SELL_SHIP
{CmdBuildShip, 0}, // CMD_BUILD_SHIP
{CmdSendShipToDepot, 0}, // CMD_SEND_SHIP_TO_DEPOT
{CmdRefitShip, 0}, // CMD_REFIT_SHIP
{CmdOrderRefit, 0}, /* CMD_ORDER_REFIT */
{CmdCloneOrder, 0}, /* CMD_CLONE_ORDER */
{CmdOrderRefit, 0}, // CMD_ORDER_REFIT
{CmdCloneOrder, 0}, // CMD_CLONE_ORDER
{CmdClearArea, CMD_NO_TEST}, /* CMD_CLEAR_AREA; destroying multi-tile houses makes town rating differ between test and execution */
{CmdClearArea, CMD_NO_TEST}, // CMD_CLEAR_AREA; destroying multi-tile houses makes town rating differ between test and execution
{CmdMoneyCheat, CMD_OFFLINE}, /* CMD_MONEY_CHEAT */
{CmdBuildCanal, CMD_AUTO}, /* CMD_BUILD_CANAL */
{CmdCompanyCtrl, CMD_SPECTATOR}, /* CMD_COMPANY_CTRL */
{CmdMoneyCheat, CMD_OFFLINE}, // CMD_MONEY_CHEAT
{CmdBuildCanal, CMD_AUTO}, // CMD_BUILD_CANAL
{CmdCompanyCtrl, CMD_SPECTATOR}, // CMD_COMPANY_CTRL
{CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO}, /* CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once */
{CmdLevelLand, CMD_ALL_TILES | CMD_NO_TEST | CMD_AUTO}, // CMD_LEVEL_LAND; test run might clear tiles multiple times, in execution that only happens once
{CmdRefitRailVehicle, 0}, /* CMD_REFIT_RAIL_VEHICLE */
{CmdRestoreOrderIndex, 0}, /* CMD_RESTORE_ORDER_INDEX */
{CmdBuildLock, CMD_AUTO}, /* CMD_BUILD_LOCK */
{CmdRefitRailVehicle, 0}, // CMD_REFIT_RAIL_VEHICLE
{CmdRestoreOrderIndex, 0}, // CMD_RESTORE_ORDER_INDEX
{CmdBuildLock, CMD_AUTO}, // CMD_BUILD_LOCK
{CmdBuildSignalTrack, CMD_AUTO}, /* CMD_BUILD_SIGNAL_TRACK */
{CmdRemoveSignalTrack, CMD_AUTO}, /* CMD_REMOVE_SIGNAL_TRACK */
{CmdBuildSignalTrack, CMD_AUTO}, // CMD_BUILD_SIGNAL_TRACK
{CmdRemoveSignalTrack, CMD_AUTO}, // CMD_REMOVE_SIGNAL_TRACK
{CmdGiveMoney, 0}, /* CMD_GIVE_MONEY */
{CmdChangeSetting, CMD_SERVER}, /* CMD_CHANGE_SETTING */
{CmdSetAutoReplace, 0}, /* CMD_SET_AUTOREPLACE */
{CmdCloneVehicle, CMD_NO_TEST}, /* CMD_CLONE_VEHICLE; NewGRF callbacks influence building and refitting making it impossible to correctly estimate the cost */
{CmdStartStopVehicle, 0}, /* CMD_START_STOP_VEHICLE */
{CmdMassStartStopVehicle, 0}, /* CMD_MASS_START_STOP */
{CmdAutoreplaceVehicle, 0}, /* CMD_AUTOREPLACE_VEHICLE */
{CmdDepotSellAllVehicles, 0}, /* CMD_DEPOT_SELL_ALL_VEHICLES */
{CmdDepotMassAutoReplace, 0}, /* CMD_DEPOT_MASS_AUTOREPLACE */
{CmdCreateGroup, 0}, /* CMD_CREATE_GROUP */
{CmdDeleteGroup, 0}, /* CMD_DELETE_GROUP */
{CmdRenameGroup, 0}, /* CMD_RENAME_GROUP */
{CmdAddVehicleGroup, 0}, /* CMD_ADD_VEHICLE_GROUP */
{CmdAddSharedVehicleGroup, 0}, /* CMD_ADD_SHARE_VEHICLE_GROUP */
{CmdRemoveAllVehiclesGroup, 0}, /* CMD_REMOVE_ALL_VEHICLES_GROUP */
{CmdSetGroupReplaceProtection, 0}, /* CMD_SET_GROUP_REPLACE_PROTECTION */
{CmdMoveOrder, 0}, /* CMD_MOVE_ORDER */
{CmdChangeTimetable, 0}, /* CMD_CHANGE_TIMETABLE */
{CmdSetVehicleOnTime, 0}, /* CMD_SET_VEHICLE_ON_TIME */
{CmdAutofillTimetable, 0}, /* CMD_AUTOFILL_TIMETABLE */
{CmdGiveMoney, 0}, // CMD_GIVE_MONEY
{CmdChangeSetting, CMD_SERVER}, // CMD_CHANGE_SETTING
{CmdSetAutoReplace, 0}, // CMD_SET_AUTOREPLACE
{CmdCloneVehicle, CMD_NO_TEST}, // CMD_CLONE_VEHICLE; NewGRF callbacks influence building and refitting making it impossible to correctly estimate the cost
{CmdStartStopVehicle, 0}, // CMD_START_STOP_VEHICLE
{CmdMassStartStopVehicle, 0}, // CMD_MASS_START_STOP
{CmdAutoreplaceVehicle, 0}, // CMD_AUTOREPLACE_VEHICLE
{CmdDepotSellAllVehicles, 0}, // CMD_DEPOT_SELL_ALL_VEHICLES
{CmdDepotMassAutoReplace, 0}, // CMD_DEPOT_MASS_AUTOREPLACE
{CmdCreateGroup, 0}, // CMD_CREATE_GROUP
{CmdDeleteGroup, 0}, // CMD_DELETE_GROUP
{CmdRenameGroup, 0}, // CMD_RENAME_GROUP
{CmdAddVehicleGroup, 0}, // CMD_ADD_VEHICLE_GROUP
{CmdAddSharedVehicleGroup, 0}, // CMD_ADD_SHARE_VEHICLE_GROUP
{CmdRemoveAllVehiclesGroup, 0}, // CMD_REMOVE_ALL_VEHICLES_GROUP
{CmdSetGroupReplaceProtection, 0}, // CMD_SET_GROUP_REPLACE_PROTECTION
{CmdMoveOrder, 0}, // CMD_MOVE_ORDER
{CmdChangeTimetable, 0}, // CMD_CHANGE_TIMETABLE
{CmdSetVehicleOnTime, 0}, // CMD_SET_VEHICLE_ON_TIME
{CmdAutofillTimetable, 0}, // CMD_AUTOFILL_TIMETABLE
};
/*!

View File

@@ -13,7 +13,6 @@
#include "network/network.h"
#include "network/network_func.h"
#include "network/network_base.h"
#include "variables.h"
#include "ai/ai.hpp"
#include "company_manager_face.h"
#include "group.h"
@@ -23,7 +22,6 @@
#include "gfx_func.h"
#include "date_func.h"
#include "sound_func.h"
#include "core/alloc_func.hpp"
#include "autoreplace_func.h"
#include "autoreplace_gui.h"
#include "string_func.h"
@@ -131,7 +129,7 @@ bool IsValidCompanyManagerFace(CompanyManagerFace cmf)
for (CompanyManagerFaceVariable cmfv = CMFV_CHEEKS; cmfv < CMFV_END; cmfv++) {
switch (cmfv) {
case CMFV_MOUSTACHE: if (!has_moustache) continue; break;
case CMFV_LIPS: /* FALL THROUGH */
case CMFV_LIPS: // FALL THROUGH
case CMFV_NOSE: if (has_moustache) continue; break;
case CMFV_TIE_EARRING: if (!has_tie_earring) continue; break;
case CMFV_GLASSES: if (!has_glasses) continue; break;
@@ -720,19 +718,19 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
InvalidateWindowData(WC_COMPANY_LEAGUE, 0, 0);
switch (p1) {
case 0: { /* Create a new company */
case 0: { // Create a new company
/* This command is only executed in a multiplayer game */
if (!_networking) return CMD_ERROR;
#ifdef ENABLE_NETWORK
/* Joining Client:
* _local_company: COMPANY_SPECTATOR
* _network_playas/cid = requested company/clientid
*
* Other client(s)/server:
* _local_company/_network_playas: what they play as
* cid = requested company/company of joining client */
* _local_company: COMPANY_SPECTATOR
* _network_playas/cid = requested company/clientid
*
* Other client(s)/server:
* _local_company/_network_playas: what they play as
* cid = requested company/company of joining client */
ClientID cid = (ClientID)p2;
/* Has the network client a correct ClientIndex? */
@@ -768,7 +766,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
_current_company = _local_company;
/* Now that we have a new company, broadcast our autorenew settings to
* all clients so everything is in sync */
* all clients so everything is in sync */
NetworkSend_Command(0,
(_settings_client.gui.autorenew << 15 ) | (_settings_client.gui.autorenew_months << 16) | 4,
_settings_client.gui.autorenew_money,
@@ -782,8 +780,8 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
if (_network_server) {
/* XXX - UGLY! p2 (pid) is mis-used to fetch the client-id, done at
* server-side in network_server.c:838, function
* DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND) */
* server side in network_server.c:838, function
* DEF_SERVER_RECEIVE_COMMAND(PACKET_CLIENT_COMMAND) */
CompanyID old_playas = ci->client_playas;
ci->client_playas = c->index;
NetworkUpdateClientInfo(ci->client_id);
@@ -795,16 +793,16 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
NetworkServerUpdateCompanyPassworded(ci->client_playas, false);
/* XXX - When a client joins, we automatically set its name to the
* client's name (for some reason). As it stands now only the server
* knows the client's name, so it needs to send out a "broadcast" to
* do this. To achieve this we send a network command. However, it
* uses _local_company to execute the command as. To prevent abuse
* (eg. only yourself can change your name/company), we 'cheat' by
* impersonation _local_company as the server. Not the best solution;
* but it works.
* TODO: Perhaps this could be improved by when the client is ready
* with joining to let it send itself the command, and not the server?
* For example in network_client.c:534? */
* client's name (for some reason). As it stands now only the server
* knows the client's name, so it needs to send out a "broadcast" to
* do this. To achieve this we send a network command. However, it
* uses _local_company to execute the command as. To prevent abuse
* (eg. only yourself can change your name/company), we 'cheat' by
* impersonation _local_company as the server. Not the best solution;
* but it works.
* TODO: Perhaps this could be improved by when the client is ready
* with joining to let it send itself the command, and not the server?
* For example in network_client.c:534? */
_local_company = ci->client_playas;
NetworkSend_Command(0, 0, 0, CMD_RENAME_PRESIDENT, NULL, ci->client_name);
_local_company = company_backup;
@@ -818,13 +816,13 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
#endif /* ENABLE_NETWORK */
} break;
case 1: /* Make a new AI company */
case 1: // Make a new AI company
if (!(flags & DC_EXEC)) return CommandCost();
DoStartupNewCompany(true);
break;
case 2: { /* Delete a company */
case 2: { // Delete a company
Company *c;
if (!IsValidCompanyID((CompanyID)p2)) return CMD_ERROR;
@@ -853,7 +851,7 @@ CommandCost CmdCompanyCtrl(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
AI::BroadcastNewEvent(new AIEventCompanyBankrupt(c_index));
} break;
case 3: { /* Merge a company (#1) into another company (#2), elimination company #1 */
case 3: { // Merge a company (#1) into another company (#2), elimination company #1
CompanyID cid_old = (CompanyID)GB(p2, 0, 16);
CompanyID cid_new = (CompanyID)GB(p2, 16, 16);

View File

@@ -286,7 +286,7 @@ struct CompanyFinancesWindow : Window {
virtual void OnClick(Point pt, int widget)
{
switch (widget) {
case CFW_WIDGET_TOGGLE_SIZE: {/* toggle size */
case CFW_WIDGET_TOGGLE_SIZE: {// toggle size
bool new_mode = !this->small;
bool stickied = !!(this->flags4 & WF_STICKY);
int oldtop = this->top; ///< current top position of the window before closing it
@@ -299,30 +299,30 @@ struct CompanyFinancesWindow : Window {
}
break;
case CFW_WIDGET_INCREASE_LOAN: /* increase loan */
case CFW_WIDGET_INCREASE_LOAN: // increase loan
DoCommandP(0, 0, _ctrl_pressed, CMD_INCREASE_LOAN | CMD_MSG(STR_702C_CAN_T_BORROW_ANY_MORE_MONEY));
break;
case CFW_WIDGET_REPAY_LOAN: /* repay loan */
case CFW_WIDGET_REPAY_LOAN: // repay loan
DoCommandP(0, 0, _ctrl_pressed, CMD_DECREASE_LOAN | CMD_MSG(STR_702F_CAN_T_REPAY_LOAN));
break;
}
}
};
static const WindowDesc _company_finances_desc = {
static const WindowDesc _company_finances_desc(
WDP_AUTO, WDP_AUTO, 407, 60 + 10, 407, 60 + 10,
WC_FINANCES, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
_company_finances_widgets,
};
_company_finances_widgets
);
static const WindowDesc _company_finances_small_desc = {
static const WindowDesc _company_finances_small_desc(
WDP_AUTO, WDP_AUTO, 280, 60, 280, 60,
WC_FINANCES, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON,
_company_finances_small_widgets,
};
_company_finances_small_widgets
);
/**
* Open the small/large finance window of the company
@@ -550,11 +550,11 @@ public:
break;
}
case SCLW_WIDGET_PRI_COL_DROPDOWN: /* First colour dropdown */
case SCLW_WIDGET_PRI_COL_DROPDOWN: // First colour dropdown
ShowColourDropDownMenu(SCLW_WIDGET_PRI_COL_DROPDOWN);
break;
case SCLW_WIDGET_SEC_COL_DROPDOWN: /* Second colour dropdown */
case SCLW_WIDGET_SEC_COL_DROPDOWN: // Second colour dropdown
ShowColourDropDownMenu(SCLW_WIDGET_SEC_COL_DROPDOWN);
break;
@@ -626,12 +626,12 @@ static const Widget _select_company_livery_widgets[] = {
{ WIDGETS_END },
};
static const WindowDesc _select_company_livery_desc = {
static const WindowDesc _select_company_livery_desc(
WDP_AUTO, WDP_AUTO, 400, 49 + 1 * 14, 400, 49 + 1 * 14,
WC_COMPANY_COLOUR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET,
_select_company_livery_widgets,
};
_select_company_livery_widgets
);
/**
* Draws the face of a company manager's face.
@@ -667,7 +667,7 @@ void DrawCompanyManagerFace(CompanyManagerFace cmf, int colour, int x, int y)
for (CompanyManagerFaceVariable cmfv = CMFV_CHEEKS; cmfv < CMFV_END; cmfv++) {
switch (cmfv) {
case CMFV_MOUSTACHE: if (!has_moustache) continue; break;
case CMFV_LIPS: /* FALL THROUGH */
case CMFV_LIPS: // FALL THROUGH
case CMFV_NOSE: if (has_moustache) continue; break;
case CMFV_TIE_EARRING: if (!has_tie_earring) continue; break;
case CMFV_GLASSES: if (!has_glasses) continue; break;
@@ -877,8 +877,8 @@ public:
/* Disable dynamically the widgets which CompanyManagerFaceVariable has less than 2 options
* (or in other words you haven't any choice).
* If the widgets depend on a HAS-variable and this is false the widgets will be disabled, too. */
* (or in other words you haven't any choice).
* If the widgets depend on a HAS-variable and this is false the widgets will be disabled, too. */
/* Eye colour buttons */
this->SetWidgetsDisabledState(_cmf_info[CMFV_EYE_COLOUR].valid_values[this->ge] < 2,
@@ -1037,10 +1037,10 @@ public:
default:
/* For all buttons from SCMFW_WIDGET_HAS_MOUSTACHE_EARRING to SCMFW_WIDGET_GLASSES_R is the same function.
* Therefor is this combined function.
* First it checks which CompanyManagerFaceVariable will be change and then
* a: invert the value for boolean variables
* or b: it checks inside of IncreaseCompanyManagerFaceBits() if a left (_L) butten is pressed and then decrease else increase the variable */
* Therefor is this combined function.
* First it checks which CompanyManagerFaceVariable will be change and then
* a: invert the value for boolean variables
* or b: it checks inside of IncreaseCompanyManagerFaceBits() if a left (_L) butten is pressed and then decrease else increase the variable */
if (this->advanced && widget >= SCMFW_WIDGET_HAS_MOUSTACHE_EARRING && widget <= SCMFW_WIDGET_GLASSES_R) {
CompanyManagerFaceVariable cmfv; // which CompanyManagerFaceVariable shall be edited
@@ -1093,20 +1093,20 @@ public:
};
/** normal/simple company manager face selection window description */
static const WindowDesc _select_company_manager_face_desc = {
static const WindowDesc _select_company_manager_face_desc(
WDP_AUTO, WDP_AUTO, 190, 163, 190, 163,
WC_COMPANY_MANAGER_FACE, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
_select_company_manager_face_widgets,
};
_select_company_manager_face_widgets
);
/** advanced company manager face selection window description */
static const WindowDesc _select_company_manager_face_adv_desc = {
static const WindowDesc _select_company_manager_face_adv_desc(
WDP_AUTO, WDP_AUTO, 220, 220, 220, 220,
WC_COMPANY_MANAGER_FACE, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_CONSTRUCTION,
_select_company_manager_face_adv_widgets,
};
_select_company_manager_face_adv_widgets
);
/**
* Open the simple/advanced company manager face selection window
@@ -1268,7 +1268,7 @@ struct CompanyWindow : Window
this->SetWidgetHiddenState(CW_WIDGET_PRESIDENT_NAME, !local);
this->SetWidgetHiddenState(CW_WIDGET_COMPANY_NAME, !local);
this->widget[CW_WIDGET_BUILD_VIEW_HQ].data = (local && c->location_of_HQ == INVALID_TILE) ? STR_706F_BUILD_HQ : STR_7072_VIEW_HQ;
if (local && c->location_of_HQ != INVALID_TILE) this->widget[CW_WIDGET_BUILD_VIEW_HQ].type = WWT_PUSHTXTBTN; //HQ is already built.
if (local && c->location_of_HQ != INVALID_TILE) this->widget[CW_WIDGET_BUILD_VIEW_HQ].type = WWT_PUSHTXTBTN; // HQ is already built.
this->SetWidgetDisabledState(CW_WIDGET_BUILD_VIEW_HQ, !local && c->location_of_HQ == INVALID_TILE);
this->SetWidgetHiddenState(CW_WIDGET_RELOCATE_HQ, !local || c->location_of_HQ == INVALID_TILE);
this->SetWidgetHiddenState(CW_WIDGET_BUY_SHARE, local);
@@ -1456,12 +1456,12 @@ struct CompanyWindow : Window
}
};
static const WindowDesc _company_desc = {
static const WindowDesc _company_desc(
WDP_AUTO, WDP_AUTO, 360, 170, 360, 170,
WC_COMPANY, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_company_widgets,
};
_company_widgets
);
void ShowCompany(CompanyID company)
{
@@ -1515,12 +1515,12 @@ static const Widget _buy_company_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _buy_company_desc = {
static const WindowDesc _buy_company_desc(
153, 171, 334, 137, 334, 137,
WC_BUY_COMPANY, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_CONSTRUCTION,
_buy_company_widgets,
};
_buy_company_widgets
);
void ShowBuyCompanyDialog(CompanyID company)

View File

@@ -57,8 +57,8 @@ struct CompanyManagerFaceBitsInfo {
/** Lookup table for indices into the CompanyManagerFace, valid ranges and sprites */
static const CompanyManagerFaceBitsInfo _cmf_info[] = {
/* Index off len WM WF BM BF WM WF BM BF */
/* CMFV_GENDER */ { 0, 1, { 2, 2, 2, 2 }, { 0, 0, 0, 0 } }, ///< 0 = male, 1 = female
/* Index off len WM WF BM BF WM WF BM BF
* CMFV_GENDER */ { 0, 1, { 2, 2, 2, 2 }, { 0, 0, 0, 0 } }, ///< 0 = male, 1 = female
/* CMFV_ETHNICITY */ { 1, 2, { 2, 2, 2, 2 }, { 0, 0, 0, 0 } }, ///< 0 = (Western-)Caucasian, 1 = African(-American)/Black
/* CMFV_GEN_ETHN */ { 0, 3, { 4, 4, 4, 4 }, { 0, 0, 0, 0 } }, ///< Shortcut to get/set gender _and_ ethnicity
/* CMFV_HAS_MOUSTACHE */ { 3, 1, { 2, 0, 2, 0 }, { 0, 0, 0, 0 } }, ///< Females do not have a moustache

View File

@@ -116,13 +116,13 @@ void IConsolePrint(ConsoleColour colour_code, const char *string)
* by any other means. Uses printf() style format, for more information look
* at IConsolePrint()
*/
void CDECL IConsolePrintF(ConsoleColour colour_code, const char *s, ...)
void CDECL IConsolePrintF(ConsoleColour colour_code, const char *format, ...)
{
va_list va;
char buf[ICON_MAX_STREAMSIZE];
va_start(va, s);
vsnprintf(buf, sizeof(buf), s, va);
va_start(va, format);
vsnprintf(buf, sizeof(buf), format, va);
va_end(va);
IConsolePrint(colour_code, buf);
@@ -691,7 +691,7 @@ void IConsoleVarExec(const IConsoleVar *var, byte tokencount, char *token[ICON_T
if (_stdlib_con_developer)
IConsolePrintF(CC_DEBUG, "condbg: requested command is a variable");
if (tokencount == 0) { /* Just print out value */
if (tokencount == 0) { // Just print out value
IConsoleVarPrintGetValue(var);
return;
}
@@ -784,7 +784,7 @@ void IConsoleCmdExec(const char *cmdstr)
if (t_index >= lengthof(tokens) || tstream_i >= lengthof(tokenstream)) break;
switch (*cmdptr) {
case ' ': /* Token seperator */
case ' ': // Token seperator
if (!foundtoken) break;
if (longtoken) {

View File

@@ -37,18 +37,18 @@
#include "table/strings.h"
#endif /* ENABLE_NETWORK */
// ** scriptfile handling ** //
/* scriptfile handling */
static FILE *_script_file;
static bool _script_running;
// ** console command / variable defines ** //
/* console command / variable defines */
#define DEF_CONSOLE_CMD(function) static bool function(byte argc, char *argv[])
#define DEF_CONSOLE_HOOK(function) static bool function()
/* **************************** */
/* variable and command hooks */
/* **************************** */
/*****************************
* variable and command hooks
*****************************/
#ifdef ENABLE_NETWORK
@@ -343,7 +343,7 @@ DEF_CONSOLE_CMD(ConPrintWorkingDirectory)
return true;
}
// XXX - Workaround for broken file handling
/* XXX - Workaround for broken file handling */
FiosGetSavegameList(SLD_LOAD_GAME);
FiosFreeSavegameList();
@@ -365,9 +365,9 @@ DEF_CONSOLE_CMD(ConClearBuffer)
}
// ********************************* //
// * Network Core Console Commands * //
// ********************************* //
/**********************************
* Network Core Console Commands
**********************************/
#ifdef ENABLE_NETWORK
DEF_CONSOLE_CMD(ConBan)
@@ -640,6 +640,11 @@ DEF_CONSOLE_CMD(ConJoinCompany)
return true;
}
if (company_id != COMPANY_SPECTATOR && GetCompany(company_id)->is_ai) {
IConsoleError("Cannot join AI company.");
return true;
}
/* Check if the company requires a password */
if (NetworkCompanyIsPassworded(company_id) && argc < 3) {
IConsolePrintF(CC_ERROR, "Company %d requires a password to join.", company_id + 1);
@@ -678,6 +683,11 @@ DEF_CONSOLE_CMD(ConMoveClient)
return true;
}
if (company_id != COMPANY_SPECTATOR && GetCompany(company_id)->is_ai) {
IConsoleError("You cannot move clients to AI companies.");
return true;
}
if (ci->client_id == CLIENT_ID_SERVER && _network_dedicated) {
IConsoleError("Silly boy, you cannot move the server!");
return true;
@@ -782,8 +792,8 @@ DEF_CONSOLE_CMD(ConNetworkConnect)
/* From a user pov 0 is a new company, internally it's different and all
* companies are offset by one to ease up on users (eg companies 1-8 not 0-7) */
if (_network_playas != COMPANY_SPECTATOR) {
if (_network_playas > MAX_COMPANIES) return false;
_network_playas--;
if (!IsValidCompanyID(_network_playas)) return false;
}
}
if (port != NULL) {
@@ -798,9 +808,9 @@ DEF_CONSOLE_CMD(ConNetworkConnect)
#endif /* ENABLE_NETWORK */
/* ******************************** */
/* script file console commands */
/* ******************************** */
/*********************************
* script file console commands
*********************************/
DEF_CONSOLE_CMD(ConExec)
{
@@ -853,9 +863,9 @@ DEF_CONSOLE_CMD(ConReturn)
return true;
}
/* **************************** */
/* default console commands */
/* **************************** */
/*****************************
* default console commands
******************************/
extern bool CloseConsoleLogIfActive();
DEF_CONSOLE_CMD(ConScript)
@@ -1189,7 +1199,7 @@ DEF_CONSOLE_CMD(ConInfoVar)
IConsolePrintF(CC_DEFAULT, "variable name: %s", var->name);
IConsolePrintF(CC_DEFAULT, "variable type: %s", _icon_vartypes[var->type]);
IConsolePrintF(CC_DEFAULT, "variable addr: 0x%X", var->addr);
IConsolePrintF(CC_DEFAULT, "variable addr: %p", var->addr);
if (var->hook.access) IConsoleWarning("variable is access hooked");
if (var->hook.pre) IConsoleWarning("variable is pre hooked");
@@ -1216,7 +1226,7 @@ DEF_CONSOLE_CMD(ConInfoCmd)
}
IConsolePrintF(CC_DEFAULT, "command name: %s", cmd->name);
IConsolePrintF(CC_DEFAULT, "command proc: 0x%X", cmd->proc);
IConsolePrintF(CC_DEFAULT, "command proc: %p", cmd->proc);
if (cmd->hook.access) IConsoleWarning("command is access hooked");
if (cmd->hook.pre) IConsoleWarning("command is pre hooked");
@@ -1421,7 +1431,7 @@ DEF_CONSOLE_CMD(ConCompanies)
const NetworkCompanyStats *stats = &company_stats[c->index];
GetString(buffer, STR_00D1_DARK_BLUE + _company_colours[c->index], lastof(buffer));
IConsolePrintF(CC_INFO, "#:%d(%s) Company Name: '%s' Year Founded: %d Money: %" OTTD_PRINTF64 "d Loan: %" OTTD_PRINTF64 "d Value: %" OTTD_PRINTF64 "d (T:%d, R:%d, P:%d, S:%d) %sprotected",
IConsolePrintF(CC_INFO, "#:%d(%s) Company Name: '%s' Year Founded: %d Money: " OTTD_PRINTF64 " Loan: " OTTD_PRINTF64 " Value: " OTTD_PRINTF64 " (T:%d, R:%d, P:%d, S:%d) %sprotected",
c->index + 1, buffer, company_name, c->inaugurated_year, (int64)c->money, (int64)c->current_loan, (int64)CalculateCompanyValue(c),
/* trains */ stats->num_vehicle[0],
/* lorry + bus */ stats->num_vehicle[1] + stats->num_vehicle[2],
@@ -1678,9 +1688,9 @@ DEF_CONSOLE_CMD(ConGamelogPrint)
}
#ifdef _DEBUG
/* ****************************************** */
/* debug commands and variables */
/* ****************************************** */
/*******************************************
* debug commands and variables
********************************************/
static void IConsoleDebugLibRegister()
{
@@ -1695,9 +1705,9 @@ static void IConsoleDebugLibRegister()
}
#endif
/* ****************************************** */
/* console command and variable registration */
/* ****************************************** */
/*******************************************
* console command and variable registration
********************************************/
void IConsoleStdLibRegister()
{
@@ -1846,7 +1856,7 @@ void IConsoleStdLibRegister()
IConsoleAliasRegister("reload_cfg", "setting reload_cfg %+");
#endif /* ENABLE_NETWORK */
// debugging stuff
/* debugging stuff */
#ifdef _DEBUG
IConsoleDebugLibRegister();
#endif

View File

@@ -17,7 +17,7 @@ void IConsoleClose();
/* console output */
void IConsolePrint(ConsoleColour colour_code, const char *string);
void CDECL IConsolePrintF(ConsoleColour colour_code, const char *s, ...);
void CDECL IConsolePrintF(ConsoleColour colour_code, const char *format, ...) WARN_FORMAT(2, 3);
void IConsoleDebug(const char *dbg, const char *string);
void IConsoleWarning(const char *string);
void IConsoleError(const char *string);

View File

@@ -204,7 +204,7 @@ struct IConsoleWindow : Window
const int scroll_height = (this->height / ICON_LINE_HEIGHT) - 1;
switch (keycode) {
case WKC_UP:
IConsoleHistoryNavigate(+1);
IConsoleHistoryNavigate(1);
this->SetDirty();
break;
@@ -317,12 +317,12 @@ static const Widget _iconsole_window_widgets[] = {
{WIDGETS_END}
};
static const WindowDesc _iconsole_window_desc = {
static const WindowDesc _iconsole_window_desc(
0, 0, 2, 2, 2, 2,
WC_CONSOLE, WC_NONE,
WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
_iconsole_window_widgets,
};
_iconsole_window_widgets
);
void IConsoleGUIInit()
{

View File

@@ -11,7 +11,7 @@
*/
void NORETURN MallocError(size_t size)
{
error("Out of memory. Cannot allocate %i bytes", size);
error("Out of memory. Cannot allocate " PRINTF_SIZE " bytes", size);
}
/**
@@ -20,5 +20,5 @@ void NORETURN MallocError(size_t size)
*/
void NORETURN ReallocError(size_t size)
{
error("Out of memory. Cannot reallocate %i bytes", size);
error("Out of memory. Cannot reallocate " PRINTF_SIZE " bytes", size);
}

View File

@@ -64,12 +64,12 @@ struct MakeEnumPropsT {
/** In some cases we use byte or uint16 to store values that are defined as enum. It is
* necessary in order to control the sizeof() such values. Some compilers make enum
* the same size as int (4 or 8 bytes instead of 1 or 2). As a consequence the strict
* compiler type - checking causes errors like:
* 'HasPowerOnRail' : cannot convert parameter 1 from 'byte' to 'RailType' when
* u->u.rail.railtype is passed as argument or type RailType. In such cases it is better
* to teach the compiler that u->u.rail.railtype is to be treated as RailType. */
* necessary in order to control the sizeof() such values. Some compilers make enum
* the same size as int (4 or 8 bytes instead of 1 or 2). As a consequence the strict
* compiler type - checking causes errors like:
* 'HasPowerOnRail' : cannot convert parameter 1 from 'byte' to 'RailType' when
* u->u.rail.railtype is passed as argument or type RailType. In such cases it is better
* to teach the compiler that u->u.rail.railtype is to be treated as RailType. */
template <typename Tenum_t> struct TinyEnumT;
/** The general declaration of TinyEnumT<> (above) */

View File

@@ -86,7 +86,7 @@ public:
FORCEINLINE OverflowSafeInt operator * (const byte factor) const { OverflowSafeInt result = *this; result *= (int64)factor; return result; }
/* Operators for division */
FORCEINLINE OverflowSafeInt& operator /= (const int divisor) { this->m_value /= divisor; return *this; }
FORCEINLINE OverflowSafeInt& operator /= (const int64 divisor) { this->m_value /= divisor; return *this; }
FORCEINLINE OverflowSafeInt operator / (const OverflowSafeInt& divisor) const { OverflowSafeInt result = *this; result /= divisor.m_value; return result; }
FORCEINLINE OverflowSafeInt operator / (const int divisor) const { OverflowSafeInt result = *this; result /= divisor; return result; }
FORCEINLINE OverflowSafeInt operator / (const uint divisor) const { OverflowSafeInt result = *this; result /= (int)divisor; return result; }

View File

@@ -108,7 +108,7 @@ static FORCEINLINE uint32 InteractiveRandomRange(uint16 max)
* Checks if a given randomize-number is below a given probability.
*
* This function is used to check if the given probability by the fraction of (a/b)
* is greater than low 16 bits of the given randomize-number v.
* is greater than low 16 bits of the given randomize-number r.
*
* Do not use this function twice on the same random 16 bits as it will yield
* the same result. One can use a random number for two calls to Chance16I,
@@ -117,12 +117,12 @@ static FORCEINLINE uint32 InteractiveRandomRange(uint16 max)
* @param a The numerator of the fraction
* @param b The denominator of the fraction, must of course not be null
* @param r The given randomize-number
* @return True if v is less or equals (a/b)
* @return True if the probability given by r is less or equal to (a/b)
*/
static FORCEINLINE bool Chance16I(const uint a, const uint b, const uint32 r)
{
assert(b != 0);
return (uint16)r < (uint16)(((a << 16) + b / 2) / b);
return (((uint16)r * b + b / 2) >> 16) < a;
}
/**

View File

@@ -10,40 +10,40 @@
#include "table/strings.h"
// exchange rate prefix symbol_pos
// | separator | postfix |
// | | Euro year | | | name
// | | | | | | |
/* exchange rate prefix symbol_pos
* | separator | postfix |
* | | Euro year | | | name
* | | | | | | | */
static const CurrencySpec origin_currency_specs[NUM_CURRENCY] = {
{ 1, ',', CF_NOEURO, "£", "", 0, STR_CURR_GBP }, ///< british pounds
{ 2, ',', CF_NOEURO, "$", "", 0, STR_CURR_USD }, ///< us dollars
{ 2, ',', CF_ISEURO, "", "", 0, STR_CURR_EUR }, ///< Euro
{ 220, ',', CF_NOEURO, "¥", "", 0, STR_CURR_YEN }, ///< yen
{ 20, ',', 2002, "", " S.", 1, STR_CURR_ATS }, ///< austrian schilling
{ 59, ',', 2002, "BEF ", "", 0, STR_CURR_BEF }, ///< belgian franc
{ 2, ',', CF_NOEURO, "CHF ", "", 0, STR_CURR_CHF }, ///< swiss franc
{ 41, ',', CF_NOEURO, "", "", 1, STR_CURR_CZK }, ///< czech koruna
{ 3, '.', 2002, "DM ", "", 0, STR_CURR_DEM }, ///< deutsche mark
{ 11, '.', CF_NOEURO, "", " kr", 1, STR_CURR_DKK }, ///< danish krone
{ 245, '.', 2002, "Pts ", "", 0, STR_CURR_ESP }, ///< spanish pesetas
{ 9, ',', 2002, "", " mk", 1, STR_CURR_FIM }, ///< finnish markka
{ 10, '.', 2002, "FF ", "", 0, STR_CURR_FRF }, ///< french francs
{ 500, ',', 2002, "", "Dr.", 1, STR_CURR_GRD }, ///< greek drachma
{ 378, ',', CF_NOEURO, "", " Ft", 1, STR_CURR_HUF }, ///< hungarian forint
{ 130, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_ISK }, ///< icelandic krona
{ 2850, ',', 2002, "", " L.", 1, STR_CURR_ITL }, ///< italian lira
{ 3, ',', 2002, "NLG ", "", 0, STR_CURR_NLG }, ///< dutch gulden
{ 12, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_NOK }, ///< norwegian krone
{ 6, ' ', CF_NOEURO, "", " zl", 1, STR_CURR_PLN }, ///< polish zloty
{ 5, '.', CF_NOEURO, "", " Lei", 1, STR_CURR_ROL }, ///< romanian Lei
{ 50, ' ', CF_NOEURO, "", " p", 1, STR_CURR_RUR }, ///< russian rouble
{ 352, '.', 2007, "", " SIT", 1, STR_CURR_SIT }, ///< slovenian tolar
{ 13, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_SEK }, ///< swedish krona
{ 3, '.', CF_NOEURO, "", " TL", 1, STR_CURR_TRY }, ///< turkish lira
{ 52, ',', 2009, "", " Sk", 1, STR_CURR_SKK }, ///< slovak koruna
{ 4, ',', CF_NOEURO, "R$ ", "", 0, STR_CURR_BRL }, ///< brazil real
{ 20, '.', CF_NOEURO, "", " EEK", 1, STR_CURR_EEK }, ///< estonian krooni
{ 1, ' ', CF_NOEURO, "", "", 2, STR_CURR_CUSTOM }, ///< custom currency
{ 1, ',', CF_NOEURO, "\xC2\xA3", "", 0, STR_CURR_GBP }, ///< british pounds
{ 2, ',', CF_NOEURO, "$", "", 0, STR_CURR_USD }, ///< us dollars
{ 2, ',', CF_ISEURO, "\xE2\x82\xAC", "", 0, STR_CURR_EUR }, ///< Euro
{ 220, ',', CF_NOEURO, "\xC2\xA5", "", 0, STR_CURR_YEN }, ///< yen
{ 20, ',', 2002, "", " S.", 1, STR_CURR_ATS }, ///< austrian schilling
{ 59, ',', 2002, "BEF ", "", 0, STR_CURR_BEF }, ///< belgian franc
{ 2, ',', CF_NOEURO, "CHF ", "", 0, STR_CURR_CHF }, ///< swiss franc
{ 41, ',', CF_NOEURO, "", " K\xC4\x8D", 1, STR_CURR_CZK }, ///< czech koruna
{ 3, '.', 2002, "DM ", "", 0, STR_CURR_DEM }, ///< deutsche mark
{ 11, '.', CF_NOEURO, "", " kr", 1, STR_CURR_DKK }, ///< danish krone
{ 245, '.', 2002, "Pts ", "", 0, STR_CURR_ESP }, ///< spanish pesetas
{ 9, ',', 2002, "", " mk", 1, STR_CURR_FIM }, ///< finnish markka
{ 10, '.', 2002, "FF ", "", 0, STR_CURR_FRF }, ///< french francs
{ 500, ',', 2002, "", "Dr.", 1, STR_CURR_GRD }, ///< greek drachma
{ 378, ',', CF_NOEURO, "", " Ft", 1, STR_CURR_HUF }, ///< hungarian forint
{ 130, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_ISK }, ///< icelandic krona
{ 2850, ',', 2002, "", " L.", 1, STR_CURR_ITL }, ///< italian lira
{ 3, ',', 2002, "NLG ", "", 0, STR_CURR_NLG }, ///< dutch gulden
{ 12, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_NOK }, ///< norwegian krone
{ 6, ' ', CF_NOEURO, "", " zl", 1, STR_CURR_PLN }, ///< polish zloty
{ 5, '.', CF_NOEURO, "", " Lei", 1, STR_CURR_RON }, ///< romanian Lei
{ 50, ' ', CF_NOEURO, "", " p", 1, STR_CURR_RUR }, ///< russian rouble
{ 352, '.', 2007, "", " SIT", 1, STR_CURR_SIT }, ///< slovenian tolar
{ 13, '.', CF_NOEURO, "", " Kr", 1, STR_CURR_SEK }, ///< swedish krona
{ 3, '.', CF_NOEURO, "", " TL", 1, STR_CURR_TRY }, ///< turkish lira
{ 52, ',', 2009, "", " Sk", 1, STR_CURR_SKK }, ///< slovak koruna
{ 4, ',', CF_NOEURO, "R$ ", "", 0, STR_CURR_BRL }, ///< brazil real
{ 20, '.', CF_NOEURO, "", " EEK", 1, STR_CURR_EEK }, ///< estonian krooni
{ 1, ' ', CF_NOEURO, "", "", 2, STR_CURR_CUSTOM }, ///< custom currency
};
/* Array of currencies used by the system */
@@ -76,7 +76,7 @@ enum {
CURR_NLG,
CURR_NOK,
CURR_PLN,
CURR_ROL,
CURR_RON,
CURR_RUR,
CURR_SIT,
CURR_SEK,

View File

@@ -37,7 +37,7 @@ struct CurrencySpec {
extern CurrencySpec _currency_specs[NUM_CURRENCY];
// XXX small hack, but makes the rest of the code a bit nicer to read
/* XXX small hack, but makes the rest of the code a bit nicer to read */
#define _custom_currency (_currency_specs[CUSTOM_CURRENCY_ID])
#define _currency ((const CurrencySpec*)&_currency_specs[_game_mode == GM_MENU ? _settings_newgame.locale.currency : _settings_game.locale.currency])

View File

@@ -92,15 +92,13 @@ static void debug_print(const char *dbg, const char *buf)
}
}
void CDECL debug(const char *dbg, ...)
void CDECL debug(const char *dbg, const char *format, ...)
{
va_list va;
va_start(va, dbg);
const char *s;
char buf[1024];
s = va_arg(va, const char*);
vsnprintf(buf, lengthof(buf), s, va);
va_list va;
va_start(va, format);
vsnprintf(buf, lengthof(buf), format, va);
va_end(va);
debug_print(dbg, buf);
@@ -149,7 +147,7 @@ void SetDebugString(const char *s)
if (p != NULL) {
*p = v;
} else {
ShowInfoF("Unknown debug level '%.*s'", s - t, t);
ShowInfoF("Unknown debug level '%.*s'", (int)(s - t), t);
return;
}
}

View File

@@ -50,19 +50,12 @@
extern int _debug_gamelog_level;
extern int _debug_desync_level;
void CDECL debug(const char *dbg, ...);
void CDECL debug(const char *dbg, const char *format, ...) WARN_FORMAT(2, 3);
#endif /* NO_DEBUG_MESSAGES */
void SetDebugString(const char *s);
const char *GetDebugString();
/* MSVCRT of course has to have a different syntax for long long *sigh* */
#if defined(_MSC_VER) || defined(__MINGW32__)
#define OTTD_PRINTF64 "I64"
#else
#define OTTD_PRINTF64 "ll"
#endif
/* Used for profiling
*
* Usage:
@@ -100,6 +93,6 @@ const char *GetDebugString();
}
void ShowInfo(const char *str);
void CDECL ShowInfoF(const char *str, ...);
void CDECL ShowInfoF(const char *str, ...) WARN_FORMAT(1, 2);
#endif /* DEBUG_H */

View File

@@ -97,33 +97,33 @@ static const Widget _depot_widgets[] = {
};
static const WindowDesc _train_depot_desc = {
static const WindowDesc _train_depot_desc(
WDP_AUTO, WDP_AUTO, 36, 27, 362, 123,
WC_VEHICLE_DEPOT, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
};
_depot_widgets
);
static const WindowDesc _road_depot_desc = {
static const WindowDesc _road_depot_desc(
WDP_AUTO, WDP_AUTO, 36, 27, 316, 97,
WC_VEHICLE_DEPOT, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
};
_depot_widgets
);
static const WindowDesc _ship_depot_desc = {
static const WindowDesc _ship_depot_desc(
WDP_AUTO, WDP_AUTO, 36, 27, 306, 99,
WC_VEHICLE_DEPOT, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
};
_depot_widgets
);
static const WindowDesc _aircraft_depot_desc = {
static const WindowDesc _aircraft_depot_desc(
WDP_AUTO, WDP_AUTO, 36, 27, 332, 99,
WC_VEHICLE_DEPOT, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS | WDF_STICKY_BUTTON | WDF_RESIZABLE,
_depot_widgets,
};
_depot_widgets
);
extern int WagonLengthToPixels(int len);
extern void DepotSortList(VehicleList *list);
@@ -167,7 +167,7 @@ static void TrainDepotMoveVehicle(const Vehicle *wagon, VehicleID sel, const Veh
uint _block_sizes[4][2];
/* Array to hold the default resize capacities
* First part is the vehicle type, while the last is 0 = x, 1 = y */
* First part is the vehicle type, while the last is 0 = x, 1 = y */
const uint _resize_cap[][2] = {
/* VEH_TRAIN */ {6, 10 * 29},
/* VEH_ROAD */ {5, 5},
@@ -255,11 +255,11 @@ struct DepotWindow : Window {
}
/** Draw a vehicle in the depot window in the box with the top left corner at x,y
* @param *w Window to draw in
* @param *v Vehicle to draw
* @param x Left side of the box to draw in
* @param y Top of the box to draw in
*/
* @param *w Window to draw in
* @param *v Vehicle to draw
* @param x Left side of the box to draw in
* @param y Top of the box to draw in
*/
void DrawVehicleInDepot(Window *w, const Vehicle *v, int x, int y)
{
byte diff_x = 0, diff_y = 0;
@@ -371,7 +371,7 @@ struct DepotWindow : Window {
DrawTrainImage(v, x + 50, y, this->sel, this->hscroll.cap - 29, 0);
DrawString(x, y + 2, STR_8816, TC_FROMSTRING);
/*Draw the train counter */
/* Draw the train counter */
i = 0;
u = v;
do i++; while ((u = u->Next()) != NULL); // Determine length of train
@@ -550,10 +550,10 @@ struct DepotWindow : Window {
}
/**
* Clones a vehicle
* @param *v is the original vehicle to clone
* @param *w is the window of the depot where the clone is build
*/
* Clones a vehicle
* @param *v is the original vehicle to clone
* @param *w is the window of the depot where the clone is build
*/
void HandleCloneVehClick(const Vehicle *v, const Window *w)
{
uint error_str;
@@ -585,7 +585,7 @@ struct DepotWindow : Window {
if (this->type == VEH_TRAIN) {
/* Divide the size of DEPOT_WIDGET_SELL into two equally big buttons so DEPOT_WIDGET_SELL and DEPOT_WIDGET_SELL_CHAIN will get the same size.
* This way it will stay the same even if DEPOT_WIDGET_SELL_CHAIN is resized for some reason */
* This way it will stay the same even if DEPOT_WIDGET_SELL_CHAIN is resized for some reason */
this->widget[DEPOT_WIDGET_SELL_CHAIN].top = ((this->widget[DEPOT_WIDGET_SELL_CHAIN].bottom - this->widget[DEPOT_WIDGET_SELL].top) / 2) + this->widget[DEPOT_WIDGET_SELL].top;
this->widget[DEPOT_WIDGET_SELL].bottom = this->widget[DEPOT_WIDGET_SELL_CHAIN].top - 1;
}

View File

@@ -35,7 +35,7 @@ DECLARE_POSTFIX_INCREMENT(Direction);
/** Define basic enum properties */
template <> struct EnumPropsT<Direction> : MakeEnumPropsT<Direction, byte, DIR_BEGIN, DIR_END, INVALID_DIR> {};
typedef TinyEnumT<Direction> DirectionByte; //typedefing-enumification of Direction
typedef TinyEnumT<Direction> DirectionByte; // typedefing-enumification of Direction
/**
@@ -85,7 +85,7 @@ DECLARE_POSTFIX_INCREMENT(DiagDirection);
/** Define basic enum properties */
template <> struct EnumPropsT<DiagDirection> : MakeEnumPropsT<DiagDirection, byte, DIAGDIR_BEGIN, DIAGDIR_END, INVALID_DIAGDIR> {};
typedef TinyEnumT<DiagDirection> DiagDirectionByte; //typedefing-enumification of DiagDirection
typedef TinyEnumT<DiagDirection> DiagDirectionByte; // typedefing-enumification of DiagDirection
/**

View File

@@ -39,21 +39,21 @@
#include "table/sprites.h"
enum DisasterSubType {
ST_Zeppeliner,
ST_Zeppeliner_Shadow,
ST_Small_Ufo,
ST_Small_Ufo_Shadow,
ST_Airplane,
ST_Airplane_Shadow,
ST_Helicopter,
ST_Helicopter_Shadow,
ST_Helicopter_Rotors,
ST_Big_Ufo,
ST_Big_Ufo_Shadow,
ST_Big_Ufo_Destroyer,
ST_Big_Ufo_Destroyer_Shadow,
ST_Small_Submarine,
ST_Big_Submarine,
ST_ZEPPELINER,
ST_ZEPPELINER_SHADOW,
ST_SMALL_UFO,
ST_SMALL_UFO_SHADOW,
ST_AIRPLANE,
ST_AIRPLANE_SHADOW,
ST_HELICOPTER,
ST_HELICOPTER_SHADOW,
ST_HELICOPTER_ROTORS,
ST_BIG_UFO,
ST_BIG_UFO_SHADOW,
ST_BIG_UFO_DESTROYER,
ST_BIG_UFO_DESTROYER_SHADOW,
ST_SMALL_SUBMARINE,
ST_BIG_SUBMARINE,
};
static void DisasterClearSquare(TileIndex tile)
@@ -135,7 +135,7 @@ static void InitializeDisasterVehicle(Vehicle *v, int x, int y, byte z, Directio
v->current_order.Free();
DisasterVehicleUpdateImage(v);
VehiclePositionChanged(v);
VehicleMove(v, false);
MarkSingleVehicleDirty(v);
}
@@ -143,20 +143,17 @@ static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
{
Vehicle *u;
BeginVehicleMove(v);
v->x_pos = x;
v->y_pos = y;
v->z_pos = z;
v->tile = TileVirtXY(x, y);
DisasterVehicleUpdateImage(v);
VehiclePositionChanged(v);
EndVehicleMove(v);
VehicleMove(v, true);
if ((u = v->Next()) != NULL) {
int safe_x = Clamp(x, 0, MapMaxX() * TILE_SIZE);
int safe_y = Clamp(y - 1, 0, MapMaxY() * TILE_SIZE);
BeginVehicleMove(u);
u->x_pos = x;
u->y_pos = y - 1 - (max(z - GetSlopeZ(safe_x, safe_y), 0U) >> 3);
@@ -165,16 +162,13 @@ static void SetDisasterVehiclePos(Vehicle *v, int x, int y, byte z)
u->direction = v->direction;
DisasterVehicleUpdateImage(u);
VehiclePositionChanged(u);
EndVehicleMove(u);
VehicleMove(u, true);
if ((u = u->Next()) != NULL) {
BeginVehicleMove(u);
u->x_pos = x;
u->y_pos = y;
u->z_pos = z + 5;
VehiclePositionChanged(u);
EndVehicleMove(u);
VehicleMove(u, true);
}
}
}
@@ -543,8 +537,7 @@ static void DisasterTick_Helicopter_Rotors(Vehicle *v)
if (++v->cur_image > SPR_ROTOR_MOVING_3) v->cur_image = SPR_ROTOR_MOVING_1;
VehiclePositionChanged(v);
MarkSingleVehicleDirty(v);
VehicleMove(v, true);
}
/**
@@ -573,6 +566,12 @@ static void DisasterTick_Big_Ufo(Vehicle *v)
return;
}
if (!IsValidTile(v->dest_tile)) {
/* Make sure we don't land outside the map. */
delete v;
return;
}
z = GetSlopeZ(v->x_pos, v->y_pos);
if (z < v->z_pos) {
SetDisasterVehiclePos(v, v->x_pos, v->y_pos, v->z_pos - 1);
@@ -604,13 +603,13 @@ static void DisasterTick_Big_Ufo(Vehicle *v)
}
u = new DisasterVehicle();
InitializeDisasterVehicle(u, -6 * TILE_SIZE, v->y_pos, 135, DIR_SW, ST_Big_Ufo_Destroyer);
InitializeDisasterVehicle(u, -6 * TILE_SIZE, v->y_pos, 135, DIR_SW, ST_BIG_UFO_DESTROYER);
u->u.disaster.big_ufo_destroyer_target = v->index;
Vehicle *w = new DisasterVehicle();
u->SetNext(w);
InitializeDisasterVehicle(w, -6 * TILE_SIZE, v->y_pos, 0, DIR_SW, ST_Big_Ufo_Destroyer_Shadow);
InitializeDisasterVehicle(w, -6 * TILE_SIZE, v->y_pos, 0, DIR_SW, ST_BIG_UFO_DESTROYER_SHADOW);
w->vehstatus |= VS_SHADOW;
} else if (v->current_order.GetDestination() == 0) {
int x = TileX(v->dest_tile) * TILE_SIZE;
@@ -702,8 +701,6 @@ static void DisasterTick_Submarine(Vehicle *v)
v->tick_counter++;
if (++v->age > 8880) {
VehiclePositionChanged(v);
MarkSingleVehicleDirty(v);
delete v;
return;
}
@@ -766,12 +763,12 @@ static void Disaster_Zeppeliner_Init()
}
}
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_Zeppeliner);
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_ZEPPELINER);
/* Allocate shadow */
Vehicle *u = new DisasterVehicle();
v->SetNext(u);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_Zeppeliner_Shadow);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_ZEPPELINER_SHADOW);
u->vehstatus |= VS_SHADOW;
}
@@ -785,14 +782,14 @@ static void Disaster_Small_Ufo_Init()
Vehicle *v = new DisasterVehicle();
int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_Small_Ufo);
InitializeDisasterVehicle(v, x, 0, 135, DIR_SE, ST_SMALL_UFO);
v->dest_tile = TileXY(MapSizeX() / 2, MapSizeY() / 2);
v->age = 0;
/* Allocate shadow */
Vehicle *u = new DisasterVehicle();
v->SetNext(u);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_Small_Ufo_Shadow);
InitializeDisasterVehicle(u, x, 0, 0, DIR_SE, ST_SMALL_UFO_SHADOW);
u->vehstatus |= VS_SHADOW;
}
@@ -819,11 +816,11 @@ static void Disaster_Airplane_Init()
int x = (MapSizeX() + 9) * TILE_SIZE - 1;
int y = TileY(found->xy) * TILE_SIZE + 37;
InitializeDisasterVehicle(v, x, y, 135, DIR_NE, ST_Airplane);
InitializeDisasterVehicle(v, x, y, 135, DIR_NE, ST_AIRPLANE);
Vehicle *u = new DisasterVehicle();
v->SetNext(u);
InitializeDisasterVehicle(u, x, y, 0, DIR_SE, ST_Airplane_Shadow);
InitializeDisasterVehicle(u, x, y, 0, DIR_SE, ST_AIRPLANE_SHADOW);
u->vehstatus |= VS_SHADOW;
}
@@ -849,16 +846,16 @@ static void Disaster_Helicopter_Init()
int x = -16 * TILE_SIZE;
int y = TileY(found->xy) * TILE_SIZE + 37;
InitializeDisasterVehicle(v, x, y, 135, DIR_SW, ST_Helicopter);
InitializeDisasterVehicle(v, x, y, 135, DIR_SW, ST_HELICOPTER);
Vehicle *u = new DisasterVehicle();
v->SetNext(u);
InitializeDisasterVehicle(u, x, y, 0, DIR_SW, ST_Helicopter_Shadow);
InitializeDisasterVehicle(u, x, y, 0, DIR_SW, ST_HELICOPTER_SHADOW);
u->vehstatus |= VS_SHADOW;
Vehicle *w = new DisasterVehicle();
u->SetNext(w);
InitializeDisasterVehicle(w, x, y, 140, DIR_SW, ST_Helicopter_Rotors);
InitializeDisasterVehicle(w, x, y, 140, DIR_SW, ST_HELICOPTER_ROTORS);
}
@@ -872,61 +869,53 @@ static void Disaster_Big_Ufo_Init()
int x = TileX(Random()) * TILE_SIZE + TILE_SIZE / 2;
int y = MapMaxX() * TILE_SIZE - 1;
InitializeDisasterVehicle(v, x, y, 135, DIR_NW, ST_Big_Ufo);
InitializeDisasterVehicle(v, x, y, 135, DIR_NW, ST_BIG_UFO);
v->dest_tile = TileXY(MapSizeX() / 2, MapSizeY() / 2);
v->age = 0;
/* Allocate shadow */
Vehicle *u = new DisasterVehicle();
v->SetNext(u);
InitializeDisasterVehicle(u, x, y, 0, DIR_NW, ST_Big_Ufo_Shadow);
InitializeDisasterVehicle(u, x, y, 0, DIR_NW, ST_BIG_UFO_SHADOW);
u->vehstatus |= VS_SHADOW;
}
/* Curious submarine #1, just floats around */
static void Disaster_Small_Submarine_Init()
static void Disaster_Submarine_Init(DisasterSubType subtype)
{
if (!Vehicle::CanAllocateItem()) return;
Vehicle *v = new DisasterVehicle();
int y;
Direction dir;
uint32 r = Random();
int x = TileX(r) * TILE_SIZE + TILE_SIZE / 2;
if (HasBit(r, 31)) {
y = MapMaxX() * TILE_SIZE - TILE_SIZE / 2 - 1;
y = MapMaxY() * TILE_SIZE - TILE_SIZE / 2 - 1;
dir = DIR_NW;
} else {
y = TILE_SIZE / 2;
if (_settings_game.construction.freeform_edges) y += TILE_SIZE;
dir = DIR_SE;
}
InitializeDisasterVehicle(v, x, y, 0, dir, ST_Small_Submarine);
if (!IsWaterTile(TileVirtXY(x, y))) return;
Vehicle *v = new DisasterVehicle();
InitializeDisasterVehicle(v, x, y, 0, dir, subtype);
v->age = 0;
}
/* Curious submarine #1, just floats around */
static void Disaster_Small_Submarine_Init()
{
Disaster_Submarine_Init(ST_SMALL_SUBMARINE);
}
/* Curious submarine #2, just floats around */
static void Disaster_Big_Submarine_Init()
{
if (!Vehicle::CanAllocateItem()) return;
Vehicle *v = new DisasterVehicle();
int y;
Direction dir;
uint32 r = Random();
int x = TileX(r) * TILE_SIZE + TILE_SIZE / 2;
if (HasBit(r, 31)) {
y = MapMaxX() * TILE_SIZE - TILE_SIZE / 2 - 1;
dir = DIR_NW;
} else {
y = TILE_SIZE / 2;
dir = DIR_SE;
}
InitializeDisasterVehicle(v, x, y, 0, dir, ST_Big_Submarine);
v->age = 0;
Disaster_Submarine_Init(ST_BIG_SUBMARINE);
}
@@ -1033,7 +1022,7 @@ void ReleaseDisastersTargetingIndustry(IndustryID i)
Vehicle *v;
FOR_ALL_VEHICLES(v) {
/* primary disaster vehicles that have chosen target */
if (v->type == VEH_DISASTER && (v->subtype == ST_Airplane || v->subtype == ST_Helicopter)) {
if (v->type == VEH_DISASTER && (v->subtype == ST_AIRPLANE || v->subtype == ST_HELICOPTER)) {
/* if it has chosen target, and it is this industry (yes, dest_tile is IndustryID here), set order to "leaving map peacefully" */
if (v->current_order.GetDestination() > 0 && v->dest_tile == i) v->current_order.SetDestination(3);
}

View File

@@ -274,12 +274,12 @@ static const Widget _build_docks_toolb_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _build_docks_toolbar_desc = {
static const WindowDesc _build_docks_toolbar_desc(
WDP_ALIGN_TBR, 22, 160, 36, 160, 36,
WC_BUILD_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_CONSTRUCTION,
_build_docks_toolb_widgets,
};
_build_docks_toolb_widgets
);
void ShowBuildDocksToolbar()
{
@@ -309,12 +309,12 @@ static const Widget _build_docks_scen_toolb_widgets[] = {
};
/* Window definition for the build docks in scenario editor window */
static const WindowDesc _build_docks_scen_toolbar_desc = {
static const WindowDesc _build_docks_scen_toolbar_desc(
WDP_AUTO, WDP_AUTO, 115, 36, 115, 36,
WC_SCEN_BUILD_TOOLBAR, WC_NONE,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON | WDF_CONSTRUCTION,
_build_docks_scen_toolb_widgets,
};
_build_docks_scen_toolb_widgets
);
void ShowBuildDocksScenToolbar()
{
@@ -395,12 +395,12 @@ static const Widget _build_dock_station_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _build_dock_station_desc = {
static const WindowDesc _build_dock_station_desc(
WDP_AUTO, WDP_AUTO, 148, 75, 148, 75,
WC_BUILD_STATION, WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_CONSTRUCTION,
_build_dock_station_widgets,
};
_build_dock_station_widgets
);
static void ShowBuildDockStationPicker(Window *parent)
{
@@ -469,12 +469,12 @@ static const Widget _build_docks_depot_widgets[] = {
{ WIDGETS_END},
};
static const WindowDesc _build_docks_depot_desc = {
static const WindowDesc _build_docks_depot_desc(
WDP_AUTO, WDP_AUTO, 204, 86, 204, 86,
WC_BUILD_DEPOT, WC_BUILD_TOOLBAR,
WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_CONSTRUCTION,
_build_docks_depot_widgets,
};
_build_docks_depot_widgets
);
static void ShowBuildDocksDepotPicker(Window *parent)

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