# HG changeset patch
# User rubidium
# Date 1206700375 0
# Node ID 9707ad4c9b60f29f1b7d8771808794f1db3dc70a
# Parent cc77111ebd856543aa90f97864907e61d33a21a6
(svn r12462) [NoAI] -Sync: with trunk r12304:12461.
diff -r cc77111ebd85 -r 9707ad4c9b60 bin/data/openttdd.grf
Binary file bin/data/openttdd.grf has changed
diff -r cc77111ebd85 -r 9707ad4c9b60 bin/data/openttdw.grf
Binary file bin/data/openttdw.grf has changed
diff -r cc77111ebd85 -r 9707ad4c9b60 changelog.txt
--- a/changelog.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/changelog.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1,173 +1,206 @@
+0.6.0-beta5 (2008-03-04)
+------------------------------------------------------------------------
+- Feature: Vehicle variable FE bit 5, 6 and 8 [FS#1812] (r12331, r12330)
+- 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: 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)
+- Fix: Vehicle sorting by name was broken, it was comparing the same string (when caching was not used) [FS#1821] (r12323)
+- Fix: Endian issue when saving/loading group owner (r12322)
+- Fix: Wrong transparency options could be saved after toggling all [FS#1817] (r12320)
+- Fix: Map string IDs that are embedded from other strings [FS#1815] (r12317)
+- Fix: Include prop 25 data for all train parts, not just those that carry cargo (r12314)
+- Fix: YAPF and NTP did not apply penalty for uphill tracks on steep slopes (r12313)
+- Fix: Restore timetable from backupped orders and add group ID to the backup [FS#1549] (r12296)
+- Fix: Do not draw trees nor lamps between tram tracks (r12290) [FS#1807]
+- Fix: [Win32] Do not create save dir on install (r12269)
+- Fix: Autoreplace did not update vehicle index for timetable window [FS#1805] (r12261)
+- Fix: GetProductionAroundTiles() may fail if only the second production slot exists (r12258)
+- Fix: Town variables 0x9E to 0xAD (company ratings) returned wrong values (r12247)
+- Fix: Typo resulting in no players are given the engine preview offer (r12244)
+- 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: "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)
+
+
0.6.0-beta4 (2008-02-18)
------------------------------------------------------------------------
--Feature: Allow buttons to resize in NewGRF settings window (r12172)
--Feature: Change colour of autorail and autoroad selection when Ctrl is pressed (r12167)
--Feature: Separate catenary transparency settings from building transparency settings (r12103)
--Feature: Allow locking individual transparency settings so they will not be changed by pressing 'x' (r12102)
--Feature: Add some missing VarAction2 variables (r12124)
--Feature: Make snow appear on rail tiles dependant on track height, not on height of the lowest part of the tile (r12098)
--Feature[newGRF]: Specify the purchase, rail and road description of a bridge (r12069)
--Feature[newGRF]: Add support for var 12, Variational Action 2 (r12045)
--Feature: Allow trees on shore (r12029)
--Feature: Invisible trees are now separate from the building concept (r12022)
--Feature: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains (r12019)
--Feature: Show all cargo sources (en-route from) in the station view cargo waiting list instead of just one (r11990)
--Feature[newGRF]: Resizable industry view window on callback 3A (r11987)
--Feature[newGRF]: Implement var 8F(random bits) during callback 28 [FS#1697] (r11985)
--Feature[newGRF]: Add support for Action 0D, var 13: informations about current map size (r11961)
--Feature: Make use of new sprites added by Action5 type 0D (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: 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: 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 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)
--Fix: Adjust aircraft slowing algorithm (r12144)
--Fix: Callback 0x3D always gets a cargobit in var 0x18, independent of grf version [FS#1766] (r12142)
--Fix: Do not allow adding tram to rail-road crossing when there is a vehicle on it (r12138)
--Fix: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown [FS#1769] (r12137)
--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: 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)
--Fix: Assert when loading savegame with wrong tiletype at south map borders (r12088)
--Fix: Check overrides only for industries when mapping newgrf entities to 'real' entities [FS#1747] (r12086)
--Fix: Update waypoint signs when changing language (r12080)
--Fix: Use search paths when opening console scripts (r12079)
--Fix: When reusing a renamed deleted waypoint, keep the new name (r12076)
--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: 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)
--Fix: Ships can drive through opponents' ship depots (r12058)
--Fix: Slowdown train when approaching 90deg turn when 90deg turns are forbidden (r12057)
--Fix: Enable YAPF to start searching inside a wormhole [FS#1704] (r12056)
--Fix: Another way to fix AI trying to build road through depots (r12055)
--Fix: The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early [FS#1737] (r12052)
--Fix: Random_func broke for desync debug (r12050)
--Fix: Memset on multibyte array with wrong byte count (r12049)
--Fix: Crash when centering on a vehicle (aircraft) that is outside of the map [FS#1741] (r12044)
--Fix: Allow building transmitters and lighthouses on tree tiles [FS#1736] (r12043)
--Fix: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be
- stored for buoys, docks, locks and depots. All these are now allowed on rivers and removal of them will revert to the
- original water type [FS#1676] (r12042)
--Fix: Change ownership of or remove statues when merging/bankrupting companies (r12038)
--Fix: For station tiles, only get road types for road stops (r12036)
--Fix: Teach YAPF where trams can reverse, and where not [FS#1702] (r12035)
--Fix: Do not show train speed as zero after loading paused game (r12033)
--Fix: When removing a statue, remove town statue flag for the statue owner, not current player (r12032)
--Fix: Prevent towns from removing or claiming ownership of player owned tiles when growing [FS#1689,FS#1719] (r12031)
--Fix: In one case trees could spread under bridges (r12024)
--Fix: Put a better suited text in the quit-dialog [FS#1690] (r12023)
--Fix: Restore initial intent on the invisible tree while transparent building patch setting [FS#1721] (r12018)
--Fix: When you have more than 9 network interfaces you'll enter the wonderfull world of overflows (r12017)
--Fix: Better work on strings in regard to gender [FS#1716] (r12015)
--Fix: Lighthouses and transmitters were never supposed to be build on a slope (r12014)
--Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases (r12013)
--Fix: Enable TownRatingTestMode during cost estimation with 'shift'-key (r12012)
--Fix: Do not consider one-corner-raised-shores to be watered tiles from all sides [FS#1701] (r12011)
--Fix: Avoid loading sample.cat if it 'looks' incorrect, and avoid later null pointer dereferences by moving volume lookup deeper [FS#1707] (r12009)
--Fix: Possible reading from an invalid pointer [FS#1717] (r12005)
--Fix: When skipping Action 11 or 12, also skip belonging sprites (r12001)
--Fix: Do entrance-slope-check for every tile of railstations (r11999)
--Fix: Possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD [FS#1692] (r11998)
--Fix: Update train statusbar when stopping from zero speed [FS#1706] (r11996)
--Fix: Resize station/roadstop/dock/airport construction windows if cargo acceptance list is too long (r11993)
--Fix: When building two rail stations close to each other (with control) so they looked like one long track trains would see them as one (r11992)
--Fix: Resize autoreplace window to fit purchase information text if it is too large (r11989)
--Fix: Build system ignored changes to table/control_codes.h which require strgen to be rebuilt (r11986)
--Fix: Also draw corner shores under rail tracks (r11984)
--Revert(r8738): Now we have shores in corners. No need to remove them from TTDP games (r11982)
--Fix: Use unicode glyph mapping to fix up missing/shuffled sprites in original data files instead of shuffling or skipping sprites directly [FS#1698] (r11981)
--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: 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: 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)
--Fix: Slope detection of bridge ramps.Helps YAPF and Trolly (r11946)
--Fix: FileExists() failed for non latin paths (win32) (r11945)
--Fix: Allow building drive-through road/tram stops at road/tram track that has no owner (r11944)
--Fix: 'BRIDGE_TOO_LOW_FOR_TERRAIN'-check was wrong for steep slopes (r11936)
--Fix[autoreplace]: Single to dualhead locomotive replacefailed when player had enough money to replace and refit one but not enough to refit the last one as well [FS#1624] (r11929)
--Fix[autoreplace]: Autoreplace could refit train engines to the wrong cargo type if the old engine had no cargo capacity and the new one had (r11928)
--Fix: Loading old, pre savegame version 2, savegames (r11925)
--Fix: AI was reading wrong tile slope while building road bridge (r11917)
--Fix: set correctly crossing state after train reversal, train leaving crossing, train crash (r11900)
--Fix: Segmentation faults/wrong frees due uninitialized memory in the AI [FS#1658] (r11887)
--Fix: Assert when trying to remove rail from a house or industry tile [FS#1663,FS#1665-6-7-8,FS#1680,FS#1686-7-8 FS#1715 FS#1742 FS#1771 FS#1776](r11883)
--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: 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)
+- Feature: Allow buttons to resize in NewGRF settings window (r12172)
+- Feature: Change colour of autorail and autoroad selection when Ctrl is pressed (r12167)
+- Feature: Separate catenary transparency settings from building transparency settings (r12103)
+- Feature: Allow locking individual transparency settings so they will not be changed by pressing 'x' (r12102)
+- Feature: Add some missing VarAction2 variables (r12124)
+- Feature: Make snow appear on rail tiles dependant on track height, not on height of the lowest part of the tile (r12098)
+- Feature: [NewGRF] Specify the purchase, rail and road description of a bridge (r12069)
+- Feature: [NewGRF] Add support for var 12, Variational Action 2 (r12045)
+- Feature: Allow trees on shore (r12029)
+- Feature: Invisible trees are now separate from the building concept (r12022)
+- Feature: Add support for passenger engine designation for AI-use, NewGRF property 0x08 for trains (r12019)
+- Feature: Show all cargo sources (en-route from) in the station view cargo waiting list instead of just one (r11990)
+- Feature: [NewGRF] Resizable industry view window on callback 3A (r11987)
+- Feature: [NewGRF] Implement var 8F (random bits) during callback 28 [FS#1697] (r11985)
+- 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: 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: 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 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)
+- Fix: Adjust aircraft slowing algorithm (r12144)
+- Fix: Callback 0x3D always gets a cargobit in var 0x18, independent of grf version [FS#1766] (r12142)
+- Fix: Do not allow adding tram to rail-road crossing when there is a vehicle on it (r12138)
+- Fix: Show cargo capacity for articulated vehicles correctly in the purchase list. Multiple cargo types can also now been shown [FS#1769] (r12137)
+- 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: 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)
+- Fix: Assert when loading savegame with wrong tiletype at south map borders (r12088)
+- Fix: Check overrides only for industries when mapping newgrf entities to 'real' entities [FS#1747] (r12086)
+- Fix: Update waypoint signs when changing language (r12080)
+- Fix: Use search paths when opening console scripts (r12079)
+- Fix: When reusing a renamed deleted waypoint, keep the new name (r12076)
+- 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: 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)
+- Fix: Ships can drive through opponents' ship depots (r12058)
+- Fix: Slowdown train when approaching 90deg turn when 90deg turns are forbidden (r12057)
+- Fix: Enable YAPF to start searching inside a wormhole [FS#1704] (r12056)
+- Fix: Another way to fix AI trying to build road through depots (r12055)
+- Fix: The cargo translation table was loaded at the right time, but all the other global variables were now loaded too early [FS#1737] (r12052)
+- Fix: Random_func broke for desync debug (r12050)
+- Fix: Memset on multibyte array with wrong byte count (r12049)
+- Fix: Crash when centering on a vehicle (aircraft) that is outside of the map [FS#1741] (r12044)
+- Fix: Allow building transmitters and lighthouses on tree tiles [FS#1736] (r12043)
+- Fix: Reimplement how rivers and canals are stored in the map, allowing the sea/river/canal status to also be stored for buoys, docks, locks and depots. All these are now allowed on rivers and removal of them will revert to the original water type [FS#1676] (r12042)
+- Fix: Change ownership of or remove statues when merging/bankrupting companies (r12038)
+- Fix: For station tiles, only get road types for road stops (r12036)
+- Fix: Teach YAPF where trams can reverse, and where not [FS#1702] (r12035)
+- Fix: Do not show train speed as zero after loading paused game (r12033)
+- Fix: When removing a statue, remove town statue flag for the statue owner, not current player (r12032)
+- Fix: Prevent towns from removing or claiming ownership of player owned tiles when growing [FS#1689,FS#1719] (r12031)
+- Fix: In one case trees could spread under bridges (r12024)
+- Fix: Put a better suited text in the quit-dialog [FS#1690] (r12023)
+- Fix: Restore initial intent on the invisible tree while transparent building patch setting [FS#1721] (r12018)
+- Fix: When you have more than 9 network interfaces you'll enter the wonderfull world of overflows (r12017)
+- Fix: Better work on strings in regard to gender [FS#1716] (r12015)
+- Fix: Lighthouses and transmitters were never supposed to be build on a slope (r12014)
+- Fix: When modifying watered tiles, mark neighboured canals and rivers dirty in more cases (r12013)
+- Fix: Enable TownRatingTestMode during cost estimation with 'shift'-key (r12012)
+- Fix: Do not consider one-corner-raised-shores to be watered tiles from all sides [FS#1701] (r12011)
+- Fix: Avoid loading sample.cat if it 'looks' incorrect, and avoid later null pointer dereferences by moving volume lookup deeper [FS#1707] (r12009)
+- Fix: Possible reading from an invalid pointer [FS#1717] (r12005)
+- Fix: When skipping Action 11 or 12, also skip belonging sprites (r12001)
+- Fix: Do entrance-slope-check for every tile of railstations (r11999)
+- Fix: Possible remote assert by setting bit 6 of p1 for CMD_REMOVE_ROAD [FS#1692] (r11998)
+- Fix: Update train statusbar when stopping from zero speed [FS#1706] (r11996)
+- Fix: Resize station/roadstop/dock/airport construction windows if cargo acceptance list is too long (r11993)
+- Fix: When building two rail stations close to each other (with control) so they looked like one long track trains would see them as one (r11992)
+- Fix: Resize autoreplace window to fit purchase information text if it is too large (r11989)
+- Fix: Build system ignored changes to table/control_codes.h which require strgen to be rebuilt (r11986)
+- Fix: Also draw corner shores under rail tracks (r11984)
+- Fix: Use unicode glyph mapping to fix up missing/shuffled sprites in original data files instead of shuffling or skipping sprites directly [FS#1698] (r11981)
+- 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: 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: 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)
+- Fix: Slope detection of bridge ramps. Helps YAPF and Trolly (r11946)
+- Fix: FileExists() failed for non latin paths (win32) (r11945)
+- Fix: Allow building drive-through road/tram stops at road/tram track that has no owner (r11944)
+- Fix: 'BRIDGE_TOO_LOW_FOR_TERRAIN'-check was wrong for steep slopes (r11936)
+- Fix: [Autoreplace] Single to dualhead locomotive replacefailed when player had enough money to replace and refit one but not enough to refit the last one as well [FS#1624] (r11929)
+- Fix: [Autoreplace] Autoreplace could refit train engines to the wrong cargo type if the old engine had no cargo capacity and the new one had (r11928)
+- Fix: Loading old, pre savegame version 2, savegames (r11925)
+- Fix: AI was reading wrong tile slope while building road bridge (r11917)
+- Fix: set correctly crossing state after train reversal, train leaving crossing, train crash (r11900)
+- Fix: Segmentation faults/wrong frees due uninitialized memory in the AI [FS#1658] (r11887)
+- Fix: Assert when trying to remove rail from a house or industry tile [FS#1663,FS#1665-6-7-8,FS#1680,FS#1686-7-8 FS#1715 FS#1742 FS#1771 FS#1776](r11883)
+- 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: 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)
+
0.6.0-beta3 (2008-01-16)
------------------------------------------------------------------------
--Feature: Replaced fixed size custom name array. Names are now attached to their object directly and there is no limit to the amount of names (r11822)
--Feature: Add drag-n-drop support to the raise/lower land tools. Land is raised/lowered at the start and the rest of the area levelled to match (r11759)
--Feature: Add support for NewGRF's train 'tilt' flag. Trains with tilt capability (specific details are per NewGRF set) will be given a 20% speed limit bonus on curves (r11741)
--Feature: Added sorting for cost, running costs and speed to road vehicles and ships build windows (r11710)
--Feature: List neutral stations where the player has service in the station list too (r11670)
--Feature: Check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen (r11646)
--Feature: Support shore replacement via Action 5 (r11726)
--Fix: When two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF [FS#1559] (r11862)
--Fix: Recompute town population when removing a 'newhouses' grf, or when loading a game with missing 'newhouses' grfs [FS#1335] (r11855)
--Fix: Road vehicle count was incorrect in network lobby window (r11844)
--Fix: Mark dirty canal tile even in diagonal direction from flooded tile, draw correctly canal next to half flooded rail tile (r11843, r11838)
--Fix: At least one instance of dmusic driver is needed for it to be registered and usable (r11826)
--Fix: An articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile [FS#1627] (r11825)
--Fix: Switch _screen to the output buffer and disable usage of 32bpp-anim animation buffer during giant screenshots [FS#1602] (r11813)
--Fix: Do not crash trains when leaving depot to a very long track [FS#716] (r11802)
--Fix: Take town rating into account when testing if a command can be executed [FS#1616] (r11795)
--Fix: Reversing a train when loading at a station with an adjacent station in the same axis crashed [FS#1632] (r11794)
--Fix: Group names got not deallocated in the command test run [FS#1614] (r11743)
--Fix: Run window tick events when paused, so that news pop-ups and the about window still progress. For other windows the events are ignored when paused [FS#1319] (r11742)
--Fix: Modify and possibly discard key events for code points in the unicode private use area [FS#1610] (r11740)
--Fix: Set the new scroll position after zooming in instead of before, as the zoom will cancel it out [FS#1609] (r11739)
--Fix: Do not reset loading indicator IDs when only reloading NewGRFs [FS#1574] (r11735)
--Fix: Elrail merge gave elrail, monorail & maglev unintended speed bonuses for curves, as the bonus was based on the railtype index. The bonus is now specified by a property of the railtype (r11732)
--Fix: Clear sprite override data before performing NewGRF wagon attach callback. This stopped the callback working for autoreplace and when moving wagons from train to train in a depot [FS#1582] (r11731)
--Fix: If there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available [FS#1577] (r11727)
--Fix: Make it impossible (for users) to circumvent the length checking of the NewGRF 'allow wagon attach' callback by moving several wagons at a time (r11724)
--Fix: Do not put more than one Random() in function calls because parameter evaluation order is not guaranteed in the c++ standard [FS#1561] (r11716)
--Fix: Do not allow player inauguration date on scenarios to be bigger than current year [FS#1569] (r11714)
--Fix: Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids (r11712)
--Fix: Do not allow refitting flooded (destroyed) vehicles (r11707)
--Fix: Trains could have sprites with wrong direction when reversing, also was inconsistent with save/load process [FS#1557] (r11705)
--Fix: When removing buoys, return to water or canal depending on their owner (r11666)
--Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08 (r11665)
--Fix: Do not allow modifying non-uniform stations when non-uniform stations are disabled [FS#1563] (r11659)
--Fix: 'Initialised' NewGRFs could still be deactivated in the later 'activation' pass (r11650)
--Fix: Vehicles were still followed when sold [FS#1541] (r11632)
--Fix: Many viewports could crash the scenario editor [FS#1527] (r11629)
--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: Sometimes large values could go off the chart [FS#1526] (r11616)
--Fix: Temperate banks can only be built in towns (over a house) (r11615)
+- Feature: Replaced fixed size custom name array. Names are now attached to their object directly and there is no limit to the amount of names (r11822)
+- Feature: Add drag-n-drop support to the raise/lower land tools. Land is raised/lowered at the start and the rest of the area levelled to match (r11759)
+- Feature: Add support for NewGRF's train 'tilt' flag. Trains with tilt capability (specific details are per NewGRF set) will be given a 20% speed limit bonus on curves (r11741)
+- Feature: Added sorting for cost, running costs and speed to road vehicles and ships build windows (r11710)
+- Feature: List neutral stations where the player has service in the station list too (r11670)
+- Feature: Check whether (some) characters are missing in the current 'font' for the 'currently' chosen language and give a warning when that does happen (r11646)
+- Feature: Support shore replacement via Action 5 (r11726)
+- Fix: When two NewGRFs 'fight' to define the same cargo it could happen that the strings are defined by one cargo and the 'action2' by another and when one assumes that both come from the same NewGRF [FS#1559] (r11862)
+- Fix: Recompute town population when removing a 'newhouses' grf, or when loading a game with missing 'newhouses' grfs [FS#1335] (r11855)
+- Fix: Road vehicle count was incorrect in network lobby window (r11844)
+- Fix: Mark dirty canal tile even in diagonal direction from flooded tile, draw correctly canal next to half flooded rail tile (r11843, r11838)
+- Fix: At least one instance of dmusic driver is needed for it to be registered and usable (r11826)
+- Fix: An articulated road vehicle could split up when it turned around at a corner and then would enter a drive through station at the next tile [FS#1627] (r11825)
+- Fix: Switch _screen to the output buffer and disable usage of 32bpp-anim animation buffer during giant screenshots [FS#1602] (r11813)
+- Fix: Do not crash trains when leaving depot to a very long track [FS#716] (r11802)
+- Fix: Take town rating into account when testing if a command can be executed [FS#1616] (r11795)
+- Fix: Reversing a train when loading at a station with an adjacent station in the same axis crashed [FS#1632] (r11794)
+- Fix: Group names got not deallocated in the command test run [FS#1614] (r11743)
+- Fix: Run window tick events when paused, so that news pop-ups and the about window still progress. For other windows the events are ignored when paused [FS#1319] (r11742)
+- Fix: Modify and possibly discard key events for code points in the unicode private use area [FS#1610] (r11740)
+- Fix: Set the new scroll position after zooming in instead of before, as the zoom will cancel it out [FS#1609] (r11739)
+- Fix: Do not reset loading indicator IDs when only reloading NewGRFs [FS#1574] (r11735)
+- Fix: Elrail merge gave elrail, monorail & maglev unintended speed bonuses for curves, as the bonus was based on the railtype index. The bonus is now specified by a property of the railtype (r11732)
+- Fix: Clear sprite override data before performing NewGRF wagon attach callback. This stopped the callback working for autoreplace and when moving wagons from train to train in a depot [FS#1582] ( r11731)
+- Fix: If there are no houses that can be build in a specific year yet, force the houses with the earliest introduction year to be available [FS#1577] (r11727)
+- Fix: Make it impossible (for users) to circumvent the length checking of the NewGRF 'allow wagon attach' callback by moving several wagons at a time (r11724)
+- Fix: Do not put more than one Random() in function calls because parameter evaluation order is not guaranteed in the C++ standard [FS#1561] (r11716)
+- Fix: Do not allow player inauguration date on scenarios to be bigger than current year [FS#1569] (r11714)
+- Fix: Add more house string id ranges to MapGRFStringID so NewGRFs use the proper string ids (r11712)
+- Fix: Do not allow refitting flooded (destroyed) vehicles (r11707)
+- Fix: Trains could have sprites with wrong direction when reversing, also was inconsistent with save/load process [FS#1557] (r11705)
+- Fix: When removing buoys, return to water or canal depending on their owner (r11666)
+- Fix: Animation informations should not be copied from original industry tile spec, while doing an action 00, industry tile, prop 08 (r11665)
+- Fix: Do not allow modifying non-uniform stations when non-uniform stations are disabled [FS#1563] (r11659)
+- Fix: 'Initialised' NewGRFs could still be deactivated in the later 'activation' pass (r11650)
+- Fix: Vehicles were still followed when sold [FS#1541] (r11632)
+- Fix: Many viewports could crash the scenario editor [FS#1527] (r11629)
+- 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: Sometimes large values could go off the chart [FS#1526] (r11616)
+- Fix: Temperate banks can only be built in towns (over a house) (r11615)
0.6.0-beta2 (2007-12-09)
diff -r cc77111ebd85 -r 9707ad4c9b60 config.lib
--- a/config.lib Thu Mar 27 05:15:06 2008 +0000
+++ b/config.lib Fri Mar 28 10:32:55 2008 +0000
@@ -970,12 +970,6 @@
if [ $cc_version -ge 42 ]; then
CFLAGS="$CFLAGS -fno-strict-overflow"
fi
-
- # GCC 4.3+ gives a warning about empty body of
- # loops and conditions
- if [ $cc_version -ge 43 ]; then
- CFLAGS="$CFLAGS -Wno-empty-body"
- fi
fi
if [ "$os" != "CYGWIN" ] && [ "$os" != "FREEBSD" ] && [ "$os" != "OPENBSD" ] && [ "$os" != "MINGW" ] && [ "$os" != "MORPHOS" ] && [ "$os" != "OSX" ] && [ "$os" != "WINCE" ] && [ "$os" != "PSP" ] && [ "$os" != "OS2" ]; then
diff -r cc77111ebd85 -r 9707ad4c9b60 docs/landscape.html
--- a/docs/landscape.html Thu Mar 27 05:15:06 2008 +0000
+++ b/docs/landscape.html Fri Mar 28 10:32:55 2008 +0000
@@ -646,6 +646,7 @@
m3 bit 6 : bit 8 of house type (m4), allowing 512 different types.
+ m3 bit 5 : bit 6 of current animation frame (see m6)
m3 bits 4..0 : triggers activated (newhouses)
m4 : town building type (with m3[6] bit)
m5 : see m3 bit 7
@@ -653,8 +654,7 @@
- If newhouses is activated
- - bits 7..3 : Current animation frame
- - bit 2 : free
+ - bits 7..2 : Current animation frame (bits 5..0); bit 6 in m3
- Standard behaviour
diff -r cc77111ebd85 -r 9707ad4c9b60 docs/landscape_grid.html
--- a/docs/landscape_grid.html Thu Mar 27 05:15:06 2008 +0000
+++ b/docs/landscape_grid.html Fri Mar 28 10:32:55 2008 +0000
@@ -170,10 +170,10 @@
XXXX XXXX |
XXXX XXXX |
XXXX XXXX XXXX XXXX |
- XXO~ ~~XX |
+ XXX~ ~~XX |
XXXX XXXX |
XXXX XXXX |
- XXXX XXXX |
+ XXXX XXXX |
XXXX XXXX |
diff -r cc77111ebd85 -r 9707ad4c9b60 known-bugs.txt
--- a/known-bugs.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/known-bugs.txt Fri Mar 28 10:32:55 2008 +0000
@@ -11,14 +11,13 @@
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.6.0-beta3
+Bugs for 0.6.0-beta5
------------------------------------------------------------------------
URL: http://bugs.openttd.org
- 1762 Strange Autoreplace behaviour
- 1711 Gravel and Clay have no worth
- 1693 Removing road does not reset owner
-- 1549 Timetable + group ID are not backed up with orders
- 1495 Long vehicles block multistop station
- 1487 Ending_year is never written to
- 1473 Train not going to available platform
diff -r cc77111ebd85 -r 9707ad4c9b60 os/debian/changelog
--- a/os/debian/changelog Thu Mar 27 05:15:06 2008 +0000
+++ b/os/debian/changelog Fri Mar 28 10:32:55 2008 +0000
@@ -1,4 +1,16 @@
-openttd (0.6.0~beta4) unstable; urgency=low
+openttd (0.7~svn) unstable; urgency=low
+
+ * Unreleased SVN version. Versioned to allow normal upgrades to released versions.
+
+ -- Matthijs Kooijman Sat, 22 Mar 2007 21:07:05 +0100
+
+openttd (0.6.0~beta5) unstable; urgency=low
+
+ * New upstream release.
+
+ -- Matthijs Kooijman Mon, 04 Mar 2008 18:06:31 +0100
+
+openttd (0.6.0~beta4-1) unstable; urgency=low
* New upstream release.
diff -r cc77111ebd85 -r 9707ad4c9b60 os/mandrake/README.urpmi
--- a/os/mandrake/README.urpmi Thu Mar 27 05:15:06 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,9 +0,0 @@
-You require the data files of the original Transport Tycoon Deluxe
-for Windows to play the game. You have to manually copy the following
-files to %{_gamesdatadir}/openttd/data/
-sample.cat
-trg1r.grf
-trgcr.grf
-trghr.grf
-trgir.grf
-trgtr.grf
diff -r cc77111ebd85 -r 9707ad4c9b60 os/mandrake/openttd.spec
--- a/os/mandrake/openttd.spec Thu Mar 27 05:15:06 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,146 +0,0 @@
-#------------------------------------------------------------------------------
-# openttd.spec
-# This SPEC file controls the building of custom OpenTTD RPM
-# packages.
-#------------------------------------------------------------------------------
-
-%define name openttd
-%define version 0.5.0
-%define release 1mdk
-
-#------------------------------------------------------------------------------
-# Prologue information
-#------------------------------------------------------------------------------
-Name: %{name}
-Version: %{version}
-Release: %{release}
-Summary: An open source clone of the Microprose game "Transport Tycoon Deluxe"
-Group: Games/Strategy
-License: GPL
-
-URL: http://www.openttd.org
-
-Source: %{name}-%{version}.tar.gz
-Packager: Dominik Scherer
-BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
-BuildRequires: libSDL1.2-devel >= 1.2.7
-BuildRequires: libpng3-devel >= 1.2.5
-BuildRequires: zlib1-devel >= 1.2.1
-
-#------------------------------------------------------------------------------
-# Description
-#------------------------------------------------------------------------------
-%description
-An enhanced open source clone of the Microprose game "Transport Tycoon Deluxe".
-You require the data files of the original Transport Tycoon Deluxe
-for Windows to play the game. You have to MANUALLY copy them to the
-game data directory!
-
-#------------------------------------------------------------------------------
-# install scripts
-#------------------------------------------------------------------------------
-%prep
-rm -rf $RPM_BUILD_ROOT
-%setup
-
-%build
-make BINARY_DIR=%{_gamesbindir} PREFIX=%{_gamesdatadir} DATA_DIR=openttd INSTALL_DIR=%{_gamesdatadir}/openttd/ USE_HOMEDIR=1 PERSONAL_DIR=.openttd INSTALL=1 RELEASE=%{version}
-
-%install
-mkdir -p $RPM_BUILD_ROOT%{_gamesbindir}
-mkdir -p $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/lang
-mkdir -p $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/data
-mkdir -p $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/scenario
-
-cp ./openttd $RPM_BUILD_ROOT%{_gamesbindir}/
-cp -r ./lang/*.lng $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/lang/
-cp -r ./data/*.grf $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/data/
-cp -r ./scenario/*.scn $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/scenario/
-cp -r ./data/opntitle.dat $RPM_BUILD_ROOT%{_gamesdatadir}/openttd/data/
-
-# icon
-install -m644 media/openttd.32.png -D $RPM_BUILD_ROOT%{_miconsdir}/%{name}.png
-install -m644 media/openttd.64.png -D $RPM_BUILD_ROOT%{_iconsdir}/%{name}.png
-install -m644 media/openttd.128.png -D $RPM_BUILD_ROOT%{_liconsdir}/%{name}.png
-
-# menu entry
-mkdir -p $RPM_BUILD_ROOT/%{_menudir}
-cat << EOF > $RPM_BUILD_ROOT/%{_menudir}/%{name}
-?package(%{name}):command="%{_gamesbindir}/openttd" icon="%{name}.png" \
- needs="X11" section="Amusement/Strategy" title="OpenTTD" \
- longtitle="%{Summary}"
-EOF
-
-%clean
-rm -rf $RPM_BUILD_ROOT
-
-%post
-%{update_menus}
-
-%postun
-%{clean_menus}
-
-#------------------------------------------------------------------------------
-# Files listing.
-#------------------------------------------------------------------------------
-%files
-%defattr(-,root,root,0755)
-%{_gamesbindir}/openttd
-
-%{_gamesdatadir}/openttd/lang/american.lng
-%{_gamesdatadir}/openttd/lang/catalan.lng
-%{_gamesdatadir}/openttd/lang/czech.lng
-%{_gamesdatadir}/openttd/lang/danish.lng
-%{_gamesdatadir}/openttd/lang/dutch.lng
-%{_gamesdatadir}/openttd/lang/english.lng
-%{_gamesdatadir}/openttd/lang/finnish.lng
-%{_gamesdatadir}/openttd/lang/french.lng
-%{_gamesdatadir}/openttd/lang/galician.lng
-%{_gamesdatadir}/openttd/lang/german.lng
-%{_gamesdatadir}/openttd/lang/hungarian.lng
-%{_gamesdatadir}/openttd/lang/icelandic.lng
-%{_gamesdatadir}/openttd/lang/italian.lng
-%{_gamesdatadir}/openttd/lang/norwegian.lng
-%{_gamesdatadir}/openttd/lang/origveh.lng
-%{_gamesdatadir}/openttd/lang/polish.lng
-%{_gamesdatadir}/openttd/lang/portuguese.lng
-%{_gamesdatadir}/openttd/lang/romanian.lng
-%{_gamesdatadir}/openttd/lang/slovak.lng
-%{_gamesdatadir}/openttd/lang/spanish.lng
-%{_gamesdatadir}/openttd/lang/swedish.lng
-
-%{_gamesdatadir}/openttd/data/autorail.grf
-%{_gamesdatadir}/openttd/data/canalsw.grf
-%{_gamesdatadir}/openttd/data/openttd.grf
-%{_gamesdatadir}/openttd/data/opntitle.dat
-%{_gamesdatadir}/openttd/data/signalsw.grf
-%{_gamesdatadir}/openttd/data/trkfoundw.grf
-
-"%{_gamesdatadir}/openttd/scenario/Linkgame Islands 2004.scn"
-"%{_gamesdatadir}/openttd/scenario/Mountain Pass.scn"
-"%{_gamesdatadir}/openttd/scenario/Volcano City.scn"
-
-%{_menudir}/%{name}
-%{_iconsdir}/*.png
-%{_miconsdir}/*.png
-%{_liconsdir}/*.png
-
-%doc changelog.txt readme.txt COPYING os/linux/README.urpmi
-
-#------------------------------------------------------------------------------
-# Change Log
-#------------------------------------------------------------------------------
-%changelog
-* Sun Jan 23 2005 Dominik Scherer 0.3.6-1mdk
-- Upgraded to 0.3.6
-- Structured and commented the spec file a bit (inspired by ScummVM)
-
-* Fri Dec 24 2004 Dominik Scherer 0.3.5-1mdk
-- Upgraded to 0.3.5
-- Added a warning message about the additional required files (only displayed when installing via urpmi)
-
-* Wed Sep 15 2004 Dominik Scherer <> 0.3.4-1mdk
-- Upgraded to 0.3.4
-
-* Wed Jul 31 2004 Dominik Scherer <> 0.3.3-1mdk
-- Initial release
diff -r cc77111ebd85 -r 9707ad4c9b60 os/rpm/openttd.spec
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/os/rpm/openttd.spec Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,75 @@
+#
+# spec file for package openttd (trunk)
+#
+# Copyright (c) 2007 The OpenTTD team.
+# This file and all modifications and additions to the pristine
+# package are under the same license as the package itself
+#
+Name: openttd
+Version: svn
+Release: head
+Group: Applications/Games
+Source: %{name}-%{version}-%{release}.tar.gz
+License: GPL
+URL: http://www.openttd.org
+Packager: Denis Burlaka
+Summary: OpenTTD is an Open Source clone of Chris Sawyer's Transport Tycoon Deluxe
+Requires: SDL zlib libpng freetype2 fontconfig
+BuildRequires: gcc SDL-devel zlib-devel libpng-devel fontconfig-devel
+%if %{_vendor}=="suse"
+BuildRequires: freetype2-devel
+%endif
+%if %{_vendor}=="fedora"
+BuildRequires: freetype-devel
+%endif
+%if %{_vendor}=="mandriva"
+BuildRequires: libfreetype6-devel
+%endif
+BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-buildroot
+Prefix: /usr
+
+%description
+OpenTTD is a clone of the Microprose game "Transport Tycoon Deluxe", a popular game originally written by Chris Sawyer. It attempts to mimic the original game as closely as possible while extending it with new features.
+
+OpenTTD is licensed under the GNU General Public License version 2.0. For more information, see the file 'COPYING' included with every release and source download of the game.
+
+%prep
+%setup
+
+%build
+./configure --prefix-dir=%{prefix} --binary-dir=bin --install-dir="$RPM_BUILD_ROOT"
+make
+
+%install
+make ROOT="$RPM_BUILD_ROOT" install
+
+mkdir -p $RPM_BUILD_ROOT/%{_datadir}/applications
+cat << EOF > $RPM_BUILD_ROOT/%{_datadir}/applications/%{name}.desktop
+[Desktop Entry]
+Categories=Games;
+Encoding=UTF-8
+Exec=/usr/bin/openttd
+Name=OpenTTD
+Icon=openttd.32
+Terminal=false
+Type=Application
+EOF
+
+%clean
+rm -Rf "$RPM_BUILD_ROOT"
+
+%files
+%dir %{_datadir}/games/%{name}
+%dir %{_datadir}/games/%{name}/lang
+%dir %{_datadir}/games/%{name}/data
+%dir %{_datadir}/games/%{name}/gm
+%dir %{_datadir}/games/%{name}/docs
+%dir %{_datadir}/pixmaps
+%defattr(644, root, games, 755)
+%attr(755, root, games) %{_bindir}/%{name}
+%{_datadir}/games/%{name}/lang/*
+%{_datadir}/games/%{name}/data/*
+%{_datadir}/games/%{name}/docs/*
+%{_datadir}/pixmaps/*
+%{_datadir}/applications/%{name}.desktop
+
diff -r cc77111ebd85 -r 9707ad4c9b60 os/suse/openttd.spec
Binary file os/suse/openttd.spec has changed
diff -r cc77111ebd85 -r 9707ad4c9b60 os/win32/installer/install.nsi
--- a/os/win32/installer/install.nsi Thu Mar 27 05:15:06 2008 +0000
+++ b/os/win32/installer/install.nsi Fri Mar 28 10:32:55 2008 +0000
@@ -1,9 +1,9 @@
!define APPNAME "OpenTTD" ; Define application name
!define APPVERSION "0.6.0" ; Define application version
-!define INSTALLERVERSION 42 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
+!define INSTALLERVERSION 43 ; NEED TO UPDATE THIS FOR EVERY RELEASE!!!
!define APPURLLINK "http://www.openttd.org"
-!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}-beta4"
+!define APPNAMEANDVERSION "${APPNAME} ${APPVERSION}-beta5"
!define APPVERSIONINTERNAL "${APPVERSION}.0" ; Needs to be of the format X.X.X.X
!define MUI_ICON "..\..\..\media\openttd.ico"
diff -r cc77111ebd85 -r 9707ad4c9b60 projects/determineversion.vbs
--- a/projects/determineversion.vbs Thu Mar 27 05:15:06 2008 +0000
+++ b/projects/determineversion.vbs Fri Mar 28 10:32:55 2008 +0000
@@ -53,6 +53,43 @@
UpdateFile revision, version, cur_date, "../src/ottdres.rc"
End Sub
+Function ReadRegistryKey(shive, subkey, valuename, architecture)
+ Dim hiveKey, objCtx, objLocator, objServices, objReg, Inparams, Outparams
+
+ ' First, get the Registry Provider for the requested architecture
+ Set objCtx = CreateObject("WbemScripting.SWbemNamedValueSet")
+ objCtx.Add "__ProviderArchitecture", architecture ' Must be 64 of 32
+ Set objLocator = CreateObject("Wbemscripting.SWbemLocator")
+ Set objServices = objLocator.ConnectServer("","root\default","","",,,,objCtx)
+ Set objReg = objServices.Get("StdRegProv")
+
+ ' Check the hive and give it the right value
+ Select Case shive
+ Case "HKCR", "HKEY_CLASSES_ROOT"
+ hiveKey = &h80000000
+ Case "HKCU", "HKEY_CURRENT_USER"
+ hiveKey = &H80000001
+ Case "HKLM", "HKEY_LOCAL_MACHINE"
+ hiveKey = &h80000002
+ Case "HKU", "HKEY_USERS"
+ hiveKey = &h80000003
+ Case "HKCC", "HKEY_CURRENT_CONFIG"
+ hiveKey = &h80000005
+ Case "HKDD", "HKEY_DYN_DATA" ' Only valid for Windows 95/98
+ hiveKey = &h80000006
+ Case Else
+ MsgBox "Hive not valid (ReadRegistryKey)"
+ End Select
+
+ Set Inparams = objReg.Methods_("GetStringValue").Inparameters
+ Inparams.Hdefkey = hiveKey
+ Inparams.Ssubkeyname = subkey
+ Inparams.Svaluename = valuename
+ Set Outparams = objReg.ExecMethod_("GetStringValue", Inparams,,objCtx)
+
+ ReadRegistryKey = Outparams.SValue
+End Function
+
Function DetermineSVNVersion()
Dim WshShell, version, url, oExec, line
Set WshShell = CreateObject("WScript.Shell")
@@ -61,27 +98,35 @@
' Try TortoiseSVN
' Get the directory where TortoiseSVN (should) reside(s)
Dim sTortoise
- sTortoise = WshShell.RegRead("HKLM\SOFTWARE\TortoiseSVN\Directory")
+ ' First, try with 32-bit architecture
+ sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 32)
+ If sTortoise = Nothing Then
+ ' No 32-bit version of TortoiseSVN installed, try 64-bit version (doesn't hurt on 32-bit machines, it returns nothing or is ignored)
+ sTortoise = ReadRegistryKey("HKLM", "SOFTWARE\TortoiseSVN", "Directory", 64)
+ End If
- Dim file
- ' Write some "magic" to a temporary file so we can acquire the svn revision/state
- Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0)
- file.WriteLine "r$WCREV$$WCMODS?M:$"
- file.WriteLine "$WCURL$"
- file.Close
- Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp")
- ' Wait till the application is finished ...
- Do
- OExec.StdOut.ReadLine()
- Loop While Not OExec.StdOut.atEndOfStream
+ ' If TortoiseSVN is installed, try to get the revision number
+ If sTortoise <> Nothing Then
+ Dim file
+ ' Write some "magic" to a temporary file so we can acquire the svn revision/state
+ Set file = FSO.CreateTextFile("tsvn_tmp", -1, 0)
+ file.WriteLine "r$WCREV$$WCMODS?M:$"
+ file.WriteLine "$WCURL$"
+ file.Close
+ Set oExec = WshShell.Exec(sTortoise & "\bin\SubWCRev.exe ../src tsvn_tmp tsvn_tmp")
+ ' Wait till the application is finished ...
+ Do
+ OExec.StdOut.ReadLine()
+ Loop While Not OExec.StdOut.atEndOfStream
- Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0)
- version = file.ReadLine
- url = file.ReadLine
- file.Close
+ Set file = FSO.OpenTextFile("tsvn_tmp", 1, 0, 0)
+ version = file.ReadLine
+ url = file.ReadLine
+ file.Close
- Set file = FSO.GetFile("tsvn_tmp")
- file.Delete
+ Set file = FSO.GetFile("tsvn_tmp")
+ file.Delete
+ End If
' Looks like there is no TortoiseSVN installed either. Then we don't know it.
If InStr(version, "$") Then
diff -r cc77111ebd85 -r 9707ad4c9b60 projects/openttd_vs80.vcproj
--- a/projects/openttd_vs80.vcproj Thu Mar 27 05:15:06 2008 +0000
+++ b/projects/openttd_vs80.vcproj Fri Mar 28 10:32:55 2008 +0000
@@ -780,6 +780,10 @@
Name="Header Files"
>
+
+
@@ -888,6 +892,10 @@
>
+
+
@@ -1004,6 +1012,18 @@
>
+
+
+
+
+
+
@@ -1012,6 +1032,10 @@
>
+
+
@@ -1020,6 +1044,10 @@
>
+
+
@@ -1112,6 +1140,10 @@
>
+
+
@@ -1124,7 +1156,11 @@
>
+
+
+
+
@@ -1280,6 +1320,10 @@
>
+
+
@@ -1376,6 +1420,10 @@
>
+
+
@@ -1396,6 +1444,10 @@
>
+
+
@@ -1424,6 +1476,14 @@
>
+
+
+
+
@@ -1440,6 +1500,14 @@
>
+
+
+
+
@@ -1544,6 +1612,10 @@
>
+
+
@@ -1592,6 +1664,10 @@
>
+
+
@@ -1712,6 +1788,10 @@
>
+
+
@@ -1724,6 +1804,10 @@
>
+
+
@@ -1732,6 +1816,10 @@
>
+
+
@@ -1752,6 +1840,10 @@
>
+
+
@@ -1788,6 +1880,10 @@
>
+
+
@@ -2632,10 +2728,6 @@
>
-
-
diff -r cc77111ebd85 -r 9707ad4c9b60 projects/openttd_vs90.vcproj
--- a/projects/openttd_vs90.vcproj Thu Mar 27 05:15:06 2008 +0000
+++ b/projects/openttd_vs90.vcproj Fri Mar 28 10:32:55 2008 +0000
@@ -777,6 +777,10 @@
Name="Header Files"
>
+
+
@@ -885,6 +889,10 @@
>
+
+
@@ -1001,6 +1009,18 @@
>
+
+
+
+
+
+
@@ -1009,6 +1029,10 @@
>
+
+
@@ -1017,6 +1041,10 @@
>
+
+
@@ -1109,6 +1137,10 @@
>
+
+
@@ -1121,7 +1153,11 @@
>
+
+
+
+
@@ -1277,6 +1317,10 @@
>
+
+
@@ -1373,6 +1417,10 @@
>
+
+
@@ -1393,6 +1441,10 @@
>
+
+
@@ -1421,6 +1473,14 @@
>
+
+
+
+
@@ -1437,6 +1497,14 @@
>
+
+
+
+
@@ -1541,6 +1609,10 @@
>
+
+
@@ -1589,6 +1661,10 @@
>
+
+
@@ -1709,6 +1785,10 @@
>
+
+
@@ -1721,6 +1801,10 @@
>
+
+
@@ -1729,6 +1813,10 @@
>
+
+
@@ -1749,6 +1837,10 @@
>
+
+
@@ -1785,6 +1877,10 @@
>
+
+
@@ -2629,10 +2725,6 @@
>
-
-
diff -r cc77111ebd85 -r 9707ad4c9b60 readme.txt
--- a/readme.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/readme.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1,6 +1,6 @@
OpenTTD README
-Last updated: 2008-02-18
-Release version: 0.6.0-beta4
+Last updated: 2008-03-04
+Release version: 0.6.0-beta5
------------------------------------------------------------------------
@@ -11,6 +11,9 @@
* 2.1 Reporting Bugs
3.0) Supported Platforms
4.0) Installing and running OpenTTD
+ * 4.1 (Required) 3rd party files
+ * 4.2 OpenTTD directories
+ * 4.3 Portable Installations (External Media)
5.0) OpenTTD features
6.0) Configuration File
7.0) Compiling
@@ -88,25 +91,100 @@
be installed, or you have downloaded an installer, which will automatically
extract OpenTTD in the given directory.
-Before you run OpenTTD, you need to put the game's datafiles into the data/
-subdirectory. You need the following files from the original version
-of TTD as OpenTTD makes use of the original TTD artwork. The Windows
-installer optionally can copy these files from your Transport Tycoon Deluxe
-CD-ROM.
+OpenTTD looks in multiple locations to find the required data files (described
+in section 4.2). Installing any 3rd party files into a "shared" location has
+the advantage that you only need to do this step once, rather than copying the
+data files into all OpenTTD versions you have.
+Savegames, screenshots, etc are saved relative to the config file (openttd.cfg)
+currently being used. This means that if you use a config file in one of the
+shared directories, savegames will reside in the save/ directory next to the
+openttd.cfg file there.
+If you want savegames and screenshots in the directory where the OpenTTD binary
+resides, simply have your config file in that location. But if you remove this
+config file, savegames will still be in this directory (see notes in section 4.2)
+
+4.1) (Required) 3rd party files:
+---- ---------------------------
+
+Before you run OpenTTD, you need to put the game's datafiles into a data/
+directory which can be located in various places addressed in the following
+section.
+As OpenTTD makes use of the original TTD artwork you will need the files listed
+below, which you can find on a Transport Tycoon Deluxe CD-ROM.
+The Windows installer optionally can copy these files from that CD-ROM.
List of the required files:
-sample.cat
-trg1r.grf
-trgcr.grf
-trghr.grf
-trgir.grf
-trgtr.grf
+ - sample.cat
+ - trg1r.grf
+ - trgcr.grf
+ - trghr.grf
+ - trgir.grf
+ - trgtr.grf
-(Alternatively you can use the TTD GRF files from the DOS version: TRG1.GRF,
-TRGC.GRF, TRGH.GRF, TRGI.GRF, TRGT.GRF.
+Alternatively you can use the TTD GRF files from the DOS version:
+ - TRG1.GRF
+ - TRGC.GRF
+ - TRGH.GRF
+ - TRGI.GRF
+ - TRGT.GRF
-If you want music you need to copy the gm/ folder from Windows TTD into your
-OpenTTD folder, not your data folder.
+If you want the TTD music, copy the gm/ folder from the Windows version
+of TTD to your OpenTTD folder (not your data folder - also explained in
+the following sections).
+
+Do NOT copy files included with OpenTTD into "shared" directories (explained in
+the following sections) as sooner or later you will run into graphical glitches
+when using other versions of the game.
+
+4.2) OpenTTD directories
+---- -------------------------------
+
+The TTD artwork files listed in the section 4.1 "(Required) 3rd party files"
+can be placed in a few different locations:
+ 1. The current working directory (from where you started OpenTTD)
+ 2. Your personal directory
+ Windows: C:\Documents and Settings\\My Documents\OpenTTD
+ Mac OSX: ~/Documents/OpenTTD
+ Linux: ~/.openttd
+ 3. The shared directory
+ Windows: C:\Documents and Settings\All Users\Documents\OpenTTD
+ Mac OSX: /Library/Application Support/OpenTTD
+ Linux: not available
+ 4. The binary directory (where the OpenTTD executable is)
+ Windows: C:\Program Files\OpenTTD
+ Linux: /usr/games
+ 5. The installation directory (Linux only)
+ Linux: /usr/share/games/openttd
+ 6. The application bundle (Mac OSX only)
+ It includes the OTTD files (grf+lng) and it will work as long as they aren't touched
+
+Notes:
+ - Linux in the previous list means .deb, but most paths should be similar for others.
+ - The previous search order is also used for newgrfs and openttd.cfg.
+ - If openttd.cfg is not found, then it will be created using the 2, 4, 1, 3, 5 order.
+ - Savegames will be relative to the config file only if there is no save/
+ directory in paths with higher priority than the config file path, but
+ autosaves and screenshots will always be relative to the config file.
+
+The prefered setup:
+Place 3rd party files in shared directory (or in personal directory if you don't
+have write access on shared directory) and have your openttd.cfg config file in
+personal directory (where the game will then also place savegames and screenshots).
+
+
+4.3) Portable Installations (External Media):
+---- ----------------------------------------
+
+You can install OpenTTD on external media so you can take it with you, i.e.
+using a USB key, or a USB HDD, etc.
+Create a directory where you shall store the game in (i.e. OpenTTD/).
+Copy the binary (OpenTTD.exe, OpenTTD.app, openttd, etc), data/ and your
+openttd.cfg to this directory.
+You can copy binaries for any operating system into this directory, which will
+allow you to play the game on nearly any computer you can attach the external
+media to.
+As always - additional grf files are stored in the data/ dir (for details,
+again, see section 4.1).
5.0) OpenTTD features:
diff -r cc77111ebd85 -r 9707ad4c9b60 source.list
--- a/source.list Thu Mar 27 05:15:06 2008 +0000
+++ b/source.list Fri Mar 28 10:32:55 2008 +0000
@@ -103,6 +103,7 @@
window.cpp
# Header Files
+ai/ai.h
aircraft.h
airport.h
airport_movement.h
@@ -130,6 +131,7 @@
date_type.h
debug.h
video/dedicated_v.h
+ai/default/default.h
depot.h
direction_func.h
direction_type.h
@@ -159,10 +161,15 @@
industry_type.h
landscape.h
livery.h
+lzoconf.h
+map_func.h
+map_type.h
core/math_func.hpp
md5.h
+minilzo.h
mixer.h
music.h
+namegen_func.h
network/network.h
network/network_client.h
network/network_data.h
@@ -186,10 +193,12 @@
newgrf_spritegroup.h
newgrf_station.h
newgrf_storage.h
+newgrf_string_type.h
newgrf_text.h
newgrf_town.h
newgrf_townname.h
-news.h
+news_func.h
+news_type.h
npf.h
music/null_m.h
sound/null_s.h
@@ -217,6 +226,7 @@
roadveh.h
saveload.h
screenshot.h
+sdl.h
sound/sdl_s.h
squirrel.hpp
squirrel_class.hpp
@@ -228,6 +238,7 @@
settings_type.h
ship.h
signal_func.h
+signal_type.h
signs.h
slope_func.h
slope_type.h
@@ -252,11 +263,13 @@
timetable.h
town.h
town_type.h
+toolbar_gui.h
track_func.h
track_type.h
train.h
transparency.h
transparency_gui.h
+ai/trolly/trolly.h
tunnelbridge.h
unmovable.h
variables.h
@@ -264,15 +277,33 @@
vehicle_func.h
vehicle_gui.h
vehicle_type.h
+viewport_func.h
+viewport_type.h
waypoint.h
music/win32_m.h
sound/win32_s.h
video/win32_v.h
+water.h
+win32.h
window_func.h
window_gui.h
window_type.h
zoom_func.h
zoom_type.h
+#if WIN32
+#else
+music/bemidi.h
+music/extmidi.h
+music/libtimidity.h
+music/os2_m.h
+music/qtmidi.h
+os/macosx/macos.h
+os/macosx/osx_stdafx.h
+os/macosx/splash.h
+sound/cocoa_s.h
+video/cocoa/cocoa_keys.h
+video/cocoa/cocoa_v.h
+#end
# GUI Source Code
aircraft_gui.cpp
@@ -295,6 +326,7 @@
newgrf_gui.cpp
news_gui.cpp
order_gui.cpp
+osk_gui.cpp
player_gui.cpp
rail_gui.cpp
road_gui.cpp
@@ -307,6 +339,7 @@
subsidy_gui.cpp
terraform_gui.cpp
timetable_gui.cpp
+toolbar_gui.cpp
town_gui.cpp
train_gui.cpp
transparency_gui.cpp
@@ -339,16 +372,20 @@
table/ai_rail.h
table/animcursors.h
table/autorail.h
+table/bridge_land.h
table/build_industry.h
table/cargo_const.h
table/clear_land.h
+table/control_codes.h
table/elrail_data.h
table/engines.h
+table/files.h
table/genland.h
table/industry_land.h
table/landscape_sprite.h
table/namegen.h
table/palettes.h
+table/railtypes.h
table/road_land.h
table/roadveh_movement.h
table/sprites.h
@@ -358,6 +395,7 @@
table/track_land.h
table/train_cmd.h
table/tree_land.h
+table/unicode.h
table/unmovable_land.h
table/water_land.h
@@ -585,7 +623,6 @@
yapf/yapf.h
yapf/yapf.hpp
yapf/yapf_base.hpp
-yapf/yapf_common.cpp
yapf/yapf_common.hpp
yapf/yapf_costbase.hpp
yapf/yapf_costcache.hpp
diff -r cc77111ebd85 -r 9707ad4c9b60 src/aircraft_cmd.cpp
--- a/src/aircraft_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/aircraft_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
#include "depot.h"
#include "engine.h"
#include "station.h"
-#include "news.h"
+#include "news_func.h"
#include "aircraft.h"
#include "airport.h"
#include "vehicle_gui.h"
@@ -1106,34 +1106,36 @@
/* Helicopter landing. */
if (amd->flag & AMED_HELI_LOWER) {
- count = UpdateAircraftSpeed(v);
- if (count > 0) {
- if (st->airport_tile == 0) {
- /* FIXME - AircraftController -> if station no longer exists, do not land
- * helicopter will circle until sign disappears, then go to next order
- * what to do when it is the only order left, right now it just stays in 1 place */
- v->u.air.state = FLYING;
- UpdateAircraftCache(v);
- AircraftNextAirportPos_and_Order(v);
- return false;
- }
+ if (st->airport_tile == 0) {
+ /* FIXME - AircraftController -> if station no longer exists, do not land
+ * helicopter will circle until sign disappears, then go to next order
+ * what to do when it is the only order left, right now it just stays in 1 place */
+ v->u.air.state = FLYING;
+ UpdateAircraftCache(v);
+ AircraftNextAirportPos_and_Order(v);
+ return false;
+ }
- /* Vehicle is now at the airport. */
- v->tile = st->airport_tile;
-
- /* Find altitude of landing position. */
- int z = GetSlopeZ(x, y) + 1 + afc->delta_z;
+ /* Vehicle is now at the airport. */
+ v->tile = st->airport_tile;
- if (z == v->z_pos) {
- Vehicle *u = v->Next()->Next();
+ /* Find altitude of landing position. */
+ int z = GetSlopeZ(x, y) + 1 + afc->delta_z;
- /* Increase speed of rotors. When speed is 80, we've landed. */
- if (u->cur_speed >= 80) return true;
- u->cur_speed += 4;
- } else if (v->z_pos > z) {
- SetAircraftPosition(v, v->x_pos, v->y_pos, max(v->z_pos - count, z));
- } else {
- SetAircraftPosition(v, v->x_pos, v->y_pos, min(v->z_pos + count, z));
+ if (z == v->z_pos) {
+ Vehicle *u = v->Next()->Next();
+
+ /* Increase speed of rotors. When speed is 80, we've landed. */
+ if (u->cur_speed >= 80) return true;
+ u->cur_speed += 4;
+ } else {
+ count = UpdateAircraftSpeed(v);
+ if (count > 0) {
+ if (v->z_pos > z) {
+ SetAircraftPosition(v, v->x_pos, v->y_pos, max(v->z_pos - count, z));
+ } else {
+ SetAircraftPosition(v, v->x_pos, v->y_pos, min(v->z_pos + count, z));
+ }
}
}
return false;
@@ -1466,7 +1468,7 @@
SetDParam(1, st->index);
AddNewsItem(newsitem,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
v->index,
0);
@@ -1506,15 +1508,12 @@
/* Check if station was ever visited before */
if (!(st->had_vehicle_of_type & HVOT_AIRCRAFT)) {
- uint32 flags;
-
st->had_vehicle_of_type |= HVOT_AIRCRAFT;
SetDParam(0, st->index);
/* show newsitem of celebrating citizens */
- flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
AddNewsItem(
STR_A033_CITIZENS_CELEBRATE_FIRST,
- flags,
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
v->index,
0);
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/autoreplace_cmd.cpp
--- a/src/autoreplace_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/autoreplace_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -4,7 +4,7 @@
#include "openttd.h"
#include "roadveh.h"
#include "ship.h"
-#include "news.h"
+#include "news_func.h"
#include "player_func.h"
#include "engine.h"
#include "debug.h"
@@ -140,18 +140,9 @@
char *vehicle_name = NULL;
CargoID replacement_cargo_type;
- /* If the vehicle belongs to a group, check if the group is protected from the global autoreplace.
- * If not, chek if an global auto replacement is defined */
- new_engine_type = (IsValidGroupID(old_v->group_id) && GetGroup(old_v->group_id)->replace_protection) ?
- INVALID_ENGINE :
- EngineReplacementForPlayer(p, old_v->engine_type, ALL_GROUP);
-
- /* If we don't set new_egnine_type previously, we try to check if an autoreplacement was defined
- * for the group and the engine_type of the vehicle */
- if (new_engine_type == INVALID_ENGINE && !IsAllGroupID(old_v->group_id)) {
- new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type, old_v->group_id);
- }
-
+ /* Check if there is a autoreplacement set for the vehicle */
+ new_engine_type = EngineReplacementForPlayer(p, old_v->engine_type, old_v->group_id);
+ /* if not, just renew to the same type */
if (new_engine_type == INVALID_ENGINE) new_engine_type = old_v->engine_type;
replacement_cargo_type = GetNewCargoTypeForReplace(old_v, new_engine_type);
@@ -208,12 +199,21 @@
*/
/* Get the vehicle in front of the one we move out */
Vehicle *front = old_v->Previous();
- /* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
- if (IsRearDualheaded(front)) front = front->Previous();
- /* Now we move the old one out of the train */
- DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
- /* Add the new vehicle */
- DoCommand(0, (front->index << 16) | new_v->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+ if (front == NULL) {
+ /* It would appear that we have the front wagon of a row of wagons without engines */
+ Vehicle *next = old_v->Next();
+ if (next != NULL) {
+ /* Move the chain to the new front wagon */
+ DoCommand(0, (new_v->index << 16) | next->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+ }
+ } else {
+ /* If the vehicle in front is the rear end of a dualheaded engine, then we need to use the one in front of that one */
+ if (IsRearDualheaded(front)) front = front->Previous();
+ /* Now we move the old one out of the train */
+ DoCommand(0, (INVALID_VEHICLE << 16) | old_v->index, 0, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+ /* Add the new vehicle */
+ DoCommand(0, (front->index << 16) | new_v->index, 1, DC_EXEC, CMD_MOVE_RAIL_VEHICLE);
+ }
} else {
// copy/clone the orders
DoCommand(0, (old_v->index << 16) | new_v->index, old_v->IsOrderListShared() ? CO_SHARE : CO_COPY, DC_EXEC, CMD_CLONE_ORDER);
@@ -345,22 +345,7 @@
// check if the vehicle should be replaced
if (!w->NeedsAutorenewing(p) || // replace if engine is too old
w->max_age == 0) { // rail cars got a max age of 0
- /* If the vehicle belongs to a group, check if the group is protected from the global autoreplace.
- If not, chek if an global auto remplacement is defined */
- if (IsValidGroupID(w->group_id)) {
- if (!EngineHasReplacementForPlayer(p, w->engine_type, w->group_id) && (
- GetGroup(w->group_id)->replace_protection ||
- !EngineHasReplacementForPlayer(p, w->engine_type, ALL_GROUP))) {
- continue;
- }
- } else if (IsDefaultGroupID(w->group_id)) {
- if (!EngineHasReplacementForPlayer(p, w->engine_type, DEFAULT_GROUP) &&
- !EngineHasReplacementForPlayer(p, w->engine_type, ALL_GROUP)) {
- continue;
- }
- } else if (!EngineHasReplacementForPlayer(p, w->engine_type, ALL_GROUP)) {
- continue;
- }
+ if (!EngineHasReplacementForPlayer(p, w->engine_type, w->group_id)) continue;
}
/* Now replace the vehicle */
@@ -392,7 +377,7 @@
default: NOT_REACHED(); message = 0; break;
}
- AddNewsItem(message, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+ AddNewsItem(message, NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
}
if (stopped) v->vehstatus &= ~VS_STOPPED;
if (display_costs) _current_player = OWNER_NONE;
@@ -423,7 +408,7 @@
if (w == NULL) {
// we failed to make the train short enough
SetDParam(0, v->unitnumber);
- AddNewsItem(STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+ AddNewsItem(STR_TRAIN_TOO_LONG_AFTER_REPLACEMENT, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
break;
}
temp = w;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/cargotype.h
--- a/src/cargotype.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/cargotype.h Fri Mar 28 10:32:55 2008 +0000
@@ -59,6 +59,8 @@
void SetupCargoForClimate(LandscapeID l);
/* Retrieve cargo details for the given cargo ID */
const CargoSpec *GetCargo(CargoID c);
+/* Get the cargo icon for a given cargo ID */
+SpriteID GetCargoSprite(CargoID i);
/* Get the cargo ID with the cargo label */
CargoID GetCargoIDByLabel(CargoLabel cl);
CargoID GetCargoIDByBitnum(uint8 bitnum);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/command.cpp
--- a/src/command.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/command.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -542,12 +542,16 @@
* fact will trigger an assertion failure. --pasky
* CMD_CLONE_VEHICLE: Both building new vehicles and refitting them can be
* influenced by newgrf callbacks, which makes it impossible to accurately
- * estimate the cost of cloning a vehicle. */
+ * estimate the cost of cloning a vehicle.
+ * CMD_DEPOT_MASS_AUTOREPLACE: we can't predict wagon removal so
+ * the test will not include income from any sold wagons.
+ * This means that the costs can sometimes be lower than estimated. */
notest =
(cmd & 0xFF) == CMD_CLEAR_AREA ||
(cmd & 0xFF) == CMD_LEVEL_LAND ||
(cmd & 0xFF) == CMD_REMOVE_LONG_ROAD ||
- (cmd & 0xFF) == CMD_CLONE_VEHICLE;
+ (cmd & 0xFF) == CMD_CLONE_VEHICLE ||
+ (cmd & 0xFF) == CMD_DEPOT_MASS_AUTOREPLACE;
_docommand_recursive = 1;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/core/math_func.hpp
--- a/src/core/math_func.hpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/core/math_func.hpp Fri Mar 28 10:32:55 2008 +0000
@@ -169,7 +169,7 @@
}
/**
- * Reduce an usigned 64-bit int to an unsigned 16-bit one
+ * Reduce an unsigned 64-bit int to an unsigned 16-bit one
*
* @param a The 64-bit value to clamp
* @return The 64-bit value reduced to a 16-bit value
diff -r cc77111ebd85 -r 9707ad4c9b60 src/currency.cpp
--- a/src/currency.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/currency.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -5,7 +5,7 @@
#include "stdafx.h"
#include "openttd.h"
#include "currency.h"
-#include "news.h"
+#include "news_func.h"
#include "settings_type.h"
#include "date_func.h"
@@ -154,7 +154,7 @@
_currency_specs[_opt.currency].to_euro != CF_ISEURO &&
_cur_year >= _currency_specs[_opt.currency].to_euro) {
_opt.currency = 2; // this is the index of euro above.
- AddNewsItem(STR_EURO_INTRODUCE, NEWS_FLAGS(NM_NORMAL, 0, NT_ECONOMY, 0), 0, 0);
+ AddNewsItem(STR_EURO_INTRODUCE, NM_NORMAL, NF_NONE, NT_ECONOMY, DNC_NONE, 0, 0);
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/disaster_cmd.cpp
--- a/src/disaster_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/disaster_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -24,7 +24,7 @@
#include "station_map.h"
#include "command_func.h"
#include "tile_cmd.h"
-#include "news.h"
+#include "news_func.h"
#include "station.h"
#include "waypoint.h"
#include "town.h"
@@ -233,7 +233,7 @@
SetDParam(0, GetStationIndex(tile));
AddNewsItem(STR_B000_ZEPPELIN_DISASTER_AT,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
v->index,
0);
}
@@ -366,7 +366,7 @@
u->vehstatus |= VS_CRASHED;
AddNewsItem(STR_B001_ROAD_VEHICLE_DESTROYED,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
u->index,
0);
}
@@ -441,7 +441,7 @@
DestructIndustry(i);
SetDParam(0, i->town->index);
- AddNewsItem(STR_B002_OIL_REFINERY_EXPLOSION, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy, 0);
+ AddNewsItem(STR_B002_OIL_REFINERY_EXPLOSION, NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE, i->xy, 0);
SndPlayTileFx(SND_12_EXPLOSION, i->xy);
}
} else if (v->current_order.dest == 0) {
@@ -514,7 +514,7 @@
DestructIndustry(i);
SetDParam(0, i->town->index);
- AddNewsItem(STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS, NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy, 0);
+ AddNewsItem(STR_B003_FACTORY_DESTROYED_IN_SUSPICIOUS, NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE, i->xy, 0);
SndPlayTileFx(SND_12_EXPLOSION, i->xy);
}
} else if (v->current_order.dest == 0) {
@@ -599,7 +599,7 @@
t = ClosestTownFromTile(v->dest_tile, (uint)-1);
SetDParam(0, t->index);
AddNewsItem(STR_B004_UFO_LANDS_NEAR,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE,
v->tile,
0);
@@ -977,7 +977,7 @@
if ((GetIndustrySpec(i->type)->behaviour & INDUSTRYBEH_CAN_SUBSIDENCE) && --index < 0) {
SetDParam(0, i->town->index);
AddNewsItem(STR_B005_COAL_MINE_SUBSIDENCE_LEAVES,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, 0), i->xy + TileDiffXY(1, 1), 0);
+ NM_THIN, NF_VIEWPORT | NF_TILE, NT_ACCIDENT, DNC_NONE, i->xy + TileDiffXY(1, 1), 0);
{
TileIndex tile = i->xy;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/economy.cpp
--- a/src/economy.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/economy.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -6,7 +6,6 @@
#include "openttd.h"
#include "currency.h"
#include "landscape.h"
-#include "news.h"
#include "player_base.h"
#include "player_func.h"
#include "station.h"
@@ -14,6 +13,7 @@
#include "saveload.h"
#include "industry.h"
#include "town.h"
+#include "news_func.h"
#include "network/network.h"
#include "engine.h"
#include "network/network_data.h"
@@ -514,15 +514,15 @@
switch (p->quarters_of_bankrupcy) {
case 2:
- AddNewsItem( (StringID)(owner | NB_BTROUBLE),
- NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+ AddNewsItem((StringID)(owner | NB_BTROUBLE),
+ NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
break;
case 3: {
/* XXX - In multiplayer, should we ask other players if it wants to take
over when it is a human company? -- TrueLight */
if (IsHumanPlayer(owner)) {
- AddNewsItem( (StringID)(owner | NB_BTROUBLE),
- NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+ AddNewsItem((StringID)(owner | NB_BTROUBLE),
+ NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
break;
}
@@ -543,7 +543,7 @@
/* Show bankrupt news */
SetDParam(0, p->index);
- AddNewsItem( (StringID)(owner | NB_BBANKRUPT), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+ AddNewsItem((StringID)(owner | NB_BBANKRUPT), NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
if (IsHumanPlayer(owner)) {
/* XXX - If we are in offline mode, leave the player playing. Eg. there
@@ -568,11 +568,10 @@
}
}
-void DrawNewsBankrupcy(Window *w)
+void DrawNewsBankrupcy(Window *w, const NewsItem *ni)
{
DrawNewsBorder(w);
- const NewsItem *ni = WP(w, news_d).ni;
Player *p = GetPlayer((PlayerID)GB(ni->string_id, 0, 4));
DrawPlayerFace(p->face, p->player_color, 2, 23);
GfxFillRect(3, 23, 3 + 91, 23 + 118, PALETTE_TO_STRUCT_GREY | (1 << USE_COLORTABLE));
@@ -786,10 +785,10 @@
if (--_economy.fluct == 0) {
_economy.fluct = -(int)GB(Random(), 0, 2);
- AddNewsItem(STR_7073_WORLD_RECESSION_FINANCIAL, NEWS_FLAGS(NM_NORMAL,0,NT_ECONOMY,0), 0, 0);
+ AddNewsItem(STR_7073_WORLD_RECESSION_FINANCIAL, NM_NORMAL, NF_NONE, NT_ECONOMY, DNC_NONE, 0, 0);
} else if (_economy.fluct == -12) {
_economy.fluct = GB(Random(), 0, 8) + 312;
- AddNewsItem(STR_7074_RECESSION_OVER_UPTURN_IN, NEWS_FLAGS(NM_NORMAL,0,NT_ECONOMY,0), 0, 0);
+ AddNewsItem(STR_7074_RECESSION_OVER_UPTURN_IN, NM_NORMAL, NF_NONE, NT_ECONOMY, DNC_NONE, 0, 0);
}
}
@@ -1129,14 +1128,14 @@
if (s->age == 12-1) {
pair = SetupSubsidyDecodeParam(s, 1);
- AddNewsItem(STR_202E_OFFER_OF_SUBSIDY_EXPIRED, NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), pair.a, pair.b);
+ AddNewsItem(STR_202E_OFFER_OF_SUBSIDY_EXPIRED, NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE, pair.a, pair.b);
s->cargo_type = CT_INVALID;
modified = true;
} else if (s->age == 2*12-1) {
st = GetStation(s->to);
if (st->owner == _local_player) {
pair = SetupSubsidyDecodeParam(s, 1);
- AddNewsItem(STR_202F_SUBSIDY_WITHDRAWN_SERVICE, NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), pair.a, pair.b);
+ AddNewsItem(STR_202F_SUBSIDY_WITHDRAWN_SERVICE, NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE, pair.a, pair.b);
}
s->cargo_type = CT_INVALID;
modified = true;
@@ -1175,7 +1174,7 @@
if (!CheckSubsidyDuplicate(s)) {
s->age = 0;
pair = SetupSubsidyDecodeParam(s, 0);
- AddNewsItem(STR_2030_SERVICE_SUBSIDY_OFFERED, NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0), pair.a, pair.b);
+ AddNewsItem(STR_2030_SERVICE_SUBSIDY_OFFERED, NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE, pair.a, pair.b);
for (PlayerID i = PLAYER_FIRST; i != MAX_PLAYERS; i++) {
AI_Event(i, new AIEventSubsidiaryOffer(s->cargo_type, s->cargo_type == CT_PASSENGERS, s->from, (GetCargo(s->cargo_type)->town_effect == TE_GOODS || GetCargo(s->cargo_type)->town_effect == TE_FOOD), s->to));
}
@@ -1395,7 +1394,7 @@
SetDParam(0, _current_player);
AddNewsItem(
STR_2031_SERVICE_SUBSIDY_AWARDED + _opt.diff.subsidy_multiplier,
- NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_SUBSIDIES, 0),
+ NM_NORMAL, NF_TILE, NT_SUBSIDIES, DNC_NONE,
pair.a, pair.b
);
@@ -1832,7 +1831,7 @@
SetDParam(0, p->index);
SetDParam(1, p->bankrupt_value);
- AddNewsItem( (StringID)(_current_player | NB_BMERGER), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+ AddNewsItem((StringID)(_current_player | NB_BMERGER), NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
/* original code does this a little bit differently */
PlayerID pi = p->index;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/elrail.cpp
--- a/src/elrail.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/elrail.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -84,7 +84,7 @@
{
switch (GetTileType(t)) {
case MP_RAILWAY:
- if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+ if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
switch (GetRailTileType(t)) {
case RAIL_TILE_NORMAL: case RAIL_TILE_SIGNALS:
return GetTrackBits(t);
@@ -96,7 +96,7 @@
break;
case MP_TUNNELBRIDGE:
- if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+ if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
if (override != NULL && (IsTunnel(t) || GetTunnelBridgeLength(t, GetOtherBridgeEnd(t)) > 0)) {
*override = 1 << GetTunnelBridgeDirection(t);
}
@@ -104,12 +104,12 @@
case MP_ROAD:
if (!IsLevelCrossing(t)) return TRACK_BIT_NONE;
- if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+ if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
return GetCrossingRailBits(t);
case MP_STATION:
if (!IsRailwayStation(t)) return TRACK_BIT_NONE;
- if (GetRailType(t) != RAILTYPE_ELECTRIC) return TRACK_BIT_NONE;
+ if (!HasCatenary(GetRailType(t))) return TRACK_BIT_NONE;
if (!IsStationTileElectrifiable(t)) return TRACK_BIT_NONE;
return TrackToTrackBits(GetRailStationTrack(t));
@@ -179,7 +179,7 @@
{ 1, 0, 15, 16 }, // NW
};
- if ((GetRailType(ti->tile) != RAILTYPE_ELECTRIC) || _patches.disable_elrails) return;
+ if (!HasCatenary(GetRailType(ti->tile)) || _patches.disable_elrails) return;
DiagDirection dir = GetTunnelBridgeDirection(ti->tile);
@@ -282,7 +282,7 @@
if (IsTileType(neighbour, MP_STATION)) tileh[TS_NEIGHBOUR] = SLOPE_FLAT;
/* Read the foundataions if they are present, and adjust the tileh */
- if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && GetRailType(neighbour) == RAILTYPE_ELECTRIC) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
+ if (trackconfig[TS_NEIGHBOUR] != TRACK_BIT_NONE && IsTileType(neighbour, MP_RAILWAY) && HasCatenary(GetRailType(neighbour))) foundation = GetRailFoundation(tileh[TS_NEIGHBOUR], trackconfig[TS_NEIGHBOUR]);
if (IsBridgeTile(neighbour)) {
foundation = GetBridgeFoundation(tileh[TS_NEIGHBOUR], DiagDirToAxis(GetTunnelBridgeDirection(neighbour)));
}
@@ -436,7 +436,7 @@
if (MayHaveBridgeAbove(ti->tile) && IsBridgeAbove(ti->tile)) {
TileIndex head = GetNorthernBridgeEnd(ti->tile);
- if (GetTunnelBridgeTransportType(head) == TRANSPORT_RAIL && GetRailType(head) == RAILTYPE_ELECTRIC) {
+ if (GetTunnelBridgeTransportType(head) == TRANSPORT_RAIL && HasCatenary(GetRailType(head))) {
DrawCatenaryOnBridge(ti);
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/engine.cpp
--- a/src/engine.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/engine.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -9,7 +9,7 @@
#include "player_base.h"
#include "player_func.h"
#include "command_func.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "variables.h"
#include "train.h"
@@ -338,7 +338,7 @@
if (p->is_active) SetBit(p->avail_roadtypes, HasBit(EngInfo(index)->misc_flags, EF_ROAD_TRAM) ? ROADTYPE_TRAM : ROADTYPE_ROAD);
}
}
- AddNewsItem(index, NEWS_FLAGS(NM_CALLBACK, 0, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL), 0, 0);
+ AddNewsItem(index, NM_CALLBACK, NF_NONE, NT_NEW_VEHICLES, DNC_VEHICLEAVAIL, 0, 0);
}
void EnginesMonthlyLoop()
diff -r cc77111ebd85 -r 9707ad4c9b60 src/engine_gui.cpp
--- a/src/engine_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/engine_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -10,7 +10,7 @@
#include "engine.h"
#include "command_func.h"
#include "economy_func.h"
-#include "news.h"
+#include "news_func.h"
#include "variables.h"
#include "newgrf_engine.h"
#include "strings_func.h"
@@ -182,11 +182,11 @@
return STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE;
}
-void DrawNewsNewVehicleAvail(Window *w)
+void DrawNewsNewVehicleAvail(Window *w, const NewsItem *ni)
{
DrawNewsBorder(w);
- EngineID engine = WP(w, news_d).ni->string_id;
+ EngineID engine = ni->string_id;
const DrawEngineInfo *dei = &_draw_engine_list[GetEngine(engine)->type];
SetDParam(0, GetEngineCategoryName(engine));
diff -r cc77111ebd85 -r 9707ad4c9b60 src/genworld_gui.cpp
--- a/src/genworld_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/genworld_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -48,6 +48,7 @@
uint y;
char name[64];
};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(generate_d));
extern void SwitchMode(int new_mode);
@@ -127,7 +128,7 @@
{ WWT_DROPDOWN, RESIZE_NONE, 12, 114, 175, 130, 141, 0x0, STR_NULL}, // Number of industries
{ WWT_TEXT, RESIZE_NONE, 0, 12, 110, 153, 163, STR_RANDOM_SEED, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, 15, 114, 207, 152, 163, 0x0, STR_RANDOM_SEED_HELP}, // Edit box for seed
+{ WWT_EDITBOX, RESIZE_NONE, 15, 114, 207, 152, 163, STR_RANDOM_SEED_OSKTITLE, STR_RANDOM_SEED_HELP}, // Edit box for seed
{ WWT_TEXTBTN, RESIZE_NONE, 12, 216, 326, 152, 163, STR_RANDOM, STR_RANDOM_HELP},
{ WWT_TEXTBTN, RESIZE_NONE, 6, 243, 326, 228, 257, STR_GENERATE, STR_NULL}, // Generate button
@@ -181,7 +182,7 @@
{ WWT_DROPDOWN, RESIZE_NONE, 12, 114, 175, 152, 163, 0x0, STR_NULL}, // Number of industries
{ WWT_TEXT, RESIZE_NONE, 0, 12, 110, 175, 185, STR_RANDOM_SEED, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, 15, 114, 207, 174, 185, 0x0, STR_RANDOM_SEED_HELP}, // Edit box for seed
+{ WWT_EDITBOX, RESIZE_NONE, 15, 114, 207, 174, 185, STR_RANDOM_SEED_OSKTITLE, STR_RANDOM_SEED_HELP}, // Edit box for seed
{ WWT_TEXTBTN, RESIZE_NONE, 12, 216, 326, 174, 185, STR_RANDOM, STR_RANDOM_HELP},
{ WWT_TEXTBTN, RESIZE_NONE, 6, 243, 326, 196, 225, STR_GENERATE, STR_NULL}, // Generate button
@@ -374,8 +375,11 @@
SetWindowDirty(w);
break;
+ case GLAND_RANDOM_EDITBOX: // edit box for random seed
+ ShowOnScreenKeyboard(w, & _genseed_query, GLAND_RANDOM_EDITBOX, 0, 0);
+ break;
+
case GLAND_GENERATE_BUTTON: // Generate
-
UpdatePatches();
if (_patches.town_layout == TL_NO_ROADS) {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/gfx.cpp
--- a/src/gfx.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/gfx.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -37,7 +37,7 @@
bool _exit_game;
bool _networking; ///< are we in networking mode?
byte _game_mode;
-byte _pause_game;
+int8 _pause_game;
int _pal_first_dirty;
int _pal_count_dirty;
@@ -561,6 +561,20 @@
return br;
}
+void DrawCharCentered(WChar c, int x, int y, uint16 real_color)
+{
+ FontSize size = FS_NORMAL;
+ byte color = real_color & 0xFF;
+ uint palette = _use_dos_palette ? 1 : 0;
+ int w = GetCharacterWidth(size, c);
+
+ _string_colorremap[1] = _string_colormap[palette][color].text;
+ _string_colorremap[2] = _string_colormap[palette][color].shadow;
+ _color_remap_ptr = _string_colorremap;
+
+ GfxMainBlitter(GetGlyph(size, c), x - w / 2, y, BM_COLOUR_REMAP);
+}
+
/** Draw a string at the given coordinates with the given colour
* @param string the string to draw
* @param x offset from left side of the screen, if negative offset from the right side
diff -r cc77111ebd85 -r 9707ad4c9b60 src/gfx_func.h
--- a/src/gfx_func.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/gfx_func.h Fri Mar 28 10:32:55 2008 +0000
@@ -99,6 +99,8 @@
void DrawStringRightAlignedTruncated(int x, int y, StringID str, uint16 color, uint maxw);
void DrawStringRightAlignedUnderline(int x, int y, StringID str, uint16 color);
+void DrawCharCentered(uint32 c, int x, int y, uint16 color);
+
void GfxFillRect(int left, int top, int right, int bottom, int color);
void GfxDrawLine(int left, int top, int right, int bottom, int color);
void DrawBox(int x, int y, int dx1, int dy1, int dx2, int dy2, int dx3, int dy3);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/group.h
--- a/src/group.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/group.h Fri Mar 28 10:32:55 2008 +0000
@@ -12,7 +12,7 @@
enum {
ALL_GROUP = 0xFFFD,
- DEFAULT_GROUP = 0xFFFE,
+ DEFAULT_GROUP = 0xFFFE, ///< ungrouped vehicles are in this group.
INVALID_GROUP = 0xFFFF,
};
@@ -23,7 +23,7 @@
char *name; ///< Group Name
uint16 num_vehicle; ///< Number of vehicles wich belong to the group
- PlayerID owner; ///< Group Owner
+ PlayerByte owner; ///< Group Owner
VehicleTypeByte vehicle_type; ///< Vehicle type of the group
bool replace_protection; ///< If set to true, the global autoreplace have no effect on the group
diff -r cc77111ebd85 -r 9707ad4c9b60 src/group_gui.cpp
--- a/src/group_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/group_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -499,7 +499,7 @@
}
case WE_CLICK:
- HideDropDownMenu(w);
+ if (e->we.click.widget != GRP_WIDGET_SORT_BY_DROPDOWN && e->we.click.widget != GRP_WIDGET_MANAGE_VEHICLES_DROPDOWN) HideDropDownMenu(w);
switch(e->we.click.widget) {
case GRP_WIDGET_SORT_BY_ORDER: // Flip sorting method ascending/descending
diff -r cc77111ebd85 -r 9707ad4c9b60 src/gui.h
--- a/src/gui.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/gui.h Fri Mar 28 10:32:55 2008 +0000
@@ -15,6 +15,10 @@
/* main_gui.cpp */
void CcPlaySound10(bool success, TileIndex tile, uint32 p1, uint32 p2);
void CcBuildCanal(bool success, TileIndex tile, uint32 p1, uint32 p2);
+void HandleOnEditText(const char *str);
+void InitializeGUI();
+Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray);
+Window *PopupMainToolbMenu(Window *w, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask);
/* settings_gui.cpp */
void ShowGameOptions();
@@ -79,6 +83,9 @@
DDSP_PLACE_AUTOROAD,
};
+/* timetable_gui.cpp */
+void ShowTimetableWindow(const Vehicle *v);
+
/* misc_gui.cpp */
void PlaceLandBlockInfo();
void ShowAboutWindow();
@@ -109,11 +116,8 @@
void ShowBuildBridgeWindow(TileIndex start, TileIndex end, TransportType transport_type, byte bridge_type);
void ShowBuildIndustryWindow();
+void ShowBuildTownWindow();
void ShowMusicWindow();
-/* main_gui.cpp */
-void HandleOnEditText(const char *str);
-
-void InitializeGUI();
#endif /* GUI_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/industry_cmd.cpp
--- a/src/industry_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/industry_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
#include "command_func.h"
#include "industry.h"
#include "town.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "variables.h"
#include "genworld.h"
@@ -1641,7 +1641,7 @@
SetDParam(1, ind->town->index);
}
AddNewsItem(indspec->new_industry_text,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
+ NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, DNC_NONE, ind->xy, 0);
break;
}
}
@@ -1860,7 +1860,7 @@
SetDParam(1, ind->town->index);
}
AddNewsItem(ind_spc->new_industry_text,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, 0), ind->xy, 0);
+ NM_THIN, NF_VIEWPORT | NF_TILE, NT_OPENCLOSE, DNC_NONE, ind->xy, 0);
}
/**
@@ -2003,7 +2003,7 @@
SetDParam(1, ind->index);
AddNewsItem(
percent >= 0 ? STR_INDUSTRY_PROD_GOUP : STR_INDUSTRY_PROD_GODOWN,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, nt, 0),
+ NM_THIN, NF_VIEWPORT | NF_TILE, nt, DNC_NONE,
ind->xy + TileDiffXY(1, 1), 0
);
}
@@ -2019,7 +2019,6 @@
*/
static void ChangeIndustryProduction(Industry *i, bool monthly)
{
- extern StringID MapGRFStringID(uint32 grfid, StringID str);
StringID str = STR_NULL;
bool closeit = false;
const IndustrySpec *indspec = GetIndustrySpec(i->type);
@@ -2197,7 +2196,7 @@
}
/* and report the news to the user */
AddNewsItem(str,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_TILE, nt, 0),
+ NM_THIN, NF_VIEWPORT | NF_TILE, nt, DNC_NONE,
i->xy + TileDiffXY(1, 1), 0);
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/industry_gui.cpp
--- a/src/industry_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/industry_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -60,6 +60,29 @@
assert_compile(lengthof(_fund_gui.index) == lengthof(_fund_gui.text));
assert_compile(lengthof(_fund_gui.index) == lengthof(_fund_gui.enabled));
+/**
+ * Gets the string to display after the cargo name (using callback 37)
+ * @param cargo the cargo for which the suffix is requested
+ * - 00 - first accepted cargo type
+ * - 01 - second accepted cargo type
+ * - 02 - third accepted cargo type
+ * - 03 - first produced cargo type
+ * - 04 - second produced cargo type
+ * @param ind the industry (NULL if in fund window)
+ * @param ind_type the industry type
+ * @param indspec the industry spec
+ * @return the string to display
+ */
+static StringID GetCargoSuffix(uint cargo, Industry *ind, IndustryType ind_type, const IndustrySpec *indspec)
+{
+ if (HasBit(indspec->callback_flags, CBM_IND_CARGO_SUFFIX)) {
+ bool fund = ind == NULL;
+ uint8 callback = GetIndustryCallback(CBID_INDUSTRY_CARGO_SUFFIX, 0, ((!fund) ? 1 << 8 : 0) | cargo, ind, ind_type, (!fund) ? ind->xy : INVALID_TILE);
+ if (callback != 0xFF) return GetGRFStringID(indspec->grf_prop.grffile->grfid, 0xD000 + callback);
+ }
+ return STR_EMPTY;
+}
+
static void BuildDynamicIndustryWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
@@ -179,10 +202,12 @@
StringID str = STR_4827_REQUIRES;
byte p = 0;
SetDParam(0, STR_00D0_NOTHING);
+ SetDParam(1, STR_EMPTY);
for (byte j = 0; j < lengthof(indsp->accepts_cargo); j++) {
if (indsp->accepts_cargo[j] == CT_INVALID) continue;
if (p > 0) str++;
SetDParam(p++, GetCargo(indsp->accepts_cargo[j])->name);
+ SetDParam(p++, GetCargoSuffix(j, NULL, WP(w, fnd_d).select, indsp));
}
DrawStringTruncated(x_str, y_str, str, TC_FROMSTRING, max_width);
y_str += 11;
@@ -191,10 +216,12 @@
str = STR_4827_PRODUCES;
p = 0;
SetDParam(0, STR_00D0_NOTHING);
+ SetDParam(1, STR_EMPTY);
for (byte j = 0; j < lengthof(indsp->produced_cargo); j++) {
if (indsp->produced_cargo[j] == CT_INVALID) continue;
if (p > 0) str++;
SetDParam(p++, GetCargo(indsp->produced_cargo[j])->name);
+ SetDParam(p++, GetCargoSuffix(j + 3, NULL, WP(w, fnd_d).select, indsp));
}
DrawStringTruncated(x_str, y_str, str, TC_FROMSTRING, max_width);
y_str += 11;
@@ -489,6 +516,7 @@
}
SetDParam(0, i->accepts_cargo[j]);
SetDParam(1, i->incoming_cargo_waiting[j]);
+ SetDParam(2, GetCargoSuffix(j, i, i->type, ind));
DrawString(4, y, STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO, TC_FROMSTRING);
y += 10;
}
@@ -500,6 +528,7 @@
has_accept = true;
if (p > 0) str++;
SetDParam(p++, GetCargo(i->accepts_cargo[j])->name);
+ SetDParam(p++, GetCargoSuffix(j, i, i->type, ind));
}
if (has_accept) {
DrawString(2, y, str, TC_FROMSTRING);
@@ -520,8 +549,9 @@
SetDParam(0, i->produced_cargo[j]);
SetDParam(1, i->last_month_production[j]);
+ SetDParam(2, GetCargoSuffix(j + 3, i, i->type, ind));
- SetDParam(2, i->last_month_pct_transported[j] * 100 >> 8);
+ SetDParam(3, i->last_month_pct_transported[j] * 100 >> 8);
DrawString(4 + (IsProductionAlterable(i) ? 30 : 0), y, STR_482B_TRANSPORTED, TC_FROMSTRING);
/* Let's put out those buttons.. */
if (IsProductionAlterable(i)) {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/afrikaans.txt
--- a/src/lang/afrikaans.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/afrikaans.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1970,20 +1970,20 @@
STR_4826_SUGAR_MINE :Suiker Myn
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Vereis: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Vrag wag om geprosesseer te wees:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produseer: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produseer: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produseer: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produseer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produksie verlede maand:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% uitgevoer)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% uitgevoer)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Senter skerm op nywerheid
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nuwe {STRING} onder opbou naby {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nuwe {STRING} word naby {TOWN} beplant!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/brazilian_portuguese.txt
--- a/src/lang/brazilian_portuguese.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/brazilian_portuguese.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1052,6 +1052,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Permitir o envio de dinheiro a outras empresas: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplicador de peso para trens simulando trens pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Fator de velocidade para aeronaves: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permitir estações drive-through em ruas locais: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
@@ -1613,6 +1614,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo de linha não apropriado
STR_1007_ALREADY_BUILT :{WHITE}...já construído
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Deve remover a ferrovia primeiro
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Rua é mão única ou está bloqueado
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Construir ferrovias
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Construir ferrovias (elétricas)
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Construir ferrovias (monotrilho)
@@ -1715,6 +1717,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}O edifício deve ser demolido primeiro
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Cidade)
STR_2006_POPULATION :{BLACK}População: {ORANGE}{COMMA}{BLACK} Casas: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Renomear Cidade
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Impossível renomear cidade...
@@ -1996,20 +1999,20 @@
STR_4826_SUGAR_MINE :{G=f}Mina de Açúcar
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Requer: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Requer: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Requer: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Requer: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Requer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Requer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Carga aguardando processamento
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produção no mês passado:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centralizar visualização na localização da indústria
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nov{G o a} {STRING} em construção em {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nov{G o a} {STRING} sendo plantada em {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/bulgarian.txt
--- a/src/lang/bulgarian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/bulgarian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1052,6 +1052,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Позволи изпращане на пари до други компаний: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Нестандартни станции: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Теглови множител към товарите за симулация на тежки влакове: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Скоростоопределяща: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Преминаване през спирки на градски пътища: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Позвалявай допрени гари: {ORANGE}{STRING}
@@ -1613,6 +1614,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Неподходящ за употреба релсов път
STR_1007_ALREADY_BUILT :{WHITE}...вече е построено
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Първо трябва да премахнеш релсовия път
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Пътят е еднопосочен или блокиран
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Конструкции за Двурелсов път
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Строене на електрифицирана ЖП мрежа
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Конструкции за Еднорелсов път
@@ -1715,6 +1717,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Сградата първо трябва да бъде разрушена
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Град)
STR_2006_POPULATION :{BLACK}Население: {ORANGE}{COMMA}{BLACK} Жилища: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Преименуване на град
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Градът не може да бъде преименуван
@@ -1994,20 +1997,20 @@
STR_4826_SUGAR_MINE :Захарна мина
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Нуждае се от: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Нуждае се от: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Нуждае се от: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Нуждае се от: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Нуждае се от: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Нуждае се от: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Товар чакащ до бъде преработен:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Произвежда: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Произвежда: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Произвежда: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Произвежда: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Произведено миналия месец:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% превозено)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% превозено)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Центриране главния прозорец върху индустрията
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Нова {STRING} се строи близо до {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Нова {STRING} се засажда близо до {TOWN}!
@@ -2768,7 +2771,7 @@
STR_TIMETABLE_TOOLTIP :{BLACK}Времетаблица - кликни върху заповед за да я маркираш.
STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Промени времетраенето на маркираната заповед
STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Изчисти времетраенето на маркираната заповед
-STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Преправи закъснялата бройка, такаче превозните средства да са на време
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Reset the lateness counter, so the vehicle will be on time
STR_SERVICE_HINT :{BLACK}Пропусни освен ако е необходим ремонт
STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER :{BLACK}Цена: {CURRENCY} Тегло: {WEIGHT_S}{}Скорост: {VELOCITY} Мощност: {POWER}{}Разход: {CURRENCY}/г.{}Капацитет: {CARGO}
STR_885C_BROKEN_DOWN :{RED}Развален
@@ -3355,6 +3358,7 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Използвай прозрачност за сгради като гари, депа, пътни точки и висящи жици
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Използвай прозрачност за мостове
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Използвай прозрачност за сгради като фарове и антени, може би в бъдеще за украси
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Активирай прозрачност за висящите. CTRL+клик за фиксиране.
STR_TRANSPARENT_LOADING_DESC :{BLACK}Вклучи прозрачност за товарещи указатели
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/catalan.txt
--- a/src/lang/catalan.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/catalan.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1050,6 +1050,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Permet enviar diners a altres companyies: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estacions no uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplicador de pes per contenidor per simular trens pesats: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Factor de velocitat dels avions: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permet situar parades en carreteres que són propietat del poble: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Permet construir estacions annexes: {ORANGE}{STRING}
@@ -1450,6 +1451,13 @@
STR_NETWORK_LANG_SWEDISH :Suec
STR_NETWORK_LANG_TURKISH :Turc
STR_NETWORK_LANG_UKRAINIAN :Ucraïnès
+STR_NETWORK_LANG_AFRIKAANS :Afrikaans
+STR_NETWORK_LANG_CROATIAN :Croat
+STR_NETWORK_LANG_CATALAN :Català
+STR_NETWORK_LANG_ESTONIAN :Estonià
+STR_NETWORK_LANG_GALICIAN :Gallec
+STR_NETWORK_LANG_GREEK :Grec
+STR_NETWORK_LANG_LATVIAN :Letó
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Lobby de partida multijugador
@@ -1611,6 +1619,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Via de tren no apropiada
STR_1007_ALREADY_BUILT :{WHITE}...ja construit
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}S'ha de treure la via primer
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La carretera és un d'un sol sentit o està bloquejada
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Construcció de Ferrocarril
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Construcció de Ferrocarril Elèctric
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Construcció de Monorail
@@ -1713,6 +1722,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}L'edifici s'ha d'enderrocar primer
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Ciutat)
STR_2006_POPULATION :{BLACK}Població: {ORANGE}{COMMA}{BLACK} Cases: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Reanomena Població
STR_2008_CAN_T_RENAME_TOWN :{WHITE}No es pot reanomenar la població...
@@ -1992,20 +2002,20 @@
STR_4826_SUGAR_MINE :Mina de Sucre
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Necessita: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Necessita: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Necessita: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Necessita: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Necessita: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Necessita: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Càrrega en espera de ser processada:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produeix: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produeix: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produeix: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produeix: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Producció del darrer mes:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportat)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportat)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centra la pantalla principal al lloc de l'indústria
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nou/nova {STRING} en construcció a prop de {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nou/nova {STRING} s'està plantant a prop de {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/croatian.txt
--- a/src/lang/croatian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/croatian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1979,20 +1979,20 @@
STR_4826_SUGAR_MINE :Rudnik šećera
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Treba: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Treba: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Treba: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Treba: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Treba: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Treba: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Teret koji čeka obradu:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Proizvodi: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Proizvodi: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Proizvodi: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Prošlomjesečna proizvodnja:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% prevezeno)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% prevezeno)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centriraj glavni pogled na položaj industrije
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Započela je izgradnja nove industrije ( {STRING} ) u blizini grada {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nova {STRING} trenutno se sadi blizu grada {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/czech.txt
--- a/src/lang/czech.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/czech.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1108,6 +1108,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Umožnit zasílání peněz ostatním společnostem: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Nejednolité stanice: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Pro simulaci těžkých vlaků vynásobit hmotnost nákladu: {ORANGE}{STRING}x
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Činitel rychlosti letadel: {ORANGE}1/{STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Povolit průjezdné zastávky na silnicích vlastněných obcemi: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Povolit stavění přilehlých stanic: {ORANGE}{STRING}
@@ -1669,6 +1670,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Žádné použitelné koleje
STR_1007_ALREADY_BUILT :{WHITE}... již vystavěno
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Musíš nejprve odstranit koleje
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Silnice je jednosměrná nebo zablokovaná
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Výstavba železnice
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Výstavba elektrifikované železnice
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Výstavba monorailu
@@ -1771,6 +1773,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Budova musí být nejprve zničena
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (velkoměsto)
STR_2006_POPULATION :{BLACK}Populace: {ORANGE}{COMMA}{BLACK} Domů: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Přejmenovat město
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Nemohu přejmenovat město:
@@ -2050,20 +2053,20 @@
STR_4826_SUGAR_MINE :Cukerný důl
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Vyžaduje: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Vyžaduje: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Vyžaduje: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Vyžaduje: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Vyžaduje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Vyžaduje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Náklad čekající na zpracování:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produkce minulý měsíc:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA} % přepraveno)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA} % přepraveno)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Nastavit pohled na průmysl
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}{STRING} se staví poblíž města {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nový {STRING} se vysazuje poblíž města {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/danish.txt
--- a/src/lang/danish.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/danish.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1050,6 +1050,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Tillad at sende penge til andre firmaer: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Ikke uniforme stationer: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Vægtfaktor for fragt for at simulere tunge tog: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Fly-hastighedsfaktor: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Tillad gennemkørsels-stop på veje ejet af en by: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Tillad bygning af tilstødende stationer: {ORANGE}{STRING}
@@ -1204,6 +1205,19 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Skift indstillingsværdi
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Nogle eller alle standard service intervaller nedenunder er uforenelige med den valgte opsætning! 5-90% og 30-800 dage er gyldige
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Stifinder til tog: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Ikke anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Stifinder til vejkøretøjer: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Original {RED}(Ikke anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Stifinder til skibe: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Original {BLUE}(Anbefalet)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(Ikke anbefalet)
+
STR_TEMPERATE_LANDSCAPE :Tempereret klima
STR_SUB_ARCTIC_LANDSCAPE :Arktisk klima
STR_SUB_TROPICAL_LANDSCAPE :Tropisk klima
@@ -1598,6 +1612,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ingen brugbar jernbane
STR_1007_ALREADY_BUILT :{WHITE}...allerede bygget
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Det er nødvendigt at fjerne jernbaneskinnerne først
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vejen er ensrettet eller blokeret
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Jernbanekonstruktion
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Elektrisk jernbanekonstruktion
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Monorailkonstruktion
@@ -1979,20 +1994,20 @@
STR_4826_SUGAR_MINE :Sukkermine
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Kræver: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Kræver: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Kræver: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Kræver: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Kræver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Kræver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Fragt der venter på forarbejdning:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Producerer: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Producerer: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Producerer: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Producerer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produktion sidste måned:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transporteret)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transporteret)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centrer skærmen over industriens lokalitet
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Ny {STRING} under opførelse tæt på {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Ny {STRING} bliver plantet tæt på {TOWN}!
@@ -3340,6 +3355,7 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Skift gennemsigtighed for konstruktioner som stationer, værksteder, kontrolsteder og køreledninger
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Skift gennemsigtighed for broer
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Skift gennemsigtighed for strukturer som fyrtårne og antenner, og måske i fremtiden for øjeguf
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Slå transparens til/fra for køreledninger. CTRL+klik for at låse.
STR_TRANSPARENT_LOADING_DESC :{BLACK}Slå gennemsigtighed til/fra for laste-indikatorer
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/dutch.txt
--- a/src/lang/dutch.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/dutch.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1050,6 +1050,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Geld geven aan andere bedrijven toestaan: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Vrij gevormde stations: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Gewichtsverhouding voor vracht om zware treinen te simuleren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Vliegtuig snelheidsverhouding: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Laat toe dat doorrij wegstops worden geplaatst op door stad beheerde wegen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Bouwen van aangrenzende stations toestaan: {ORANGE}{STRING}
@@ -1211,7 +1212,7 @@
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Routezoeker voor voertuigen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Original {RED}(Niet aanbevolen)
STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
-STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Aanbevolen)
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Routezoeker voor schepen: {ORANGE}{STRING}
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Original {BLUE}(Aanbevolen)
STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
@@ -1611,6 +1612,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Geen bruikbaar spoor
STR_1007_ALREADY_BUILT :{WHITE}...reeds gebouwd
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Bestaand spoor moet eerst weggehaald worden
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Eenrichtingsverkeer of de weg is geblokkeerd
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Spoorwegconstructie
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Geëlectrificeerde spoorwegconstructie
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Monorailconstructie
@@ -1992,20 +1994,20 @@
STR_4826_SUGAR_MINE :Suikermijn
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Vereist: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Vereist: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Vereist: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Vereist: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Vereist: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Vereist: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Vracht klaar om te worden verwerkt:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produceert: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produceert: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produceert: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produceert: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Productie vorige maand:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% getransporteerd)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% getransporteerd)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centreer het hoofdbeeld op de locatie van de industrie
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nieuw {STRING} in aanbouw bij {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nieuw {STRING} in aanplant bij {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/english.txt
--- a/src/lang/english.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/english.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1352,6 +1352,7 @@
STR_NETWORK_PLAYER_NAME :{BLACK}Player name:
STR_NETWORK_ENTER_NAME_TIP :{BLACK}This is the name other players will identify you by
+STR_NETWORK_PLAYER_NAME_OSKTITLE :{BLACK}Enter your name
STR_NETWORK_CONNECTION :{BLACK}Connection:
STR_NETWORK_CONNECTION_TIP :{BLACK}Choose between an internet game or a Local Area Network (LAN) game
@@ -1395,6 +1396,7 @@
STR_NETWORK_NEW_GAME_NAME :{BLACK}Game name:
STR_NETWORK_NEW_GAME_NAME_TIP :{BLACK}The game name will be displayed to other players in the multiplayer game selection menu
+STR_NETWORK_NEW_GAME_NAME_OSKTITLE :{BLACK}Enter a name for the network game
STR_NETWORK_SET_PASSWORD :{BLACK}Set password
STR_NETWORK_PASSWORD_TIP :{BLACK}Protect your game with a password if you don't want it to be publicly accessible
STR_NETWORK_SELECT_MAP :{BLACK}Select a map:
@@ -1451,6 +1453,13 @@
STR_NETWORK_LANG_SWEDISH :Swedish
STR_NETWORK_LANG_TURKISH :Turkish
STR_NETWORK_LANG_UKRAINIAN :Ukrainian
+STR_NETWORK_LANG_AFRIKAANS :Afrikaans
+STR_NETWORK_LANG_CROATIAN :Croatian
+STR_NETWORK_LANG_CATALAN :Catalan
+STR_NETWORK_LANG_ESTONIAN :Estonian
+STR_NETWORK_LANG_GALICIAN :Galician
+STR_NETWORK_LANG_GREEK :Greek
+STR_NETWORK_LANG_LATVIAN :Latvian
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Multiplayer game lobby
@@ -1549,6 +1558,7 @@
STR_NETWORK_CHAT_TO_CLIENT :[Private] To {STRING}: {GRAY}{STRING}
STR_NETWORK_CHAT_ALL_CAPTION :[All] :
STR_NETWORK_CHAT_ALL :[All] {STRING}: {GRAY}{STRING}
+STR_NETWORK_CHAT_OSKTITLE :{BLACK}Enter text for network chat
STR_NETWORK_NAME_CHANGE :has changed his/her name to
STR_NETWORK_SERVER_SHUTDOWN :{WHITE} The server closed the session
STR_NETWORK_SERVER_REBOOT :{WHITE} The server is restarting...{}Please wait...
@@ -1612,6 +1622,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}No suitable railway track
STR_1007_ALREADY_BUILT :{WHITE}...already built
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Must remove railway track first
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Road is one way or blocked
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Railway Construction
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Electrified Railway Construction
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Monorail Construction
@@ -1714,6 +1725,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Building must be demolished first
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (City)
STR_2006_POPULATION :{BLACK}Population: {ORANGE}{COMMA}{BLACK} Houses: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Rename Town
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Can't rename town...
@@ -1950,6 +1962,7 @@
STR_400F_SELECT_SCENARIO_GREEN_PRE :{BLACK}Select scenario (green), pre-set game (blue), or random new game
STR_4010_GENERATE_RANDOM_NEW_GAME :Generate random new game
STR_LOAD_HEIGHTMAP :{WHITE}Load Heightmap
+STR_SAVE_OSKTITLE :{BLACK}Enter a name for the savegame
##id 0x4800
STR_4800_IN_THE_WAY :{WHITE}{STRING} in the way
@@ -1993,20 +2006,20 @@
STR_4826_SUGAR_MINE :Sugar Mine
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Cargo waiting to be processed:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Production last month:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transported)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transported)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centre the main view on industry location
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}New {STRING} under construction near {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}New {STRING} being planted near {TOWN}!
@@ -2708,6 +2721,8 @@
STR_REFIT_ORDER :(Refit to {STRING})
STR_TIMETABLE_VIEW :{BLACK}Timetable
STR_TIMETABLE_VIEW_TOOLTIP :{BLACK}Switch to the timetable view
+STR_ORDER_VIEW :{BLACK}Orders
+STR_ORDER_VIEW_TOOLTIP :{BLACK}Switch to the order view
STR_8829_ORDERS :{WHITE}{VEHICLE} (Orders)
STR_882A_END_OF_ORDERS :{SETX 10}- - End of Orders - -
STR_FULLLOAD_OR_SERVICE :{SKIP}{SKIP}{STRING}
@@ -3264,6 +3279,7 @@
STR_WORLD_GENERATION_CAPTION :{WHITE}World generation
STR_RANDOM_SEED :{BLACK}Random Seed:
STR_RANDOM_SEED_HELP :{BLACK}Click to enter a random seed
+STR_RANDOM_SEED_OSKTITLE :{BLACK}Enter a random seed
STR_LAND_GENERATOR :{BLACK}Land generator:
STR_TREE_PLACER :{BLACK}Tree algorithm:
STR_HEIGHTMAP_ROTATION :{BLACK}Heightmap rotation:
@@ -3411,6 +3427,7 @@
#### Improved sign GUI
STR_NEXT_SIGN_TOOLTIP :{BLACK}Go to next sign
STR_PREVIOUS_SIGN_TOOLTIP :{BLACK}Go to previous sign
+STR_SIGN_OSKTITLE :{BLACK}Enter a name for the sign
########
@@ -3483,3 +3500,8 @@
STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP :{BLACK}Decrease dragging signal density
STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP :{BLACK}Increase dragging signal density
########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT :`1234567890-=\qwertyuiop[]asdfghjkl;' zxcvbnm,./ .
+STR_OSK_KEYBOARD_LAYOUT_CAPS :~!@#$%^&*()_+|QWERTYUIOP{{}}ASDFGHJKL:" ZXCVBNM<>? .
+########
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/english_US.txt
--- a/src/lang/english_US.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/english_US.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1976,20 +1976,20 @@
STR_4826_SUGAR_MINE :Sugar Mine
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Requires: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Cargo waiting to be processed:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produces: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Production last month:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transported)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transported)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Center the main view on industry location
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}New {STRING} under construction near {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}New {STRING} being planted near {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/esperanto.txt
--- a/src/lang/esperanto.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/esperanto.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1864,13 +1864,13 @@
STR_4826_SUGAR_MINE :Sukerminejo
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Bezonas: {YELLOW}{STRING.n}
-STR_4828_REQUIRES :{BLACK}Bezonas: {YELLOW}{STRING.n}, {STRING.n}
-STR_4829_REQUIRES :{BLACK}Bezonas: {YELLOW}{STRING.n}, {STRING.n}, {STRING.n}
+STR_4827_REQUIRES :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}
+STR_4828_REQUIRES :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}, {STRING.n}{STRING}
+STR_4829_REQUIRES :{BLACK}Bezonas: {YELLOW}{STRING.n}{STRING}, {STRING.n}{STRING}, {STRING.n}{STRING}
############ range for requires ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Lastmonata produktado:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportiĝis)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportiĝis)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centre en la ĉefvido vidu la industilokon
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nova {STRING} konstruiĝas ĉe {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nova {STRING} plantiĝas ĉe {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/estonian.txt
--- a/src/lang/estonian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/estonian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1150,6 +1150,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Luba teistele ettevõtetele raha saata: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Luba suvalise kujuga jaamad: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Raskete rongide simuleerimiseks kasutatav raskuse korrutaja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Lennuki kiiruse tegur: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Luba läbisõidupeatused linnateedel: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Luba jaamu lähestikku ehitada: {ORANGE}{STRING}
@@ -1711,6 +1712,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Sobiv rongitee puudub
STR_1007_ALREADY_BUILT :{WHITE}...juba ehitatud
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Rööbastee tuleb eelnevalt lammutada
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Läbipääsmatu või ühesuunaline maantee
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Rööbasteede ehitamine
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Elektrifitseeritud rööbasteede ehitamine
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Monorelsi ehitamine
@@ -2092,20 +2094,20 @@
STR_4826_SUGAR_MINE :suhkrukaevandus
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Vajab: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Vajab: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Vajab: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Vajab: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Vajab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Vajab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Käitlust ootav kaup:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Toodab: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Toodab: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Toodab: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Toodab: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Eelmise kuu valmistoodang:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% veetud)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% veetud)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Vaate keskendamine tööstusele
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Uus {STRING} on linna {TOWN} lähedal ehitamisel!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Uus {STRING} on istutatud linna {TOWN} lähedale!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/finnish.txt
--- a/src/lang/finnish.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/finnish.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1963,20 +1963,20 @@
STR_4826_SUGAR_MINE :Sokerikaivos
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Tarvitsee: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Tarvitsee: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Tarvitsee: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Tarvitsee: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Rahti odottaa käsittelyä:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Tuottaa: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Tuottaa: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Tuottaa: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Tuottaa: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Tuotto viime kuussa:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}{NBSP}% kuljetettu)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}{NBSP}% kuljetettu)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Keskitä päänäkymä teollisuuden sijaintiin.
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Uusi {STRING} rakennetaan kaupungin {TOWN} lähistölle!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Uusi {STRING} istutetaan kaupungin {TOWN} lähistölle!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/french.txt
--- a/src/lang/french.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/french.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1051,6 +1051,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Autoriser l'envoi d'argent aux autres compagnies: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Gares non uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplier le poid pour les trains fret (simule des trains lourds): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Facteur de vitesse des aéroplanes: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Autoriser les arrêts de bus sur les routes des municipalités: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Autoriser la construction de stations adjacentes: {ORANGE}{STRING}
@@ -1451,6 +1452,13 @@
STR_NETWORK_LANG_SWEDISH :Suédois
STR_NETWORK_LANG_TURKISH :Turc
STR_NETWORK_LANG_UKRAINIAN :Ukrainien
+STR_NETWORK_LANG_AFRIKAANS :Afrikaans
+STR_NETWORK_LANG_CROATIAN :Croate
+STR_NETWORK_LANG_CATALAN :Catalan
+STR_NETWORK_LANG_ESTONIAN :Estonien
+STR_NETWORK_LANG_GALICIAN :Galicien
+STR_NETWORK_LANG_GREEK :Grec
+STR_NETWORK_LANG_LATVIAN :Letton
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Préparation de la partie
@@ -1612,6 +1620,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Aucuns rails convenables
STR_1007_ALREADY_BUILT :{WHITE}...déjà construit
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Vous devez d'abord enlever les rails
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La route est à sens unique ou bloquée
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Construction de voie ferrée
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Construction de voie ferrée électrifiée
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Construction de Monorail
@@ -1714,6 +1723,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}L'édifice doit d'abord être démolit
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Métropole)
STR_2006_POPULATION :{BLACK}Population: {ORANGE}{COMMA}{BLACK} Maisons: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Renommer Ville
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Impossible de renommer la ville...
@@ -1993,20 +2003,20 @@
STR_4826_SUGAR_MINE :{G=f}Mine de sucre
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Nécessite: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Nécessite: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Nécessite: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Nécessite: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Nécessite: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Nécessite: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Marchandise en attente d'être utilisée:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produit: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produit: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produit: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produit: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Production le mois dernier:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transporté)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transporté)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centrer la vue sur l'industrie
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Un{G "" "" e} nouv{G eau el elle} {STRING} en construction près de {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Un{G "" "" e} nouv{G eau el elle} {STRING} s'implante près de {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/galician.txt
--- a/src/lang/galician.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/galician.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1806,19 +1806,19 @@
STR_4826_SUGAR_MINE :Mina de Azucre
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Require: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Require: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Require: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Require: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Require: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Require: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Producción no último mes:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centra-la vista principal na situación da industria
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}¡Nova {STRING} en construcción cerca de {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}¡Nova {STRING} cerca de {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/german.txt
--- a/src/lang/german.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/german.txt Fri Mar 28 10:32:55 2008 +0000
@@ -16,6 +16,7 @@
STR_0007_FLAT_LAND_REQUIRED :{WHITE}Ebenes Land erforderlich
STR_0008_WAITING :{BLACK}Im Wartezustand: {WHITE}{STRING}
STR_0009 :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM :{YELLOW}({SHORTCARGO} unterwegs von {STATION})
STR_000C_ACCEPTS :{BLACK}Akzeptiert: {WHITE}
STR_000D_ACCEPTS :{BLACK}Akzeptiert: {GOLD}
STR_000E :
@@ -724,7 +725,7 @@
STR_028D_PLACE_LIGHTHOUSE :{BLACK}Leuchtturm errichten
STR_028E_PLACE_TRANSMITTER :{BLACK}Sender errichten
STR_028F_DEFINE_DESERT_AREA :{BLACK}Lege Wüstengebiet an.{}STRG drücken zum entfernen
-STR_CREATE_LAKE :{BLACK}Wasser erzeugen.{}Baut einen Kanal. Bei gedrückter Strg.-Taste wird ein Wasserfeld erzeugt, das umliegendes Land flutet.
+STR_CREATE_LAKE :{BLACK}Wasser erzeugen.{}Baut einen Kanal; Bei gedrückter Strg.-Taste wird ein Wasserfeld erzeugt, das umliegendes Land flutet.
STR_CREATE_RIVER :{BLACK}Flüsse platzieren.
STR_0290_DELETE :{BLACK}Löschen
STR_0291_DELETE_THIS_TOWN_COMPLETELY :{BLACK}Diese Stadt vollständig löschen
@@ -1050,6 +1051,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Erlaube es, anderen Firmen Geld zu schenken: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Ungleichmäßige Bahnhöfe: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Frachtgewicht erhöhen um schwere Züge zu simulieren: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Flugzeug-Geschwindigkeitsfaktor: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Bushaltestellen an städtischen Straßen erlauben: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Bau angrenzender Stationen erlauben: {ORANGE}{STRING}
@@ -1204,6 +1206,19 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Einstellungswert ändern
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Einige oder alle dieser Standardwartungsintervalle sind inkompatibel mit den gewählten Einstellungen! 5-90% und 30-800 Tage sind gültig.
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Pathfinder für Züge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Not recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Recommended)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Pathfinder für Straßenfahrzeuge: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Original {RED}(nicht empfohlen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(empfohlen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Pathfinder für Schiffe: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Original {BLUE}(empfohlen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(nicht empfohlen)
+
STR_TEMPERATE_LANDSCAPE :Gemäßigt
STR_SUB_ARCTIC_LANDSCAPE :Subarktisch
STR_SUB_TROPICAL_LANDSCAPE :Subtropisch
@@ -1598,6 +1613,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Keine geeigneten Gleise
STR_1007_ALREADY_BUILT :{WHITE}...ist bereits gebaut
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Gleise müssen erst entfernt werden
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Einbahnstraße oder blockierter Weg
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Gleis- / Bahnhofsbau
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Bau elektrifizierter Strecken
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Einschienenbahnbau
@@ -1979,20 +1995,20 @@
STR_4826_SUGAR_MINE :{G=w}Zuckermine
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Benötigt: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Benötigt: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Benötigt: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Benötigt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Zur Verarbeitung bereitstehende Fracht:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produziert: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produziert: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produziert: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produziert: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produktion im letzten Monat:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% befördert)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% befördert)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Hauptansicht zum Industriegebiet scrollen
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Neue{G r "" s} {STRING} wird nahe {TOWN} gebaut!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Neue{G r "" s} {STRING} wird nahe {TOWN} aufgeforstet!
@@ -3340,6 +3356,7 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Transparenz für Gebäude wie Bahnhöfe, Depots, Wegpunkte und Oberleitung einstellen
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Transparenz für Brücken einstellen
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Transparenz für Bauten wie Leuchttürme und Antennen, evtl. in der Zukunft auch für Sehenswürdigkeiten, einstellen
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Transparente Oberleitungen. Strg.+klick zum feststellen.
STR_TRANSPARENT_LOADING_DESC :{BLACK}Transparenz für Ladestandsanzeige einstellen
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
@@ -3468,3 +3485,8 @@
STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP :{BLACK}Signalabstand verringern
STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP :{BLACK}Signalabstand erhöhen
########
+
+############ on screen keyboard
+STR_OSK_KEYBOARD_LAYOUT :^1234567890ß'€qwertzuiopü+asdfghjklöä#YXCVBNM;:_ .
+########
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/hungarian.txt
--- a/src/lang/hungarian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/hungarian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1115,6 +1115,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Lehessen más vállalatoknak pénzt küldeni: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Különböző vágánytípusok engedélyezése egy állomáson: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Tömegszorzó tehervonatoknak (szimulációs célból): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Repülőgép sebességszorzó: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Áthajtható állomások engedélyezése városi utakra: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Érintkező állomások építésének engedélyezése: {ORANGE}{STRING}
@@ -1515,6 +1516,13 @@
STR_NETWORK_LANG_SWEDISH :Svéd
STR_NETWORK_LANG_TURKISH :Török
STR_NETWORK_LANG_UKRAINIAN :Ukrán
+STR_NETWORK_LANG_AFRIKAANS :Afrikai
+STR_NETWORK_LANG_CROATIAN :Horvát
+STR_NETWORK_LANG_CATALAN :Katalán
+STR_NETWORK_LANG_ESTONIAN :Észt
+STR_NETWORK_LANG_GALICIAN :Gall
+STR_NETWORK_LANG_GREEK :Görög
+STR_NETWORK_LANG_LATVIAN :Lett
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Hálózati-játék lobby
@@ -1676,6 +1684,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Nincs megfelelő sín
STR_1007_ALREADY_BUILT :{WHITE}...már van itt
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Előbb le kell rombolnod a sínt
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Az út egy irányú vagy blokkolt
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Vasútépítés
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Elektromos-vasút építés
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Egysínű vasút építése
@@ -1778,6 +1787,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Előbb le kell rombolnod az épületet
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Város)
STR_2006_POPULATION :{BLACK}Lakosság: {ORANGE}{COMMA}{BLACK} Házak: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Város átnevezése
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Nem nevezheted át a várost...
@@ -2094,20 +2104,20 @@
STR_4826_SUGAR_MINE.t :cukorbányát
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Felhasznál: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Felhasznál: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Felhasznál: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Felhasznál: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Feldolgozásra váró szállítmány:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Gyárt: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Gyárt: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Gyárt: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Gyárt: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Múlt havi termelés:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% elszállítva)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% elszállítva)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}A fő nézetet a gazdasági épületre állítja
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Új {STRING.t} építenek {TOWN} közelében!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Új {STRING.t} ültettek {TOWN} közelében!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/icelandic.txt
--- a/src/lang/icelandic.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/icelandic.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1,9 +1,11 @@
##name Icelandic
##ownname Íslenska
##isocode is_IS
-##plural 0
+##plural 9
##gender karlkyn kvenkyn hvorugkyn
+#
+
##id 0x0000
STR_NULL :
STR_0001_OFF_EDGE_OF_MAP :{WHITE}Brún kortsins
@@ -14,6 +16,7 @@
STR_0007_FLAT_LAND_REQUIRED :{WHITE}Sléttlendi nauðsynlegt
STR_0008_WAITING :{BLACK}Bíður: {WHITE}{STRING}
STR_0009 :{WHITE}{CARGO}
+STR_EN_ROUTE_FROM :{YELLOW}({SHORTCARGO} frá {STATION})
STR_000C_ACCEPTS :{BLACK}Tekur við: {WHITE}
STR_000D_ACCEPTS :{BLACK}Tekur við: {GOLD}
STR_000E :
@@ -278,6 +281,7 @@
STR_OSNAME_MORPHOS :MorphOS
STR_OSNAME_AMIGAOS :AmigaOS
STR_OSNAME_OS2 :OS/2
+STR_OSNAME_SUNOS :SunOS
STR_013B_OWNED_BY :{WHITE}...í eigu {STRING}
STR_013C_CARGO :{BLACK}Farmur
@@ -582,7 +586,11 @@
STR_0207_ARRIVAL_OF_FIRST_VEHICLE :{YELLOW}Aðkoma fyrsta farartækis á stöð andstæðings
STR_0208_ACCIDENTS_DISASTERS :{YELLOW}Slys / hamfarir
STR_0209_COMPANY_INFORMATION :{YELLOW}Fyrirtækisupplýsingar
+STR_NEWS_OPEN_CLOSE :{YELLOW}Opnun / lokun iðnaða
STR_020A_ECONOMY_CHANGES :{YELLOW}Efnahagsbreytingar
+STR_INDUSTRY_CHANGES_SERVED_BY_PLAYER :{YELLOW}Framleiðslubreytingar fyrirtækja þjónustuð af leikmanni
+STR_INDUSTRY_CHANGES_SERVED_BY_OTHER :{YELLOW}Framleiðslubreytingar fyrirtækja þjónustuð af mótherjum
+STR_OTHER_INDUSTRY_PRODUCTION_CHANGES :{YELLOW}Aðrar framleiðslubreytingar
STR_020B_ADVICE_INFORMATION_ON_PLAYER :{YELLOW}Ráð / upplýsingar um farartæki leikmanns
STR_020C_NEW_VEHICLES :{YELLOW}Ný farartæki
STR_020D_CHANGES_OF_CARGO_ACCEPTANCE :{YELLOW}Breyting á viðtöku farms
@@ -717,6 +725,8 @@
STR_028D_PLACE_LIGHTHOUSE :{BLACK}Setja vita
STR_028E_PLACE_TRANSMITTER :{BLACK}Setja sendi
STR_028F_DEFINE_DESERT_AREA :{BLACK}Afmarkaðu eyðimörk.{}Smelltu og haltu CTRL til að fjarlægja hana
+STR_CREATE_LAKE :{BLACK}Skilgreina vantssvæði.{}Grafa skipaskurð, nema CTRL sé haldið niðri við sjávarmál, þá flæðir það umhverfið í staðin.
+STR_CREATE_RIVER :{BLACK}Búa til fljót.
STR_0290_DELETE :{BLACK}Eyða
STR_0291_DELETE_THIS_TOWN_COMPLETELY :{BLACK}Eyða þessum bæ algjörlega
STR_0292_SAVE_SCENARIO :Vista kort
@@ -740,6 +750,7 @@
STR_02A1_SMALL :{BLACK}Lítill
STR_02A2_MEDIUM :{BLACK}Miðlungs
STR_02A3_LARGE :{BLACK}Stór
+STR_SCENARIO_EDITOR_CITY :{BLACK}Borg
STR_02A4_SELECT_TOWN_SIZE :{BLACK}Velja stærð bæjar
STR_02A5_TOWN_SIZE :{YELLOW}Stærð bæjar:
@@ -764,6 +775,7 @@
STR_02C6_DIFFICULTY_SETTINGS :Erfiðleikastig
STR_MENU_CONFIG_PATCHES :Viðbætur
STR_NEWGRF_SETTINGS :NewGRF stillingar
+STR_TRANSPARENCY_OPTIONS :Gegnsæisstillingar
STR_GAMEOPTMENU_0A :
STR_02CA_TOWN_NAMES_DISPLAYED :{SETX 12}Bæjarnöfn sýnd
STR_02CC_STATION_NAMES_DISPLAYED :{SETX 12}Stöðvarnöfn sýnd
@@ -846,6 +858,7 @@
STR_0314_FUND_NEW_INDUSTRY :{WHITE}Fjármagna nýjan iðnað
STR_JUST_STRING :{STRING}
+STR_JUST_INT :{NUM}
STR_0316_CAN_ONLY_BE_BUILT_IN_TOWNS :{WHITE}...aðeins hægt að byggja í bæjum
STR_0317_CAN_ONLY_BE_BUILT_IN_RAINFOREST :{WHITE}...aðeins hægt að byggja á regnskógasvæðum
STR_0318_CAN_ONLY_BE_BUILT_IN_DESERT :{WHITE}...aðeins hægt að byggja í eyðimörk
@@ -923,6 +936,7 @@
STR_OPTIONS_FULLSCREEN :{BLACK}Fylla út í skjá
STR_OPTIONS_FULLSCREEN_TIP :{BLACK}Smelltu hér til að OpenTTD fylli út í skjáinn
+STR_FULLSCREEN_FAILED :{WHITE}Skjáfyllihamur brást
STR_OPTIONS_RES :{BLACK}Skjáupplausn
STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -1006,6 +1020,7 @@
STR_CONFIG_PATCHES_ON :Já
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Sýna hraða farartækis á upplýsingaslá: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Leyfilegt að byggja í halla og á strönd: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Leyfa landslagsbreytingar undir byggingum, teinum o.fl. (landfylling): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Raunverulegri stærð svæðis sem stöðvar ná yfir: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Leyfa meiri eyðingu vega, brúa, gangna o.s.frv. í eigu bæjar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Leyfa mjög langar lestir: {ORANGE}{STRING}
@@ -1019,6 +1034,8 @@
STR_CONFIG_PATCHES_SELECTGOODS :{LTBLUE}Aðeins afhlaða farmi á stöðvum þar sem er eftirspurn: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LONGBRIDGES :{LTBLUE}Leyfa byggingu mjög langra brúa: {ORANGE}{STRING}
STR_CONFIG_PATCHES_GOTODEPOT :{LTBLUE}Skýli má vera á áætlun lesta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD :{LTBLUE}Fjármögnun nýrra hráefnisiðnaða: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_RAW_INDUSTRY_CONSTRUCTION_METHOD_NONE :engin
STR_CONFIG_PATCHES_MULTIPINDTOWN :{LTBLUE}Leyfa marga svipaða iðnaði í sama bæ: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SAMEINDCLOSE :{LTBLUE}Má byggja iðnaði af sömu gerð nálægt hvor öðrum: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LONGDATE :{LTBLUE}Sýna alltaf fulla dagsetningu á upplýsingaslá: {ORANGE}{STRING}
@@ -1028,9 +1045,12 @@
STR_CONFIG_PATCHES_ROADVEH_QUEUE :{LTBLUE}Bifreiðir bíða í röð (með skömmtunaráhrifum): {ORANGE}{STRING}
STR_CONFIG_PATCHES_AUTOSCROLL :{LTBLUE}Færa sjónarhorn þegar músin nálgast brún gluggans: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BRIBE :{LTBLUE}Leyfilegt að múta bæjaryfirvöldum: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_EXCLUSIVE :{LTBLUE}Heimila sölu á sérleyfi til flutninga: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Heimila peningagreiðslur til annarra fyrirtækja: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Órétthyrndar lestarstöðvar leyfðar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Margfalda þyngd farms til að líkja eftir þyngri lestum: {ORANGE}{STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Leyfa strætóstöðvar á gangstéttum bæja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Heimila sambyggingu stöðva: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Alltaf leyfa litla flugvelli: {ORANGE}{STRING}
@@ -1071,12 +1091,40 @@
STR_CONFIG_PATCHES_SERVICEATHELIPAD :{LTBLUE}Skoða þyrlur sjálfvirkt á þyrlupalli: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR :{LTBLUE}Opna landmótunarglugga samhliða öðrum framkvæmdum: {ORANGE}{STRING}
STR_CONFIG_PATCHES_REVERSE_SCROLLING :{LTBLUE}Færa sjónarhorn í öfuga átt miðað við mús: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SMOOTH_SCROLLING :{LTBLUE}Mjúkt skrun í skjágluggum: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MEASURE_TOOLTIP :{LTBLUE}Sýna mælstiku við byggingu: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LIVERIES :{LTBLUE}Sýna auka litastillingar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LIVERIES_NONE :Aldrei
STR_CONFIG_PATCHES_LIVERIES_OWN :Eigin fyrirtækis
STR_CONFIG_PATCHES_LIVERIES_ALL :Allra fyrirtækja
STR_CONFIG_PATCHES_PREFER_TEAMCHAT :{LTBLUE}Nota liðsspjall með : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLLING :{LTBLUE}Virkni skrunhjóls: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_SCROLLWHEEL_ZOOM :Víkka/þrengja sjónarhorn
+STR_CONFIG_PATCHES_SCROLLWHEEL_SCROLL :Skruna á korti
+STR_CONFIG_PATCHES_SCROLLWHEEL_OFF :Engin
+STR_CONFIG_PATCHES_SCROLLWHEEL_MULTIPLIER :{LTBLUE}Hraði skrunhjóls á korti: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_RIGHT_MOUSE_BTN_EMU_OFF :Af
+
+STR_CONFIG_PATCHES_PAUSE_ON_NEW_GAME :{LTBLUE}Setja leik á bið þegar nýr leikur er hafinn: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS :{LTBLUE}Ítarlegur listi yfir farartæki: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OFF :Af
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_OWN :Eigin fyrirtækis
+STR_CONFIG_PATCHES_ADVANCED_VEHICLE_LISTS_ALL :Allra fyrirtækja
+STR_CONFIG_PATCHES_LOADING_INDICATORS :{LTBLUE}Sýna stöðu lestunar: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OFF :Engra fyrirtækja
+STR_CONFIG_PATCHES_LOADING_INDICATORS_OWN :Eigin fyrirtækis
+STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Allra fyrirtækja
+STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Virkja áætlanir fyrir farartæki: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Birta áætlanir í slögum frekar en dögum: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Valin lestartegund (eftir nýjan leik/opnaðan leik): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Hefðbundin lest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Rafmagnslest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL :Einteinungslest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MAGLEV :Segulsviflest
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_FIRST :Fyrsta mögulega
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST :Síðasta mögulega
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED :Mest notuð
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Lestir á leikmann mest: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Bifreiðir á leikmann mest: {ORANGE}{STRING}
@@ -1110,12 +1158,32 @@
STR_CONFIG_PATCHES_ALLOW_SHARES :{LTBLUE}Leyfa hlutabréfakaup í öðrum fyrirtækjum
STR_CONFIG_PATCHES_DRAG_SIGNALS_DENSITY :{LTBLUE}Þegar dregið er, setja skilti á: {ORANGE}{STRING} hvern reit
STR_CONFIG_PATCHES_SEMAPHORE_BUILD_BEFORE_DATE :{LTBLUE}Nota skilti í stað ljósa fyrir: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ENABLE_SIGNAL_GUI :{LTBLUE}Virkja valmynd lestarljósa: {ORANGE}{STRING}
+
+STR_CONFIG_PATCHES_TOWN_LAYOUT_INVALID :{WHITE}Vegaskipulagið „ekki fleiri vegi“ er ekki gilt við landslagsgerð
+STR_CONFIG_PATCHES_TOWN_LAYOUT :{LTBLUE}Vegaskipulag bæja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_LAYOUT_NO_ROADS :ekki fleiri vegi
+STR_CONFIG_PATCHES_TOWN_LAYOUT_DEFAULT :sjálfgefið
+STR_CONFIG_PATCHES_TOWN_LAYOUT_BETTER_ROADS :betri vegi
+STR_CONFIG_PATCHES_TOWN_LAYOUT_2X2_GRID :2x2 net
+STR_CONFIG_PATCHES_TOWN_LAYOUT_3X3_GRID :3x3 net
+
STR_CONFIG_PATCHES_TOOLBAR_POS :{LTBLUE}Staðsetning tækjasláar: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TOOLBAR_POS_LEFT :Vinstri
STR_CONFIG_PATCHES_TOOLBAR_POS_CENTER :Miðja
STR_CONFIG_PATCHES_TOOLBAR_POS_RIGHT :Hægri
STR_CONFIG_PATCHES_SNAP_RADIUS :{LTBLUE}Gluggar smella saman við: {ORANGE}{STRING} punkta radíus
STR_CONFIG_PATCHES_SNAP_RADIUS_DISABLED :{LTBLUE}Gluggar smella: {ORANGE}ekki saman
+STR_CONFIG_PATCHES_TOWN_GROWTH :{LTBLUE}Vaxtarhraði bæja: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_TOWN_GROWTH_NONE :Enginn
+STR_CONFIG_PATCHES_TOWN_GROWTH_SLOW :Hægur
+STR_CONFIG_PATCHES_TOWN_GROWTH_NORMAL :Venjulegur
+STR_CONFIG_PATCHES_TOWN_GROWTH_FAST :Hraður
+STR_CONFIG_PATCHES_TOWN_GROWTH_VERY_FAST :Mjög hraður
+STR_CONFIG_PATCHES_LARGER_TOWNS :{LTBLUE}Hlutfall bæja sem verða að borgum: {ORANGE}1 af {STRING}
+STR_CONFIG_PATCHES_LARGER_TOWNS_DISABLED :{LTBLUE}Hlutfall bæja sem verða að borgum: {ORANGE}Enginn
+STR_CONFIG_PATCHES_CITY_SIZE_MULTIPLIER :{LTBLUE}Upphaflegur margfaldari bogarstærðar: {ORANGE}{STRING}
+STR_CONFIG_MODIFIED_ROAD_REBUILD :{LTBLUE}Fjarlægja fráleita vegahluti þegar vegagerð stendur yfir
STR_CONFIG_PATCHES_GUI :{BLACK}Viðmót
STR_CONFIG_PATCHES_CONSTRUCTION :{BLACK}Bygging
@@ -1131,6 +1199,19 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Breyta gildi stillingar
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Einhver eða öll bil milli skoðana hér fyrir neðan eru ósamhæfanleg við valdar stillingar! 5-90% og 30-800 dagar er leyfilegt
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Leiðsagnarkerfi lesta: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Óráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Ráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Leiðsögukerfi bifreiða: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Original {RED}(Óráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Ráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Leiðsögukerfi skipa: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Original {BLUE}(Ráðlegt)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(Óráðlegt)
+
STR_TEMPERATE_LANDSCAPE :Temprað landslag
STR_SUB_ARCTIC_LANDSCAPE :Heimskautalandslag
STR_SUB_TROPICAL_LANDSCAPE :Miðjarðarlandslag
@@ -1192,6 +1273,7 @@
STR_TREES_RANDOM_TYPE_TIP :{BLACK}Gróðursetja tré af handahófskenndri gerð
STR_CANT_BUILD_CANALS :{WHITE}Ekki hægt að grafa skipaskurð hér...
+STR_BUILD_CANALS_TIP :{BLACK}Grafa skipaskurði.
STR_LANDINFO_CANAL :Skipaskurður
STR_CANT_BUILD_LOCKS :{WHITE}Ekki hægt að gera skurðgátt hér
@@ -1200,6 +1282,7 @@
STR_BUOY_IS_IN_USE :{WHITE}... bauja í notkun!
+STR_LANDINFO_COORDS :{BLACK}Hnit: {LTBLUE}{NUM}x{NUM}x{NUM} ({STRING})
STR_CANT_REMOVE_PART_OF_STATION :{WHITE}Get ekki fjarlægt hluta af stöð...
STR_CANT_CONVERT_RAIL :{WHITE}Get ekki breytt lestarteini...
@@ -1310,18 +1393,23 @@
STR_NETWORK_PASSWORD_TIP :{BLACK}Verndaðu leikinn þinn með lykilorði ef þú vilt ekki að óboðnir tengist honum
STR_NETWORK_SELECT_MAP :{BLACK}Veldu kort:
STR_NETWORK_SELECT_MAP_TIP :{BLACK}Hvaða kort viltu spila?
-STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Hámarksfjöldi notenda:
-STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Veldu hámarksfjölda notenda. Ekki þarf að fylla öll pláss
+STR_NETWORK_LAN_INTERNET_COMBO :{BLACK}{SKIP}{STRING}
STR_NETWORK_LAN :Staðarnet
STR_NETWORK_INTERNET :Internet
STR_NETWORK_LAN_INTERNET :Staðarnet / Internet
STR_NETWORK_INTERNET_ADVERTISE :Internet (auglýsa)
+STR_NETWORK_CLIENTS_SELECT :{BLACK}{SKIP}{SKIP}{NUM} biðlar{P i ar}
+STR_NETWORK_NUMBER_OF_CLIENTS :{BLACK}Hámarksfjöldi notenda:
+STR_NETWORK_NUMBER_OF_CLIENTS_TIP :{BLACK}Veldu hámarksfjölda notenda. Ekki þarf að fylla öll pláss
+STR_NETWORK_COMPANIES_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{NUM} Fyrirtæki
STR_NETWORK_NUMBER_OF_COMPANIES :{BLACK}Hámarksfjöldi fyrirtækja:
STR_NETWORK_NUMBER_OF_COMPANIES_TIP :{BLACK}Takmarka fjölda fyrirtækja á vefþjóni
+STR_NETWORK_SPECTATORS_SELECT :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{NUM} áhorf{P andi endur}
STR_NETWORK_NUMBER_OF_SPECTATORS :{BLACK}Hámarksfjöldi áhorfanda:
STR_NETWORK_NUMBER_OF_SPECTATORS_TIP :{BLACK}Takmarka fjölda áhorfanda á vefþjóninum
STR_NETWORK_LANGUAGE_SPOKEN :{BLACK}Tungumál:
STR_NETWORK_LANGUAGE_TIP :{BLACK}Aðrir notendur munu vita hvaða tungumál er talað á þjóninum
+STR_NETWORK_LANGUAGE_COMBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_NETWORK_START_GAME :{BLACK}Hefja leik
STR_NETWORK_START_GAME_TIP :{BLACK}Hefja nýjan netleik í sérvöldu korti eða landslagi af handahófi
STR_NETWORK_LOAD_GAME :{BLACK}Hlaða leik
@@ -1332,6 +1420,31 @@
STR_NETWORK_LANG_ENGLISH :Enska
STR_NETWORK_LANG_GERMAN :Þýska
STR_NETWORK_LANG_FRENCH :Franska
+STR_NETWORK_LANG_BRAZILIAN :Brasilíska
+STR_NETWORK_LANG_BULGARIAN :Búlgarska
+STR_NETWORK_LANG_CHINESE :Kínverska
+STR_NETWORK_LANG_CZECH :Tékkneska
+STR_NETWORK_LANG_DANISH :Danska
+STR_NETWORK_LANG_DUTCH :Hollenska
+STR_NETWORK_LANG_ESPERANTO :Esperanto
+STR_NETWORK_LANG_FINNISH :Finnska
+STR_NETWORK_LANG_HUNGARIAN :Ungverska
+STR_NETWORK_LANG_ICELANDIC :Íslenska
+STR_NETWORK_LANG_ITALIAN :Ítalska
+STR_NETWORK_LANG_JAPANESE :Japanska
+STR_NETWORK_LANG_KOREAN :Kóreiska
+STR_NETWORK_LANG_LITHUANIAN :Litháenska
+STR_NETWORK_LANG_NORWEGIAN :Norska
+STR_NETWORK_LANG_POLISH :Pólska
+STR_NETWORK_LANG_PORTUGUESE :Portúgalska
+STR_NETWORK_LANG_ROMANIAN :Rómanska
+STR_NETWORK_LANG_RUSSIAN :Rússneska
+STR_NETWORK_LANG_SLOVAK :Slóvakíska
+STR_NETWORK_LANG_SLOVENIAN :Slóveska
+STR_NETWORK_LANG_SPANISH :Spænska
+STR_NETWORK_LANG_SWEDISH :Sænska
+STR_NETWORK_LANG_TURKISH :Tyrkneska
+STR_NETWORK_LANG_UKRAINIAN :Úkraínska
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Anddyri fjölspilunarleiks
@@ -1493,6 +1606,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Enginn hentugur lestarteinn
STR_1007_ALREADY_BUILT :{WHITE}...nú þegar byggt
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Verður að fjarlægja lestartein fyrst
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Vegurinn er einstefnuvegur eða stíflaður
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Járnbrautarlestarframkvæmdir
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Raflestaframkvæmdir
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Einteinungsframkvæmdir
@@ -1524,6 +1638,14 @@
STR_RAILROAD_TRACK_WITH_NORMAL_SIGNALS :Lestarteinn með venjulegum ljósum
STR_RAILROAD_TRACK_WITH_PRESIGNALS :Lestarteinn með forljósum
STR_RAILROAD_TRACK_WITH_EXITSIGNALS :Lestarteinn með útljósum
+STR_RAILROAD_TRACK_WITH_COMBOSIGNALS :Járnbrautarspor með fjölljósum
+STR_RAILROAD_TRACK_WITH_NORMAL_PRESIGNALS :Járbrautarspor með venjulegum ljósum og forljósum
+STR_RAILROAD_TRACK_WITH_NORMAL_EXITSIGNALS :Járnbrautarspor með venjulegum ljósum og útgangsljósum
+STR_RAILROAD_TRACK_WITH_NORMAL_COMBOSIGNALS :Járnbrautarspor með venjulegum ljósum og fjölljósum
+STR_RAILROAD_TRACK_WITH_PRE_EXITSIGNALS :Járnbrautarspor með for- og útgangsljósum
+STR_RAILROAD_TRACK_WITH_PRE_COMBOSIGNALS :Járnbrautarspor með for- og fjölljósum
+STR_RAILROAD_TRACK_WITH_EXIT_COMBOSIGNALS :Járnbrautarspor með útgangs- og fjölljósum
+STR_MUST_REMOVE_RAILWAY_STATION_FIRST :{WHITE}Verður að fjarlægja járnbrautarstöð fyrst
@@ -1531,22 +1653,42 @@
STR_1801_MUST_REMOVE_ROAD_FIRST :{WHITE}Verður að fjarlægja veg fyrst
STR_ROAD_WORKS_IN_PROGRESS :{WHITE}Vegaframkvæmdir standa yfir
STR_1802_ROAD_CONSTRUCTION :{WHITE}Vegagerð
+STR_WHITE_TRAMWAY_CONSTRUCTION :{WHITE}Sporvagnaframkvæmdir
STR_1803_SELECT_ROAD_BRIDGE :{WHITE}Veldu vegabrú
+STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION :{WHITE}... einstefnuvegin geta ekki mætt öðrum vegi
STR_1804_CAN_T_BUILD_ROAD_HERE :{WHITE}Get ekki lagt veg hér...
+STR_CAN_T_BUILD_TRAMWAY_HERE :{WHITE}Get ekki lagt sporvagnaspor hér...
STR_1805_CAN_T_REMOVE_ROAD_FROM :{WHITE}Get ekki fjarlægt veg héðan...
+STR_CAN_T_REMOVE_TRAMWAY_FROM :{WHITE}Get ekki fjarlægt sporvagnaspor héðan...
STR_1806_ROAD_DEPOT_ORIENTATION :{WHITE}Bifreiðaskýli
+STR_TRAM_DEPOT_ORIENTATION :{WHITE}Staða sporvagnaskýlis
STR_1807_CAN_T_BUILD_ROAD_VEHICLE :{WHITE}Get ekki fjarlægt bifreiðaskýli héðan...
+STR_CAN_T_BUILD_TRAM_VEHICLE :{WHITE}Get ekki reist sporvagnaskýli hér...
STR_1808_CAN_T_BUILD_BUS_STATION :{WHITE}Get ekki byggt strætóstoppistöð...
STR_1809_CAN_T_BUILD_TRUCK_STATION :{WHITE}Get ekki byggt flutningabílastöð...
+STR_CAN_T_BUILD_PASSENGER_TRAM_STATION :{WHITE}Get ekki reist sporvagnastöð fyrir farþega...
+STR_CAN_T_BUILD_CARGO_TRAM_STATION :{WHITE}Get ekki reist sporvagnastöð fyrir farm...
STR_180A_ROAD_CONSTRUCTION :Vegagerð
+STR_TRAMWAY_CONSTRUCTION :Sporvagnaframkvæmdir
STR_180B_BUILD_ROAD_SECTION :{BLACK}Leggja veg
+STR_BUILD_AUTOROAD_TIP :{BLACK}Leggja veghluta í sjálfvirkum vegaham
+STR_BUILD_TRAMWAY_SECTION :{BLACK}Leggja sporvagnaspor
+STR_BUILD_AUTOTRAM_TIP :{BLACK}Leggja sporvagnaspor í sjálfvirkum sporvagnsham
STR_180C_BUILD_ROAD_VEHICLE_DEPOT :{BLACK}Byggja bifreiðaskýli (til að byggja og gera við bifreiðir)
+STR_BUILD_TRAM_VEHICLE_DEPOT :{BLACK}Reisa sporvagnaskýli (til að smíða og þjónusta vagna)
STR_180D_BUILD_BUS_STATION :{BLACK}Byggja strætóstoppistöð
STR_180E_BUILD_TRUCK_LOADING_BAY :{BLACK}Byggja flutningabílastöð
+STR_BUILD_PASSENGER_TRAM_STATION :{BLACK}Reisa sporvagnastöð fyrir farþega
+STR_BUILD_CARGO_TRAM_STATION :{BLACK}Reisa sporvagnastöð fyrir farm
STR_180F_BUILD_ROAD_BRIDGE :{BLACK}Byggja vegabrú
+STR_BUILD_TRAMWAY_BRIDGE :{BLACK}Byggja sporvagnabrú
STR_1810_BUILD_ROAD_TUNNEL :{BLACK}Byggja göng
+STR_BUILD_TRAMWAY_TUNNEL :{BLACK}Grafa sporvagnagöng
+STR_TOGGLE_ONE_WAY_ROAD :{BLACK}Virkja/afvirkja einstefnugötur
STR_1811_TOGGLE_BUILD_REMOVE_FOR :{BLACK}Skipta á milli byggja/fjarlægja fyrir vegagerð
+STR_TOGGLE_BUILD_REMOVE_FOR_TRAMWAYS :{BLACK}Skipta á milli þess að leggja leggja og fjarlægja sporvagnaspor
STR_1813_SELECT_ROAD_VEHICLE_DEPOT :{BLACK}Veldu legu bifreiðaskýlis
+STR_SELECT_TRAM_VEHICLE_DEPOT :{BLACK}Veldu stöðu sporvagnaskýlis
STR_1814_ROAD :Vegur
STR_1815_ROAD_WITH_STREETLIGHTS :Vegur með umferðarljósum
STR_1816_TREE_LINED_ROAD :Trjáskreyttur vegur
@@ -1554,6 +1696,8 @@
STR_1818_ROAD_RAIL_LEVEL_CROSSING :Vega/lestar gatnamót
STR_CAN_T_REMOVE_BUS_STATION :{WHITE}Get ekki fjarlægt strætóstoppistöð...
STR_CAN_T_REMOVE_TRUCK_STATION :{WHITE}Get ekki flutt vörubílastöð...
+STR_CAN_T_REMOVE_PASSENGER_TRAM_STATION :{WHITE}Get ekki fjarlægt farþegasporvagnastöð...
+STR_CAN_T_REMOVE_CARGO_TRAM_STATION :{WHITE}Get ekki fjarlægt farmsporvagnastöð...
##id 0x2000
STR_2000_TOWNS :{WHITE}Bæir
@@ -1562,6 +1706,7 @@
STR_TOWN_LABEL_TINY_BLACK :{TINYFONT}{BLACK}{TOWN}
STR_TOWN_LABEL_TINY_WHITE :{TINYFONT}{WHITE}{TOWN}
STR_2002 :{TINYFONT}{BLACK}{SIGN}
+STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Verður að eyða byggingu fyrst
STR_2005 :{WHITE}{TOWN}
STR_2006_POPULATION :{BLACK}Íbúafjöldi: {ORANGE}{COMMA}{BLACK} Hús: {ORANGE}{COMMA}
@@ -1718,8 +1863,12 @@
STR_3041_NOW_ACCEPTS_AND :{WHITE}{STATION} tekur nú við {STRING} og {STRING}
STR_3042_BUS_STATION_ORIENTATION :{WHITE}Staða strætisvagnastöðvar
STR_3043_TRUCK_STATION_ORIENT :{WHITE}Staða póstvagnsstöðvar
+STR_PASSENGER_TRAM_STATION_ORIENTATION :{WHITE}Staða sporvagnafarþegastöðvar
+STR_CARGO_TRAM_STATION_ORIENT :{WHITE}Staða farmsporvagnastöðvar
STR_3046_MUST_DEMOLISH_BUS_STATION :{WHITE}Verður að eyða strætisvagnastöðinni fyrst
STR_3047_MUST_DEMOLISH_TRUCK_STATION :{WHITE}Verður að eyða póstvagnsstöðinni fyrst
+STR_MUST_DEMOLISH_PASSENGER_TRAM_STATION :{WHITE}Verður að rífa farþegasporvagnastöð fyrst
+STR_MUST_DEMOLISH_CARGO_TRAM_STATION :{WHITE}Verður að rífa farmsporvagnastöð fyrst
STR_3048_STATIONS :{WHITE}{COMPANY} - {COMMA} Stöðvar
STR_3049_0 :{YELLOW}{STATION} {STATIONFEATURES}
STR_304A_NONE :{YELLOW}- Ekkert -
@@ -1731,6 +1880,8 @@
STR_3050_SELECT_LENGTH_OF_RAILROAD :{BLACK}Veldu lengd lestarstöðvar
STR_3051_SELECT_BUS_STATION_ORIENTATION :{BLACK}Veldu stöðu strætisvagnastöðvar
STR_3052_SELECT_TRUCK_LOADING_BAY :{BLACK}Veldu stöðu póstvagnsstöðvar
+STR_SELECT_PASSENGER_TRAM_STATION_ORIENTATION :{BLACK}Velja stöðu farþegasporvagnastöðvar
+STR_SELECT_CARGO_TRAM_STATION_ORIENTATION :{BLACK}Velja stöðu farmsporvagnastöðvar
STR_3053_CENTER_MAIN_VIEW_ON_STATION :{BLACK}Færa miðju sýnishorns á staðsetningu stöðvar
STR_3054_SHOW_STATION_RATINGS :{BLACK}Sýna einkunn stöðvar
STR_3055_CHANGE_NAME_OF_STATION :{BLACK}Breyta nafni stöðvar
@@ -1768,6 +1919,7 @@
STR_3805_COAST_OR_RIVERBANK :Strönd
STR_3806_SHIP_DEPOT :Slippur
STR_3807_CAN_T_BUILD_ON_WATER :{WHITE}...Get ekki byggt á vatni
+STR_MUST_DEMOLISH_CANAL_FIRST :{WHITE}Verður að fylla upp í skipaskurð fyrst
##id 0x4000
STR_4000_SAVE_GAME :{WHITE}Vista leik
@@ -1780,6 +1932,11 @@
STR_4007_GAME_SAVE_FAILED :{WHITE}Vistun leiks mistókst{}{STRING}
STR_4008_UNABLE_TO_DELETE_FILE :{WHITE}Get ekki eytt skrá
STR_4009_GAME_LOAD_FAILED :{WHITE}Mistókst að opna leik{}{STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_INTERNAL_ERROR :Innri villa: {STRING}
+STR_GAME_SAVELOAD_ERROR_BROKEN_SAVEGAME :Bilun í vistuðum leik - {STRING}
+STR_GAME_SAVELOAD_ERROR_TOO_NEW_SAVEGAME :Leikur er vistaður í nýrri útgáfu
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_READABLE :Skrá er ekki lesanleg
+STR_GAME_SAVELOAD_ERROR_FILE_NOT_WRITEABLE :Skrá er ekki skrifanleg
STR_400A_LIST_OF_DRIVES_DIRECTORIES :{BLACK}Listi yfir drif, möppur og vistaða leiki
STR_400B_CURRENTLY_SELECTED_NAME :{BLACK}Nafn fyrir vistun leiks
STR_400C_DELETE_THE_CURRENTLY_SELECTED :{BLACK}Eyða nafninu
@@ -1831,13 +1988,20 @@
STR_4826_SUGAR_MINE :Sykurnáma
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Tekur við: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Tekur við: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Tekur við: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Tekur við: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Tekur við: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Tekur við: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
+############ range for produces starts
+STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Farmur sem bíður verkunar:
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Framleiðir: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Framleiðir: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+############ range for produces ends
+
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Framleiðsla síðasta mánaðar:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% flutt)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% flutt)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Miðja aðalsjónarhorn á iðnað
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Ný {STRING} í byggingu við {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Ný {STRING} er að rísa við {TOWN}!
@@ -1865,6 +2029,8 @@
STR_5006_MUST_DEMOLISH_TUNNEL_FIRST :{WHITE}Verður að eyða göngum fyrst
STR_5007_MUST_DEMOLISH_BRIDGE_FIRST :{WHITE}Verður að eyða brú fyrst
STR_5008_CANNOT_START_AND_END_ON :{WHITE}Getur ekki byrjað og endað á sama stað
+STR_BRIDGEHEADS_NOT_SAME_HEIGHT :{WHITE}Brúarendar ekki í sömu hæð
+STR_BRIDGE_TOO_LOW_FOR_TERRAIN :{WHITE}Brú er of lág fyrir umhverfið
STR_500A_START_AND_END_MUST_BE_IN :{WHITE}Verður að byrja og enda í sömu línu
STR_500B_SITE_UNSUITABLE_FOR_TUNNEL :{WHITE}Óhentug staðsetning fyrir enda gangnanna
STR_500D :{GOLD}{STRING},{} {VELOCITY} {WHITE}{CURRENCY}
@@ -1897,7 +2063,7 @@
##id 0x5800
STR_5800_OBJECT_IN_THE_WAY :{WHITE}Hluturinn er fyrir
-STR_5801_TRANSMITTER :Sendir
+STR_5801_TRANSMITTER :Mastur
STR_5802_LIGHTHOUSE :Viti
STR_5803_COMPANY_HEADQUARTERS :Höfuðstöðvar fyritækis
STR_5804_COMPANY_HEADQUARTERS_IN :{WHITE}...höfuðstöðvar fyrirtækis eru fyrir
@@ -1949,6 +2115,7 @@
STR_SV_STNAME_LOWER :Neðri {STRING}
STR_SV_STNAME_HELIPORT :{STRING} Þyrlupallur
STR_SV_STNAME_FOREST :{STRING} Skógur
+STR_SV_STNAME_FALLBACK :{STRING} Stöð #{NUM}
############ end of savegame specific region!
@@ -1985,6 +2152,7 @@
############ range for difficulty settings ends
STR_NONE :Engin
+STR_NUM_VERY_LOW :Mjög lág
STR_6816_LOW :Fáir
STR_6817_NORMAL :Miðlungs
STR_6818_HIGH :Margir
@@ -2143,6 +2311,11 @@
STR_COMPANY_PASSWORD :{BLACK}Lykilorð
STR_COMPANY_PASSWORD_TOOLTIP :{BLACK}Til að vernda fyrirtæki þitt frá óboðnum notendum geturðu sett lykilorð á það
STR_SET_COMPANY_PASSWORD :{BLACK}Setja lykilorð á fyrirtæki
+STR_COMPANY_PASSWORD_CANCEL :{BLACK}Ekki vista innslegið lykilorð
+STR_COMPANY_PASSWORD_OK :{BLACK}Læsa fyrirtækinu með nýja lykilorðinu
+STR_COMPANY_PASSWORD_CAPTION :{WHITE}Lykilorð fyrirtækis
+STR_MAKE_DEFAULT_COMPANY_PASSWORD :{BLACK}Sjálfgefið lykilorð fyrirtækis
+STR_MAKE_DEFAULT_COMPANY_PASSWORD_TIP :{BLACK}Nota lykilorð þessa fyrirtækis sem sjálfgefið fyrir ný fyrirtæki
STR_7073_WORLD_RECESSION_FINANCIAL :{BIGFONT}{BLACK}Heimssamdráttur!{}{}Hagfræðingar hræddir um efnahagshrun!
STR_7074_RECESSION_OVER_UPTURN_IN :{BIGFONT}{BLACK}Samdráttur!{}{}Uppslag í viðskiptum gefur bjartari von um betri efnahag!
STR_7075_TOGGLE_LARGE_SMALL_WINDOW :{BLACK}Stækka/smækka gluggastærð
@@ -2168,6 +2341,8 @@
STR_LIVERY_PASSENGER_WAGON_STEAM :Farþegavagn (Gufu)
STR_LIVERY_PASSENGER_WAGON_DIESEL :Farþegavagn (Dísel)
STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Farþegavagn (Rafmagns)
+STR_LIVERY_PASSENGER_WAGON_MONORAIL :Farþegavagn (einteinungslest)
+STR_LIVERY_PASSENGER_WAGON_MAGLEV :Farþegavagn (segulsviflest)
STR_LIVERY_FREIGHT_WAGON :Flutningsvagnar
STR_LIVERY_BUS :Strætó
STR_LIVERY_TRUCK :Flutningabílar
@@ -2176,6 +2351,8 @@
STR_LIVERY_HELICOPTER :Þyrlur
STR_LIVERY_SMALL_PLANE :Flugvélar
STR_LIVERY_LARGE_PLANE :Þotur
+STR_LIVERY_PASSENGER_TRAM :Farþegasporvagn
+STR_LIVERY_FREIGHT_TRAM :Farmsporvagn
STR_LIVERY_GENERAL_TIP :{BLACK}Grunnlitur fyrirtækis
STR_LIVERY_TRAIN_TIP :{BLACK}Litaskema lesta
@@ -2476,6 +2653,13 @@
STR_880F_GO_NON_STOP_TO_TRAIN_DEPOT :Fer viðstöðulaust til {TOWN} Lestar Byggingar
STR_SERVICE_NON_STOP_AT_TRAIN_DEPOT :Viðgerð viðstöðulaust í {TOWN} Lestar Byggingu
+STR_TIMETABLE_GO_TO :{STRING} {STRING}
+STR_TIMETABLE_TRAVEL_NOT_TIMETABLED :Ferðalag (ekki sett í áætlun)
+STR_TIMETABLE_TRAVEL_FOR :Ferðast í {STRING}
+STR_TIMETABLE_STAY_FOR :og bíða í {STRING}
+STR_TIMETABLE_DAYS :{COMMA} dag{P "" a}
+STR_TIMETABLE_TICKS :{COMMA} sl{P ag ög}
+
STR_HEADING_FOR_TRAIN_DEPOT :{ORANGE}Á leið í {TOWN} Lestar Byggingu
STR_HEADING_FOR_TRAIN_DEPOT_VEL :{ORANGE}Á leið í {TOWN} Lestar Byggingu, {VELOCITY}
STR_HEADING_FOR_TRAIN_DEPOT_SERVICE :{LTBLUE}Viðhald í {TOWN} lestaskýli
@@ -2517,6 +2701,8 @@
STR_REFIT :{BLACK}Breyta
STR_REFIT_TIP :{BLACK}Veldu farm til að breyta í. CTRL smelltu til að fjarlægja breytiskipun
STR_REFIT_ORDER :(Breyta í {STRING})
+STR_TIMETABLE_VIEW :{BLACK}Áætlun
+STR_TIMETABLE_VIEW_TOOLTIP :{BLACK}Skipta yfir í áætlanasýn
STR_8829_ORDERS :{WHITE}{VEHICLE} (Skipanir)
STR_882A_END_OF_ORDERS :{SETX 10}- - Endi skipana - -
STR_FULLLOAD_OR_SERVICE :{SKIP}{SKIP}{STRING}
@@ -2533,6 +2719,9 @@
STR_8833_CAN_T_INSERT_NEW_ORDER :{WHITE}Get ekki bætt við nýrri skipun...
STR_8834_CAN_T_DELETE_THIS_ORDER :{WHITE}Get ekki eytt þessari skipun...
STR_8835_CAN_T_MODIFY_THIS_ORDER :{WHITE}Get ekki breytt þessari skipun...
+STR_CAN_T_MOVE_THIS_ORDER :{WHITE}Get ekki fært þessa skipun...
+STR_CAN_T_SKIP_ORDER :{WHITE}Get ekki sleppt núverandi skipun...
+STR_CAN_T_SKIP_TO_ORDER :{WHITE}Get ekki hoppað í valda skipun...
STR_8837_CAN_T_MOVE_VEHICLE :{WHITE}Get ekki fært farartæki...
STR_REAR_ENGINE_FOLLOW_FRONT_ERROR :{WHITE}Aftari dráttarvagn fylgir alltaf fremri hluta
STR_8838_N_A :N/A{SKIP}
@@ -2564,11 +2753,16 @@
STR_8851_SHOW_CAPACITIES_OF_EACH :{BLACK}Sýna burðargetu hvers farartækis
STR_SHOW_TOTAL_CARGO :{BLACK}Sýna heildar burðargetu lestar, raðar eftir tegund farms
STR_8852_ORDERS_LIST_CLICK_ON_ORDER :{BLACK}Áætlun - smelltu til að velja stöð. CTRL + músartakki færir sjónarhorn að stöðinni
+STR_8853_SKIP_THE_CURRENT_ORDER :{BLACK}Sleppa núverandi skipun og fara í þá næstu. CTRL + smella sleppir valdri skipun
STR_8854_DELETE_THE_HIGHLIGHTED :{BLACK}Eyða valdri skipun
STR_8855_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Gera valda skipun viðstöðulausa
STR_8856_INSERT_A_NEW_ORDER_BEFORE :{BLACK}Skeyta inn nýrri skipun á undan valdri skipun, eða bæta við á enda listans
STR_8857_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Neyða lest til að bíða eftir fullum farmi í valdri skipun
STR_8858_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Neyða lest til að afferma sig í valdri skipun
+STR_TIMETABLE_TOOLTIP :{BLACK}Áætlun - smelltu á skipun til að velja hana.
+STR_TIMETABLE_WAIT_TIME_TOOLTIP :{BLACK}Breyta tímanum sem valin skipun ætti að taka
+STR_TIMETABLE_CLEAR_TIME_TOOLTIP :{BLACK}Hreinsa tímann fyrir valda skipun
+STR_TIMETABLE_RESET_LATENESS_TOOLTIP :{BLACK}Endurstilla seinkunarteljara, svo farartækið verði á réttum tíma
STR_SERVICE_HINT :{BLACK}Sleppa þessarri skipun nema þörf sé á viðgerð
STR_VEHICLE_INFO_COST_WEIGHT_SPEED_POWER :{BLACK}Verð: {CURRENCY} Þyngd: {WEIGHT_S}{}Hraði: {VELOCITY} Afl: {POWER}{}Rekstrarkostnaður: {CURRENCY} á ári{}Burðargeta: {CARGO}
STR_885C_BROKEN_DOWN :{RED}Bilaður
@@ -2590,6 +2784,8 @@
STR_886B_CAN_T_RENAME_TRAIN_VEHICLE :{WHITE}Get ekki endurskírt lestargerð...
STR_MAKE_THE_HIGHLIGHTED_ORDER :{BLACK}Lætur lestina losa farminn á valinni skipun
STR_TRANSFER :{BLACK}Yfirfæra
+STR_CLEAR_TIME :{BLACK}Hreinsa tíma
+STR_RESET_LATENESS :{BLACK}Endurstilla seinkunnarteljara
STR_TRAIN_STOPPING :{RED}Stöðva
STR_TRAIN_STOPPING_VEL :{RED}Stöðva, {VELOCITY}
@@ -2597,6 +2793,25 @@
STR_TRAIN_NO_POWER :{RED}Ekkert afl
STR_TRAIN_START_NO_CATENARY :Á þetta lestarspor vantar rafmagnsvíra, lestin kemst ekki af stað
+STR_NEW_VEHICLE_NOW_AVAILABLE :{BLACK}{BIGFONT}Ný {STRING} er nú fáanleg!
+STR_NEW_VEHICLE_TYPE :{BLACK}{BIGFONT}{ENGINE}
+STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}Ný {STRING} er nú fáanleg! - {ENGINE}
+
+STR_CAN_T_SELL_DESTROYED_VEHICLE :{WHITE}Get ekki selt ónýtt farartæki...
+STR_CAN_T_REFIT_DESTROYED_VEHICLE :{WHITE}Get ekki breytt ónýtu farartæki...
+
+STR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Get ekki stillt áætlun farartækis...
+STR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Farartæki getur aðeins beðið við stöð.
+STR_TIMETABLE_NOT_STOPPING_HERE :{WHITE}Þetta farartæki mun ekki stoppa við þessa stöð.
+STR_TIMETABLE_CHANGE_TIME :{BLACK}Breyta tíma
+STR_TIMETABLE_STATUS_ON_TIME :Þetta farartæki er nú þegar á réttum tíma
+STR_TIMETABLE_STATUS_LATE :Þetta farartæki er {STRING} of seint
+STR_TIMETABLE_STATUS_EARLY :Þetta farartæki er {STRING} of fljótt
+STR_TIMETABLE_TOTAL_TIME :Það mun taka {STRING} að ljúka við þessa áætlun
+STR_TIMETABLE_TOTAL_TIME_INCOMPLETE :Það mun að minnsta kosti taka {STRING} að ljúka við þessa áætlun (ekki allar skipanir á áætlun)
+STR_TIMETABLE_AUTOFILL :{BLACK}Skrifa sjálfvirkt
+STR_TIMETABLE_AUTOFILL_TOOLTIP :{BLACK}Skrifa áætlunina sjálfvirkt með gildum úr fyrstu ferð
+
##id 0x9000
STR_9000_ROAD_VEHICLE_IN_THE_WAY :{WHITE}Bíll fyrir
STR_9001_ROAD_VEHICLES :{WHITE}{COMPANY} - {COMMA} Bílar
@@ -2638,12 +2853,16 @@
STR_9026_ROAD_VEHICLE_SELECTION :{BLACK}Bifreiðalisti - ýttu á bifreið fyrir nánari upplýsingar
STR_9027_BUILD_THE_HIGHLIGHTED_ROAD :{BLACK}Smíða valda bifreið
STR_902A_COST_SPEED_RUNNING_COST :{BLACK}Verð: {CURRENCY}{}Hraði: {VELOCITY}{}Rekstrarkostnaður: {CURRENCY} á ári{}Burðargeta: {CARGO}
+STR_ARTICULATED_RV_CAPACITY :{BLACK}Rými: {LTBLUE}
+STR_BARE_CARGO :{CARGO}
STR_902C_NAME_ROAD_VEHICLE :{WHITE}Nefna bifreið
STR_902D_CAN_T_NAME_ROAD_VEHICLE :{WHITE}Get ekki nefnt bifreið...
STR_902E_NAME_ROAD_VEHICLE :{BLACK}Nefna bifreið
STR_902F_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti strætisvagn kemur við á {STATION}!
STR_9030_CITIZENS_CELEBRATE_FIRST :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti vörubíll kemur við á {STATION}!
+STR_CITIZENS_CELEBRATE_FIRST_PASSENGER_TRAM :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti farþegasporvagn kemur við á {STATION}!
+STR_CITIZENS_CELEBRATE_FIRST_CARGO_TRAM :{BLACK}{BIGFONT}Bæjarbúar fagna . . .{}Fyrsti farmsporvagn kemur við á {STATION}!
STR_9031_ROAD_VEHICLE_CRASH_DRIVER :{BLACK}{BIGFONT}Bílslys!{}Bílstjóri deyr í sprengingu eftir árekstur við lest
STR_9032_ROAD_VEHICLE_CRASH_DIE :{BLACK}{BIGFONT}Bílslys!{}{COMMA} deyja í sprengingu eftir árekstur við lest
STR_9033_CAN_T_MAKE_VEHICLE_TURN :{WHITE}Get ekki snúið bifreið við...
@@ -2804,6 +3023,8 @@
STR_GO_TO_AIRPORT_HANGAR :Fara í {STATION} flugskýli
SERVICE_AT_AIRPORT_HANGAR :Skoða í {STATION} flugskýli
+STR_TIMETABLE_TITLE :{WHITE}{VEHICLE} (Áætlun)
+
##id 0xB000
STR_B000_ZEPPELIN_DISASTER_AT :{BLACK}{BIGFONT}Loftskipaslys á {STATION}!
STR_B001_ROAD_VEHICLE_DESTROYED :{BLACK}{BIGFONT}Bifreið eyðilagðist í árekstri við FFH
@@ -2857,6 +3078,19 @@
STR_NEWGRF_MD5SUM :{BLACK}MD5 summa: {SILVER}{STRING}
STR_NEWGRF_CONFIRMATION_TEXT :{YELLOW}Þú ert í þann mund að eiga við leik í gangi, við það gæti OpenTTD hrunið.{}Ertu viss um að þú viljir halda áfram?
+STR_NEWGRF_ERROR_MSG_INFO :{SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_WARNING :{RED}Aðvörun: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_ERROR :{RED}Villa: {SILVER}{STRING}
+STR_NEWGRF_ERROR_MSG_FATAL :{RED}Banvænt: {SILVER}{STRING}
+STR_NEWGRF_ERROR_VERSION_NUMBER :{STRING} Mun ekki virka með útgáfu TTDPatch sem OpenTTD gefur til kynna.
+STR_NEWGRF_ERROR_DOS_OR_WINDOWS :{STRING} er fyrir {STRING} útgáfu af TTD.
+STR_NEWGRF_ERROR_UNSET_SWITCH :{STRING} er hannað til að notast með {STRING}
+STR_NEWGRF_ERROR_INVALID_PARAMETER :Ógild færibreyta {STRING}: færibreyta {STRING} ({NUM})
+STR_NEWGRF_ERROR_LOAD_BEFORE :{STRING} verður að hlaðast á undan {STRING}.
+STR_NEWGRF_ERROR_LOAD_AFTER :{STRING} verður að hlaðast eftir {STRING}.
+STR_NEWGRF_ERROR_OTTD_VERSION_NUMBER :{STRING} þarf OpenTTD útgáfu {STRING} eða nýrri.
+STR_NEWGRF_ERROR_AFTER_TRANSLATED_FILE :GRF skránni sem það var hannað til að þýða
+STR_NEWGRF_ERROR_TOO_MANY_NEWGRFS_LOADED :Of mörg NewGRF eru hlaðin.
STR_NEWGRF_ADD :{BLACK}Bæta við
STR_NEWGRF_ADD_TIP :{BLACK}Bæta NewGRF skrá við listann
@@ -2885,6 +3119,8 @@
STR_NEWGRF_COMPATIBLE_LOAD_WARNING :{WHITE}Samsvarandi GRF hlaðið í staðin týndrar skrár
STR_NEWGRF_DISABLED_WARNING :{WHITE}Týndar GRF skrár hafa verið gerðar óvirkar
STR_NEWGRF_NOT_FOUND_WARNING :{WHITE}Vantar GRF skrár til að hægt sé að hlaða leik
+STR_NEWGRF_UNPAUSE_WARNING_TITLE :{YELLOW}Vantar GRF skrá(r)
+STR_NEWGRF_UNPAUSE_WARNING :{WHITE}OpenTTD getur hrunið ef leikur er settur af stað. Ekki skrá villufærslur fyrir eftirfarandi hrun.{}Ertu viss um að þú viljir setja leikinn af stað?
STR_CURRENCY_WINDOW :{WHITE}Sérvalinn gjaldeyrir
STR_CURRENCY_EXCHANGE_RATE :{LTBLUE}Gengi: {ORANGE}{CURRENCY} = £ {COMMA}
@@ -2917,6 +3153,7 @@
### depot strings
STR_DEPOT_SELL_CONFIRMATION_TEXT :{YELLOW}Þú ert í þann mund að selja öll farartækin. Viltu halda áfram?
+STR_DEPOT_WRONG_DEPOT_TYPE :Röng tegund skýlis
STR_DEPOT_SELL_ALL_BUTTON_TRAIN_TIP :{BLACK}Selja allar lestir í skýli
STR_DEPOT_SELL_ALL_BUTTON_ROADVEH_TIP :{BLACK}Selja allar bifreiðar í skýli
@@ -2954,6 +3191,10 @@
STR_REPLACE_REMOVE_WAGON_HELP :{BLACK}Heldur lengd lestar með því að fjarlægja vagna (framan frá) ef útskipting dráttarvagna myndi lengja hana.
STR_REPLACE_ENGINE_WAGON_SELECT :{BLACK}Skipti út: {ORANGE}{SKIP}{SKIP}{STRING}
STR_REPLACE_ENGINE_WAGON_SELECT_HELP :{BLACK} TILRAUNAEIGINLEIKI {}Skipta á milli útskiptiglugga dráttar- og flutningavagna.{}Útskipting vagna fer aðeins fram ef hægt er að breyta nýju vögnunum til að flytja sama farm og þeir gömlu. Það er kannað fyrir hvern vagn þegar útskipting á honum fer fram.
+STR_RAIL_VEHICLE_NOT_AVAILABLE :{WHITE}Lestarvagn er ekki fáanlegur
+STR_ROAD_VEHICLE_NOT_AVAILABLE :{WHITE}Bifreið er ekki fáanleg
+STR_SHIP_NOT_AVAILABLE :{WHITE}Skip er ekki fáanlegt
+STR_AIRCRAFT_NOT_AVAILABLE :{WHITE}Flugvél er ekki fáanleg
STR_ENGINES :Dráttarvagnar
STR_WAGONS :Vagnar
@@ -3004,6 +3245,12 @@
STR_PURCHASE_INFO_ALL_BUT :Allt nema {GOLD}
STR_PURCHASE_INFO_MAX_TE :{BLACK}Hámarks : {GOLD}{FORCE}
+########### For showing numbers in widgets
+
+STR_NUM_1 :{BLACK}{SKIP}{NUM}
+STR_NUM_2 :{BLACK}{SKIP}{SKIP}{NUM}
+STR_NUM_3 :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}
+
########### String for New Landscape Generator
STR_GENERATE :{WHITE}Mynda land
@@ -3029,6 +3276,8 @@
STR_START_DATE_QUERY_CAPT :{WHITE}Breyta upphafsári
STR_HEIGHTMAP_SCALE_WARNING_CAPTION :{WHITE}Stærð hæðarlínukorts
STR_HEIGHTMAP_SCALE_WARNING_MESSAGE :{YELLOW}Ekki er mælt með því að breyta stærð grunnkorts of mikið. Viltu halda áfram?
+STR_TOWN_LAYOUT_WARNING_CAPTION :{WHITE}Vegaskipulagsaðvörun
+STR_TOWN_LAYOUT_WARNING_MESSAGE :{YELLOW}Vegaskipulagið „ekki fleiri vegi“ er óráðlegt. Halda myndun áfram?
STR_HEIGHTMAP_NAME :{BLACK}Nafn hæðarlínukorts:
STR_HEIGHTMAP_SIZE :{BLACK}Stærð: {ORANGE}{NUM} x {NUM}
STR_GENERATION_WORLD :{WHITE}Skapa heim...
@@ -3056,6 +3305,7 @@
STR_FLAT_WORLD_HEIGHT :{BLACK}Hæð slétts lands yfir sjávarmáli
STR_SMALLMAP_CENTER :{BLACK}Miðja heimskort á núverandi staðsetningu
+STR_SMALLMAP_INDUSTRY :{TINYFONT}{STRING} ({NUM})
########### String for new airports
STR_SMALL_AIRPORT :{BLACK}Lítill flugvöllur
@@ -3081,5 +3331,149 @@
STR_MEASURE_AREA_HEIGHTDIFF :{BLACK}Svæði: {NUM} x {NUM}{}Hæðarmunur: {NUM} m
############ Date formatting
+STR_DATE_TINY :{STRING}-{STRING}-{NUM}
+STR_DATE_SHORT :{STRING} {NUM}
+STR_DATE_LONG :{STRING} {STRING} {NUM}
########
+
+STR_DRIVE_THROUGH_ERROR_ON_TOWN_ROAD :{WHITE}...vegurinn er í eigu bæjar
+STR_DRIVE_THROUGH_ERROR_DIRECTION :{WHITE}...vegurinn snýr í ranga átt
+
+STR_TRANSPARENCY_TOOLB :{WHITE}Stilling gegnsæjis
+STR_TRANSPARENT_SIGNS_DESC :{BLACK}Virkja/afvirkja gegnsæji stöðvaskiltia. CTRL+smella til að læsa.
+STR_TRANSPARENT_TREES_DESC :{BLACK}Virkja/afvirkja gegnsæji trjáa. CTRL+smella til að læsa.
+STR_TRANSPARENT_HOUSES_DESC :{BLACK}Virkja/afvirkja gegnsæji húsa. CTRL+smella til að læsa.
+STR_TRANSPARENT_INDUSTRIES_DESC :{BLACK}Virkja/afvirkja gegnsæji iðnaða. CTRL+smella til að læsa.
+STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Virkja/afvirkja gegnsæji bygginga á borð við stöðvar, skýli og veghlið. CTRL+smella til að læsa.
+STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Virkja/afvirkja gegnsæji brúa. CTRL+smella til að læsa.
+STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Virkja/afvirkja gegnsæji bygginga á borð við vita og möstur. CTRL+smella til að læsa.
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Virkja/afvirkja gegnsæji raflína. CTRL+smella til að læsa.
+STR_TRANSPARENT_LOADING_DESC :{BLACK}Virkja/afvirkja gegnsæji hleðslumæla. CTRL+smella til að læsa.
+
+STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
+STR_PERCENT_UP :{WHITE}{NUM}%{UPARROW}
+STR_PERCENT_DOWN_SMALL :{TINYFONT}{WHITE}{NUM}%{DOWNARROW}
+STR_PERCENT_DOWN :{WHITE}{NUM}%{DOWNARROW}
+STR_PERCENT_UP_DOWN_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+STR_PERCENT_UP_DOWN :{WHITE}{NUM}%{UPARROW}{DOWNARROW}
+
+##### Mass Order
+STR_GROUP_NAME_FORMAT :Hópur {COMMA}
+STR_GROUP_TINY_NAME :{TINYFONT}{GROUP}
+STR_GROUP_ALL_TRAINS :Allar lestir
+STR_GROUP_ALL_ROADS :Allar bifreiðir
+STR_GROUP_ALL_SHIPS :Öll skip
+STR_GROUP_ALL_AIRCRAFTS :Allar flugvélar
+STR_GROUP_DEFAULT_TRAINS :Hóplausar lestir
+STR_GROUP_DEFAULT_ROADS :Hóplausar bifreiðir
+STR_GROUP_DEFAULT_SHIPS :Hóplaus skip
+STR_GROUP_DEFAULT_AIRCRAFTS :Hóplausar flugvélar
+STR_GROUP_TINY_NUM :{TINYFONT}{COMMA}
+STR_GROUP_ADD_SHARED_VEHICLE :Bæta við deildu farartæki
+STR_GROUP_REMOVE_ALL_VEHICLES :Fjarlægja öll farartæki
+
+STR_GROUP_TRAINS_CAPTION :{WHITE}{GROUP} - {COMMA} Lest{P "" ir}
+STR_GROUP_ROADVEH_CAPTION :{WHITE}{GROUP} - {COMMA} Bifreið{P "" ar}
+STR_GROUP_SHIPS_CAPTION :{WHITE}{GROUP} - {COMMA} Skip
+STR_GROUP_AIRCRAFTS_CAPTION :{WHITE}{GROUP} - {COMMA} Flugvél{P "" ar}
+STR_GROUP_RENAME_CAPTION :{BLACK}Endurnefna hóp
+STR_GROUP_REPLACE_CAPTION :{WHITE}Skipta út farartækjum í „{GROUP}“
+
+STR_GROUP_CAN_T_CREATE :{WHITE}Get ekki búið til hóp...
+STR_GROUP_CAN_T_DELETE :{WHITE}Get ekki eytt þessum hópi...
+STR_GROUP_CAN_T_RENAME :{WHITE}Get ekki endurnefnt hóp...
+STR_GROUP_CAN_T_REMOVE_ALL_VEHICLES :{WHITE}Get ekki fjarlægt öll farartæki úr þessum hóp...
+STR_GROUP_CAN_T_ADD_VEHICLE :{WHITE}Get ekki bætt farartækinu við þennan hóp...
+STR_GROUP_CAN_T_ADD_SHARED_VEHICLE :{WHITE}Get ekki bætt við deildu farartæki við hóp...
+
+STR_GROUPS_CLICK_ON_GROUP_FOR_TIP :{BLACK}Hópar - Smelltu á hóp til að skrifa öll farartæki í þessum hóp
+STR_GROUP_CREATE_TIP :{BLACK}Smelltu til að búa til hóp
+STR_GROUP_DELETE_TIP :{BLACK}Eyða völdum hóp
+STR_GROUP_RENAME_TIP :{BLACK}Endurnefna valdan hóp
+STR_GROUP_REPLACE_PROTECTION_TIP :{BLACK}Smelltu til að halda þessum hóp frá sjálfvirkri uppfærslu
+
+STR_COMPANY_NAME :{COMPANY}
+STR_ENGINE_NAME :{ENGINE}
+STR_GROUP_NAME :{GROUP}
+STR_PLAYER_NAME :{PLAYERNAME}
+STR_SIGN_NAME :{SIGN}
+STR_VEHICLE_NAME :{VEHICLE}
+
+STR_NAME_MUST_BE_UNIQUE :{WHITE}Nafnið verður að vera sérstætt
+
+#### Improved sign GUI
+STR_NEXT_SIGN_TOOLTIP :{BLACK}Fara að næsta skilti
+STR_PREVIOUS_SIGN_TOOLTIP :{BLACK}Fara að fyrra skilti
+
+########
+
+STR_FUND_NEW_INDUSTRY :{BLACK}Fjármagna
+STR_PROSPECT_NEW_INDUSTRY :{BLACK}Horfur
+STR_BUILD_NEW_INDUSTRY :{BLACK}Reisa
+STR_INDUSTRY_SELECTION_HINT :{BLACK}Veldu viðeigandi iðnað úr listanum
+
+############ Face formatting
+STR_FACE_ADVANCED :{BLACK}Ítarlegt
+STR_FACE_ADVANCED_TIP :{BLACK}Ítarleg breyting andlits
+STR_FACE_SIMPLE :{BLACK}Einfalt
+STR_FACE_SIMPLE_TIP :{BLACK}Einföld breyting andlits
+STR_FACE_LOAD :{BLACK}Hlaða
+STR_FACE_LOAD_TIP :{BLACK}Hlaða uppáhalds andliti
+STR_FACE_LOAD_DONE :{WHITE}Uppáhalds andlitinu þínu hefur verið hlaðið úr stilliskrá OpenTTD.
+STR_FACE_FACECODE :{BLACK}Andlit nr.
+STR_FACE_FACECODE_TIP :{BLACK}Skoða og/eða stilla andlitsnúmer
+STR_FACE_FACECODE_CAPTION :{WHITE}Skoða og/eða stilla andlitsnúmer
+STR_FACE_FACECODE_SET :{WHITE}Nýtt andlitsnúmer hefur verið stillt.
+STR_FACE_FACECODE_ERR :{WHITE}Gat ekki stillt andlitsnúmer - verður að vera tala á bilinu 0 og upp í 4.294.967.295!
+STR_FACE_SAVE :{BLACK}Vista
+STR_FACE_SAVE_TIP :{BLACK}Vista uppáhalds andlit
+STR_FACE_SAVE_DONE :{WHITE}Þetta andlit verður vistað sem þitt uppáhalds í stilliskrá OpenTTD.
+STR_FACE_EUROPEAN :{BLACK}Evrópskt
+STR_FACE_SELECT_EUROPEAN :{BLACK}Velur evrópskt útlit
+STR_FACE_AFRICAN :{BLACK}Afrískt
+STR_FACE_SELECT_AFRICAN :{BLACK}Velur afrískt útlit
+STR_FACE_YES :Já
+STR_FACE_NO :Nei
+STR_FACE_MOUSTACHE_EARRING_TIP :{BLACK}Virkja yfirvaraskegg eða eyrnalokk
+STR_FACE_HAIR :Hár:
+STR_FACE_HAIR_TIP :{BLACK}Breyta hári
+STR_FACE_EYEBROWS :Augabrúnir:
+STR_FACE_EYEBROWS_TIP :{BLACK}Breyta augabrúnum
+STR_FACE_EYECOLOUR :Augnlitur:
+STR_FACE_EYECOLOUR_TIP :{BLACK}Breyta augnlit
+STR_FACE_GLASSES :Gleraugu:
+STR_FACE_GLASSES_TIP :{BLACK}Velja/afvelja gleraugu
+STR_FACE_GLASSES_TIP_2 :{BLACK}Breyta gleraugum
+STR_FACE_NOSE :Nef:
+STR_FACE_NOSE_TIP :{BLACK}Breyta nefi
+STR_FACE_LIPS :Varir:
+STR_FACE_MOUSTACHE :Yfirvaraskegg:
+STR_FACE_LIPS_MOUSTACHE_TIP :{BLACK}Breyta vörum eða yfirvaraskeggi
+STR_FACE_CHIN :Vangar:
+STR_FACE_CHIN_TIP :{BLACK}Breyta vöngum
+STR_FACE_JACKET :Jakki:
+STR_FACE_JACKET_TIP :{BLACK}Breyta jakka
+STR_FACE_COLLAR :Kragi:
+STR_FACE_COLLAR_TIP :{BLACK}Breyta kraga
+STR_FACE_TIE :Bindi:
+STR_FACE_EARRING :Eyrnalokkur:
+STR_FACE_TIE_EARRING_TIP :{BLACK}Breyta bindi eða eyrnalokk
+########
+
+############ signal GUI
+STR_SIGNAL_SELECTION :{WHITE}Lestaljós
+STR_SIGNAL_CAN_T_CONVERT_SIGNALS_HERE :{WHITE}Get ekki breytt ljósum hér...
+STR_BUILD_SIGNAL_SEMAPHORE_NORM_TIP :{BLACK}Hefðbundin merki{}Merki eru nauðsynleg til að koma í veg fyrir að lestir lendi í árekstri.
+STR_BUILD_SIGNAL_SEMAPHORE_ENTRY_TIP :{BLACK}Komumerki{}Hleypir í gegn uns ekkert frámerki er eftir opið.
+STR_BUILD_SIGNAL_SEMAPHORE_EXIT_TIP :{BLACK}Frámerki{}Virkar eins og hefðbundið merki en er nauðsynlegt til að fá rétta virkni fyrir komu- og fjölmerki.
+STR_BUILD_SIGNAL_SEMAPHORE_COMBO_TIP :{BLACK}Fjölmerki{}Fjölmerkin virka bæði sem komu- og frámerki sem gerir þér kleyft að hanna stór „tré“ af formerkjum.
+STR_BUILD_SIGNAL_ELECTRIC_NORM_TIP :{BLACK}Hefðbundin ljós{}Ljós eru nauðsynleg til að koma í veg fyrir að lestir lendi í árekstri.
+STR_BUILD_SIGNAL_ELECTRIC_ENTRY_TIP :{BLACK}Komuljós{}Hleypir í gegn uns ekkert fráljós er lengur grænt.
+STR_BUILD_SIGNAL_ELECTRIC_EXIT_TIP :{BLACK}Fráljós{}Virkar eins og hefðbundið ljós en er naðusynlegt til að fá rétta virkni fyrir komu- og fjölljós.
+STR_BUILD_SIGNAL_ELECTRIC_COMBO_TIP :{BLACK}Fjölljós{}Fjölljósið virkar bæði sem komu- og fráljós sem gerir þér kleyft að hanna stór „tré“ af forljósum.
+STR_SIGNAL_CONVERT_TIP :{BLACK}Breyting ljósa{}Þegar valið þá breytist merki sem til er fyrir í valda gerð og tegund. CTRL-smellur mun rúlla í gegnum núverandi tegund.
+STR_DRAG_SIGNALS_DENSITY_TIP :{BLACK}Þéttleiki dreginna ljósa
+STR_DRAG_SIGNALS_DENSITY_DECREASE_TIP :{BLACK}Minnka þéttleika dreginna ljósa
+STR_DRAG_SIGNALS_DENSITY_INCREASE_TIP :{BLACK}Auka þéttleika dreginna ljósa
+########
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/italian.txt
--- a/src/lang/italian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/italian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1052,6 +1052,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Consenti l'invio di denaro ad altre compagnie: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Stazioni non uniformi: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Moltiplicatore di peso per simulare treni merci pesanti: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Fattore di velocità degli aeromobili: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Consenti fermate passanti sulle strade delle città: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Consenti la costruzione di stazioni adiacenti: {ORANGE}{STRING}
@@ -1452,6 +1453,13 @@
STR_NETWORK_LANG_SWEDISH :Svedese
STR_NETWORK_LANG_TURKISH :Turco
STR_NETWORK_LANG_UKRAINIAN :Ucraino
+STR_NETWORK_LANG_AFRIKAANS :Afrikaans
+STR_NETWORK_LANG_CROATIAN :Croato
+STR_NETWORK_LANG_CATALAN :Catalano
+STR_NETWORK_LANG_ESTONIAN :Èstone
+STR_NETWORK_LANG_GALICIAN :Galiziano
+STR_NETWORK_LANG_GREEK :Greco
+STR_NETWORK_LANG_LATVIAN :Lèttone
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Stanza principale partita multigiocatore
@@ -1613,6 +1621,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo di binari non adatti
STR_1007_ALREADY_BUILT :{WHITE}...già costruito
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Bisogna demolire i binari prima
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}La strada è bloccata o a senso unico
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Costruzione ferrovie
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Costruzione ferrovie elettrificate
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Costruzione monorotaia
@@ -1715,6 +1724,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}L'edificio deve essere demolito prima
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Metropoli)
STR_2006_POPULATION :{BLACK}Popolazione: {ORANGE}{COMMA}{BLACK} Case: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Rinomina città
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Impossibile rinominare la città...
@@ -1994,20 +2004,20 @@
STR_4826_SUGAR_MINE :{G=f}Miniera di zucchero
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Richiede: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Richiede: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Richiede: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Richiede: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Richiede: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Richiede: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Carico in attesa di lavorazione:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produzione il mese scorso:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% trasportato)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% trasportato)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centra la visuale principale sulla posizione dell'industria
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nuov{G o a} {STRING} in costruzione vicino a {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nuov{G o a} {STRING} piantat{G o a} vicino a {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/japanese.txt
--- a/src/lang/japanese.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/japanese.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1992,20 +1992,20 @@
STR_4826_SUGAR_MINE :砂糖鉱山
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}必要な原料:{YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}必要な原料:{YELLOW}{STRING}と{STRING}
-STR_4829_REQUIRES :{BLACK}必要な原料:{YELLOW}{STRING}、{STRING}、{STRING}
+STR_4827_REQUIRES :{BLACK}必要な原料:{YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}必要な原料:{YELLOW}{STRING}{STRING}と{STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}必要な原料:{YELLOW}{STRING}{STRING}、{STRING}{STRING}、{STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}処理待ちの貨物:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}産物:{YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}産物:{YELLOW}{STRING}、{STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}産物:{YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}産物:{YELLOW}{STRING}{STRING}、{STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}先月の生産量:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK}({COMMA}%運送済み)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK}({COMMA}%運送済み)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}主の画面を産業の場所に移動します
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}新しい{STRING}が{TOWN}町に工事中!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}新しい{STRING}が{TOWN}町に植林中!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/korean.txt
--- a/src/lang/korean.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/korean.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1051,6 +1051,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}다른 회사에게 돈을 송금하는 것을 허용: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}이미 지어진 역에 추가로 역을 증축하는 것을 허용 : {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}무거운 열차를 운행하기 위해 화물에 무게를 가함 : {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}비행기 속도 인수: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}마을이 소유중인 도로를 통과하는 버스 정류장 건설 허용: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}정거장 근처에 건물 짓기 허용: {ORANGE}{STRING}
@@ -1612,6 +1613,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}알맞지 않은 철로입니다.
STR_1007_ALREADY_BUILT :{WHITE}...이미 지어져있습니다
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}철로를 먼저 제거하십시오
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}도로가 일방통행이거나 막혔습니다
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}철도 건설
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}전기철도 건설
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}모노레일 건설
@@ -1714,6 +1716,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}건물을 먼저 제거하십시오!
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (도시)
STR_2006_POPULATION :{BLACK}인구: {ORANGE}{COMMA}{BLACK} 가구수: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :도시 이름 변경
STR_2008_CAN_T_RENAME_TOWN :{WHITE}도시 이름을 바꿀 수 없습니다...
@@ -1993,20 +1996,20 @@
STR_4826_SUGAR_MINE :설탕 광산
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}필요함: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}필요함: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}필요함: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}필요함: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}필요함: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}필요함: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}처리될 화물 대기:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}생산: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}생산: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}생산: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}생산: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}지난달 생산량:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% 수송됨)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% 수송됨)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}이 산업시설이 있는 곳으로 이동
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}새로운 {STRING}이/가 {TOWN} 근처에 지어지고 있습니다!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}새로운 {STRING}이/가 {TOWN} 근처에서 자라나고 있습니다!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/lithuanian.txt
--- a/src/lang/lithuanian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/lithuanian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1871,16 +1871,16 @@
STR_4826_SUGAR_MINE :cukraus kasykloje
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Reikalauja: {YELLOW}{STRING.ko}
-STR_4828_REQUIRES :{BLACK}Reikalauja: {YELLOW}{STRING.ko}, {STRING.ko}
-STR_4829_REQUIRES :{BLACK}Reikalauja: {YELLOW}{STRING.ko}, {STRING.ko}, {STRING.ko}
+STR_4827_REQUIRES :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}
+STR_4828_REQUIRES :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}, {STRING.ko}{STRING}
+STR_4829_REQUIRES :{BLACK}Reikalauja: {YELLOW}{STRING.ko}{STRING}, {STRING.ko}{STRING}, {STRING.ko}{STRING}
############ range for requires ends
############ range for produces starts
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Praėjusio mėnesio produkcija:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportuota)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportuota)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Rodyti gamykla ekrano centre
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Statomas naujas {STRING} netoli miesto: {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Sodinamas naujas {STRING} netoli miesto: {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/norwegian_bokmal.txt
--- a/src/lang/norwegian_bokmal.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/norwegian_bokmal.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1978,20 +1978,20 @@
STR_4826_SUGAR_MINE :Sukkergruve
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Trenger: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Trenger: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Trenger: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Trenger: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Trenger: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Trenger: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Gods som venter på behandling:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produserer: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produserer: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produserer: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produserer: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produksjon forrige måned:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}{NBSP}% transportert)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}{NBSP}% transportert)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Sentrer bildet på industriområdet
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Ny {STRING} under bygging i nærheten av {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Ny {STRING} plantes i nærheten av {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/norwegian_nynorsk.txt
--- a/src/lang/norwegian_nynorsk.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/norwegian_nynorsk.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1977,20 +1977,20 @@
STR_4826_SUGAR_MINE :Sukkergruve
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Treng: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Treng: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Treng: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Treng: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Treng: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Treng: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Gods ventar på å bli behandla:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Lagar: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Lagar: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Lagar: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Lagar: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produksjon førre månad:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA} % transportert)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA} % transportert)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Sentrer biletet på industriområdet
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Ny {STRING} byggjast i nærleiken av {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Ny {STRING} plantast i nærleiken av {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/piglatin.txt
--- a/src/lang/piglatin.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/piglatin.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1967,20 +1967,20 @@
STR_4826_SUGAR_MINE :Ugarsay Inemay
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Equiresray: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Equiresray: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Equiresray: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Equiresray: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Equiresray: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Equiresray: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Argocay aitingway otay ebay ocessedpray:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Oducespray: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Oducespray: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Oducespray: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Oducespray: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Oductionpray astlay onthmay:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% ansportedtray)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% ansportedtray)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Entrecay ethay ainmay iewvay onway industryway ocationlay
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Ewnay {STRING} underway onstructioncay earnay {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Ewnay {STRING} eingbay antedplay earnay {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/polish.txt
--- a/src/lang/polish.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/polish.txt Fri Mar 28 10:32:55 2008 +0000
@@ -2099,20 +2099,20 @@
STR_4826_SUGAR_MINE.d :{G=f}kopalni cukru
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Wymaga: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Ładunek oczekujący na przetworzenie:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Wyprodukowano w ostatnim miesiącu:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% przetransportowano)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% przetransportowano)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centruj główny widok na przedsiębiorstwie
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Rozpoczęto budowę nowe{G go j go} {STRING.d} blisko {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Now{G y a e} {STRING} został{G 0 "" a o} posadzon{G 0 y a e} blisko {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/portuguese.txt
--- a/src/lang/portuguese.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/portuguese.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1019,7 +1019,7 @@
STR_CONFIG_PATCHES_ON :Ligado
STR_CONFIG_PATCHES_VEHICLESPEED :{LTBLUE}Mostrar velocidade do veículo na barra de estado: {ORANGE}{STRING}
STR_CONFIG_PATCHES_BUILDONSLOPES :{LTBLUE}Permitir a construção em declives e encostas: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Permitir formação de terra em construções, linhas, etc. (auto-declive): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTOSLOPE :{LTBLUE}Permitir formação de terra em construções (auto-declive): {ORANGE}{STRING}
STR_CONFIG_PATCHES_CATCHMENT :{LTBLUE}Dimensionamento mais realista de áreas de abrangência: {ORANGE}{STRING}
STR_CONFIG_PATCHES_EXTRADYNAMITE :{LTBLUE}Permitir remoção de mais estradas, pontes, etc: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAMMOTHTRAINS :{LTBLUE}Permitir a construção de comboios muito longos: {ORANGE}{STRING}
@@ -1050,6 +1050,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Permitir enviar dinheiro para outras empresas: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estações não uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Multiplicador de peso para simular comboios pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Factor de velocidade de aviões: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permitir estações de passagem em estradas das cidades: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Permitir construção de estações adjacentes: {ORANGE}{STRING}
@@ -1093,7 +1094,7 @@
STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR :{LTBLUE}Ligar ferramentas de paisagem com as de construção: {ORANGE}{STRING}
STR_CONFIG_PATCHES_REVERSE_SCROLLING :{LTBLUE}Ao deslizar com o rato, mover a vista na direcção oposta: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMOOTH_SCROLLING :{LTBLUE}Suavizar deslocamento da navegação no mapa: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_MEASURE_TOOLTIP :{LTBLUE}Mostrar as medidas nas várias ferramentas de construção: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_MEASURE_TOOLTIP :{LTBLUE}Mostrar medidas nas várias ferramentas de construção: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LIVERIES :{LTBLUE}Mostrar estampagens da companhia: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LIVERIES_NONE :Nenhum
STR_CONFIG_PATCHES_LIVERIES_OWN :Própria companhia
@@ -1121,7 +1122,7 @@
STR_CONFIG_PATCHES_LOADING_INDICATORS_ALL :Todas as empresas
STR_CONFIG_PATCHES_TIMETABLE_ALLOW :{LTBLUE}Activar plano de horários para veículos: {ORANGE}{STRING}
STR_CONFIG_PATCHES_TIMETABLE_IN_TICKS :{LTBLUE}Mostrar horário em tics em vez dias: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar jogo): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE :{LTBLUE}Tipo padrão de ferrovia (ao criar ou carregar): {ORANGE}{STRING}
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_RAIL :Linha Normal
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_ELRAIL :Linha Electrificada
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MONORAIL :Monorail
@@ -1130,7 +1131,7 @@
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_LAST :Último disponível
STR_CONFIG_PATCHES_DEFAULT_RAIL_TYPE_MOST_USED :Mais utilizado
-STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE :{LTBLUE}Mostrar ferramentas de construção quando não existirem veículos adequeados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_ALWAYS_BUILD_INFRASTRUCTURE :{LTBLUE}Mostrar ferram. de construção se não houver veículos adequados: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_TRAINS :{LTBLUE}Máximo de comboios por jogador: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_ROADVEH :{LTBLUE}Máximo de veículos de estrada por jogador: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MAX_AIRCRAFT :{LTBLUE}Máximo de aeronaves por jogador: {ORANGE}{STRING}
@@ -1204,6 +1205,18 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Alterar valor
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Alguns ou todos os intervalo(s) de serviço predefinidos abaixo são incompatíveis com o valor escolhido! São válidos 5-90% e 30-800 dias
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Sistema de encontrar caminho para comboios: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Não recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Sistema de encontrar caminho para veículos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Original {RED}(Não recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Sistema de encontrar caminho para barcos: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Original {BLUE}(Recomendado)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(Não recomendado)
STR_TEMPERATE_LANDSCAPE :Terreno temperado
STR_SUB_ARCTIC_LANDSCAPE :terreno subárctico
@@ -1599,6 +1612,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tipo de linha não apropriado
STR_1007_ALREADY_BUILT :{WHITE}...já construído
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Deverá remover a linha férrea primeiro
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Estrada de sentido único ou bloqueada
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Construir caminhos-de-ferro
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Construir caminhos-de-ferro electrificados
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Construir monocarril
@@ -1980,20 +1994,20 @@
STR_4826_SUGAR_MINE :Mina de Açúcar
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Necessário: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Necessário: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Necessário: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Necessário: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Necessário: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Necessário: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Carga aguardando processamento:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produz: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produção no último mês:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centrar visualização na localização da indústria
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nova {STRING} em construção em {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nova {STRING} está a ser plantada em {TOWN}!
@@ -2867,7 +2881,7 @@
STR_SERVICE_AT_ROADVEH_DEPOT :Manutenção no depósito de {TOWN}
STR_REFIT_ROAD_VEHICLE_TO_CARRY :{BLACK}Reconverter veículo para transportar outro tipo de carga
-STR_REFIT_ROAD_VEHICLE :{BLACK}Reconverter veiculo
+STR_REFIT_ROAD_VEHICLE :{BLACK}Reconverter veículo
STR_REFIT_ROAD_VEHICLE_TO_CARRY_HIGHLIGHTED :{BLACK}Reconverter veículo para transportar o tipo de carga seleccionado
STR_REFIT_ROAD_VEHICLE_CAN_T :{WHITE}Não é possível reconverter veículo
STR_ROAD_SELECT_TYPE_OF_CARGO_FOR :{BLACK}Seleccione o tipo de carga para o veículo
@@ -3136,7 +3150,7 @@
STR_SCHEDULED_SHIPS :{WHITE}{STATION} - {COMMA} Barcos
STR_SCHEDULED_TRAINS_TIP :{BLACK}Mostrar todos os comboios que têm esta estação nas ordens de serviço
-STR_SCHEDULED_ROAD_VEHICLES_TIP :{BLACK}Mostrar todos os veiculos de estrada que têm esta estação nas ordens de serviço
+STR_SCHEDULED_ROAD_VEHICLES_TIP :{BLACK}Mostrar todos os veículos de estrada que têm esta estação nas ordens de serviço
STR_SCHEDULED_AIRCRAFT_TIP :{BLACK}Mostrar todos os aviões que têm esta estação nas ordens de serviço
STR_SCHEDULED_SHIPS_TIP :{BLACK}Mostrar todos os navios de cujo itinerário esta estação faz parte
@@ -3341,6 +3355,7 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Comutar transparência para edificações como estações, depósitos, pontos-de-passagem e catenárias
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Comutar transparência para pontes
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Comutar transparência para estruturas como faróis-terrestres e antenas (talvez, no futuro, para embelezamentos)
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Comutar transparência para catenária. CTRL+clique para fechar.
STR_TRANSPARENT_LOADING_DESC :{BLACK}Alterar transparência para indicadores de carga
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/romanian.txt
--- a/src/lang/romanian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/romanian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1977,20 +1977,20 @@
STR_4826_SUGAR_MINE :Mină de zahăr
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Are nevoie de: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Are nevoie de: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Are nevoie de: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Are nevoie de: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Incarcatura in asteaptarea procesarii:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Producţia lunii trecute:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportat)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportat)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centrează imaginea pe locaţia industriei
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Un nou obiectiv industrial ({STRING}) se construieşte lângă {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}O nouă {STRING} se plantează lângă {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/russian.txt
--- a/src/lang/russian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/russian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1052,6 +1052,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Разрешить передачу денег другим компаниям: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Станции могут быть произвольной формы: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Множитель увеличения веса груза для товарных поездов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Коэффициент скорости авиатранспорта: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Позволять строить остановки на городских дорогах: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Разрешить строительство смежных станций: {ORANGE}{STRING}
@@ -1206,6 +1207,19 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Изменить значение
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Некоторые интервалы не совместимы с выбранной установкой. Допускаются значения 5-90% или 30-800 дней
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Алгоритм поиска пути для поездов: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Не рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Алгоритм поиска пути для автотранспорта: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Оригин. {RED}(Не рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Алгоритм поиска путей для кораблей: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Оригин. {BLUE}(Рекоменд.)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(Не рекоменд.)
+
STR_TEMPERATE_LANDSCAPE :Умеренный ландшафт
STR_SUB_ARCTIC_LANDSCAPE :Субарктический ландшафт
STR_SUB_TROPICAL_LANDSCAPE :Субтропический ландшафт
@@ -1439,6 +1453,13 @@
STR_NETWORK_LANG_SWEDISH :Шведский
STR_NETWORK_LANG_TURKISH :Турецкий
STR_NETWORK_LANG_UKRAINIAN :Украинский
+STR_NETWORK_LANG_AFRIKAANS :Африканский
+STR_NETWORK_LANG_CROATIAN :Хорватский
+STR_NETWORK_LANG_CATALAN :Каталанский
+STR_NETWORK_LANG_ESTONIAN :Эстонский
+STR_NETWORK_LANG_GALICIAN :Галицийский
+STR_NETWORK_LANG_GREEK :Греческий
+STR_NETWORK_LANG_LATVIAN :Латвийский
############ End of leave-in-this-order
STR_NETWORK_GAME_LOBBY :{WHITE}Состояние сетевой игры
@@ -1600,6 +1621,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Нет подходящих рельсов
STR_1007_ALREADY_BUILT :{WHITE}...уже построено
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Сначала надо удалить рельсы
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дорога односторонняя или блокирована
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Железные дороги
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Электрифицированные ж/д
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Монорельс
@@ -1702,6 +1724,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Сначала надо уничтожить здания
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (Город)
STR_2006_POPULATION :{BLACK}Население: {ORANGE}{COMMA}{BLACK} Зданий: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Переименовать город
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Не могу переименовать город...
@@ -1981,20 +2004,20 @@
STR_4826_SUGAR_MINE :Сахарная шахта
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Требуется: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Требуется: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Требуется: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Требуется: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Требуется: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Требуется: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Груз, ожидающий переработки:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Произведено: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Произведено: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Произведено: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Произведено: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Произведено за прошлый месяц:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% перевезено)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% перевезено)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Показать предприятие в основном окне
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Новое предприятие! {STRING} строится возле г. {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Новое предприятие! {STRING} заложен возле г. {TOWN}!
@@ -3353,6 +3376,7 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Переключить прозрачность зданий, которые можно строить игроком. Например -- станции, депо, точки пути и столбы для электричества.
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Переключить прозрачность мостов
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Переключить прозрачность зданий, вроде антенн и маяков.
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Переключить прозрачность контактной сети. Ctrl-щелчок - запрет изменений.
STR_TRANSPARENT_LOADING_DESC :{BLACK}Переключить прозрачность для индикаторов загрузки
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/simplified_chinese.txt
--- a/src/lang/simplified_chinese.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/simplified_chinese.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1854,13 +1854,13 @@
STR_4826_SUGAR_MINE :蔗糖矿
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}需要:{YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}需要:{YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}需要:{YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}需要:{YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}需要:{YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}需要:{YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}上月产量:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% 已运输)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% 已运输)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}将屏幕中心移动到工厂所在的位置
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}新 {STRING} 正在 {TOWN} 加紧建设!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}新 {STRING} 即将落户 {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/slovak.txt
--- a/src/lang/slovak.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/slovak.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1114,6 +1114,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Umožnit posielanie penazí ostatným spolocnostiam: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Roznorode stanice: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Váhový násobok pre nákladné vlaky: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Faktor rýchlosti lietadiel: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Povolit prejazdné zastávky na mestských cestách: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Povolit stavbu oddelených staníc: {ORANGE}{STRING}
@@ -1675,6 +1676,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ziadne pouzitelne zeleznicne kolaje
STR_1007_ALREADY_BUILT :{WHITE}... uz bolo vytvorene
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Najskor treba odstranit zeleznicne kolaje
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Cesta je jednosmerná alebo blokovaná.
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Zeleznica
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Elektrifikovana železnica
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Jednokolajka - Monorail
@@ -2056,20 +2058,20 @@
STR_4826_SUGAR_MINE :Cukrova bana
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Náklad cakajúci na spracovanie:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produkuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produkcia za posledny mesiac:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% prepravenych)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% prepravenych)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Vycentrovanie pohladu na poziciu tovarne
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}{STRING} sa zacina stavat nedaleko mesta {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}{STRING} sa vysadza nedaleko mesta {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/slovenian.txt
--- a/src/lang/slovenian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/slovenian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1092,6 +1092,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Dovoli pošiljanje denarja drugim podjetjem: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Neenake postaje: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Koeficient teže tovora za simulacijo težkih vlakov: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Faktor hitrosti letal: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Dovoli prehodne postaje na cestah v lasti mest: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Dovoli gradnjo združljivih postaj: {ORANGE}{STRING}
@@ -1246,6 +1247,18 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Spremeni vrednost
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Nekatera ali vsa privzeta obdobja servisiranja spodaj niso združljiva z izborom! 5-90% in 30-800 dni je veljavno
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Iskalnik poti za vlake: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Ni priporočeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Priporočeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Iskalnik poti za vozila: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Original {RED}(Ni priporočeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Priporočeno)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Logaritem poti za ladje: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Original {BLUE}(Priporočen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(Ni priporočen)
STR_TEMPERATE_LANDSCAPE :Zmerno podnebje
STR_SUB_ARCTIC_LANDSCAPE :Sub arktično podnebje
@@ -1641,6 +1654,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Ni primernih tračnic
STR_1007_ALREADY_BUILT :{WHITE} ... že zgrajeno
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Najprej odstrani tračnice
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Cesta je enosmerna ali blokirana
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Gradnja železnice
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Elektrificirana Železnica
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Gradnja enotirne železnice
@@ -2060,20 +2074,20 @@
STR_4826_SUGAR_MINE.r :Rudnika sladkorja
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Potrebuje: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Tovor na čakanju obdelave:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Proizvaja: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Proizvaja: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Proizvaja: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Proizvaja: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Proizvodnja prejšnjega meseca:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% prepeljano)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% prepeljano)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Pogled na industrijo
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Na novo se gradi {STRING} blizu mesta {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Postavlja se {STRING} blizu mesta {TOWN}!
@@ -3421,6 +3435,7 @@
STR_TRANSPARENT_BUILDINGS_DESC :{BLACK}Prozoren ali navaden pogled ostalih objektov kot so postaje, garaže...
STR_TRANSPARENT_BRIDGES_DESC :{BLACK}Prozoren ali navaden pogled mostov
STR_TRANSPARENT_STRUCTURES_DESC :{BLACK}Prozoren ali navaden pogled struktur kot so antene, svetilniki...
+STR_TRANSPARENT_CATENARY_DESC :{BLACK}Preklop prosojnosti za pogone. CTRL+klik za zaklepanje.
STR_TRANSPARENT_LOADING_DESC :{BLACK}Preklop na prosojnost za prikaz polnenja
STR_PERCENT_UP_SMALL :{TINYFONT}{WHITE}{NUM}%{UPARROW}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/spanish.txt
--- a/src/lang/spanish.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/spanish.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1051,6 +1051,7 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Permitir enviar dinero a otras empresas: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Estaciones no uniformes: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Carga el multiplicador de peso para simular trenes pesados: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Factor velocidad avión: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Permite conducir en paradas sobre carreteras de ciudades: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Permitir construcción en estaciones contiguas : {ORANGE}{STRING}
@@ -1150,7 +1151,7 @@
STR_CONFIG_PATCHES_SERVINT_ROADVEH :{LTBLUE}Intervalo de despacho por defecto para veh. de carretera: {ORANGE}{STRING} días
STR_CONFIG_PATCHES_SERVINT_ROADVEH_DISABLED :{LTBLUE}Intervalo de despacho por defecto para veh. de carretera: {ORANGE}no
STR_CONFIG_PATCHES_SERVINT_AIRCRAFT :{LTBLUE}Intervalo de despacho por defecto para aeroplanos: {ORANGE}{STRING} días
-STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Intervalo de despacho por defecto para aviones: {ORANGE}no
+STR_CONFIG_PATCHES_SERVINT_AIRCRAFT_DISABLED :{LTBLUE}Intervalo de despacho por defecto para aeronaves: {ORANGE}no
STR_CONFIG_PATCHES_SERVINT_SHIPS :{LTBLUE}Intervalo de despacho por defecto para barcos: {ORANGE}{STRING} días
STR_CONFIG_PATCHES_SERVINT_SHIPS_DISABLED :{LTBLUE}Intervalo de despacho por defecto para barcos: {ORANGE}no
STR_CONFIG_PATCHES_NOSERVICE :{LTBLUE}Desactivar servicio cuando las averías están desactivadas: {ORANGE}{STRING}
@@ -1612,6 +1613,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Tramo de vía no apropiado
STR_1007_ALREADY_BUILT :{WHITE}...ya construído
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Se debe retirar primero tramo de vía
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Carretera de un solo sentido o bloqueada
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Construcción de ferrocarril
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Construcciòn Línea Eléctrica de Ferrocarril
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Construcción de monorraíl
@@ -1993,20 +1995,20 @@
STR_4826_SUGAR_MINE :Mina de Azúcar
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Requiere: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Requiere: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Requiere: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Requiere: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Requiere: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}La carga está esperando a ser procesada:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Produce: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Producción mes anterior:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportado)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportado)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centrar la vista sobre la industria
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Nuevo {STRING} bajo construcción cerca de {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Nuevo {STRING} está siendo plantado cerca de {TOWN}!
@@ -2964,7 +2966,7 @@
STR_CLONE_AIRCRAFT :{BLACK}Clonar aeronave
STR_CLONE_AIRCRAFT_INFO :{BLACK}Esto copiará la aeronave. Control-click compartirá las ordenes
STR_CLONE_AIRCRAFT_INFO_HANGAR_WINDOW :{BLACK}Esto construirá una copia de la aeronave. Pulsa este botón y después la aeronave dentro o fuera del hangar. Control-click compartirá las ordenes
-STR_A005_NEW_AIRCRAFT :{WHITE}Nuevo avilón
+STR_A005_NEW_AIRCRAFT :{WHITE}Nueva Aeronave
STR_A006_BUILD_AIRCRAFT :{BLACK}Construir aeronave
STR_A008_CAN_T_BUILD_AIRCRAFT :{WHITE}No se puede construir aeronave...
STR_A009_AIRCRAFT :{WHITE}{COMPANY} - {COMMA} Aeronave
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/swedish.txt
--- a/src/lang/swedish.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/swedish.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1980,20 +1980,20 @@
STR_4826_SUGAR_MINE :Sockergruva
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Kräver: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Kräver: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Kräver: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Kräver: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Kräver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Kräver: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Last som väntar på att bli behandlad:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Producerar: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Producerar: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Producerar: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Producerar: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produktion förra månaden:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transporterat)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transporterat)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Centrera vyn ovanför industrin
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Ny {STRING} under byggnation nära {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Ny {STRING} planteras nära {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/traditional_chinese.txt
--- a/src/lang/traditional_chinese.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/traditional_chinese.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1973,20 +1973,20 @@
STR_4826_SUGAR_MINE :糖礦
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}需要:{YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}需要:{YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}需要:{YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}需要:{YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}需要:{YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}需要:{YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}囤積的貨物:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}產出:{YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}產出:{YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}產出:{YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}產出:{YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}上月產量:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} (運送了 {COMMA}%)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} (運送了 {COMMA}%)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}將主視野帶到工業上方
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}新的 {STRING} 正在 {TOWN} 附近建造中!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}新的 {STRING} 正在 {TOWN} 附近種植中!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/turkish.txt
--- a/src/lang/turkish.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/turkish.txt Fri Mar 28 10:32:55 2008 +0000
@@ -724,6 +724,7 @@
STR_028E_PLACE_TRANSMITTER :{BLACK}Verici koy
STR_028F_DEFINE_DESERT_AREA :{BLACK}Çöl yap, kaldırmak için CTRL'ye basılı tut
STR_CREATE_LAKE :{BLACK}Su alanını belirle.{}Deniz seviyesinde CTRL tuşu basılı olmadığı sürece kanal yapar, basılıysa etraftakileri su altında bırakır
+STR_CREATE_RIVER :{BLACK}Irmak oluştur.
STR_0290_DELETE :{BLACK}Sil
STR_0291_DELETE_THIS_TOWN_COMPLETELY :{BLACK}Sehri tamamen sil
STR_0292_SAVE_SCENARIO :Kaydet
@@ -933,6 +934,7 @@
STR_OPTIONS_FULLSCREEN :{BLACK}Tam ekran
STR_OPTIONS_FULLSCREEN_TIP :{BLACK}Tam ekran oynamak için bunu isaretleyin
+STR_FULLSCREEN_FAILED :{WHITE}Tam ekran modu başarısız
STR_OPTIONS_RES :{BLACK}Ekran Çözünürlüğü
STR_OPTIONS_RES_CBO :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
@@ -1200,6 +1202,19 @@
STR_CONFIG_PATCHES_QUERY_CAPT :{WHITE}Ayar değerini değiştir
STR_CONFIG_PATCHES_SERVICE_INTERVAL_INCOMPATIBLE :{WHITE}Bazi servis gecikmeleri aralık dışında: %5-%90 veya 30-800 gün arasında olmalı
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS :{LTBLUE}Trenler için yol bulucu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NTP :NTP {RED}(Önerilmez)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_TRAINS_YAPF :YAPF {BLUE}(Önerilen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH :{LTBLUE}Arabalar için yol bulucu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_OPF :Öntanımlı {RED}(Önerilmez)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_ROADVEH_YAPF :YAPF {BLUE}(Önerilen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS :{LTBLUE}Gemiler için yol bulucu: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_OPF :Öntanımlı {BLUE}(Önerilen)
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_NPF :NPF
+STR_CONFIG_PATCHES_PATHFINDER_FOR_SHIPS_YAPF :YAPF {RED}(Önerilmez)
+
STR_TEMPERATE_LANDSCAPE :Ilıman iklim
STR_SUB_ARCTIC_LANDSCAPE :Soğuk iklim
STR_SUB_TROPICAL_LANDSCAPE :Tropik iklim
@@ -1975,20 +1990,20 @@
STR_4826_SUGAR_MINE :Şeker Madeni
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}İstenen: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}İstenenler: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}İstenenler: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}İstenen: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}İstenenler: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}İstenenler: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}İşlenmeyi bekleyen kargo:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Üretir: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Üretir: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Üretir: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Üretir: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Geçen ayki üretim:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} (%{COMMA} tasindi)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} (%{COMMA} tasindi)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Fabrikaya git
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Yeni bir {STRING}, {TOWN} şehri yakınlarında kuruldu!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Yeni bir {STRING}, {TOWN} şehri yakınlarında kuruldu!
@@ -2328,6 +2343,8 @@
STR_LIVERY_PASSENGER_WAGON_STEAM :Tramvay (Buhar)
STR_LIVERY_PASSENGER_WAGON_DIESEL :Tramvay (Dizel)
STR_LIVERY_PASSENGER_WAGON_ELECTRIC :Tramvay (Elektrik)
+STR_LIVERY_PASSENGER_WAGON_MONORAIL :Yolcu Vagonu (Monoray)
+STR_LIVERY_PASSENGER_WAGON_MAGLEV :Yolcu Vagonu (Maglev)
STR_LIVERY_FREIGHT_WAGON :Yük Vagonu
STR_LIVERY_BUS :Otobüs
STR_LIVERY_TRUCK :Kamyon
@@ -2783,6 +2800,7 @@
STR_NEW_VEHICLE_NOW_AVAILABLE_WITH_TYPE :{BLACK}{STRING} artık kullanılabilir! - {ENGINE}
STR_CAN_T_SELL_DESTROYED_VEHICLE :{WHITE}Hurda araçlar satılamaz...
+STR_CAN_T_REFIT_DESTROYED_VEHICLE :{WHITE}Yok olmuş araç modifiye edilemez...
STR_CAN_T_TIMETABLE_VEHICLE :{WHITE}Aracın zaman çizelgesi oluşturulamıyor...
STR_TIMETABLE_ONLY_WAIT_AT_STATIONS :{WHITE}Araçlar sadece istasyonlarda bekleyebilir.
@@ -3227,6 +3245,12 @@
STR_PURCHASE_INFO_ALL_BUT :{GOLD} hariç hepsi
STR_PURCHASE_INFO_MAX_TE :{BLACK}Mak. Çekim Gücü: {GOLD}{FORCE}
+########### For showing numbers in widgets
+
+STR_NUM_1 :{BLACK}{SKIP}{NUM}
+STR_NUM_2 :{BLACK}{SKIP}{SKIP}{NUM}
+STR_NUM_3 :{BLACK}{SKIP}{SKIP}{SKIP}{NUM}
+
########### String for New Landscape Generator
STR_GENERATE :{WHITE}Oluştur
@@ -3395,6 +3419,8 @@
STR_FACE_LOAD_TIP :{BLACK}Tercih edilen yüzü yükle
STR_FACE_LOAD_DONE :{WHITE}Tercih edilen yüz OpenTTD ayar dosyasından yüklendi.
STR_FACE_FACECODE :{BLACK}Oyuncu yüzü no.
+STR_FACE_FACECODE_TIP :{BLACK}Oyuncu suratının numarasını göster/değiştir
+STR_FACE_FACECODE_CAPTION :{WHITE}Oyuncu suratının numarasını göster/değiştir
STR_FACE_FACECODE_SET :{WHITE}Surat numarası ayarlandı.
STR_FACE_FACECODE_ERR :{WHITE}Oyuncu surat numarası ayarlanamadı - 0 ve 4.294.967.295 arasında bir sayı olmalı!
STR_FACE_SAVE :{BLACK}Kaydet
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/ukrainian.txt
--- a/src/lang/ukrainian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/ukrainian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -723,7 +723,7 @@
STR_MESSAGES_ALL :{YELLOW}Відображати повідомлення: відкл. / коротко / повно
STR_MESSAGE_SOUND :{YELLOW}Звукове сповіщення для підсумкових новин
STR_0210_TOO_FAR_FROM_PREVIOUS_DESTINATIO :{WHITE}...дуже далеко від попереднього пункту призначення
-STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Кращі компанії, що досягли {NUM}{}(рівень {STRING})
+STR_0211_TOP_COMPANIES_WHO_REACHED :{BIGFONT}{BLACK}Кращі компанії, що досягли {NUM}{}({STRING} рівень)
STR_TOP_COMPANIES_NETWORK_GAME :{BIGFONT}{BLACK}Таблиця компаній з {NUM}
STR_0212 :{BIGFONT}{COMMA}.
STR_0213_BUSINESSMAN :Бізнесмен
@@ -940,7 +940,7 @@
STR_02E2_CURRENCY_UNITS_SELECTION :{BLACK}Виберіть грошову одиницю
STR_MEASURING_UNITS :{BLACK}Система одиниць виміру
STR_02E4 :{BLACK}{SKIP}{SKIP}{STRING}
-STR_MEASURING_UNITS_SELECTION :{BLACK}Вибір системи одиниць виміру
+STR_MEASURING_UNITS_SELECTION :{BLACK}Виберіть систему одиниць виміру
STR_02E6_ROAD_VEHICLES :{BLACK}Транспорт
STR_02E7 :{BLACK}{SKIP}{SKIP}{SKIP}{STRING}
STR_02E8_SELECT_SIDE_OF_ROAD_FOR :{BLACK}Виберіть, по якій стороні їхатиме транспорт
@@ -953,10 +953,10 @@
STR_02F4_AUTOSAVE :{BLACK}Автозбереження
STR_02F5 :{BLACK}{SKIP}{SKIP}{SKIP}{SKIP}{SKIP}{STRING}
STR_02F6_SELECT_INTERVAL_BETWEEN :{BLACK}Виберіть період автозбереження гри
-STR_02F7_OFF :Вимкнено
-STR_02F8_EVERY_3_MONTHS :Кожні три місяці
-STR_02F9_EVERY_6_MONTHS :Кожні півроку
-STR_02FA_EVERY_12_MONTHS :Щороку
+STR_02F7_OFF :вимкнено
+STR_02F8_EVERY_3_MONTHS :кожні три місяці
+STR_02F9_EVERY_6_MONTHS :кожні півроку
+STR_02FA_EVERY_12_MONTHS :щороку
STR_02FB_START_A_NEW_GAME :{BLACK}Почати нову гру
STR_02FC_LOAD_A_SAVED_GAME :{BLACK}Продовжити збережену гру
STR_02FE_CREATE_A_CUSTOMIZED_GAME :{BLACK}Створити свій сценарій
@@ -1175,29 +1175,30 @@
STR_CONFIG_PATCHES_ALLOW_GIVE_MONEY :{LTBLUE}Дозволити передавати гроші іншим компаніям: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NONUNIFORM_STATIONS :{LTBLUE}Неоднорідні станції: {ORANGE}{STRING}
STR_CONFIG_PATCHES_FREIGHT_TRAINS :{LTBLUE}Множник ваги для імітації важких потягів: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_PLANE_SPEED :{LTBLUE}Фактор швидкості літаків: {ORANGE}1 / {STRING}
STR_CONFIG_PATCHES_STOP_ON_TOWN_ROAD :{LTBLUE}Дозволити безпересадкові зупинки на муніципальних дорогах: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ADJACENT_STATIONS :{LTBLUE}Дозволити будувати суміжні станції: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMALL_AIRPORTS :{LTBLUE}Будувати малі аеропорти можна завжди: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_WARN_LOST_TRAIN :{LTBLUE}Повідомляти, коли поїзд загубився {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_LOST_TRAIN :{LTBLUE}Повідомляти, якщо поїзд загубився {ORANGE}{STRING}
STR_CONFIG_PATCHES_ORDER_REVIEW :{LTBLUE}Показ транспортних наказів: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ORDER_REVIEW_OFF :ні
STR_CONFIG_PATCHES_ORDER_REVIEW_EXDEPOT :так, крім зупиненого транспорту
STR_CONFIG_PATCHES_ORDER_REVIEW_ON :усього транспорту
-STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Попереджати якщо поїзд приносить збитки: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_WARN_INCOME_LESS :{LTBLUE}Повідомляти, якщо поїзд приносить збитки: {ORANGE}{STRING}
STR_CONFIG_PATCHES_NEVER_EXPIRE_VEHICLES :{LTBLUE}Транспорт не старіє: {ORANGE}{STRING}
STR_CONFIG_PATCHES_AUTORENEW_VEHICLE :{LTBLUE}Автооновлення старого транспорту
STR_CONFIG_PATCHES_AUTORENEW_MONTHS :{LTBLUE}Автооновлення транспорту через {ORANGE}{STRING}{LTBLUE} міс. до/після макс.віку
-STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Необхідна сума для автооновлення: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AUTORENEW_MONEY :{LTBLUE}Сума, необхідна для автооновлення: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ERRMSG_DURATION :{LTBLUE}Тривалість повідомлення про помилку: {ORANGE}{STRING}
STR_CONFIG_PATCHES_POPULATION_IN_LABEL :{LTBLUE}Показувати населення міста поруч з назвою: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_INVISIBLE_TREES :{LTBLUE}Невидимі дерева і прозорі будівлі: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_INVISIBLE_TREES :{LTBLUE}Прозорі дерева: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LAND_GENERATOR :{LTBLUE}Генератор ландшафту: {ORANGE}{STRING}
STR_CONFIG_PATCHES_LAND_GENERATOR_ORIGINAL :Класичний
STR_CONFIG_PATCHES_LAND_GENERATOR_TERRA_GENESIS :ТерраГен
-STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE :{LTBLUE}Макс віддаленість від нафтової свердловини {ORANGE}{STRING}
+STR_CONFIG_PATCHES_OIL_REF_EDGE_DISTANCE :{LTBLUE}Макс. віддаленість від краю для нафтових свердловин {ORANGE}{STRING}
STR_CONFIG_PATCHES_SNOWLINE_HEIGHT :{LTBLUE}Висота рівня снігу: {ORANGE}{STRING}
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN :{LTBLUE}Нерівність землі (лише для TerraGenesis) : {ORANGE}{STRING}
STR_CONFIG_PATCHES_ROUGHNESS_OF_TERRAIN_VERY_SMOOTH :Дуже гладкий
@@ -1215,7 +1216,7 @@
STR_CONFIG_PATCHES_STATION_SPREAD :{LTBLUE}Макс. довжина станції: {ORANGE}{STRING} {RED}Велике значення гальмує гру
STR_CONFIG_PATCHES_SERVICEATHELIPAD :{LTBLUE}Автоматичний техогляд гелікоптерів на площадках: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR :{LTBLUE}Включити меню рельєфу до меню будування: {ORANGE}{STRING}
+STR_CONFIG_PATCHES_LINK_TERRAFORM_TOOLBAR :{LTBLUE}Приєднати меню рельєфу до меню будування: {ORANGE}{STRING}
STR_CONFIG_PATCHES_REVERSE_SCROLLING :{LTBLUE}Протилежний напрямок прокрутки: {ORANGE}{STRING}
STR_CONFIG_PATCHES_SMOOTH_SCROLLING :{LTBLUE}Плавна прокрутка у вікні: {ORANGE}{STRING}
STR_CONFIG_PATCHES_MEASURE_TOOLTIP :{LTBLUE}Показувати розміри будівництва в підказці: {ORANGE}{STRING}
@@ -1266,7 +1267,7 @@
STR_CONFIG_PATCHES_AI_BUILDS_AIRCRAFT :{LTBLUE}Заборонити комп'ютеру будувати літаки: {ORANGE}{STRING}
STR_CONFIG_PATCHES_AI_BUILDS_SHIPS :{LTBLUE}Заборонити комп'ютеру будувати кораблі: {ORANGE}{STRING}
-STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}Новий тип інтелекту (альфа): {ORANGE}{STRING}
+STR_CONFIG_PATCHES_AINEW_ACTIVE :{LTBLUE}Новий тип інтелекту (альфа-версія): {ORANGE}{STRING}
STR_CONFIG_PATCHES_AI_IN_MULTIPLAYER :{LTBLUE}Включити інтелект при грі в мережі(тестовий): {ORANGE}{STRING}
STR_CONFIG_PATCHES_SERVINT_TRAINS :{LTBLUE}Інтервал техогляду для поїздів: {ORANGE}{STRING} дн/%
@@ -1736,6 +1737,7 @@
STR_1005_NO_SUITABLE_RAILROAD_TRACK :{WHITE}Невідповідний тип колії
STR_1007_ALREADY_BUILT :{WHITE}...вже побудовано
STR_1008_MUST_REMOVE_RAILROAD_TRACK :{WHITE}Спочатку приберіть колію
+STR_ERR_CROSSING_ON_ONEWAY_ROAD :{WHITE}Дорога з одностороннім рухом або блокована
STR_100A_RAILROAD_CONSTRUCTION :{WHITE}Будівництво залізниці
STR_TITLE_ELRAIL_CONSTRUCTION :{WHITE}Будувати електрифіковану колію
STR_100B_MONORAIL_CONSTRUCTION :{WHITE}Будівництво монорельса
@@ -1838,6 +1840,7 @@
STR_2002_WHITE :{TINYFONT}{WHITE}{SIGN}
STR_2004_BUILDING_MUST_BE_DEMOLISHED :{WHITE}Спочатку зруйнуйте споруду
STR_2005 :{WHITE}{TOWN}
+STR_CITY :{WHITE}{TOWN} (місто)
STR_2006_POPULATION :{BLACK}Населення: {ORANGE}{COMMA}{BLACK} Будинки: {ORANGE}{COMMA}
STR_2007_RENAME_TOWN :Перейменувати
STR_2008_CAN_T_RENAME_TOWN :{WHITE}Неможливо перейменувати...
@@ -2154,20 +2157,20 @@
STR_4826_SUGAR_MINE.z :цукрову копальню
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Потребує: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Потребує: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Потребує: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Потребує: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Потребує: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Потребує: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Вантаж чекає на обробку:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
-STR_4827_PRODUCES :{BLACK}Продукція: {YELLOW}{STRING}
-STR_4828_PRODUCES :{BLACK}Продукція: {YELLOW}{STRING}, {STRING}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
+STR_4827_PRODUCES :{BLACK}Продукція: {YELLOW}{STRING}{STRING}
+STR_4828_PRODUCES :{BLACK}Продукція: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Вироблено за місяць:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% перевезено)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% перевезено)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Показати в центрі екрану
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Будується {STRING} біля {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Насаджено {STRING} біля {TOWN}!
@@ -2346,14 +2349,14 @@
STR_682D_MOUNTAINOUS :Гористий
STR_682E_STEADY :Стабільна
STR_682F_FLUCTUATING :Нестійка
-STR_6830_IMMEDIATE :Відразу
+STR_6830_IMMEDIATE :відразу
STR_6831_3_MONTHS_AFTER_PLAYER :3 місяці після гравця
STR_6832_6_MONTHS_AFTER_PLAYER :6 місяців після гравця
STR_6833_9_MONTHS_AFTER_PLAYER :9 місяців після гравця
-STR_6834_AT_END_OF_LINE_AND_AT_STATIONS :В кінці лінії, або на станціях
-STR_6835_AT_END_OF_LINE_ONLY :Лише в кінці лінії
-STR_6836_OFF :ВиКл
-STR_6837_ON :Вкл
+STR_6834_AT_END_OF_LINE_AND_AT_STATIONS :в кінці лінії, або на станціях
+STR_6835_AT_END_OF_LINE_ONLY :лише в кінці лінії
+STR_6836_OFF :відкл.
+STR_6837_ON :вкл.
STR_6838_SHOW_HI_SCORE_CHART :{BLACK}Показати таблицю рекордів
STR_PERMISSIVE :Допустиме
STR_TOLERANT :Терпиме
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/unfinished/frisian.txt
--- a/src/lang/unfinished/frisian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/unfinished/frisian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1079,13 +1079,13 @@
STR_4826_SUGAR_MINE :Sûkermyn
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Nedich: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Nedich: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Nedich: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Nedich: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Nedich: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Nedich: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produksje lêste moanne:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% transportearre)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% transportearre)
STR_482F_COST :{BLACK}Kostet: {YELLOW}{CURRENCY}
##id 0x5000
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/unfinished/greek.txt
--- a/src/lang/unfinished/greek.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/unfinished/greek.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1596,13 +1596,13 @@
STR_4826_SUGAR_MINE :Ορυχείο Ζάχαρης
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Απαιτεί: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Απαιτεί: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Απαιτεί: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Απαιτεί: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Παραγωγή προηγούμενου μήνα:
-STR_482B_TRANSPORTED :{YELLOW}{CARGO}{BLACK} ({COMMA}% μεταφέρθηκαν)
+STR_482B_TRANSPORTED :{YELLOW}{CARGO}{STRING}{BLACK} ({COMMA}% μεταφέρθηκαν)
STR_482C_CENTER_THE_MAIN_VIEW_ON :{BLACK}Κεντράρισμα εικόνας στην περιοχή της βιομηχανίας
STR_482D_NEW_UNDER_CONSTRUCTION :{BLACK}{BIGFONT}Νέο {STRING} υπό κατασκευή κοντά στην πόλη {TOWN}!
STR_482E_NEW_BEING_PLANTED_NEAR :{BLACK}{BIGFONT}Νέα {STRING} φυτεύεται κοντά στην πόλη {TOWN}!
diff -r cc77111ebd85 -r 9707ad4c9b60 src/lang/unfinished/latvian.txt
--- a/src/lang/unfinished/latvian.txt Thu Mar 27 05:15:06 2008 +0000
+++ b/src/lang/unfinished/latvian.txt Fri Mar 28 10:32:55 2008 +0000
@@ -1558,14 +1558,14 @@
STR_4826_SUGAR_MINE :Cukura raktuve
############ range for requires starts
-STR_4827_REQUIRES :{BLACK}Nepieciešams: {YELLOW}{STRING}
-STR_4828_REQUIRES :{BLACK}Nepieciešams: {YELLOW}{STRING}, {STRING}
-STR_4829_REQUIRES :{BLACK}Nepieciešams: {YELLOW}{STRING}, {STRING}, {STRING}
+STR_4827_REQUIRES :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}
+STR_4828_REQUIRES :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}, {STRING}{STRING}
+STR_4829_REQUIRES :{BLACK}Nepieciešams: {YELLOW}{STRING}{STRING}, {STRING}{STRING}, {STRING}{STRING}
############ range for requires ends
############ range for produces starts
STR_INDUSTRY_WINDOW_WAITING_FOR_PROCESSING :{BLACK}Krava, kas jāapstrādā:
-STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{BLACK}
+STR_INDUSTRY_WINDOW_WAITING_STOCKPILE_CARGO :{YELLOW}{CARGO}{STRING}{BLACK}
############ range for produces ends
STR_482A_PRODUCTION_LAST_MONTH :{BLACK}Produkcija iepriekšēja mēnesī:
diff -r cc77111ebd85 -r 9707ad4c9b60 src/main_gui.cpp
--- a/src/main_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/main_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
#include "textbuf_gui.h"
#include "viewport_func.h"
#include "command_func.h"
-#include "news.h"
+#include "news_func.h"
#include "town.h"
#include "console.h"
#include "signs.h"
@@ -44,6 +44,7 @@
#include "player_func.h"
#include "player_gui.h"
#include "settings_type.h"
+#include "toolbar_gui.h"
#include "network/network.h"
#include "network/network_data.h"
@@ -59,11 +60,6 @@
RailType _last_built_railtype;
RoadType _last_built_roadtype;
-static int _scengen_town_size = 1; // depress medium-sized towns per default
-
-extern void GenerateIndustries();
-extern bool GenerateTowns();
-
bool _draw_bounding_boxes = false;
@@ -147,20 +143,6 @@
}
-static void ToolbarPauseClick(Window *w)
-{
- if (_networking && !_network_server) return; // only server can pause the game
-
- if (DoCommandP(0, _pause_game ? 0 : 1, 0, NULL, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
-}
-
-static void ToolbarFastForwardClick(Window *w)
-{
- _fast_forward ^= true;
- SndPlayFx(SND_15_BEEP);
-}
-
-
static void MenuClickSettings(int index)
{
switch (index) {
@@ -182,7 +164,7 @@
MarkWholeScreenDirty();
}
-static void MenuClickSaveLoad(int index)
+void MenuClickSaveLoad(int index)
{
if (_game_mode == GM_EDITOR) {
switch (index) {
@@ -347,7 +329,7 @@
ShowQueryString(STR_WAYPOINT_RAW, STR_EDIT_WAYPOINT_NAME, 30, 180, NULL, CS_ALPHANUMERAL);
}
-static void SelectSignTool()
+void SelectSignTool()
{
if (_cursor.sprite == SPR_CURSOR_SIGN) {
ResetObjectToPlace();
@@ -380,12 +362,12 @@
}
}
-static void MenuClickSmallScreenshot()
+void MenuClickSmallScreenshot()
{
SetScreenshotType(SC_VIEWPORT);
}
-static void MenuClickWorldScreenshot()
+void MenuClickWorldScreenshot()
{
SetScreenshotType(SC_WORLD);
}
@@ -546,6 +528,7 @@
num = num * 10 + 2;
w->height = num;
w->widget[0].bottom = w->widget[0].top + num - 1;
+ w->top = GetToolbarDropdownPos(0, w->width, w->height).y;
SetWindowDirty(w);
}
}
@@ -699,26 +682,21 @@
* @param item_count Number of strings in the list, see previous parameter
* @param disabled_mask Bitmask of disabled strings in the list
* @return Return a pointer to the newly created dropdown window */
-static Window *PopupMainToolbMenu(Window *w, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask)
+ Window *PopupMainToolbMenu(Window *w, uint16 parent_button, StringID base_string, byte item_count, byte disabled_mask)
{
- int width;
- int x = w->widget[GB(parent_button, 0, 8)].left;
-
assert(disabled_mask == 0 || item_count <= 8);
w->LowerWidget(parent_button);
w->InvalidateWidget(parent_button);
DeleteWindowById(WC_TOOLBAR_MENU, 0);
- /* Extend the dropdown toolbar to the longest string in the list and
- * also make sure the dropdown is fully visible within the window.
- * x + w->left because x is supposed to be the offset of the toolbar-button
- * we clicked on and w->left the toolbar window itself. So meaning that
- * the default position is aligned with the left side of the clicked button */
- width = max(GetStringListMaxWidth(base_string, item_count) + 6, 140);
- x = w->left + Clamp(x, 0, w->width - width); // or alternatively '_screen.width - width'
+ // Extend the dropdown toolbar to the longest string in the list
+ int width = max(GetStringListMaxWidth(base_string, item_count) + 6, 140);
+ int height = item_count * 10 + 2;
- w = AllocateWindow(x, 22, width, item_count * 10 + 2, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
+ Point pos = GetToolbarDropdownPos(parent_button, width, height);
+
+ w = AllocateWindow(pos.x, pos.y, width, height, MenuWndProc, WC_TOOLBAR_MENU, _menu_widgets);
w->widget[0].bottom = item_count * 10 + 1;
w->flags4 &= ~WF_WHITE_BORDER_MASK;
@@ -736,15 +714,14 @@
return w;
}
-static Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray)
+Window *PopupMainPlayerToolbMenu(Window *w, int main_button, int gray)
{
- int x = w->widget[main_button].left + w->left;
-
w->LowerWidget(main_button);
w->InvalidateWidget(main_button);
DeleteWindowById(WC_TOOLBAR_MENU, 0);
- w = AllocateWindow(x, 0x16, 0xF1, 0x52, PlayerMenuWndProc, WC_TOOLBAR_MENU, _player_menu_widgets);
+ Point pos = GetToolbarDropdownPos(main_button, 241, 82);
+ w = AllocateWindow(pos.x, pos.y, 241, 82, PlayerMenuWndProc, WC_TOOLBAR_MENU, _player_menu_widgets);
w->flags4 &= ~WF_WHITE_BORDER_MASK;
WP(w, menu_d).item_count = 0;
WP(w, menu_d).sel_index = (_local_player != PLAYER_SPECTATOR) ? _local_player : GetPlayerIndexFromMenu(0);
@@ -765,101 +742,6 @@
return w;
}
-static void ToolbarSaveClick(Window *w)
-{
- PopupMainToolbMenu(w, 3, STR_015C_SAVE_GAME, 4, 0);
-}
-
-static void ToolbarMapClick(Window *w)
-{
- PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 3, 0);
-}
-
-static void ToolbarTownClick(Window *w)
-{
- PopupMainToolbMenu(w, 5, STR_02BB_TOWN_DIRECTORY, 1, 0);
-}
-
-static void ToolbarSubsidiesClick(Window *w)
-{
- PopupMainToolbMenu(w, 6, STR_02DD_SUBSIDIES, 1, 0);
-}
-
-static void ToolbarStationsClick(Window *w)
-{
- PopupMainPlayerToolbMenu(w, 7, 0);
-}
-
-static void ToolbarMoneyClick(Window *w)
-{
- PopupMainPlayerToolbMenu(w, 8, 0);
-}
-
-static void ToolbarPlayersClick(Window *w)
-{
- PopupMainPlayerToolbMenu(w, 9, 0);
-}
-
-static void ToolbarGraphsClick(Window *w)
-{
- PopupMainToolbMenu(w, 10, STR_0154_OPERATING_PROFIT_GRAPH, 6, 0);
-}
-
-static void ToolbarLeagueClick(Window *w)
-{
- PopupMainToolbMenu(w, 11, STR_015A_COMPANY_LEAGUE_TABLE, 2, 0);
-}
-
-static void ToolbarIndustryClick(Window *w)
-{
- /* Disable build-industry menu if we are a spectator */
- PopupMainToolbMenu(w, 12, STR_INDUSTRY_DIR, 2, (_current_player == PLAYER_SPECTATOR) ? (1 << 1) : 0);
-}
-
-static void ToolbarTrainClick(Window *w)
-{
- const Vehicle *v;
- int dis = -1;
-
- FOR_ALL_VEHICLES(v) {
- if (v->type == VEH_TRAIN && IsFrontEngine(v)) ClrBit(dis, v->owner);
- }
- PopupMainPlayerToolbMenu(w, 13, dis);
-}
-
-static void ToolbarRoadClick(Window *w)
-{
- const Vehicle *v;
- int dis = -1;
-
- FOR_ALL_VEHICLES(v) {
- if (v->type == VEH_ROAD && IsRoadVehFront(v)) ClrBit(dis, v->owner);
- }
- PopupMainPlayerToolbMenu(w, 14, dis);
-}
-
-static void ToolbarShipClick(Window *w)
-{
- const Vehicle *v;
- int dis = -1;
-
- FOR_ALL_VEHICLES(v) {
- if (v->type == VEH_SHIP) ClrBit(dis, v->owner);
- }
- PopupMainPlayerToolbMenu(w, 15, dis);
-}
-
-static void ToolbarAirClick(Window *w)
-{
- const Vehicle *v;
- int dis = -1;
-
- FOR_ALL_VEHICLES(v) {
- if (v->type == VEH_AIRCRAFT) ClrBit(dis, v->owner);
- }
- PopupMainPlayerToolbMenu(w, 16, dis);
-}
-
/* Zooms a viewport in a window in or out */
/* No button handling or what so ever */
bool DoZoomInOutWindow(int how, Window *w)
@@ -904,152 +786,16 @@
return true;
}
-static void ToolbarZoomInClick(Window *w)
-{
- if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(17);
- SndPlayFx(SND_15_BEEP);
- }
-}
-
-static void ToolbarZoomOutClick(Window *w)
-{
- if (DoZoomInOutWindow(ZOOM_OUT,FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(18);
- SndPlayFx(SND_15_BEEP);
- }
-}
-
-static void ToolbarBuildRailClick(Window *w)
-{
- const Player *p = GetPlayer(_local_player);
- Window *w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
- WP(w2, menu_d).sel_index = _last_built_railtype;
-}
-
-static void ToolbarBuildRoadClick(Window *w)
-{
- const Player *p = GetPlayer(_local_player);
- /* The standard road button is *always* available */
- Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | ROADTYPES_ROAD));
- WP(w2, menu_d).sel_index = _last_built_roadtype;
-}
-
-static void ToolbarBuildWaterClick(Window *w)
-{
- PopupMainToolbMenu(w, 21, STR_9800_DOCK_CONSTRUCTION, 1, 0);
-}
-
-static void ToolbarBuildAirClick(Window *w)
-{
- PopupMainToolbMenu(w, 22, STR_A01D_AIRPORT_CONSTRUCTION, 1, 0);
-}
-
-static void ToolbarForestClick(Window *w)
-{
- PopupMainToolbMenu(w, 23, STR_LANDSCAPING, 3, 0);
-}
-
-static void ToolbarMusicClick(Window *w)
-{
- PopupMainToolbMenu(w, 24, STR_01D3_SOUND_MUSIC, 1, 0);
-}
-
-static void ToolbarNewspaperClick(Window *w)
-{
- PopupMainToolbMenu(w, 25, STR_0200_LAST_MESSAGE_NEWS_REPORT, 3, 0);
-}
-
-static void ToolbarHelpClick(Window *w)
-{
- PopupMainToolbMenu(w, 26, STR_02D5_LAND_BLOCK_INFO, 6, 0);
-}
-
-static void ToolbarOptionsClick(Window *w)
-{
- uint16 x = 0;
-
- w = PopupMainToolbMenu(w, 2, STR_02C4_GAME_OPTIONS, 14, 0);
-
- if (HasBit(_display_opt, DO_SHOW_TOWN_NAMES)) SetBit(x, 6);
- if (HasBit(_display_opt, DO_SHOW_STATION_NAMES)) SetBit(x, 7);
- if (HasBit(_display_opt, DO_SHOW_SIGNS)) SetBit(x, 8);
- if (HasBit(_display_opt, DO_WAYPOINTS)) SetBit(x, 9);
- if (HasBit(_display_opt, DO_FULL_ANIMATION)) SetBit(x, 10);
- if (HasBit(_display_opt, DO_FULL_DETAIL)) SetBit(x, 11);
- if (IsTransparencySet(TO_HOUSES)) SetBit(x, 12);
- if (IsTransparencySet(TO_SIGNS)) SetBit(x, 13);
- WP(w, menu_d).checked_items = x;
-}
-
-
-static void ToolbarScenSaveOrLoad(Window *w)
-{
- PopupMainToolbMenu(w, 3, STR_0292_SAVE_SCENARIO, 6, 0);
-}
-
-static void ToolbarScenDateBackward(Window *w)
-{
- /* don't allow too fast scrolling */
- if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
- w->HandleButtonClick(6);
- SetWindowDirty(w);
-
- _patches_newgame.starting_year = Clamp(_patches_newgame.starting_year - 1, MIN_YEAR, MAX_YEAR);
- SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
- }
- _left_button_clicked = false;
-}
-
-static void ToolbarScenDateForward(Window *w)
-{
- /* don't allow too fast scrolling */
- if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
- w->HandleButtonClick(7);
- SetWindowDirty(w);
-
- _patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + 1, MIN_YEAR, MAX_YEAR);
- SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
- }
- _left_button_clicked = false;
-}
-
-static void ToolbarScenMapTownDir(Window *w)
-{
- /* Scenario editor button, *hack*hack* use different button to activate */
- PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 4, 0);
-}
-
-static void ToolbarScenZoomIn(Window *w)
-{
- if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(9);
- SndPlayFx(SND_15_BEEP);
- }
-}
-
-static void ToolbarScenZoomOut(Window *w)
-{
- if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
- w->HandleButtonClick(10);
- SndPlayFx(SND_15_BEEP);
- }
-}
-
void ZoomInOrOutToCursorWindow(bool in, Window *w)
{
- ViewPort *vp;
- Point pt;
-
- assert(w != 0);
-
- vp = w->viewport;
+ assert(w != NULL);
if (_game_mode != GM_MENU) {
+ ViewPort *vp = w->viewport;
if ((in && vp->zoom == ZOOM_LVL_MIN) || (!in && vp->zoom == ZOOM_LVL_MAX))
return;
- pt = GetTileZoomCenterWindow(in,w);
+ Point pt = GetTileZoomCenterWindow(in,w);
if (pt.x != -1) {
ScrollWindowTo(pt.x, pt.y, w, true);
@@ -1058,608 +804,6 @@
}
}
-static void ToolbarScenGenLand(Window *w)
-{
- w->HandleButtonClick(11);
- SndPlayFx(SND_15_BEEP);
-
- ShowEditorTerraformToolbar();
-}
-
-void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
-{
- if (success) {
- SndPlayTileFx(SND_1F_SPLAT, tile);
- ResetObjectToPlace();
- }
-}
-
-static void PlaceProc_Town(TileIndex tile)
-{
- uint32 size = min(_scengen_town_size, (int)TSM_CITY);
- uint32 mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
- DoCommandP(tile, size, mode, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
-}
-
-
-static const Widget _scen_edit_town_gen_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
-{ WWT_STICKYBOX, RESIZE_NONE, 7, 148, 159, 0, 13, 0x0, STR_STICKY_BUTTON},
-{ WWT_PANEL, RESIZE_NONE, 7, 0, 159, 14, 94, 0x0, STR_NULL},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 16, 27, STR_0234_NEW_TOWN, STR_0235_CONSTRUCT_NEW_TOWN},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 29, 40, STR_023D_RANDOM_TOWN, STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 42, 53, STR_MANY_RANDOM_TOWNS, STR_RANDOM_TOWNS_TIP},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 53, 68, 79, STR_02A1_SMALL, STR_02A4_SELECT_TOWN_SIZE},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 54, 105, 68, 79, STR_02A2_MEDIUM, STR_02A4_SELECT_TOWN_SIZE},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 106, 157, 68, 79, STR_02A3_LARGE, STR_02A4_SELECT_TOWN_SIZE},
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 81, 92, STR_SCENARIO_EDITOR_CITY, STR_02A4_SELECT_TOWN_SIZE},
-{ WWT_LABEL, RESIZE_NONE, 7, 0, 147, 54, 67, STR_02A5_TOWN_SIZE, STR_NULL},
-{ WIDGETS_END},
-};
-
-static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_PAINT:
- DrawWindowWidgets(w);
- break;
-
- case WE_CREATE:
- w->LowerWidget(_scengen_town_size + 7);
- break;
-
- case WE_CLICK:
- switch (e->we.click.widget) {
- case 4: // new town
- HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, VHM_RECT, PlaceProc_Town);
- break;
- case 5: {// random town
- Town *t;
- uint size = min(_scengen_town_size, (int)TSM_CITY);
- TownSizeMode mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
-
- w->HandleButtonClick(5);
- _generating_world = true;
- t = CreateRandomTown(20, mode, size);
- _generating_world = false;
-
- if (t == NULL) {
- ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
- } else {
- ScrollMainWindowToTile(t->xy);
- }
-
- break;
- }
- case 6: {// many random towns
- w->HandleButtonClick(6);
-
- _generating_world = true;
- if (!GenerateTowns()) ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
- _generating_world = false;
- break;
- }
-
- case 7: case 8: case 9: case 10:
- w->RaiseWidget(_scengen_town_size + 7);
- _scengen_town_size = e->we.click.widget - 7;
- w->LowerWidget(_scengen_town_size + 7);
- SetWindowDirty(w);
- break;
- }
- break;
-
- case WE_TIMEOUT:
- w->RaiseWidget(5);
- w->RaiseWidget(6);
- SetWindowDirty(w);
- break;
- case WE_PLACE_OBJ:
- _place_proc(e->we.place.tile);
- break;
- case WE_ABORT_PLACE_OBJ:
- w->RaiseButtons();
- w->LowerWidget(_scengen_town_size + 7);
- SetWindowDirty(w);
- break;
- }
-}
-
-static const WindowDesc _scen_edit_town_gen_desc = {
- WDP_AUTO, WDP_AUTO, 160, 95, 160, 95,
- WC_SCEN_TOWN_GEN, WC_NONE,
- WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
- _scen_edit_town_gen_widgets,
- ScenEditTownGenWndProc,
-};
-
-static void ToolbarScenGenTown(Window *w)
-{
- w->HandleButtonClick(12);
- SndPlayFx(SND_15_BEEP);
-
- AllocateWindowDescFront(&_scen_edit_town_gen_desc, 0);
-}
-
-static void ToolbarScenGenIndustry(Window *w)
-{
- w->HandleButtonClick(13);
- SndPlayFx(SND_15_BEEP);
- ShowBuildIndustryWindow();
-}
-
-static void ToolbarScenBuildRoad(Window *w)
-{
- w->HandleButtonClick(14);
- SndPlayFx(SND_15_BEEP);
- ShowBuildRoadScenToolbar();
-}
-
-static void ToolbarScenPlantTrees(Window *w)
-{
- w->HandleButtonClick(15);
- SndPlayFx(SND_15_BEEP);
- ShowBuildTreesScenToolbar();
-}
-
-static void ToolbarScenPlaceSign(Window *w)
-{
- w->HandleButtonClick(16);
- SndPlayFx(SND_15_BEEP);
- SelectSignTool();
-}
-
-static void ToolbarBtn_NULL(Window *w)
-{
-}
-
-
-typedef void ToolbarButtonProc(Window *w);
-
-static ToolbarButtonProc * const _toolbar_button_procs[] = {
- ToolbarPauseClick,
- ToolbarFastForwardClick,
- ToolbarOptionsClick,
- ToolbarSaveClick,
- ToolbarMapClick,
- ToolbarTownClick,
- ToolbarSubsidiesClick,
- ToolbarStationsClick,
- ToolbarMoneyClick,
- ToolbarPlayersClick,
- ToolbarGraphsClick,
- ToolbarLeagueClick,
- ToolbarIndustryClick,
- ToolbarTrainClick,
- ToolbarRoadClick,
- ToolbarShipClick,
- ToolbarAirClick,
- ToolbarZoomInClick,
- ToolbarZoomOutClick,
- ToolbarBuildRailClick,
- ToolbarBuildRoadClick,
- ToolbarBuildWaterClick,
- ToolbarBuildAirClick,
- ToolbarForestClick,
- ToolbarMusicClick,
- ToolbarNewspaperClick,
- ToolbarHelpClick,
-};
-
-static void MainToolbarWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_PAINT:
- /* Draw brown-red toolbar bg. */
- GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
- GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
-
- /* If spectator, disable all construction buttons
- * ie : Build road, rail, ships, airports and landscaping
- * Since enabled state is the default, just disable when needed */
- w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
- /* disable company list drop downs, if there are no companies */
- w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
-
- w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
- w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
-
- DrawWindowWidgets(w);
- break;
-
- case WE_CLICK: {
- if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget))
- _toolbar_button_procs[e->we.click.widget](w);
- } break;
-
- case WE_KEYPRESS: {
- switch (e->we.keypress.keycode) {
- case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
- case WKC_F2: ShowGameOptions(); break;
- case WKC_F3: MenuClickSaveLoad(0); break;
- case WKC_F4: ShowSmallMap(); break;
- case WKC_F5: ShowTownDirectory(); break;
- case WKC_F6: ShowSubsidiesList(); break;
- case WKC_F7: ShowPlayerStations(_local_player); break;
- case WKC_F8: ShowPlayerFinances(_local_player); break;
- case WKC_F9: ShowPlayerCompany(_local_player); break;
- case WKC_F10: ShowOperatingProfitGraph(); break;
- case WKC_F11: ShowCompanyLeagueTable(); break;
- case WKC_F12: ShowBuildIndustryWindow(); break;
- case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
- case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
- case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
- case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
- case WKC_NUM_PLUS: // Fall through
- case WKC_EQUALS: // Fall through
- case WKC_SHIFT | WKC_EQUALS: // Fall through
- case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
- case WKC_NUM_MINUS: // Fall through
- case WKC_MINUS: // Fall through
- case WKC_SHIFT | WKC_MINUS: // Fall through
- case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
- case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
- case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
- case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
- case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
- case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
- case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
- case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
- case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
- case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
- case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail
- case 'L': ShowTerraformToolbar(); break;
- case 'M': ShowSmallMap(); break;
- case 'V': ShowExtraViewPortWindow(); break;
- default: return;
- }
- e->we.keypress.cont = false;
- } break;
-
- case WE_PLACE_OBJ: {
- _place_proc(e->we.place.tile);
- } break;
-
- case WE_ABORT_PLACE_OBJ: {
- w->RaiseWidget(25);
- SetWindowDirty(w);
- } break;
-
- case WE_MOUSELOOP:
- if (w->IsWidgetLowered(0) != !!_pause_game) {
- w->ToggleWidgetLoweredState(0);
- w->InvalidateWidget(0);
- }
-
- if (w->IsWidgetLowered(1) != !!_fast_forward) {
- w->ToggleWidgetLoweredState(1);
- w->InvalidateWidget(1);
- }
- break;
-
- case WE_RESIZE: {
- /* There are 27 buttons plus some spacings if the space allows it */
- uint button_width;
- uint spacing;
- if (w->width >= 27 * 22) {
- button_width = 22;
- spacing = w->width - (27 * button_width);
- } else {
- button_width = w->width / 27;
- spacing = 0;
- }
- uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
-
- for (uint i = 0, x = 0, j = 0; i < 27; i++) {
- if (extra_spacing_at[j] == i) {
- j++;
- uint add = spacing / (lengthof(extra_spacing_at) - j);
- spacing -= add;
- x += add;
- }
-
- w->widget[i].left = x;
- x += (spacing != 0) ? button_width : (w->width - x) / (27 - i);
- w->widget[i].right = x - 1;
- }
- } break;
-
- case WE_TIMEOUT: {
- uint i;
- for (i = 2; i < w->widget_count; i++) {
- if (w->IsWidgetLowered(i)) {
- w->RaiseWidget(i);
- w->InvalidateWidget(i);
- }
- }
- break;
- }
-
- case WE_MESSAGE:
- if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
- break;
- }
-}
-
-static const Widget _toolb_normal_widgets[] = {
-{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
-{ WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
-{ WIDGETS_END},
-};
-
-static const WindowDesc _toolb_normal_desc = {
- 0, 0, 0, 22, 640, 22,
- WC_MAIN_TOOLBAR, WC_NONE,
- WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
- _toolb_normal_widgets,
- MainToolbarWndProc
-};
-
-
-static const Widget _toolb_scen_widgets[] = {
-{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
-{WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO},
-
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 0, 0, 21, 0x0, STR_NULL},
-
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 129, 0, 21, 0x0, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
-
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN},
-
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
-{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
-{WIDGETS_END},
-};
-
-static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
- ToolbarPauseClick,
- ToolbarFastForwardClick,
- ToolbarOptionsClick,
- ToolbarScenSaveOrLoad,
- ToolbarBtn_NULL,
- ToolbarBtn_NULL,
- ToolbarScenDateBackward,
- ToolbarScenDateForward,
- ToolbarScenMapTownDir,
- ToolbarScenZoomIn,
- ToolbarScenZoomOut,
- ToolbarScenGenLand,
- ToolbarScenGenTown,
- ToolbarScenGenIndustry,
- ToolbarScenBuildRoad,
- ToolbarScenPlantTrees,
- ToolbarScenPlaceSign,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- ToolbarMusicClick,
- NULL,
- ToolbarHelpClick,
-};
-
-static void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
-{
- switch (e->event) {
- case WE_PAINT:
- w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
- w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
-
- /* Draw brown-red toolbar bg. */
- GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
- GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
-
- DrawWindowWidgets(w);
-
- SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
- DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
-
- /* We hide this panel when the toolbar space gets too small */
- if (w->widget[4].left != w->widget[4].right) {
- DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 1, STR_0221_OPENTTD, TC_FROMSTRING);
- DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
- }
-
- break;
-
- case WE_CLICK: {
- if (_game_mode == GM_MENU) return;
- _scen_toolbar_button_procs[e->we.click.widget](w);
- } break;
-
- case WE_KEYPRESS:
- switch (e->we.keypress.keycode) {
- case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
- case WKC_F2: ShowGameOptions(); break;
- case WKC_F3: MenuClickSaveLoad(0); break;
- case WKC_F4: ToolbarScenGenLand(w); break;
- case WKC_F5: ToolbarScenGenTown(w); break;
- case WKC_F6: ToolbarScenGenIndustry(w); break;
- case WKC_F7: ToolbarScenBuildRoad(w); break;
- case WKC_F8: ToolbarScenPlantTrees(w); break;
- case WKC_F9: ToolbarScenPlaceSign(w); break;
- case WKC_F10: ShowMusicWindow(); break;
- case WKC_F11: PlaceLandBlockInfo(); break;
- case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
- case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
-
- /* those following are all fall through */
- case WKC_NUM_PLUS:
- case WKC_EQUALS:
- case WKC_SHIFT | WKC_EQUALS:
- case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
-
- /* those following are all fall through */
- case WKC_NUM_MINUS:
- case WKC_MINUS:
- case WKC_SHIFT | WKC_MINUS:
- case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
-
- case 'L': ShowEditorTerraformToolbar(); break;
- case 'M': ShowSmallMap(); break;
- case 'V': ShowExtraViewPortWindow(); break;
- default: return;
- }
- e->we.keypress.cont = false;
- break;
-
- case WE_PLACE_OBJ: {
- _place_proc(e->we.place.tile);
- } break;
-
- case WE_ABORT_PLACE_OBJ: {
- w->RaiseWidget(25);
- SetWindowDirty(w);
- } break;
-
- case WE_RESIZE: {
- /* There are 15 buttons plus some spacings if the space allows it.
- * Furthermore there are two panels of which one is non-essential
- * and that one can be removed is the space is too small. */
- uint buttons_width;
- uint spacing;
-
- static int normal_min_width = (15 * 22) + (2 * 130);
- static int one_less_panel_min_width = (15 * 22) + 130;
-
- if (w->width >= one_less_panel_min_width) {
- buttons_width = 15 * 22;
- spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
- } else {
- buttons_width = w->width - 130;
- spacing = 0;
- }
- uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
-
- /* Yes, it defines about 27 widgets for this toolbar */
- for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) {
- switch (i) {
- case 4:
- w->widget[i].left = x;
- if (w->width < normal_min_width) {
- w->widget[i].right = x;
- j++;
- continue;
- }
-
- x += 130;
- w->widget[i].right = x - 1;
- break;
-
- case 5: {
- int offset = x - w->widget[i].left;
- w->widget[i + 1].left += offset;
- w->widget[i + 1].right += offset;
- w->widget[i + 2].left += offset;
- w->widget[i + 2].right += offset;
- w->widget[i].left = x;
- x += 130;
- w->widget[i].right = x - 1;
- i += 2;
- } break;
-
- default:
- if (w->widget[i].bottom == 0) continue;
-
- w->widget[i].left = x;
- x += buttons_width / (15 - b);
- w->widget[i].right = x - 1;
- buttons_width -= buttons_width / (15 - b);
- b++;
- break;
- }
-
- if (extra_spacing_at[j] == i) {
- j++;
- uint add = spacing / (lengthof(extra_spacing_at) - j);
- spacing -= add;
- x += add;
- }
- }
- } break;
-
- case WE_MOUSELOOP:
- if (w->IsWidgetLowered(0) != !!_pause_game) {
- w->ToggleWidgetLoweredState(0);
- SetWindowDirty(w);
- }
-
- if (w->IsWidgetLowered(1) != !!_fast_forward) {
- w->ToggleWidgetLoweredState(1);
- SetWindowDirty(w);
- }
- break;
-
- case WE_MESSAGE:
- HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10);
- break;
- }
-}
-
-static const WindowDesc _toolb_scen_desc = {
- 0, 0, 130, 22, 640, 22,
- WC_MAIN_TOOLBAR, WC_NONE,
- WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
- _toolb_scen_widgets,
- ScenEditToolbarWndProc
-};
extern GetNewsStringCallbackProc * const _get_news_string_callback[];
@@ -2036,9 +1180,7 @@
void ShowVitalWindows()
{
- Window *w;
-
- w = AllocateWindowDesc((_game_mode != GM_EDITOR) ? &_toolb_normal_desc : &_toolb_scen_desc);
+ Window *w = AllocateToolbar();
DoZoomInOutWindow(ZOOM_NONE, w);
CLRBITS(w->flags4, WF_WHITE_BORDER_MASK);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/misc.cpp
--- a/src/misc.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/misc.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -6,7 +6,7 @@
#include "openttd.h"
#include "currency.h"
#include "landscape.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "engine.h"
#include "vehicle_gui.h"
diff -r cc77111ebd85 -r 9707ad4c9b60 src/misc_cmd.cpp
--- a/src/misc_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/misc_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -324,11 +324,11 @@
_pause_game += (p1 == 0) ? -1 : 1;
switch (_pause_game) {
- case (byte)-4:
- case (byte)-1:
+ case -4:
+ case -1:
_pause_game = 0;
break;
- case (byte)-3:
+ case -3:
ShowQuery(
STR_NEWGRF_UNPAUSE_WARNING_TITLE,
STR_NEWGRF_UNPAUSE_WARNING,
@@ -359,7 +359,7 @@
#ifndef _DEBUG
if (_networking) return CMD_ERROR;
#endif
- return CommandCost(EXPENSES_OTHER, -(Money)p1);
+ return CommandCost(EXPENSES_OTHER, -(int32)p1);
}
/** Transfer funds (money) from one player to another.
diff -r cc77111ebd85 -r 9707ad4c9b60 src/misc_gui.cpp
--- a/src/misc_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/misc_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -92,26 +92,20 @@
static void Place_LandInfo(TileIndex tile)
{
- Player *p;
- Window *w;
- Town *t;
- Money old_money;
- CommandCost costclear;
AcceptedCargo ac;
TileDesc td;
- StringID str;
DeleteWindowById(WC_LAND_INFO, 0);
- w = AllocateWindowDesc(&_land_info_desc);
+ Window *w = AllocateWindowDesc(&_land_info_desc);
WP(w, void_d).data = &_landinfo_data;
- p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
- t = ClosestTownFromTile(tile, _patches.dist_local_authority);
+ Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
+ Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
- old_money = p->player_money;
+ Money old_money = p->player_money;
p->player_money = INT64_MAX;
- costclear = DoCommand(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR);
+ CommandCost costclear = DoCommand(tile, 0, 0, 0, CMD_LANDSCAPE_CLEAR);
p->player_money = old_money;
/* Because build_date is not set yet in every TileDesc, we make sure it is empty */
@@ -126,7 +120,7 @@
if (td.owner != OWNER_NONE && td.owner != OWNER_WATER) GetNameOfOwner(td.owner, tile);
GetString(_landinfo_data[1], STR_01A7_OWNER, lastof(_landinfo_data[1]));
- str = STR_01A4_COST_TO_CLEAR_N_A;
+ StringID str = STR_01A4_COST_TO_CLEAR_N_A;
if (CmdSucceeded(costclear)) {
SetDParam(0, costclear.GetCost());
str = STR_01A5_COST_TO_CLEAR;
@@ -147,36 +141,33 @@
}
GetString(_landinfo_data[4], STR_01A8_LOCAL_AUTHORITY, lastof(_landinfo_data[4]));
- {
- char *p = GetString(_landinfo_data[5], STR_01CE_CARGO_ACCEPTED, lastof(_landinfo_data[5]));
- bool found = false;
+ char *strp = GetString(_landinfo_data[5], STR_01CE_CARGO_ACCEPTED, lastof(_landinfo_data[5]));
+ bool found = false;
- for (CargoID i = 0; i < NUM_CARGO; ++i) {
- if (ac[i] > 0) {
- /* Add a comma between each item. */
- if (found) {
- *p++ = ',';
- *p++ = ' ';
- }
- found = true;
+ for (CargoID i = 0; i < NUM_CARGO; ++i) {
+ if (ac[i] > 0) {
+ /* Add a comma between each item. */
+ if (found) {
+ *strp++ = ',';
+ *strp++ = ' ';
+ }
+ found = true;
- /* If the accepted value is less than 8, show it in 1/8:ths */
- if (ac[i] < 8) {
- SetDParam(0, ac[i]);
- SetDParam(1, GetCargo(i)->name);
- p = GetString(p, STR_01D1_8, lastof(_landinfo_data[5]));
- } else {
- p = GetString(p, GetCargo(i)->name, lastof(_landinfo_data[5]));
- }
+ /* If the accepted value is less than 8, show it in 1/8:ths */
+ if (ac[i] < 8) {
+ SetDParam(0, ac[i]);
+ SetDParam(1, GetCargo(i)->name);
+ strp = GetString(strp, STR_01D1_8, lastof(_landinfo_data[5]));
+ } else {
+ strp = GetString(strp, GetCargo(i)->name, lastof(_landinfo_data[5]));
}
}
-
- if (!found) _landinfo_data[5][0] = '\0';
}
+ if (!found) _landinfo_data[5][0] = '\0';
if (td.build_date != 0) {
SetDParam(0, td.build_date);
- GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6]));
+ GetString(_landinfo_data[6], STR_BUILD_DATE, lastof(_landinfo_data[6]));
} else {
_landinfo_data[6][0] = '\0';
}
@@ -265,40 +256,41 @@
static void AboutWindowProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_CREATE: // Set up window counter and start position of scroller
- WP(w, scroller_d).counter = 5;
- WP(w, scroller_d).height = w->height - 40;
- break;
- case WE_PAINT: {
- uint i;
- int y = WP(w, scroller_d).height;
- DrawWindowWidgets(w);
-
- /* Show original copyright and revision version */
- DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING);
- DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING);
+ case WE_CREATE: // Set up window counter and start position of scroller
+ WP(w, scroller_d).counter = 5;
+ WP(w, scroller_d).height = w->height - 40;
+ break;
- /* Show all scrolling credits */
- for (i = 0; i < lengthof(credits); i++) {
- if (y >= 50 && y < (w->height - 40)) {
- DoDrawString(credits[i], 10, y, TC_BLACK);
- }
- y += 10;
- }
+ case WE_PAINT: {
+ int y = WP(w, scroller_d).height;
+ DrawWindowWidgets(w);
- /* If the last text has scrolled start anew from the start */
- if (y < 50) WP(w, scroller_d).height = w->height - 40;
+ /* Show original copyright and revision version */
+ DrawStringCentered(210, 17, STR_00B6_ORIGINAL_COPYRIGHT, TC_FROMSTRING);
+ DrawStringCentered(210, 17 + 10, STR_00B7_VERSION, TC_FROMSTRING);
- DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK);
- DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING);
- } break;
- case WE_TICK: // Timer to scroll the text and adjust the new top
- if (--WP(w, scroller_d).counter == 0) {
- WP(w, scroller_d).counter = 5;
- WP(w, scroller_d).height--;
- SetWindowDirty(w);
- }
- break;
+ /* Show all scrolling credits */
+ for (uint i = 0; i < lengthof(credits); i++) {
+ if (y >= 50 && y < (w->height - 40)) {
+ DoDrawString(credits[i], 10, y, TC_BLACK);
+ }
+ y += 10;
+ }
+
+ /* If the last text has scrolled start anew from the start */
+ if (y < 50) WP(w, scroller_d).height = w->height - 40;
+
+ DoDrawStringCentered(210, w->height - 25, "Website: http://www.openttd.org", TC_BLACK);
+ DrawStringCentered(210, w->height - 15, STR_00BA_COPYRIGHT_OPENTTD, TC_FROMSTRING);
+ } break;
+
+ case WE_TICK: // Timer to scroll the text and adjust the new top
+ if (--WP(w, scroller_d).counter == 0) {
+ WP(w, scroller_d).counter = 5;
+ WP(w, scroller_d).height--;
+ SetWindowDirty(w);
+ }
+ break;
}
}
@@ -343,82 +335,83 @@
static void BuildTreesWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT: {
- int x,y;
- int i, count;
-
- DrawWindowWidgets(w);
+ case WE_PAINT: {
+ int i, count;
- WP(w, tree_d).base = i = _tree_base_by_landscape[_opt.landscape];
- WP(w, tree_d).count = count = _tree_count_by_landscape[_opt.landscape];
+ DrawWindowWidgets(w);
- x = 18;
- y = 54;
- do {
- DrawSprite(_tree_sprites[i].sprite, _tree_sprites[i].pal, x, y);
- x += 35;
- if (!(++i & 3)) {
- x -= 35 * 4;
- y += 47;
+ WP(w, tree_d).base = i = _tree_base_by_landscape[_opt.landscape];
+ WP(w, tree_d).count = count = _tree_count_by_landscape[_opt.landscape];
+
+ int x = 18;
+ int y = 54;
+ do {
+ DrawSprite(_tree_sprites[i].sprite, _tree_sprites[i].pal, x, y);
+ x += 35;
+ if (!(++i & 3)) {
+ x -= 35 * 4;
+ y += 47;
+ }
+ } while (--count);
+ } break;
+
+ case WE_CLICK: {
+ int wid = e->we.click.widget;
+
+ switch (wid) {
+ case 0:
+ ResetObjectToPlace();
+ break;
+
+ case 3: case 4: case 5: case 6:
+ case 7: case 8: case 9: case 10:
+ case 11:case 12: case 13: case 14:
+ if (wid - 3 >= WP(w, tree_d).count) break;
+
+ if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL)) {
+ _tree_to_plant = WP(w, tree_d).base + wid - 3;
+ }
+ break;
+
+ case 15: // tree of random type.
+ if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL)) {
+ _tree_to_plant = -1;
+ }
+ break;
+
+ case 16: // place trees randomly over the landscape
+ w->LowerWidget(16);
+ w->flags4 |= 5 << WF_TIMEOUT_SHL;
+ SndPlayFx(SND_15_BEEP);
+ PlaceTreesRandomly();
+ MarkWholeScreenDirty();
+ break;
}
- } while (--count);
- } break;
-
- case WE_CLICK: {
- int wid = e->we.click.widget;
+ } break;
- switch (wid) {
- case 0:
- ResetObjectToPlace();
- break;
-
- case 3: case 4: case 5: case 6:
- case 7: case 8: case 9: case 10:
- case 11:case 12: case 13: case 14:
- if (wid - 3 >= WP(w, tree_d).count) break;
-
- if (HandlePlacePushButton(w, wid, SPR_CURSOR_TREE, VHM_RECT, NULL))
- _tree_to_plant = WP(w, tree_d).base + wid - 3;
+ case WE_PLACE_OBJ:
+ VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES);
+ VpSetPlaceSizingLimit(20);
break;
- case 15: // tree of random type.
- if (HandlePlacePushButton(w, 15, SPR_CURSOR_TREE, VHM_RECT, NULL))
- _tree_to_plant = -1;
+ case WE_PLACE_DRAG:
+ VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
+ return;
+
+ case WE_PLACE_MOUSEUP:
+ if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) {
+ DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL,
+ CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
+ }
break;
- case 16: // place trees randomly over the landscape
- w->LowerWidget(16);
- w->flags4 |= 5 << WF_TIMEOUT_SHL;
- SndPlayFx(SND_15_BEEP);
- PlaceTreesRandomly();
- MarkWholeScreenDirty();
+ case WE_TIMEOUT:
+ w->RaiseWidget(16);
break;
- }
- } break;
-
- case WE_PLACE_OBJ:
- VpStartPlaceSizing(e->we.place.tile, VPM_X_AND_Y_LIMITED, DDSP_PLANT_TREES);
- VpSetPlaceSizingLimit(20);
- break;
- case WE_PLACE_DRAG:
- VpSelectTilesWithMethod(e->we.place.pt.x, e->we.place.pt.y, e->we.place.select_method);
- return;
-
- case WE_PLACE_MOUSEUP:
- if (e->we.place.pt.x != -1 && e->we.place.select_proc == DDSP_PLANT_TREES) {
- DoCommandP(e->we.place.tile, _tree_to_plant, e->we.place.starttile, NULL,
- CMD_PLANT_TREE | CMD_MSG(STR_2805_CAN_T_PLANT_TREE_HERE));
- }
- break;
-
- case WE_TIMEOUT:
- w->RaiseWidget(16);
- break;
-
- case WE_ABORT_PLACE_OBJ:
- w->RaiseButtons();
- break;
+ case WE_ABORT_PLACE_OBJ:
+ w->RaiseButtons();
+ break;
}
}
@@ -513,70 +506,72 @@
static void ErrmsgWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT:
- CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
- DrawWindowWidgets(w);
- CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
+ case WE_PAINT:
+ CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
+ DrawWindowWidgets(w);
+ CopyInDParam(0, _errmsg_decode_params, lengthof(_errmsg_decode_params));
- /* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
- * If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
- */
- SwitchToErrorRefStack();
- RewindTextRefStack();
+ /* If the error message comes from a NewGRF, we must use the text ref. stack reserved for error messages.
+ * If the message doesn't come from a NewGRF, it won't use the TTDP-style text ref. stack, so we won't hurt anything
+ */
+ SwitchToErrorRefStack();
+ RewindTextRefStack();
- if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) {
- DrawStringMultiCenter(
- 120,
- (_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15),
- _errmsg_message_2,
- w->width - 2);
- if (_errmsg_message_1 != INVALID_STRING_ID)
+ if (!IsWindowOfPrototype(w, _errmsg_face_widgets)) {
DrawStringMultiCenter(
120,
- 30,
- _errmsg_message_1,
+ (_errmsg_message_1 == INVALID_STRING_ID ? 25 : 15),
+ _errmsg_message_2,
w->width - 2);
- } else {
- const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2));
- DrawPlayerFace(p->face, p->player_color, 2, 16);
+ if (_errmsg_message_1 != INVALID_STRING_ID) {
+ DrawStringMultiCenter(
+ 120,
+ 30,
+ _errmsg_message_1,
+ w->width - 2);
+ }
+ } else {
+ const Player *p = GetPlayer((PlayerID)GetDParamX(_errmsg_decode_params,2));
+ DrawPlayerFace(p->face, p->player_color, 2, 16);
- DrawStringMultiCenter(
- 214,
- (_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45),
- _errmsg_message_2,
- w->width - 2);
- if (_errmsg_message_1 != INVALID_STRING_ID)
DrawStringMultiCenter(
214,
- 90,
- _errmsg_message_1,
+ (_errmsg_message_1 == INVALID_STRING_ID ? 65 : 45),
+ _errmsg_message_2,
w->width - 2);
- }
-
- /* Switch back to the normal text ref. stack for NewGRF texts */
- SwitchToNormalRefStack();
- break;
-
- case WE_MOUSELOOP:
- if (_right_button_down) DeleteWindow(w);
- break;
+ if (_errmsg_message_1 != INVALID_STRING_ID) {
+ DrawStringMultiCenter(
+ 214,
+ 90,
+ _errmsg_message_1,
+ w->width - 2);
+ }
+ }
- case WE_4:
- if (--_errmsg_duration == 0) DeleteWindow(w);
- break;
+ /* Switch back to the normal text ref. stack for NewGRF texts */
+ SwitchToNormalRefStack();
+ break;
- case WE_DESTROY:
- SetRedErrorSquare(0);
- _switch_mode_errorstr = INVALID_STRING_ID;
- break;
+ case WE_MOUSELOOP:
+ if (_right_button_down) DeleteWindow(w);
+ break;
- case WE_KEYPRESS:
- if (e->we.keypress.keycode == WKC_SPACE) {
- /* Don't continue. */
- e->we.keypress.cont = false;
- DeleteWindow(w);
- }
- break;
+ case WE_4:
+ if (--_errmsg_duration == 0) DeleteWindow(w);
+ break;
+
+ case WE_DESTROY:
+ SetRedErrorSquare(0);
+ _switch_mode_errorstr = INVALID_STRING_ID;
+ break;
+
+ case WE_KEYPRESS:
+ if (e->we.keypress.keycode == WKC_SPACE) {
+ /* Don't continue. */
+ e->we.keypress.cont = false;
+ DeleteWindow(w);
+ }
+ break;
}
}
@@ -588,8 +583,7 @@
DeleteWindowById(WC_ERRMSG, 0);
- //assert(msg_2);
- if (msg_2 == 0) msg_2 = STR_EMPTY;
+ if (msg_2 == STR_NULL) msg_2 = STR_EMPTY;
_errmsg_message_1 = msg_1;
_errmsg_message_2 = msg_2;
@@ -598,8 +592,7 @@
if (!_errmsg_duration) return;
if (_errmsg_message_1 != STR_013B_OWNED_BY || GetDParamX(_errmsg_decode_params,2) >= 8) {
-
- if ( (x|y) != 0) {
+ if ((x | y) != 0) {
pt = RemapCoords2(x, y);
vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
@@ -617,7 +610,7 @@
}
w = AllocateWindow(pt.x, pt.y, 240, 46, ErrmsgWndProc, WC_ERRMSG, _errmsg_widgets);
} else {
- if ( (x|y) != 0) {
+ if ((x | y) != 0) {
pt = RemapCoords2(x, y);
vp = FindWindowById(WC_MAIN_WINDOW, 0)->viewport;
pt.x = Clamp(UnScaleByZoom(pt.x - vp->virtual_left, vp->zoom) + vp->left - (334/2), 0, _screen.width - 334);
@@ -699,17 +692,15 @@
static void TooltipsWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT: {
- uint arg;
+ case WE_PAINT:
GfxFillRect(0, 0, w->width - 1, w->height - 1, 0);
GfxFillRect(1, 1, w->width - 2, w->height - 2, 0x44);
- for (arg = 0; arg < WP(w, tooltips_d).paramcount; arg++) {
+ for (uint arg = 0; arg < WP(w, tooltips_d).paramcount; arg++) {
SetDParam(arg, WP(w, tooltips_d).params[arg]);
}
DrawStringMultiCenter((w->width >> 1), (w->height >> 1) - 5, WP(w, tooltips_d).string_id, w->width - 2);
break;
- }
case WE_MOUSELOOP:
/* We can show tooltips while dragging tools. These are shown as long as
@@ -731,21 +722,16 @@
* added to a tooltip; currently only supports parameters of {NUM} (integer) */
void GuiShowTooltipsWithArgs(StringID str, uint paramcount, const uint64 params[])
{
- char buffer[512];
- Dimension br;
- Window *w;
- uint i;
- int x, y;
-
DeleteWindowById(WC_TOOLTIPS, 0);
/* We only show measurement tooltips with patch setting on */
if (str == STR_NULL || (paramcount != 0 && !_patches.measure_tooltip)) return;
- for (i = 0; i != paramcount; i++) SetDParam(i, params[i]);
+ for (uint i = 0; i != paramcount; i++) SetDParam(i, params[i]);
+ char buffer[512];
GetString(buffer, str, lastof(buffer));
- br = GetStringBoundingBox(buffer);
+ Dimension br = GetStringBoundingBox(buffer);
br.width += 6; br.height += 4; // increase slightly to have some space around the box
/* Cut tooltip length to 200 pixels max, wrap to new line if longer */
@@ -757,11 +743,11 @@
/* Correctly position the tooltip position, watch out for window and cursor size
* Clamp value to below main toolbar and above statusbar. If tooltip would
* go below window, flip it so it is shown above the cursor */
- y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12);
+ int y = Clamp(_cursor.pos.y + _cursor.size.y + _cursor.offs.y + 5, 22, _screen.height - 12);
if (y + br.height > _screen.height - 12) y = _cursor.pos.y + _cursor.offs.y - br.height - 5;
- x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width);
+ int x = Clamp(_cursor.pos.x - (br.width >> 1), 0, _screen.width - br.width);
- w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets);
+ Window *w = AllocateWindow(x, y, br.width, br.height, TooltipsWndProc, WC_TOOLTIPS, _tooltips_widgets);
WP(w, tooltips_d).string_id = str;
assert(sizeof(WP(w, tooltips_d).params[0]) == sizeof(params[0]));
@@ -863,14 +849,12 @@
static void DelChar(Textbuf *tb, bool backspace)
{
WChar c;
- uint width;
- size_t len;
char *s = tb->buf + tb->caretpos;
if (backspace) s = Utf8PrevChar(s);
- len = Utf8Decode(&c, s);
- width = GetCharacterWidth(FS_NORMAL, c);
+ size_t len = Utf8Decode(&c, s);
+ uint width = GetCharacterWidth(FS_NORMAL, c);
tb->width -= width;
if (backspace) {
@@ -949,35 +933,38 @@
bool MoveTextBufferPos(Textbuf *tb, int navmode)
{
switch (navmode) {
- case WKC_LEFT:
- if (tb->caretpos != 0) {
- WChar c;
- const char *s = Utf8PrevChar(tb->buf + tb->caretpos);
- Utf8Decode(&c, s);
- tb->caretpos = s - tb->buf; // -= (tb->buf + tb->caretpos - s)
- tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c);
+ case WKC_LEFT:
+ if (tb->caretpos != 0) {
+ WChar c;
+ const char *s = Utf8PrevChar(tb->buf + tb->caretpos);
+ Utf8Decode(&c, s);
+ tb->caretpos = s - tb->buf; // -= (tb->buf + tb->caretpos - s)
+ tb->caretxoffs -= GetCharacterWidth(FS_NORMAL, c);
+ return true;
+ }
+ break;
+
+ case WKC_RIGHT:
+ if (tb->caretpos < tb->length) {
+ WChar c;
+
+ tb->caretpos += Utf8Decode(&c, tb->buf + tb->caretpos);
+ tb->caretxoffs += GetCharacterWidth(FS_NORMAL, c);
+
+ return true;
+ }
+ break;
+
+ case WKC_HOME:
+ tb->caretpos = 0;
+ tb->caretxoffs = 0;
return true;
- }
- break;
- case WKC_RIGHT:
- if (tb->caretpos < tb->length) {
- WChar c;
- tb->caretpos += Utf8Decode(&c, tb->buf + tb->caretpos);
- tb->caretxoffs += GetCharacterWidth(FS_NORMAL, c);
-
+ case WKC_END:
+ tb->caretpos = tb->length;
+ tb->caretxoffs = tb->width;
return true;
- }
- break;
- case WKC_HOME:
- tb->caretpos = 0;
- tb->caretxoffs = 0;
- return true;
- case WKC_END:
- tb->caretpos = tb->length;
- tb->caretxoffs = tb->width;
- return true;
}
return false;
@@ -1029,32 +1016,33 @@
e->we.keypress.cont = false;
switch (e->we.keypress.keycode) {
- case WKC_ESC: return 2;
- case WKC_RETURN: case WKC_NUM_ENTER: return 1;
- case (WKC_CTRL | 'V'):
- if (InsertTextBufferClipboard(&string->text))
- w->InvalidateWidget(wid);
- break;
- case (WKC_CTRL | 'U'):
- DeleteTextBufferAll(&string->text);
- w->InvalidateWidget(wid);
- break;
- case WKC_BACKSPACE: case WKC_DELETE:
- if (DeleteTextBufferChar(&string->text, e->we.keypress.keycode))
+ case WKC_ESC: return 2;
+
+ case WKC_RETURN: case WKC_NUM_ENTER: return 1;
+
+ case (WKC_CTRL | 'V'):
+ if (InsertTextBufferClipboard(&string->text)) w->InvalidateWidget(wid);
+ break;
+
+ case (WKC_CTRL | 'U'):
+ DeleteTextBufferAll(&string->text);
w->InvalidateWidget(wid);
- break;
- case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
- if (MoveTextBufferPos(&string->text, e->we.keypress.keycode))
- w->InvalidateWidget(wid);
- break;
- default:
- if (IsValidChar(e->we.keypress.key, string->afilter)) {
- if (InsertTextBufferChar(&string->text, e->we.keypress.key)) {
- w->InvalidateWidget(wid);
+ break;
+
+ case WKC_BACKSPACE: case WKC_DELETE:
+ if (DeleteTextBufferChar(&string->text, e->we.keypress.keycode)) w->InvalidateWidget(wid);
+ break;
+
+ case WKC_LEFT: case WKC_RIGHT: case WKC_END: case WKC_HOME:
+ if (MoveTextBufferPos(&string->text, e->we.keypress.keycode)) w->InvalidateWidget(wid);
+ break;
+
+ default:
+ if (IsValidChar(e->we.keypress.key, string->afilter)) {
+ if (InsertTextBufferChar(&string->text, e->we.keypress.key)) w->InvalidateWidget(wid);
+ } else { // key wasn't caught. Continue only if standard entry specified
+ e->we.keypress.cont = (string->afilter == CS_ALPHANUMERAL);
}
- } else { // key wasn't caught. Continue only if standard entry specified
- e->we.keypress.cont = (string->afilter == CS_ALPHANUMERAL);
- }
}
return 0;
@@ -1084,15 +1072,18 @@
const Widget *wi = &w->widget[wid];
const Textbuf *tb = &string->text;
+ assert((wi->type & WWT_MASK) == WWT_EDITBOX);
+
GfxFillRect(wi->left + 1, wi->top + 1, wi->right - 1, wi->bottom - 1, 215);
/* Limit the drawing of the string inside the widget boundaries */
if (!FillDrawPixelInfo(&dpi,
- wi->left + 4,
- wi->top + 1,
- wi->right - wi->left - 4,
- wi->bottom - wi->top - 1)
- ) return;
+ wi->left + 4,
+ wi->top + 1,
+ wi->right - wi->left - 4,
+ wi->bottom - wi->top - 1)) {
+ return;
+ }
old_dpi = _cur_dpi;
_cur_dpi = &dpi;
@@ -1135,6 +1126,10 @@
case WE_CLICK:
switch (e->we.click.widget) {
+ case QUERY_STR_WIDGET_TEXT:
+ ShowOnScreenKeyboard(w, &WP(w, querystr_d), QUERY_STR_WIDGET_TEXT, QUERY_STR_WIDGET_CANCEL, QUERY_STR_WIDGET_OK);
+ break;
+
case QUERY_STR_WIDGET_OK:
press_ok:;
if (qs->orig == NULL || strcmp(qs->text.buf, qs->orig) != 0) {
@@ -1188,7 +1183,7 @@
{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
{ WWT_CAPTION, RESIZE_NONE, 14, 11, 259, 0, 13, STR_012D, STR_NULL},
{ WWT_PANEL, RESIZE_NONE, 14, 0, 259, 14, 29, 0x0, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, 14, 2, 257, 16, 27, 0x0, STR_NULL},
+{ WWT_EDITBOX, RESIZE_NONE, 14, 2, 257, 16, 27, 0x0, STR_NULL},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 129, 30, 41, STR_012E_CANCEL, STR_NULL},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 130, 259, 30, 41, STR_012F_OK, STR_NULL},
{ WIDGETS_END},
@@ -1202,7 +1197,8 @@
QueryStringWndProc
};
-static char _edit_str_buf[64];
+char _edit_str_buf[64];
+char _orig_str_buf[lengthof(_edit_str_buf)];
/** Show a query popup window with a textbox in it.
* @param str StringID for the text shown in the textbox
@@ -1215,8 +1211,6 @@
* @param afilter filters out unwanted character input */
void ShowQueryString(StringID str, StringID caption, uint maxlen, uint maxwidth, Window *parent, CharSetFilter afilter)
{
- static char orig_str_buf[lengthof(_edit_str_buf)];
- Window *w;
uint realmaxlen = maxlen & ~0x1000;
assert(realmaxlen < lengthof(_edit_str_buf));
@@ -1224,7 +1218,7 @@
DeleteWindowById(WC_QUERY_STRING, 0);
DeleteWindowById(WC_SAVELOAD, 0);
- w = AllocateWindowDesc(&_query_string_desc);
+ Window *w = AllocateWindowDesc(&_query_string_desc);
w->parent = parent;
GetString(_edit_str_buf, str, lastof(_edit_str_buf));
@@ -1233,8 +1227,8 @@
if (maxlen & 0x1000) {
WP(w, querystr_d).orig = NULL;
} else {
- strecpy(orig_str_buf, _edit_str_buf, lastof(orig_str_buf));
- WP(w, querystr_d).orig = orig_str_buf;
+ strecpy(_orig_str_buf, _edit_str_buf, lastof(_orig_str_buf));
+ WP(w, querystr_d).orig = _orig_str_buf;
}
w->LowerWidget(QUERY_STR_WIDGET_TEXT);
@@ -1379,7 +1373,7 @@
{ WWT_INSET, RESIZE_RB, 14, 2, 243, 50, 150, 0x0, STR_400A_LIST_OF_DRIVES_DIRECTORIES},
{ WWT_SCROLLBAR, RESIZE_LRB, 14, 245, 256, 60, 151, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
{ WWT_PANEL, RESIZE_RTB, 14, 0, 256, 152, 167, 0x0, STR_NULL},
-{ WWT_PANEL, RESIZE_RTB, 14, 2, 254, 154, 165, 0x0, STR_400B_CURRENTLY_SELECTED_NAME},
+{ WWT_EDITBOX, RESIZE_RTB, 14, 2, 254, 154, 165, STR_SAVE_OSKTITLE,STR_400B_CURRENTLY_SELECTED_NAME},
{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 127, 168, 179, STR_4003_DELETE, STR_400C_DELETE_THE_CURRENTLY_SELECTED},
{ WWT_PUSHTXTBTN, RESIZE_TB, 14, 128, 244, 168, 179, STR_4002_SAVE, STR_400D_SAVE_THE_CURRENT_GAME_USING},
{ WWT_RESIZEBOX, RESIZE_LRTB, 14, 245, 256, 168, 179, 0x0, STR_RESIZE_BUTTON},
@@ -1451,7 +1445,7 @@
static void GenerateFileName()
{
- /* Check if we are not a specatator who wants to generate a name..
+ /* Check if we are not a spectator who wants to generate a name..
Let's use the name of player #0 for now. */
const Player *p = GetPlayer(IsValidPlayer(_local_player) ? _local_player : PLAYER_FIRST);
@@ -1468,192 +1462,201 @@
static FiosItem o_dir;
switch (e->event) {
- case WE_CREATE: // Set up OPENTTD button
- w->vscroll.cap = 10;
- w->resize.step_width = 2;
- w->resize.step_height = 10;
-
- o_dir.type = FIOS_TYPE_DIRECT;
- switch (_saveload_mode) {
- case SLD_SAVE_GAME:
- case SLD_LOAD_GAME:
- FioGetDirectory(o_dir.name, lengthof(o_dir.name), SAVE_DIR);
- break;
-
- case SLD_SAVE_SCENARIO:
- case SLD_LOAD_SCENARIO:
- FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR);
- break;
-
- case SLD_LOAD_HEIGHTMAP:
- FioGetDirectory(o_dir.name, lengthof(o_dir.name), HEIGHTMAP_DIR);
- break;
-
- default:
- ttd_strlcpy(o_dir.name, _personal_dir, lengthof(o_dir.name));
- }
- break;
-
- case WE_PAINT: {
- int pos;
- int y;
+ case WE_CREATE: // Set up OPENTTD button
+ w->vscroll.cap = 10;
+ w->resize.step_width = 2;
+ w->resize.step_height = 10;
- SetVScrollCount(w, _fios_num);
- DrawWindowWidgets(w);
- DrawFiosTexts(w->width);
-
- if (_savegame_sort_dirty) {
- _savegame_sort_dirty = false;
- MakeSortedSaveGameList();
- }
-
- GfxFillRect(w->widget[7].left + 1, w->widget[7].top + 1, w->widget[7].right, w->widget[7].bottom, 0xD7);
- DrawSortButtonState(w, _savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP);
-
- y = w->widget[7].top + 1;
- for (pos = w->vscroll.pos; pos < _fios_num; pos++) {
- const FiosItem *item = _fios_list + pos;
+ o_dir.type = FIOS_TYPE_DIRECT;
+ switch (_saveload_mode) {
+ case SLD_SAVE_GAME:
+ case SLD_LOAD_GAME:
+ FioGetDirectory(o_dir.name, lengthof(o_dir.name), SAVE_DIR);
+ break;
- DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], w->width - 18);
- y += 10;
- if (y >= w->vscroll.cap * 10 + w->widget[7].top + 1) break;
- }
+ case SLD_SAVE_SCENARIO:
+ case SLD_LOAD_SCENARIO:
+ FioGetDirectory(o_dir.name, lengthof(o_dir.name), SCENARIO_DIR);
+ break;
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
- DrawEditBox(w, &WP(w, querystr_d), 10);
- }
- break;
- }
+ case SLD_LOAD_HEIGHTMAP:
+ FioGetDirectory(o_dir.name, lengthof(o_dir.name), HEIGHTMAP_DIR);
+ break;
- case WE_CLICK:
- switch (e->we.click.widget) {
- case 2: // Sort save names by name
- _savegame_sort_order = (_savegame_sort_order == SORT_BY_NAME) ?
- SORT_BY_NAME | SORT_DESCENDING : SORT_BY_NAME;
- _savegame_sort_dirty = true;
- SetWindowDirty(w);
+ default:
+ ttd_strlcpy(o_dir.name, _personal_dir, lengthof(o_dir.name));
+ }
break;
- case 3: // Sort save names by date
- _savegame_sort_order = (_savegame_sort_order == SORT_BY_DATE) ?
- SORT_BY_DATE | SORT_DESCENDING : SORT_BY_DATE;
- _savegame_sort_dirty = true;
- SetWindowDirty(w);
- break;
-
- case 6: // OpenTTD 'button', jumps to OpenTTD directory
- FiosBrowseTo(&o_dir);
- SetWindowDirty(w);
- BuildFileList();
- break;
-
- case 7: { // Click the listbox
- int y = (e->we.click.pt.y - w->widget[e->we.click.widget].top - 1) / 10;
- char *name;
- const FiosItem *file;
-
- if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return;
-
- file = _fios_list + y;
+ case WE_PAINT: {
+ int pos;
+ int y;
- name = FiosBrowseTo(file);
- if (name != NULL) {
- if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
- _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD;
-
- SetFiosType(file->type);
- ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
- ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+ SetVScrollCount(w, _fios_num);
+ DrawWindowWidgets(w);
+ DrawFiosTexts(w->width);
- DeleteWindow(w);
- } else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
- SetFiosType(file->type);
- ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
- ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+ if (_savegame_sort_dirty) {
+ _savegame_sort_dirty = false;
+ MakeSortedSaveGameList();
+ }
- DeleteWindow(w);
- ShowHeightmapLoad();
- } else {
- /* SLD_SAVE_GAME, SLD_SAVE_SCENARIO copy clicked name to editbox */
- ttd_strlcpy(WP(w, querystr_d).text.buf, file->title, WP(w, querystr_d).text.maxlength);
- UpdateTextBufferSize(&WP(w, querystr_d).text);
- w->InvalidateWidget(10);
- }
- } else {
- /* Changed directory, need repaint. */
- SetWindowDirty(w);
- BuildFileList();
+ GfxFillRect(w->widget[7].left + 1, w->widget[7].top + 1, w->widget[7].right, w->widget[7].bottom, 0xD7);
+ DrawSortButtonState(w, _savegame_sort_order & SORT_BY_NAME ? 2 : 3, _savegame_sort_order & SORT_DESCENDING ? SBS_DOWN : SBS_UP);
+
+ y = w->widget[7].top + 1;
+ for (pos = w->vscroll.pos; pos < _fios_num; pos++) {
+ const FiosItem *item = _fios_list + pos;
+
+ DoDrawStringTruncated(item->title, 4, y, _fios_colors[item->type], w->width - 18);
+ y += 10;
+ if (y >= w->vscroll.cap * 10 + w->widget[7].top + 1) break;
+ }
+
+ if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+ DrawEditBox(w, &WP(w, querystr_d), 10);
}
break;
}
- case 11: case 12: // Delete, Save game
- break;
- }
- break;
- case WE_MOUSELOOP:
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
- HandleEditBox(w, &WP(w, querystr_d), 10);
- }
- break;
- case WE_KEYPRESS:
- if (e->we.keypress.keycode == WKC_ESC) {
- DeleteWindow(w);
- return;
- }
+ case WE_CLICK:
+ switch (e->we.click.widget) {
+ case 2: // Sort save names by name
+ _savegame_sort_order = (_savegame_sort_order == SORT_BY_NAME) ?
+ SORT_BY_NAME | SORT_DESCENDING : SORT_BY_NAME;
+ _savegame_sort_dirty = true;
+ SetWindowDirty(w);
+ break;
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
- if (HandleEditBoxKey(w, &WP(w, querystr_d), 10, e) == 1) // Press Enter
- w->HandleButtonClick(12);
- }
- break;
- case WE_TIMEOUT:
- /* This test protects against using widgets 11 and 12 which are only available
- * in those two saveload mode */
- if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break;
+ case 3: // Sort save names by date
+ _savegame_sort_order = (_savegame_sort_order == SORT_BY_DATE) ?
+ SORT_BY_DATE | SORT_DESCENDING : SORT_BY_DATE;
+ _savegame_sort_dirty = true;
+ SetWindowDirty(w);
+ break;
- if (w->IsWidgetLowered(11)) { // Delete button clicked
- if (!FiosDelete(WP(w, querystr_d).text.buf)) {
- ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0);
- } else {
- BuildFileList();
- /* Reset file name to current date on successful delete */
- if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName();
+ case 6: // OpenTTD 'button', jumps to OpenTTD directory
+ FiosBrowseTo(&o_dir);
+ SetWindowDirty(w);
+ BuildFileList();
+ break;
+
+ case 7: { // Click the listbox
+ int y = (e->we.click.pt.y - w->widget[e->we.click.widget].top - 1) / 10;
+ char *name;
+ const FiosItem *file;
+
+ if (y < 0 || (y += w->vscroll.pos) >= w->vscroll.count) return;
+
+ file = _fios_list + y;
+
+ name = FiosBrowseTo(file);
+ if (name != NULL) {
+ if (_saveload_mode == SLD_LOAD_GAME || _saveload_mode == SLD_LOAD_SCENARIO) {
+ _switch_mode = (_game_mode == GM_EDITOR) ? SM_LOAD_SCENARIO : SM_LOAD;
+
+ SetFiosType(file->type);
+ ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
+ ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+
+ DeleteWindow(w);
+ } else if (_saveload_mode == SLD_LOAD_HEIGHTMAP) {
+ SetFiosType(file->type);
+ ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
+ ttd_strlcpy(_file_to_saveload.title, file->title, sizeof(_file_to_saveload.title));
+
+ DeleteWindow(w);
+ ShowHeightmapLoad();
+ } else {
+ /* SLD_SAVE_GAME, SLD_SAVE_SCENARIO copy clicked name to editbox */
+ ttd_strlcpy(WP(w, querystr_d).text.buf, file->title, WP(w, querystr_d).text.maxlength);
+ UpdateTextBufferSize(&WP(w, querystr_d).text);
+ w->InvalidateWidget(10);
+ }
+ } else {
+ /* Changed directory, need repaint. */
+ SetWindowDirty(w);
+ BuildFileList();
+ }
+ break;
+ }
+
+ case 10: // edit box
+ ShowOnScreenKeyboard(w, &WP(w, querystr_d), e->we.click.widget, 0, 0);
+ break;
+
+ case 11: case 12: // Delete, Save game
+ break;
+ }
+ break;
+
+ case WE_MOUSELOOP:
+ if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+ HandleEditBox(w, &WP(w, querystr_d), 10);
+ }
+ break;
+
+ case WE_KEYPRESS:
+ if (e->we.keypress.keycode == WKC_ESC) {
+ DeleteWindow(w);
+ return;
}
- UpdateTextBufferSize(&WP(w, querystr_d).text);
- SetWindowDirty(w);
- } else if (w->IsWidgetLowered(12)) { // Save button clicked
- _switch_mode = SM_SAVE;
- FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name));
+ if ((_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) &&
+ HandleEditBoxKey(w, &WP(w, querystr_d), 10, e) == 1) { // Press Enter
+ w->HandleButtonClick(12);
+ }
+ break;
- /* In the editor set up the vehicle engines correctly (date might have changed) */
- if (_game_mode == GM_EDITOR) StartupEngines();
- }
- break;
- case WE_DESTROY:
- /* pause is only used in single-player, non-editor mode, non menu mode */
- if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {
- DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
- }
- FiosFreeSavegameList();
- ClrBit(_no_scroll, SCROLL_SAVE);
- break;
- case WE_RESIZE: {
- /* Widget 2 and 3 have to go with halve speed, make it so obiwan */
- uint diff = e->we.sizing.diff.x / 2;
- w->widget[2].right += diff;
- w->widget[3].left += diff;
- w->widget[3].right += e->we.sizing.diff.x;
+ case WE_TIMEOUT:
+ /* This test protects against using widgets 11 and 12 which are only available
+ * in those two saveload mode */
+ if (!(_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO)) break;
- /* Same for widget 11 and 12 in save-dialog */
- if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
- w->widget[11].right += diff;
- w->widget[12].left += diff;
- w->widget[12].right += e->we.sizing.diff.x;
- }
+ if (w->IsWidgetLowered(11)) { // Delete button clicked
+ if (!FiosDelete(WP(w, querystr_d).text.buf)) {
+ ShowErrorMessage(INVALID_STRING_ID, STR_4008_UNABLE_TO_DELETE_FILE, 0, 0);
+ } else {
+ BuildFileList();
+ /* Reset file name to current date on successful delete */
+ if (_saveload_mode == SLD_SAVE_GAME) GenerateFileName();
+ }
- w->vscroll.cap += e->we.sizing.diff.y / 10;
+ UpdateTextBufferSize(&WP(w, querystr_d).text);
+ SetWindowDirty(w);
+ } else if (w->IsWidgetLowered(12)) { // Save button clicked
+ _switch_mode = SM_SAVE;
+ FiosMakeSavegameName(_file_to_saveload.name, WP(w, querystr_d).text.buf, sizeof(_file_to_saveload.name));
+
+ /* In the editor set up the vehicle engines correctly (date might have changed) */
+ if (_game_mode == GM_EDITOR) StartupEngines();
+ }
+ break;
+
+ case WE_DESTROY:
+ /* pause is only used in single-player, non-editor mode, non menu mode */
+ if (!_networking && _game_mode != GM_EDITOR && _game_mode != GM_MENU) {
+ if (_pause_game >= 0) DoCommandP(0, 0, 0, NULL, CMD_PAUSE);
+ }
+ FiosFreeSavegameList();
+ ClrBit(_no_scroll, SCROLL_SAVE);
+ break;
+
+ case WE_RESIZE: {
+ /* Widget 2 and 3 have to go with halve speed, make it so obiwan */
+ uint diff = e->we.sizing.diff.x / 2;
+ w->widget[2].right += diff;
+ w->widget[3].left += diff;
+ w->widget[3].right += e->we.sizing.diff.x;
+
+ /* Same for widget 11 and 12 in save-dialog */
+ if (_saveload_mode == SLD_SAVE_GAME || _saveload_mode == SLD_SAVE_SCENARIO) {
+ w->widget[11].right += diff;
+ w->widget[12].left += diff;
+ w->widget[12].right += e->we.sizing.diff.x;
+ }
+
+ w->vscroll.cap += e->we.sizing.diff.y / 10;
} break;
}
}
@@ -1726,7 +1729,7 @@
/* pause is only used in single-player, non-editor mode, non-menu mode. It
* will be unpaused in the WE_DESTROY event handler. */
if (_game_mode != GM_MENU && !_networking && _game_mode != GM_EDITOR) {
- DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
+ if (_pause_game >= 0) DoCommandP(0, 1, 0, NULL, CMD_PAUSE);
}
BuildFileList();
@@ -1768,10 +1771,17 @@
}
}
+/**
+ * The 'amount' to cheat with.
+ * This variable is semantically a constant value, but because the cheat
+ * code requires to be able to write to the variable it is not constified.
+ */
+static int32 _money_cheat_amount = 10000000;
+
static int32 ClickMoneyCheat(int32 p1, int32 p2)
{
- DoCommandP(0, 10000000, 0, NULL, CMD_MONEY_CHEAT);
- return true;
+ DoCommandP(0, (uint32)(p2 * _money_cheat_amount), 0, NULL, CMD_MONEY_CHEAT);
+ return _money_cheat_amount;
}
/**
@@ -1827,38 +1837,24 @@
typedef int32 CheckButtonClick(int32, int32);
-enum ce_flags_long
-{
- CE_NONE = 0,
- CE_CLICK = 1 << 0,
- CE_END = 1 << 1,
-};
-
-/** Define basic enum properties */
-template <> struct EnumPropsT : MakeEnumPropsT {};
-typedef TinyEnumT ce_flags;
-
-
struct CheatEntry {
VarType type; ///< type of selector
- ce_flags flags; ///< selector flags
StringID str; ///< string with descriptive text
void *variable; ///< pointer to the variable
bool *been_used; ///< has this cheat been used before?
CheckButtonClick *proc;///< procedure
- int16 min, max; ///< range for spinbox setting
};
static const CheatEntry _cheats_ui[] = {
- {SLE_BOOL, {CE_CLICK}, STR_CHEAT_MONEY, &_cheats.money.value, &_cheats.money.been_used, &ClickMoneyCheat, 0, 0},
- {SLE_UINT8, {CE_NONE}, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat, 0, 11},
- {SLE_BOOL, {CE_NONE}, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL, 0, 0},
- {SLE_BOOL, {CE_NONE}, STR_CHEAT_CROSSINGTUNNELS,&_cheats.crossing_tunnels.value,&_cheats.crossing_tunnels.been_used,NULL, 0, 0},
- {SLE_BOOL, {CE_NONE}, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL, 0, 0},
- {SLE_BOOL, {CE_NONE}, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL, 0, 0},
- {SLE_BOOL, {CE_NONE}, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL, 0, 0},
- {SLE_UINT8, {CE_NONE}, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat,-1, 4},
- {SLE_INT32, {CE_NONE}, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat, -1, 1},
+ {SLE_INT32, STR_CHEAT_MONEY, &_money_cheat_amount, &_cheats.money.been_used, &ClickMoneyCheat },
+ {SLE_UINT8, STR_CHEAT_CHANGE_PLAYER, &_local_player, &_cheats.switch_player.been_used, &ClickChangePlayerCheat },
+ {SLE_BOOL, STR_CHEAT_EXTRA_DYNAMITE, &_cheats.magic_bulldozer.value, &_cheats.magic_bulldozer.been_used, NULL },
+ {SLE_BOOL, STR_CHEAT_CROSSINGTUNNELS, &_cheats.crossing_tunnels.value, &_cheats.crossing_tunnels.been_used, NULL },
+ {SLE_BOOL, STR_CHEAT_BUILD_IN_PAUSE, &_cheats.build_in_pause.value, &_cheats.build_in_pause.been_used, NULL },
+ {SLE_BOOL, STR_CHEAT_NO_JETCRASH, &_cheats.no_jetcrash.value, &_cheats.no_jetcrash.been_used, NULL },
+ {SLE_BOOL, STR_CHEAT_SETUP_PROD, &_cheats.setup_prod.value, &_cheats.setup_prod.been_used, NULL },
+ {SLE_UINT8, STR_CHEAT_SWITCH_CLIMATE, &_opt.landscape, &_cheats.switch_climate.been_used, &ClickChangeClimateCheat},
+ {SLE_INT32, STR_CHEAT_CHANGE_DATE, &_cur_year, &_cheats.change_date.been_used, &ClickChangeDateCheat },
};
@@ -1873,123 +1869,97 @@
static void CheatsWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT: {
- int clk = WP(w, def_d).data_1;
- int x, y;
- int i;
-
- DrawWindowWidgets(w);
-
- DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, w->width - 50);
-
- x = 0;
- y = 45;
-
- for (i = 0; i != lengthof(_cheats_ui); i++) {
- const CheatEntry *ce = &_cheats_ui[i];
+ case WE_PAINT: {
+ int clk = WP(w, def_d).data_1;
- DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2);
-
- switch (ce->type) {
- case SLE_BOOL: {
- bool on = (*(bool*)ce->variable);
+ DrawWindowWidgets(w);
+ DrawStringMultiCenter(200, 25, STR_CHEATS_WARNING, w->width - 50);
- if (ce->flags & CE_CLICK) {
- DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, 0, (clk - (i * 2) == 1) ? FR_LOWERED : FR_NONE);
- if (i == 0) { // XXX - hack/hack for first element which is increase money. Told ya it's a mess
- SetDParam(0, 10000000);
- } else {
- SetDParam(0, false);
- }
- } else {
- DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE);
- SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
+ for (int i = 0, x = 0, y = 45; i != lengthof(_cheats_ui); i++) {
+ const CheatEntry *ce = &_cheats_ui[i];
+
+ DrawSprite((*ce->been_used) ? SPR_BOX_CHECKED : SPR_BOX_EMPTY, PAL_NONE, x + 5, y + 2);
+
+ switch (ce->type) {
+ case SLE_BOOL: {
+ bool on = (*(bool*)ce->variable);
+
+ DrawFrameRect(x + 20, y + 1, x + 30 + 9, y + 9, on ? 6 : 4, on ? FR_LOWERED : FR_NONE);
+ SetDParam(0, on ? STR_CONFIG_PATCHES_ON : STR_CONFIG_PATCHES_OFF);
+ } break;
+
+ default: {
+ int32 val = (int32)ReadValue(ce->variable, ce->type);
+ char buf[512];
+
+ /* Draw [<][>] boxes for settings of an integer-type */
+ DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true);
+
+ switch (ce->str) {
+ /* Display date for change date cheat */
+ case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break;
+
+ /* Draw colored flag for change player cheat */
+ case STR_CHEAT_CHANGE_PLAYER:
+ SetDParam(0, val);
+ GetString(buf, STR_CHEAT_CHANGE_PLAYER, lastof(buf));
+ DrawPlayerIcon(_current_player, 60 + GetStringBoundingBox(buf).width, y + 2);
+ break;
+
+ /* Set correct string for switch climate cheat */
+ case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE;
+
+ /* Fallthrough */
+ default: SetDParam(0, val);
+ }
+ } break;
}
- } break;
- default: {
- int32 val = (int32)ReadValue(ce->variable, ce->type);
- char buf[512];
-
- /* Draw [<][>] boxes for settings of an integer-type */
- DrawArrowButtons(x + 20, y, 3, clk - (i * 2), true, true);
- switch (ce->str) {
- /* Display date for change date cheat */
- case STR_CHEAT_CHANGE_DATE: SetDParam(0, _date); break;
- /* Draw colored flag for change player cheat */
- case STR_CHEAT_CHANGE_PLAYER:
- SetDParam(0, val);
- GetString(buf, STR_CHEAT_CHANGE_PLAYER, lastof(buf));
- DrawPlayerIcon(_current_player, 60 + GetStringBoundingBox(buf).width, y + 2);
- break;
- /* Set correct string for switch climate cheat */
- case STR_CHEAT_SWITCH_CLIMATE: val += STR_TEMPERATE_LANDSCAPE;
- /* Fallthrough */
- default: SetDParam(0, val);
- }
- } break;
+ DrawString(50, y + 1, ce->str, TC_FROMSTRING);
+
+ y += 12;
}
-
- DrawString(50, y + 1, ce->str, TC_FROMSTRING);
-
- y += 12;
+ break;
}
- break;
- }
- case WE_CLICK: {
- const CheatEntry *ce;
+ case WE_CLICK: {
uint btn = (e->we.click.pt.y - 46) / 12;
- int32 value, oldvalue;
uint x = e->we.click.pt.x;
- /* not clicking a button? */
+ /* Not clicking a button? */
if (!IsInsideMM(x, 20, 40) || btn >= lengthof(_cheats_ui)) break;
- ce = &_cheats_ui[btn];
- oldvalue = value = (int32)ReadValue(ce->variable, ce->type);
+ const CheatEntry *ce = &_cheats_ui[btn];
+ int value = (int32)ReadValue(ce->variable, ce->type);
+ int oldvalue = value;
*ce->been_used = true;
switch (ce->type) {
- case SLE_BOOL:
- if (ce->flags & CE_CLICK) WP(w, def_d).data_1 = btn * 2 + 1;
- value ^= 1;
- if (ce->proc != NULL) ce->proc(value, 0);
- break;
- default: {
- /* Add a dynamic step-size to the scroller. In a maximum of
- * 50-steps you should be able to get from min to max */
- uint16 step = ((ce->max - ce->min) / 20);
- if (step == 0) step = 1;
+ case SLE_BOOL:
+ value ^= 1;
+ if (ce->proc != NULL) ce->proc(value, 0);
+ break;
- /* Increase or decrease the value and clamp it to extremes */
- value += (x >= 30) ? step : -step;
- value = Clamp(value, ce->min, ce->max);
+ default:
+ /* Take whatever the function returns */
+ value = ce->proc(value + ((x >= 30) ? 1 : -1), (x >= 30) ? 1 : -1);
- /* take whatever the function returns */
- value = ce->proc(value, (x >= 30) ? 1 : -1);
-
- if (value != oldvalue) {
- WP(w, def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0);
- }
- } break;
+ if (value != oldvalue) WP(w, def_d).data_1 = btn * 2 + 1 + ((x >= 30) ? 1 : 0);
+ break;
}
- if (value != oldvalue) {
- WriteValue(ce->variable, ce->type, (int64)value);
- SetWindowDirty(w);
- }
+ if (value != oldvalue) WriteValue(ce->variable, ce->type, (int64)value);
w->flags4 |= 5 << WF_TIMEOUT_SHL;
SetWindowDirty(w);
- }
- break;
- case WE_TIMEOUT:
- WP(w, def_d).data_1 = 0;
- SetWindowDirty(w);
- break;
+ } break;
+
+ case WE_TIMEOUT:
+ WP(w, def_d).data_1 = 0;
+ SetWindowDirty(w);
+ break;
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/music/win32_m.cpp
--- a/src/music/win32_m.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/music/win32_m.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
HANDLE wait_obj;
HANDLE thread;
UINT_PTR devid;
- char start_song[260];
+ char start_song[MAX_PATH];
} _midi;
static FMusicDriver_Win32 iFMusicDriver_Win32;
@@ -46,28 +46,34 @@
SetEvent(_midi.wait_obj);
}
-static MCIERROR CDECL MidiSendCommand(const char* cmd, ...)
+static MCIERROR CDECL MidiSendCommand(const TCHAR* cmd, ...)
{
va_list va;
- char buf[512];
+ TCHAR buf[512];
va_start(va, cmd);
- vsnprintf(buf, lengthof(buf), cmd, va);
+ _vsntprintf(buf, lengthof(buf), cmd, va);
va_end(va);
- return mciSendStringA(buf, NULL, 0, 0);
+ return mciSendString(buf, NULL, 0, 0);
}
static bool MidiIntPlaySong(const char *filename)
{
- MidiSendCommand("close all");
- if (MidiSendCommand("open \"%s\" type sequencer alias song", filename) != 0) return false;
+ MidiSendCommand(_T("close all"));
- return MidiSendCommand("play song from 0") == 0;
+ if (MidiSendCommand(_T("open \"%s\" type sequencer alias song"), OTTD2FS(filename)) != 0) {
+ /* Let's try the "short name" */
+ TCHAR buf[MAX_PATH];
+ if (GetShortPathName(OTTD2FS(filename), buf, MAX_PATH) == 0) return false;
+ if (MidiSendCommand(_T("open \"%s\" type sequencer alias song"), buf) != 0) return false;
+ }
+
+ return MidiSendCommand(_T("play song from 0")) == 0;
}
static void MidiIntStopSong()
{
- MidiSendCommand("close all");
+ MidiSendCommand(_T("close all"));
}
static void MidiIntSetVolume(int vol)
diff -r cc77111ebd85 -r 9707ad4c9b60 src/namegen.cpp
--- a/src/namegen.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/namegen.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -5,7 +5,7 @@
#include "stdafx.h"
#include "openttd.h"
#include "debug.h"
-#include "namegen.h"
+#include "namegen_func.h"
#include "string_func.h"
#include "table/namegen.h"
diff -r cc77111ebd85 -r 9707ad4c9b60 src/namegen.h
--- a/src/namegen.h Thu Mar 27 05:15:06 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,12 +0,0 @@
-/* $Id$ */
-
-/** @file namegen.h Town name generator stuff. */
-
-#ifndef NAMEGEN_H
-#define NAMEGEN_H
-
-typedef byte TownNameGenerator(char *buf, uint32 seed, const char *last);
-
-extern TownNameGenerator * const _town_name_generators[];
-
-#endif /* NAMEGEN_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/namegen_func.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/namegen_func.h Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+/** @file namegen.h Town name generator stuff. */
+
+#ifndef NAMEGEN_H
+#define NAMEGEN_H
+
+typedef byte TownNameGenerator(char *buf, uint32 seed, const char *last);
+
+extern TownNameGenerator * const _town_name_generators[];
+
+#endif /* NAMEGEN_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/network/core/config.h
--- a/src/network/core/config.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/network/core/config.h Fri Mar 28 10:32:55 2008 +0000
@@ -47,7 +47,7 @@
*/
NETWORK_MAX_GRF_COUNT = 55,
- NETWORK_NUM_LANGUAGES = 29, ///< Number of known languages (to the network protocol) + 1 for 'any'.
+ NETWORK_NUM_LANGUAGES = 36, ///< Number of known languages (to the network protocol) + 1 for 'any'.
/**
* The number of landscapes in OpenTTD.
* This number must be equal to NUM_LANDSCAPE, but as this number is used
diff -r cc77111ebd85 -r 9707ad4c9b60 src/network/network_data.cpp
--- a/src/network/network_data.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/network/network_data.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -79,7 +79,7 @@
/* And we queue it for delivery to the clients */
NetworkTCPSocketHandler *cs;
FOR_ALL_CLIENTS(cs) {
- if (cs->status > STATUS_AUTH) NetworkAddCommandQueue(cs, &c);
+ if (cs->status > STATUS_MAP_WAIT) NetworkAddCommandQueue(cs, &c);
}
return;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/network/network_gui.cpp
--- a/src/network/network_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/network/network_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -35,6 +35,7 @@
#define BTC 15
struct chatquerystr_d : public querystr_d {
+ DestType dtype;
int dest;
};
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(chatquerystr_d));
@@ -59,7 +60,7 @@
/* Global to remember sorting after window has been closed */
static Listing _ng_sorting;
-static char _edit_str_buf[150];
+static char _edit_str_net_buf[150];
static bool _chat_tab_completion_active;
static void ShowNetworkStartServerWindow();
@@ -254,58 +255,57 @@
list_d *ld = &WP(w, network_ql_d).l;
switch (e->event) {
- case WE_CREATE: // Focus input box
- w->vscroll.cap = 13;
- w->resize.step_height = NET_PRC__SIZE_OF_ROW;
-
- nd->field = NGWW_PLAYER;
- nd->server = NULL;
-
- WP(w, network_ql_d).sort_list = NULL;
- ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE);
- ld->sort_type = _ng_sorting.criteria;
- break;
-
- case WE_PAINT: {
- const NetworkGameList *sel = nd->server;
- const SortButtonState arrow = (ld->flags & VL_DESC) ? SBS_DOWN : SBS_UP;
-
- if (ld->flags & VL_REBUILD) {
- BuildNetworkGameList(&WP(w, network_ql_d));
- SetVScrollCount(w, ld->list_length);
- }
- if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d));
+ case WE_CREATE: // Focus input box
+ w->vscroll.cap = 13;
+ w->resize.step_height = NET_PRC__SIZE_OF_ROW;
- /* 'Refresh' button invisible if no server selected */
- w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL);
- /* 'Join' button disabling conditions */
- w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server
- !sel->online || // Server offline
- sel->info.clients_on >= sel->info.clients_max || // Server full
- !sel->info.compatible); // Revision mismatch
-
- /* 'NewGRF Settings' button invisible if no NewGRF is used */
- w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
- !sel->online ||
- sel->info.grfconfig == NULL);
+ nd->field = NGWW_PLAYER;
+ nd->server = NULL;
- SetDParam(0, 0x00);
- SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
- DrawWindowWidgets(w);
-
- /* Edit box to set player name */
- DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
+ WP(w, network_ql_d).sort_list = NULL;
+ ld->flags = VL_REBUILD | (_ng_sorting.order ? VL_DESC : VL_NONE);
+ ld->sort_type = _ng_sorting.criteria;
+ break;
- DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
+ case WE_PAINT: {
+ const NetworkGameList *sel = nd->server;
+ const SortButtonState arrow = (ld->flags & VL_DESC) ? SBS_DOWN : SBS_UP;
- /* Sort based on widgets: name, clients, compatibility */
- switch (ld->sort_type) {
- case NGWW_NAME - NGWW_NAME: DrawSortButtonState(w, NGWW_NAME, arrow); break;
- case NGWW_CLIENTS - NGWW_NAME: DrawSortButtonState(w, NGWW_CLIENTS, arrow); break;
- case NGWW_INFO - NGWW_NAME: DrawSortButtonState(w, NGWW_INFO, arrow); break;
- }
+ if (ld->flags & VL_REBUILD) {
+ BuildNetworkGameList(&WP(w, network_ql_d));
+ SetVScrollCount(w, ld->list_length);
+ }
+ if (ld->flags & VL_RESORT) SortNetworkGameList(&WP(w, network_ql_d));
- { // draw list of games
+ /* 'Refresh' button invisible if no server selected */
+ w->SetWidgetDisabledState(NGWW_REFRESH, sel == NULL);
+ /* 'Join' button disabling conditions */
+ w->SetWidgetDisabledState(NGWW_JOIN, sel == NULL || // no Selected Server
+ !sel->online || // Server offline
+ sel->info.clients_on >= sel->info.clients_max || // Server full
+ !sel->info.compatible); // Revision mismatch
+
+ /* 'NewGRF Settings' button invisible if no NewGRF is used */
+ w->SetWidgetHiddenState(NGWW_NEWGRF, sel == NULL ||
+ !sel->online ||
+ sel->info.grfconfig == NULL);
+
+ SetDParam(0, 0x00);
+ SetDParam(1, _lan_internet_types_dropdown[_network_lan_internet]);
+ DrawWindowWidgets(w);
+
+ /* Edit box to set player name */
+ DrawEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
+
+ DrawString(w->widget[NGWW_PLAYER].left - 100, 23, STR_NETWORK_PLAYER_NAME, TC_GOLD);
+
+ /* Sort based on widgets: name, clients, compatibility */
+ switch (ld->sort_type) {
+ case NGWW_NAME - NGWW_NAME: DrawSortButtonState(w, NGWW_NAME, arrow); break;
+ case NGWW_CLIENTS - NGWW_NAME: DrawSortButtonState(w, NGWW_CLIENTS, arrow); break;
+ case NGWW_INFO - NGWW_NAME: DrawSortButtonState(w, NGWW_INFO, arrow); break;
+ }
+
uint16 y = NET_PRC__OFFSET_TOP_WIDGET + 3;
int32 n = 0;
int32 pos = w->vscroll.pos;
@@ -346,258 +346,270 @@
y += NET_PRC__SIZE_OF_ROW;
if (++n == w->vscroll.cap) break; // max number of games in the window
}
- }
- /* Draw the right menu */
- GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157);
- if (sel == NULL) {
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
- } else if (!sel->online) {
- SetDParamStr(0, sel->info.server_name);
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name
+ /* Draw the right menu */
+ GfxFillRect(w->widget[NGWW_DETAILS].left + 1, 43, w->widget[NGWW_DETAILS].right - 1, 92, 157);
+ if (sel == NULL) {
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 58, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
+ } else if (!sel->online) {
+ SetDParamStr(0, sel->info.server_name);
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 68, STR_ORANGE, TC_FROMSTRING); // game name
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline
- } else { // show game info
- uint16 y = 100;
- const uint16 x = w->widget[NGWW_DETAILS].left + 5;
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 132, STR_NETWORK_SERVER_OFFLINE, TC_FROMSTRING); // server offline
+ } else { // show game info
+ uint16 y = 100;
+ const uint16 x = w->widget[NGWW_DETAILS].left + 5;
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, 48, STR_NETWORK_GAME_INFO, TC_FROMSTRING);
- SetDParamStr(0, sel->info.server_name);
- DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name
-
- SetDParamStr(0, sel->info.map_name);
- DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name
-
- SetDParam(0, sel->info.clients_on);
- SetDParam(1, sel->info.clients_max);
- SetDParam(2, sel->info.companies_on);
- SetDParam(3, sel->info.companies_max);
- DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
- y += 10;
-
- SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
- DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language
- y += 10;
-
- SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set);
- DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset
- y += 10;
-
- SetDParam(0, sel->info.map_width);
- SetDParam(1, sel->info.map_height);
- DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size
- y += 10;
+ SetDParamStr(0, sel->info.server_name);
+ DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 62, STR_ORANGE, TC_BLACK); // game name
- SetDParamStr(0, sel->info.server_revision);
- DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version
- y += 10;
-
- SetDParamStr(0, sel->info.hostname);
- SetDParam(1, sel->port);
- DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address
- y += 10;
-
- SetDParam(0, sel->info.start_date);
- DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date
- y += 10;
+ SetDParamStr(0, sel->info.map_name);
+ DrawStringCenteredTruncated(w->widget[NGWW_DETAILS].left, w->widget[NGWW_DETAILS].right, 74, STR_02BD, TC_BLACK); // map name
- SetDParam(0, sel->info.game_date);
- DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date
- y += 10;
-
- y += 2;
+ SetDParam(0, sel->info.clients_on);
+ SetDParam(1, sel->info.clients_max);
+ SetDParam(2, sel->info.companies_on);
+ SetDParam(3, sel->info.companies_max);
+ DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
+ y += 10;
- if (!sel->info.compatible) {
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch
- } else if (sel->info.clients_on == sel->info.clients_max) {
- /* Show: server full, when clients_on == clients_max */
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full
- } else if (sel->info.use_password) {
- DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning
+ SetDParam(0, STR_NETWORK_LANG_ANY + sel->info.server_lang);
+ DrawString(x, y, STR_NETWORK_LANGUAGE, TC_GOLD); // server language
+ y += 10;
+
+ SetDParam(0, STR_TEMPERATE_LANDSCAPE + sel->info.map_set);
+ DrawString(x, y, STR_NETWORK_TILESET, TC_GOLD); // tileset
+ y += 10;
+
+ SetDParam(0, sel->info.map_width);
+ SetDParam(1, sel->info.map_height);
+ DrawString(x, y, STR_NETWORK_MAP_SIZE, TC_GOLD); // map size
+ y += 10;
+
+ SetDParamStr(0, sel->info.server_revision);
+ DrawString(x, y, STR_NETWORK_SERVER_VERSION, TC_GOLD); // server version
+ y += 10;
+
+ SetDParamStr(0, sel->info.hostname);
+ SetDParam(1, sel->port);
+ DrawString(x, y, STR_NETWORK_SERVER_ADDRESS, TC_GOLD); // server address
+ y += 10;
+
+ SetDParam(0, sel->info.start_date);
+ DrawString(x, y, STR_NETWORK_START_DATE, TC_GOLD); // start date
+ y += 10;
+
+ SetDParam(0, sel->info.game_date);
+ DrawString(x, y, STR_NETWORK_CURRENT_DATE, TC_GOLD); // current date
+ y += 10;
+
+ y += 2;
+
+ if (!sel->info.compatible) {
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, sel->info.version_compatible ? STR_NETWORK_GRF_MISMATCH : STR_NETWORK_VERSION_MISMATCH, TC_FROMSTRING); // server mismatch
+ } else if (sel->info.clients_on == sel->info.clients_max) {
+ /* Show: server full, when clients_on == clients_max */
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_SERVER_FULL, TC_FROMSTRING); // server full
+ } else if (sel->info.use_password) {
+ DrawStringCentered(w->widget[NGWW_DETAILS].left + 115, y, STR_NETWORK_PASSWORD, TC_FROMSTRING); // password warning
+ }
+
+ y += 10;
+ }
+ } break;
+
+ case WE_CLICK:
+ nd->field = e->we.click.widget;
+ switch (e->we.click.widget) {
+ case NGWW_PLAYER:
+ ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q, NGWW_PLAYER, 0, 0);
+ break;
+
+ case NGWW_CANCEL: // Cancel button
+ DeleteWindowById(WC_NETWORK_WINDOW, 0);
+ break;
+
+ case NGWW_CONN_BTN: // 'Connection' droplist
+ ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
+ break;
+
+ case NGWW_NAME: // Sort by name
+ case NGWW_CLIENTS: // Sort by connected clients
+ case NGWW_INFO: // Connectivity (green dot)
+ if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC;
+ ld->flags |= VL_RESORT;
+ ld->sort_type = e->we.click.widget - NGWW_NAME;
+
+ _ng_sorting.order = !!(ld->flags & VL_DESC);
+ _ng_sorting.criteria = ld->sort_type;
+ SetWindowDirty(w);
+ break;
+
+ case NGWW_MATRIX: { // Matrix to show networkgames
+ NetworkGameList *cur_item;
+ uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
+
+ if (id_v >= w->vscroll.cap) return; // click out of bounds
+ id_v += w->vscroll.pos;
+
+ cur_item = _network_game_list;
+ for (; id_v > 0 && cur_item != NULL; id_v--) cur_item = cur_item->next;
+
+ nd->server = cur_item;
+ SetWindowDirty(w);
+ } break;
+
+ case NGWW_FIND: // Find server automatically
+ switch (_network_lan_internet) {
+ case 0: NetworkUDPSearchGame(); break;
+ case 1: NetworkUDPQueryMasterServer(); break;
+ }
+ break;
+
+ case NGWW_ADD: // Add a server
+ ShowQueryString(
+ BindCString(_network_default_ip),
+ STR_NETWORK_ENTER_IP,
+ 31 | 0x1000, // maximum number of characters OR
+ 250, // characters up to this width pixels, whichever is satisfied first
+ w, CS_ALPHANUMERAL);
+ break;
+
+ case NGWW_START: // Start server
+ ShowNetworkStartServerWindow();
+ break;
+
+ case NGWW_JOIN: // Join Game
+ if (nd->server != NULL) {
+ snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip));
+ _network_last_port = nd->server->port;
+ ShowNetworkLobbyWindow(nd->server);
+ }
+ break;
+
+ case NGWW_REFRESH: // Refresh
+ if (nd->server != NULL) NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port);
+ break;
+
+ case NGWW_NEWGRF: // NewGRF Settings
+ if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig);
+ break;
+ }
+ break;
+
+ case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
+ switch (e->we.dropdown.button) {
+ case NGWW_CONN_BTN:
+ _network_lan_internet = e->we.dropdown.index;
+ break;
+
+ default:
+ NOT_REACHED();
}
- y += 10;
- }
- } break;
-
- case WE_CLICK:
- nd->field = e->we.click.widget;
- switch (e->we.click.widget) {
- case NGWW_CANCEL: // Cancel button
- DeleteWindowById(WC_NETWORK_WINDOW, 0);
- break;
- case NGWW_CONN_BTN: // 'Connection' droplist
- ShowDropDownMenu(w, _lan_internet_types_dropdown, _network_lan_internet, NGWW_CONN_BTN, 0, 0); // do it for widget NSSW_CONN_BTN
- break;
- case NGWW_NAME: // Sort by name
- case NGWW_CLIENTS: // Sort by connected clients
- case NGWW_INFO: // Connectivity (green dot)
- if (ld->sort_type == e->we.click.widget - NGWW_NAME) ld->flags ^= VL_DESC;
- ld->flags |= VL_RESORT;
- ld->sort_type = e->we.click.widget - NGWW_NAME;
-
- _ng_sorting.order = !!(ld->flags & VL_DESC);
- _ng_sorting.criteria = ld->sort_type;
SetWindowDirty(w);
break;
- case NGWW_MATRIX: { // Matrix to show networkgames
- NetworkGameList *cur_item;
- uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET) / NET_PRC__SIZE_OF_ROW;
-
- if (id_v >= w->vscroll.cap) return; // click out of bounds
- id_v += w->vscroll.pos;
-
- cur_item = _network_game_list;
- for (; id_v > 0 && cur_item != NULL; id_v--) cur_item = cur_item->next;
- nd->server = cur_item;
- SetWindowDirty(w);
- } break;
- case NGWW_FIND: // Find server automatically
- switch (_network_lan_internet) {
- case 0: NetworkUDPSearchGame(); break;
- case 1: NetworkUDPQueryMasterServer(); break;
- }
- break;
- case NGWW_ADD: { // Add a server
- ShowQueryString(
- BindCString(_network_default_ip),
- STR_NETWORK_ENTER_IP,
- 31 | 0x1000, // maximum number of characters OR
- 250, // characters up to this width pixels, whichever is satisfied first
- w, CS_ALPHANUMERAL);
- } break;
- case NGWW_START: // Start server
- ShowNetworkStartServerWindow();
- break;
- case NGWW_JOIN: // Join Game
- if (nd->server != NULL) {
- snprintf(_network_last_host, sizeof(_network_last_host), "%s", inet_ntoa(*(struct in_addr *)&nd->server->ip));
- _network_last_port = nd->server->port;
- ShowNetworkLobbyWindow(nd->server);
- }
- break;
- case NGWW_REFRESH: // Refresh
- if (nd->server != NULL)
- NetworkUDPQueryServer(nd->server->info.hostname, nd->server->port);
- break;
- case NGWW_NEWGRF: // NewGRF Settings
- if (nd->server != NULL) ShowNewGRFSettings(false, false, false, &nd->server->info.grfconfig);
+ case WE_MOUSELOOP:
+ if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
break;
- } break;
-
- case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
- switch (e->we.dropdown.button) {
- case NGWW_CONN_BTN:
- _network_lan_internet = e->we.dropdown.index;
- break;
- default:
- NOT_REACHED();
- }
-
- SetWindowDirty(w);
- break;
-
- case WE_MOUSELOOP:
- if (nd->field == NGWW_PLAYER) HandleEditBox(w, &WP(w, network_ql_d).q, NGWW_PLAYER);
- break;
-
- case WE_MESSAGE:
- if (e->we.message.msg != 0) nd->server = NULL;
- ld->flags |= VL_REBUILD;
- SetWindowDirty(w);
- break;
-
- case WE_KEYPRESS:
- if (nd->field != NGWW_PLAYER) {
- if (nd->server != NULL) {
- if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers
- NetworkGameListRemoveItem(nd->server);
- NetworkRebuildHostList();
- nd->server = NULL;
- }
- }
+ case WE_MESSAGE:
+ if (e->we.message.msg != 0) nd->server = NULL;
+ ld->flags |= VL_REBUILD;
+ SetWindowDirty(w);
break;
- }
- if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed
-
- /* The name is only allowed when it starts with a letter! */
- if (_edit_str_buf[0] != '\0' && _edit_str_buf[0] != ' ') {
- ttd_strlcpy(_network_player_name, _edit_str_buf, lengthof(_network_player_name));
- } else {
- ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name));
- }
-
- break;
-
- case WE_ON_EDIT_TEXT:
- NetworkAddServer(e->we.edittext.str);
- NetworkRebuildHostList();
- break;
-
- case WE_RESIZE: {
- w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
+ case WE_KEYPRESS:
+ if (nd->field != NGWW_PLAYER) {
+ if (nd->server != NULL) {
+ if (e->we.keypress.keycode == WKC_DELETE) { // Press 'delete' to remove servers
+ NetworkGameListRemoveItem(nd->server);
+ NetworkRebuildHostList();
+ nd->server = NULL;
+ }
+ }
+ break;
+ }
- w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1;
-
- SetVScrollCount(w, ld->list_length);
-
- int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left;
- int space = (w->width - 4 * widget_width - 25) / 3;
+ if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NGWW_PLAYER, e) == 1) break; // enter pressed
- int offset = 10;
- for (uint i = 0; i < 4; i++) {
- w->widget[NGWW_FIND + i].left = offset;
- offset += widget_width;
- w->widget[NGWW_FIND + i].right = offset;
- offset += space;
- }
- } break;
+ /* The name is only allowed when it starts with a letter! */
+ if (_edit_str_net_buf[0] != '\0' && _edit_str_net_buf[0] != ' ') {
+ ttd_strlcpy(_network_player_name, _edit_str_net_buf, lengthof(_network_player_name));
+ } else {
+ ttd_strlcpy(_network_player_name, "Player", lengthof(_network_player_name));
+ }
- case WE_DESTROY: // Nicely clean up the sort-list
- free(WP(w, network_ql_d).sort_list);
- break;
+ break;
+
+ case WE_ON_EDIT_TEXT:
+ NetworkAddServer(e->we.edittext.str);
+ NetworkRebuildHostList();
+ break;
+
+ case WE_RESIZE: {
+ w->vscroll.cap += e->we.sizing.diff.y / (int)w->resize.step_height;
+
+ w->widget[NGWW_MATRIX].data = (w->vscroll.cap << 8) + 1;
+
+ SetVScrollCount(w, ld->list_length);
+
+ int widget_width = w->widget[NGWW_FIND].right - w->widget[NGWW_FIND].left;
+ int space = (w->width - 4 * widget_width - 25) / 3;
+
+ int offset = 10;
+ for (uint i = 0; i < 4; i++) {
+ w->widget[NGWW_FIND + i].left = offset;
+ offset += widget_width;
+ w->widget[NGWW_FIND + i].right = offset;
+ offset += space;
+ }
+ } break;
+
+ case WE_DESTROY: // Nicely clean up the sort-list
+ free(WP(w, network_ql_d).sort_list);
+ break;
}
}
static const Widget _network_game_window_widgets[] = {
/* TOP */
-{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // NGWW_CLOSE
-{ WWT_CAPTION, RESIZE_RIGHT, BGC, 11, 449, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL},
-{ WWT_PANEL, RESIZE_RB, BGC, 0, 449, 14, 263, 0x0, STR_NULL},
+{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // NGWW_CLOSE
+{ WWT_CAPTION, RESIZE_RIGHT, BGC, 11, 449, 0, 13, STR_NETWORK_MULTIPLAYER, STR_NULL},
+{ WWT_PANEL, RESIZE_RB, BGC, 0, 449, 14, 263, 0x0, STR_NULL},
-{ WWT_TEXT, RESIZE_NONE, BGC, 9, 85, 23, 35, STR_NETWORK_CONNECTION, STR_NULL},
-{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 90, 181, 22, 33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NGWW_CONN_BTN
+{ WWT_TEXT, RESIZE_NONE, BGC, 9, 85, 23, 35, STR_NETWORK_CONNECTION, STR_NULL},
+{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 90, 181, 22, 33, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NGWW_CONN_BTN
-{ WWT_PANEL, RESIZE_LR, BGC, 290, 440, 22, 33, 0x0, STR_NETWORK_ENTER_NAME_TIP}, // NGWW_PLAYER
+{ WWT_EDITBOX, RESIZE_LR, BGC, 290, 440, 22, 33, STR_NETWORK_PLAYER_NAME_OSKTITLE, STR_NETWORK_ENTER_NAME_TIP}, // NGWW_PLAYER
/* LEFT SIDE */
-{ WWT_PUSHTXTBTN, RESIZE_RIGHT, BTC, 10, 70, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, // NGWW_NAME
-{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 71, 150, 42, 53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP}, // NGWW_CLIENTS
-{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 151, 190, 42, 53, STR_EMPTY, STR_NETWORK_INFO_ICONS_TIP}, // NGWW_INFO
+{ WWT_PUSHTXTBTN, RESIZE_RIGHT, BTC, 10, 70, 42, 53, STR_NETWORK_GAME_NAME, STR_NETWORK_GAME_NAME_TIP}, // NGWW_NAME
+{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 71, 150, 42, 53, STR_NETWORK_CLIENTS_CAPTION, STR_NETWORK_CLIENTS_CAPTION_TIP}, // NGWW_CLIENTS
+{ WWT_PUSHTXTBTN, RESIZE_LR, BTC, 151, 190, 42, 53, STR_EMPTY, STR_NETWORK_INFO_ICONS_TIP}, // NGWW_INFO
-{ WWT_MATRIX, RESIZE_RB, BGC, 10, 190, 54, 236, (13 << 8) + 1, STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX
-{ WWT_SCROLLBAR, RESIZE_LRB, BGC, 191, 202, 42, 236, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{ WWT_MATRIX, RESIZE_RB, BGC, 10, 190, 54, 236, (13 << 8) + 1, STR_NETWORK_CLICK_GAME_TO_SELECT}, // NGWW_MATRIX
+{ WWT_SCROLLBAR, RESIZE_LRB, BGC, 191, 202, 42, 236, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
/* RIGHT SIDE */
-{ WWT_PANEL, RESIZE_LRB, BGC, 210, 440, 42, 236, 0x0, STR_NULL}, // NGWW_DETAILS
+{ WWT_PANEL, RESIZE_LRB, BGC, 210, 440, 42, 236, 0x0, STR_NULL}, // NGWW_DETAILS
-{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 215, 315, 215, 226, STR_NETWORK_JOIN_GAME, STR_NULL}, // NGWW_JOIN
-{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 215, 226, STR_NETWORK_REFRESH, STR_NETWORK_REFRESH_TIP}, // NGWW_REFRESH
+{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 215, 315, 215, 226, STR_NETWORK_JOIN_GAME, STR_NULL}, // NGWW_JOIN
+{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 215, 226, STR_NETWORK_REFRESH, STR_NETWORK_REFRESH_TIP}, // NGWW_REFRESH
-{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 197, 208, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL}, // NGWW_NEWGRF
+{ WWT_PUSHTXTBTN, RESIZE_LRTB, BTC, 330, 435, 197, 208, STR_NEWGRF_SETTINGS_BUTTON, STR_NULL}, // NGWW_NEWGRF
/* BOTTOM */
-{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 10, 110, 246, 257, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, // NGWW_FIND
-{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 118, 218, 246, 257, STR_NETWORK_ADD_SERVER, STR_NETWORK_ADD_SERVER_TIP}, // NGWW_ADD
-{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 226, 326, 246, 257, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, // NGWW_START
-{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 334, 434, 246, 257, STR_012E_CANCEL, STR_NULL}, // NGWW_CANCEL
+{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 10, 110, 246, 257, STR_NETWORK_FIND_SERVER, STR_NETWORK_FIND_SERVER_TIP}, // NGWW_FIND
+{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 118, 218, 246, 257, STR_NETWORK_ADD_SERVER, STR_NETWORK_ADD_SERVER_TIP}, // NGWW_ADD
+{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 226, 326, 246, 257, STR_NETWORK_START_SERVER, STR_NETWORK_START_SERVER_TIP}, // NGWW_START
+{ WWT_PUSHTXTBTN, RESIZE_TB, BTC, 334, 434, 246, 257, STR_012E_CANCEL, STR_NULL}, // NGWW_CANCEL
-{ WWT_RESIZEBOX, RESIZE_LRTB, BGC, 438, 449, 252, 263, 0x0, STR_RESIZE_BUTTON },
+{ WWT_RESIZEBOX, RESIZE_LRTB, BGC, 438, 449, 252, 263, 0x0, STR_RESIZE_BUTTON },
{ WIDGETS_END},
};
@@ -613,12 +625,11 @@
void ShowNetworkGameWindow()
{
static bool first = true;
- Window *w;
DeleteWindowById(WC_NETWORK_WINDOW, 0);
/* Only show once */
if (first) {
- char* const *srv;
+ char * const *srv;
first = false;
// add all servers from the config file to our list
@@ -630,13 +641,13 @@
_ng_sorting.order = 0; // sort ascending by default
}
- w = AllocateWindowDesc(&_network_game_window_desc);
+ Window *w = AllocateWindowDesc(&_network_game_window_desc);
if (w != NULL) {
querystr_d *querystr = &WP(w, network_ql_d).q;
- ttd_strlcpy(_edit_str_buf, _network_player_name, lengthof(_edit_str_buf));
+ ttd_strlcpy(_edit_str_net_buf, _network_player_name, lengthof(_edit_str_net_buf));
querystr->afilter = CS_ALPHANUMERAL;
- InitializeTextBuffer(&querystr->text, _edit_str_buf, lengthof(_edit_str_buf), 120);
+ InitializeTextBuffer(&querystr->text, _edit_str_net_buf, lengthof(_edit_str_net_buf), 120);
UpdateNetworkGameWindow(true);
}
@@ -683,242 +694,254 @@
network_d *nd = &WP(w, network_ql_d).n;
switch (e->event) {
- case WE_CREATE: // focus input box
- nd->field = NSSW_GAMENAME;
- _network_game_info.use_password = (_network_server_password[0] != '\0');
- break;
-
- case WE_PAINT: {
- int y = NSSWND_START, pos;
- const FiosItem *item;
-
- /* draw basic widgets */
- SetDParam(1, _connection_types_dropdown[_network_advertise]);
- SetDParam(2, _network_game_info.clients_max);
- SetDParam(3, _network_game_info.companies_max);
- SetDParam(4, _network_game_info.spectators_max);
- SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
- DrawWindowWidgets(w);
-
- /* editbox to set game name */
- DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
-
- /* if password is set, draw red '*' next to 'Set password' button */
- if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED);
-
- /* draw list of maps */
- GfxFillRect(11, 63, 258, 215, 0xD7); // black background of maps list
-
- pos = w->vscroll.pos;
- while (pos < _fios_num + 1) {
- item = _fios_list + pos - 1;
- if (item == nd->map || (pos == 0 && nd->map == NULL))
- GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour
-
- if (pos == 0) {
- DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN);
- } else {
- DoDrawString(item->title, 14, y, _fios_colors[item->type] );
- }
- pos++;
- y += NSSWND_ROWSIZE;
-
- if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
- }
- } break;
-
- case WE_CLICK:
- nd->field = e->we.click.widget;
- switch (e->we.click.widget) {
- case NSSW_CLOSE: // Close 'X'
- case NSSW_CANCEL: // Cancel button
- ShowNetworkGameWindow();
+ case WE_CREATE: // focus input box
+ nd->field = NSSW_GAMENAME;
+ _network_game_info.use_password = (_network_server_password[0] != '\0');
break;
- case NSSW_SETPWD: // Set password button
- nd->widget_id = NSSW_SETPWD;
- ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
+ case WE_PAINT: {
+ int y = NSSWND_START, pos;
+ const FiosItem *item;
+
+ /* draw basic widgets */
+ SetDParam(1, _connection_types_dropdown[_network_advertise]);
+ SetDParam(2, _network_game_info.clients_max);
+ SetDParam(3, _network_game_info.companies_max);
+ SetDParam(4, _network_game_info.spectators_max);
+ SetDParam(5, STR_NETWORK_LANG_ANY + _network_game_info.server_lang);
+ DrawWindowWidgets(w);
+
+ /* editbox to set game name */
+ DrawEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
+
+ /* if password is set, draw red '*' next to 'Set password' button */
+ if (_network_game_info.use_password) DoDrawString("*", 408, 23, TC_RED);
+
+ /* draw list of maps */
+ GfxFillRect(11, 63, 258, 215, 0xD7); // black background of maps list
+
+ pos = w->vscroll.pos;
+ while (pos < _fios_num + 1) {
+ item = _fios_list + pos - 1;
+ if (item == nd->map || (pos == 0 && nd->map == NULL))
+ GfxFillRect(11, y - 1, 258, y + 10, 155); // show highlighted item with a different colour
+
+ if (pos == 0) {
+ DrawString(14, y, STR_4010_GENERATE_RANDOM_NEW_GAME, TC_DARK_GREEN);
+ } else {
+ DoDrawString(item->title, 14, y, _fios_colors[item->type] );
+ }
+ pos++;
+ y += NSSWND_ROWSIZE;
+
+ if (y >= w->vscroll.cap * NSSWND_ROWSIZE + NSSWND_START) break;
+ }
+ } break;
+
+ case WE_CLICK:
+ if (e->we.click.widget != NSSW_CONNTYPE_BTN && e->we.click.widget != NSSW_LANGUAGE_BTN) HideDropDownMenu(w);
+ nd->field = e->we.click.widget;
+ switch (e->we.click.widget) {
+ case NSSW_CLOSE: // Close 'X'
+ case NSSW_CANCEL: // Cancel button
+ ShowNetworkGameWindow();
+ break;
+
+ case NSSW_GAMENAME:
+ ShowOnScreenKeyboard(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, 0, 0);
+ break;
+
+ case NSSW_SETPWD: // Set password button
+ nd->widget_id = NSSW_SETPWD;
+ ShowQueryString(BindCString(_network_server_password), STR_NETWORK_SET_PASSWORD, 20, 250, w, CS_ALPHANUMERAL);
+ break;
+
+ case NSSW_SELMAP: { // Select map
+ int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
+
+ y += w->vscroll.pos;
+ if (y >= w->vscroll.count) return;
+
+ nd->map = (y == 0) ? NULL : _fios_list + y - 1;
+ SetWindowDirty(w);
+ } break;
+
+ case NSSW_CONNTYPE_BTN: // Connection type
+ ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
+ break;
+
+ case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU: // Click on up/down button for number of clients
+ case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU: // Click on up/down button for number of companies
+ case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators
+ /* Don't allow too fast scrolling */
+ if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
+ w->HandleButtonClick(e->we.click.widget);
+ SetWindowDirty(w);
+ switch (e->we.click.widget) {
+ default: NOT_REACHED();
+ case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU:
+ _network_game_info.clients_max = Clamp(_network_game_info.clients_max + e->we.click.widget - NSSW_CLIENTS_TXT, 2, MAX_CLIENTS);
+ break;
+ case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU:
+ _network_game_info.companies_max = Clamp(_network_game_info.companies_max + e->we.click.widget - NSSW_COMPANIES_TXT, 1, MAX_PLAYERS);
+ break;
+ case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU:
+ _network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS);
+ break;
+ }
+ }
+ _left_button_clicked = false;
+ break;
+
+ case NSSW_CLIENTS_TXT: // Click on number of players
+ nd->widget_id = NSSW_CLIENTS_TXT;
+ SetDParam(0, _network_game_info.clients_max);
+ ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, w, CS_NUMERAL);
+ break;
+
+ case NSSW_COMPANIES_TXT: // Click on number of companies
+ nd->widget_id = NSSW_COMPANIES_TXT;
+ SetDParam(0, _network_game_info.companies_max);
+ ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES, 3, 50, w, CS_NUMERAL);
+ break;
+
+ case NSSW_SPECTATORS_TXT: // Click on number of spectators
+ nd->widget_id = NSSW_SPECTATORS_TXT;
+ SetDParam(0, _network_game_info.spectators_max);
+ ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL);
+ break;
+
+ case NSSW_LANGUAGE_BTN: { // Language
+ uint sel = 0;
+ for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
+ if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
+ sel = i;
+ break;
+ }
+ }
+ ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0);
+ } break;
+
+ case NSSW_START: // Start game
+ _is_network_server = true;
+
+ if (nd->map == NULL) { // start random new game
+ ShowGenerateLandscape();
+ } else { // load a scenario
+ char *name = FiosBrowseTo(nd->map);
+ if (name != NULL) {
+ SetFiosType(nd->map->type);
+ _file_to_saveload.filetype = FT_SCENARIO;
+ ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
+ ttd_strlcpy(_file_to_saveload.title, nd->map->title, sizeof(_file_to_saveload.title));
+
+ DeleteWindow(w);
+ SwitchMode(SM_START_SCENARIO);
+ }
+ }
+ break;
+
+ case NSSW_LOAD: // Load game
+ _is_network_server = true;
+ /* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets
+ * copied all the elements of 'load game' and upon closing that, it segfaults */
+ DeleteWindow(w);
+ ShowSaveLoadDialog(SLD_LOAD_GAME);
+ break;
+ }
break;
- case NSSW_SELMAP: { // Select map
- int y = (e->we.click.pt.y - NSSWND_START) / NSSWND_ROWSIZE;
+ case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
+ switch (e->we.dropdown.button) {
+ case NSSW_CONNTYPE_BTN:
+ _network_advertise = (e->we.dropdown.index != 0);
+ break;
+ case NSSW_LANGUAGE_BTN:
+ _network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY;
+ break;
+ default:
+ NOT_REACHED();
+ }
- y += w->vscroll.pos;
- if (y >= w->vscroll.count) return;
-
- nd->map = (y == 0) ? NULL : _fios_list + y - 1;
SetWindowDirty(w);
- } break;
- case NSSW_CONNTYPE_BTN: // Connection type
- ShowDropDownMenu(w, _connection_types_dropdown, _network_advertise, NSSW_CONNTYPE_BTN, 0, 0); // do it for widget NSSW_CONNTYPE_BTN
break;
- case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU: // Click on up/down button for number of clients
- case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU: // Click on up/down button for number of companies
- case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU: // Click on up/down button for number of spectators
- /* Don't allow too fast scrolling */
- if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
- w->HandleButtonClick(e->we.click.widget);
- SetWindowDirty(w);
- switch (e->we.click.widget) {
+
+ case WE_MOUSELOOP:
+ if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
+ break;
+
+ case WE_KEYPRESS:
+ if (nd->field == NSSW_GAMENAME) {
+ if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed
+
+ ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
+ }
+ break;
+
+ case WE_ON_EDIT_TEXT:
+ if (e->we.edittext.str == NULL) break;
+
+ if (nd->widget_id == NSSW_SETPWD) {
+ ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
+ _network_game_info.use_password = (_network_server_password[0] != '\0');
+ } else {
+ int32 value = atoi(e->we.edittext.str);
+ w->InvalidateWidget(nd->widget_id);
+ switch (nd->widget_id) {
default: NOT_REACHED();
- case NSSW_CLIENTS_BTND: case NSSW_CLIENTS_BTNU:
- _network_game_info.clients_max = Clamp(_network_game_info.clients_max + e->we.click.widget - NSSW_CLIENTS_TXT, 2, MAX_CLIENTS);
- break;
- case NSSW_COMPANIES_BTND: case NSSW_COMPANIES_BTNU:
- _network_game_info.companies_max = Clamp(_network_game_info.companies_max + e->we.click.widget - NSSW_COMPANIES_TXT, 1, MAX_PLAYERS);
- break;
- case NSSW_SPECTATORS_BTND: case NSSW_SPECTATORS_BTNU:
- _network_game_info.spectators_max = Clamp(_network_game_info.spectators_max + e->we.click.widget - NSSW_SPECTATORS_TXT, 0, MAX_CLIENTS);
- break;
+ case NSSW_CLIENTS_TXT: _network_game_info.clients_max = Clamp(value, 2, MAX_CLIENTS); break;
+ case NSSW_COMPANIES_TXT: _network_game_info.companies_max = Clamp(value, 1, MAX_PLAYERS); break;
+ case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break;
}
}
- _left_button_clicked = false;
- break;
- case NSSW_CLIENTS_TXT: // Click on number of players
- nd->widget_id = NSSW_CLIENTS_TXT;
- SetDParam(0, _network_game_info.clients_max);
- ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_CLIENTS, 3, 50, w, CS_NUMERAL);
- break;
- case NSSW_COMPANIES_TXT: // Click on number of companies
- nd->widget_id = NSSW_COMPANIES_TXT;
- SetDParam(0, _network_game_info.companies_max);
- ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_COMPANIES, 3, 50, w, CS_NUMERAL);
- break;
- case NSSW_SPECTATORS_TXT: // Click on number of spectators
- nd->widget_id = NSSW_SPECTATORS_TXT;
- SetDParam(0, _network_game_info.spectators_max);
- ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_NETWORK_NUMBER_OF_SPECTATORS, 3, 50, w, CS_NUMERAL);
- break;
- case NSSW_LANGUAGE_BTN: { // Language
- uint sel = 0;
- for (uint i = 0; i < lengthof(_language_dropdown) - 1; i++) {
- if (_language_dropdown[i] == STR_NETWORK_LANG_ANY + _network_game_info.server_lang) {
- sel = i;
- break;
- }
- }
- ShowDropDownMenu(w, _language_dropdown, sel, NSSW_LANGUAGE_BTN, 0, 0);
- break;
- }
- case NSSW_START: // Start game
- _is_network_server = true;
- if (nd->map == NULL) { // start random new game
- ShowGenerateLandscape();
- } else { // load a scenario
- char *name = FiosBrowseTo(nd->map);
- if (name != NULL) {
- SetFiosType(nd->map->type);
- _file_to_saveload.filetype = FT_SCENARIO;
- ttd_strlcpy(_file_to_saveload.name, name, sizeof(_file_to_saveload.name));
- ttd_strlcpy(_file_to_saveload.title, nd->map->title, sizeof(_file_to_saveload.title));
-
- DeleteWindow(w);
- SwitchMode(SM_START_SCENARIO);
- }
- }
+ SetWindowDirty(w);
break;
- case NSSW_LOAD: // Load game
- _is_network_server = true;
- /* XXX - WC_NETWORK_WINDOW (this window) should stay, but if it stays, it gets
- * copied all the elements of 'load game' and upon closing that, it segfaults */
- DeleteWindow(w);
- ShowSaveLoadDialog(SLD_LOAD_GAME);
- break;
- }
- break;
-
- case WE_DROPDOWN_SELECT: // we have selected a dropdown item in the list
- switch (e->we.dropdown.button) {
- case NSSW_CONNTYPE_BTN:
- _network_advertise = (e->we.dropdown.index != 0);
- break;
- case NSSW_LANGUAGE_BTN:
- _network_game_info.server_lang = _language_dropdown[e->we.dropdown.index] - STR_NETWORK_LANG_ANY;
- break;
- default:
- NOT_REACHED();
- }
-
- SetWindowDirty(w);
- break;
-
- case WE_MOUSELOOP:
- if (nd->field == NSSW_GAMENAME) HandleEditBox(w, &WP(w, network_ql_d).q, NSSW_GAMENAME);
- break;
-
- case WE_KEYPRESS:
- if (nd->field == NSSW_GAMENAME) {
- if (HandleEditBoxKey(w, &WP(w, network_ql_d).q, NSSW_GAMENAME, e) == 1) break; // enter pressed
-
- ttd_strlcpy(_network_server_name, WP(w, network_ql_d).q.text.buf, sizeof(_network_server_name));
- }
- break;
-
- case WE_ON_EDIT_TEXT:
- if (e->we.edittext.str == NULL) break;
-
- if (nd->widget_id == NSSW_SETPWD) {
- ttd_strlcpy(_network_server_password, e->we.edittext.str, lengthof(_network_server_password));
- _network_game_info.use_password = (_network_server_password[0] != '\0');
- } else {
- int32 value = atoi(e->we.edittext.str);
- w->InvalidateWidget(nd->widget_id);
- switch (nd->widget_id) {
- default: NOT_REACHED();
- case NSSW_CLIENTS_TXT: _network_game_info.clients_max = Clamp(value, 2, MAX_CLIENTS); break;
- case NSSW_COMPANIES_TXT: _network_game_info.companies_max = Clamp(value, 1, MAX_PLAYERS); break;
- case NSSW_SPECTATORS_TXT: _network_game_info.spectators_max = Clamp(value, 0, MAX_CLIENTS); break;
- }
- }
-
- SetWindowDirty(w);
- break;
}
}
static const Widget _network_start_server_window_widgets[] = {
/* Window decoration and background panel */
-{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // NSSW_CLOSE
-{ WWT_CAPTION, RESIZE_NONE, BGC, 11, 419, 0, 13, STR_NETWORK_START_GAME_WINDOW, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, BGC, 0, 419, 14, 243, 0x0, STR_NULL},
+{ WWT_CLOSEBOX, RESIZE_NONE, BGC, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW }, // NSSW_CLOSE
+{ WWT_CAPTION, RESIZE_NONE, BGC, 11, 419, 0, 13, STR_NETWORK_START_GAME_WINDOW, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, BGC, 0, 419, 14, 243, 0x0, STR_NULL},
/* Set game name and password widgets */
-{ WWT_TEXT, RESIZE_NONE, BGC, 10, 90, 22, 34, STR_NETWORK_NEW_GAME_NAME, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, BGC, 100, 272, 22, 33, 0x0, STR_NETWORK_NEW_GAME_NAME_TIP}, // NSSW_GAMENAME
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 285, 405, 22, 33, STR_NETWORK_SET_PASSWORD, STR_NETWORK_PASSWORD_TIP}, // NSSW_SETPWD
+{ WWT_TEXT, RESIZE_NONE, BGC, 10, 90, 22, 34, STR_NETWORK_NEW_GAME_NAME, STR_NULL},
+{ WWT_EDITBOX, RESIZE_NONE, BGC, 100, 272, 22, 33, STR_NETWORK_NEW_GAME_NAME_OSKTITLE, STR_NETWORK_NEW_GAME_NAME_TIP}, // NSSW_GAMENAME
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 285, 405, 22, 33, STR_NETWORK_SET_PASSWORD, STR_NETWORK_PASSWORD_TIP}, // NSSW_SETPWD
/* List of playable scenarios */
-{ WWT_TEXT, RESIZE_NONE, BGC, 10, 110, 43, 55, STR_NETWORK_SELECT_MAP, STR_NULL},
-{ WWT_INSET, RESIZE_NONE, BGC, 10, 271, 62, 216, STR_NULL, STR_NETWORK_SELECT_MAP_TIP}, // NSSW_SELMAP
-{ WWT_SCROLLBAR, RESIZE_NONE, BGC, 259, 270, 63, 215, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
+{ WWT_TEXT, RESIZE_NONE, BGC, 10, 110, 43, 55, STR_NETWORK_SELECT_MAP, STR_NULL},
+{ WWT_INSET, RESIZE_NONE, BGC, 10, 271, 62, 216, STR_NULL, STR_NETWORK_SELECT_MAP_TIP}, // NSSW_SELMAP
+{ WWT_SCROLLBAR, RESIZE_NONE, BGC, 259, 270, 63, 215, 0x0, STR_0190_SCROLL_BAR_SCROLLS_LIST},
/* Combo/selection boxes to control Connection Type / Max Clients / Max Companies / Max Observers / Language */
-{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 63, 75, STR_NETWORK_CONNECTION, STR_NULL},
-{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 77, 88, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NSSW_CONNTYPE_BTN
-
-{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 95, 107, STR_NETWORK_NUMBER_OF_CLIENTS, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 109, 120, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTND
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 109, 120, STR_NETWORK_CLIENTS_SELECT, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_TXT
-{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 109, 120, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTNU
+{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 63, 75, STR_NETWORK_CONNECTION, STR_NULL},
+{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 77, 88, STR_NETWORK_LAN_INTERNET_COMBO, STR_NETWORK_CONNECTION_TIP}, // NSSW_CONNTYPE_BTN
-{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 127, 139, STR_NETWORK_NUMBER_OF_COMPANIES, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 141, 152, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTND
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 141, 152, STR_NETWORK_COMPANIES_SELECT, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_TXT
-{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 141, 152, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTNU
+{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 95, 107, STR_NETWORK_NUMBER_OF_CLIENTS, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 109, 120, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTND
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 109, 120, STR_NETWORK_CLIENTS_SELECT, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_TXT
+{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 109, 120, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_CLIENTS_TIP}, // NSSW_CLIENTS_BTNU
-{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 159, 171, STR_NETWORK_NUMBER_OF_SPECTATORS, STR_NULL},
-{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 173, 184, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 173, 184, STR_NETWORK_SPECTATORS_SELECT, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT
-{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 173, 184, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU
+{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 127, 139, STR_NETWORK_NUMBER_OF_COMPANIES, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 141, 152, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTND
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 141, 152, STR_NETWORK_COMPANIES_SELECT, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_TXT
+{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 141, 152, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_COMPANIES_TIP}, // NSSW_COMPANIES_BTNU
-{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 191, 203, STR_NETWORK_LANGUAGE_SPOKEN, STR_NULL},
-{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 205, 216, STR_NETWORK_LANGUAGE_COMBO, STR_NETWORK_LANGUAGE_TIP}, // NSSW_LANGUAGE_BTN
+{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 159, 171, STR_NETWORK_NUMBER_OF_SPECTATORS, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, BGC, 280, 291, 173, 184, SPR_ARROW_DOWN, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTND
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BGC, 292, 397, 173, 184, STR_NETWORK_SPECTATORS_SELECT, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_TXT
+{ WWT_IMGBTN, RESIZE_NONE, BGC, 398, 410, 173, 184, SPR_ARROW_UP, STR_NETWORK_NUMBER_OF_SPECTATORS_TIP}, // NSSW_SPECTATORS_BTNU
+
+{ WWT_TEXT, RESIZE_NONE, BGC, 280, 419, 191, 203, STR_NETWORK_LANGUAGE_SPOKEN, STR_NULL},
+{ WWT_DROPDOWNIN, RESIZE_NONE, BGC, 280, 410, 205, 216, STR_NETWORK_LANGUAGE_COMBO, STR_NETWORK_LANGUAGE_TIP}, // NSSW_LANGUAGE_BTN
/* Buttons Start / Load / Cancel */
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 40, 140, 224, 235, STR_NETWORK_START_GAME, STR_NETWORK_START_GAME_TIP}, // NSSW_START
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 150, 250, 224, 235, STR_NETWORK_LOAD_GAME, STR_NETWORK_LOAD_GAME_TIP}, // NSSW_LOAD
-{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 260, 360, 224, 235, STR_012E_CANCEL, STR_NULL}, // NSSW_CANCEL
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 40, 140, 224, 235, STR_NETWORK_START_GAME, STR_NETWORK_START_GAME_TIP}, // NSSW_START
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 150, 250, 224, 235, STR_NETWORK_LOAD_GAME, STR_NETWORK_LOAD_GAME_TIP}, // NSSW_LOAD
+{ WWT_PUSHTXTBTN, RESIZE_NONE, BTC, 260, 360, 224, 235, STR_012E_CANCEL, STR_NULL}, // NSSW_CANCEL
{ WIDGETS_END},
};
@@ -933,11 +956,10 @@
static void ShowNetworkStartServerWindow()
{
- Window *w;
DeleteWindowById(WC_NETWORK_WINDOW, 0);
- w = AllocateWindowDesc(&_network_start_server_window_desc);
- ttd_strlcpy(_edit_str_buf, _network_server_name, lengthof(_edit_str_buf));
+ Window *w = AllocateWindowDesc(&_network_start_server_window_desc);
+ ttd_strlcpy(_edit_str_net_buf, _network_server_name, lengthof(_edit_str_net_buf));
_saveload_mode = SLD_NEW_GAME;
BuildFileList();
@@ -945,16 +967,13 @@
w->vscroll.count = _fios_num + 1;
WP(w, network_ql_d).q.afilter = CS_ALPHANUMERAL;
- InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_buf, lengthof(_edit_str_buf), 160);
+ InitializeTextBuffer(&WP(w, network_ql_d).q.text, _edit_str_net_buf, lengthof(_edit_str_net_buf), 160);
}
static PlayerID NetworkLobbyFindCompanyIndex(byte pos)
{
- PlayerID i;
-
- /* Scroll through all _network_player_info and get the 'pos' item
- that is not empty */
- for (i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
+ /* Scroll through all _network_player_info and get the 'pos' item that is not empty */
+ for (PlayerID i = PLAYER_FIRST; i < MAX_PLAYERS; i++) {
if (_network_player_info[i].company_name[0] != '\0') {
if (pos-- == 0) return i;
}
@@ -989,142 +1008,148 @@
network_d *nd = &WP(w, network_d);
switch (e->event) {
- case WE_CREATE:
- nd->company = INVALID_PLAYER;
- break;
-
- case WE_PAINT: {
- const NetworkGameInfo *gi = &nd->server->info;
- int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
-
- /* Join button is disabled when no company is selected */
- w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER);
- /* Cannot start new company if there are too many */
- w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
- /* Cannot spectate if there are too many spectators */
- w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
-
- /* Draw window widgets */
- SetDParamStr(0, gi->server_name);
- DrawWindowWidgets(w);
-
- /* Draw company list */
- pos = w->vscroll.pos;
- while (pos < gi->companies_on) {
- byte company = NetworkLobbyFindCompanyIndex(pos);
- bool income = false;
- if (nd->company == company)
- GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
-
- DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
- if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
-
- /* If the company's income was positive puts a green dot else a red dot */
- if (_network_player_info[company].income >= 0) income = true;
- DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
-
- pos++;
- y += NET_PRC__SIZE_OF_ROW;
- if (pos >= w->vscroll.cap) break;
- }
-
- /* Draw info about selected company when it is selected in the left window */
- GfxFillRect(174, 39, 403, 75, 157);
- DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
- if (nd->company != INVALID_PLAYER) {
- const uint x = 183;
- const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
- y = 80;
-
- SetDParam(0, nd->server->info.clients_on);
- SetDParam(1, nd->server->info.clients_max);
- SetDParam(2, nd->server->info.companies_on);
- SetDParam(3, nd->server->info.companies_max);
- DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
- y += 10;
-
- SetDParamStr(0, _network_player_info[nd->company].company_name);
- DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].inaugurated_year);
- DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
- y += 10;
+ case WE_CREATE:
+ nd->company = INVALID_PLAYER;
+ break;
- SetDParam(0, _network_player_info[nd->company].company_value);
- DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].money);
- DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].income);
- DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].performance);
- DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].num_vehicle[0]);
- SetDParam(1, _network_player_info[nd->company].num_vehicle[1]);
- SetDParam(2, _network_player_info[nd->company].num_vehicle[2]);
- SetDParam(3, _network_player_info[nd->company].num_vehicle[3]);
- SetDParam(4, _network_player_info[nd->company].num_vehicle[4]);
- DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
- y += 10;
-
- SetDParam(0, _network_player_info[nd->company].num_station[0]);
- SetDParam(1, _network_player_info[nd->company].num_station[1]);
- SetDParam(2, _network_player_info[nd->company].num_station[2]);
- SetDParam(3, _network_player_info[nd->company].num_station[3]);
- SetDParam(4, _network_player_info[nd->company].num_station[4]);
- DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
- y += 10;
+ case WE_PAINT: {
+ const NetworkGameInfo *gi = &nd->server->info;
+ int y = NET_PRC__OFFSET_TOP_WIDGET_COMPANY, pos;
- SetDParamStr(0, _network_player_info[nd->company].players);
- DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
- }
- } break;
-
- case WE_CLICK:
- switch (e->we.click.widget) {
- case NLWW_CLOSE: // Close 'X'
- case NLWW_CANCEL: // Cancel button
- ShowNetworkGameWindow();
- break;
- case NLWW_MATRIX: { // Company list
- uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
-
- if (id_v >= w->vscroll.cap) break;
+ /* Join button is disabled when no company is selected */
+ w->SetWidgetDisabledState(NLWW_JOIN, nd->company == INVALID_PLAYER);
+ /* Cannot start new company if there are too many */
+ w->SetWidgetDisabledState(NLWW_NEW, gi->companies_on >= gi->companies_max);
+ /* Cannot spectate if there are too many spectators */
+ w->SetWidgetDisabledState(NLWW_SPECTATE, gi->spectators_on >= gi->spectators_max);
- id_v += w->vscroll.pos;
- nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
- SetWindowDirty(w);
- } break;
- case NLWW_JOIN: // Join company
- /* Button can be clicked only when it is enabled */
- _network_playas = nd->company;
- NetworkClientConnectGame(_network_last_host, _network_last_port);
- break;
- case NLWW_NEW: // New company
- _network_playas = PLAYER_NEW_COMPANY;
- NetworkClientConnectGame(_network_last_host, _network_last_port);
- break;
- case NLWW_SPECTATE: // Spectate game
- _network_playas = PLAYER_SPECTATOR;
- NetworkClientConnectGame(_network_last_host, _network_last_port);
- break;
- case NLWW_REFRESH: // Refresh
- NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
- NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
- break;
+ /* Draw window widgets */
+ SetDParamStr(0, gi->server_name);
+ DrawWindowWidgets(w);
+
+ /* Draw company list */
+ pos = w->vscroll.pos;
+ while (pos < gi->companies_on) {
+ byte company = NetworkLobbyFindCompanyIndex(pos);
+ bool income = false;
+ if (nd->company == company)
+ GfxFillRect(11, y - 1, 154, y + 10, 10); // show highlighted item with a different colour
+
+ DoDrawStringTruncated(_network_player_info[company].company_name, 13, y, TC_BLACK, 135 - 13);
+ if (_network_player_info[company].use_password != 0) DrawSprite(SPR_LOCK, PAL_NONE, 135, y);
+
+ /* If the company's income was positive puts a green dot else a red dot */
+ if (_network_player_info[company].income >= 0) income = true;
+ DrawSprite(SPR_BLOT, income ? PALETTE_TO_GREEN : PALETTE_TO_RED, 145, y);
+
+ pos++;
+ y += NET_PRC__SIZE_OF_ROW;
+ if (pos >= w->vscroll.cap) break;
+ }
+
+ /* Draw info about selected company when it is selected in the left window */
+ GfxFillRect(174, 39, 403, 75, 157);
+ DrawStringCentered(290, 50, STR_NETWORK_COMPANY_INFO, TC_FROMSTRING);
+ if (nd->company != INVALID_PLAYER) {
+ const uint x = 183;
+ const uint trunc_width = w->widget[NLWW_DETAILS].right - x;
+ y = 80;
+
+ SetDParam(0, nd->server->info.clients_on);
+ SetDParam(1, nd->server->info.clients_max);
+ SetDParam(2, nd->server->info.companies_on);
+ SetDParam(3, nd->server->info.companies_max);
+ DrawString(x, y, STR_NETWORK_CLIENTS, TC_GOLD);
+ y += 10;
+
+ SetDParamStr(0, _network_player_info[nd->company].company_name);
+ DrawStringTruncated(x, y, STR_NETWORK_COMPANY_NAME, TC_GOLD, trunc_width);
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].inaugurated_year);
+ DrawString(x, y, STR_NETWORK_INAUGURATION_YEAR, TC_GOLD); // inauguration year
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].company_value);
+ DrawString(x, y, STR_NETWORK_VALUE, TC_GOLD); // company value
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].money);
+ DrawString(x, y, STR_NETWORK_CURRENT_BALANCE, TC_GOLD); // current balance
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].income);
+ DrawString(x, y, STR_NETWORK_LAST_YEARS_INCOME, TC_GOLD); // last year's income
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].performance);
+ DrawString(x, y, STR_NETWORK_PERFORMANCE, TC_GOLD); // performance
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].num_vehicle[0]);
+ SetDParam(1, _network_player_info[nd->company].num_vehicle[1]);
+ SetDParam(2, _network_player_info[nd->company].num_vehicle[2]);
+ SetDParam(3, _network_player_info[nd->company].num_vehicle[3]);
+ SetDParam(4, _network_player_info[nd->company].num_vehicle[4]);
+ DrawString(x, y, STR_NETWORK_VEHICLES, TC_GOLD); // vehicles
+ y += 10;
+
+ SetDParam(0, _network_player_info[nd->company].num_station[0]);
+ SetDParam(1, _network_player_info[nd->company].num_station[1]);
+ SetDParam(2, _network_player_info[nd->company].num_station[2]);
+ SetDParam(3, _network_player_info[nd->company].num_station[3]);
+ SetDParam(4, _network_player_info[nd->company].num_station[4]);
+ DrawString(x, y, STR_NETWORK_STATIONS, TC_GOLD); // stations
+ y += 10;
+
+ SetDParamStr(0, _network_player_info[nd->company].players);
+ DrawStringTruncated(x, y, STR_NETWORK_PLAYERS, TC_GOLD, trunc_width); // players
+ }
} break;
- case WE_MESSAGE:
- SetWindowDirty(w);
- break;
+ case WE_CLICK:
+ switch (e->we.click.widget) {
+ case NLWW_CLOSE: // Close 'X'
+ case NLWW_CANCEL: // Cancel button
+ ShowNetworkGameWindow();
+ break;
+
+ case NLWW_MATRIX: { // Company list
+ uint32 id_v = (e->we.click.pt.y - NET_PRC__OFFSET_TOP_WIDGET_COMPANY) / NET_PRC__SIZE_OF_ROW;
+
+ if (id_v >= w->vscroll.cap) break;
+
+ id_v += w->vscroll.pos;
+ nd->company = (id_v >= nd->server->info.companies_on) ? INVALID_PLAYER : NetworkLobbyFindCompanyIndex(id_v);
+ SetWindowDirty(w);
+ } break;
+
+ case NLWW_JOIN: // Join company
+ /* Button can be clicked only when it is enabled */
+ _network_playas = nd->company;
+ NetworkClientConnectGame(_network_last_host, _network_last_port);
+ break;
+
+ case NLWW_NEW: // New company
+ _network_playas = PLAYER_NEW_COMPANY;
+ NetworkClientConnectGame(_network_last_host, _network_last_port);
+ break;
+
+ case NLWW_SPECTATE: // Spectate game
+ _network_playas = PLAYER_SPECTATOR;
+ NetworkClientConnectGame(_network_last_host, _network_last_port);
+ break;
+
+ case NLWW_REFRESH: // Refresh
+ NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
+ NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
+ break;
+ }
+ break;
+
+ case WE_MESSAGE:
+ SetWindowDirty(w);
+ break;
}
}
@@ -1164,16 +1189,15 @@
* @param ngl Selected game pointer which is passed to the new window */
static void ShowNetworkLobbyWindow(NetworkGameList *ngl)
{
- Window *w;
DeleteWindowById(WC_NETWORK_WINDOW, 0);
NetworkTCPQueryServer(_network_last_host, _network_last_port); // company info
NetworkUDPQueryServer(_network_last_host, _network_last_port); // general data
- w = AllocateWindowDesc(&_network_lobby_window_desc);
+ Window *w = AllocateWindowDesc(&_network_lobby_window_desc);
if (w != NULL) {
WP(w, network_ql_d).n.server = ngl;
- strcpy(_edit_str_buf, "");
+ strcpy(_edit_str_net_buf, "");
w->vscroll.cap = 10;
}
}
@@ -1247,36 +1271,39 @@
static void ClientList_Ban(byte client_no)
{
- uint i;
uint32 ip = NetworkFindClientInfo(client_no)->client_ip;
- for (i = 0; i < lengthof(_network_ban_list); i++) {
+ for (uint i = 0; i < lengthof(_network_ban_list); i++) {
if (_network_ban_list[i] == NULL) {
_network_ban_list[i] = strdup(inet_ntoa(*(struct in_addr *)&ip));
break;
}
}
- if (client_no < MAX_PLAYERS)
+ if (client_no < MAX_PLAYERS) {
SEND_COMMAND(PACKET_SERVER_ERROR)(DEREF_CLIENT(client_no), NETWORK_ERROR_KICKED);
+ }
}
static void ClientList_GiveMoney(byte client_no)
{
- if (NetworkFindClientInfo(client_no) != NULL)
+ if (NetworkFindClientInfo(client_no) != NULL) {
ShowNetworkGiveMoneyWindow(NetworkFindClientInfo(client_no)->client_playas);
+ }
}
static void ClientList_SpeakToClient(byte client_no)
{
- if (NetworkFindClientInfo(client_no) != NULL)
+ if (NetworkFindClientInfo(client_no) != NULL) {
ShowNetworkChatQueryWindow(DESTTYPE_CLIENT, NetworkFindClientInfo(client_no)->client_index);
+ }
}
static void ClientList_SpeakToCompany(byte client_no)
{
- if (NetworkFindClientInfo(client_no) != NULL)
+ if (NetworkFindClientInfo(client_no) != NULL) {
ShowNetworkChatQueryWindow(DESTTYPE_TEAM, NetworkFindClientInfo(client_no)->client_playas);
+ }
}
static void ClientList_SpeakToAll(byte client_no)
@@ -1286,34 +1313,38 @@
static void ClientList_None(byte client_no)
{
- // No action ;)
+ /* No action ;) */
}
-// Help, a action is clicked! What do we do?
+/**
+ * An action is clicked! What do we do?
+ */
static void HandleClientListPopupClick(byte index, byte clientno)
{
- // A click on the Popup of the ClientList.. handle the command
+ /* A click on the Popup of the ClientList.. handle the command */
if (index < MAX_CLIENTLIST_ACTION && _clientlist_proc[index] != NULL) {
_clientlist_proc[index](clientno);
}
}
-// Finds the amount of clients and set the height correct
+/**
+ * Finds the amount of clients and set the height correct
+ */
static bool CheckClientListHeight(Window *w)
{
int num = 0;
const NetworkClientInfo *ci;
- // Should be replaced with a loop through all clients
+ /* Should be replaced with a loop through all clients */
FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
num++;
}
num *= CLNWND_ROWSIZE;
- // If height is changed
+ /* If height is changed */
if (w->height != CLNWND_OFFSET + num + 1) {
// XXX - magic unfortunately; (num + 2) has to be one bigger than heigh (num + 1)
SetWindowDirty(w);
@@ -1325,13 +1356,15 @@
return true;
}
-// Finds the amount of actions in the popup and set the height correct
+/**
+ * Finds the amount of actions in the popup and set the height correct
+ */
static uint ClientListPopupHeight()
{
- int i, num = 0;
+ int num = 0;
// Find the amount of actions
- for (i = 0; i < MAX_CLIENTLIST_ACTION; i++) {
+ for (int i = 0; i < MAX_CLIENTLIST_ACTION; i++) {
if (_clientlist_action[i][0] == '\0') continue;
if (_clientlist_proc[i] == NULL) continue;
num++;
@@ -1342,21 +1375,25 @@
return num + 1;
}
-// Show the popup (action list)
+/**
+ * Show the popup (action list)
+ */
static Window *PopupClientList(Window *w, int client_no, int x, int y)
{
- int i, h;
+ int i;
const NetworkClientInfo *ci;
DeleteWindowById(WC_TOOLBAR_MENU, 0);
- // Clean the current actions
+ /* Clean the current actions */
for (i = 0; i < MAX_CLIENTLIST_ACTION; i++) {
_clientlist_action[i][0] = '\0';
_clientlist_proc[i] = NULL;
}
- // Fill the actions this client has
- // Watch is, max 50 chars long!
+ /*
+ * Fill the actions this client has.
+ * Watch is, max 50 chars long!
+ */
ci = NetworkFindClientInfo(client_no);
if (ci == NULL) return NULL;
@@ -1382,7 +1419,7 @@
}
}
- // A server can kick clients (but not himself)
+ /* A server can kick clients (but not himself) */
if (_network_server && _network_own_client_index != ci->client_index) {
GetString(_clientlist_action[i], STR_NETWORK_CLIENTLIST_KICK, lastof(_clientlist_action[i]));
_clientlist_proc[i++] = &ClientList_Kick;
@@ -1397,9 +1434,9 @@
}
/* Calculate the height */
- h = ClientListPopupHeight();
+ int h = ClientListPopupHeight();
- // Allocate the popup
+ /* Allocate the popup */
w = AllocateWindow(x, y, 150, h + 1, ClientListPopupWndProc, WC_TOOLBAR_MENU, _client_list_popup_widgets);
w->widget[0].bottom = w->widget[0].top + h;
w->widget[0].right = w->widget[0].left + 150;
@@ -1420,127 +1457,127 @@
static void ClientListPopupWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT: {
- int i, y, sel;
- TextColour colour;
- DrawWindowWidgets(w);
+ case WE_PAINT: {
+ DrawWindowWidgets(w);
- // Draw the actions
- sel = WP(w, menu_d).sel_index;
- y = 1;
- for (i = 0; i < MAX_CLIENTLIST_ACTION; i++, y += CLNWND_ROWSIZE) {
- if (_clientlist_action[i][0] == '\0') continue;
- if (_clientlist_proc[i] == NULL) continue;
+ /* Draw the actions */
+ int sel = WP(w, menu_d).sel_index;
+ int y = 1;
+ for (int i = 0; i < MAX_CLIENTLIST_ACTION; i++, y += CLNWND_ROWSIZE) {
+ if (_clientlist_action[i][0] == '\0') continue;
+ if (_clientlist_proc[i] == NULL) continue;
- if (sel-- == 0) { // Selected item, highlight it
- GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0);
- colour = TC_WHITE;
- } else {
- colour = TC_BLACK;
+ TextColour colour;
+ if (sel-- == 0) { // Selected item, highlight it
+ GfxFillRect(1, y, 150 - 2, y + CLNWND_ROWSIZE - 1, 0);
+ colour = TC_WHITE;
+ } else {
+ colour = TC_BLACK;
+ }
+
+ DoDrawString(_clientlist_action[i], 4, y, colour);
+ }
+ } break;
+
+ case WE_POPUPMENU_SELECT: {
+ /* We selected an action */
+ int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
+
+ if (index >= 0 && e->we.popupmenu.pt.y >= w->top) {
+ HandleClientListPopupClick(index, WP(w, menu_d).main_button);
}
- DoDrawString(_clientlist_action[i], 4, y, colour);
- }
- } break;
-
- case WE_POPUPMENU_SELECT: {
- // We selected an action
- int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
-
- if (index >= 0 && e->we.popupmenu.pt.y >= w->top)
- HandleClientListPopupClick(index, WP(w, menu_d).main_button);
+ DeleteWindowById(WC_TOOLBAR_MENU, 0);
+ } break;
- DeleteWindowById(WC_TOOLBAR_MENU, 0);
- } break;
+ case WE_POPUPMENU_OVER: {
+ /* Our mouse hoovers over an action? Select it! */
+ int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
- case WE_POPUPMENU_OVER: {
- // Our mouse hoovers over an action? Select it!
- int index = (e->we.popupmenu.pt.y - w->top) / CLNWND_ROWSIZE;
+ if (index == -1 || index == WP(w, menu_d).sel_index) return;
- if (index == -1 || index == WP(w, menu_d).sel_index) return;
-
- WP(w, menu_d).sel_index = index;
- SetWindowDirty(w);
- } break;
-
+ WP(w, menu_d).sel_index = index;
+ SetWindowDirty(w);
+ } break;
}
}
-// Main handle for clientlist
+/**
+ * Main handle for clientlist
+ */
static void ClientListWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT: {
- NetworkClientInfo *ci;
- int y, i = 0;
- TextColour colour;
-
- // Check if we need to reset the height
- if (!CheckClientListHeight(w)) break;
-
- DrawWindowWidgets(w);
-
- y = CLNWND_OFFSET;
+ case WE_PAINT: {
+ NetworkClientInfo *ci;
+ int i = 0;
- FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
- if (_selected_clientlist_item == i++) { // Selected item, highlight it
- GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0);
- colour = TC_WHITE;
+ /* Check if we need to reset the height */
+ if (!CheckClientListHeight(w)) break;
+
+ DrawWindowWidgets(w);
+
+ int y = CLNWND_OFFSET;
+
+ FOR_ALL_ACTIVE_CLIENT_INFOS(ci) {
+ TextColour colour;
+ if (_selected_clientlist_item == i++) { // Selected item, highlight it
+ GfxFillRect(1, y, 248, y + CLNWND_ROWSIZE - 1, 0);
+ colour = TC_WHITE;
+ } else {
+ colour = TC_BLACK;
+ }
+
+ if (ci->client_index == NETWORK_SERVER_INDEX) {
+ DrawString(4, y, STR_NETWORK_SERVER, colour);
+ } else {
+ DrawString(4, y, STR_NETWORK_CLIENT, colour);
+ }
+
+ /* Filter out spectators */
+ if (IsValidPlayer(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1);
+
+ DoDrawString(ci->client_name, 81, y, colour);
+
+ y += CLNWND_ROWSIZE;
+ }
+ } break;
+
+ case WE_CLICK:
+ /* Show the popup with option */
+ if (_selected_clientlist_item != 255) {
+ PopupClientList(w, _selected_clientlist_item, e->we.click.pt.x + w->left, e->we.click.pt.y + w->top);
+ }
+ break;
+
+ case WE_MOUSEOVER:
+ /* -1 means we left the current window */
+ if (e->we.mouseover.pt.y == -1) {
+ _selected_clientlist_y = 0;
+ _selected_clientlist_item = 255;
+ SetWindowDirty(w);
+ break;
+ }
+ /* It did not change.. no update! */
+ if (e->we.mouseover.pt.y == _selected_clientlist_y) break;
+
+ /* Find the new selected item (if any) */
+ _selected_clientlist_y = e->we.mouseover.pt.y;
+ if (e->we.mouseover.pt.y > CLNWND_OFFSET) {
+ _selected_clientlist_item = (e->we.mouseover.pt.y - CLNWND_OFFSET) / CLNWND_ROWSIZE;
} else {
- colour = TC_BLACK;
- }
-
- if (ci->client_index == NETWORK_SERVER_INDEX) {
- DrawString(4, y, STR_NETWORK_SERVER, colour);
- } else {
- DrawString(4, y, STR_NETWORK_CLIENT, colour);
+ _selected_clientlist_item = 255;
}
- // Filter out spectators
- if (IsValidPlayer(ci->client_playas)) DrawPlayerIcon(ci->client_playas, 64, y + 1);
-
- DoDrawString(ci->client_name, 81, y, colour);
-
- y += CLNWND_ROWSIZE;
- }
- } break;
-
- case WE_CLICK:
- // Show the popup with option
- if (_selected_clientlist_item != 255) {
- PopupClientList(w, _selected_clientlist_item, e->we.click.pt.x + w->left, e->we.click.pt.y + w->top);
- }
-
- break;
-
- case WE_MOUSEOVER:
- // -1 means we left the current window
- if (e->we.mouseover.pt.y == -1) {
- _selected_clientlist_y = 0;
- _selected_clientlist_item = 255;
+ /* Repaint */
SetWindowDirty(w);
break;
- }
- // It did not change.. no update!
- if (e->we.mouseover.pt.y == _selected_clientlist_y) break;
- // Find the new selected item (if any)
- _selected_clientlist_y = e->we.mouseover.pt.y;
- if (e->we.mouseover.pt.y > CLNWND_OFFSET) {
- _selected_clientlist_item = (e->we.mouseover.pt.y - CLNWND_OFFSET) / CLNWND_ROWSIZE;
- } else {
+ case WE_DESTROY: case WE_CREATE:
+ /* When created or destroyed, data is reset */
_selected_clientlist_item = 255;
- }
-
- // Repaint
- SetWindowDirty(w);
- break;
-
- case WE_DESTROY: case WE_CREATE:
- // When created or destroyed, data is reset
- _selected_clientlist_item = 255;
- _selected_clientlist_y = 0;
- break;
+ _selected_clientlist_y = 0;
+ break;
}
}
@@ -1570,54 +1607,52 @@
static void NetworkJoinStatusWindowWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_PAINT: {
- uint8 progress; // used for progress bar
- DrawWindowWidgets(w);
+ case WE_PAINT: {
+ uint8 progress; // used for progress bar
+ DrawWindowWidgets(w);
- DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY);
- switch (_network_join_status) {
- case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING:
- case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
- progress = 10; // first two stages 10%
- break;
- case NETWORK_JOIN_STATUS_WAITING:
- SetDParam(0, _network_join_waiting);
- DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY);
- progress = 15; // third stage is 15%
- break;
- case NETWORK_JOIN_STATUS_DOWNLOADING:
- SetDParam(0, _network_join_kbytes);
- SetDParam(1, _network_join_kbytes_total);
- DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY);
- /* Fallthrough */
- default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */
- progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total;
- }
+ DrawStringCentered(125, 35, STR_NETWORK_CONNECTING_1 + _network_join_status, TC_GREY);
+ switch (_network_join_status) {
+ case NETWORK_JOIN_STATUS_CONNECTING: case NETWORK_JOIN_STATUS_AUTHORIZING:
+ case NETWORK_JOIN_STATUS_GETTING_COMPANY_INFO:
+ progress = 10; // first two stages 10%
+ break;
+ case NETWORK_JOIN_STATUS_WAITING:
+ SetDParam(0, _network_join_waiting);
+ DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_WAITING, TC_GREY);
+ progress = 15; // third stage is 15%
+ break;
+ case NETWORK_JOIN_STATUS_DOWNLOADING:
+ SetDParam(0, _network_join_kbytes);
+ SetDParam(1, _network_join_kbytes_total);
+ DrawStringCentered(125, 46, STR_NETWORK_CONNECTING_DOWNLOADING, TC_GREY);
+ /* Fallthrough */
+ default: /* Waiting is 15%, so the resting receivement of map is maximum 70% */
+ progress = 15 + _network_join_kbytes * (100 - 15) / _network_join_kbytes_total;
+ }
- /* Draw nice progress bar :) */
- DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE);
- } break;
+ /* Draw nice progress bar :) */
+ DrawFrameRect(20, 18, (int)((w->width - 20) * progress / 100), 28, 10, FR_NONE);
+ } break;
- case WE_CLICK:
- switch (e->we.click.widget) {
- case 2: /* Disconnect button */
+ case WE_CLICK:
+ if (e->we.click.widget == 2) { //Disconnect button
NetworkDisconnect();
DeleteWindow(w);
SwitchMode(SM_MENU);
ShowNetworkGameWindow();
- break;
- }
- break;
-
- /* If the server asks for a password, we need to fill it in */
- case WE_ON_EDIT_TEXT_CANCEL:
- NetworkDisconnect();
- ShowNetworkGameWindow();
+ }
break;
- case WE_ON_EDIT_TEXT:
- SEND_COMMAND(PACKET_CLIENT_PASSWORD)(pw_type, e->we.edittext.str);
- break;
+ /* If the server asks for a password, we need to fill it in */
+ case WE_ON_EDIT_TEXT_CANCEL:
+ NetworkDisconnect();
+ ShowNetworkGameWindow();
+ break;
+
+ case WE_ON_EDIT_TEXT:
+ SEND_COMMAND(PACKET_CLIENT_PASSWORD)(pw_type, e->we.edittext.str);
+ break;
}
}
@@ -1638,9 +1673,8 @@
void ShowJoinStatusWindow()
{
- Window *w;
DeleteWindowById(WC_NETWORK_STATUS_WINDOW, 0);
- w = AllocateWindowDesc(&_network_join_status_window_desc);
+ Window *w = AllocateWindowDesc(&_network_join_status_window_desc);
/* Parent the status window to the lobby */
if (w != NULL) w->parent = FindWindowById(WC_NETWORK_WINDOW, 0);
}
@@ -1708,7 +1742,7 @@
*/
static void ChatTabCompletion(Window *w)
{
- static char _chat_tab_completion_buf[lengthof(_edit_str_buf)];
+ static char _chat_tab_completion_buf[lengthof(_edit_str_net_buf)];
Textbuf *tb = &WP(w, chatquerystr_d).text;
uint len, tb_len;
uint item;
@@ -1761,9 +1795,9 @@
/* Change to the found name. Add ': ' if we are at the start of the line (pretty) */
if (pre_buf == tb_buf) {
- snprintf(tb->buf, lengthof(_edit_str_buf), "%s: ", cur_name);
+ snprintf(tb->buf, lengthof(_edit_str_net_buf), "%s: ", cur_name);
} else {
- snprintf(tb->buf, lengthof(_edit_str_buf), "%s %s", pre_buf, cur_name);
+ snprintf(tb->buf, lengthof(_edit_str_net_buf), "%s %s", pre_buf, cur_name);
}
/* Update the textbuffer */
@@ -1790,75 +1824,73 @@
/*
* uses chatquerystr_d WP macro
- * uses chatquerystr_d->caption to store type of chat message (Private/Team/All)
+ * uses chatquerystr_d->dtype to store type of chat message (Private/Team/All)
*/
static void ChatWindowWndProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_CREATE:
- SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
- SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys
- break;
-
- case WE_PAINT: {
- static const StringID chat_captions[] = {
- STR_NETWORK_CHAT_ALL_CAPTION,
- STR_NETWORK_CHAT_COMPANY_CAPTION,
- STR_NETWORK_CHAT_CLIENT_CAPTION
- };
- StringID msg;
-
- DrawWindowWidgets(w);
-
- assert(WP(w, chatquerystr_d).caption < lengthof(chat_captions));
- msg = chat_captions[WP(w, chatquerystr_d).caption];
- DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, msg, TC_BLACK);
- DrawEditBox(w, &WP(w, chatquerystr_d), 2);
- } break;
+ case WE_CREATE:
+ SendWindowMessage(WC_NEWS_WINDOW, 0, WE_CREATE, w->height, 0);
+ SetBit(_no_scroll, SCROLL_CHAT); // do not scroll the game with the arrow-keys
+ break;
- case WE_CLICK:
- switch (e->we.click.widget) {
- case 3: { /* Send */
- DestType type = (DestType)WP(w, chatquerystr_d).caption;
- int dest = WP(w, chatquerystr_d).dest;
- SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
- } /* FALLTHROUGH */
- case 0: /* Cancel */ DeleteWindow(w); break;
- }
- break;
-
- case WE_MOUSELOOP:
- HandleEditBox(w, &WP(w, chatquerystr_d), 2);
- break;
+ case WE_PAINT: {
+ static const StringID chat_captions[] = {
+ STR_NETWORK_CHAT_ALL_CAPTION,
+ STR_NETWORK_CHAT_COMPANY_CAPTION,
+ STR_NETWORK_CHAT_CLIENT_CAPTION
+ };
- case WE_KEYPRESS:
- if (e->we.keypress.keycode == WKC_TAB) {
- ChatTabCompletion(w);
- } else {
- _chat_tab_completion_active = false;
- switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) {
- case 1: { /* Return */
- DestType type = (DestType)WP(w, chatquerystr_d).caption;
- int dest = WP(w, chatquerystr_d).dest;
- SendChat(WP(w, chatquerystr_d).text.buf, type, dest);
- } /* FALLTHROUGH */
- case 2: /* Escape */ DeleteWindow(w); break;
+ DrawWindowWidgets(w);
+
+ assert((uint)WP(w, chatquerystr_d).dtype < lengthof(chat_captions));
+ DrawStringRightAligned(w->widget[2].left - 2, w->widget[2].top + 1, chat_captions[WP(w, chatquerystr_d).dtype], TC_BLACK);
+ DrawEditBox(w, &WP(w, chatquerystr_d), 2);
+ } break;
+
+ case WE_CLICK:
+ switch (e->we.click.widget) {
+ case 2:
+ ShowOnScreenKeyboard(w, &WP(w, chatquerystr_d), 2, 0, 3);
+ break;
+
+ case 3: /* Send */
+ SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest);
+ /* FALLTHROUGH */
+ case 0: /* Cancel */ DeleteWindow(w); break;
}
- }
- break;
+ break;
- case WE_DESTROY:
- SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0);
- ClrBit(_no_scroll, SCROLL_CHAT);
- break;
+ case WE_MOUSELOOP:
+ HandleEditBox(w, &WP(w, chatquerystr_d), 2);
+ break;
+
+ case WE_KEYPRESS:
+ if (e->we.keypress.keycode == WKC_TAB) {
+ ChatTabCompletion(w);
+ } else {
+ _chat_tab_completion_active = false;
+ switch (HandleEditBoxKey(w, &WP(w, chatquerystr_d), 2, e)) {
+ case 1: /* Return */
+ SendChat(WP(w, chatquerystr_d).text.buf, WP(w, chatquerystr_d).dtype, WP(w, chatquerystr_d).dest);
+ /* FALLTHROUGH */
+ case 2: /* Escape */ DeleteWindow(w); break;
+ }
+ }
+ break;
+
+ case WE_DESTROY:
+ SendWindowMessage(WC_NEWS_WINDOW, 0, WE_DESTROY, 0, 0);
+ ClrBit(_no_scroll, SCROLL_CHAT);
+ break;
}
}
static const Widget _chat_window_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_PANEL, RESIZE_RIGHT, 14, 11, 319, 0, 13, 0x0, STR_NULL}, // background
-{ WWT_PANEL, RESIZE_RIGHT, 14, 75, 257, 1, 12, 0x0, STR_NULL}, // text box
-{ WWT_PUSHTXTBTN, RESIZE_LR, 14, 258, 319, 1, 12, STR_NETWORK_SEND, STR_NULL}, // send button
+{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
+{ WWT_PANEL, RESIZE_RIGHT, 14, 11, 319, 0, 13, 0x0, STR_NULL}, // background
+{ WWT_EDITBOX, RESIZE_RIGHT, 14, 75, 257, 1, 12, STR_NETWORK_CHAT_OSKTITLE, STR_NULL}, // text box
+{ WWT_PUSHTXTBTN, RESIZE_LR, 14, 258, 319, 1, 12, STR_NETWORK_SEND, STR_NULL}, // send button
{ WIDGETS_END},
};
@@ -1872,20 +1904,18 @@
void ShowNetworkChatQueryWindow(DestType type, int dest)
{
- Window *w;
-
DeleteWindowById(WC_SEND_NETWORK_MSG, 0);
- _edit_str_buf[0] = '\0';
+ _edit_str_net_buf[0] = '\0';
_chat_tab_completion_active = false;
- w = AllocateWindowDesc(&_chat_window_desc);
+ Window *w = AllocateWindowDesc(&_chat_window_desc);
w->LowerWidget(2);
- WP(w, chatquerystr_d).caption = type; // Misuse of caption
+ WP(w, chatquerystr_d).dtype = type;
WP(w, chatquerystr_d).dest = dest;
WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
- InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, lengthof(_edit_str_buf), 0);
+ InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_net_buf, lengthof(_edit_str_net_buf), 0);
}
/** Enum for NetworkGameWindow, referring to _network_game_window_widgets */
@@ -1912,12 +1942,12 @@
switch (e->we.click.widget) {
case NCPWW_OK: {
if (w->IsWidgetLowered(NCPWW_SAVE_AS_DEFAULT_PASSWORD)) {
- snprintf(_network_default_company_pass, lengthof(_network_default_company_pass), "%s", _edit_str_buf);
+ snprintf(_network_default_company_pass, lengthof(_network_default_company_pass), "%s", _edit_str_net_buf);
}
/* empty password is a '*' because of console argument */
- if (StrEmpty(_edit_str_buf)) snprintf(_edit_str_buf, lengthof(_edit_str_buf), "*");
- char *password = _edit_str_buf;
+ if (StrEmpty(_edit_str_net_buf)) snprintf(_edit_str_net_buf, lengthof(_edit_str_net_buf), "*");
+ char *password = _edit_str_net_buf;
NetworkChangeCompanyPassword(1, &password);
}
@@ -1930,6 +1960,9 @@
w->ToggleWidgetLoweredState(NCPWW_SAVE_AS_DEFAULT_PASSWORD);
SetWindowDirty(w);
break;
+ case NCPWW_PASSWORD:
+ ShowOnScreenKeyboard(w, &WP(w, chatquerystr_d), NCPWW_PASSWORD, 2, 1);
+ break;
}
break;
@@ -1958,7 +1991,7 @@
{ WWT_CAPTION, RESIZE_NONE, 14, 11, 299, 0, 13, STR_COMPANY_PASSWORD_CAPTION, STR_018C_WINDOW_TITLE_DRAG_THIS},
{ WWT_PANEL, RESIZE_NONE, 14, 0, 299, 14, 50, 0x0, STR_NULL},
{ WWT_TEXT, RESIZE_NONE, 14, 5, 100, 19, 30, STR_COMPANY_PASSWORD, STR_NULL},
-{ WWT_PANEL, RESIZE_NONE, 14, 101, 294, 19, 30, 0x0, STR_NULL},
+{ WWT_EDITBOX, RESIZE_NONE, 14, 101, 294, 19, 30, STR_SET_COMPANY_PASSWORD, STR_NULL},
{ WWT_TEXTBTN, RESIZE_NONE, 14, 101, 294, 35, 46, STR_MAKE_DEFAULT_COMPANY_PASSWORD, STR_MAKE_DEFAULT_COMPANY_PASSWORD_TIP},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 0, 149, 51, 62, STR_012E_CANCEL, STR_COMPANY_PASSWORD_CANCEL},
{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 150, 299, 51, 62, STR_012F_OK, STR_COMPANY_PASSWORD_OK},
@@ -1977,10 +2010,10 @@
{
DeleteWindowById(WC_COMPANY_PASSWORD_WINDOW, 0);
- _edit_str_buf[0] = '\0';
+ _edit_str_net_buf[0] = '\0';
Window *w = AllocateWindowDesc(&_ncp_window_desc);
WP(w, chatquerystr_d).afilter = CS_ALPHANUMERAL;
- InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_buf, min(lengthof(_network_default_company_pass), lengthof(_edit_str_buf)), 0);
+ InitializeTextBuffer(&WP(w, chatquerystr_d).text, _edit_str_net_buf, min(lengthof(_network_default_company_pass), lengthof(_edit_str_net_buf)), 0);
}
#endif /* ENABLE_NETWORK */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/network/network_internal.h
--- a/src/network/network_internal.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/network/network_internal.h Fri Mar 28 10:32:55 2008 +0000
@@ -106,6 +106,13 @@
NETLANG_SWEDISH,
NETLANG_TURKISH,
NETLANG_UKRAINIAN,
+ NETLANG_AFRIKAANS,
+ NETLANG_CROATIAN,
+ NETLANG_CATALAN,
+ NETLANG_ESTONIAN,
+ NETLANG_GALICIAN,
+ NETLANG_GREEK,
+ NETLANG_LATVIAN,
NETLANG_COUNT
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf.cpp
--- a/src/newgrf.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -120,7 +120,7 @@
static uint32 _grm_engines[TOTAL_NUM_ENGINES];
/* Contains the GRF ID of the owner of a cargo if it has been reserved */
-static uint32 _grm_cargos[NUM_CARGO];
+static uint32 _grm_cargos[NUM_CARGO * 2];
/** DEBUG() function dedicated to newGRF debugging messages
* Function is essentialy the same as DEBUG(grf, severity, ...) with the
@@ -244,13 +244,24 @@
STR_BAGS, STR_LITERS, STR_TONS, STR_NOTHING,
STR_TONS, STR_NOTHING, STR_LITERS, STR_NOTHING
};
+
/* 0xD0 and 0xDC stand for all the TextIDs in the range
* of 0xD000 (misc graphics texts) and 0xDC00 (misc persistent texts).
* These strings are unique to each grf file, and thus require to be used with the
* grfid in which they are declared */
- if (GB(str, 8, 8) == 0xD0 || GB(str, 8, 8) == 0xDC) {
- return GetGRFStringID(grfid, str);
+ switch (GB(str, 8, 8)) {
+ case 0xD0: case 0xD1: case 0xD2: case 0xD3:
+ case 0xDC:
+ return GetGRFStringID(grfid, str);
+
+ case 0xD4: case 0xD5: case 0xD6: case 0xD7:
+ /* Strings embedded via 0x81 have 0x400 added to them (no real
+ * explanation why...) */
+ return GetGRFStringID(grfid, str - 0x400);
+
+ default: break;
}
+
#define TEXID_TO_STRINGID(begin, end, stringid) if (str >= begin && str <= end) return str + (stringid - begin)
/* We have some changes in our cargo strings, resulting in some missing. */
TEXID_TO_STRINGID(0x000E, 0x002D, STR_000E);
@@ -2573,13 +2584,19 @@
/* Randomized Sprite Group */
case 0x80: // Self scope
case 0x83: // Parent scope
+ case 0x84: // Relative scope
{
- if (!check_length(bufend - buf, 7, "NewSpriteGroup (Randomized) (1)")) return;
+ if (!check_length(bufend - buf, HasBit(type, 2) ? 8 : 7, "NewSpriteGroup (Randomized) (1)")) return;
group = AllocateSpriteGroup();
group->type = SGT_RANDOMIZED;
group->g.random.var_scope = HasBit(type, 1) ? VSG_SCOPE_PARENT : VSG_SCOPE_SELF;
+ if (HasBit(type, 2)) {
+ if (feature <= GSF_AIRCRAFT) group->g.random.var_scope = VSG_SCOPE_RELATIVE;
+ group->g.random.count = grf_load_byte(&buf);
+ }
+
uint8 triggers = grf_load_byte(&buf);
group->g.random.triggers = GB(triggers, 0, 7);
group->g.random.cmp_mode = HasBit(triggers, 7) ? RSG_CMP_ALL : RSG_CMP_ANY;
@@ -3242,6 +3259,9 @@
break;
case 0xD0:
+ case 0xD1:
+ case 0xD2:
+ case 0xD3:
case 0xDC:
AddGRFString(_cur_grffile->grfid, id, lang, new_scheme, name, STR_UNDEFINED);
break;
@@ -3541,6 +3561,10 @@
return true;
}
+ case 0x22: // difficulty level
+ *value = _opt.diff_level;
+ return true;
+
default: return false;
}
}
@@ -3845,12 +3869,12 @@
len -= 6;
const char *name = grf_load_string(&buf, len);
- _cur_grfconfig->name = TranslateTTDPatchCodes(name);
+ _cur_grfconfig->name = TranslateTTDPatchCodes(grfid, name);
len -= strlen(name) + 1;
if (len > 0) {
const char *info = grf_load_string(&buf, len);
- _cur_grfconfig->info = TranslateTTDPatchCodes(info);
+ _cur_grfconfig->info = TranslateTTDPatchCodes(grfid, info);
}
/* GLS_INFOSCAN only looks for the action 8, so we can skip the rest of the file */
@@ -4020,7 +4044,7 @@
const char *message = grf_load_string(&buf, len);
len -= (strlen(message) + 1);
- error->custom_message = TranslateTTDPatchCodes(message);
+ error->custom_message = TranslateTTDPatchCodes(_cur_grffile->grfid, message);
} else {
error->message = msgstr[message_id];
}
@@ -4029,7 +4053,7 @@
const char *data = grf_load_string(&buf, len);
len -= (strlen(data) + 1);
- error->data = TranslateTTDPatchCodes(data);
+ error->data = TranslateTTDPatchCodes(_cur_grffile->grfid, data);
}
/* Only two parameter numbers can be used in the string. */
@@ -4544,7 +4568,7 @@
if (!check_length(len, 1, "FeatureTownName: style name")) return;
const char *name = grf_load_string(&buf, len);
len -= strlen(name) + 1;
- grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, TranslateTTDPatchCodes(name));
+ grfmsg(6, "FeatureTownName: lang 0x%X -> '%s'", lang, TranslateTTDPatchCodes(grfid, name));
townname->name[nb_gen] = AddGRFString(grfid, id, lang, new_scheme, name, STR_UNDEFINED);
@@ -4597,7 +4621,7 @@
} else {
const char *text = grf_load_string(&buf, len);
len -= strlen(text) + 1;
- townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(text);
+ townname->partlist[id][i].parts[j].data.text = TranslateTTDPatchCodes(grfid, text);
grfmsg(6, "FeatureTownName: part %d, text %d, '%s' (with probability %d)", i, j, townname->partlist[id][i].parts[j].data.text, prob);
}
townname->partlist[id][i].parts[j].prob = prob;
@@ -4630,7 +4654,7 @@
} else {
/* Attach the label to the end of the list */
GRFLabel *l;
- for (l = _cur_grffile->label; l->next != NULL; l = l->next);
+ for (l = _cur_grffile->label; l->next != NULL; l = l->next) {}
l->next = label;
}
@@ -5355,17 +5379,18 @@
static void CalculateRefitMasks()
{
for (EngineID engine = 0; engine < TOTAL_NUM_ENGINES; engine++) {
+ EngineInfo *ei = &_engine_info[engine];
uint32 mask = 0;
uint32 not_mask = 0;
uint32 xor_mask = 0;
- if (_engine_info[engine].refit_mask != 0) {
+ if (ei->refit_mask != 0) {
const GRFFile *file = GetEngineGRF(engine);
if (file != NULL && file->cargo_max != 0) {
/* Apply cargo translation table to the refit mask */
uint num_cargo = min(32, file->cargo_max);
for (uint i = 0; i < num_cargo; i++) {
- if (!HasBit(_engine_info[engine].refit_mask, i)) continue;
+ if (!HasBit(ei->refit_mask, i)) continue;
CargoID c = GetCargoIDByLabel(file->cargo_list[i]);
if (c == CT_INVALID) continue;
@@ -5378,7 +5403,7 @@
const CargoSpec *cs = GetCargo(c);
if (!cs->IsValid()) continue;
- if (HasBit(_engine_info[engine].refit_mask, cs->bitnum)) SetBit(xor_mask, c);
+ if (HasBit(ei->refit_mask, cs->bitnum)) SetBit(xor_mask, c);
}
}
}
@@ -5409,7 +5434,8 @@
}
}
}
- _engine_info[engine].refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
+
+ ei->refit_mask = ((mask & ~not_mask) ^ xor_mask) & _cargo_mask;
/* Check if this engine's cargo type is valid. If not, set to the first refittable
* cargo type. Apparently cargo_type isn't a common property... */
@@ -5419,19 +5445,19 @@
case VEH_TRAIN: {
RailVehicleInfo *rvi = &_rail_vehicle_info[engine];
if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
- if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
+ if (rvi->cargo_type == CT_INVALID) ei->climates = 0;
break;
}
case VEH_ROAD: {
RoadVehicleInfo *rvi = &_road_vehicle_info[engine - ROAD_ENGINES_INDEX];
if (rvi->cargo_type == CT_INVALID) rvi->cargo_type = FindFirstRefittableCargo(engine);
- if (rvi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
+ if (rvi->cargo_type == CT_INVALID) ei->climates = 0;
break;
}
case VEH_SHIP: {
ShipVehicleInfo *svi = &_ship_vehicle_info[engine - SHIP_ENGINES_INDEX];
if (svi->cargo_type == CT_INVALID) svi->cargo_type = FindFirstRefittableCargo(engine);
- if (svi->cargo_type == CT_INVALID) _engine_info[engine].climates = 0;
+ if (svi->cargo_type == CT_INVALID) ei->climates = 0;
break;
}
}
@@ -5839,6 +5865,12 @@
* in each loading stage, (try to) open each file specified in the config
* and load information from it. */
for (GrfLoadingStage stage = GLS_LABELSCAN; stage <= GLS_ACTIVATION; stage++) {
+ /* Set activated grfs back to will-be-activated between reservation- and activation-stage.
+ * This ensures that action7/9 conditions 0x06 - 0x0A work correctly. */
+ for (GRFConfig *c = _grfconfig; c != NULL; c = c->next) {
+ if (c->status == GCS_ACTIVATED) c->status = GCS_INITIALISED;
+ }
+
uint slot = file_index;
_cur_stage = stage;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf.h
--- a/src/newgrf.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf.h Fri Mar 28 10:32:55 2008 +0000
@@ -128,4 +128,6 @@
bool HasGrfMiscBit(GrfMiscBit bit);
bool GetGlobalVariable(byte param, uint32 *value);
+StringID MapGRFStringID(uint32 grfid, StringID str);
+
#endif /* NEWGRF_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_callbacks.h
--- a/src/newgrf_callbacks.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_callbacks.h Fri Mar 28 10:32:55 2008 +0000
@@ -150,7 +150,7 @@
CBID_VEHICLE_MODIFY_PROPERTY = 0x36,
/** Called to determine text to display after cargo name */
- CBID_INDUSTRY_CARGO_SUFFIX = 0x37, // not implemented
+ CBID_INDUSTRY_CARGO_SUFFIX = 0x37,
/** Called to determine more text in the fund industry window */
CBID_INDUSTRY_FUND_MORE_TEXT = 0x38,
@@ -210,6 +210,11 @@
/** Customize the output cargo types of a newly build industry. */
CBID_INDUSTRY_OUTPUT_CARGO_TYPES = 0x14C,
+
+ /* ATTENTION:
+ * When adding new callbacks and their result is 15bit, add them to newgrf_spritegroup.cpp:Is8BitCallback().
+ * It does not harm to add them there though they are not implemented. But it does harm if they get forgotton.
+ */
};
/**
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_canal.cpp
--- a/src/newgrf_canal.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_canal.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -85,6 +85,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_cargo.cpp
--- a/src/newgrf_cargo.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_cargo.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -64,6 +64,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_engine.cpp
--- a/src/newgrf_engine.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_engine.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -23,6 +23,8 @@
#include "vehicle_func.h"
#include "core/random_func.hpp"
#include "direction_func.h"
+#include "rail_map.h"
+#include "rail.h"
int _traininfo_vehicle_pitch = 0;
@@ -398,7 +400,39 @@
/* Vehicle Resolver Functions */
static inline const Vehicle *GRV(const ResolverObject *object)
{
- return object->scope == VSG_SCOPE_SELF ? object->u.vehicle.self : object->u.vehicle.parent;
+ switch (object->scope) {
+ default: NOT_REACHED();
+ case VSG_SCOPE_SELF: return object->u.vehicle.self;
+ case VSG_SCOPE_PARENT: return object->u.vehicle.parent;
+ case VSG_SCOPE_RELATIVE: {
+ const Vehicle *v = NULL;
+ switch (GB(object->count, 6, 2)) {
+ default: NOT_REACHED();
+ case 0x00: // count back (away from the engine), starting at this vehicle
+ case 0x01: // count forward (toward the engine), starting at this vehicle
+ v = object->u.vehicle.self;
+ break;
+ case 0x02: // count back, starting at the engine
+ v = object->u.vehicle.parent;
+ break;
+ case 0x03: { // count back, starting at the first vehicle in this chain of vehicles with the same ID, as for vehicle variable 41
+ const Vehicle *self = object->u.vehicle.self;
+ for (const Vehicle *u = self->First(); u != self; u = u->Next()) {
+ if (u->engine_type != self->engine_type) {
+ v = NULL;
+ } else {
+ if (v == NULL) v = u;
+ }
+ }
+ if (v == NULL) v = self;
+ } break;
+ }
+ uint32 count = GB(object->count, 0, 4);
+ if (count == 0) count = GetRegister(0x100);
+ while (v != NULL && count-- != 0) v = (GB(object->count, 6, 2) == 0x01) ? v->Previous() : v->Next();
+ return v;
+ }
+ }
}
@@ -512,12 +546,13 @@
memset(common_subtypes, 0, sizeof(common_subtypes));
for (u = v; u != NULL; u = u->Next()) {
+ if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
+
/* Skip empty engines */
if (u->cargo_cap == 0) continue;
cargo_classes |= GetCargo(u->cargo_type)->classes;
common_cargos[u->cargo_type]++;
- if (v->type == VEH_TRAIN) user_def_data |= u->u.rail.user_def_data;
common_subtypes[u->cargo_subtype]++;
}
@@ -623,12 +658,17 @@
case 0xFF: {
uint16 modflags = 0;
- /* @todo: There are some other bits that should be implemented:
- * bit 5: Whether the rail vehicle is powered or not (mostly useful for wagons).
- * bit 6: This is an electrically powered rail vehicle which is running on normal rail.
- * bit 8: (Maybe?) Toggled whenever the train reverses.
- */
+ if (v->type == VEH_TRAIN) {
+ const Vehicle *u = IsTrainWagon(v) && HasBit(v->vehicle_flags, VRF_POWEREDWAGON) ? v->First() : v;
+ RailType railtype = GetRailType(v->tile);
+ bool powered = IsTrainEngine(v) || (IsTrainWagon(v) && HasBit(v->vehicle_flags, VRF_POWEREDWAGON));
+ bool has_power = powered && HasPowerOnRail(u->u.rail.railtype, railtype);
+ bool is_electric = powered && u->u.rail.railtype == RAILTYPE_ELECTRIC;
+ if (has_power) SetBit(modflags, 5);
+ if (is_electric && !has_power) SetBit(modflags, 6);
+ if (HasBit(v->u.rail.flags, VRF_TOGGLE_REVERSE)) SetBit(modflags, 8);
+ }
if (HasBit(v->vehicle_flags, VF_BUILT_AS_PROTOTYPE)) SetBit(modflags, 10);
return variable == 0xFE ? modflags : GB(modflags, 8, 8);
@@ -808,6 +848,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_generic.cpp
--- a/src/newgrf_generic.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_generic.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -125,6 +125,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_gui.cpp
--- a/src/newgrf_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -114,6 +114,7 @@
GRFConfig **list;
const GRFConfig *sel;
};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(newgrf_add_d));
/* Names of the add a newgrf window widgets */
enum AddNewGRFWindowWidgets {
@@ -179,7 +180,7 @@
const GRFConfig *c;
uint i = (e->we.click.pt.y - w->widget[ANGRFW_GRF_LIST].top) / 10 + w->vscroll.pos;
- for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--);
+ for (c = _all_grfs; c != NULL && i > 0; c = c->next, i--) {}
WP(w, newgrf_add_d).sel = c;
SetWindowDirty(w);
break;
@@ -304,7 +305,7 @@
const GRFConfig *c;
int i;
- for (c = *WP(w, newgrf_d).list, i = 0; c != NULL; c = c->next, i++);
+ for (c = *WP(w, newgrf_d).list, i = 0; c != NULL; c = c->next, i++) {}
w->vscroll.cap = (w->widget[SNGRFS_FILE_LIST].bottom - w->widget[SNGRFS_FILE_LIST].top) / 14 + 1;
SetVScrollCount(w, i);
@@ -327,9 +328,9 @@
ReloadNewGRFData();
/* Show new, updated list */
- for (c = *nd->list; c != NULL && c != nd->sel; c = c->next, i++);
+ for (c = *nd->list; c != NULL && c != nd->sel; c = c->next, i++) {}
CopyGRFConfigList(nd->list, *nd->orig_list, false);
- for (c = *nd->list; c != NULL && i > 0; c = c->next, i--);
+ for (c = *nd->list; c != NULL && i > 0; c = c->next, i--) {}
nd->sel = c;
SetWindowDirty(w);
@@ -474,7 +475,7 @@
GRFConfig *c;
uint i = (e->we.click.pt.y - w->widget[SNGRFS_FILE_LIST].top) / 14 + w->vscroll.pos;
- for (c = *WP(w, newgrf_d).list; c != NULL && i > 0; c = c->next, i--);
+ for (c = *WP(w, newgrf_d).list; c != NULL && i > 0; c = c->next, i--) {}
WP(w, newgrf_d).sel = c;
SetWindowDirty(w);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_house.cpp
--- a/src/newgrf_house.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_house.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -31,13 +31,24 @@
HouseOverrideManager _house_mngr(NEW_HOUSE_OFFSET, HOUSE_MAX, INVALID_HOUSE_ID);
-void CheckHouseIDs()
+/**
+ * Check and update town and house values.
+ *
+ * Checked are the HouseIDs. Updated are the
+ * town population the number of houses per
+ * town, the town radius and the max passengers
+ * of the town.
+ */
+void UpdateHousesAndTowns()
{
Town *town;
InitializeBuildingCounts();
- /* Reset town population */
- FOR_ALL_TOWNS(town) town->population = 0;
+ /* Reset town population and num_houses */
+ FOR_ALL_TOWNS(town) {
+ town->population = 0;
+ town->num_houses = 0;
+ }
for (TileIndex t = 0; t < MapSize(); t++) {
HouseID house_id;
@@ -51,9 +62,23 @@
house_id = _house_mngr.GetSubstituteID(house_id);
SetHouseType(t, house_id);
}
+
town = GetTownByTile(t);
IncreaseBuildingCount(town, house_id);
if (IsHouseCompleted(t)) town->population += GetHouseSpecs(house_id)->population;
+
+ /* Increase the number of houses for every house tile which
+ * has a size bit set. Multi tile buildings have got only
+ * one tile with such a bit set, so there is no problem. */
+ if (GetHouseSpecs(GetHouseType(t))->building_flags & BUILDING_HAS_1_TILE) {
+ town->num_houses++;
+ }
+ }
+
+ /* Update the population and num_house dependant values */
+ FOR_ALL_TOWNS(town) {
+ UpdateTownRadius(town);
+ UpdateTownMaxPass(town);
}
}
@@ -266,6 +291,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
uint16 GetHouseCallback(CallbackID callback, uint32 param1, uint32 param2, HouseID house_id, Town *town, TileIndex tile)
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_house.h
--- a/src/newgrf_house.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_house.h Fri Mar 28 10:32:55 2008 +0000
@@ -26,7 +26,7 @@
uint8 class_id; ////< The class id within the grf file
};
-void CheckHouseIDs();
+void UpdateHousesAndTowns();
HouseClassID AllocateHouseClassID(byte grf_class_id, uint32 grfid);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_industries.cpp
--- a/src/newgrf_industries.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_industries.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -25,7 +25,7 @@
#include "table/strings.h"
-static Randomizer _industry_creation_randomizer;
+static uint32 _industry_creation_random_bits;
/* Since the industry IDs defined by the GRF file don't necessarily correlate
* to those used by the game, the IDs used for overriding old industries must be
@@ -410,6 +410,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
uint16 GetIndustryCallback(CallbackID callback, uint32 param1, uint32 param2, Industry *industry, IndustryType type, TileIndex tile)
@@ -469,7 +470,7 @@
case 0x8D: return min(DistanceSquare(industry->town->xy, tile), 65535);
/* 32 random bits */
- case 0x8F: return _industry_creation_randomizer.Next();
+ case 0x8F: return _industry_creation_random_bits;
}
/* None of the special ones, so try the general ones */
@@ -494,7 +495,7 @@
NewIndustryResolver(&object, tile, &ind, type);
object.GetVariable = IndustryLocationGetVariable;
object.callback = CBID_INDUSTRY_LOCATION;
- _industry_creation_randomizer.SetSeed(seed);
+ _industry_creation_random_bits = seed;
group = Resolve(GetIndustrySpec(type)->grf_prop.spritegroup, &object);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_industrytiles.cpp
--- a/src/newgrf_industrytiles.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_industrytiles.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -170,6 +170,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
void IndustryDrawTileLayout(const TileInfo *ti, const SpriteGroup *group, byte rnd_color, byte stage, IndustryGfx gfx)
@@ -275,7 +276,7 @@
return !IsSlopeRefused(GetTileSlope(ind_tile, NULL), its->slopes_refused);
}
if (its->grf_prop.grffile->grf_version < 7) {
- return callback_res != 0;
+ return (callback_res & 0xFF) != 0; // mask to 8 bit callback result
}
/* Copy some parameters from the registers to the error message text ref. stack */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_spritegroup.cpp
--- a/src/newgrf_spritegroup.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_spritegroup.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -80,6 +80,37 @@
TemporaryStorageArray _temp_store;
+static inline bool Is8BitCallback(const ResolverObject *object)
+{
+ /* Var 0x7E procedure results are always 15 bit */
+ if (object == NULL || object->procedure_call) return false;
+
+ switch (object->callback) {
+ /* All these functions are 15 bit callbacks */
+ case CBID_STATION_SPRITE_LAYOUT:
+ case CBID_VEHICLE_REFIT_CAPACITY:
+ case CBID_HOUSE_COLOUR:
+ case CBID_HOUSE_CARGO_ACCEPTANCE:
+ case CBID_INDUSTRY_LOCATION:
+ case CBID_HOUSE_ACCEPT_CARGO:
+ case CBID_INDTILE_CARGO_ACCEPTANCE:
+ case CBID_INDTILE_ACCEPT_CARGO:
+ case CBID_VEHICLE_COLOUR_MAPPING:
+ case CBID_HOUSE_PRODUCE_CARGO:
+ case CBID_INDTILE_SHAPE_CHECK: // depends on grf version, masked to 8 bit in PerformIndustryTileSlopeCheck() if needed
+ case CBID_VEHICLE_SOUND_EFFECT:
+ case CBID_VEHICLE_MODIFY_PROPERTY: // depends on queried property
+ case CBID_CARGO_PROFIT_CALC:
+ case CBID_SOUNDS_AMBIENT_EFFECT:
+ case CBID_CARGO_STATION_RATING_CALC:
+ return false;
+
+ /* The rest is a 8 bit callback, which should be truncated properly */
+ default:
+ return true;
+ }
+}
+
static inline uint32 GetVariable(const ResolverObject *object, byte variable, byte parameter, bool *available)
{
/* First handle variables common with Action7/9/D */
@@ -174,6 +205,7 @@
bool available = true;
if (adjust->variable == 0x7E) {
ResolverObject subobject = *object;
+ subobject.procedure_call = true;
const SpriteGroup *subgroup = Resolve(adjust->subroutine, &subobject);
if (subgroup == NULL || subgroup->type != SGT_CALLBACK) {
value = CALLBACK_FAILED;
@@ -204,25 +236,7 @@
if (group->g.determ.num_ranges == 0) {
/* nvar == 0 is a special case -- we turn our value into a callback result */
nvarzero.type = SGT_CALLBACK;
- switch (object->callback) {
- /* All these functions are 15 bit callbacks */
- case CBID_VEHICLE_REFIT_CAPACITY:
- case CBID_HOUSE_COLOUR:
- case CBID_HOUSE_CARGO_ACCEPTANCE:
- case CBID_INDUSTRY_LOCATION:
- case CBID_INDTILE_CARGO_ACCEPTANCE:
- case CBID_VEHICLE_COLOUR_MAPPING:
- case CBID_HOUSE_PRODUCE_CARGO:
- case CBID_VEHICLE_SOUND_EFFECT:
- case CBID_SOUNDS_AMBIENT_EFFECT:
- nvarzero.g.callback.result = GB(value, 0, 15);
- break;
-
- /* The rest is a 8 bit callback, which should be truncated properly */
- default:
- nvarzero.g.callback.result = GB(value, 0, 8);
- break;
- }
+ nvarzero.g.callback.result = GB(value, 0, Is8BitCallback(object) ? 8 : 15);
return &nvarzero;
}
@@ -242,6 +256,7 @@
byte index;
object->scope = group->g.random.var_scope;
+ object->count = group->g.random.count;
if (object->trigger != 0) {
/* Handle triggers */
@@ -280,6 +295,14 @@
case SGT_REAL: return object->ResolveReal(object, group);
case SGT_DETERMINISTIC: return ResolveVariable(group, object);
case SGT_RANDOMIZED: return ResolveRandom(group, object);
+ case SGT_CALLBACK: {
+ if (!Is8BitCallback(object)) return group;
+
+ static SpriteGroup result8bit;
+ result8bit.type = SGT_CALLBACK;
+ result8bit.g.callback.result = GB(group->g.callback.result, 0, 8);
+ return &result8bit;
+ }
default: return group;
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_spritegroup.h
--- a/src/newgrf_spritegroup.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_spritegroup.h Fri Mar 28 10:32:55 2008 +0000
@@ -48,6 +48,8 @@
VSG_SCOPE_SELF,
/* Engine of consists for vehicles, city for stations. */
VSG_SCOPE_PARENT,
+ /* Any vehicle in the consist (vehicles only) */
+ VSG_SCOPE_RELATIVE,
};
enum DeterministicSpriteGroupSize {
@@ -128,6 +130,7 @@
RandomizedSpriteGroupCompareMode cmp_mode; ///< Check for these triggers:
byte triggers;
+ byte count;
byte lowest_randbit; ///< Look for this in the per-object randomized bitmask:
byte num_groups; ///< must be power of 2
@@ -198,8 +201,10 @@
CallbackID callback;
uint32 callback_param1;
uint32 callback_param2;
+ bool procedure_call; ///< true if we are currently resolving a var 0x7E procedure result.
byte trigger;
+ byte count;
uint32 last_value;
uint32 reseed;
VarSpriteGroupScope scope;
@@ -254,6 +259,8 @@
void (*SetTriggers)(const struct ResolverObject*, int);
uint32 (*GetVariable)(const struct ResolverObject*, byte, byte, bool*);
const SpriteGroup *(*ResolveReal)(const struct ResolverObject*, const SpriteGroup*);
+
+ ResolverObject() : procedure_call(false) { }
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_station.cpp
--- a/src/newgrf_station.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_station.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -105,7 +105,7 @@
uint GetNumStationClasses()
{
uint i;
- for (i = 0; i < STAT_CLASS_MAX && _station_classes[i].id != 0; i++);
+ for (i = 0; i < STAT_CLASS_MAX && _station_classes[i].id != 0; i++) {}
return i;
}
@@ -571,6 +571,7 @@
res->last_value = 0;
res->trigger = 0;
res->reseed = 0;
+ res->count = 0;
}
static const SpriteGroup *ResolveStation(ResolverObject *object)
@@ -724,7 +725,7 @@
/* If this was the highest spec index, reallocate */
if (specindex == st->num_specs - 1) {
- for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--);
+ for (; st->speclist[st->num_specs - 1].grfid == 0 && st->num_specs > 1; st->num_specs--) {}
if (st->num_specs > 1) {
st->speclist = ReallocT(st->speclist, st->num_specs);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_text.cpp
--- a/src/newgrf_text.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_text.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -192,7 +192,7 @@
static byte _currentLangID = GRFLX_ENGLISH; ///< by default, english is used.
-char *TranslateTTDPatchCodes(const char *str)
+char *TranslateTTDPatchCodes(uint32 grfid, const char *str)
{
char *tmp = MallocT(strlen(str) * 10 + 1); // Allocate space to allow for expansion
char *d = tmp;
@@ -241,7 +241,7 @@
string = *str++;
string |= *str++ << 8;
d += Utf8Encode(d, SCC_STRING_ID);
- d += Utf8Encode(d, string);
+ d += Utf8Encode(d, MapGRFStringID(grfid, string));
break;
}
case 0x82:
@@ -345,7 +345,7 @@
/* Too many strings allocated, return empty */
if (id == lengthof(_grf_text)) return STR_EMPTY;
- translatedtext = TranslateTTDPatchCodes(text_to_add);
+ translatedtext = TranslateTTDPatchCodes(grfid, text_to_add);
GRFText *newtext = GRFText::New(langid_to_add, translatedtext);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_text.h
--- a/src/newgrf_text.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_text.h Fri Mar 28 10:32:55 2008 +0000
@@ -11,7 +11,7 @@
const char *GetGRFStringPtr(uint16 stringid);
void CleanUpStrings();
void SetCurrentGrfLangID(const char *iso_name);
-char *TranslateTTDPatchCodes(const char *str);
+char *TranslateTTDPatchCodes(uint32 grfid, const char *str);
bool CheckGrfLangID(byte lang_id, byte grf_version);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/newgrf_town.cpp
--- a/src/newgrf_town.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/newgrf_town.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -64,7 +64,7 @@
case 0xAD: return GB(t->ratings[7], 8, 8);
case 0xAE: return t->have_ratings;
case 0xB2: return t->statues;
- case 0xB6: return t->num_houses;
+ case 0xB6: return ClampToU16(t->num_houses);
case 0xB9: return t->growth_rate;
case 0xBA: return ClampToU16(t->new_max_pass);
case 0xBB: return GB(ClampToU16(t->new_max_pass), 8, 8);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/news.h
--- a/src/news.h Thu Mar 27 05:15:06 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-/* $Id$ */
-
-/** @file news.h */
-
-#ifndef NEWS_H
-#define NEWS_H
-
-#include "window_type.h"
-#include "vehicle_type.h"
-#include "tile_type.h"
-#include "date_type.h"
-#include "strings_type.h"
-
-struct NewsItem {
- StringID string_id; ///< Message text (sometimes also used for storing other info)
- uint16 duration; ///< Remaining time for showing this news message
- Date date; ///< Date of the news
- byte flags; ///< NewsFlags bits @see NewsFlags
- byte display_mode; ///< Display mode value @see NewsMode
- byte type; ///< News category @see NewsType
- byte callback; ///< Call-back function
-
- TileIndex data_a; ///< Reference to tile or vehicle
- TileIndex data_b; ///< Reference to second tile or vehicle
-
- uint64 params[10];
-};
-
-typedef bool ValidationProc ( uint data_a, uint data_b );
-typedef void DrawNewsCallbackProc(Window *w);
-typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
-
-/**
- * Macro for creating news flags.
- * @param mode (bits 0 - 7) Display_mode, one of the NewsMode enums (NM_)
- * @param flag (bits 8 - 15) OR-able news flags, any of the NewsFlags enums (NF_)
- * @param type (bits 16-23) News category, one of the NewsType enums (NT_)
- * @param cb (bits 24-31) Call-back function, one of the NewsCallback enums (DNC_) or 0 if no callback
- * @see NewsMode
- * @see NewsFlags
- * @see NewsType
- * @see NewsCallback
- * @see AddNewsItem
- */
-#define NEWS_FLAGS(mode, flag, type, cb) ((cb) << 24 | (type) << 16 | (flag) << 8 | (mode))
-
-void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b);
-void NewsLoop();
-void DrawNewsBorder(const Window *w);
-void InitNewsItemStructs();
-
-extern NewsItem _statusbar_news_item;
-extern uint32 _news_display_opt;
-extern bool _news_ticker_sound;
-
-/** Type of news. */
-enum NewsType {
- NT_ARRIVAL_PLAYER, ///< Cargo arrived for player
- NT_ARRIVAL_OTHER, ///< Cargo arrived for competitor
- NT_ACCIDENT, ///< An accident or disaster has occurred
- NT_COMPANY_INFO, ///< Company info (new companies, bankrupcy messages)
- NT_OPENCLOSE, ///< Opening and closing of industries
- NT_ECONOMY, ///< Economic changes (recession, industry up/dowm)
- NT_INDUSTRY_PLAYER, ///< Production changes of industry serviced by local player
- NT_INDUSTRY_OTHER, ///< Production changes of industry serviced by competitor(s)
- NT_INDUSTRY_NOBODY, ///< Other industry production changes
- NT_ADVICE, ///< Bits of news about vehicles of the player
- NT_NEW_VEHICLES, ///< New vehicle has become available
- NT_ACCEPTANCE, ///< A type of cargo is (no longer) accepted
- NT_SUBSIDIES, ///< News about subsidies (announcements, expirations, acceptance)
- NT_GENERAL, ///< General news (from towns)
- NT_END, ///< end-of-array marker
-};
-
-extern const char *_news_display_name[NT_END];
-
-/**
- * News mode.
- * @see NEWS_FLAGS
- */
-enum NewsMode {
- NM_SMALL = 0, ///< Show only a small popup informing us about vehicle age for example
- NM_NORMAL = 1, ///< Show a simple news message (height 170 pixels)
- NM_THIN = 2, ///< Show a simple news message (height 130 pixels)
- NM_CALLBACK = 3, ///< Do some special processing before displaying news message. Which callback to call is in NewsCallback
-};
-
-/**
- * Various OR-able news-item flags.
- * note: NF_INCOLOR is set automatically if needed
- * @see NEWS_FLAGS
- */
-enum NewsFlags {
- NF_VIEWPORT = (1 << 1), ///< Does the news message have a viewport? (ingame picture of happening)
- NF_TILE = (1 << 2), ///< When clicked on the news message scroll to a given tile? Tile is in data_a/data_b
- NF_VEHICLE = (1 << 3), ///< When clicked on the message scroll to the vehicle? VehicleID is in data_a
- NF_FORCE_BIG = (1 << 4), ///< Force the appearance of a news message if it has already been shown (internal)
- NF_INCOLOR = (1 << 5), ///< Show the newsmessage in colour, otherwise it defaults to black & white
-};
-
-/** Special news items */
-enum NewsCallback {
- DNC_VEHICLEAVAIL = 0, ///< Show new vehicle available message. StringID is EngineID
- DNC_BANKRUPCY = 1, ///< Show bankrupcy message. StringID is PlayerID (0-3) and NewsBankrupcy (4-7)
-};
-
-/** Kinds of bankrupcy */
-enum NewsBankrupcy {
- NB_BTROUBLE = (1 << 4), ///< Company is in trouble (warning)
- NB_BMERGER = (2 << 4), ///< Company has been bought by another company
- NB_BBANKRUPT = (3 << 4), ///< Company has gone bankrupt
- NB_BNEWCOMPANY = (4 << 4), ///< A new company has been started
-};
-
-/**
- * Delete a news item type about a vehicle
- * if the news item type is INVALID_STRING_ID all news about the vehicle get
- * deleted
- */
-void DeleteVehicleNews(VehicleID, StringID news);
-
-#endif /* NEWS_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/news_func.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/news_func.h Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,29 @@
+/* $Id$ */
+
+/** @file news_func.h Functions related to news. */
+
+#ifndef NEWS_FUNC_H
+#define NEWS_FUNC_H
+
+#include "news_type.h"
+#include "vehicle_type.h"
+
+void AddNewsItem(StringID string, NewsMode mode, NewsFlag flag, NewsType type, NewsCallback callback, uint data_a, uint data_b);
+void NewsLoop();
+void DrawNewsBorder(const Window *w);
+void InitNewsItemStructs();
+
+extern NewsItem _statusbar_news_item;
+extern uint32 _news_display_opt;
+extern bool _news_ticker_sound;
+
+extern const char *_news_display_name[NT_END];
+
+/**
+ * Delete a news item type about a vehicle
+ * if the news item type is INVALID_STRING_ID all news about the vehicle get
+ * deleted
+ */
+void DeleteVehicleNews(VehicleID, StringID news);
+
+#endif /* NEWS_FUNC_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/news_gui.cpp
--- a/src/news_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/news_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -6,7 +6,7 @@
#include "gui.h"
#include "window_gui.h"
#include "viewport_func.h"
-#include "news.h"
+#include "news_func.h"
#include "settings_type.h"
#include "transparency.h"
#include "strings_func.h"
@@ -60,6 +60,16 @@
static NewsID _oldest_news = 0; ///< points to first item in fifo queue
static NewsID _latest_news = INVALID_NEWS; ///< points to last item in fifo queue
+struct news_d {
+ uint16 follow_vehicle;
+ int32 scrollpos_x;
+ int32 scrollpos_y;
+ int32 dest_scrollpos_x;
+ int32 dest_scrollpos_y;
+ NewsItem *ni;
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(news_d));
+
/** Forced news item.
* Users can force an item by accessing the history or "last message".
* If the message being shown was forced by the user, its index is stored in
@@ -68,8 +78,8 @@
static byte _total_news = 0; ///< Number of news items in FIFO queue @see _news_items
-void DrawNewsNewVehicleAvail(Window *w);
-void DrawNewsBankrupcy(Window *w);
+void DrawNewsNewVehicleAvail(Window *w, const NewsItem *ni);
+void DrawNewsBankrupcy(Window *w, const NewsItem *ni);
static void MoveToNextItem();
StringID GetNewsStringNewVehicleAvail(const NewsItem *ni);
@@ -117,118 +127,118 @@
static void NewsWindowProc(Window *w, WindowEvent *e)
{
switch (e->event) {
- case WE_CREATE: { // If chatbar is open at creation time, we need to go above it
- const Window *w1 = FindWindowById(WC_SEND_NETWORK_MSG, 0);
- w->message.msg = (w1 != NULL) ? w1->height : 0;
- } break;
-
- case WE_PAINT: {
- const NewsItem *ni = WP(w, news_d).ni;
- ViewPort *vp;
-
- switch (ni->display_mode) {
- case NM_NORMAL:
- case NM_THIN: {
- DrawNewsBorder(w);
-
- DrawString(2, 1, STR_00C6, TC_FROMSTRING);
-
- SetDParam(0, ni->date);
- DrawStringRightAligned(428, 1, STR_01FF, TC_FROMSTRING);
-
- if (!(ni->flags & NF_VIEWPORT)) {
- CopyInDParam(0, ni->params, lengthof(ni->params));
- DrawStringMultiCenter(215, ni->display_mode == NM_NORMAL ? 76 : 56,
- ni->string_id, w->width - 4);
- } else {
- /* Back up transparency options to draw news view */
- TransparencyOptionBits to_backup = _transparency_opt;
- _transparency_opt = 0;
- DrawWindowViewport(w);
- _transparency_opt = to_backup;
-
- /* Shade the viewport into gray, or color*/
- vp = w->viewport;
- GfxFillRect(vp->left - w->left, vp->top - w->top,
- vp->left - w->left + vp->width - 1, vp->top - w->top + vp->height - 1,
- (ni->flags & NF_INCOLOR ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY) | (1 << USE_COLORTABLE)
- );
+ case WE_CREATE: { // If chatbar is open at creation time, we need to go above it
+ const Window *w1 = FindWindowById(WC_SEND_NETWORK_MSG, 0);
+ w->message.msg = (w1 != NULL) ? w1->height : 0;
+ } break;
- CopyInDParam(0, ni->params, lengthof(ni->params));
- DrawStringMultiCenter(w->width / 2, 20, ni->string_id, w->width - 4);
- }
- break;
- }
+ case WE_PAINT: {
+ const NewsItem *ni = WP(w, news_d).ni;
+ ViewPort *vp;
- case NM_CALLBACK: {
- _draw_news_callback[ni->callback](w);
- break;
- }
+ switch (ni->display_mode) {
+ case NM_NORMAL:
+ case NM_THIN: {
+ DrawNewsBorder(w);
- default: {
- DrawWindowWidgets(w);
- if (!(ni->flags & NF_VIEWPORT)) {
- CopyInDParam(0, ni->params, lengthof(ni->params));
- DrawStringMultiCenter(140, 38, ni->string_id, 276);
- } else {
- DrawWindowViewport(w);
- CopyInDParam(0, ni->params, lengthof(ni->params));
- DrawStringMultiCenter(w->width / 2, w->height - 16, ni->string_id, w->width - 4);
+ DrawString(2, 1, STR_00C6, TC_FROMSTRING);
+
+ SetDParam(0, ni->date);
+ DrawStringRightAligned(428, 1, STR_01FF, TC_FROMSTRING);
+
+ if (!(ni->flags & NF_VIEWPORT)) {
+ CopyInDParam(0, ni->params, lengthof(ni->params));
+ DrawStringMultiCenter(215, ni->display_mode == NM_NORMAL ? 76 : 56,
+ ni->string_id, w->width - 4);
+ } else {
+ /* Back up transparency options to draw news view */
+ TransparencyOptionBits to_backup = _transparency_opt;
+ _transparency_opt = 0;
+ DrawWindowViewport(w);
+ _transparency_opt = to_backup;
+
+ /* Shade the viewport into gray, or color*/
+ vp = w->viewport;
+ GfxFillRect(vp->left - w->left, vp->top - w->top,
+ vp->left - w->left + vp->width - 1, vp->top - w->top + vp->height - 1,
+ (ni->flags & NF_INCOLOR ? PALETTE_TO_TRANSPARENT : PALETTE_TO_STRUCT_GREY) | (1 << USE_COLORTABLE)
+ );
+
+ CopyInDParam(0, ni->params, lengthof(ni->params));
+ DrawStringMultiCenter(w->width / 2, 20, ni->string_id, w->width - 4);
+ }
+ break;
}
- break;
- }
- }
- } break;
- case WE_CLICK: {
- switch (e->we.click.widget) {
- case 1: {
- NewsItem *ni = WP(w, news_d).ni;
- DeleteWindow(w);
- ni->duration = 0;
- _forced_news = INVALID_NEWS;
- } break;
- case 0: {
- NewsItem *ni = WP(w, news_d).ni;
- if (ni->flags & NF_VEHICLE) {
- Vehicle *v = GetVehicle(ni->data_a);
- ScrollMainWindowTo(v->x_pos, v->y_pos);
- } else if (ni->flags & NF_TILE) {
- if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0)
- ScrollMainWindowToTile(ni->data_b);
+ case NM_CALLBACK: {
+ _draw_news_callback[ni->callback](w, ni);
+ break;
+ }
+
+ default: {
+ DrawWindowWidgets(w);
+ if (!(ni->flags & NF_VIEWPORT)) {
+ CopyInDParam(0, ni->params, lengthof(ni->params));
+ DrawStringMultiCenter(140, 38, ni->string_id, 276);
+ } else {
+ DrawWindowViewport(w);
+ CopyInDParam(0, ni->params, lengthof(ni->params));
+ DrawStringMultiCenter(w->width / 2, w->height - 16, ni->string_id, w->width - 4);
+ }
+ break;
+ }
}
} break;
- }
- } break;
-
- case WE_KEYPRESS:
- if (e->we.keypress.keycode == WKC_SPACE) {
- /* Don't continue. */
- e->we.keypress.cont = false;
- DeleteWindow(w);
- }
- break;
- case WE_MESSAGE: // The chatbar has notified us that is was either created or closed
- switch (e->we.message.msg) {
- case WE_CREATE: w->message.msg = e->we.message.wparam; break;
- case WE_DESTROY: w->message.msg = 0; break;
- }
- break;
+ case WE_CLICK: {
+ switch (e->we.click.widget) {
+ case 1: {
+ NewsItem *ni = WP(w, news_d).ni;
+ DeleteWindow(w);
+ ni->duration = 0;
+ _forced_news = INVALID_NEWS;
+ } break;
+ case 0: {
+ NewsItem *ni = WP(w, news_d).ni;
+ if (ni->flags & NF_VEHICLE) {
+ Vehicle *v = GetVehicle(ni->data_a);
+ ScrollMainWindowTo(v->x_pos, v->y_pos);
+ } else if (ni->flags & NF_TILE) {
+ if (!ScrollMainWindowToTile(ni->data_a) && ni->data_b != 0)
+ ScrollMainWindowToTile(ni->data_b);
+ }
+ } break;
+ }
+ } break;
- case WE_TICK: { // Scroll up newsmessages from the bottom in steps of 4 pixels
- int diff;
- int y = max(w->top - 4, _screen.height - w->height - 12 - w->message.msg);
- if (y == w->top) return;
+ case WE_KEYPRESS:
+ if (e->we.keypress.keycode == WKC_SPACE) {
+ /* Don't continue. */
+ e->we.keypress.cont = false;
+ DeleteWindow(w);
+ }
+ break;
- if (w->viewport != NULL)
- w->viewport->top += y - w->top;
+ case WE_MESSAGE: // The chatbar has notified us that is was either created or closed
+ switch (e->we.message.msg) {
+ case WE_CREATE: w->message.msg = e->we.message.wparam; break;
+ case WE_DESTROY: w->message.msg = 0; break;
+ }
+ break;
- diff = Delta(w->top, y);
- w->top = y;
+ case WE_TICK: { // Scroll up newsmessages from the bottom in steps of 4 pixels
+ int diff;
+ int y = max(w->top - 4, _screen.height - w->height - 12 - w->message.msg);
+ if (y == w->top) return;
- SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height);
- } break;
+ if (w->viewport != NULL)
+ w->viewport->top += y - w->top;
+
+ diff = Delta(w->top, y);
+ w->top = y;
+
+ SetDirtyBlocks(w->left, w->top - diff, w->left + w->width, w->top + w->height);
+ } break;
}
}
@@ -254,17 +264,15 @@
/**
* Add a new newsitem to be shown.
- * @param string String to display, can have special values based on parameter \a flags
- * @param flags various control bits that will show various news-types. See macro NEWS_FLAGS()
+ * @param string String to display, can have special values based on parameter \a display_mode
+ * @param display_mode, any of the NewsMode enums (NM_)
+ * @param flags any of the NewsFlag enums (NF_)
+ * @param type news category, any of the NewsType enums (NT_)
+ * @param callback news callback function, any of the NewsCallback enums (DNC_)
* @param data_a news-specific value based on news type
* @param data_b news-specific value based on news type
- * @note flags exists of 4 byte-sized extra parameters.
- * -# Bits 0 - 7 display_mode, any of the NewsMode enums (NM_)
- * -# Bits 8 - 15 news flags, any of the NewsFlags enums (NF_)
- * -# Bits 16 - 23 news category, any of the NewsType enums (NT_)
- * -# Bits 24 - 31 news callback function, any of the NewsCallback enums (DNC_)
*
- * If the display mode is NM_CALLBACK, special news is shown and parameter
+ * @note If the display mode is NM_CALLBACK, special news is shown and parameter
* \a string has a special meaning.
* - For DNC_TRAINAVAIL, DNC_ROADAVAIL, DNC_SHIPAVAIL, DNC_AIRCRAFTAVAIL messages: StringID is
* the index of the engine that is shown
@@ -274,11 +282,11 @@
* @see NewsBankrupcy
*
* @see NewsMode
- * @see NewsFlags
+ * @see NewsFlag
* @see NewsType
* @see NewsCallback
*/
-void AddNewsItem(StringID string, uint32 flags, uint data_a, uint data_b)
+void AddNewsItem(StringID string, NewsMode display_mode, NewsFlag flags, NewsType type, NewsCallback callback, uint data_a, uint data_b)
{
NewsID l_news;
@@ -306,36 +314,33 @@
_current_news, _oldest_news, _latest_news, _forced_news, _total_news);*/
/* Add news to _latest_news */
- {
- Window *w;
- NewsItem *ni = &_news_items[_latest_news];
- memset(ni, 0, sizeof(*ni));
-
- ni->string_id = string;
- ni->display_mode = (byte)flags;
- ni->flags = (byte)(flags >> 8);
-
- /* show this news message in color? */
- if (_cur_year >= _patches.colored_news_year) ni->flags |= NF_INCOLOR;
+ NewsItem *ni = &_news_items[_latest_news];
+ memset(ni, 0, sizeof(*ni));
- ni->type = (byte)(flags >> 16);
- ni->callback = (byte)(flags >> 24);
- ni->data_a = data_a;
- ni->data_b = data_b;
- ni->date = _date;
- CopyOutDParam(ni->params, 0, lengthof(ni->params));
+ ni->string_id = string;
+ ni->display_mode = display_mode;
+ ni->flags = flags;
- w = FindWindowById(WC_MESSAGE_HISTORY, 0);
- if (w == NULL) return;
- SetWindowDirty(w);
- w->vscroll.count = _total_news;
- }
+ /* show this news message in color? */
+ if (_cur_year >= _patches.colored_news_year) ni->flags |= NF_INCOLOR;
+
+ ni->type = type;
+ ni->callback = callback;
+ ni->data_a = data_a;
+ ni->data_b = data_b;
+ ni->date = _date;
+ CopyOutDParam(ni->params, 0, lengthof(ni->params));
+
+ Window *w = FindWindowById(WC_MESSAGE_HISTORY, 0);
+ if (w == NULL) return;
+ SetWindowDirty(w);
+ w->vscroll.count = _total_news;
}
/**
* Maximum age of news items.
- * Don't show item if it's older than x days, corresponds with NewsType in news.h
+ * Don't show item if it's older than x days, corresponds with NewsType in news_type.h
* @see NewsType
*/
static const byte _news_items_age[NT_END] = {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/news_type.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/news_type.h Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,96 @@
+/* $Id$ */
+
+/** @file news_type.h Types related to news. */
+
+#ifndef NEWS_TYPE_H
+#define NEWS_TYPE_H
+
+#include "window_type.h"
+#include "date_type.h"
+#include "strings_type.h"
+
+/**
+ * Type of news.
+ */
+enum NewsType {
+ NT_ARRIVAL_PLAYER, ///< Cargo arrived for player
+ NT_ARRIVAL_OTHER, ///< Cargo arrived for competitor
+ NT_ACCIDENT, ///< An accident or disaster has occurred
+ NT_COMPANY_INFO, ///< Company info (new companies, bankrupcy messages)
+ NT_OPENCLOSE, ///< Opening and closing of industries
+ NT_ECONOMY, ///< Economic changes (recession, industry up/dowm)
+ NT_INDUSTRY_PLAYER, ///< Production changes of industry serviced by local player
+ NT_INDUSTRY_OTHER, ///< Production changes of industry serviced by competitor(s)
+ NT_INDUSTRY_NOBODY, ///< Other industry production changes
+ NT_ADVICE, ///< Bits of news about vehicles of the player
+ NT_NEW_VEHICLES, ///< New vehicle has become available
+ NT_ACCEPTANCE, ///< A type of cargo is (no longer) accepted
+ NT_SUBSIDIES, ///< News about subsidies (announcements, expirations, acceptance)
+ NT_GENERAL, ///< General news (from towns)
+ NT_END, ///< end-of-array marker
+};
+
+/**
+ * News mode.
+ */
+enum NewsMode {
+ NM_SMALL = 0, ///< Show only a small popup informing us about vehicle age for example
+ NM_NORMAL = 1, ///< Show a simple news message (height 170 pixels)
+ NM_THIN = 2, ///< Show a simple news message (height 130 pixels)
+ NM_CALLBACK = 3, ///< Do some special processing before displaying news message. Which callback to call is in NewsCallback
+};
+
+/**
+ * Various OR-able news-item flags.
+ * note: NF_INCOLOR is set automatically if needed
+ */
+enum NewsFlag {
+ NF_NONE = 0, ///< No flag is set.
+ NF_VIEWPORT = (1 << 1), ///< Does the news message have a viewport? (ingame picture of happening)
+ NF_TILE = (1 << 2), ///< When clicked on the news message scroll to a given tile? Tile is in data_a/data_b
+ NF_VEHICLE = (1 << 3), ///< When clicked on the message scroll to the vehicle? VehicleID is in data_a
+ NF_FORCE_BIG = (1 << 4), ///< Force the appearance of a news message if it has already been shown (internal)
+ NF_INCOLOR = (1 << 5), ///< Show the newsmessage in colour, otherwise it defaults to black & white
+};
+DECLARE_ENUM_AS_BIT_SET(NewsFlag);
+
+
+/**
+ * Special news items
+ */
+enum NewsCallback {
+ DNC_VEHICLEAVAIL = 0, ///< Show new vehicle available message. StringID is EngineID
+ DNC_BANKRUPCY = 1, ///< Show bankrupcy message. StringID is PlayerID (0-3) and NewsBankrupcy (4-7)
+ DNC_NONE = 0xFF, ///< No news callback.
+};
+
+/**
+ * Kinds of bankrupcy
+ */
+enum NewsBankrupcy {
+ NB_BTROUBLE, ///< Company is in trouble (warning)
+ NB_BMERGER, ///< Company has been bought by another company
+ NB_BBANKRUPT, ///< Company has gone bankrupt
+ NB_BNEWCOMPANY, ///< A new company has been started
+};
+
+struct NewsItem {
+ StringID string_id; ///< Message text (sometimes also used for storing other info)
+ uint16 duration; ///< Remaining time for showing this news message
+ Date date; ///< Date of the news
+ NewsFlag flags; ///< NewsFlags bits @see NewsFlag
+ NewsMode display_mode; ///< Display mode value @see NewsMode
+ NewsType type; ///< News category @see NewsType
+ NewsCallback callback; ///< Call-back function
+
+ uint data_a; ///< Reference to tile or vehicle
+ uint data_b; ///< Reference to second tile or vehicle
+
+ uint64 params[10];
+};
+
+typedef bool ValidationProc(uint data_a, uint data_b);
+typedef void DrawNewsCallbackProc(Window *w, const NewsItem *ni);
+typedef StringID GetNewsStringCallbackProc(const NewsItem *ni);
+
+#endif /* NEWS_TYPE_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/oldloader.cpp
--- a/src/oldloader.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/oldloader.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -339,6 +339,18 @@
ClrBit(v->u.road.state, RVS_IS_STOPPING);
}
+ /* The subtype should be 0, but it sometimes isn't :( */
+ if (v->type == VEH_ROAD) v->subtype = 0;
+
+ /* Sometimes primary vehicles would have a nothing (invalid) order
+ * or vehicles that could not have an order would still have a
+ * (loading) order which causes assertions and the like later on.
+ */
+ if (!IsPlayerBuildableVehicleType(v) ||
+ (v->IsPrimaryVehicle() && v->current_order.type == OT_NOTHING)) {
+ v->current_order.type = OT_DUMMY;
+ }
+
FOR_ALL_VEHICLES_FROM(u, v->index + 1) {
/* If a vehicle has the same orders, add the link to eachother
* in both vehicles */
@@ -428,7 +440,7 @@
static const OldChunks town_chunk[] = {
OCL_SVAR( OC_TILE, Town, xy ),
- OCL_SVAR( OC_FILE_U16 | OC_VAR_U32, Town, population ),
+ OCL_NULL( 2 ), ///< population, no longer in use
OCL_SVAR( OC_UINT16, Town, townnametype ),
OCL_SVAR( OC_UINT32, Town, townnameparts ),
OCL_SVAR( OC_UINT8, Town, grow_counter ),
@@ -451,7 +463,7 @@
nothing changed ? ? */
OCL_SVAR( OC_FILE_U32 | OC_VAR_U8, Town, have_ratings ),
OCL_SVAR( OC_FILE_U32 | OC_VAR_U8, Town, statues ),
- OCL_SVAR( OC_UINT16, Town, num_houses ),
+ OCL_NULL( 2 ), ///< num_houses, no longer in use
OCL_SVAR( OC_UINT8, Town, time_until_rebuild ),
OCL_SVAR( OC_UINT8, Town, growth_rate ),
@@ -952,17 +964,15 @@
uint temp = ls->total_read;
bool res;
- /* We changed the offset of the vehicle types, so fix it
- * Basically v->type -= 0x10; would suffice, but play safely */
switch (v->type) {
default: NOT_REACHED();
- case 0x00 /*VEH_INVALID */: v = new (v) InvalidVehicle(); res = LoadChunk(ls, NULL, vehicle_empty_chunk); break;
- case 0x10 /*VEH_TRAIN */: v = new (v) Train(); res = LoadChunk(ls, &v->u.rail, vehicle_train_chunk); break;
- case 0x11 /*VEH_ROAD */: v = new (v) RoadVehicle(); res = LoadChunk(ls, &v->u.road, vehicle_road_chunk); break;
- case 0x12 /*VEH_SHIP */: v = new (v) Ship(); res = LoadChunk(ls, &v->u.ship, vehicle_ship_chunk); break;
- case 0x13 /*VEH_AIRCRAFT*/: v = new (v) Aircraft(); res = LoadChunk(ls, &v->u.air, vehicle_air_chunk); break;
- case 0x14 /*VEH_SPECIAL */: v = new (v) SpecialVehicle(); res = LoadChunk(ls, &v->u.special, vehicle_special_chunk); break;
- case 0x15 /*VEH_DISASTER*/: v = new (v) DisasterVehicle(); res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
+ case VEH_INVALID : res = LoadChunk(ls, NULL, vehicle_empty_chunk); break;
+ case VEH_TRAIN : res = LoadChunk(ls, &v->u.rail, vehicle_train_chunk); break;
+ case VEH_ROAD : res = LoadChunk(ls, &v->u.road, vehicle_road_chunk); break;
+ case VEH_SHIP : res = LoadChunk(ls, &v->u.ship, vehicle_ship_chunk); break;
+ case VEH_AIRCRAFT: res = LoadChunk(ls, &v->u.air, vehicle_air_chunk); break;
+ case VEH_SPECIAL : res = LoadChunk(ls, &v->u.special, vehicle_special_chunk); break;
+ case VEH_DISASTER: res = LoadChunk(ls, &v->u.disaster, vehicle_disaster_chunk); break;
}
/* This chunk size should always be 10 bytes */
@@ -977,7 +987,6 @@
static uint16 _cargo_count;
static const OldChunks vehicle_chunk[] = {
- OCL_SVAR( OC_UINT8, Vehicle, type ),
OCL_SVAR( OC_UINT8, Vehicle, subtype ),
OCL_NULL( 2 ), ///< Hash, calculated automatically
@@ -1066,7 +1075,18 @@
for (i = 0; i < _old_vehicle_multiplier; i++) {
_current_vehicle_id = num * _old_vehicle_multiplier + i;
- Vehicle *v = new (_current_vehicle_id) InvalidVehicle();
+ /* Read the vehicle type and allocate the right vehicle */
+ Vehicle *v;
+ switch (ReadByte(ls)) {
+ default: NOT_REACHED();
+ case 0x00 /*VEH_INVALID */: v = new (_current_vehicle_id) InvalidVehicle(); break;
+ case 0x10 /*VEH_TRAIN */: v = new (_current_vehicle_id) Train(); break;
+ case 0x11 /*VEH_ROAD */: v = new (_current_vehicle_id) RoadVehicle(); break;
+ case 0x12 /*VEH_SHIP */: v = new (_current_vehicle_id) Ship(); break;
+ case 0x13 /*VEH_AIRCRAFT*/: v = new (_current_vehicle_id) Aircraft(); break;
+ case 0x14 /*VEH_SPECIAL */: v = new (_current_vehicle_id) SpecialVehicle(); break;
+ case 0x15 /*VEH_DISASTER*/: v = new (_current_vehicle_id) DisasterVehicle(); break;
+ }
if (!LoadChunk(ls, v, vehicle_chunk)) return false;
/* This should be consistent, else we have a big problem... */
@@ -1076,7 +1096,12 @@
}
if (_old_order_ptr != 0 && _old_order_ptr != 0xFFFFFFFF) {
- v->orders = GetOrder(REMAP_ORDER_IDX(_old_order_ptr));
+ uint old_id = REMAP_ORDER_IDX(_old_order_ptr);
+ /* There is a maximum of 5000 orders in old savegames, so *if*
+ * we go over that limit something is very wrong. In that case
+ * we just assume there are no orders for the vehicle.
+ */
+ if (old_id < 5000) v->orders = GetOrder(old_id);
}
AssignOrder(&v->current_order, UnpackOldOrder(_old_order));
diff -r cc77111ebd85 -r 9707ad4c9b60 src/openttd.cpp
--- a/src/openttd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/openttd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -29,7 +29,7 @@
#include "command_func.h"
#include "town.h"
#include "industry.h"
-#include "news.h"
+#include "news_func.h"
#include "engine.h"
#include "fileio.h"
#include "fios.h"
@@ -1358,9 +1358,9 @@
if (CheckSavegameVersionOldStyle(6, 1)) UpdateSignOwner();
/* In old version there seems to be a problem that water is owned by
- OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
- (4.3) version, so I just check when versions are older, and then
- walk through the whole map.. */
+ * OWNER_NONE, not OWNER_WATER.. I can't replicate it for the current
+ * (4.3) version, so I just check when versions are older, and then
+ * walk through the whole map.. */
if (CheckSavegameVersionOldStyle(4, 3)) {
for (TileIndex t = 0; t < map_size; t++) {
if (IsTileType(t, MP_WATER) && GetTileOwner(t) >= MAX_PLAYERS) {
@@ -1409,7 +1409,7 @@
switch (gcf_res) {
case GLC_COMPATIBLE: _switch_mode_errorstr = STR_NEWGRF_COMPATIBLE_LOAD_WARNING; break;
- case GLC_NOT_FOUND: _switch_mode_errorstr = STR_NEWGRF_DISABLED_WARNING; _pause_game = (byte)-1; break;
+ case GLC_NOT_FOUND: _switch_mode_errorstr = STR_NEWGRF_DISABLED_WARNING; _pause_game = -1; break;
default: break;
}
@@ -2044,8 +2044,8 @@
}
}
- /* Check that house ids are still valid. */
- CheckHouseIDs();
+ /* Check and update house and town values */
+ UpdateHousesAndTowns();
if (CheckSavegameVersion(43)) {
for (TileIndex t = 0; t < map_size; t++) {
@@ -2441,6 +2441,15 @@
}
}
+ if (CheckSavegameVersion(91)) {
+ /* Increase HouseAnimationFrame from 5 to 7 bits */
+ for (TileIndex t = 0; t < map_size; t++) {
+ if (IsTileType(t, MP_HOUSE) && GetHouseType(t) >= NEW_HOUSE_OFFSET) {
+ SetHouseAnimationFrame(t, GB(_m[t].m6, 3, 5));
+ }
+ }
+ }
+
return InitializeWindowsAndCaches();
}
@@ -2462,8 +2471,8 @@
/* update station and waypoint graphics */
AfterLoadWaypoints();
AfterLoadStations();
- /* check that house ids are still valid */
- CheckHouseIDs();
+ /* Check and update house and town values */
+ UpdateHousesAndTowns();
/* redraw the whole screen */
MarkWholeScreenDirty();
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/openttd.h
--- a/src/openttd.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/openttd.h Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,6 @@
struct Waypoint;
struct Station;
struct ViewPort;
-struct NewsItem;
struct DrawPixelInfo;
struct Group;
typedef byte VehicleOrderID; ///< The index of an order within its current vehicle (not pool related)
@@ -156,6 +155,6 @@
extern byte _game_mode;
extern bool _exit_game;
-extern byte _pause_game;
+extern int8 _pause_game;
#endif /* OPENTTD_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/order_cmd.cpp
--- a/src/order_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/order_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -11,7 +11,7 @@
#include "command_func.h"
#include "station.h"
#include "player_func.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "vehicle_gui.h"
#include "cargotype.h"
@@ -997,8 +997,8 @@
break;
}
- /* Copy timetable */
- if (!DoCommandP(0, v->index | (i << 16) | (1 << 25),
+ /* Copy timetable if enabled */
+ if (_patches.timetabling && !DoCommandP(0, v->index | (i << 16) | (1 << 25),
bak->order[i].wait_time << 16 | bak->order[i].travel_time, NULL,
CMD_CHANGE_TIMETABLE | CMD_NO_TEST_IF_IN_NETWORK)) {
break;
@@ -1135,7 +1135,7 @@
SetDParam(0, v->unitnumber);
AddNewsItem(
message,
- NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, 0),
+ NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE,
v->index,
0
);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/osk_gui.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/osk_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,370 @@
+/* $Id$ */
+
+/** @file osk_gui.cpp The On Screen Keyboard GUI */
+
+#include "stdafx.h"
+#include "openttd.h"
+
+#include "textbuf_gui.h"
+#include "window_gui.h"
+#include "string_func.h"
+#include "strings_func.h"
+#include "debug.h"
+#include "window_func.h"
+#include "gfx_func.h"
+
+#include "table/sprites.h"
+#include "table/strings.h"
+
+struct osk_d {
+ querystr_d *qs; // text-input
+ int text_btn; // widget number of parent's text field
+ int ok_btn; // widget number of parent's ok button (=0 when ok shouldn't be passed on)
+ int cancel_btn; // widget number of parent's cancel button (=0 when cancel shouldn't be passed on; text will be reverted to original)
+ Textbuf *text; // pointer to parent's textbuffer (to update caret position)
+ char *orig; // the original text, in case we cancel
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(osk_d));
+
+enum OskWidgets {
+ OSK_WIDGET_TEXT = 3,
+ OSK_WIDGET_CANCEL = 5,
+ OSK_WIDGET_OK,
+ OSK_WIDGET_BACKSPACE,
+ OSK_WIDGET_SPECIAL,
+ OSK_WIDGET_CAPS,
+ OSK_WIDGET_SHIFT,
+ OSK_WIDGET_SPACE,
+ OSK_WIDGET_LEFT,
+ OSK_WIDGET_RIGHT,
+ OSK_WIDGET_LETTERS
+};
+
+char _keyboard_opt[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
+static WChar _keyboard[2][OSK_KEYBOARD_ENTRIES];
+
+enum {
+ KEYS_NONE,
+ KEYS_SHIFT,
+ KEYS_CAPS
+};
+static byte _keystate = KEYS_NONE;
+
+/*
+ * Only show valid characters; do not show characters that would
+ * only insert a space when we have a spacebar to do that or
+ * characters that are not allowed to be entered.
+ */
+static void ChangeOskDiabledState(Window *w, const querystr_d *qs, bool shift)
+{
+ for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
+ w->SetWidgetDisabledState(OSK_WIDGET_LETTERS + i,
+ !IsValidChar(_keyboard[shift][i], qs->afilter) || _keyboard[shift][i] == ' ');
+ }
+ w->SetWidgetDisabledState(OSK_WIDGET_SPACE, !IsValidChar(' ', qs->afilter));
+}
+
+/* on screen keyboard */
+static void OskWndProc(Window *w, WindowEvent *e)
+{
+ querystr_d *qs = WP(w, osk_d).qs;
+
+ switch (e->event) {
+ case WE_CREATE:
+ SetBit(_no_scroll, SCROLL_EDIT);
+ /* Not needed by default. */
+ w->DisableWidget(OSK_WIDGET_SPECIAL);
+ break;
+
+ case WE_PAINT: {
+ bool shift = HasBit(_keystate, KEYS_CAPS) ^ HasBit(_keystate, KEYS_SHIFT);
+
+ w->LowerWidget(OSK_WIDGET_TEXT);
+ w->SetWidgetLoweredState(OSK_WIDGET_SHIFT, HasBit(_keystate, KEYS_SHIFT));
+ w->SetWidgetLoweredState(OSK_WIDGET_CAPS, HasBit(_keystate, KEYS_CAPS));
+
+ ChangeOskDiabledState(w, qs, shift);
+
+ SetDParam(0, qs->caption);
+ DrawWindowWidgets(w);
+
+ for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
+ DrawCharCentered(_keyboard[shift][i],
+ w->widget[OSK_WIDGET_LETTERS + i].left + 8,
+ w->widget[OSK_WIDGET_LETTERS + i].top + 3,
+ TC_BLACK);
+ }
+
+ DrawEditBox(w, qs, OSK_WIDGET_TEXT);
+ break;
+ }
+
+ case WE_CLICK:
+ /* clicked a letter */
+ if (e->we.click.widget >= OSK_WIDGET_LETTERS) {
+ bool shift = HasBit(_keystate, KEYS_CAPS) ^ HasBit(_keystate, KEYS_SHIFT);
+
+ WChar c = _keyboard[shift][e->we.click.widget - OSK_WIDGET_LETTERS];
+
+ if (!IsValidChar(c, qs->afilter)) break;
+
+ if (InsertTextBufferChar(&qs->text, c)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+
+ if (HasBit(_keystate, KEYS_SHIFT)) {
+ ToggleBit(_keystate, KEYS_SHIFT);
+ w->widget[OSK_WIDGET_SHIFT].color = HasBit(_keystate, KEYS_SHIFT) ? 15 : 14;
+ SetWindowDirty(w);
+ }
+ break;
+ }
+
+ switch (e->we.click.widget) {
+ case OSK_WIDGET_BACKSPACE:
+ if (DeleteTextBufferChar(&qs->text, WKC_BACKSPACE)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+ break;
+
+ case OSK_WIDGET_SPECIAL:
+ /*
+ * Anything device specific can go here.
+ * The button itself is hidden by default, and when you need it you
+ * can not hide it in the create event.
+ */
+ break;
+
+ case OSK_WIDGET_CAPS:
+ ToggleBit(_keystate, KEYS_CAPS);
+ SetWindowDirty(w);
+ break;
+
+ case OSK_WIDGET_SHIFT:
+ ToggleBit(_keystate, KEYS_SHIFT);
+ SetWindowDirty(w);
+ break;
+
+ case OSK_WIDGET_SPACE:
+ if (InsertTextBufferChar(&qs->text, ' ')) w->InvalidateWidget(OSK_WIDGET_TEXT);
+ break;
+
+ case OSK_WIDGET_LEFT:
+ if (MoveTextBufferPos(&qs->text, WKC_LEFT)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+ break;
+
+ case OSK_WIDGET_RIGHT:
+ if (MoveTextBufferPos(&qs->text, WKC_RIGHT)) w->InvalidateWidget(OSK_WIDGET_TEXT);
+ break;
+
+ case OSK_WIDGET_OK:
+ if (qs->orig == NULL || strcmp(qs->text.buf, qs->orig) != 0) {
+ /* pass information by simulating a button press on parent window */
+ if (WP(w, osk_d).ok_btn != 0) {
+ Window *parent = w->parent;
+ WindowEvent e;
+ e.event = WE_CLICK;
+ e.we.click.widget = WP(w, osk_d).ok_btn;
+ parent->wndproc(parent, &e);
+ }
+ }
+ DeleteWindow(w);
+ break;
+
+ case OSK_WIDGET_CANCEL:
+ if (WP(w, osk_d).cancel_btn != 0) { // pass a cancel event to the parent window
+ Window *parent = w->parent;
+ WindowEvent e;
+ e.event = WE_CLICK;
+ e.we.click.widget = WP(w, osk_d).cancel_btn;
+ parent->wndproc(parent, &e);
+ } else { // or reset to original string
+ strcpy(qs->text.buf, WP(w, osk_d).orig);
+ UpdateTextBufferSize(&qs->text);
+ MoveTextBufferPos(&qs->text, WKC_END);
+ }
+ DeleteWindow(w);
+ break;
+ }
+ /* make sure that the parent window's textbox also gets updated */
+ if (w->parent != NULL) w->parent->InvalidateWidget(WP(w, osk_d).text_btn);
+ break;
+
+ case WE_MOUSELOOP:
+ HandleEditBox(w, qs, OSK_WIDGET_TEXT);
+ /* make the caret of the parent window also blink */
+ w->parent->InvalidateWidget(WP(w, osk_d).text_btn);
+ break;
+ }
+}
+
+static const Widget _osk_widgets[] = {
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_CAPTION, RESIZE_NONE, 14, 0, 255, 0, 13, STR_012D, STR_NULL},
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 255, 14, 29, 0x0, STR_NULL},
+{ WWT_EDITBOX, RESIZE_NONE, 14, 2, 253, 16, 27, 0x0, STR_NULL},
+
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 255, 30, 139, 0x0, STR_NULL},
+
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 3, 108, 35, 46, STR_012E_CANCEL, STR_NULL},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 111, 216, 35, 46, STR_012F_OK, STR_NULL},
+{ WWT_PUSHIMGBTN, RESIZE_NONE, 14, 219, 252, 35, 46, SPR_OSK_BACKSPACE, STR_NULL},
+
+{ WWT_PUSHIMGBTN, RESIZE_NONE, 14, 3, 27, 67, 82, SPR_OSK_SPECIAL, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 36, 85, 100, SPR_OSK_CAPS, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 27, 103, 118, SPR_OSK_SHIFT, STR_NULL},
+
+{ WWT_PUSHTXTBTN, RESIZE_NONE, 14, 75, 189, 121, 136, STR_EMPTY, STR_NULL},
+
+{ WWT_PUSHIMGBTN, RESIZE_NONE, 14, 219, 234, 121, 136, SPR_OSK_LEFT, STR_NULL},
+{ WWT_PUSHIMGBTN, RESIZE_NONE, 14, 237, 252, 121, 136, SPR_OSK_RIGHT, STR_NULL},
+
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 3, 18, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 21, 36, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 39, 54, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 57, 72, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 75, 90, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 93, 108, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 111, 126, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 129, 144, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 147, 162, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 165, 180, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 183, 198, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 201, 216, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 219, 234, 49, 64, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 237, 252, 49, 64, 0x0, STR_NULL},
+
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 30, 45, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 48, 63, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 66, 81, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 84, 99, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 102, 117, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 120, 135, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 138, 153, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 156, 171, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 174, 189, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 192, 207, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 210, 225, 67, 82, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 228, 243, 67, 82, 0x0, STR_NULL},
+
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 39, 54, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 57, 72, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 75, 90, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 93, 108, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 111, 126, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 129, 144, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 147, 162, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 165, 180, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 183, 198, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 201, 216, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 219, 234, 85, 100, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 237, 252, 85, 100, 0x0, STR_NULL},
+
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 30, 45, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 48, 63, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 66, 81, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 84, 99, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 102, 117, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 120, 135, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 138, 153, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 156, 171, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 174, 189, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 192, 207, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 210, 225, 103, 118, 0x0, STR_NULL},
+{ WWT_PUSHBTN, RESIZE_NONE, 14, 228, 243, 103, 118, 0x0, STR_NULL},
+
+{ WIDGETS_END},
+};
+
+WindowDesc _osk_desc = {
+ WDP_CENTER, WDP_CENTER, 256, 140, 256, 140,
+ WC_OSK, WC_NONE,
+ WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+ _osk_widgets,
+ OskWndProc
+};
+
+/**
+ * Retrieve keyboard layout from language string or (if set) config file.
+ * Also check for invalid characters.
+ */
+void GetKeyboardLayout()
+{
+ char keyboard[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
+ char errormark[2][OSK_KEYBOARD_ENTRIES + 1]; // used for marking invalid chars
+ bool has_error = false; // true when an invalid char is detected
+
+ if (StrEmpty(_keyboard_opt[0])) {
+ GetString(keyboard[0], STR_OSK_KEYBOARD_LAYOUT, lastof(keyboard[0]));
+ } else {
+ strncpy(keyboard[0], _keyboard_opt[0], lengthof(keyboard[0]));
+ }
+
+ if (StrEmpty(_keyboard_opt[1])) {
+ GetString(keyboard[1], STR_OSK_KEYBOARD_LAYOUT_CAPS, lastof(keyboard[1]));
+ } else {
+ strncpy(keyboard[1], _keyboard_opt[1], lengthof(keyboard[1]));
+ }
+
+ for (uint j = 0; j < 2; j++) {
+ const char *kbd = keyboard[j];
+ bool ended = false;
+ for (uint i = 0; i < OSK_KEYBOARD_ENTRIES; i++) {
+ _keyboard[j][i] = Utf8Consume(&kbd);
+
+ /* Be lenient when the last characters are missing (is quite normal) */
+ if (_keyboard[j][i] == '\0' || ended) {
+ ended = true;
+ _keyboard[j][i] = ' ';
+ continue;
+ }
+
+ if (IsPrintable(_keyboard[j][i])) {
+ errormark[j][i] = ' ';
+ } else {
+ has_error = true;
+ errormark[j][i] = '^';
+ _keyboard[j][i] = ' ';
+ }
+ }
+ }
+
+ if (has_error) {
+ ShowInfoF("The keyboard layout you selected contains invalid chars. Please check those chars marked with ^.");
+ ShowInfoF("Normal keyboard: %s", keyboard[0]);
+ ShowInfoF(" %s", errormark[0]);
+ ShowInfoF("Caps Lock: %s", keyboard[1]);
+ ShowInfoF(" %s", errormark[1]);
+ }
+}
+
+/**
+ * Show the osk associated with a given textbox
+ * @param parent pointer to the Window where this keyboard originated from
+ * @param q querystr_d pointer to the query string of the parent, which is
+ * shared for both windows
+ * @param button widget number of parent's textbox
+ * @param cancel widget number of parent's cancel button (0 if cancel events
+ * should not be passed)
+ * @param ok widget number of parent's ok button (0 if ok events should not
+ * be passed)
+ */
+void ShowOnScreenKeyboard(Window *parent, querystr_d *q, int button, int cancel, int ok)
+{
+ DeleteWindowById(WC_OSK, 0);
+
+ Window *w = AllocateWindowDesc(&_osk_desc);
+
+ w->parent = parent;
+ assert(parent != NULL);
+
+ if (parent->widget[button].data != 0) q->caption = parent->widget[button].data;
+
+ WP(w, osk_d).qs = q;
+ WP(w, osk_d).text_btn = button;
+ WP(w, osk_d).cancel_btn = cancel;
+ WP(w, osk_d).ok_btn = ok;
+ WP(w, osk_d).text = &q->text;
+
+ GetKeyboardLayout();
+
+ /* make a copy in case we need to reset later */
+ strcpy(_orig_str_buf, WP(w, osk_d).qs->text.buf);
+ WP(w, osk_d).orig = _orig_str_buf;
+}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/ottdres.rc.in
--- a/src/ottdres.rc.in Thu Mar 27 05:15:06 2008 +0000
+++ b/src/ottdres.rc.in Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
#ifdef MSVC
#include "winres.h"
#else
-#include "afxres.h"
+#define IDC_STATIC (-1) // all static controls
#endif
/////////////////////////////////////////////////////////////////////////////
diff -r cc77111ebd85 -r 9707ad4c9b60 src/pathfind.cpp
--- a/src/pathfind.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/pathfind.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -540,24 +540,6 @@
}
-static const uint16 _is_upwards_slope[15] = {
- 0, ///< no tileh
- (1 << TRACKDIR_X_SW) | (1 << TRACKDIR_Y_NW), ///< 1
- (1 << TRACKDIR_X_SW) | (1 << TRACKDIR_Y_SE), ///< 2
- (1 << TRACKDIR_X_SW), ///< 3
- (1 << TRACKDIR_X_NE) | (1 << TRACKDIR_Y_SE), ///< 4
- 0, ///< 5
- (1 << TRACKDIR_Y_SE), ///< 6
- 0, ///< 7
- (1 << TRACKDIR_X_NE) | (1 << TRACKDIR_Y_NW), ///< 8,
- (1 << TRACKDIR_Y_NW), ///< 9
- 0, ///< 10
- 0, ///< 11,
- (1 << TRACKDIR_X_NE), ///< 12
- 0, ///< 13
- 0, ///< 14
-};
-
static uint DistanceMoo(TileIndex t0, TileIndex t1)
{
const uint dx = Delta(TileX(t0), TileX(t1));
@@ -629,37 +611,22 @@
/* If the tile is the entry tile of a tunnel, and we're not going out of the tunnel,
* need to find the exit of the tunnel. */
if (IsTileType(tile, MP_TUNNELBRIDGE)) {
- if (IsTunnel(tile)) {
- if (GetTunnelBridgeDirection(tile) != ReverseDiagDir(direction)) {
- /* We are not just driving out of the tunnel */
- if (GetTunnelBridgeDirection(tile) != direction ||
- GetTunnelBridgeTransportType(tile) != tpf->tracktype) {
- /* We are not driving into the tunnel, or it is an invalid tunnel */
- continue;
- }
- if (!HasBit(tpf->railtypes, GetRailType(tile))) {
- bits = TRACK_BIT_NONE;
- break;
- }
+ if (GetTunnelBridgeDirection(tile) != ReverseDiagDir(direction)) {
+ /* We are not just driving out of the tunnel/bridge */
+ if (GetTunnelBridgeDirection(tile) != direction ||
+ GetTunnelBridgeTransportType(tile) != tpf->tracktype) {
+ /* We are not driving into the tunnel/bridge, or it is an invalid tunnel/bridge */
+ continue;
+ }
+ if (!HasBit(tpf->railtypes, GetRailType(tile))) {
+ bits = TRACK_BIT_NONE;
+ break;
+ }
- TileIndex endtile = GetOtherTunnelEnd(tile);
- si.cur_length += DIAG_FACTOR * (GetTunnelBridgeLength(tile, endtile) + 1);
- tile = endtile;
- /* tile now points to the exit tile of the tunnel */
- }
- } else { // IsBridge(tile)
- TileIndex tile_end;
- if (GetTunnelBridgeDirection(tile) != ReverseDiagDir(direction)) {
- /* We are not just leaving the bridge */
- if (GetTunnelBridgeDirection(tile) != direction ||
- GetTunnelBridgeTransportType(tile) != tpf->tracktype) {
- /* Not entering the bridge or not compatible */
- continue;
- }
- }
- tile_end = GetOtherBridgeEnd(tile);
- si.cur_length += DIAG_FACTOR * (GetTunnelBridgeLength(tile, tile_end) + 1);
- tile = tile_end;
+ TileIndex endtile = GetOtherTunnelBridgeEnd(tile);
+ si.cur_length += DIAG_FACTOR * (GetTunnelBridgeLength(tile, endtile) + 1);
+ tile = endtile;
+ /* tile now points to the exit tile of the tunnel/bridge */
}
}
@@ -727,9 +694,8 @@
si.cur_length += _length_of_track[track];
- /* Check if this rail is an upwards slope. If it is, then add a penalty.
- * Small optimization here.. if (track&7)>1 then it can't be a slope so we avoid calling GetTileSlope */
- if ((track & 7) <= 1 && (_is_upwards_slope[GetTileSlope(tile, NULL)] & (1 << track)) ) {
+ /* Check if this rail is an upwards slope. If it is, then add a penalty. */
+ if (IsDiagonalTrackdir(track) && IsUphillTrackdir(GetTileSlope(tile, NULL), track)) {
// upwards slope. add some penalty.
si.cur_length += 4 * DIAG_FACTOR;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/players.cpp
--- a/src/players.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/players.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -9,7 +9,7 @@
#include "player_gui.h"
#include "town.h"
#include "station.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "command_func.h"
#include "network/network.h"
@@ -335,7 +335,7 @@
if (!IsHumanPlayer(p->index)) {
SetDParam(0, t->index);
- AddNewsItem((StringID)(p->index | NB_BNEWCOMPANY), NEWS_FLAGS(NM_CALLBACK, NF_TILE, NT_COMPANY_INFO, DNC_BANKRUPCY), p->last_build_coordinate, 0);
+ AddNewsItem((StringID)(p->index | NB_BNEWCOMPANY), NM_CALLBACK, NF_TILE, NT_COMPANY_INFO, DNC_BANKRUPCY, p->last_build_coordinate, 0);
}
return;
}
@@ -898,7 +898,7 @@
/* Show the bankrupt news */
SetDParam(0, p->index);
- AddNewsItem( (StringID)(p->index | NB_BBANKRUPT), NEWS_FLAGS(NM_CALLBACK, 0, NT_COMPANY_INFO, DNC_BANKRUPCY),0,0);
+ AddNewsItem((StringID)(p->index | NB_BBANKRUPT), NM_CALLBACK, NF_NONE, NT_COMPANY_INFO, DNC_BANKRUPCY, 0, 0);
/* Remove the company */
ChangeOwnershipOfPlayerItems(p->index, PLAYER_SPECTATOR);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/rail.cpp
--- a/src/rail.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/rail.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -113,6 +113,40 @@
TRACK_BIT_LEFT, TRACK_BIT_LOWER, TRACK_BIT_RIGHT, TRACK_BIT_UPPER,
};
+extern const TrackdirBits _uphill_trackdirs[] = {
+ TRACKDIR_BIT_NONE , ///< 0 SLOPE_FLAT
+ TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 1 SLOPE_W -> inclined for diagonal track
+ TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 2 SLOPE_S -> inclined for diagonal track
+ TRACKDIR_BIT_X_SW , ///< 3 SLOPE_SW
+ TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 4 SLOPE_E -> inclined for diagonal track
+ TRACKDIR_BIT_NONE , ///< 5 SLOPE_EW
+ TRACKDIR_BIT_Y_SE , ///< 6 SLOPE_SE
+ TRACKDIR_BIT_NONE , ///< 7 SLOPE_WSE -> leveled
+ TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 8 SLOPE_N -> inclined for diagonal track
+ TRACKDIR_BIT_Y_NW , ///< 9 SLOPE_NW
+ TRACKDIR_BIT_NONE , ///< 10 SLOPE_NS
+ TRACKDIR_BIT_NONE , ///< 11 SLOPE_NWS -> leveled
+ TRACKDIR_BIT_X_NE , ///< 12 SLOPE_NE
+ TRACKDIR_BIT_NONE , ///< 13 SLOPE_ENW -> leveled
+ TRACKDIR_BIT_NONE , ///< 14 SLOPE_SEN -> leveled
+ TRACKDIR_BIT_NONE , ///< 15 invalid
+ TRACKDIR_BIT_NONE , ///< 16 invalid
+ TRACKDIR_BIT_NONE , ///< 17 invalid
+ TRACKDIR_BIT_NONE , ///< 18 invalid
+ TRACKDIR_BIT_NONE , ///< 19 invalid
+ TRACKDIR_BIT_NONE , ///< 20 invalid
+ TRACKDIR_BIT_NONE , ///< 21 invalid
+ TRACKDIR_BIT_NONE , ///< 22 invalid
+ TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 23 SLOPE_STEEP_S -> inclined for diagonal track
+ TRACKDIR_BIT_NONE , ///< 24 invalid
+ TRACKDIR_BIT_NONE , ///< 25 invalid
+ TRACKDIR_BIT_NONE , ///< 26 invalid
+ TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 27 SLOPE_STEEP_W -> inclined for diagonal track
+ TRACKDIR_BIT_NONE , ///< 28 invalid
+ TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 29 SLOPE_STEEP_N -> inclined for diagonal track
+ TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 30 SLOPE_STEEP_E -> inclined for diagonal track
+};
+
/* The default multiplier for the cost of building different types of railway
* track, which will be divided by 8. Can be changed by newgrf files. */
const int _default_railtype_cost_multiplier[RAILTYPE_END] = {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/rail.h
--- a/src/rail.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/rail.h Fri Mar 28 10:32:55 2008 +0000
@@ -181,6 +181,18 @@
void DrawTrainDepotSprite(int x, int y, int image, RailType railtype);
void DrawDefaultWaypointSprite(int x, int y, RailType railtype);
void *EnsureNoTrainOnTrackProc(Vehicle *v, void *data);
+int TicksToLeaveDepot(const Vehicle *v);
+
+
+/**
+ * Test if a rail type has catenary
+ * @param rt Rail type to test
+ */
+static inline bool HasCatenary(RailType rt)
+{
+ return rt == RAILTYPE_ELECTRIC;
+}
+
/**
* Draws overhead wires and pylons for electric railways.
diff -r cc77111ebd85 -r 9707ad4c9b60 src/rail_cmd.cpp
--- a/src/rail_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/rail_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -360,6 +360,8 @@
if (IsNormalRoad(tile)) {
if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
+ if (GetDisallowedRoadDirections(tile) != DRD_NONE) return_cmd_error(STR_ERR_CROSSING_ON_ONEWAY_ROAD);
+
RoadTypes roadtypes = GetRoadTypes(tile);
RoadBits road = GetRoadBits(tile, ROADTYPE_ROAD);
RoadBits tram = GetRoadBits(tile, ROADTYPE_TRAM);
@@ -367,7 +369,7 @@
default: break;
case ROADTYPES_TRAM:
/* Tram crossings must always have road. */
- SetRoadOwner(tile, ROADTYPE_ROAD, _current_player);
+ if (flags & DC_EXEC) SetRoadOwner(tile, ROADTYPE_ROAD, _current_player);
roadtypes |= ROADTYPES_ROAD;
break;
@@ -1696,35 +1698,51 @@
}
}
+/** Enums holding the offsets from base signal sprite,
+ * according to the side it is representing.
+ * The addtion of 2 per enum is necessary in order to "jump" over the
+ * green state sprite, all signal sprites being in pair,
+ * starting with the off-red state */
+enum {
+ SIGNAL_TO_SOUTHWEST = 0,
+ SIGNAL_TO_NORTHEAST = 2,
+ SIGNAL_TO_SOUTHEAST = 4,
+ SIGNAL_TO_NORTHWEST = 6,
+ SIGNAL_TO_EAST = 8,
+ SIGNAL_TO_WEST = 10,
+ SIGNAL_TO_SOUTH = 12,
+ SIGNAL_TO_NORTH = 14,
+};
+
static void DrawSignals(TileIndex tile, TrackBits rails)
{
-#define MAYBE_DRAW_SIGNAL(x,y,z,t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y - 0x4FB, z)
+#define MAYBE_DRAW_SIGNAL(x,y,z,t) if (IsSignalPresent(tile, x)) DrawSingleSignal(tile, t, GetSingleSignalState(tile, x), y, z)
if (!(rails & TRACK_BIT_Y)) {
if (!(rails & TRACK_BIT_X)) {
if (rails & TRACK_BIT_LEFT) {
- MAYBE_DRAW_SIGNAL(2, 0x509, 0, TRACK_LEFT);
- MAYBE_DRAW_SIGNAL(3, 0x507, 1, TRACK_LEFT);
+ MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTH, 0, TRACK_LEFT);
+ MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTH, 1, TRACK_LEFT);
}
if (rails & TRACK_BIT_RIGHT) {
- MAYBE_DRAW_SIGNAL(0, 0x509, 2, TRACK_RIGHT);
- MAYBE_DRAW_SIGNAL(1, 0x507, 3, TRACK_RIGHT);
+ MAYBE_DRAW_SIGNAL(0, SIGNAL_TO_NORTH, 2, TRACK_RIGHT);
+ MAYBE_DRAW_SIGNAL(1, SIGNAL_TO_SOUTH, 3, TRACK_RIGHT);
}
if (rails & TRACK_BIT_UPPER) {
- MAYBE_DRAW_SIGNAL(3, 0x505, 4, TRACK_UPPER);
- MAYBE_DRAW_SIGNAL(2, 0x503, 5, TRACK_UPPER);
+ MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_WEST, 4, TRACK_UPPER);
+ MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_EAST, 5, TRACK_UPPER);
}
if (rails & TRACK_BIT_LOWER) {
- MAYBE_DRAW_SIGNAL(1, 0x505, 6, TRACK_LOWER);
- MAYBE_DRAW_SIGNAL(0, 0x503, 7, TRACK_LOWER);
+ MAYBE_DRAW_SIGNAL(1, SIGNAL_TO_WEST, 6, TRACK_LOWER);
+ MAYBE_DRAW_SIGNAL(0, SIGNAL_TO_EAST, 7, TRACK_LOWER);
}
} else {
- MAYBE_DRAW_SIGNAL(3, 0x4FB, 8, TRACK_X);
- MAYBE_DRAW_SIGNAL(2, 0x4FD, 9, TRACK_X);
+ MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTHWEST, 8, TRACK_X);
+ MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTHEAST, 9, TRACK_X);
}
} else {
- MAYBE_DRAW_SIGNAL(3, 0x4FF, 10, TRACK_Y);
- MAYBE_DRAW_SIGNAL(2, 0x501, 11, TRACK_Y);
+ MAYBE_DRAW_SIGNAL(3, SIGNAL_TO_SOUTHEAST, 10, TRACK_Y);
+ MAYBE_DRAW_SIGNAL(2, SIGNAL_TO_NORTHWEST, 11, TRACK_Y);
}
}
@@ -1742,7 +1760,7 @@
if (HasBit(_display_opt, DO_FULL_DETAIL)) DrawTrackDetails(ti);
- if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+ if (HasCatenary(GetRailType(ti->tile))) DrawCatenary(ti);
if (HasSignals(ti->tile)) DrawSignals(ti->tile, rails);
} else {
@@ -1816,7 +1834,7 @@
DrawGroundSprite(image, PAL_NONE);
- if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+ if (HasCatenary(GetRailType(ti->tile))) DrawCatenary(ti);
foreach_draw_tile_seq(dtss, dts->seq) {
SpriteID image = dtss->image.sprite;
@@ -2211,6 +2229,29 @@
0, 1, 0, -1 /* y */
};
+
+/** Compute number of ticks when next wagon will leave a depot.
+ * Negative means next wagon should have left depot n ticks before.
+ * @param v vehicle outside (leaving) the depot
+ * @return number of ticks when the next wagon will leave
+ */
+int TicksToLeaveDepot(const Vehicle *v)
+{
+ DiagDirection dir = GetRailDepotDirection(v->tile);
+ int length = v->u.rail.cached_veh_length;
+
+ switch (dir) {
+ case DIAGDIR_NE: return ((int)(v->x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) - (length + 1)));
+ case DIAGDIR_SE: return -((int)(v->y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4) + (length + 1)));
+ case DIAGDIR_SW: return -((int)(v->x_pos & 0x0F) - ((_fractcoords_enter[dir] & 0x0F) + (length + 1)));
+ default:
+ case DIAGDIR_NW: return ((int)(v->y_pos & 0x0F) - ((_fractcoords_enter[dir] >> 4) - (length + 1)));
+ }
+
+ return 0; // make compilers happy
+}
+
+
static VehicleEnterTileStatus VehicleEnter_Track(Vehicle *v, TileIndex tile, int x, int y)
{
byte fract_coord;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/rail_map.h
--- a/src/rail_map.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/rail_map.h Fri Mar 28 10:32:55 2008 +0000
@@ -10,6 +10,7 @@
#include "direction_func.h"
#include "track_func.h"
#include "tile_map.h"
+#include "signal_type.h"
/** Different types of Rail-related tiles */
@@ -201,14 +202,6 @@
return (WaypointID)_m[t].m2;
}
-/** Type of signal, i.e. how does the signal behave? */
-enum SignalType {
- SIGTYPE_NORMAL = 0, ///< normal signal
- SIGTYPE_ENTRY = 1, ///< presignal block entry
- SIGTYPE_EXIT = 2, ///< presignal block exit
- SIGTYPE_COMBO = 3 ///< presignal inter-block
-};
-
static inline SignalType GetSignalType(TileIndex t, Track track)
{
assert(GetRailTileType(t) == RAIL_TILE_SIGNALS);
@@ -244,12 +237,6 @@
SB(_m[t].m3, pos, 2, sig);
}
-/** Variant of the signal, i.e. how does the signal look? */
-enum SignalVariant {
- SIG_ELECTRIC = 0, ///< Light signal
- SIG_SEMAPHORE = 1 ///< Old-fashioned semaphore signal
-};
-
static inline SignalVariant GetSignalVariant(TileIndex t, Track track)
{
byte pos = (track == TRACK_LOWER || track == TRACK_RIGHT) ? 6 : 2;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/rev.cpp.in
--- a/src/rev.cpp.in Thu Mar 27 05:15:06 2008 +0000
+++ b/src/rev.cpp.in Fri Mar 28 10:32:55 2008 +0000
@@ -34,7 +34,7 @@
* final release will always have a lower version number than the released
* version, thus making comparisions on specific revisions easy.
*/
-uint32 _openttd_newgrf_version = 0 << 28 | 6 << 24 | 0 << 20 | 0 << 19 | (@@REVISION@@ & ((1 << 19) - 1));
+uint32 _openttd_newgrf_version = 0 << 28 | 7 << 24 | 0 << 20 | 0 << 19 | (@@REVISION@@ & ((1 << 19) - 1));
#ifdef __MORPHOS__
/**
diff -r cc77111ebd85 -r 9707ad4c9b60 src/road_cmd.cpp
--- a/src/road_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/road_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -43,12 +43,59 @@
static const uint32 VALID_LEVEL_CROSSING_SLOPES = (M(SLOPE_SEN) | M(SLOPE_ENW) | M(SLOPE_NWS) | M(SLOPE_NS) | M(SLOPE_WSE) | M(SLOPE_EW) | M(SLOPE_FLAT));
#undef M
+/* Invalid RoadBits on slopes */
+static const RoadBits _invalid_tileh_slopes_road[2][15] = {
+ /* The inverse of the mixable RoadBits on a leveled slope */
+ {
+ ROAD_NONE, // SLOPE_FLAT
+ ROAD_NE | ROAD_SE, // SLOPE_W
+ ROAD_NE | ROAD_NW, // SLOPE_S
+
+ ROAD_NE, // SLOPE_SW
+ ROAD_NW | ROAD_SW, // SLOPE_E
+ ROAD_NONE, // SLOPE_EW
+
+ ROAD_NW, // SLOPE_SE
+ ROAD_NONE, // SLOPE_WSE
+ ROAD_SE | ROAD_SW, // SLOPE_N
+
+ ROAD_SE, // SLOPE_NW
+ ROAD_NONE, // SLOPE_NS
+ ROAD_NONE, // SLOPE_ENW
+
+ ROAD_SW, // SLOPE_NE
+ ROAD_NONE, // SLOPE_SEN
+ ROAD_NONE // SLOPE_NWS
+ },
+ /* The inverse of the allowed straight roads on a slope
+ * (with and without a foundation). */
+ {
+ ROAD_NONE, // SLOPE_FLAT
+ ROAD_NONE, // SLOPE_W Foundation
+ ROAD_NONE, // SLOPE_S Foundation
+
+ ROAD_Y, // SLOPE_SW
+ ROAD_NONE, // SLOPE_E Foundation
+ ROAD_ALL, // SLOPE_EW
+
+ ROAD_X, // SLOPE_SE
+ ROAD_ALL, // SLOPE_WSE
+ ROAD_NONE, // SLOPE_N Foundation
+
+ ROAD_X, // SLOPE_NW
+ ROAD_ALL, // SLOPE_NS
+ ROAD_ALL, // SLOPE_ENW
+
+ ROAD_Y, // SLOPE_NE
+ ROAD_ALL, // SLOPE_SEN
+ ROAD_ALL // SLOPE_NW
+ }
+};
+
Foundation GetRoadFoundation(Slope tileh, RoadBits bits);
bool CheckAllowRemoveRoad(TileIndex tile, RoadBits remove, Owner owner, bool *edge_road, RoadType rt)
{
- RoadBits present;
- RoadBits n;
*edge_road = true;
if (_game_mode == GM_EDITOR || remove == ROAD_NONE) return true;
@@ -66,8 +113,8 @@
if (_cheats.magic_bulldozer.value) return true;
/* Get a bitmask of which neighbouring roads has a tile */
- n = ROAD_NONE;
- present = GetAnyRoadBits(tile, rt);
+ RoadBits n = ROAD_NONE;
+ RoadBits present = GetAnyRoadBits(tile, rt);
if (present & ROAD_NE && GetAnyRoadBits(TILE_ADDXY(tile, -1, 0), rt) & ROAD_SW) n |= ROAD_NE;
if (present & ROAD_SE && GetAnyRoadBits(TILE_ADDXY(tile, 0, 1), rt) & ROAD_NW) n |= ROAD_SE;
if (present & ROAD_SW && GetAnyRoadBits(TILE_ADDXY(tile, 1, 0), rt) & ROAD_NE) n |= ROAD_SW;
@@ -75,13 +122,12 @@
/* If 0 or 1 bits are set in n, or if no bits that match the bits to remove,
* then allow it */
- if ((n & (n - 1)) != 0 && (n & remove) != 0) {
- Town *t;
+ if (KillFirstBit(n) != ROAD_NONE && (n & remove) != ROAD_NONE) {
*edge_road = false;
/* you can remove all kind of roads with extra dynamite */
if (_patches.extra_dynamite) return true;
- t = ClosestTownFromTile(tile, (uint)-1);
+ const Town *t = ClosestTownFromTile(tile, (uint)-1);
SetDParam(0, t->index);
_error_message = STR_2009_LOCAL_AUTHORITY_REFUSES;
@@ -178,24 +224,38 @@
switch (GetRoadTileType(tile)) {
case ROAD_TILE_NORMAL: {
+ const Slope tileh = GetTileSlope(tile, NULL);
RoadBits present = GetRoadBits(tile, rt);
- RoadBits c = pieces;
+ const RoadBits other = GetOtherRoadBits(tile, rt);
+ const Foundation f = GetRoadFoundation(tileh, present);
if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
- if (GetTileSlope(tile, NULL) != SLOPE_FLAT &&
- (present == ROAD_Y || present == ROAD_X)) {
- c |= (RoadBits)((c & 0xC) >> 2);
- c |= (RoadBits)((c & 0x3) << 2);
+ /* Autocomplete to a straight road
+ * @li on steep slopes
+ * @li if the bits of the other roadtypes result in another foundation
+ * @li if build on slopes is disabled */
+ if (IsSteepSlope(tileh) || (IsStraightRoad(other) &&
+ (other & _invalid_tileh_slopes_road[0][tileh & SLOPE_ELEVATED]) != ROAD_NONE) ||
+ (tileh != SLOPE_FLAT && !_patches.build_on_slopes)) {
+ pieces |= MirrorRoadBits(pieces);
}
/* limit the bits to delete to the existing bits. */
- c &= present;
- if (c == ROAD_NONE) return CMD_ERROR;
+ pieces &= present;
+ if (pieces == ROAD_NONE) return CMD_ERROR;
+
+ /* Now set present what it will be after the remove */
+ present ^= pieces;
+
+ /* Check for invalid RoadBit combinations on slopes */
+ if (tileh != SLOPE_FLAT && present != ROAD_NONE &&
+ (present & _invalid_tileh_slopes_road[0][tileh & SLOPE_ELEVATED]) == present) {
+ return CMD_ERROR;
+ }
ChangeTownRating(t, -road_remove_cost[(byte)edge_road], RATING_ROAD_MINIMUM);
if (flags & DC_EXEC) {
- present ^= c;
if (present == ROAD_NONE) {
RoadTypes rts = GetRoadTypes(tile) & ComplementRoadTypes(RoadTypeToRoadTypes(rt));
if (rts == ROADTYPES_NONE) {
@@ -215,7 +275,10 @@
MarkTileDirtyByTile(tile);
}
}
- return CommandCost(EXPENSES_CONSTRUCTION, CountBits(c) * _price.remove_road);
+
+ /* If we change the foundation we have to pay for it. */
+ return CommandCost(EXPENSES_CONSTRUCTION, CountBits(pieces) * _price.remove_road +
+ ((GetRoadFoundation(tileh, present) != f) ? _price.terraform : (Money)0));
}
case ROAD_TILE_CROSSING: {
@@ -268,76 +331,6 @@
return RemoveRoad(tile, flags, pieces, rt, true);
}
-
-static const RoadBits _valid_tileh_slopes_road[][15] = {
- /* set of normal ones */
- {
- ROAD_ALL, // SLOPE_FLAT
- ROAD_NONE, // SLOPE_W
- ROAD_NONE, // SLOPE_S
-
- ROAD_X, // SLOPE_SW
- ROAD_NONE, // SLOPE_E
- ROAD_NONE, // SLOPE_EW
-
- ROAD_Y, // SLOPE_SE
- ROAD_NONE, // SLOPE_WSE
- ROAD_NONE, // SLOPE_N
-
- ROAD_Y, // SLOPE_NW
- ROAD_NONE, // SLOPE_NS
- ROAD_NONE, // SLOPE_NE
-
- ROAD_X, // SLOPE_ENW
- ROAD_NONE, // SLOPE_SEN
- ROAD_NONE // SLOPE_ELEVATED
- },
- /* allowed road for an evenly raised platform */
- {
- ROAD_NONE, // SLOPE_FLAT
- ROAD_SW | ROAD_NW, // SLOPE_W
- ROAD_SW | ROAD_SE, // SLOPE_S
-
- ROAD_Y | ROAD_SW, // SLOPE_SW
- ROAD_SE | ROAD_NE, // SLOPE_E
- ROAD_ALL, // SLOPE_EW
-
- ROAD_X | ROAD_SE, // SLOPE_SE
- ROAD_ALL, // SLOPE_WSE
- ROAD_NW | ROAD_NE, // SLOPE_N
-
- ROAD_X | ROAD_NW, // SLOPE_NW
- ROAD_ALL, // SLOPE_NS
- ROAD_ALL, // SLOPE_NE
-
- ROAD_Y | ROAD_NE, // SLOPE_ENW
- ROAD_ALL, // SLOPE_SEN
- ROAD_ALL // SLOPE_ELEVATED
- },
- /* Singe bits on slopes */
- {
- ROAD_ALL, // SLOPE_FLAT
- ROAD_NE | ROAD_SE, // SLOPE_W
- ROAD_NE | ROAD_NW, // SLOPE_S
-
- ROAD_NE, // SLOPE_SW
- ROAD_NW | ROAD_SW, // SLOPE_E
- ROAD_ALL, // SLOPE_EW
-
- ROAD_NW, // SLOPE_SE
- ROAD_ALL, // SLOPE_WSE
- ROAD_SE | ROAD_SW, // SLOPE_N
-
- ROAD_SE, // SLOPE_NW
- ROAD_ALL, // SLOPE_NS
- ROAD_ALL, // SLOPE_NE
-
- ROAD_SW, // SLOPE_ENW
- ROAD_ALL, // SLOPE_SEN
- ROAD_ALL, // SLOPE_ELEVATED
- },
-};
-
/**
* Calculate the costs for roads on slopes
* Aside modify the RoadBits to fit on the slopes
@@ -345,49 +338,71 @@
* @note The RoadBits are modified too!
* @param tileh The current slope
* @param pieces The RoadBits we want to add
- * @param existing The existent RoadBits
+ * @param existing The existent RoadBits of the current type
+ * @param other The other existent RoadBits
* @return The costs for these RoadBits on this slope
*/
-static CommandCost CheckRoadSlope(Slope tileh, RoadBits* pieces, RoadBits existing)
+static CommandCost CheckRoadSlope(Slope tileh, RoadBits* pieces, RoadBits existing, RoadBits other)
{
+ /* Remove already build pieces */
+ CLRBITS(*pieces, existing);
+
+ /* If we can't build anything stop here */
+ if (*pieces == ROAD_NONE) return CMD_ERROR;
+
+ /* All RoadBit combos are valid on flat land */
+ if (tileh == SLOPE_FLAT) return CommandCost();
+
+ /* Proceed steep Slopes first to reduce lookup table size */
if (IsSteepSlope(tileh)) {
/* Force straight roads. */
*pieces |= MirrorRoadBits(*pieces);
- if (existing == ROAD_NONE || existing == *pieces) {
- if (*pieces == ROAD_X || *pieces == ROAD_Y) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+ /* Use existing as all existing since only straight
+ * roads are allowed here. */
+ existing |= other;
+
+ if ((existing == ROAD_NONE || existing == *pieces) && IsStraightRoad(*pieces)) {
+ return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
}
return CMD_ERROR;
}
- RoadBits road_bits = *pieces | existing;
+ /* Save the merge of all bits of the current type */
+ RoadBits type_bits = existing | *pieces;
- /* Single bits on slopes.
- * We check for the roads that need at least 2 bits */
- if (_patches.build_on_slopes &&
- existing == ROAD_NONE && CountBits(*pieces) == 1 &&
- (_valid_tileh_slopes_road[2][tileh] & *pieces) == ROAD_NONE) {
- return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+ /* Roads on slopes */
+ if (_patches.build_on_slopes && (_invalid_tileh_slopes_road[0][tileh] & (other | type_bits)) == ROAD_NONE) {
+
+ /* If we add leveling we've got to pay for it */
+ if ((other | existing) == ROAD_NONE) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+
+ return CommandCost();
}
- /* no special foundation */
- if ((~_valid_tileh_slopes_road[0][tileh] & road_bits) == ROAD_NONE) {
- /* force that all bits are set when we have slopes */
- if (tileh != SLOPE_FLAT) *pieces |= _valid_tileh_slopes_road[0][tileh];
- return CommandCost(); // no extra cost
- }
+ /* Autocomplete uphill roads */
+ *pieces |= MirrorRoadBits(*pieces);
+ type_bits = existing | *pieces;
- /* foundation is used. Whole tile is leveled up */
- if ((~_valid_tileh_slopes_road[1][tileh] & road_bits) == ROAD_NONE) {
- return CommandCost(EXPENSES_CONSTRUCTION, existing != ROAD_NONE ? (Money)0 : _price.terraform);
- }
+ /* Uphill roads */
+ if (IsStraightRoad(type_bits) && (other == type_bits || other == ROAD_NONE) &&
+ (_invalid_tileh_slopes_road[1][tileh] & (other | type_bits)) == ROAD_NONE) {
- /* Force straight roads. */
- *pieces |= MirrorRoadBits(*pieces);
+ /* Slopes with foundation ? */
+ if (IsSlopeWithOneCornerRaised(tileh)) {
- /* partly leveled up tile, only if there's no road on that tile */
- if ((existing == ROAD_NONE || existing == *pieces) && IsSlopeWithOneCornerRaised(tileh)) {
- if (*pieces == ROAD_X || *pieces == ROAD_Y) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+ /* Prevent build on slopes if it isn't allowed */
+ if (_patches.build_on_slopes) {
+
+ /* If we add foundation we've got to pay for it */
+ if ((other | existing) == ROAD_NONE) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+
+ return CommandCost();
+ }
+ } else {
+ if (CountBits(existing) == 1) return CommandCost(EXPENSES_CONSTRUCTION, _price.terraform);
+ return CommandCost();
+ }
}
return CMD_ERROR;
}
@@ -405,8 +420,7 @@
CommandCost cost(EXPENSES_CONSTRUCTION);
CommandCost ret;
RoadBits existing = ROAD_NONE;
- RoadBits all_bits = ROAD_NONE;
- Slope tileh;
+ RoadBits other_bits = ROAD_NONE;
/* Road pieces are max 4 bitset values (NE, NW, SE, SW) and town can only be non-zero
* if a non-player is building the road */
@@ -414,12 +428,15 @@
RoadBits pieces = Extract(p1);
+ /* do not allow building 'zero' road bits, code wouldn't handle it */
+ if (pieces == ROAD_NONE) return CMD_ERROR;
+
RoadType rt = (RoadType)GB(p1, 4, 2);
if (!IsValidRoadType(rt) || !ValParamRoadType(rt)) return CMD_ERROR;
DisallowedRoadDirections toggle_drd = (DisallowedRoadDirections)GB(p1, 6, 2);
- tileh = GetTileSlope(tile, NULL);
+ Slope tileh = GetTileSlope(tile, NULL);
switch (GetTileType(tile)) {
case MP_ROAD:
@@ -427,12 +444,11 @@
case ROAD_TILE_NORMAL: {
if (HasRoadWorks(tile)) return_cmd_error(STR_ROAD_WORKS_IN_PROGRESS);
- all_bits = GetAllRoadBits(tile);
+ other_bits = GetOtherRoadBits(tile, rt);
if (!HasTileRoadType(tile, rt)) break;
existing = GetRoadBits(tile, rt);
- RoadBits merged = existing | pieces;
- bool crossing = (merged != ROAD_X && merged != ROAD_Y);
+ bool crossing = !IsStraightRoad(existing | pieces);
if (rt != ROADTYPE_TRAM && (GetDisallowedRoadDirections(tile) != DRD_NONE || toggle_drd != DRD_NONE) && crossing) {
/* Junctions cannot be one-way */
return_cmd_error(STR_ERR_ONEWAY_ROADS_CAN_T_HAVE_JUNCTION);
@@ -445,7 +461,7 @@
if (!EnsureNoVehicleOnGround(tile)) return CMD_ERROR;
/* Ignore half built tiles */
- if (flags & DC_EXEC && rt != ROADTYPE_TRAM && (existing == ROAD_X || existing == ROAD_Y)) {
+ if (flags & DC_EXEC && rt != ROADTYPE_TRAM && IsStraightRoad(existing)) {
SetDisallowedRoadDirections(tile, GetDisallowedRoadDirections(tile) ^ toggle_drd);
MarkTileDirtyByTile(tile);
}
@@ -457,8 +473,8 @@
case ROAD_TILE_CROSSING:
if (HasTileRoadType(tile, rt)) return_cmd_error(STR_1007_ALREADY_BUILT);
- all_bits = GetCrossingRoadBits(tile);
- if (pieces & ComplementRoadBits(all_bits)) goto do_clear;
+ other_bits = GetCrossingRoadBits(tile);
+ if (pieces & ComplementRoadBits(other_bits)) goto do_clear;
break;
default:
@@ -525,9 +541,9 @@
cost.AddCost(ret);
}
- if (all_bits != pieces) {
+ if (other_bits != pieces) {
/* Check the foundation/slopes when adding road/tram bits */
- ret = CheckRoadSlope(tileh, &pieces, all_bits | existing);
+ ret = CheckRoadSlope(tileh, &pieces, existing, other_bits);
/* Return an error if we need to build a foundation (ret != 0) but the
* current patch-setting is turned off (or stupid AI@work) */
if (CmdFailed(ret) || (ret.GetCost() != 0 && !_patches.build_on_slopes)) {
@@ -605,7 +621,7 @@
if (rt != ROADTYPE_TRAM && IsNormalRoadTile(tile)) {
existing |= pieces;
- SetDisallowedRoadDirections(tile, (existing == ROAD_X || existing == ROAD_Y) ?
+ SetDisallowedRoadDirections(tile, IsStraightRoad(existing) ?
GetDisallowedRoadDirections(tile) ^ toggle_drd : DRD_NONE);
}
@@ -896,21 +912,29 @@
#include "table/road_land.h"
-
+/**
+ * Get the foundationtype of a RoadBits Slope combination
+ *
+ * @param tileh The Slope part
+ * @param bits The RoadBits part
+ * @return The resulting Foundation
+ */
Foundation GetRoadFoundation(Slope tileh, RoadBits bits)
{
+ /* Flat land and land without a road doesn't require a foundation */
+ if (tileh == SLOPE_FLAT || bits == ROAD_NONE) return FOUNDATION_NONE;
+
if (!IsSteepSlope(tileh)) {
- if ((~_valid_tileh_slopes_road[0][tileh] & bits) == 0) {
- /* As one can remove a single road piece when in a corner on a foundation as
- * it is on a sloped piece of landscape, one creates a state that cannot be
- * created directly, but the state itself is still perfectly drawable.
- * However, as we do not want this to be build directly, we need to check
- * for that situation in here. */
- return (tileh != 0 && CountBits(bits) == 1) ? FOUNDATION_LEVELED : FOUNDATION_NONE;
- }
- if ((~_valid_tileh_slopes_road[1][tileh] & bits) == 0) return FOUNDATION_LEVELED;
+ /* Leveled RoadBits on a slope */
+ if ((_invalid_tileh_slopes_road[0][tileh] & bits) == ROAD_NONE) return FOUNDATION_LEVELED;
+
+ /* Straight roads without foundation on a slope */
+ if (!IsSlopeWithOneCornerRaised(tileh) &&
+ (_invalid_tileh_slopes_road[1][tileh] & bits) == ROAD_NONE)
+ return FOUNDATION_NONE;
}
+ /* Roads on steep Slopes or on Slopes with one corner raised */
return (bits == ROAD_X ? FOUNDATION_INCLINED_X : FOUNDATION_INCLINED_Y);
}
@@ -1107,7 +1131,7 @@
DrawGroundSprite(SPR_TRAMWAY_OVERLAY + (GetCrossingRoadAxis(ti->tile) ^ 1), pal);
DrawTramCatenary(ti, GetCrossingRoadBits(ti->tile));
}
- if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) DrawCatenary(ti);
+ if (HasCatenary(GetRailType(ti->tile))) DrawCatenary(ti);
break;
}
@@ -1479,7 +1503,7 @@
RoadBits bits = GetAllRoadBits(tile);
RoadBits bits_copy = bits;
/* Check if the slope-road_bits combination is valid at all, i.e. it is save to call GetRoadFoundation(). */
- if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE))) {
+ if (!CmdFailed(CheckRoadSlope(tileh_new, &bits_copy, ROAD_NONE, ROAD_NONE))) {
/* CheckRoadSlope() sometimes changes the road_bits, if it does not agree with them. */
if (bits == bits_copy) {
uint z_old;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/road_func.h
--- a/src/road_func.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/road_func.h Fri Mar 28 10:32:55 2008 +0000
@@ -101,6 +101,17 @@
}
/**
+ * Check if we've got a straight road
+ *
+ * @param r The given RoadBits
+ * @return true if we've got a straight road
+ */
+static inline bool IsStraightRoad(RoadBits r)
+{
+ return (r == ROAD_X || r == ROAD_Y);
+}
+
+/**
* Create the road-part which belongs to the given DiagDirection
*
* This function returns a RoadBits value which belongs to
@@ -115,6 +126,20 @@
}
/**
+ * Create the road-part which belongs to the given Axis
+ *
+ * This function returns a RoadBits value which belongs to
+ * the given Axis.
+ *
+ * @param a The Axis
+ * @return The result RoadBits which the selected road-part set
+ */
+static inline RoadBits AxisToRoadBits(Axis a)
+{
+ return a == AXIS_X ? ROAD_X : ROAD_Y;
+}
+
+/**
* Finds out, whether given player has all given RoadTypes available
* @param PlayerID ID of player
* @param rts RoadTypes to test
diff -r cc77111ebd85 -r 9707ad4c9b60 src/road_gui.cpp
--- a/src/road_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/road_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -418,9 +418,11 @@
switch (clicked_widget) {
case RTW_REMOVE:
w->RaiseWidget(RTW_ONE_WAY);
+ w->InvalidateWidget(RTW_ONE_WAY);
break;
case RTW_ONE_WAY:
w->RaiseWidget(RTW_REMOVE);
+ w->InvalidateWidget(RTW_REMOVE);
break;
case RTW_BUS_STATION:
case RTW_TRUCK_STATION:
diff -r cc77111ebd85 -r 9707ad4c9b60 src/road_map.cpp
--- a/src/road_map.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/road_map.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -14,7 +14,7 @@
#include "tunnelbridge_map.h"
-RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt)
+RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance)
{
if (!HasTileRoadType(tile, rt)) return ROAD_NONE;
@@ -34,7 +34,9 @@
case MP_TUNNELBRIDGE:
if (GetTunnelBridgeTransportType(tile) != TRANSPORT_ROAD) return ROAD_NONE;
- return DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile)));
+ return straight_tunnel_bridge_entrance ?
+ AxisToRoadBits(DiagDirToAxis(GetTunnelBridgeDirection(tile))) :
+ DiagDirToRoadBits(ReverseDiagDir(GetTunnelBridgeDirection(tile)));
default: return ROAD_NONE;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/road_map.h
--- a/src/road_map.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/road_map.h Fri Mar 28 10:32:55 2008 +0000
@@ -65,6 +65,26 @@
}
}
+/**
+ * Get all RoadBits set on a tile except from the given RoadType
+ *
+ * @param t The tile from which we want to get the RoadBits
+ * @param rt The RoadType which we exclude from the querry
+ * @return all set RoadBits of the tile which are not from the given RoadType
+ */
+static inline RoadBits GetOtherRoadBits(TileIndex t, RoadType rt)
+{
+ return ((rt == ROADTYPE_ROAD) ? ROAD_NONE : GetRoadBits(t, ROADTYPE_ROAD)) |
+ ((rt == ROADTYPE_TRAM) ? ROAD_NONE : GetRoadBits(t, ROADTYPE_TRAM)) |
+ ((rt == ROADTYPE_HWAY) ? ROAD_NONE : GetRoadBits(t, ROADTYPE_HWAY));
+}
+
+/**
+ * Get all set RoadBits on the given tile
+ *
+ * @param tile The tile from which we want to get the RoadBits
+ * @return all set RoadBits of the tile
+ */
static inline RoadBits GetAllRoadBits(TileIndex tile)
{
return GetRoadBits(tile, ROADTYPE_ROAD) | GetRoadBits(tile, ROADTYPE_TRAM) | GetRoadBits(tile, ROADTYPE_HWAY);
@@ -328,11 +348,16 @@
* - road tunnels: entrance is treated as road piece
* - bridge ramps: start of the ramp is treated as road piece
* - bridge middle parts: bridge itself is ignored
+ *
+ * If straight_tunnel_bridge_entrance is set a ROAD_X or ROAD_Y
+ * for bridge ramps and tunnel entrances is returned depending
+ * on the orientation of the tunnel or bridge.
* @param tile the tile to get the road bits for
* @param rt the road type to get the road bits form
+ * @param stbe whether to return straight road bits for tunnels/bridges.
* @return the road bits of the given tile
*/
-RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt);
+RoadBits GetAnyRoadBits(TileIndex tile, RoadType rt, bool straight_tunnel_bridge_entrance = false);
/**
* Get the accessible track bits for the given tile.
diff -r cc77111ebd85 -r 9707ad4c9b60 src/roadveh_cmd.cpp
--- a/src/roadveh_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/roadveh_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -14,7 +14,7 @@
#include "engine.h"
#include "command_func.h"
#include "station.h"
-#include "news.h"
+#include "news_func.h"
#include "pathfind.h"
#include "npf.h"
#include "player_func.h"
@@ -702,7 +702,7 @@
AddNewsItem(
(pass == 1) ?
STR_9031_ROAD_VEHICLE_CRASH_DRIVER : STR_9032_ROAD_VEHICLE_CRASH_DIE,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
v->index,
0
);
@@ -921,28 +921,22 @@
if (IsCargoInClass(v->cargo_type, CC_PASSENGERS)) {
/* Check if station was ever visited before */
if (!(st->had_vehicle_of_type & HVOT_BUS)) {
- uint32 flags;
-
st->had_vehicle_of_type |= HVOT_BUS;
SetDParam(0, st->index);
- flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
AddNewsItem(
v->u.road.roadtype == ROADTYPE_ROAD ? STR_902F_CITIZENS_CELEBRATE_FIRST : STR_CITIZENS_CELEBRATE_FIRST_PASSENGER_TRAM,
- flags,
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
v->index,
0);
}
} else {
/* Check if station was ever visited before */
if (!(st->had_vehicle_of_type & HVOT_TRUCK)) {
- uint32 flags;
-
st->had_vehicle_of_type |= HVOT_TRUCK;
SetDParam(0, st->index);
- flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
AddNewsItem(
v->u.road.roadtype == ROADTYPE_ROAD ? STR_9030_CITIZENS_CELEBRATE_FIRST : STR_CITIZENS_CELEBRATE_FIRST_CARGO_TRAM,
- flags,
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
v->index,
0
);
@@ -1464,7 +1458,7 @@
};
RoadBits required = required_roadbits[dir & 0x07];
- if ((required & GetAnyRoadBits(tile, v->u.road.roadtype)) == ROAD_NONE) {
+ if ((required & GetAnyRoadBits(tile, v->u.road.roadtype, true)) == ROAD_NONE) {
dir = INVALID_TRACKDIR;
}
@@ -1701,7 +1695,7 @@
uint turn_around_start_frame = RVC_TURN_AROUND_START_FRAME;
RoadBits tram;
- if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM)) == 1) {
+ if (v->u.road.roadtype == ROADTYPE_TRAM && CountBits(tram = GetAnyRoadBits(v->tile, ROADTYPE_TRAM, true)) == 1) {
/*
* The tram is turning around with one tram 'roadbit'. This means that
* it is using the 'big' corner 'drive data'. However, to support the
diff -r cc77111ebd85 -r 9707ad4c9b60 src/saveload.cpp
--- a/src/saveload.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/saveload.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -34,7 +34,7 @@
#include "table/strings.h"
-extern const uint16 SAVEGAME_VERSION = 90;
+extern const uint16 SAVEGAME_VERSION = 92;
uint16 _sl_version; ///< the major savegame version identifier
byte _sl_minor_version; ///< the minor savegame version, DO NOT USE!
@@ -1600,7 +1600,7 @@
InitializeGame(IG_DATE_RESET, 256, 256); // set a mapsize of 256x256 for TTDPatch games or it might get confused
if (!LoadOldSaveGame(filename)) return SL_REINIT;
_sl_version = 0;
- AfterLoadGame();
+ if (!AfterLoadGame()) return SL_REINIT;
return SL_OK;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/settings.cpp
--- a/src/settings.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/settings.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -37,7 +37,7 @@
#include "genworld.h"
#include "rail.h"
#include "train.h"
-#include "news.h"
+#include "news_func.h"
#include "window_func.h"
#include "strings_func.h"
#include "vehicle_func.h"
@@ -49,6 +49,7 @@
#endif
#include "spritecache.h"
#include "transparency.h"
+#include "textbuf_gui.h"
#include "string_func.h"
#include "gui.h"
#include "town.h"
@@ -236,7 +237,7 @@
while (fgets(buffer, sizeof(buffer), in)) {
/* trim whitespace from the left side */
- for (s = buffer; *s == ' ' || *s == '\t'; s++);
+ for (s = buffer; *s == ' ' || *s == '\t'; s++) {}
/* trim whitespace from right side. */
e = s + strlen(s);
@@ -278,10 +279,10 @@
/* find end of keyname */
if (*s == '\"') {
s++;
- for (t = s; *t != '\0' && *t != '\"'; t++);
+ for (t = s; *t != '\0' && *t != '\"'; t++) {}
if (*t == '\"') *t = ' ';
} else {
- for (t = s; *t != '\0' && *t != '=' && *t != '\t' && *t != ' '; t++);
+ for (t = s; *t != '\0' && *t != '=' && *t != '\t' && *t != ' '; t++) {}
}
/* it's an item in an existing group */
@@ -1189,6 +1190,17 @@
return 0;
}
+static int32 RealisticAccelerationChanged(int32 p1)
+{
+ Vehicle *v;
+
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == VEH_TRAIN && IsFrontEngine(v)) UpdateTrainAcceleration(v);
+ }
+
+ return 0;
+}
+
/**
* Check for right TownLayout usage in editor mode.
* The No Road mode is not desirable since towns have to be
@@ -1278,6 +1290,8 @@
SDTG_VAR("player_face", SLE_UINT32, S, 0, _player_face, 0,0,0xFFFFFFFF,0, STR_NULL, NULL),
SDTG_VAR("transparency_options", SLE_UINT, S, 0, _transparency_opt, 0,0,0x1FF,0, STR_NULL, NULL),
SDTG_VAR("transparency_locks", SLE_UINT, S, 0, _transparency_lock, 0,0,0x1FF,0, STR_NULL, NULL),
+ SDTG_STR("keyboard", SLE_STRB, S, 0, _keyboard_opt[0], NULL, STR_NULL, NULL),
+ SDTG_STR("keyboard_caps", SLE_STRB, S, 0, _keyboard_opt[1], NULL, STR_NULL, NULL),
SDTG_END()
};
@@ -1306,7 +1320,7 @@
SDTG_VAR("max_spectators", SLE_UINT8, S, 0, _network_game_info.spectators_max, 10, 0, MAX_CLIENTS, 0, STR_NULL, NULL),
SDTG_VAR("restart_game_year", SLE_INT32, S,D0, _network_restart_game_year, 0, MIN_YEAR, MAX_YEAR, 1, STR_NULL, NULL),
SDTG_VAR("min_players", SLE_UINT8, S, 0, _network_min_players, 0, 0, 10, 0, STR_NULL, NULL),
- SDTG_OMANY("server_lang", SLE_UINT8, S, 0, _network_game_info.server_lang, 0, 28, "ANY|ENGLISH|GERMAN|FRENCH|BRAZILIAN|BULGARIAN|CHINESE|CZECH|DANISH|DUTCH|ESPERANTO|FINNISH|HUNGARIAN|ICELANDIC|ITALIAN|JAPANESE|KOREAN|LITHUANIAN|NORWEGIAN|POLISH|PORTUGUESE|ROMANIAN|RUSSIAN|SLOVAK|SLOVENIAN|SPANISH|SWEDISH|TURKISH|UKRAINIAN", STR_NULL, NULL),
+ SDTG_OMANY("server_lang", SLE_UINT8, S, 0, _network_game_info.server_lang, 0, 35, "ANY|ENGLISH|GERMAN|FRENCH|BRAZILIAN|BULGARIAN|CHINESE|CZECH|DANISH|DUTCH|ESPERANTO|FINNISH|HUNGARIAN|ICELANDIC|ITALIAN|JAPANESE|KOREAN|LITHUANIAN|NORWEGIAN|POLISH|PORTUGUESE|ROMANIAN|RUSSIAN|SLOVAK|SLOVENIAN|SPANISH|SWEDISH|TURKISH|UKRAINIAN|AFRIKAANS|CROATIAN|CATALAN|ESTONIAN|GALICIAN|GREEK|LATVIAN", STR_NULL, NULL),
SDTG_BOOL("reload_cfg", S, 0, _network_reload_cfg, false, STR_NULL, NULL),
SDTG_END()
};
@@ -1389,7 +1403,7 @@
/***************************************************************************/
/* Vehicle section of the GUI-configure patches window */
- SDT_BOOL(Patches, realistic_acceleration, 0, 0, false, STR_CONFIG_PATCHES_REALISTICACCEL, NULL),
+ SDT_BOOL(Patches, realistic_acceleration, 0, 0, false, STR_CONFIG_PATCHES_REALISTICACCEL, RealisticAccelerationChanged),
SDT_BOOL(Patches, forbid_90_deg, 0, 0, false, STR_CONFIG_PATCHES_FORBID_90_DEG, NULL),
SDT_BOOL(Patches, mammoth_trains, 0,NN, true, STR_CONFIG_PATCHES_MAMMOTHTRAINS, NULL),
SDT_BOOL(Patches, gotodepot, 0, 0, true, STR_CONFIG_PATCHES_GOTODEPOT, NULL),
@@ -1733,6 +1747,36 @@
}
}
+/**
+ * Save the version of OpenTTD to the ini file.
+ * @param ini the ini to write to
+ */
+static void SaveVersionInConfig(IniFile *ini)
+{
+ extern const char _openttd_revision[];
+ extern uint32 _openttd_newgrf_version;
+
+ IniGroup *group = ini_getgroup(ini, "version", -1);
+
+ if (group == NULL) return;
+ group->item = NULL;
+ IniItem **item = &group->item;
+
+ char version[9];
+ snprintf(version, lengthof(version), "%08X", _openttd_newgrf_version);
+
+ const char *versions[][2] = {
+ { "version_string", _openttd_revision },
+ { "version_number", version }
+ };
+
+ for (uint i = 0; i < lengthof(versions); i++) {
+ *item = ini_item_alloc(group, versions[i][0], strlen(versions[i][0]));
+ (*item)->value = (char*)pool_strdup(&ini->pool, versions[i][1], strlen(versions[i][1]));
+ item = &(*item)->next;
+ }
+}
+
/* Save a GRF configuration to the given group name */
static void GRFSaveConfig(IniFile *ini, const char *grpname, const GRFConfig *list)
{
@@ -1797,6 +1841,7 @@
GRFSaveConfig(ini, "newgrf", _grfconfig_newgame);
GRFSaveConfig(ini, "newgrf-static", _grfconfig_static);
NewsDisplaySaveConfig(ini, "news_display", _news_display_opt);
+ SaveVersionInConfig(ini);
ini_save(_config_file, ini);
ini_free(ini);
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/ship_cmd.cpp
--- a/src/ship_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/ship_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -12,7 +12,7 @@
#include "pathfind.h"
#include "station_map.h"
#include "station.h"
-#include "news.h"
+#include "news_func.h"
#include "engine.h"
#include "player_func.h"
#include "player_base.h"
@@ -406,15 +406,12 @@
{
/* Check if station was ever visited before */
if (!(st->had_vehicle_of_type & HVOT_SHIP)) {
- uint32 flags;
-
st->had_vehicle_of_type |= HVOT_SHIP;
SetDParam(0, st->index);
- flags = (v->owner == _local_player) ? NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) : NEWS_FLAGS(NM_THIN, NF_VIEWPORT|NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
AddNewsItem(
STR_9833_CITIZENS_CELEBRATE_FIRST,
- flags,
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, (v->owner == _local_player) ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
v->index,
0);
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/signal_type.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/signal_type.h Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,24 @@
+/* $Id$ */
+
+/** @file signal_type.h Types and classes related to signals. */
+
+#ifndef SIGNAL_TYPE_H
+#define SIGNAL_TYPE_H
+
+/** Variant of the signal, i.e. how does the signal look? */
+enum SignalVariant {
+ SIG_ELECTRIC = 0, ///< Light signal
+ SIG_SEMAPHORE = 1 ///< Old-fashioned semaphore signal
+};
+
+
+/** Type of signal, i.e. how does the signal behave? */
+enum SignalType {
+ SIGTYPE_NORMAL = 0, ///< normal signal
+ SIGTYPE_ENTRY = 1, ///< presignal block entry
+ SIGTYPE_EXIT = 2, ///< presignal block exit
+ SIGTYPE_COMBO = 3 ///< presignal inter-block
+};
+
+
+#endif /* SIGNAL_TYPE_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/signs_gui.cpp
--- a/src/signs_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/signs_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -163,8 +163,7 @@
struct editsign_d : querystr_d {
SignID cur_sign;
};
-
-static char _edit_str_buf[64];
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(editsign_d));
enum QueryEditSignWidgets {
QUERY_EDIT_SIGN_WIDGET_TEXT = 3,
@@ -249,6 +248,10 @@
UpdateSignEditWindow(w, si);
break;
+ case QUERY_EDIT_SIGN_WIDGET_TEXT:
+ ShowOnScreenKeyboard(w, qs, e->we.click.widget, QUERY_EDIT_SIGN_WIDGET_CANCEL, QUERY_EDIT_SIGN_WIDGET_OK);
+ break;
+
case QUERY_EDIT_SIGN_WIDGET_DELETE:
/* Only need to set the buffer to null, the rest is handled as the OK button */
DeleteTextBufferAll(&qs->text);
@@ -287,16 +290,16 @@
}
static const Widget _query_sign_edit_widgets[] = {
-{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
-{ WWT_CAPTION, RESIZE_NONE, 14, 11, 259, 0, 13, STR_012D, STR_NULL },
-{ WWT_PANEL, RESIZE_NONE, 14, 0, 259, 14, 29, STR_NULL, STR_NULL },
-{ WWT_PANEL, RESIZE_NONE, 14, 2, 257, 16, 27, STR_NULL, STR_NULL }, // Text field
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 60, 30, 41, STR_012F_OK, STR_NULL },
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 61, 120, 30, 41, STR_012E_CANCEL, STR_NULL },
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 121, 180, 30, 41, STR_0290_DELETE, STR_NULL },
-{ WWT_PANEL, RESIZE_NONE, 14, 181, 237, 30, 41, STR_NULL, STR_NULL },
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 238, 248, 30, 41, STR_6819, STR_PREVIOUS_SIGN_TOOLTIP },
-{ WWT_TEXTBTN, RESIZE_NONE, 14, 249, 259, 30, 41, STR_681A, STR_NEXT_SIGN_TOOLTIP },
+{ WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
+{ WWT_CAPTION, RESIZE_NONE, 14, 11, 259, 0, 13, STR_012D, STR_NULL },
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 259, 14, 29, STR_NULL, STR_NULL },
+{ WWT_EDITBOX, RESIZE_NONE, 14, 2, 257, 16, 27, STR_SIGN_OSKTITLE, STR_NULL }, // Text field
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 0, 60, 30, 41, STR_012F_OK, STR_NULL },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 61, 120, 30, 41, STR_012E_CANCEL, STR_NULL },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 121, 180, 30, 41, STR_0290_DELETE, STR_NULL },
+{ WWT_PANEL, RESIZE_NONE, 14, 181, 237, 30, 41, STR_NULL, STR_NULL },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 238, 248, 30, 41, STR_6819, STR_PREVIOUS_SIGN_TOOLTIP },
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 249, 259, 30, 41, STR_681A, STR_NEXT_SIGN_TOOLTIP },
{ WIDGETS_END },
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/spritecache.cpp
--- a/src/spritecache.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/spritecache.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -23,11 +23,11 @@
struct SpriteCache {
- void *ptr;
+ void *ptr;
uint32 id;
- uint32 file_pos;
+ uint32 file_pos;
uint16 file_slot;
- int16 lru;
+ int16 lru;
};
@@ -338,8 +338,7 @@
assert(!(next->size & S_FREE_MASK));
/* If the next block is the sentinel block, we can safely return */
- if (next->size == 0)
- break;
+ if (next->size == 0) break;
/* Locate the sprite belonging to the next pointer. */
for (i = 0; GetSpriteCache(i)->ptr != next->data; i++) {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/spriteloader/png.cpp
--- a/src/spriteloader/png.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/spriteloader/png.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -9,7 +9,6 @@
#include "../fileio.h"
#include "../debug.h"
#include "../core/alloc_func.hpp"
-#include "../core/endian_func.hpp"
#include "png.hpp"
#include
@@ -126,18 +125,8 @@
color_type = PNG_COLOR_TYPE_RGB;
}
-#ifdef TTD_LITTLE_ENDIAN
- png_set_bgr(png_ptr);
-#else
- if (color_type == PNG_COLOR_TYPE_RGB_ALPHA) png_set_swap_alpha(png_ptr);
-#endif
-
if (color_type == PNG_COLOR_TYPE_RGB) {
-#ifdef TTD_LITTLE_ENDIAN
png_set_filler(png_ptr, 0xff, PNG_FILLER_AFTER);
-#else
- png_set_filler(png_ptr, 0xff, PNG_FILLER_BEFORE);
-#endif
}
pixelsize = sizeof(uint32);
@@ -159,16 +148,16 @@
for (uint x = 0; x < info_ptr->width; x++) {
if (mask) {
if (row_pointer[x * sizeof(uint8)] != 0) {
+ dst[x].r = 0;
+ dst[x].g = 0;
dst[x].b = 0;
- dst[x].g = 0;
- dst[x].r = 0;
/* Alpha channel is used from the original image (to allow transparency in remap colors) */
dst[x].m = row_pointer[x * sizeof(uint8)];
}
} else {
- dst[x].b = row_pointer[x * sizeof(uint32) + 0];
+ dst[x].r = row_pointer[x * sizeof(uint32) + 0];
dst[x].g = row_pointer[x * sizeof(uint32) + 1];
- dst[x].r = row_pointer[x * sizeof(uint32) + 2];
+ dst[x].b = row_pointer[x * sizeof(uint32) + 2];
dst[x].a = row_pointer[x * sizeof(uint32) + 3];
dst[x].m = 0;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/station.cpp
--- a/src/station.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/station.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -9,7 +9,6 @@
#include "station_map.h"
#include "station.h"
#include "town.h"
-#include "news.h"
#include "saveload.h"
#include "player_func.h"
#include "airport.h"
diff -r cc77111ebd85 -r 9707ad4c9b60 src/station_cmd.cpp
--- a/src/station_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/station_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -15,7 +15,7 @@
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "airport.h"
#include "sprite.h"
@@ -432,7 +432,7 @@
}
SetDParam(0, st->index);
- AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT | NF_TILE, NT_ACCEPTANCE, 0), st->xy, 0);
+ AddNewsItem(msg, NM_SMALL, NF_VIEWPORT | NF_TILE, NT_ACCEPTANCE, DNC_NONE, st->xy, 0);
}
/**
@@ -2177,7 +2177,7 @@
DrawGroundSprite(image, HasBit(image, PALETTE_MODIFIER_COLOR) ? palette : PAL_NONE);
}
- if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC && IsStationTileElectrifiable(ti->tile)) DrawCatenary(ti);
+ if (HasCatenary(GetRailType(ti->tile)) && IsStationTileElectrifiable(ti->tile)) DrawCatenary(ti);
if (HasBit(roadtypes, ROADTYPE_TRAM)) {
Axis axis = GetRoadStopDir(ti->tile) == DIAGDIR_NE ? AXIS_X : AXIS_Y;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/station_gui.cpp
--- a/src/station_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/station_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -682,19 +682,8 @@
{ WIDGETS_END},
};
-/**
- * Draws icons of wainting cargo in the StationView window
- *
- * @param i type of cargo
- * @param waiting number of wainting units
- * @param x x on-screen coordinate where to start with drawing icons
- * @param y y coordinate
- */
-static void DrawCargoIcons(CargoID i, uint waiting, int x, int y, uint width)
+SpriteID GetCargoSprite(CargoID i)
{
- uint num = min((waiting + 5) / 10, width / 10); // maximum is width / 10 icons so it won't overflow
- if (num == 0) return;
-
const CargoSpec *cs = GetCargo(i);
SpriteID sprite;
@@ -707,12 +696,36 @@
if (sprite == 0) sprite = SPR_CARGO_GOODS;
+ return sprite;
+}
+
+/**
+ * Draws icons of waiting cargo in the StationView window
+ *
+ * @param i type of cargo
+ * @param waiting number of waiting units
+ * @param x x on-screen coordinate where to start with drawing icons
+ * @param y y coordinate
+ */
+static void DrawCargoIcons(CargoID i, uint waiting, int x, int y, uint width)
+{
+ uint num = min((waiting + 5) / 10, width / 10); // maximum is width / 10 icons so it won't overflow
+ if (num == 0) return;
+
+ SpriteID sprite = GetCargoSprite(i);
+
do {
DrawSprite(sprite, PAL_NONE, x, y);
x += 10;
} while (--num);
}
+struct stationview_d {
+ uint32 cargo; ///< Bitmask of cargo types to expand
+ uint16 cargo_rows[NUM_CARGO]; ///< Header row for each cargo type
+};
+assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(stationview_d));
+
struct CargoData {
CargoID cargo;
StationID source;
@@ -740,13 +753,19 @@
int pos; ///< = w->vscroll.pos
StringID str;
CargoDataList cargolist;
+ uint32 transfers = 0;
/* count types of cargos waiting in station */
for (CargoID i = 0; i < NUM_CARGO; i++) {
- if (!st->goods[i].cargo.Empty()) {
+ if (st->goods[i].cargo.Empty()) {
+ WP(w, stationview_d).cargo_rows[i] = 0;
+ } else {
/* Add an entry for total amount of cargo of this type waiting. */
cargolist.push_back(CargoData(i, INVALID_STATION, st->goods[i].cargo.Count()));
+ /* Set the row for this cargo entry for the expand/hide button */
+ WP(w, stationview_d).cargo_rows[i] = cargolist.size();
+
/* Add an entry for each distinct cargo source. */
const CargoList::List *packets = st->goods[i].cargo.Packets();
for (CargoList::List::const_iterator it = packets->begin(); it != packets->end(); it++) {
@@ -754,6 +773,12 @@
if (cp->source != station_id) {
bool added = false;
+ /* Enable the expand/hide button for this cargo type */
+ SetBit(transfers, i);
+
+ /* Don't add cargo lines if not expanded */
+ if (!HasBit(WP(w, stationview_d).cargo, i)) break;
+
/* Check if we already have this source in the list */
for (CargoDataList::iterator jt = cargolist.begin(); jt != cargolist.end(); jt++) {
CargoData *cd = &(*jt);
@@ -807,7 +832,14 @@
DrawCargoIcons(cd->cargo, cd->count, x, y, width);
SetDParam(0, cd->cargo);
SetDParam(1, cd->count);
- DrawStringRightAligned(x + width, y, STR_0009, TC_FROMSTRING);
+ if (HasBit(transfers, cd->cargo)) {
+ /* This cargo has transfers waiting so show the expand or shrink 'button' */
+ const char *sym = HasBit(WP(w, stationview_d).cargo, cd->cargo) ? "-" : "+";
+ DrawStringRightAligned(x + width - 8, y, STR_0009, TC_FROMSTRING);
+ DoDrawString(sym, x + width - 6, y, TC_YELLOW);
+ } else {
+ DrawStringRightAligned(x + width, y, STR_0009, TC_FROMSTRING);
+ }
} else {
SetDParam(0, cd->cargo);
SetDParam(1, cd->count);
@@ -870,6 +902,19 @@
}
}
+static void HandleCargoWaitingClick(Window *w, int row)
+{
+ if (row == 0) return;
+
+ for (CargoID c = 0; c < NUM_CARGO; c++) {
+ if (WP(w, stationview_d).cargo_rows[c] == row) {
+ ToggleBit(WP(w, stationview_d).cargo, c);
+ w->InvalidateWidget(SVW_WAITING);
+ break;
+ }
+ }
+}
+
/**
* Fuction called when any WindowEvent occurs for any StationView window
@@ -886,6 +931,10 @@
case WE_CLICK:
switch (e->we.click.widget) {
+ case SVW_WAITING:
+ HandleCargoWaitingClick(w, (e->we.click.pt.y - w->widget[SVW_WAITING].top) / 10 + w->vscroll.pos);
+ break;
+
case SVW_LOCATION:
ScrollMainWindowToTile(GetStation(w->window_number)->xy);
break;
@@ -953,7 +1002,7 @@
case WE_DESTROY: {
WindowNumber wno =
- (w->window_number << 16) | GetStation(w->window_number)->owner;
+ (w->window_number << 16) | VLW_STATION_LIST | GetStation(w->window_number)->owner;
DeleteWindowById(WC_TRAINS_LIST, wno);
DeleteWindowById(WC_ROADVEH_LIST, wno);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/stdafx.h
--- a/src/stdafx.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/stdafx.h Fri Mar 28 10:32:55 2008 +0000
@@ -279,6 +279,8 @@
#define assert_compile(expr) extern "C" void __ct_assert__(int a[1 - 2 * !(expr)])
#endif /* __OS2__ */
+/* Check if the types have the bitsizes like we are using them */
+assert_compile(sizeof(uint64) == 8);
assert_compile(sizeof(uint32) == 4);
assert_compile(sizeof(uint16) == 2);
assert_compile(sizeof(uint8) == 1);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/strgen/strgen.cpp
--- a/src/strgen/strgen.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/strgen/strgen.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -103,7 +103,7 @@
static int _numcases;
// for each plural value, this is the number of plural forms.
-static const byte _plural_form_counts[] = { 2, 1, 2, 3, 3, 3, 3, 3, 4 };
+static const byte _plural_form_counts[] = { 2, 1, 2, 3, 3, 3, 3, 3, 4, 2 };
static const char *_cur_ident;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/string_func.h
--- a/src/string_func.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/string_func.h Fri Mar 28 10:32:55 2008 +0000
@@ -48,7 +48,7 @@
static inline int ttd_strnlen(const char *str, int maxlen)
{
const char *t;
- for (t = str; *t != '\0' && t - str < maxlen; t++);
+ for (t = str; *t != '\0' && t - str < maxlen; t++) {}
return t - str;
}
@@ -128,7 +128,7 @@
static inline char *Utf8PrevChar(const char *s)
{
const char *ret = s;
- while (IsUtf8Part(*--ret));
+ while (IsUtf8Part(*--ret)) {}
return (char*)ret;
}
@@ -142,7 +142,8 @@
}
/**
- * Check whether UNICODE character is whitespace or not
+ * Check whether UNICODE character is whitespace or not, i.e. whether
+ * this is a potential line-break character.
* @param c UNICODE character to check
* @return a boolean value whether 'c' is a whitespace character or not
* @see http://www.fileformat.info/info/unicode/category/Zs/list.htm
@@ -151,7 +152,6 @@
{
return
c == 0x0020 /* SPACE */ ||
- c == 0x00A0 /* NO-BREAK SPACE */ ||
c == 0x3000 /* IDEOGRAPHIC SPACE */
;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/strings.cpp
--- a/src/strings.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/strings.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -5,10 +5,9 @@
#include "stdafx.h"
#include "openttd.h"
#include "currency.h"
-#include "namegen.h"
+#include "namegen_func.h"
#include "station.h"
#include "town.h"
-#include "news.h"
#include "screenshot.h"
#include "waypoint.h"
#include "industry.h"
@@ -400,68 +399,75 @@
return buff;
}
-static int DeterminePluralForm(int64 cnt)
+static int DeterminePluralForm(int64 count)
{
- uint64 n = cnt;
/* The absolute value determines plurality */
- if (cnt < 0) n = -cnt;
+ uint64 n = abs(count);
switch (_langpack->plural_form) {
- /* Two forms, singular used for one only
- * Used in:
- * Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
- * Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto */
- case 0:
- default:
- return n != 1;
-
- /* Only one form
- * Used in:
- * Hungarian, Japanese, Korean, Turkish */
- case 1:
- return 0;
-
- /* Two forms, singular used for zero and one
- * Used in:
- * French, Brazilian Portuguese */
- case 2:
- return n > 1;
-
- /* Three forms, special case for zero
- * Used in:
- * Latvian */
- case 3:
- return n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2;
+ default:
+ NOT_REACHED();
- /* Three forms, special case for one and two
- * Used in:
- * Gaelige (Irish) */
- case 4:
- return n == 1 ? 0 : n == 2 ? 1 : 2;
-
- /* Three forms, special case for numbers ending in 1[2-9]
- * Used in:
- * Lithuanian */
- case 5:
- return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+ /* Two forms, singular used for one only
+ * Used in:
+ * Danish, Dutch, English, German, Norwegian, Swedish, Estonian, Finnish,
+ * Greek, Hebrew, Italian, Portuguese, Spanish, Esperanto */
+ case 0:
+ return n != 1;
- /* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
- * Used in:
- * Croatian, Czech, Russian, Slovak, Ukrainian */
- case 6:
- return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+ /* Only one form
+ * Used in:
+ * Hungarian, Japanese, Korean, Turkish */
+ case 1:
+ return 0;
- /* Three forms, special case for one and some numbers ending in 2, 3, or 4
- * Used in:
- * Polish */
- case 7:
- return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+ /* Two forms, singular used for zero and one
+ * Used in:
+ * French, Brazilian Portuguese */
+ case 2:
+ return n > 1;
- /* Four forms, special case for one and all numbers ending in 02, 03, or 04
- * Used in:
- * Slovenian */
- case 8:
- return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
+ /* Three forms, special case for zero
+ * Used in:
+ * Latvian */
+ case 3:
+ return n % 10 == 1 && n % 100 != 11 ? 0 : n != 0 ? 1 : 2;
+
+ /* Three forms, special case for one and two
+ * Used in:
+ * Gaelige (Irish) */
+ case 4:
+ return n == 1 ? 0 : n == 2 ? 1 : 2;
+
+ /* Three forms, special case for numbers ending in 1[2-9]
+ * Used in:
+ * Lithuanian */
+ case 5:
+ return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+ /* Three forms, special cases for numbers ending in 1 and 2, 3, 4, except those ending in 1[1-4]
+ * Used in:
+ * Croatian, Czech, Russian, Slovak, Ukrainian */
+ case 6:
+ return n % 10 == 1 && n % 100 != 11 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+ /* Three forms, special case for one and some numbers ending in 2, 3, or 4
+ * Used in:
+ * Polish */
+ case 7:
+ return n == 1 ? 0 : n % 10 >= 2 && n % 10 <= 4 && (n % 100 < 10 || n % 100 >= 20) ? 1 : 2;
+
+ /* Four forms, special case for one and all numbers ending in 02, 03, or 04
+ * Used in:
+ * Slovenian */
+ case 8:
+ return n % 100 == 1 ? 0 : n % 100 == 2 ? 1 : n % 100 == 3 || n % 100 == 4 ? 2 : 3;
+
+ /* Two forms; singular used for everything ending in 1 but not in 11.
+ * Used in:
+ * Icelandic */
+ case 9:
+ return n % 10 == 1 && n % 100 != 11 ? 0 : 1;
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/table/cargo_const.h
--- a/src/table/cargo_const.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/table/cargo_const.h Fri Mar 28 10:32:55 2008 +0000
@@ -106,11 +106,11 @@
SPR_CARGO_SUGAR, CC_BULK ),
MK( 18, 'TOYS', 174, 2, 5574, 25, 255, true, TE_NONE,
- STR_0025_TOYS, STR_0045_TOY, STR_NOTHING, STR_QUANTITY_TOYS, STR_ABBREV_TOYS,
+ STR_0025_TOYS, STR_0045_TOY, STR_ITEMS, STR_QUANTITY_TOYS, STR_ABBREV_TOYS,
SPR_CARGO_TOYS, CC_PIECE_GOODS ),
MK( 19, 'BATT', 208, 4, 4322, 2, 30, true, TE_NONE,
- STR_002B_BATTERIES, STR_004B_BATTERY, STR_NOTHING, STR_QUANTITY_BATTERIES, STR_ABBREV_BATTERIES,
+ STR_002B_BATTERIES, STR_004B_BATTERY, STR_ITEMS, STR_QUANTITY_BATTERIES, STR_ABBREV_BATTERIES,
SPR_CARGO_BATTERIES, CC_PIECE_GOODS ),
MK( 20, 'SWET', 194, 5, 6144, 8, 40, true, TE_GOODS,
@@ -130,7 +130,7 @@
SPR_CARGO_COTTONCANDY, CC_BULK ),
MK( 24, 'BUBL', 10, 1, 5077, 20, 80, true, TE_NONE,
- STR_0029_BUBBLES, STR_0049_BUBBLE, STR_NOTHING, STR_QUANTITY_BUBBLES, STR_ABBREV_BUBBLES,
+ STR_0029_BUBBLES, STR_0049_BUBBLE, STR_ITEMS, STR_QUANTITY_BUBBLES, STR_ABBREV_BUBBLES,
SPR_CARGO_BUBBLES, CC_PIECE_GOODS ),
MK( 25, 'PLST', 202, 16, 4664, 30, 255, true, TE_NONE,
@@ -138,7 +138,7 @@
SPR_CARGO_PLASTIC, CC_LIQUID ),
MK( 26, 'FZDR', 48, 2, 6250, 30, 50, true, TE_FOOD,
- STR_002D_FIZZY_DRINKS, STR_004D_FIZZY_DRINK, STR_NOTHING, STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
+ STR_002D_FIZZY_DRINKS, STR_004D_FIZZY_DRINK, STR_ITEMS, STR_QUANTITY_FIZZY_DRINKS, STR_ABBREV_FIZZY_DRINKS,
SPR_CARGO_FIZZYDRINK, CC_PIECE_GOODS ),
/* Void slot in temperate */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/table/files.h
--- a/src/table/files.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/table/files.h Fri Mar 28 10:32:55 2008 +0000
@@ -33,9 +33,10 @@
{ "TRGT.GRF", {0xfc, 0xde, 0x1d, 0x7e, 0x8a, 0x74, 0x19, 0x7d, 0x72, 0xa6, 0x26, 0x95, 0x88, 0x4b, 0x90, 0x9e} }
},
{ "SAMPLE.CAT", {0x42, 0x2e, 0xa3, 0xdd, 0x07, 0x4d, 0x28, 0x59, 0xbb, 0x51, 0x63, 0x9a, 0x6e, 0x0e, 0x85, 0xda} },
- { "OPENTTDD.GRF", {0x2c, 0x3a, 0x86, 0x3b, 0xe0, 0x42, 0xb1, 0x65, 0xba, 0x59, 0xcb, 0x99, 0x9c, 0x3f, 0xe5, 0x3e} }
+ { "OPENTTDD.GRF", {0x32, 0xb4, 0xec, 0x0c, 0xc9, 0x5d, 0xa0, 0x14, 0x3a, 0x2f, 0xe1, 0xd4, 0x20, 0x63, 0x49, 0x74} }
};
+
static FileList files_win = {
{
{ "TRG1R.GRF", {0xb0, 0x4c, 0xe5, 0x93, 0xd8, 0xc5, 0x01, 0x6e, 0x07, 0x47, 0x3a, 0x74, 0x3d, 0x7d, 0x33, 0x58} }, // 0 - 4792 inclusive
@@ -46,5 +47,5 @@
{ "TRGTR.GRF", {0xde, 0x53, 0x65, 0x05, 0x17, 0xfe, 0x66, 0x1c, 0xea, 0xa3, 0x13, 0x8c, 0x6e, 0xdb, 0x0e, 0xb8} }
},
{ "SAMPLE.CAT", {0x92, 0x12, 0xe8, 0x1e, 0x72, 0xba, 0xdd, 0x4b, 0xbe, 0x1e, 0xae, 0xae, 0x66, 0x45, 0x8e, 0x10} },
- { "OPENTTDW.GRF", {0x1d, 0x9b, 0x03, 0x5e, 0x5d, 0x87, 0xef, 0x21, 0x0f, 0xe3, 0x6e, 0x6d, 0x12, 0xa1, 0x85, 0xfb} }
+ { "OPENTTDW.GRF", {0xc6, 0x1f, 0xcc, 0x4e, 0x83, 0x98, 0x5b, 0x67, 0xb7, 0x03, 0xa0, 0x31, 0x39, 0x2e, 0x75, 0xfc} }
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/table/road_land.h
--- a/src/table/road_land.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/table/road_land.h Fri Mar 28 10:32:55 2008 +0000
@@ -9,13 +9,13 @@
};
static const DrawTileSeqStruct _road_depot_SE[] = {
- TILE_SEQ_LINE(0x580, PAL_NONE, 0, 0, 1, 16)
+ TILE_SEQ_LINE(0x580 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 1, 16)
TILE_SEQ_LINE(0x581 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 15, 0, 1, 16)
TILE_SEQ_END()
};
static const DrawTileSeqStruct _road_depot_SW[] = {
- TILE_SEQ_LINE(0x582, PAL_NONE, 0, 0, 16, 1)
+ TILE_SEQ_LINE(0x582 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 16, 1)
TILE_SEQ_LINE(0x583 | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
TILE_SEQ_END()
};
@@ -38,13 +38,13 @@
};
static const DrawTileSeqStruct _tram_depot_SE[] = {
- TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x31, PAL_NONE, 0, 0, 1, 16)
+ TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x31) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 1, 16)
TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x32) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 15, 0, 1, 16)
TILE_SEQ_END()
};
static const DrawTileSeqStruct _tram_depot_SW[] = {
- TILE_SEQ_LINE(SPR_TRAMWAY_BASE + 0x33, PAL_NONE, 0, 0, 16, 1)
+ TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x33) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 0, 16, 1)
TILE_SEQ_LINE((SPR_TRAMWAY_BASE + 0x34) | (1 << PALETTE_MODIFIER_COLOR), PAL_NONE, 0, 15, 16, 1)
TILE_SEQ_END()
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/table/sprites.h
--- a/src/table/sprites.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/table/sprites.h Fri Mar 28 10:32:55 2008 +0000
@@ -49,7 +49,7 @@
/* Extra graphic spritenumbers */
SPR_OPENTTD_BASE = 4896,
- OPENTTD_SPRITE_COUNT = 138,
+ OPENTTD_SPRITE_COUNT = 144,
/* Halftile-selection sprites */
SPR_HALFTILE_SELECTION_FLAT = SPR_OPENTTD_BASE,
@@ -73,6 +73,14 @@
SPR_PIN_UP = SPR_OPENTTD_BASE + 51, // pin icon
SPR_PIN_DOWN = SPR_OPENTTD_BASE + 52,
+ /* on screen keyboard icons */
+ SPR_OSK_LEFT = SPR_OPENTTD_BASE + 138,
+ SPR_OSK_RIGHT = SPR_OPENTTD_BASE + 139,
+ SPR_OSK_CAPS = SPR_OPENTTD_BASE + 140,
+ SPR_OSK_SHIFT = SPR_OPENTTD_BASE + 141,
+ SPR_OSK_BACKSPACE = SPR_OPENTTD_BASE + 142,
+ SPR_OSK_SPECIAL = SPR_OPENTTD_BASE + 143,
+
/* Clone vehicles stuff */
SPR_CLONE_TRAIN = SPR_OPENTTD_BASE + 106,
SPR_CLONE_ROADVEH = SPR_OPENTTD_BASE + 107,
@@ -201,7 +209,7 @@
/* Flags sprites (in same order as enum NetworkLanguage) */
SPR_FLAGS_BASE = SPR_ONEWAY_BASE + ONEWAY_SPRITE_COUNT,
- FLAGS_SPRITE_COUNT = 29,
+ FLAGS_SPRITE_COUNT = 36,
/* Not really a sprite, but an empty bounding box. Used to construct bounding boxes, that help sorting the sprites, but do not have a sprite associated. */
SPR_EMPTY_BOUNDING_BOX = SPR_FLAGS_BASE + FLAGS_SPRITE_COUNT,
@@ -677,7 +685,7 @@
SPR_BTSGA_X_FRONT = 2503,
SPR_BTSGA_Y_FRONT = 2504,
SPR_BTSGA_X_PILLAR = 2505,
- SPR_BTSGA_Y_PILLAR = 2606,
+ SPR_BTSGA_Y_PILLAR = 2506,
SPR_BTSGA_MONO_X_REAR = 4324,
SPR_BTSGA_MONO_Y_REAR = 4325,
SPR_BTSGA_MGLV_X_REAR = 4364,
diff -r cc77111ebd85 -r 9707ad4c9b60 src/table/station_land.h
--- a/src/table/station_land.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/table/station_land.h Fri Mar 28 10:32:55 2008 +0000
@@ -132,7 +132,7 @@
static const DrawTileSeqStruct _station_display_datas_32[] = {
TILE_SEQ_LINE(14, 0, 0, 2, 16, 28, SPR_AIRPORT_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
- TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_AIRPORT_HANGAR_REAR)
+ TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_AIRPORT_HANGAR_REAR | (1 << PALETTE_MODIFIER_COLOR))
TILE_SEQ_END()
};
@@ -291,7 +291,7 @@
static const DrawTileSeqStruct _station_display_datas_65[] = {
TILE_SEQ_LINE(14, 0, 0, 2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
- TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_AIRFIELD_HANGAR_REAR)
+ TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_AIRFIELD_HANGAR_REAR | (1 << PALETTE_MODIFIER_COLOR))
TILE_SEQ_END()
};
@@ -403,7 +403,7 @@
// concrete underground
static const DrawTileSeqStruct _station_display_datas_086[] = {
TILE_SEQ_LINE(14, 0, 0, 2, 16, 28, SPR_AIRFIELD_HANGAR_FRONT | (1 << PALETTE_MODIFIER_COLOR))
- TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_AIRFIELD_HANGAR_REAR)
+ TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_AIRFIELD_HANGAR_REAR | (1 << PALETTE_MODIFIER_COLOR))
TILE_SEQ_END()
};
@@ -711,7 +711,7 @@
// West facing hangar
static const DrawTileSeqStruct _station_display_datas_0129[] = {
TILE_SEQ_LINE(14, 0, 0, 2, 16, 28, SPR_NEWHANGAR_W | (1 << PALETTE_MODIFIER_COLOR))
- TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_NEWHANGAR_W_WALL)
+ TILE_SEQ_LINE( 0, 0, 0, 2, 16, 28, SPR_NEWHANGAR_W_WALL | (1 << PALETTE_MODIFIER_COLOR))
TILE_SEQ_END()
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/textbuf_gui.h
--- a/src/textbuf_gui.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/textbuf_gui.h Fri Mar 28 10:32:55 2008 +0000
@@ -7,6 +7,7 @@
#include "window_type.h"
#include "string_type.h"
+#include "strings_type.h"
struct Textbuf {
char *buf; ///< buffer in which text is saved
@@ -26,6 +27,8 @@
};
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(querystr_d));
+extern char _edit_str_buf[64];
+extern char _orig_str_buf[lengthof(_edit_str_buf)];
void DrawEditBox(Window *w, querystr_d *string, int wid);
void HandleEditBox(Window *w, querystr_d *string, int wid);
@@ -43,4 +46,16 @@
void ShowQueryString(StringID str, StringID caption, uint maxlen, uint maxwidth, Window *parent, CharSetFilter afilter);
void ShowQuery(StringID caption, StringID message, Window *w, void (*callback)(Window*, bool));
+/** The number of 'characters' on the on-screen keyboard. */
+static const uint OSK_KEYBOARD_ENTRIES = 50;
+
+/**
+ * The number of characters has to be OSK_KEYBOARD_ENTRIES. However, these
+ * have to be UTF-8 encoded, which means up to 4 bytes per character.
+ * Furthermore the string needs to be '\0'-terminated.
+ */
+extern char _keyboard_opt[2][OSK_KEYBOARD_ENTRIES * 4 + 1];
+
+void ShowOnScreenKeyboard(Window *parent, querystr_d *q, int button, int cancel, int ok);
+
#endif /* TEXTBUF_GUI_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/timetable_gui.cpp
--- a/src/timetable_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/timetable_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -21,6 +21,22 @@
#include "table/strings.h"
+enum TimetableViewWindowWidgets {
+ TTV_WIDGET_CLOSEBOX = 0,
+ TTV_CAPTION,
+ TTV_ORDER_VIEW,
+ TTV_STICKY,
+ TTV_TIMETABLE_PANEL,
+ TTV_SCROLLBAR,
+ TTV_SUMMARY_PANEL,
+ TTV_CHANGE_TIME,
+ TTV_CLEAR_TIME,
+ TTV_RESET_LATENESS,
+ TTV_AUTOFILL,
+ TTV_EMPTY,
+ TTV_RESIZE,
+};
+
static int GetOrderFromTimetableWndPt(Window *w, int y, const Vehicle *v)
{
/*
@@ -57,29 +73,29 @@
if (v->owner == _local_player) {
if (selected == -1) {
- w->DisableWidget(6);
- w->DisableWidget(7);
+ w->DisableWidget(TTV_CHANGE_TIME);
+ w->DisableWidget(TTV_CLEAR_TIME);
} else if (selected % 2 == 1) {
- w->EnableWidget(6);
- w->EnableWidget(7);
+ w->EnableWidget(TTV_CHANGE_TIME);
+ w->EnableWidget(TTV_CLEAR_TIME);
} else {
const Order *order = GetVehicleOrder(v, (selected + 1) / 2);
bool disable = order == NULL || order->type != OT_GOTO_STATION || (_patches.new_nonstop && (order->flags & OFB_NON_STOP));
- w->SetWidgetDisabledState(6, disable);
- w->SetWidgetDisabledState(7, disable);
+ w->SetWidgetDisabledState(TTV_CHANGE_TIME, disable);
+ w->SetWidgetDisabledState(TTV_CLEAR_TIME, disable);
}
- w->EnableWidget(8);
- w->EnableWidget(9);
+ w->EnableWidget(TTV_RESET_LATENESS);
+ w->EnableWidget(TTV_AUTOFILL);
} else {
- w->DisableWidget(6);
- w->DisableWidget(7);
- w->DisableWidget(8);
- w->DisableWidget(9);
+ w->DisableWidget(TTV_CHANGE_TIME);
+ w->DisableWidget(TTV_CLEAR_TIME);
+ w->DisableWidget(TTV_RESET_LATENESS);
+ w->DisableWidget(TTV_AUTOFILL);
}
- w->SetWidgetLoweredState(9, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
+ w->SetWidgetLoweredState(TTV_AUTOFILL, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE));
SetDParam(0, v->index);
DrawWindowWidgets(w);
@@ -173,7 +189,7 @@
y += 10;
}
- y = w->widget[5].top + 1;
+ y = w->widget[TTV_SUMMARY_PANEL].top + 1;
{
uint total_time = 0;
@@ -221,7 +237,11 @@
const Vehicle *v = GetVehicle(w->window_number);
switch (we->we.click.widget) {
- case 3: { /* Main panel. */
+ case TTV_ORDER_VIEW: /* Order view button */
+ ShowOrdersWindow(v);
+ break;
+
+ case TTV_TIMETABLE_PANEL: { /* Main panel. */
int selected = GetOrderFromTimetableWndPt(w, we->we.click.pt.y, v);
if (selected == INVALID_ORDER || selected == WP(w, order_d).sel) {
@@ -233,7 +253,7 @@
}
} break;
- case 6: { /* "Wait For" button. */
+ case TTV_CHANGE_TIME: { /* "Wait For" button. */
int selected = WP(w, order_d).sel;
VehicleOrderID real = (selected + 1) / 2;
@@ -255,16 +275,16 @@
ShowQueryString(current, STR_TIMETABLE_CHANGE_TIME, 31, 150, w, CS_NUMERAL);
} break;
- case 7: { /* Clear waiting time button. */
+ case TTV_CLEAR_TIME: { /* Clear waiting time button. */
uint32 p1 = PackTimetableArgs(v, WP(w, order_d).sel);
DoCommandP(0, p1, 0, NULL, CMD_CHANGE_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
} break;
- case 8: /* Reset the vehicle's late counter. */
+ case TTV_RESET_LATENESS: /* Reset the vehicle's late counter. */
DoCommandP(0, v->index, 0, NULL, CMD_SET_VEHICLE_ON_TIME | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
break;
- case 9: /* Autofill the timetable. */
+ case TTV_AUTOFILL: /* Autofill the timetable. */
DoCommandP(0, v->index, HasBit(v->vehicle_flags, VF_AUTOFILL_TIMETABLE) ? 0 : 1, NULL, CMD_AUTOFILL_TIMETABLE | CMD_MSG(STR_CAN_T_TIMETABLE_VEHICLE));
break;
}
@@ -287,29 +307,30 @@
case WE_RESIZE:
/* Update the scroll + matrix */
- w->vscroll.cap = (w->widget[3].bottom - w->widget[3].top) / 10;
+ w->vscroll.cap = (w->widget[TTV_TIMETABLE_PANEL].bottom - w->widget[TTV_TIMETABLE_PANEL].top) / 10;
break;
}
}
static const Widget _timetable_widgets[] = {
- { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
- { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 387, 0, 13, STR_TIMETABLE_TITLE, STR_018C_WINDOW_TITLE_DRAG_THIS},
- { WWT_STICKYBOX, RESIZE_LR, 14, 388, 399, 0, 13, STR_NULL, STR_STICKY_BUTTON},
-
- { WWT_PANEL, RESIZE_RB, 14, 0, 387, 14, 95, STR_NULL, STR_TIMETABLE_TOOLTIP},
- { WWT_SCROLLBAR, RESIZE_LRB, 14, 388, 399, 14, 95, STR_NULL, STR_0190_SCROLL_BAR_SCROLLS_LIST},
+ { WWT_CLOSEBOX, RESIZE_NONE, 14, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW}, // TTV_WIDGET_CLOSEBOX
+ { WWT_CAPTION, RESIZE_RIGHT, 14, 11, 326, 0, 13, STR_TIMETABLE_TITLE, STR_018C_WINDOW_TITLE_DRAG_THIS}, // TTV_CAPTION
+ { WWT_PUSHTXTBTN, RESIZE_LR, 14, 327, 387, 0, 13, STR_ORDER_VIEW, STR_ORDER_VIEW_TOOLTIP}, // TTV_ORDER_VIEW
+ { WWT_STICKYBOX, RESIZE_LR, 14, 388, 399, 0, 13, STR_NULL, STR_STICKY_BUTTON}, // TTV_STICKY
- { WWT_PANEL, RESIZE_RTB, 14, 0, 399, 96, 117, STR_NULL, STR_NULL},
+ { WWT_PANEL, RESIZE_RB, 14, 0, 387, 14, 95, STR_NULL, STR_TIMETABLE_TOOLTIP}, // TTV_TIMETABLE_PANEL
+ { WWT_SCROLLBAR, RESIZE_LRB, 14, 388, 399, 14, 95, STR_NULL, STR_0190_SCROLL_BAR_SCROLLS_LIST}, // TTV_SCROLLBAR
- { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 109, 118, 129, STR_TIMETABLE_CHANGE_TIME, STR_TIMETABLE_WAIT_TIME_TOOLTIP},
- { WWT_PUSHTXTBTN, RESIZE_TB, 14, 110, 219, 118, 129, STR_CLEAR_TIME, STR_TIMETABLE_CLEAR_TIME_TOOLTIP},
- { WWT_PUSHTXTBTN, RESIZE_TB, 14, 220, 337, 118, 129, STR_RESET_LATENESS, STR_TIMETABLE_RESET_LATENESS_TOOLTIP},
- { WWT_PUSHTXTBTN, RESIZE_TB, 14, 338, 387, 118, 129, STR_TIMETABLE_AUTOFILL, STR_TIMETABLE_AUTOFILL_TOOLTIP},
+ { WWT_PANEL, RESIZE_RTB, 14, 0, 399, 96, 117, STR_NULL, STR_NULL}, // TTV_SUMMARY_PANEL
- { WWT_PANEL, RESIZE_RTB, 14, 388, 387, 118, 129, STR_NULL, STR_NULL},
- { WWT_RESIZEBOX, RESIZE_LRTB, 14, 388, 399, 118, 129, STR_NULL, STR_RESIZE_BUTTON},
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 0, 109, 118, 129, STR_TIMETABLE_CHANGE_TIME, STR_TIMETABLE_WAIT_TIME_TOOLTIP}, // TTV_CHANGE_TIME
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 110, 219, 118, 129, STR_CLEAR_TIME, STR_TIMETABLE_CLEAR_TIME_TOOLTIP}, // TTV_CLEAR_TIME
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 220, 337, 118, 129, STR_RESET_LATENESS, STR_TIMETABLE_RESET_LATENESS_TOOLTIP}, // TTV_RESET_LATENESS
+ { WWT_PUSHTXTBTN, RESIZE_TB, 14, 338, 387, 118, 129, STR_TIMETABLE_AUTOFILL, STR_TIMETABLE_AUTOFILL_TOOLTIP}, // TTV_AUTOFILL
+
+ { WWT_PANEL, RESIZE_RTB, 14, 388, 387, 118, 129, STR_NULL, STR_NULL}, // TTV_EMPTY
+ { WWT_RESIZEBOX, RESIZE_LRTB, 14, 388, 399, 118, 129, STR_NULL, STR_RESIZE_BUTTON}, // TTV_RESIZE
{ WIDGETS_END }
};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/toolbar_gui.cpp
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/toolbar_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,799 @@
+/* $Id$ */
+
+/** @file toolbar_gui.cpp Code related to the (main) toolbar. */
+
+#include "stdafx.h"
+#include "openttd.h"
+#include "gui.h"
+#include "window_gui.h"
+#include "window_func.h"
+#include "viewport_func.h"
+#include "command_func.h"
+#include "variables.h"
+#include "train.h"
+#include "roadveh.h"
+#include "vehicle_gui.h"
+#include "rail_gui.h"
+#include "road_gui.h"
+#include "date_func.h"
+#include "vehicle_func.h"
+#include "sound_func.h"
+#include "terraform_gui.h"
+#include "transparency.h"
+#include "strings_func.h"
+#include "player_base.h"
+#include "player_func.h"
+#include "player_gui.h"
+#include "settings_type.h"
+#include "toolbar_gui.h"
+#include "vehicle_base.h"
+#include "gfx_func.h"
+
+#include "network/network.h"
+
+#include "table/strings.h"
+#include "table/sprites.h"
+
+extern void SelectSignTool();
+extern RailType _last_built_railtype;
+extern RoadType _last_built_roadtype;
+
+/* Returns the position where the toolbar wants the menu to appear.
+ * Make sure the dropdown is fully visible within the window.
+ * x + w->left because x is supposed to be the offset of the toolbar-button
+ * we clicked on and w->left the toolbar window itself. So meaning that
+ * the default position is aligned with the left side of the clicked button */
+Point GetToolbarDropdownPos(uint16 parent_button, int width, int height)
+{
+ const Window *w = FindWindowById(WC_MAIN_TOOLBAR,0);
+ Point pos;
+ pos.x = w->widget[GB(parent_button, 0, 8)].left;
+ pos.x = w->left + Clamp(pos.x, 0, w->width - width);
+ pos.y = w->height;
+
+ return pos;
+}
+
+
+static void ToolbarPauseClick(Window *w)
+{
+ if (_networking && !_network_server) return; // only server can pause the game
+
+ if (DoCommandP(0, _pause_game ? 0 : 1, 0, NULL, CMD_PAUSE)) SndPlayFx(SND_15_BEEP);
+}
+
+static void ToolbarFastForwardClick(Window *w)
+{
+ _fast_forward ^= true;
+ SndPlayFx(SND_15_BEEP);
+}
+
+static void ToolbarSaveClick(Window *w)
+{
+ PopupMainToolbMenu(w, 3, STR_015C_SAVE_GAME, 4, 0);
+}
+
+static void ToolbarMapClick(Window *w)
+{
+ PopupMainToolbMenu(w, 4, STR_02DE_MAP_OF_WORLD, 3, 0);
+}
+
+static void ToolbarTownClick(Window *w)
+{
+ PopupMainToolbMenu(w, 5, STR_02BB_TOWN_DIRECTORY, 1, 0);
+}
+
+static void ToolbarSubsidiesClick(Window *w)
+{
+ PopupMainToolbMenu(w, 6, STR_02DD_SUBSIDIES, 1, 0);
+}
+
+static void ToolbarStationsClick(Window *w)
+{
+ PopupMainPlayerToolbMenu(w, 7, 0);
+}
+
+static void ToolbarMoneyClick(Window *w)
+{
+ PopupMainPlayerToolbMenu(w, 8, 0);
+}
+
+static void ToolbarPlayersClick(Window *w)
+{
+ PopupMainPlayerToolbMenu(w, 9, 0);
+}
+
+static void ToolbarGraphsClick(Window *w)
+{
+ PopupMainToolbMenu(w, 10, STR_0154_OPERATING_PROFIT_GRAPH, 6, 0);
+}
+
+static void ToolbarLeagueClick(Window *w)
+{
+ PopupMainToolbMenu(w, 11, STR_015A_COMPANY_LEAGUE_TABLE, 2, 0);
+}
+
+static void ToolbarIndustryClick(Window *w)
+{
+ /* Disable build-industry menu if we are a spectator */
+ PopupMainToolbMenu(w, 12, STR_INDUSTRY_DIR, 2, (_current_player == PLAYER_SPECTATOR) ? (1 << 1) : 0);
+}
+
+static void ToolbarTrainClick(Window *w)
+{
+ const Vehicle *v;
+ int dis = -1;
+
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == VEH_TRAIN && IsFrontEngine(v)) ClrBit(dis, v->owner);
+ }
+ PopupMainPlayerToolbMenu(w, 13, dis);
+}
+
+static void ToolbarRoadClick(Window *w)
+{
+ const Vehicle *v;
+ int dis = -1;
+
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == VEH_ROAD && IsRoadVehFront(v)) ClrBit(dis, v->owner);
+ }
+ PopupMainPlayerToolbMenu(w, 14, dis);
+}
+
+static void ToolbarShipClick(Window *w)
+{
+ const Vehicle *v;
+ int dis = -1;
+
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == VEH_SHIP) ClrBit(dis, v->owner);
+ }
+ PopupMainPlayerToolbMenu(w, 15, dis);
+}
+
+static void ToolbarAirClick(Window *w)
+{
+ const Vehicle *v;
+ int dis = -1;
+
+ FOR_ALL_VEHICLES(v) {
+ if (v->type == VEH_AIRCRAFT) ClrBit(dis, v->owner);
+ }
+ PopupMainPlayerToolbMenu(w, 16, dis);
+}
+
+
+static void ToolbarZoomInClick(Window *w)
+{
+ if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
+ w->HandleButtonClick(17);
+ SndPlayFx(SND_15_BEEP);
+ }
+}
+
+static void ToolbarZoomOutClick(Window *w)
+{
+ if (DoZoomInOutWindow(ZOOM_OUT,FindWindowById(WC_MAIN_WINDOW, 0))) {
+ w->HandleButtonClick(18);
+ SndPlayFx(SND_15_BEEP);
+ }
+}
+
+static void ToolbarBuildRailClick(Window *w)
+{
+ const Player *p = GetPlayer(_local_player);
+ Window *w2 = PopupMainToolbMenu(w, 19, STR_1015_RAILROAD_CONSTRUCTION, RAILTYPE_END, ~p->avail_railtypes);
+ WP(w2, menu_d).sel_index = _last_built_railtype;
+}
+
+static void ToolbarBuildRoadClick(Window *w)
+{
+ const Player *p = GetPlayer(_local_player);
+ /* The standard road button is *always* available */
+ Window *w2 = PopupMainToolbMenu(w, 20, STR_180A_ROAD_CONSTRUCTION, 2, ~(p->avail_roadtypes | ROADTYPES_ROAD));
+ WP(w2, menu_d).sel_index = _last_built_roadtype;
+}
+
+static void ToolbarBuildWaterClick(Window *w)
+{
+ PopupMainToolbMenu(w, 21, STR_9800_DOCK_CONSTRUCTION, 1, 0);
+}
+
+static void ToolbarBuildAirClick(Window *w)
+{
+ PopupMainToolbMenu(w, 22, STR_A01D_AIRPORT_CONSTRUCTION, 1, 0);
+}
+
+static void ToolbarForestClick(Window *w)
+{
+ PopupMainToolbMenu(w, 23, STR_LANDSCAPING, 3, 0);
+}
+
+static void ToolbarMusicClick(Window *w)
+{
+ PopupMainToolbMenu(w, 24, STR_01D3_SOUND_MUSIC, 1, 0);
+}
+
+static void ToolbarNewspaperClick(Window *w)
+{
+ PopupMainToolbMenu(w, 25, STR_0200_LAST_MESSAGE_NEWS_REPORT, 3, 0);
+}
+
+static void ToolbarHelpClick(Window *w)
+{
+ PopupMainToolbMenu(w, 26, STR_02D5_LAND_BLOCK_INFO, 6, 0);
+}
+
+static void ToolbarOptionsClick(Window *w)
+{
+ uint16 x = 0;
+
+ w = PopupMainToolbMenu(w, 2, STR_02C4_GAME_OPTIONS, 14, 0);
+
+ if (HasBit(_display_opt, DO_SHOW_TOWN_NAMES)) SetBit(x, 6);
+ if (HasBit(_display_opt, DO_SHOW_STATION_NAMES)) SetBit(x, 7);
+ if (HasBit(_display_opt, DO_SHOW_SIGNS)) SetBit(x, 8);
+ if (HasBit(_display_opt, DO_WAYPOINTS)) SetBit(x, 9);
+ if (HasBit(_display_opt, DO_FULL_ANIMATION)) SetBit(x, 10);
+ if (HasBit(_display_opt, DO_FULL_DETAIL)) SetBit(x, 11);
+ if (IsTransparencySet(TO_HOUSES)) SetBit(x, 12);
+ if (IsTransparencySet(TO_SIGNS)) SetBit(x, 13);
+ WP(w, menu_d).checked_items = x;
+}
+
+
+static void ToolbarScenSaveOrLoad(Window *w)
+{
+ PopupMainToolbMenu(w, 3, STR_0292_SAVE_SCENARIO, 6, 0);
+}
+
+static void ToolbarScenDateBackward(Window *w)
+{
+ /* don't allow too fast scrolling */
+ if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
+ w->HandleButtonClick(6);
+ SetWindowDirty(w);
+
+ _patches_newgame.starting_year = Clamp(_patches_newgame.starting_year - 1, MIN_YEAR, MAX_YEAR);
+ SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
+ }
+ _left_button_clicked = false;
+}
+
+static void ToolbarScenDateForward(Window *w)
+{
+ /* don't allow too fast scrolling */
+ if ((w->flags4 & WF_TIMEOUT_MASK) <= 2 << WF_TIMEOUT_SHL) {
+ w->HandleButtonClick(7);
+ SetWindowDirty(w);
+
+ _patches_newgame.starting_year = Clamp(_patches_newgame.starting_year + 1, MIN_YEAR, MAX_YEAR);
+ SetDate(ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
+ }
+ _left_button_clicked = false;
+}
+
+static void ToolbarScenMapTownDir(Window *w)
+{
+ /* Scenario editor button, *hack*hack* use different button to activate */
+ PopupMainToolbMenu(w, 8 | (17 << 8), STR_02DE_MAP_OF_WORLD, 4, 0);
+}
+
+static void ToolbarScenZoomIn(Window *w)
+{
+ if (DoZoomInOutWindow(ZOOM_IN, FindWindowById(WC_MAIN_WINDOW, 0))) {
+ w->HandleButtonClick(9);
+ SndPlayFx(SND_15_BEEP);
+ }
+}
+
+static void ToolbarScenZoomOut(Window *w)
+{
+ if (DoZoomInOutWindow(ZOOM_OUT, FindWindowById(WC_MAIN_WINDOW, 0))) {
+ w->HandleButtonClick(10);
+ SndPlayFx(SND_15_BEEP);
+ }
+}
+
+static void ToolbarScenGenLand(Window *w)
+{
+ w->HandleButtonClick(11);
+ SndPlayFx(SND_15_BEEP);
+
+ ShowEditorTerraformToolbar();
+}
+
+
+static void ToolbarScenGenTown(Window *w)
+{
+ w->HandleButtonClick(12);
+ SndPlayFx(SND_15_BEEP);
+ ShowBuildTownWindow();
+}
+
+static void ToolbarScenGenIndustry(Window *w)
+{
+ w->HandleButtonClick(13);
+ SndPlayFx(SND_15_BEEP);
+ ShowBuildIndustryWindow();
+}
+
+static void ToolbarScenBuildRoad(Window *w)
+{
+ w->HandleButtonClick(14);
+ SndPlayFx(SND_15_BEEP);
+ ShowBuildRoadScenToolbar();
+}
+
+static void ToolbarScenPlantTrees(Window *w)
+{
+ w->HandleButtonClick(15);
+ SndPlayFx(SND_15_BEEP);
+ ShowBuildTreesScenToolbar();
+}
+
+static void ToolbarScenPlaceSign(Window *w)
+{
+ w->HandleButtonClick(16);
+ SndPlayFx(SND_15_BEEP);
+ SelectSignTool();
+}
+
+static void ToolbarBtn_NULL(Window *w)
+{
+}
+
+
+typedef void ToolbarButtonProc(Window *w);
+
+static ToolbarButtonProc * const _toolbar_button_procs[] = {
+ ToolbarPauseClick,
+ ToolbarFastForwardClick,
+ ToolbarOptionsClick,
+ ToolbarSaveClick,
+ ToolbarMapClick,
+ ToolbarTownClick,
+ ToolbarSubsidiesClick,
+ ToolbarStationsClick,
+ ToolbarMoneyClick,
+ ToolbarPlayersClick,
+ ToolbarGraphsClick,
+ ToolbarLeagueClick,
+ ToolbarIndustryClick,
+ ToolbarTrainClick,
+ ToolbarRoadClick,
+ ToolbarShipClick,
+ ToolbarAirClick,
+ ToolbarZoomInClick,
+ ToolbarZoomOutClick,
+ ToolbarBuildRailClick,
+ ToolbarBuildRoadClick,
+ ToolbarBuildWaterClick,
+ ToolbarBuildAirClick,
+ ToolbarForestClick,
+ ToolbarMusicClick,
+ ToolbarNewspaperClick,
+ ToolbarHelpClick,
+};
+
+extern void MenuClickSmallScreenshot();
+extern void MenuClickWorldScreenshot();
+extern void MenuClickSaveLoad(int index);
+
+void MainToolbarWndProc(Window *w, WindowEvent *e)
+{
+ switch (e->event) {
+ case WE_PAINT:
+ /* Draw brown-red toolbar bg. */
+ GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
+ GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
+
+ /* If spectator, disable all construction buttons
+ * ie : Build road, rail, ships, airports and landscaping
+ * Since enabled state is the default, just disable when needed */
+ w->SetWidgetsDisabledState(_current_player == PLAYER_SPECTATOR, 19, 20, 21, 22, 23, WIDGET_LIST_END);
+ /* disable company list drop downs, if there are no companies */
+ w->SetWidgetsDisabledState(ActivePlayerCount() == 0, 7, 8, 13, 14, 15, 16, WIDGET_LIST_END);
+
+ w->SetWidgetDisabledState(19, !CanBuildVehicleInfrastructure(VEH_TRAIN));
+ w->SetWidgetDisabledState(22, !CanBuildVehicleInfrastructure(VEH_AIRCRAFT));
+
+ DrawWindowWidgets(w);
+ break;
+
+ case WE_CLICK:
+ if (_game_mode != GM_MENU && !w->IsWidgetDisabled(e->we.click.widget))
+ _toolbar_button_procs[e->we.click.widget](w);
+ break;
+
+ case WE_KEYPRESS:
+ switch (e->we.keypress.keycode) {
+ case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
+ case WKC_F2: ShowGameOptions(); break;
+ case WKC_F3: MenuClickSaveLoad(0); break;
+ case WKC_F4: ShowSmallMap(); break;
+ case WKC_F5: ShowTownDirectory(); break;
+ case WKC_F6: ShowSubsidiesList(); break;
+ case WKC_F7: ShowPlayerStations(_local_player); break;
+ case WKC_F8: ShowPlayerFinances(_local_player); break;
+ case WKC_F9: ShowPlayerCompany(_local_player); break;
+ case WKC_F10: ShowOperatingProfitGraph(); break;
+ case WKC_F11: ShowCompanyLeagueTable(); break;
+ case WKC_F12: ShowBuildIndustryWindow(); break;
+ case WKC_SHIFT | WKC_F1: ShowVehicleListWindow(_local_player, VEH_TRAIN); break;
+ case WKC_SHIFT | WKC_F2: ShowVehicleListWindow(_local_player, VEH_ROAD); break;
+ case WKC_SHIFT | WKC_F3: ShowVehicleListWindow(_local_player, VEH_SHIP); break;
+ case WKC_SHIFT | WKC_F4: ShowVehicleListWindow(_local_player, VEH_AIRCRAFT); break;
+ case WKC_NUM_PLUS: // Fall through
+ case WKC_EQUALS: // Fall through
+ case WKC_SHIFT | WKC_EQUALS: // Fall through
+ case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
+ case WKC_NUM_MINUS: // Fall through
+ case WKC_MINUS: // Fall through
+ case WKC_SHIFT | WKC_MINUS: // Fall through
+ case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
+ case WKC_SHIFT | WKC_F7: if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, -1); break;
+ case WKC_SHIFT | WKC_F8: ShowBuildRoadToolbar(_last_built_roadtype); break;
+ case WKC_SHIFT | WKC_F9: ShowBuildDocksToolbar(); break;
+ case WKC_SHIFT | WKC_F10: if (CanBuildVehicleInfrastructure(VEH_AIRCRAFT)) ShowBuildAirToolbar(); break;
+ case WKC_SHIFT | WKC_F11: ShowBuildTreesToolbar(); break;
+ case WKC_SHIFT | WKC_F12: ShowMusicWindow(); break;
+ case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
+ case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
+ case WKC_CTRL | WKC_ALT | 'C': if (!_networking) ShowCheatWindow(); break;
+ case 'A': if (CanBuildVehicleInfrastructure(VEH_TRAIN)) ShowBuildRailToolbar(_last_built_railtype, 4); break; // Invoke Autorail
+ case 'L': ShowTerraformToolbar(); break;
+ case 'M': ShowSmallMap(); break;
+ case 'V': ShowExtraViewPortWindow(); break;
+ default: return;
+ }
+ e->we.keypress.cont = false;
+ break;
+
+ case WE_PLACE_OBJ:
+ _place_proc(e->we.place.tile);
+ break;
+
+ case WE_ABORT_PLACE_OBJ:
+ w->RaiseWidget(25);
+ SetWindowDirty(w);
+ break;
+
+ case WE_MOUSELOOP:
+ if (w->IsWidgetLowered(0) != !!_pause_game) {
+ w->ToggleWidgetLoweredState(0);
+ w->InvalidateWidget(0);
+ }
+
+ if (w->IsWidgetLowered(1) != !!_fast_forward) {
+ w->ToggleWidgetLoweredState(1);
+ w->InvalidateWidget(1);
+ }
+ break;
+
+ case WE_RESIZE: {
+ /* There are 27 buttons plus some spacings if the space allows it */
+ uint button_width;
+ uint spacing;
+ if (w->width >= 27 * 22) {
+ button_width = 22;
+ spacing = w->width - (27 * button_width);
+ } else {
+ button_width = w->width / 27;
+ spacing = 0;
+ }
+ uint extra_spacing_at[] = { 4, 8, 13, 17, 19, 24, 0 };
+
+ for (uint i = 0, x = 0, j = 0; i < 27; i++) {
+ if (extra_spacing_at[j] == i) {
+ j++;
+ uint add = spacing / (lengthof(extra_spacing_at) - j);
+ spacing -= add;
+ x += add;
+ }
+
+ w->widget[i].left = x;
+ x += (spacing != 0) ? button_width : (w->width - x) / (27 - i);
+ w->widget[i].right = x - 1;
+ }
+ } break;
+
+ case WE_TIMEOUT:
+ for (uint i = 2; i < w->widget_count; i++) {
+ if (w->IsWidgetLowered(i)) {
+ w->RaiseWidget(i);
+ w->InvalidateWidget(i);
+ }
+ }
+ break;
+
+ case WE_MESSAGE:
+ if (FindWindowById(WC_MAIN_WINDOW, 0) != NULL) HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 17, 18);
+ break;
+ }
+}
+
+static const Widget _toolb_normal_widgets[] = {
+{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
+{ WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0172_SAVE_GAME_ABANDON_GAME},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0174_DISPLAY_MAP},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_0176_DISPLAY_TOWN_DIRECTORY},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SUBSIDIES, STR_02DC_DISPLAY_SUBSIDIES},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LIST, STR_0173_DISPLAY_LIST_OF_COMPANY},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_FINANCE, STR_0177_DISPLAY_COMPANY_FINANCES},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_GENERAL, STR_0178_DISPLAY_COMPANY_GENERAL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_GRAPHS, STR_0179_DISPLAY_GRAPHS},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_COMPANY_LEAGUE, STR_017A_DISPLAY_COMPANY_LEAGUE},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0312_FUND_CONSTRUCTION_OF_NEW},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRAINLIST, STR_017B_DISPLAY_LIST_OF_COMPANY},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TRUCKLIST, STR_017C_DISPLAY_LIST_OF_COMPANY},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SHIPLIST, STR_017D_DISPLAY_LIST_OF_COMPANY},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_AIRPLANESLIST, STR_017E_DISPLAY_LIST_OF_COMPANY},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDRAIL, STR_0181_BUILD_RAILROAD_TRACK},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0182_BUILD_ROADS},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDWATER, STR_0183_BUILD_SHIP_DOCKS},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDAIR, STR_0184_BUILD_AIRPORTS},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_LANDSCAPING_TOOLBAR_TIP}, // tree icon is 0x2E6
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MESSAGES, STR_0203_SHOW_LAST_MESSAGE_NEWS},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
+{ WIDGETS_END},
+};
+
+static const WindowDesc _toolb_normal_desc = {
+ 0, 0, 0, 22, 640, 22,
+ WC_MAIN_TOOLBAR, WC_NONE,
+ WDF_STD_TOOLTIPS | WDF_DEF_WIDGET,
+ _toolb_normal_widgets,
+ MainToolbarWndProc
+};
+
+
+static ToolbarButtonProc * const _scen_toolbar_button_procs[] = {
+ ToolbarPauseClick,
+ ToolbarFastForwardClick,
+ ToolbarOptionsClick,
+ ToolbarScenSaveOrLoad,
+ ToolbarBtn_NULL,
+ ToolbarBtn_NULL,
+ ToolbarScenDateBackward,
+ ToolbarScenDateForward,
+ ToolbarScenMapTownDir,
+ ToolbarScenZoomIn,
+ ToolbarScenZoomOut,
+ ToolbarScenGenLand,
+ ToolbarScenGenTown,
+ ToolbarScenGenIndustry,
+ ToolbarScenBuildRoad,
+ ToolbarScenPlantTrees,
+ ToolbarScenPlaceSign,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ ToolbarMusicClick,
+ NULL,
+ ToolbarHelpClick,
+};
+
+void ScenEditToolbarWndProc(Window *w, WindowEvent *e)
+{
+ switch (e->event) {
+ case WE_PAINT:
+ w->SetWidgetDisabledState(6, _patches_newgame.starting_year <= MIN_YEAR);
+ w->SetWidgetDisabledState(7, _patches_newgame.starting_year >= MAX_YEAR);
+
+ /* Draw brown-red toolbar bg. */
+ GfxFillRect(0, 0, w->width-1, w->height-1, 0xB2);
+ GfxFillRect(0, 0, w->width-1, w->height-1, 0xB4 | (1 << PALETTE_MODIFIER_GREYOUT));
+
+ DrawWindowWidgets(w);
+
+ SetDParam(0, ConvertYMDToDate(_patches_newgame.starting_year, 0, 1));
+ DrawStringCenteredTruncated(w->widget[6].right, w->widget[7].left, 6, STR_00AF, TC_FROMSTRING);
+
+ /* We hide this panel when the toolbar space gets too small */
+ if (w->widget[4].left != w->widget[4].right) {
+ DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 1, STR_0221_OPENTTD, TC_FROMSTRING);
+ DrawStringCenteredTruncated(w->widget[4].left + 1, w->widget[4].right - 1, 11, STR_0222_SCENARIO_EDITOR, TC_FROMSTRING);
+ }
+
+ break;
+
+ case WE_CLICK:
+ if (_game_mode == GM_MENU) return;
+ _scen_toolbar_button_procs[e->we.click.widget](w);
+ break;
+
+ case WE_KEYPRESS:
+ switch (e->we.keypress.keycode) {
+ case WKC_F1: case WKC_PAUSE: ToolbarPauseClick(w); break;
+ case WKC_F2: ShowGameOptions(); break;
+ case WKC_F3: MenuClickSaveLoad(0); break;
+ case WKC_F4: ToolbarScenGenLand(w); break;
+ case WKC_F5: ToolbarScenGenTown(w); break;
+ case WKC_F6: ToolbarScenGenIndustry(w); break;
+ case WKC_F7: ToolbarScenBuildRoad(w); break;
+ case WKC_F8: ToolbarScenPlantTrees(w); break;
+ case WKC_F9: ToolbarScenPlaceSign(w); break;
+ case WKC_F10: ShowMusicWindow(); break;
+ case WKC_F11: PlaceLandBlockInfo(); break;
+ case WKC_CTRL | 'S': MenuClickSmallScreenshot(); break;
+ case WKC_CTRL | 'G': MenuClickWorldScreenshot(); break;
+
+ /* those following are all fall through */
+ case WKC_NUM_PLUS:
+ case WKC_EQUALS:
+ case WKC_SHIFT | WKC_EQUALS:
+ case WKC_SHIFT | WKC_F5: ToolbarZoomInClick(w); break;
+
+ /* those following are all fall through */
+ case WKC_NUM_MINUS:
+ case WKC_MINUS:
+ case WKC_SHIFT | WKC_MINUS:
+ case WKC_SHIFT | WKC_F6: ToolbarZoomOutClick(w); break;
+
+ case 'L': ShowEditorTerraformToolbar(); break;
+ case 'M': ShowSmallMap(); break;
+ case 'V': ShowExtraViewPortWindow(); break;
+ default: return;
+ }
+ e->we.keypress.cont = false;
+ break;
+
+ case WE_PLACE_OBJ:
+ _place_proc(e->we.place.tile);
+ break;
+
+ case WE_ABORT_PLACE_OBJ:
+ w->RaiseWidget(25);
+ SetWindowDirty(w);
+ break;
+
+ case WE_RESIZE: {
+ /* There are 15 buttons plus some spacings if the space allows it.
+ * Furthermore there are two panels of which one is non-essential
+ * and that one can be removed is the space is too small. */
+ uint buttons_width;
+ uint spacing;
+
+ static int normal_min_width = (15 * 22) + (2 * 130);
+ static int one_less_panel_min_width = (15 * 22) + 130;
+
+ if (w->width >= one_less_panel_min_width) {
+ buttons_width = 15 * 22;
+ spacing = w->width - ((w->width >= normal_min_width) ? normal_min_width : one_less_panel_min_width);
+ } else {
+ buttons_width = w->width - 130;
+ spacing = 0;
+ }
+ uint extra_spacing_at[] = { 3, 4, 7, 8, 10, 16, 0 };
+
+ /* Yes, it defines about 27 widgets for this toolbar */
+ for (uint i = 0, x = 0, j = 0, b = 0; i < 27; i++) {
+ switch (i) {
+ case 4:
+ w->widget[i].left = x;
+ if (w->width < normal_min_width) {
+ w->widget[i].right = x;
+ j++;
+ continue;
+ }
+
+ x += 130;
+ w->widget[i].right = x - 1;
+ break;
+
+ case 5: {
+ int offset = x - w->widget[i].left;
+ w->widget[i + 1].left += offset;
+ w->widget[i + 1].right += offset;
+ w->widget[i + 2].left += offset;
+ w->widget[i + 2].right += offset;
+ w->widget[i].left = x;
+ x += 130;
+ w->widget[i].right = x - 1;
+ i += 2;
+ } break;
+
+ default:
+ if (w->widget[i].bottom == 0) continue;
+
+ w->widget[i].left = x;
+ x += buttons_width / (15 - b);
+ w->widget[i].right = x - 1;
+ buttons_width -= buttons_width / (15 - b);
+ b++;
+ break;
+ }
+
+ if (extra_spacing_at[j] == i) {
+ j++;
+ uint add = spacing / (lengthof(extra_spacing_at) - j);
+ spacing -= add;
+ x += add;
+ }
+ }
+ } break;
+
+ case WE_MOUSELOOP:
+ if (w->IsWidgetLowered(0) != !!_pause_game) {
+ w->ToggleWidgetLoweredState(0);
+ SetWindowDirty(w);
+ }
+
+ if (w->IsWidgetLowered(1) != !!_fast_forward) {
+ w->ToggleWidgetLoweredState(1);
+ SetWindowDirty(w);
+ }
+ break;
+
+ case WE_MESSAGE:
+ HandleZoomMessage(w, FindWindowById(WC_MAIN_WINDOW, 0)->viewport, 9, 10);
+ break;
+ }
+}
+
+static const Widget _toolb_scen_widgets[] = {
+{ WWT_IMGBTN, RESIZE_LEFT, 14, 0, 0, 0, 21, SPR_IMG_PAUSE, STR_0171_PAUSE_GAME},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_FASTFORWARD, STR_FAST_FORWARD},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SETTINGS, STR_0187_OPTIONS},
+{WWT_IMGBTN_2, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SAVE, STR_0297_SAVE_SCENARIO_LOAD_SCENARIO},
+
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 0, 0, 21, 0x0, STR_NULL},
+
+{ WWT_PANEL, RESIZE_NONE, 14, 0, 129, 0, 21, 0x0, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 3, 14, 5, 16, SPR_ARROW_DOWN, STR_029E_MOVE_THE_STARTING_DATE},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 113, 125, 5, 16, SPR_ARROW_UP, STR_029F_MOVE_THE_STARTING_DATE},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SMALLMAP, STR_0175_DISPLAY_MAP_TOWN_DIRECTORY},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMIN, STR_017F_ZOOM_THE_VIEW_IN},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_ZOOMOUT, STR_0180_ZOOM_THE_VIEW_OUT},
+
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_LANDSCAPING, STR_022E_LANDSCAPE_GENERATION},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_TOWN, STR_022F_TOWN_GENERATION},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_INDUSTRY, STR_0230_INDUSTRY_GENERATION},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_BUILDROAD, STR_0231_ROAD_CONSTRUCTION},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_PLANTTREES, STR_0288_PLANT_TREES},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_SIGN, STR_0289_PLACE_SIGN},
+
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_MUSIC, STR_01D4_SHOW_SOUND_MUSIC_WINDOW},
+{ WWT_EMPTY, RESIZE_NONE, 0, 0, 0, 0, 0, 0x0, STR_NULL},
+{ WWT_IMGBTN, RESIZE_NONE, 14, 0, 0, 0, 21, SPR_IMG_QUERY, STR_0186_LAND_BLOCK_INFORMATION},
+{WIDGETS_END},
+};
+
+static const WindowDesc _toolb_scen_desc = {
+ 0, 0, 130, 22, 640, 22,
+ WC_MAIN_TOOLBAR, WC_NONE,
+ WDF_STD_TOOLTIPS | WDF_DEF_WIDGET | WDF_UNCLICK_BUTTONS,
+ _toolb_scen_widgets,
+ ScenEditToolbarWndProc
+};
+
+Window *AllocateToolbar()
+{
+ return AllocateWindowDesc((_game_mode != GM_EDITOR) ? &_toolb_normal_desc : &_toolb_scen_desc);
+}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/toolbar_gui.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/src/toolbar_gui.h Fri Mar 28 10:32:55 2008 +0000
@@ -0,0 +1,13 @@
+/* $Id$ */
+
+/** @file toolbar_gui.h Stuff related to the (main) toolbar. */
+
+#ifndef TOOLBAR_GUI_H
+#define TOOLBAR_GUI_H
+
+#include "window_type.h"
+
+Point GetToolbarDropdownPos(uint16 parent_button, int width, int height);
+Window *AllocateToolbar();
+
+#endif /*TOOLBAR_GUI_H*/
diff -r cc77111ebd85 -r 9707ad4c9b60 src/town.h
--- a/src/town.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/town.h Fri Mar 28 10:32:55 2008 +0000
@@ -90,7 +90,7 @@
TileIndex xy;
/* Current population of people and amount of houses. */
- uint16 num_houses;
+ uint32 num_houses;
uint32 population;
/* Town name */
@@ -320,6 +320,7 @@
void ClearTownHouse(Town *t, TileIndex tile);
void AfterLoadTown();
void UpdateTownMaxPass(Town *t);
+void UpdateTownRadius(Town *t);
bool CheckIfAuthorityAllows(TileIndex tile);
Town *ClosestTownFromTile(TileIndex tile, uint threshold);
void ChangeTownRating(Town *t, int add, int max);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/town_cmd.cpp
--- a/src/town_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/town_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -17,7 +17,7 @@
#include "industry.h"
#include "station.h"
#include "player_base.h"
-#include "news.h"
+#include "news_func.h"
#include "saveload.h"
#include "gui.h"
#include "unmovable_map.h"
@@ -265,8 +265,6 @@
MarkTileDirtyByTile(tile);
}
-static void UpdateTownRadius(Town *t);
-
/**
* Determines if a town is close to a tile
* @param tile TileIndex of the tile to query
@@ -1282,7 +1280,7 @@
return false;
}
-static void UpdateTownRadius(Town *t)
+void UpdateTownRadius(Town *t)
{
static const uint16 _town_radius_data[23][5] = {
{ 4, 0, 0, 0, 0}, // 0
@@ -2074,12 +2072,12 @@
/** Called from GUI */
void ExpandTown(Town *t)
{
- int amount, n;
+ uint amount, n;
_generating_world = true;
/* The more houses, the faster we grow */
- amount = RandomRange(t->num_houses / 10) + 3;
+ amount = RandomRange(ClampToU16(t->num_houses / 10)) + 3;
t->num_houses += amount;
UpdateTownRadius(t);
@@ -2120,7 +2118,7 @@
SetDParam(1, _current_player);
AddNewsItem(STR_2055_TRAFFIC_CHAOS_IN_ROAD_REBUILDING,
- NEWS_FLAGS(NM_NORMAL, NF_TILE, NT_GENERAL, 0), t->xy, 0);
+ NM_NORMAL, NF_TILE, NT_GENERAL, DNC_NONE, t->xy, 0);
}
static bool DoBuildStatueOfCompany(TileIndex tile, TownID town_id)
@@ -2564,10 +2562,10 @@
SLE_CONDVAR(Town, xy, SLE_FILE_U16 | SLE_VAR_U32, 0, 5),
SLE_CONDVAR(Town, xy, SLE_UINT32, 6, SL_MAX_VERSION),
- SLE_CONDNULL(2, 0, 2),
- SLE_CONDNULL(4, 3, 84),
-
- SLE_VAR(Town, num_houses, SLE_UINT16),
+ SLE_CONDNULL(2, 0, 2), ///< population, no longer in use
+ SLE_CONDNULL(4, 3, 84), ///< population, no longer in use
+ SLE_CONDNULL(2, 0, 91), ///< num_houses, no longer in use
+
SLE_CONDVAR(Town, townnamegrfid, SLE_UINT32, 66, SL_MAX_VERSION),
SLE_VAR(Town, townnametype, SLE_UINT16),
SLE_VAR(Town, townnameparts, SLE_UINT32),
@@ -2576,13 +2574,12 @@
SLE_VAR(Town, flags12, SLE_UINT8),
SLE_VAR(Town, statues, SLE_UINT8),
- /* sort_index_obsolete was stored here in savegame format 0 - 1 */
- SLE_CONDNULL(1, 0, 1),
+ SLE_CONDNULL(1, 0, 1), ///< sort_index, no longer in use
SLE_VAR(Town, have_ratings, SLE_UINT8),
SLE_ARR(Town, ratings, SLE_INT16, 8),
/* failed bribe attempts are stored since savegame format 4 */
- SLE_CONDARR(Town, unwanted, SLE_INT8, 8, 4,SL_MAX_VERSION),
+ SLE_CONDARR(Town, unwanted, SLE_INT8, 8, 4, SL_MAX_VERSION),
SLE_CONDVAR(Town, max_pass, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
SLE_CONDVAR(Town, max_mail, SLE_FILE_U16 | SLE_VAR_U32, 0, 8),
@@ -2695,10 +2692,6 @@
void AfterLoadTown()
{
- Town *t;
- FOR_ALL_TOWNS(t) {
- UpdateTownRadius(t);
- }
_town_sort_dirty = true;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/town_gui.cpp
--- a/src/town_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/town_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -18,6 +18,7 @@
#include "network/network.h"
#include "variables.h"
#include "strings_func.h"
+#include "sound_func.h"
#include "economy_func.h"
#include "core/alloc_func.hpp"
#include "settings_type.h"
@@ -25,6 +26,9 @@
#include "table/sprites.h"
#include "table/strings.h"
+extern bool GenerateTowns();
+static int _scengen_town_size = 1; // depress medium-sized towns per default
+
enum TownAuthorityWidget {
TWA_CLOSEBOX = 0,
TWA_CAPTION,
@@ -275,6 +279,10 @@
Town *t = GetTown(w->window_number);
switch (e->event) {
+ case WE_CREATE:
+ if (t->larger_town) w->widget[1].data = STR_CITY;
+ break;
+
case WE_PAINT:
/* disable renaming town in network games if you are not the server */
w->SetWidgetDisabledState(8, _networking && !_network_server);
@@ -567,3 +575,117 @@
w->resize.height = w->height - 10 * 6; // minimum of 10 items in the list, each item 10 high
}
}
+
+void CcBuildTown(bool success, TileIndex tile, uint32 p1, uint32 p2)
+{
+ if (success) {
+ SndPlayTileFx(SND_1F_SPLAT, tile);
+ ResetObjectToPlace();
+ }
+}
+
+static void PlaceProc_Town(TileIndex tile)
+{
+ uint32 size = min(_scengen_town_size, (int)TSM_CITY);
+ uint32 mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
+ DoCommandP(tile, size, mode, CcBuildTown, CMD_BUILD_TOWN | CMD_MSG(STR_0236_CAN_T_BUILD_TOWN_HERE));
+}
+
+static const Widget _scen_edit_town_gen_widgets[] = {
+{ WWT_CLOSEBOX, RESIZE_NONE, 7, 0, 10, 0, 13, STR_00C5, STR_018B_CLOSE_WINDOW},
+{ WWT_CAPTION, RESIZE_NONE, 7, 11, 147, 0, 13, STR_0233_TOWN_GENERATION, STR_018C_WINDOW_TITLE_DRAG_THIS},
+{ WWT_STICKYBOX, RESIZE_NONE, 7, 148, 159, 0, 13, 0x0, STR_STICKY_BUTTON},
+{ WWT_PANEL, RESIZE_NONE, 7, 0, 159, 14, 94, 0x0, STR_NULL},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 16, 27, STR_0234_NEW_TOWN, STR_0235_CONSTRUCT_NEW_TOWN},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 29, 40, STR_023D_RANDOM_TOWN, STR_023E_BUILD_TOWN_IN_RANDOM_LOCATION},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 42, 53, STR_MANY_RANDOM_TOWNS, STR_RANDOM_TOWNS_TIP},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 53, 68, 79, STR_02A1_SMALL, STR_02A4_SELECT_TOWN_SIZE},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 54, 105, 68, 79, STR_02A2_MEDIUM, STR_02A4_SELECT_TOWN_SIZE},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 106, 157, 68, 79, STR_02A3_LARGE, STR_02A4_SELECT_TOWN_SIZE},
+{ WWT_TEXTBTN, RESIZE_NONE, 14, 2, 157, 81, 92, STR_SCENARIO_EDITOR_CITY, STR_02A4_SELECT_TOWN_SIZE},
+{ WWT_LABEL, RESIZE_NONE, 7, 0, 147, 54, 67, STR_02A5_TOWN_SIZE, STR_NULL},
+{ WIDGETS_END},
+};
+
+static void ScenEditTownGenWndProc(Window *w, WindowEvent *e)
+{
+ switch (e->event) {
+ case WE_PAINT:
+ DrawWindowWidgets(w);
+ break;
+
+ case WE_CREATE:
+ w->LowerWidget(_scengen_town_size + 7);
+ break;
+
+ case WE_CLICK:
+ switch (e->we.click.widget) {
+ case 4: // new town
+ HandlePlacePushButton(w, 4, SPR_CURSOR_TOWN, VHM_RECT, PlaceProc_Town);
+ break;
+ case 5: {// random town
+ Town *t;
+ uint size = min(_scengen_town_size, (int)TSM_CITY);
+ TownSizeMode mode = _scengen_town_size > TSM_CITY ? TSM_CITY : TSM_FIXED;
+
+ w->HandleButtonClick(5);
+ _generating_world = true;
+ t = CreateRandomTown(20, mode, size);
+ _generating_world = false;
+
+ if (t == NULL) {
+ ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
+ } else {
+ ScrollMainWindowToTile(t->xy);
+ }
+
+ break;
+ }
+ case 6: {// many random towns
+ w->HandleButtonClick(6);
+
+ _generating_world = true;
+ if (!GenerateTowns()) ShowErrorMessage(STR_NO_SPACE_FOR_TOWN, STR_CANNOT_GENERATE_TOWN, 0, 0);
+ _generating_world = false;
+ break;
+ }
+
+ case 7: case 8: case 9: case 10:
+ w->RaiseWidget(_scengen_town_size + 7);
+ _scengen_town_size = e->we.click.widget - 7;
+ w->LowerWidget(_scengen_town_size + 7);
+ SetWindowDirty(w);
+ break;
+ }
+ break;
+
+ case WE_TIMEOUT:
+ w->RaiseWidget(5);
+ w->RaiseWidget(6);
+ SetWindowDirty(w);
+ break;
+ case WE_PLACE_OBJ:
+ _place_proc(e->we.place.tile);
+ break;
+ case WE_ABORT_PLACE_OBJ:
+ w->RaiseButtons();
+ w->LowerWidget(_scengen_town_size + 7);
+ SetWindowDirty(w);
+ break;
+ }
+}
+
+static const WindowDesc _scen_edit_town_gen_desc = {
+ WDP_AUTO, WDP_AUTO, 160, 95, 160, 95,
+ WC_SCEN_TOWN_GEN, WC_NONE,
+ WDF_STD_TOOLTIPS | WDF_STD_BTN | WDF_DEF_WIDGET | WDF_STICKY_BUTTON,
+ _scen_edit_town_gen_widgets,
+ ScenEditTownGenWndProc,
+};
+
+void ShowBuildTownWindow()
+{
+ if (_game_mode != GM_EDITOR && !IsValidPlayer(_current_player)) return;
+ AllocateWindowDescFront(&_scen_edit_town_gen_desc, 0);
+}
+
diff -r cc77111ebd85 -r 9707ad4c9b60 src/town_map.h
--- a/src/town_map.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/town_map.h Fri Mar 28 10:32:55 2008 +0000
@@ -145,7 +145,7 @@
static inline byte GetHouseAnimationFrame(TileIndex t)
{
assert(IsTileType(t, MP_HOUSE));
- return GB(_m[t].m6, 3, 5);
+ return GB(_m[t].m6, 2, 6) | (GB(_m[t].m3, 5, 1) << 6);
}
/**
@@ -157,7 +157,8 @@
static inline void SetHouseAnimationFrame(TileIndex t, byte frame)
{
assert(IsTileType(t, MP_HOUSE));
- SB(_m[t].m6, 3, 5, frame);
+ SB(_m[t].m6, 2, 6, GB(frame, 0, 6));
+ SB(_m[t].m3, 5, 1, GB(frame, 6, 1));
}
/**
diff -r cc77111ebd85 -r 9707ad4c9b60 src/track_func.h
--- a/src/track_func.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/track_func.h Fri Mar 28 10:32:55 2008 +0000
@@ -574,4 +574,20 @@
return (dir & 0x06) == 0;
}
+/**
+ * Checks whether a trackdir on a specific slope is going uphill.
+ *
+ * Valid for rail and road tracks.
+ * Valid for tile-slopes (under foundation) and foundation-slopes (on foundation).
+ *
+ * @param slope The slope of the tile.
+ * @param dir The trackdir of interest.
+ * @return true iff the track goes upwards.
+ */
+static inline bool IsUphillTrackdir(Slope slope, Trackdir dir)
+{
+ extern const TrackdirBits _uphill_trackdirs[];
+ return HasBit(_uphill_trackdirs[RemoveHalftileSlope(slope)], dir);
+}
+
#endif /* TRACK_FUNC_H */
diff -r cc77111ebd85 -r 9707ad4c9b60 src/train.h
--- a/src/train.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/train.h Fri Mar 28 10:32:55 2008 +0000
@@ -274,6 +274,7 @@
int CheckTrainInDepot(const Vehicle *v, bool needs_to_be_stopped);
int CheckTrainStoppedInDepot(const Vehicle *v);
+void UpdateTrainAcceleration(Vehicle* v);
/**
* This class 'wraps' Vehicle; you do not actually instantiate this class.
diff -r cc77111ebd85 -r 9707ad4c9b60 src/train_cmd.cpp
--- a/src/train_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/train_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -17,7 +17,7 @@
#include "pathfind.h"
#include "npf.h"
#include "station.h"
-#include "news.h"
+#include "news_func.h"
#include "engine.h"
#include "player_func.h"
#include "player_base.h"
@@ -53,7 +53,7 @@
#include "table/train_cmd.h"
static bool TrainCheckIfLineEnds(Vehicle *v);
-static void TrainController(Vehicle *v, bool update_image);
+static void TrainController(Vehicle *v, Vehicle *nomove, bool update_image);
static TileIndex TrainApproachingCrossingTile(const Vehicle *v);
static const byte _vehicle_initial_x_fract[4] = {10, 8, 4, 8};
@@ -215,6 +215,9 @@
/* Reset color map */
u->colormap = PAL_NONE;
+ /* Set user defined data (must be done before other properties) */
+ u->u.rail.user_def_data = GetVehicleProperty(u, 0x25, rvi_u->user_def_data);
+
if (rvi_u->visual_effect != 0) {
u->u.rail.cached_vis_effect = rvi_u->visual_effect;
} else {
@@ -271,8 +274,6 @@
u->cargo_cap = GetVehicleProperty(u, 0x14, rvi_u->capacity);
}
- u->u.rail.user_def_data = GetVehicleProperty(u, 0x25, rvi_u->user_def_data);
-
/* check the vehicle length (callback) */
uint16 veh_len = CALLBACK_FAILED;
if (HasBit(EngInfo(u->engine_type)->callbackmask, CBM_VEHICLE_LENGTH)) {
@@ -290,6 +291,11 @@
/* recalculate cached weights and power too (we do this *after* the rest, so it is known which wagons are powered and need extra weight added) */
TrainCargoChanged(v);
+
+ if (IsFrontEngine(v)) {
+ UpdateTrainAcceleration(v);
+ InvalidateWindow(WC_VEHICLE_DETAILS, v->index);
+ }
}
enum AccelType {
@@ -468,7 +474,7 @@
}
}
-static void UpdateTrainAcceleration(Vehicle* v)
+void UpdateTrainAcceleration(Vehicle* v)
{
assert(IsFrontEngine(v));
@@ -790,7 +796,6 @@
}
TrainConsistChanged(v);
- UpdateTrainAcceleration(v);
UpdateTrainGroupID(v);
if (!HasBit(p2, 1)) { // check if the cars should be added to the new vehicle
@@ -1215,7 +1220,7 @@
{
Vehicle *v;
- for (v = src; GetNextVehicle(v) != NULL; v = GetNextVehicle(v));
+ for (v = src; GetNextVehicle(v) != NULL; v = GetNextVehicle(v)) {}
GetLastEnginePart(v)->SetNext(dst->Next());
}
dst->SetNext(src);
@@ -1245,8 +1250,6 @@
TrainConsistChanged(src_head);
UpdateTrainGroupID(src_head);
if (IsFrontEngine(src_head)) {
- UpdateTrainAcceleration(src_head);
- InvalidateWindow(WC_VEHICLE_DETAILS, src_head->index);
/* Update the refit button and window */
InvalidateWindow(WC_VEHICLE_REFIT, src_head->index);
InvalidateWindowWidget(WC_VEHICLE_VIEW, src_head->index, VVW_WIDGET_REFIT_VEH);
@@ -1260,8 +1263,6 @@
TrainConsistChanged(dst_head);
UpdateTrainGroupID(dst_head);
if (IsFrontEngine(dst_head)) {
- UpdateTrainAcceleration(dst_head);
- InvalidateWindow(WC_VEHICLE_DETAILS, dst_head->index);
/* Update the refit button and window */
InvalidateWindowWidget(WC_VEHICLE_VIEW, dst_head->index, VVW_WIDGET_REFIT_VEH);
InvalidateWindow(WC_VEHICLE_REFIT, dst_head->index);
@@ -1434,11 +1435,7 @@
NormaliseTrainConsist(first);
TrainConsistChanged(first);
UpdateTrainGroupID(first);
- if (IsFrontEngine(first)) {
- InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
- InvalidateWindow(WC_VEHICLE_REFIT, first->index);
- UpdateTrainAcceleration(first);
- }
+ if (IsFrontEngine(first)) InvalidateWindow(WC_VEHICLE_REFIT, first->index);
}
@@ -1504,8 +1501,6 @@
NormaliseTrainConsist(first);
TrainConsistChanged(first);
UpdateTrainGroupID(first);
- if (IsFrontEngine(first)) UpdateTrainAcceleration(first);
- InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
InvalidateWindow(WC_VEHICLE_REFIT, first->index);
}
} break;
@@ -1722,39 +1717,86 @@
/**
* Advances wagons for train reversing, needed for variable length wagons.
- * Needs to be called once before the train is reversed, and once after it.
+ * This one is called before the train is reversed.
* @param v First vehicle in chain
- * @param before Set to true for the call before reversing, false otherwise
*/
-static void AdvanceWagons(Vehicle *v, bool before)
+static void AdvanceWagonsBeforeSwap(Vehicle *v)
{
Vehicle *base = v;
- Vehicle *first = base->Next();
+ Vehicle *first = base; // first vehicle to move
+ Vehicle *last = GetLastVehicleInChain(v); // last vehicle to move
uint length = CountVehiclesInChain(v);
while (length > 2) {
- /* find pairwise matching wagon
- * start<>end, start+1<>end-1, ... */
- Vehicle *last = first;
- for (uint i = length - 3; i > 0; i--) last = last->Next();
+ last = last->Previous();
+ first = first->Next();
+
+ int differential = base->u.rail.cached_veh_length - last->u.rail.cached_veh_length;
+
+ /* do not update images now
+ * negative differential will be handled in AdvanceWagonsAfterSwap() */
+ for (int i = 0; i < differential; i++) TrainController(first, last->Next(), false);
+
+ base = first; // == base->Next()
+ length -= 2;
+ }
+}
+
+
+/**
+ * Advances wagons for train reversing, needed for variable length wagons.
+ * This one is called after the train is reversed.
+ * @param v First vehicle in chain
+ */
+static void AdvanceWagonsAfterSwap(Vehicle *v)
+{
+ /* first of all, fix the situation when the train was entering a depot */
+ Vehicle *dep = v; // last vehicle in front of just left depot
+ while (dep->Next() != NULL && (dep->u.rail.track == TRACK_BIT_DEPOT || dep->Next()->u.rail.track != TRACK_BIT_DEPOT)) {
+ dep = dep->Next(); // find first vehicle outside of a depot, with next vehicle inside a depot
+ }
+
+ Vehicle *leave = dep->Next(); // first vehicle in a depot we are leaving now
+
+ if (leave != NULL) {
+ /* 'pull' next wagon out of the depot, so we won't miss it (it could stay in depot forever) */
+ int d = TicksToLeaveDepot(dep);
+
+ if (d <= 0) {
+ leave->vehstatus &= ~VS_HIDDEN; // move it out of the depot
+ leave->u.rail.track = AxisToTrackBits(DiagDirToAxis(GetRailDepotDirection(leave->tile)));
+ for (int i = 0; i >= d; i--) TrainController(leave, NULL, false); // maybe move it, and maybe let another wagon leave
+ }
+ } else {
+ dep = NULL; // no vehicle in a depot, so no vehicle leaving a depot
+ }
+
+ Vehicle *base = v;
+ Vehicle *first = base; // first vehicle to move
+ Vehicle *last = GetLastVehicleInChain(v); // last vehicle to move
+ uint length = CountVehiclesInChain(v);
+
+ /* we have to make sure all wagons that leave a depot because of train reversing are moved coorectly
+ * they have already correct spacing, so we have to make sure they are moved how they should */
+ bool nomove = (dep == NULL); // if there is no vehicle leaving a depot, limit the number of wagons moved immediatelly
+
+ while (length > 2) {
+ /* we reached vehicle (originally) in front of a depot, stop now
+ * (we would move wagons that are alredy moved with new wagon length) */
+ if (base == dep) break;
+
+ /* the last wagon was that one leaving a depot, so do not move it anymore */
+ if (last == dep) nomove = true;
+
+ last = last->Previous();
+ first = first->Next();
int differential = last->u.rail.cached_veh_length - base->u.rail.cached_veh_length;
- if (before) differential *= -1;
-
- if (differential > 0) {
- /* disconnect last car to make sure only this subset moves */
- Vehicle *tempnext = last->Next();
- last->SetNext(NULL);
-
- /* do not update images now because the wagons are disconnected
- * and that could cause problems with NewGRFs */
- for (int i = 0; i < differential; i++) TrainController(first, false);
-
- last->SetNext(tempnext);
- }
-
- base = first;
- first = first->Next();
+
+ /* do not update images now */
+ for (int i = 0; i < differential; i++) TrainController(first, (nomove ? last->Next() : NULL), false);
+
+ base = first; // == base->Next()
length -= 2;
}
}
@@ -1773,7 +1815,7 @@
int r = 0; ///< number of vehicles - 1
for (const Vehicle *u = v; (u = u->Next()) != NULL;) { r++; }
- AdvanceWagons(v, true);
+ AdvanceWagonsBeforeSwap(v);
/* swap start<>end, start+1<>end-1, ... */
int l = 0;
@@ -1781,17 +1823,23 @@
ReverseTrainSwapVeh(v, l++, r--);
} while (l <= r);
- AdvanceWagons(v, false);
+ AdvanceWagonsAfterSwap(v);
if (IsTileDepotType(v->tile, TRANSPORT_RAIL)) {
InvalidateWindowData(WC_VEHICLE_DEPOT, v->tile);
}
- /* update all images */
- for (Vehicle *u = v; u != NULL; u = u->Next()) { u->cur_image = u->GetImage(u->direction); }
+ /* set reversed flag on all parts */
+ for (Vehicle *u = v; u != NULL; u = u->Next()) ToggleBit(u->u.rail.flags, VRF_TOGGLE_REVERSE);
ClrBit(v->u.rail.flags, VRF_REVERSING);
+ /* recalculate cached data */
+ TrainConsistChanged(v);
+
+ /* update all images */
+ for (Vehicle *u = v; u != NULL; u = u->Next()) u->cur_image = u->GetImage(u->direction);
+
/* update crossing we were approaching */
if (crossing != INVALID_TILE) UpdateLevelCrossing(crossing);
@@ -2448,7 +2496,7 @@
SetDParam(0, v->unitnumber);
AddNewsItem(
STR_TRAIN_IS_LOST,
- NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),
+ NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE,
v->index,
0);
}
@@ -2718,12 +2766,9 @@
if (!(st->had_vehicle_of_type & HVOT_TRAIN)) {
st->had_vehicle_of_type |= HVOT_TRAIN;
SetDParam(0, st->index);
- uint32 flags = v->owner == _local_player ?
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ARRIVAL_PLAYER, 0) :
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ARRIVAL_OTHER, 0);
AddNewsItem(
STR_8801_CITIZENS_CELEBRATE_FIRST,
- flags,
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, v->owner == _local_player ? NT_ARRIVAL_PLAYER : NT_ARRIVAL_OTHER, DNC_NONE,
v->index,
0
);
@@ -2973,7 +3018,7 @@
AI_Event(v->owner, new AIEventVehicleCrash(v->index, v->tile));
SetDParam(0, tcc.num);
AddNewsItem(STR_8868_TRAIN_CRASH_DIE_IN_FIREBALL,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
v->index,
0
);
@@ -2994,12 +3039,12 @@
return NULL;
}
-static void TrainController(Vehicle *v, bool update_image)
+static void TrainController(Vehicle *v, Vehicle *nomove, bool update_image)
{
Vehicle *prev;
/* For every vehicle after and including the given vehicle */
- for (prev = v->Previous(); v != NULL; prev = v, v = v->Next()) {
+ for (prev = v->Previous(); v != nomove; prev = v, v = v->Next()) {
DiagDirection enterdir = DIAGDIR_BEGIN;
bool update_signals_crossing = false; // will we update signals or crossing state?
BeginVehicleMove(v);
@@ -3223,7 +3268,6 @@
} else {
/* Recalculate cached train properties */
TrainConsistChanged(first);
- InvalidateWindow(WC_VEHICLE_DETAILS, first->index);
/* Update the depot window if the first vehicle is in depot -
* if v == first, then it is updated in PreDestructor() */
if (first->u.rail.track == TRACK_BIT_DEPOT) {
@@ -3556,7 +3600,7 @@
TrainCheckIfLineEnds(v);
do {
- TrainController(v, true);
+ TrainController(v, NULL, true);
CheckTrainCollision(v);
if (v->cur_speed <= 0x100)
break;
@@ -3694,7 +3738,7 @@
SetDParam(0, v->unitnumber);
AddNewsItem(
STR_TRAIN_IS_UNPROFITABLE,
- NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0),
+ NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE,
v->index,
0);
}
@@ -3741,7 +3785,7 @@
}
Vehicle *w;
- for (w = u->Next(); w != NULL && (w->engine_type != u->engine_type || w->u.rail.other_multiheaded_part != NULL); w = GetNextVehicle(w));
+ for (w = u->Next(); w != NULL && (w->engine_type != u->engine_type || w->u.rail.other_multiheaded_part != NULL); w = GetNextVehicle(w)) {}
if (w != NULL) {
/* we found a car to partner with this engine. Now we will make sure it face the right way */
if (IsTrainEngine(w)) {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/transparency.h
--- a/src/transparency.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/transparency.h Fri Mar 28 10:32:55 2008 +0000
@@ -66,7 +66,7 @@
/* if none of the non-locked options are set */
if ((_transparency_opt & ~_transparency_lock) == 0) {
/* set all non-locked options */
- _transparency_opt |= ~_transparency_lock;
+ _transparency_opt |= GB(~_transparency_lock, 0, TO_END);
} else {
/* clear all non-locked options */
_transparency_opt &= _transparency_lock;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/transparency_gui.cpp
--- a/src/transparency_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/transparency_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -23,7 +23,7 @@
TTW_WIDGET_BRIDGES, ///< Make bridges transparent
TTW_WIDGET_STRUCTURES, ///< Make unmovable structures transparent
TTW_WIDGET_CATENARY, ///< Make catenary transparent
- TTW_WIDGET_LOADING, ///< Make loading indicators transperent
+ TTW_WIDGET_LOADING, ///< Make loading indicators transparent
TTW_WIDGET_END, ///< End of toggle buttons
};
@@ -66,7 +66,7 @@
{WWT_STICKYBOX, RESIZE_NONE, 7, 207, 218, 0, 13, STR_NULL, STR_STICKY_BUTTON},
/* transparency widgets:
- * transparent signs, trees, houses, industries, player's buildings, bridges, unmovable structures and loading indicators */
+ * transparent signs, trees, houses, industries, player's buildings, bridges, unmovable structures, catenary and loading indicators */
{ WWT_IMGBTN, RESIZE_NONE, 7, 0, 21, 14, 35, SPR_IMG_SIGN, STR_TRANSPARENT_SIGNS_DESC},
{ WWT_IMGBTN, RESIZE_NONE, 7, 22, 43, 14, 35, SPR_IMG_PLANTTREES, STR_TRANSPARENT_TREES_DESC},
{ WWT_IMGBTN, RESIZE_NONE, 7, 44, 65, 14, 35, SPR_IMG_TOWN, STR_TRANSPARENT_HOUSES_DESC},
diff -r cc77111ebd85 -r 9707ad4c9b60 src/tunnelbridge_cmd.cpp
--- a/src/tunnelbridge_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/tunnelbridge_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -859,7 +859,7 @@
StartSpriteCombine();
AddSortableSpriteToDraw(SPR_TRAMWAY_TUNNEL_WIRES + tunnelbridge_direction, PAL_NONE, ti->x, ti->y, BB_data[10], BB_data[11], TILE_HEIGHT, ti->z, IsTransparencySet(TO_CATENARY), BB_data[8], BB_data[9], BB_Z_SEPARATOR);
}
- } else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
+ } else if (HasCatenary(GetRailType(ti->tile))) {
DrawCatenary(ti);
catenary = true;
@@ -935,7 +935,7 @@
DrawBridgeTramBits(ti->x, ti->y, z, offset, HasBit(rts, ROADTYPE_ROAD));
}
EndSpriteCombine();
- } else if (GetRailType(ti->tile) == RAILTYPE_ELECTRIC) {
+ } else if (HasCatenary(GetRailType(ti->tile))) {
DrawCatenary(ti);
}
@@ -1061,7 +1061,7 @@
EndSpriteCombine();
StartSpriteCombine();
}
- } else if (GetRailType(rampsouth) == RAILTYPE_ELECTRIC) {
+ } else if (HasCatenary(GetRailType(rampsouth))) {
DrawCatenary(ti);
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/vehicle.cpp
--- a/src/vehicle.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/vehicle.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
#include "timetable.h"
#include "viewport_func.h"
#include "gfx_func.h"
-#include "news.h"
+#include "news_func.h"
#include "command_func.h"
#include "saveload.h"
#include "player_func.h"
@@ -1544,7 +1544,7 @@
SetDParam(0, _vehicle_type_names[v->type]);
SetDParam(1, v->unitnumber);
- AddNewsItem(msg, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+ AddNewsItem(msg, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
}
void AgeVehicle(Vehicle *v)
@@ -1687,24 +1687,28 @@
}
/** Autoreplace all vehicles in the depot
+ * Note: this command can make incorrect cost estimations
+ * Luckily the final price can only drop, not increase. This is due to the fact that
+ * estimation can't predict wagon removal so it presumes worst case which is no income from selling wagons.
* @param tile Tile of the depot where the vehicles are
* @param flags type of operation
* @param p1 Type of vehicle
- * @param p2 Unused
+ * @param p2 If bit 0 is set, then either replace all or nothing (instead of replacing until money runs out)
*/
CommandCost CmdDepotMassAutoReplace(TileIndex tile, uint32 flags, uint32 p1, uint32 p2)
{
Vehicle **vl = NULL;
uint16 engine_list_length = 0;
uint16 engine_count = 0;
- uint i, x = 0, y = 0, z = 0;
- CommandCost cost;
+ uint i;
+ CommandCost cost = CommandCost(EXPENSES_NEW_VEHICLES);
VehicleType vehicle_type = (VehicleType)GB(p1, 0, 8);
+ bool all_or_nothing = HasBit(p2, 0);
if (!IsDepotTile(tile) || !IsTileOwner(tile, _current_player)) return CMD_ERROR;
/* Get the list of vehicles in the depot */
- BuildDepotVehicleList(vehicle_type, tile, &vl, &engine_list_length, &engine_count, NULL, NULL, NULL);
+ BuildDepotVehicleList(vehicle_type, tile, &vl, &engine_list_length, &engine_count, &vl, &engine_list_length, &engine_count);
for (i = 0; i < engine_count; i++) {
@@ -1715,10 +1719,6 @@
/* Ensure that the vehicle completely in the depot */
if (!v->IsInDepot()) continue;
- x = v->x_pos;
- y = v->y_pos;
- z = v->z_pos;
-
if (stopped) {
v->vehstatus |= VS_STOPPED; // Stop the vehicle
v->leave_depot_instantly = true;
@@ -1727,24 +1727,25 @@
if (CmdSucceeded(ret)) {
cost.AddCost(ret);
- if (!(flags & DC_EXEC)) break;
- /* There is a problem with autoreplace and newgrf
- * It's impossible to tell the length of a train after it's being replaced before it's actually done
- * Because of this, we can't estimate costs due to wagon removal and we will have to always return 0 and pay manually
- * Since we pay after each vehicle is replaced and MaybeReplaceVehicle() check if the player got enough money
- * we should never reach a condition where the player will end up with negative money from doing this */
- SubtractMoneyFromPlayer(ret);
+ } else {
+ if (all_or_nothing) {
+ /* We failed to replace a vehicle even though we set all or nothing.
+ * We should never reach this if DC_EXEC is set since then it should
+ * have failed the estimation guess. */
+ assert(!(flags & DC_EXEC));
+ /* Now we will have to return an error.
+ * This goto will leave the loop and it's ok to do so because
+ * there is no point in the rest of the loop. */
+ goto error;
+ }
}
}
if (cost.GetCost() == 0) {
+error:
+ /* Either we didn't replace anything or something went wrong.
+ * Either way we want to return an error and not execute this command. */
cost = CMD_ERROR;
- } else {
- if (flags & DC_EXEC) {
- /* Display the cost animation now that DoCommandP() can't do it for us (see previous comments) */
- if (IsLocalPlayer()) ShowCostOrIncomeAnimation(x, y, z, cost.GetCost());
- }
- cost = CommandCost();
}
free(vl);
@@ -2199,6 +2200,9 @@
if (!IsFrontEngine(v)) v = v->First();
UpdateSignalsOnSegment(v->tile, INVALID_DIAGDIR, v->owner);
v->load_unload_time_rem = 0;
+ /* Reset reversed flag */
+ for (Vehicle *u = v; u != NULL; u = u->Next()) ClrBit(u->u.rail.flags, VRF_TOGGLE_REVERSE);
+ TrainConsistChanged(v);
break;
case VEH_ROAD:
@@ -2254,7 +2258,7 @@
/* Notify the user that we stopped the vehicle */
SetDParam(0, _vehicle_type_names[v->type]);
SetDParam(1, v->unitnumber);
- AddNewsItem(STR_ORDER_REFIT_FAILED, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+ AddNewsItem(STR_ORDER_REFIT_FAILED, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
}
} else if (v->owner == _local_player && cost.GetCost() != 0) {
ShowCostOrIncomeAnimation(v->x_pos, v->y_pos, v->z_pos, cost.GetCost());
@@ -2280,7 +2284,7 @@
}
SetDParam(0, v->unitnumber);
- AddNewsItem(string, NEWS_FLAGS(NM_SMALL, NF_VIEWPORT|NF_VEHICLE, NT_ADVICE, 0), v->index, 0);
+ AddNewsItem(string, NM_SMALL, NF_VIEWPORT | NF_VEHICLE, NT_ADVICE, DNC_NONE, v->index, 0);
}
}
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/vehicle_base.h
--- a/src/vehicle_base.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/vehicle_base.h Fri Mar 28 10:32:55 2008 +0000
@@ -118,7 +118,7 @@
const struct SpriteGroup *cached_override;
};
-enum {
+enum VehicleRailFlags {
VRF_REVERSING = 0,
/* used to calculate if train is going up or down */
@@ -136,6 +136,9 @@
/* used to mark that electric train engine is allowed to run on normal rail */
VRF_EL_ENGINE_ALLOWED_NORMAL_RAIL = 6,
+
+ /* used for vehicle var 0xFE bit 8 (toggled each time the train is reversed) */
+ VRF_TOGGLE_REVERSE = 7,
};
struct VehicleAir {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/vehicle_gui.cpp
--- a/src/vehicle_gui.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/vehicle_gui.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -145,10 +145,17 @@
vl->l.flags |= VL_RESORT;
}
+/* cached values for VehicleNameSorter to spare many GetString() calls */
+static const Vehicle *_last_vehicle[2] = { NULL, NULL };
+static char _last_name[2][64] = { "", "" };
+
void SortVehicleList(vehiclelist_d *vl)
{
if (!(vl->l.flags & VL_RESORT)) return;
+ /* invalidate cached values for name sorter - vehicle names could change */
+ _last_vehicle[0] = _last_vehicle[1] = NULL;
+
_internal_sort_order = (vl->l.flags & VL_DESC) != 0;
qsort((void*)vl->sort_list, vl->l.list_length, sizeof(vl->sort_list[0]),
_vehicle_sorter[vl->l.sort_type]);
@@ -546,26 +553,23 @@
static int CDECL VehicleNameSorter(const void *a, const void *b)
{
- static const Vehicle *last_vehicle[2] = { NULL, NULL };
- static char last_name[2][64] = { "", "" };
-
const Vehicle* va = *(const Vehicle**)a;
const Vehicle* vb = *(const Vehicle**)b;
int r;
- if (va != last_vehicle[0]) {
- last_vehicle[0] = va;
+ if (va != _last_vehicle[0]) {
+ _last_vehicle[0] = va;
SetDParam(0, va->index);
- GetString(last_name[0], STR_VEHICLE_NAME, lastof(last_name[0]));
+ GetString(_last_name[0], STR_VEHICLE_NAME, lastof(_last_name[0]));
}
- if (vb != last_vehicle[1]) {
- last_vehicle[1] = vb;
- SetDParam(1, vb->index);
- GetString(last_name[1], STR_VEHICLE_NAME, lastof(last_name[1]));
+ if (vb != _last_vehicle[1]) {
+ _last_vehicle[1] = vb;
+ SetDParam(0, vb->index);
+ GetString(_last_name[1], STR_VEHICLE_NAME, lastof(_last_name[1]));
}
- r = strcmp(last_name[0], last_name[1]); // sort by name
+ r = strcmp(_last_name[0], _last_name[1]); // sort by name
VEHICLEUNITNUMBERSORTER(r, va, vb);
@@ -2075,7 +2079,11 @@
ShowVehicleRefitWindow(v, INVALID_VEH_ORDER_ID);
break;
case VVW_WIDGET_SHOW_ORDERS: /* show orders */
- ShowOrdersWindow(v);
+ if (_ctrl_pressed) {
+ ShowTimetableWindow(v);
+ } else {
+ ShowOrdersWindow(v);
+ }
break;
case VVW_WIDGET_SHOW_DETAILS: /* show details */
ShowVehicleDetailsWindow(v);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/viewport.cpp
--- a/src/viewport.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/viewport.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -941,10 +941,8 @@
static void DrawTileSelection(const TileInfo *ti)
{
/* Draw a red error square? */
- if (_thd.redsq != 0 && _thd.redsq == ti->tile) {
- DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
- return;
- }
+ bool is_redsq = _thd.redsq != 0 && _thd.redsq == ti->tile;
+ if (is_redsq) DrawTileSelectionRect(ti, PALETTE_TILE_RED_PULSATING);
/* no selection active? */
if (_thd.drawstyle == 0) return;
@@ -953,7 +951,7 @@
if (IsInsideBS(ti->x, _thd.pos.x, _thd.size.x) &&
IsInsideBS(ti->y, _thd.pos.y, _thd.size.y)) {
if (_thd.drawstyle & HT_RECT) {
- DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
+ if (!is_redsq) DrawTileSelectionRect(ti, _thd.make_square_red ? PALETTE_SEL_TILE_RED : PAL_NONE);
} else if (_thd.drawstyle & HT_POINT) {
/* Figure out the Z coordinate for the single dot. */
byte z = 0;
@@ -994,7 +992,7 @@
}
/* Check if it's inside the outer area? */
- if (_thd.outersize.x &&
+ if (!is_redsq && _thd.outersize.x &&
_thd.size.x < _thd.size.x + _thd.outersize.x &&
IsInsideBS(ti->x, _thd.pos.x + _thd.offs.x, _thd.size.x + _thd.outersize.x) &&
IsInsideBS(ti->y, _thd.pos.y + _thd.offs.y, _thd.size.y + _thd.outersize.y)) {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/water_cmd.cpp
--- a/src/water_cmd.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/water_cmd.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -13,7 +13,7 @@
#include "viewport_func.h"
#include "command_func.h"
#include "town.h"
-#include "news.h"
+#include "news_func.h"
#include "depot.h"
#include "vehicle_gui.h"
#include "train.h"
@@ -855,7 +855,7 @@
SetDParam(0, pass);
AddNewsItem(STR_B006_FLOOD_VEHICLE_DESTROYED,
- NEWS_FLAGS(NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, 0),
+ NM_THIN, NF_VIEWPORT | NF_VEHICLE, NT_ACCIDENT, DNC_NONE,
v->index,
0);
CreateEffectVehicleRel(v, 4, 4, 8, EV_EXPLOSION_LARGE);
@@ -912,7 +912,7 @@
*/
static void DoFloodTile(TileIndex target)
{
- if (IsTileType(target, MP_WATER)) return;
+ assert(!IsTileType(target, MP_WATER));
bool flooded = false; // Will be set to true if something is changed.
@@ -1033,6 +1033,8 @@
for (Direction dir = DIR_BEGIN; dir < DIR_END; dir++) {
TileIndex dest = AddTileIndexDiffCWrap(tile, TileIndexDiffCByDir(dir));
if (dest == INVALID_TILE) continue;
+ /* do not try to flood water tiles - increases performance a lot */
+ if (IsTileType(dest, MP_WATER)) continue;
uint z_dest;
Slope slope_dest = (Slope)(GetFoundationSlope(dest, &z_dest) & ~SLOPE_HALFTILE_MASK & ~SLOPE_STEEP);
diff -r cc77111ebd85 -r 9707ad4c9b60 src/widget.cpp
--- a/src/widget.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/widget.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -54,7 +54,7 @@
Scrollbar *sb;
switch (wi->type) {
- case WWT_SCROLLBAR: {
+ case WWT_SCROLLBAR:
/* vertical scroller */
w->flags4 &= ~WF_HSCROLL;
w->flags4 &= ~WF_SCROLL2;
@@ -63,8 +63,8 @@
pos = y;
sb = &w->vscroll;
break;
- }
- case WWT_SCROLL2BAR: {
+
+ case WWT_SCROLL2BAR:
/* 2nd vertical scroller */
w->flags4 &= ~WF_HSCROLL;
w->flags4 |= WF_SCROLL2;
@@ -73,8 +73,8 @@
pos = y;
sb = &w->vscroll2;
break;
- }
- case WWT_HSCROLLBAR: {
+
+ case WWT_HSCROLLBAR:
/* horizontal scroller */
w->flags4 &= ~WF_SCROLL2;
w->flags4 |= WF_HSCROLL;
@@ -83,8 +83,8 @@
pos = x;
sb = &w->hscroll;
break;
- }
- default: return; //this should never happen
+
+ default: NOT_REACHED();
}
if (pos <= mi+9) {
/* Pressing the upper button? */
@@ -94,7 +94,7 @@
if (sb->pos != 0) sb->pos--;
}
_left_button_clicked = false;
- } else if (pos >= ma-10) {
+ } else if (pos >= ma - 10) {
/* Pressing the lower button? */
w->flags4 |= WF_SCROLL_DOWN;
@@ -216,17 +216,19 @@
break;
}
- case WWT_PANEL: {
+ case WWT_PANEL:
assert(wi->data == 0);
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
break;
- }
+
+ case WWT_EDITBOX:
+ DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_LOWERED | FR_DARKENED);
+ break;
case WWT_TEXTBTN:
- case WWT_TEXTBTN_2: {
+ case WWT_TEXTBTN_2:
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
- }
- /* fall through */
+ /* FALL THROUGH */
case WWT_LABEL: {
StringID str = wi->data;
@@ -253,28 +255,24 @@
}
case WWT_MATRIX: {
- int c, d, ctr;
- int x, amt1, amt2;
- int color;
-
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
- c = GB(wi->data, 0, 8);
- amt1 = (wi->right - wi->left + 1) / c;
+ int c = GB(wi->data, 0, 8);
+ int amt1 = (wi->right - wi->left + 1) / c;
- d = GB(wi->data, 8, 8);
- amt2 = (wi->bottom - wi->top + 1) / d;
+ int d = GB(wi->data, 8, 8);
+ int amt2 = (wi->bottom - wi->top + 1) / d;
- color = _colour_gradient[wi->color & 0xF][6];
+ int color = _colour_gradient[wi->color & 0xF][6];
- x = r.left;
- for (ctr = c; ctr > 1; ctr--) {
+ int x = r.left;
+ for (int ctr = c; ctr > 1; ctr--) {
x += amt1;
GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
}
x = r.top;
- for (ctr = d; ctr > 1; ctr--) {
+ for (int ctr = d; ctr > 1; ctr--) {
x += amt2;
GfxFillRect(r.left + 1, x, r.right - 1, x, color);
}
@@ -282,13 +280,13 @@
color = _colour_gradient[wi->color & 0xF][4];
x = r.left - 1;
- for (ctr = c; ctr > 1; ctr--) {
+ for (int ctr = c; ctr > 1; ctr--) {
x += amt1;
GfxFillRect(x, r.top + 1, x, r.bottom - 1, color);
}
x = r.top - 1;
- for (ctr = d; ctr > 1; ctr--) {
+ for (int ctr = d; ctr > 1; ctr--) {
x += amt2;
GfxFillRect(r.left + 1, x, r.right - 1, x, color);
}
@@ -298,11 +296,8 @@
/* vertical scrollbar */
case WWT_SCROLLBAR: {
- Point pt;
- int c1, c2;
-
assert(wi->data == 0);
- assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+ assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
/* draw up/down buttons */
clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_UP);
@@ -313,8 +308,8 @@
DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
- c1 = _colour_gradient[wi->color & 0xF][3];
- c2 = _colour_gradient[wi->color & 0xF][7];
+ int c1 = _colour_gradient[wi->color & 0xF][3];
+ int c2 = _colour_gradient[wi->color & 0xF][7];
/* draw "shaded" background */
GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
@@ -326,16 +321,14 @@
GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
- pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
+ Point pt = HandleScrollbarHittest(&w->vscroll, r.top, r.bottom);
DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == WF_SCROLL_MIDDLE ? FR_LOWERED : FR_NONE);
break;
}
+
case WWT_SCROLL2BAR: {
- Point pt;
- int c1, c2;
-
assert(wi->data == 0);
- assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+ assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
/* draw up/down buttons */
clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_UP | WF_SCROLL2));
@@ -346,8 +339,8 @@
DrawFrameRect(r.left, r.bottom - 9, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
DoDrawString(DOWNARROW, r.left + 2 + clicked, r.bottom - 9 + clicked, TC_BLACK);
- c1 = _colour_gradient[wi->color & 0xF][3];
- c2 = _colour_gradient[wi->color & 0xF][7];
+ int c1 = _colour_gradient[wi->color & 0xF][3];
+ int c2 = _colour_gradient[wi->color & 0xF][7];
/* draw "shaded" background */
GfxFillRect(r.left, r.top + 10, r.right, r.bottom - 10, c2);
@@ -359,18 +352,15 @@
GfxFillRect(r.left + 7, r.top + 10, r.left + 7, r.bottom - 10, c1);
GfxFillRect(r.left + 8, r.top + 10, r.left + 8, r.bottom - 10, c2);
- pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
+ Point pt = HandleScrollbarHittest(&w->vscroll2, r.top, r.bottom);
DrawFrameRect(r.left, pt.x, r.right, pt.y, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL | WF_SCROLL2)) == (WF_SCROLL_MIDDLE | WF_SCROLL2) ? FR_LOWERED : FR_NONE);
break;
}
/* horizontal scrollbar */
case WWT_HSCROLLBAR: {
- Point pt;
- int c1, c2;
-
assert(wi->data == 0);
- assert(r.bottom - r.top == 11); // XXX - to ensure the same sizes are used everywhere!
+ assert(r.bottom - r.top == 11); // To ensure the same sizes are used everywhere!
clicked = ((w->flags4 & (WF_SCROLL_UP | WF_HSCROLL)) == (WF_SCROLL_UP | WF_HSCROLL));
DrawFrameRect(r.left, r.top, r.left + 9, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
@@ -380,8 +370,8 @@
DrawFrameRect(r.right - 9, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
DrawSprite(SPR_ARROW_RIGHT, PAL_NONE, r.right - 8 + clicked, r.top + 1 + clicked);
- c1 = _colour_gradient[wi->color & 0xF][3];
- c2 = _colour_gradient[wi->color & 0xF][7];
+ int c1 = _colour_gradient[wi->color & 0xF][3];
+ int c2 = _colour_gradient[wi->color & 0xF][7];
/* draw "shaded" background */
GfxFillRect(r.left + 10, r.top, r.right - 10, r.bottom, c2);
@@ -394,7 +384,7 @@
GfxFillRect(r.left + 10, r.top + 8, r.right - 10, r.top + 8, c2);
/* draw actual scrollbar */
- pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
+ Point pt = HandleScrollbarHittest(&w->hscroll, r.left, r.right);
DrawFrameRect(pt.x, r.top, pt.y, r.bottom, wi->color, (w->flags4 & (WF_SCROLL_MIDDLE | WF_HSCROLL)) == (WF_SCROLL_MIDDLE | WF_HSCROLL) ? FR_LOWERED : FR_NONE);
break;
@@ -402,13 +392,12 @@
case WWT_FRAME: {
const StringID str = wi->data;
- int c1, c2;
int x2 = r.left; // by default the left side is the left side of the widget
if (str != STR_NULL) x2 = DrawString(r.left + 6, r.top, str, TC_FROMSTRING);
- c1 = _colour_gradient[wi->color][3];
- c2 = _colour_gradient[wi->color][7];
+ int c1 = _colour_gradient[wi->color][3];
+ int c2 = _colour_gradient[wi->color][7];
/* Line from upper left corner to start of text */
GfxFillRect(r.left, r.top + 4, r.left + 4, r.top + 4, c1);
@@ -432,39 +421,37 @@
break;
}
- case WWT_STICKYBOX: {
+ case WWT_STICKYBOX:
assert(wi->data == 0);
- assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+ assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
clicked = !!(w->flags4 & WF_STICKY);
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
DrawSprite((clicked) ? SPR_PIN_UP : SPR_PIN_DOWN, PAL_NONE, r.left + 2 + clicked, r.top + 3 + clicked);
break;
- }
- case WWT_RESIZEBOX: {
+ case WWT_RESIZEBOX:
assert(wi->data == 0);
- assert(r.right - r.left == 11); // XXX - to ensure the same sizes are used everywhere!
+ assert(r.right - r.left == 11); // To ensure the same sizes are used everywhere!
clicked = !!(w->flags4 & WF_SIZING);
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, (clicked) ? FR_LOWERED : FR_NONE);
DrawSprite(SPR_WINDOW_RESIZE, PAL_NONE, r.left + 3 + clicked, r.top + 3 + clicked);
break;
- }
case WWT_CLOSEBOX: {
const StringID str = wi->data;
assert(str == STR_00C5 || str == STR_00C6); // black or silver cross
- assert(r.right - r.left == 10); // ensure the same sizes are used everywhere
+ assert(r.right - r.left == 10); // To ensure the same sizes are used everywhere
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_NONE);
DrawString(r.left + 2, r.top + 2, str, TC_FROMSTRING);
break;
}
- case WWT_CAPTION: {
- assert(r.bottom - r.top == 13); // XXX - to ensure the same sizes are used everywhere!
+ case WWT_CAPTION:
+ assert(r.bottom - r.top == 13); // To ensure the same sizes are used everywhere!
DrawFrameRect(r.left, r.top, r.right, r.bottom, wi->color, FR_BORDERONLY);
DrawFrameRect(r.left + 1, r.top + 1, r.right - 1, r.bottom - 1, wi->color, (w->caption_color == 0xFF) ? FR_LOWERED | FR_DARKENED : FR_LOWERED | FR_DARKENED | FR_BORDERONLY);
@@ -474,7 +461,6 @@
DrawStringCenteredTruncated(r.left + 2, r.right - 2, r.top + 2, wi->data, 0x84);
break;
- }
case WWT_DROPDOWN: {
assert(r.bottom - r.top == 11); // ensure consistent size
@@ -516,7 +502,7 @@
int16 offset = w->widget[a].left;
int16 length = w->widget[b].right - offset;
- w->widget[a].right = (length / 2) + offset;
+ w->widget[a].right = (length / 2) + offset;
w->widget[b].left = w->widget[a].right + 1;
}
diff -r cc77111ebd85 -r 9707ad4c9b60 src/window.cpp
--- a/src/window.cpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/window.cpp Fri Mar 28 10:32:55 2008 +0000
@@ -2175,15 +2175,22 @@
IConsoleResize(w);
continue;
- default:
+ default: {
left = w->left;
if (left + (w->width >> 1) >= neww) left = neww - w->width;
if (left < 0) left = 0;
top = w->top;
if (top + (w->height >> 1) >= newh) top = newh - w->height;
- if (top < 0) top = 0;
- break;
+
+ const Window *wt = FindWindowById(WC_MAIN_TOOLBAR, 0);
+ if (wt != NULL) {
+ if (top < wt->height) top = wt->height;
+ if (top >= newh) top = newh - 1;
+ } else {
+ if (top < 0) top = 0;
+ }
+ } break;
}
if (w->viewport != NULL) {
diff -r cc77111ebd85 -r 9707ad4c9b60 src/window_gui.h
--- a/src/window_gui.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/window_gui.h Fri Mar 28 10:32:55 2008 +0000
@@ -392,16 +392,6 @@
};
assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(vp_d));
-struct news_d {
- uint16 follow_vehicle;
- int32 scrollpos_x;
- int32 scrollpos_y;
- int32 dest_scrollpos_x;
- int32 dest_scrollpos_y;
- NewsItem *ni;
-};
-assert_compile(WINDOW_CUSTOM_SIZE >= sizeof(news_d));
-
struct highscore_d {
uint32 background_img;
int8 rank;
@@ -499,6 +489,7 @@
WWT_CLOSEBOX,
WWT_DROPDOWN, ///< Raised drop down list (regular)
WWT_DROPDOWNIN, ///< Inset drop down list (used on game options only)
+ WWT_EDITBOX, ///< a textbox for typing (don't forget to call ShowOnScreenKeyboard() when clicked)
WWT_LAST, ///< Last Item. use WIDGETS_END to fill up padding!!
WWT_MASK = 0x1F,
diff -r cc77111ebd85 -r 9707ad4c9b60 src/window_type.h
--- a/src/window_type.h Thu Mar 27 05:15:06 2008 +0000
+++ b/src/window_type.h Fri Mar 28 10:32:55 2008 +0000
@@ -90,6 +90,7 @@
WC_VEHICLE_TIMETABLE,
WC_BUILD_SIGNAL,
WC_COMPANY_PASSWORD_WINDOW,
+ WC_OSK,
};
struct Window;
diff -r cc77111ebd85 -r 9707ad4c9b60 src/yapf/yapf_common.cpp
--- a/src/yapf/yapf_common.cpp Thu Mar 27 05:15:06 2008 +0000
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,31 +0,0 @@
-/* $Id$ */
-
-/** @file yapf_common.cpp */
-
-#include "../stdafx.h"
-
-#include "yapf.hpp"
-#include "follow_track.hpp"
-#include "yapf_node_rail.hpp"
-#include "yapf_costbase.hpp"
-#include "yapf_costcache.hpp"
-
-/** translate tileh to the bitset of up-hill trackdirs */
-const TrackdirBits CYapfCostBase::c_upwards_slopes[] = {
- TRACKDIR_BIT_NONE , ///< no tileh
- TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_NW, ///< 1
- TRACKDIR_BIT_X_SW | TRACKDIR_BIT_Y_SE, ///< 2
- TRACKDIR_BIT_X_SW , ///< 3
- TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_SE, ///< 4
- TRACKDIR_BIT_NONE , ///< 5
- TRACKDIR_BIT_Y_SE , ///< 6
- TRACKDIR_BIT_NONE , ///< 7
- TRACKDIR_BIT_X_NE | TRACKDIR_BIT_Y_NW, ///< 8
- TRACKDIR_BIT_Y_NW , ///< 9
- TRACKDIR_BIT_NONE , ///< 10
- TRACKDIR_BIT_NONE , ///< 11
- TRACKDIR_BIT_X_NE , ///< 12
- TRACKDIR_BIT_NONE , ///< 13
- TRACKDIR_BIT_NONE , ///< 14
- TRACKDIR_BIT_NONE , ///< 15
-};
diff -r cc77111ebd85 -r 9707ad4c9b60 src/yapf/yapf_costbase.hpp
--- a/src/yapf/yapf_costbase.hpp Thu Mar 27 05:15:06 2008 +0000
+++ b/src/yapf/yapf_costbase.hpp Fri Mar 28 10:32:55 2008 +0000
@@ -4,8 +4,6 @@
#define YAPF_COSTBASE_HPP
struct CYapfCostBase {
- static const TrackdirBits c_upwards_slopes[16];
-
FORCEINLINE static bool stSlopeCost(TileIndex tile, Trackdir td)
{
if (IsDiagonalTrackdir(td)) {
@@ -19,8 +17,8 @@
} else {
// not bridge ramp
if (IsTunnelTile(tile)) return false; // tunnel entry/exit doesn't slope
- uint tile_slope = GetTileSlope(tile, NULL) & 0x0F;
- if ((c_upwards_slopes[tile_slope] & TrackdirToTrackdirBits(td)) != 0) return true; // slopes uphill => apply penalty
+ Slope tile_slope = GetTileSlope(tile, NULL);
+ return IsUphillTrackdir(tile_slope, td); // slopes uphill => apply penalty
}
}
return false;